2 * ============LICENSE_START=======================================================
\r
4 * ================================================================================
\r
5 * Copyright (C) 2017 AT&T Intellectual Property. All rights reserved.
\r
6 * ================================================================================
\r
7 * Licensed under the Apache License, Version 2.0 (the "License");
\r
8 * you may not use this file except in compliance with the License.
\r
9 * You may obtain a copy of the License at
\r
11 * http://www.apache.org/licenses/LICENSE-2.0
\r
13 * Unless required by applicable law or agreed to in writing, software
\r
14 * distributed under the License is distributed on an "AS IS" BASIS,
\r
15 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
\r
16 * See the License for the specific language governing permissions and
\r
17 * limitations under the License.
\r
18 * ============LICENSE_END=========================================================
\r
24 * "UtilityService" contains various generic methods.
\r
26 * (*** DEPRECATED - Use PropertyService instead ***) setProperties() and
\r
29 * SYNTAX: hasContents(object)
\r
31 * Returns "true" if "object" contains contents (i.e. is NOT undefined, null or
\r
32 * ""), "false" otherwise.
\r
34 * SYNTAX: checkUndefined(name, value)
\r
36 * Throws an exception if "value" is undefined. The exception includes "name" as
\r
37 * the cause of the exception. Returns "value" if it is defined.
\r
39 * SYNTAX: getCurrentTime()
\r
41 * Returns the current local date and time in the format "MM/DD/YY HH:MM:SS"
\r
43 * SYNTAX: setHttpErrorHandler(function)
\r
45 * Sets the HTTP error handler to "function".
\r
47 * SYNTAX: runHttpErrorHandler(response, status)
\r
49 * Logs warning messages and the runs the HTTP error handler previously set by
\r
50 * "setHttpErrorHandler". The intended usage is for "$http" calls. Example:
\r
51 * $http.get(...).then(...)["catch"](UtilityService.runHttpErrorHandler);
\r
53 * SYNTAX: getHttpStatusText(statusCode)
\r
55 * Expects "statusCode" to be an HTTP response code (e.g. 404). The function
\r
56 * returns a string that includes both the code and an equivalent text summary.
\r
57 * Example: "Not found (404)"
\r
59 * SYNTAX: getHttpErrorMessage(response)
\r
61 * Expects "response" to be the response object generated by a "$http" error
\r
62 * condition. "getHttpErrorMessage" examines the object and returns a summary
\r
63 * string for some known conditions.
\r
66 var UtilityService = function($log, DataService, PARAMETER) {
\r
69 var convertModel = function (serviceModel) {
\r
71 var isNewFlow = false;
\r
73 for (var networkCustomizationName in serviceModel.networks) {
\r
74 var networkModel = serviceModel.networks[networkCustomizationName];
\r
75 if ( networkModel.customizationUuid != null ) {
\r
81 for (var vnfCustomizationName in serviceModel.vnfs) {
\r
82 var vnfModel = serviceModel.vnfs[vnfCustomizationName];
\r
83 if ( vnfModel.customizationUuid != null ) {
\r
90 return (convertNewModel (serviceModel) );
\r
93 return (convertOldModel (serviceModel) );
\r
96 var convertNewModel = function (serviceModel ) {
\r
97 var completeResources = new Array();
\r
99 var convertedAsdcModel = {
\r
100 "service": serviceModel.service,
\r
103 "pnfs": serviceModel.pnfs,
\r
104 "serviceProxies": serviceModel.serviceProxies,
\r
105 "completeDisplayInputs": {},
\r
108 var networkModelDisplayInputs = {};
\r
109 var vnfModelDisplayInputs = {};
\r
110 for (var networkCustomizationName in serviceModel.networks) {
\r
111 var networkModel = serviceModel.networks[networkCustomizationName];
\r
113 convertedAsdcModel.networks[networkModel.customizationUuid] = {
\r
114 "uuid": networkModel.uuid,
\r
115 "invariantUuid": networkModel.invariantUuid,
\r
116 "version": networkModel.version,
\r
117 "name": networkModel.name,
\r
118 "modelCustomizationName": networkModel.modelCustomizationName,
\r
119 "customizationUuid": networkModel.customizationUuid,
\r
121 "description": networkModel.description,
\r
123 "displayInputs": {}
\r
126 "name": networkModel.modelCustomizationName,
\r
127 "description": networkModel.description
\r
129 completeResources.push (resource);
\r
131 if (networkModel.commands != null) {
\r
134 * internal_net_param_ntu: {
\r
135 * command: get_input,
\r
136 * displaName: internal_net_param_ntu,
\r
137 * inputName: vccfd1_internal_net_param_ntu // pointer to input key
\r
139 * If the input name (ptr) is one of instance_node_target, naming_policy or vf_instance_name
\r
144 for ( var cmd in networkModel.commands ) {
\r
145 var cmdObj = networkModel.commands[cmd];
\r
146 if ( cmdObj.inputName != null ) {
\r
147 switch (cmdObj.inputName) {
\r
148 case "instance_node_target":
\r
150 case "naming_policy":
\r
152 case "vf_instance_name":
\r
155 if (serviceModel.service != null && serviceModel.service.inputs != null &&
\r
156 serviceModel.service.inputs[cmdObj.inputName] != null ) {
\r
157 networkModelDisplayInputs[cmdObj.inputName] = (serviceModel.service.inputs[cmdObj.inputName]);
\r
158 networkModelDisplayInputs[cmdObj.inputName][PARAMETER.DISPLAY_NAME] = cmdObj.displayName;
\r
159 //E2E services need this
\r
160 ["templateInvariantUUID", "templateCustomizationUUID", "templateUUID", "templateName"].forEach(function(templateProp) {
\r
161 networkModelDisplayInputs[cmdObj.inputName][templateProp] = networkModel.inputs[cmdObj.displayName][templateProp];
\r
170 convertedAsdcModel.networks[networkModel.customizationUuid].displayInputs=networkModelDisplayInputs;
\r
175 _.forEach(serviceModel.configurations, function(element, key) {
\r
176 element.isConfig = true;
\r
178 _.forEach(serviceModel.pnfs, function(element, key) {
\r
179 element.isPnf= true;
\r
180 element.modelCustomizationName= key;
\r
182 var mergedVnfs = Object.assign(serviceModel.vnfs, serviceModel.configurations, serviceModel.pnfs);
\r
184 for (var vnfCustomizationName in mergedVnfs) {
\r
185 var vnfModel = mergedVnfs[vnfCustomizationName];
\r
186 var vnfCustomizationUuid = vnfModel.customizationUuid;
\r
187 convertedAsdcModel.vnfs[vnfModel.customizationUuid] = {
\r
188 "uuid": vnfModel.uuid,
\r
189 "invariantUuid": vnfModel.invariantUuid,
\r
190 "version": vnfModel.version,
\r
191 "name": vnfModel.name,
\r
192 "modelCustomizationName": vnfModel.modelCustomizationName,
\r
193 "customizationUuid": vnfModel.customizationUuid,
\r
195 "description": vnfModel.description,
\r
197 "volumeGroups": {},
\r
199 "displayInputs": {},
\r
203 "sourceNodes": vnfModel.sourceNodes,
\r
204 "collectorNodes": vnfModel.collectorNodes,
\r
205 "isConfigurationByPolicy": vnfModel.configurationByPolicy ? vnfModel.configurationByPolicy : false,
\r
206 "isConfig": vnfModel.isConfig ? vnfModel.isConfig : false,
\r
207 "isPnf": vnfModel.isPnf ? vnfModel.isPnf : false
\r
211 "name": vnfModel.modelCustomizationName,
\r
212 "description": vnfModel.description
\r
214 completeResources.push (resource);
\r
216 if (vnfModel.commands != null) {
\r
219 * internal_net_param_ntu: {
\r
220 * command: get_input,
\r
221 * displaName: internal_net_param_ntu,
\r
222 * inputName: vccfd1_internal_net_param_ntu // pointer to input key
\r
224 * If the input name (ptr) is one of instance_node_target, naming_policy or vf_instance_name
\r
229 for ( var cmd in vnfModel.commands ) {
\r
230 var cmdObj = vnfModel.commands[cmd];
\r
231 if ( cmdObj.inputName != null ) {
\r
232 // To Do: Make this list configurable
\r
233 switch (cmdObj.inputName) {
\r
234 case "instance_node_target":
\r
236 case "naming_policy":
\r
238 case "vf_instance_name":
\r
241 if (serviceModel.service != null && serviceModel.service.inputs != null &&
\r
242 serviceModel.service.inputs[cmdObj.inputName] != null ) {
\r
243 vnfModelDisplayInputs[cmdObj.inputName] = (serviceModel.service.inputs[cmdObj.inputName]);
\r
244 vnfModelDisplayInputs[cmdObj.inputName][PARAMETER.DISPLAY_NAME] = cmdObj.displayName;
\r
245 //E2E services need this
\r
246 ["templateInvariantUUID", "templateCustomizationUUID", "templateUUID", "templateName"].forEach(function(templateProp) {
\r
247 networkModelDisplayInputs[cmdObj.inputName][templateProp] = vnfModel.inputs[cmdObj.displayName][templateProp];
\r
256 convertedAsdcModel.vnfs[vnfCustomizationUuid].displayInputs=vnfModelDisplayInputs;
\r
257 convertedAsdcModel.vnfs[vnfCustomizationUuid].properties=vnfModel.properties;
\r
261 var vnf_function = "";
\r
263 if ( !( isObjectEmpty(vnfModel.properties) ) ) {
\r
264 if (hasContents (vnfModel.properties.nf_type) ) {
\r
265 vnf_type = vnfModel.properties.nf_type;
\r
267 if (hasContents (vnfModel.properties.nf_role) ) {
\r
268 vnf_role = vnfModel.properties.nf_role;
\r
270 if (hasContents (vnfModel.properties.nf_function) ) {
\r
271 vnf_function = vnfModel.properties.nf_function;
\r
273 if (hasContents (vnfModel.properties.nf_naming_code) ) {
\r
274 vnf_code = vnfModel.properties.nf_naming_code;
\r
277 convertedAsdcModel.vnfs[vnfCustomizationUuid]["nfType"] = vnf_type;
\r
278 convertedAsdcModel.vnfs[vnfCustomizationUuid]["nfRole"] = vnf_role;
\r
279 convertedAsdcModel.vnfs[vnfCustomizationUuid]["nfFunction"] = vnf_function;
\r
280 convertedAsdcModel.vnfs[vnfCustomizationUuid]["nfCode"] = vnf_code;
\r
282 for (var vfModuleCustomizationName in serviceModel.vnfs[vnfCustomizationName].vfModules) {
\r
283 var vfModuleModel = serviceModel.vnfs[vnfCustomizationName].vfModules[vfModuleCustomizationName];
\r
284 convertedAsdcModel.vnfs[vnfCustomizationUuid].vfModules[vfModuleModel.customizationUuid] = vfModuleModel;
\r
287 for (var volumeGroupCustomizationName in serviceModel.vnfs[vnfCustomizationName].volumeGroups) {
\r
288 var volumeGroupModel = serviceModel.vnfs[vnfCustomizationName].volumeGroups[volumeGroupCustomizationName];
\r
289 convertedAsdcModel.vnfs[vnfCustomizationUuid].volumeGroups[volumeGroupModel.customizationUuid] = volumeGroupModel;
\r
294 var completeDisplayInputs = {};
\r
296 for (var key in vnfModelDisplayInputs) {
\r
297 completeDisplayInputs[key] = vnfModelDisplayInputs[key];
\r
299 for (var key in networkModelDisplayInputs) {
\r
300 completeDisplayInputs[key] = networkModelDisplayInputs[key];
\r
303 convertedAsdcModel.completeDisplayInputs = completeDisplayInputs;
\r
304 // Need to collect all the model customization names (node template tag) and descriptions
\r
305 DataService.setResources (completeResources);
\r
307 $log.debug ("convertedAsdcModel: ", convertedAsdcModel);
\r
308 return (convertedAsdcModel);
\r
311 var convertOldModel = function (serviceModel ) {
\r
314 var convertedAsdcModel = {
\r
315 "service": serviceModel.service,
\r
318 "pnfs": serviceModel.pnfs,
\r
319 "serviceProxies": serviceModel.serviceProxies,
\r
320 "completeDisplayInputs": {},
\r
323 var completeResources = new Array();
\r
325 var vnfModelDisplayInputs = {};
\r
326 var networkModelDisplayInputs = {};
\r
327 for (var networkCustomizationName in serviceModel.networks) {
\r
328 var networkModel = serviceModel.networks[networkCustomizationName];
\r
329 convertedAsdcModel.networks[networkModel.invariantUuid] = {};
\r
330 //convertedAsdcModel.networks[networkModel.invariantUuid][networkModel.version] = networkModel;
\r
331 // need a network model to test this
\r
332 convertedAsdcModel.networks[networkModel.uuid] = {
\r
333 "uuid": networkModel.uuid,
\r
334 "invariantUuid": networkModel.invariantUuid,
\r
335 "version": networkModel.version,
\r
336 "name": networkModel.name,
\r
337 "modelCustomizationName": networkModel.modelCustomizationName,
\r
338 "customizationUuid": networkModel.customizationUuid,
\r
340 "description": networkModel.description,
\r
342 "displayInputs": {}
\r
345 "name": networkModel.modelCustomizationName,
\r
346 "description": networkModel.description
\r
348 completeResources.push (resource);
\r
349 if (networkModel.commands != null) {
\r
352 * internal_net_param_ntu: {
\r
353 * command: get_input,
\r
354 * displaName: internal_net_param_ntu,
\r
355 * inputName: vccfd1_internal_net_param_ntu // pointer to input key
\r
357 * If the input name (ptr) is one of instance_node_target, naming_policy or vf_instance_name
\r
362 for ( var cmd in networkModel.commands ) {
\r
363 var cmdObj = networkModel.commands[cmd];
\r
364 if ( cmdObj.inputName != null ) {
\r
365 switch (cmdObj.inputName) {
\r
366 case "instance_node_target":
\r
368 case "naming_policy":
\r
370 case "vf_instance_name":
\r
373 if (serviceModel.service != null && serviceModel.service.inputs != null &&
\r
374 serviceModel.service.inputs[cmdObj.inputName] != null ) {
\r
375 networkModelDisplayInputs[cmdObj.inputName] = (serviceModel.service.inputs[cmdObj.inputName]);
\r
376 networkModelDisplayInputs[cmdObj.inputName][PARAMETER.DISPLAY_NAME] = cmdObj.displayName;
\r
383 convertedAsdcModel.networks[networkModel.uuid].displayInputs=networkModelDisplayInputs;
\r
387 _.forEach(serviceModel.configurations, function(element, key) {
\r
388 element.isConfig = true;
\r
390 _.forEach(serviceModel.pnfs, function(element, key) {
\r
391 element.isPnf= true;
\r
392 element.modelCustomizationName= key;
\r
394 var mergedVnfs = Object.assign(serviceModel.vnfs, serviceModel.configurations, serviceModel.pnfs);
\r
396 for (var vnfCustomizationName in mergedVnfs) {
\r
397 var vnfModel = mergedVnfs[vnfCustomizationName];
\r
398 convertedAsdcModel.vnfs[vnfModel.uuid] = {
\r
399 "uuid": vnfModel.uuid,
\r
400 "invariantUuid": vnfModel.invariantUuid,
\r
401 "version": vnfModel.version,
\r
402 "name": vnfModel.name,
\r
403 "modelCustomizationName": vnfModel.modelCustomizationName,
\r
404 "customizationUuid": vnfModel.customizationUuid,
\r
406 "description": vnfModel.description,
\r
408 "volumeGroups": {},
\r
410 "displayInputs": {},
\r
411 "sourceNodes": vnfModel.sourceNodes,
\r
412 "collectorNodes": vnfModel.collectorNodes,
\r
413 "isConfigurationByPolicy": vnfModel.configurationByPolicy ? vnfModel.configurationByPolicy : false,
\r
414 "isConfig": vnfModel.isConfig ? vnfModel.isConfig : false,
\r
415 "isPnf": vnfModel.isPnf ? vnfModel.isPnf : false
\r
418 "name": vnfModel.modelCustomizationName,
\r
419 "description": vnfModel.description
\r
421 completeResources.push (resource);
\r
423 if (vnfModel.commands != null) {
\r
426 * internal_net_param_ntu: {
\r
427 * command: get_input,
\r
428 * displaName: internal_net_param_ntu,
\r
429 * inputName: vccfd1_internal_net_param_ntu // pointer to input key
\r
431 * If the input name (ptr) is one of instance_node_target, naming_policy or vf_instance_name
\r
436 for ( var cmd in vnfModel.commands ) {
\r
437 var cmdObj = vnfModel.commands[cmd];
\r
438 if ( cmdObj.inputName != null ) {
\r
439 // To Do: Make this list configurable
\r
440 switch (cmdObj.inputName) {
\r
441 case "instance_node_target":
\r
443 case "naming_policy":
\r
445 case "vf_instance_name":
\r
448 if (serviceModel.service != null && serviceModel.service.inputs != null &&
\r
449 serviceModel.service.inputs[cmdObj.inputName] != null ) {
\r
450 vnfModelDisplayInputs[cmdObj.inputName] = (serviceModel.service.inputs[cmdObj.inputName]);
\r
451 vnfModelDisplayInputs[cmdObj.inputName][PARAMETER.DISPLAY_NAME] = cmdObj.displayName;
\r
458 convertedAsdcModel.vnfs[vnfModel.uuid].displayInputs=vnfModelDisplayInputs;
\r
461 for (var vfModuleCustomizationName in serviceModel.vnfs[vnfCustomizationName].vfModules) {
\r
462 var vfModuleModel = serviceModel.vnfs[vnfCustomizationName].vfModules[vfModuleCustomizationName];
\r
463 convertedAsdcModel.vnfs[vnfModel.uuid].vfModules[vfModuleModel.uuid] = vfModuleModel;
\r
466 for (var volumeGroupCustomizationName in serviceModel.vnfs[vnfCustomizationName].volumeGroups) {
\r
467 var volumeGroupModel = serviceModel.vnfs[vnfCustomizationName].volumeGroups[volumeGroupCustomizationName];
\r
468 convertedAsdcModel.vnfs[vnfModel.uuid].volumeGroups[volumeGroupModel.uuid] = volumeGroupModel;
\r
471 //console.log ("convertedAsdcModel: "); console.log (JSON.stringify ( convertedAsdcModel, null, 4 ) );
\r
473 var completeDisplayInputs = {};
\r
475 for (var key in vnfModelDisplayInputs) {
\r
476 completeDisplayInputs[key] = vnfModelDisplayInputs[key];
\r
478 for (var key in networkModelDisplayInputs) {
\r
479 completeDisplayInputs[key] = networkModelDisplayInputs[key];
\r
482 convertedAsdcModel.completeDisplayInputs = completeDisplayInputs;
\r
483 // Need to collect all the model customization names (node template tag) and descriptions
\r
484 DataService.setResources (completeResources);
\r
485 $log.debug ("convertedAsdcModel: ", convertedAsdcModel);
\r
486 return (convertedAsdcModel);
\r
489 function hasContents(object) {
\r
490 if (object === undefined || object === null || object === "") {
\r
495 function isObjectEmpty(o) {
\r
497 if (hasContents(o)){
\r
498 var keys = Object.keys(o);
\r
511 function padZero(number) {
\r
513 return "0" + number;
\r
515 return "" + number;
\r
519 var httpErrorHandler = function(response, status) {
\r
520 $log.warn("UtilityService:httpErrorHandler: response:");
\r
521 $log.warn(response);
\r
522 $log.warn("UtilityService:httpErrorHandler: status:");
\r
524 if (angular.isFunction(_this.httpErrorHandler)) {
\r
525 _this.httpErrorHandler(response, status);
\r
529 var startNextAsyncOperation = function() {
\r
530 if (_this.asyncOperations.count < _this.asyncOperations.operationList.length) {
\r
531 _this.asyncOperations.operationList[_this.asyncOperations.count++]
\r
534 if (angular.isFunction(_this.asyncOperations.callbackFunction)) {
\r
535 _this.asyncOperations.callbackFunction();
\r
541 setProperties : function(properties) {
\r
542 _this.properties = properties;
\r
544 getProperties : function() {
\r
545 return _this.properties;
\r
547 hasContents : hasContents,
\r
548 checkUndefined : function(name, value) {
\r
549 if (value === undefined) {
\r
551 type : "undefinedObject",
\r
552 message : "undefined object: \"" + name + "\""
\r
557 jsonConcat : function (o1, o2) {
\r
558 for (var key in o2) {
\r
563 getCurrentTime : function() {
\r
564 var time = new Date();
\r
565 return padZero(time.getMonth() + 1) + "/"
\r
566 + padZero(time.getDate()) + "/"
\r
567 + (time.getFullYear() - 2000) + " "
\r
568 + padZero(time.getHours()) + ":"
\r
569 + padZero(time.getMinutes()) + ":"
\r
570 + padZero(time.getSeconds())
\r
572 getHttpStatusText : function(statusCode) {
\r
576 "202" : "Accepted",
\r
577 "400" : "Bad Request",
\r
578 "401" : "Unauthorized",
\r
579 "404" : "Not Found",
\r
580 "405" : "Method Not Allowed",
\r
582 "500" : "Internal Server Error",
\r
583 "503" : "Service Unavailable",
\r
584 "504" : "Gateway Timeout"
\r
587 if (status === undefined) {
\r
588 return "Undefined";
\r
591 var statusText = statusMap[statusCode];
\r
592 if (statusText === undefined) {
\r
593 statusText = "Unknown";
\r
596 return statusText + " (" + statusCode + ")";
\r
598 getHttpErrorMessage : function(response) {
\r
599 var data = response.data;
\r
600 if ((response.status >= 400 && response.status < 600) && hasContents(data.exception)) {
\r
601 var summary = "exception: " + data.exception;
\r
602 if (hasContents(data.message)) {
\r
603 summary += " message: " + data.message;
\r
607 if (response.status === 0 && response.statusText === "") {
\r
609 * This logic is somewhat "fuzzy". Potential (brainstorming)
\r
610 * enhancements if users find the message unreliable include:
\r
612 * A) SERVER TIMEOUT: perhaps a newer version of Angular can
\r
613 * reliably determine timeouts.
\r
615 * B) SERVER TIMEOUT: recording start / end times and using that
\r
616 * to determine if timeout occured
\r
618 * C) SESSION TIMEOUT "Potentially" examine cookies, although
\r
619 * that may not be feasible if cookies are set to "httponly".
\r
621 if (data === null) {
\r
622 //return "possible server timeout";
\r
623 return "VID has timed out waiting for a response. To see status, close this popup and the screen will be refreshed automatically";
\r
626 return "Possible reasons include a session timeout or a server issue. "
\r
627 + "A session timeout might be resolved by refreshing the screen and re-logging in";
\r
631 if (response.status !== undefined && response.status > 0) {
\r
632 summary = "status: " + response.status;
\r
634 if (hasContents(response.statusText)) {
\r
635 if (summary !== "") {
\r
638 summary += "message: " + response.statusText;
\r
642 setHttpErrorHandler : function(httpErrorHandler) {
\r
643 _this.httpErrorHandler = httpErrorHandler;
\r
645 runHttpErrorHandler : function(response, status) {
\r
646 httpErrorHandler(response, status);
\r
648 startAsyncOperations : function(operationList, callbackFunction) {
\r
649 for (var i = 0; i < operationList.length; i++) {
\r
650 if (!angular.isFunction(operationList[i])) {
\r
651 throw "UtilityService:startAsyncOperations: invalid function: index: "
\r
655 _this.asyncOperations = {
\r
656 operationList : operationList,
\r
657 callbackFunction : callbackFunction,
\r
660 startNextAsyncOperation();
\r
662 startNextAsyncOperation : startNextAsyncOperation,
\r
663 stopAsyncOperations : function() {
\r
664 _this.asyncOperations.count = _this.asyncOperations.operationList.length;
\r
666 isObjectEmpty : isObjectEmpty,
\r
667 convertModel : convertModel,
\r
668 convertNewModel : convertNewModel,
\r
669 convertOldModel : convertOldModel,
\r
670 arrayContains : function (a, obj) {
\r
674 if (a[i] === obj) {
\r
684 //app.factory("UtilityService", UtilityService);
\r
685 appDS2.factory("UtilityService", [ "$log", "DataService", "PARAMETER", UtilityService ]);
\r