Merge branch 'api-legacy-telemetry-provider-v2'
This commit is contained in:
@@ -79,6 +79,7 @@ define([
|
||||
"key": "telemetry",
|
||||
"implementation": TelemetryCapability,
|
||||
"depends": [
|
||||
"openmct",
|
||||
"$injector",
|
||||
"$q",
|
||||
"$log"
|
||||
|
||||
@@ -24,8 +24,12 @@
|
||||
* Module defining TelemetryCapability. Created by vwoeltje on 11/12/14.
|
||||
*/
|
||||
define(
|
||||
[],
|
||||
function () {
|
||||
[
|
||||
'../../../src/api/objects/object-utils'
|
||||
],
|
||||
function (
|
||||
objectUtils
|
||||
) {
|
||||
|
||||
var ZERO = function () {
|
||||
return 0;
|
||||
@@ -103,7 +107,7 @@ define(
|
||||
* @implements {Capability}
|
||||
* @constructor
|
||||
*/
|
||||
function TelemetryCapability($injector, $q, $log, domainObject) {
|
||||
function TelemetryCapability(openmct, $injector, $q, $log, domainObject) {
|
||||
// We could depend on telemetryService directly, but
|
||||
// there isn't a platform implementation of this.
|
||||
this.initializeTelemetryService = function () {
|
||||
@@ -118,7 +122,7 @@ define(
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
this.openmct = openmct;
|
||||
this.$q = $q;
|
||||
this.$log = $log;
|
||||
this.domainObject = domainObject;
|
||||
@@ -160,6 +164,20 @@ define(
|
||||
};
|
||||
|
||||
|
||||
function asSeries(telemetry, defaultDomain, defaultRange) {
|
||||
return {
|
||||
getRangeValue: function (index, range) {
|
||||
return telemetry[index][range || defaultRange];
|
||||
},
|
||||
getDomainValue: function (index, domain) {
|
||||
return telemetry[index][domain || defaultDomain];
|
||||
},
|
||||
getPointCount: function () {
|
||||
return telemetry.length;
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
/**
|
||||
* Request telemetry data for this specific domain object.
|
||||
* @param {TelemetryRequest} [request] parameters for this
|
||||
@@ -169,11 +187,21 @@ define(
|
||||
*/
|
||||
TelemetryCapability.prototype.requestData = function requestTelemetry(request) {
|
||||
// Bring in any defaults from the object model
|
||||
var fullRequest = this.buildRequest(request || {}),
|
||||
source = fullRequest.source,
|
||||
key = fullRequest.key,
|
||||
telemetryService = this.telemetryService ||
|
||||
this.initializeTelemetryService(); // Lazy initialization
|
||||
var fullRequest = this.buildRequest(request || {});
|
||||
var source = fullRequest.source;
|
||||
var key = fullRequest.key;
|
||||
var telemetryService = this.telemetryService ||
|
||||
this.initializeTelemetryService(); // Lazy initialization
|
||||
|
||||
var domainObject = objectUtils.toNewFormat(this.domainObject.getModel(), this.domainObject.getId());
|
||||
var telemetryAPI = this.openmct.telemetry;
|
||||
|
||||
var metadata = telemetryAPI.getMetadata(domainObject);
|
||||
var defaultDomain = (metadata.valuesForHints(['domain'])[0] || {}).key;
|
||||
var defaultRange = (metadata.valuesForHints(['range'])[0] || {}).key;
|
||||
|
||||
var isLegacyProvider = telemetryAPI.findRequestProvider(domainObject) ===
|
||||
telemetryAPI.legacyProvider;
|
||||
|
||||
// Pull out the relevant field from the larger,
|
||||
// structured response.
|
||||
@@ -187,11 +215,17 @@ define(
|
||||
return telemetryService.requestTelemetry([fullRequest]);
|
||||
}
|
||||
|
||||
// If a telemetryService is not available,
|
||||
// getTelemetryService() should reject, and this should
|
||||
// bubble through subsequent then calls.
|
||||
return telemetryService &&
|
||||
requestTelemetryFromService().then(getRelevantResponse);
|
||||
if (isLegacyProvider) {
|
||||
// If a telemetryService is not available,
|
||||
// getTelemetryService() should reject, and this should
|
||||
// bubble through subsequent then calls.
|
||||
return telemetryService &&
|
||||
requestTelemetryFromService().then(getRelevantResponse);
|
||||
} else {
|
||||
return telemetryAPI.request(domainObject, fullRequest).then(function (telemetry) {
|
||||
return asSeries(telemetry, defaultDomain, defaultRange);
|
||||
});
|
||||
}
|
||||
};
|
||||
|
||||
/**
|
||||
@@ -217,12 +251,26 @@ define(
|
||||
* subscription request
|
||||
*/
|
||||
TelemetryCapability.prototype.subscribe = function subscribe(callback, request) {
|
||||
var fullRequest = this.buildRequest(request || {}),
|
||||
telemetryService = this.telemetryService ||
|
||||
this.initializeTelemetryService(); // Lazy initialization
|
||||
var fullRequest = this.buildRequest(request || {});
|
||||
var telemetryService = this.telemetryService ||
|
||||
this.initializeTelemetryService(); // Lazy initialization
|
||||
|
||||
var domainObject = objectUtils.toNewFormat(this.domainObject.getModel(), this.domainObject.getId());
|
||||
var telemetryAPI = this.openmct.telemetry;
|
||||
|
||||
var metadata = telemetryAPI.getMetadata(domainObject);
|
||||
var defaultDomain = (metadata.valuesForHints(['domain'])[0] || {}).key;
|
||||
var defaultRange = (metadata.valuesForHints(['range'])[0] || {}).key;
|
||||
|
||||
var isLegacyProvider = telemetryAPI.findSubscriptionProvider(domainObject) ===
|
||||
telemetryAPI.legacyProvider;
|
||||
|
||||
function update(telemetry) {
|
||||
callback(asSeries([telemetry], defaultDomain, defaultRange));
|
||||
}
|
||||
|
||||
// Unpack the relevant telemetry series
|
||||
function update(telemetries) {
|
||||
function updateLegacy(telemetries) {
|
||||
var source = fullRequest.source,
|
||||
key = fullRequest.key,
|
||||
result = ((telemetries || {})[source] || {})[key];
|
||||
@@ -231,8 +279,13 @@ define(
|
||||
}
|
||||
}
|
||||
|
||||
return telemetryService &&
|
||||
telemetryService.subscribe(update, [fullRequest]);
|
||||
// Avoid a loop here...
|
||||
if (isLegacyProvider) {
|
||||
return telemetryService &&
|
||||
telemetryService.subscribe(updateLegacy, [fullRequest]);
|
||||
} else {
|
||||
return telemetryAPI.subscribe(domainObject, update, fullRequest);
|
||||
}
|
||||
};
|
||||
|
||||
/**
|
||||
|
||||
@@ -32,8 +32,9 @@ define(
|
||||
mockTelemetryService,
|
||||
mockReject,
|
||||
mockUnsubscribe,
|
||||
telemetry;
|
||||
|
||||
telemetry,
|
||||
mockTelemetryAPI,
|
||||
mockAPI;
|
||||
|
||||
function mockPromise(value) {
|
||||
return {
|
||||
@@ -43,6 +44,9 @@ define(
|
||||
};
|
||||
}
|
||||
|
||||
function noop() {
|
||||
}
|
||||
|
||||
beforeEach(function () {
|
||||
mockInjector = jasmine.createSpyObj("$injector", ["get"]);
|
||||
mockQ = jasmine.createSpyObj("$q", ["when", "reject"]);
|
||||
@@ -79,7 +83,25 @@ define(
|
||||
// Bubble up...
|
||||
mockReject.then.andReturn(mockReject);
|
||||
|
||||
mockTelemetryAPI = jasmine.createSpyObj("telemetryAPI", [
|
||||
"getMetadata",
|
||||
"subscribe",
|
||||
"request",
|
||||
"findRequestProvider",
|
||||
"findSubscriptionProvider"
|
||||
]);
|
||||
mockTelemetryAPI.getMetadata.andReturn({
|
||||
valuesForHints: function () {
|
||||
return [];
|
||||
}
|
||||
});
|
||||
|
||||
mockAPI = {
|
||||
telemetry: mockTelemetryAPI
|
||||
};
|
||||
|
||||
telemetry = new TelemetryCapability(
|
||||
mockAPI,
|
||||
mockInjector,
|
||||
mockQ,
|
||||
mockLog,
|
||||
@@ -113,7 +135,6 @@ define(
|
||||
key: "testKey", // from model
|
||||
start: 42 // from argument
|
||||
}]);
|
||||
|
||||
});
|
||||
|
||||
it("provides an empty series when telemetry is missing", function () {
|
||||
@@ -161,6 +182,57 @@ define(
|
||||
expect(mockLog.warn).toHaveBeenCalled();
|
||||
});
|
||||
|
||||
it("if a new style telemetry source is available, use it", function () {
|
||||
var mockProvider = {};
|
||||
mockTelemetryAPI.findSubscriptionProvider.andReturn(mockProvider);
|
||||
telemetry.subscribe(noop, {});
|
||||
expect(mockTelemetryService.subscribe).not.toHaveBeenCalled();
|
||||
expect(mockTelemetryAPI.subscribe).toHaveBeenCalled();
|
||||
});
|
||||
|
||||
it("if a new style telemetry source is not available, revert to old API", function () {
|
||||
mockTelemetryAPI.findSubscriptionProvider.andReturn(undefined);
|
||||
telemetry.subscribe(noop, {});
|
||||
expect(mockTelemetryAPI.subscribe).not.toHaveBeenCalled();
|
||||
expect(mockTelemetryService.subscribe).toHaveBeenCalled();
|
||||
});
|
||||
|
||||
it("Wraps telemetry returned from the new API as a telemetry series", function () {
|
||||
var returnedTelemetry;
|
||||
var mockTelemetry = [{
|
||||
prop1: "val1",
|
||||
prop2: "val2",
|
||||
prop3: "val3"
|
||||
},
|
||||
{
|
||||
prop1: "val4",
|
||||
prop2: "val5",
|
||||
prop3: "val6"
|
||||
}];
|
||||
var mockProvider = {};
|
||||
var dunzo = false;
|
||||
|
||||
mockTelemetryAPI.findRequestProvider.andReturn(mockProvider);
|
||||
mockTelemetryAPI.request.andReturn(Promise.resolve(mockTelemetry));
|
||||
|
||||
telemetry.requestData({}).then(function (data) {
|
||||
returnedTelemetry = data;
|
||||
dunzo = true;
|
||||
});
|
||||
|
||||
waitsFor(function () {
|
||||
return dunzo;
|
||||
});
|
||||
|
||||
runs(function () {
|
||||
expect(returnedTelemetry.getPointCount).toBeDefined();
|
||||
expect(returnedTelemetry.getDomainValue).toBeDefined();
|
||||
expect(returnedTelemetry.getRangeValue).toBeDefined();
|
||||
expect(returnedTelemetry.getPointCount()).toBe(2);
|
||||
});
|
||||
|
||||
});
|
||||
|
||||
it("allows subscriptions to updates", function () {
|
||||
var mockCallback = jasmine.createSpy("callback"),
|
||||
subscription = telemetry.subscribe(mockCallback);
|
||||
|
||||
Reference in New Issue
Block a user