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'
9511043import NetworkConfiguration from ' @views/compute/wizard/NetworkConfiguration'
9521044import LoadBalancerSelection from ' @views/compute/wizard/LoadBalancerSelection'
9531045import SshKeyPairSelection from ' @views/compute/wizard/SshKeyPairSelection'
1046+ import UserDataSelection from ' @views/compute/wizard/UserDataSelection'
9541047import SecurityGroupSelection from ' @views/compute/wizard/SecurityGroupSelection'
9551048import TooltipLabel from ' @/components/widgets/TooltipLabel'
9561049import 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