2 * ============LICENSE_START=======================================================
\r
4 * ================================================================================
\r
5 * Copyright (C) 2017 - 2019 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
70 function hasCustomizationUuidFields(mapOfVfs) {
\r
71 return _.some(mapOfVfs, function (o) {
\r
72 return _.has(o, "customizationUuid");
\r
76 var convertModel = function (serviceModel) {
\r
79 hasCustomizationUuidFields(serviceModel.networks)
\r
80 || hasCustomizationUuidFields(serviceModel.pnfs)
\r
81 || hasCustomizationUuidFields(serviceModel.vnfs)
\r
82 || hasCustomizationUuidFields(serviceModel.configurations);
\r
85 return (convertNewModel (serviceModel) );
\r
88 return (convertOldModel (serviceModel) );
\r
91 var convertNewModel = function (serviceModel ) {
\r
92 var completeResources = new Array();
\r
94 var convertedAsdcModel = {
\r
95 "service": serviceModel.service,
\r
98 "pnfs": serviceModel.pnfs,
\r
99 "serviceProxies": serviceModel.serviceProxies,
\r
100 "completeDisplayInputs": {},
\r
103 var networkModelDisplayInputs = {};
\r
104 var vnfModelDisplayInputs = {};
\r
105 for (var networkCustomizationName in serviceModel.networks) {
\r
106 var networkModel = serviceModel.networks[networkCustomizationName];
\r
108 convertedAsdcModel.networks[networkModel.customizationUuid] = {
\r
109 "uuid": networkModel.uuid,
\r
110 "invariantUuid": networkModel.invariantUuid,
\r
111 "version": networkModel.version,
\r
112 "name": networkModel.name,
\r
113 "modelCustomizationName": networkModel.modelCustomizationName,
\r
114 "customizationUuid": networkModel.customizationUuid,
\r
116 "description": networkModel.description,
\r
118 "displayInputs": {}
\r
121 "name": networkModel.modelCustomizationName,
\r
122 "description": networkModel.description
\r
124 completeResources.push (resource);
\r
126 if (networkModel.commands != null) {
\r
129 * internal_net_param_ntu: {
\r
130 * command: get_input,
\r
131 * displaName: internal_net_param_ntu,
\r
132 * inputName: vccfd1_internal_net_param_ntu // pointer to input key
\r
134 * If the input name (ptr) is one of instance_node_target, naming_policy or vf_instance_name
\r
139 for ( var cmd in networkModel.commands ) {
\r
140 var cmdObj = networkModel.commands[cmd];
\r
141 if ( cmdObj.inputName != null ) {
\r
142 switch (cmdObj.inputName) {
\r
143 case "instance_node_target":
\r
145 case "naming_policy":
\r
147 case "vf_instance_name":
\r
150 if (serviceModel.service != null && serviceModel.service.inputs != null &&
\r
151 serviceModel.service.inputs[cmdObj.inputName] != null ) {
\r
152 networkModelDisplayInputs[cmdObj.inputName] = (serviceModel.service.inputs[cmdObj.inputName]);
\r
153 networkModelDisplayInputs[cmdObj.inputName][PARAMETER.DISPLAY_NAME] = cmdObj.displayName;
\r
154 //E2E services need this
\r
155 ["templateInvariantUUID", "templateCustomizationUUID", "templateUUID", "templateName"].forEach(function(templateProp) {
\r
156 networkModelDisplayInputs[cmdObj.inputName][templateProp] = networkModel.inputs[cmdObj.displayName][templateProp];
\r
165 convertedAsdcModel.networks[networkModel.customizationUuid].displayInputs=networkModelDisplayInputs;
\r
170 _.forEach(serviceModel.configurations, function(element, key) {
\r
171 element.isConfig = true;
\r
173 _.forEach(serviceModel.pnfs, function(element, key) {
\r
174 element.isPnf= true;
\r
175 element.modelCustomizationName= key;
\r
177 var mergedVnfs = Object.assign({}, serviceModel.vnfs, serviceModel.configurations, serviceModel.pnfs);
\r
179 for (var vnfCustomizationName in mergedVnfs) {
\r
180 var vnfModel = mergedVnfs[vnfCustomizationName];
\r
181 var vnfCustomizationUuid = vnfModel.customizationUuid;
\r
182 convertedAsdcModel.vnfs[vnfModel.customizationUuid] = {
\r
183 "uuid": vnfModel.uuid,
\r
184 "invariantUuid": vnfModel.invariantUuid,
\r
185 "version": vnfModel.version,
\r
186 "name": vnfModel.name,
\r
187 "modelCustomizationName": vnfModel.modelCustomizationName,
\r
188 "customizationUuid": vnfModel.customizationUuid,
\r
190 "description": vnfModel.description,
\r
192 "volumeGroups": {},
\r
194 "displayInputs": {},
\r
198 "sourceNodes": vnfModel.sourceNodes,
\r
199 "collectorNodes": vnfModel.collectorNodes,
\r
200 "isConfigurationByPolicy": vnfModel.configurationByPolicy ? vnfModel.configurationByPolicy : false,
\r
201 "isConfig": vnfModel.isConfig ? vnfModel.isConfig : false,
\r
202 "isPnf": vnfModel.isPnf ? vnfModel.isPnf : false
\r
206 "name": vnfModel.modelCustomizationName,
\r
207 "description": vnfModel.description
\r
209 completeResources.push (resource);
\r
211 if (vnfModel.commands != null) {
\r
214 * internal_net_param_ntu: {
\r
215 * command: get_input,
\r
216 * displaName: internal_net_param_ntu,
\r
217 * inputName: vccfd1_internal_net_param_ntu // pointer to input key
\r
219 * If the input name (ptr) is one of instance_node_target, naming_policy or vf_instance_name
\r
224 for ( var cmd in vnfModel.commands ) {
\r
225 var cmdObj = vnfModel.commands[cmd];
\r
226 if ( cmdObj.inputName != null ) {
\r
227 // To Do: Make this list configurable
\r
228 switch (cmdObj.inputName) {
\r
229 case "instance_node_target":
\r
231 case "naming_policy":
\r
233 case "vf_instance_name":
\r
236 if (serviceModel.service != null && serviceModel.service.inputs != null &&
\r
237 serviceModel.service.inputs[cmdObj.inputName] != null ) {
\r
238 vnfModelDisplayInputs[cmdObj.inputName] = (serviceModel.service.inputs[cmdObj.inputName]);
\r
239 vnfModelDisplayInputs[cmdObj.inputName][PARAMETER.DISPLAY_NAME] = cmdObj.displayName;
\r
240 //E2E services need this
\r
241 ["templateInvariantUUID", "templateCustomizationUUID", "templateUUID", "templateName"].forEach(function(templateProp) {
\r
242 vnfModelDisplayInputs[cmdObj.inputName][templateProp] = vnfModel.inputs[cmdObj.displayName][templateProp];
\r
251 convertedAsdcModel.vnfs[vnfCustomizationUuid].displayInputs=vnfModelDisplayInputs;
\r
252 convertedAsdcModel.vnfs[vnfCustomizationUuid].properties=vnfModel.properties;
\r
256 var vnf_function = "";
\r
258 if ( !( isObjectEmpty(vnfModel.properties) ) ) {
\r
259 if (hasContents (vnfModel.properties.nf_type) ) {
\r
260 vnf_type = vnfModel.properties.nf_type;
\r
262 if (hasContents (vnfModel.properties.nf_role) ) {
\r
263 vnf_role = vnfModel.properties.nf_role;
\r
265 if (hasContents (vnfModel.properties.nf_function) ) {
\r
266 vnf_function = vnfModel.properties.nf_function;
\r
268 if (hasContents (vnfModel.properties.nf_naming_code) ) {
\r
269 vnf_code = vnfModel.properties.nf_naming_code;
\r
272 convertedAsdcModel.vnfs[vnfCustomizationUuid]["nfType"] = vnf_type;
\r
273 convertedAsdcModel.vnfs[vnfCustomizationUuid]["nfRole"] = vnf_role;
\r
274 convertedAsdcModel.vnfs[vnfCustomizationUuid]["nfFunction"] = vnf_function;
\r
275 convertedAsdcModel.vnfs[vnfCustomizationUuid]["nfCode"] = vnf_code;
\r
277 for (var vfModuleCustomizationName in vnfModel.vfModules) {
\r
278 var vfModuleModel = vnfModel.vfModules[vfModuleCustomizationName];
\r
279 convertedAsdcModel.vnfs[vnfCustomizationUuid].vfModules[vfModuleModel.customizationUuid] = vfModuleModel;
\r
282 for (var volumeGroupCustomizationName in mergedVnfs[vnfCustomizationName].volumeGroups) {
\r
283 var volumeGroupModel = mergedVnfs[vnfCustomizationName].volumeGroups[volumeGroupCustomizationName];
\r
284 convertedAsdcModel.vnfs[vnfCustomizationUuid].volumeGroups[volumeGroupModel.customizationUuid] = volumeGroupModel;
\r
289 var completeDisplayInputs = {};
\r
291 for (var key in vnfModelDisplayInputs) {
\r
292 completeDisplayInputs[key] = vnfModelDisplayInputs[key];
\r
294 for (var key in networkModelDisplayInputs) {
\r
295 completeDisplayInputs[key] = networkModelDisplayInputs[key];
\r
298 convertedAsdcModel.completeDisplayInputs = completeDisplayInputs;
\r
299 // Need to collect all the model customization names (node template tag) and descriptions
\r
300 DataService.setResources (completeResources);
\r
302 $log.debug ("convertedAsdcModel: ", convertedAsdcModel);
\r
303 return (convertedAsdcModel);
\r
306 var convertOldModel = function (serviceModel ) {
\r
309 var convertedAsdcModel = {
\r
310 "service": serviceModel.service,
\r
313 "pnfs": serviceModel.pnfs,
\r
314 "serviceProxies": serviceModel.serviceProxies,
\r
315 "completeDisplayInputs": {},
\r
318 var completeResources = new Array();
\r
320 var vnfModelDisplayInputs = {};
\r
321 var networkModelDisplayInputs = {};
\r
322 for (var networkCustomizationName in serviceModel.networks) {
\r
323 var networkModel = serviceModel.networks[networkCustomizationName];
\r
324 convertedAsdcModel.networks[networkModel.invariantUuid] = {};
\r
325 //convertedAsdcModel.networks[networkModel.invariantUuid][networkModel.version] = networkModel;
\r
326 // need a network model to test this
\r
327 convertedAsdcModel.networks[networkModel.uuid] = {
\r
328 "uuid": networkModel.uuid,
\r
329 "invariantUuid": networkModel.invariantUuid,
\r
330 "version": networkModel.version,
\r
331 "name": networkModel.name,
\r
332 "modelCustomizationName": networkModel.modelCustomizationName,
\r
333 "customizationUuid": networkModel.customizationUuid,
\r
335 "description": networkModel.description,
\r
337 "displayInputs": {}
\r
340 "name": networkModel.modelCustomizationName,
\r
341 "description": networkModel.description
\r
343 completeResources.push (resource);
\r
344 if (networkModel.commands != null) {
\r
347 * internal_net_param_ntu: {
\r
348 * command: get_input,
\r
349 * displaName: internal_net_param_ntu,
\r
350 * inputName: vccfd1_internal_net_param_ntu // pointer to input key
\r
352 * If the input name (ptr) is one of instance_node_target, naming_policy or vf_instance_name
\r
357 for ( var cmd in networkModel.commands ) {
\r
358 var cmdObj = networkModel.commands[cmd];
\r
359 if ( cmdObj.inputName != null ) {
\r
360 switch (cmdObj.inputName) {
\r
361 case "instance_node_target":
\r
363 case "naming_policy":
\r
365 case "vf_instance_name":
\r
368 if (serviceModel.service != null && serviceModel.service.inputs != null &&
\r
369 serviceModel.service.inputs[cmdObj.inputName] != null ) {
\r
370 networkModelDisplayInputs[cmdObj.inputName] = (serviceModel.service.inputs[cmdObj.inputName]);
\r
371 networkModelDisplayInputs[cmdObj.inputName][PARAMETER.DISPLAY_NAME] = cmdObj.displayName;
\r
378 convertedAsdcModel.networks[networkModel.uuid].displayInputs=networkModelDisplayInputs;
\r
382 _.forEach(serviceModel.configurations, function(element, key) {
\r
383 element.isConfig = true;
\r
385 _.forEach(serviceModel.pnfs, function(element, key) {
\r
386 element.isPnf= true;
\r
387 element.modelCustomizationName= key;
\r
389 var mergedVnfs = Object.assign({}, serviceModel.vnfs, serviceModel.configurations, serviceModel.pnfs);
\r
391 for (var vnfCustomizationName in mergedVnfs) {
\r
392 var vnfModel = mergedVnfs[vnfCustomizationName];
\r
393 convertedAsdcModel.vnfs[vnfModel.uuid] = {
\r
394 "uuid": vnfModel.uuid,
\r
395 "invariantUuid": vnfModel.invariantUuid,
\r
396 "version": vnfModel.version,
\r
397 "name": vnfModel.name,
\r
398 "modelCustomizationName": vnfModel.modelCustomizationName,
\r
399 "customizationUuid": vnfModel.customizationUuid,
\r
401 "description": vnfModel.description,
\r
403 "volumeGroups": {},
\r
405 "displayInputs": {},
\r
406 "sourceNodes": vnfModel.sourceNodes,
\r
407 "collectorNodes": vnfModel.collectorNodes,
\r
408 "isConfigurationByPolicy": vnfModel.configurationByPolicy ? vnfModel.configurationByPolicy : false,
\r
409 "isConfig": vnfModel.isConfig ? vnfModel.isConfig : false,
\r
410 "isPnf": vnfModel.isPnf ? vnfModel.isPnf : false
\r
413 "name": vnfModel.modelCustomizationName,
\r
414 "description": vnfModel.description
\r
416 completeResources.push (resource);
\r
418 if (vnfModel.commands != null) {
\r
421 * internal_net_param_ntu: {
\r
422 * command: get_input,
\r
423 * displaName: internal_net_param_ntu,
\r
424 * inputName: vccfd1_internal_net_param_ntu // pointer to input key
\r
426 * If the input name (ptr) is one of instance_node_target, naming_policy or vf_instance_name
\r
431 for ( var cmd in vnfModel.commands ) {
\r
432 var cmdObj = vnfModel.commands[cmd];
\r
433 if ( cmdObj.inputName != null ) {
\r
434 // To Do: Make this list configurable
\r
435 switch (cmdObj.inputName) {
\r
436 case "instance_node_target":
\r
438 case "naming_policy":
\r
440 case "vf_instance_name":
\r
443 if (serviceModel.service != null && serviceModel.service.inputs != null &&
\r
444 serviceModel.service.inputs[cmdObj.inputName] != null ) {
\r
445 vnfModelDisplayInputs[cmdObj.inputName] = (serviceModel.service.inputs[cmdObj.inputName]);
\r
446 vnfModelDisplayInputs[cmdObj.inputName][PARAMETER.DISPLAY_NAME] = cmdObj.displayName;
\r
453 convertedAsdcModel.vnfs[vnfModel.uuid].displayInputs=vnfModelDisplayInputs;
\r
456 for (var vfModuleCustomizationName in vnfModel.vfModules) {
\r
457 var vfModuleModel = vnfModel.vfModules[vfModuleCustomizationName];
\r
458 convertedAsdcModel.vnfs[vnfModel.uuid].vfModules[vfModuleModel.uuid] = vfModuleModel;
\r
461 for (var volumeGroupCustomizationName in vnfModel.volumeGroups) {
\r
462 var volumeGroupModel = vnfModel.volumeGroups[volumeGroupCustomizationName];
\r
463 convertedAsdcModel.vnfs[vnfModel.uuid].volumeGroups[volumeGroupModel.uuid] = volumeGroupModel;
\r
466 //console.log ("convertedAsdcModel: "); console.log (JSON.stringify ( convertedAsdcModel, null, 4 ) );
\r
468 var completeDisplayInputs = {};
\r
470 for (var key in vnfModelDisplayInputs) {
\r
471 completeDisplayInputs[key] = vnfModelDisplayInputs[key];
\r
473 for (var key in networkModelDisplayInputs) {
\r
474 completeDisplayInputs[key] = networkModelDisplayInputs[key];
\r
477 convertedAsdcModel.completeDisplayInputs = completeDisplayInputs;
\r
478 // Need to collect all the model customization names (node template tag) and descriptions
\r
479 DataService.setResources (completeResources);
\r
480 $log.debug ("convertedAsdcModel: ", convertedAsdcModel);
\r
481 return (convertedAsdcModel);
\r
484 function hasContents(object) {
\r
485 if (object === undefined || object === null || object === "") {
\r
490 function isObjectEmpty(o) {
\r
492 if (hasContents(o)){
\r
493 var keys = Object.keys(o);
\r
506 function padZero(number) {
\r
508 return "0" + number;
\r
510 return "" + number;
\r
514 var httpErrorHandler = function(response, status) {
\r
515 $log.warn("UtilityService:httpErrorHandler: response:");
\r
516 $log.warn(response);
\r
517 $log.warn("UtilityService:httpErrorHandler: status:");
\r
519 if (angular.isFunction(_this.httpErrorHandler)) {
\r
520 _this.httpErrorHandler(response, status);
\r
524 var startNextAsyncOperation = function() {
\r
525 if (_this.asyncOperations.count < _this.asyncOperations.operationList.length) {
\r
526 _this.asyncOperations.operationList[_this.asyncOperations.count++]
\r
529 if (angular.isFunction(_this.asyncOperations.callbackFunction)) {
\r
530 _this.asyncOperations.callbackFunction();
\r
536 setProperties : function(properties) {
\r
537 _this.properties = properties;
\r
539 getProperties : function() {
\r
540 return _this.properties;
\r
542 hasContents : hasContents,
\r
543 checkUndefined : function(name, value) {
\r
544 if (value === undefined) {
\r
546 type : "undefinedObject",
\r
547 message : "undefined object: \"" + name + "\""
\r
552 jsonConcat : function (o1, o2) {
\r
553 for (var key in o2) {
\r
558 getCurrentTime : function() {
\r
559 var time = new Date();
\r
560 return padZero(time.getMonth() + 1) + "/"
\r
561 + padZero(time.getDate()) + "/"
\r
562 + (time.getFullYear() - 2000) + " "
\r
563 + padZero(time.getHours()) + ":"
\r
564 + padZero(time.getMinutes()) + ":"
\r
565 + padZero(time.getSeconds())
\r
567 getHttpStatusText : function(statusCode) {
\r
571 "202" : "Accepted",
\r
572 "400" : "Bad Request",
\r
573 "401" : "Unauthorized",
\r
574 "404" : "Not Found",
\r
575 "405" : "Method Not Allowed",
\r
577 "500" : "Internal Server Error",
\r
578 "503" : "Service Unavailable",
\r
579 "504" : "Gateway Timeout"
\r
582 if (status === undefined) {
\r
583 return "Undefined";
\r
586 var statusText = statusMap[statusCode];
\r
587 if (statusText === undefined) {
\r
588 statusText = "Unknown";
\r
591 return statusText + " (" + statusCode + ")";
\r
593 getHttpErrorMessage : function(response) {
\r
594 var data = response.data;
\r
595 if ((response.status >= 400 && response.status < 600) && hasContents(data.exception)) {
\r
596 var summary = "exception: " + data.exception;
\r
597 if (hasContents(data.message)) {
\r
598 summary += " message: " + data.message;
\r
602 if (response.status === 0 && response.statusText === "") {
\r
604 * This logic is somewhat "fuzzy". Potential (brainstorming)
\r
605 * enhancements if users find the message unreliable include:
\r
607 * A) SERVER TIMEOUT: perhaps a newer version of Angular can
\r
608 * reliably determine timeouts.
\r
610 * B) SERVER TIMEOUT: recording start / end times and using that
\r
611 * to determine if timeout occured
\r
613 * C) SESSION TIMEOUT "Potentially" examine cookies, although
\r
614 * that may not be feasible if cookies are set to "httponly".
\r
616 if (data === null) {
\r
617 //return "possible server timeout";
\r
618 return "VID has timed out waiting for a response. To see status, close this popup and the screen will be refreshed automatically";
\r
621 return "Possible reasons include a session timeout or a server issue. "
\r
622 + "A session timeout might be resolved by refreshing the screen and re-logging in";
\r
626 if (response.status !== undefined && response.status > 0) {
\r
627 summary = "status: " + response.status;
\r
629 if (hasContents(response.statusText)) {
\r
630 if (summary !== "") {
\r
633 summary += "message: " + response.statusText;
\r
637 setHttpErrorHandler : function(httpErrorHandler) {
\r
638 _this.httpErrorHandler = httpErrorHandler;
\r
640 runHttpErrorHandler : function(response, status) {
\r
641 httpErrorHandler(response, status);
\r
643 startAsyncOperations : function(operationList, callbackFunction) {
\r
644 for (var i = 0; i < operationList.length; i++) {
\r
645 if (!angular.isFunction(operationList[i])) {
\r
646 throw "UtilityService:startAsyncOperations: invalid function: index: "
\r
650 _this.asyncOperations = {
\r
651 operationList : operationList,
\r
652 callbackFunction : callbackFunction,
\r
655 startNextAsyncOperation();
\r
657 startNextAsyncOperation : startNextAsyncOperation,
\r
658 stopAsyncOperations : function() {
\r
659 _this.asyncOperations.count = _this.asyncOperations.operationList.length;
\r
661 isObjectEmpty : isObjectEmpty,
\r
662 convertModel : convertModel,
\r
663 convertNewModel : convertNewModel,
\r
664 convertOldModel : convertOldModel,
\r
665 arrayContains : function (a, obj) {
\r
669 if (a[i] === obj) {
\r
679 //app.factory("UtilityService", UtilityService);
\r
680 appDS2.factory("UtilityService", [ "$log", "DataService", "PARAMETER", "_", UtilityService ]);
\r