/*- * ============LICENSE_START======================================================= * ONAP CLAMP * ================================================================================ * Copyright (C) 2017-2019 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============================================ * =================================================================== * */ app .controller( 'operationalPolicyCtrl', [ '$scope', '$rootScope', '$uibModalInstance', 'data', 'operationalPolicyService', 'dialogs', function($scope, $rootScope, $uibModalInstance, data, operationalPolicyService, dialogs) { console.log("//////operationalPolicyCtrl"); $scope.policy_ids = [] var allPolicies = {}; $scope.guardType = "GUARD_MIN_MAX"; $scope.number = 0; $scope.clname = ""; $scope.guard_ids = []; function getAllFormId() { return Array.from(document.getElementsByClassName("formId")); } function searchActiveFormId() { var formArray = getAllFormId(); for (var i = 0, max = formArray.length; i < max; i++) { console.log("Search active FormId, current element " + formArray[i].id); if (formArray[i].style.display !== "none") { console.log("Active form is:" + formArray[i].id); return formArray[i]; } } console.log("No active formId found !"); } function add_one_more() { console.log("add one more"); $("#nav_Tabs li").removeClass("active"); // FormSpan contains a block of the form that is not being // displayed. We will create clones of that and add them to tabs var form = $("#formSpan").clone(true, true) var count = 0; // Each new tab will have the formId class attached to it. This way // we can track how many forms we currently have out there and // assign listeners to them if ($(".formId").length > 0) { var greatest = 0; var s = $(".formId"); for (var i = 0; i < s.length; i++) { if (parseInt($(s[i]).attr("id").substring(6)) > greatest) { greatest = parseInt($(s[i]).attr("id").substring(6)) } } count = greatest + 1; $("#properties_tab").append(('')); } else { count++; $("#properties_tab").append(''); } $("#add_one_more") .parent() .before( '
  • new
  • '); $("#formId" + count).append(form.children()); $(".formId").not($("#formId" + count)).css("display", "none"); addCustListen(count); $("#formId" + count + " #id").val("new"); $("#formId" + count + " #clname").val($scope.clname); return count; } function addCustListen(count) { $('#go_properties_tab' + count).click(function(event) { $("#nav_Tabs li").removeClass("active"); $(this).parent().addClass("active"); $("#formId" + count).css("display", "") $(".formId").not($("#formId" + count)).css("display", "none") }) $('#tab_close' + count).click(function(event) { $(this).parent().remove(); $scope.policy_ids.splice($scope.policy_ids.indexOf($("#formId" + count + " #id").val()), 1); $("#formId" + count).remove(); }) } function greatestIdNum() { var greatest = 0; var s = $(".formId"); for (var i = 0; i < s.length; i++) { if (parseInt($(s[i]).attr("id").substring(6)) > greatest) { greatest = parseInt($(s[i]).attr("id").substring(6)) } } return greatest; } function serializeElement(element) { var o = {}; var a = element.serializeArray(); $.each(a, function() { if (o[this.name]) { if (!o[this.name].push) { o[this.name] = [ o[this.name] ]; } o[this.name].push(this.value || ''); } else { o[this.name] = this.value || ''; } }); return o; } function savePolicyLocally() { var polForm = {}; var clPolForm = {}; clPolForm = serializeElement($("#operationalPolicyHeaderForm")); allPolicies['guard_policies'] = {}; var policiesArray = [] $.each($(".formId"), function() { var policyProperties = serializeElement($("#" + this.id + " .policyProperties")); policyProperties["target"] = serializeElement($("#" + this.id + " .policyTarget")) policiesArray.push(policyProperties); // Now get the Guard if ($("#" + this.id + " #enableGuardPolicy").is(':checked')) { var guardPolicyBody = serializeElement($("#" + this.id + " .guardProperties")); var guardPolicyId = guardPolicyBody['id']; delete guardPolicyBody['id']; allPolicies['guard_policies'][guardPolicyId] = guardPolicyBody; $scope.guard_ids.push(guardPolicyId); } }); polForm['controlLoop'] = clPolForm; polForm['policies'] = policiesArray; allPolicies['operational_policy'] = polForm; } function add_new_policy() { console.log("add new policy"); // remove old gui forms for (var i = 1; i < ($(".formId").length + 1); i++) { $("#go_properties_tab" + i).parent().remove(); } $(".formId").remove(); $("#add_one_more").click(); } function configureComponents(allPolicies) { console.log("load properties to op policy"); // Set the header $.each($('#operationalPolicyHeaderForm').find('.form-control'), function() { $(this).val(allPolicies['operational_policy']['controlLoop'][this.id]); }); // Set the sub-policies $.each(allPolicies['operational_policy']['policies'], function(opPolicyElemIndex, opPolicyElemValue) { var formNum = add_one_more(); $.each($('.policyProperties').find('.form-control'), function(opPolicyPropIndex, opPolicyPropValue) { $("#formId" + formNum + " .policyProperties").find("#" + opPolicyPropValue.id).val( allPolicies['operational_policy']['policies'][opPolicyElemIndex][opPolicyPropValue.id]); }); // Initial TargetResourceId options initTargetResourceIdOptions(allPolicies['operational_policy']['policies'][opPolicyElemIndex]['target']['type'], formNum); $.each($('.policyTarget').find('.form-control'), function(opPolicyTargetPropIndex, opPolicyTargetPropValue) { $("#formId" + formNum + " .policyTarget").find("#" + opPolicyTargetPropValue.id).val( allPolicies['operational_policy']['policies'][opPolicyElemIndex]['target'][opPolicyTargetPropValue.id]); }); // update the current tab label $("#go_properties_tab" + formNum).text( allPolicies['operational_policy']['policies'][opPolicyElemIndex]['id']); // Check if there is a guard set for it $.each(allPolicies['guard_policies'], function(guardElemId, guardElemValue) { if (guardElemValue.recipe === $($("#formId" + formNum + " #recipe")[0]).val()) { // Found one, set all guard prop $.each($('.guardProperties').find('.form-control'), function(guardPropElemIndex, guardPropElemValue) { guardElemValue['id'] = guardElemId; $("#formId" + formNum + " .guardProperties").find("#" + guardPropElemValue.id).val( guardElemValue[guardPropElemValue.id]); }); iniGuardPolicyType(guardElemId, formNum); // And finally enable the flag $("#formId" + formNum + " #enableGuardPolicy").prop("checked", true); } }); }); } function iniGuardPolicyType (guardPolicyId, formNum) { if(guardPolicyId.indexOf('guard.minmax.') !== -1) { $("#formId" + formNum + " #minMaxGuardPolicyDiv").show(); $("#formId" + formNum + " #frequencyLimiterGuardPolicyDiv").hide(); $("#formId" + formNum + " #guardPolicyType").val("GUARD_MIN_MAX"); } else if (guardPolicyId.indexOf('guard.frequency.') !== -1) { $("#formId" + formNum + " #minMaxGuardPolicyDiv").hide(); $("#formId" + formNum + " #frequencyLimiterGuardPolicyDiv").show(); $("#formId" + formNum + " #guardPolicyType").val("GUARD_YAML"); } } function initTargetResourceIdOptions (targetType, formNum) { var recipe = $("#formId" + formNum + "#recipe").val(); $("#formId" + formNum + " #resourceID").empty(); $("#formId" + formNum + " #resourceID").append($('').val("").html("-- choose an option --")); var resourceVnf = getResourceDetailsVfProperty(); if (targetType == "VNF" && (null !== resourceVnf || undefined !== resourceVnf)) { for ( var prop in resourceVnf) { var name = resourceVnf[prop]["name"]; $("#formId" + formNum + " #resourceID").append($('').val(name).html(name)); } } var resourceVFModule = getResourceDetailsVfModuleProperty(); if (targetType == "VFMODULE" && (null !== resourceVFModule || undefined !== resourceVFModule)) { if (recipe == 'VF Module Create' || recipe == 'VF Module Delete') { for ( var prop in resourceVFModule) { if (resourceVFModule[prop]["isBase"] == false) { $("#formId" + formNum + " #resourceID").append($('').val(resourceVFModule[prop]["vfModuleModelName"]).html(resourceVFModule[prop]["vfModuleModelName"])); } } } else { for ( var prop in resourceVFModule) { $("#formId" + formNum + " #resourceID").append($('').val(resourceVFModule[prop]["vfModuleModelName"]).html(resourceVFModule[prop]["vfModuleModelName"])); } } } } function initTargetModelAttributes (formNum) { $("#formId" + formNum + " #modelName").val(""); $("#formId" + formNum + " #modelInvariantId").val(""); $("#formId" + formNum + " #modelVersionId").val(""); $("#formId" + formNum + " #modelVersion").val(""); $("#formId" + formNum + " #modelCustomizationId").val(""); } $scope.initTargetResourceId = function(event) { var formNum = $(event.target).closest('.formId').attr('id').substring(6); initTargetModelAttributes(formNum); var type = $(event.target).val(); initTargetResourceIdOptions(type, formNum); } $scope.changeGuardId = function(formItemActive) { if (formItemActive === undefined) { formItemActive = searchActiveFormId(); if (formItemActive === undefined) { return; } } var oldValue = $("#" + formItemActive.id + " .guardProperties #id").val(); // remove old prefix if(oldValue.indexOf('guard.minmax.') !== -1) { oldValue = oldValue.substr(oldValue.indexOf('guard.minmax.') + 13); } else if (oldValue.indexOf('guard.frequency.') !== -1) { oldValue = oldValue.substr(oldValue.indexOf('guard.frequency.') + 16); } var prefix = "guard."; if ($("#" + formItemActive.id + " #guardPolicyType").val() === "GUARD_MIN_MAX") { prefix = prefix + "minmax."; } else if ($("#" + formItemActive.id + " #guardPolicyType").val() === "GUARD_YAML") { prefix = prefix + "frequency."; } $("#" + formItemActive.id + " .guardProperties #id").val(prefix+oldValue); } $scope.changeTargetResourceId = function(event) { var formNum = $(event.target).closest('.formId').attr('id').substring(6); initTargetModelAttributes(formNum); var resourceVFModule = getResourceDetailsVfModuleProperty(); var type = $("#formId" + formNum +" #type").val(); var recipe = $("#formId" + formNum +" #recipe").val(); if (type == "VFMODULE" && (null !== resourceVFModule || undefined !== resourceVFModule) && (recipe == 'VF Module Create' || recipe == 'VF Module Delete')) { for ( var prop in resourceVFModule) { if (prop == $(event.target).val()) { $("#formId" + formNum +" #modelName").val(resourceVFModule[prop]["vfModuleModelName"]); $("#formId" + formNum +" #modelInvariantId").val(resourceVFModule[prop]["vfModuleModelInvariantUUID"]); $("#formId" + formNum +" #modelVersionId").val(resourceVFModule[prop]["vfModuleModelUUID"]); $("#formId" + formNum +" #modelVersion").val(resourceVFModule[prop]["vfModuleModelVersion"]); $("#formId" + formNum +" #modelCustomizationId").val(resourceVFModule[prop]["vfModuleModelCustomizationUUID"]); $("#formId" + formNum +" #metadata *").prop('disabled', false); } } } else { $("#formId" + formNum +" #metadata *").prop('disabled', true); } } $scope.changeGuardPolicyType = function() { var formItemActive = searchActiveFormId(); if (formItemActive === undefined) return; if ($("#" + formItemActive.id + " #guardPolicyType").val() === "GUARD_MIN_MAX") { $("#" + formItemActive.id + " #minMaxGuardPolicyDiv").show(); $("#" + formItemActive.id + " #frequencyLimiterGuardPolicyDiv").hide(); } else if ($("#" + formItemActive.id + " #guardPolicyType").val() === "GUARD_YAML") { $("#" + formItemActive.id + " #minMaxGuardPolicyDiv").hide(); $("#" + formItemActive.id + " #frequencyLimiterGuardPolicyDiv").show(); } $scope.changeGuardId(formItemActive); } $scope.initPolicySelect = function() { if (allPolicies['operational_policy'] === undefined || allPolicies['operational_policy'] === null) { allPolicies = getOperationalPolicyProperty(); } // Provision all policies ID first if ($scope.policy_ids.length == 0 && allPolicies['operational_policy'] != undefined) { $.each(allPolicies['operational_policy']['policies'], function() { $scope.policy_ids.push(this['id']); }); } } $scope.init = function() { $(function() { $scope.clname = getLoopName(); $("#add_one_more").click(function(event) { console.log("add one more"); event.preventDefault(); $scope.policy_ids.push($("#formId" + add_one_more() + " #id").val()); }); if (allPolicies['operational_policy'] !== undefined && allPolicies['operational_policy'] !== null) { // load properties console.log("load properties"); configureComponents(allPolicies); } else { console.log("create new policy"); add_new_policy(); } $("#savePropsBtn").click(function(event) { console.log("save properties triggered"); savePolicyLocally(); for (var i = 0; i <= $scope.guard_ids.length; i++) { for (var j = i; j <= $scope.guard_ids.length; j++) { if (i != j && $scope.guard_ids[i] == $scope.guard_ids[j]) { // duplacated guard policy id exist alert("The guard policy ID should be unique."); return; } } } angular.element(document.getElementById('formSpan')).scope().submitForm(allPolicies); $("#close_button").click(); }); }); } $scope.init(); $scope.updateGuardRecipe = function(event) { var formNum = $(event.target).closest('.formId').attr('id').substring(6); // Get the second recipe (guard one) and update it $($("#formId" + formNum + " #recipe")[1]).val($(event.target).val()); } $scope.updateGuardActor = function(event) { var formNum = $(event.target).closest('.formId').attr('id').substring(6); // Get the second actor (guard one) and update it $($("#formId" + formNum + " #actor")[1]).val($(event.target).val()); } // When we change the name of a policy $scope.updateTabLabel = function(event) { // update policy id structure var formNum = $(event.target).closest('.formId').attr('id').substring(6); $scope.policy_ids.splice($scope.policy_ids.indexOf($("#formId" + formNum + " #id").val()), 1); $scope.policy_ids.push($(event.target).val()); // Update the tab now $("#go_properties_tab" + formNum).text($(event.target).val()); } $scope.close = function() { console.log("close"); $uibModalInstance.close("closed"); }; $scope.submitForm = function(obj) { var operationalPolicies = getOperationalPolicies(); if (obj !== null) { operationalPolicies[0]["configurationsJson"] = obj; } operationalPolicyService.saveOpPolicyProperties(operationalPolicies).then(function(pars) { updateOpPolicyProperties(operationalPolicies); }, function(data) { }); }; } ]);