summaryrefslogtreecommitdiffstats
path: root/tests
diff options
context:
space:
mode:
Diffstat (limited to 'tests')
-rw-r--r--tests/mock_deployment_handler.js103
-rw-r--r--tests/mock_utils.js36
-rw-r--r--tests/test_dcae-deployments.js633
-rw-r--r--tests/test_info.js59
-rw-r--r--tests/test_policy.js589
-rw-r--r--tests/test_zzz_run.js21
6 files changed, 1276 insertions, 165 deletions
diff --git a/tests/mock_deployment_handler.js b/tests/mock_deployment_handler.js
new file mode 100644
index 0000000..7407e55
--- /dev/null
+++ b/tests/mock_deployment_handler.js
@@ -0,0 +1,103 @@
+/*
+Copyright(c) 2018 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.
+*/
+
+/**
+ * mock-deployment_handler - base server for all other tests
+ */
+
+"use strict";
+
+const nock = require('nock');
+const utils = require('./mock_utils');
+
+const MAIN_PATH = './../';
+
+const CONSUL_URL = 'http://consul:8500';
+const MOCK_CLOUDIFY_MANAGER = "mock_cloudify_manager";
+const CLOUDIFY_URL = "http://" + MOCK_CLOUDIFY_MANAGER + ":80";
+
+const MOCK_INVENTORY = "mock_inventory";
+const INVENTORY_URL = "https://" + MOCK_INVENTORY + ":8080";
+
+nock(CONSUL_URL).persist().get('/v1/kv/deployment_handler?raw')
+ .reply(200, {"logLevel": "DEBUG", "cloudify": {"protocol": "http"}});
+
+nock(CONSUL_URL).persist().get('/v1/catalog/service/cloudify_manager')
+ .reply(200, [{
+ "ID":"deadbeef-dead-beef-dead-beefdeadbeef",
+ "Node":"devorcl00",
+ "Address": MOCK_CLOUDIFY_MANAGER,
+ "Datacenter":"rework-central",
+ "TaggedAddresses":{"lan": MOCK_CLOUDIFY_MANAGER,"wan": MOCK_CLOUDIFY_MANAGER},
+ "NodeMeta":{},
+ "ServiceID":"cloudify_manager",
+ "ServiceName":"cloudify_manager",
+ "ServiceTags":["http://" + MOCK_CLOUDIFY_MANAGER + "/api/v2.1"],
+ "ServiceAddress": MOCK_CLOUDIFY_MANAGER,
+ "ServicePort":80,
+ "ServiceEnableTagOverride":false,
+ "CreateIndex":16,
+ "ModifyIndex":16
+ }]);
+
+nock(CONSUL_URL).persist().get('/v1/catalog/service/inventory')
+ .reply(200, [{
+ "ID": "",
+ "Node": "inventory_mock_node",
+ "Address": MOCK_INVENTORY,
+ "Datacenter": "rework-central",
+ "TaggedAddresses": null,
+ "NodeMeta": null,
+ "ServiceID": "inventory",
+ "ServiceName": "inventory",
+ "ServiceTags": [],
+ "ServiceAddress": "",
+ "ServicePort": 8080,
+ "ServiceEnableTagOverride": false,
+ "CreateIndex": 8068,
+ "ModifyIndex": 8068
+ }]);
+
+const tests = [];
+
+const run_dh = function() {
+ describe('run deployment-handler', () => {
+ it('starting deployment-handler server', function() {
+ console.log("starting deployment-handler server");
+ const dh_server = require(MAIN_PATH + 'deployment-handler');
+
+ return utils.sleep(5000).then(function() {
+ console.log("starting tests: count =", tests.length);
+ if (Array.isArray(tests)) {
+ tests.forEach(test => {
+ test(dh_server);
+ });
+ }
+ })
+ .catch(function(e) {
+ const error = "test of deployment-handler exiting due to test problem: " + e.message
+ + " " + (e.stack || "").replace(/\n/g, " ");
+ console.error(error);
+ throw e;
+ });
+ }).timeout(10000);
+ });
+};
+
+module.exports.INVENTORY_URL = INVENTORY_URL;
+module.exports.CLOUDIFY_URL = CLOUDIFY_URL;
+module.exports.add_tests = function(new_tests) {Array.prototype.push.apply(tests, new_tests);};
+module.exports.run_dh = run_dh;
diff --git a/tests/mock_utils.js b/tests/mock_utils.js
new file mode 100644
index 0000000..311e9dc
--- /dev/null
+++ b/tests/mock_utils.js
@@ -0,0 +1,36 @@
+/*
+Copyright(c) 2018 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.
+*/
+
+"use strict";
+
+module.exports.sleep = function(time) {
+ console.log("sleep for " + time + " msecs...");
+ return new Promise((resolve) => setTimeout(() => {
+ console.log("woke up after " + time + " msecs");
+ resolve();
+ }, time));
+};
+
+module.exports.ActionTimer = class ActionTimer {
+ constructor() {
+ this.started = Date.now();
+ }
+ get step() {
+ let num = Date.now() - this.started;
+ return ("000000" + num).slice(-Math.max(5, (""+num).length));
+ }
+};
+
diff --git a/tests/test_dcae-deployments.js b/tests/test_dcae-deployments.js
new file mode 100644
index 0000000..664615e
--- /dev/null
+++ b/tests/test_dcae-deployments.js
@@ -0,0 +1,633 @@
+/*
+Copyright(c) 2018 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.
+*/
+
+/**
+ * handling policy updates
+ */
+
+"use strict";
+
+const nock = require('nock')
+ , chai = require('chai')
+ , chaiHttp = require('chai-http')
+ , expect = chai.expect
+ , assert = chai.assert
+ , admzip = require('adm-zip');
+
+chai.use(chaiHttp);
+
+const dh = require('./mock_deployment_handler');
+const utils = require('./mock_utils');
+
+const INV_PATH_DCAE_SERVICES = "/dcae-services";
+const INV_PATH_DCAE_SERVICE_TYPES = "/dcae-service-types/";
+const INV_PARAM_TYPE_ID = "?typeId=";
+
+const I_DONT_KNOW = "i-dont-know";
+const DEPLOYMENT_ID_JFL = "dep-jfl-000";
+const DEPLOYMENT_ID_JFL_1 = "dep-jfl-001";
+const EXISTING_DEPLOYMENT_ID = "deployment-CL-2229";
+const INV_EXISTING_SERVICE_TYPE = "86615fc1-aed9-4aa2-9e4b-abdaccbe63de";
+
+const Inventory = {
+ resp_empty: {"links":{"previousLink":null,"nextLink":null},"totalCount":0,"items":[]},
+ resp_services: function(deployment_id, service_type, totalCount) {
+ service_type = service_type || "f93264ee-348c-44f6-af3d-15b157bba735";
+ const res = {
+ "links": {
+ "previousLink": null,
+ "nextLink": {
+ "rel": "next",
+ "href": dh.INVENTORY_URL + INV_PATH_DCAE_SERVICES
+ + (service_type && "/" + INV_PARAM_TYPE_ID + service_type + "&offset=25") || "/?offset=25"
+ }
+ },
+ "totalCount": totalCount || 190,
+ "items": []
+ };
+ Array.from(Array(totalCount || 1), (_, idx) => idx).forEach(index => {
+ const dpl_id = deployment_id + ((index && "_" + index) || "");
+ res.items.push({
+ "serviceId": dpl_id,
+ "selfLink": {
+ "rel": "self",
+ "href": dh.INVENTORY_URL + INV_PATH_DCAE_SERVICES + "/" + dpl_id
+ },
+ "created": 1503668339483,
+ "modified": 1503668339483,
+ "typeLink": {
+ "rel": "type",
+ "href": dh.INVENTORY_URL + INV_PATH_DCAE_SERVICE_TYPES + service_type
+ },
+ "vnfId": "dummyVnfId",
+ "vnfLink": null,
+ "vnfType": "dummyVnfType",
+ "vnfLocation": "dummyLocation",
+ "deploymentRef": dpl_id,
+ "components": [{
+ "componentId": "/components/dummy",
+ "componentLink": null,
+ "created": 1489768104449,
+ "modified": 1508260526203,
+ "componentType": "dummyComponent",
+ "componentSource": "DCAEController",
+ "status": null,
+ "location": null,
+ "shareable": 0
+ }]
+ });
+ });
+ return res;
+ },
+ resp_not_found_service: function(service_id) {
+ return {
+ "code": 1,
+ "type": "error",
+ "message": "DCAEService not found: " + service_id
+ };
+ },
+ resp_existing_blueprint: function(service_type) {
+ return {
+ "owner": "dcaeorch",
+ "typeName": "svc-type-000",
+ "typeVersion": 1,
+ "blueprintTemplate": "tosca_definitions_version: cloudify_dsl_1_3\nimports:\n - \"http://www.getcloudify.org/spec/cloudify/3.4/types.yaml\"\n - https://nexus.onap.org/service/local/repositories/raw/content/org.onap.dcaegen2.platform.plugins/R3/dockerplugin/3.2.0/dockerplugin_types.yaml\n - https://nexus.onap.org/service/local/repositories/raw/content/org.onap.dcaegen2.platform.plugins/R3/relationshipplugin/1.0.0/relationshipplugin_types.yaml\n - https://nexus.onap.org/service/local/repositories/raw/content/org.onap.dcaegen2.platform.plugins/R3/dcaepolicyplugin/2.3.0/dcaepolicyplugin_types.yaml\n\ninputs:\n dh_override:\n type: string\n default: \"dockerhost\"\n dh_location_id:\n type: string\n default: \"zone1\"\n aaiEnrichmentHost:\n type: string\n default: \"none\"\n aaiEnrichmentPort:\n type: string \n default: 8443\n enableAAIEnrichment:\n type: string\n default: false\n dmaap_host:\n type: string\n default: dmaap.onap-message-router \n dmaap_port:\n type: string\n default: 3904 \n enableRedisCaching:\n type: string\n default: false \n redisHosts:\n type: string \n tag_version:\n type: string\n default: \"nexus3.onap.org:10001/onap/org.onap.dcaegen2.deployments.tca-cdap-container:1.0.0\"\n consul_host:\n type: string\n default: consul-server.onap-consul\n consul_port:\n type: string\n default: \"8500\"\n cbs_host:\n type: string\n default: \"config-binding-service.dcae\"\n cbs_port:\n type: string\n default: \"10000\"\n policy_id:\n type: string\n default: \"none\"\n external_port:\n type: string\n description: \"Port for CDAPgui to be exposed\"\n default: \"32010\"\n scn_name: \n default: dcaegen2-analytics_tca_clampinstance_1\n type: string\nnode_templates:\n docker_service_host:\n properties:\n docker_host_override:\n get_input: dh_override\n location_id:\n get_input: dh_location_id\n type: dcae.nodes.SelectedDockerHost\n tca_docker:\n relationships:\n - type: dcae.relationships.component_contained_in\n target: docker_service_host\n - target: tca_policy\n type: cloudify.relationships.depends_on \n type: dcae.nodes.DockerContainerForComponentsUsingDmaap\n properties:\n application_config:\n app_config:\n appDescription: DCAE Analytics Threshold Crossing Alert Application\n appName: dcae-tca\n tcaAlertsAbatementTableName: TCAAlertsAbatementTable\n tcaAlertsAbatementTableTTLSeconds: '1728000'\n tcaSubscriberOutputStreamName: TCASubscriberOutputStream\n tcaVESAlertsTableName: TCAVESAlertsTable\n tcaVESAlertsTableTTLSeconds: '1728000'\n tcaVESMessageStatusTableName: TCAVESMessageStatusTable\n tcaVESMessageStatusTableTTLSeconds: '86400'\n thresholdCalculatorFlowletInstances: '2'\n app_preferences:\n aaiEnrichmentHost: \n get_input: aaiEnrichmentHost\n aaiEnrichmentIgnoreSSLCertificateErrors: 'true'\n aaiEnrichmentPortNumber: '8443'\n aaiEnrichmentProtocol: https\n aaiEnrichmentUserName: DCAE\n aaiEnrichmentUserPassword: DCAE\n aaiVMEnrichmentAPIPath: /aai/v11/search/nodes-query\n aaiVNFEnrichmentAPIPath: /aai/v11/network/generic-vnfs/generic-vnf\n enableAAIEnrichment: \n get_input: enableAAIEnrichment\n enableRedisCaching: \n get_input: enableRedisCaching\n redisHosts: \n get_input: redisHosts\n enableAlertCEFFormat: 'false'\n publisherContentType: application/json\n publisherHostName: \n get_input: dmaap_host\n publisherHostPort: \n get_input: dmaap_port \n publisherMaxBatchSize: '1'\n publisherMaxRecoveryQueueSize: '100000'\n publisherPollingInterval: '20000'\n publisherProtocol: http\n publisherTopicName: unauthenticated.DCAE_CL_OUTPUT\n subscriberConsumerGroup: OpenDCAE-c12\n subscriberConsumerId: c12\n subscriberContentType: application/json\n subscriberHostName: \n get_input: dmaap_host\n subscriberHostPort:\n get_input: dmaap_port \n subscriberMessageLimit: '-1'\n subscriberPollingInterval: '30000'\n subscriberProtocol: http\n subscriberTimeoutMS: '-1'\n subscriberTopicName: unauthenticated.SEC_MEASUREMENT_OUTPUT\n tca_policy_default: '{\"domain\":\"measurementsForVfScaling\",\"metricsPerEventName\":[{\"eventName\":\"vFirewallBroadcastPackets\",\"controlLoopSchemaType\":\"VNF\",\"policyScope\":\"DCAE\",\"policyName\":\"DCAE.Config_tca-hi-lo\",\"policyVersion\":\"v0.0.1\",\"thresholds\":[{\"closedLoopControlName\":\"ControlLoop-vFirewall-d0a1dfc6-94f5-4fd4-a5b5-4630b438850a\",\"version\":\"1.0.2\",\"fieldPath\":\"$.event.measurementsForVfScalingFields.vNicUsageArray[*].receivedTotalPacketsDelta\",\"thresholdValue\":300,\"direction\":\"LESS_OR_EQUAL\",\"severity\":\"MAJOR\",\"closedLoopEventStatus\":\"ONSET\"},{\"closedLoopControlName\":\"ControlLoop-vFirewall-d0a1dfc6-94f5-4fd4-a5b5-4630b438850a\",\"version\":\"1.0.2\",\"fieldPath\":\"$.event.measurementsForVfScalingFields.vNicUsageArray[*].receivedTotalPacketsDelta\",\"thresholdValue\":700,\"direction\":\"GREATER_OR_EQUAL\",\"severity\":\"CRITICAL\",\"closedLoopEventStatus\":\"ONSET\"}]},{\"eventName\":\"vLoadBalancer\",\"controlLoopSchemaType\":\"VM\",\"policyScope\":\"DCAE\",\"policyName\":\"DCAE.Config_tca-hi-lo\",\"policyVersion\":\"v0.0.1\",\"thresholds\":[{\"closedLoopControlName\":\"ControlLoop-vDNS-6f37f56d-a87d-4b85-b6a9-cc953cf779b3\",\"version\":\"1.0.2\",\"fieldPath\":\"$.event.measurementsForVfScalingFields.vNicUsageArray[*].receivedTotalPacketsDelta\",\"thresholdValue\":300,\"direction\":\"GREATER_OR_EQUAL\",\"severity\":\"CRITICAL\",\"closedLoopEventStatus\":\"ONSET\"}]},{\"eventName\":\"Measurement_vGMUX\",\"controlLoopSchemaType\":\"VNF\",\"policyScope\":\"DCAE\",\"policyName\":\"DCAE.Config_tca-hi-lo\",\"policyVersion\":\"v0.0.1\",\"thresholds\":[{\"closedLoopControlName\":\"ControlLoop-vCPE-48f0c2c3-a172-4192-9ae3-052274181b6e\",\"version\":\"1.0.2\",\"fieldPath\":\"$.event.measurementsForVfScalingFields.additionalMeasurements[*].arrayOfFields[0].value\",\"thresholdValue\":0,\"direction\":\"EQUAL\",\"severity\":\"MAJOR\",\"closedLoopEventStatus\":\"ABATED\"},{\"closedLoopControlName\":\"ControlLoop-vCPE-48f0c2c3-a172-4192-9ae3-052274181b6e\",\"version\":\"1.0.2\",\"fieldPath\":\"$.event.measurementsForVfScalingFields.additionalMeasurements[*].arrayOfFields[0].value\",\"thresholdValue\":0,\"direction\":\"GREATER\",\"severity\":\"CRITICAL\",\"closedLoopEventStatus\":\"ONSET\"}]}]}'\n service_component_type: dcaegen2-analytics_tca \n docker_config:\n healthcheck:\n endpoint: /\n interval: 15s\n timeout: 1s\n type: http\n image:\n get_input: tag_version \n service_component_name_override: \n get_input: scn_name \n interfaces:\n cloudify.interfaces.lifecycle:\n start:\n inputs:\n envs:\n DMAAPHOST: \n { get_input: dmaap_host }\n DMAAPPORT:\n { get_input: dmaap_port }\n DMAAPPUBTOPIC: \"unauthenticated.DCAE_CL_OUTPUT\"\n DMAAPSUBTOPIC: \"unauthenticated.SEC_MEASUREMENT_OUTPUT\"\n AAIHOST: \n { get_input: aaiEnrichmentHost }\n AAIPORT: \n { get_input: aaiEnrichmentPort }\n CONSUL_HOST: \n { get_input: consul_host }\n CONSUL_PORT: \n { get_input: consul_port }\n CBS_HOST: \n { get_input: cbs_host }\n CBS_PORT: \n { get_input: cbs_port }\n CONFIG_BINDING_SERVICE: \"config_binding_service\" \n SERVICE_11011_NAME: \n { get_input: scn_name }\n SERVICE_11015_IGNORE: \"true\" \n ports:\n - concat: [\"11011:\", { get_input: external_port }] \n stop:\n inputs:\n cleanup_image: true \n tca_policy:\n type: dcae.nodes.policy\n properties:\n policy_id:\n get_input: policy_id\n",
+ "serviceIds": null,
+ "vnfTypes": ["TESTVNF000"],
+ "serviceLocations": null,
+ "asdcServiceId": null,
+ "asdcResourceId": null,
+ "asdcServiceURL": null,
+ "typeId": service_type,
+ "selfLink": {
+ "rel": "self",
+ "href": dh.INVENTORY_URL + INV_PATH_DCAE_SERVICE_TYPES + service_type
+ },
+ "created": 1500910967567,
+ "deactivated": null
+ };
+ },
+ resp_put_service: function(deployment_id, service_type) {
+ return {
+ "serviceId": deployment_id,
+ "selfLink": {
+ "rel": "self",
+ "href": dh.INVENTORY_URL + INV_PATH_DCAE_SERVICES + "/" + deployment_id
+ },
+ "created": 1516376798582,
+ "modified": 1516376798582,
+ "typeLink": {
+ "rel": "type",
+ "href": dh.INVENTORY_URL + INV_PATH_DCAE_SERVICE_TYPES + service_type
+ },
+ "vnfId": "dummyVnfId",
+ "vnfLink": null,
+ "vnfType": "dummyVnfType",
+ "vnfLocation": "dummyLocation",
+ "deploymentRef": deployment_id,
+ "components": [{
+ "componentId": "/components/dummy",
+ "componentLink": null,
+ "created": 1489768104449,
+ "modified": 1516376798582,
+ "componentType": "dummy_component",
+ "componentSource": "DCAEController",
+ "status": null,
+ "location": null,
+ "shareable": 0
+ }]
+ };
+ }
+};
+
+const Cloudify = {
+ resp_blueprint: function(deployment_id) {
+ return {
+ "main_file_name": "blueprint.yaml",
+ "description": null,
+ "created_at": "2018-01-19 15:46:47.037084",
+ "updated_at": "2018-01-19 15:46:47.037084",
+ "plan": {},
+ "id": deployment_id
+ };
+ },
+ resp_deploy: function(deployment_id, blueprint_id, inputs) {
+ return {
+ "inputs": (inputs && JSON.parse(JSON.stringify(inputs)) || null),
+ "description": null,
+ "created_at": "2018-01-19 15:46:47.037084",
+ "updated_at": "2018-01-19 15:46:47.037084",
+ "id": deployment_id,
+ "blueprint_id": blueprint_id || deployment_id
+ };
+ },
+ resp_execution: function(deployment_id, blueprint_id, execution_id, terminated, workflow_id) {
+ return {
+ "status": (terminated && "terminated") || "pending",
+ "created_at": "2018-01-19 15:51:21.866227",
+ "workflow_id": workflow_id || "install",
+ "is_system_workflow": false,
+ "parameters": {},
+ "blueprint_id": blueprint_id || deployment_id,
+ "deployment_id": deployment_id,
+ "error": "",
+ "id": execution_id
+ };
+ },
+ resp_outputs: function(deployment_id) {
+ return {"outputs": {}, "deployment_id": deployment_id};
+ }
+};
+
+function test_get_dcae_deployments(dh_server) {
+ const req_path = "/dcae-deployments";
+ const test_txt = "GET " + req_path;
+ describe(test_txt, () => {
+ it('GET all the dcae-deployments from inventory', function() {
+ const action_timer = new utils.ActionTimer();
+ console.log(action_timer.step, test_txt);
+
+ const inv_resp = Inventory.resp_services(EXISTING_DEPLOYMENT_ID);
+ nock(dh.INVENTORY_URL).get(INV_PATH_DCAE_SERVICES)
+ .reply(200, function(uri) {
+ console.log(action_timer.step, "get", dh.INVENTORY_URL, uri);
+ return JSON.stringify(inv_resp);
+ });
+
+ return chai.request(dh_server.app).get(req_path)
+ .then(function(res) {
+ console.log(action_timer.step, "res for", test_txt, res.text);
+ expect(res).to.have.status(200);
+ expect(res).to.be.json;
+
+ assert.containsAllKeys(res.body, {"requestId": "", "deployments": []});
+ assert.isString(res.body.requestId);
+ assert.isArray(res.body.deployments);
+ assert.lengthOf(res.body.deployments, inv_resp.items.length);
+ assert.containsAllKeys(res.body.deployments[0], {"href":null});
+ assert.match(res.body.deployments[0].href,
+ new RegExp("^http:[/][/]127.0.0.1:[0-9]+[/]dcae-deployments[/]" + EXISTING_DEPLOYMENT_ID));
+ })
+ .catch(function(err) {
+ console.error(action_timer.step, "err for", test_txt, err);
+ throw err;
+ });
+ });
+ });
+}
+
+function test_get_dcae_deployments_service_type_unknown(dh_server) {
+ const req_path = "/dcae-deployments?serviceTypeId=" + I_DONT_KNOW;
+ const test_txt = "GET " + req_path;
+ describe(test_txt, () => {
+ it('GET nothing for unknown service-type from inventory', function() {
+ const action_timer = new utils.ActionTimer();
+ console.log(action_timer.step, test_txt);
+ nock(dh.INVENTORY_URL).get(INV_PATH_DCAE_SERVICES + INV_PARAM_TYPE_ID + I_DONT_KNOW)
+ .reply(200, function(uri) {
+ console.log(action_timer.step, "get", dh.INVENTORY_URL, uri);
+ return JSON.stringify(Inventory.resp_empty);
+ }
+ );
+
+ return chai.request(dh_server.app).get(req_path)
+ .then(function(res) {
+ console.log(action_timer.step, "res for", test_txt, res.text);
+ expect(res).to.have.status(200);
+ expect(res).to.be.json;
+
+ assert.containsAllKeys(res.body, {"requestId": "", "deployments": []});
+ assert.isString(res.body.requestId);
+ assert.isArray(res.body.deployments);
+ assert.lengthOf(res.body.deployments, 0);
+ })
+ .catch(function(err) {
+ console.error(action_timer.step, "err for", test_txt, err);
+ throw err;
+ });
+ });
+ });
+}
+
+function create_main_message(service_type_id, include_inputs) {
+ var msg = {"serviceTypeId": service_type_id};
+ if (include_inputs) {
+ msg.inputs= {
+ "dcae_service_location" : "loc00",
+ "dcae_target_type" : "type000",
+ "dcae_target_name" : "target000"
+ };
+ }
+ return msg;
+}
+
+function test_put_dcae_deployments_i_dont_know(dh_server) {
+ const req_path = "/dcae-deployments/" + I_DONT_KNOW;
+ const message = create_main_message(I_DONT_KNOW);
+ const test_txt = "PUT " + req_path + ": " + JSON.stringify(message);
+ describe(test_txt, () => {
+ it('Fail to deploy i-dont-know service', function(done) {
+ const action_timer = new utils.ActionTimer();
+ console.log(action_timer.step, test_txt);
+ nock(dh.INVENTORY_URL).get(INV_PATH_DCAE_SERVICES + "/" + I_DONT_KNOW)
+ .reply(404, function(uri) {
+ console.log(action_timer.step, "get", dh.INVENTORY_URL, uri);
+ return JSON.stringify(Inventory.resp_not_found_service(I_DONT_KNOW));
+ });
+ nock(dh.INVENTORY_URL).get(INV_PATH_DCAE_SERVICE_TYPES + I_DONT_KNOW)
+ .reply(404, function(uri) {
+ console.log(action_timer.step, "get", dh.INVENTORY_URL, uri);
+ return "<html> <head><title>Error 404 Not Found</title></head><body></body> </html>";
+ });
+
+ chai.request(dh_server.app).put(req_path)
+ .set('content-type', 'application/json')
+ .send(message)
+ .end(function(err, res) {
+ console.log(action_timer.step, "res for", test_txt, res.text);
+ expect(res).to.have.status(404);
+ expect(res.body).to.have.property('message');
+ expect(res.body.message).to.be.equal("No service type with ID " + I_DONT_KNOW);
+ done();
+ });
+ });
+ });
+}
+
+function test_put_dcae_deployments_missing_input_error(dh_server) {
+ const req_path = "/dcae-deployments/" + DEPLOYMENT_ID_JFL;
+ const message = create_main_message(INV_EXISTING_SERVICE_TYPE);
+ const test_txt = "PUT " + req_path + ": " + JSON.stringify(message);
+ describe(test_txt, () => {
+ it('Fail to deploy service - missing_input', function(done) {
+ const action_timer = new utils.ActionTimer();
+ console.log(action_timer.step, test_txt);
+
+ nock(dh.INVENTORY_URL).get(INV_PATH_DCAE_SERVICES + "/" + DEPLOYMENT_ID_JFL)
+ .reply(404, function(uri) {
+ console.log(action_timer.step, "get", dh.INVENTORY_URL, uri);
+ return JSON.stringify(Inventory.resp_not_found_service(DEPLOYMENT_ID_JFL));
+ });
+ nock(dh.INVENTORY_URL).get(INV_PATH_DCAE_SERVICE_TYPES + INV_EXISTING_SERVICE_TYPE)
+ .reply(200, function(uri) {
+ console.log(action_timer.step, "get", dh.INVENTORY_URL, uri);
+ return JSON.stringify(Inventory.resp_existing_blueprint(INV_EXISTING_SERVICE_TYPE));
+ });
+ nock(dh.INVENTORY_URL).put(INV_PATH_DCAE_SERVICES + "/" + DEPLOYMENT_ID_JFL)
+ .reply(200, function(uri, requestBody) {
+ console.log(action_timer.step, "put", dh.INVENTORY_URL, uri, JSON.stringify(requestBody));
+ return JSON.stringify(Inventory.resp_put_service(DEPLOYMENT_ID_JFL, INV_EXISTING_SERVICE_TYPE));
+ });
+ nock(dh.INVENTORY_URL).delete(INV_PATH_DCAE_SERVICES + "/" + DEPLOYMENT_ID_JFL)
+ .reply(200, function(uri) {
+ console.log(action_timer.step, "delete", dh.INVENTORY_URL, uri);
+ return "";
+ });
+
+ nock(dh.CLOUDIFY_URL).put("/api/v2.1/blueprints/" + DEPLOYMENT_ID_JFL)
+ .reply(200, function(uri, requestBody) {
+ console.log(action_timer.step, "put", dh.CLOUDIFY_URL, uri, JSON.stringify(requestBody));
+ return JSON.stringify(Cloudify.resp_blueprint(DEPLOYMENT_ID_JFL));
+ });
+
+ const depl_rejected = {
+ "message": "Required inputs blah...",
+ "error_code": "missing_required_deployment_input_error",
+ "server_traceback": "Traceback blah..."
+ };
+ nock(dh.CLOUDIFY_URL).put("/api/v2.1/deployments/" + DEPLOYMENT_ID_JFL)
+ .reply(400, function(uri) {
+ console.log(action_timer.step, "put", dh.CLOUDIFY_URL, uri);
+ return JSON.stringify(depl_rejected);
+ });
+
+ chai.request(dh_server.app).put(req_path)
+ .set('content-type', 'application/json')
+ .send(message)
+ .end(function(err, res) {
+ console.log(action_timer.step, "res for", test_txt, res.text);
+ expect(res).to.have.status(400);
+ expect(res.body).to.have.property('message');
+ expect(res.body.message).to.be.equal("Status 400 from CM API -- error code: " + depl_rejected.error_code + " -- message: " + depl_rejected.message);
+ done();
+ });
+ });
+ });
+}
+
+function test_put_dcae_deployments_success(dh_server) {
+ const req_path = "/dcae-deployments/" + DEPLOYMENT_ID_JFL_1;
+ const message = create_main_message(INV_EXISTING_SERVICE_TYPE, true);
+ const test_txt = "PUT " + req_path + ": " + JSON.stringify(message);
+ const execution_id = "execution_" + DEPLOYMENT_ID_JFL_1;
+ describe(test_txt, () => {
+ it('Success deploy service', function() {
+ const action_timer = new utils.ActionTimer();
+ console.log(action_timer.step, test_txt);
+
+ nock(dh.INVENTORY_URL).get(INV_PATH_DCAE_SERVICES + "/" + DEPLOYMENT_ID_JFL_1)
+ .reply(404, function(uri) {
+ console.log(action_timer.step, "get", dh.INVENTORY_URL, uri);
+ return JSON.stringify(Inventory.resp_not_found_service(DEPLOYMENT_ID_JFL_1));
+ });
+ nock(dh.INVENTORY_URL).get(INV_PATH_DCAE_SERVICE_TYPES + INV_EXISTING_SERVICE_TYPE)
+ .reply(200, function(uri) {
+ console.log(action_timer.step, "get", dh.INVENTORY_URL, uri);
+ return JSON.stringify(Inventory.resp_existing_blueprint(INV_EXISTING_SERVICE_TYPE));
+ });
+ nock(dh.INVENTORY_URL).put(INV_PATH_DCAE_SERVICES + "/" + DEPLOYMENT_ID_JFL_1)
+ .reply(200, function(uri, requestBody) {
+ console.log(action_timer.step, "put", dh.INVENTORY_URL, uri, JSON.stringify(requestBody));
+ return JSON.stringify(Inventory.resp_put_service(DEPLOYMENT_ID_JFL_1, INV_EXISTING_SERVICE_TYPE));
+ });
+
+ nock(dh.CLOUDIFY_URL).put("/api/v2.1/blueprints/" + DEPLOYMENT_ID_JFL_1)
+ .reply(200, function(uri, requestBody) {
+ console.log(action_timer.step, "put", dh.CLOUDIFY_URL, uri, JSON.stringify(requestBody));
+ return JSON.stringify(Cloudify.resp_blueprint(DEPLOYMENT_ID_JFL_1));
+ });
+
+ nock(dh.CLOUDIFY_URL).put("/api/v2.1/deployments/" + DEPLOYMENT_ID_JFL_1)
+ .reply(201, function(uri, requestBody) {
+ console.log(action_timer.step, "put", dh.CLOUDIFY_URL, uri, JSON.stringify(requestBody));
+ return JSON.stringify(Cloudify.resp_deploy(DEPLOYMENT_ID_JFL_1, DEPLOYMENT_ID_JFL_1, message.inputs));
+ });
+
+ nock(dh.CLOUDIFY_URL).post("/api/v2.1/executions")
+ .reply(201, function(uri, requestBody) {
+ console.log(action_timer.step, "post", dh.CLOUDIFY_URL, uri, JSON.stringify(requestBody));
+ return JSON.stringify(Cloudify.resp_execution(DEPLOYMENT_ID_JFL_1, DEPLOYMENT_ID_JFL_1, execution_id));
+ });
+
+ nock(dh.CLOUDIFY_URL).get("/api/v2.1/executions/" + execution_id)
+ .reply(200, function(uri) {
+ console.log(action_timer.step, "get", dh.CLOUDIFY_URL, uri);
+ return JSON.stringify(Cloudify.resp_execution(DEPLOYMENT_ID_JFL_1, DEPLOYMENT_ID_JFL_1, execution_id, true));
+ });
+
+ nock(dh.CLOUDIFY_URL).get("/api/v2.1/deployments/" + DEPLOYMENT_ID_JFL_1 + "/outputs")
+ .reply(200, function(uri) {
+ console.log(action_timer.step, "get", dh.CLOUDIFY_URL, uri);
+ return JSON.stringify(Cloudify.resp_outputs(DEPLOYMENT_ID_JFL_1));
+ });
+
+ return chai.request(dh_server.app).put(req_path)
+ .set('content-type', 'application/json')
+ .send(message)
+ .then(function(res) {
+ console.log(action_timer.step, "res for", test_txt, res.text);
+ expect(res).to.have.status(202);
+ expect(res).to.be.json;
+
+ return utils.sleep(10000);
+ })
+ .then(function() {
+ console.log(action_timer.step, "the end of test");
+ })
+ .catch(function(err) {
+ console.error(action_timer.step, "err for", test_txt, err);
+ throw err;
+ });
+ }).timeout(50000);
+ });
+}
+
+function test_get_dcae_deployments_operation(dh_server) {
+ const execution_id = "execution_" + DEPLOYMENT_ID_JFL_1;
+ const req_path = "/dcae-deployments/" + DEPLOYMENT_ID_JFL_1 + "/operation/" + execution_id;
+ const test_txt = "GET " + req_path;
+ describe(test_txt, () => {
+ it('Get operation execution succeeded', function() {
+ const action_timer = new utils.ActionTimer();
+ console.log(action_timer.step, test_txt);
+ nock(dh.CLOUDIFY_URL).get("/api/v2.1/executions/" + execution_id)
+ .reply(200, function(uri) {
+ console.log(action_timer.step, "get", dh.CLOUDIFY_URL, uri);
+ return JSON.stringify(Cloudify.resp_execution(DEPLOYMENT_ID_JFL_1, DEPLOYMENT_ID_JFL_1, execution_id, true));
+ });
+
+ return chai.request(dh_server.app).get(req_path)
+ .then(function(res) {
+ console.log(action_timer.step, "res for", test_txt, res.text);
+ expect(res).to.have.status(200);
+ expect(res).to.be.json;
+ })
+ .catch(function(err) {
+ console.error(action_timer.step, "err for", test_txt, err);
+ throw err;
+ });
+ });
+ });
+}
+
+function test_get_dcae_deployments_service_type_deployed(dh_server) {
+ const req_path = "/dcae-deployments?serviceTypeId=" + INV_EXISTING_SERVICE_TYPE;
+ const test_txt = "GET " + req_path;
+ describe(test_txt, () => {
+ it('GET services=deployments of the service-type from inventory', function() {
+ const action_timer = new utils.ActionTimer();
+ console.log(action_timer.step, test_txt);
+ const deployed_count = 10;
+ nock(dh.INVENTORY_URL)
+ .get(INV_PATH_DCAE_SERVICES + INV_PARAM_TYPE_ID + INV_EXISTING_SERVICE_TYPE)
+ .reply(200, function(uri) {
+ console.log(action_timer.step, "get", dh.INVENTORY_URL, uri);
+ return JSON.stringify(Inventory.resp_services(DEPLOYMENT_ID_JFL_1, INV_EXISTING_SERVICE_TYPE, deployed_count));
+ });
+
+ return chai.request(dh_server.app).get(req_path)
+ .then(function(res) {
+ console.log(action_timer.step, "res for", test_txt, res.text);
+ expect(res).to.have.status(200);
+ expect(res).to.be.json;
+
+ assert.containsAllKeys(res.body, {"requestId": "", "deployments": []});
+ assert.isString(res.body.requestId);
+ assert.isArray(res.body.deployments);
+ assert.lengthOf(res.body.deployments, deployed_count);
+ })
+ .catch(function(err) {
+ console.error(action_timer.step, "err for", test_txt, err);
+ throw err;
+ });
+ });
+ });
+}
+
+function test_delete_dcae_deployments_success(dh_server) {
+ const req_path = "/dcae-deployments/" + DEPLOYMENT_ID_JFL_1;
+ const test_txt = "DELETE " + req_path;
+ const workflow_id = "uninstall";
+ const execution_id = workflow_id + "_" + DEPLOYMENT_ID_JFL_1;
+ describe(test_txt, () => {
+ it('Success DELETE service', function() {
+ const action_timer = new utils.ActionTimer();
+ console.log(action_timer.step, test_txt);
+
+ nock(dh.CLOUDIFY_URL).post("/api/v2.1/executions")
+ .reply(201, function(uri, requestBody) {
+ console.log(action_timer.step, "post", dh.CLOUDIFY_URL, uri, JSON.stringify(requestBody));
+ return JSON.stringify(Cloudify.resp_execution(DEPLOYMENT_ID_JFL_1, DEPLOYMENT_ID_JFL_1,
+ execution_id, false, workflow_id));
+ });
+
+ nock(dh.INVENTORY_URL).delete(INV_PATH_DCAE_SERVICES + "/" + DEPLOYMENT_ID_JFL_1)
+ .reply(200, function(uri) {
+ console.log(action_timer.step, "delete", dh.INVENTORY_URL, uri);
+ return "";
+ });
+
+ nock(dh.CLOUDIFY_URL).get("/api/v2.1/executions/" + execution_id)
+ .reply(200, function(uri) {
+ console.log(action_timer.step, "get", dh.CLOUDIFY_URL, uri);
+ return JSON.stringify(Cloudify.resp_execution(DEPLOYMENT_ID_JFL_1, DEPLOYMENT_ID_JFL_1,
+ execution_id, true, workflow_id));
+ });
+
+ nock(dh.CLOUDIFY_URL).delete("/api/v2.1/deployments/" + DEPLOYMENT_ID_JFL_1)
+ .reply(201, function(uri) {
+ console.log(action_timer.step, "delete", dh.CLOUDIFY_URL, uri);
+ return JSON.stringify(Cloudify.resp_deploy(DEPLOYMENT_ID_JFL_1, DEPLOYMENT_ID_JFL_1));
+ });
+
+ nock(dh.CLOUDIFY_URL).delete("/api/v2.1/blueprints/" + DEPLOYMENT_ID_JFL_1)
+ .reply(200, function(uri) {
+ console.log(action_timer.step, "delete", dh.CLOUDIFY_URL, uri);
+ return JSON.stringify(Cloudify.resp_blueprint(DEPLOYMENT_ID_JFL_1));
+ });
+
+ return chai.request(dh_server.app).delete(req_path)
+ .then(function(res) {
+ console.log(action_timer.step, "res for", test_txt, res.text);
+ expect(res).to.have.status(202);
+ expect(res).to.be.json;
+
+ return utils.sleep(45000);
+ })
+ .then(function() {
+ console.log(action_timer.step, "the end of test");
+ })
+ .catch(function(err) {
+ console.error(action_timer.step, "err for", test_txt, err);
+ throw err;
+ });
+ }).timeout(60000);
+ });
+}
+
+function test_zipper(dh_server) {
+ const test_txt = 'zip the blueprint';
+ describe(test_txt, () => {
+ it(test_txt, function() {
+ var blueprint = "";
+ const failed_blueprints = [];
+ const success_blueprints = [];
+ const action_timer = new utils.ActionTimer();
+ console.log(action_timer.step, test_txt);
+
+ return utils.sleep(100).then(function() {
+ console.log("starting test_zipper");
+ var first_exc;
+ for (var i=0; i< 100; i++) {
+ blueprint = blueprint + (i % 10);
+ try {
+ const zip = new admzip();
+ zip.addFile('work/', new Buffer(0));
+ zip.addFile('work/blueprint.yaml', new Buffer(blueprint, 'utf8'));
+ const zip_buffer = zip.toBuffer();
+ success_blueprints.push(blueprint);
+ } catch (e) {
+ // TypeError
+ const error = "failed to zip: " + e.message
+ + " " + (e.stack || "").replace(/\n/g, " ")
+ + "blueprint(" + blueprint + ")";
+ console.error(error);
+ failed_blueprints.push(blueprint);
+ if (!first_exc) {
+ first_exc = e;
+ first_exc.blueprint = blueprint;
+ }
+ }
+ }
+ console.log("success", success_blueprints.length / (failed_blueprints.length + success_blueprints.length));
+ console.log("failed_blueprints", failed_blueprints);
+ console.log("success_blueprints", success_blueprints);
+ if (first_exc) {
+ throw first_exc;
+ }
+ })
+ .catch(function(e) {
+ const error = "test of zipper exiting due to test problem: " + e.message
+ + " " + (e.stack || "").replace(/\n/g, " ") + "blueprint(" + e.blueprint + ")";
+ console.error(error);
+ throw e;
+ });
+ });
+ });
+}
+
+
+dh.add_tests([
+ test_zipper,
+ test_get_dcae_deployments,
+ test_get_dcae_deployments_service_type_unknown,
+ test_put_dcae_deployments_i_dont_know,
+ test_put_dcae_deployments_missing_input_error,
+ test_get_dcae_deployments_operation,
+ test_get_dcae_deployments_service_type_deployed,
+ test_put_dcae_deployments_success,
+ test_delete_dcae_deployments_success
+]);
diff --git a/tests/test_info.js b/tests/test_info.js
new file mode 100644
index 0000000..1156d59
--- /dev/null
+++ b/tests/test_info.js
@@ -0,0 +1,59 @@
+/*
+Copyright(c) 2018 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.
+*/
+
+/**
+ * handling policy updates
+ */
+
+"use strict";
+
+const chai = require('chai')
+ , chaiHttp = require('chai-http')
+ , expect = chai.expect
+ , assert = chai.assert;
+
+chai.use(chaiHttp);
+
+const dh = require('./mock_deployment_handler');
+const utils = require('./mock_utils');
+
+function test_get_info(dh_server) {
+ const req_path = "/";
+ const test_txt = "GET " + req_path;
+ describe(test_txt, () => {
+ it('GET info', function() {
+ const action_timer = new utils.ActionTimer();
+ console.log(action_timer.step, test_txt);
+ return chai.request(dh_server.app).get(req_path)
+ .then(function(res) {
+ console.log(action_timer.step, "res for", test_txt, res.text);
+ expect(res).to.have.status(200);
+ expect(res).to.be.json;
+
+ const info = res.body;
+ const config = process.mainModule.exports.config;
+ assert.include(config, info.server);
+ assert.deepEqual(config.apiLinks, info.links);
+ })
+ .catch(function(err) {
+ console.error(action_timer.step, "err for", test_txt, err);
+ throw err;
+ });
+ });
+ });
+}
+
+dh.add_tests([test_get_info]);
diff --git a/tests/test_policy.js b/tests/test_policy.js
index c0ad243..0d7550e 100644
--- a/tests/test_policy.js
+++ b/tests/test_policy.js
@@ -1,5 +1,5 @@
/*
-Copyright(c) 2017 AT&T Intellectual Property. All rights reserved.
+Copyright(c) 2017-2018 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.
@@ -20,205 +20,464 @@ See the License for the specific language governing permissions and limitations
"use strict";
-const nock = require('nock');
-const chai = require('chai')
+const nock = require('nock')
+ , chai = require('chai')
, chaiHttp = require('chai-http')
- , expect = chai.expect;
+ , expect = chai.expect
+ , assert = chai.assert;
chai.use(chaiHttp);
-const REQ_ID = "111";
+const dh = require('./mock_deployment_handler');
+const utils = require('./mock_utils');
+
const RUN_TS = new Date();
const RUN_TS_HOURS = RUN_TS.getHours();
-const CONSUL_URL = 'http://consul:8500';
-const TEST_CLOUDIFY_MANAGER = "test_cloudify_manager";
-const CLOUDIFY_URL = "http://" + TEST_CLOUDIFY_MANAGER + ":80";
-
const POLICY_ID = 'policy_id';
const POLICY_VERSION = "policyVersion";
const POLICY_NAME = "policyName";
const POLICY_BODY = 'policy_body';
const POLICY_CONFIG = 'config';
-const MONKEYED_POLICY_ID = "DCAE_alex.Config_peach"
-const MONKEYED_POLICY_ID_2 = "DCAE_alex.Config_peach_2"
+const BLUEPRINT_ID = "demo_dcaepolicy";
+const DEPLOYMENT_ID = "demo_dcae_policy_depl";
+const OPERATION_POLICY_UPDATE = "dcae.interfaces.policy.policy_update";
+const EXECUTE_OPERATION = "execute_operation";
+
+const MONKEYED_POLICY_ID = "DCAE_alex.Config_peach";
+const MONKEYED_POLICY_ID_2 = "DCAE_alex.Config_peach_2";
+const MONKEYED_POLICY_ID_3 = "DCAE_alex.Config_peach_3";
+const MONKEYED_POLICY_ID_4 = "DCAE_alex.Config_peach_4";
+const MONKEYED_POLICY_ID_5 = "DCAE_alex.Config_peach_5";
+const MONKEYED_POLICY_ID_6 = "DCAE_alex.Config_peach_6";
+const CLAMP_POLICY_ID = "CLAMP.Config_clamp_policy";
-function create_policy_body(policy_id, policy_version=1) {
- const prev_ver = policy_version - 1;
- const timestamp = new Date(RUN_TS.getTime());
- timestamp.setHours(RUN_TS_HOURS + prev_ver);
+const CFY_API = "/api/v2.1";
+const CFY_API_NODE_INSTANCES = CFY_API + "/node-instances";
+const CFY_API_EXECUTIONS = CFY_API + "/executions";
+const CFY_API_EXECUTION = CFY_API_EXECUTIONS + "/";
+function create_policy_body(policy_id, policy_version=1, matching_conditions=null) {
const this_ver = policy_version.toString();
- const config = {
- "policy_updated_from_ver": prev_ver.toString(),
- "policy_updated_to_ver": this_ver.toString(),
- "policy_hello": "world!",
- "policy_updated_ts": timestamp,
- "updated_policy_id": policy_id
+
+ const matchingConditions = {
+ "ONAPName": "DCAE",
+ "ConfigName": "alex_config_name"
};
+ if (matching_conditions) {
+ Object.assign(matchingConditions, matching_conditions);
+ }
return {
"policyConfigMessage": "Config Retrieved! ",
"policyConfigStatus": "CONFIG_RETRIEVED",
"type": "JSON",
- POLICY_NAME: policy_id + "." + this_ver + ".xml",
- POLICY_VERSION: this_ver,
- POLICY_CONFIG: config,
- "matchingConditions": {
- "ECOMPName": "DCAE",
- "ConfigName": "alex_config_name"
- },
+ [POLICY_NAME]: (policy_id && (policy_id + "." + this_ver + ".xml") || null),
+ [POLICY_VERSION]: this_ver,
+ [POLICY_CONFIG]: {"policy_hello": "world!"},
+ "matchingConditions": matchingConditions,
"responseAttributes": {},
"property": null
};
}
-function create_policy(policy_id, policy_version=1) {
+function create_policy(policy_id, policy_version=1, matching_conditions=null) {
return {
- POLICY_ID : policy_id,
- POLICY_BODY : MonkeyedPolicyBody.create_policy_body(policy_id, policy_version)
+ [POLICY_ID] : policy_id,
+ [POLICY_BODY] : create_policy_body(policy_id, policy_version, matching_conditions)
};
}
-nock(CONSUL_URL).persist().get('/v1/kv/deployment_handler?raw')
- .reply(200, {"logLevel": "DEBUG", "cloudify": {"protocol": "http"}});
-
-nock(CONSUL_URL).persist().get('/v1/catalog/service/cloudify_manager')
- .reply(200, [{
- "ID":"deadbeef-dead-beef-dead-beefdeadbeef",
- "Node":"devorcl00",
- "Address": TEST_CLOUDIFY_MANAGER,
- "Datacenter":"rework-central",
- "TaggedAddresses":{"lan": TEST_CLOUDIFY_MANAGER,"wan": TEST_CLOUDIFY_MANAGER},
- "NodeMeta":{},
- "ServiceID":"cloudify_manager",
- "ServiceName":"cloudify_manager",
- "ServiceTags":["http://" + TEST_CLOUDIFY_MANAGER + "/api/v2.1"],
- "ServiceAddress": TEST_CLOUDIFY_MANAGER,
- "ServicePort":80,
- "ServiceEnableTagOverride":false,
- "CreateIndex":16,
- "ModifyIndex":16
- }]);
-
-nock(CONSUL_URL).persist().get('/v1/catalog/service/inventory')
- .reply(200, [{
- "ID": "",
- "Node": "inventory_test",
- "Address": "inventory",
- "Datacenter": "rework-central",
- "TaggedAddresses": null,
- "NodeMeta": null,
- "ServiceID": "inventory",
- "ServiceName": "inventory",
- "ServiceTags": [],
- "ServiceAddress": "inventory",
- "ServicePort": 8080,
- "ServiceEnableTagOverride": false,
- "CreateIndex": 8068,
- "ModifyIndex": 8068
- }]);
-
-nock(CLOUDIFY_URL).persist().get(/[/]api[/]v2[.]1[/]node-instances/)
- .reply(200, {
- "items": [
- {
- "deployment_id": "demo_dcae_policy_depl",
- "id": "host_vm_163f7",
- "runtime_properties": {
- "application_config": {
- "capacity_ts": "2017-09-07T16:54:31.696Z",
- "capacity": "123",
- "policy_hello": "world!",
- "policy_updated_ts": "2017-09-05T18:09:54.109548Z",
- "policy_updated_from_ver": "20",
- "location": "neverland",
- "updated_policy_id": MONKEYED_POLICY_ID_2,
- "policy_updated_to_ver": "21",
- "location_ts": "2017-09-07T16:54:31.696Z"
- },
- "execute_operation": "policy_update",
- "service_component_name": "2caa5ccf-bfc6-4a75-aca7-4af03745f478.unknown.unknown.unknown.dcae.onap.org",
- "exe_task": "node_configure",
- "policies": {
- "DCAE_alex.Config_host_location_policy_id_value": {
- "policy_required": true,
- "policy_body": create_policy_body(MONKEYED_POLICY_ID, 55),
- "policy_id": MONKEYED_POLICY_ID
- },
- "DCAE_alex.Config_host_capacity_policy_id_value": {
- "policy_required": true,
- "policy_body": create_policy_body(MONKEYED_POLICY_ID_2, 21),
- "policy_id": MONKEYED_POLICY_ID_2
- }
+const message_catch_up = {
+ "errored_scopes": [],
+ "catch_up": true,
+ "scope_prefixes": ["DCAE_alex.Config_", "DCAE.Config_"],
+ "errored_policies": {},
+ "latest_policies": {}
+};
+
+const cloudify_node_instances = [
+ {
+ "deployment_id": DEPLOYMENT_ID,
+ "id": "host_vm_163f7",
+ "runtime_properties": {
+ "application_config": {
+ "policy_hello": "world!",
+ "location": "neverland",
+ "location_ts": "2017-09-07T16:54:31.696Z"
+ },
+ [EXECUTE_OPERATION]: "policy_update",
+ "service_component_name": "2caa5ccf-bfc6-4a75-aca7-4af03745f478.unknown.unknown.unknown.dcae.onap.org",
+ "exe_task": "node_configure",
+ "policies": {
+ [MONKEYED_POLICY_ID]: {
+ "policy_required": true,
+ "policy_persistent": true,
+ "policy_body": create_policy_body(MONKEYED_POLICY_ID, 55),
+ "policy_id": MONKEYED_POLICY_ID
+ },
+ [MONKEYED_POLICY_ID_2]: {
+ "policy_persistent": false,
+ "policy_body": create_policy_body(MONKEYED_POLICY_ID_2, 21, {"key1": "value1"}),
+ "policy_id": MONKEYED_POLICY_ID_2
+ },
+ [MONKEYED_POLICY_ID_3]: {
+ "policy_persistent": false,
+ "policy_body": create_policy_body(MONKEYED_POLICY_ID_3, 33, {"service": "alex_service"}),
+ "policy_id": MONKEYED_POLICY_ID_3
+ },
+ [MONKEYED_POLICY_ID_5]: {
+ "policy_persistent": false,
+ "policy_body": create_policy_body(MONKEYED_POLICY_ID_5, 1),
+ "policy_id": MONKEYED_POLICY_ID_5
+ },
+ [CLAMP_POLICY_ID]: {
+ "policy_persistent": false,
+ "policy_body": create_policy_body(CLAMP_POLICY_ID, 9),
+ "policy_id": CLAMP_POLICY_ID
+ }
+ },
+ "policy_filters": {
+ "db_client_policies_c83de": {
+ "policy_filter_id": "db_client_policies_c83de",
+ "policy_filter": {
+ "policyName": MONKEYED_POLICY_ID_2 + ".*",
+ "unique": false,
+ "onapName": "DCAE",
+ "configName": "alex_config_name",
+ "configAttributes": {"key1": "value1"}
+ }
+ },
+ "db_client_policies_microservice_09f09": {
+ "policy_filter_id": "db_client_policies_microservice_09f09",
+ "policy_filter": {
+ "policyName": MONKEYED_POLICY_ID + ".*",
+ "unique": false,
+ "onapName": "DCAE",
+ "configName": "alex_config_name",
+ "configAttributes": {"service": "alex_service"}
+ }
+ },
+ "policy_filter_by_id_02d02": {
+ "policy_filter_id": "policy_filter_by_id_02d02",
+ "policy_filter": {
+ "policyName": MONKEYED_POLICY_ID_6
+ }
+ },
+ "new_policies_09f09": {
+ "policy_filter_id": "new_policies_09f09",
+ "policy_filter": {
+ "policyName": MONKEYED_POLICY_ID_4 + ".*",
+ "unique": false,
+ "onapName": "DCAE",
+ "configName": "alex_config_name",
+ "configAttributes": {"service": "alex_service"}
+ }
+ },
+ "db_client_policies_not_found_cfed6": {
+ "policy_filter_id": "db_client_policies_not_found_cfed6",
+ "policy_filter": {
+ "configAttributes": {"not-to-be-found": "ever"},
+ "unique": false,
+ "onapName": "DCAE",
+ "policyName": "DCAE_alex.Config_not_found_ever_.*"
+ }
+ },
+ "filter_without_policy_name_22abcd": {
+ "policy_filter_id": "filter_without_policy_name",
+ "policy_filter": {"onapName": "DCAE"}
+ },
+ "db_client_policies_no_match_afed8": {
+ "policy_filter_id": "db_client_policies_no_match_afed8",
+ "policy_filter": {
+ "policyName": "DCAE_alex.Config_not_found_ever_.*"
}
}
}
- ],
- "metadata": {
- "pagination": {
- "total": 1,
- "offset": 0,
- "size": 10000
- }
}
- });
+ },
+ {
+ "deployment_id": DEPLOYMENT_ID,
+ "id": "no_policies_on_node_1212beef",
+ "runtime_properties": {"application_config": {}}
+ },
+ {
+ "deployment_id": DEPLOYMENT_ID,
+ "id": "no_policy_filters_on_node_55ham",
+ "runtime_properties": {
+ "application_config": {},
+ "policies": {}
+ }
+ }
+];
-describe('test policy on deployment-handler', () => {
- it('starting', function() {
- console.log("go testing deployment-handler");
-
- const conf = require('./../lib/config');
- const logging = require('./../lib/logging');
- const log = logging.getLogger();
-
- console.log("started logger");
- log.debug(REQ_ID, "started logger");
-
- console.log("conf.configure");
-
- return conf.configure()
- .then(function(config) {
- logging.setLevel(config.logLevel);
-
- /* Set up exported configuration */
- config.apiLinks = {"test" : true};
- // exports.config = config;
- process.mainModule.exports.config = config;
-
- console.log("got configuration:", JSON.stringify(config));
-
- log.debug(REQ_ID, "Configuration: " + JSON.stringify(config));
-
- const main_app = require('./../deployment-handler');
- console.log("setting main_app...");
- main_app.set_app();
- console.log("set main_app");
-
- const req_path = "/policy/components";
- const test_txt = "GET " + req_path;
- describe(test_txt, () => {
- console.log(test_txt);
- it('GET all the components with policy from cloudify', function() {
- console.log("chai", test_txt);
- return chai.request(main_app.app).get(req_path)
- .then(function(res) {
- console.log("res for", test_txt, JSON.stringify(res.body));
- log.debug(REQ_ID, "received " + JSON.stringify(res.body));
- expect(res).to.have.status(200);
- expect(res).to.be.json;
- })
- .catch(function(err) {
- console.error("err for", test_txt, err);
- throw err;
- });
- });
+function nock_cfy_node_instances(action_timer) {
+ nock(dh.CLOUDIFY_URL).get(CFY_API_NODE_INSTANCES).query(true)
+ .reply(200, function(uri) {
+ console.log(action_timer.step, "get", dh.CLOUDIFY_URL, uri);
+ return JSON.stringify({
+ "items": cloudify_node_instances,
+ "metadata": {"pagination": {"total": cloudify_node_instances.length, "offset": 0, "size": 10000}}
});
- })
- .catch(function(e) {
- const error = "test of deployment-handler exiting due to startup problem: " + e.message;
- console.error(error);
- throw e;
});
+}
+
+function test_get_policy_components(dh_server) {
+ const req_path = "/policy/components";
+ const test_txt = "GET " + req_path;
+ describe(test_txt, () => {
+ it('GET all the components with policy from cloudify', function() {
+ const action_timer = new utils.ActionTimer();
+ console.log(action_timer.step, test_txt);
+ nock_cfy_node_instances(action_timer);
+
+ return chai.request(dh_server.app).get(req_path)
+ .then(function(res) {
+ console.log(action_timer.step, "res for", test_txt, res.text);
+ expect(res).to.have.status(200);
+ expect(res).to.be.json;
+ })
+ .catch(function(err) {
+ console.error(action_timer.step, "err for", test_txt, err);
+ throw err;
+ });
+ });
+ });
+}
+
+function test_post_policy_catch_up(dh_server) {
+ const req_path = "/policy";
+ const message = JSON.parse(JSON.stringify(message_catch_up));
+ message.errored_scopes = ["CLAMP.Config_"];
+ message.latest_policies = {
+ [MONKEYED_POLICY_ID]: create_policy(MONKEYED_POLICY_ID, 55),
+ [MONKEYED_POLICY_ID_2]: create_policy(MONKEYED_POLICY_ID_2, 22, {"key1": "value1"}),
+ [MONKEYED_POLICY_ID_4]: create_policy(MONKEYED_POLICY_ID_4, 77, {"service": "alex_service"}),
+ [MONKEYED_POLICY_ID_5]: create_policy(MONKEYED_POLICY_ID_5, "nan_version"),
+ [MONKEYED_POLICY_ID_6]: create_policy(MONKEYED_POLICY_ID_6, 66),
+ "junk_policy": create_policy("junk_policy", "nan_version"),
+ "fail_filtered": create_policy("fail_filtered", 12, {"ONAPName": "not-match"}),
+ "fail_filtered_2": create_policy("fail_filtered_2", 32, {"ConfigName": "not-match2"}),
+ "": create_policy("", 1)
+ };
+ const test_txt = "POST " + req_path + " - catchup " + JSON.stringify(message);
+ describe(test_txt, () => {
+ it('POST policy-update - catchup', function() {
+ const action_timer = new utils.ActionTimer();
+ console.log(action_timer.step, test_txt);
+ const execution_id = "policy_catch_up";
+ const resp_to_exe = {"status": "none"};
+ nock_cfy_node_instances(action_timer);
+
+ nock(dh.CLOUDIFY_URL).post(CFY_API_EXECUTIONS)
+ .reply(201, function(uri, requestBody) {
+ requestBody = JSON.stringify(requestBody);
+ console.log(action_timer.step, "on_post", dh.CLOUDIFY_URL, uri, requestBody);
+ Object.assign(resp_to_exe, JSON.parse(requestBody));
+ resp_to_exe.status = "pending";
+ resp_to_exe.created_at = RUN_TS;
+ resp_to_exe.workflow_id = EXECUTE_OPERATION;
+ resp_to_exe.is_system_workflow = false;
+ resp_to_exe.blueprint_id = BLUEPRINT_ID;
+ resp_to_exe.error = "";
+ resp_to_exe.id = execution_id;
+ resp_to_exe.parameters.run_by_dependency_order = false;
+ resp_to_exe.parameters.operation = OPERATION_POLICY_UPDATE;
+ resp_to_exe.parameters.type_names = [];
+
+ console.log(action_timer.step, "reply to post", dh.CLOUDIFY_URL, uri, JSON.stringify(resp_to_exe));
+
+ return JSON.stringify(resp_to_exe);
+ });
+
+ nock(dh.CLOUDIFY_URL).get(CFY_API_EXECUTION + execution_id)
+ .reply(200, function(uri) {
+ resp_to_exe.status = "pending";
+ console.log(action_timer.step, "get", dh.CLOUDIFY_URL, uri, JSON.stringify(resp_to_exe));
+ return JSON.stringify(resp_to_exe);
+ });
+ nock(dh.CLOUDIFY_URL).get(CFY_API_EXECUTION + execution_id)
+ .times(2)
+ .reply(200, function(uri) {
+ resp_to_exe.status = "started";
+ console.log(action_timer.step, "get", dh.CLOUDIFY_URL, uri, JSON.stringify(resp_to_exe));
+ return JSON.stringify(resp_to_exe);
+ });
+ nock(dh.CLOUDIFY_URL).get(CFY_API_EXECUTION + execution_id)
+ .reply(200, function(uri) {
+ resp_to_exe.status = "terminated";
+ console.log(action_timer.step, "get", dh.CLOUDIFY_URL, uri, JSON.stringify(resp_to_exe));
+ return JSON.stringify(resp_to_exe);
+ });
+
+ for (var extra_i = 1; extra_i <= 100000; extra_i++) {
+ const policy_id = "extra_" + extra_i;
+ message.latest_policies[policy_id] = create_policy(policy_id, extra_i);
+ }
+
+ return chai.request(dh_server.app).post(req_path)
+ .set('content-type', 'application/json')
+ .set('X-ECOMP-RequestID', 'test_post_policy_catch_up')
+ .send(message)
+ .then(function(res) {
+ console.log(action_timer.step, "res for", test_txt, res.text);
+ expect(res).to.have.status(200);
+ expect(res).to.be.json;
+
+ return utils.sleep(25000);
+ })
+ .then(function() {
+ console.log(action_timer.step, "the end of test");
+ })
+ .catch(function(err) {
+ console.error(action_timer.step, "err for", test_txt, err);
+ throw err;
+ });
+ }).timeout(60000);
+ });
+}
+
+function test_fail_cfy_policy_catch_up(dh_server) {
+ const req_path = "/policy";
+ const message = JSON.parse(JSON.stringify(message_catch_up));
+ message.latest_policies = {
+ [MONKEYED_POLICY_ID_6]: create_policy(MONKEYED_POLICY_ID_6, 66)
+ };
+ const test_txt = "fail POST " + req_path + " - catchup without execution_id " + JSON.stringify(message);
+ describe(test_txt, () => {
+ it('fail POST policy-update - catchup without execution_id', function() {
+ const action_timer = new utils.ActionTimer();
+ console.log(action_timer.step, test_txt);
+ const execution_id = "policy_catch_up";
+ const resp_to_exe = {"status": "none"};
+ nock_cfy_node_instances(action_timer);
+
+ nock(dh.CLOUDIFY_URL).post(CFY_API_EXECUTIONS)
+ .reply(201, function(uri, requestBody) {
+ requestBody = JSON.stringify(requestBody);
+ console.log(action_timer.step, "on_post", dh.CLOUDIFY_URL, uri, requestBody);
+ Object.assign(resp_to_exe, JSON.parse(requestBody));
+ resp_to_exe.status = "pending";
+
+ console.log(action_timer.step, "reply to post", dh.CLOUDIFY_URL, uri, JSON.stringify(resp_to_exe));
+
+ return JSON.stringify(resp_to_exe);
+ });
+
+ return chai.request(dh_server.app).post(req_path)
+ .set('content-type', 'application/json')
+ .set('X-ECOMP-RequestID', 'test_post_policy_catch_up')
+ .send(message)
+ .then(function(res) {
+ console.log(action_timer.step, "res for", test_txt, res.text);
+ expect(res).to.have.status(200);
+ expect(res).to.be.json;
+
+ return utils.sleep(1000);
+ })
+ .then(function() {
+ console.log(action_timer.step, "the end of test");
+ })
+ .catch(function(err) {
+ console.error(action_timer.step, "err for", test_txt, err);
+ throw err;
+ });
+ }).timeout(30000);
+ });
+}
+
+function test_fail_400_cfy_policy_catch_up(dh_server) {
+ const req_path = "/policy";
+ const message = JSON.parse(JSON.stringify(message_catch_up));
+ message.latest_policies = {
+ [MONKEYED_POLICY_ID_6]: create_policy(MONKEYED_POLICY_ID_6, 66)
+ };
+ const test_txt = "fail 400 POST " + req_path + " - existing_running_execution_error " + JSON.stringify(message);
+ describe(test_txt, () => {
+ it('fail 400 POST policy-update - existing_running_execution_error', function() {
+ const action_timer = new utils.ActionTimer();
+ console.log(action_timer.step, test_txt);
+ const execution_id = "policy_catch_up";
+ const resp_to_exe = {"error_code": "existing_running_execution_error"};
+ nock_cfy_node_instances(action_timer);
+
+ nock(dh.CLOUDIFY_URL).post(CFY_API_EXECUTIONS).times(5)
+ .reply(400, function(uri, requestBody) {
+ console.log(action_timer.step, "on_post", dh.CLOUDIFY_URL, uri, JSON.stringify(requestBody));
+ console.log(action_timer.step, "reply to post", dh.CLOUDIFY_URL, uri, JSON.stringify(resp_to_exe));
+ return JSON.stringify(resp_to_exe);
+ });
+
+ return chai.request(dh_server.app).post(req_path)
+ .set('content-type', 'application/json')
+ .set('X-ECOMP-RequestID', 'test_post_policy_catch_up')
+ .send(message)
+ .then(function(res) {
+ console.log(action_timer.step, "res for", test_txt, res.text);
+ expect(res).to.have.status(200);
+ expect(res).to.be.json;
+
+ return utils.sleep(25000);
+ })
+ .then(function() {
+ console.log(action_timer.step, "the end of test");
+ })
+ .catch(function(err) {
+ console.error(action_timer.step, "err for", test_txt, err);
+ throw err;
+ });
+ }).timeout(30000);
});
-}); \ No newline at end of file
+}
+
+function test_fail_404_cfy_policy_catch_up(dh_server) {
+ const req_path = "/policy";
+ const message = JSON.parse(JSON.stringify(message_catch_up));
+ message.latest_policies = {
+ [MONKEYED_POLICY_ID_6]: create_policy(MONKEYED_POLICY_ID_6, 66)
+ };
+ const test_txt = "fail 404 POST " + req_path + " - not_found_error " + JSON.stringify(message);
+ describe(test_txt, () => {
+ it('fail 404 POST policy-update - not_found_error', function() {
+ const action_timer = new utils.ActionTimer();
+ console.log(action_timer.step, test_txt);
+ const execution_id = "policy_catch_up";
+ const resp_to_exe = {"error_code": "not_found_error"};
+ nock_cfy_node_instances(action_timer);
+
+ nock(dh.CLOUDIFY_URL).post(CFY_API_EXECUTIONS).times(5)
+ .reply(404, function(uri, requestBody) {
+ console.log(action_timer.step, "on_post", dh.CLOUDIFY_URL, uri, JSON.stringify(requestBody));
+ console.log(action_timer.step, "reply to post", dh.CLOUDIFY_URL, uri, JSON.stringify(resp_to_exe));
+ return JSON.stringify(resp_to_exe);
+ });
+
+ return chai.request(dh_server.app).post(req_path)
+ .set('content-type', 'application/json')
+ .set('X-ECOMP-RequestID', 'test_post_policy_catch_up')
+ .send(message)
+ .then(function(res) {
+ console.log(action_timer.step, "res for", test_txt, res.text);
+ expect(res).to.have.status(200);
+ expect(res).to.be.json;
+
+ return utils.sleep(1000);
+ })
+ .then(function() {
+ console.log(action_timer.step, "the end of test");
+ })
+ .catch(function(err) {
+ console.error(action_timer.step, "err for", test_txt, err);
+ throw err;
+ });
+ }).timeout(30000);
+ });
+}
+
+dh.add_tests([
+ test_get_policy_components,
+ test_post_policy_catch_up,
+ test_fail_cfy_policy_catch_up,
+ test_fail_400_cfy_policy_catch_up,
+ test_fail_404_cfy_policy_catch_up
+]);
diff --git a/tests/test_zzz_run.js b/tests/test_zzz_run.js
new file mode 100644
index 0000000..8ae405a
--- /dev/null
+++ b/tests/test_zzz_run.js
@@ -0,0 +1,21 @@
+/*
+Copyright(c) 2018 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.
+*/
+
+"use strict";
+
+const dh = require('./mock_deployment_handler');
+
+dh.run_dh();