diff --git a/src/pybind/mgr/dashboard/frontend/src/app/ceph/cluster/telemetry/telemetry.component.html b/src/pybind/mgr/dashboard/frontend/src/app/ceph/cluster/telemetry/telemetry.component.html
index f84930dc1dcb6..ed3d7b85a765e 100644
--- a/src/pybind/mgr/dashboard/frontend/src/app/ceph/cluster/telemetry/telemetry.component.html
+++ b/src/pybind/mgr/dashboard/frontend/src/app/ceph/cluster/telemetry/telemetry.component.html
@@ -185,6 +185,19 @@
i18n-placeholder>
+
diff --git a/src/pybind/mgr/dashboard/frontend/src/app/ceph/cluster/telemetry/telemetry.component.spec.ts b/src/pybind/mgr/dashboard/frontend/src/app/ceph/cluster/telemetry/telemetry.component.spec.ts
index 72215f6176f9a..e2d93c4b4526d 100644
--- a/src/pybind/mgr/dashboard/frontend/src/app/ceph/cluster/telemetry/telemetry.component.spec.ts
+++ b/src/pybind/mgr/dashboard/frontend/src/app/ceph/cluster/telemetry/telemetry.component.spec.ts
@@ -86,22 +86,28 @@ describe('TelemetryComponent', () => {
fixture.debugElement.nativeElement.querySelector('input[id=contact]');
const getDescriptionField = () =>
fixture.debugElement.nativeElement.querySelector('input[id=description]');
+ const checkVisibility = () => {
+ if (component.showContactInfo) {
+ expect(getContactField()).toBeTruthy();
+ expect(getDescriptionField()).toBeTruthy();
+ } else {
+ expect(getContactField()).toBeFalsy();
+ expect(getDescriptionField()).toBeFalsy();
+ }
+ };
- // Initially hidden.
- expect(getContactField()).toBeFalsy();
- expect(getDescriptionField()).toBeFalsy();
+ // Initial check.
+ checkVisibility();
- // Show fields.
+ // toggle fields.
component.toggleIdent();
fixture.detectChanges();
- expect(getContactField()).toBeTruthy();
- expect(getDescriptionField()).toBeTruthy();
+ checkVisibility();
- // Hide fields.
+ // toggle fields again.
component.toggleIdent();
fixture.detectChanges();
- expect(getContactField()).toBeFalsy();
- expect(getDescriptionField()).toBeFalsy();
+ checkVisibility();
});
it('should set module enability to true correctly', () => {
@@ -120,16 +126,6 @@ describe('TelemetryComponent', () => {
});
});
- it('should update the Telemetry configuration', () => {
- component.updateConfig();
- const req = httpTesting.expectOne('api/mgr/module/telemetry');
- expect(req.request.method).toBe('PUT');
- expect(req.request.body).toEqual({
- config: {}
- });
- req.flush({});
- });
-
it('should disable the Telemetry module', () => {
const message = 'Module disabled message.';
const followUpFunc = function () {
@@ -305,14 +301,22 @@ describe('TelemetryComponent', () => {
it('should submit', () => {
component.onSubmit();
- const req = httpTesting.expectOne('api/telemetry');
- expect(req.request.method).toBe('PUT');
- expect(req.request.body).toEqual({
+ const req1 = httpTesting.expectOne('api/telemetry');
+ expect(req1.request.method).toBe('PUT');
+ expect(req1.request.body).toEqual({
enable: true,
license_name: 'sharing-1-0'
});
- req.flush({});
- expect(router.navigate).toHaveBeenCalledWith(['']);
+ req1.flush({});
+ const req2 = httpTesting.expectOne({
+ url: 'api/mgr/module/telemetry',
+ method: 'PUT'
+ });
+ expect(req2.request.body).toEqual({
+ config: {}
+ });
+ req2.flush({});
+ expect(router.url).toBe('/');
});
});
});
diff --git a/src/pybind/mgr/dashboard/frontend/src/app/ceph/cluster/telemetry/telemetry.component.ts b/src/pybind/mgr/dashboard/frontend/src/app/ceph/cluster/telemetry/telemetry.component.ts
index 41d9f677553e5..882a2fe3c4036 100644
--- a/src/pybind/mgr/dashboard/frontend/src/app/ceph/cluster/telemetry/telemetry.component.ts
+++ b/src/pybind/mgr/dashboard/frontend/src/app/ceph/cluster/telemetry/telemetry.component.ts
@@ -25,6 +25,8 @@ export class TelemetryComponent extends CdForm implements OnInit {
licenseAgrmt = false;
moduleEnabled: boolean;
options: Object = {};
+ newConfig: Object = {};
+ configResp: object = {};
previewForm: CdFormGroup;
requiredFields = [
'channel_basic',
@@ -35,14 +37,16 @@ export class TelemetryComponent extends CdForm implements OnInit {
'interval',
'proxy',
'contact',
- 'description'
+ 'description',
+ 'organization'
];
+ contactInfofields = ['contact', 'description', 'organization'];
report: object = undefined;
reportId: number = undefined;
sendToUrl = '';
sendToDeviceUrl = '';
step = 1;
- showContactInfo = false;
+ showContactInfo: boolean;
constructor(
public actionLabels: ActionLabelsI18n,
@@ -67,10 +71,11 @@ export class TelemetryComponent extends CdForm implements OnInit {
this.moduleEnabled = configResp['enabled'];
this.sendToUrl = configResp['url'];
this.sendToDeviceUrl = configResp['device_url'];
+ this.showContactInfo = configResp['channel_ident'];
this.options = _.pick(resp[0], this.requiredFields);
- const configs = _.pick(configResp, this.requiredFields);
+ this.configResp = _.pick(configResp, this.requiredFields);
this.createConfigForm();
- this.configForm.setValue(configs);
+ this.configForm.setValue(this.configResp);
this.loadingReady();
},
(_error) => {
@@ -176,6 +181,23 @@ export class TelemetryComponent extends CdForm implements OnInit {
return result;
}
+ private updateReportFromConfig(updatedConfig: Object = {}) {
+ // update channels
+ const availableChannels: string[] = this.report['report']['channels_available'];
+ const updatedChannels = [];
+ for (const channel of availableChannels) {
+ const key = `channel_${channel}`;
+ if (updatedConfig[key]) {
+ updatedChannels.push(channel);
+ }
+ }
+ this.report['report']['channels'] = updatedChannels;
+ // update contactInfo
+ for (const contactInfofield of this.contactInfofields) {
+ this.report['report'][contactInfofield] = updatedConfig[contactInfofield];
+ }
+ }
+
private getReport() {
this.loadingStart();
@@ -183,6 +205,7 @@ export class TelemetryComponent extends CdForm implements OnInit {
(resp: object) => {
this.report = resp;
this.reportId = resp['report']['report_id'];
+ this.updateReportFromConfig(this.newConfig);
this.createPreviewForm();
this.loadingReady();
this.step++;
@@ -197,31 +220,25 @@ export class TelemetryComponent extends CdForm implements OnInit {
this.showContactInfo = !this.showContactInfo;
}
- updateConfig() {
- const config = {};
- _.forEach(Object.values(this.options), (option) => {
+ buildReport() {
+ this.newConfig = {};
+ for (const option of Object.values(this.options)) {
const control = this.configForm.get(option.name);
- // Append the option only if the value has been modified.
- if (control.dirty && control.valid) {
- config[option.name] = control.value;
- }
- });
- this.mgrModuleService.updateConfig('telemetry', config).subscribe(
- () => {
- this.disableModule(
- $localize`Your settings have been applied successfully. \
- Due to privacy/legal reasons the Telemetry module is now disabled until you \
- complete the next step and accept the license.`,
- () => {
- this.getReport();
- }
- );
- },
- () => {
- // Reset the 'Submit' button.
+ // Append the option only if they are valid
+ if (control.valid) {
+ this.newConfig[option.name] = control.value;
+ } else {
this.configForm.setErrors({ cdSubmitButton: true });
+ return;
}
- );
+ }
+ // reset contact info field if ident channel is off
+ if (!this.newConfig['channel_ident']) {
+ for (const contactInfofield of this.contactInfofields) {
+ this.newConfig[contactInfofield] = '';
+ }
+ }
+ this.getReport();
}
disableModule(message: string = null, followUpFunc: Function = null) {
@@ -239,25 +256,52 @@ export class TelemetryComponent extends CdForm implements OnInit {
}
next() {
- if (this.configForm.pristine) {
- this.getReport();
- } else {
- this.updateConfig();
- }
+ this.buildReport();
}
back() {
this.step--;
}
- onSubmit() {
- this.telemetryService.enable().subscribe(() => {
- this.telemetryNotificationService.setVisibility(false);
- this.notificationService.show(
- NotificationType.success,
- $localize`The Telemetry module has been configured and activated successfully.`
- );
- this.router.navigate(['']);
+ getChangedConfig() {
+ const updatedConfig = {};
+ _.forEach(this.requiredFields, (configField) => {
+ if (!_.isEqual(this.configResp[configField], this.newConfig[configField])) {
+ updatedConfig[configField] = this.newConfig[configField];
+ }
});
+ return updatedConfig;
+ }
+
+ onSubmit() {
+ const updatedConfig = this.getChangedConfig();
+ const observables = [
+ this.telemetryService.enable(),
+ this.mgrModuleService.updateConfig('telemetry', updatedConfig)
+ ];
+
+ observableForkJoin(observables).subscribe(
+ () => {
+ this.telemetryNotificationService.setVisibility(false);
+ this.notificationService.show(
+ NotificationType.success,
+ $localize`The Telemetry module has been configured and activated successfully.`
+ );
+ },
+ () => {
+ this.telemetryNotificationService.setVisibility(false);
+ this.notificationService.show(
+ NotificationType.error,
+ $localize`An Error occurred while updating the Telemetry module configuration.\
+ Please Try again`
+ );
+ // Reset the 'Update' button.
+ this.previewForm.setErrors({ cdSubmitButton: true });
+ },
+ () => {
+ this.newConfig = {};
+ this.router.navigate(['']);
+ }
+ );
}
}