add affinity group support Kubernetes cluster creation

This commit is contained in:
Daman Arora 2026-01-13 06:39:00 -05:00
parent d62b9f3b73
commit fc548975d3
3 changed files with 97 additions and 3 deletions

View File

@ -555,6 +555,9 @@
"label.cks.cluster.size": "Cluster size (Worker nodes)",
"label.cks.cluster.worker.nodes.offeringid": "Service Offering for Worker Nodes",
"label.cks.cluster.worker.nodes.templateid": "Template for Worker Nodes",
"label.cks.cluster.control.nodes.affinitygroupid": "Affinity Groups for Control Nodes",
"label.cks.cluster.worker.nodes.affinitygroupid": "Affinity Groups for Worker Nodes",
"label.cks.cluster.etcd.nodes.affinitygroupid": "Affinity Groups for ETCD Nodes",
"label.cleanup": "Clean up",
"label.clear": "Clear",
"label.clear.all": "Clear all",
@ -2883,6 +2886,9 @@
"label.edgecluster": "Edge Cluster",
"label.encryption": "Encryption",
"label.etcdnodes": "Number of etcd nodes",
"label.controlaffinitygroupnames": "Control Affinity Groups",
"label.workeraffinitygroupnames": "Worker Affinity Groups",
"label.etcdaffinitygroupnames": "ETCD Affinity Groups",
"label.versioning": "Versioning",
"label.objectlocking": "Object Lock",
"label.bucket.policy": "Bucket Policy",

View File

@ -574,7 +574,7 @@ export default {
const filters = ['cloud.managed', 'external.managed']
return filters
},
details: ['name', 'description', 'zonename', 'kubernetesversionname', 'autoscalingenabled', 'csienabled', 'minsize', 'maxsize', 'size', 'controlnodes', 'etcdnodes', 'cpunumber', 'memory', 'keypair', 'cniconfigname', 'associatednetworkname', 'account', 'domain', 'zonename', 'clustertype', 'created'],
details: ['name', 'description', 'zonename', 'kubernetesversionname', 'autoscalingenabled', 'csienabled', 'minsize', 'maxsize', 'size', 'controlnodes', 'controlaffinitygroupnames', 'etcdnodes', 'etcdaffinitygroupnames', 'workeraffinitygroupnames', 'cpunumber', 'memory', 'keypair', 'cniconfigname', 'associatednetworkname', 'account', 'domain', 'zonename', 'clustertype', 'created'],
tabs: [
{
name: 'k8s',

View File

@ -316,7 +316,7 @@
</a-select-option>
</a-select>
</a-form-item>
<a-form-item v-if="form.advancedmode && form?.etcdnodes > 0" name="etcdtemplateid" ref="etcdtemplateid">
<a-form-item v-if="form.advancedmode && form.etcdnodes && form.etcdnodes > 0" name="etcdtemplateid" ref="etcdtemplateid">
<template #label>
<tooltip-label :title="$t('label.cks.cluster.etcd.nodes.templateid')" :tooltip="$t('label.cks.cluster.etcd.nodes.templateid')"/>
</template>
@ -335,6 +335,57 @@
</a-select-option>
</a-select>
</a-form-item>
<a-form-item v-if="form.advancedmode" name="controlaffinitygroupids" ref="controlaffinitygroupids">
<template #label>
<tooltip-label :title="$t('label.cks.cluster.control.nodes.affinitygroupid')" :tooltip="$t('label.cks.cluster.control.nodes.affinitygroupid')"/>
</template>
<a-select
v-model:value="controlAffinityGroups"
mode="multiple"
showSearch
optionFilterProp="label"
:filterOption="(input, option) => option.label.toLowerCase().indexOf(input.toLowerCase()) >= 0"
:loading="affinityGroupLoading"
:placeholder="$t('label.cks.cluster.control.nodes.affinitygroupid')">
<a-select-option v-for="opt in affinityGroups" :key="opt.id" :label="opt.name">
{{ opt.name }}
</a-select-option>
</a-select>
</a-form-item>
<a-form-item v-if="form.advancedmode" name="workeraffinitygroupids" ref="workeraffinitygroupids">
<template #label>
<tooltip-label :title="$t('label.cks.cluster.worker.nodes.affinitygroupid')" :tooltip="$t('label.cks.cluster.worker.nodes.affinitygroupid')"/>
</template>
<a-select
v-model:value="workerAffinityGroups"
mode="multiple"
showSearch
optionFilterProp="label"
:filterOption="(input, option) => option.label.toLowerCase().indexOf(input.toLowerCase()) >= 0"
:loading="affinityGroupLoading"
:placeholder="$t('label.cks.cluster.worker.nodes.affinitygroupid')">
<a-select-option v-for="opt in affinityGroups" :key="opt.id" :label="opt.name">
{{ opt.name }}
</a-select-option>
</a-select>
</a-form-item>
<a-form-item v-if="form.advancedmode && form.etcdnodes && form.etcdnodes > 0" name="etcdaffinitygroupids" ref="etcdaffinitygroupids">
<template #label>
<tooltip-label :title="$t('label.cks.cluster.etcd.nodes.affinitygroupid')" :tooltip="$t('label.cks.cluster.etcd.nodes.affinitygroupid')"/>
</template>
<a-select
v-model:value="etcdAffinityGroups"
mode="multiple"
showSearch
optionFilterProp="label"
:filterOption="(input, option) => option.label.toLowerCase().indexOf(input.toLowerCase()) >= 0"
:loading="affinityGroupLoading"
:placeholder="$t('label.cks.cluster.etcd.nodes.affinitygroupid')">
<a-select-option v-for="opt in affinityGroups" :key="opt.id" :label="opt.name">
{{ opt.name }}
</a-select-option>
</a-select>
</a-form-item>
<a-form-item v-if="form.advancedmode && isASNumberRequired() && !form.networkid" name="asnumber" ref="asnumber">
<template #label>
<tooltip-label :title="$t('label.asnumber')" :tooltip="apiParams.asnumber.description"/>
@ -490,7 +541,12 @@ export default {
cksNetworkOffering: null,
asNumbersZone: [],
asNumberLoading: false,
selectedAsNumber: 0
selectedAsNumber: 0,
affinityGroups: [],
affinityGroupLoading: false,
controlAffinityGroups: [],
workerAffinityGroups: [],
etcdAffinityGroups: []
}
},
beforeCreate () {
@ -560,6 +616,22 @@ export default {
this.fetchCKSNetworkOfferingName()
this.fetchCniConfigurations()
},
fetchAffinityGroups () {
this.affinityGroups = []
const params = {}
if (!this.isObjectEmpty(this.selectedZone)) {
params.zoneid = this.selectedZone.id
}
this.affinityGroupLoading = true
getAPI('listAffinityGroups', params).then(json => {
const groups = json.listaffinitygroupsresponse.affinitygroup
if (this.arrayHasItems(groups)) {
this.affinityGroups = groups
}
}).finally(() => {
this.affinityGroupLoading = false
})
},
isValidValueForKey (obj, key) {
return key in obj && obj[key] != null
},
@ -600,6 +672,7 @@ export default {
this.fetchNetworkData()
this.fetchZoneHypervisors()
this.fetchZoneASNumbers()
this.fetchAffinityGroups()
},
handleASNumberChange (selectedIndex) {
this.selectedAsNumber = this.asNumbersZone[selectedIndex].asnumber
@ -881,6 +954,21 @@ export default {
advancedTemplates++
}
}
if (values.advancedmode) {
let affinityIndex = 0
const addAffinityGroups = (nodeType, groups) => {
if (groups && groups.length > 0) {
params[`nodeaffinitygroups[${affinityIndex}].node`] = nodeType
params[`nodeaffinitygroups[${affinityIndex}].affinitygroup`] = groups.join(',')
affinityIndex++
}
}
addAffinityGroups('control', this.controlAffinityGroups)
addAffinityGroups('worker', this.workerAffinityGroups)
if (values.etcdnodes > 0) {
addAffinityGroups('etcd', this.etcdAffinityGroups)
}
}
if (this.isValidValueForKey(values, 'noderootdisksize') && values.noderootdisksize > 0) {
params.noderootdisksize = values.noderootdisksize
}