Skip to content

Commit 030024f

Browse files
committed
CreateAutoScaleVmGroup.vue: support userdata ids (6202)
1 parent 8c5b19b commit 030024f

File tree

1 file changed

+224
-0
lines changed

1 file changed

+224
-0
lines changed

ui/src/views/compute/CreateAutoScaleVmGroup.vue

Lines changed: 224 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -759,6 +759,98 @@
759759
@select-affinity-group-item="($event) => updateAffinityGroups($event)"
760760
@handle-search-filter="($event) => handleSearchFilter('affinityGroups', $event)"/>
761761
</a-form-item>
762+
<a-form-item :label="$t('label.userdata')">
763+
<a-card>
764+
<div v-if="this.template && this.template.userdataid">
765+
<a-text type="primary">
766+
Userdata "{{ $t(this.template.userdataname) }}" is linked with template "{{ $t(this.template.name) }}" with override policy "{{ $t(this.template.userdatapolicy) }}"
767+
</a-text><br/><br/>
768+
<div v-if="templateUserDataParams.length > 0 && !doUserdataOverride">
769+
<a-text type="primary" v-if="this.template && this.template.userdataid && templateUserDataParams.length > 0">
770+
Enter the values for the variables in userdata
771+
</a-text>
772+
<a-input-group>
773+
<a-table
774+
size="small"
775+
style="overflow-y: auto"
776+
:columns="userDataParamCols"
777+
:dataSource="templateUserDataParams"
778+
:pagination="false"
779+
:rowKey="record => record.key">
780+
<template #value="{ record }">
781+
<a-input v-model:value="templateUserDataValues[record.key]" />
782+
</template>
783+
</a-table>
784+
</a-input-group>
785+
</div>
786+
</div><br/><br/>
787+
<div v-if="userdataDefaultOverridePolicy === 'ALLOWOVERRIDE' || userdataDefaultOverridePolicy === 'APPEND' || !userdataDefaultOverridePolicy">
788+
<span v-if="userdataDefaultOverridePolicy === 'ALLOWOVERRIDE'" >
789+
{{ $t('label.userdata.do.override') }}
790+
<a-switch v-model:checked="doUserdataOverride" style="margin-left: 10px"/>
791+
</span>
792+
<span v-if="userdataDefaultOverridePolicy === 'APPEND'">
793+
{{ $t('label.userdata.do.append') }}
794+
<a-switch v-model:checked="doUserdataAppend" style="margin-left: 10px"/>
795+
</span>
796+
<a-step
797+
:status="zoneSelected ? 'process' : 'wait'">
798+
<template #description>
799+
<div v-if="doUserdataOverride || doUserdataAppend || !userdataDefaultOverridePolicy" style="margin-top: 15px">
800+
<a-card
801+
:tabList="userdataTabList"
802+
:activeTabKey="userdataTabKey"
803+
@tabChange="key => onUserdataTabChange(key, 'userdataTabKey')">
804+
<div v-if="userdataTabKey === 'userdataregistered'">
805+
<a-step
806+
v-if="isUserAllowedToListUserDatas"
807+
:status="zoneSelected ? 'process' : 'wait'">
808+
<template #description>
809+
<div v-if="zoneSelected">
810+
<user-data-selection
811+
:items="options.userDatas"
812+
:row-count="rowCount.userDatas"
813+
:zoneId="zoneId"
814+
:disabled="template.userdatapolicy === 'DENYOVERRIDE'"
815+
:loading="loading.userDatas"
816+
:preFillContent="dataPreFill"
817+
@select-user-data-item="($event) => updateUserData($event)"
818+
@handle-search-filter="($event) => handleSearchFilter('userData', $event)"
819+
/>
820+
<div v-if="userDataParams.length > 0">
821+
<a-input-group>
822+
<a-table
823+
size="small"
824+
style="overflow-y: auto"
825+
:columns="userDataParamCols"
826+
:dataSource="userDataParams"
827+
:pagination="false"
828+
:rowKey="record => record.key">
829+
<template #value="{ record }">
830+
<a-input v-model:value="userDataValues[record.key]" />
831+
</template>
832+
</a-table>
833+
</a-input-group>
834+
</div>
835+
</div>
836+
</template>
837+
</a-step>
838+
</div>
839+
<div v-else>
840+
<a-form-item name="userdata" ref="userdata" >
841+
<a-textarea
842+
placeholder="Userdata"
843+
v-model:value="form.userdata">
844+
</a-textarea>
845+
</a-form-item>
846+
</div>
847+
</a-card>
848+
</div>
849+
</template>
850+
</a-step>
851+
</div>
852+
</a-card>
853+
</a-form-item>
762854
<a-form-item name="userdata" ref="userdata">
763855
<template #label>
764856
<tooltip-label :title="$t('label.userdata')" :tooltip="createAutoScaleVmProfileApiParams.userdata.description"/>
@@ -951,6 +1043,7 @@ import NetworkSelection from '@views/compute/wizard/NetworkSelection'
9511043
import NetworkConfiguration from '@views/compute/wizard/NetworkConfiguration'
9521044
import LoadBalancerSelection from '@views/compute/wizard/LoadBalancerSelection'
9531045
import SshKeyPairSelection from '@views/compute/wizard/SshKeyPairSelection'
1046+
import UserDataSelection from '@views/compute/wizard/UserDataSelection'
9541047
import SecurityGroupSelection from '@views/compute/wizard/SecurityGroupSelection'
9551048
import TooltipLabel from '@/components/widgets/TooltipLabel'
9561049
import InstanceNicsNetworkSelectListView from '@/components/view/InstanceNicsNetworkSelectListView.vue'
@@ -963,6 +1056,7 @@ export default {
9631056
name: 'Wizard',
9641057
components: {
9651058
SshKeyPairSelection,
1059+
UserDataSelection,
9661060
NetworkConfiguration,
9671061
NetworkSelection,
9681062
LoadBalancerSelection,
@@ -1009,6 +1103,10 @@ export default {
10091103
zoneSelected: false,
10101104
dynamicscalingenabled: true,
10111105
templateKey: 0,
1106+
showRegisteredUserdata: true,
1107+
doUserdataOverride: false,
1108+
doUserdataAppend: false,
1109+
userdataDefaultOverridePolicy: 'ALLOWOVERRIDE',
10121110
vm: {
10131111
name: null,
10141112
zoneid: null,
@@ -1033,6 +1131,7 @@ export default {
10331131
affinityGroups: [],
10341132
networks: [],
10351133
sshKeyPairs: [],
1134+
UserDatas: [],
10361135
loadbalancers: []
10371136
},
10381137
rowCount: {},
@@ -1044,6 +1143,7 @@ export default {
10441143
affinityGroups: false,
10451144
networks: false,
10461145
sshKeyPairs: false,
1146+
userDatas: false,
10471147
loadbalancers: false,
10481148
zones: false
10491149
},
@@ -1122,6 +1222,32 @@ export default {
11221222
zone: {},
11231223
sshKeyPairs: [],
11241224
sshKeyPair: {},
1225+
userData: {},
1226+
userDataParams: [],
1227+
userDataParamCols: [
1228+
{
1229+
title: this.$t('label.key'),
1230+
dataIndex: 'key'
1231+
},
1232+
{
1233+
title: this.$t('label.value'),
1234+
dataIndex: 'value',
1235+
slots: { customRender: 'value' }
1236+
}
1237+
],
1238+
userDataValues: {},
1239+
templateUserDataCols: [
1240+
{
1241+
title: this.$t('label.userdata'),
1242+
dataIndex: 'userdata'
1243+
},
1244+
{
1245+
title: this.$t('label.userdatapolicy'),
1246+
dataIndex: 'userdataoverridepolicy'
1247+
}
1248+
],
1249+
templateUserDataParams: [],
1250+
templateUserDataValues: {},
11251251
overrideDiskOffering: {},
11261252
templateFilter: [
11271253
'featured',
@@ -1133,6 +1259,7 @@ export default {
11331259
defaultNetworkId: '',
11341260
dataNetworkCreated: [],
11351261
tabKey: 'templateid',
1262+
userdataTabKey: 'userdataregistered',
11361263
dataPreFill: {},
11371264
showDetails: false,
11381265
showRootDiskSizeChanger: false,
@@ -1223,6 +1350,15 @@ export default {
12231350
listall: false
12241351
}
12251352
},
1353+
userDatas: {
1354+
list: 'listUserData',
1355+
options: {
1356+
page: 1,
1357+
pageSize: 10,
1358+
keyword: undefined,
1359+
listall: false
1360+
}
1361+
},
12261362
networks: {
12271363
list: 'listNetworks',
12281364
options: {
@@ -1284,12 +1420,27 @@ export default {
12841420
}]
12851421
return tabList
12861422
},
1423+
userdataTabList () {
1424+
let tabList = []
1425+
tabList = [{
1426+
key: 'userdataregistered',
1427+
tab: this.$t('label.userdata.registered')
1428+
},
1429+
{
1430+
key: 'userdatatext',
1431+
tab: this.$t('label.userdata.text')
1432+
}]
1433+
return tabList
1434+
},
12871435
showSecurityGroupSection () {
12881436
return (this.networks.length > 0 && this.zone.securitygroupsenabled) || (this.zone && this.zone.networktype === 'Basic')
12891437
},
12901438
isUserAllowedToListSshKeys () {
12911439
return Boolean('listSSHKeyPairs' in this.$store.getters.apis)
12921440
},
1441+
isUserAllowedToListUserDatas () {
1442+
return Boolean('listUserData' in this.$store.getters.apis)
1443+
},
12931444
dynamicScalingVmConfigValue () {
12941445
return this.options.dynamicScalingVmConfig?.[0]?.value === 'true'
12951446
},
@@ -1420,6 +1571,8 @@ export default {
14201571
template (oldValue, newValue) {
14211572
if (oldValue && newValue && oldValue.id !== newValue.id) {
14221573
this.dynamicscalingenabled = this.isDynamicallyScalable()
1574+
this.doUserdataOverride = false
1575+
this.doUserdataAppend = false
14231576
}
14241577
},
14251578
beforeCreate () {
@@ -1852,6 +2005,8 @@ export default {
18522005
if (template) {
18532006
var size = template.size / (1024 * 1024 * 1024) || 0 // bytes to GB
18542007
this.dataPreFill.minrootdisksize = Math.ceil(size)
2008+
this.updateTemplateLinkedUserData(this.template.userdataid)
2009+
this.userdataDefaultOverridePolicy = this.template.userdatapolicy
18552010
}
18562011
} else if (['cpuspeed', 'cpunumber', 'memory'].includes(name)) {
18572012
this.vm[name] = value
@@ -2016,6 +2171,56 @@ export default {
20162171
this.form.keypairs = names
20172172
this.sshKeyPairs = names.map((sshKeyPair) => { return sshKeyPair.name })
20182173
},
2174+
updateUserData (id) {
2175+
if (id === '0') {
2176+
this.form.userdataid = undefined
2177+
return
2178+
}
2179+
this.form.userdataid = id
2180+
this.userDataParams = []
2181+
api('listUserData', { id: id }).then(json => {
2182+
const resp = json?.listuserdataresponse?.userdata || []
2183+
if (resp) {
2184+
var params = resp[0].params
2185+
if (params) {
2186+
var dataParams = params.split(',')
2187+
}
2188+
var that = this
2189+
dataParams.forEach(function (val, index) {
2190+
that.userDataParams.push({
2191+
id: index,
2192+
key: val
2193+
})
2194+
})
2195+
}
2196+
})
2197+
},
2198+
updateTemplateLinkedUserData (id) {
2199+
if (id === '0') {
2200+
return
2201+
}
2202+
this.templateUserDataParams = []
2203+
2204+
api('listUserData', { id: id }).then(json => {
2205+
const resp = json?.listuserdataresponse?.userdata || []
2206+
if (resp) {
2207+
var params = resp[0].params
2208+
if (params) {
2209+
var dataParams = params.split(',')
2210+
}
2211+
var that = this
2212+
that.templateUserDataParams = []
2213+
if (dataParams) {
2214+
dataParams.forEach(function (val, index) {
2215+
that.templateUserDataParams.push({
2216+
id: index,
2217+
key: val
2218+
})
2219+
})
2220+
}
2221+
}
2222+
})
2223+
},
20192224
updateAffinityGroups (ids) {
20202225
this.form.affinitygroupids = ids
20212226
},
@@ -2427,6 +2632,7 @@ export default {
24272632
if (values.userdata && values.userdata.length > 0) {
24282633
createVmGroupData.userdata = this.$toBase64AndURIEncoded(values.userdata)
24292634
}
2635+
createVmGroupData.userdataid = values.userdataid
24302636
24312637
// vm profile details
24322638
createVmGroupData.autoscaleuserid = values.autoscaleuserid
@@ -2435,6 +2641,20 @@ export default {
24352641
createVmGroupData = Object.fromEntries(
24362642
Object.entries(createVmGroupData).filter(([key, value]) => value !== undefined))
24372643
2644+
var idx = 0
2645+
if (this.templateUserDataValues) {
2646+
for (const [key, value] of Object.entries(this.templateUserDataValues)) {
2647+
createVmGroupData['userdatadetails[' + idx + '].' + `${key}`] = value
2648+
idx++
2649+
}
2650+
}
2651+
if (this.userDataValues) {
2652+
for (const [key, value] of Object.entries(this.userDataValues)) {
2653+
createVmGroupData['userdatadetails[' + idx + '].' + `${key}`] = value
2654+
idx++
2655+
}
2656+
}
2657+
24382658
this.processStatusModalVisible = true
24392659
this.processStatus = null
24402660
@@ -2702,6 +2922,10 @@ export default {
27022922
this.params[name].options = { ...this.params[name].options, ...options }
27032923
this.fetchOptions(this.params[name], name)
27042924
},
2925+
onUserdataTabChange (key, type) {
2926+
this[type] = key
2927+
this.userDataParams = []
2928+
},
27052929
fetchTemplateNics (template) {
27062930
var nics = []
27072931
this.nicToNetworkSelection = []

0 commit comments

Comments
 (0)