Merge "Pull correct docker images for master branch"
authorGary Wu <gary.wu@futurewei.com>
Mon, 8 Jul 2019 17:43:25 +0000 (17:43 +0000)
committerGerrit Code Review <gerrit@onap.org>
Mon, 8 Jul 2019 17:43:25 +0000 (17:43 +0000)
18 files changed:
plans/so/vnfm_adapter/docker-compose.yml [new file with mode: 0644]
plans/so/vnfm_adapter/setup.sh [new file with mode: 0644]
plans/so/vnfm_adapter/teardown.sh [new file with mode: 0644]
plans/so/vnfm_adapter/testplan.txt [new file with mode: 0644]
plans/vfc-gvnfm-vnfres/sanity-check/setup.sh
plans/vfc-nfvo-catalog/sanity-check/testplan.txt
plans/vfc-nfvo-driver-vnfm-gvnfm/sanity-check/setup.sh
tests/dcaegen2/prh-testcases/assets/re-registration/expected-logical-link.json [deleted file]
tests/dcaegen2/prh-testcases/assets/re-registration/expected-pnf-update-event.json
tests/dcaegen2/prh-testcases/assets/re-registration/ves-event.json
tests/dcaegen2/prh-testcases/prh_tests.robot
tests/dcaegen2/prh-testcases/prh_tests_with_no_auth.robot [new file with mode: 0644]
tests/dcaegen2/prh-testcases/resources/prh_configs/prh-no-auth-config.json [new file with mode: 0644]
tests/dcaegen2/prh-testcases/resources/prh_library.robot
tests/dcaegen2/prh-testcases/resources/simulator/AAI.py
tests/dcaegen2/prh-testcases/resources/simulator/DMaaP.py
tests/so/vnfm_adapter/vnfm_adapter_test.robot [new file with mode: 0644]
tests/vfc/nfvo-catalog/Subscriptions.robot [new file with mode: 0644]

diff --git a/plans/so/vnfm_adapter/docker-compose.yml b/plans/so/vnfm_adapter/docker-compose.yml
new file mode 100644 (file)
index 0000000..9519571
--- /dev/null
@@ -0,0 +1,18 @@
+version: '3'
+services:
+################################################################################
+  VNFM-adapter:
+    image: nexus3.onap.org:10001/onap/so/vnfm-adapter:1.4.4
+    ports:
+      - "9092:9092"
+    environment:
+    - APP=VNFM-adapter
+    - JVM_ARGS=-Xms64m -Xmx512m
+    hostname:
+      vnfm-adapter-test
+    logging:
+      driver: "json-file"
+      options:
+        max-size: "30m"
+        max-file: "5"
+################################################################################
diff --git a/plans/so/vnfm_adapter/setup.sh b/plans/so/vnfm_adapter/setup.sh
new file mode 100644 (file)
index 0000000..518358b
--- /dev/null
@@ -0,0 +1,31 @@
+#!/bin/bash
+#
+# ============LICENSE_START=======================================================
+#  Copyright (C) 2019 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=========================================================
+#
+
+export NEXUS_DOCKER_REPO_MSO=nexus3.onap.org:10001
+export TAG=1.4.0-STAGING-latest
+
+docker-compose pull
+docker-compose up -d
+
+sleep 2m
+
+REPO_IP='127.0.0.1'
+ROBOT_VARIABLES="-v REPO_IP:${REPO_IP}"
diff --git a/plans/so/vnfm_adapter/teardown.sh b/plans/so/vnfm_adapter/teardown.sh
new file mode 100644 (file)
index 0000000..8b778a5
--- /dev/null
@@ -0,0 +1,22 @@
+#!/bin/bash
+#
+# ============LICENSE_START=======================================================
+#  Copyright (C) 2019 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=========================================================
+#
+
+docker-compose down
diff --git a/plans/so/vnfm_adapter/testplan.txt b/plans/so/vnfm_adapter/testplan.txt
new file mode 100644 (file)
index 0000000..823990a
--- /dev/null
@@ -0,0 +1,3 @@
+# Test suites are relative paths under [integration/csit.git]/tests/.
+# Place the suites in run order.
+so/vnfm_adapter/vnfm_adapter_test.robot
index 11b86c7..e2ab259 100755 (executable)
@@ -78,6 +78,8 @@ done
 docker cp vfc-vnfres:/service/vfc/gvnfm/vnfres/res/res/pub/config/config.py ./
 cat config.py
 
+docker logs vfc-vnfres
+
 docker cp vfc-vnfres:/service/vfc/gvnfm/vnfres/res/logs/runtime_res.log ./
 cat runtime_res.log
 
index 3c5f813..cce75ed 100644 (file)
@@ -1,3 +1,4 @@
 # Test suites are relative paths under [integration/csit.git]/tests/.
 # Place the suites in run order.
 vfc/nfvo-catalog/test.robot
+vfc/nfvo-catalog/Subscriptions.robot
index 8b21b89..56e1f91 100644 (file)
@@ -52,6 +52,8 @@ for i in {1..10}; do
     sleep $i
 done
 
+docker logs vfc-gvnfmdriver
+
 docker cp vfc-gvnfmdriver:/service/vfc/nfvo/driver/vnfm/gvnfm/gvnfmadapter/logs/runtime_gvnfmdriver.log ./
 cat runtime_gvnfmdriver.log
 
diff --git a/tests/dcaegen2/prh-testcases/assets/re-registration/expected-logical-link.json b/tests/dcaegen2/prh-testcases/assets/re-registration/expected-logical-link.json
deleted file mode 100644 (file)
index 0e4f6ab..0000000
+++ /dev/null
@@ -1,22 +0,0 @@
-{
-  "link-name": "bbs-link",
-  "in-maint": false,
-  "link-type": "attachment-point",
-  "relationship-list":
-  {
-    "relationship": [
-      {
-        "related-to": "pnf",
-        "relationship-label": "org.onap.relationships.inventory.BridgedTo",
-        "related-link": "/network/pnfs/pnf/NOK6061ZW9",
-        "relationship-data": [
-          {
-            "relationship-key": "pnf.pnf-name",
-            "relationship-value": "NOK6061ZW9"
-          }
-        ]
-      }
-    ]
-  }
-}
-
index d178779..48341b6 100644 (file)
@@ -1,7 +1,8 @@
 [
   {
     "additionalFields": {
-      "attachment-point": "another-link"
+      "attachment-point": "another-link",
+      "some-param": "param"
     },
     "correlationId": "NOK6061ZW9"
   }
index ef75a88..f02d734 100644 (file)
@@ -33,7 +33,8 @@
       "oamV6IpAddress": "val4",
       "softwareVersion": "val7",
       "additionalFields": {
-        "attachment-point": "another-link"
+        "attachment-point": "another-link",
+        "some-param": "param"
       }
     }
   }
index c8297ec..69ce27d 100644 (file)
@@ -1,13 +1,13 @@
 *** Settings ***
 Documentation     Integration tests for PRH.
 ...               PRH receive events from DMaaP and produce or not PNF_READY notification depends on required fields in received event.
-Suite Setup       Run keywords   Create Headers  AND  Create sessions
+Suite Setup       Run keywords   Create Headers  AND  Create sessions   AND    Set default PRH CBS config
 Test Teardown     Reset Simulators
 Test Timeout      2 minutes
 
-Library           resources/PrhLibrary.py
 Resource          resources/prh_sessions.robot
 Resource          resources/prh_library.robot
+Resource          resources/prh_config_library.robot
 
 *** Variables ***
 ${TEST_CASES_DIR}    %{WORKSPACE}/tests/dcaegen2/prh-testcases/assets
@@ -53,7 +53,7 @@ Should not send PNF ready when AAI is not responding
 Should send PNF ready when logical link exists and replace it in AAI
     [Documentation]  PRH gets event from DMaaP with an attachment point, PNF is related to a logical link in AAI
     [Tags]  PRH    Attachment point
-    [Template]  Verify PNF ready sent and old logical link removed from AAI
+    [Template]  Verify PNF ready sent and old logical link replaced in AAI
     ${TEST_CASES_DIR}/pnf-with-existing-logical-link
     ${TEST_CASES_DIR}/pnf-with-different-logical-link
 
diff --git a/tests/dcaegen2/prh-testcases/prh_tests_with_no_auth.robot b/tests/dcaegen2/prh-testcases/prh_tests_with_no_auth.robot
new file mode 100644 (file)
index 0000000..afcd0f8
--- /dev/null
@@ -0,0 +1,20 @@
+*** Settings ***
+Documentation     Integration tests for PRH when cert auth for dmaap and aai is disabled.
+Suite Setup       Run keywords   Create Headers  AND  Create sessions   AND
+...               Set PRH CBS config from file    ${CONFIGS_DIR}/prh-no-auth-config.json
+Test Teardown     Reset Simulators
+Test Timeout      2 minutes
+
+Resource          resources/prh_sessions.robot
+Resource          resources/prh_library.robot
+Resource          resources/prh_config_library.robot
+
+*** Variables ***
+${TEST_CASES_DIR}    %{WORKSPACE}/tests/dcaegen2/prh-testcases/assets
+
+*** Test Cases ***
+Simple registration event
+    [Documentation]    simple registration scenario when AAI and dmaap cert atuh is disabled
+    [Tags]    PRH    Valid event
+    [Template]    Verify PNF ready sent
+    ${TEST_CASES_DIR}/ves-event-without-additional-fields
\ No newline at end of file
diff --git a/tests/dcaegen2/prh-testcases/resources/prh_configs/prh-no-auth-config.json b/tests/dcaegen2/prh-testcases/resources/prh_configs/prh-no-auth-config.json
new file mode 100644 (file)
index 0000000..a4f87e0
--- /dev/null
@@ -0,0 +1,58 @@
+{
+  "cbs.updates-interval": 0,
+  "logging.level.org.onap.dcaegen2.services.prh": "debug",
+  "logging.level.org.onap.dcaegen2.services.sdk": "debug",
+  "logging.level.org.onap.dcaegen2.services.prh.controllers.AppInfoController": "off",
+  "dmaap.dmaapConsumerConfiguration.dmaapUserName": "admin",
+  "dmaap.dmaapConsumerConfiguration.dmaapUserPassword": "admin",
+  "dmaap.dmaapConsumerConfiguration.dmaapContentType": "application/json",
+  "dmaap.dmaapConsumerConfiguration.consumerId": "c12",
+  "dmaap.dmaapConsumerConfiguration.consumerGroup": "OpenDCAE-c12",
+  "dmaap.dmaapConsumerConfiguration.timeoutMs": -1,
+  "dmaap.dmaapProducerConfiguration.dmaapUserName": "admin",
+  "dmaap.dmaapProducerConfiguration.dmaapUserPassword": "admin",
+  "dmaap.dmaapProducerConfiguration.dmaapContentType": "application/json",
+  "dmaap.dmaapUpdateProducerConfiguration.dmaapUserName": "admin",
+  "dmaap.dmaapUpdateProducerConfiguration.dmaapUserPassword": "admin",
+  "dmaap.dmaapUpdateProducerConfiguration.dmaapContentType": "application/json",
+  "aai.aaiClientConfiguration.pnfUrl": "http://aai:3333/aai/v12/network/pnfs/pnf",
+  "aai.aaiClientConfiguration.aaiUserName": "DCAE",
+  "aai.aaiClientConfiguration.aaiUserPassword": "DCAE",
+  "aai.aaiClientConfiguration.aaiIgnoreSslCertificateErrors": true,
+  "aai.aaiClientConfiguration.aaiServiceInstancePath": "/business/customers/customer/${customer}/service-subscriptions/service-subscription/${serviceType}/service-instances/service-instance/${serviceInstanceId}",
+  "aai.aaiClientConfiguration.aaiHeaders": {
+    "X-FromAppId": "prh",
+    "X-TransactionId": "9999",
+    "Accept": "application/json",
+    "Real-Time": "true",
+    "Authorization": "Basic QUFJOkFBSQ=="
+  },
+  "security.trustStorePath": "",
+  "security.trustStorePasswordPath": "",
+  "security.keyStorePath": "",
+  "security.keyStorePasswordPath": "",
+  "security.enableAaiCertAuth": false,
+  "security.enableDmaapCertAuth": false,
+  "streams_publishes": {
+    "pnf-update": {
+      "type": "message_router",
+      "dmaap_info": {
+        "topic_url": "http://dmaap-mr:2222/events/unauthenticated.PNF_UPDATE"
+      }
+    },
+    "pnf-ready": {
+      "type": "message_router",
+      "dmaap_info": {
+        "topic_url": "http://dmaap-mr:2222/events/unauthenticated.PNF_READY"
+      }
+    }
+  },
+  "streams_subscribes": {
+    "ves-reg-output": {
+      "type": "message_router",
+      "dmaap_info": {
+        "topic_url": "http://dmaap-mr:2222/events/unauthenticated.VES_PNFREG_OUTPUT"
+      }
+    }
+  }
+}
\ No newline at end of file
index cf3f109..892ee52 100644 (file)
@@ -15,12 +15,13 @@ Verify PNF ready sent
     Wait Until Keyword Succeeds    10x    3000ms    Check CBS ready
     Wait Until Keyword Succeeds    10x    3000ms    Check created PNF_READY notification    ${expected_pnf_ready_event}
 
-Verify PNF ready sent and old logical link removed from AAI
+Verify PNF ready sent and old logical link replaced in AAI
     [Arguments]    ${test_case_directory}
     ${logical_link}=   Get Data From File  ${test_case_directory}/logical-link.json
+    ${expected_logical_link}=    Get Data From File  ${test_case_directory}/expected-logical-link.json
     Add logical link entry in AAI  ${logical_link}
     Verify PNF ready sent  ${test_case_directory}
-    Wait Until Keyword Succeeds    10x    3000ms    Check no logical link in AAI    ${test_case_directory}
+    Wait Until Keyword Succeeds    10x    3000ms    Check created Logical Link    ${expected_logical_link}
 
 Verify PNF ready sent and logical link created
     [Arguments]    ${test_case_directory}
@@ -95,13 +96,8 @@ Verify PNF ready sent when service instance non active
 Check logical link not modified
     [Arguments]    ${test_case_directory}
     ${expected_logical_link}=    Get Data From File  ${test_case_directory}/logical-link.json
-    ${actual_logical_link}=    Get Request   ${aai_session}    /verify/logical-link/bbs-link    headers=${suite_headers}
-    Should Be Equal As JSON  ${expected_logical_link}    ${actual_logical_link.content}
-
-Check no logical link in AAI
-    [Arguments]    ${test_case_directory}
-    ${logical_links}=    Get Request    ${aai_session}    /verify/logical-links    headers=${suite_headers}
-    Should Be Equal As JSON    {}    ${logical_links.content}
+    ${existing_logical_link}=    Get Request    ${aai_session}    /verify/logical-link    headers=${suite_headers}
+    Should Be Equal As JSON  ${expected_logical_link}    ${existing_logical_link.content}
 
 Check CBS ready
     ${resp}=    Get Request    ${consul_session}    /v1/catalog/services
@@ -110,21 +106,21 @@ Check CBS ready
     Dictionary Should Contain Key    ${resp.json()}    cbs    |Consul service catalog should contain CBS entry
 
 Check created PNF_READY notification
-    [Arguments]    ${expected_event_pnf_ready_in_dpaap}
+    [Arguments]    ${expected_event_pnf_ready_in_dmaap}
     ${resp}=    Get Request    ${dmaap_session}    /verify/pnf_ready    headers=${suite_headers}
     Should Be Equal As Strings    ${resp.status_code}    200
-    Should Be Equal As JSON    ${resp.content}    ${expected_event_pnf_ready_in_dpaap}
+    Should Be Equal As JSON    ${resp.content}    ${expected_event_pnf_ready_in_dmaap}
 
 Check created PNF_UPDATE notification
-    [Arguments]    ${expected_event_pnf_update_in_dpaap}
+    [Arguments]    ${expected_event_pnf_update_in_dmaap}
     ${resp}=    Get Request    ${dmaap_session}    /verify/pnf_update    headers=${suite_headers}
     Log    Response from DMaaP: ${resp.content}
     Should Be Equal As Strings    ${resp.status_code}    200
-    Should Be Equal As JSON    ${resp.content}    ${expected_event_pnf_update_in_dpaap}
+    Should Be Equal As JSON    ${resp.content}    ${expected_event_pnf_update_in_dmaap}
 
 Check created Logical Link
     [Arguments]    ${expected_logical_link_in_aai}
-    ${resp}=    Get Request    ${aai_session}    /verify/created_logical_link    headers=${suite_headers}
+    ${resp}=    Get Request    ${aai_session}    /verify/logical-link    headers=${suite_headers}
     Should Be Equal As Strings    ${resp.status_code}    200
     Should Be Equal As JSON    ${resp.content}    ${expected_logical_link_in_aai}
 
index e5f0b10..0886434 100644 (file)
@@ -20,7 +20,6 @@ logger = logging.getLogger('AAI-simulator-logger')
 AAI_RESOURCE_NOT_FOUND = b'{}'
 
 pnf_entries = {}
-logical_links = {}
 patched_pnf = AAI_RESOURCE_NOT_FOUND
 created_logical_link = AAI_RESOURCE_NOT_FOUND
 service_instance = AAI_RESOURCE_NOT_FOUND
@@ -32,15 +31,9 @@ class AAISetup(BaseHTTPRequestHandler):
             if re.search('/setup/patched_pnf', self.path):
                 httpServerLib.set_response_200_ok(self, payload = patched_pnf)
                 logger.debug('AAISetup GET /setup/patched_pnf -> 200 OK')
-            elif re.search('/verify/created_logical_link', self.path):
+            elif re.search('/verify/logical-link', self.path):
                 httpServerLib.set_response_200_ok(self, payload = created_logical_link)
-                logger.debug('AAISetup GET /setup/created_logical_link -> 200 OK')
-            elif re.search('/verify/logical-links', self.path):
-                httpServerLib.set_response_200_ok(self, payload= json.dumps(logical_links).encode('utf-8'))
-            elif re.search('/verify/logical-link/bbs-link', self.path):
-                link_name = basename(self.path)
-                if link_name in logical_links:
-                    httpServerLib.set_response_200_ok(self, payload = logical_links[link_name])
+                logger.debug('AAISetup GET /verify/logical_link -> 200 OK')
             else:
                 httpServerLib.set_response_404_not_found(self)
                 logger.info('AAISetup GET ' + self.path + ' -> 404 Not found')
@@ -73,10 +66,9 @@ class AAISetup(BaseHTTPRequestHandler):
                 if logical_link_name == None:
                     raise Exception("Invalid logical link entry, could not extract `link-name`")
 
-                global logical_link
-                logical_links[logical_link_name] = logical_link_payload
+                global created_logical_link
+                created_logical_link = logical_link_payload
 
-                logical_link = json.loads(logical_link_payload)
                 httpServerLib.set_response_200_ok(self)
                 logger.debug('AAISetup PUT /setup/add_logical_link -> 200 OK')
 
@@ -126,12 +118,12 @@ class AAIHandler(BaseHTTPRequestHandler):
                     logger.info('AAIHandler GET /aai/v12/network/pnfs/pnf/' + pnf_name + ' -> 404 Not found, actual entries: ' + str(pnf_entries.keys()))
             elif re.search('/aai/v12/network/logical-links/logical-link/[^/]*$', self.path):
                 logical_link_name = basename(self.path)
-                if logical_link_name in logical_links:
-                    httpServerLib.set_response_200_ok(self, payload = logical_links[logical_link_name])
+                if json.loads(created_logical_link).get("link-name") == logical_link_name:
+                    httpServerLib.set_response_200_ok(self, payload = created_logical_link)
                     logger.debug('AAIHandler GET /aai/v12/network/logical-links/logical-link/' + logical_link_name + ' -> 200 OK')
                 else:
                     httpServerLib.set_response_404_not_found(self)
-                    logger.info('AAIHandler GET /aai/v12/network/logical-links/logical-link/' + logical_link_name + ' -> 404 Not found, actual entries: ' + str(logical_links.keys()))
+                    logger.info('AAIHandler GET /aai/v12/network/logical-links/logical-link/' + logical_link_name + ' -> 404 Not found, actual link: ' + created_logical_link)
             elif re.search('aai/v12/network/pnfs/pnf/business/customers/customer/Demonstration/service-subscriptions/service-subscription/vFW/service-instances/service-instance/bbs_service', self.path):
                 httpServerLib.set_response_200_ok(self, payload = json.dumps(service_instance).encode('utf-8'))
                 logger.debug('AAIHandler GET aai/v12/network/pnfs/pnf/business/customers/customer/Demonstration/service-subscriptions/service-subscription/vFW/service-instances/service-instance/bbs_service -> 200 OK')
@@ -185,7 +177,10 @@ class AAIHandler(BaseHTTPRequestHandler):
                 httpServerLib.set_response_200_ok(self)
                 logical_link_name = re.search('.+?(?=\?)', basename(self.path)).group(0)
 
-                del logical_links[logical_link_name]
+                global created_logical_link
+                if json.loads(created_logical_link).get("link-name") == logical_link_name:
+                    created_logical_link = AAI_RESOURCE_NOT_FOUND
+
                 logger.debug('AAIHandler DELETE /aai/v12/network/logical-links/logical-link/' + logical_link_name + ' -> 200 OK')
             else:
                 httpServerLib.set_response_404_not_found(self)
@@ -196,6 +191,7 @@ class AAIHandler(BaseHTTPRequestHandler):
 
 def _main_(handler_class=AAIHandler, protocol="HTTP/1.0"):
     handler_class.protocol_version = protocol
+    httpServerLib.start_http_endpoint(3333, AAIHandler)
     httpServerLib.start_https_endpoint(3334, AAIHandler, keyfile="certs/aai.key", certfile="certs/aai.crt", ca_certs="certs/root.crt")
     httpServerLib.start_http_endpoint(3335, AAISetup)
     while 1:
index 5ec601f..5d7bd70 100644 (file)
@@ -125,6 +125,7 @@ class DMaaPHandler(BaseHTTPRequestHandler):
 
 def _main_(handler_class=DMaaPHandler, protocol="HTTP/1.0"):
     handler_class.protocol_version = protocol
+    httpServerLib.start_http_endpoint(2222, DMaaPHandler)
     httpServerLib.start_https_endpoint(2223, DMaaPHandler, keyfile="certs/dmaap-mr.key", certfile="certs/dmaap-mr.crt", ca_certs="certs/root.crt")
     httpServerLib.start_http_endpoint(2224, DmaapSetup)
     while 1:
diff --git a/tests/so/vnfm_adapter/vnfm_adapter_test.robot b/tests/so/vnfm_adapter/vnfm_adapter_test.robot
new file mode 100644 (file)
index 0000000..d0c7034
--- /dev/null
@@ -0,0 +1,16 @@
+*** Settings ***
+Library     Collections
+Library     RequestsLibrary
+Library     OperatingSystem
+Library     json
+
+*** Variables ***
+
+
+*** Test Cases ***
+
+Healthcheck
+    Create Session   refrepo  http://${REPO_IP}:9092
+    &{headers}=  Create Dictionary    Authorization=Basic dm5mbTpwYXNzd29yZDEk==    Content-Type=application/json
+    ${resp}=    Get Request    refrepo    /manage/health    headers=${headers}
+    Run Keyword If  '${resp.status_code}' == 'UP'   log to console  \nexecuted with expected result
diff --git a/tests/vfc/nfvo-catalog/Subscriptions.robot b/tests/vfc/nfvo-catalog/Subscriptions.robot
new file mode 100644 (file)
index 0000000..b87c20f
--- /dev/null
@@ -0,0 +1,45 @@
+*** Settings ***
+Resource    ../../common.robot
+Library     Collections
+Library     RequestsLibrary
+Library     OperatingSystem
+Library     json
+Library     HttpLibrary.HTTP
+
+*** Variables ***
+@{return_ok_list}=         200  201  202  204
+${catalog_port}            8806
+${subscriptions_url}         /api/vnfpkgm/v1/subscriptions
+
+#json files
+${vnf_subscription_json}    ${SCRIPTS}/../tests/vfc/nfvo-catalog/jsons/vnf_subscription.json
+
+#global variables
+${subscriptionId}
+
+*** Test Cases ***
+POST Subscription
+    Log    Trying to create a new subscription
+    [Documentation]    Create Vnf Subscription function test
+    ${json_value}=     json_from_file      ${vnf_subscription_json}
+    ${json_string}=     string_from_json   ${json_value}
+    ${headers}    Create Dictionary    Content-Type=application/json    Accept=application/json
+    Create Session    web_session    http://${CATALOG_IP}:${catalog_port}    headers=${headers}
+    Set Request Body    ${json_string}
+    ${resp}=    Post Request    web_session     ${subscriptions_url}    ${json_string}
+    ${responese_code}=     Convert To String      ${resp.status_code}
+    List Should Contain Value    ${return_ok_list}   ${responese_code}
+    ${response_json}    json.loads    ${resp.content}
+    ${callback_uri}=    Convert To String      ${response_json['callbackUri']}
+    Should Be Equal    ${callback_uri}    http://127.0.0.1:${catalog_port}/api/catalog/v1/callback_sample
+    ${subscriptionId}=    Convert To String      ${response_json['id']}
+    Set Global Variable     ${subscriptionId}
+
+DeleteVnfSubscriptionTest
+    [Documentation]    Delete Vnf Subscription function test
+    ${headers}    Create Dictionary    Content-Type=application/json    Accept=application/json
+    Create Session    web_session    http://${CATALOG_IP}:${catalog_port}    headers=${headers}
+    ${resp}=    Delete Request    web_session     ${subscriptions_url}/${subscriptionId}
+    ${responese_code}=     Convert To String      ${resp.status_code}
+    List Should Contain Value    ${return_ok_list}   ${responese_code}
+