From: Sébastien Determe Date: Fri, 29 Sep 2017 07:05:06 +0000 (+0000) Subject: Merge "Removed redundant code" X-Git-Tag: v1.1.0~40 X-Git-Url: https://gerrit.onap.org/r/gitweb?a=commitdiff_plain;h=c51eb5cd77b9691d0c66149e7fbef4d56148d233;hp=86b8eefa62e39d9dc930e4a88447532ab57110f6;p=clamp.git Merge "Removed redundant code" --- diff --git a/pom.xml b/pom.xml index fb86ae82..c4c1a81a 100644 --- a/pom.xml +++ b/pom.xml @@ -795,6 +795,9 @@ verify + + **/*ItCase.java + 1 false diff --git a/src/main/java/org/onap/clamp/clds/client/DcaeInventoryServices.java b/src/main/java/org/onap/clamp/clds/client/DcaeInventoryServices.java index 192dcdb9..8f80e07c 100644 --- a/src/main/java/org/onap/clamp/clds/client/DcaeInventoryServices.java +++ b/src/main/java/org/onap/clamp/clds/client/DcaeInventoryServices.java @@ -101,7 +101,7 @@ public class DcaeInventoryServices { String serviceUuid = sdcCatalogServices.getServiceUuidFromServiceInvariantId(invariantServiceUuid); String resourceUuid = ""; if (resourceUuidList != null && !resourceUuidList.isEmpty()) { - resourceUuid = resourceUuidList.get(0).toString(); + resourceUuid = resourceUuidList.get(0); } /* Invemtory service url is called in this method */ isDcaeInfoAvailable = getDcaeInformation(artifactName, serviceUuid, resourceUuid); @@ -215,7 +215,7 @@ public class DcaeInventoryServices { JSONArray itemsArray = (JSONArray) jsonObj.get("items"); JSONObject dcaeServiceType0 = (JSONObject) itemsArray.get(0); daceInventoryResponse = dcaeServiceType0.toString(); - logger.info(daceInventoryResponse.toString()); + logger.info(daceInventoryResponse); } LoggingUtils.setTimeContext(startTime, new Date()); metricsLogger.info("getDcaeInformation complete: number services returned=" + numServices); diff --git a/src/main/java/org/onap/clamp/clds/client/PolicyClient.java b/src/main/java/org/onap/clamp/clds/client/PolicyClient.java index 391e3955..7aa1330f 100644 --- a/src/main/java/org/onap/clamp/clds/client/PolicyClient.java +++ b/src/main/java/org/onap/clamp/clds/client/PolicyClient.java @@ -140,7 +140,7 @@ public class PolicyClient { // Set Policy Type policyParameters.setPolicyConfigType(PolicyConfigType.MicroService); - policyParameters.setEcompName(refProp.getStringValue("policy.ecomp.name")); + policyParameters.setEcompName(refProp.getStringValue("policy.onap.name")); policyParameters.setPolicyName(prop.getCurrentPolicyScopeAndPolicyName()); policyParameters.setConfigBody(policyJson); @@ -177,7 +177,7 @@ public class PolicyClient { // Set Policy Type policyParameters.setPolicyConfigType(PolicyConfigType.Base); - policyParameters.setEcompName(refProp.getStringValue("policy.ecomp.name")); + policyParameters.setEcompName(refProp.getStringValue("policy.onap.name")); policyParameters.setPolicyName(prop.getCurrentPolicyScopeAndPolicyName()); policyParameters.setConfigBody(configBody); @@ -196,6 +196,43 @@ public class PolicyClient { return rtnMsg; } + /** + * Perform send of Microservice policy in OTHER type. + * + * @param configBody + * The config policy string body + * @param prop + * The ModelProperties + * @param policyRequestUuid + * The policy request UUID + * @return The answer from policy call + */ + public String sendMicroServiceInOther(String configBody, ModelProperties prop, String policyRequestUuid) { + + PolicyParameters policyParameters = new PolicyParameters(); + + // Set Policy Type + policyParameters.setPolicyConfigType(PolicyConfigType.MicroService); + policyParameters.setEcompName(refProp.getStringValue("policy.onap.name")); + policyParameters.setPolicyName(prop.getCurrentPolicyScopeAndPolicyName()); + + policyParameters.setConfigBody(configBody); + policyParameters.setConfigBodyType(PolicyType.OTHER); + + policyParameters.setRequestID(UUID.fromString(policyRequestUuid)); + String policyNamePrefix = refProp.getStringValue("policy.ms.policyNamePrefix"); + + // Adding this line to clear the policy id from policy name while + // pushing to policy engine + prop.setPolicyUniqueId(""); + + String rtnMsg = send(policyParameters, prop, policyNamePrefix); + String policyType = refProp.getStringValue("policy.ms.type"); + push(policyType, prop); + + return rtnMsg; + } + /** * Perform send of policy. * diff --git a/src/main/java/org/onap/clamp/clds/client/StringMatchPolicyDelegate.java b/src/main/java/org/onap/clamp/clds/client/StringMatchPolicyDelegate.java deleted file mode 100644 index d149137b..00000000 --- a/src/main/java/org/onap/clamp/clds/client/StringMatchPolicyDelegate.java +++ /dev/null @@ -1,74 +0,0 @@ -/*- - * ============LICENSE_START======================================================= - * ONAP CLAMP - * ================================================================================ - * 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. - */ - -package org.onap.clamp.clds.client; - -import java.util.UUID; - -import org.camunda.bpm.engine.delegate.DelegateExecution; -import org.camunda.bpm.engine.delegate.JavaDelegate; -import org.onap.clamp.clds.client.req.StringMatchPolicyReq; -import org.onap.clamp.clds.model.prop.ModelProperties; -import org.onap.clamp.clds.model.prop.StringMatch; -import org.onap.clamp.clds.model.refprop.RefProp; -import org.springframework.beans.factory.annotation.Autowired; - -import com.att.eelf.configuration.EELFLogger; -import com.att.eelf.configuration.EELFManager; - -/** - * Send String Match info to policy api. - */ -public class StringMatchPolicyDelegate implements JavaDelegate { - protected static final EELFLogger logger = EELFManager.getInstance() - .getLogger(StringMatchPolicyDelegate.class); - protected static final EELFLogger metricsLogger = EELFManager.getInstance().getMetricsLogger(); - - @Autowired - private PolicyClient policyClient; - - @Autowired - private RefProp refProp; - - /** - * Perform activity. Send String Match info to policy api. - * - * @param execution - */ - @Override - public void execute(DelegateExecution execution) throws Exception { - String stringMatchPolicyRequestUuid = UUID.randomUUID().toString(); - execution.setVariable("stringMatchPolicyRequestUuid", stringMatchPolicyRequestUuid); - - ModelProperties prop = ModelProperties.create(execution); - StringMatch stringMatch = prop.getType(StringMatch.class); - if (stringMatch.isFound()) { - String policyJson = StringMatchPolicyReq.format(refProp, prop); - String responseMessage = policyClient.sendMicroServiceInJson(policyJson, prop, stringMatchPolicyRequestUuid); - if (responseMessage != null) { - execution.setVariable("stringMatchPolicyResponseMessage", responseMessage.getBytes()); - } - } - } - -} diff --git a/src/main/java/org/onap/clamp/clds/client/StringMatchPolicyDeleteDelegate.java b/src/main/java/org/onap/clamp/clds/client/StringMatchPolicyDeleteDelegate.java deleted file mode 100644 index 5bda8d36..00000000 --- a/src/main/java/org/onap/clamp/clds/client/StringMatchPolicyDeleteDelegate.java +++ /dev/null @@ -1,62 +0,0 @@ -/*- - * ============LICENSE_START======================================================= - * ONAP CLAMP - * ================================================================================ - * 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. - */ - -package org.onap.clamp.clds.client; - -import org.camunda.bpm.engine.delegate.DelegateExecution; -import org.camunda.bpm.engine.delegate.JavaDelegate; -import org.onap.clamp.clds.model.prop.ModelProperties; -import org.onap.clamp.clds.model.prop.StringMatch; -import org.springframework.beans.factory.annotation.Autowired; - -import com.att.eelf.configuration.EELFLogger; -import com.att.eelf.configuration.EELFManager; - -/** - * Delete String Match Policy via policy api. - */ -public class StringMatchPolicyDeleteDelegate implements JavaDelegate { - protected static final EELFLogger logger = EELFManager.getInstance() - .getLogger(StringMatchPolicyDeleteDelegate.class); - protected static final EELFLogger metricsLogger = EELFManager.getInstance().getMetricsLogger(); - - @Autowired - private PolicyClient policyClient; - - /** - * Perform activity. Delete String Match Policy via policy api. - * - * @param execution - */ - @Override - public void execute(DelegateExecution execution) throws Exception { - ModelProperties prop = ModelProperties.create(execution); - StringMatch stringMatch = prop.getType(StringMatch.class); - if (stringMatch.isFound()) { - prop.setCurrentModelElementId(stringMatch.getId()); - - policyClient.deleteMicrosService(prop); - } - } - -} diff --git a/src/main/java/org/onap/clamp/clds/client/TcaPolicyDelegate.java b/src/main/java/org/onap/clamp/clds/client/TcaPolicyDelegate.java index 9debcc2a..7de12683 100644 --- a/src/main/java/org/onap/clamp/clds/client/TcaPolicyDelegate.java +++ b/src/main/java/org/onap/clamp/clds/client/TcaPolicyDelegate.java @@ -23,19 +23,19 @@ package org.onap.clamp.clds.client; +import com.att.eelf.configuration.EELFLogger; +import com.att.eelf.configuration.EELFManager; + import java.util.UUID; import org.camunda.bpm.engine.delegate.DelegateExecution; import org.camunda.bpm.engine.delegate.JavaDelegate; -import org.onap.clamp.clds.client.req.TcaMPolicyReq; +import org.onap.clamp.clds.client.req.TcaRequestFormatter; import org.onap.clamp.clds.model.prop.ModelProperties; import org.onap.clamp.clds.model.prop.Tca; import org.onap.clamp.clds.model.refprop.RefProp; import org.springframework.beans.factory.annotation.Autowired; -import com.att.eelf.configuration.EELFLogger; -import com.att.eelf.configuration.EELFManager; - /** * Send Tca info to policy api. * @@ -46,10 +46,10 @@ public class TcaPolicyDelegate implements JavaDelegate { protected static final EELFLogger metricsLogger = EELFManager.getInstance().getMetricsLogger(); @Autowired - private RefProp refProp; + private RefProp refProp; @Autowired - PolicyClient policyClient; + PolicyClient policyClient; /** * Perform activity. Send Tca info to policy api. @@ -64,8 +64,8 @@ public class TcaPolicyDelegate implements JavaDelegate { ModelProperties prop = ModelProperties.create(execution); Tca tca = prop.getType(Tca.class); if (tca.isFound()) { - String policyJson = TcaMPolicyReq.formatTca(refProp, prop); - String responseMessage = policyClient.sendMicroServiceInJson(policyJson, prop, tcaPolicyRequestUuid); + String policyJson = TcaRequestFormatter.createPolicyJson(refProp, prop); + String responseMessage = policyClient.sendMicroServiceInOther(policyJson, prop, tcaPolicyRequestUuid); if (responseMessage != null) { execution.setVariable("tcaPolicyResponseMessage", responseMessage.getBytes()); } diff --git a/src/main/java/org/onap/clamp/clds/client/req/SdcReq.java b/src/main/java/org/onap/clamp/clds/client/req/SdcReq.java index f8351ca5..32846ed0 100644 --- a/src/main/java/org/onap/clamp/clds/client/req/SdcReq.java +++ b/src/main/java/org/onap/clamp/clds/client/req/SdcReq.java @@ -26,7 +26,6 @@ package org.onap.clamp.clds.client.req; import com.att.eelf.configuration.EELFLogger; import com.att.eelf.configuration.EELFManager; import com.fasterxml.jackson.core.JsonParseException; -import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.databind.JsonMappingException; import com.fasterxml.jackson.databind.JsonNode; import com.fasterxml.jackson.databind.ObjectMapper; @@ -50,7 +49,6 @@ import org.onap.clamp.clds.model.CldsSdcResource; import org.onap.clamp.clds.model.CldsSdcServiceDetail; import org.onap.clamp.clds.model.prop.Global; import org.onap.clamp.clds.model.prop.ModelProperties; -import org.onap.clamp.clds.model.prop.StringMatch; import org.onap.clamp.clds.model.prop.Tca; import org.onap.clamp.clds.model.refprop.RefProp; @@ -88,85 +86,16 @@ public class SdcReq { String yamlvalue = getYamlvalue(docText); String updatedBlueprint = ""; - StringMatch stringMatch = prop.getType(StringMatch.class); Tca tca = prop.getType(Tca.class); - if (stringMatch.isFound()) { - prop.setCurrentModelElementId(stringMatch.getId()); - ObjectMapper objectMapper = new ObjectMapper(); - ObjectNode serviceConfigurations = objectMapper.createObjectNode(); - - StringMatchPolicyReq.appendServiceConfigurations(refProp, service, serviceConfigurations, stringMatch, - prop); - logger.info("Value of serviceConfigurations:" + serviceConfigurations); - ObjectNode servConfNode = (ObjectNode) serviceConfigurations.get("serviceConfigurations"); - - // get updated blueprint by attaching service Conf from - // globalProperties - updatedBlueprint = getUpdatedBlueprintWithServiceConf(refProp, prop, yamlvalue, servConfNode); - } else if (tca.isFound()) { - prop.setCurrentModelElementId(tca.getId()); - ObjectNode rootNode = (ObjectNode) refProp.getJsonTemplate("tca.template", service); - ObjectNode content = rootNode.with("content"); - TcaMPolicyReq.appendSignatures(refProp, service, content, tca, prop); - logger.info("Value of content:" + content); - // ObjectNode servConfNode = - // (ObjectNode)signatures.get("signatures"); - - // get updated blueprint by attaching service Conf from - // globalProperties - updatedBlueprint = getUpdatedBlueprintWithConfiguration(refProp, prop, yamlvalue, content); - } - + if (tca.isFound()) { + updatedBlueprint = TcaRequestFormatter.updatedBlueprintWithConfiguration(refProp, prop, yamlvalue); + } logger.info("value of blueprint:" + updatedBlueprint); return updatedBlueprint; } - private static String getUpdatedBlueprintWithServiceConf(RefProp refProp, ModelProperties prop, String yamlValue, - ObjectNode serviceConf) throws IOException { - Yaml yaml = new Yaml(); - - // Serialiaze Yaml file - Map loadedYaml = (Map) yaml.load(yamlValue); - // Get node templates information from Yaml - Map nodeTemplates = loadedYaml.get("node_templates"); - logger.info("value of NodeTemplates:" + nodeTemplates); - - // Get StringMatch Object information from node templates of Yaml - Map smObject = nodeTemplates.get("SM"); - logger.info("value of StringMatch:" + smObject); - - // Get Properties Object information from stringmatch of Yaml - Map propsObject = smObject.get("properties"); - logger.info("value of PropsObject:" + propsObject); - - String deploymentJsonObject = propsObject.get("deployment_JSON"); - logger.info("value of deploymentJson:" + deploymentJsonObject); - - ObjectMapper mapper = new ObjectMapper(); - ObjectNode deployJsonNode = (ObjectNode) mapper.readTree(deploymentJsonObject); - ObjectNode configurationObjectNode = (ObjectNode) deployJsonNode.get("configuration"); - - // "policyName":"example_model06.ClosedLoop_FRWL_SIG_0538e6f2_8c1b_4656_9999_3501b3c59ad7_StringMatch_", - String policyNamePrefix = refProp.getStringValue("policy.ms.policyNamePrefix"); - String policyName = prop.getCurrentPolicyScopeAndFullPolicyName(policyNamePrefix); - configurationObjectNode.put("policyName", policyName); - - // "closedLoopControlName":"ClosedLoop-FRWL-SIG-0538e6f2-8c1b-4656-9999-3501b3c59ad7", - configurationObjectNode.put("closedLoopControlName", prop.getControlName()); - configurationObjectNode.put("messageReaderConsumerGroup", prop.getModelName()); - configurationObjectNode.set("serviceConfigurations", serviceConf); - propsObject.put("deployment_JSON", deployJsonNode.toString()); - String blueprint = yaml.dump(loadedYaml); - logger.info("value of updated Yaml File:" + blueprint); - - blueprint = yaml.dump(loadedYaml); - logger.info("value of updated Yaml File:" + blueprint); - - return blueprint; - } - private static String getUpdatedBlueprintWithConfiguration(RefProp refProp, ModelProperties prop, String yamlValue, - ObjectNode serviceConf) throws JsonProcessingException, IOException { + ObjectNode serviceConf) throws IOException { String blueprint = ""; Yaml yaml = new Yaml(); // Serialiaze Yaml file diff --git a/src/main/java/org/onap/clamp/clds/client/req/StringMatchPolicyReq.java b/src/main/java/org/onap/clamp/clds/client/req/StringMatchPolicyReq.java deleted file mode 100644 index 5884c3dd..00000000 --- a/src/main/java/org/onap/clamp/clds/client/req/StringMatchPolicyReq.java +++ /dev/null @@ -1,139 +0,0 @@ -/*- - * ============LICENSE_START======================================================= - * ONAP CLAMP - * ================================================================================ - * 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. - */ - -package org.onap.clamp.clds.client.req; - -import java.io.IOException; -import java.util.Iterator; -import java.util.Map.Entry; - -import org.onap.clamp.clds.model.prop.Global; -import org.onap.clamp.clds.model.prop.ModelProperties; -import org.onap.clamp.clds.model.prop.ResourceGroup; -import org.onap.clamp.clds.model.prop.ServiceConfiguration; -import org.onap.clamp.clds.model.prop.StringMatch; -import org.onap.clamp.clds.model.refprop.RefProp; - -import com.att.eelf.configuration.EELFLogger; -import com.att.eelf.configuration.EELFManager; -import com.fasterxml.jackson.databind.node.ArrayNode; -import com.fasterxml.jackson.databind.node.ObjectNode; - -/** - * Construct a Policy for String Match Micro Service request given CLDS objects. - */ -public class StringMatchPolicyReq { - protected static final EELFLogger logger = EELFManager.getInstance().getLogger(StringMatchPolicyReq.class); - protected static final EELFLogger metricsLogger = EELFManager.getInstance().getMetricsLogger(); - - /** - * Format Policy String Match request. - * - * @param refProp - * @param prop - * @return - * @throws IOException - */ - public static String format(RefProp refProp, ModelProperties prop) throws IOException { - Global global = prop.getGlobal(); - String service = global.getService(); - - StringMatch sm = prop.getType(StringMatch.class); - prop.setCurrentModelElementId(sm.getId()); - ObjectNode rootNode = (ObjectNode) refProp.getJsonTemplate("sm.template", service); - rootNode.put("policyName", prop.getCurrentPolicyScopeAndPolicyName()); - ObjectNode content = rootNode.with("content"); - appendServiceConfigurations(refProp, service, content, sm, prop); - - String stringMatchPolicyReq = rootNode.toString(); - logger.info("stringMatchPolicyReq=" + stringMatchPolicyReq); - return stringMatchPolicyReq; - } - - /** - * Add serviceConfigurations to json - * - * @param appendToNode - * @param sm - * @throws IOException - */ - public static void appendServiceConfigurations(RefProp refProp, String service, ObjectNode appendToNode, - StringMatch sm, ModelProperties prop) throws IOException { - // "serviceConfigurations":{ - ObjectNode scNodes = appendToNode.with("serviceConfigurations"); - - int index = 0; - if (sm != null && sm.getResourceGroups() != null) { - for (ResourceGroup resourceGroup : sm.getResourceGroups()) { - Iterator scItr = resourceGroup.getServiceConfigurations().iterator(); - - while (scItr.hasNext()) { - ServiceConfiguration sc = scItr.next(); - - // "ItemX":{ - index++; - String keyValue = "Item" + index; - ObjectNode scNode = (ObjectNode) refProp.getJsonTemplate("sm.sc.template", service); - scNodes.set(keyValue, scNode); - - // "rulegroup":"abc", - String rulegroupInd = refProp.getStringValue("sm.rulegroup", service); - String groupNumber = resourceGroup.getGroupNumber(); - if (rulegroupInd != null && rulegroupInd.equalsIgnoreCase("true") && groupNumber != null - && groupNumber.length() > 0) { - scNode.put("rulegroup", groupNumber); - } - - // "closedLoopControlName": - prop.setPolicyUniqueId(resourceGroup.getPolicyId()); - scNode.put("closedLoopControlName", prop.getControlNameAndPolicyUniqueId()); - - // "aaiMatchingFields" : ["VM_NAME"], - JsonUtil.addArrayField(scNode, "aaiMatchingFields", sc.getaaiMatchingFields()); - // "aaiSendFields" : ["VMID", "TenantID"], - JsonUtil.addArrayField(scNode, "aaiSendFields", sc.getaaiSendFields()); - - // "stringSet": [ - ArrayNode ssNode = scNode.putArray("stringSet"); - - for (Entry entry : sc.getStringSet().entrySet()) { - // exclude eventSourceType - if (!entry.getKey().equals("eventSourceType")) { - ssNode.add(entry.getKey()); - ssNode.add(entry.getValue()); - } - } - - // timeWindow": "0", - scNode.put("timeWindow", sc.getTimeWindow()); - // "ageLimit": "3600", - scNode.put("ageLimit", sc.getAgeLimit()); - // "createClosedLoopEventId" : "Initial", - scNode.put("createClosedLoopEventId", sc.getCreateClosedLoopEventId()); - // "outputEventName": "OnSet" - scNode.put("outputEventName", sc.getOutputEventName()); - } - } - } - } -} diff --git a/src/main/java/org/onap/clamp/clds/client/req/TcaMPolicyReq.java b/src/main/java/org/onap/clamp/clds/client/req/TcaMPolicyReq.java deleted file mode 100644 index f3106289..00000000 --- a/src/main/java/org/onap/clamp/clds/client/req/TcaMPolicyReq.java +++ /dev/null @@ -1,121 +0,0 @@ -/*- - * ============LICENSE_START======================================================= - * ONAP CLAMP - * ================================================================================ - * 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. - */ - -package org.onap.clamp.clds.client.req; - -import java.io.IOException; -import java.util.Iterator; - -import org.onap.clamp.clds.model.prop.Global; -import org.onap.clamp.clds.model.prop.ModelProperties; -import org.onap.clamp.clds.model.prop.Tca; -import org.onap.clamp.clds.model.prop.TcaItem; -import org.onap.clamp.clds.model.prop.TcaThreshhold; -import org.onap.clamp.clds.model.refprop.RefProp; - -import com.att.eelf.configuration.EELFLogger; -import com.att.eelf.configuration.EELFManager; -import com.fasterxml.jackson.core.JsonParseException; -import com.fasterxml.jackson.databind.JsonMappingException; -import com.fasterxml.jackson.databind.node.ArrayNode; -import com.fasterxml.jackson.databind.node.ObjectNode; - -/** - * Construct a Policy for Tca/MTca Service request given CLDS objects. - * - * - */ -public class TcaMPolicyReq { - protected static final EELFLogger logger = EELFManager.getInstance().getLogger(TcaMPolicyReq.class); - protected static final EELFLogger metricsLogger = EELFManager.getInstance().getMetricsLogger(); - - /** - * Format Tca Policy request - * - * @param refProp - * @param prop - * @return - * @throws JsonParseException - * @throws JsonMappingException - * @throws IOException - */ - public static String formatTca(RefProp refProp, ModelProperties prop) - throws JsonParseException, JsonMappingException, IOException { - Global global = prop.getGlobal(); - String service = global.getService(); - - Tca tca = prop.getType(Tca.class); - prop.setCurrentModelElementId(tca.getId()); - ObjectNode rootNode = (ObjectNode) refProp.getJsonTemplate("tca.template", service); - rootNode.put("policyName", prop.getCurrentPolicyScopeAndPolicyName()); - ObjectNode content = rootNode.with("content"); - appendSignatures(refProp, service, content, tca, prop); - - String tcaPolicyReq = rootNode.toString(); - logger.info("tcaPolicyReq=" + tcaPolicyReq); - return tcaPolicyReq; - } - - /** - * Add appendSignatures to json - * - * @param refProp - * @param service - * @param appendToNode - * @param tca - * @param prop - * @throws JsonParseException - * @throws JsonMappingException - * @throws IOException - */ - public static void appendSignatures(RefProp refProp, String service, ObjectNode appendToNode, Tca tca, - ModelProperties prop) throws JsonParseException, JsonMappingException, IOException { - // "signatures":{ - ArrayNode tcaNodes = appendToNode.withArray("signatures"); - for (TcaItem tcaItem : tca.getTcaItems()) { - ObjectNode tcaNode = (ObjectNode) refProp.getJsonTemplate("tca.signature.template", service); - tcaNode.put("useCaseName", tcaItem.getTcaName()); - tcaNode.put("signatureName", tcaItem.getTcaName() + "_" + tcaItem.getTcaUuId()); - tcaNode.put("signatureUuid", tcaItem.getTcaUuId()); - prop.setPolicyUniqueId(tcaItem.getPolicyId()); - tcaNode.put("closedLoopControlName", prop.getControlNameAndPolicyUniqueId()); - tcaNode.put("severity", tcaItem.getSeverity()); - tcaNode.put("maxInterval", tcaItem.getInterval()); - tcaNode.put("minMessageViolations", tcaItem.getViolations()); - - tcaNodes.add(tcaNode); - Iterator scItr = tcaItem.getTcaThreshholds().iterator(); - while (scItr.hasNext()) { - TcaThreshhold tcaThreshhold = scItr.next(); - // "thresholds": [ - ArrayNode thNodes = tcaNode.withArray("thresholds"); - ObjectNode thNode = thNodes.addObject(); - thNode.put("fieldPath", tcaThreshhold.getFieldPath()); - thNode.put("thresholdName", tcaThreshhold.getMetric()); - thNode.put("thresholdValue", tcaThreshhold.getThreshhold()); - thNode.put("direction", tcaThreshhold.getOperator()); - } - } - } - -} \ No newline at end of file diff --git a/src/main/java/org/onap/clamp/clds/client/req/TcaRequestFormatter.java b/src/main/java/org/onap/clamp/clds/client/req/TcaRequestFormatter.java new file mode 100644 index 00000000..3fbf8739 --- /dev/null +++ b/src/main/java/org/onap/clamp/clds/client/req/TcaRequestFormatter.java @@ -0,0 +1,166 @@ +/*- + * ============LICENSE_START======================================================= + * ONAP CLAMP + * ================================================================================ + * 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. + */ + +package org.onap.clamp.clds.client.req; + +import com.att.eelf.configuration.EELFLogger; +import com.att.eelf.configuration.EELFManager; +import com.fasterxml.jackson.databind.node.ArrayNode; +import com.fasterxml.jackson.databind.node.ObjectNode; +import com.fasterxml.jackson.dataformat.yaml.snakeyaml.Yaml; + +import java.util.Map; + +import org.onap.clamp.clds.exception.TcaRequestFormatterException; +import org.onap.clamp.clds.model.prop.ModelProperties; +import org.onap.clamp.clds.model.prop.Tca; +import org.onap.clamp.clds.model.prop.TcaItem; +import org.onap.clamp.clds.model.prop.TcaThreshold; +import org.onap.clamp.clds.model.refprop.RefProp; + +/** + * Construct the requests for TCA policy and SDC. + * + */ +public class TcaRequestFormatter { + protected static final EELFLogger logger = EELFManager.getInstance().getLogger(TcaRequestFormatter.class); + protected static final EELFLogger metricsLogger = EELFManager.getInstance().getMetricsLogger(); + + /** + * Hide the default constructor. + */ + private TcaRequestFormatter() { + + } + + /** + * Format Tca Policy JSON request. + * + * @param refProp + * The refProp generally created by Spring, it's an access on the + * clds-references.properties file + * @param modelProperties + * The Model Prop created from BPMN JSON and BPMN properties JSON + * @return The Json string containing that should be sent to policy + */ + public static String createPolicyJson(RefProp refProp, ModelProperties modelProperties) { + try { + String service = modelProperties.getGlobal().getService(); + + Tca tca = modelProperties.getType(Tca.class); + modelProperties.setCurrentModelElementId(tca.getId()); + ObjectNode rootNode = (ObjectNode) refProp.getJsonTemplate("tca.template", service); + ((ObjectNode) rootNode.get("cdap-tca-hi-lo_policy").get("metricsPerEventName").get(0)).put("policyName", + modelProperties.getCurrentPolicyScopeAndPolicyName()); + ((ObjectNode) rootNode.get("cdap-tca-hi-lo_policy").get("metricsPerEventName").get(0)).put("eventName", + tca.getTcaItem().getEventName()); + + ObjectNode thresholdsParent = ((ObjectNode) rootNode.get("cdap-tca-hi-lo_policy").get("metricsPerEventName") + .get(0)); + + addThresholds(refProp, service, thresholdsParent, tca.getTcaItem(), modelProperties); + + String tcaPolicyReq = rootNode.toString(); + logger.info("tcaPolicyReq=" + tcaPolicyReq); + return tcaPolicyReq; + } catch (Exception e) { + throw new TcaRequestFormatterException("Exception caught when attempting to create the policy JSON", e); + } + } + + /** + * Add threshold values to the existing policy JSON. + * + * @param refProp + * The refProp generally created by Spring, it's an access on the + * clds-references.properties file + * @param service + * The Service value extracted from Global section of the Bpmn + * Properties JSON + * @param appendToNode + * The JSON structure from where the thresholds section must be + * added + * @param tcaItem + * The TCA item contained in the Tca object + * @param modelProperties + * The Model Properties created from BPMN JSON and BPMN + * properties JSON + */ + private static void addThresholds(RefProp refProp, String service, ObjectNode appendToNode, TcaItem tcaItem, + ModelProperties modelProperties) { + try { + ArrayNode tcaNodes = appendToNode.withArray("thresholds"); + ObjectNode tcaNode = (ObjectNode) refProp.getJsonTemplate("tca.thresholds.template", service); + + for (TcaThreshold tcaThreshold : tcaItem.getTcaThresholds()) { + tcaNode.put("controlLoopSchema", tcaThreshold.getControlLoopSchema()); + tcaNode.put("closedLoopControlName", modelProperties.getControlNameAndPolicyUniqueId()); + tcaNode.put("fieldPath", tcaThreshold.getFieldPath()); + tcaNode.put("thresholdValue", tcaThreshold.getThreshold()); + tcaNode.put("direction", tcaThreshold.getOperator()); + tcaNode.put("closedLoopEventStatus", tcaThreshold.getClosedLoopEventStatus()); + tcaNodes.add(tcaNode); + } + } catch (Exception e) { + throw new TcaRequestFormatterException("Exception caught when attempting to create the thresholds JSON", e); + } + } + + /** + * This method updates the blueprint that is received in the UI with the TCA + * Json. + * + * @param refProp + * * The refProp generally created by Spring, it's an access on + * the clds-references.properties file + * @param modelProperties + * The Model Prop created from BPMN JSON and BPMN properties JSON + * @param yamlValue + * The yaml string received from the UI + * @return The updated YAML as a string + */ + public static String updatedBlueprintWithConfiguration(RefProp refProp, ModelProperties modelProperties, + String yamlValue) { + try { + String jsonPolicy = createPolicyJson(refProp, modelProperties); + + logger.info("Yaml that will be updated:" + yamlValue); + Yaml yaml = new Yaml(); + + Map loadedYaml = (Map) yaml.load(yamlValue); + + Map nodeTemplates = (Map) loadedYaml.get("node_templates"); + Map tcaObject = (Map) nodeTemplates.get("tca_tca"); + Map propsObject = (Map) tcaObject.get("properties"); + Map appPreferences = (Map) propsObject.get("app_preferences"); + appPreferences.put("tca_policy", jsonPolicy); + + String blueprint = yaml.dump(loadedYaml); + logger.info("Yaml updated:" + blueprint); + + return blueprint; + } catch (Exception e) { + throw new TcaRequestFormatterException("Exception caught when attempting to update the blueprint", e); + } + } +} \ No newline at end of file diff --git a/src/main/java/org/onap/clamp/clds/config/CldsConfiguration.java b/src/main/java/org/onap/clamp/clds/config/CldsConfiguration.java index a6baa969..6b7d337e 100644 --- a/src/main/java/org/onap/clamp/clds/config/CldsConfiguration.java +++ b/src/main/java/org/onap/clamp/clds/config/CldsConfiguration.java @@ -42,8 +42,6 @@ import org.onap.clamp.clds.client.OperationalPolicyDeleteDelegate; import org.onap.clamp.clds.client.PolicyClient; import org.onap.clamp.clds.client.SdcCatalogServices; import org.onap.clamp.clds.client.SdcSendReqDelegate; -import org.onap.clamp.clds.client.StringMatchPolicyDelegate; -import org.onap.clamp.clds.client.StringMatchPolicyDeleteDelegate; import org.onap.clamp.clds.client.TcaPolicyDelegate; import org.onap.clamp.clds.client.TcaPolicyDeleteDelegate; import org.onap.clamp.clds.dao.CldsDao; @@ -128,16 +126,6 @@ public class CldsConfiguration { return new OperationalPolicyDeleteDelegate(); } - @Bean(name = "stringMatchPolicyDelegate") - public StringMatchPolicyDelegate getStringMatchPolicyDelegate() { - return new StringMatchPolicyDelegate(); - } - - @Bean(name = "stringMatchPolicyDeleteDelegate") - public StringMatchPolicyDeleteDelegate getStringMatchPolicyDeleteDelegate() { - return new StringMatchPolicyDeleteDelegate(); - } - @Bean(name = "sdcCatalogServices") public SdcCatalogServices getSdcCatalogServices() { return new SdcCatalogServices(); diff --git a/src/main/java/org/onap/clamp/clds/model/prop/Collector.java b/src/main/java/org/onap/clamp/clds/exception/TcaRequestFormatterException.java similarity index 52% rename from src/main/java/org/onap/clamp/clds/model/prop/Collector.java rename to src/main/java/org/onap/clamp/clds/exception/TcaRequestFormatterException.java index be30f3ec..055b47ff 100644 --- a/src/main/java/org/onap/clamp/clds/model/prop/Collector.java +++ b/src/main/java/org/onap/clamp/clds/exception/TcaRequestFormatterException.java @@ -5,50 +5,59 @@ * 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. + * 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 + * + * 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. */ -package org.onap.clamp.clds.model.prop; - -import com.att.eelf.configuration.EELFLogger; -import com.att.eelf.configuration.EELFManager; -import com.fasterxml.jackson.databind.JsonNode; +package org.onap.clamp.clds.exception; /** - * Parse Collector json properties. + * New exception to capture TcaRequestFormatterException errors. + * */ -public class Collector extends AbstractModelElement { - protected static final EELFLogger logger = EELFManager.getInstance().getLogger(Collector.class); - protected static final EELFLogger auditLogger = EELFManager.getInstance().getAuditLogger(); +public class TcaRequestFormatterException extends RuntimeException { - private static final String TYPE_COLLECTOR = "collector"; + /** + * + */ + private static final long serialVersionUID = 169875373143236667L; /** - * Parse Collector given json node. - * - * @param modelBpmn - * @param modelJson + * This constructor can be used to create a new + * TcaRequestFormatterException. + * + * @param message + * A string message detailing the problem + * @param e + * The exception sent by the code */ - public Collector(ModelProperties modelProp, ModelBpmn modelBpmn, JsonNode modelJson) { - super(TYPE_COLLECTOR, modelProp, modelBpmn, modelJson); - topicPublishes = getValueByName("topicPublishes"); + public TcaRequestFormatterException(String message, Throwable e) { + super(message, e); } - public static final String getType() { - return TYPE_COLLECTOR; + /** + * This constructor can be used to create a new + * TcaRequestFormatterException. Use this constructor only if you are + * creating a new exception stack, not if an exception was already raised by + * another code. + * + * @param message + * A string message detailing the problem + */ + public TcaRequestFormatterException(String message) { + super(message); } } diff --git a/src/main/java/org/onap/clamp/clds/model/prop/AbstractModelElement.java b/src/main/java/org/onap/clamp/clds/model/prop/AbstractModelElement.java index 7038dc6c..9ced0199 100644 --- a/src/main/java/org/onap/clamp/clds/model/prop/AbstractModelElement.java +++ b/src/main/java/org/onap/clamp/clds/model/prop/AbstractModelElement.java @@ -33,7 +33,7 @@ import java.util.List; /** * Provide base ModelElement functionality. Perform base parsing of properties - * for a ModelElement (such as, Collector, StringMatch, Policy, Tca, Holmes, + * for a ModelElement (such as, VesCollector, Policy, Tca, Holmes, * ...) */ public abstract class AbstractModelElement { @@ -54,7 +54,7 @@ public abstract class AbstractModelElement { /** * Perform base parsing of properties for a ModelElement (such as, - * Collector, StringMatch, Policy and Tca) + * VesCollector, Policy and Tca) * * @param type * @param modelProp diff --git a/src/main/java/org/onap/clamp/clds/model/prop/ModelBpmn.java b/src/main/java/org/onap/clamp/clds/model/prop/ModelBpmn.java index ae7028dc..f3d344a7 100644 --- a/src/main/java/org/onap/clamp/clds/model/prop/ModelBpmn.java +++ b/src/main/java/org/onap/clamp/clds/model/prop/ModelBpmn.java @@ -45,9 +45,8 @@ import org.onap.clamp.clds.service.CldsService; /** * Parse Model BPMN properties. *

- * Example json: {"collector":[{"id":"Collector_11r50j1", - * "from":"StartEvent_1"}],"stringMatch":[{"id":"StringMatch_0h6cbdv"}],"policy" - * :[{"id":"Policy_0oxeocn", "from":"StringMatch_0h6cbdv"}]} + * Example json: {"policy" + * :[{"id":"Policy_0oxeocn", "from":"StartEvent_1"}]} */ public class ModelBpmn { protected static final EELFLogger logger = EELFManager.getInstance() @@ -77,7 +76,7 @@ public class ModelBpmn { ObjectMapper objectMapper = new ObjectMapper(); ObjectNode root = objectMapper.readValue(modelBpmnPropText, ObjectNode.class); // iterate over each entry like: - // "collector":[{"id":"Collector_11r50j1","from":"StartEvent_1"}] + // "Policy":[{"id":"Policy","from":"StartEvent_1"}] Iterator> entryItr = root.fields(); List bpmnElementIdList = new ArrayList<>(); while (entryItr.hasNext()) { @@ -86,7 +85,7 @@ public class ModelBpmn { String type = entry.getKey(); ArrayNode arrayNode = (ArrayNode) entry.getValue(); // process each id/from object, like: - // {"id":"Collector_11r50j1","from":"StartEvent_1"} + // {"id":"Policy","from":"StartEvent_1"} for (JsonNode anArrayNode : arrayNode) { ObjectNode node = (ObjectNode) anArrayNode; String id = node.get("id").asText(); @@ -123,11 +122,11 @@ public class ModelBpmn { } /** - * This method verifies if the ModelElement Type (collector, holmes, tca, + * This method verifies if the ModelElement Type (holmes, tca, * ...) is in the list. * * @param type - * A model Element type (tca, collector, ...) + * A model Element type (tca, ...) * @return true if the element is found or false otherwise */ public boolean isModelElementTypeInList(String type) { diff --git a/src/main/java/org/onap/clamp/clds/model/prop/ModelBpmnEntry.java b/src/main/java/org/onap/clamp/clds/model/prop/ModelBpmnEntry.java index 210795be..dc668229 100644 --- a/src/main/java/org/onap/clamp/clds/model/prop/ModelBpmnEntry.java +++ b/src/main/java/org/onap/clamp/clds/model/prop/ModelBpmnEntry.java @@ -29,9 +29,8 @@ import com.att.eelf.configuration.EELFManager; /** * Model BPMN property entry *

- * Example json: {"collector":[{"id":"Collector_11r50j1", - * "from":"StartEvent_1"}],"stringMatch":[{"id":"StringMatch_0h6cbdv"],"policy": - * [{"id":"Policy_0oxeocn", "from":"StringMatch_0h6cbdv"}]} + * Example json: {"policy": + * [{"id":"Policy_0oxeocn", "from":"StartEvent_1"}]} */ public class ModelBpmnEntry { protected static final EELFLogger logger = EELFManager.getInstance().getLogger(ModelBpmnEntry.class); diff --git a/src/main/java/org/onap/clamp/clds/model/prop/ModelProperties.java b/src/main/java/org/onap/clamp/clds/model/prop/ModelProperties.java index dc0de326..7111f1dd 100644 --- a/src/main/java/org/onap/clamp/clds/model/prop/ModelProperties.java +++ b/src/main/java/org/onap/clamp/clds/model/prop/ModelProperties.java @@ -72,10 +72,9 @@ public class ModelProperties { static { synchronized (lock) { - modelElementClasses.put(Collector.class, Collector.getType()); modelElementClasses.put(Policy.class, Policy.getType()); - modelElementClasses.put(StringMatch.class, StringMatch.getType()); modelElementClasses.put(Tca.class, Tca.getType()); + modelElementClasses.put(Holmes.class, Holmes.getType()); } } @@ -136,7 +135,7 @@ public class ModelProperties { .newInstance(this, modelBpmn, modelJson))); } catch (InstantiationException | NoSuchMethodException | IllegalAccessException | InvocationTargetException e) { - logger.warn("Unable to instantiate a ModelElement, exception follows: " + e); + logger.warn("Unable to instantiate a ModelElement, exception follows: ", e); } }); } diff --git a/src/main/java/org/onap/clamp/clds/model/prop/ResourceGroup.java b/src/main/java/org/onap/clamp/clds/model/prop/ResourceGroup.java index 7395ced0..8b2dbeb8 100644 --- a/src/main/java/org/onap/clamp/clds/model/prop/ResourceGroup.java +++ b/src/main/java/org/onap/clamp/clds/model/prop/ResourceGroup.java @@ -35,7 +35,7 @@ import java.util.List; * Parse Resource Group json properties. * * Example json: - * {"StringMatch_0aji7go":{"Group1":[{"name":"rgname","value":"1493749598520"},{ + * {"TCA_0aji7go":{"Group1":[{"name":"rgname","value":"1493749598520"},{ * "name":"rgfriendlyname","value":"Group1"},{"name":"policyName","value": * "Policy1"},{"name":"policyId","value":"1"},{"serviceConfigurations":[[{"name" * :"aaiMatchingFields","value":["complex.city","vserver.vserver-name"]},{"name" diff --git a/src/main/java/org/onap/clamp/clds/model/prop/ServiceConfiguration.java b/src/main/java/org/onap/clamp/clds/model/prop/ServiceConfiguration.java index f15d7019..418afbb9 100644 --- a/src/main/java/org/onap/clamp/clds/model/prop/ServiceConfiguration.java +++ b/src/main/java/org/onap/clamp/clds/model/prop/ServiceConfiguration.java @@ -33,10 +33,10 @@ import com.att.eelf.configuration.EELFManager; import com.fasterxml.jackson.databind.JsonNode; /** - * Parse serviceConfigurations from StringMatch json properties. + * Parse serviceConfigurations from Tca json properties. *

* Example json: - * {"StringMatch_0aji7go":{"Group1":[{"name":"rgname","value":"1493749598520"},{ + * {"Tca_0aji7go":{"Group1":[{"name":"rgname","value":"1493749598520"},{ * "name":"rgfriendlyname","value":"Group1"},{"name":"policyName","value": * "Policy1"},{"name":"policyId","value":"1"},{"serviceConfigurations":[[{"name" * :"aaiMatchingFields","value":["complex.city","vserver.vserver-name"]},{"name" diff --git a/src/main/java/org/onap/clamp/clds/model/prop/StringMatch.java b/src/main/java/org/onap/clamp/clds/model/prop/StringMatch.java deleted file mode 100644 index b74e7d13..00000000 --- a/src/main/java/org/onap/clamp/clds/model/prop/StringMatch.java +++ /dev/null @@ -1,98 +0,0 @@ -/*- - * ============LICENSE_START======================================================= - * ONAP CLAMP - * ================================================================================ - * 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. - */ - -package org.onap.clamp.clds.model.prop; - -import com.fasterxml.jackson.databind.JsonNode; - -import java.util.ArrayList; -import java.util.Iterator; -import java.util.List; - -/** - * Parse StringMatch json properties. - *

- * Example json: - * {"StringMatch_0aji7go":{"Group1":[{"name":"rgname","value":"1493749598520"},{ - * "name":"rgfriendlyname","value":"Group1"},{"name":"policyName","value": - * "Policy1"},{"name":"policyId","value":"1"},{"serviceConfigurations":[[{"name" - * :"aaiMatchingFields","value":["complex.city","vserver.vserver-name"]},{"name" - * :"aaiSendFields","value":["complex.city","vserver.vserver-name"]},{"name": - * "eventSeverity","value":["OK"]},{"name":"eventSourceType","value":[""]},{ - * "name":"timeWindow","value":["100"]},{"name":"ageLimit","value":["100"]},{ - * "name":"createClosedLoopEventId","value":["Initial"]},{"name": - * "outputEventName","value":["ONSET"]}]]}],"Group2":[{"name":"rgname","value": - * "1493749665149"},{"name":"rgfriendlyname","value":"Group2"},{"name": - * "policyName","value":"Policy2"},{"name":"policyId","value":"2"},{ - * "serviceConfigurations":[[{"name":"aaiMatchingFields","value":[ - * "cloud-region.identity-url","vserver.vserver-name"]},{"name":"aaiSendFields", - * "value":["cloud-region.identity-url","vserver.vserver-name"]},{"name": - * "eventSeverity","value":["NORMAL"]},{"name":"eventSourceType","value":[""]},{ - * "name":"timeWindow","value":["1000"]},{"name":"ageLimit","value":["1000"]},{ - * "name":"createClosedLoopEventId","value":["Initial"]},{"name": - * "outputEventName","value":["ONSET"]}],[{"name":"aaiMatchingFields","value":[ - * "generic-vnf.vnf-name","vserver.vserver-name"]},{"name":"aaiSendFields", - * "value":["generic-vnf.vnf-name","vserver.vserver-name"]},{"name": - * "eventSeverity","value":["CRITICAL"]},{"name":"eventSourceType","value":[""]} - * ,{"name":"timeWindow","value":["3000"]},{"name":"ageLimit","value":["3000"]}, - * {"name":"createClosedLoopEventId","value":["Initial"]},{"name": - * "outputEventName","value":["ABATED"]}]]}]}} - * - */ -public class StringMatch extends AbstractModelElement { - - private List resourceGroups; - - private static final String TYPE_STRING_MATCH = "stringMatch"; - - /** - * Parse StringMatch given json node. - * - * @param modelBpmn - * @param modelJson - */ - public StringMatch(ModelProperties modelProp, ModelBpmn modelBpmn, JsonNode modelJson) { - super(TYPE_STRING_MATCH, modelProp, modelBpmn, modelJson); - - // process Server_Configurations - if (modelElementJsonNode != null) { - Iterator itr = modelElementJsonNode.elements(); - resourceGroups = new ArrayList<>(); - while (itr.hasNext()) { - resourceGroups.add(new ResourceGroup(itr.next())); - } - } - } - - /** - * @return the resourceGroups - */ - public List getResourceGroups() { - return resourceGroups; - } - - public static final String getType() { - return TYPE_STRING_MATCH; - } - -} diff --git a/src/main/java/org/onap/clamp/clds/model/prop/Tca.java b/src/main/java/org/onap/clamp/clds/model/prop/Tca.java index f7bbac0d..4fd6b595 100644 --- a/src/main/java/org/onap/clamp/clds/model/prop/Tca.java +++ b/src/main/java/org/onap/clamp/clds/model/prop/Tca.java @@ -27,25 +27,8 @@ import com.att.eelf.configuration.EELFLogger; import com.att.eelf.configuration.EELFManager; import com.fasterxml.jackson.databind.JsonNode; -import java.util.ArrayList; -import java.util.Iterator; -import java.util.List; - /** - * Parse Tca json properties. - * - * Example json: - * {"TCA_0lm6cix":{"Narra":[{"name":"tname","value":"Narra"},{"name":"tcaEnab", - * "value":"on"},{"name":"tcaPol","value":"Polcicy1"},{"name":"tcaPolId","value" - * :"1"},{"name":"tcaInt","value":"1"},{"name":"tcaSev","value":"Critical"},{ - * "name":"tcaVio","value":"1"},{"serviceConfigurations":[["FIELDPATH_test_1", - * ">","4"],["FIELDPATH_test_1","=","5"]]}],"Srini":[{"name":"tname","value": - * "Srini"},{"name":"tcaEnab","value":"on"},{"name":"tcaPol","value":"Policy1"}, - * {"name":"tcaPolId","value":"1"},{"name":"tcaInt","value":"1"},{"name": - * "tcaSev","value":"Major"},{"name":"tcaVio","value":"1"},{ - * "serviceConfigurations":[["FIELDPATH_test_2","=","3"],["FIELDPATH_test_1",">" - * ,"2"]]}]}} - * + * Parse ONAP Tca json properties. * */ public class Tca extends AbstractModelElement { @@ -53,7 +36,7 @@ public class Tca extends AbstractModelElement { protected static final EELFLogger logger = EELFManager.getInstance().getLogger(Tca.class); protected static final EELFLogger auditLogger = EELFManager.getInstance().getAuditLogger(); - private List tcaItems; + private TcaItem tcaItem; private static final String TYPE_TCA = "tca"; @@ -69,16 +52,12 @@ public class Tca extends AbstractModelElement { // process Server_Configurations if (modelElementJsonNode != null) { - Iterator itr = modelElementJsonNode.elements(); - tcaItems = new ArrayList<>(); - while (itr.hasNext()) { - tcaItems.add(new TcaItem(itr.next())); - } + tcaItem = new TcaItem(modelElementJsonNode.elements().next()); } } - public List getTcaItems() { - return tcaItems; + public TcaItem getTcaItem() { + return tcaItem; } public static final String getType() { diff --git a/src/main/java/org/onap/clamp/clds/model/prop/TcaItem.java b/src/main/java/org/onap/clamp/clds/model/prop/TcaItem.java index f104b091..79da2db0 100644 --- a/src/main/java/org/onap/clamp/clds/model/prop/TcaItem.java +++ b/src/main/java/org/onap/clamp/clds/model/prop/TcaItem.java @@ -23,45 +23,28 @@ package org.onap.clamp.clds.model.prop; -import java.util.ArrayList; -import java.util.Iterator; -import java.util.List; - import com.att.eelf.configuration.EELFLogger; import com.att.eelf.configuration.EELFManager; import com.fasterxml.jackson.databind.JsonNode; +import java.util.ArrayList; +import java.util.Iterator; +import java.util.List; + /** - * Parse Tca Item json properties. - * - * Example json: - * {"TCA_0lm6cix":{"Narra":[{"name":"tname","value":"Narra"},{"name":"tcaEnab", - * "value":"on"},{"name":"tcaPol","value":"Polcicy1"},{"name":"tcaPolId","value" - * :"1"},{"name":"tcaInt","value":"1"},{"name":"tcaSev","value":"Critical"},{ - * "name":"tcaVio","value":"1"},{"serviceConfigurations":[["FIELDPATH_test_1", - * ">","4"],["FIELDPATH_test_1","=","5"]]}],"Srini":[{"name":"tname","value": - * "Srini"},{"name":"tcaEnab","value":"on"},{"name":"tcaPol","value":"Policy1"}, - * {"name":"tcaPolId","value":"1"},{"name":"tcaInt","value":"1"},{"name": - * "tcaSev","value":"Major"},{"name":"tcaVio","value":"1"},{ - * "serviceConfigurations":[["FIELDPATH_test_2","=","3"],["FIELDPATH_test_1",">" - * ,"2"]]}]}} - * + * Parse ONAP Tca Item json properties. * */ public class TcaItem { - protected static final EELFLogger logger = EELFManager.getInstance().getLogger(TcaItem.class); + protected static final EELFLogger logger = EELFManager.getInstance().getLogger(TcaItem.class); protected static final EELFLogger auditLogger = EELFManager.getInstance().getAuditLogger(); - private String tcaName; - private String tcaUuId; - private String nfNamingCode; - private String tcaEnable; - private String policyId; - private Integer interval; - private String severity; - private Integer violations; - private List tcaThreshholds; + private String tcaName; + private String tcaUuId; + private String policyId; + private String eventName; + private List tcaThresholds; /** * Parse Tca Item given json node @@ -72,23 +55,14 @@ public class TcaItem { tcaName = AbstractModelElement.getValueByName(node, "tname"); tcaUuId = AbstractModelElement.getValueByName(node, "tuuid"); - nfNamingCode = AbstractModelElement.getValueByName(node, "tnfc"); - tcaEnable = AbstractModelElement.getValueByName(node, "tcaEnab"); policyId = AbstractModelElement.getValueByName(node, "tcaPolId"); - if (AbstractModelElement.getValueByName(node, "tcaInt") != null) { - interval = Integer.valueOf(AbstractModelElement.getValueByName(node, "tcaInt")); - } - severity = AbstractModelElement.getValueByName(node, "tcaSev"); - if (AbstractModelElement.getValueByName(node, "tcaVio") != null) { - violations = Integer.valueOf(AbstractModelElement.getValueByName(node, "tcaVio")); - } - + eventName = AbstractModelElement.getValueByName(node, "eventName"); // process service Configurations JsonNode serviceConfigurationsNode = node.get(node.size() - 1).get("serviceConfigurations"); Iterator itr = serviceConfigurationsNode.elements(); - tcaThreshholds = new ArrayList(); + tcaThresholds = new ArrayList<>(); while (itr.hasNext()) { - tcaThreshholds.add(new TcaThreshhold(itr.next())); + tcaThresholds.add(new TcaThreshold(itr.next())); } } @@ -108,22 +82,6 @@ public class TcaItem { this.tcaUuId = tcaUuId; } - public String getNfNamingCode() { - return nfNamingCode; - } - - public void setNfNamingCode(String nfNamingCode) { - this.nfNamingCode = nfNamingCode; - } - - public String getTcaEnable() { - return tcaEnable; - } - - public void setTcaEnable(String tcaEnable) { - this.tcaEnable = tcaEnable; - } - public String getPolicyId() { return policyId; } @@ -132,32 +90,16 @@ public class TcaItem { this.policyId = policyId; } - public Integer getInterval() { - return interval; - } - - public void setInterval(Integer interval) { - this.interval = interval; - } - - public String getSeverity() { - return severity; - } - - public void setSeverity(String severity) { - this.severity = severity; - } - - public Integer getViolations() { - return violations; + public List getTcaThresholds() { + return tcaThresholds; } - public void setViolations(Integer violations) { - this.violations = violations; + public String getEventName() { + return eventName; } - public List getTcaThreshholds() { - return tcaThreshholds; + public void setEventName(String eventName) { + this.eventName = eventName; } } diff --git a/src/main/java/org/onap/clamp/clds/model/prop/TcaThreshhold.java b/src/main/java/org/onap/clamp/clds/model/prop/TcaThreshold.java similarity index 57% rename from src/main/java/org/onap/clamp/clds/model/prop/TcaThreshhold.java rename to src/main/java/org/onap/clamp/clds/model/prop/TcaThreshold.java index 39369f17..43bdb5c1 100644 --- a/src/main/java/org/onap/clamp/clds/model/prop/TcaThreshhold.java +++ b/src/main/java/org/onap/clamp/clds/model/prop/TcaThreshold.java @@ -28,59 +28,42 @@ import com.att.eelf.configuration.EELFManager; import com.fasterxml.jackson.databind.JsonNode; /** - * Parse Tca Threshhold json properties. - * - * Example json: - * {"TCA_0lm6cix":{"Narra":[{"name":"tname","value":"Narra"},{"name":"tcaEnab", - * "value":"on"},{"name":"tcaPol","value":"Polcicy1"},{"name":"tcaPolId","value" - * :"1"},{"name":"tcaInt","value":"1"},{"name":"tcaSev","value":"Critical"},{ - * "name":"tcaVio","value":"1"},{"serviceConfigurations":[["FIELDPATH_test_1", - * ">","4"],["FIELDPATH_test_1","=","5"]]}],"Srini":[{"name":"tname","value": - * "Srini"},{"name":"tcaEnab","value":"on"},{"name":"tcaPol","value":"Policy1"}, - * {"name":"tcaPolId","value":"1"},{"name":"tcaInt","value":"1"},{"name": - * "tcaSev","value":"Major"},{"name":"tcaVio","value":"1"},{ - * "serviceConfigurations":[["FIELDPATH_test_2","=","3"],["FIELDPATH_test_1",">" - * ,"2"]]}]}} - * + * Parse ONAP Tca Threshold json properties. * */ -public class TcaThreshhold { +public class TcaThreshold { - protected static final EELFLogger logger = EELFManager.getInstance().getLogger(TcaThreshhold.class); + protected static final EELFLogger logger = EELFManager.getInstance().getLogger(TcaThreshold.class); protected static final EELFLogger auditLogger = EELFManager.getInstance().getAuditLogger(); - private String metric; - private String fieldPath; - private String operator; - private Integer threshhold; + private String fieldPath; + private String operator; + private Integer threshold; + private String closedLoopEventStatus; + private String controlLoopSchema; /** * Parse Tca Threshhold given json node * * @param node */ - public TcaThreshhold(JsonNode node) { + public TcaThreshold(JsonNode node) { if (node.get(0) != null) { - metric = node.get(0).asText(); + fieldPath = node.get(0).asText(); } if (node.get(1) != null) { operator = node.get(1).asText(); } if (node.get(2) != null) { - threshhold = Integer.valueOf(node.get(2).asText()); + threshold = Integer.valueOf(node.get(2).asText()); } if (node.get(3) != null) { - fieldPath = node.get(3).asText(); + controlLoopSchema = node.get(3).asText(); + } + if (node.get(4) != null) { + closedLoopEventStatus = node.get(4).asText(); } - } - - public String getMetric() { - return metric; - } - - public void setMetric(String metric) { - this.metric = metric; } public String getFieldPath() { @@ -99,12 +82,27 @@ public class TcaThreshhold { this.operator = operator; } - public Integer getThreshhold() { - return threshhold; + public Integer getThreshold() { + return threshold; } - public void setThreshhold(Integer threshhold) { - this.threshhold = threshhold; + public void setThreshold(Integer threshold) { + this.threshold = threshold; } + public String getClosedLoopEventStatus() { + return closedLoopEventStatus; + } + + public void setClosedLoopEventStatus(String closedLoopEventStatus) { + this.closedLoopEventStatus = closedLoopEventStatus; + } + + public String getControlLoopSchema() { + return controlLoopSchema; + } + + public void setControlLoopSchema(String controlLoopSchema) { + this.controlLoopSchema = controlLoopSchema; + } } diff --git a/src/main/java/org/onap/clamp/clds/service/CldsTemplateService.java b/src/main/java/org/onap/clamp/clds/service/CldsTemplateService.java index e6e7325a..e29b1887 100644 --- a/src/main/java/org/onap/clamp/clds/service/CldsTemplateService.java +++ b/src/main/java/org/onap/clamp/clds/service/CldsTemplateService.java @@ -65,8 +65,6 @@ import org.springframework.beans.factory.annotation.Value; @Path("/cldsTempate") public class CldsTemplateService extends SecureServiceBase { - private static final String COLLECTOR_KEY = "Collector"; - private static final String STRING_MATCH_KEY = "StringMatch"; private static final String POLICY_KEY = "Policy"; @Value("${CLDS_PERMISSION_TYPE_TEMPLATE:permission-type-template}") @@ -314,16 +312,12 @@ public class CldsTemplateService extends SecureServiceBase { if (keyPropName != null && keyPropName.equalsIgnoreCase(currElementId)) { ArrayNode arrayNode = (ArrayNode) entry.getValue(); // process each id/from object, like: - // {"id":"Collector_11r50j1", "from":"StartEvent_1"} + // {"id":"Policy_11r50j1", "from":"StartEvent_1"} for (JsonNode anArrayNode : arrayNode) { ObjectNode node = (ObjectNode) anArrayNode; String valueNode = node.get("value").asText(); logger.info("value of node:" + valueNode); - if (keyPropName.startsWith(COLLECTOR_KEY)) { - valueNode = COLLECTOR_KEY + "_" + valueNode; - } else if (keyPropName.startsWith(STRING_MATCH_KEY)) { - valueNode = STRING_MATCH_KEY + "_" + valueNode; - } else if (keyPropName.startsWith(POLICY_KEY)) { + if (keyPropName.startsWith(POLICY_KEY)) { valueNode = POLICY_KEY + "_" + valueNode; } bpmnIoIdsMap.put(keyPropName, valueNode); diff --git a/src/main/resources/META-INF/resources/designer/css/app.css b/src/main/resources/META-INF/resources/designer/css/app.css index 333c9666..e387dc03 100644 --- a/src/main/resources/META-INF/resources/designer/css/app.css +++ b/src/main/resources/META-INF/resources/designer/css/app.css @@ -170,20 +170,18 @@ svg:not(:root) { } /* 'î ¡' */ .define-path:before{ - content: url('../images/DefinePath.png'); + content: url('../images/DefinePath.png'); position:relative; /*or absolute*/ z-index:100000; /*a number that's more than the modal box*/ } /* 'î ¡' */ -.define-decision:before{ +.define-decision:before{ content: url('../images/DefineDecision.png'); position:relative; /*or absolute*/ z-index:100000; /*a number that's more than the modal box*/ } /* 'î ¡' */ .icon-initial-node:before{ content: url('../images/InitialProcess.png'); } /* 'î ¡' */ -.icon-collector-node:before{ content: url('../images/clds-collector-icon.png'); } /* 'î ¡' */ .icon-holmes-node:before{ content: url('../images/clds-holmes-icon.png'); } /* 'î ¡' */ .icon-ves-collector-node:before{ content: url('../images/clds-ves-collector-icon.png'); } /* 'î ¡' */ -.icon-stringmatch-node:before{ content: url('../images/clds-string-match-icon.png'); } /* 'î ¡' */ .icon-tca-node:before{ content: url('../images/clds-tca-icon.png'); } /* 'î ¡' */ .icon-policy-node:before{ content: url('../images/clds-policy-icon.png'); } /* 'î ¡' */ .icon-goc-node:before{ content: url('../images/GOC.png'); } /* 'î ¡' */ diff --git a/src/main/resources/META-INF/resources/designer/images/clds-string-match-icon.png b/src/main/resources/META-INF/resources/designer/images/clds-string-match-icon.png deleted file mode 100644 index 6b00414f..00000000 Binary files a/src/main/resources/META-INF/resources/designer/images/clds-string-match-icon.png and /dev/null differ diff --git a/src/main/resources/META-INF/resources/designer/index.js b/src/main/resources/META-INF/resources/designer/index.js index 89a688ac..33b84e6f 100644 --- a/src/main/resources/META-INF/resources/designer/index.js +++ b/src/main/resources/META-INF/resources/designer/index.js @@ -1449,58 +1449,6 @@ function visibility_model() { return lane; - }, - 'bpmn:Collector': function(p, element) { - var lane = renderer('bpmn:Lane')(p, element, { - fill: 'White' - }); - - var expandedPool = DiUtil.isExpanded(element); - - if (expandedPool) { - drawLine(p, [{ - x: element.width, - y: 80 - }, { - x: element.width, - y: 20 - }]); - - drawLine(p, [{ - x: 20, - y: 0 - }, { - x: 20, - y: element.height - }]); - var text2 = getSemantic(element).name; - if (text2 == undefined) { - text2 = 'Collector'; - } - - renderLabel(p, text2, { - box: element, - align: 'center-middle' - }); - - } else { - // Collapsed pool draw text inline - var text2 = getSemantic(element).name; - renderLabel(p, text2, { - box: element, - align: 'center-middle' - }); - } - - var participantMultiplicity = !!(getSemantic(element).participantMultiplicity); - - if (participantMultiplicity) { - renderer('ParticipantMultiplicityMarker')(p, element); - } - - return lane; - - }, 'bpmn:VesCollector': function(p, element) { var lane = renderer('bpmn:Lane')(p, element, { @@ -1626,52 +1574,6 @@ function visibility_model() { return lane; }, - - 'bpmn:StringMatch': function(p, element) { - var lane = renderer('bpmn:Lane')(p, element, { - fill: 'White' - }); - - var expandedPool = DiUtil.isExpanded(element); - - if (expandedPool) { - - drawLine(p, [{ - x: 0, - y: 20 - }, { - x: element.width, - y: 20 - }]); - var text2 = getSemantic(element).name; - if (text2 == undefined) { - text2 = 'StringMatch'; - } - renderLabel(p, text2, { - box: element, - align: 'center-middle' - }); - - } else { - // Collapsed pool draw text inline - var text2 = getSemantic(element).name; - renderLabel(p, text2, { - box: element, - align: 'center-middle' - }); - } - - var participantMultiplicity = !!(getSemantic(element).participantMultiplicity); - - if (participantMultiplicity) { - renderer('ParticipantMultiplicityMarker')(p, element); - } - - return lane; - - - }, - 'bpmn:TCA': function(p, element) { var lane = renderer('bpmn:Lane')(p, element, { fill: 'White' @@ -3838,39 +3740,6 @@ function visibility_model() { if (bpmnElement.$instanceOf('bpmn:InitiateProcess')) {} if (bpmnElement.$instanceOf('bpmn:StartEvent')) {} - if (bpmnElement.$instanceOf('bpmn:Collector')) { - assign(actions, { - 'Properties': { - group: 'clds', - label: 'Edit Properties', - className: 'clds-edit-properties', - title: 'Properties', - action: { - click: function(event) { - lastElementSelected = bpmnElement.id - CollectorsWindow(bpmnElement); - } - } - } - }); - - } - if (bpmnElement.$instanceOf('bpmn:StringMatch')) { - assign(actions, { - 'Properties': { - group: 'clds', - label: 'Edit Properties', - className: 'clds-edit-properties', - title: 'Properties', - action: { - click: function(event) { - lastElementSelected = bpmnElement.id - StringMatchWindow(bpmnElement); - } - } - } - }); - } if (bpmnElement.$instanceOf('bpmn:Holmes')) { assign(actions, { 'Properties': { @@ -5007,19 +4876,6 @@ function visibility_model() { height: 80 }; } - if (semantic.$instanceOf('bpmn:Collector')) { - return { - width: 120, - height: 80 - }; - } - - if (semantic.$instanceOf('bpmn:StringMatch')) { - return { - width: 120, - height: 80 - }; - } if (semantic.$instanceOf('bpmn:VesCollector')) { return { width: 120, @@ -6541,12 +6397,6 @@ function visibility_model() { 'create.start-event': createAction( 'bpmn:StartEvent', 'event', 'icon-start-event-none', "Start" ), - 'create.collector': createAction( - 'bpmn:Collector', 'event', 'icon-collector-node', 'Collector' - ), - 'create.String-Match': createAction( - 'bpmn:StringMatch', 'event', 'icon-stringmatch-node', 'String Match' - ), 'create.ves-collector': createAction( 'bpmn:VesCollector', 'event', 'icon-ves-collector-node', 'Ves Collector' ), @@ -14381,18 +14231,6 @@ function visibility_model() { "Activity", "InteractionNode" ] - }, { - "name": "Collector", - "superClass": [ - "Activity", - "InteractionNode" - ] - }, { - "name": "StringMatch", - "superClass": [ - "Activity", - "InteractionNode" - ] }, { "name": "VesCollector", "superClass": [ diff --git a/src/main/resources/META-INF/resources/designer/partials/portfolios/Collector_properties.html b/src/main/resources/META-INF/resources/designer/partials/portfolios/Collector_properties.html deleted file mode 100644 index 7537f72a..00000000 --- a/src/main/resources/META-INF/resources/designer/partials/portfolios/Collector_properties.html +++ /dev/null @@ -1,122 +0,0 @@ - - - - - -

- - - - -
- - diff --git a/src/main/resources/META-INF/resources/designer/partials/portfolios/stringMatch_properties.html b/src/main/resources/META-INF/resources/designer/partials/portfolios/stringMatch_properties.html deleted file mode 100644 index 49ac07d7..00000000 --- a/src/main/resources/META-INF/resources/designer/partials/portfolios/stringMatch_properties.html +++ /dev/null @@ -1,1019 +0,0 @@ - - - - - - -
- - - - - - - - -
diff --git a/src/main/resources/META-INF/resources/designer/partials/portfolios/tca_properties.html b/src/main/resources/META-INF/resources/designer/partials/portfolios/tca_properties.html index 7305fd91..546909ab 100644 --- a/src/main/resources/META-INF/resources/designer/partials/portfolios/tca_properties.html +++ b/src/main/resources/META-INF/resources/designer/partials/portfolios/tca_properties.html @@ -70,17 +70,22 @@ } #tcaEditHolder{ - height:260px; background-color: #f5f5f5; - padding:10px 0px; + padding:10px 10px; margin: 15px 15px 0 0; float: right; } + + +#tcaEditHolder #properties_tab>div+div { + margin-top: 10px; +} + .tcaErr{ display:none; text-align:center; margin-bottom:20px; - color:red;" + color:red; } .tcaParentItems { @@ -155,12 +160,6 @@
-
- -
-
- - - -
- - -
@@ -200,6 +186,12 @@
+
+ +
+ +
+
- -
- - -
- -
-
- -
- -
-
- -
- - -
+
@@ -250,26 +222,38 @@
-
-
+
+
-
+
-
+
+
+ +
+ +
+
+
+ +
+ +
+
@@ -289,7 +273,16 @@ class="btn btn-primary">Cancel
-