From 21a8761f684745bb300e075c7e98ad897ace9eed Mon Sep 17 00:00:00 2001 From: st782s Date: Tue, 30 Jan 2018 17:29:36 -0500 Subject: Security/ Package Name changes Issue-ID: PORTAL-174, PORTAL-157, PORTAL-156, PORTAL-148, PORTAL-145, PORTAL-140, PORTAL-133, PORTAL-121, PORTAL-111, PORTAL-88 Includes security fixes, Role Centralization, replace certain ECOMP occurrences etc Change-Id: I3c8b706709c6b92e646e3cbe50c2d660e8a46ef4 Signed-off-by: st782s --- ecomp-portal-widget-ms/common-widgets/.gitignore | 3 + ecomp-portal-widget-ms/common-widgets/pom.xml | 5 +- .../js/controller.js | 604 +++++++++++++++++++++ .../markup/markup.html | 178 ++++++ .../styles/styles.css | 47 ++ 5 files changed, 834 insertions(+), 3 deletions(-) create mode 100644 ecomp-portal-widget-ms/common-widgets/portal-common-scheduler-widget/js/controller.js create mode 100644 ecomp-portal-widget-ms/common-widgets/portal-common-scheduler-widget/markup/markup.html create mode 100644 ecomp-portal-widget-ms/common-widgets/portal-common-scheduler-widget/styles/styles.css (limited to 'ecomp-portal-widget-ms/common-widgets') diff --git a/ecomp-portal-widget-ms/common-widgets/.gitignore b/ecomp-portal-widget-ms/common-widgets/.gitignore index f151f08a..92ae7aa8 100644 --- a/ecomp-portal-widget-ms/common-widgets/.gitignore +++ b/ecomp-portal-widget-ms/common-widgets/.gitignore @@ -3,3 +3,6 @@ /.settings/ /bin/ target/ +/common-widgets/events-widget.zip +/common-widgets/news-widget.zip +/common-widgets/resources-widget.zip \ No newline at end of file diff --git a/ecomp-portal-widget-ms/common-widgets/pom.xml b/ecomp-portal-widget-ms/common-widgets/pom.xml index 232f9331..7b1167d4 100644 --- a/ecomp-portal-widget-ms/common-widgets/pom.xml +++ b/ecomp-portal-widget-ms/common-widgets/pom.xml @@ -1,12 +1,12 @@ - 4.0.0 + 4.0.0 org.onap.portal widget-ms-parent - 1.3.0 + 2.2 common-widgets @@ -78,5 +78,4 @@ - 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;itoDateObj) + $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(); + + +} + diff --git a/ecomp-portal-widget-ms/common-widgets/portal-common-scheduler-widget/markup/markup.html b/ecomp-portal-widget-ms/common-widgets/portal-common-scheduler-widget/markup/markup.html new file mode 100644 index 00000000..1a941907 --- /dev/null +++ b/ecomp-portal-widget-ms/common-widgets/portal-common-scheduler-widget/markup/markup.html @@ -0,0 +1,178 @@ +
+
+ + +
+
+
+
+
No prerequisite data available
+
+
+
+
+
+
+ +
+ + +
+
+
+
+ +
+ + A required date is missing + Please enter valid date in MM/DD/YYYY format! + Input date must be greater than today! +
+
+ +
+
+
+
+
+
+ +
+ + To date must be greater than From date. + A required date is missing + Please enter valid date in MM/DD/YYYY format! + Input date must be greater than today! +
+
+
+
+
+
+
+
+ +
+
+
+
+
+
+
+ +
+ Required! +
+
+
+
+
+ +
+ Required! +
+
+
+
+
+
+
+
+ +
+ + Required! +
+
+
+
+
+
+
+
+ +
+
+
+
+
+ +
+ + + + + + + + + + + + + + +
Start TimeFinish Time
+
+
+ + +
+
+ + +
diff --git a/ecomp-portal-widget-ms/common-widgets/portal-common-scheduler-widget/styles/styles.css b/ecomp-portal-widget-ms/common-widgets/portal-common-scheduler-widget/styles/styles.css new file mode 100644 index 00000000..67c8ab40 --- /dev/null +++ b/ecomp-portal-widget-ms/common-widgets/portal-common-scheduler-widget/styles/styles.css @@ -0,0 +1,47 @@ + +.portal-widget-panel-container { + margin-left:150px; + width:1500px; +} + + +.portal-widget-panel-fixed-panel { + min-height: 300px; + max-height: 1300px; + overflow: auto; +} + +.portal-widget-panel-double-middle { + min-height: 660px; + max-height: 660px; + overflow: auto; +} + +.portal-widget-panel-row { + margin-right: 0px; + margin-left: 0px; + width: 2800px; +} + +/*Increases the width of the card/panel */ +.portal-widget-panel-panel-default { + width:450px +} + +/*Controls the spacing between the cards */ +.portal-widget-panel-col-sm-3 { + width:20.5% +} + +.portal-widget-panel-top { + top: 15px; + left: 15px; +} + +#-css-ready { +color: #bada55 !important; +} + +.scheduler-radio{ + margin:5px; +} \ No newline at end of file -- cgit 1.2.3-korg