From 9015d0d86d23a83e578ded1bd95485d467515208 Mon Sep 17 00:00:00 2001 From: "Christopher Lott (cl778h)" Date: Thu, 17 Aug 2017 14:52:44 -0400 Subject: Publish seed code for the OOM Dashboard First open-source release of the ONAP Operations Manager Dashboard web application. Issue: CCSDK-61 Change-Id: I902f789692d76ee583aa967682e39f03b6578fe9 Signed-off-by: Christopher Lott (cl778h) --- .../app/ecdapp/cloudify/deployment-controllers.js | 371 +++++++++++++++++++++ 1 file changed, 371 insertions(+) create mode 100644 ecd-app-overlay/src/main/webapp/app/ecdapp/cloudify/deployment-controllers.js (limited to 'ecd-app-overlay/src/main/webapp/app/ecdapp/cloudify/deployment-controllers.js') diff --git a/ecd-app-overlay/src/main/webapp/app/ecdapp/cloudify/deployment-controllers.js b/ecd-app-overlay/src/main/webapp/app/ecdapp/cloudify/deployment-controllers.js new file mode 100644 index 0000000..b46d242 --- /dev/null +++ b/ecd-app-overlay/src/main/webapp/app/ecdapp/cloudify/deployment-controllers.js @@ -0,0 +1,371 @@ +/******************************************************************************* + * =============LICENSE_START========================================================= + * + * ================================================================================= + * Copyright (c) 2017 AT&T Intellectual Property. All rights reserved. + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============LICENSE_END========================================================= + * + * ECOMP is a trademark and service mark of AT&T Intellectual Property. + *******************************************************************************/ +appDS2.controller('deploymentTableController', function( + $rootScope, $scope, $log, $modal, DeploymentService) { + + 'use strict'; + + // Controls logging in this controller + var debug = false; + + // this object holds all app data and functions + $scope.ecdapp = {}; + // models for controls on screen + $scope.ecdapp.tableData = []; + $scope.ecdapp.currentPageNum = 1; + $scope.ecdapp.viewPerPage = 10; + // other + $scope.ecdapp.errMsg = null; + $scope.ecdapp.isDataLoading = true; + $scope.ecdapp.isRequestFailed = false; + + /** + * Loads the table. Interprets the remote controller's response and copies + * to scope variables. The response is either a list to be assigned to + * tableData, or an error to be shown. + */ + $scope.ecdapp.loadTable = function() { + $scope.ecdapp.isDataLoading = true; + DeploymentService.getDeployments($scope.ecdapp.currentPageNum, + $scope.ecdapp.viewPerPage).then( + function(jsonObj) { + if (jsonObj.error) { + $log.error("deploymentController.loadTable failed: " + + jsonObj.error); + $scope.ecdapp.isRequestFailed = true; + $scope.ecdapp.errMsg = jsonObj.error; + $scope.ecdapp.tableData = []; + } else { + $scope.ecdapp.isRequestFailed = false; + $scope.ecdapp.errMsg = null; + $scope.ecdapp.totalPages = jsonObj.totalPages; + $scope.ecdapp.tableData = jsonObj.items; + } + $scope.ecdapp.isDataLoading = false; + }, + function(error) { + $log.error("deploymentController.loadTable failed: " + + error); + $scope.ecdapp.isRequestFailed = true; + $scope.ecdapp.errMsg = error; + $scope.ecdapp.tableData = []; + $scope.ecdapp.isDataLoading = false; + }); + }; + + /** + * Invoked at first page load AND when + * user clicks on the B2B pagination control. + */ + $scope.pageChangeHandler = function(page) { + // console.log('pageChangeHandler: current is ' + $scope.ecdapp.currentPageNum + ' new is ' + page); + $scope.ecdapp.currentPageNum = page; + $scope.ecdapp.loadTable(); + } + + /** + * Shows a modal pop-up to create an execution from a deployment. + * Passes data in via an object named "message". + * On success, updates the table. + */ + $scope.ecdapp.createExecutionModalPopup = function(deployment) { + var modalInstance = $modal.open({ + templateUrl : 'deployment_execute_popup.html', + controller : 'deploymentExecuteCtrl', + windowClass: 'modal-docked', + sizeClass: 'modal-large', + resolve : { + message : function() { + var dataForPopup = { + deployment : deployment, + }; + return dataForPopup; + } + } + }); + modalInstance.result.then(function(response) { + if (debug) + $log.debug('createExecutionModalPopup: response: ' + JSON.stringify(response)); + if (response == null) { + // $log.debug('user closed dialog'); + } + else { + if (response.error != null) { + $log.error('createExecutionModalPopup: failed to delete: ' + error); + alert('Failed to create execution:\n' + response.error); + // No need to update THIS table. + // Must switch to executions page to see result? Awkward. + } + } + }); + }; + + /** + * Shows a modal pop-up to confirm deletion. + * On successful completion, updates the table. + */ + $scope.ecdapp.deleteDeploymentModalPopup = function(deployment) { + var modalInstance = $modal.open({ + templateUrl : 'deployment_delete_popup.html', + controller : 'deploymentDeleteCtrl', + sizeClass: 'modal-small', + resolve : { + message : function() { + var dataForPopup = { + deployment : deployment, + }; + return dataForPopup; + } + } + }); + modalInstance.result.then(function(response) { + if (debug) + $log.debug('deleteDeploymentPopup: response: ' + JSON.stringify(response)); + if (response == null) { + // $log.debug('user closed dialog'); + } + else { + if (response.error != null) { + $log.error('deleteDeploymentModalPopup failed: ' + response.error); + alert('Failed to delete deployment:\n' + response.error); + } + else { + // success, get the updated list. + $scope.ecdapp.loadTable() + } + } + }); + }; + +}); + +/*************************************************************************/ + +appDS2.controller('deploymentDeleteCtrl', function( + $scope, $log, $modalInstance, message, DeploymentService) { + + 'use strict'; + + // Controls logging in this controller + var debug = false; + + // this object holds all app data and functions + $scope.ecdapp = {}; + $scope.ecdapp.label = 'Delete Deployment'; + $scope.ecdapp.deploymentId = message.deployment.id; + $scope.ecdapp.ignoreLiveNodes = false; + + $scope.ecdapp.deleteDeploymentById = function(){ + DeploymentService.deleteDeployment($scope.ecdapp.deploymentId, $scope.ecdapp.ignoreLiveNodes).then( + function(response) { + if (debug) + $log.debug('deploymentDeleteCtrl.deleteDeployment: ' + JSON.stringify(response)); + if (response && response.error) { + $log.error('DeploymentService.deleteDeployment failed: ' + response.error); + alert('Failed to delete deployment:\n' + response.error); + } + else { + // Delete service returns null on success. + $modalInstance.close("success"); + } + }, + function(error) { + $log.error('DeploymentService.deleteDeployment failed: ' + error); + alert('Service failed to delete deployment:\n' + error); + }); + } + +}); + +/*************************************************************************/ + +appDS2.controller('deploymentExecuteCtrl', function( + $scope, $log, $modalInstance, message, ExecutionService) { + + 'use strict'; + + // Controls logging in this controller + var debug = false; + + // this object holds all app data and functions + $scope.ecdapp = {}; + $scope.ecdapp.label = 'Execute Deployment'; + + // Cache the input parameter names for validation + $scope.ecdapp.inputsDict = {}; + if (debug) + $log.debug('DeploymentXeqCtrl: inputsDict is ' + JSON.stringify($scope.ecdapp.inputsDict)); + + // Copy the input names and values + // (different structure than blueprint) + /*for (var pkey in message.deployment.inputs) { + let dval = message.deployment.inputs[pkey]; + inputsAndValues[pkey] = dval; + }*/ + + // Gather workflow names as a simple list + var workflowList = []; + for (var i = 0; i < message.deployment.workflows.length; i++) + workflowList.push(message.deployment.workflows[i].name); + if (debug) + $log.debug('DeploymentXeqCtrl: workflowList is ' + JSON.stringify(workflowList)); + + // Create an object for edit. + $scope.ecdapp.editRequest = { + deployment_id : message.deployment.id, + allow_custom_parameter : false, + force : false, + // Has title and value objects + workflow_name: { value : '' }, + workflow_list : workflowList, + fileModel : null, + parmFileDict : {} + }; + + $scope.selectWorkflowName = function(){ + var workflows = message.deployment.workflows; + let inputsAndValues = {}; + var res = workflows.filter(function(d){ + if(d.name == $scope.ecdapp.editRequest.workflow_name.value){ + return d + } + }); + for(var key in res[0].parameters){ + inputsAndValues[key] = typeof (res[0].parameters[key].default) === 'string' ? res[0].parameters[key].default : null; + } + $scope.ecdapp.inputsDict = inputsAndValues; + $scope.ecdapp.editRequest.parmFileDict = inputsAndValues; + }; + + if (debug) + $log.debug('DeploymentXeqCtrl: editRequest is ' + JSON.stringify($scope.ecdapp.editRequest)); + + /** + * Handler for file-read event reads file, parses YAML, validates content. + */ + var fileReader = new FileReader(); + fileReader.onload = function(event) { + let yamlString = fileReader.result; + if (debug) + $log.debug('fileReader.onload: read: ' + yamlString); + let ydict = {}; + try { + ydict = YAML.parse(yamlString); + } + catch (ex) { + alert('Failed to parse file as YAML:\n' + ex); + } + for (var ykey in ydict) { + let yval = ydict[ykey]; + if (debug) + $log.debug('fileReader.onload: typeof ' + ykey + ' is ' + typeof ykey); + // Only accept valid, expected key-value pairs + if (typeof yval !== 'string' && typeof yval!=='number') + alert('Unexpected file content:\nNot a simple key-value pair:\n' + ykey); + else if (! (ykey in $scope.ecdapp.editRequest.parmFileDict)) + alert('Unexpected file content:\nKey not defined by deployment:\n' + ykey); + else + $scope.ecdapp.editRequest.parmFileDict[ykey] = yval; + } + if (debug) + $log.debug('fileReader.onload: parmFileDict: ' + JSON.stringify($scope.ecdapp.editRequest.parmFileDict)); + + // Update table in all cases + $scope.$apply(); + } + + // Handler for file-select event + $scope.handleFileSelect = function() { + if (debug) + $log.debug('handleFileSelect: $scope.ecdapp.fileModel.name is ' + $scope.ecdapp.editRequest.fileModel.name); + fileReader.readAsText($scope.ecdapp.editRequest.fileModel); + }; + + /** + * Validates content of user-editable fields. + * Returns null if all is well, + * a descriptive error message otherwise. + */ + var validateRequest = function(editRequest) { + if (debug) + $log.debug('validateRequest: editRequest is ' + JSON.stringify(editRequest)); + if (editRequest == null) + return "No data found.\nPlease enter some values."; + if (editRequest.deployment_id == null || editRequest.deployment_id.trim() == '') + return "Deployment ID is required.\nPlease enter a value."; + if (editRequest.workflow_name.value == null || editRequest.workflow_name.value.trim() == '') + return "Workflow name is required.\nPlease select a workflow."; + // Check that every file parameter is defined by blueprint + for (var pkey in $scope.ecdapp.editRequest.parmFileDict) { + // Defined in blueprint? + if (! $scope.ecdapp.inputsDict[pkey]) + return 'Unexpected input parameter\n' + pkey; + // Populated? + let parmVal = $scope.ecdapp.editRequest.parmFileDict[pkey]; + if (parmVal.trim().length == 0) + return 'Missing value for parameter ' + pkey; + } + // Check that a value is supplied for every expected input + for (var bkey in $scope.ecdapp.inputsDict) { + if (! $scope.ecdapp.editRequest.parmFileDict[bkey]) + return 'Missing input parameter\n' + bkey; + } + return null; + } + + $scope.ecdapp.executeDeployment = function(editRequest) { + var validateMsg = validateRequest(editRequest); + if (validateMsg != null) { + alert('Invalid execution request:\n' + validateMsg); + return; + } + + // Create request with key:value parameters dictionary + let executeRequest = { + deployment_id : editRequest.deployment_id, + workflow_name : editRequest.workflow_name.value, + allow_custom_parameter : editRequest.allow_custom_parameter, + force : editRequest.force, + parameters : {} + }; + for (var pkey in $scope.ecdapp.editRequest.parmFileDict) + executeRequest.parameters[pkey] = $scope.ecdapp.editRequest.parmFileDict[pkey]; + if (debug) + $log.debug('executeDeployment: executeRequest is ' + JSON.stringify(executeRequest)); + + ExecutionService.executeDeployment(executeRequest) + .then(function(response) { + if (response.error) + alert('Failed to create execution:\n' + response.error); + else + $modalInstance.close(response); + }, + function (error) { + $log.error('deploymentExecuteCtrl: error while creating execution: ' + error); + alert('Server rejected execute request:\n' + error); + } + ); + + }; + +}); + -- cgit 1.2.3-korg