summaryrefslogtreecommitdiffstats
path: root/ecomp-portal-widget-ms/common-widgets/portal-common-scheduler-widget/js/controller.js
diff options
context:
space:
mode:
Diffstat (limited to 'ecomp-portal-widget-ms/common-widgets/portal-common-scheduler-widget/js/controller.js')
-rw-r--r--ecomp-portal-widget-ms/common-widgets/portal-common-scheduler-widget/js/controller.js604
1 files changed, 604 insertions, 0 deletions
diff --git a/ecomp-portal-widget-ms/common-widgets/portal-common-scheduler-widget/js/controller.js b/ecomp-portal-widget-ms/common-widgets/portal-common-scheduler-widget/js/controller.js
new file mode 100644
index 00000000..934095c3
--- /dev/null
+++ b/ecomp-portal-widget-ms/common-widgets/portal-common-scheduler-widget/js/controller.js
@@ -0,0 +1,604 @@
+function SchedulerCtrl($rootScope , $scope,$state,widgetsCatalogService,$log,schedulerService,$filter,confirmBoxService,userProfileService,conf,$interval,$compile) {
+ /****define fields****/
+ var pollpromise;
+ /*Assign the data that's passed to scheduler UI*/
+ $scope.hasParentData = true;
+ $rootScope.schedulerID = '';
+ $scope.orgUserId="";
+ $scope.policys = [];
+ $scope.selectedPolicy={policyName:"",policyConfig:""};
+ $scope.scheduler = {};
+ $scope.schedulingInfo = {};
+ $scope.timeSlots = [];
+ $scope.changeManagement = {};
+ $rootScope.schedulerForm = {
+ checkboxSelection : 'false',
+ fromDate:'',
+ toDate:'',
+ duration:'',
+ fallbackDuration:'',
+ concurrencyLimit:''
+ };
+
+ $scope.vnfNames = [];
+ $scope.vnfTypes = [];
+ $scope.schedulerObj = {};
+
+ var tomorrow = new Date();
+ tomorrow.setDate(tomorrow.getDate() + 1);
+ $scope.minDate = tomorrow.toISOString().substring(0, 10);
+
+
+ /*form validation*/
+ $scope.durationEmpty=false;
+ $scope.concurrencyLimitEmpty = false;
+ $scope.fallBackDurationEmpty=false;
+ $scope.fromDateEmpty = false;
+ $scope.toDateEmpty=false;
+
+ /*interval values for getting time slots*/
+ var hasvaluereturnd = true;
+ var hasthresholdreached = false;
+ var thresholdvalue =10; // interval threshold value
+
+ $scope.timeUnit= [
+ {text: 'HOURS'},
+ {text: 'MINUTES'},
+ {text: 'SECONDS'}
+ ];
+
+
+ /***** Functions for modal popup ******/
+ $scope.radioSelections=function (){
+ if( $rootScope.schedulerForm.checkboxSelection=="true"){
+ $rootScope.schedulerForm.fromDate='';
+ $rootScope.schedulerForm.toDate=''
+ }
+ }
+
+ /*Dropdown update: everytime values in dropdown chagnes, update the selected value*/
+ $scope.$watch('selectedPolicy.policyName', (newVal, oldVal) => {
+ for (var i = 0; i < $scope.policys.length; i++)
+ if ($scope.policys[i].policyName == newVal)
+ $scope.selectedPolicy = angular.copy($scope.policys[i]);;
+ });
+
+ $scope.$watch('selectedTimeUint.text', (newVal, oldVal) => {
+ for (var i = 0; i < $scope.timeUnit.length; i++)
+ if ($scope.timeUnit[i].text == newVal)
+ $scope.selectedTimeUint = angular.copy($scope.timeUnit[i]);;
+ });
+
+ /**
+ * This function is to validate and check if the input is a valid date.
+ * There are two checkers in this function:
+ * Check 1: the input is a valid date object,return true, return false otherwise.
+ * Check 2: check if the input has the format of MM/DD/YYYY or M/D/YYYY and is a valid date value.
+ * @param dateInput
+ * @return true/false
+ */
+ $scope.isDateValid = function(dateInput) {
+ /*Check 1: see if the input is able to convert into date object*/
+ if ( Object.prototype.toString.call(dateInput) === "[object Date]" )
+ return true;
+ /*Check 2: see if the input is the date format MM/DD/YYYY */
+ var isDateStrFormat = false;
+ try{
+ /*check the format of MM/DD/YYYY or M/D/YYYY */
+ var startDateformat = dateInput.split('/');
+ if (startDateformat.length != 3)
+ return false;
+ var day = startDateformat[1];
+ var month = parseInt(startDateformat[0])-1;
+ var year = startDateformat[2];
+ if (year.length != 4)
+ return false;
+ /*check the input value and see if it's a valid date*/
+ var composedDate = new Date(year, month, day);
+ if(composedDate.getDate() == day && composedDate.getMonth() == month && composedDate.getFullYear() == year)
+ isDateStrFormat = true
+ else
+ isDateStrFormat =false;
+ }catch(err){
+ return false;
+ }
+ return isDateStrFormat;
+ };
+
+ /**
+ * This function is to check whether the input date is greater than current date or not.
+ * @param date
+ * @return true/false
+ */
+ $scope.isStartDateValidFromToday = function (date) {
+ if(!$scope.isDateValid(date))
+ return false;
+ var startDate = new Date(date);
+ var currentDate = new Date();
+ if(startDate<=currentDate)
+ return false;
+ return true;
+ };
+
+ /**
+ * This function is to check whether the input to date is greater than input from date.
+ * @param fromDate , toDate
+ * @return true/false
+ */
+ $scope.isToDateGreaterFromDate = function (fromDate,toDate) {
+ if(!$scope.isDateValid(fromDate) || !$scope.isDateValid(toDate))
+ return false;
+ var fromDateObj = new Date(fromDate);
+ var toDateObj = new Date(toDate);
+ if(toDateObj<=fromDateObj)
+ return false;
+ return true;
+ };
+
+ /**
+ * This function is to get error message from the input json response object.
+ * @param response , method
+ * @return errorMsg
+ */
+ $scope.parseErrorMsg = function(response, method){
+ var errorMsg = '';
+ if(response.entity){
+ try{
+ var entityJson = JSON.parse(response.entity);
+ if(entityJson){
+ errorMsg = entityJson.requestError.text;
+ }
+ }catch(err){
+ $log.error('SchedulerCtrl::' + method +' error: ' + err);
+ }
+ }
+ return errorMsg;
+ }
+ /***** Scheduler UI functions *****/
+
+ /* This function is to send scheduler task approval to scheduler microservice. */
+ $scope.submit = function () {
+ $rootScope.showSpinner =true;
+
+ var approvalDateTime = new Date($scope.timeSlots[0].startTime);
+ $scope.schedulingInfo={
+ scheduleId: $rootScope.schedulerID,
+ approvalDateTime:approvalDateTime.toISOString(),
+ approvalUserId:$scope.orgUserId,
+ approvalStatus:$scope.schedulerObjConst.approvalSubmitStatus,
+ approvalType: $scope.schedulerObjConst.approvalType
+ }
+ var approvalObj= JSON.stringify($scope.schedulingInfo)
+ schedulerService.postSubmitForApprovedTimeslots(approvalObj).then(response => {
+ if(response.status>=200 && response.status<=204){
+ confirmBoxService.showInformation("Successfully Sent for Approval").then(isConfirmed => {});
+ }else{
+ var errorMsg = $scope.parseErrorMsg(response, 'postSubmitForApprovedTimeslots');
+ confirmBoxService.showInformation("Failed to Send for Approval "+ errorMsg).then(isConfirmed => {
+ $scope.closeModal();
+ });
+ }
+ }).catch(err => {
+ $log.error('SchedulerCtrl::postSubmitForApprovedTimeslots error: ' + err);
+ var errorMsg = '';
+ if(err.data)
+ errorMsg = $scope.parseErrorMsg(err.data, 'postSubmitForApprovedTimeslots');
+ else
+ errorMsg = err;
+ confirmBoxService.showInformation("There was a problem sending Schedule request. " + errorMsg).then(isConfirmed => {
+ $scope.closeModal();
+ });
+ }).finally(() => {
+ $rootScope.showSpinner = false;
+ });
+ };
+
+ /* This function is to send scheduler task rejection to scheduler microservice. */
+ $scope.reject = function () {
+ $rootScope.showSpinner =true;
+ var approvalDateTime = new Date($scope.timeSlots[0].startTime);
+ $scope.schedulingInfo={
+ scheduleId: $rootScope.schedulerID,
+ approvalDateTime:approvalDateTime.toISOString(),
+ approvalUserId:$scope.orgUserId,
+ approvalStatus: $scope.schedulerObjConst.approvalRejectStatus,
+ approvalType: $scope.schedulerObjConst.approvalType
+ }
+ var approvalObj= JSON.stringify($scope.schedulingInfo)
+ schedulerService.postSubmitForApprovedTimeslots(approvalObj).then(response => {
+ if(response.status>=200 && response.status<=299){
+ confirmBoxService.showInformation("Successfully Sent for Reject").then(isConfirmed => {});
+ }else{
+ var errorMsg = $scope.parseErrorMsg(response, 'postSubmitForApprovedTimeslots');
+ confirmBoxService.showInformation("Failed to Send for Reject "+ errorMsg).then(isConfirmed => {});
+ }
+ }).catch(err => {
+ $log.error('SchedulerCtrl::postSubmitForApprovedTimeslots error: ' + err);
+ var errorMsg = '';
+ if(err.data)
+ errorMsg = $scope.parseErrorMsg(err.data, 'postSubmitForApprovedTimeslots');
+ else
+ errorMsg = err;
+ confirmBoxService.showInformation("There was a problem rejecting Schedule request. " + errorMsg).then(isConfirmed => {
+ $scope.closeModal();
+ });
+ }).finally(() => {
+ $rootScope.showSpinner = false;
+ });
+ };
+
+ /* This function is to send policy config and receive scheduler Id. */
+ function sendSchedulerReq(){
+ $scope.timeSlots=[];
+ $scope.timeSlots.length=0;
+ $scope.schedulerObj.userId=$scope.orgUserId;
+ $scope.schedulerObj.domainData[0].WorkflowName=$scope.vnfObject.workflow;
+ $scope.schedulerObj.schedulingInfo.normalDurationInSeconds=convertToSecs($rootScope.schedulerForm.duration)
+ $scope.schedulerObj.schedulingInfo.additionalDurationInSeconds=convertToSecs($rootScope.schedulerForm.fallbackDuration)
+ $scope.schedulerObj.schedulingInfo.concurrencyLimit=parseInt($rootScope.schedulerForm.concurrencyLimit)
+
+ $scope.schedulerObj.schedulingInfo['vnfDetails'][0].groupId=$scope.schedulerObjConst.groupId;
+ $scope.schedulerObj.schedulingInfo['vnfDetails'][0].node=getVnfData($scope.vnfObject.vnfNames);
+ for(var i=0;i<$scope.policys.length;i++){
+ if($scope.policys[i].policyName == $scope.selectedPolicy.policyName){
+ try{
+ var config = $scope.policys[i].config;
+ var configJson = JSON.parse(config);
+ $scope.selectedPolicy.policyConfig = configJson.policyName;
+ }catch(err){
+ confirmBoxService.showInformation("There was a problem setting Policy config. Please try again later. " + err).then(isConfirmed => {
+ $scope.closeModal();
+ });
+ return;
+ }
+ }
+ }
+ $scope.schedulerObj.schedulingInfo.policyId=$scope.selectedPolicy.policyConfig;
+ var changeWindow=[{
+ startTime:$filter('date')(new Date($rootScope.schedulerForm.fromDate), "yyyy-MM-ddTHH:mmZ", "UTC"),
+ endTime:$filter('date')(new Date($rootScope.schedulerForm.toDate), "yyyy-MM-ddTHH:mmZ", "UTC")
+ }];
+ $scope.schedulerObj.schedulingInfo['vnfDetails'][0].changeWindow=changeWindow;
+
+ if($rootScope.schedulerForm.checkboxSelection=="true"){ //When Scheduled now we remove the changeWindow
+ delete $scope.schedulerObj.schedulingInfo['vnfDetails'][0].changeWindow;
+ }
+ var requestScheduler= JSON.stringify($scope.schedulerObj)
+ $rootScope.showSpinner = true;
+ schedulerService.getStatusSchedulerId(requestScheduler).then(response => {
+
+ var errorMsg = '';
+ if(response && response.entity!=null){
+ var errorMsg = $scope.parseErrorMsg(response, 'getStatusSchedulerId');
+ confirmBoxService.showInformation("There was a problem retrieving scheduler ID. Please try again later. " + errorMsg).then(isConfirmed => {
+ $scope.closeModal();
+ });
+
+ }else{
+ if(response && response.uuid){
+ $rootScope.schedulerID = response.uuid;
+ var scheduledID= JSON.stringify({scheduleId:$rootScope.schedulerID});
+ $scope.seviceCallToGetTimeSlots();
+ }else{
+ confirmBoxService.showInformation("There was a problem retrieving scheduler ID. Please try again later. " + response).then(isConfirmed => {
+
+ });
+ }
+
+
+ }
+ }).catch(err => {
+ $rootScope.showSpinner = false;
+ $log.error('SchedulerCtrl::getStatusSchedulerId error: ' + err);
+ var errorMsg = '';
+ if(err.data)
+ errorMsg = $scope.parseErrorMsg(err.data, 'getStatusSchedulerId');
+ else
+ errorMsg = err;
+ confirmBoxService.showInformation("There was a problem retrieving scheduler ID. Please try again later." + errorMsg).then(isConfirmed => {
+ $scope.closeModal();
+ });
+ }).finally(() => {
+ $rootScope.showSpinner = false;
+ });
+ }
+
+ /* This function is to get time slots from SNIRO */
+ $scope.seviceCallToGetTimeSlots = function(){
+ $rootScope.showTimeslotSpinner = true;
+ schedulerService.getTimeslotsForScheduler($rootScope.schedulerID).then(response => {
+ if($rootScope.schedulerForm.checkboxSelection=="false"){
+ if(response.entity && JSON.parse(response.entity).schedule){ //received the timeslots
+ var entityJson = JSON.parse(response.entity);
+ var scheduleColl=JSON.parse(entityJson.schedule);
+ if(scheduleColl.length>0){
+ $scope.timeSlots =scheduleColl;
+ hasvaluereturnd = false;
+ $rootScope.showTimeslotSpinner = false;
+ $scope.stopPoll();
+ confirmBoxService.showInformation(entityJson.scheduleId +" Successfully Returned TimeSlots.").then(isConfirmed => {});
+ }else
+ confirmBoxService.showInformation("No time slot available").then(isConfirmed => {
+ $scope.closeModal();
+ });
+ }else{ // do polling
+ if($scope.timeSlots.length==0 && hasthresholdreached==false){
+ var polltime=$scope.schedulerObjConst.getTimeslotRate*1000;
+ pollpromise= poll(polltime, function () {
+ if($scope.timeSlots.length==0){
+ hasvaluereturnd = true;
+ $scope.seviceCallToGetTimeSlots()
+ }else
+ hasvaluereturnd = false;
+ });
+ } else {
+ if($rootScope.showTimeslotSpinner === true){
+ $rootScope.showTimeslotSpinner = false;
+ hasthresholdreached = false;
+ confirmBoxService.showInformation("Failed to get time slot - Timeout error. Please try again later").then(isConfirmed => {
+ $scope.closeModal();
+ });
+ }
+ }
+ }
+ }else{
+ if(response.entity){
+ $rootScope.showTimeslotSpinner = false;
+ if($rootScope.schedulerForm.checkboxSelection=="false")
+ confirmBoxService.showInformation("Schedule ID :" + response.entity.scheduleId +" is ready to schedule.").then(isConfirmed => {});
+ else{
+ var entityObj = JSON.parse(response.entity);
+ confirmBoxService.showInformation("ID :" + entityObj.scheduleId +" is successfully sent for Approval").then(isConfirmed => {
+ $scope.closeModal();
+ });
+ }
+ }
+ }
+ }).catch(err => {
+ $log.error('SchedulerCtrl::seviceCallToGetTimeSlots error: ' + err);
+ $rootScope.showTimeslotSpinner = false;
+ confirmBoxService.showInformation("There was a problem retrieving time slows. Please try again later.").then(isConfirmed => {
+ $scope.closeModal();
+ });
+ })
+ }
+
+
+ $scope.closeModal = function(){
+ setTimeout(function(){ $rootScope.closeModal(); }, 500);
+ }
+
+ /* This function is to get policy list from policy microservice */
+ $scope.getPolicy = function(){
+ schedulerService.getPolicyInfo().then(res =>{
+ if(res==null || res=='' || res.status==null || !(res.status>=200 && res.status<=299)){
+ $log.error('SchedulerWidgetCtrl::getPolicyInfo caught error', res);
+ var errorMsg = $scope.parseErrorMsg(res, 'getPolicy');
+ confirmBoxService.showInformation('There was a problem retrieving ploicy. Please try again later. ' + errorMsg).then(isConfirmed => {
+ $scope.closeModal();
+ });
+ }else
+ $scope.policys = res.entity;
+ });
+ }
+
+ $scope.removeXMLExtension = function(str){
+ return str.replace(".xml","");
+ };
+ /* Find Button */
+ $scope.schedule = function () {
+ if($scope.formValidation())
+ sendSchedulerReq();
+ };
+
+ /*************utility functions**************/
+
+ function convertToSecs(number){
+ var totalSecs;
+ if($scope.selectedTimeUint.text === 'HOURS'){
+ totalSecs=number * 3600;
+ } else if($scope.selectedOption === 'MINUTES') {
+ totalSecs=number * 60;
+ } else {
+ totalSecs=number;
+ }
+ return totalSecs;
+ }
+
+ function poll(interval, callback) {
+ return $interval(function () {
+ if (hasvaluereturnd) //check flag before start new call
+ callback(hasvaluereturnd);
+ thresholdvalue = thresholdvalue - 1; //Decrease threshold value
+ if (thresholdvalue == 0)
+ $scope.stopPoll(); // Stop $interval if it reaches to threshold
+ }, interval)
+ }
+
+ // stop interval.
+ $scope.stopPoll = function () {
+ $interval.cancel(pollpromise);
+ thresholdvalue = 0; //reset all flags.
+ hasvaluereturnd = false;
+ hasthresholdreached=true;
+ $rootScope.showSpinner = false;
+ }
+
+ function getVnfData(arrColl){
+ var vnfcolletion=[];
+ for(var i=0;i<arrColl.length;i++)
+ vnfcolletion.push(arrColl[i].name);
+ return vnfcolletion
+ }
+
+ function extractChangeManagementCallbackDataStr(changeManagement) {
+ var result = {};
+ result.requestType = changeManagement.workflow;
+ result.requestDetails = [];
+ _.forEach(changeManagement.vnfNames, function (vnfName) {
+ if (vnfName && vnfName.version) {
+ if (vnfName.selectedFile) {
+ vnfName.version.requestParameters.userParams = vnfName.selectedFile;
+ }
+ result.requestDetails.push(vnfName.version)
+ }
+ });
+ return JSON.stringify(result);
+ }
+
+
+ $scope.constructScheduleInfo = function(){
+ var callbackData = extractChangeManagementCallbackDataStr($scope.vnfObject);
+ $scope.schedulerObj = {
+ domain: $scope.schedulerObjConst.domain,
+ scheduleId: '',
+ scheduleName: $scope.schedulerObjConst.scheduleName,
+ userId: '',
+ domainData: [{
+ 'WorkflowName': $scope.schedulerObjConst.WorkflowName,
+ 'CallbackUrl': $scope.schedulerObjConst.CallbackUrl,
+ 'CallbackData': callbackData
+ }],
+ schedulingInfo: {
+ normalDurationInSeconds: '',
+ additionalDurationInSeconds: '',
+ concurrencyLimit: '',
+ policyId: '',
+ vnfDetails: [
+ {
+ groupId: "",
+ node: [],
+ changeWindow: [{
+ startTime: '',
+ endTime: ''
+ }]
+ }
+ ]
+ },
+ }
+ }
+
+ $scope.formValidation = function(){
+ $scope.durationEmpty=false;
+ $scope.concurrencyLimitEmpty = false;
+ $scope.fallBackDurationEmpty=false;
+ $scope.fromDateGreater=false;
+ $scope.fromDateEmpty=false;
+ $scope.toDateEmpty=false;
+ if($rootScope.schedulerForm.duration=='')
+ $scope.durationEmpty=true;
+ if($rootScope.schedulerForm.fallbackDuration=='')
+ $scope.fallBackDurationEmpty=true;
+ if($rootScope.schedulerForm.concurrencyLimit=='')
+ $scope.concurrencyLimitEmpty = true;
+ if(!($rootScope.schedulerForm.fromDate instanceof Date))
+ $scope.fromDateEmpty=true;
+ if(!($rootScope.schedulerForm.toDate instanceof Date ))
+ $scope.toDateEmpty=true;
+ var fromDateObj = new Date($rootScope.schedulerForm.fromDate);
+ var toDateObj = new Date($rootScope.schedulerForm.toDate);
+ if(fromDateObj>toDateObj)
+ $scope.fromDateGreater = true;
+ if($scope.durationEmpty||$scope.fallBackDurationEmpty ||$scope.concurrencyLimitEmpty || (($scope.fromDateEmpty || $scope.toDateEmpty) && $rootScope.schedulerForm.checkboxSelection=='false' ) ||$scope.fromDateGreater)
+ return false;
+ if($rootScope.schedulerForm.checkboxSelection == false && (!isDateValid($rootScope.schedulerForm.toDate) || !isDateValid($rootScope.schedulerForm.fromDate)))
+ return false;
+ if($scope.selectedPolicy.policyName=='' || $scope.selectedPolicy.policyName=='Select Policy'){
+ confirmBoxService.showInformation("Policy is required").then(isConfirmed => {});
+ return false;
+ }
+ return true;
+ }
+
+ $scope.getScheduleConstant =function(){
+ schedulerService.getSchedulerConstants().then(res =>{
+ if(res==null || res=='' || res.status==null || res.status!="OK"){
+ $log.error('SchedulerWidgetCtrl::getSchedulerConstants caught error', res);
+ confirmBoxService.showInformation('There is a problem about the Scheduler UI. Please try again later.').then(isConfirmed => {
+ $scope.closeModal();
+ });
+ }else{
+ var response = res.response;
+ $scope.schedulerObjConst= {
+ domain: response.domainName,
+ scheduleName : response.scheduleName,
+ WorkflowName : response.workflowName,
+ CallbackUrl : response.callbackUrl,
+ approvalType : response.approvalType,
+ approvalSubmitStatus : response.approvalSubmitStatus,
+ approvalRejectStatus : response.approvalRejectStatus,
+ getTimeslotRate : response.intervalRate,
+ policyName : response.policyName,
+ groupId : response.groupId
+ }
+ $scope.constructScheduleInfo();
+ $scope.getPolicy() // get policy items for the dropdown in the scheduler UI
+ }
+ });
+ }
+
+ /*This function is to get the current logged in user id*/
+ $scope.getUserId = function(){
+ $rootScope.showSpinner = true;
+ userProfileService.getUserProfile()
+ .then(profile=> {
+ $scope.orgUserId = profile.orgUserId;
+ }).finally(() => {
+ $rootScope.showSpinner = false;
+ });
+ }
+
+ $scope.activateThis = function(ele){
+ $compile(ele.contents())($scope);
+ $scope.$apply();
+ };
+
+ /** listening calls from parents **/
+ $scope.$on("submit", function(events,data){
+ $scope.submit();
+ });
+
+ $scope.$on("reject", function(events,data){
+ $scope.reject();
+ });
+
+ $scope.$on("schedule", function(events,data){
+ $scope.schedule();
+ });
+
+ /** init **/
+
+ var init = function () {
+ $rootScope.showSpinner = false;
+ $scope.selectedTimeUint=$scope.timeUnit[0];
+
+ if($scope.$parent.parentData){
+ $scope.hasParentData = true;
+ $scope.message = $scope.$parent.parentData;
+ $scope.vnfObject = $scope.message.data;
+ $scope.schedulerObj = $scope.message.data;
+ $scope.getUserId();
+ $scope.getScheduleConstant(); //get Scheduler constants from properties file
+ }else{
+ //second approach to get data
+ var isModal = $( "#scheduler-body" ).hasClass( "b2b-modal-body" );
+ if(isModal){
+ $scope.message = schedulerService.getWidgetData();
+ if($scope.message){
+ $scope.hasParentData = true;
+ $scope.vnfObject = $scope.message.data;
+ $scope.schedulerObj = $scope.message.data;
+ $scope.getUserId();
+ $scope.getScheduleConstant(); //get Scheduler constants from properties file
+ }
+ }else{
+ $scope.hasParentData = false;
+ }
+ }
+ };
+
+ init();
+
+
+}
+