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) {
\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
162 convertedAsdcModel.networks[networkModel.customizationUuid].displayInputs=networkModelDisplayInputs;
\r
167 for (var vnfCustomizationName in serviceModel.vnfs) {
\r
168 var vnfModel = serviceModel.vnfs[vnfCustomizationName];
\r
169 var vnfCustomizationUuid = vnfModel.customizationUuid;
\r
170 convertedAsdcModel.vnfs[vnfModel.customizationUuid] = {
\r
171 "uuid": vnfModel.uuid,
\r
172 "invariantUuid": vnfModel.invariantUuid,
\r
173 "version": vnfModel.version,
\r
174 "name": vnfModel.name,
\r
175 "modelCustomizationName": vnfModel.modelCustomizationName,
\r
176 "customizationUuid": vnfModel.customizationUuid,
\r
178 "description": vnfModel.description,
\r
180 "volumeGroups": {},
\r
182 "displayInputs": {},
\r
189 "name": vnfModel.modelCustomizationName,
\r
190 "description": vnfModel.description
\r
192 completeResources.push (resource);
\r
194 if (vnfModel.commands != null) {
\r
197 * internal_net_param_ntu: {
\r
198 * command: get_input,
\r
199 * displaName: internal_net_param_ntu,
\r
200 * inputName: vccfd1_internal_net_param_ntu // pointer to input key
\r
202 * If the input name (ptr) is one of instance_node_target, naming_policy or vf_instance_name
\r
207 for ( var cmd in vnfModel.commands ) {
\r
208 var cmdObj = vnfModel.commands[cmd];
\r
209 if ( cmdObj.inputName != null ) {
\r
210 // To Do: Make this list configurable
\r
211 switch (cmdObj.inputName) {
\r
212 case "instance_node_target":
\r
214 case "naming_policy":
\r
216 case "vf_instance_name":
\r
219 if (serviceModel.service != null && serviceModel.service.inputs != null &&
\r
220 serviceModel.service.inputs[cmdObj.inputName] != null ) {
\r
221 vnfModelDisplayInputs[cmdObj.inputName] = (serviceModel.service.inputs[cmdObj.inputName]);
\r
229 convertedAsdcModel.vnfs[vnfCustomizationUuid].displayInputs=vnfModelDisplayInputs;
\r
230 convertedAsdcModel.vnfs[vnfCustomizationUuid].properties=vnfModel.properties;
\r
234 var vnf_function = "";
\r
236 if ( !( isObjectEmpty(vnfModel.properties) ) ) {
\r
237 if (hasContents (vnfModel.properties.nf_type) ) {
\r
238 vnf_type = vnfModel.properties.nf_type;
\r
240 if (hasContents (vnfModel.properties.nf_role) ) {
\r
241 vnf_role = vnfModel.properties.nf_role;
\r
243 if (hasContents (vnfModel.properties.nf_function) ) {
\r
244 vnf_function = vnfModel.properties.nf_function;
\r
246 if (hasContents (vnfModel.properties.nf_code) ) {
\r
247 vnf_code = vnfModel.properties.nf_code;
\r
250 convertedAsdcModel.vnfs[vnfCustomizationUuid]["nfType"] = vnf_type;
\r
251 convertedAsdcModel.vnfs[vnfCustomizationUuid]["nfRole"] = vnf_role;
\r
252 convertedAsdcModel.vnfs[vnfCustomizationUuid]["nfFunction"] = vnf_function;
\r
253 convertedAsdcModel.vnfs[vnfCustomizationUuid]["nfCode"] = vnf_code;
\r
255 for (var vfModuleCustomizationName in serviceModel.vnfs[vnfCustomizationName].vfModules) {
\r
256 var vfModuleModel = serviceModel.vnfs[vnfCustomizationName].vfModules[vfModuleCustomizationName];
\r
257 convertedAsdcModel.vnfs[vnfCustomizationUuid].vfModules[vfModuleModel.customizationUuid] = vfModuleModel;
\r
260 for (var volumeGroupCustomizationName in serviceModel.vnfs[vnfCustomizationName].volumeGroups) {
\r
261 var volumeGroupModel = serviceModel.vnfs[vnfCustomizationName].volumeGroups[volumeGroupCustomizationName];
\r
262 convertedAsdcModel.vnfs[vnfCustomizationUuid].volumeGroups[volumeGroupModel.customizationUuid] = volumeGroupModel;
\r
267 var completeDisplayInputs = {};
\r
269 for (var key in vnfModelDisplayInputs) {
\r
270 completeDisplayInputs[key] = vnfModelDisplayInputs[key];
\r
272 for (var key in networkModelDisplayInputs) {
\r
273 completeDisplayInputs[key] = networkModelDisplayInputs[key];
\r
276 convertedAsdcModel.completeDisplayInputs = completeDisplayInputs;
\r
277 // Need to collect all the model customization names (node template tag) and descriptions
\r
278 DataService.setResources (completeResources);
\r
280 console.log ("convertedAsdcModel: "); console.log (JSON.stringify ( convertedAsdcModel, null, 4 ));
\r
281 return (convertedAsdcModel);
\r
284 var convertOldModel = function (serviceModel ) {
\r
287 var convertedAsdcModel = {
\r
288 "service": serviceModel.service,
\r
291 "completeDisplayInputs": {},
\r
294 var completeResources = new Array();
\r
296 var vnfModelDisplayInputs = {};
\r
297 var networkModelDisplayInputs = {};
\r
298 for (var networkCustomizationName in serviceModel.networks) {
\r
299 var networkModel = serviceModel.networks[networkCustomizationName];
\r
300 convertedAsdcModel.networks[networkModel.invariantUuid] = {};
\r
301 //convertedAsdcModel.networks[networkModel.invariantUuid][networkModel.version] = networkModel;
\r
302 // need a network model to test this
\r
303 convertedAsdcModel.networks[networkModel.uuid] = {
\r
304 "uuid": networkModel.uuid,
\r
305 "invariantUuid": networkModel.invariantUuid,
\r
306 "version": networkModel.version,
\r
307 "name": networkModel.name,
\r
308 "modelCustomizationName": networkModel.modelCustomizationName,
\r
309 "customizationUuid": networkModel.customizationUuid,
\r
311 "description": networkModel.description,
\r
313 "displayInputs": {}
\r
316 "name": networkModel.modelCustomizationName,
\r
317 "description": networkModel.description
\r
319 completeResources.push (resource);
\r
320 if (networkModel.commands != null) {
\r
323 * internal_net_param_ntu: {
\r
324 * command: get_input,
\r
325 * displaName: internal_net_param_ntu,
\r
326 * inputName: vccfd1_internal_net_param_ntu // pointer to input key
\r
328 * If the input name (ptr) is one of instance_node_target, naming_policy or vf_instance_name
\r
333 for ( var cmd in networkModel.commands ) {
\r
334 var cmdObj = networkModel.commands[cmd];
\r
335 if ( cmdObj.inputName != null ) {
\r
336 switch (cmdObj.inputName) {
\r
337 case "instance_node_target":
\r
339 case "naming_policy":
\r
341 case "vf_instance_name":
\r
344 if (serviceModel.service != null && serviceModel.service.inputs != null &&
\r
345 serviceModel.service.inputs[cmdObj.inputName] != null ) {
\r
346 networkModelDisplayInputs[cmdObj.inputName] = (serviceModel.service.inputs[cmdObj.inputName]);
\r
353 convertedAsdcModel.networks[networkModel.uuid].displayInputs=networkModelDisplayInputs;
\r
357 for (var vnfCustomizationName in serviceModel.vnfs) {
\r
358 var vnfModel = serviceModel.vnfs[vnfCustomizationName];
\r
359 convertedAsdcModel.vnfs[vnfModel.uuid] = {
\r
360 "uuid": vnfModel.uuid,
\r
361 "invariantUuid": vnfModel.invariantUuid,
\r
362 "version": vnfModel.version,
\r
363 "name": vnfModel.name,
\r
364 "modelCustomizationName": vnfModel.modelCustomizationName,
\r
365 "customizationUuid": vnfModel.customizationUuid,
\r
367 "description": vnfModel.description,
\r
369 "volumeGroups": {},
\r
371 "displayInputs": {}
\r
374 "name": vnfModel.modelCustomizationName,
\r
375 "description": vnfModel.description
\r
377 completeResources.push (resource);
\r
379 if (vnfModel.commands != null) {
\r
382 * internal_net_param_ntu: {
\r
383 * command: get_input,
\r
384 * displaName: internal_net_param_ntu,
\r
385 * inputName: vccfd1_internal_net_param_ntu // pointer to input key
\r
387 * If the input name (ptr) is one of instance_node_target, naming_policy or vf_instance_name
\r
392 for ( var cmd in vnfModel.commands ) {
\r
393 var cmdObj = vnfModel.commands[cmd];
\r
394 if ( cmdObj.inputName != null ) {
\r
395 // To Do: Make this list configurable
\r
396 switch (cmdObj.inputName) {
\r
397 case "instance_node_target":
\r
399 case "naming_policy":
\r
401 case "vf_instance_name":
\r
404 if (serviceModel.service != null && serviceModel.service.inputs != null &&
\r
405 serviceModel.service.inputs[cmdObj.inputName] != null ) {
\r
406 vnfModelDisplayInputs[cmdObj.inputName] = (serviceModel.service.inputs[cmdObj.inputName]);
\r
413 convertedAsdcModel.vnfs[vnfModel.uuid].displayInputs=vnfModelDisplayInputs;
\r
416 for (var vfModuleCustomizationName in serviceModel.vnfs[vnfCustomizationName].vfModules) {
\r
417 var vfModuleModel = serviceModel.vnfs[vnfCustomizationName].vfModules[vfModuleCustomizationName];
\r
418 convertedAsdcModel.vnfs[vnfModel.uuid].vfModules[vfModuleModel.uuid] = vfModuleModel;
\r
421 for (var volumeGroupCustomizationName in serviceModel.vnfs[vnfCustomizationName].volumeGroups) {
\r
422 var volumeGroupModel = serviceModel.vnfs[vnfCustomizationName].volumeGroups[volumeGroupCustomizationName];
\r
423 convertedAsdcModel.vnfs[vnfModel.uuid].volumeGroups[volumeGroupModel.uuid] = volumeGroupModel;
\r
426 //console.log ("convertedAsdcModel: "); console.log (JSON.stringify ( convertedAsdcModel, null, 4 ) );
\r
428 var completeDisplayInputs = {};
\r
430 for (var key in vnfModelDisplayInputs) {
\r
431 completeDisplayInputs[key] = vnfModelDisplayInputs[key];
\r
433 for (var key in networkModelDisplayInputs) {
\r
434 completeDisplayInputs[key] = networkModelDisplayInputs[key];
\r
437 convertedAsdcModel.completeDisplayInputs = completeDisplayInputs;
\r
438 // Need to collect all the model customization names (node template tag) and descriptions
\r
439 DataService.setResources (completeResources);
\r
440 console.log ("convertedAsdcModel: "); console.log (JSON.stringify ( convertedAsdcModel, null, 4 ));
\r
441 return (convertedAsdcModel);
\r
444 function hasContents(object) {
\r
445 if (object === undefined || object === null || object === "") {
\r
450 function isObjectEmpty(o) {
\r
452 if (hasContents(o)){
\r
453 var keys = Object.keys(o);
\r
466 function padZero(number) {
\r
468 return "0" + number;
\r
470 return "" + number;
\r
474 var httpErrorHandler = function(response, status) {
\r
475 $log.warn("UtilityService:httpErrorHandler: response:");
\r
476 $log.warn(response);
\r
477 $log.warn("UtilityService:httpErrorHandler: status:");
\r
479 if (angular.isFunction(_this.httpErrorHandler)) {
\r
480 _this.httpErrorHandler(response, status);
\r
484 var startNextAsyncOperation = function() {
\r
485 if (_this.asyncOperations.count < _this.asyncOperations.operationList.length) {
\r
486 _this.asyncOperations.operationList[_this.asyncOperations.count++]
\r
489 if (angular.isFunction(_this.asyncOperations.callbackFunction)) {
\r
490 _this.asyncOperations.callbackFunction();
\r
496 setProperties : function(properties) {
\r
497 _this.properties = properties;
\r
499 getProperties : function() {
\r
500 return _this.properties;
\r
502 hasContents : hasContents,
\r
503 checkUndefined : function(name, value) {
\r
504 if (value === undefined) {
\r
506 type : "undefinedObject",
\r
507 message : "undefined object: \"" + name + "\""
\r
512 jsonConcat : function (o1, o2) {
\r
513 for (var key in o2) {
\r
518 getCurrentTime : function() {
\r
519 var time = new Date();
\r
520 return padZero(time.getMonth() + 1) + "/"
\r
521 + padZero(time.getDate()) + "/"
\r
522 + (time.getFullYear() - 2000) + " "
\r
523 + padZero(time.getHours()) + ":"
\r
524 + padZero(time.getMinutes()) + ":"
\r
525 + padZero(time.getSeconds())
\r
527 getHttpStatusText : function(statusCode) {
\r
531 "202" : "Accepted",
\r
532 "400" : "Bad Request",
\r
533 "401" : "Unauthorized",
\r
534 "404" : "Not Found",
\r
535 "405" : "Method Not Allowed",
\r
537 "500" : "Internal Server Error",
\r
538 "503" : "Service Unavailable",
\r
539 "504" : "Gateway Timeout"
\r
542 if (status === undefined) {
\r
543 return "Undefined";
\r
546 var statusText = statusMap[statusCode];
\r
547 if (statusText === undefined) {
\r
548 statusText = "Unknown";
\r
551 return statusText + " (" + statusCode + ")";
\r
553 getHttpErrorMessage : function(response) {
\r
554 var data = response.data;
\r
555 if (response.status === 500 && hasContents(data.exception)) {
\r
556 var summary = "exception: " + data.exception;
\r
557 if (hasContents(data.message)) {
\r
558 summary += " message: " + data.message;
\r
562 if (response.status === 0 && response.statusText === "") {
\r
564 * This logic is somewhat "fuzzy". Potential (brainstorming)
\r
565 * enhancements if users find the message unreliable include:
\r
567 * A) SERVER TIMEOUT: perhaps a newer version of Angular can
\r
568 * reliably determine timeouts.
\r
570 * B) SERVER TIMEOUT: recording start / end times and using that
\r
571 * to determine if timeout occured
\r
573 * C) SESSION TIMEOUT "Potentially" examine cookies, although
\r
574 * that may not be feasible if cookies are set to "httponly".
\r
576 if (data === null) {
\r
577 //return "possible server timeout";
\r
578 return "VID has timed out waiting for a response. To see status, close this popup and the screen will be refreshed automatically";
\r
581 return "Possible reasons include a session timeout or a server issue. "
\r
582 + "A session timeout might be resolved by refreshing the screen and re-logging in";
\r
586 if (response.status !== undefined && response.status > 0) {
\r
587 summary = "status: " + response.status;
\r
589 if (hasContents(response.statusText)) {
\r
590 if (summary !== "") {
\r
593 summary += "message: " + response.statusText;
\r
597 setHttpErrorHandler : function(httpErrorHandler) {
\r
598 _this.httpErrorHandler = httpErrorHandler;
\r
600 runHttpErrorHandler : function(response, status) {
\r
601 httpErrorHandler(response, status);
\r
603 startAsyncOperations : function(operationList, callbackFunction) {
\r
604 for (var i = 0; i < operationList.length; i++) {
\r
605 if (!angular.isFunction(operationList[i])) {
\r
606 throw "UtilityService:startAsyncOperations: invalid function: index: "
\r
610 _this.asyncOperations = {
\r
611 operationList : operationList,
\r
612 callbackFunction : callbackFunction,
\r
615 startNextAsyncOperation();
\r
617 startNextAsyncOperation : startNextAsyncOperation,
\r
618 stopAsyncOperations : function() {
\r
619 _this.asyncOperations.count = _this.asyncOperations.operationList.length;
\r
621 isObjectEmpty : isObjectEmpty,
\r
622 convertModel : convertModel,
\r
623 convertNewModel : convertNewModel,
\r
624 convertOldModel : convertOldModel,
\r
625 arrayContains : function (a, obj) {
\r
629 if (a[i] === obj) {
\r
639 //app.factory("UtilityService", UtilityService);
\r
640 appDS2.factory("UtilityService", [ "$log", "DataService", UtilityService ]);
\r