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 +++ .../feature/config/usecases-controller.properties | 8 +-- .../src/files/apps-controlloop-installer | 38 ----------- .../src/main/docker/docker-entrypoint.sh | 50 ++++++++++++-- .../main/resources/__closedLoopControlName__.drl | 35 +++++++--- 7 files changed, 219 insertions(+), 57 deletions(-) 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 delete mode 100644 controlloop/packages/apps-controlloop/src/files/apps-controlloop-installer (limited to 'controlloop') 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" +} diff --git a/controlloop/common/feature-controlloop-usecases/src/main/feature/config/usecases-controller.properties b/controlloop/common/feature-controlloop-usecases/src/main/feature/config/usecases-controller.properties index 3035e1061..10696b8ef 100644 --- a/controlloop/common/feature-controlloop-usecases/src/main/feature/config/usecases-controller.properties +++ b/controlloop/common/feature-controlloop-usecases/src/main/feature/config/usecases-controller.properties @@ -20,13 +20,7 @@ controller.name=usecases -dmaap.source.topics=PDPD-CONFIGURATION,DCAE_TOPIC,APPC-CL,APPC-LCM-WRITE,SDNR-CL-RSP - -dmaap.source.topics.PDPD-CONFIGURATION.effectiveTopic=${env:PDPD_CONFIGURATION_TOPIC} -dmaap.source.topics.PDPD-CONFIGURATION.servers=${env:DMAAP_SERVERS} -dmaap.source.topics.PDPD-CONFIGURATION.events=org.onap.policy.controlloop.params.ControlLoopParams -dmaap.source.topics.PDPD-CONFIGURATION.events.org.onap.policy.controlloop.params.ControlLoopParams.filter=[?($.closedLoopControlName =~ /.*/ && $.controlLoopYaml =~ /.*/)] -dmaap.source.topics.PDPD-CONFIGURATION.https=true +dmaap.source.topics=DCAE_TOPIC,APPC-CL,APPC-LCM-WRITE,SDNR-CL-RSP dmaap.source.topics.DCAE_TOPIC.effectiveTopic=${env:DCAE_TOPIC} dmaap.source.topics.DCAE_TOPIC.servers=${env:DMAAP_SERVERS} diff --git a/controlloop/packages/apps-controlloop/src/files/apps-controlloop-installer b/controlloop/packages/apps-controlloop/src/files/apps-controlloop-installer deleted file mode 100644 index 95fef711e..000000000 --- a/controlloop/packages/apps-controlloop/src/files/apps-controlloop-installer +++ /dev/null @@ -1,38 +0,0 @@ -#!/bin/bash - -### -# ============LICENSE_START======================================================= -# Apps Installation Package -# ================================================================================ -# 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========================================================= -### - -# -# This file will be automatically invoked by the main pdp-d installer -# for drools applications -# - -echo -echo "**********************************" -echo " CONTROL LOOP APP INSTALL " -echo "**********************************" -echo - -features enable controlloop-trans -features enable controlloop-management -features enable controlloop-amsterdam - - diff --git a/controlloop/packages/docker-controlloop/src/main/docker/docker-entrypoint.sh b/controlloop/packages/docker-controlloop/src/main/docker/docker-entrypoint.sh index 8afc2c0db..73781619e 100644 --- a/controlloop/packages/docker-controlloop/src/main/docker/docker-entrypoint.sh +++ b/controlloop/packages/docker-controlloop/src/main/docker/docker-entrypoint.sh @@ -25,6 +25,10 @@ function configurations { local confName + if ! ls "${POLICY_INSTALL_INIT}"/*.conf 2>&1; then + return 0 + fi + for c in $(ls "${POLICY_INSTALL_INIT}"/*.conf 2> /dev/null); do echo "adding configuration file: ${c}" cp -f "${c}" "${POLICY_HOME}"/etc/profile.d/ @@ -41,6 +45,10 @@ function features { set -x fi + if ! ls "${POLICY_INSTALL_INIT}"/features*.zip 2>&1; then + return 0 + fi + source "${POLICY_HOME}"/etc/profile.d/env.sh for f in $(ls "${POLICY_INSTALL_INIT}"/features*.zip 2> /dev/null); do @@ -55,6 +63,10 @@ function scripts { set -x fi + if ! ls "${POLICY_INSTALL_INIT}"/*.sh 2>&1; then + return 0 + fi + source "${POLICY_HOME}"/etc/profile.d/env.sh for s in $(ls "${POLICY_INSTALL_INIT}"/*.sh 2> /dev/null); do @@ -97,6 +109,10 @@ function properties { set -x fi + if ! ls "${POLICY_INSTALL_INIT}"/*.properties 2>&1; then + return 0 + fi + for p in $(ls "${POLICY_INSTALL_INIT}"/*.properties 2> /dev/null); do echo "configuration properties: ${p}" cp -f "${p}" "${POLICY_HOME}"/config @@ -113,6 +129,9 @@ function db { return 0 fi + echo "Wating for ${SQL_HOST} ." + timeout 120 bash -c 'until nc -vz "${SQL_HOST}" 3306; do echo -n "."; sleep 1; done'; echo $? + "${POLICY_HOME}"/bin/db-migrator -s ALL -o upgrade } @@ -200,7 +219,17 @@ function start { policy start } -function boot { +function configure { + if [[ ${DEBUG} == y ]]; then + echo "-- ${FUNCNAME[0]} --" + set -x + fi + + reload + db +} + +function vmBoot { if [[ ${DEBUG} == y ]]; then echo "-- ${FUNCNAME[0]} --" set -x @@ -209,12 +238,21 @@ function boot { reload db start +} + +function dockerBoot { + if [[ ${DEBUG} == y ]]; then + echo "-- ${FUNCNAME[0]} --" + set -x + fi + + set -e + + vmBoot tail -f /dev/null } -set -e - if [[ ${DEBUG} == y ]]; then echo "-- $0 $* --" set -x @@ -224,7 +262,11 @@ operation="${1}" case "${operation}" in inspect) inspect ;; - boot) boot + boot) dockerBoot + ;; + vmboot) vmBoot + ;; + configure) configure ;; *) exec "$@" ;; diff --git a/controlloop/templates/archetype-cl-usecases/src/main/resources/archetype-resources/src/main/resources/__closedLoopControlName__.drl b/controlloop/templates/archetype-cl-usecases/src/main/resources/archetype-resources/src/main/resources/__closedLoopControlName__.drl index 8dcc79866..3f2bf572c 100644 --- a/controlloop/templates/archetype-cl-usecases/src/main/resources/archetype-resources/src/main/resources/__closedLoopControlName__.drl +++ b/controlloop/templates/archetype-cl-usecases/src/main/resources/archetype-resources/src/main/resources/__closedLoopControlName__.drl @@ -33,6 +33,7 @@ import org.onap.policy.controlloop.policy.Policy; import org.onap.policy.controlloop.eventmanager.ControlLoopEventManager; import org.onap.policy.controlloop.eventmanager.ControlLoopEventManager.NewEventStatus; import org.onap.policy.controlloop.eventmanager.ControlLoopOperationManager; +import org.onap.policy.controlloop.utils.ControlLoopUtils; import org.onap.policy.controlloop.actor.so.SoActorServiceProvider; import org.onap.policy.aai.AaiNqResponseWrapper; import org.onap.policy.appc.Request; @@ -101,9 +102,6 @@ rule "INSERT.PARAMS" $params : ControlLoopParams() then - // Note: globals have bad behavior when persistence is used, - // hence explicitly getting the logger vs using a global - Logger logger = LoggerFactory.getLogger(drools.getRule().getPackage()); logger.info("{}: {} : YAML=[{}]", $params.getClosedLoopControlName(), $params.getPolicyName() + "." + drools.getRule().getName(), $params.getControlLoopYaml()); @@ -111,18 +109,39 @@ end /* * -* Called when a Tosca Policy fact is present. +* Called when a Tosca Policy is present. * */ -rule "NEW TOSCA POLICY" +rule "NEW.TOSCA.POLICY" when $policy : ToscaPolicy() then Logger logger = LoggerFactory.getLogger(drools.getRule().getPackage()); - logger.info("{}:{}: [{}|{}|{}|{}]: CONTENT: {}", drools.getRule().getName(), - $policy.getType(), $policy.getTypeVersion(), $policy.getName(), $policy.getVersion(), - $policy); + logger.info("{}: [{}|{}|{}|{}]: CONTENT: {}", drools.getRule().getName(), + $policy.getType(), $policy.getTypeVersion(), $policy.getName(), + $policy.getVersion(), $policy); + + ControlLoopParams params = ControlLoopUtils.toControlLoopParams($policy); + if (params != null) { + insert(params); + } +end + +/* + * Remove Control Loop Parameters. + */ +rule "REMOVE.PARAMS" + when + $params : ControlLoopParams( $policyName : getPolicyName(), $policyVersion : getPolicyVersion() ) + not ( ToscaPolicy( getName() == $policyName, getVersion() == $policyVersion ) ) + then + + Logger logger = LoggerFactory.getLogger(drools.getRule().getPackage()); + logger.info("{}: [{}|{}|{}]", drools.getRule().getName(), + $params.getPolicyScope(), $params.getPolicyName(), $params.getPolicyVersion()); + + retract($params); end /* -- cgit 1.2.3-korg