Skip to content

Commit 7a24ffe

Browse files
committed
Allow removing default backend by selecting None
Default backend validation rules now only enforce required checks when a service is actually selected. Selecting "None" skips validation so the user can save, and willSave() cleans up the empty backend object.
1 parent 760f7e7 commit 7a24ffe

1 file changed

Lines changed: 35 additions & 14 deletions

File tree

  • shell/edit/networking.k8s.io.ingress

shell/edit/networking.k8s.io.ingress/index.vue

Lines changed: 35 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -94,10 +94,10 @@ export default {
9494
},
9595
{ path: 'spec', rules: ['backEndOrRules'] },
9696
{
97-
path: 'spec.defaultBackend.service.name', rules: ['required'], translationKey: 'ingress.defaultBackend.targetService.label'
97+
path: 'spec.defaultBackend.service.name', rules: ['defaultBackendNameRequired'], translationKey: 'ingress.defaultBackend.targetService.label'
9898
},
9999
{
100-
path: 'spec.defaultBackend.service.port', rules: ['portRequired', 'portRange'], translationKey: 'ingress.defaultBackend.port.label'
100+
path: 'spec.defaultBackend.service.port', rules: ['defaultBackendPortRequired', 'portRange'], translationKey: 'ingress.defaultBackend.port.label'
101101
},
102102
{ path: 'spec.tls.hosts', rules: ['required', 'wildcardHostname'] }
103103
],
@@ -156,8 +156,36 @@ export default {
156156
}
157157
};
158158
159+
const hasDefaultBackendService = () => {
160+
const backend = get(this.value?.spec, this.value.defaultBackendPath);
161+
162+
return !!get(backend, this.value.serviceNamePath);
163+
};
164+
165+
const nameLabel = this.t('ingress.defaultBackend.targetService.label');
166+
167+
// Only enforce required on the default backend when a service is selected.
168+
// Selecting "None" means the user wants to remove the backend; willSave() handles cleanup.
169+
const defaultBackendNameRequired = (name) => {
170+
if (hasDefaultBackendService() && !name) {
171+
return this.t('validation.required', { key: nameLabel });
172+
}
173+
};
174+
175+
const defaultBackendPortRequired = (port) => {
176+
if (!hasDefaultBackendService()) {
177+
return;
178+
}
179+
180+
return portRequired(port);
181+
};
182+
159183
return {
160-
backEndOrRules, portRequired, portRange
184+
backEndOrRules,
185+
portRequired,
186+
portRange,
187+
defaultBackendNameRequired,
188+
defaultBackendPortRequired,
161189
};
162190
},
163191
tabErrors() {
@@ -176,17 +204,10 @@ export default {
176204
};
177205
},
178206
defaultBackendPathRules() {
179-
const rulesExist = (this.value?.spec?.rules || []).length > 0;
180-
const defaultBackendExist = !!this.value?.spec?.defaultBackend?.service;
181-
182-
if (!rulesExist || defaultBackendExist) {
183-
return {
184-
name: this.fvGetAndReportPathRules('spec.defaultBackend.service.name'),
185-
port: this.fvGetAndReportPathRules('spec.defaultBackend.service.port'),
186-
};
187-
}
188-
189-
return { name: [], port: [] };
207+
return {
208+
name: this.fvGetAndReportPathRules('spec.defaultBackend.service.name'),
209+
port: this.fvGetAndReportPathRules('spec.defaultBackend.service.port'),
210+
};
190211
},
191212
serviceTargets() {
192213
return this.ingressHelper.findAndMapServiceTargets(this.services);

0 commit comments

Comments
 (0)