export PROJECT=""
export ROBOT_FILE=""
-export READINESS_CONTAINER=""
+export READINESS_CONTAINERS=()
function spin_microk8s_cluster () {
echo "Verify if Microk8s cluster is running.."
rm -rf tests/models/
echo "---------------------------------------------"
echo "Installing Robot framework pod for running CSIT"
- helm install csit-robot robot --set robot=$ROBOT_FILE --set readiness=$READINESS_CONTAINER;
+ microk8s helm install csit-robot robot --set robot=$ROBOT_FILE --set "readiness={${READINESS_CONTAINERS[*]}}";
echo "Please check the logs of policy-csit-robot pod for the test execution results"
fi
}
echo GERRIT_BRANCH="${GERRIT_BRANCH}"
# download models examples
git clone -b "${GERRIT_BRANCH}" --single-branch https://github.com/onap/policy-models.git tests/models
+
+ # create a couple of variations of the policy definitions
+ sed -e 's!Measurement_vGMUX!ADifferentValue!' \
+ tests/models/models-examples/src/main/resources/policies/vCPE.policy.monitoring.input.tosca.json \
+ >tests/models/models-examples/src/main/resources/policies/vCPE.policy.monitoring.input.tosca.v1_2.json
+
+ sed -e 's!"version": "1.0.0"!"version": "2.0.0"!' \
+ -e 's!"policy-version": 1!"policy-version": 2!' \
+ tests/models/models-examples/src/main/resources/policies/vCPE.policy.monitoring.input.tosca.json \
+ >tests/models/models-examples/src/main/resources/policies/vCPE.policy.monitoring.input.tosca.v2.json
}
clamp | policy-clamp)
export ROBOT_FILE=$POLICY_CLAMP_ROBOT
- export READINESS_CONTAINER=$POLICY_CLAMP_CONTAINER
+ export READINESS_CONTAINERS=($POLICY_CLAMP_CONTAINER)
;;
api | policy-api)
export ROBOT_FILE=$POLICY_API_ROBOT
- export READINESS_CONTAINER=$POLICY_API_CONTAINER
+ export READINESS_CONTAINERS=($POLICY_API_CONTAINER)
;;
pap | policy-pap)
export ROBOT_FILE=$POLICY_PAP_ROBOT
- export READINESS_CONTAINER=$POLICY_PAP_CONTAINER
+ export READINESS_CONTAINERS=($POLICY_PAP_CONTAINER,$POLICY_API_CONTAINER)
;;
apex-pdp | policy-apex-pdp)
export ROBOT_FILE=$POLICY_APEX_PDP_ROBOT
- export READINESS_CONTAINER=$POLICY_APEX_CONTAINER
+ export READINESS_CONTAINERS=($POLICY_APEX_CONTAINER,$POLICY_API_CONTAINER,$POLICY_PAP_CONTAINER)
;;
xacml-pdp | policy-xacml-pdp)
- export ROBOT_FILE=$POLICY_XACML_PDP_ROBOT
+ export ROBOT_FILE=($POLICY_XACML_PDP_ROBOT)
;;
drools-pdp | policy-drools-pdp)
- export ROBOT_FILE=$POLICY_DROOLS_PDP_ROBOT
+ export ROBOT_FILE=($POLICY_DROOLS_PDP_ROBOT)
;;
*)
spin_microk8s_cluster
if [ "${?}" -eq 0 ]; then
echo "Installing policy helm charts in the default namespace"
- cd ../helm/;helm dependency build policy;microk8s helm install csit-policy policy;
+ cd ../helm/;microk8s helm dependency build policy;microk8s helm install csit-policy policy;
echo "Policy chart installation completed"
echo "-------------------------------------------"
fi
export PROJECT=$2
get_robot_file
echo "CSIT will be invoked from $ROBOT_FILE"
- echo "Readiness container: $READINESS_CONTAINER"
+ echo "Readiness containers: ${READINESS_CONTAINERS[*]}"
+ echo "-------------------------------------------"
build_robot_image
else
echo "No project supplied for running CSIT"
# application configuration
restServer:
- user: healthcheck
+ user: policyadmin
password: zb!XztG34
# ============LICENSE_END=========================================================
server:
- port: {{ .Values.service.internalPort }}
+ port: {{ .Values.service.port }}
ssl:
enabled: false
servlet:
metadata:
name: {{ .Chart.Name }}
namespace: default
- labels:
- app: {{ .Chart.Name }}
- chart: {{ .Chart.Name }}-{{ .Chart.Version | replace "+" "_" }}
- heritage: Helm
spec:
selector:
matchLabels:
- app: {{ .Chart.Name }}
+ app.kubernetes.io/name: {{ .Chart.Name }}
replicas: {{ .Values.replicaCount }}
template:
metadata:
labels:
- app: {{ .Chart.Name }}
+ app.kubernetes.io/name: {{ .Chart.Name }}
+ helm.sh/chart: {{ .Chart.Name }}-{{ .Chart.Version | replace "+" "_" }}
+ app.kubernetes.io/instance: RELEASE
+ app.kubernetes.io/managed-by: Helm
+ name: {{ .Chart.Name }}
spec:
initContainers:
- command:
command: ["/opt/app/policy/api/bin/policy-api.sh"]
args: ["/opt/app/policy/api/etc/mounted/apiParameters.yaml"]
ports:
- - containerPort: {{ .Values.service.internalPort }}
+ - containerPort: {{ .Values.service.port }}
+ name: http
# disable liveness probe when breakpoints set in debugger
# so K8s doesn't restart unresponsive container
{{- if eq .Values.liveness.enabled true }}
livenessProbe:
tcpSocket:
- port: {{ .Values.service.internalPort }}
+ port: {{ .Values.service.port }}
initialDelaySeconds: {{ .Values.liveness.initialDelaySeconds }}
periodSeconds: {{ .Values.liveness.periodSeconds }}
{{ end -}}
readinessProbe:
httpGet:
path: {{ .Values.readiness.api }}
- port: {{ .Values.service.internalPort }}
+ port: {{ .Values.service.port }}
httpHeaders:
- name: Authorization
value: Basic {{ printf "%s:%s" .Values.restServer.user .Values.restServer.password | b64enc }}
name: {{ .Chart.Name }}
namespace: default
labels:
- app: {{ .Chart.Name }}
- chart: {{ .Chart.Name }}-{{ .Chart.Version | replace "+" "_" }}
- release: release
- heritage: Helm
+ app.kubernetes.io/name: {{ .Chart.Name }}
+ helm.sh/chart: {{ .Chart.Name }}-{{ .Chart.Version | replace "+" "_" }}
+ app.kubernetes.io/managed-by: Helm
spec:
type: {{ .Values.service.type }}
ports:
- - port: {{ .Values.service.externalPort }}
- targetPort: {{ .Values.service.internalPort }}
+ - port: {{ .Values.service.port }}
+ targetPort: {{ .Values.service.port }}
+ nodePort: {{ .Values.service.nodePort }}
+ protocol: TCP
name: {{ .Values.service.portName }}
selector:
- app: {{ .Chart.Name }}
- release: release
\ No newline at end of file
+ app.kubernetes.io/name: {{ .Chart.Name }}
\ No newline at end of file
# Global configuration defaults.
#################################################################
global:
- nodePortPrefix: 304
persistence: {}
aafEnabled: false
# necessary to disable liveness probe when setting breakpoints
# in debugger so K8s doesn't restart unresponsive container
enabled: true
+ port: http
readiness:
initialDelaySeconds: 10
successThreshold: 1
failureThreshold: 3
timeout: 60
+ port: http
service:
- type: ClusterIP
- name: policy-api
+ type: NodePort
portName: http
- externalPort: 6969
- internalPort: 6969
- nodePort: 40
+ port: 6969
+ nodePort: 30441
ingress:
enabled: false
command: ["/opt/app/policy/clamp/bin/acm-runtime.sh"]
args: ["/opt/app/policy/clamp/etc/mounted/acRuntimeParameters.yaml"]
ports:
- - containerPort: 6969
+ - containerPort: {{ .Values.service.ports.port }}
name: http-api
# disable liveness probe when breakpoints set in debugger
# so K8s doesn't restart unresponsive container
--- /dev/null
+{
+ "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": []
+ }
+ ]
+ }
+ ]
+}
pap:
name: PapGroup
aaf: false
+ topic:
+ pdp-pap.name: POLICY-PDP-PAP
+ notification.name: POLICY-NOTIFICATION
+ heartbeat.name: POLICY-HEARTBEAT
pdpParameters:
heartBeatMs: 120000
updateParameters:
stateChangeParameters:
maxRetryCount: 1
maxWaitMs: 30000
- savePdpStatisticsInDb: false
+ savePdpStatisticsInDb: true
topicParameterGroup:
topicSources:
- - topic: POLICY-PDP-PAP
+ - topic: ${pap.topic.pdp-pap.name}
servers:
- message-router
+ topicCommInfrastructure: dmaap
useHttps: false
fetchTimeout: 15000
- topicCommInfrastructure: dmaap
- - topic: POLICY-HEARTBEAT
- effectiveTopic: POLICY-PDP-PAP
+ - topic: ${pap.topic.heartbeat.name}
+ effectiveTopic: ${pap.topic.pdp-pap.name}
consumerGroup: policy-pap
servers:
- message-router
+ topicCommInfrastructure: dmaap
useHttps: false
fetchTimeout: 15000
- topicCommInfrastructure: dmaap
topicSinks:
- - topic: POLICY-PDP-PAP
+ - topic: ${pap.topic.pdp-pap.name}
servers:
- message-router
- useHttps: false
topicCommInfrastructure: dmaap
- - topic: POLICY-NOTIFICATION
+ useHttps: false
+ - topic: ${pap.topic.notification.name}
servers:
- message-router
- useHttps: false
topicCommInfrastructure: dmaap
-# If Strimzi Kafka to be used for communication, replace following configuration for topicSources and topicSinks
-# servers:
-# - {{ .Values.config.kafkaBootstrap }}:9092
-# topicCommInfrastructure: kafka
-# additionalProps:
-# security.protocol: SASL_PLAINTEXT
-# sasl.mechanism: SCRAM-SHA-512
-# sasl.jaas.config: ${JAASLOGIN}
-
+ useHttps: false
healthCheckRestClientParameters:
- clientName: api
hostname: policy-api
password: "${API_PASSWORD}"
useHttps: false
basePath: policy/api/v1/healthcheck
- - clientName: distribution
- hostname: policy-distribution
- port: 6969
- userName: "${DISTRIBUTION_USER}"
- password: "${DISTRIBUTION_PASSWORD}"
- useHttps: false
- basePath: healthcheck
- - clientName: dmaap
- hostname: message-router
- port: 3904
- useHttps: false
- basePath: topics
management:
endpoints:
name: {{ .Chart.Name }}
namespace: default
labels:
- name: {{ .Chart.Name }}
- chart: {{ .Chart.Name }}-{{ .Chart.Version | replace "+" "_" }}
- release: RELEASE
- heritage: Helm
+ app.kubernetes.io/name: {{ .Chart.Name }}
+ helm.sh/chart: {{ .Chart.Name }}-{{ .Chart.Version | replace "+" "_" }}
+ app.kubernetes.io/managed-by: Helm
spec:
ports:
ipFamilyPolicy: PreferDualStack
type: {{ .Values.service.type }}
selector:
- app: {{ .Chart.Name }}
- release: RELEASE
+ app.kubernetes.io/name: {{ .Chart.Name }}
sessionAffinity: None
# Application configuration defaults.
#################################################################
# application image
-image: nexus3.onap.org:10001/onap/policy-pap:2.7.1
+image: nexus3.onap.org:10001/onap/policy-pap:2.8-SNAPSHOT-latest
pullPolicy: Always
# flag to enable debugging - application support required
image: {{ .Values.imageCredentials.readinessImage.name }}
imagePullPolicy: {{ .Values.image.pullPolicy }}
command:
- - /app/ready.py
- - --container-name
- - {{ .Values.readiness }}
+ - /app/ready.py
+ args:
+ {{- range $container := .Values.readiness }}
+ - --container-name
+ - {{ $container}}
+ {{- end }}
env:
- name: NAMESPACE
valueFrom:
affinity: {}
robot: ""
-readiness: ""
+readiness: []
export POLICY_RUNTIME_ACM_IP=policy-clamp-runtime-acm
export POLICY_API_IP=policy-api
export POLICY_PAP_IP=policy-pap
-export POLICY_APEX_PDP_IP=policy-apex-pdp
+export APEX_IP=policy-apex-pdp
+export DMAAP_IP=message-router
export ROBOT_VARIABLES=
ROBOT_VARIABLES="-v DATA:$DATA -v NODETEMPLATES:$NODETEMPLATES -v POLICY_RUNTIME_ACM_IP:$POLICY_RUNTIME_ACM_IP -v POLICY_API_IP:$POLICY_API_IP
--v POLICY_PAP_IP:$POLICY_PAP_IP -v POLICY_APEX_PDP_IP:$POLICY_APEX_PDP_IP"
+-v POLICY_PAP_IP:$POLICY_PAP_IP -v APEX_IP:$APEX_IP -v DMAAP_IP:$DMAAP_IP"
echo "Run Robot test"
echo ROBOT_VARIABLES="${ROBOT_VARIABLES}"
ExecuteApexSampleDomainPolicy
Set Test Variable ${policyName} onap.policies.native.apex.Sampledomain
- ${postjson}= Get file ${CURDIR}/data/${policyName}.json
+ ${postjson}= Get file ./data/${policyName}.json
CreatePolicy /policy/api/v1/policytypes/onap.policies.native.Apex/versions/1.0.0/policies 200 ${postjson} ${policyName} 1.0.0
Wait Until Keyword Succeeds 3 min 5 sec VerifyPdpStatistics 0 0 0 0
DeployPolicy
ExecuteApexTestPnfPolicy
Set Test Variable ${policyName} onap.policies.apex.pnf.Test
- ${postjson}= Get file ${CURDIR}/data/${policyName}.json
+ ${postjson}= Get file ./data/${policyName}.json
CreatePolicy /policy/api/v1/policytypes/onap.policies.native.Apex/versions/1.0.0/policies 200 ${postjson} ${policyName} 1.0.0
DeployPolicy
Wait Until Keyword Succeeds 2 min 5 sec QueryPolicyStatus ${policyName} defaultGroup apex ${pdpName} onap.policies.native.Apex
- ${result}= Run Process ${SCRIPTS}/make_topic.sh APEX-CL-MGT
+ ${result}= Run Process ./data/make_topic.sh APEX-CL-MGT
Should Be Equal As Integers ${result.rc} 0
Wait Until Keyword Succeeds 2 min 5 sec TriggerAndVerifyTestPnfPolicy
ExecuteApexTestVnfPolicy
Set Test Variable ${policyName} onap.policies.apex.vnf.Test
- ${postjson}= Get file ${CURDIR}/data/${policyName}.json
+ ${postjson}= Get file ./data/${policyName}.json
CreatePolicy /policy/api/v1/policytypes/onap.policies.native.Apex/versions/1.0.0/policies 200 ${postjson} ${policyName} 1.0.0
DeployPolicy
Wait Until Keyword Succeeds 2 min 5 sec QueryPolicyStatus ${policyName} defaultGroup apex ${pdpName} onap.policies.native.Apex
- ${result}= Run Process ${SCRIPTS}/make_topic.sh APEX-CL-MGT
+ ${result}= Run Process ./data/make_topic.sh APEX-CL-MGT
Should Be Equal As Integers ${result.rc} 0
Wait Until Keyword Succeeds 2 min 5 sec TriggerAndVerifyTestVnfPolicy
ExecuteApexTestPnfPolicyWithMetadataSet
Set Test Variable ${policyName} onap.policies.apex.pnf.metadataSet.Test
- ${postjson}= Get file ${CURDIR}/data/${policyName}.json
+ ${postjson}= Get file ./data/${policyName}.json
CreatePolicy /policy/api/v1/policytypes/onap.policies.native.Apex/versions/1.0.0/policies 200 ${postjson} ${policyName} 1.0.0
- ${postjson}= Get file ${CURDIR}/data/onap.pnf.metadataSet.Test.json
+ ${postjson}= Get file ./data/onap.pnf.metadataSet.Test.json
CreateNodeTemplate /policy/api/v1/nodetemplates 200 ${postjson} 1
DeployPolicy
Wait Until Keyword Succeeds 2 min 5 sec QueryPolicyStatus ${policyName} defaultGroup apex ${pdpName} onap.policies.native.Apex
- ${result}= Run Process ${SCRIPTS}/make_topic.sh APEX-CL-MGT2
+ ${result}= Run Process ./data/make_topic.sh APEX-CL-MGT2
Should Be Equal As Integers ${result.rc} 0
Wait Until Keyword Succeeds 2 min 5 sec TriggerAndVerifyTestPnfPolicy
DeployPolicy
[Documentation] Deploy the policy in apex-pdp engine
- ${postjson}= Get file ${CURDIR}/data/policy_deploy.json
+ ${postjson}= Get file ./data/policy_deploy.json
${postjson}= evaluate json.loads('''${postjson}''') json
set to dictionary ${postjson['groups'][0]['deploymentSubgroups'][0]['policies'][0]} name=${policyName}
${postjson}= evaluate json.dumps(${postjson}) json
RunEventOnApexEngine
[Documentation] Send event to verify policy execution
Create Session apexSession http://${APEX_IP}:23324 max_retries=1
- ${data}= Get Binary File ${CURDIR}${/}data${/}event.json
+ ${data}= Get Binary File ./data/event.json
&{headers}= Create Dictionary Content-Type=application/json Accept=application/json
${resp}= PUT On Session apexSession /apex/FirstConsumer/EventIn data=${data} headers=${headers}
Should Be Equal As Strings ${resp.status_code} 200
TriggerAndVerifyTestPnfPolicy
[Documentation] Send TestPnf policy trigger event to DMaaP and read notifications to verify policy execution
Create Session apexSession http://${DMAAP_IP}:3904 max_retries=1
- ${data}= Get Binary File ${CURDIR}/data/VesEventForPnfPolicy.json
+ ${data}= Get Binary File ./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}
Should Be Equal As Strings ${resp.status_code} 200
TriggerAndVerifyTestVnfPolicy
[Documentation] Send TestVnf policy trigger event to DMaaP and read notifications to verify policy execution
Create Session apexSession http://${DMAAP_IP}:3904 max_retries=1
- ${data}= Get Binary File ${CURDIR}/data/VesEventForVnfPolicy.json
+ ${data}= Get Binary File ./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}
Should Be Equal As Strings ${resp.status_code} 200
CheckLogMessage
[Documentation] Read log messages received and check for expected content.
[Arguments] ${status} ${expectedMsg}
- ${result}= Run Process ${SCRIPTS}/wait_topic.sh APEX-CL-MGT ${status}
+ ${result}= Run Process ./data/wait_topic.sh APEX-CL-MGT ${status}
Log Received log event on APEX-CL-MGT topic ${result.stdout}
Should Be Equal As Integers ${result.rc} 0
Should Contain ${result.stdout} ${expectedMsg}
Should Be Equal As Strings ${responseEntry['state']} SUCCESS
GetMetrics
- [Arguments] ${hostname} ${auth}
+ [Arguments] ${hostname} ${auth} ${context_path}
Log Creating session http://${hostname}:6969
${session}= Create Session policy http://${hostname}:6969 auth=${auth}
- ${resp}= GET On Session policy /metrics expected_status=200
+ ${resp}= GET On Session policy ${context_path}metrics expected_status=200
Log Received response from policy ${resp.text}
[return] ${resp}
--- /dev/null
+#!/bin/bash
+#
+# ===========LICENSE_START====================================================
+# Copyright (C) 2023 Nordix Foundation. 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=====================================================
+#
+
+#
+# Creates a topic, which happens as a side-effect of polling it.
+#
+
+if [ $# -ne 1 ]
+then
+ echo "arg(s): topic-name" >&2
+ exit 1
+fi
+
+topic="${1}"
+
+curl -s -k "http://${SIM_IP}:3904/events/${topic}/script/1?limit=1&timeout=0"
+echo
--- /dev/null
+#!/bin/bash
+#
+# ===========LICENSE_START====================================================
+# Copyright (C) 2023 Nordix Foundation. 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=====================================================
+#
+
+#
+# Polls a topic for a message. Additional text items can be specified,
+# in which case, it discards messages that do not contain all of the
+# specified text items.
+#
+# Exits with a non-zero status if no matching message is received on the
+# topic before the timeout.
+#
+
+if [ $# -lt 1 ]
+then
+ echo "arg(s): topic-name [text-to-match1 [text-to-match2 ...]]" >&2
+ exit 1
+fi
+
+topic="${1}"
+shift
+
+matched=no
+
+while [ ${matched} = "no" ]
+do
+ msg=`curl -s -k "http://${SIM_IP}:3904/events/${topic}/script/1?limit=1"`
+ if [ $? -ne 0 -o "${msg}" = "[]" ]
+ then
+ echo not found >&2
+ exit 2
+ fi
+
+ matched=yes
+ for text in "$@"
+ do
+ echo "${msg}" | grep -q "${text}"
+ if [ $? -ne 0 ]
+ then
+ matched=no
+ break
+ fi
+ done
+done
+
+echo "${msg}"
Metrics
[Documentation] Verify policy pap is exporting prometheus metrics
${auth}= PolicyAdminAuth
- ${resp}= GetMetrics ${POLICY_PAP_IP} ${auth}
+ ${resp}= GetMetrics ${POLICY_PAP_IP} ${auth} /policy/pap/v1/
Should Contain ${resp.text} http_server_requests_seconds_count{exception="None",method="GET",outcome="SUCCESS",status="200",uri="/policy/pap/v1/healthcheck",} 1.0
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