From: Afreen Misbah Date: Wed, 22 Apr 2026 13:06:21 +0000 (+0530) Subject: mgr/dashboard: Fix service form to take into account labels X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=2cb8fafb73cabe7181a402ec7bd89d11b5a4b635;p=ceph.git mgr/dashboard: Fix service form to take into account labels Fixes https://tracker.ceph.com/issues/76215 - placement label for services takes only a single label - when multiple labels or an array of labels is passed the service was not getting created Signed-off-by: Afreen Misbah --- diff --git a/src/pybind/mgr/dashboard/frontend/src/app/ceph/cluster/services/service-form/service-form.component.html b/src/pybind/mgr/dashboard/frontend/src/app/ceph/cluster/services/service-form/service-form.component.html index 648b0282202d..c7552e233e62 100644 --- a/src/pybind/mgr/dashboard/frontend/src/app/ceph/cluster/services/service-form/service-form.component.html +++ b/src/pybind/mgr/dashboard/frontend/src/app/ceph/cluster/services/service-form/service-form.component.html @@ -322,7 +322,7 @@ @if (hostsAndLabels$ | async; as data) { @if (!serviceForm.controls.unmanaged.value && serviceForm.controls.placement.value === 'label') {
- + [invalidText]="requiredFieldLabel"> @@ -354,7 +352,7 @@ id="hosts" [appendInline]="true" [items]="data.hosts" - (selected)="multiSelector($event, 'hosts')" + (selected)="multiSelector($event)" i18n> diff --git a/src/pybind/mgr/dashboard/frontend/src/app/ceph/cluster/services/service-form/service-form.component.spec.ts b/src/pybind/mgr/dashboard/frontend/src/app/ceph/cluster/services/service-form/service-form.component.spec.ts index 2490f993d497..e3ea965b0d3a 100644 --- a/src/pybind/mgr/dashboard/frontend/src/app/ceph/cluster/services/service-form/service-form.component.spec.ts +++ b/src/pybind/mgr/dashboard/frontend/src/app/ceph/cluster/services/service-form/service-form.component.spec.ts @@ -105,15 +105,18 @@ describe('ServiceFormComponent', () => { }); }); - it('should test placement (label)', () => { + it('should test placement (label) with single select value', () => { + // placement labels take only single value formHelper.setValue('service_type', 'mgr'); formHelper.setValue('placement', 'label'); - formHelper.setValue('label', [{ content: 'foo', selected: true }]); + formHelper.setValue('label', 'foo'); + component.onSubmit(); + expect(cephServiceService.create).toHaveBeenCalledWith({ service_type: 'mgr', placement: { - label: ['foo'] + label: 'foo' }, unmanaged: false }); diff --git a/src/pybind/mgr/dashboard/frontend/src/app/ceph/cluster/services/service-form/service-form.component.ts b/src/pybind/mgr/dashboard/frontend/src/app/ceph/cluster/services/service-form/service-form.component.ts index 6ecb3ba29158..03025cce416e 100644 --- a/src/pybind/mgr/dashboard/frontend/src/app/ceph/cluster/services/service-form/service-form.component.ts +++ b/src/pybind/mgr/dashboard/frontend/src/app/ceph/cluster/services/service-form/service-form.component.ts @@ -80,7 +80,6 @@ export class ServiceFormComponent extends CdForm implements OnInit { resource: string; serviceTypes: string[] = []; serviceIds: string[] = []; - selectedLabels: string[] = []; selectedHosts: string[] = []; labels: string[]; labelClick = new Subject(); @@ -1355,9 +1354,9 @@ export class ServiceFormComponent extends CdForm implements OnInit { } break; case 'label': - serviceSpec['placement']['label'] = values['label'] - .filter((label: { content: string; selected: boolean }) => label.selected) - .map((label: { content: string }) => label.content); + if (!_.isEmpty(values['label'])) { + serviceSpec['placement']['label'] = values['label']?.content; + } break; } if (_.isNumber(values['count']) && values['count'] > 0) { @@ -1499,9 +1498,8 @@ export class ServiceFormComponent extends CdForm implements OnInit { }); } - multiSelector(event: any, field: 'label' | 'hosts') { - if (field === 'hosts') this.selectedHosts = event.map((host: any) => host.content); - else this.selectedLabels = event.map((label: any) => label.content); + multiSelector(event: any) { + this.selectedHosts = event.map((host: any) => host.content); } get isPrefixedNamedService(): boolean {