mirror of https://github.com/rancher/dashboard.git
208 lines
5.7 KiB
Vue
208 lines
5.7 KiB
Vue
<script>
|
|
import { LabeledInput } from '@components/Form/LabeledInput';
|
|
import LabeledSelect from '@shell/components/form/LabeledSelect';
|
|
import { RadioGroup } from '@components/Form/Radio';
|
|
import { _CREATE } from '@shell/config/query-params';
|
|
import { get } from '@shell/utils/object';
|
|
import { HCI as HCI_LABELS_ANNOTATIONS } from '@shell/config/labels-annotations';
|
|
|
|
const HARVESTER_ADD_ON_CONFIG = [{
|
|
variableName: 'ipam',
|
|
key: HCI_LABELS_ANNOTATIONS.CLOUD_PROVIDER_IPAM,
|
|
default: 'dhcp'
|
|
}, {
|
|
variableName: 'healthcheckPort',
|
|
key: 'cloudprovider.harvesterhci.io/healthcheck-port',
|
|
default: '',
|
|
}, {
|
|
variableName: 'healthCheckSuccessThreshold',
|
|
key: 'cloudprovider.harvesterhci.io/healthcheck-success-threshold',
|
|
default: 1,
|
|
}, {
|
|
variableName: 'healthCheckFailureThreshold',
|
|
key: 'cloudprovider.harvesterhci.io/healthcheck-failure-threshold',
|
|
default: 3,
|
|
}, {
|
|
variableName: 'healthCheckPeriod',
|
|
key: 'cloudprovider.harvesterhci.io/healthcheck-periodseconds',
|
|
default: 5,
|
|
}, {
|
|
variableName: 'healthCheckTimeout',
|
|
key: 'cloudprovider.harvesterhci.io/healthcheck-timeoutseconds',
|
|
default: 3,
|
|
}];
|
|
|
|
export default {
|
|
components: {
|
|
LabeledInput,
|
|
LabeledSelect,
|
|
RadioGroup,
|
|
},
|
|
|
|
props: {
|
|
mode: {
|
|
type: String,
|
|
default: _CREATE,
|
|
},
|
|
|
|
value: {
|
|
type: Object,
|
|
default: () => {
|
|
return {};
|
|
}
|
|
},
|
|
|
|
registerBeforeHook: {
|
|
type: Function,
|
|
default: null
|
|
},
|
|
},
|
|
|
|
created() {
|
|
if (this.registerBeforeHook) {
|
|
this.registerBeforeHook(this.willSave, 'harvesterWillSave');
|
|
}
|
|
},
|
|
|
|
data() {
|
|
const harvesterAddOnConfig = {};
|
|
|
|
HARVESTER_ADD_ON_CONFIG.forEach((c) => {
|
|
harvesterAddOnConfig[c.variableName] = this.value.metadata.annotations[c.key] || c.default;
|
|
});
|
|
|
|
return {
|
|
...harvesterAddOnConfig,
|
|
healthCheckEnabled: !!harvesterAddOnConfig.healthcheckPort,
|
|
};
|
|
},
|
|
|
|
computed: {
|
|
ipamOptions() {
|
|
return [{
|
|
label: 'DHCP',
|
|
value: 'dhcp',
|
|
}, {
|
|
label: 'Pool',
|
|
value: 'pool',
|
|
}];
|
|
},
|
|
|
|
portOptions() {
|
|
const ports = this.value?.spec?.ports || [];
|
|
|
|
return ports.filter(p => p.port && p.protocol === 'TCP').map(p => p.port) || [];
|
|
},
|
|
},
|
|
|
|
methods: {
|
|
willSave() {
|
|
const errors = [];
|
|
|
|
if (this.healthCheckEnabled && !this.healthcheckPort) {
|
|
errors.push(this.t('validation.required', { key: this.t('servicesPage.harvester.healthCheckPort.label') }, true));
|
|
}
|
|
|
|
if (errors.length > 0) {
|
|
return Promise.reject(errors);
|
|
}
|
|
|
|
HARVESTER_ADD_ON_CONFIG.forEach((c) => {
|
|
this.value.metadata.annotations[c.key] = String(get(this, c.variableName));
|
|
});
|
|
|
|
if (!this.healthCheckEnabled) {
|
|
delete this.value.metadata.annotations['cloudprovider.harvesterhci.io/healthcheck-port'];
|
|
delete this.value.metadata.annotations['cloudprovider.harvesterhci.io/healthcheck-success-threshold'];
|
|
delete this.value.metadata.annotations['cloudprovider.harvesterhci.io/healthcheck-failure-threshold'];
|
|
delete this.value.metadata.annotations['cloudprovider.harvesterhci.io/healthcheck-periodseconds'];
|
|
delete this.value.metadata.annotations['cloudprovider.harvesterhci.io/healthcheck-timeoutseconds'];
|
|
}
|
|
},
|
|
},
|
|
};
|
|
</script>
|
|
|
|
<template>
|
|
<div>
|
|
<div class="row mt-30">
|
|
<div class="col span-6">
|
|
<LabeledSelect
|
|
v-model="ipam"
|
|
:mode="mode"
|
|
:options="ipamOptions"
|
|
:label="t('servicesPage.harvester.ipam.label')"
|
|
:disabled="mode === 'edit'"
|
|
/>
|
|
</div>
|
|
</div>
|
|
|
|
<div class="row mt-30">
|
|
<div class="col span-6">
|
|
<RadioGroup
|
|
v-model="healthCheckEnabled"
|
|
:mode="mode"
|
|
name="healthCheckEnabled"
|
|
:label="t('servicesPage.harvester.healthCheckEnabled.label')"
|
|
:labels="[t('generic.disabled'),t('generic.enabled')]"
|
|
:options="[false, true]"
|
|
/>
|
|
</div>
|
|
</div>
|
|
<div v-if="healthCheckEnabled">
|
|
<div class="row mt-10">
|
|
<div
|
|
v-if="healthCheckEnabled"
|
|
class="col span-6"
|
|
>
|
|
<LabeledSelect
|
|
v-model="healthcheckPort"
|
|
:mode="mode"
|
|
:options="portOptions"
|
|
required
|
|
:label="t('servicesPage.harvester.healthCheckPort.label')"
|
|
/>
|
|
</div>
|
|
<div class="col span-6">
|
|
<LabeledInput
|
|
v-model="healthCheckSuccessThreshold"
|
|
:mode="mode"
|
|
type="number"
|
|
:label="t('servicesPage.harvester.healthCheckSuccessThreshold.label')"
|
|
:tooltip="t('servicesPage.harvester.healthCheckSuccessThreshold.description')"
|
|
/>
|
|
</div>
|
|
</div>
|
|
<div class="row mt-10">
|
|
<div class="col span-6">
|
|
<LabeledInput
|
|
v-model="healthCheckFailureThreshold"
|
|
:mode="mode"
|
|
type="number"
|
|
:label="t('servicesPage.harvester.healthCheckFailureThreshold.label')"
|
|
:tooltip="t('servicesPage.harvester.healthCheckFailureThreshold.description')"
|
|
/>
|
|
</div>
|
|
<div class="col span-6">
|
|
<LabeledInput
|
|
v-model="healthCheckPeriod"
|
|
:mode="mode"
|
|
type="number"
|
|
:label="t('servicesPage.harvester.healthCheckPeriod.label')"
|
|
/>
|
|
</div>
|
|
</div>
|
|
<div class="row mt-10">
|
|
<div class="col span-6">
|
|
<LabeledInput
|
|
v-model="healthCheckTimeout"
|
|
:mode="mode"
|
|
type="number"
|
|
:label="t('servicesPage.harvester.healthCheckTimeout.label')"
|
|
/>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</template>
|