From 479d2c204f1869490b3d0f11aaa2cb84a6671b09 Mon Sep 17 00:00:00 2001 From: liamfallon Date: Thu, 8 Sep 2022 15:54:08 +0100 Subject: [PATCH] Convert CSIT tests to use HTTP rather than HTTPS This commit converts the CSITs from HTTPS to HTTP. It also does some refactoring and didying up on the CSIT environment. Issue-ID: POLICY-4338 Change-Id: I31ac4aa83d476dd677f611a0a0f368dbec4ac21f Signed-off-by: liamfallon --- .gitignore | 4 + csit/apex-pdp/plans/teardown.sh | 5 - csit/apex-pdp/tests/apex-pdp-test.robot | 4 +- .../tests/data/onap.policies.apex.pnf.Test.json | 8 +- .../onap.policies.apex.pnf.metadataSet.Test.json | 8 +- .../tests/data/onap.policies.apex.vnf.Test.json | 6 +- csit/api/plans/teardown.sh | 3 - csit/clamp/plans/setup.sh | 4 +- csit/clamp/tests/policy-clamp-test.robot | 28 +- csit/common-library.robot | 20 +- csit/compose-grafana.yml | 33 +- csit/config/apex-pdp/OnapPfConfig.json | 6 +- csit/config/apex-pdp/groups.json | 28 ++ csit/config/apex-pdp/logback.xml | 122 +++++++ csit/config/api/groups.json | 137 ++++++++ csit/config/api/logback.xml | 207 ++++++++++++ csit/config/cakey.pem | 30 -- csit/config/careq.pem | 16 - csit/config/caroot.cer | 19 -- csit/config/caserial.txt | 1 - csit/config/clamp/AcRuntimeParameters.yaml | 7 +- ...on-smoke.properties => ClampBackend.properties} | 40 +-- csit/config/clamp/HttpParticipantParameters.yaml | 8 +- .../clamp/KubernetesParticipantParameters.yaml | 8 +- csit/config/clamp/PolicyParticipantParameters.yaml | 12 +- csit/config/clamp/groups.json | 137 ++++++++ csit/config/clamp/logback-backend.xml | 219 +++++++++++++ csit/config/clamp/logback.xml | 206 ++++++++++++ csit/config/distribution/defaultConfig.json | 6 +- csit/config/distribution/groups.json | 137 ++++++++ csit/config/distribution/logback.xml | 136 ++++++++ csit/config/dns_ssl.txt | 21 -- .../custom/engine-system.properties | 0 .../custom/feature-lifecycle.properties | 4 +- .../custom/features.pre.sh | 0 .../custom/standalone-settings.xml | 0 .../env/base.conf | 11 +- .../env/feature-healthcheck.conf | 0 .../env/feature-pooling-dmaap.conf | 0 csit/config/drools-applications/groups.json | 137 ++++++++ .../custom/engine-system.properties | 0 .../{drools => drools-pdp}/custom/noop.pre.sh | 0 csit/config/{drools => drools-pdp}/env/base.conf | 4 +- csit/config/drools-pdp/groups.json | 137 ++++++++ csit/config/ks.cer | 29 -- csit/config/ks.csr | 18 - csit/config/ks.jks | Bin 5001 -> 0 bytes csit/config/pap/groups.json | 111 +------ csit/config/pap/logback.xml | 120 +++++++ csit/config/pap/papParameters.yaml | 12 +- .../{clamp/gui => policy-gui}/application.yaml | 14 +- csit/config/policy-gui/groups.json | 137 ++++++++ csit/config/policy-gui/logback.xml | 119 +++++++ csit/config/policy-truststore | Bin 125108 -> 0 bytes csit/config/sim-all/logback.xml | 42 +++ csit/config/sim-all/simParameters.json | 18 +- csit/config/xacml-pdp/defaultConfig.json | 8 +- csit/config/xacml-pdp/groups.json | 101 ++++++ csit/config/xacml-pdp/logback.xml | 116 +++++++ csit/db-migrator/plans/teardown.sh | 2 - csit/distribution/plans/teardown.sh | 5 - csit/docker-compose-all.yml | 207 +++++++----- csit/docker-compose-gui-smoke.yml | 361 --------------------- csit/drools-applications/plans/teardown.sh | 6 - .../tests/drools-applications-test.robot | 8 +- csit/drools-pdp/plans/teardown.sh | 5 - csit/drools-pdp/tests/drools-pdp-test.robot | 8 +- csit/gen_keystore.sh | 54 --- csit/gen_truststore.sh | 49 --- ...clude-raw-integration-install-robotframework.sh | 2 +- csit/make_topic.sh | 3 +- csit/metrics/prometheus.yml | 13 + csit/onset.sh | 3 +- csit/pap/plans/setup.sh | 12 +- csit/pap/plans/teardown.sh | 4 - csit/pap/tests/pap-test.robot | 4 +- csit/prepare-config-files.py | 59 ---- csit/pylibs.txt | 1 - csit/run-project-csit.sh | 66 ++-- ...{start-gui-smoke-components.sh => start-all.sh} | 10 +- csit/start-grafana.sh | 10 +- csit/{stop-gui-smoke.sh => stop-all.sh} | 2 +- csit/wait_for_port.sh | 6 +- csit/wait_topic.sh | 3 +- csit/xacml-pdp/plans/setup.sh | 2 +- csit/xacml-pdp/plans/teardown.sh | 5 - env.properties | 1 + policy-jdk/alpine/pom.xml | 105 +++++- policy-jdk/alpine/src/main/docker/Dockerfile | 5 +- policy-jre/alpine/pom.xml | 110 ++++++- policy-jre/alpine/src/main/docker/Dockerfile | 5 +- 91 files changed, 2818 insertions(+), 1082 deletions(-) create mode 100644 csit/config/apex-pdp/groups.json create mode 100644 csit/config/apex-pdp/logback.xml create mode 100644 csit/config/api/groups.json create mode 100644 csit/config/api/logback.xml delete mode 100644 csit/config/cakey.pem delete mode 100644 csit/config/careq.pem delete mode 100644 csit/config/caroot.cer delete mode 100644 csit/config/caserial.txt rename csit/config/clamp/{application-smoke.properties => ClampBackend.properties} (87%) create mode 100644 csit/config/clamp/groups.json create mode 100644 csit/config/clamp/logback-backend.xml create mode 100644 csit/config/clamp/logback.xml create mode 100644 csit/config/distribution/groups.json create mode 100644 csit/config/distribution/logback.xml delete mode 100644 csit/config/dns_ssl.txt rename csit/config/{drools-apps => drools-applications}/custom/engine-system.properties (100%) rename csit/config/{drools-apps => drools-applications}/custom/feature-lifecycle.properties (93%) rename csit/config/{drools-apps => drools-applications}/custom/features.pre.sh (100%) rename csit/config/{drools-apps => drools-applications}/custom/standalone-settings.xml (100%) rename csit/config/{drools-apps => drools-applications}/env/base.conf (94%) rename csit/config/{drools-apps => drools-applications}/env/feature-healthcheck.conf (100%) rename csit/config/{drools-apps => drools-applications}/env/feature-pooling-dmaap.conf (100%) create mode 100644 csit/config/drools-applications/groups.json rename csit/config/{drools => drools-pdp}/custom/engine-system.properties (100%) rename csit/config/{drools => drools-pdp}/custom/noop.pre.sh (100%) rename csit/config/{drools => drools-pdp}/env/base.conf (97%) create mode 100644 csit/config/drools-pdp/groups.json delete mode 100644 csit/config/ks.cer delete mode 100644 csit/config/ks.csr delete mode 100644 csit/config/ks.jks create mode 100644 csit/config/pap/logback.xml rename csit/config/{clamp/gui => policy-gui}/application.yaml (76%) create mode 100644 csit/config/policy-gui/groups.json create mode 100644 csit/config/policy-gui/logback.xml delete mode 100644 csit/config/policy-truststore create mode 100644 csit/config/sim-all/logback.xml create mode 100644 csit/config/xacml-pdp/groups.json create mode 100644 csit/config/xacml-pdp/logback.xml delete mode 100644 csit/docker-compose-gui-smoke.yml delete mode 100755 csit/gen_keystore.sh delete mode 100755 csit/gen_truststore.sh delete mode 100755 csit/prepare-config-files.py rename csit/{start-gui-smoke-components.sh => start-all.sh} (82%) rename csit/{stop-gui-smoke.sh => stop-all.sh} (93%) create mode 100644 env.properties diff --git a/.gitignore b/.gitignore index abced7c6..31bf3819 100644 --- a/.gitignore +++ b/.gitignore @@ -6,3 +6,7 @@ install.log* *.sw? **/*.iml .idea/ +csit/archives +env.properties +.pydevproject +models diff --git a/csit/apex-pdp/plans/teardown.sh b/csit/apex-pdp/plans/teardown.sh index a44e3aab..9bfdfe88 100755 --- a/csit/apex-pdp/plans/teardown.sh +++ b/csit/apex-pdp/plans/teardown.sh @@ -20,9 +20,4 @@ # SPDX-License-Identifier: Apache-2.0 # ============LICENSE_END========================================================= -docker logs policy-api -docker logs simulator -docker logs policy-pap -docker logs apex-pdp - docker-compose -f ${SCRIPTS}/docker-compose-all.yml down -v diff --git a/csit/apex-pdp/tests/apex-pdp-test.robot b/csit/apex-pdp/tests/apex-pdp-test.robot index b0e4c727..77393270 100644 --- a/csit/apex-pdp/tests/apex-pdp-test.robot +++ b/csit/apex-pdp/tests/apex-pdp-test.robot @@ -100,7 +100,7 @@ RunEventOnApexEngine TriggerAndVerifyTestPnfPolicy [Documentation] Send TestPnf policy trigger event to DMaaP and read notifications to verify policy execution - Create Session apexSession https://${DMAAP_IP}:3905 max_retries=1 + Create Session apexSession http://${DMAAP_IP}:3904 max_retries=1 ${data}= Get Binary File ${CURDIR}/data/VesEventForPnfPolicy.json &{headers}= Create Dictionary Content-Type=application/json Accept=application/json ${resp}= POST On Session apexSession /events/unauthenticated.DCAE_CL_OUTPUT data=${data} headers=${headers} @@ -111,7 +111,7 @@ TriggerAndVerifyTestPnfPolicy TriggerAndVerifyTestVnfPolicy [Documentation] Send TestVnf policy trigger event to DMaaP and read notifications to verify policy execution - Create Session apexSession https://${DMAAP_IP}:3905 max_retries=1 + Create Session apexSession http://${DMAAP_IP}:3904 max_retries=1 ${data}= Get Binary File ${CURDIR}/data/VesEventForVnfPolicy.json &{headers}= Create Dictionary Content-Type=application/json Accept=application/json ${resp}= POST On Session apexSession /events/unauthenticated.DCAE_POLICY_EXAMPLE_OUTPUT data=${data} headers=${headers} diff --git a/csit/apex-pdp/tests/data/onap.policies.apex.pnf.Test.json b/csit/apex-pdp/tests/data/onap.policies.apex.pnf.Test.json index 5d9cbf9a..05522936 100644 --- a/csit/apex-pdp/tests/data/onap.policies.apex.pnf.Test.json +++ b/csit/apex-pdp/tests/data/onap.policies.apex.pnf.Test.json @@ -32,7 +32,7 @@ "taskParameters": [ { "key": "logUrl", - "value": "https://message-router:3905/events/APEX-CL-MGT" + "value": "http://message-router:3904/events/APEX-CL-MGT" } ] }, @@ -2778,7 +2778,7 @@ "carrierTechnology": "RESTCLIENT", "parameterClassName": "org.onap.policy.apex.plugins.event.carrier.restclient.RestClientCarrierTechnologyParameters", "parameters": { - "url": "https://message-router:3905/events/unauthenticated.DCAE_CL_OUTPUT/cl/apex?timeout=30000" + "url": "http://message-router:3904/events/unauthenticated.DCAE_CL_OUTPUT/cl/apex?timeout=30000" } }, "eventProtocolParameters": { @@ -2791,7 +2791,7 @@ "carrierTechnology": "RESTREQUESTOR", "parameterClassName": "org.onap.policy.apex.plugins.event.carrier.restrequestor.RestRequestorCarrierTechnologyParameters", "parameters": { - "url": "https://aai-sim:6666/aai/v16/network/pnfs/pnf/{pnfName}", + "url": "http://aai-sim:6666/aai/v16/network/pnfs/pnf/{pnfName}", "httpMethod": "GET", "httpCodeFilter": "[2-5][0-1][0-9]", "httpHeaders": [ @@ -2879,7 +2879,7 @@ "carrierTechnology": "RESTCLIENT", "parameterClassName": "org.onap.policy.apex.plugins.event.carrier.restclient.RestClientCarrierTechnologyParameters", "parameters": { - "url": "https://message-router:3905/events/APEX-CL-MGT" + "url": "http://message-router:3904/events/APEX-CL-MGT" } }, "eventProtocolParameters": { diff --git a/csit/apex-pdp/tests/data/onap.policies.apex.pnf.metadataSet.Test.json b/csit/apex-pdp/tests/data/onap.policies.apex.pnf.metadataSet.Test.json index 767adf13..20338fff 100644 --- a/csit/apex-pdp/tests/data/onap.policies.apex.pnf.metadataSet.Test.json +++ b/csit/apex-pdp/tests/data/onap.policies.apex.pnf.metadataSet.Test.json @@ -36,7 +36,7 @@ "taskParameters": [ { "key": "logUrl", - "value": "https://message-router:3905/events/APEX-CL-MGT2" + "value": "http://message-router:3904/events/APEX-CL-MGT2" } ] } @@ -47,7 +47,7 @@ "carrierTechnology": "RESTCLIENT", "parameterClassName": "org.onap.policy.apex.plugins.event.carrier.restclient.RestClientCarrierTechnologyParameters", "parameters": { - "url": "https://message-router:3905/events/unauthenticated.DCAE_CL_OUTPUT/cl/apex?timeout=30000" + "url": "http://message-router:3904/events/unauthenticated.DCAE_CL_OUTPUT/cl/apex?timeout=30000" } }, "eventProtocolParameters": { @@ -60,7 +60,7 @@ "carrierTechnology": "RESTREQUESTOR", "parameterClassName": "org.onap.policy.apex.plugins.event.carrier.restrequestor.RestRequestorCarrierTechnologyParameters", "parameters": { - "url": "https://aai-sim:6666/aai/v16/network/pnfs/pnf/{pnfName}", + "url": "http://aai-sim:6666/aai/v16/network/pnfs/pnf/{pnfName}", "httpMethod": "GET", "httpCodeFilter": "[2-5][0-1][0-9]", "httpHeaders": [ @@ -148,7 +148,7 @@ "carrierTechnology": "RESTCLIENT", "parameterClassName": "org.onap.policy.apex.plugins.event.carrier.restclient.RestClientCarrierTechnologyParameters", "parameters": { - "url": "https://message-router:3905/events/APEX-CL-MGT2" + "url": "http://message-router:3904/events/APEX-CL-MGT2" } }, "eventProtocolParameters": { diff --git a/csit/apex-pdp/tests/data/onap.policies.apex.vnf.Test.json b/csit/apex-pdp/tests/data/onap.policies.apex.vnf.Test.json index d000de7c..7886f84b 100644 --- a/csit/apex-pdp/tests/data/onap.policies.apex.vnf.Test.json +++ b/csit/apex-pdp/tests/data/onap.policies.apex.vnf.Test.json @@ -32,7 +32,7 @@ "taskParameters": [ { "key": "logUrl", - "value": "https://message-router:3905/events/APEX-CL-MGT" + "value": "http://message-router:3904/events/APEX-CL-MGT" } ] }, @@ -3060,7 +3060,7 @@ "carrierTechnology": "RESTCLIENT", "parameterClassName": "org.onap.policy.apex.plugins.event.carrier.restclient.RestClientCarrierTechnologyParameters", "parameters": { - "url": "https://message-router:3905/events/unauthenticated.DCAE_POLICY_EXAMPLE_OUTPUT/ApexExampleCG1/1?timeout=30000" + "url": "http://message-router:3904/events/unauthenticated.DCAE_POLICY_EXAMPLE_OUTPUT/ApexExampleCG1/1?timeout=30000" } }, "eventProtocolParameters": { @@ -3073,7 +3073,7 @@ "carrierTechnology": "RESTREQUESTOR", "parameterClassName": "org.onap.policy.apex.plugins.event.carrier.restrequestor.RestRequestorCarrierTechnologyParameters", "parameters": { - "url": "https://aai-sim:6666/aai/v16/network/generic-vnfs/generic-vnf?vnf-name={vnf-name}", + "url": "http://aai-sim:6666/aai/v16/network/generic-vnfs/generic-vnf?vnf-name={vnf-name}", "httpMethod": "GET", "httpCodeFilter": "[245][0-9][0-9]", "httpHeaders": [ diff --git a/csit/api/plans/teardown.sh b/csit/api/plans/teardown.sh index 71daccc6..6f77caa4 100755 --- a/csit/api/plans/teardown.sh +++ b/csit/api/plans/teardown.sh @@ -18,7 +18,4 @@ # SPDX-License-Identifier: Apache-2.0 # ============LICENSE_END========================================================= -docker logs policy-api -docker logs simulator - docker-compose -f ${SCRIPTS}/docker-compose-all.yml down -v diff --git a/csit/clamp/plans/setup.sh b/csit/clamp/plans/setup.sh index c7bbabe0..6b11f9e0 100755 --- a/csit/clamp/plans/setup.sh +++ b/csit/clamp/plans/setup.sh @@ -44,6 +44,8 @@ echo POLICY RUNTIME ACM IP IS "${POLICY_RUNTIME_ACM_IP}" "${SCRIPTS}"/wait_for_port.sh "${POLICY_RUNTIME_ACM_IP}" 6969 # Bringup ACM participant containers +docker-compose -f "${SCRIPTS}"/docker-compose-all.yml up -d policy-clamp-ac-k8s-ppnt +docker-compose -f "${SCRIPTS}"/docker-compose-all.yml up -d policy-clamp-ac-http-ppnt docker-compose -f "${SCRIPTS}"/docker-compose-all.yml up -d policy-clamp-ac-pf-ppnt sleep 10 @@ -60,7 +62,7 @@ echo K8S PARTICIPANT IP IS "${K8S_PARTICIPANT_IP}" echo HTTP PARTICIPANT IP IS "${HTTP_PARTICIPANT_IP}" # wait for the app to start up -"${SCRIPTS}"/wait_for_port.sh "${POLICY_API_IP}" 6969 +"${SCRIPTS}"/wait_for_port.sh "${POLICY_PARTICIPANT_IP}" 6969 ROBOT_VARIABLES="" ROBOT_VARIABLES="${ROBOT_VARIABLES} -v POLICY_RUNTIME_ACM_IP:${POLICY_RUNTIME_ACM_IP}" diff --git a/csit/clamp/tests/policy-clamp-test.robot b/csit/clamp/tests/policy-clamp-test.robot index fe241333..f819d2d2 100644 --- a/csit/clamp/tests/policy-clamp-test.robot +++ b/csit/clamp/tests/policy-clamp-test.robot @@ -9,9 +9,9 @@ Library json CommissionAutomationCompositionV1 [Documentation] Commission automation composition. ${auth}= Create List runtimeUser zb!XztG34 - Log Creating session https://${POLICY_RUNTIME_ACM_IP}:6969 + Log Creating session http://${POLICY_RUNTIME_ACM_IP}:6969 ${postyaml}= Get file ${CURDIR}/data/PMSHMultipleACTosca.yaml - ${session}= Create Session policy https://${POLICY_RUNTIME_ACM_IP}:6969 auth=${auth} + ${session}= Create Session policy http://${POLICY_RUNTIME_ACM_IP}:6969 auth=${auth} ${headers}= Create Dictionary Accept=application/yaml Content-Type=application/yaml ${resp}= POST On Session policy /onap/policy/clamp/acm/v2/commission data=${postyaml} headers=${headers} Log Received response from runtime acm ${resp.text} @@ -20,9 +20,9 @@ CommissionAutomationCompositionV1 InstantiateAutomationCompositionV1 [Documentation] Instantiate automation composition. ${auth}= Create List runtimeUser zb!XztG34 - Log Creating session https://${POLICY_RUNTIME_ACM_IP}:6969 + Log Creating session http://${POLICY_RUNTIME_ACM_IP}:6969 ${postjson}= Get file ${CURDIR}/data/InstantiateAC.json - ${session}= Create Session policy https://${POLICY_RUNTIME_ACM_IP}:6969 auth=${auth} + ${session}= Create Session policy http://${POLICY_RUNTIME_ACM_IP}:6969 auth=${auth} ${headers}= Create Dictionary Accept=application/json Content-Type=application/json ${resp}= POST On Session policy /onap/policy/clamp/acm/v2/instantiation data=${postjson} headers=${headers} Log Received response from runtime acm ${resp.text} @@ -31,9 +31,9 @@ InstantiateAutomationCompositionV1 PassivateAutomationComposition [Documentation] Passivate automation composition. ${auth}= Create List runtimeUser zb!XztG34 - Log Creating session https://${POLICY_RUNTIME_ACM_IP}:6969 + Log Creating session http://${POLICY_RUNTIME_ACM_IP}:6969 ${postjson}= Get file ${CURDIR}/data/PassivateAC.json - ${session}= Create Session policy https://${POLICY_RUNTIME_ACM_IP}:6969 auth=${auth} + ${session}= Create Session policy http://${POLICY_RUNTIME_ACM_IP}:6969 auth=${auth} ${headers}= Create Dictionary Accept=application/json Content-Type=application/json ${resp}= PUT On Session policy /onap/policy/clamp/acm/v2/instantiation/command data=${postjson} headers=${headers} Log Received response from runtime acm ${resp.text} @@ -42,8 +42,8 @@ PassivateAutomationComposition QueryPolicies [Documentation] Runs Policy Participant Query New Policies ${auth}= Create List policyadmin zb!XztG34 - Log Creating session https://${POLICY_API_IP}:6969 - ${session}= Create Session policy https://${POLICY_API_IP}:6969 auth=${auth} + Log Creating session http://${POLICY_API_IP}:6969 + ${session}= Create Session policy http://${POLICY_API_IP}:6969 auth=${auth} ${headers}= Create Dictionary Accept=application/json Content-Type=application/json ${resp}= GET On Session policy /policy/api/v1/policies headers=${headers} Log Received response from policy-api {resp.text} @@ -52,8 +52,8 @@ QueryPolicies QueryPolicyTypes [Documentation] Runs Policy Participant Query New Policy Types ${auth}= Create List policyadmin zb!XztG34 - Log Creating session https://${POLICY_API_IP}:6969 - ${session}= Create Session policy https://${POLICY_API_IP}:6969 auth=${auth} + Log Creating session http://${POLICY_API_IP}:6969 + ${session}= Create Session policy http://${POLICY_API_IP}:6969 auth=${auth} ${headers}= Create Dictionary Accept=application/json Content-Type=application/json ${resp}= GET On Session policy /policy/api/v1/policytypes headers=${headers} Log Received response from policy-api ${resp.text} @@ -62,9 +62,9 @@ QueryPolicyTypes StateChangeRunningAutomationComposition [Documentation] AutomationComposition State Change to RUNNING. ${auth}= Create List runtimeUser zb!XztG34 - Log Creating session https://${POLICY_RUNTIME_ACM_IP}:6969 + Log Creating session http://${POLICY_RUNTIME_ACM_IP}:6969 ${postjson}= Get file ${CURDIR}/data/StateChangeRunningAC.json - ${session}= Create Session policy https://${POLICY_RUNTIME_ACM_IP}:6969 auth=${auth} + ${session}= Create Session policy http://${POLICY_RUNTIME_ACM_IP}:6969 auth=${auth} ${headers}= Create Dictionary Accept=application/json Content-Type=application/json ${resp}= PUT On Session policy /onap/policy/clamp/acm/v2/instantiation/command data=${postjson} headers=${headers} expected_status=406 Log Received response from runtime acm ${resp.text} @@ -72,8 +72,8 @@ StateChangeRunningAutomationComposition QueryInstantiatedACs [Documentation] Get Instantiated AutomationCompositions ${auth}= Create List runtimeUser zb!XztG34 - Log Creating session https://${POLICY_RUNTIME_ACM_IP}:6969 - ${session}= Create Session policy https://${POLICY_RUNTIME_ACM_IP}:6969 auth=${auth} + Log Creating session http://${POLICY_RUNTIME_ACM_IP}:6969 + ${session}= Create Session policy http://${POLICY_RUNTIME_ACM_IP}:6969 auth=${auth} ${headers}= Create Dictionary Accept=application/json Content-Type=application/json ${resp}= GET On Session policy /onap/policy/clamp/acm/v2/instantiation headers=${headers} Log Received response from runtime acm ${resp.text} diff --git a/csit/common-library.robot b/csit/common-library.robot index aa737a02..b90f854c 100644 --- a/csit/common-library.robot +++ b/csit/common-library.robot @@ -16,8 +16,8 @@ HealthCheckAuth PerformPostRequest [Arguments] ${hostname} ${url} ${expectedstatus} ${postjson} ${params} ${auth} - Log Creating session https://${hostname}:6969 - ${session}= Create Session policy https://${hostname}:6969 auth=${auth} + Log Creating session http://${hostname}:6969 + ${session}= Create Session policy http://${hostname}:6969 auth=${auth} ${headers}= Create Dictionary Accept=application/json Content-Type=application/json ${resp}= POST On Session policy ${url} data=${postjson} params=${params} headers=${headers} expected_status=${expectedstatus} Log Received response from policy ${resp.text} @@ -25,8 +25,8 @@ PerformPostRequest PerformPutRequest [Arguments] ${hostname} ${url} ${expectedstatus} ${params} ${auth} - Log Creating session https://${hostname}:6969 - ${session}= Create Session policy https://${hostname}:6969 auth=${auth} + Log Creating session http://${hostname}:6969 + ${session}= Create Session policy http://${hostname}:6969 auth=${auth} ${headers}= Create Dictionary Accept=application/json Content-Type=application/json ${resp}= PUT On Session policy ${url} params=${params} headers=${headers} expected_status=${expectedstatus} Log Received response from policy ${resp.text} @@ -34,8 +34,8 @@ PerformPutRequest PerformGetRequest [Arguments] ${hostname} ${url} ${expectedstatus} ${params} ${auth} - Log Creating session https://${hostname}:6969 - ${session}= Create Session policy https://${hostname}:6969 auth=${auth} + Log Creating session http://${hostname}:6969 + ${session}= Create Session policy http://${hostname}:6969 auth=${auth} ${headers}= Create Dictionary Accept=application/json Content-Type=application/json ${resp}= GET On Session policy ${url} params=${params} headers=${headers} expected_status=${expectedstatus} Log Received response from policy ${resp.text} @@ -43,8 +43,8 @@ PerformGetRequest PerformDeleteRequest [Arguments] ${hostname} ${url} ${expectedstatus} ${auth} - Log Creating session https://${hostname}:6969 - ${session}= Create Session policy https://${hostname}:6969 auth=${auth} + Log Creating session http://${hostname}:6969 + ${session}= Create Session policy http://${hostname}:6969 auth=${auth} ${headers}= Create Dictionary Accept=application/json Content-Type=application/json ${resp}= DELETE On Session policy ${url} headers=${headers} expected_status=${expectedstatus} Log Received response from policy ${resp.text} @@ -114,8 +114,8 @@ QueryPolicyStatus GetMetrics [Arguments] ${hostname} ${auth} - Log Creating session https://${hostname}:6969 - ${session}= Create Session policy https://${hostname}:6969 auth=${auth} + Log Creating session http://${hostname}:6969 + ${session}= Create Session policy http://${hostname}:6969 auth=${auth} ${resp}= GET On Session policy /metrics expected_status=200 Log Received response from policy ${resp.text} [return] ${resp} diff --git a/csit/compose-grafana.yml b/csit/compose-grafana.yml index 75b39fbb..f9908533 100644 --- a/csit/compose-grafana.yml +++ b/csit/compose-grafana.yml @@ -165,7 +165,6 @@ services: - 9696 volumes: - ./config/drools-apps/custom:/tmp/policy-install/config:ro - - ./config/drools-apps/custom/feature-lifecycle.properties:/opt/app/policy/features/lifecycle/config/feature-lifecycle.properties:ro - ./wait_for_port.sh:/opt/app/policy/bin/wait_for_port.sh:ro env_file: - config/drools-apps/env/base.conf @@ -224,6 +223,23 @@ services: 'pap', '6969', 'apex-pdp', '6969' ] + policy-clamp-runtime-acm: + image: nexus3.onap.org:10001/onap/policy-clamp-runtime-acm:${POLICY_CLAMP_VERSION} + container_name: policy-clamp-runtime-acm + depends_on: + - mariadb + - simulator + hostname: policy-clamp-runtime-acm + expose: + - 6969 + volumes: + - ./wait_for_port.sh:/opt/app/policy/bin/wait_for_port.sh:ro + - ./config/clamp/AcRuntimeParameters.yaml:/opt/app/policy/clamp/etc/AcRuntimeParameters.yaml:ro + entrypoint: /opt/app/policy/bin/wait_for_port.sh + command: [ + '-c', './acm-runtime.sh', + 'message-router', '3904' + ] prometheus: image: prom/prometheus:v2.32.1 container_name: prometheus @@ -244,3 +260,18 @@ services: - ./metrics/dashboard.yaml:/etc/grafana/provisioning/dashboards/dashboard.yaml - ./metrics/datasource.yaml:/etc/grafana/provisioning/datasources/datasource.yaml - ./metrics/dashboards:/var/lib/grafana/dashboards + node-exporter: + image: prom/node-exporter:latest + container_name: node-exporter + restart: unless-stopped + volumes: + - /proc:/host/proc:ro + - /sys:/host/sys:ro + - /:/rootfs:ro + command: + - '--path.procfs=/host/proc' + - '--path.rootfs=/rootfs' + - '--path.sysfs=/host/sys' + - '--collector.filesystem.mount-points-exclude=^/(sys|proc|dev|host|etc)($$|/)' + expose: + - 9100 diff --git a/csit/config/apex-pdp/OnapPfConfig.json b/csit/config/apex-pdp/OnapPfConfig.json index 74085a19..5760259b 100644 --- a/csit/config/apex-pdp/OnapPfConfig.json +++ b/csit/config/apex-pdp/OnapPfConfig.json @@ -5,7 +5,7 @@ "port": 6969, "userName": "healthcheck", "password": "zb!XztG34", - "https": {{HTTPS_ENABLED}}, + "https": false, "prometheus": true }, "pdpStatusParameters":{ @@ -29,13 +29,13 @@ "topic" : "POLICY-PDP-PAP", "servers" : [ "message-router" ], "topicCommInfrastructure" : "dmaap", - "useHttps" : {{HTTPS_ENABLED}} + "useHttps" : false }], "topicSinks" : [{ "topic" : "POLICY-PDP-PAP", "servers" : [ "message-router" ], "topicCommInfrastructure" : "dmaap", - "useHttps" : {{HTTPS_ENABLED}} + "useHttps" : false }] } } diff --git a/csit/config/apex-pdp/groups.json b/csit/config/apex-pdp/groups.json new file mode 100644 index 00000000..bd5c2868 --- /dev/null +++ b/csit/config/apex-pdp/groups.json @@ -0,0 +1,28 @@ +{ + "groups": [ + { + "name": "defaultGroup", + "version": "1.0.0", + "description": "The default group that registers all supported policy types and pdps.", + "pdpGroupState": "ACTIVE", + "pdpSubgroups": [ + { + "pdpType": "apex", + "supportedPolicyTypes": [ + { + "name": "onap.policies.controlloop.operational.common.Apex", + "version": "1.0.0" + }, + { + "name": "onap.policies.native.Apex", + "version": "1.0.0" + } + ], + "currentInstanceCount": 0, + "desiredInstanceCount": 1, + "policies": [] + } + ] + } + ] +} diff --git a/csit/config/apex-pdp/logback.xml b/csit/config/apex-pdp/logback.xml new file mode 100644 index 00000000..eb5613c0 --- /dev/null +++ b/csit/config/apex-pdp/logback.xml @@ -0,0 +1,122 @@ + + + + + + + + + + + + + + + + + ${logDir}/${errorLog}.log + + ${logDir}/${errorLog}.%d{yyyy-MM-dd}.%i.log.zip + + 50MB + 30 + 10GB + + + WARN + + + ${errorPattern} + + + + + + + + + ${logDir}/${debugLog}.log + + ${logDir}/${debugLog}.%d{yyyy-MM-dd}.%i.log.zip + + 50MB + 30 + 10GB + + + ${debugPattern} + + + + + + + + + ${logDir}/${networkLog}.log + + ${logDir}/${networkLog}.%d{yyyy-MM-dd}.%i.log.zip + + 50MB + 30 + 10GB + + + ${networkPattern} + + + + + + + + + + [%d{yyyy-MM-dd'T'HH:mm:ss.SSS+00:00, UTC}|%level|%logger{0}|%thread] %msg%n + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/csit/config/api/groups.json b/csit/config/api/groups.json new file mode 100644 index 00000000..6ee30e1c --- /dev/null +++ b/csit/config/api/groups.json @@ -0,0 +1,137 @@ +{ + "groups": [ + { + "name": "defaultGroup", + "version": "1.0.0", + "description": "The default group that registers all supported policy types and pdps.", + "pdpGroupState": "ACTIVE", + "pdpSubgroups": [ + { + "pdpType": "xacml", + "supportedPolicyTypes": [ + { + "name": "onap.policies.controlloop.guard.common.FrequencyLimiter", + "version": "1.0.0" + }, + { + "name": "onap.policies.controlloop.guard.common.MinMax", + "version": "1.0.0" + }, + { + "name": "onap.policies.controlloop.guard.common.Blacklist", + "version": "1.0.0" + }, + { + "name": "onap.policies.controlloop.guard.common.Filter", + "version": "1.0.0" + }, + { + "name": "onap.policies.controlloop.guard.coordination.FirstBlocksSecond", + "version": "1.0.0" + }, + { + "name": "onap.policies.monitoring.*", + "version": "1.0.0" + }, + { + "name": "onap.policies.optimization.*", + "version": "1.0.0" + }, + { + "name": "onap.policies.optimization.resource.AffinityPolicy", + "version": "1.0.0" + }, + { + "name": "onap.policies.optimization.resource.DistancePolicy", + "version": "1.0.0" + }, + { + "name": "onap.policies.optimization.resource.HpaPolicy", + "version": "1.0.0" + }, + { + "name": "onap.policies.optimization.resource.OptimizationPolicy", + "version": "1.0.0" + }, + { + "name": "onap.policies.optimization.resource.PciPolicy", + "version": "1.0.0" + }, + { + "name": "onap.policies.optimization.service.QueryPolicy", + "version": "1.0.0" + }, + { + "name": "onap.policies.optimization.service.SubscriberPolicy", + "version": "1.0.0" + }, + { + "name": "onap.policies.optimization.resource.Vim_fit", + "version": "1.0.0" + }, + { + "name": "onap.policies.optimization.resource.VnfPolicy", + "version": "1.0.0" + }, + { + "name": "onap.policies.native.Xacml", + "version": "1.0.0" + }, + { + "name": "onap.policies.Naming", + "version": "1.0.0" + }, + { + "name": "onap.policies.match.*", + "version": "1.0.0" + } + ], + "currentInstanceCount": 0, + "desiredInstanceCount": 1, + "policies": [ + { + "name": "SDNC_Policy.ONAP_NF_NAMING_TIMESTAMP", + "version": "1.0.0" + } + ] + }, + { + "pdpType": "drools", + "supportedPolicyTypes": [ + { + "name": "onap.policies.controlloop.operational.common.Drools", + "version": "1.0.0" + }, + { + "name": "onap.policies.native.drools.Controller", + "version": "1.0.0" + }, + { + "name": "onap.policies.native.drools.Artifact", + "version": "1.0.0" + } + ], + "currentInstanceCount": 0, + "desiredInstanceCount": 1, + "policies": [] + }, + { + "pdpType": "apex", + "supportedPolicyTypes": [ + { + "name": "onap.policies.controlloop.operational.common.Apex", + "version": "1.0.0" + }, + { + "name": "onap.policies.native.Apex", + "version": "1.0.0" + } + ], + "currentInstanceCount": 0, + "desiredInstanceCount": 1, + "policies": [] + } + ] + } + ] +} diff --git a/csit/config/api/logback.xml b/csit/config/api/logback.xml new file mode 100644 index 00000000..83a70993 --- /dev/null +++ b/csit/config/api/logback.xml @@ -0,0 +1,207 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ${logDir}/${errorLog}.log + + ${logDir}/${errorLog}.%d{yyyy-MM-dd}.%i.log.zip + + 50MB + 30 + 10GB + + + WARN + + + ${errorPattern} + + + + + + + + + ${logDir}/${debugLog}.log + + ${logDir}/${debugLog}.%d{yyyy-MM-dd}.%i.log.zip + + 50MB + 30 + 10GB + + + ${debugPattern} + + + + + + + + + ${logDir}/${networkLog}.log + + ${logDir}/${networkLog}.%d{yyyy-MM-dd}.%i.log.zip + + 50MB + 30 + 10GB + + + ${networkPattern} + + + + + + + + + ${logDir}/${metricLog}.log + + ${logDir}/${metricLog}.%d{yyyy-MM-dd}.%i.log.zip + + 50MB + 30 + 10GB + + + ${metricPattern} + + + + + + + + + ${logDir}/${transactionLog}.log + + ${logDir}/${transactionLog}.%d{yyyy-MM-dd}.%i.log.zip + + 50MB + 30 + 10GB + + + ${transactionPattern} + + + + + + + + + + [%d{yyyy-MM-dd'T'HH:mm:ss.SSS+00:00, UTC}|%level|%logger{0}|%thread] %msg%n + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/csit/config/cakey.pem b/csit/config/cakey.pem deleted file mode 100644 index 461c1523..00000000 --- a/csit/config/cakey.pem +++ /dev/null @@ -1,30 +0,0 @@ ------BEGIN ENCRYPTED PRIVATE KEY----- -MIIFHDBOBgkqhkiG9w0BBQ0wQTApBgkqhkiG9w0BBQwwHAQIrbGtIemEC2oCAggA -MAwGCCqGSIb3DQIJBQAwFAYIKoZIhvcNAwcECNUTed7WnOACBIIEyOcQO0PmJ/Qj -0NSwyyRpztMUtwuBanXC43vHgPfkYXiQRSl7vFrKZ6c3rYc8+ZFIK4U6XzK9peuc -Tqkt408CBlpOcHqYEtgIQ+U2Fm2ytbIa8BVYbKN3w2+GRN1bbfNwn2+k23r7lceb -4M4OOM6aaEcTITXa63xE0LdpDX2URh4Jaty/6kVhu4ZHWarHZ4hoeZKbdS4WEz66 -j0Rajmpwddo59EK5S3sseYqkqKJzfBnDijTbk45xTzOxS14JqEmGBJtWCGehl2ax -9zJE+27E8BUB9yEE7nrUXiEyMW3LHePb2sjcdXhRlS1dczyR/y17m/d2auJ26uiw -IUMcuW0KJ6y9uqH9t8RyhjXabRktKbl3bGvcItd+pHBFlXw+aFVXA9xraXjIj1+B -aKsIL7KKmsK8hjhjaPw7KKTScj5ttHSI9rrUsu3o/N2HdPGhPp/BY1ycW7+Aen7/ -0lRBoxvzNjj0IlVEBUGWha+ZscD0CpP9Xn9WpzMlBEDvZ6RS8ddn1uQlG9fbOZ9p -phEewKlPUbXShluGivmAVuOvcIVXTi+V8lExIYdWo49H8U0zd8XYScxlAQYIkO8+ -O1roHsmUDI8QSaILW3bMnEr7oznyGe3qXA1rs+z0ZZWrlGunIeG71H7jrf2z2IOt -RB2P/fYova0XoT/rZ88tn61zeJOBLvJqy2Z4Fqa3dnpEkGsKot6QAvaTkrGegN1+ -fEZQ+EdUAzqgMoBeNuadJ6Q42tsnpLzcAukcqz3x5zJuirQKgX9ALxVuh7xMHSVj -W4D9RIpPxOK5ZUZ/COro+Fd9SXqZAevrsXb0q3KHIglZ3RhVxVFuWq8Y/6Tk1Zc9 -mZCKIrwQPzs3llvckebFf16+Vanxtwmb8xkWtYO7LzK28vVkZJ7HtKzX1zcy+OmX -F/gZ+tzJk/vZg8OtW3Z+ypjRlh5ch+M7b2l448UFdMKrdqk4FpSsgZtlDAsi/1bK -9HBNiskke7j1yj963A7rP0X/b2dRa7W/KrfMprtGp0wWUj1jm/SP5IaX+hfQYG9Z -0vnU68A8p9Kphd1J2BDm3lrUhiZSwZKrZYNXelLifcNhjMn0ChhcShf4AVOb3gVH -cSKtABk0B2bSWU6mgVHhmBQbc4grQdGG1ilyx4U0QnUJA2HLbiWvqe4NOWQjReTs -6RptSeidlCu47f99U73f/f+X7WhOSEaCkzDhrWZzvOo3lwli9h18m2S+yDasMwVe -Q0Ymv1+DiyXELS+jKbTiIMzuYGK4TYOE9OcQDNE0ob/C4oJioEGcdi9s2akYMXTt -FFWn52elJnd+5Q38ElO3jpK3L1cOr4KA9tahl1uM1C8blM696fBbeS2A5HHh8PbO -tl0GXXLgSM5fzGhKlZCbRnVIsusONC0O3cw72RKC1OszaNIYctIoYy3OcSeG85wy -0BjiWo72Nvc1yKdwO4mRm1IYm95N61uv2bLMaRXtjQSlHqrY/S5UdTO/1SnMOYRZ -KChzLf8rRN0c6lb+3bov167Uveu6tAGgXE8W53w9fA7ZwcmdDchnPJsN4YkM2bGh -qoHiVDXvb4OS3H4HMoJBv/yUOb/icr5Z+kALpnH2FGUx/N36NcYH/cDesFNj7X9T -FIhIqnbHcdIEGmjnmXCwmA== ------END ENCRYPTED PRIVATE KEY----- diff --git a/csit/config/careq.pem b/csit/config/careq.pem deleted file mode 100644 index b56ade1e..00000000 --- a/csit/config/careq.pem +++ /dev/null @@ -1,16 +0,0 @@ ------BEGIN CERTIFICATE REQUEST----- -MIICjDCCAXQCAQAwRzELMAkGA1UEBhMCVVMxEzARBgNVBAgMCk5ldyBKZXJzZXkx -DTALBgNVBAsMBE9OQVAxFDASBgNVBAMMC3BvbGljeS5vbmFwMIIBIjANBgkqhkiG -9w0BAQEFAAOCAQ8AMIIBCgKCAQEA0qNgvDgs8fDWKUqQ0/ZLE3X8Ugg1EMnH0KVb -qBAQlQjcP/G02ucBbp5KATXMI7RJQTtjajeQlLAHs2G8rZDRoWwg/61aEI6SGHzZ -gb0k/ROQ1sIrtSfbHVSrZIyQaIF8XZrAh5RdA2oCLwJbc80aCDY06Sc4OsuljylN -wqZHlBY/KBytkVGbeRY79dx7844SN7Wcr8qRAfLo1Gc3ZgSSwpMUHFueWr84Fh1O -4xc9TXiz52QACWjHbqrI66IJLRZrvqMJz+hVOIQeT1c0ixTfb7q4kH5yDSmqZuNF -PevnzL3Z0EoH/d3cJ5JmIjzKL5O+FMY43fPisziJoQmj36GaFQIDAQABoAAwDQYJ -KoZIhvcNAQELBQADggEBAFdqXYjXK+88XvJyspAD5YX9XKBAiOH+eyacdMUKqkDJ -coYw4xBX0LlzupZamg5Qwk/Ad/SMlqXL29hI322HN7Frx3dwlNzuighIMZ62sN/s -FFf+rrAxqMBb1b++9thfOgrZdIQI5WodU0EELy+sFpRAbkieyEQ7a1SVie1+7Afu -KhGfEGTvgln81eMr+QB0gRkTlorC7AkeWJzIgWMh4kTcujTWsVc/FLb1jSe7Hc7R -diOdNes3EZLjfdpORhuL3BOb+HzTwVUyw2BHD3bD0u+XFOfDLIUlfdOSesuf6bi6 -JKHSeUV0xww0R0WfsgYxN/6HSFQ8hWFGa3PjY5D1UNE= ------END CERTIFICATE REQUEST----- diff --git a/csit/config/caroot.cer b/csit/config/caroot.cer deleted file mode 100644 index cd12c65c..00000000 --- a/csit/config/caroot.cer +++ /dev/null @@ -1,19 +0,0 @@ ------BEGIN CERTIFICATE----- -MIIDFTCCAf0CFCAWwWW10ZqYy46ID/aAsN1zxnkgMA0GCSqGSIb3DQEBCwUAMEcx -CzAJBgNVBAYTAlVTMRMwEQYDVQQIDApOZXcgSmVyc2V5MQ0wCwYDVQQLDARPTkFQ -MRQwEgYDVQQDDAtwb2xpY3kub25hcDAeFw0yMjA5MDUxMzI1MDlaFw0zMjA5MDIx -MzI1MDlaMEcxCzAJBgNVBAYTAlVTMRMwEQYDVQQIDApOZXcgSmVyc2V5MQ0wCwYD -VQQLDARPTkFQMRQwEgYDVQQDDAtwb2xpY3kub25hcDCCASIwDQYJKoZIhvcNAQEB -BQADggEPADCCAQoCggEBANKjYLw4LPHw1ilKkNP2SxN1/FIINRDJx9ClW6gQEJUI -3D/xtNrnAW6eSgE1zCO0SUE7Y2o3kJSwB7NhvK2Q0aFsIP+tWhCOkhh82YG9JP0T -kNbCK7Un2x1Uq2SMkGiBfF2awIeUXQNqAi8CW3PNGgg2NOknODrLpY8pTcKmR5QW -PygcrZFRm3kWO/Xce/OOEje1nK/KkQHy6NRnN2YEksKTFBxbnlq/OBYdTuMXPU14 -s+dkAAlox26qyOuiCS0Wa76jCc/oVTiEHk9XNIsU32+6uJB+cg0pqmbjRT3r58y9 -2dBKB/3d3CeSZiI8yi+TvhTGON3z4rM4iaEJo9+hmhUCAwEAATANBgkqhkiG9w0B -AQsFAAOCAQEAumReAeDIj8a/bba3Lyhe55NSrMiVzZD9GRxJSUkmbi0RD6QRJpHG -HXu9e8v3luP7Y8INz6c/ztCCNWCIggR53qYRdGAssId/mLpkx02WOvQGdWiPIoZQ -VmUC4BORkfuHk/LceKPwIf+RM52NzlRPhPawZhDITVoVx5EASeV5ZrVUMoxDgix6 -Wk56MYUSjAjMQq3NFPzLbQEMA73gSCifo29NSPqEtTzNKI4UHTgOaXnv59YKP3t7 -IgbCtAxiN4qqUgemTXeBvfpLLpuq0wrltxu2joqprikvJujqxvxzOXlH4cMik47v -aRqp806pFMBIf7P8S3b4MzLrZi8U5/CqVA== ------END CERTIFICATE----- diff --git a/csit/config/caserial.txt b/csit/config/caserial.txt deleted file mode 100644 index 3bdca32d..00000000 --- a/csit/config/caserial.txt +++ /dev/null @@ -1 +0,0 @@ -1245 diff --git a/csit/config/clamp/AcRuntimeParameters.yaml b/csit/config/clamp/AcRuntimeParameters.yaml index 40031828..ef686cf7 100644 --- a/csit/config/clamp/AcRuntimeParameters.yaml +++ b/csit/config/clamp/AcRuntimeParameters.yaml @@ -32,6 +32,8 @@ security: server: port: 6969 + ssl: + enabled: false servlet: context-path: /onap/policy/clamp/acm error: @@ -52,17 +54,18 @@ runtime: - ${topicServer:message-router} topicCommInfrastructure: dmaap fetchTimeout: 15000 - useHttps: true + useHttps: false topicSinks: - topic: POLICY-ACRUNTIME-PARTICIPANT servers: - ${topicServer:message-router} topicCommInfrastructure: dmaap - useHttps: true + useHttps: false management: endpoints: web: + base-path: / exposure: include: health, metrics, prometheus diff --git a/csit/config/clamp/application-smoke.properties b/csit/config/clamp/ClampBackend.properties similarity index 87% rename from csit/config/clamp/application-smoke.properties rename to csit/config/clamp/ClampBackend.properties index 40578077..b9776d04 100644 --- a/csit/config/clamp/application-smoke.properties +++ b/csit/config/clamp/ClampBackend.properties @@ -44,11 +44,11 @@ ### HTTPS Example: ### -------------- ### server.port=8443 -server.ssl.key-store=file:/opt/policy/clamp/policy-keystore -server.ssl.key-store-password=enc:qWxBtY7w9h5Hl72vQKgI5G1qqyRIuBarQqMkVDHqZmd -server.ssl.key-password=enc:qWxBtY7w9h5Hl72vQKgI5G1qqyRIuBarQqMkVDHqZmd -server.ssl.key-store-type=jks -server.port=8443 +#server.ssl.key-store=file:/opt/policy/clamp/policy-keystore +#server.ssl.key-store-password=enc:qWxBtY7w9h5Hl72vQKgI5G1qqyRIuBarQqMkVDHqZmd +#server.ssl.key-password=enc:qWxBtY7w9h5Hl72vQKgI5G1qqyRIuBarQqMkVDHqZmd +#server.ssl.key-store-type=jks +server.port=8445 ## Config part for Server certificates # Can be a classpath parameter instead of file:/ #server.ssl.key-store=classpath:/clds/aaf/org.onap.clamp.p12 @@ -56,22 +56,22 @@ server.port=8443 #server.ssl.key-password=enc:YZs7M6IftyPjHniTa6J7G2416hssb8qI-Av8D1b8pPS ## Config part for Client certificates -server.ssl.client-auth=want +#server.ssl.client-auth=want #server.ssl.trust-store=classpath:/clds/aaf/truststoreONAPall.jks #server.ssl.trust-store-password=enc:iDnPBBLq_EMidXlMa1FEuBR8TZzYxrCg66vq_XfLHdJ -server.ssl.trust-store=file:/opt/policy/clamp/policy-truststore -server.ssl.trust-store-password=enc:qWxBtY7w9h5Hl72vQKgI5G1qqyRIuBarQqMkVDHqZmd +#server.ssl.trust-store=file:/opt/policy/clamp/policy-truststore +#server.ssl.trust-store-password=enc:qWxBtY7w9h5Hl72vQKgI5G1qqyRIuBarQqMkVDHqZmd # The key file used to decode the key store and trust store password # If not defined, the key store and trust store password will not be decrypted #clamp.config.keyFile=classpath:/clds/aaf/org.onap.clamp.keyfile -clamp.config.keyFile=file:/opt/policy/clamp/clamp-be-keyfile +#clamp.config.keyFile=file:/opt/policy/clamp/clamp-be-keyfile -#server.http-to-https-redirection.port=8080 +server.http-to-https-redirection.port=8080 server.servlet.context-path=/ #Modified engine-rest applicationpath -spring.profiles.active=clamp-default,clamp-default-user,clamp-sdc-controller,clamp-ssl-config,clamp-policy-controller,default-dictionary-elements +spring.profiles.active=clamp-default,clamp-default-user,clamp-policy-controller,default-dictionary-elements spring.http.converters.preferred-json-mapper=gson #The max number of active threads in this pool @@ -134,10 +134,10 @@ async.max.pool.size=20 async.queue.capacity=500 #For logback file -#clamp.config.logback.path= -clamp.config.logback.filename=logback-default.xml +clamp.config.logback.path=/opt/policy/clamp/config +clamp.config.logback.filename=logback.xml #The log folder that will be used in logback.xml file -clamp.config.log.path=/var/log/onap/clamp +clamp.config.log.path=/var/log/onap/policy/clamp clamp.config.files.systemProperties=classpath:/system.properties clamp.config.files.cldsUsers=classpath:/clds/clds-users.json clamp.config.files.globalProperties=classpath:/clds/templates/globalProperties.json @@ -148,10 +148,10 @@ clamp.config.httpclient.connectTimeout=10000 # # Configuration Settings for Policy Engine Components -clamp.config.policy.api.url={{PROTOCOL}}${POLICY_API_HOST}:6969 +clamp.config.policy.api.url=http://${POLICY_API_HOST}:6969 clamp.config.policy.api.userName=policyadmin clamp.config.policy.api.password=zb!XztG34 -clamp.config.policy.pap.url={{PROTOCOL}}${POLICY_PAP_HOST}:6969 +clamp.config.policy.pap.url=http://${POLICY_PAP_HOST}:6969 clamp.config.policy.pap.userName=policyadmin clamp.config.policy.pap.password=zb!XztG34 @@ -160,12 +160,12 @@ clamp.config.policy.pap.password=zb!XztG34 clamp.config.sdc.csarFolder = /tmp/sdc-controllers #DCAE Inventory Url Properties -clamp.config.dcae.inventory.url={{PROTOCOL}}localhost:8085 +clamp.config.dcae.inventory.url=http://localhost:8085 clamp.config.dcae.intentory.retry.interval=10000 clamp.config.dcae.intentory.retry.limit=5 #DCAE Deployment Url Properties -clamp.config.dcae.deployment.url={{PROTOCOL}}localhost:8085 +clamp.config.dcae.deployment.url=http://localhost:8085 clamp.config.dcae.deployment.userName=test clamp.config.dcae.deployment.password=test @@ -187,11 +187,11 @@ clamp.config.tosca.converter.default.datatypes=classpath:/clds/tosca-converter/d clamp.config.tosca.converter.dictionary.support.enabled=true # Configuration settings for CDS -clamp.config.cds.url={{PROTOCOL}}cds-blueprints-processor-http:8080 +clamp.config.cds.url=http://cds-blueprints-processor-http:8080 clamp.config.cds.userName=ccsdkapps clamp.config.cds.password=ccsdkapps # Configuration settings for ControlLoop Runtime Rest API -clamp.config.acm.runtime.url={{PROTOCOL}}${RUNTIME_HOST}:6969 +clamp.config.acm.runtime.url=http://${RUNTIME_HOST}:6969 clamp.config.acm.runtime.userName=runtimeUser clamp.config.acm.runtime.password=zb!XztG34 diff --git a/csit/config/clamp/HttpParticipantParameters.yaml b/csit/config/clamp/HttpParticipantParameters.yaml index 529b095a..15768882 100644 --- a/csit/config/clamp/HttpParticipantParameters.yaml +++ b/csit/config/clamp/HttpParticipantParameters.yaml @@ -22,19 +22,21 @@ participant: - ${topicServer:message-router} topicCommInfrastructure: dmaap fetchTimeout: 15000 - useHttps: true + useHttps: false topicSinks: - topic: POLICY-ACRUNTIME-PARTICIPANT servers: - ${topicServer:message-router} topicCommInfrastructure: dmaap - useHttps: true + useHttps: false management: endpoints: web: exposure: include: health, metrics, prometheus server: - port: 8084 + port: 6969 + ssl: + enabled: false servlet: context-path: /onap/policy/clamp/acm/httpparticipant diff --git a/csit/config/clamp/KubernetesParticipantParameters.yaml b/csit/config/clamp/KubernetesParticipantParameters.yaml index c6acf405..c13f8151 100644 --- a/csit/config/clamp/KubernetesParticipantParameters.yaml +++ b/csit/config/clamp/KubernetesParticipantParameters.yaml @@ -26,14 +26,14 @@ participant: - ${topicServer:message-router} topicCommInfrastructure: dmaap fetchTimeout: 15000 - useHttps: true + useHttps: false topicSinks: - topic: POLICY-ACRUNTIME-PARTICIPANT servers: - ${topicServer:message-router} topicCommInfrastructure: dmaap - useHttps: true + useHttps: false management: endpoints: @@ -41,7 +41,9 @@ management: exposure: include: health, metrics, prometheus server: - port: 8083 + port: 6969 + ssl: + enabled: false servlet: context-path: /onap/policy/clamp/acm/k8sparticipant diff --git a/csit/config/clamp/PolicyParticipantParameters.yaml b/csit/config/clamp/PolicyParticipantParameters.yaml index 1cb4e6dc..acaaebbe 100644 --- a/csit/config/clamp/PolicyParticipantParameters.yaml +++ b/csit/config/clamp/PolicyParticipantParameters.yaml @@ -13,7 +13,7 @@ participant: port: 6969 userName: policyadmin password: zb!XztG34 - useHttps: true + useHttps: false allowSelfSignedCerts: true policyPapParameters: clientName: pap @@ -21,7 +21,7 @@ participant: port: 6969 userName: policyadmin password: zb!XztG34 - useHttps: true + useHttps: false allowSelfSignedCerts: true intermediaryParameters: reportingTimeIntervalMs: 120000 @@ -40,20 +40,22 @@ participant: - ${topicServer:message-router} topicCommInfrastructure: dmaap fetchTimeout: 15000 - useHttps: true + useHttps: false topicSinks: - topic: POLICY-ACRUNTIME-PARTICIPANT servers: - ${topicServer:message-router} topicCommInfrastructure: dmaap - useHttps: true + useHttps: false management: endpoints: web: exposure: include: health, metrics, prometheus server: - port: 8085 + port: 6969 + ssl: + enabled: false servlet: context-path: /onap/policy/clamp/acm/policyparticipant diff --git a/csit/config/clamp/groups.json b/csit/config/clamp/groups.json new file mode 100644 index 00000000..6ee30e1c --- /dev/null +++ b/csit/config/clamp/groups.json @@ -0,0 +1,137 @@ +{ + "groups": [ + { + "name": "defaultGroup", + "version": "1.0.0", + "description": "The default group that registers all supported policy types and pdps.", + "pdpGroupState": "ACTIVE", + "pdpSubgroups": [ + { + "pdpType": "xacml", + "supportedPolicyTypes": [ + { + "name": "onap.policies.controlloop.guard.common.FrequencyLimiter", + "version": "1.0.0" + }, + { + "name": "onap.policies.controlloop.guard.common.MinMax", + "version": "1.0.0" + }, + { + "name": "onap.policies.controlloop.guard.common.Blacklist", + "version": "1.0.0" + }, + { + "name": "onap.policies.controlloop.guard.common.Filter", + "version": "1.0.0" + }, + { + "name": "onap.policies.controlloop.guard.coordination.FirstBlocksSecond", + "version": "1.0.0" + }, + { + "name": "onap.policies.monitoring.*", + "version": "1.0.0" + }, + { + "name": "onap.policies.optimization.*", + "version": "1.0.0" + }, + { + "name": "onap.policies.optimization.resource.AffinityPolicy", + "version": "1.0.0" + }, + { + "name": "onap.policies.optimization.resource.DistancePolicy", + "version": "1.0.0" + }, + { + "name": "onap.policies.optimization.resource.HpaPolicy", + "version": "1.0.0" + }, + { + "name": "onap.policies.optimization.resource.OptimizationPolicy", + "version": "1.0.0" + }, + { + "name": "onap.policies.optimization.resource.PciPolicy", + "version": "1.0.0" + }, + { + "name": "onap.policies.optimization.service.QueryPolicy", + "version": "1.0.0" + }, + { + "name": "onap.policies.optimization.service.SubscriberPolicy", + "version": "1.0.0" + }, + { + "name": "onap.policies.optimization.resource.Vim_fit", + "version": "1.0.0" + }, + { + "name": "onap.policies.optimization.resource.VnfPolicy", + "version": "1.0.0" + }, + { + "name": "onap.policies.native.Xacml", + "version": "1.0.0" + }, + { + "name": "onap.policies.Naming", + "version": "1.0.0" + }, + { + "name": "onap.policies.match.*", + "version": "1.0.0" + } + ], + "currentInstanceCount": 0, + "desiredInstanceCount": 1, + "policies": [ + { + "name": "SDNC_Policy.ONAP_NF_NAMING_TIMESTAMP", + "version": "1.0.0" + } + ] + }, + { + "pdpType": "drools", + "supportedPolicyTypes": [ + { + "name": "onap.policies.controlloop.operational.common.Drools", + "version": "1.0.0" + }, + { + "name": "onap.policies.native.drools.Controller", + "version": "1.0.0" + }, + { + "name": "onap.policies.native.drools.Artifact", + "version": "1.0.0" + } + ], + "currentInstanceCount": 0, + "desiredInstanceCount": 1, + "policies": [] + }, + { + "pdpType": "apex", + "supportedPolicyTypes": [ + { + "name": "onap.policies.controlloop.operational.common.Apex", + "version": "1.0.0" + }, + { + "name": "onap.policies.native.Apex", + "version": "1.0.0" + } + ], + "currentInstanceCount": 0, + "desiredInstanceCount": 1, + "policies": [] + } + ] + } + ] +} diff --git a/csit/config/clamp/logback-backend.xml b/csit/config/clamp/logback-backend.xml new file mode 100644 index 00000000..cfa280c4 --- /dev/null +++ b/csit/config/clamp/logback-backend.xml @@ -0,0 +1,219 @@ + + + + + + + + + + + + + + + + + + + + + + + + + INFO + + + %d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{1024} - %msg%n + + + + + + + ERROR + ACCEPT + DENY + + ${logDirectory}/error.log + true + + ${errorPattern} + + + ${logDirectory}/error.%d{yyyy-MM-dd}.%i.log.zip + + 50MB + 20 + 1GB + + + + 256 + + + + + ${logDirectory}/debug.log + true + + %d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{1024} - %msg%n + + + + ${logDirectory}/debug.%d{yyyy-MM-dd}.%i.log.zip + + 50MB + 20 + 1GB + + + + 256 + + + + + + ${logDirectory}/audit.log + + ${auditPattern} + + + ${logDirectory}/audit.%d{yyyy-MM-dd}.%i.log.zip + + 50MB + 20 + 1GB + + + + 256 + + + + + + ${logDirectory}/metric.log + + ${metricPattern} + + + ${logDirectory}/metric.%d{yyyy-MM-dd}.%i.log.zip + + 50MB + 20 + 1GB + + + + 256 + + + + + + + ${logDirectory}/security.log + + %X{EntryTimestamp}|%date{yyyy-MM-dd'T'HH:mm:ss.SSSXXX,UTC}|%X{RequestID}|%X{ServiceInstanceId}|%.20thread|%X{VirtualServerName}|%X{ServiceName}|%X{PartnerName}|%X{StatusCode}|%X{ResponseCode}|%X{ResponseDescription}|%X{InstanceUUID}|%.-5level|%X{AlertSeverity}|%X{ServerIPAddress}|%X{ElapsedTime}|%X{ServerFQDN}|%X{RemoteHost}|%X{ClassName}|%X{Unused}|%X{ProcessKey}|%X{CustomField1}|%X{CustomField2}|%X{CustomField3}|%X{CustomField4}|%msg%n + + + + ${logDirectory}/security.%d{yyyy-MM-dd}.%i.log.zip + + 50MB + 20 + 1GB + + + + 256 + + + + + + + + ${logDirectory}/Audits.log + + ${logDirectory}/Audits-%d{yyyy-MM-dd}.%i.log.zip + + 50MB + 20 + 1GB + + + "%d [%thread] %-5level %logger{1024} - %msg%n" + + + + + + + ${logDirectory}/Perform.log + + ${logDirectory}/Perform--%d{yyyy-MM-dd}.%i.log.zip + + 50MB + 20 + 1GB + + + "%d [%thread] %-5level %logger{1024} - %msg%n" + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/csit/config/clamp/logback.xml b/csit/config/clamp/logback.xml new file mode 100644 index 00000000..c316e179 --- /dev/null +++ b/csit/config/clamp/logback.xml @@ -0,0 +1,206 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ${logDir}/${errorLog}.log + + ${logDir}/${errorLog}.%d{yyyy-MM-dd}.%i.log.zip + + 50MB + 30 + 10GB + + + WARN + + + ${errorPattern} + + + + + + + + + ${logDir}/${debugLog}.log + + ${logDir}/${debugLog}.%d{yyyy-MM-dd}.%i.log.zip + + 50MB + 30 + 10GB + + + ${debugPattern} + + + + + + + + + ${logDir}/${networkLog}.log + + ${logDir}/${networkLog}.%d{yyyy-MM-dd}.%i.log.zip + + 50MB + 30 + 10GB + + + ${networkPattern} + + + + + + + + + ${logDir}/${metricLog}.log + + ${logDir}/${metricLog}.%d{yyyy-MM-dd}.%i.log.zip + + 50MB + 30 + 10GB + + + ${metricPattern} + + + + + + + + + ${logDir}/${transactionLog}.log + + ${logDir}/${transactionLog}.%d{yyyy-MM-dd}.%i.log.zip + + 50MB + 30 + 10GB + + + ${transactionPattern} + + + + + + + + + + [%d{yyyy-MM-dd'T'HH:mm:ss.SSS+00:00, UTC}|%level|%logger{0}|%thread] %msg%n + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/csit/config/distribution/defaultConfig.json b/csit/config/distribution/defaultConfig.json index 50cb822e..7f09c6b4 100644 --- a/csit/config/distribution/defaultConfig.json +++ b/csit/config/distribution/defaultConfig.json @@ -5,7 +5,7 @@ "port":6969, "userName":"healthcheck", "password":"zb!XztG34", - "https": {{HTTPS_ENABLED}}, + "https": false, "prometheus": true }, "receptionHandlerParameters":{ @@ -59,7 +59,7 @@ "port": 6969, "userName": "policyadmin", "password": "zb!XztG34", - "useHttps": {{HTTPS_ENABLED}} + "useHttps": false }, "papParameters": { "clientName": "policy-pap", @@ -67,7 +67,7 @@ "port": 6969, "userName": "policyadmin", "password": "zb!XztG34", - "useHttps": {{HTTPS_ENABLED}} + "useHttps": false }, "deployPolicies": true } diff --git a/csit/config/distribution/groups.json b/csit/config/distribution/groups.json new file mode 100644 index 00000000..6ee30e1c --- /dev/null +++ b/csit/config/distribution/groups.json @@ -0,0 +1,137 @@ +{ + "groups": [ + { + "name": "defaultGroup", + "version": "1.0.0", + "description": "The default group that registers all supported policy types and pdps.", + "pdpGroupState": "ACTIVE", + "pdpSubgroups": [ + { + "pdpType": "xacml", + "supportedPolicyTypes": [ + { + "name": "onap.policies.controlloop.guard.common.FrequencyLimiter", + "version": "1.0.0" + }, + { + "name": "onap.policies.controlloop.guard.common.MinMax", + "version": "1.0.0" + }, + { + "name": "onap.policies.controlloop.guard.common.Blacklist", + "version": "1.0.0" + }, + { + "name": "onap.policies.controlloop.guard.common.Filter", + "version": "1.0.0" + }, + { + "name": "onap.policies.controlloop.guard.coordination.FirstBlocksSecond", + "version": "1.0.0" + }, + { + "name": "onap.policies.monitoring.*", + "version": "1.0.0" + }, + { + "name": "onap.policies.optimization.*", + "version": "1.0.0" + }, + { + "name": "onap.policies.optimization.resource.AffinityPolicy", + "version": "1.0.0" + }, + { + "name": "onap.policies.optimization.resource.DistancePolicy", + "version": "1.0.0" + }, + { + "name": "onap.policies.optimization.resource.HpaPolicy", + "version": "1.0.0" + }, + { + "name": "onap.policies.optimization.resource.OptimizationPolicy", + "version": "1.0.0" + }, + { + "name": "onap.policies.optimization.resource.PciPolicy", + "version": "1.0.0" + }, + { + "name": "onap.policies.optimization.service.QueryPolicy", + "version": "1.0.0" + }, + { + "name": "onap.policies.optimization.service.SubscriberPolicy", + "version": "1.0.0" + }, + { + "name": "onap.policies.optimization.resource.Vim_fit", + "version": "1.0.0" + }, + { + "name": "onap.policies.optimization.resource.VnfPolicy", + "version": "1.0.0" + }, + { + "name": "onap.policies.native.Xacml", + "version": "1.0.0" + }, + { + "name": "onap.policies.Naming", + "version": "1.0.0" + }, + { + "name": "onap.policies.match.*", + "version": "1.0.0" + } + ], + "currentInstanceCount": 0, + "desiredInstanceCount": 1, + "policies": [ + { + "name": "SDNC_Policy.ONAP_NF_NAMING_TIMESTAMP", + "version": "1.0.0" + } + ] + }, + { + "pdpType": "drools", + "supportedPolicyTypes": [ + { + "name": "onap.policies.controlloop.operational.common.Drools", + "version": "1.0.0" + }, + { + "name": "onap.policies.native.drools.Controller", + "version": "1.0.0" + }, + { + "name": "onap.policies.native.drools.Artifact", + "version": "1.0.0" + } + ], + "currentInstanceCount": 0, + "desiredInstanceCount": 1, + "policies": [] + }, + { + "pdpType": "apex", + "supportedPolicyTypes": [ + { + "name": "onap.policies.controlloop.operational.common.Apex", + "version": "1.0.0" + }, + { + "name": "onap.policies.native.Apex", + "version": "1.0.0" + } + ], + "currentInstanceCount": 0, + "desiredInstanceCount": 1, + "policies": [] + } + ] + } + ] +} diff --git a/csit/config/distribution/logback.xml b/csit/config/distribution/logback.xml new file mode 100644 index 00000000..fdd850f9 --- /dev/null +++ b/csit/config/distribution/logback.xml @@ -0,0 +1,136 @@ + + + + + + + + + + + + + + + + + + + + + + ${logDir}/${errorLog}.log + + ${logDir}/${errorLog}.%d{yyyy-MM-dd}.%i.log.zip + + 50MB + 30 + 10GB + + + WARN + + + ${errorPattern} + + + + + + + + + ${logDir}/${debugLog}.log + + ${logDir}/${debugLog}.%d{yyyy-MM-dd}.%i.log.zip + + 50MB + 30 + 10GB + + + ${debugPattern} + + + + + + + + + ${logDir}/${networkLog}.log + + ${logDir}/${networkLog}.%d{yyyy-MM-dd}.%i.log.zip + + 50MB + 30 + 10GB + + + ${networkPattern} + + + + + + + + + + [%d{yyyy-MM-dd'T'HH:mm:ss.SSS+00:00, UTC}|%level|%logger{0}|%thread] %msg%n + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/csit/config/dns_ssl.txt b/csit/config/dns_ssl.txt deleted file mode 100644 index 9833ed23..00000000 --- a/csit/config/dns_ssl.txt +++ /dev/null @@ -1,21 +0,0 @@ -subjectAltName = \ - DNS:policy, \ - DNS:drools, \ - DNS:drools.onap, \ - DNS:policy-apex-pdp, \ - DNS:policy-apex-pdp.onap, \ - DNS:policy-api, \ - DNS:policy-api.onap, \ - DNS:policy-distribution, \ - DNS:policy-distribution.onap, \ - DNS:policy-pap, \ - DNS:policy-pap.onap, \ - DNS:policy-xacml-pdp, \ - DNS:policy-xacml-pdp.onap, \ - DNS:simulator, \ - DNS:aai-sim, \ - DNS:grpc-sim, \ - DNS:sdnc-sim, \ - DNS:so-sim, \ - DNS:vfc-sim, \ - DNS:message-router diff --git a/csit/config/drools-apps/custom/engine-system.properties b/csit/config/drools-applications/custom/engine-system.properties similarity index 100% rename from csit/config/drools-apps/custom/engine-system.properties rename to csit/config/drools-applications/custom/engine-system.properties diff --git a/csit/config/drools-apps/custom/feature-lifecycle.properties b/csit/config/drools-applications/custom/feature-lifecycle.properties similarity index 93% rename from csit/config/drools-apps/custom/feature-lifecycle.properties rename to csit/config/drools-applications/custom/feature-lifecycle.properties index dcbf290e..3e862970 100644 --- a/csit/config/drools-apps/custom/feature-lifecycle.properties +++ b/csit/config/drools-applications/custom/feature-lifecycle.properties @@ -29,10 +29,10 @@ dmaap.source.topics.POLICY-PDP-PAP.servers=${envd:DMAAP_SERVERS} dmaap.source.topics.POLICY-PDP-PAP.effectiveTopic=${envd:POLICY_PDP_PAP_TOPIC} dmaap.source.topics.POLICY-PDP-PAP.apiKey=${envd:POLICY_PDP_PAP_API_KEY} dmaap.source.topics.POLICY-PDP-PAP.apiSecret=${envd:POLICY_PDP_PAP_API_SECRET} -dmaap.source.topics.POLICY-PDP-PAP.https=${envd:DMAAP_HTTPS:true} +dmaap.source.topics.POLICY-PDP-PAP.https=${envd:DMAAP_HTTPS:false} dmaap.sink.topics.POLICY-PDP-PAP.servers=${envd:DMAAP_SERVERS} dmaap.sink.topics.POLICY-PDP-PAP.effectiveTopic=${envd:POLICY_PDP_PAP_TOPIC} dmaap.sink.topics.POLICY-PDP-PAP.apiKey=${envd:POLICY_PDP_PAP_API_KEY} dmaap.sink.topics.POLICY-PDP-PAP.apiSecret=${envd:POLICY_PDP_PAP_API_SECRET} -dmaap.sink.topics.POLICY-PDP-PAP.https=${envd:DMAAP_HTTPS:true} +dmaap.sink.topics.POLICY-PDP-PAP.https=${envd:DMAAP_HTTPS:false} diff --git a/csit/config/drools-apps/custom/features.pre.sh b/csit/config/drools-applications/custom/features.pre.sh similarity index 100% rename from csit/config/drools-apps/custom/features.pre.sh rename to csit/config/drools-applications/custom/features.pre.sh diff --git a/csit/config/drools-apps/custom/standalone-settings.xml b/csit/config/drools-applications/custom/standalone-settings.xml similarity index 100% rename from csit/config/drools-apps/custom/standalone-settings.xml rename to csit/config/drools-applications/custom/standalone-settings.xml diff --git a/csit/config/drools-apps/env/base.conf b/csit/config/drools-applications/env/base.conf similarity index 94% rename from csit/config/drools-apps/env/base.conf rename to csit/config/drools-applications/env/base.conf index 7b65681d..c3cf80f7 100644 --- a/csit/config/drools-apps/env/base.conf +++ b/csit/config/drools-applications/env/base.conf @@ -50,6 +50,8 @@ SQL_HOST=mariadb SQL_USER=policy_user SQL_PASSWORD=policy_user SQL_PORT=3306 +JDBC_URL=jdbc:mariadb://mariadb:3306/ +JDBC_OPTS= # AAF @@ -59,7 +61,7 @@ AAF_HOST=aaf.api.simpledemo.onap.org # HTTP Servers -HTTP_SERVER_HTTPS={{HTTPS_ENABLED}} +HTTP_SERVER_HTTPS=false PROMETHEUS=true # LIVENESS Checks @@ -95,7 +97,7 @@ PDP_PORT=6969 PDP_CONTEXT_URI=policy/pdpx/v1/ PDP_USERNAME=healthcheck PDP_PASSWORD=zb!XztG34 - +PDP_HTTPS=false # DCAE DMaaP @@ -106,7 +108,7 @@ DCAE_CONSUMER_GROUP=dcae.policy.shared # Open DMaaP DMAAP_SERVERS=message-router -DMAAP_HTTPS={{HTTPS_ENABLED}} +DMAAP_HTTPS=false # AAI @@ -115,13 +117,14 @@ AAI_PORT=6666 AAI_CONTEXT_URI= AAI_USERNAME=policy@policy.onap.org AAI_PASSWORD=demo123456! +AAI_HTTPS=false # MSO SO_HOST=so-sim SO_PORT=6669 SO_CONTEXT_URI= -SO_URL=https://message-router:6669/ +SO_URL=http://message-router:6669/ SO_USERNAME=InfraPortalClient SO_PASSWORD=password1$ diff --git a/csit/config/drools-apps/env/feature-healthcheck.conf b/csit/config/drools-applications/env/feature-healthcheck.conf similarity index 100% rename from csit/config/drools-apps/env/feature-healthcheck.conf rename to csit/config/drools-applications/env/feature-healthcheck.conf diff --git a/csit/config/drools-apps/env/feature-pooling-dmaap.conf b/csit/config/drools-applications/env/feature-pooling-dmaap.conf similarity index 100% rename from csit/config/drools-apps/env/feature-pooling-dmaap.conf rename to csit/config/drools-applications/env/feature-pooling-dmaap.conf diff --git a/csit/config/drools-applications/groups.json b/csit/config/drools-applications/groups.json new file mode 100644 index 00000000..6ee30e1c --- /dev/null +++ b/csit/config/drools-applications/groups.json @@ -0,0 +1,137 @@ +{ + "groups": [ + { + "name": "defaultGroup", + "version": "1.0.0", + "description": "The default group that registers all supported policy types and pdps.", + "pdpGroupState": "ACTIVE", + "pdpSubgroups": [ + { + "pdpType": "xacml", + "supportedPolicyTypes": [ + { + "name": "onap.policies.controlloop.guard.common.FrequencyLimiter", + "version": "1.0.0" + }, + { + "name": "onap.policies.controlloop.guard.common.MinMax", + "version": "1.0.0" + }, + { + "name": "onap.policies.controlloop.guard.common.Blacklist", + "version": "1.0.0" + }, + { + "name": "onap.policies.controlloop.guard.common.Filter", + "version": "1.0.0" + }, + { + "name": "onap.policies.controlloop.guard.coordination.FirstBlocksSecond", + "version": "1.0.0" + }, + { + "name": "onap.policies.monitoring.*", + "version": "1.0.0" + }, + { + "name": "onap.policies.optimization.*", + "version": "1.0.0" + }, + { + "name": "onap.policies.optimization.resource.AffinityPolicy", + "version": "1.0.0" + }, + { + "name": "onap.policies.optimization.resource.DistancePolicy", + "version": "1.0.0" + }, + { + "name": "onap.policies.optimization.resource.HpaPolicy", + "version": "1.0.0" + }, + { + "name": "onap.policies.optimization.resource.OptimizationPolicy", + "version": "1.0.0" + }, + { + "name": "onap.policies.optimization.resource.PciPolicy", + "version": "1.0.0" + }, + { + "name": "onap.policies.optimization.service.QueryPolicy", + "version": "1.0.0" + }, + { + "name": "onap.policies.optimization.service.SubscriberPolicy", + "version": "1.0.0" + }, + { + "name": "onap.policies.optimization.resource.Vim_fit", + "version": "1.0.0" + }, + { + "name": "onap.policies.optimization.resource.VnfPolicy", + "version": "1.0.0" + }, + { + "name": "onap.policies.native.Xacml", + "version": "1.0.0" + }, + { + "name": "onap.policies.Naming", + "version": "1.0.0" + }, + { + "name": "onap.policies.match.*", + "version": "1.0.0" + } + ], + "currentInstanceCount": 0, + "desiredInstanceCount": 1, + "policies": [ + { + "name": "SDNC_Policy.ONAP_NF_NAMING_TIMESTAMP", + "version": "1.0.0" + } + ] + }, + { + "pdpType": "drools", + "supportedPolicyTypes": [ + { + "name": "onap.policies.controlloop.operational.common.Drools", + "version": "1.0.0" + }, + { + "name": "onap.policies.native.drools.Controller", + "version": "1.0.0" + }, + { + "name": "onap.policies.native.drools.Artifact", + "version": "1.0.0" + } + ], + "currentInstanceCount": 0, + "desiredInstanceCount": 1, + "policies": [] + }, + { + "pdpType": "apex", + "supportedPolicyTypes": [ + { + "name": "onap.policies.controlloop.operational.common.Apex", + "version": "1.0.0" + }, + { + "name": "onap.policies.native.Apex", + "version": "1.0.0" + } + ], + "currentInstanceCount": 0, + "desiredInstanceCount": 1, + "policies": [] + } + ] + } + ] +} diff --git a/csit/config/drools/custom/engine-system.properties b/csit/config/drools-pdp/custom/engine-system.properties similarity index 100% rename from csit/config/drools/custom/engine-system.properties rename to csit/config/drools-pdp/custom/engine-system.properties diff --git a/csit/config/drools/custom/noop.pre.sh b/csit/config/drools-pdp/custom/noop.pre.sh similarity index 100% rename from csit/config/drools/custom/noop.pre.sh rename to csit/config/drools-pdp/custom/noop.pre.sh diff --git a/csit/config/drools/env/base.conf b/csit/config/drools-pdp/env/base.conf similarity index 97% rename from csit/config/drools/env/base.conf rename to csit/config/drools-pdp/env/base.conf index fd4d66fc..4bd7632b 100644 --- a/csit/config/drools/env/base.conf +++ b/csit/config/drools-pdp/env/base.conf @@ -59,7 +59,7 @@ AAF_HOST=aaf.api.simpledemo.onap.org # HTTP Servers -HTTP_SERVER_HTTPS={{HTTPS_ENABLED}} +HTTP_SERVER_HTTPS=false PROMETHEUS=true # PDP-D DMaaP configuration channel @@ -104,7 +104,7 @@ DCAE_CONSUMER_GROUP=dcae.policy.shared # Open DMaaP DMAAP_SERVERS=mr.api.simpledemo.onap.org -DMAAP_HTTPS={{HTTPS_ENABLED}} +DMAAP_HTTPS=false # AAI diff --git a/csit/config/drools-pdp/groups.json b/csit/config/drools-pdp/groups.json new file mode 100644 index 00000000..6ee30e1c --- /dev/null +++ b/csit/config/drools-pdp/groups.json @@ -0,0 +1,137 @@ +{ + "groups": [ + { + "name": "defaultGroup", + "version": "1.0.0", + "description": "The default group that registers all supported policy types and pdps.", + "pdpGroupState": "ACTIVE", + "pdpSubgroups": [ + { + "pdpType": "xacml", + "supportedPolicyTypes": [ + { + "name": "onap.policies.controlloop.guard.common.FrequencyLimiter", + "version": "1.0.0" + }, + { + "name": "onap.policies.controlloop.guard.common.MinMax", + "version": "1.0.0" + }, + { + "name": "onap.policies.controlloop.guard.common.Blacklist", + "version": "1.0.0" + }, + { + "name": "onap.policies.controlloop.guard.common.Filter", + "version": "1.0.0" + }, + { + "name": "onap.policies.controlloop.guard.coordination.FirstBlocksSecond", + "version": "1.0.0" + }, + { + "name": "onap.policies.monitoring.*", + "version": "1.0.0" + }, + { + "name": "onap.policies.optimization.*", + "version": "1.0.0" + }, + { + "name": "onap.policies.optimization.resource.AffinityPolicy", + "version": "1.0.0" + }, + { + "name": "onap.policies.optimization.resource.DistancePolicy", + "version": "1.0.0" + }, + { + "name": "onap.policies.optimization.resource.HpaPolicy", + "version": "1.0.0" + }, + { + "name": "onap.policies.optimization.resource.OptimizationPolicy", + "version": "1.0.0" + }, + { + "name": "onap.policies.optimization.resource.PciPolicy", + "version": "1.0.0" + }, + { + "name": "onap.policies.optimization.service.QueryPolicy", + "version": "1.0.0" + }, + { + "name": "onap.policies.optimization.service.SubscriberPolicy", + "version": "1.0.0" + }, + { + "name": "onap.policies.optimization.resource.Vim_fit", + "version": "1.0.0" + }, + { + "name": "onap.policies.optimization.resource.VnfPolicy", + "version": "1.0.0" + }, + { + "name": "onap.policies.native.Xacml", + "version": "1.0.0" + }, + { + "name": "onap.policies.Naming", + "version": "1.0.0" + }, + { + "name": "onap.policies.match.*", + "version": "1.0.0" + } + ], + "currentInstanceCount": 0, + "desiredInstanceCount": 1, + "policies": [ + { + "name": "SDNC_Policy.ONAP_NF_NAMING_TIMESTAMP", + "version": "1.0.0" + } + ] + }, + { + "pdpType": "drools", + "supportedPolicyTypes": [ + { + "name": "onap.policies.controlloop.operational.common.Drools", + "version": "1.0.0" + }, + { + "name": "onap.policies.native.drools.Controller", + "version": "1.0.0" + }, + { + "name": "onap.policies.native.drools.Artifact", + "version": "1.0.0" + } + ], + "currentInstanceCount": 0, + "desiredInstanceCount": 1, + "policies": [] + }, + { + "pdpType": "apex", + "supportedPolicyTypes": [ + { + "name": "onap.policies.controlloop.operational.common.Apex", + "version": "1.0.0" + }, + { + "name": "onap.policies.native.Apex", + "version": "1.0.0" + } + ], + "currentInstanceCount": 0, + "desiredInstanceCount": 1, + "policies": [] + } + ] + } + ] +} diff --git a/csit/config/ks.cer b/csit/config/ks.cer deleted file mode 100644 index 2946a080..00000000 --- a/csit/config/ks.cer +++ /dev/null @@ -1,29 +0,0 @@ ------BEGIN CERTIFICATE----- -MIIE+jCCA+KgAwIBAgIUDSbE1jAMdFITeC8csFyyBEhTc6YwDQYJKoZIhvcNAQEL -BQAwRzELMAkGA1UEBhMCVVMxEzARBgNVBAgMCk5ldyBKZXJzZXkxDTALBgNVBAsM -BE9OQVAxFDASBgNVBAMMC3BvbGljeS5vbmFwMB4XDTIyMDkwNTEzMjUyMVoXDTIy -MTAwNTEzMjUyMVowYjEPMA0GA1UEAxMGcG9saWN5MSMwIQYDVQQLDBpwb2xpY3lA -cG9saWN5Lm9uYXAub3JnOkRFVjEOMAwGA1UECxMFT1NBQUYxDTALBgNVBAoTBE9O -QVAxCzAJBgNVBAYTAlVTMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA -kBWA9VTEHET8X9uDs35VVTfpHtHXxxHPWwm04uCROHus6AADNN0KVchZCFMm2Cem -f4kEoaGxLWNsW57YnSybyB5L254/YvNa9utFLkaMnVzNZkoFFE24j4T2KgT2Vbt4 -YLMJYFzdu6/9pGhlkBw30UfZKo8li0BPyxReshk8hWFV+6Tcbr94qPM90j4b1Hz6 -pkJ1BwPOqCyrRLjuk6tQc2TYRN3PBFjknC/C9yeJc7fiBgoe8Hbx8AWEpMK/pFIB -2JkMojuopjLffic8cN834+mExECWqtyaHNxnv8BaLvpCOgxXo3EMS9fHPM/N9XGz -XIlw7W70d/FWE8pwCw+DXwIDAQABo4IBwTCCAb0wggEsBgNVHREEggEjMIIBH4IG -cG9saWN5ggZkcm9vbHOCC2Ryb29scy5vbmFwgg9wb2xpY3ktYXBleC1wZHCCFHBv -bGljeS1hcGV4LXBkcC5vbmFwggpwb2xpY3ktYXBpgg9wb2xpY3ktYXBpLm9uYXCC -E3BvbGljeS1kaXN0cmlidXRpb26CGHBvbGljeS1kaXN0cmlidXRpb24ub25hcIIK -cG9saWN5LXBhcIIPcG9saWN5LXBhcC5vbmFwghBwb2xpY3kteGFjbWwtcGRwghVw -b2xpY3kteGFjbWwtcGRwLm9uYXCCCXNpbXVsYXRvcoIHYWFpLXNpbYIIZ3JwYy1z -aW2CCHNkbmMtc2ltggZzby1zaW2CB3ZmYy1zaW2CDm1lc3NhZ2Utcm91dGVyMB0G -A1UdDgQWBBRWeSCDe3OXHeKiptkS05EYEt2lLjBsBgNVHSMEZTBjoUukSTBHMQsw -CQYDVQQGEwJVUzETMBEGA1UECAwKTmV3IEplcnNleTENMAsGA1UECwwET05BUDEU -MBIGA1UEAwwLcG9saWN5Lm9uYXCCFCAWwWW10ZqYy46ID/aAsN1zxnkgMA0GCSqG -SIb3DQEBCwUAA4IBAQDQf71j4ZMONLxNLZs/GBPBKVSw29MMoLXrsMkUVmne+g2M -cnCEV0W4I/kSGwlxLGx3bxquUmRevKl2zB5pvzub+kwOotYqG+qWcS9mH4E2GGOP -TsCldopk2mPLuEdTve583RtsUeRM4DJ4X3kiFZmyD+Pu/f8yhTqjZS79kPxbPcHX -O9riD4Qh/x69UdcR5KK2Lsy63fAtTVY9F5bKx1PmRm5vnQbExYp+ncD+C+8mvPEU -ofJIbGmEGrf/YHDsCrn0yq37G3ujJxT114Z7YIai+LTFlMqSL8wR8gDhSEGB4anz -cWNLMN4/l73ySRMXSC7Kj2h2J5DS0z46ujJCkCPN ------END CERTIFICATE----- diff --git a/csit/config/ks.csr b/csit/config/ks.csr deleted file mode 100644 index 9777b85b..00000000 --- a/csit/config/ks.csr +++ /dev/null @@ -1,18 +0,0 @@ ------BEGIN NEW CERTIFICATE REQUEST----- -MIIC1zCCAb8CAQAwYjEPMA0GA1UEAxMGcG9saWN5MSMwIQYDVQQLDBpwb2xpY3lA -cG9saWN5Lm9uYXAub3JnOkRFVjEOMAwGA1UECxMFT1NBQUYxDTALBgNVBAoTBE9O -QVAxCzAJBgNVBAYTAlVTMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA -kBWA9VTEHET8X9uDs35VVTfpHtHXxxHPWwm04uCROHus6AADNN0KVchZCFMm2Cem -f4kEoaGxLWNsW57YnSybyB5L254/YvNa9utFLkaMnVzNZkoFFE24j4T2KgT2Vbt4 -YLMJYFzdu6/9pGhlkBw30UfZKo8li0BPyxReshk8hWFV+6Tcbr94qPM90j4b1Hz6 -pkJ1BwPOqCyrRLjuk6tQc2TYRN3PBFjknC/C9yeJc7fiBgoe8Hbx8AWEpMK/pFIB -2JkMojuopjLffic8cN834+mExECWqtyaHNxnv8BaLvpCOgxXo3EMS9fHPM/N9XGz -XIlw7W70d/FWE8pwCw+DXwIDAQABoDAwLgYJKoZIhvcNAQkOMSEwHzAdBgNVHQ4E -FgQUVnkgg3tzlx3ioqbZEtORGBLdpS4wDQYJKoZIhvcNAQELBQADggEBAE6C4xqR -1Ju3IaVGGoUW6zVtKwPPwXbbU4opQfpFMnDw6HGs1HFF6bRmB5bCN9uS32CSRq42 -X6uYFh24prpU2D3e1xQCtSZfBq55AYlgVrfuLwDXgpLNTQbQGnpeyobThS5qgeld -umpWTCOU4dRIjjpXJb3e3CW2PN3wzNwavjgx1kHWHH+D5OGD4BZeZT8PHShT0qo6 -G6LNcedvEgJVHDFxnWJ7CK0qVAHHldVZ6PKvb9T79g2tRbIw29yfLv4nUUQtpRzU -Ru0LTNStOxvbbg5Lrlx9gltdiHUMihnSj430yhG+7W6D16pP1YhAMCLBbdp9BKzn -jOCKf0x5qlcc/Bk= ------END NEW CERTIFICATE REQUEST----- diff --git a/csit/config/ks.jks b/csit/config/ks.jks deleted file mode 100644 index c45251b8c8b996894dea0e1049c937cffc3341fd..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5001 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 + + + + + + + + + + + + + + + ${logDir}/${errorLog}.log + + ${logDir}/${errorLog}.%d{yyyy-MM-dd}.%i.log.zip + + 50MB + 30 + 10GB + + + WARN + + + ${errorPattern} + + + + + + + + + ${logDir}/${debugLog}.log + + ${logDir}/${debugLog}.%d{yyyy-MM-dd}.%i.log.zip + + 50MB + 30 + 10GB + + + ${debugPattern} + + + + + + + + + ${logDir}/${networkLog}.log + + ${logDir}/${networkLog}.%d{yyyy-MM-dd}.%i.log.zip + + 50MB + 30 + 10GB + + + ${networkPattern} + + + + + + + + + + [%d{yyyy-MM-dd'T'HH:mm:ss.SSS+00:00, UTC}|%level|%logger{0}|%thread] %msg%n + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/csit/config/pap/papParameters.yaml b/csit/config/pap/papParameters.yaml index 9a57ebb6..bb050205 100644 --- a/csit/config/pap/papParameters.yaml +++ b/csit/config/pap/papParameters.yaml @@ -24,7 +24,7 @@ spring: server: port: 6969 ssl: - enabled: {{HTTPS_ENABLED}} + enabled: false pap: name: PapGroup @@ -44,7 +44,7 @@ pap: servers: - message-router topicCommInfrastructure: dmaap - useHttps: {{HTTPS_ENABLED}} + useHttps: false fetchTimeout: 15000 - topic: POLICY-HEARTBEAT effectiveTopic: POLICY-PDP-PAP @@ -52,26 +52,26 @@ pap: servers: - message-router topicCommInfrastructure: dmaap - useHttps: {{HTTPS_ENABLED}} + useHttps: false fetchTimeout: 15000 topicSinks: - topic: POLICY-PDP-PAP servers: - message-router topicCommInfrastructure: dmaap - useHttps: {{HTTPS_ENABLED}} + useHttps: false - topic: POLICY-NOTIFICATION servers: - message-router topicCommInfrastructure: dmaap - useHttps: {{HTTPS_ENABLED}} + useHttps: false healthCheckRestClientParameters: - clientName: api hostname: policy-api port: 6969 userName: policyadmin password: zb!XztG34 - useHttps: {{HTTPS_ENABLED}} + useHttps: false basePath: policy/api/v1/healthcheck management: diff --git a/csit/config/clamp/gui/application.yaml b/csit/config/policy-gui/application.yaml similarity index 76% rename from csit/config/clamp/gui/application.yaml rename to csit/config/policy-gui/application.yaml index a0a6c224..30de64bf 100644 --- a/csit/config/clamp/gui/application.yaml +++ b/csit/config/policy-gui/application.yaml @@ -16,19 +16,13 @@ # ============LICENSE_END===================================================== # server: - port: 2443 + port: 2445 ssl: - enabled: {{HTTPS_ENABLED}} - enabled-protocols: TLSv1.2 - client-auth: want - key-store: file:${KEYSTORE} - key-store-password: ${KEYSTORE_PASSWD} - trust-store: file:${TRUSTSTORE} - trust-store-password: ${TRUSTSTORE_PASSWD} + enabled: false clamp: - url: https://policy-clamp-be:8443 - disable-ssl-validation: false + url: http://policy-clamp-be:8445 + disable-ssl-validation: true disable-ssl-hostname-check: true apex-editor: diff --git a/csit/config/policy-gui/groups.json b/csit/config/policy-gui/groups.json new file mode 100644 index 00000000..6ee30e1c --- /dev/null +++ b/csit/config/policy-gui/groups.json @@ -0,0 +1,137 @@ +{ + "groups": [ + { + "name": "defaultGroup", + "version": "1.0.0", + "description": "The default group that registers all supported policy types and pdps.", + "pdpGroupState": "ACTIVE", + "pdpSubgroups": [ + { + "pdpType": "xacml", + "supportedPolicyTypes": [ + { + "name": "onap.policies.controlloop.guard.common.FrequencyLimiter", + "version": "1.0.0" + }, + { + "name": "onap.policies.controlloop.guard.common.MinMax", + "version": "1.0.0" + }, + { + "name": "onap.policies.controlloop.guard.common.Blacklist", + "version": "1.0.0" + }, + { + "name": "onap.policies.controlloop.guard.common.Filter", + "version": "1.0.0" + }, + { + "name": "onap.policies.controlloop.guard.coordination.FirstBlocksSecond", + "version": "1.0.0" + }, + { + "name": "onap.policies.monitoring.*", + "version": "1.0.0" + }, + { + "name": "onap.policies.optimization.*", + "version": "1.0.0" + }, + { + "name": "onap.policies.optimization.resource.AffinityPolicy", + "version": "1.0.0" + }, + { + "name": "onap.policies.optimization.resource.DistancePolicy", + "version": "1.0.0" + }, + { + "name": "onap.policies.optimization.resource.HpaPolicy", + "version": "1.0.0" + }, + { + "name": "onap.policies.optimization.resource.OptimizationPolicy", + "version": "1.0.0" + }, + { + "name": "onap.policies.optimization.resource.PciPolicy", + "version": "1.0.0" + }, + { + "name": "onap.policies.optimization.service.QueryPolicy", + "version": "1.0.0" + }, + { + "name": "onap.policies.optimization.service.SubscriberPolicy", + "version": "1.0.0" + }, + { + "name": "onap.policies.optimization.resource.Vim_fit", + "version": "1.0.0" + }, + { + "name": "onap.policies.optimization.resource.VnfPolicy", + "version": "1.0.0" + }, + { + "name": "onap.policies.native.Xacml", + "version": "1.0.0" + }, + { + "name": "onap.policies.Naming", + "version": "1.0.0" + }, + { + "name": "onap.policies.match.*", + "version": "1.0.0" + } + ], + "currentInstanceCount": 0, + "desiredInstanceCount": 1, + "policies": [ + { + "name": "SDNC_Policy.ONAP_NF_NAMING_TIMESTAMP", + "version": "1.0.0" + } + ] + }, + { + "pdpType": "drools", + "supportedPolicyTypes": [ + { + "name": "onap.policies.controlloop.operational.common.Drools", + "version": "1.0.0" + }, + { + "name": "onap.policies.native.drools.Controller", + "version": "1.0.0" + }, + { + "name": "onap.policies.native.drools.Artifact", + "version": "1.0.0" + } + ], + "currentInstanceCount": 0, + "desiredInstanceCount": 1, + "policies": [] + }, + { + "pdpType": "apex", + "supportedPolicyTypes": [ + { + "name": "onap.policies.controlloop.operational.common.Apex", + "version": "1.0.0" + }, + { + "name": "onap.policies.native.Apex", + "version": "1.0.0" + } + ], + "currentInstanceCount": 0, + "desiredInstanceCount": 1, + "policies": [] + } + ] + } + ] +} diff --git a/csit/config/policy-gui/logback.xml b/csit/config/policy-gui/logback.xml new file mode 100644 index 00000000..04bc5671 --- /dev/null +++ b/csit/config/policy-gui/logback.xml @@ -0,0 +1,119 @@ + + + + + + + + + + + + + + + + ${logDir}/${errorLog}.log + + ${logDir}/${errorLog}.%d{yyyy-MM-dd}.%i.log.zip + + 50MB + 30 + 10GB + + + WARN + + + ${errorPattern} + + + + + + + + + ${logDir}/${debugLog}.log + + ${logDir}/${debugLog}.%d{yyyy-MM-dd}.%i.log.zip + + 50MB + 30 + 10GB + + + ${debugPattern} + + + + + + + + + ${logDir}/${networkLog}.log + + ${logDir}/${networkLog}.%d{yyyy-MM-dd}.%i.log.zip + + 50MB + 30 + 10GB + + + ${networkPattern} + + + + + + + + + + [%d{yyyy-MM-dd'T'HH:mm:ss.SSS+00:00, UTC}|%level|%logger{0}|%thread] %msg%n + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/csit/config/policy-truststore b/csit/config/policy-truststore deleted file mode 100644 index 78998aff611e2a14c51ed5496031720c2d29bb00..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 125108 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

A5c-jJwYwrfD$ci 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 %$f5dj_b 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 z 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 + + + + + + + + %d %level %msg%n + + + + + + + + diff --git a/csit/config/sim-all/simParameters.json b/csit/config/sim-all/simParameters.json index 3d348125..41fc9057 100644 --- a/csit/config/sim-all/simParameters.json +++ b/csit/config/sim-all/simParameters.json @@ -8,15 +8,15 @@ "name": "DMaaP simulator", "providerClass": "org.onap.policy.models.sim.dmaap.rest.DmaapSimRestControllerV1", "host": "0.0.0.0", - "port": {{MESSAGE_ROUTER_PORT}}, - "https": {{HTTPS_ENABLED}} + "port": 3904, + "https": false }, { "name": "A&AI simulator", "providerClass": "org.onap.policy.simulators.AaiSimulatorJaxRs", "host": "0.0.0.0", "port": 6666, - "https": {{HTTPS_ENABLED}}, + "https": false, "userName": "policy@policy.onap.org", "password": "demo123456!", "resourceLocation": "/opt/app/policy/simulators/etc/mounted/aairesponse/" @@ -26,7 +26,7 @@ "providerClass": "org.onap.policy.simulators.SdncSimulatorJaxRs", "host": "0.0.0.0", "port": 6668, - "https": {{HTTPS_ENABLED}} + "https": false }, { "name": "SO simulator", @@ -42,7 +42,7 @@ "providerClass": "org.onap.policy.simulators.VfcSimulatorJaxRs", "host": "0.0.0.0", "port": 6670, - "https": {{HTTPS_ENABLED}} + "https": false } ], "topicSinks": [ @@ -50,7 +50,7 @@ "topic": "APPC-CL", "servers": ["${HOST_NAME}"], "topicCommInfrastructure": "DMAAP", - "useHttps": {{HTTPS_ENABLED}}, + "useHttps": false, "apiKey": "some-key", "apiSecret": "some-secret" }, @@ -58,7 +58,7 @@ "topic": "APPC-LCM-WRITE", "servers": ["${HOST_NAME}"], "topicCommInfrastructure": "DMAAP", - "useHttps": {{HTTPS_ENABLED}}, + "useHttps": false, "apiKey": "some-key", "apiSecret": "some-secret" } @@ -68,7 +68,7 @@ "topic": "APPC-CL", "servers": ["${HOST_NAME}"], "topicCommInfrastructure": "DMAAP", - "useHttps": {{HTTPS_ENABLED}}, + "useHttps": false, "apiKey": "some-key", "apiSecret": "some-secret" }, @@ -76,7 +76,7 @@ "topic": "APPC-LCM-READ", "servers": ["${HOST_NAME}"], "topicCommInfrastructure": "DMAAP", - "useHttps": {{HTTPS_ENABLED}}, + "useHttps": false, "apiKey": "some-key", "apiSecret": "some-secret" } diff --git a/csit/config/xacml-pdp/defaultConfig.json b/csit/config/xacml-pdp/defaultConfig.json index 6ee07698..a4bcc5ed 100644 --- a/csit/config/xacml-pdp/defaultConfig.json +++ b/csit/config/xacml-pdp/defaultConfig.json @@ -7,7 +7,7 @@ "port": 6969, "userName": "healthcheck", "password": "zb!XztG34", - "https": {{HTTPS_ENABLED}}, + "https": false, "aaf": false, "prometheus": true }, @@ -16,7 +16,7 @@ "port": 6969, "userName": "policyadmin", "password": "zb!XztG34", - "useHttps": {{HTTPS_ENABLED}}, + "useHttps": false, "aaf": false }, "applicationParameters": { @@ -27,13 +27,13 @@ "topic" : "POLICY-PDP-PAP", "servers" : [ "message-router" ], "topicCommInfrastructure" : "dmaap", - "useHttps" : {{HTTPS_ENABLED}} + "useHttps" : false }], "topicSinks" : [{ "topic" : "POLICY-PDP-PAP", "servers" : [ "message-router" ], "topicCommInfrastructure" : "dmaap", - "useHttps" : {{HTTPS_ENABLED}} + "useHttps" : false }] } } diff --git a/csit/config/xacml-pdp/groups.json b/csit/config/xacml-pdp/groups.json new file mode 100644 index 00000000..0a7e5fe3 --- /dev/null +++ b/csit/config/xacml-pdp/groups.json @@ -0,0 +1,101 @@ +{ + "groups": [ + { + "name": "defaultGroup", + "version": "1.0.0", + "description": "The default group that registers all supported policy types and pdps.", + "pdpGroupState": "ACTIVE", + "pdpSubgroups": [ + { + "pdpType": "xacml", + "supportedPolicyTypes": [ + { + "name": "onap.policies.controlloop.guard.common.FrequencyLimiter", + "version": "1.0.0" + }, + { + "name": "onap.policies.controlloop.guard.common.MinMax", + "version": "1.0.0" + }, + { + "name": "onap.policies.controlloop.guard.common.Blacklist", + "version": "1.0.0" + }, + { + "name": "onap.policies.controlloop.guard.common.Filter", + "version": "1.0.0" + }, + { + "name": "onap.policies.controlloop.guard.coordination.FirstBlocksSecond", + "version": "1.0.0" + }, + { + "name": "onap.policies.monitoring.*", + "version": "1.0.0" + }, + { + "name": "onap.policies.optimization.*", + "version": "1.0.0" + }, + { + "name": "onap.policies.optimization.resource.AffinityPolicy", + "version": "1.0.0" + }, + { + "name": "onap.policies.optimization.resource.DistancePolicy", + "version": "1.0.0" + }, + { + "name": "onap.policies.optimization.resource.HpaPolicy", + "version": "1.0.0" + }, + { + "name": "onap.policies.optimization.resource.OptimizationPolicy", + "version": "1.0.0" + }, + { + "name": "onap.policies.optimization.resource.PciPolicy", + "version": "1.0.0" + }, + { + "name": "onap.policies.optimization.service.QueryPolicy", + "version": "1.0.0" + }, + { + "name": "onap.policies.optimization.service.SubscriberPolicy", + "version": "1.0.0" + }, + { + "name": "onap.policies.optimization.resource.Vim_fit", + "version": "1.0.0" + }, + { + "name": "onap.policies.optimization.resource.VnfPolicy", + "version": "1.0.0" + }, + { + "name": "onap.policies.native.Xacml", + "version": "1.0.0" + }, + { + "name": "onap.policies.Naming", + "version": "1.0.0" + }, + { + "name": "onap.policies.match.*", + "version": "1.0.0" + } + ], + "currentInstanceCount": 0, + "desiredInstanceCount": 1, + "policies": [ + { + "name": "SDNC_Policy.ONAP_NF_NAMING_TIMESTAMP", + "version": "1.0.0" + } + ] + } + ] + } + ] +} diff --git a/csit/config/xacml-pdp/logback.xml b/csit/config/xacml-pdp/logback.xml new file mode 100644 index 00000000..e075f905 --- /dev/null +++ b/csit/config/xacml-pdp/logback.xml @@ -0,0 +1,116 @@ + + + + + + + + + + + + + + + + ${logDir}/${errorLog}.log + + ${logDir}/${errorLog}.%d{yyyy-MM-dd}.%i.log.zip + + 50MB + 30 + 10GB + + + WARN + + + ${errorPattern} + + + + + + + + + ${logDir}/${debugLog}.log + + ${logDir}/${debugLog}.%d{yyyy-MM-dd}.%i.log.zip + + 50MB + 30 + 10GB + + + ${debugPattern} + + + + + + + + + ${logDir}/${networkLog}.log + + ${logDir}/${networkLog}.%d{yyyy-MM-dd}.%i.log.zip + + 50MB + 30 + 10GB + + + ${networkPattern} + + + + + + + + + + [%d{yyyy-MM-dd'T'HH:mm:ss.SSS+00:00, UTC}|%level|%logger{0}|%thread] %msg%n + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/csit/db-migrator/plans/teardown.sh b/csit/db-migrator/plans/teardown.sh index 30a0f48d..0483d84d 100755 --- a/csit/db-migrator/plans/teardown.sh +++ b/csit/db-migrator/plans/teardown.sh @@ -17,6 +17,4 @@ # SPDX-License-Identifier: Apache-2.0 # ============LICENSE_END========================================================= -docker logs postgres - docker-compose -f ${SCRIPTS}/compose-postgres.yml down -v \ No newline at end of file diff --git a/csit/distribution/plans/teardown.sh b/csit/distribution/plans/teardown.sh index e451ba66..9bfdfe88 100755 --- a/csit/distribution/plans/teardown.sh +++ b/csit/distribution/plans/teardown.sh @@ -20,9 +20,4 @@ # SPDX-License-Identifier: Apache-2.0 # ============LICENSE_END========================================================= -docker logs policy-api -docker logs simulator -docker logs policy-pap -docker logs policy-distribution - docker-compose -f ${SCRIPTS}/docker-compose-all.yml down -v diff --git a/csit/docker-compose-all.yml b/csit/docker-compose-all.yml index a8a795ce..12f8b8c3 100644 --- a/csit/docker-compose-all.yml +++ b/csit/docker-compose-all.yml @@ -2,7 +2,7 @@ # ===========LICENSE_START==================================================== # Copyright (C) 2020-2021 AT&T Intellectual Property. All rights reserved. # Modifications Copyright (C) 2021 Bell Canada. All rights reserved. -# Modification Copyright 2021. Nordix Foundation. +# Modification Copyright 2021-2022 Nordix Foundation. # ============================================================================ # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. @@ -20,25 +20,25 @@ version: '2' services: mariadb: - image: nexus3.onap.org:10001/mariadb:${POLICY_MARIADB_VER} + image: ${CONTAINER_LOCATION}mariadb:${POLICY_MARIADB_VER} container_name: mariadb hostname: mariadb command: ['--lower-case-table-names=1', '--wait_timeout=28800'] - env_file: config/db/db.conf + env_file: ./config/db/db.conf volumes: - ./config/db:/docker-entrypoint-initdb.d:ro - ./config/clamp/policy-clamp-create-tables.sql:/tmp/policy-clamp-create-tables.sql - expose: - - 3306 + ports: + - 3306:3306 policy-db-migrator: - image: nexus3.onap.org:10001/onap/policy-db-migrator:${POLICY_DOCKER_VERSION} + image: ${CONTAINER_LOCATION}onap/policy-db-migrator:${POLICY_DOCKER_VERSION} container_name: policy-db-migrator hostname: policy-db-migrator depends_on: - mariadb expose: - 6824 - env_file: config/db/db.conf + env_file: ./config/db/db.conf environment: SQL_DB: policyadmin SQL_HOST: mariadb @@ -52,7 +52,7 @@ services: 'mariadb', '3306' ] simulator: - image: nexus3.onap.org:10001/onap/policy-models-simulator:${POLICY_MODELS_VERSION} + image: ${CONTAINER_LOCATION}onap/policy-models-simulator:${POLICY_MODELS_VERSION} container_name: simulator hostname: simulator networks: @@ -66,26 +66,25 @@ services: - vfc-sim volumes: - ./config/sim-all:/opt/app/policy/simulators/etc/mounted:ro - - ./config/ks.jks:/opt/app/policy/simulators/etc/ssl/policy-keystore:ro - - ./config/policy-truststore:/opt/app/policy/simulators/etc/ssl/policy-truststore:ro + - ./config/sim-all/logback.xml:/opt/app/policy/simulators/etc/mounted/logback.xml:ro expose: - 6666 - 6668 - 6669 - 6670 - - 3905 + - 3904 - 6680 api: - image: nexus3.onap.org:10001/onap/policy-api:${POLICY_API_VERSION} + image: ${CONTAINER_LOCATION}onap/policy-api:${POLICY_API_VERSION} container_name: policy-api depends_on: - policy-db-migrator hostname: policy-api - expose: - - 6969 + ports: + - 30440:6969 volumes: - - ./config/ks.jks:/opt/app/policy/api/etc/ssl/policy-keystore:ro - - ./config/policy-truststore:/opt/app/policy/api/etc/ssl/policy-truststore:ro + - ./config/api/apiParameters.yaml:/opt/app/policy/api/etc/apiParameters.yaml:ro + - ./config/api/logback.xml:/opt/app/policy/api/etc/logback.xml:ro - ./wait_for_port.sh:/opt/app/policy/api/bin/wait_for_port.sh:ro entrypoint: ./wait_for_port.sh command: [ @@ -94,74 +93,72 @@ services: 'policy-db-migrator', '6824' ] pap: - image: nexus3.onap.org:10001/onap/policy-pap:${POLICY_PAP_VERSION} + image: ${CONTAINER_LOCATION}onap/policy-pap:${POLICY_PAP_VERSION} container_name: policy-pap depends_on: - mariadb - simulator - api hostname: policy-pap - expose: - - 6969 + ports: + - 30442:6969 volumes: - ./config/pap/papParameters.yaml:/opt/app/policy/pap/etc/papParameters.yaml:ro - - ./config/pap/groups.json:/opt/app/policy/pap/etc/mounted/groups.json:ro - - ./config/ks.jks:/opt/app/policy/pap/etc/ssl/policy-keystore:ro - - ./config/policy-truststore:/opt/app/policy/pap/etc/ssl/policy-truststore:ro + - ./config/${PROJECT}/groups.json:/opt/app/policy/pap/etc/mounted/groups.json:ro + - ./config/pap/logback.xml:/opt/app/policy/pap/etc/logback.xml:ro - ./wait_for_port.sh:/opt/app/policy/pap/bin/wait_for_port.sh:ro entrypoint: ./wait_for_port.sh command: [ '-c', './policy-pap.sh', 'mariadb', '3306', - 'message-router', '3905', + 'message-router', '3904', 'api', '6969' ] xacml-pdp: - image: nexus3.onap.org:10001/onap/policy-xacml-pdp:${POLICY_XACML_PDP_VERSION} + image: ${CONTAINER_LOCATION}onap/policy-xacml-pdp:${POLICY_XACML_PDP_VERSION} container_name: policy-xacml-pdp depends_on: - mariadb - simulator - pap hostname: policy-xacml-pdp - expose: - - 6969 + ports: + - 30441:6969 volumes: - ./config/xacml-pdp/defaultConfig.json:/opt/app/policy/pdpx/etc/defaultConfig.json:ro - - ./config/ks.jks:/opt/app/policy/pdpx/etc/ssl/policy-keystore:ro - - ./config/policy-truststore:/opt/app/policy/pdpx/etc/ssl/policy-truststore:ro + - ./config/xacml-pdp/logback.xml:/opt/app/policy/pdpx/etc/logback.xml:ro - ./wait_for_port.sh:/opt/app/policy/pdpx/bin/wait_for_port.sh:ro entrypoint: ./wait_for_port.sh command: [ '-c', './policy-pdpx.sh', 'mariadb', '3306', - 'message-router', '3905', + 'message-router', '3904', 'pap', '6969' ] drools: - image: nexus3.onap.org:10001/onap/policy-drools:${POLICY_DROOLS_PDP_VERSION} + image: ${CONTAINER_LOCATION}onap/policy-drools:${POLICY_DROOLS_PDP_VERSION} container_name: drools depends_on: - mariadb - simulator - pap hostname: drools - expose: - - 6969 - - 9696 + ports: + - 30217:6969 + - 30216:9696 volumes: - - ./config/drools/custom:/tmp/policy-install/config:ro + - ./config/drools-pdp/custom:/tmp/policy-install/config:ro - ./wait_for_port.sh:/opt/app/policy/bin/wait_for_port.sh:ro env_file: - - config/drools/env/base.conf + - ./config/drools-pdp/env/base.conf entrypoint: /opt/app/policy/bin/wait_for_port.sh command: [ '-c', '/opt/app/policy/bin/pdpd-entrypoint.sh boot', 'mariadb', '3306', - 'message-router', '3905' + 'message-router', '3904' ] drools-apps: - image: nexus3.onap.org:10001/onap/policy-pdpd-cl:${POLICY_DROOLS_APPS_VERSION} + image: ${CONTAINER_LOCATION}onap/policy-pdpd-cl:${POLICY_DROOLS_APPS_VERSION} container_name: drools-apps depends_on: - mariadb @@ -169,22 +166,21 @@ services: - pap - xacml-pdp hostname: drools-apps - expose: - - 6969 - - 9696 + ports: + - 30221:6969 + - 30219:9696 volumes: - - ./config/drools-apps/custom:/tmp/policy-install/config:ro - - ./config/drools-apps/custom/feature-lifecycle.properties:/opt/app/policy/features/lifecycle/config/feature-lifecycle.properties:ro + - ./config/drools-applications/custom:/tmp/policy-install/config:ro - ./wait_for_port.sh:/opt/app/policy/bin/wait_for_port.sh:ro env_file: - - config/drools-apps/env/base.conf - - config/drools-apps/env/feature-healthcheck.conf - - config/drools-apps/env/feature-pooling-dmaap.conf + - ./config/drools-applications/env/base.conf + - ./config/drools-applications/env/feature-healthcheck.conf + - ./config/drools-applications/env/feature-pooling-dmaap.conf entrypoint: /opt/app/policy/bin/wait_for_port.sh command: [ '-c', '/opt/app/policy/bin/pdpd-cl-entrypoint.sh boot', 'mariadb', '3306', - 'message-router', '3905', + 'message-router', '3904', 'pap', '6969', 'aai-sim', '6666', 'sdnc-sim', '6668', @@ -192,30 +188,28 @@ services: 'vfc-sim', '6670' ] apex-pdp: - image: nexus3.onap.org:10001/onap/policy-apex-pdp:${POLICY_APEX_PDP_VERSION} + image: ${CONTAINER_LOCATION}onap/policy-apex-pdp:${POLICY_APEX_PDP_VERSION} container_name: policy-apex-pdp depends_on: - mariadb - simulator - pap hostname: policy-apex-pdp - expose: - - 6969 - - 23324 + ports: + - 30237:6969 volumes: - ./config/apex-pdp/OnapPfConfig.json:/opt/app/policy/apex-pdp/etc/onappf/config/OnapPfConfig.json:ro - - ./config/ks.jks:/opt/app/policy/apex-pdp/etc/ssl/policy-keystore:ro - - ./config/policy-truststore:/opt/app/policy/apex-pdp/etc/ssl/policy-truststore:ro + - ./config/apex-pdp/logback.xml:/opt/app/policy/apex-pdp/etc/logback.xml:ro - ./wait_for_port.sh:/opt/app/policy/bin/wait_for_port.sh:ro entrypoint: /opt/app/policy/bin/wait_for_port.sh command: [ '-c', '/opt/app/policy/apex-pdp/bin/apexOnapPf.sh -c /opt/app/policy/apex-pdp/etc/onappf/config/OnapPfConfig.json', 'mariadb', '3306', - 'message-router', '3905', + 'message-router', '3904', 'pap', '6969' ] distribution: - image: nexus3.onap.org:10001/onap/policy-distribution:${POLICY_DISTRIBUTION_VERSION} + image: ${CONTAINER_LOCATION}onap/policy-distribution:${POLICY_DISTRIBUTION_VERSION} container_name: policy-distribution depends_on: - mariadb @@ -225,84 +219,129 @@ services: hostname: policy-distribution volumes: - ./config/distribution/defaultConfig.json:/opt/app/policy/distribution/etc/defaultConfig.json:ro - - ./config/ks.jks:/opt/app/policy/distribution/etc/ssl/policy-keystore:ro - - ./config/policy-truststore:/opt/app/policy/distribution/etc/ssl/policy-truststore:ro - ./distribution/config/temp/:/opt/app/policy/distribution/etc/temp/:ro + - ./config/distribution/logback.xml:/opt/app/policy/distribution/etc/logback.xml:ro - ./wait_for_port.sh:/opt/app/policy/bin/wait_for_port.sh:ro entrypoint: /opt/app/policy/bin/wait_for_port.sh command: [ '-c', './policy-dist.sh', 'mariadb', '3306', - 'message-router', '3905', + 'message-router', '3904', 'pap', '6969', 'apex-pdp', '6969' ] policy-clamp-runtime-acm: - image: nexus3.onap.org:10001/onap/policy-clamp-runtime-acm:${POLICY_CLAMP_VERSION} + image: ${CONTAINER_LOCATION}onap/policy-clamp-runtime-acm:${POLICY_CLAMP_VERSION} container_name: policy-clamp-runtime-acm depends_on: - mariadb - simulator hostname: policy-clamp-runtime-acm - expose: - - 6969 + ports: + - 30258:6969 volumes: - - ./config/policy-truststore:/opt/app/policy/clamp/etc/ssl/policy-truststore:ro + - ./config/clamp/AcRuntimeParameters.yaml:/opt/app/policy/clamp/etc/AcRuntimeParameters.yaml + - ./config/clamp/logback.xml:/opt/app/policy/clamp/etc/logback.xml:ro - ./wait_for_port.sh:/opt/app/policy/bin/wait_for_port.sh:ro - - ./config/ks.jks:/opt/app/policy/clamp/etc/ssl/policy-keystore:ro entrypoint: /opt/app/policy/bin/wait_for_port.sh command: [ '-c', './acm-runtime.sh', - 'message-router', '3905' + 'mariadb', '3306', + 'message-router', '3904' ] policy-clamp-ac-http-ppnt: - image: nexus3.onap.org:10001/onap/policy-clamp-ac-http-ppnt:${POLICY_CLAMP_VERSION} + image: ${CONTAINER_LOCATION}onap/policy-clamp-ac-http-ppnt:${POLICY_CLAMP_VERSION} container_name: policy-clamp-ac-http-ppnt + depends_on: + - simulator hostname: policy-clamp-ac-http-ppnt - expose: - - 6971 + ports: + - 30290:6969 volumes: - - ./config/policy-truststore:/opt/app/policy/clamp/etc/ssl/policy-truststore:ro + - ./config/clamp/HttpParticipantParameters.yaml:/opt/app/policy/clamp/etc/HttpParticipantParameters.yaml + - ./config/clamp/logback.xml:/opt/app/policy/clamp/etc/logback.xml:ro - ./wait_for_port.sh:/opt/app/policy/bin/wait_for_port.sh:ro - - ./config/ks.jks:/opt/app/policy/clamp/etc/ssl/policy-keystore:ro entrypoint: /opt/app/policy/bin/wait_for_port.sh command: [ '-c', './http-participant.sh', - 'message-router', '3905' + 'message-router', '3904' ] policy-clamp-ac-k8s-ppnt: - image: nexus3.onap.org:10001/onap/policy-clamp-ac-k8s-ppnt:${POLICY_CLAMP_VERSION} + image: ${CONTAINER_LOCATION}onap/policy-clamp-ac-k8s-ppnt:${POLICY_CLAMP_VERSION} container_name: policy-clamp-ac-k8s-ppnt + depends_on: + - simulator hostname: policy-clamp-ac-k8s-ppnt - expose: - - 6972 + ports: + - 30295:6969 volumes: - - ./config/policy-truststore:/opt/app/policy/clamp/etc/ssl/policy-truststore:ro + - ./config/clamp/KubernetesParticipantParameters.yaml:/opt/app/policy/clamp/etc/KubernetesParticipantParameters.yaml + - ./config/clamp/logback.xml:/opt/app/policy/clamp/etc/logback.xml:ro - ./wait_for_port.sh:/opt/app/policy/bin/wait_for_port.sh:ro - - ./config/ks.jks:/opt/app/policy/clamp/etc/ssl/policy-keystore:ro entrypoint: /opt/app/policy/bin/wait_for_port.sh command: [ '-c', './kubernetes-participant.sh', - 'message-router', '3905' + 'message-router', '3904' ] policy-clamp-ac-pf-ppnt: - image: nexus3.onap.org:10001/onap/policy-clamp-ac-pf-ppnt:${POLICY_CLAMP_VERSION} + image: ${CONTAINER_LOCATION}onap/policy-clamp-ac-pf-ppnt:${POLICY_CLAMP_VERSION} container_name: policy-clamp-ac-pf-ppnt depends_on: - simulator - api - - policy-clamp-ac-http-ppnt - - policy-clamp-ac-k8s-ppnt hostname: policy-clamp-ac-pf-ppnt - expose: - - 6973 + ports: + - 30218:6969 volumes: - - ./config/policy-truststore:/opt/app/policy/clamp/etc/ssl/policy-truststore:ro + - ./config/clamp/PolicyParticipantParameters.yaml:/opt/app/policy/clamp/etc/PolicyParticipantParameters.yaml:ro + - ./config/clamp/logback.xml:/opt/app/policy/clamp/etc/logback.xml:ro - ./wait_for_port.sh:/opt/app/policy/bin/wait_for_port.sh:ro - - ./config/ks.jks:/opt/app/policy/clamp/etc/ssl/policy-keystore:ro - - ./config/clamp/PolicyParticipantParameters.yaml:/opt/app/policy/clamp/config/PolicyParticipantParameters.yaml:ro entrypoint: /opt/app/policy/bin/wait_for_port.sh command: [ '-c', './policy-participant.sh', - 'message-router', '3905' + 'message-router', '3904', + 'api', '6969' ] + policy-gui: + image: ${CONTAINER_LOCATION}onap/policy-gui:latest + container_name: policy-gui + depends_on: + - policy-clamp-backend + hostname: policy-gui + environment: + CLAMP_URL: http://policy-clamp-backend:8445 + CLAMP_DISABLE_SSL_VALIDATION: "true" + ports: + - 2445:2445 + volumes: + - ./config/policy-gui/application.yaml:/opt/app/policy/gui/etc/application.yml + - ./config/policy-gui/logback.xml:/opt/app/policy/gui/etc/logback.xml:ro + - ./wait_for_port.sh:/opt/app/policy/gui/bin/wait_for_port.sh:ro + entrypoint: ./policy-gui.sh + working_dir: /opt/app/policy/gui/bin + command: ./policy-gui.sh + policy-clamp-backend: + image: ${CONTAINER_LOCATION}onap/policy-clamp-backend:${POLICY_CLAMP_VERSION} + container_name: policy-clamp-backend + depends_on: + - policy-clamp-runtime-acm + - distribution + hostname: policy-clamp-backend + environment: + POLICY_API_HOST: api + POLICY_PAP_HOST: pap + MARIADB_HOST: mariadb + RUNTIME_HOST: policy-clamp-runtime-acm + ports: + - 8445:8445 + volumes: + - ./config/clamp/ClampBackend.properties:/opt/policy/clamp/config/ClampBackend.properties:ro + - ./config/clamp/logback-backend.xml:/opt/policy/clamp/config/logback.xml:ro + working_dir: /opt/policy/clamp + command: java + -Djava.security.egd=file:/dev/./urandom + -XX:MinRAMPercentage=50 + -XX:MaxRAMPercentage=75 + -jar ./policy-clamp-backend.jar + --spring.config.name=ClampBackend + --spring.config.location=/opt/policy/clamp/config/ClampBackend.properties diff --git a/csit/docker-compose-gui-smoke.yml b/csit/docker-compose-gui-smoke.yml deleted file mode 100644 index 8be6ec6e..00000000 --- a/csit/docker-compose-gui-smoke.yml +++ /dev/null @@ -1,361 +0,0 @@ -# -# ===========LICENSE_START==================================================== -# Copyright (C) 2022 Nordix Foundation. -# ============================================================================ -# 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===================================================== -# -version: '2' -services: - mariadb: - image: nexus3.onap.org:10001/mariadb:${POLICY_MARIADB_VER} - container_name: mariadb - hostname: mariadb - command: ['--lower-case-table-names=1', '--wait_timeout=28800'] - env_file: ./config/db/db.conf - volumes: - - ./config/clamp/policy-clamp-create-tables.sql:/tmp/policy-clamp-create-tables.sql - - ./config/db:/docker-entrypoint-initdb.d:ro - ports: - - "3306:3306" - policy-db-migrator: - image: nexus3.onap.org:10001/onap/policy-db-migrator:${POLICY_DOCKER_VERSION} - container_name: policy-db-migrator - hostname: policy-db-migrator - depends_on: - - mariadb - expose: - - 6824 - env_file: ./config/db/db.conf - environment: - SQL_DB: policyadmin - SQL_HOST: mariadb - volumes: - - ./db_migrator_policy_init.sh:/opt/app/policy/bin/db_migrator_policy_init.sh:ro - - ./wait_for_port.sh:/opt/app/policy/bin/wait_for_port.sh:ro - entrypoint: /opt/app/policy/bin/wait_for_port.sh - command: [ - '-c', - '/opt/app/policy/bin/db_migrator_policy_init.sh', - 'mariadb', '3306' - ] - simulator: - image: nexus3.onap.org:10001/onap/policy-models-simulator:${POLICY_MODELS_VERSION} - container_name: simulator - hostname: simulator - networks: - default: - aliases: - - message-router - - aai-sim - - grpc-sim - - sdnc-sim - - so-sim - - vfc-sim - volumes: - - ./config/sim-all:/opt/app/policy/simulators/etc/mounted:ro - - ./config/ks.jks:/opt/app/policy/simulators/etc/ssl/policy-keystore:ro - - ./config/policy-truststore:/opt/app/policy/simulators/etc/ssl/policy-truststore:ro - expose: - - 6666 - - 6668 - - 6669 - - 6670 - - 3905 - - 6680 - api: - image: nexus3.onap.org:10001/onap/policy-api:${POLICY_API_VERSION} - container_name: policy-api - depends_on: - - policy-db-migrator - hostname: policy-api - expose: - - 6969 - volumes: - - ./config/ks.jks:/opt/app/policy/api/etc/ssl/policy-keystore:ro - - ./config/policy-truststore:/opt/app/policy/api/etc/ssl/policy-truststore:ro - - ./wait_for_port.sh:/opt/app/policy/api/bin/wait_for_port.sh:ro - entrypoint: ./wait_for_port.sh - command: [ - '-c', './policy-api.sh', - 'mariadb', '3306', - 'policy-db-migrator', '6824' - ] - pap: - image: nexus3.onap.org:10001/onap/policy-pap:${POLICY_PAP_VERSION} - container_name: policy-pap - depends_on: - - mariadb - - simulator - - api - hostname: policy-pap - expose: - - 6969 - volumes: - - ./config/pap/papParameters.yaml:/opt/app/policy/pap/etc/papParameters.yaml:ro - - ./config/pap/groups.json:/opt/app/policy/pap/etc/mounted/groups.json:ro - - ./config/ks.jks:/opt/app/policy/pap/etc/ssl/policy-keystore:ro - - ./config/policy-truststore:/opt/app/policy/pap/etc/ssl/policy-truststore:ro - - ./wait_for_port.sh:/opt/app/policy/pap/bin/wait_for_port.sh:ro - entrypoint: ./wait_for_port.sh - command: [ - '-c', './policy-pap.sh', - 'mariadb', '3306', - 'message-router', '3905', - 'api', '6969' - ] - xacml-pdp: - image: nexus3.onap.org:10001/onap/policy-xacml-pdp:${POLICY_XACML_PDP_VERSION} - container_name: policy-xacml-pdp - depends_on: - - mariadb - - simulator - - pap - hostname: policy-xacml-pdp - expose: - - 6969 - volumes: - - ./config/xacml-pdp/defaultConfig.json:/opt/app/policy/pdpx/etc/defaultConfig.json:ro - - ./config/ks.jks:/opt/app/policy/pdpx/etc/ssl/policy-keystore:ro - - ./config/policy-truststore:/opt/app/policy/pdpx/etc/ssl/policy-truststore:ro - - ./wait_for_port.sh:/opt/app/policy/pdpx/bin/wait_for_port.sh:ro - entrypoint: ./wait_for_port.sh - command: [ - '-c', './policy-pdpx.sh', - 'mariadb', '3306', - 'message-router', '3905', - 'pap', '6969' - ] - drools: - image: nexus3.onap.org:10001/onap/policy-drools:${POLICY_DROOLS_PDP_VERSION} - container_name: drools - depends_on: - - mariadb - - simulator - - pap - hostname: drools - expose: - - 6969 - - 9696 - volumes: - - ./config/drools/custom:/tmp/policy-install/config:ro - - ./wait_for_port.sh:/opt/app/policy/bin/wait_for_port.sh:ro - env_file: - - ./config/drools/env/base.conf - entrypoint: /opt/app/policy/bin/wait_for_port.sh - command: [ - '-c', '/opt/app/policy/bin/pdpd-entrypoint.sh boot', - 'mariadb', '3306', - 'message-router', '3905' - ] - drools-apps: - image: nexus3.onap.org:10001/onap/policy-pdpd-cl:${POLICY_DROOLS_APPS_VERSION} - container_name: drools-apps - depends_on: - - mariadb - - simulator - - pap - - xacml-pdp - hostname: drools-apps - expose: - - 6969 - - 9696 - volumes: - - ./config/drools-apps/custom:/tmp/policy-install/config:ro - - ./config/feature-lifecycle.properties:/opt/app/policy/features/lifecycle/config/feature-lifecycle.properties:ro - - ./wait_for_port.sh:/opt/app/policy/bin/wait_for_port.sh:ro - env_file: - - ./config/drools-apps/env/base.conf - - ./config/drools-apps/env/feature-healthcheck.conf - - ./config/drools-apps/env/feature-pooling-dmaap.conf - entrypoint: /opt/app/policy/bin/wait_for_port.sh - command: [ - '-c', '/opt/app/policy/bin/pdpd-cl-entrypoint.sh boot', - 'mariadb', '3306', - 'message-router', '3905', - 'pap', '6969', - 'aai-sim', '6666', - 'sdnc-sim', '6668', - 'so-sim', '6669', - 'vfc-sim', '6670' - ] - apex-pdp: - image: nexus3.onap.org:10001/onap/policy-apex-pdp:${POLICY_APEX_PDP_VERSION} - container_name: policy-apex-pdp - depends_on: - - mariadb - - simulator - - pap - hostname: policy-apex-pdp - expose: - - 6969 - - 23324 - volumes: - - ./config/apex-pdp/OnapPfConfig.json:/opt/app/policy/apex-pdp/etc/onappf/config/OnapPfConfig.json:ro - - ./config/ks.jks:/opt/app/policy/apex-pdp/etc/ssl/policy-keystore:ro - - ./config/policy-truststore:/opt/app/policy/apex-pdp/etc/ssl/policy-truststore:ro - - ./wait_for_port.sh:/opt/app/policy/bin/wait_for_port.sh:ro - entrypoint: /opt/app/policy/bin/wait_for_port.sh - command: [ - '-c', '/opt/app/policy/apex-pdp/bin/apexOnapPf.sh -c /opt/app/policy/apex-pdp/etc/onappf/config/OnapPfConfig.json', - 'mariadb', '3306', - 'message-router', '3905', - 'pap', '6969' - ] - distribution: - image: nexus3.onap.org:10001/onap/policy-distribution:${POLICY_DISTRIBUTION_VERSION} - container_name: policy-distribution - depends_on: - - mariadb - - api - - pap - - apex-pdp - hostname: policy-distribution - volumes: - - ./config/distribution/defaultConfig.json:/opt/app/policy/distribution/etc/defaultConfig.json:ro - - ./config/ks.jks:/opt/app/policy/distribution/etc/ssl/policy-keystore:ro - - ./config/policy-truststore:/opt/app/policy/distribution/etc/ssl/policy-truststore:ro - - ./distribution/config/temp/:/opt/app/policy/distribution/etc/temp/:ro - - ./wait_for_port.sh:/opt/app/policy/bin/wait_for_port.sh:ro - entrypoint: /opt/app/policy/bin/wait_for_port.sh - command: [ - '-c', './policy-dist.sh', - 'mariadb', '3306', - 'message-router', '3905', - 'pap', '6969', - 'apex-pdp', '6969' - ] - policy-clamp-runtime-acm: - image: nexus3.onap.org:10001/onap/policy-clamp-runtime-acm:${POLICY_CLAMP_VERSION} - container_name: policy-clamp-runtime-acm - depends_on: - - mariadb - - simulator - - policy-clamp-ac-http-ppnt - - policy-clamp-ac-k8s-ppnt - - policy-clamp-ac-pf-ppnt - hostname: policy-clamp-runtime-acm - expose: - - 6969 - volumes: - - ./config/policy-truststore:/opt/app/policy/clamp/etc/ssl/policy-truststore:ro - - ./wait_for_port.sh:/opt/app/policy/bin/wait_for_port.sh:ro - - ./config/ks.jks:/opt/app/policy/clamp/etc/ssl/policy-keystore:ro - - ./config/clamp/AcRuntimeParameters.yaml:/opt/app/policy/clamp/config/AcRuntimeParameters.yaml - entrypoint: /opt/app/policy/bin/wait_for_port.sh - command: [ - '-c', './acm-runtime.sh', - 'message-router', '3905' - ] - policy-clamp-ac-http-ppnt: - image: nexus3.onap.org:10001/onap/policy-clamp-ac-http-ppnt:${POLICY_CLAMP_VERSION} - container_name: policy-clamp-ac-http-ppnt - depends_on: - - simulator - hostname: policy-clamp-ac-http-ppnt - expose: - - 6971 - volumes: - - ./config/policy-truststore:/opt/app/policy/clamp/etc/ssl/policy-truststore:ro - - ./wait_for_port.sh:/opt/app/policy/bin/wait_for_port.sh:ro - - ./config/ks.jks:/opt/app/policy/clamp/etc/ssl/policy-keystore:ro - entrypoint: /opt/app/policy/bin/wait_for_port.sh - command: [ - '-c', './http-participant.sh', - 'message-router', '3905' - ] - policy-clamp-ac-k8s-ppnt: - image: nexus3.onap.org:10001/onap/policy-clamp-ac-k8s-ppnt:${POLICY_CLAMP_VERSION} - container_name: policy-clamp-ac-k8s-ppnt - depends_on: - - simulator - hostname: policy-clamp-ac-k8s-ppnt - expose: - - 6972 - volumes: - - ./config/policy-truststore:/opt/app/policy/clamp/etc/ssl/policy-truststore:ro - - ./wait_for_port.sh:/opt/app/policy/bin/wait_for_port.sh:ro - - ./config/ks.jks:/opt/app/policy/clamp/etc/ssl/policy-keystore:ro - entrypoint: /opt/app/policy/bin/wait_for_port.sh - command: [ - '-c', './kubernetes-participant.sh', - 'message-router', '3905' - ] - policy-clamp-ac-pf-ppnt: - image: nexus3.onap.org:10001/onap/policy-clamp-ac-pf-ppnt:${POLICY_CLAMP_VERSION} - container_name: policy-clamp-ac-pf-ppnt - depends_on: - - simulator - - api - hostname: policy-clamp-ac-pf-ppnt - expose: - - 6973 - volumes: - - ./config/policy-truststore:/opt/app/policy/clamp/etc/ssl/policy-truststore:ro - - ./wait_for_port.sh:/opt/app/policy/bin/wait_for_port.sh:ro - - ./config/ks.jks:/opt/app/policy/clamp/etc/ssl/policy-keystore:ro - - ./config/clamp/PolicyParticipantParameters.yaml:/opt/app/policy/clamp/config/PolicyParticipantParameters.yaml:ro - entrypoint: /opt/app/policy/bin/wait_for_port.sh - command: [ - '-c', './policy-participant.sh', - 'message-router', '3905' - ] - - policy-gui: - image: nexus3.onap.org:10001/onap/policy-gui:latest - container_name: policy-gui - depends_on: - - policy-clamp-backend - hostname: policy-gui - environment: - CLAMP_URL: https://policy-clamp-backend:8443 - CLAMP_DISABLE_SSL_VALIDATION: "true" - SERVER_SSL_CLIENT_AUTH: want - KEYSTORE_PASSWD: Pol1cy_0nap - TRUSTSTORE_PASSWD: Pol1cy_0nap - ports: - - "2443:2443" - expose: - - 2443 - volumes: - - ./config/clamp/gui/application.yaml:/opt/app/policy/gui/etc/application.yaml - - ./config/policy-truststore:/opt/app/policy/gui/etc/mounted/policy-truststore:ro - - ./config/ks.jks:/opt/app/policy/gui/etc/mounted/policy-keystore:ro - - ./wait_for_port.sh:/opt/app/policy/gui/bin/wait_for_port.sh:ro - entrypoint: ./policy-gui.sh - working_dir: /opt/app/policy/gui/bin - command: ./policy-gui.sh - - policy-clamp-backend: - image: nexus3.onap.org:10001/onap/policy-clamp-backend:${POLICY_CLAMP_VERSION} - container_name: policy-clamp-backend - depends_on: - - policy-clamp-runtime-acm - - distribution - hostname: policy-clamp-backend - environment: - POLICY_API_HOST: api - POLICY_PAP_HOST: pap - MARIADB_HOST: mariadb - RUNTIME_HOST: policy-clamp-runtime-acm - ports: - - "8443:8443" - expose: - - 8443 - volumes: - - ./config/clamp/application-smoke.properties:/opt/policy/clamp/application-smoke.properties:ro - - ./config/policy-truststore:/opt/policy/clamp/policy-truststore:ro - - ./config/ks.jks:/opt/policy/clamp/policy-keystore:ro - - ./config/clamp/org.onap.clamp.keyfile:/opt/policy/clamp/clamp-be-keyfile:ro - working_dir: /opt/policy/clamp - command: java -Djava.security.egd=file:/dev/./urandom -XX:MinRAMPercentage=50 -XX:MaxRAMPercentage=75 -jar ./policy-clamp-backend.jar --spring.config.name=application-smoke --spring.config.location=optional:classpath:/,optional:classpath:/config/,optional:file:./,optional:file:./config/ diff --git a/csit/drools-applications/plans/teardown.sh b/csit/drools-applications/plans/teardown.sh index f1a8624f..72ade97b 100755 --- a/csit/drools-applications/plans/teardown.sh +++ b/csit/drools-applications/plans/teardown.sh @@ -18,10 +18,4 @@ # ============LICENSE_END===================================================== # -docker logs policy-api -docker logs simulator -docker logs policy-pap -docker logs xacml-pdp -docker logs drools-apps - docker-compose -f ${SCRIPTS}/docker-compose-all.yml down -v diff --git a/csit/drools-applications/tests/drools-applications-test.robot b/csit/drools-applications/tests/drools-applications-test.robot index a908f79b..c06631b9 100644 --- a/csit/drools-applications/tests/drools-applications-test.robot +++ b/csit/drools-applications/tests/drools-applications-test.robot @@ -213,8 +213,8 @@ VerifyController PeformGetRequest [Arguments] ${url} ${hostname} ${port} ${expectedstatus} ${auth}= Create List demo@people.osaaf.org demo123456! - Log Creating session https://${hostname}:${port} - ${session}= Create Session policy https://${hostname}:${port} auth=${auth} + Log Creating session http://${hostname}:${port} + ${session}= Create Session policy http://${hostname}:${port} auth=${auth} ${headers}= Create Dictionary Accept=application/json Content-Type=application/json ${resp}= GET On Session policy ${url} headers=${headers} expected_status=${expectedstatus} Log Received response from policy ${resp.text} @@ -224,8 +224,8 @@ PerformPostRequest [Arguments] ${url} ${params} ${hostname} ${port} ${jsonfile} ${filepath} ${contenttype} ${expectedstatus} ${auth}= Create List policyadmin zb!XztG34 ${postjson}= Get file ${filepath}/${jsonfile} - Log Creating session https://${hostname}:${port} - ${session}= Create Session policy https://${hostname}:${port} auth=${auth} + Log Creating session http://${hostname}:${port} + ${session}= Create Session policy http://${hostname}:${port} auth=${auth} ${headers}= Create Dictionary Accept=application/${contenttype} Content-Type=application/${contenttype} ${resp}= POST On Session policy ${url} params=${params} data=${postjson} headers=${headers} expected_status=${expectedstatus} Log Received response from policy ${resp.text} diff --git a/csit/drools-pdp/plans/teardown.sh b/csit/drools-pdp/plans/teardown.sh index 6ec00513..c2b68155 100755 --- a/csit/drools-pdp/plans/teardown.sh +++ b/csit/drools-pdp/plans/teardown.sh @@ -16,9 +16,4 @@ # limitations under the License. # ============LICENSE_END========================================================= -docker logs policy-api -docker logs simulator -docker logs policy-pap -docker logs drools - docker-compose -f ${SCRIPTS}/docker-compose-all.yml down -v diff --git a/csit/drools-pdp/tests/drools-pdp-test.robot b/csit/drools-pdp/tests/drools-pdp-test.robot index 68dc4ead..3d95b6a1 100644 --- a/csit/drools-pdp/tests/drools-pdp-test.robot +++ b/csit/drools-pdp/tests/drools-pdp-test.robot @@ -8,8 +8,8 @@ Library json Alive [Documentation] Runs Policy PDP Alive Check ${auth}= Create List demo@people.osaaf.org demo123456! - Log Creating session https://${POLICY_DROOLS_IP}:9696 - ${session}= Create Session policy https://${POLICY_DROOLS_IP}:9696 auth=${auth} + Log Creating session http://${POLICY_DROOLS_IP}:9696 + ${session}= Create Session policy http://${POLICY_DROOLS_IP}:9696 auth=${auth} ${headers}= Create Dictionary Accept=application/json Content-Type=application/json ${resp}= GET On Session policy /policy/pdp/engine headers=${headers} expected_status=200 Log Received response from policy ${resp.text} @@ -18,8 +18,8 @@ Alive Metrics [Documentation] Verify drools-pdp is exporting metrics ${auth}= Create List demo@people.osaaf.org demo123456! - Log Creating session https://${POLICY_DROOLS_IP}:9696 - ${session}= Create Session policy https://${POLICY_DROOLS_IP}:9696 auth=${auth} + Log Creating session http://${POLICY_DROOLS_IP}:9696 + ${session}= Create Session policy http://${POLICY_DROOLS_IP}:9696 auth=${auth} ${headers}= Create Dictionary Accept=application/json Content-Type=application/json ${resp}= GET On Session policy /metrics headers=${headers} expected_status=200 Log Received response from policy ${resp.text} diff --git a/csit/gen_keystore.sh b/csit/gen_keystore.sh deleted file mode 100755 index 9b1cdfd6..00000000 --- a/csit/gen_keystore.sh +++ /dev/null @@ -1,54 +0,0 @@ -#!/bin/bash -# -# ===========LICENSE_START==================================================== -# Copyright (C) 2021 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===================================================== -# - -# -# Generates a self-signed keystore for use by the various policy docker -# images. -# - -DIR="${0%/*}/config" -cd "${DIR}" - -OUTFILE=ks.jks - -ALIAS="policy@policy.onap.org" -PASS=Pol1cy_0nap - -dn="C=US, O=ONAP, OU=OSAAF, OU=policy@policy.onap.org:DEV, CN=policy" - -rm -f "${OUTFILE}" - -keytool -genkeypair -alias "${ALIAS}" -validity 30 \ - -keyalg RSA -dname "${dn}" -keystore "${OUTFILE}" \ - -keypass "${PASS}" -storepass "${PASS}" - -keytool -certreq -alias "${ALIAS}" -keystore ks.jks -file ks.csr \ - -storepass "${PASS}" - -openssl x509 -CA caroot.cer -CAkey cakey.pem -CAserial caserial.txt \ - -req -in ks.csr -out ks.cer -passin "pass:${PASS}" \ - -extfile dns_ssl.txt -days 30 - -keytool -import -noprompt -file caroot.cer -keystore ks.jks \ - -storepass "${PASS}" - -keytool -import -alias "${ALIAS}" -file ks.cer -keystore ks.jks \ - -storepass "${PASS}" - -chmod 644 "$OUTFILE" diff --git a/csit/gen_truststore.sh b/csit/gen_truststore.sh deleted file mode 100755 index 748d5f30..00000000 --- a/csit/gen_truststore.sh +++ /dev/null @@ -1,49 +0,0 @@ -#!/bin/bash -# -# ===========LICENSE_START==================================================== -# Copyright (C) 2021 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===================================================== -# - -# -# Generates a root certificate and truststore for use by the various policy -# docker images. -# - -DIR="${0%/*}/config" -cd "${DIR}" - -OUTFILE=policy-truststore -ALIAS=onap.policy.csit.root.ca -PASS=Pol1cy_0nap - -keytool -list -alias ${ALIAS} -keystore ${OUTFILE} -storepass "${PASS}" \ - >/dev/null 2>&1 -if [ $? -eq 0 ] -then - echo "Truststore already contains a policy root CA - not re-generating" - exit 0 -fi - -openssl req -new -keyout cakey.pem -out careq.pem -passout "pass:${PASS}" \ - -subj "/C=US/ST=New Jersey/OU=ONAP/CN=policy.onap" - -openssl x509 -signkey cakey.pem -req -days 3650 -in careq.pem \ - -out caroot.cer -extensions v3_ca -passin "pass:${PASS}" - -keytool -import -noprompt -trustcacerts -alias ${ALIAS} \ - -file caroot.cer -keystore "${OUTFILE}" -storepass "${PASS}" - -chmod 644 "$OUTFILE" diff --git a/csit/include-raw-integration-install-robotframework.sh b/csit/include-raw-integration-install-robotframework.sh index 22f71a73..2711d18e 100755 --- a/csit/include-raw-integration-install-robotframework.sh +++ b/csit/include-raw-integration-install-robotframework.sh @@ -2,7 +2,7 @@ # # ============LICENSE_START=================================================== # Copyright (c) 2016 The Linux Foundation and others. -# Modification Copyright 2021-2022 Nordix Foundation. +# Modification Copyright 2021. Nordix Foundation. # Modification Copyright 2021 AT&T Intellectual Property. All rights reserved. # ============================================================================ # Licensed under the Apache License, Version 2.0 (the "License"); diff --git a/csit/make_topic.sh b/csit/make_topic.sh index 77e0a2dd..05d11f3c 100755 --- a/csit/make_topic.sh +++ b/csit/make_topic.sh @@ -2,6 +2,7 @@ # # ===========LICENSE_START==================================================== # Copyright (C) 2020-2021 AT&T Intellectual Property. All rights reserved. +# Modifications Copyright (C) 2022 Nordix Foundation. # ============================================================================ # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. @@ -29,5 +30,5 @@ fi topic="${1}" -curl -s -k "https://${SIM_IP}:3905/events/${topic}/script/1?limit=1&timeout=0" +curl -s -k "http://${SIM_IP}:3904/events/${topic}/script/1?limit=1&timeout=0" echo diff --git a/csit/metrics/prometheus.yml b/csit/metrics/prometheus.yml index 1b292cd7..c2e0cf10 100644 --- a/csit/metrics/prometheus.yml +++ b/csit/metrics/prometheus.yml @@ -84,3 +84,16 @@ scrape_configs: basic_auth: username: "healthcheck" password: "zb!XztG34" + + - job_name: "acm-metrics" + metrics_path: "/prometheus" + static_configs: + - targets: + - "policy-clamp-runtime-acm:6969" + basic_auth: + username: "runtimeUser" + password: "zb!XztG34" + + - job_name: "node" + static_configs: + - targets: ["node-exporter:9100"] diff --git a/csit/onset.sh b/csit/onset.sh index 06b0c9fd..251b5b51 100755 --- a/csit/onset.sh +++ b/csit/onset.sh @@ -2,6 +2,7 @@ # # ===========LICENSE_START==================================================== # Copyright (C) 2020-2021 AT&T Intellectual Property. All rights reserved. +# Modifications Copyright (C) 2022 Nordix Foundation. # ============================================================================ # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. @@ -28,5 +29,5 @@ then fi curl -k -H "Content-type: application/json" --data-binary @$1 \ - https://${SIM_IP}:3905/events/unauthenticated.DCAE_CL_OUTPUT + http://${SIM_IP}:3904/events/unauthenticated.DCAE_CL_OUTPUT echo diff --git a/csit/pap/plans/setup.sh b/csit/pap/plans/setup.sh index 8612d2bf..c5b75937 100755 --- a/csit/pap/plans/setup.sh +++ b/csit/pap/plans/setup.sh @@ -2,6 +2,7 @@ # ============LICENSE_START======================================================= # Copyright (C) 2019-2022 Nordix Foundation. # Modifications Copyright (C) 2019-2021 AT&T Intellectual Property. +# Modifications Copyright (C) 2022 Nordix Foundation. # ================================================================================ # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. @@ -23,13 +24,17 @@ python3 -m pip uninstall -y docker-py python3 -m pip uninstall -y docker python3 -m pip install -U docker -sudo apt-get -y install libxml2-utils - source "${SCRIPTS}"/get-versions.sh + +sudo apt-get -y install libxml2-utils bash "${SCRIPTS}"/get-models-examples.sh -docker-compose -f "${SCRIPTS}"/docker-compose-all.yml up -d pap +echo "${POLICY_PAP_VERSION}" + +cd "${SCRIPTS}" +docker-compose -f "${SCRIPTS}"/docker-compose-all.yml up -d pap apex-pdp +sleep 10 unset http_proxy https_proxy POLICY_PAP_IP=$(get-instance-ip.sh policy-pap) @@ -43,7 +48,6 @@ echo MARIADB IP IS "${MARIADB_IP}" # wait for the app to start up "${SCRIPTS}"/wait_for_port.sh "${POLICY_PAP_IP}" 6969 - DATA=${WORKSPACE}/models/models-examples/src/main/resources/policies NODETEMPLATES=${WORKSPACE}/models/models-examples/src/main/resources/nodetemplates diff --git a/csit/pap/plans/teardown.sh b/csit/pap/plans/teardown.sh index 10c5f789..0d4c6ed2 100755 --- a/csit/pap/plans/teardown.sh +++ b/csit/pap/plans/teardown.sh @@ -18,8 +18,4 @@ # SPDX-License-Identifier: Apache-2.0 # ============LICENSE_END========================================================= -docker logs policy-api -docker logs simulator -docker logs policy-pap - docker-compose -f ${SCRIPTS}/docker-compose-all.yml down -v diff --git a/csit/pap/tests/pap-test.robot b/csit/pap/tests/pap-test.robot index 203ddd6c..c2ad8370 100644 --- a/csit/pap/tests/pap-test.robot +++ b/csit/pap/tests/pap-test.robot @@ -46,7 +46,6 @@ Metrics Should Contain ${resp.text} http_server_requests_seconds_count{exception="None",method="GET",outcome="SUCCESS",status="200",uri="/policy/pap/v1/components/healthcheck",} 1.0 Should Contain ${resp.text} spring_data_repository_invocations_seconds_count{exception="None",method="save",repository="PdpGroupRepository",state="SUCCESS",} 1.0 Should Contain ${resp.text} spring_data_repository_invocations_seconds_count{exception="None",method="findByKeyName",repository="PdpGroupRepository",state="SUCCESS",} 1.0 - Should Contain ${resp.text} spring_data_repository_invocations_seconds_count{exception="None",method="findAll",repository="PdpGroupRepository",state="SUCCESS",} 1.0 Should Contain ${resp.text} spring_data_repository_invocations_seconds_count{exception="None",method="findAll",repository="PolicyStatusRepository",state="SUCCESS",} 1.0 Statistics @@ -106,7 +105,8 @@ QueryPdpGroupsAfterUndeploy QueryPdpGroups 2 defaultGroup ACTIVE 0 testGroup ACTIVE 0 QueryPolicyAuditAfterUnDeploy - [Documentation] Verify policy audit record after undeploy + [Documentation] Verify policy audit record after undeploy + Sleep 60 seconds QueryPolicyAudit /policy/pap/v1/policies/audit 200 testGroup pdpTypeA onap.restart.tca UNDEPLOYMENT QueryPolicyAuditWithMetadataSetAfterUnDeploy diff --git a/csit/prepare-config-files.py b/csit/prepare-config-files.py deleted file mode 100755 index 4eaa3422..00000000 --- a/csit/prepare-config-files.py +++ /dev/null @@ -1,59 +0,0 @@ -#!/usr/bin/python3 -# -# ============LICENSE_START==================================================== -# Copyright (C) 2022 Nordix Foundation. -# ============================================================================= -# 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. -# -# SPDX-License-Identifier: Apache-2.0 -# ============LICENSE_END====================================================== - -import os -import argparse - -if __name__ == '__main__': - parser = argparse.ArgumentParser(description='Process configuration files for https/ssl ' - 'disabling.') - parser.add_argument('--https', default="true", - help='enable or disable https/ssl connection. ' - 'use https=true or https=false') - - https_enabled = parser.parse_args().https - message_router_port = '3905' if https_enabled == "true" else '3904' - protocol = 'https://' if https_enabled == "true" else 'http://' - - current_dir = os.getcwd() - config_dir = current_dir + "/config/" - - files = [] - for (dirpath, dirnames, filenames) in os.walk(config_dir): - for filename in filenames: - files.append(os.path.join(dirpath, filename)) - - for file in files: - try: - with open(file, 'r+') as f: - content = f.read() - new_content = content.replace("{{HTTPS_ENABLED}}", https_enabled) - new_content = new_content.replace("{{PROTOCOL}}", protocol) - new_content = new_content.replace("{{MESSAGE_ROUTER_PORT}}", message_router_port) - - if new_content != content: - f.seek(0) - f.truncate() - f.write(new_content) - print("File {0} updated!".format(file)) - except UnicodeDecodeError: - print("File didn't open: ", file) - - exit(0) diff --git a/csit/pylibs.txt b/csit/pylibs.txt index d6250dba..a8d8c4e3 100644 --- a/csit/pylibs.txt +++ b/csit/pylibs.txt @@ -7,7 +7,6 @@ requests robotframework-httplibrary robotframework-requests robotframework-selenium2library -robotframework-extendedselenium2library robotframework-sshlibrary scapy # Module jsonpath is needed by current AAA idmlite suite. diff --git a/csit/run-project-csit.sh b/csit/run-project-csit.sh index c0f8d07a..fd20c6af 100755 --- a/csit/run-project-csit.sh +++ b/csit/run-project-csit.sh @@ -31,10 +31,13 @@ function on_exit(){ rsync -av "${WORKDIR}/" "${WORKSPACE}/csit/archives/${PROJECT}" fi # Record list of active docker containers - docker ps --format "{{.Image}}" > "${WORKSPACE}/csit/archives/${PROJECT}/_docker-images.log" + docker ps + + # Show the logs from all containers + docker-compose -f "${WORKSPACE}/csit/docker-compose-all.yml" logs # show memory consumption after all docker instances initialized - docker_stats | tee "${WORKSPACE}/csit/archives/${PROJECT}/_sysinfo-2-after-robot.txt" + docker_stats fi # Run teardown script plan if it exists cd "${TESTPLANDIR}/plans/" @@ -51,16 +54,23 @@ function on_exit(){ trap on_exit EXIT function docker_stats(){ - #General memory details - echo "> top -bn1 | head -3" - top -bn1 | head -3 - echo - - echo "> free -h" - free -h - echo + # General memory details + if [ "$(uname -s)" == "Darwin" ] + then + echo "> top -l1 | head -10" + sh -c "top -l1 | head -10" + echo + else + echo "> top -bn1 | head -3" + sh -c "top -bn1 | head -3" + echo + + echo "> free -h" + sh -c "free -h" + echo + fi - #Memory details per Docker + # Memory details per Docker echo "> docker ps" docker ps echo @@ -120,6 +130,19 @@ function source_safely() { # main # +if $(docker images | grep -q "onap\/policy-api") +then + echo where + export CONTAINER_LOCATION=$( + docker images | + grep onap/policy-api | + head -1 | + sed 's/onap\/policy-api.*$//' + ) +else + export CONTAINER_LOCATION="nexus3.onap.org:10001/" +fi + # set and save options for quick failure harden_set && save_set @@ -145,10 +168,6 @@ export ROBOT_VARIABLES= # get the plan from git clone source "${SCRIPTS}"/get-branch.sh -# Prepare configuration files -cd "${WORKSPACE}/csit" -python3 ./prepare-config-files.py --https=true - export PROJECT="${1}" cd ${WORKSPACE} @@ -165,25 +184,12 @@ source_safely "${SCRIPTS}/prepare-csit.sh" # Activate the virtualenv containing all the required libraries installed by prepare-csit.sh source_safely "${ROBOT_VENV}/bin/activate" -WORKDIR=$(mktemp -d --suffix=-robot-workdir) +WORKDIR=$(mktemp -d) cd "${WORKDIR}" # Sign in to nexus3 docker repo docker login -u docker -p docker nexus3.onap.org:10001 -# Generate truststore and keystore to be used by repos -#${SCRIPTS}/gen_truststore.sh -#${SCRIPTS}/gen_keystore.sh -cp ${SCRIPTS}/config/ks.jks ${SCRIPTS}/config/drools/custom/policy-keystore -cp ${SCRIPTS}/config/ks.jks ${SCRIPTS}/config/drools-apps/custom/policy-keystore -cp ${SCRIPTS}/config/policy-truststore \ - ${SCRIPTS}/config/drools/custom/policy-truststore -cp ${SCRIPTS}/config/policy-truststore \ - ${SCRIPTS}/config/drools-apps/custom/policy-truststore -chmod 644 \ - ${SCRIPTS}/config/drools/custom/policy-* \ - ${SCRIPTS}/config/drools-apps/custom/policy-* - # Run setup script plan if it exists cd "${TESTPLANDIR}/plans/" SETUP="${TESTPLANDIR}/plans/setup.sh" @@ -200,7 +206,7 @@ cd "${WORKDIR}" echo "Reading the testplan:" cat "${TESTPLANDIR}/plans/testplan.txt" | egrep -v '(^[[:space:]]*#|^[[:space:]]*$)' | sed "s|^|${TESTPLANDIR}/tests/|" > testplan.txt cat testplan.txt -SUITES=$( xargs -a testplan.txt ) +SUITES=$( xargs < testplan.txt ) echo ROBOT_VARIABLES="${ROBOT_VARIABLES}" echo "Starting Robot test suites ${SUITES} ..." diff --git a/csit/start-gui-smoke-components.sh b/csit/start-all.sh similarity index 82% rename from csit/start-gui-smoke-components.sh rename to csit/start-all.sh index 4fe36a01..15210aab 100755 --- a/csit/start-gui-smoke-components.sh +++ b/csit/start-all.sh @@ -18,12 +18,8 @@ SCRIPTS=$(git rev-parse --show-toplevel) export SCRIPTS="${SCRIPTS}"/csit -cd ${SCRIPTS} +source "${SCRIPTS}"/get-versions.sh -python3 ./prepare-config-files.py --https=true +docker-compose -f "${SCRIPTS}"/docker-compose-all.yml up -d policy-gui -source ./get-versions.sh - -docker-compose -f docker-compose-gui-smoke.yml up -d policy-gui - -echo "Clamp GUI: https://localhost:2443/clamp" +echo "Clamp GUI: https://localhost:2445/clamp" diff --git a/csit/start-grafana.sh b/csit/start-grafana.sh index 0350ad25..e081d04c 100755 --- a/csit/start-grafana.sh +++ b/csit/start-grafana.sh @@ -21,20 +21,16 @@ SCRIPTS=$(git rev-parse --show-toplevel) export SCRIPTS="${SCRIPTS}"/csit -cd ${SCRIPTS} - -python3 ./prepare-config-files.py --https=false - -source ./get-versions.sh +source "${SCRIPTS}"/get-versions.sh export PROJECT="${1}" if [ -z "${PROJECT}" ]; then echo "Starting all components..." - docker-compose -f ./compose-grafana.yml up -d + docker-compose -f "${SCRIPTS}"/compose-grafana.yml up -d else echo "Starting ${PROJECT} application..." - docker-compose -f ./compose-grafana.yml up -d "${PROJECT}" grafana + docker-compose -f "${SCRIPTS}"/compose-grafana.yml up -d "${PROJECT}" grafana fi prometheus=$(docker inspect -f '{{range.NetworkSettings.Networks}}{{.IPAddress}}{{end}}' prometheus) diff --git a/csit/stop-gui-smoke.sh b/csit/stop-all.sh similarity index 93% rename from csit/stop-gui-smoke.sh rename to csit/stop-all.sh index c69069b3..4e6b0aa6 100755 --- a/csit/stop-gui-smoke.sh +++ b/csit/stop-all.sh @@ -23,4 +23,4 @@ export SCRIPTS="${SCRIPTS}"/csit source "${SCRIPTS}"/get-versions.sh -docker-compose -f "${SCRIPTS}"/docker-compose-gui-smoke.yml down +docker-compose -f "${SCRIPTS}"/docker-compose-all.yml down diff --git a/csit/wait_for_port.sh b/csit/wait_for_port.sh index 9262ba32..5a8be250 100755 --- a/csit/wait_for_port.sh +++ b/csit/wait_for_port.sh @@ -62,6 +62,11 @@ do while [ "$tmout" -gt 0 ] do + if command -v docker > /dev/null 2>&1 + then + docker ps + fi + nc -vz "$host" "$port" rc=$? @@ -69,7 +74,6 @@ do then break else - docker ps tmout=$((tmout-1)) sleep 1 fi diff --git a/csit/wait_topic.sh b/csit/wait_topic.sh index 64b6c9f3..a6d997d0 100755 --- a/csit/wait_topic.sh +++ b/csit/wait_topic.sh @@ -2,6 +2,7 @@ # # ===========LICENSE_START==================================================== # Copyright (C) 2020-2021 AT&T Intellectual Property. All rights reserved. +# Modifications Copyright (C) 2022 Nordix Foundation. # ============================================================================ # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. @@ -39,7 +40,7 @@ matched=no while [ ${matched} = "no" ] do - msg=`curl -s -k "https://${SIM_IP}:3905/events/${topic}/script/1?limit=1"` + msg=`curl -s -k "http://${SIM_IP}:3904/events/${topic}/script/1?limit=1"` if [ $? -ne 0 -o "${msg}" = "[]" ] then echo not found >&2 diff --git a/csit/xacml-pdp/plans/setup.sh b/csit/xacml-pdp/plans/setup.sh index c99a0318..705c8202 100755 --- a/csit/xacml-pdp/plans/setup.sh +++ b/csit/xacml-pdp/plans/setup.sh @@ -40,7 +40,7 @@ POLICY_PAP_IP=$(get-instance-ip.sh policy-pap) export SIM_IP -echo PDP IP IS "${POLICY_PDPX_IP}" +echo XACML-PDP IP IS "${POLICY_PDPX_IP}" echo API IP IS "${POLICY_API_IP}" echo PAP IP IS "${POLICY_PAP_IP}" echo MARIADB IP IS "${MARIADB_IP}" diff --git a/csit/xacml-pdp/plans/teardown.sh b/csit/xacml-pdp/plans/teardown.sh index 3e2fc5f7..6f77caa4 100755 --- a/csit/xacml-pdp/plans/teardown.sh +++ b/csit/xacml-pdp/plans/teardown.sh @@ -18,9 +18,4 @@ # SPDX-License-Identifier: Apache-2.0 # ============LICENSE_END========================================================= -docker logs policy-api -docker logs simulator -docker logs policy-pap -docker logs xacml-pdp - docker-compose -f ${SCRIPTS}/docker-compose-all.yml down -v diff --git a/env.properties b/env.properties new file mode 100644 index 00000000..f261e4c9 --- /dev/null +++ b/env.properties @@ -0,0 +1 @@ +ROBOT_VENV=/var/folders/6c/dcrpcjhj3g55rx06jz5btng00000gn/T/tmp.fs02QdL6 diff --git a/policy-jdk/alpine/pom.xml b/policy-jdk/alpine/pom.xml index 8a899a48..19f382e1 100644 --- a/policy-jdk/alpine/pom.xml +++ b/policy-jdk/alpine/pom.xml @@ -37,8 +37,95 @@ onap/policy-jdk-alpine + onap/integration-python + 9.1.0 + + + + baseImage + + + aarch64 + + + + + + org.apache.maven.plugins + maven-scm-plugin + 1.13.0 + + + org.codehaus.plexus + plexus-utils + 3.4.2 + + + org.apache.maven.scm + maven-scm-provider-gitexe + 1.13.0 + + + + connection + src/main/resources/meta + + + + checkout-onap-python + validate + + scm:git:https://gerrit.onap.org/r/integration/docker/onap-python + ${project.build.directory}/onap-python + + + checkout + + + + + + io.fabric8 + docker-maven-plugin + + + + generate-python-image + initialize + + true + 1.23 + ${docker.pull.registry} + ${docker.push.registry} + + + ${integration.python.name} + + try + ${project.build.directory}/onap-python + Dockerfile + + ${integration.python.version} + ${integration.python.version}-${maven.build.timestamp} + ${project.docker.latest.minmax.tag.version} + + + + + + + build + + + + + + + + + ${project.artifactId}-${project.version} @@ -58,6 +145,10 @@ + + io.github.git-commit-id + git-commit-id-maven-plugin + io.fabric8 docker-maven-plugin @@ -78,6 +169,10 @@ ${project.version}-${maven.build.timestamp} ${project.docker.latest.minmax.tag.version} + + ${integration.python.name} + ${integration.python.version} + @@ -85,8 +180,8 @@ - clean-images - pre-clean + clean-jdk-image + prepare-package remove @@ -96,15 +191,15 @@ - generate-images - generate-sources + generate-jdk-image + package build - push-images + push-jdk-image deploy build diff --git a/policy-jdk/alpine/src/main/docker/Dockerfile b/policy-jdk/alpine/src/main/docker/Dockerfile index ca4021b1..fc4006a3 100644 --- a/policy-jdk/alpine/src/main/docker/Dockerfile +++ b/policy-jdk/alpine/src/main/docker/Dockerfile @@ -23,7 +23,10 @@ # $JAVA_HOME is set to /usr/lib/jvm/java-11-openjdk # more details at https://hub.docker.com/_/openjdk -FROM onap/integration-python:9.1.0 +ARG INTEGRATION_PYTHON_NAME=${INTEGRATION_PYTHON_NAME} +ARG INTEGRATION_PYTHON_VERSION=${INTEGRATION_PYTHON_VERSION} + +FROM ${INTEGRATION_PYTHON_NAME}:${INTEGRATION_PYTHON_VERSION} LABEL maintainer="Policy Team" diff --git a/policy-jre/alpine/pom.xml b/policy-jre/alpine/pom.xml index 06074340..90e3bda5 100644 --- a/policy-jre/alpine/pom.xml +++ b/policy-jre/alpine/pom.xml @@ -29,7 +29,6 @@ policy-jre 2.4.5-SNAPSHOT - pom policy-jre-alpine Policy alpine jre docker image @@ -37,8 +36,95 @@ onap/policy-jre-alpine + onap/integration-java11 + 9.0.0 + + + + baseImage + + + aarch64 + + + + + + org.apache.maven.plugins + maven-scm-plugin + 1.13.0 + + + org.codehaus.plexus + plexus-utils + 3.4.2 + + + org.apache.maven.scm + maven-scm-provider-gitexe + 1.13.0 + + + + connection + src/main/resources/meta + + + + checkout-onap-python + validate + + scm:git:https://gerrit.onap.org/r/integration/docker/onap-java11 + ${project.build.directory}/onap-java11 + + + checkout + + + + + + io.fabric8 + docker-maven-plugin + + + + generate-base-image + initialize + + true + 1.23 + ${docker.pull.registry} + ${docker.push.registry} + + + ${integration.java.name} + + try + ${project.build.directory}/onap-java11 + BareAlpine.Dockerfile + + ${integration.java.version} + ${integration.java.version}-${maven.build.timestamp} + ${project.docker.latest.minmax.tag.version} + + + + + + + build + + + + + + + + + ${project.artifactId}-${project.version} @@ -48,7 +134,7 @@ 2.1.1 - validate + prepare-package execute @@ -58,6 +144,10 @@ + + io.github.git-commit-id + git-commit-id-maven-plugin + io.fabric8 docker-maven-plugin @@ -78,6 +168,10 @@ ${project.version}-${maven.build.timestamp} ${project.docker.latest.minmax.tag.version} + + ${integration.java.name} + ${integration.java.version} + @@ -85,8 +179,8 @@ - clean-images - pre-clean + clean-jre-image + prepare-package remove @@ -96,15 +190,15 @@ - generate-images - generate-sources + generate-jre-image + package build - push-images + push-jre-image deploy build @@ -132,4 +226,4 @@ - + \ No newline at end of file diff --git a/policy-jre/alpine/src/main/docker/Dockerfile b/policy-jre/alpine/src/main/docker/Dockerfile index 803cc178..290c9998 100644 --- a/policy-jre/alpine/src/main/docker/Dockerfile +++ b/policy-jre/alpine/src/main/docker/Dockerfile @@ -23,7 +23,10 @@ # $JAVA_HOME is set to /usr/lib/jvm/java-11-openjdk # more details at https://hub.docker.com/_/openjdk -FROM onap/integration-java11:9.0.0 +ARG INTEGRATION_JAVA_NAME=${INTEGRATION_JAVA_NAME} +ARG INTEGRATION_JAVA_VERSION=${INTEGRATION_JAVA_VERSION} + +FROM ${INTEGRATION_JAVA_NAME}:${INTEGRATION_JAVA_VERSION} LABEL maintainer="Policy Team" -- 2.16.6