From ca8cad0a74c52f2cc1bb5ece151934e1bcea91b2 Mon Sep 17 00:00:00 2001 From: Pete Richards Date: Thu, 21 Sep 2017 10:26:26 -0700 Subject: [PATCH] [Telemetry] Legacy adapter handles source remap Update the Legacy Telemetry Adapter to handle source remapping for telemetry which has it. fixes https://github.com/nasa/openmct/issues/1724 --- platform/telemetry/src/TelemetryCapability.js | 31 +++++---- .../telemetry/test/TelemetryCapabilitySpec.js | 65 +++++++++++++++---- 2 files changed, 71 insertions(+), 25 deletions(-) diff --git a/platform/telemetry/src/TelemetryCapability.js b/platform/telemetry/src/TelemetryCapability.js index ed7a8b6f0d..38258cdb71 100644 --- a/platform/telemetry/src/TelemetryCapability.js +++ b/platform/telemetry/src/TelemetryCapability.js @@ -25,10 +25,12 @@ */ define( [ - '../../../src/api/objects/object-utils' + '../../../src/api/objects/object-utils', + 'lodash' ], function ( - objectUtils + objectUtils, + _ ) { var ZERO = function () { @@ -189,14 +191,17 @@ define( return fullRequest; }; + function asSeries(telemetry, defaultDomain, defaultRange, sourceMap) { + function getValue(index, key) { + return telemetry[index][sourceMap[key].source]; + } - function asSeries(telemetry, defaultDomain, defaultRange) { return { getRangeValue: function (index, range) { - return telemetry[index][range || defaultRange]; + return getValue(index, range || defaultRange); }, getDomainValue: function (index, domain) { - return telemetry[index][domain || defaultDomain]; + return getValue(index, domain || defaultDomain); }, getPointCount: function () { return telemetry.length; @@ -223,9 +228,11 @@ define( var telemetryAPI = this.openmct.telemetry; var metadata = telemetryAPI.getMetadata(domainObject); - var defaultDomain = metadata.valuesForHints(['domain'])[0].source; + var defaultDomain = metadata.valuesForHints(['domain'])[0].key; var defaultRange = metadata.valuesForHints(['range'])[0]; - defaultRange = defaultRange ? defaultRange.source : undefined; + defaultRange = defaultRange ? defaultRange.key : undefined; + + var sourceMap = _.indexBy(metadata.values(), 'key'); var isLegacyProvider = telemetryAPI.findRequestProvider(domainObject) === telemetryAPI.legacyProvider; @@ -250,7 +257,7 @@ define( requestTelemetryFromService().then(getRelevantResponse); } else { return telemetryAPI.request(domainObject, fullRequest).then(function (telemetry) { - return asSeries(telemetry, defaultDomain, defaultRange); + return asSeries(telemetry, defaultDomain, defaultRange, sourceMap); }); } }; @@ -286,15 +293,17 @@ define( var telemetryAPI = this.openmct.telemetry; var metadata = telemetryAPI.getMetadata(domainObject); - var defaultDomain = metadata.valuesForHints(['domain'])[0].source; + var defaultDomain = metadata.valuesForHints(['domain'])[0].key; var defaultRange = metadata.valuesForHints(['range'])[0]; - defaultRange = defaultRange ? defaultRange.source : undefined; + defaultRange = defaultRange ? defaultRange.key : undefined; + + var sourceMap = _.indexBy(metadata.values(), 'key'); var isLegacyProvider = telemetryAPI.findSubscriptionProvider(domainObject) === telemetryAPI.legacyProvider; function update(telemetry) { - callback(asSeries([telemetry], defaultDomain, defaultRange)); + callback(asSeries([telemetry], defaultDomain, defaultRange, sourceMap)); } // Unpack the relevant telemetry series diff --git a/platform/telemetry/test/TelemetryCapabilitySpec.js b/platform/telemetry/test/TelemetryCapabilitySpec.js index 8e65bdeada..9ff193d49f 100644 --- a/platform/telemetry/test/TelemetryCapabilitySpec.js +++ b/platform/telemetry/test/TelemetryCapabilitySpec.js @@ -34,6 +34,7 @@ define( mockUnsubscribe, telemetry, mockTelemetryAPI, + mockMetadata, mockAPI; function mockPromise(value) { @@ -90,14 +91,23 @@ define( "findRequestProvider", "findSubscriptionProvider" ]); - mockTelemetryAPI.getMetadata.andReturn({ - valuesForHints: function (hint) { - var metadatum = {}; - metadatum[hint] = "foo"; - return [metadatum]; - } + + mockMetadata = jasmine.createSpyObj('telemetryMetadata', [ + 'valuesForHints', + 'values' + ]); + + mockMetadata.valuesForHints.andCallFake(function (hints) { + var hint = hints[0]; + var metadatum = { + key: 'default' + hint + }; + metadatum[hint] = "foo"; + return [metadatum]; }); + mockTelemetryAPI.getMetadata.andReturn(mockMetadata); + mockAPI = { telemetry: mockTelemetryAPI, time: { @@ -150,8 +160,8 @@ define( key: "testKey", // from model start: 42, // from argument domain: 'mockTimeSystem', - domains: [{ domain: "foo" }], - ranges: [{ range: "foo" }] + domains: [{ domain: "foo", key: 'defaultdomain' }], + ranges: [{ range: "foo", key: 'defaultrange' }] }]); }); @@ -172,8 +182,8 @@ define( start: 0, end: 1, domain: 'mockTimeSystem', - domains: [{ domain: "foo" }], - ranges: [{ range: "foo" }] + domains: [{ domain: "foo", key: 'defaultdomain' }], + ranges: [{ range: "foo", key: 'defaultrange' }] }); }); @@ -191,8 +201,8 @@ define( start: 0, end: 1, domain: 'mockTimeSystem', - domains: [{ domain: "foo" }], - ranges: [{ range: "foo" }] + domains: [{ domain: "foo", key: 'defaultdomain' }], + ranges: [{ range: "foo", key: 'defaultrange' }] }); }); @@ -240,6 +250,21 @@ define( var mockProvider = {}; var dunzo = false; + mockMetadata.values.andReturn([ + { + key: 'defaultrange', + source: 'prop1' + }, + { + key: 'defaultdomain', + source: 'prop2' + }, + { + key: 'prop3', + source: 'prop3' + } + ]); + mockTelemetryAPI.findRequestProvider.andReturn(mockProvider); mockTelemetryAPI.request.andReturn(Promise.resolve(mockTelemetry)); @@ -257,6 +282,18 @@ define( expect(returnedTelemetry.getDomainValue).toBeDefined(); expect(returnedTelemetry.getRangeValue).toBeDefined(); expect(returnedTelemetry.getPointCount()).toBe(2); + // Default domain + remap should work. + expect(returnedTelemetry.getDomainValue(0)).toBe('val2'); + expect(returnedTelemetry.getDomainValue(1)).toBe('val5'); + // explicit domain should work + expect(returnedTelemetry.getDomainValue(0, 'prop3')).toBe('val3'); + expect(returnedTelemetry.getDomainValue(1, 'prop3')).toBe('val6'); + // default range + remap should work + expect(returnedTelemetry.getRangeValue(0)).toBe('val1'); + expect(returnedTelemetry.getRangeValue(1)).toBe('val4'); + // explicit range should work + expect(returnedTelemetry.getRangeValue(0, 'prop3')).toBe('val3'); + expect(returnedTelemetry.getRangeValue(1, 'prop3')).toBe('val6'); }); }); @@ -275,8 +312,8 @@ define( start: 0, end: 1, domain: 'mockTimeSystem', - domains: [{ domain: "foo" }], - ranges: [{ range: "foo" }] + domains: [{ domain: "foo", key: "defaultdomain" }], + ranges: [{ range: "foo", key: "defaultrange" }] }] );