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 "completeDisplayInputs": {},
\r
106 var networkModelDisplayInputs = {};
\r
107 var vnfModelDisplayInputs = {};
\r
108 for (var networkCustomizationName in serviceModel.networks) {
\r
109 var networkModel = serviceModel.networks[networkCustomizationName];
\r
111 convertedAsdcModel.networks[networkModel.customizationUuid] = {
\r
112 "uuid": networkModel.uuid,
\r
113 "invariantUuid": networkModel.invariantUuid,
\r
114 "version": networkModel.version,
\r
115 "name": networkModel.name,
\r
116 "modelCustomizationName": networkModel.modelCustomizationName,
\r
117 "customizationUuid": networkModel.customizationUuid,
\r
119 "description": networkModel.description,
\r
121 "displayInputs": {}
\r
124 "name": networkModel.modelCustomizationName,
\r
125 "description": networkModel.description
\r
127 completeResources.push (resource);
\r
129 if (networkModel.commands != null) {
\r
132 * internal_net_param_ntu: {
\r
133 * command: get_input,
\r
134 * displaName: internal_net_param_ntu,
\r
135 * inputName: vccfd1_internal_net_param_ntu // pointer to input key
\r
137 * If the input name (ptr) is one of instance_node_target, naming_policy or vf_instance_name
\r
142 for ( var cmd in networkModel.commands ) {
\r
143 var cmdObj = networkModel.commands[cmd];
\r
144 if ( cmdObj.inputName != null ) {
\r
145 switch (cmdObj.inputName) {
\r
146 case "instance_node_target":
\r
148 case "naming_policy":
\r
150 case "vf_instance_name":
\r
153 if (serviceModel.service != null && serviceModel.service.inputs != null &&
\r
154 serviceModel.service.inputs[cmdObj.inputName] != null ) {
\r
155 networkModelDisplayInputs[cmdObj.inputName] = (serviceModel.service.inputs[cmdObj.inputName]);
\r
156 networkModelDisplayInputs[cmdObj.inputName][PARAMETER.DISPLAY_NAME] = cmdObj.displayName;
\r
163 convertedAsdcModel.networks[networkModel.customizationUuid].displayInputs=networkModelDisplayInputs;
\r
168 for (var vnfCustomizationName in serviceModel.vnfs) {
\r
169 var vnfModel = serviceModel.vnfs[vnfCustomizationName];
\r
170 var vnfCustomizationUuid = vnfModel.customizationUuid;
\r
171 convertedAsdcModel.vnfs[vnfModel.customizationUuid] = {
\r
172 "uuid": vnfModel.uuid,
\r
173 "invariantUuid": vnfModel.invariantUuid,
\r
174 "version": vnfModel.version,
\r
175 "name": vnfModel.name,
\r
176 "modelCustomizationName": vnfModel.modelCustomizationName,
\r
177 "customizationUuid": vnfModel.customizationUuid,
\r
179 "description": vnfModel.description,
\r
181 "volumeGroups": {},
\r
183 "displayInputs": {},
\r
190 "name": vnfModel.modelCustomizationName,
\r
191 "description": vnfModel.description
\r
193 completeResources.push (resource);
\r
195 if (vnfModel.commands != null) {
\r
198 * internal_net_param_ntu: {
\r
199 * command: get_input,
\r
200 * displaName: internal_net_param_ntu,
\r
201 * inputName: vccfd1_internal_net_param_ntu // pointer to input key
\r
203 * If the input name (ptr) is one of instance_node_target, naming_policy or vf_instance_name
\r
208 for ( var cmd in vnfModel.commands ) {
\r
209 var cmdObj = vnfModel.commands[cmd];
\r
210 if ( cmdObj.inputName != null ) {
\r
211 // To Do: Make this list configurable
\r
212 switch (cmdObj.inputName) {
\r
213 case "instance_node_target":
\r
215 case "naming_policy":
\r
217 case "vf_instance_name":
\r
220 if (serviceModel.service != null && serviceModel.service.inputs != null &&
\r
221 serviceModel.service.inputs[cmdObj.inputName] != null ) {
\r
222 vnfModelDisplayInputs[cmdObj.inputName] = (serviceModel.service.inputs[cmdObj.inputName]);
\r
223 vnfModelDisplayInputs[cmdObj.inputName][PARAMETER.DISPLAY_NAME] = cmdObj.displayName;
\r
231 convertedAsdcModel.vnfs[vnfCustomizationUuid].displayInputs=vnfModelDisplayInputs;
\r
232 convertedAsdcModel.vnfs[vnfCustomizationUuid].properties=vnfModel.properties;
\r
236 var vnf_function = "";
\r
238 if ( !( isObjectEmpty(vnfModel.properties) ) ) {
\r
239 if (hasContents (vnfModel.properties.nf_type) ) {
\r
240 vnf_type = vnfModel.properties.nf_type;
\r
242 if (hasContents (vnfModel.properties.nf_role) ) {
\r
243 vnf_role = vnfModel.properties.nf_role;
\r
245 if (hasContents (vnfModel.properties.nf_function) ) {
\r
246 vnf_function = vnfModel.properties.nf_function;
\r
248 if (hasContents (vnfModel.properties.nf_naming_code) ) {
\r
249 vnf_code = vnfModel.properties.nf_naming_code;
\r
252 convertedAsdcModel.vnfs[vnfCustomizationUuid]["nfType"] = vnf_type;
\r
253 convertedAsdcModel.vnfs[vnfCustomizationUuid]["nfRole"] = vnf_role;
\r
254 convertedAsdcModel.vnfs[vnfCustomizationUuid]["nfFunction"] = vnf_function;
\r
255 convertedAsdcModel.vnfs[vnfCustomizationUuid]["nfCode"] = vnf_code;
\r
257 for (var vfModuleCustomizationName in serviceModel.vnfs[vnfCustomizationName].vfModules) {
\r
258 var vfModuleModel = serviceModel.vnfs[vnfCustomizationName].vfModules[vfModuleCustomizationName];
\r
259 convertedAsdcModel.vnfs[vnfCustomizationUuid].vfModules[vfModuleModel.customizationUuid] = vfModuleModel;
\r
262 for (var volumeGroupCustomizationName in serviceModel.vnfs[vnfCustomizationName].volumeGroups) {
\r
263 var volumeGroupModel = serviceModel.vnfs[vnfCustomizationName].volumeGroups[volumeGroupCustomizationName];
\r
264 convertedAsdcModel.vnfs[vnfCustomizationUuid].volumeGroups[volumeGroupModel.customizationUuid] = volumeGroupModel;
\r
269 var completeDisplayInputs = {};
\r
271 for (var key in vnfModelDisplayInputs) {
\r
272 completeDisplayInputs[key] = vnfModelDisplayInputs[key];
\r
274 for (var key in networkModelDisplayInputs) {
\r
275 completeDisplayInputs[key] = networkModelDisplayInputs[key];
\r
278 convertedAsdcModel.completeDisplayInputs = completeDisplayInputs;
\r
279 // Need to collect all the model customization names (node template tag) and descriptions
\r
280 DataService.setResources (completeResources);
\r
282 console.log ("convertedAsdcModel: "); console.log (JSON.stringify ( convertedAsdcModel, null, 4 ));
\r
283 return (convertedAsdcModel);
\r
286 var convertOldModel = function (serviceModel ) {
\r
289 var convertedAsdcModel = {
\r
290 "service": serviceModel.service,
\r
293 "completeDisplayInputs": {},
\r
296 var completeResources = new Array();
\r
298 var vnfModelDisplayInputs = {};
\r
299 var networkModelDisplayInputs = {};
\r
300 for (var networkCustomizationName in serviceModel.networks) {
\r
301 var networkModel = serviceModel.networks[networkCustomizationName];
\r
302 convertedAsdcModel.networks[networkModel.invariantUuid] = {};
\r
303 //convertedAsdcModel.networks[networkModel.invariantUuid][networkModel.version] = networkModel;
\r
304 // need a network model to test this
\r
305 convertedAsdcModel.networks[networkModel.uuid] = {
\r
306 "uuid": networkModel.uuid,
\r
307 "invariantUuid": networkModel.invariantUuid,
\r
308 "version": networkModel.version,
\r
309 "name": networkModel.name,
\r
310 "modelCustomizationName": networkModel.modelCustomizationName,
\r
311 "customizationUuid": networkModel.customizationUuid,
\r
313 "description": networkModel.description,
\r
315 "displayInputs": {}
\r
318 "name": networkModel.modelCustomizationName,
\r
319 "description": networkModel.description
\r
321 completeResources.push (resource);
\r
322 if (networkModel.commands != null) {
\r
325 * internal_net_param_ntu: {
\r
326 * command: get_input,
\r
327 * displaName: internal_net_param_ntu,
\r
328 * inputName: vccfd1_internal_net_param_ntu // pointer to input key
\r
330 * If the input name (ptr) is one of instance_node_target, naming_policy or vf_instance_name
\r
335 for ( var cmd in networkModel.commands ) {
\r
336 var cmdObj = networkModel.commands[cmd];
\r
337 if ( cmdObj.inputName != null ) {
\r
338 switch (cmdObj.inputName) {
\r
339 case "instance_node_target":
\r
341 case "naming_policy":
\r
343 case "vf_instance_name":
\r
346 if (serviceModel.service != null && serviceModel.service.inputs != null &&
\r
347 serviceModel.service.inputs[cmdObj.inputName] != null ) {
\r
348 networkModelDisplayInputs[cmdObj.inputName] = (serviceModel.service.inputs[cmdObj.inputName]);
\r
349 networkModelDisplayInputs[cmdObj.inputName][PARAMETER.DISPLAY_NAME] = cmdObj.displayName;
\r
356 convertedAsdcModel.networks[networkModel.uuid].displayInputs=networkModelDisplayInputs;
\r
360 for (var vnfCustomizationName in serviceModel.vnfs) {
\r
361 var vnfModel = serviceModel.vnfs[vnfCustomizationName];
\r
362 convertedAsdcModel.vnfs[vnfModel.uuid] = {
\r
363 "uuid": vnfModel.uuid,
\r
364 "invariantUuid": vnfModel.invariantUuid,
\r
365 "version": vnfModel.version,
\r
366 "name": vnfModel.name,
\r
367 "modelCustomizationName": vnfModel.modelCustomizationName,
\r
368 "customizationUuid": vnfModel.customizationUuid,
\r
370 "description": vnfModel.description,
\r
372 "volumeGroups": {},
\r
374 "displayInputs": {}
\r
377 "name": vnfModel.modelCustomizationName,
\r
378 "description": vnfModel.description
\r
380 completeResources.push (resource);
\r
382 if (vnfModel.commands != null) {
\r
385 * internal_net_param_ntu: {
\r
386 * command: get_input,
\r
387 * displaName: internal_net_param_ntu,
\r
388 * inputName: vccfd1_internal_net_param_ntu // pointer to input key
\r
390 * If the input name (ptr) is one of instance_node_target, naming_policy or vf_instance_name
\r
395 for ( var cmd in vnfModel.commands ) {
\r
396 var cmdObj = vnfModel.commands[cmd];
\r
397 if ( cmdObj.inputName != null ) {
\r
398 // To Do: Make this list configurable
\r
399 switch (cmdObj.inputName) {
\r
400 case "instance_node_target":
\r
402 case "naming_policy":
\r
404 case "vf_instance_name":
\r
407 if (serviceModel.service != null && serviceModel.service.inputs != null &&
\r
408 serviceModel.service.inputs[cmdObj.inputName] != null ) {
\r
409 vnfModelDisplayInputs[cmdObj.inputName] = (serviceModel.service.inputs[cmdObj.inputName]);
\r
410 vnfModelDisplayInputs[cmdObj.inputName][PARAMETER.DISPLAY_NAME] = cmdObj.displayName;
\r
417 convertedAsdcModel.vnfs[vnfModel.uuid].displayInputs=vnfModelDisplayInputs;
\r
420 for (var vfModuleCustomizationName in serviceModel.vnfs[vnfCustomizationName].vfModules) {
\r
421 var vfModuleModel = serviceModel.vnfs[vnfCustomizationName].vfModules[vfModuleCustomizationName];
\r
422 convertedAsdcModel.vnfs[vnfModel.uuid].vfModules[vfModuleModel.uuid] = vfModuleModel;
\r
425 for (var volumeGroupCustomizationName in serviceModel.vnfs[vnfCustomizationName].volumeGroups) {
\r
426 var volumeGroupModel = serviceModel.vnfs[vnfCustomizationName].volumeGroups[volumeGroupCustomizationName];
\r
427 convertedAsdcModel.vnfs[vnfModel.uuid].volumeGroups[volumeGroupModel.uuid] = volumeGroupModel;
\r
430 //console.log ("convertedAsdcModel: "); console.log (JSON.stringify ( convertedAsdcModel, null, 4 ) );
\r
432 var completeDisplayInputs = {};
\r
434 for (var key in vnfModelDisplayInputs) {
\r
435 completeDisplayInputs[key] = vnfModelDisplayInputs[key];
\r
437 for (var key in networkModelDisplayInputs) {
\r
438 completeDisplayInputs[key] = networkModelDisplayInputs[key];
\r
441 convertedAsdcModel.completeDisplayInputs = completeDisplayInputs;
\r
442 // Need to collect all the model customization names (node template tag) and descriptions
\r
443 DataService.setResources (completeResources);
\r
444 console.log ("convertedAsdcModel: "); console.log (JSON.stringify ( convertedAsdcModel, null, 4 ));
\r
445 return (convertedAsdcModel);
\r
448 function hasContents(object) {
\r
449 if (object === undefined || object === null || object === "") {
\r
454 function isObjectEmpty(o) {
\r
456 if (hasContents(o)){
\r
457 var keys = Object.keys(o);
\r
470 function padZero(number) {
\r
472 return "0" + number;
\r
474 return "" + number;
\r
478 var httpErrorHandler = function(response, status) {
\r
479 $log.warn("UtilityService:httpErrorHandler: response:");
\r
480 $log.warn(response);
\r
481 $log.warn("UtilityService:httpErrorHandler: status:");
\r
483 if (angular.isFunction(_this.httpErrorHandler)) {
\r
484 _this.httpErrorHandler(response, status);
\r
488 var startNextAsyncOperation = function() {
\r
489 if (_this.asyncOperations.count < _this.asyncOperations.operationList.length) {
\r
490 _this.asyncOperations.operationList[_this.asyncOperations.count++]
\r
493 if (angular.isFunction(_this.asyncOperations.callbackFunction)) {
\r
494 _this.asyncOperations.callbackFunction();
\r
500 setProperties : function(properties) {
\r
501 _this.properties = properties;
\r
503 getProperties : function() {
\r
504 return _this.properties;
\r
506 hasContents : hasContents,
\r
507 checkUndefined : function(name, value) {
\r
508 if (value === undefined) {
\r
510 type : "undefinedObject",
\r
511 message : "undefined object: \"" + name + "\""
\r
516 jsonConcat : function (o1, o2) {
\r
517 for (var key in o2) {
\r
522 getCurrentTime : function() {
\r
523 var time = new Date();
\r
524 return padZero(time.getMonth() + 1) + "/"
\r
525 + padZero(time.getDate()) + "/"
\r
526 + (time.getFullYear() - 2000) + " "
\r
527 + padZero(time.getHours()) + ":"
\r
528 + padZero(time.getMinutes()) + ":"
\r
529 + padZero(time.getSeconds())
\r
531 getHttpStatusText : function(statusCode) {
\r
535 "202" : "Accepted",
\r
536 "400" : "Bad Request",
\r
537 "401" : "Unauthorized",
\r
538 "404" : "Not Found",
\r
539 "405" : "Method Not Allowed",
\r
541 "500" : "Internal Server Error",
\r
542 "503" : "Service Unavailable",
\r
543 "504" : "Gateway Timeout"
\r
546 if (status === undefined) {
\r
547 return "Undefined";
\r
550 var statusText = statusMap[statusCode];
\r
551 if (statusText === undefined) {
\r
552 statusText = "Unknown";
\r
555 return statusText + " (" + statusCode + ")";
\r
557 getHttpErrorMessage : function(response) {
\r
558 var data = response.data;
\r
559 if (response.status === 500 && hasContents(data.exception)) {
\r
560 var summary = "exception: " + data.exception;
\r
561 if (hasContents(data.message)) {
\r
562 summary += " message: " + data.message;
\r
566 if (response.status === 0 && response.statusText === "") {
\r
568 * This logic is somewhat "fuzzy". Potential (brainstorming)
\r
569 * enhancements if users find the message unreliable include:
\r
571 * A) SERVER TIMEOUT: perhaps a newer version of Angular can
\r
572 * reliably determine timeouts.
\r
574 * B) SERVER TIMEOUT: recording start / end times and using that
\r
575 * to determine if timeout occured
\r
577 * C) SESSION TIMEOUT "Potentially" examine cookies, although
\r
578 * that may not be feasible if cookies are set to "httponly".
\r
580 if (data === null) {
\r
581 //return "possible server timeout";
\r
582 return "VID has timed out waiting for a response. To see status, close this popup and the screen will be refreshed automatically";
\r
585 return "Possible reasons include a session timeout or a server issue. "
\r
586 + "A session timeout might be resolved by refreshing the screen and re-logging in";
\r
590 if (response.status !== undefined && response.status > 0) {
\r
591 summary = "status: " + response.status;
\r
593 if (hasContents(response.statusText)) {
\r
594 if (summary !== "") {
\r
597 summary += "message: " + response.statusText;
\r
601 setHttpErrorHandler : function(httpErrorHandler) {
\r
602 _this.httpErrorHandler = httpErrorHandler;
\r
604 runHttpErrorHandler : function(response, status) {
\r
605 httpErrorHandler(response, status);
\r
607 startAsyncOperations : function(operationList, callbackFunction) {
\r
608 for (var i = 0; i < operationList.length; i++) {
\r
609 if (!angular.isFunction(operationList[i])) {
\r
610 throw "UtilityService:startAsyncOperations: invalid function: index: "
\r
614 _this.asyncOperations = {
\r
615 operationList : operationList,
\r
616 callbackFunction : callbackFunction,
\r
619 startNextAsyncOperation();
\r
621 startNextAsyncOperation : startNextAsyncOperation,
\r
622 stopAsyncOperations : function() {
\r
623 _this.asyncOperations.count = _this.asyncOperations.operationList.length;
\r
625 isObjectEmpty : isObjectEmpty,
\r
626 convertModel : convertModel,
\r
627 convertNewModel : convertNewModel,
\r
628 convertOldModel : convertOldModel,
\r
629 arrayContains : function (a, obj) {
\r
633 if (a[i] === obj) {
\r
643 //app.factory("UtilityService", UtilityService);
\r
644 appDS2.factory("UtilityService", [ "$log", "DataService", "PARAMETER", UtilityService ]);
\r