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
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
247 convertedAsdcModel.vnfs[vnfCustomizationUuid].displayInputs=vnfModelDisplayInputs;
\r
248 convertedAsdcModel.vnfs[vnfCustomizationUuid].properties=vnfModel.properties;
\r
252 var vnf_function = "";
\r
254 if ( !( isObjectEmpty(vnfModel.properties) ) ) {
\r
255 if (hasContents (vnfModel.properties.nf_type) ) {
\r
256 vnf_type = vnfModel.properties.nf_type;
\r
258 if (hasContents (vnfModel.properties.nf_role) ) {
\r
259 vnf_role = vnfModel.properties.nf_role;
\r
261 if (hasContents (vnfModel.properties.nf_function) ) {
\r
262 vnf_function = vnfModel.properties.nf_function;
\r
264 if (hasContents (vnfModel.properties.nf_naming_code) ) {
\r
265 vnf_code = vnfModel.properties.nf_naming_code;
\r
268 convertedAsdcModel.vnfs[vnfCustomizationUuid]["nfType"] = vnf_type;
\r
269 convertedAsdcModel.vnfs[vnfCustomizationUuid]["nfRole"] = vnf_role;
\r
270 convertedAsdcModel.vnfs[vnfCustomizationUuid]["nfFunction"] = vnf_function;
\r
271 convertedAsdcModel.vnfs[vnfCustomizationUuid]["nfCode"] = vnf_code;
\r
273 for (var vfModuleCustomizationName in serviceModel.vnfs[vnfCustomizationName].vfModules) {
\r
274 var vfModuleModel = serviceModel.vnfs[vnfCustomizationName].vfModules[vfModuleCustomizationName];
\r
275 convertedAsdcModel.vnfs[vnfCustomizationUuid].vfModules[vfModuleModel.customizationUuid] = vfModuleModel;
\r
278 for (var volumeGroupCustomizationName in serviceModel.vnfs[vnfCustomizationName].volumeGroups) {
\r
279 var volumeGroupModel = serviceModel.vnfs[vnfCustomizationName].volumeGroups[volumeGroupCustomizationName];
\r
280 convertedAsdcModel.vnfs[vnfCustomizationUuid].volumeGroups[volumeGroupModel.customizationUuid] = volumeGroupModel;
\r
285 var completeDisplayInputs = {};
\r
287 for (var key in vnfModelDisplayInputs) {
\r
288 completeDisplayInputs[key] = vnfModelDisplayInputs[key];
\r
290 for (var key in networkModelDisplayInputs) {
\r
291 completeDisplayInputs[key] = networkModelDisplayInputs[key];
\r
294 convertedAsdcModel.completeDisplayInputs = completeDisplayInputs;
\r
295 // Need to collect all the model customization names (node template tag) and descriptions
\r
296 DataService.setResources (completeResources);
\r
298 $log.debug ("convertedAsdcModel: ", convertedAsdcModel);
\r
299 return (convertedAsdcModel);
\r
302 var convertOldModel = function (serviceModel ) {
\r
305 var convertedAsdcModel = {
\r
306 "service": serviceModel.service,
\r
309 "pnfs": serviceModel.pnfs,
\r
310 "serviceProxies": serviceModel.serviceProxies,
\r
311 "completeDisplayInputs": {},
\r
314 var completeResources = new Array();
\r
316 var vnfModelDisplayInputs = {};
\r
317 var networkModelDisplayInputs = {};
\r
318 for (var networkCustomizationName in serviceModel.networks) {
\r
319 var networkModel = serviceModel.networks[networkCustomizationName];
\r
320 convertedAsdcModel.networks[networkModel.invariantUuid] = {};
\r
321 //convertedAsdcModel.networks[networkModel.invariantUuid][networkModel.version] = networkModel;
\r
322 // need a network model to test this
\r
323 convertedAsdcModel.networks[networkModel.uuid] = {
\r
324 "uuid": networkModel.uuid,
\r
325 "invariantUuid": networkModel.invariantUuid,
\r
326 "version": networkModel.version,
\r
327 "name": networkModel.name,
\r
328 "modelCustomizationName": networkModel.modelCustomizationName,
\r
329 "customizationUuid": networkModel.customizationUuid,
\r
331 "description": networkModel.description,
\r
333 "displayInputs": {}
\r
336 "name": networkModel.modelCustomizationName,
\r
337 "description": networkModel.description
\r
339 completeResources.push (resource);
\r
340 if (networkModel.commands != null) {
\r
343 * internal_net_param_ntu: {
\r
344 * command: get_input,
\r
345 * displaName: internal_net_param_ntu,
\r
346 * inputName: vccfd1_internal_net_param_ntu // pointer to input key
\r
348 * If the input name (ptr) is one of instance_node_target, naming_policy or vf_instance_name
\r
353 for ( var cmd in networkModel.commands ) {
\r
354 var cmdObj = networkModel.commands[cmd];
\r
355 if ( cmdObj.inputName != null ) {
\r
356 switch (cmdObj.inputName) {
\r
357 case "instance_node_target":
\r
359 case "naming_policy":
\r
361 case "vf_instance_name":
\r
364 if (serviceModel.service != null && serviceModel.service.inputs != null &&
\r
365 serviceModel.service.inputs[cmdObj.inputName] != null ) {
\r
366 networkModelDisplayInputs[cmdObj.inputName] = (serviceModel.service.inputs[cmdObj.inputName]);
\r
367 networkModelDisplayInputs[cmdObj.inputName][PARAMETER.DISPLAY_NAME] = cmdObj.displayName;
\r
374 convertedAsdcModel.networks[networkModel.uuid].displayInputs=networkModelDisplayInputs;
\r
378 _.forEach(serviceModel.configurations, function(element, key) {
\r
379 element.isConfig = true;
\r
381 _.forEach(serviceModel.pnfs, function(element, key) {
\r
382 element.isPnf= true;
\r
383 element.modelCustomizationName= key;
\r
385 var mergedVnfs = Object.assign(serviceModel.vnfs, serviceModel.configurations, serviceModel.pnfs);
\r
387 for (var vnfCustomizationName in mergedVnfs) {
\r
388 var vnfModel = mergedVnfs[vnfCustomizationName];
\r
389 convertedAsdcModel.vnfs[vnfModel.uuid] = {
\r
390 "uuid": vnfModel.uuid,
\r
391 "invariantUuid": vnfModel.invariantUuid,
\r
392 "version": vnfModel.version,
\r
393 "name": vnfModel.name,
\r
394 "modelCustomizationName": vnfModel.modelCustomizationName,
\r
395 "customizationUuid": vnfModel.customizationUuid,
\r
397 "description": vnfModel.description,
\r
399 "volumeGroups": {},
\r
401 "displayInputs": {},
\r
402 "sourceNodes": vnfModel.sourceNodes,
\r
403 "collectorNodes": vnfModel.collectorNodes,
\r
404 "isConfigurationByPolicy": vnfModel.configurationByPolicy ? vnfModel.configurationByPolicy : false,
\r
405 "isConfig": vnfModel.isConfig ? vnfModel.isConfig : false,
\r
406 "isPnf": vnfModel.isPnf ? vnfModel.isPnf : false
\r
409 "name": vnfModel.modelCustomizationName,
\r
410 "description": vnfModel.description
\r
412 completeResources.push (resource);
\r
414 if (vnfModel.commands != null) {
\r
417 * internal_net_param_ntu: {
\r
418 * command: get_input,
\r
419 * displaName: internal_net_param_ntu,
\r
420 * inputName: vccfd1_internal_net_param_ntu // pointer to input key
\r
422 * If the input name (ptr) is one of instance_node_target, naming_policy or vf_instance_name
\r
427 for ( var cmd in vnfModel.commands ) {
\r
428 var cmdObj = vnfModel.commands[cmd];
\r
429 if ( cmdObj.inputName != null ) {
\r
430 // To Do: Make this list configurable
\r
431 switch (cmdObj.inputName) {
\r
432 case "instance_node_target":
\r
434 case "naming_policy":
\r
436 case "vf_instance_name":
\r
439 if (serviceModel.service != null && serviceModel.service.inputs != null &&
\r
440 serviceModel.service.inputs[cmdObj.inputName] != null ) {
\r
441 vnfModelDisplayInputs[cmdObj.inputName] = (serviceModel.service.inputs[cmdObj.inputName]);
\r
442 vnfModelDisplayInputs[cmdObj.inputName][PARAMETER.DISPLAY_NAME] = cmdObj.displayName;
\r
449 convertedAsdcModel.vnfs[vnfModel.uuid].displayInputs=vnfModelDisplayInputs;
\r
452 for (var vfModuleCustomizationName in serviceModel.vnfs[vnfCustomizationName].vfModules) {
\r
453 var vfModuleModel = serviceModel.vnfs[vnfCustomizationName].vfModules[vfModuleCustomizationName];
\r
454 convertedAsdcModel.vnfs[vnfModel.uuid].vfModules[vfModuleModel.uuid] = vfModuleModel;
\r
457 for (var volumeGroupCustomizationName in serviceModel.vnfs[vnfCustomizationName].volumeGroups) {
\r
458 var volumeGroupModel = serviceModel.vnfs[vnfCustomizationName].volumeGroups[volumeGroupCustomizationName];
\r
459 convertedAsdcModel.vnfs[vnfModel.uuid].volumeGroups[volumeGroupModel.uuid] = volumeGroupModel;
\r
462 //console.log ("convertedAsdcModel: "); console.log (JSON.stringify ( convertedAsdcModel, null, 4 ) );
\r
464 var completeDisplayInputs = {};
\r
466 for (var key in vnfModelDisplayInputs) {
\r
467 completeDisplayInputs[key] = vnfModelDisplayInputs[key];
\r
469 for (var key in networkModelDisplayInputs) {
\r
470 completeDisplayInputs[key] = networkModelDisplayInputs[key];
\r
473 convertedAsdcModel.completeDisplayInputs = completeDisplayInputs;
\r
474 // Need to collect all the model customization names (node template tag) and descriptions
\r
475 DataService.setResources (completeResources);
\r
476 $log.debug ("convertedAsdcModel: ", convertedAsdcModel);
\r
477 return (convertedAsdcModel);
\r
480 function hasContents(object) {
\r
481 if (object === undefined || object === null || object === "") {
\r
486 function isObjectEmpty(o) {
\r
488 if (hasContents(o)){
\r
489 var keys = Object.keys(o);
\r
502 function padZero(number) {
\r
504 return "0" + number;
\r
506 return "" + number;
\r
510 var httpErrorHandler = function(response, status) {
\r
511 $log.warn("UtilityService:httpErrorHandler: response:");
\r
512 $log.warn(response);
\r
513 $log.warn("UtilityService:httpErrorHandler: status:");
\r
515 if (angular.isFunction(_this.httpErrorHandler)) {
\r
516 _this.httpErrorHandler(response, status);
\r
520 var startNextAsyncOperation = function() {
\r
521 if (_this.asyncOperations.count < _this.asyncOperations.operationList.length) {
\r
522 _this.asyncOperations.operationList[_this.asyncOperations.count++]
\r
525 if (angular.isFunction(_this.asyncOperations.callbackFunction)) {
\r
526 _this.asyncOperations.callbackFunction();
\r
532 setProperties : function(properties) {
\r
533 _this.properties = properties;
\r
535 getProperties : function() {
\r
536 return _this.properties;
\r
538 hasContents : hasContents,
\r
539 checkUndefined : function(name, value) {
\r
540 if (value === undefined) {
\r
542 type : "undefinedObject",
\r
543 message : "undefined object: \"" + name + "\""
\r
548 jsonConcat : function (o1, o2) {
\r
549 for (var key in o2) {
\r
554 getCurrentTime : function() {
\r
555 var time = new Date();
\r
556 return padZero(time.getMonth() + 1) + "/"
\r
557 + padZero(time.getDate()) + "/"
\r
558 + (time.getFullYear() - 2000) + " "
\r
559 + padZero(time.getHours()) + ":"
\r
560 + padZero(time.getMinutes()) + ":"
\r
561 + padZero(time.getSeconds())
\r
563 getHttpStatusText : function(statusCode) {
\r
567 "202" : "Accepted",
\r
568 "400" : "Bad Request",
\r
569 "401" : "Unauthorized",
\r
570 "404" : "Not Found",
\r
571 "405" : "Method Not Allowed",
\r
573 "500" : "Internal Server Error",
\r
574 "503" : "Service Unavailable",
\r
575 "504" : "Gateway Timeout"
\r
578 if (status === undefined) {
\r
579 return "Undefined";
\r
582 var statusText = statusMap[statusCode];
\r
583 if (statusText === undefined) {
\r
584 statusText = "Unknown";
\r
587 return statusText + " (" + statusCode + ")";
\r
589 getHttpErrorMessage : function(response) {
\r
590 var data = response.data;
\r
591 if ((response.status >= 400 && response.status < 600) && hasContents(data.exception)) {
\r
592 var summary = "exception: " + data.exception;
\r
593 if (hasContents(data.message)) {
\r
594 summary += " message: " + data.message;
\r
598 if (response.status === 0 && response.statusText === "") {
\r
600 * This logic is somewhat "fuzzy". Potential (brainstorming)
\r
601 * enhancements if users find the message unreliable include:
\r
603 * A) SERVER TIMEOUT: perhaps a newer version of Angular can
\r
604 * reliably determine timeouts.
\r
606 * B) SERVER TIMEOUT: recording start / end times and using that
\r
607 * to determine if timeout occured
\r
609 * C) SESSION TIMEOUT "Potentially" examine cookies, although
\r
610 * that may not be feasible if cookies are set to "httponly".
\r
612 if (data === null) {
\r
613 //return "possible server timeout";
\r
614 return "VID has timed out waiting for a response. To see status, close this popup and the screen will be refreshed automatically";
\r
617 return "Possible reasons include a session timeout or a server issue. "
\r
618 + "A session timeout might be resolved by refreshing the screen and re-logging in";
\r
622 if (response.status !== undefined && response.status > 0) {
\r
623 summary = "status: " + response.status;
\r
625 if (hasContents(response.statusText)) {
\r
626 if (summary !== "") {
\r
629 summary += "message: " + response.statusText;
\r
633 setHttpErrorHandler : function(httpErrorHandler) {
\r
634 _this.httpErrorHandler = httpErrorHandler;
\r
636 runHttpErrorHandler : function(response, status) {
\r
637 httpErrorHandler(response, status);
\r
639 startAsyncOperations : function(operationList, callbackFunction) {
\r
640 for (var i = 0; i < operationList.length; i++) {
\r
641 if (!angular.isFunction(operationList[i])) {
\r
642 throw "UtilityService:startAsyncOperations: invalid function: index: "
\r
646 _this.asyncOperations = {
\r
647 operationList : operationList,
\r
648 callbackFunction : callbackFunction,
\r
651 startNextAsyncOperation();
\r
653 startNextAsyncOperation : startNextAsyncOperation,
\r
654 stopAsyncOperations : function() {
\r
655 _this.asyncOperations.count = _this.asyncOperations.operationList.length;
\r
657 isObjectEmpty : isObjectEmpty,
\r
658 convertModel : convertModel,
\r
659 convertNewModel : convertNewModel,
\r
660 convertOldModel : convertOldModel,
\r
661 arrayContains : function (a, obj) {
\r
665 if (a[i] === obj) {
\r
675 //app.factory("UtilityService", UtilityService);
\r
676 appDS2.factory("UtilityService", [ "$log", "DataService", "PARAMETER", UtilityService ]);
\r