CPS-615 - CSIT for model sync & passthrough 43/124643/34
authorJosephKeenan <joseph.keenan@est.tech>
Fri, 1 Oct 2021 09:40:47 +0000 (10:40 +0100)
committerRahul Tyagi <rahul.tyagi@est.tech>
Fri, 15 Oct 2021 13:21:27 +0000 (13:21 +0000)
This commit contains
-Registration and sync test cases
-Passthrough read and  write test case

Issue-ID: CPS-615
Change-Id: I1ad70dbc8c0af96bd5cf69476acdad42cf3c179d
Signed-off-by: JosephKeenan <joseph.keenan@est.tech>
19 files changed:
.gitignore
csit/data/bookstoreAddEntry.json [new file with mode: 0644]
csit/data/cmHandleRegistration.json [new file with mode: 0644]
csit/data/postModuleRequestBody.json [new file with mode: 0644]
csit/plans/cps/pnfsim/docker-compose.yml [new file with mode: 0755]
csit/plans/cps/pnfsim/netconf-config/LICENSE [new file with mode: 0755]
csit/plans/cps/pnfsim/netconf-config/stores.yang [new file with mode: 0644]
csit/plans/cps/pnfsim/netconf-config/subscriber.py [new file with mode: 0755]
csit/plans/cps/sdnc/certs/certs.properties [new file with mode: 0644]
csit/plans/cps/sdnc/certs/keys0.zip [new file with mode: 0644]
csit/plans/cps/sdnc/docker-compose.yml [new file with mode: 0644]
csit/plans/cps/sdnc/sdnc_setup.sh [new file with mode: 0644]
csit/plans/cps/setup.sh [moved from csit/plans/default/setup.sh with 53% similarity]
csit/plans/cps/teardown.sh [moved from csit/plans/default/teardown.sh with 75% similarity]
csit/plans/cps/testplan.txt [new file with mode: 0644]
csit/plans/default/testplan.txt [deleted file]
csit/tests/cps-model-sync/cps-model-sync.robot [new file with mode: 0644]
csit/tests/ncmp-passthrough/ncmp-passthrough.robot [new file with mode: 0644]
docker-compose/docker-compose.yml

index 3c5994f..3da7d4a 100755 (executable)
@@ -1,7 +1,6 @@
 *.class
 *.jar
 *.war
-*.zip
 *.log
 
 cps-application/archunit_store
diff --git a/csit/data/bookstoreAddEntry.json b/csit/data/bookstoreAddEntry.json
new file mode 100644 (file)
index 0000000..86e9a5b
--- /dev/null
@@ -0,0 +1,19 @@
+{
+  "stores:categories": [
+    {
+      "stores:code": "ISBN200123",
+      "stores:name": "library",
+      "stores:books": [
+        {
+          "stores:title": "A good book",
+          "stores:lang": "English",
+          "stores:authors": [
+            "Joe & Rahul"
+          ],
+          "stores:pub_year": "2001",
+          "stores:price": "1000"
+        }
+      ]
+    }
+  ]
+}
\ No newline at end of file
diff --git a/csit/data/cmHandleRegistration.json b/csit/data/cmHandleRegistration.json
new file mode 100644 (file)
index 0000000..0133148
--- /dev/null
@@ -0,0 +1,5 @@
+{
+    "cmHandles": [
+        "PNFDemo"
+    ]
+}
\ No newline at end of file
diff --git a/csit/data/postModuleRequestBody.json b/csit/data/postModuleRequestBody.json
new file mode 100644 (file)
index 0000000..e12af9d
--- /dev/null
@@ -0,0 +1,11 @@
+{
+    "operation": "read",
+    "data": {
+        "modules": [
+            {
+                "name": "nc-notifications",
+                "revision": "2008-07-14"
+            }
+        ]
+    }
+}
\ No newline at end of file
diff --git a/csit/plans/cps/pnfsim/docker-compose.yml b/csit/plans/cps/pnfsim/docker-compose.yml
new file mode 100755 (executable)
index 0000000..568f98f
--- /dev/null
@@ -0,0 +1,28 @@
+# ============LICENSE_START=======================================================
+# Copyright (C) 2021 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: '3'
+
+services:
+  netconf-pnp-simulator:
+    image: nexus3.onap.org:10001/onap/integration/simulators/netconf-pnp-simulator:2.8.6
+    container_name: netconf-simulator
+    restart: always
+    ports:
+      - "831:830"
+      - "6512:6513"
+    volumes:
+      - ./netconf-config:/config/modules/stores
diff --git a/csit/plans/cps/pnfsim/netconf-config/LICENSE b/csit/plans/cps/pnfsim/netconf-config/LICENSE
new file mode 100755 (executable)
index 0000000..3bc5b02
--- /dev/null
@@ -0,0 +1,13 @@
+Copyright (C) 2021 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.
diff --git a/csit/plans/cps/pnfsim/netconf-config/stores.yang b/csit/plans/cps/pnfsim/netconf-config/stores.yang
new file mode 100644 (file)
index 0000000..b24ac0e
--- /dev/null
@@ -0,0 +1,63 @@
+module stores {\r
+\r
+    yang-version 1.1;\r
+\r
+    namespace "org:onap:ccsdk:sample";\r
+\r
+    prefix book-store;\r
+\r
+       import ietf-yang-types { prefix yang; }\r
+       import ietf-inet-types { prefix inet; }\r
+\r
+    revision "2020-09-15" {\r
+        description\r
+        "Sample Model";\r
+    }\r
+\r
+    typedef year {\r
+        type uint16 {\r
+            range "1000..9999";\r
+        }\r
+    }\r
+\r
+    container bookstore {\r
+\r
+        leaf bookstore-name {\r
+            type string;\r
+        }\r
+\r
+        list categories {\r
+\r
+            key "code";\r
+\r
+            leaf code {\r
+                type string;\r
+            }\r
+\r
+            leaf name {\r
+                type string;\r
+            }\r
+\r
+            list books {\r
+                key title;\r
+\r
+                leaf title {\r
+                    type string;\r
+                }\r
+                leaf lang {\r
+                    type string;\r
+                }\r
+                leaf-list authors {\r
+                    type string;\r
+                }\r
+                leaf pub_year {\r
+                     type year;\r
+                }\r
+                leaf price {\r
+                     type uint64;\r
+                }\r
+            }\r
+        }\r
+   }\r
+}\r
+\r
diff --git a/csit/plans/cps/pnfsim/netconf-config/subscriber.py b/csit/plans/cps/pnfsim/netconf-config/subscriber.py
new file mode 100755 (executable)
index 0000000..5147c93
--- /dev/null
@@ -0,0 +1,131 @@
+#!/usr/bin/env python3
+
+__author__ = "Mislav Novakovic <mislav.novakovic@sartura.hr>"
+__copyright__ = "Copyright 2018, Deutsche Telekom AG"
+__license__ = "Apache 2.0"
+
+# ============LICENSE_START=======================================================
+# Copyright (C) 2018 Deutsche Telekom AG
+# Modifications Copyright (C) 2021 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=========================================================
+
+import sysrepo as sr
+import sys
+
+
+# Helper function for printing changes given operation, old and new value.
+def print_change(op, old_val, new_val):
+    if op == sr.SR_OP_CREATED:
+        print(f"CREATED: {new_val.to_string()}")
+    elif op == sr.SR_OP_DELETED:
+        print(f"DELETED: {old_val.to_string()}")
+    elif op == sr.SR_OP_MODIFIED:
+        print(f"MODIFIED: {old_val.to_string()} to {new_val.to_string()}")
+    elif op == sr.SR_OP_MOVED:
+        print(f"MOVED: {new_val.xpath()} after {old_val.xpath()}")
+
+
+# Helper function for printing events.
+def ev_to_str(ev):
+    if ev == sr.SR_EV_VERIFY:
+        return "verify"
+    elif ev == sr.SR_EV_APPLY:
+        return "apply"
+    elif ev == sr.SR_EV_ABORT:
+        return "abort"
+    else:
+        return "unknown"
+
+
+# Function to print current configuration state.
+# It does so by loading all the items of a session and printing them out.
+def print_current_config(session, module_name):
+    select_xpath = f"/{module_name}:*//*"
+
+    values = session.get_items(select_xpath)
+
+    if values is not None:
+        print("========== BEGIN CONFIG ==========")
+        for i in range(values.val_cnt()):
+            print(values.val(i).to_string(), end='')
+        print("=========== END CONFIG ===========")
+
+
+# Function to be called for subscribed client of given session whenever configuration changes.
+def module_change_cb(sess, module_name, event, private_ctx):
+    try:
+        print("========== Notification " + ev_to_str(event) + " =============================================")
+        if event == sr.SR_EV_APPLY:
+            print_current_config(sess, module_name)
+
+        print("========== CHANGES: =============================================")
+
+        change_path = f"/{module_name}:*"
+
+        it = sess.get_changes_iter(change_path)
+
+        while True:
+            change = sess.get_change_next(it)
+            if change is None:
+                break
+            print_change(change.oper(), change.old_val(), change.new_val())
+
+        print("========== END OF CHANGES =======================================")
+    except Exception as e:
+        print(e)
+
+    return sr.SR_ERR_OK
+
+
+def main():
+    # Notable difference between c implementation is using exception mechanism for open handling unexpected events.
+    # Here it is useful because `Connection`, `Session` and `Subscribe` could throw an exception.
+    try:
+        module_name = "ietf-interfaces"
+        if len(sys.argv) > 1:
+            module_name = sys.argv[1]
+        else:
+            print("\nYou can pass the module name to be subscribed as the first argument")
+
+        print(f"Application will watch for changes in {module_name}")
+
+        # connect to sysrepo
+        conn = sr.Connection(module_name)
+
+        # start session
+        sess = sr.Session(conn)
+
+        # subscribe for changes in running config */
+        subscribe = sr.Subscribe(sess)
+
+        subscribe.module_change_subscribe(module_name, module_change_cb)
+
+        try:
+            print_current_config(sess, module_name)
+        except Exception as e:
+            print(e)
+
+        print("========== STARTUP CONFIG APPLIED AS RUNNING ==========")
+
+        sr.global_loop()
+
+        print("Application exit requested, exiting.")
+
+    except Exception as e:
+        print(e)
+
+
+if __name__ == '__main__':
+    main()
diff --git a/csit/plans/cps/sdnc/certs/certs.properties b/csit/plans/cps/sdnc/certs/certs.properties
new file mode 100644 (file)
index 0000000..f8f3fa7
--- /dev/null
@@ -0,0 +1,2 @@
+keys0.zip
+*****
diff --git a/csit/plans/cps/sdnc/certs/keys0.zip b/csit/plans/cps/sdnc/certs/keys0.zip
new file mode 100644 (file)
index 0000000..48b4d90
Binary files /dev/null and b/csit/plans/cps/sdnc/certs/keys0.zip differ
diff --git a/csit/plans/cps/sdnc/docker-compose.yml b/csit/plans/cps/sdnc/docker-compose.yml
new file mode 100644 (file)
index 0000000..1b7fe1f
--- /dev/null
@@ -0,0 +1,64 @@
+# ============LICENSE_START=======================================================
+# Copyright (C) 2021 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: '3'
+
+services:
+  mariadb:
+    image: mariadb:10.1.11
+    ports:
+      - "3306:3306"
+    container_name: mariadb
+    environment:
+      - MYSQL_ROOT_PASSWORD=password
+    hostname:
+      mariadb.so.testlab.onap.org
+    logging:
+      driver: "json-file"
+      options:
+        max-size: "30m"
+        max-file: "5"
+  sdnc:
+    image: onap/sdnc-image:1.8.1
+    container_name: sdnc
+    volumes: 
+      - /etc/localtime:/etc/localtime:ro
+      - $SDNC_CERT_PATH:/opt/opendaylight/current/certs
+    entrypoint: ["/opt/onap/sdnc/bin/startODL.sh"]
+    ports:
+      - "8282:8181"
+    hostname:
+      sdnc
+    depends_on:
+      - mariadb
+    environment:
+      - MYSQL_ROOT_PASSWORD=password
+      - SDNC_CONFIG_DIR=/opt/onap/sdnc/data/properties
+      - MYSQL_PASSWD=password
+      - ODL_CERT_DIR=/opt/opendaylight/current/certs
+      - ODL_ADMIN_USERNAME=admin
+      - ODL_ADMIN_PASSWORD=Kp8bJ4SXszM0WXlhak3eHlcse2gAw84vaoGGmJvUy2U
+    dns:
+      - ${DNS_IP_ADDR-10.0.100.1}
+    logging:
+      driver:   "json-file"
+      options:
+        max-size: "30m"
+        max-file: "5"
+    extra_hosts:
+      - sdnctldb02:${LOCAL_IP}
+      - sdnctldb01:${LOCAL_IP}
+      - dbhost:${LOCAL_IP}
\ No newline at end of file
diff --git a/csit/plans/cps/sdnc/sdnc_setup.sh b/csit/plans/cps/sdnc/sdnc_setup.sh
new file mode 100644 (file)
index 0000000..18d21b3
--- /dev/null
@@ -0,0 +1,49 @@
+#!/bin/bash
+#
+# ============LICENSE_START=======================================================
+#   Copyright (C) 2021 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=========================================================
+
+# @author Rahul Tyagi (rahul.tyagi@est.tech)
+# setup sdnc
+
+export SDNC_CERT_PATH=$WORKSPACE/plans/cps/sdnc/certs
+
+#start SDNC containers with docker compose and configuration from docker-compose.yml
+docker-compose -f $WORKSPACE/plans/cps/sdnc/docker-compose.yml up -d
+
+# WAIT 10 minutes maximum and test every 30 seconds if SDNC is up using HealthCheck API
+TIME_OUT=600
+INTERVAL=30
+TIME=0
+while [ "$TIME" -lt "$TIME_OUT" ]; do
+  response=$(curl --write-out '%{http_code}' --silent --output /dev/null -H "Authorization: Basic YWRtaW46S3A4Yko0U1hzek0wV1hsaGFrM2VIbGNzZTJnQXc4NHZhb0dHbUp2VXkyVQ==" -X POST -H "X-FromAppId: csit-sdnc" -H "X-TransactionId: csit-sdnc" -H "Accept: application/json" -H "Content-Type: application/json" http://localhost:8282/restconf/operations/SLI-API:healthcheck );
+  echo $response
+
+  if [ "$response" == "200" ]; then
+    echo SDNC started in $TIME seconds
+    break;
+  fi
+
+  echo Sleep: $INTERVAL seconds before testing if SDNC is up. Total wait time up now is: $TIME seconds. Timeout is: $TIME_OUT seconds
+  sleep $INTERVAL
+  TIME=$(($TIME+$INTERVAL))
+done
+
+if [ "$TIME" -ge "$TIME_OUT" ]; then
+   echo TIME OUT: karaf session not started in $TIME_OUT seconds... Could cause problems for testing activities...
+fi
\ No newline at end of file
similarity index 53%
rename from csit/plans/default/setup.sh
rename to csit/plans/cps/setup.sh
index e8074dd..2fc0ec4 100755 (executable)
@@ -18,6 +18,7 @@
 # Modifications copyright (c) 2020-2021 Samsung Electronics Co., Ltd.
 # Modifications Copyright (C) 2021 Pantheon.tech
 # Modifications Copyright (C) 2021 Bell Canada.
+# Modifications Copyright (C) 2021 Nordix Foundation.
 #
 # Branched from ccsdk/distribution to this repository Feb 23, 2021
 #
@@ -28,7 +29,11 @@ cp $WORKSPACE/../docker-compose/*.yml $WORKSPACE/archives/docker-compose
 cd $WORKSPACE/archives/docker-compose
 
 # Set env variables for docker compose
-export DB_HOST=dbpostgresql
+export LOCAL_IP=$(ip -4 addr show docker0 | grep -Po 'inet \K[\d.]+')
+export DMI_SERVICE_URL=http://$LOCAL_IP:8783
+export DB_HOST=$LOCAL_IP
+export SDNC_HOST=$LOCAL_IP
+export CPS_CORE_HOST=$LOCAL_IP
 export DB_USERNAME=cps
 export DB_PASSWORD=cps
 # Use latest image version
@@ -39,7 +44,62 @@ curl -L https://github.com/docker/compose/releases/download/1.25.0/docker-compos
 chmod +x docker-compose
 
 # start CPS and PostgreSQL containers with docker compose
+docker network create test_network
 ./docker-compose up -d
+
+###################### setup sdnc ############################
+source $WORKSPACE/plans/cps/sdnc/sdnc_setup.sh
+
+###################### setup pnfsim ##########################
+docker-compose -f $WORKSPACE/plans/cps/pnfsim/docker-compose.yml up -d
+
+# Allow time for netconf-pnp-simulator & SDNC to come up fully
+sleep 30s
+
+SDNC_TIME_OUT=250
+SDNC_INTERVAL=10
+SDNC_TIME=0
+
+while [ "$SDNC_TIME" -le "$SDNC_TIME_OUT" ]; do
+
+       # Mount netconf node
+
+       curl --location --request PUT 'http://'"$LOCAL_IP"':8282/restconf/config/network-topology:network-topology/topology/topology-netconf/node/PNFDemo' \
+       --header 'Authorization: Basic YWRtaW46S3A4Yko0U1hzek0wV1hsaGFrM2VIbGNzZTJnQXc4NHZhb0dHbUp2VXkyVQ==' \
+       --header 'Content-Type: application/json' \
+       --data-raw '{
+         "node": [
+               {
+                 "node-id": "PNFDemo",
+                 "netconf-node-topology:protocol": {
+                       "name": "TLS"
+                 },
+                 "netconf-node-topology:host": '"$LOCAL_IP"',
+                 "netconf-node-topology:key-based": {
+                       "username": "netconf",
+                       "key-id": "ODL_private_key_0"
+                 },
+                 "netconf-node-topology:port": 6512,
+                 "netconf-node-topology:tcp-only": false,
+                 "netconf-node-topology:max-connection-attempts": 5
+               }
+         ]
+        }'
+
+       # Verify node has been mounted
+
+       RESPONSE=$( curl --location --request GET 'http://'"$LOCAL_IP"':8282/restconf/config/network-topology:network-topology/topology/topology-netconf' --header 'Authorization: basic YWRtaW46S3A4Yko0U1hzek0wV1hsaGFrM2VIbGNzZTJnQXc4NHZhb0dHbUp2VXkyVQ==')
+
+         if [[ "$RESPONSE" == *"PNFDemo"* ]]; then
+           echo "Node mounted in $SDNC_TIME"
+                 break;
+         fi
+
+        sleep $SDNC_INTERVAL
+        SDNC_TIME=$((SDNC_TIME + SDNC_INTERVAL))
+
+done
+
 # Validate CPS service initialization completed via periodic log checking for line like below:
 # org.onap.cps.Application ... Started Application in X.XXX seconds
 
@@ -65,12 +125,5 @@ if [ "$TIME" -gt "$TIME_OUT" ]; then
    exit 1;
 fi
 
-# The CPS host according to docker-compose.yml
-CPS_HOST="localhost"
-CPS_PORT="8883"
-
-MANAGEMENT_PORT="8887"
-
 # Pass variables required for Robot test suites in ROBOT_VARIABLES
-ROBOT_VARIABLES="-v CPS_HOST:$CPS_HOST -v CPS_PORT:$CPS_PORT -v MANAGEMENT_PORT:$MANAGEMENT_PORT -v DATADIR:$WORKSPACE/data"
-
+ROBOT_VARIABLES="-v CPS_HOST:$LOCAL_IP -v CPS_PORT:8883 -v DMI_HOST:$LOCAL_IP -v DMI_PORT:8783 -v MANAGEMENT_PORT:8887 -v DATADIR:$WORKSPACE/data"
\ No newline at end of file
similarity index 75%
rename from csit/plans/default/teardown.sh
rename to csit/plans/cps/teardown.sh
index f9368f9..3ef50d4 100755 (executable)
 # Modifications copyright (c) 2017 AT&T Intellectual Property
 # Modifications copyright (c) 2020 Samsung Electronics Co., Ltd.
 # Modifications Copyright (C) 2021 Pantheon.tech
-#
+# Modifications Copyright (C) 2021 Nordix Foundation
 # Branched from ccsdk/distribution to this repository Feb 23, 2021
 #
 
-cd $WORKSPACE/archives/docker-compose
-./docker-compose down -v
+echo 'Stopping, Removing all running containers...'
+docker stop $(docker ps -aq) && docker rm $(docker ps -aq)
+
+echo 'Removing Volumes...'
+echo y | docker volume prune
+
+echo 'Removing Networks...'
+echo y | docker network prune
+
diff --git a/csit/plans/cps/testplan.txt b/csit/plans/cps/testplan.txt
new file mode 100644 (file)
index 0000000..8069bb7
--- /dev/null
@@ -0,0 +1,24 @@
+# ============LICENSE_START=======================================================
+# Copyright (C) 2021 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=========================================================
+
+# Test suites are relative paths under csit/tests/.
+# Place the suites in run order.
+actuator
+cps-model-sync
+ncmp-passthrough
+cps-admin
+cps-data
+
diff --git a/csit/plans/default/testplan.txt b/csit/plans/default/testplan.txt
deleted file mode 100644 (file)
index e4e8759..0000000
+++ /dev/null
@@ -1,6 +0,0 @@
-# Test suites are relative paths under csit/tests/.
-# Place the suites in run order.
-actuator
-cps-admin
-cps-data
-
diff --git a/csit/tests/cps-model-sync/cps-model-sync.robot b/csit/tests/cps-model-sync/cps-model-sync.robot
new file mode 100644 (file)
index 0000000..340577e
--- /dev/null
@@ -0,0 +1,58 @@
+/*
+ *  ============LICENSE_START=======================================================
+ *  Copyright (C) 2021 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=========================================================
+ */
+
+*** Settings ***
+Documentation         NCMP-DMI - Model Sync
+
+Library               Collections
+Library               OperatingSystem
+Library               RequestsLibrary
+Library               BuiltIn
+
+Suite Setup           Create Session     DMI_URL    http://${DMI_HOST}:${DMI_PORT}
+
+*** Variables ***
+
+${auth}            Basic Y3BzdXNlcjpjcHNyMGNrcyE=
+${basePath}        /dmi
+
+
+*** Test Cases ***
+Register node & sync models
+    ${uri}=              Set Variable       ${basePath}/v1/inventory/cmHandles
+    ${headers}=          Create Dictionary  Content-Type=application/json   Authorization=${auth}
+    ${jsonData}=         Get Binary File    ${DATADIR}${/}cmHandleRegistration.json
+    ${response}=         POST On Session    DMI_URL   ${uri}   headers=${headers}   data=${jsonData}
+    Should Be Equal As Strings              ${response.status_code}   201
+
+Verify Sync
+    ${uri}=              Set Variable       ${basePath}/v1/ch/PNFDemo/modules
+    ${headers}=          Create Dictionary  Content-Type=application/json   Authorization=${auth}
+    ${jsonData}=         Get Binary File    ${DATADIR}${/}postModuleRequestBody.json
+    ${response}=         POST On Session    DMI_URL   ${uri}   headers=${headers}   data=${jsonData}
+    ${responseJson}=     Set Variable       ${response.json()}
+    ${moduleCount}=      Get length         ${responseJson['schemas']}
+    Should Be Equal As Strings              ${response.status_code}   200
+    FOR   ${item}   IN  @{responseJson['schemas']}
+        IF   "${item}.get('moduleName')" == "stores"
+            Should Be Equal As Strings              "${item}.get('revision')"   2020-09-15
+            Should Be Equal As Strings              "${item}.get('namespace')"   org:onap:ccsdk:sample
+        END
+    END
diff --git a/csit/tests/ncmp-passthrough/ncmp-passthrough.robot b/csit/tests/ncmp-passthrough/ncmp-passthrough.robot
new file mode 100644 (file)
index 0000000..3b68c33
--- /dev/null
@@ -0,0 +1,65 @@
+/*
+ *  ============LICENSE_START=======================================================
+ *  Copyright (C) 2021 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=========================================================
+ */
+
+*** Settings ***
+Documentation         NCMP
+
+Library               Collections
+Library               OperatingSystem
+Library               RequestsLibrary
+Library               BuiltIn
+
+Suite Setup           Create Session      CPS_URL    http://${CPS_HOST}:${CPS_PORT}
+
+*** Variables ***
+
+${auth}                 Basic Y3BzdXNlcjpjcHNyMGNrcyE=
+${ncmpBasePath}         /ncmp
+${netconf}              NETCONF
+
+*** Test Cases ***
+
+Get for Passthough Operational (CF, RO) with fields
+    ${uri}=              Set Variable       ${ncmpBasePath}/v1/ch/PNFDemo/data/ds/ncmp-datastore:passthrough-operational?resourceIdentifier=ietf-netconf-monitoring:netconf-state&options=(fields=schemas/schema/location)
+    ${headers}=          Create Dictionary  Authorization=${auth}
+    ${response}=         Get On Session     CPS_URL   ${uri}   headers=${headers}   expected_status=200
+    ${responseJson}=     Set Variable       ${response.json()}
+    ${schemaCount}=      Get length         ${responseJson['ietf-netconf-monitoring:netconf-state']['schemas']}
+    Should Be True                          ${schemaCount} >0
+    Should Contain                          ${responseJson['ietf-netconf-monitoring:netconf-state']['schemas']['schema'][0]['location']}   ${netconf}
+
+Write to bookstore using passthrough-running
+    ${uri}=              Set Variable       ${ncmpBasePath}/v1/ch/PNFDemo/data/ds/ncmp-datastore:passthrough-running?resourceIdentifier=stores:bookstore
+    ${headers}=          Create Dictionary  Content-Type=application/json   Authorization=${auth}
+    ${jsonData}=         Get Binary File    ${DATADIR}${/}bookstoreAddEntry.json
+    ${response}=         POST On Session    CPS_URL   ${uri}   headers=${headers}   data=${jsonData}
+    Should Be Equal As Strings              ${response.status_code}   201
+
+Verify write to bookstore using passthrough-running
+    ${uri}=              Set Variable       ${ncmpBasePath}/v1/ch/PNFDemo/data/ds/ncmp-datastore:passthrough-running?resourceIdentifier=stores:bookstore
+    ${headers}=          Create Dictionary  Authorization=${auth}
+    ${response}=         Get On Session     CPS_URL   ${uri}   headers=${headers}
+    ${responseJson}=     Set Variable       ${response.json()}
+    Should Be Equal As Strings              ${response.status_code}   200
+    FOR   ${item}   IN  @{responseJson['stores:bookstore']['categories']}
+        IF   "${item['code']}" == "ISBN200123"
+            Should Be Equal As Strings              "${item['books']}[0][title]"  "A good book"
+        END
+    END
index d97cbeb..c928ee8 100755 (executable)
 version: "3.7"
 
 services:
+  ### Services cps-service, cps-ncmp, zookeeper and kafka are commented below, these
+  ### services can be un-commented and used on need to use basis. Only minimal
+  ### services will run (dbpostgresql, cps-and-ncmp and ncmp-dmi-plugin) by default.
+
   #cps-standalone:
   #  container_name: cps-service
   #  image: ${DOCKER_REPO:-nexus3.onap.org:10003}/onap/cps-service:${VERSION:-latest}
@@ -59,6 +63,38 @@ services:
   #  depends_on:
   #    - dbpostgresql
 
+  #  zookeeper:
+  #    image: confluentinc/cp-zookeeper:6.1.1
+  #    environment:
+  #      ZOOKEEPER_CLIENT_PORT: 2181
+  #      ZOOKEEPER_TICK_TIME: 2000
+  #    ports:
+  #      - 22181:2181
+  #
+  #  kafka:
+  #    image: confluentinc/cp-kafka:6.1.1
+  #    depends_on:
+  #      - zookeeper
+  #    ports:
+  #      - 29092:29092
+  #    environment:
+  #      KAFKA_BROKER_ID: 1
+  #      KAFKA_ZOOKEEPER_CONNECT: zookeeper:2181
+  #      KAFKA_ADVERTISED_LISTENERS: PLAINTEXT://kafka:9092,PLAINTEXT_HOST://localhost:29092
+  #      KAFKA_LISTENER_SECURITY_PROTOCOL_MAP: PLAINTEXT:PLAINTEXT,PLAINTEXT_HOST:PLAINTEXT
+  #      KAFKA_INTER_BROKER_LISTENER_NAME: PLAINTEXT
+  #      KAFKA_OFFSETS_TOPIC_REPLICATION_FACTOR: 1
+
+  dbpostgresql:
+    container_name: dbpostgresql
+    image: postgres:13.2-alpine
+    ports:
+      - '5432:5432'
+    environment:
+      POSTGRES_DB: cpsdb
+      POSTGRES_USER: ${DB_USERNAME:-cps}
+      POSTGRES_PASSWORD: ${DB_PASSWORD:-cps}
+
   cps-and-ncmp:
     container_name: cps-and-ncmp
     image: ${DOCKER_REPO:-nexus3.onap.org:10003}/onap/cps-and-ncmp:${VERSION:-latest}
@@ -68,7 +104,7 @@ services:
     environment:
       CPS_USERNAME: ${CPS_USERNAME:-cpsuser}
       CPS_PASSWORD: ${CPS_PASSWORD:-cpsr0cks!}
-      DB_HOST: dbpostgresql
+      DB_HOST: ${DB_HOST}
       DB_USERNAME: ${DB_USERNAME:-cps}
       DB_PASSWORD: ${DB_PASSWORD:-cps}
       DMI_USERNAME: ${DMI_USERNAME:-cpsuser}
@@ -80,34 +116,24 @@ services:
     depends_on:
       - dbpostgresql
 
-  dbpostgresql:
-    container_name: dbpostgresql
-    image: postgres:13.2-alpine
+  ncmp-dmi-plugin:
+    container_name: ncmp-dmi-plugin
+    image: ${DOCKER_REPO:-nexus3.onap.org:10003}/onap/ncmp-dmi-plugin:${VERSION:-latest}
     ports:
-      - '5432:5432'
+      - "8783:8080"
+      - "8787:8081"
     environment:
-      POSTGRES_DB: cpsdb
-      POSTGRES_USER: ${DB_USERNAME:-cps}
-      POSTGRES_PASSWORD: ${DB_PASSWORD:-cps}
-
-#  zookeeper:
-#    image: confluentinc/cp-zookeeper:6.1.1
-#    environment:
-#      ZOOKEEPER_CLIENT_PORT: 2181
-#      ZOOKEEPER_TICK_TIME: 2000
-#    ports:
-#      - 22181:2181
-#
-#  kafka:
-#    image: confluentinc/cp-kafka:6.1.1
-#    depends_on:
-#      - zookeeper
-#    ports:
-#      - 29092:29092
-#    environment:
-#      KAFKA_BROKER_ID: 1
-#      KAFKA_ZOOKEEPER_CONNECT: zookeeper:2181
-#      KAFKA_ADVERTISED_LISTENERS: PLAINTEXT://kafka:9092,PLAINTEXT_HOST://localhost:29092
-#      KAFKA_LISTENER_SECURITY_PROTOCOL_MAP: PLAINTEXT:PLAINTEXT,PLAINTEXT_HOST:PLAINTEXT
-#      KAFKA_INTER_BROKER_LISTENER_NAME: PLAINTEXT
-#      KAFKA_OFFSETS_TOPIC_REPLICATION_FACTOR: 1
+      DMI_USERNAME: ${DMI_USERNAME:-cpsuser}
+      DMI_PASSWORD: ${DMI_PASSWORD:-cpsr0cks!}
+      CPS_CORE_HOST: ${CPS_CORE_HOST}
+      CPS_CORE_PORT: ${CPS_CORE_PORT:-8883}
+      CPS_CORE_USERNAME: ${CPS_CORE_USERNAME:-cpsuser}
+      CPS_CORE_PASSWORD: ${CPS_CORE_PASSWORD:-cpsr0cks!}
+      SDNC_HOST: ${SDNC_HOST}
+      SDNC_PORT: ${SDNC_PORT:-8282}
+      SDNC_USERNAME: ${SDNC_USERNAME:-admin}
+      SDNC_PASSWORD: ${SDNC_PASSWORD:-Kp8bJ4SXszM0WXlhak3eHlcse2gAw84vaoGGmJvUy2U}
+      DMI_SERVICE_URL: ${DMI_SERVICE_URL}
+    restart: unless-stopped
+    depends_on:
+      - cps-and-ncmp   #it depends on cps_and_ncmp for registration but as a container it can run independently.
\ No newline at end of file