From 3c1527544df835a831898edbd74a473f027bb855 Mon Sep 17 00:00:00 2001 From: "Lucas, John (jl1315)" Date: Wed, 23 Aug 2017 18:58:33 +0000 Subject: deployment handler initial seed code Change-Id: I0bfc86d17edead0114ea0012fb469014e978cd15 Issue-Id: DCAEGEN2-43 Signed-off-by: J. F. Lucas --- lib/inventory.js | 169 +++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 169 insertions(+) create mode 100644 lib/inventory.js (limited to 'lib/inventory.js') diff --git a/lib/inventory.js b/lib/inventory.js new file mode 100644 index 0000000..75a0e47 --- /dev/null +++ b/lib/inventory.js @@ -0,0 +1,169 @@ +/* +Copyright(c) 2017 AT&T Intellectual Property. All rights reserved. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. + +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, +software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR +CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and limitations under the License. +*/ + + /* Routines related to accessing DCAE inventory */ + + "use strict"; + + const req = require('./promise_request'); + const createError = require('./dispatcher-error').createDispatcherError; + + const INV_SERV_TYPES = '/dcae-service-types'; + const INV_SERVICES = '/dcae-services'; + + /* + * Common error handling for inventory API calls + */ + const invError = function(err) { + if (err.status && err.status === 404) { + /* Map 404 to an empty list */ + return []; + } + else { + var newErr; + var message; + if (err.status) { + /* Got a response from inventory indicating an error */ + message = "Error response " + err.status + " from DCAE inventory: " + err.body; + newErr = createError(message, 502, "api", 501, "dcae-inventory"); + } + else { + /* Problem connecting to inventory */ + message = "Error communicating with inventory: " + err.message; + newErr = createError(message, 504, "system", 201, "dcae-inventory"); + } + throw newErr; + } + }; + + module.exports = function(options) { + + const url = options.url; + + return { + + /* Add a DCAE service to the inventory. Done after a deployment.*/ + addService: function(deploymentId, serviceType, vnfId, vnfType, vnfLocation, outputs) { + + /* Create the service description */ + var serviceDescription = + { + "vnfId" : vnfId, + "vnfType" : vnfType, + "vnfLocation" : vnfLocation, + "typeId" : serviceType, + "deploymentRef" : deploymentId + }; + + // TODO create 'components' array using 'outputs'--for now, a dummy + serviceDescription.components = [ + { + componentType: "dummy_component", + componentId: "/components/dummy", + componentSource: "DCAEController", + shareable: 0 + } + ]; + + const reqOptions = { + method : "PUT", + uri : url + INV_SERVICES + "/" + deploymentId, + json: serviceDescription + }; + + return req.doRequest(reqOptions); + }, + + /* Remove a DCAE service from the inventory. Done after an undeployment. */ + deleteService: function(serviceId) { + return req.doRequest({method: "DELETE", uri: url + INV_SERVICES + "/" + serviceId}); + }, + + /* Find running/deploying instances of services (with a given type name, if specified) */ + getServicesByType: function(query) { + var options = { + method: 'GET', + uri: url + INV_SERVICES, + qs: query || {} + }; + + return req.doRequest(options) + .then (function (result) { + var services = []; + var content = JSON.parse(result.body); + if(content.items) { + /* Pick out the fields we want */ + services = content.items.map(function(i) { return { deploymentId: i.deploymentRef, serviceTypeId: i.typeId};}); + } + return services; + }) + .catch(invError); + }, + + /* Find a blueprint given the service type ID -- return blueprint and type ID */ + getBlueprintByType: function(serviceTypeId) { + return req.doRequest({ + method: "GET", + uri: url + INV_SERV_TYPES + '/' + serviceTypeId + }) + .then (function(result) { + var blueprintInfo = {}; + var content = JSON.parse(result.body); + blueprintInfo.blueprint = content.blueprintTemplate; + blueprintInfo.typeId = content.typeId; + + return blueprintInfo; + }) + .catch(invError); + }, + + /* + * Verify that the specified deployment ID does not already have + * an entry in inventory. This is needed to enforce the rule that + * creating a second instance of a deployment under the + * same ID as an existing deployment is not permitted. + * The function checks for a service in inventory using the + * deployment ID as service name. If it doesn't exist, the function + * resolves its promise. If it *does* exist, then it throws an error. + */ + verifyUniqueDeploymentId: function(deploymentId) { + + return req.doRequest({ + method: "GET", + uri: url + INV_SERVICES + "/" + deploymentId + }) + + /* Successful lookup -- the deployment exists, so throw an error */ + .then(function(res) { + throw createError("Deployment " + deploymentId + " already exists", 409, "api", 501); + }, + + /* Error from the lookup -- either deployment ID doesn't exist or some other problem */ + function (err) { + + /* Inventory returns a 404 if it does not find the deployment ID */ + if (err.status === 404) { + return true; + } + + /* Some other error -- it really is an error and we can't continue */ + else { + return invError(err); + } + }); + } + }; + }; -- cgit 1.2.3-korg