From e32d0fac919c8cc5657496a16c300877bd29621e Mon Sep 17 00:00:00 2001 From: jhh Date: Thu, 25 Apr 2019 07:45:29 -0500 Subject: Match up ControlLoopParams against ToscaPolicy Change-Id: Ia23a5b90b452bcafe2a8aa660598697ebfb07431 Issue-ID: POLICY-1691 Signed-off-by: jhh --- .../policy/controlloop/utils/ControlLoopUtils.java | 78 ++++++++++++++++++++++ .../controlloop/utils/ControlLoopUtilsTest.java | 58 ++++++++++++++++ .../tosca-policy-operational-restart.json | 9 +++ 3 files changed, 145 insertions(+) create mode 100644 controlloop/common/eventmanager/src/main/java/org/onap/policy/controlloop/utils/ControlLoopUtils.java create mode 100644 controlloop/common/eventmanager/src/test/java/org/onap/policy/controlloop/utils/ControlLoopUtilsTest.java create mode 100644 controlloop/common/eventmanager/src/test/resources/tosca-policy-operational-restart.json (limited to 'controlloop/common/eventmanager') diff --git a/controlloop/common/eventmanager/src/main/java/org/onap/policy/controlloop/utils/ControlLoopUtils.java b/controlloop/common/eventmanager/src/main/java/org/onap/policy/controlloop/utils/ControlLoopUtils.java new file mode 100644 index 000000000..8b7876c71 --- /dev/null +++ b/controlloop/common/eventmanager/src/main/java/org/onap/policy/controlloop/utils/ControlLoopUtils.java @@ -0,0 +1,78 @@ +/*- + * ============LICENSE_START======================================================= + * Copyright (C) 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========================================================= + */ + +package org.onap.policy.controlloop.utils; + +import java.io.UnsupportedEncodingException; +import java.net.URLDecoder; +import org.apache.commons.lang3.StringUtils; +import org.onap.policy.controlloop.ControlLoopException; +import org.onap.policy.controlloop.params.ControlLoopParams; +import org.onap.policy.controlloop.processor.ControlLoopProcessor; +import org.onap.policy.models.tosca.authorative.concepts.ToscaPolicy; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +/** + * Control Loop Utils. + */ +public class ControlLoopUtils { + + public static final Logger logger = LoggerFactory.getLogger(ControlLoopUtils.class); + public static final String TOSCA_POLICY_PROPERTY_CONTENT = "content"; + + /** + * Get a Control Loop Parameters object from a Tosca Policy. + */ + public static ControlLoopParams toControlLoopParams(ToscaPolicy policy) { + + // TODO: ControlLoopParams class should be moved to this repo and take Tosca Policy in a constructor. + + /* No exceptions are thrown to keep the DRL simpler */ + + try { + if (policy == null || policy.getProperties() == null + || policy.getProperties().get(TOSCA_POLICY_PROPERTY_CONTENT) == null) { + logger.error("Invalid Policy: {}", policy); + return null; + } + + String encodedPolicy = policy.getProperties().get(TOSCA_POLICY_PROPERTY_CONTENT).toString(); + String decodedPolicy = URLDecoder.decode(encodedPolicy, "UTF-8"); + + ControlLoopProcessor controlLoopProcessor = new ControlLoopProcessor(decodedPolicy); + if (controlLoopProcessor.getControlLoop() == null + || StringUtils.isEmpty(controlLoopProcessor.getControlLoop().getControlLoopName())) { + return null; + } + + ControlLoopParams controlLoopParams = new ControlLoopParams(); + controlLoopParams.setClosedLoopControlName(controlLoopProcessor.getControlLoop().getControlLoopName()); + controlLoopParams.setControlLoopYaml(encodedPolicy); + controlLoopParams.setPolicyScope(policy.getType() + ":" + policy.getTypeVersion()); + controlLoopParams.setPolicyName(policy.getName()); + controlLoopParams.setPolicyVersion(policy.getVersion()); + + return controlLoopParams; + } catch (ControlLoopException | RuntimeException | UnsupportedEncodingException e) { + logger.error("Invalid Policy because of {}: {}", e.getMessage(), policy, e); + return null; + } + } + +} diff --git a/controlloop/common/eventmanager/src/test/java/org/onap/policy/controlloop/utils/ControlLoopUtilsTest.java b/controlloop/common/eventmanager/src/test/java/org/onap/policy/controlloop/utils/ControlLoopUtilsTest.java new file mode 100644 index 000000000..72e51bae9 --- /dev/null +++ b/controlloop/common/eventmanager/src/test/java/org/onap/policy/controlloop/utils/ControlLoopUtilsTest.java @@ -0,0 +1,58 @@ +/*- + * ============LICENSE_START======================================================= + * Copyright (C) 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========================================================= + */ + +package org.onap.policy.controlloop.utils; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNotNull; +import static org.junit.Assert.assertNull; + +import java.io.IOException; +import java.nio.file.Files; +import java.nio.file.Paths; +import java.util.Map; +import org.junit.Test; +import org.onap.policy.common.utils.coder.CoderException; +import org.onap.policy.common.utils.coder.StandardCoder; +import org.onap.policy.controlloop.params.ControlLoopParams; +import org.onap.policy.models.tosca.authorative.concepts.ToscaPolicy; + +public class ControlLoopUtilsTest { + + @Test + public void toControlLoopParams() throws IOException, CoderException { + String policy = + new String(Files.readAllBytes(Paths.get("src/test/resources/tosca-policy-operational-restart.json"))); + + ToscaPolicy toscaPolicy = new StandardCoder().decode(policy, ToscaPolicy.class); + ControlLoopParams params = ControlLoopUtils.toControlLoopParams(toscaPolicy); + assertNotNull(params); + assertNotNull(params.getClosedLoopControlName()); + assertEquals(toscaPolicy.getProperties().get("content"), params.getControlLoopYaml()); + assertEquals(toscaPolicy.getName(), params.getPolicyName()); + assertEquals(toscaPolicy.getVersion(), params.getPolicyVersion()); + assertEquals(toscaPolicy.getType() + ":" + toscaPolicy.getVersion(), params.getPolicyScope()); + + assertNull(ControlLoopUtils.toControlLoopParams(null)); + + Map properties = toscaPolicy.getProperties(); + toscaPolicy.setProperties(null); + assertNull(ControlLoopUtils.toControlLoopParams(toscaPolicy)); + toscaPolicy.setProperties(properties); + } +} \ No newline at end of file diff --git a/controlloop/common/eventmanager/src/test/resources/tosca-policy-operational-restart.json b/controlloop/common/eventmanager/src/test/resources/tosca-policy-operational-restart.json new file mode 100644 index 000000000..1b17d2cf5 --- /dev/null +++ b/controlloop/common/eventmanager/src/test/resources/tosca-policy-operational-restart.json @@ -0,0 +1,9 @@ +{ + "type": "onap.policies.controlloop.Operational", + "type_version": "1.0.0", + "properties": { + "content": "controlLoop%3A%0D%0A++version%3A+2.0.0%0D%0A++controlLoopName%3A+ControlLoop-vCPE-48f0c2c3-a172-4192-9ae3-052274181b6e%0D%0A++trigger_policy%3A+unique-policy-id-1-restart%0D%0A++timeout%3A+3600%0D%0A++abatement%3A+true%0D%0A+%0D%0Apolicies%3A%0D%0A++-+id%3A+unique-policy-id-1-restart%0D%0A++++name%3A+Restart+the+VM%0D%0A++++description%3A%0D%0A++++actor%3A+APPC%0D%0A++++recipe%3A+Restart%0D%0A++++target%3A%0D%0A++++++type%3A+VM%0D%0A++++retry%3A+3%0D%0A++++timeout%3A+1200%0D%0A++++success%3A+final_success%0D%0A++++failure%3A+final_failure%0D%0A++++failure_timeout%3A+final_failure_timeout%0D%0A++++failure_retries%3A+final_failure_retries%0D%0A++++failure_exception%3A+final_failure_exception%0D%0A++++failure_guard%3A+final_failure_guard" + }, + "name": "operational.restart", + "version": "1.0.0" +} -- cgit 1.2.3-korg