From b601698d2006ad583b26e3a11a83a4799b88da89 Mon Sep 17 00:00:00 2001 From: Thierry Jiao Date: Thu, 17 Dec 2020 18:39:49 +0100 Subject: [PATCH] Add tests for service Notifications - Add functional test test_nbinotifications.py to check the sending of service notifications when service-create and service-delete are invoked - Update test_utils.py by adding a new function capable of getting the service notifications - Add docker-compose.yml necessary for Kafka and ZooKeeper dockers - Update tox.ini to include the new functional test and run Kafka/ZooKeeper dockers JIRA: TRNSPRTPCE-343 Signed-off-by: Thierry Jiao Change-Id: Ice4d8a2980317ee1dca6533752466305ed525981 --- nbinotifications/pom.xml | 2 - tests/nbinotifications/docker-compose.yml | 15 + .../2.2.1/test_nbinotifications.py | 354 ++++++++++++++++++ tests/transportpce_tests/common/test_utils.py | 5 + tox.ini | 15 +- 5 files changed, 383 insertions(+), 8 deletions(-) create mode 100644 tests/nbinotifications/docker-compose.yml create mode 100644 tests/transportpce_tests/2.2.1/test_nbinotifications.py diff --git a/nbinotifications/pom.xml b/nbinotifications/pom.xml index e49c0f15d..a1b0d9e41 100644 --- a/nbinotifications/pom.xml +++ b/nbinotifications/pom.xml @@ -24,7 +24,6 @@ UTF-8 2.6.0 - ${project.groupId} @@ -67,5 +66,4 @@ test - diff --git a/tests/nbinotifications/docker-compose.yml b/tests/nbinotifications/docker-compose.yml new file mode 100644 index 000000000..b13f6b9b7 --- /dev/null +++ b/tests/nbinotifications/docker-compose.yml @@ -0,0 +1,15 @@ +version: '2' +services: + zookeeper: + image: wurstmeister/zookeeper + container_name: nbinotifications_zookeeper + ports: + - "2181:2181" + kafka: + image: wurstmeister/kafka + container_name: nbinotifications_kafka + ports: + - "9092:9092" + environment: + KAFKA_ADVERTISED_HOST_NAME: localhost + KAFKA_ZOOKEEPER_CONNECT: zookeeper:2181 \ No newline at end of file diff --git a/tests/transportpce_tests/2.2.1/test_nbinotifications.py b/tests/transportpce_tests/2.2.1/test_nbinotifications.py new file mode 100644 index 000000000..b772b3667 --- /dev/null +++ b/tests/transportpce_tests/2.2.1/test_nbinotifications.py @@ -0,0 +1,354 @@ +#!/usr/bin/env python +############################################################################## +# Copyright (c) 2020 Orange, Inc. and others. All rights reserved. +# +# All rights reserved. This program and the accompanying materials +# are made available under the terms of the Apache License, Version 2.0 +# which accompanies this distribution, and is available at +# http://www.apache.org/licenses/LICENSE-2.0 +############################################################################## + +# pylint: disable=no-member +# pylint: disable=too-many-public-methods + +import os +import sys +import unittest +import time +import requests +from common import test_utils + + +class TransportNbiNotificationstesting(unittest.TestCase): + processes = None + cr_serv_sample_data = {"input": { + "sdnc-request-header": { + "request-id": "e3028bae-a90f-4ddd-a83f-cf224eba0e58", + "rpc-action": "service-create", + "request-system-id": "appname", + "notification-url": "http://localhost:8585/NotificationServer/notify" + }, + "service-name": "service1", + "common-id": "ASATT1234567", + "connection-type": "service", + "service-a-end": { + "service-rate": "100", + "node-id": "XPDR-A1", + "service-format": "Ethernet", + "clli": "SNJSCAMCJP8", + "tx-direction": { + "port": { + "port-device-name": "ROUTER_SNJSCAMCJP8_000000.00_00", + "port-type": "router", + "port-name": "Gigabit Ethernet_Tx.ge-5/0/0.0", + "port-rack": "000000.00", + "port-shelf": "00" + }, + "lgx": { + "lgx-device-name": "LGX Panel_SNJSCAMCJP8_000000.00_00", + "lgx-port-name": "LGX Back.3", + "lgx-port-rack": "000000.00", + "lgx-port-shelf": "00" + } + }, + "rx-direction": { + "port": { + "port-device-name": "ROUTER_SNJSCAMCJP8_000000.00_00", + "port-type": "router", + "port-name": "Gigabit Ethernet_Rx.ge-5/0/0.0", + "port-rack": "000000.00", + "port-shelf": "00" + }, + "lgx": { + "lgx-device-name": "LGX Panel_SNJSCAMCJP8_000000.00_00", + "lgx-port-name": "LGX Back.4", + "lgx-port-rack": "000000.00", + "lgx-port-shelf": "00" + } + }, + "optic-type": "gray" + }, + "service-z-end": { + "service-rate": "100", + "node-id": "XPDR-C1", + "service-format": "Ethernet", + "clli": "SNJSCAMCJT4", + "tx-direction": { + "port": { + "port-device-name": "ROUTER_SNJSCAMCJT4_000000.00_00", + "port-type": "router", + "port-name": "Gigabit Ethernet_Tx.ge-1/0/0.0", + "port-rack": "000000.00", + "port-shelf": "00" + }, + "lgx": { + "lgx-device-name": "LGX Panel_SNJSCAMCJT4_000000.00_00", + "lgx-port-name": "LGX Back.29", + "lgx-port-rack": "000000.00", + "lgx-port-shelf": "00" + } + }, + "rx-direction": { + "port": { + "port-device-name": "ROUTER_SNJSCAMCJT4_000000.00_00", + "port-type": "router", + "port-name": "Gigabit Ethernet_Rx.ge-1/0/0.0", + "port-rack": "000000.00", + "port-shelf": "00" + }, + "lgx": { + "lgx-device-name": "LGX Panel_SNJSCAMCJT4_000000.00_00", + "lgx-port-name": "LGX Back.30", + "lgx-port-rack": "000000.00", + "lgx-port-shelf": "00" + } + }, + "optic-type": "gray" + }, + "due-date": "2016-11-28T00:00:01Z", + "operator-contact": "pw1234" + } + } + + WAITING = 20 # nominal value is 300 + + @classmethod + def setUpClass(cls): + # TODO: for lighty manage the activation of NBI notification feature + cls.processes = test_utils.start_tpce() + # NBI notification feature is not installed by default in Karaf + if "USE_LIGHTY" not in os.environ or os.environ['USE_LIGHTY'] != 'True': + print("installing NBI notification feature...") + result = test_utils.install_karaf_feature("odl-transportpce-nbinotifications") + if result.returncode != 0: + cls.init_failed = True + print("Restarting OpenDaylight...") + test_utils.shutdown_process(cls.processes[0]) + cls.processes[0] = test_utils.start_karaf() + test_utils.process_list[0] = cls.processes[0] + cls.init_failed = not test_utils.wait_until_log_contains( + test_utils.KARAF_LOG, test_utils.KARAF_OK_START_MSG, time_to_wait=60) + if cls.init_failed: + print("NBI notification installation feature failed...") + test_utils.shutdown_process(cls.processes[0]) + sys.exit(2) + cls.processes = test_utils.start_sims(['xpdra', 'roadma', 'roadmc', 'xpdrc']) + + @classmethod + def tearDownClass(cls): + # pylint: disable=not-an-iterable + for process in cls.processes: + test_utils.shutdown_process(process) + print("all processes killed") + + def setUp(self): # instruction executed before each test method + print("execution of {}".format(self.id().split(".")[-1])) + + def test_01_connect_xpdrA(self): + response = test_utils.mount_device("XPDR-A1", 'xpdra') + self.assertEqual(response.status_code, requests.codes.created, test_utils.CODE_SHOULD_BE_201) + + def test_02_connect_xpdrC(self): + response = test_utils.mount_device("XPDR-C1", 'xpdrc') + self.assertEqual(response.status_code, requests.codes.created, test_utils.CODE_SHOULD_BE_201) + + def test_03_connect_rdmA(self): + response = test_utils.mount_device("ROADM-A1", 'roadma') + self.assertEqual(response.status_code, requests.codes.created, test_utils.CODE_SHOULD_BE_201) + + def test_04_connect_rdmC(self): + response = test_utils.mount_device("ROADM-C1", 'roadmc') + self.assertEqual(response.status_code, requests.codes.created, test_utils.CODE_SHOULD_BE_201) + + def test_05_connect_xprdA_N1_to_roadmA_PP1(self): + response = test_utils.connect_xpdr_to_rdm_request("XPDR-A1", "1", "1", + "ROADM-A1", "1", "SRG1-PP1-TXRX") + self.assertEqual(response.status_code, requests.codes.ok) + res = response.json() + self.assertIn('Xponder Roadm Link created successfully', res["output"]["result"]) + time.sleep(2) + + def test_06_connect_roadmA_PP1_to_xpdrA_N1(self): + response = test_utils.connect_rdm_to_xpdr_request("XPDR-A1", "1", "1", + "ROADM-A1", "1", "SRG1-PP1-TXRX") + self.assertEqual(response.status_code, requests.codes.ok) + res = response.json() + self.assertIn('Roadm Xponder links created successfully', res["output"]["result"]) + time.sleep(2) + + def test_07_connect_xprdC_N1_to_roadmC_PP1(self): + response = test_utils.connect_xpdr_to_rdm_request("XPDR-C1", "1", "1", + "ROADM-C1", "1", "SRG1-PP1-TXRX") + self.assertEqual(response.status_code, requests.codes.ok) + res = response.json() + self.assertIn('Xponder Roadm Link created successfully', res["output"]["result"]) + time.sleep(2) + + def test_08_connect_roadmC_PP1_to_xpdrC_N1(self): + response = test_utils.connect_rdm_to_xpdr_request("XPDR-C1", "1", "1", + "ROADM-C1", "1", "SRG1-PP1-TXRX") + self.assertEqual(response.status_code, requests.codes.ok) + res = response.json() + self.assertIn('Roadm Xponder links created successfully', res["output"]["result"]) + time.sleep(2) + + def test_09_get_notifications_service1(self): + data = { + "input": { + "connection-type": "service", + "id-consumer": "consumer", + "group-id": "transportpceTest" + } + } + response = test_utils.get_notifications_service_request(data) + self.assertEqual(response.status_code, requests.codes.no_content) + time.sleep(2) + + def test_10_create_eth_service1(self): + self.cr_serv_sample_data["input"]["service-name"] = "service1" + response = test_utils.service_create_request(self.cr_serv_sample_data) + self.assertEqual(response.status_code, requests.codes.ok) + res = response.json() + self.assertIn('PCE calculation in progress', + res['output']['configuration-response-common']['response-message']) + time.sleep(self.WAITING) + + def test_11_get_notifications_service1(self): + data = { + "input": { + "connection-type": "service", + "id-consumer": "consumer", + "group-id": "transportpceTest" + } + } + response = test_utils.get_notifications_service_request(data) + self.assertEqual(response.status_code, requests.codes.ok) + res = response.json() + self.assertEqual(res['output']['notification-service'][-2]['service-name'], 'service1') + self.assertEqual(res['output']['notification-service'][-2]['connection-type'], 'service') + self.assertEqual(res['output']['notification-service'][-2]['message'], 'ServiceCreate request received ...') + self.assertEqual(res['output']['notification-service'][-1]['service-name'], 'service1') + self.assertEqual(res['output']['notification-service'][-1]['message'], 'ServiceCreate request failed ...') + self.assertEqual(res['output']['notification-service'][-1]['response-failed'], + 'PCE path computation failed !') + time.sleep(2) + + def test_12_add_omsAttributes_ROADMA_ROADMC(self): + # Config ROADMA-ROADMC oms-attributes + data = {"span": { + "auto-spanloss": "true", + "spanloss-base": 11.4, + "spanloss-current": 12, + "engineered-spanloss": 12.2, + "link-concatenation": [{ + "SRLG-Id": 0, + "fiber-type": "smf", + "SRLG-length": 100000, + "pmd": 0.5}]}} + response = test_utils.add_oms_attr_request("ROADM-A1-DEG2-DEG2-TTP-TXRXtoROADM-C1-DEG1-DEG1-TTP-TXRX", data) + self.assertEqual(response.status_code, requests.codes.created) + + def test_13_add_omsAttributes_ROADMC_ROADMA(self): + # Config ROADMC-ROADMA oms-attributes + data = {"span": { + "auto-spanloss": "true", + "spanloss-base": 11.4, + "spanloss-current": 12, + "engineered-spanloss": 12.2, + "link-concatenation": [{ + "SRLG-Id": 0, + "fiber-type": "smf", + "SRLG-length": 100000, + "pmd": 0.5}]}} + response = test_utils.add_oms_attr_request("ROADM-C1-DEG1-DEG1-TTP-TXRXtoROADM-A1-DEG2-DEG2-TTP-TXRX", data) + self.assertEqual(response.status_code, requests.codes.created) + + # test service-create for Eth service from xpdr to xpdr + def test_14_create_eth_service1(self): + self.cr_serv_sample_data["input"]["service-name"] = "service1" + response = test_utils.service_create_request(self.cr_serv_sample_data) + self.assertEqual(response.status_code, requests.codes.ok) + res = response.json() + self.assertIn('PCE calculation in progress', + res['output']['configuration-response-common']['response-message']) + time.sleep(self.WAITING) + + def test_15_get_eth_service1(self): + response = test_utils.get_service_list_request("services/service1") + self.assertEqual(response.status_code, requests.codes.ok) + res = response.json() + self.assertEqual( + res['services'][0]['administrative-state'], 'inService') + self.assertEqual( + res['services'][0]['service-name'], 'service1') + self.assertEqual( + res['services'][0]['connection-type'], 'service') + self.assertEqual( + res['services'][0]['lifecycle-state'], 'planned') + time.sleep(2) + + def test_16_get_notifications_service1(self): + data = { + "input": { + "connection-type": "service", + "id-consumer": "consumer", + "group-id": "transportpceTest" + } + } + response = test_utils.get_notifications_service_request(data) + self.assertEqual(response.status_code, requests.codes.ok) + res = response.json() + self.assertEqual(res['output']['notification-service'][-3]['service-name'], 'service1') + self.assertEqual(res['output']['notification-service'][-3]['connection-type'], 'service') + self.assertEqual(res['output']['notification-service'][-3]['message'], 'ServiceCreate request received ...') + self.assertEqual(res['output']['notification-service'][-2]['service-name'], 'service1') + self.assertEqual(res['output']['notification-service'][-2]['message'], 'PCE calculation done OK !') + self.assertEqual(res['output']['notification-service'][-1]['service-name'], 'service1') + self.assertEqual(res['output']['notification-service'][-1]['message'], 'Service implemented !') + time.sleep(2) + + def test_17_delete_eth_service1(self): + response = test_utils.service_delete_request("service1") + self.assertEqual(response.status_code, requests.codes.ok) + res = response.json() + self.assertIn('Renderer service delete in progress', + res['output']['configuration-response-common']['response-message']) + time.sleep(20) + + def test_18_get_notifications_service1(self): + data = { + "input": { + "connection-type": "service", + "id-consumer": "consumer", + "group-id": "transportpceTest" + } + } + response = test_utils.get_notifications_service_request(data) + self.assertEqual(response.status_code, requests.codes.ok) + res = response.json() + self.assertEqual(res['output']['notification-service'][-2]['service-name'], 'service1') + self.assertEqual(res['output']['notification-service'][-2]['connection-type'], 'service') + self.assertEqual(res['output']['notification-service'][-2]['message'], 'ServiceDelete request received ...') + self.assertEqual(res['output']['notification-service'][-1]['service-name'], 'service1') + self.assertEqual(res['output']['notification-service'][-1]['message'], 'Service deleted !') + time.sleep(2) + + def test_19_disconnect_XPDRA(self): + response = test_utils.unmount_device("XPDR-A1") + self.assertEqual(response.status_code, requests.codes.ok, test_utils.CODE_SHOULD_BE_200) + + def test_20_disconnect_XPDRC(self): + response = test_utils.unmount_device("XPDR-C1") + self.assertEqual(response.status_code, requests.codes.ok, test_utils.CODE_SHOULD_BE_200) + + def test_21_disconnect_ROADMA(self): + response = test_utils.unmount_device("ROADM-A1") + self.assertEqual(response.status_code, requests.codes.ok, test_utils.CODE_SHOULD_BE_200) + + def test_22_disconnect_ROADMC(self): + response = test_utils.unmount_device("ROADM-C1") + self.assertEqual(response.status_code, requests.codes.ok, test_utils.CODE_SHOULD_BE_200) + + +if __name__ == "__main__": + unittest.main(verbosity=2) diff --git a/tests/transportpce_tests/common/test_utils.py b/tests/transportpce_tests/common/test_utils.py index c2447a992..1026df7e0 100644 --- a/tests/transportpce_tests/common/test_utils.py +++ b/tests/transportpce_tests/common/test_utils.py @@ -45,6 +45,7 @@ URL_CONFIG_CLLI_NET = "{}/config/ietf-network:networks/network/clli-network/" URL_CONFIG_ORDM_NET = "{}/config/ietf-network:networks/network/openroadm-network/" URL_PORTMAPPING = "{}/config/transportpce-portmapping:network/nodes/" URL_OPER_SERV_LIST = "{}/operational/org-openroadm-service:service-list/" +URL_GET_NBINOTIFICATIONS_SERV = "{}/operations/nbi-notifications:get-notifications-service/" URL_SERV_CREATE = "{}/operations/org-openroadm-service:service-create" URL_SERV_DELETE = "{}/operations/org-openroadm-service:service-delete" URL_SERVICE_PATH = "{}/operations/transportpce-device-renderer:service-path" @@ -337,6 +338,10 @@ def portmapping_request(suffix: str): return get_request(url) +def get_notifications_service_request(attr): + return post_request(URL_GET_NBINOTIFICATIONS_SERV, attr) + + def get_service_list_request(suffix: str): url = URL_OPER_SERV_LIST + suffix return get_request(url) diff --git a/tox.ini b/tox.ini index 8c52932a8..49de49ae7 100644 --- a/tox.ini +++ b/tox.ini @@ -23,19 +23,19 @@ commands = #install honeynode 1.2.1 simulators {py3,portmapping,topoPortMapping,rspn,topology,pce,olm,end2end}: - sh -c "./install_honeynode.sh 1.2.1" #patch OLM constant to speed up tests, unnecessary for PCE - {py3,portmapping,topoPortMapping,rspn,topology,olm,end2end,portmapping221,rspn221,otnrenderer,otnshrenderer,topology221,otn-topology,olm221,otnend2end,end2end221,tapi221}: - sh -c "sed -i'_' 's@=.*//#FUNCTESTVAL=@=@g' ../olm/src/main/java/org/opendaylight/transportpce/olm/util/OlmUtils.java" + {py3,portmapping,topoPortMapping,rspn,topology,olm,end2end,portmapping221,rspn221,otnrenderer,otnshrenderer,topology221,otn-topology,olm221,otnend2end,end2end221,tapi221,nbinotifications}: - sh -c "sed -i'_' 's@=.*//#FUNCTESTVAL=@=@g' ../olm/src/main/java/org/opendaylight/transportpce/olm/util/OlmUtils.java" #build controller, source JDK_JAVA_OPTIONS to remove illegal reflective acces warnings introduced by Java11 - {py3,portmapping,topoPortMapping,rspn,topology,pce,olm,end2end,portmapping221,rspn221,otnrenderer,otnshrenderer,topology221,otntopology,flexgrid,olm221,tapi221,otnend2end,end2end221,gnpy}: - sh -c ". $PWD/reflectwarn.sh && cd .. && mvn clean install -s tests/odl_settings.xml -DskipTests -Dmaven.javadoc.skip=true -Dodlparent.spotbugs.skip -Dodlparent.checkstyle.skip" - {py3,portmapping,topoPortMapping,rspn,topology,olm,end2end,portmapping221,rspn221,otnrenderer,otnshrenderer,topology221,otn-topology,olm221,otnend2end,end2end221,tapi221}: - sh -c "mv ../olm/src/main/java/org/opendaylight/transportpce/olm/util/OlmUtils.java_ ../olm/src/main/java/org/opendaylight/transportpce/olm/util/OlmUtils.java" + {py3,portmapping,topoPortMapping,rspn,topology,pce,olm,end2end,portmapping221,rspn221,otnrenderer,otnshrenderer,topology221,otntopology,flexgrid,olm221,tapi221,otnend2end,end2end221,gnpy,nbinotifications}: - sh -c ". $PWD/reflectwarn.sh && cd .. && mvn clean install -s tests/odl_settings.xml -DskipTests -Dmaven.javadoc.skip=true -Dodlparent.spotbugs.skip -Dodlparent.checkstyle.skip" + {py3,portmapping,topoPortMapping,rspn,topology,olm,end2end,portmapping221,rspn221,otnrenderer,otnshrenderer,topology221,otn-topology,olm221,otnend2end,end2end221,tapi221,nbinotifications}: - sh -c "mv ../olm/src/main/java/org/opendaylight/transportpce/olm/util/OlmUtils.java_ ../olm/src/main/java/org/opendaylight/transportpce/olm/util/OlmUtils.java" #patch Karaf exec for the same reason at runtime - {py3,portmapping,topoPortMapping,rspn,topology,pce,olm,end2end,portmapping221,rspn221,otnrenderer,otnshrenderer,topology221,otntopology,flexgrid,olm221,tapi221,otnend2end,end2end221,gnpy}: - sh -c "sed -i'_' 's@!/bin/sh@!/bin/sh\'$'\n. $(dirname $0)/../../../../tests/reflectwarn.sh@' ../karaf/target/assembly/bin/karaf" + {py3,portmapping,topoPortMapping,rspn,topology,pce,olm,end2end,portmapping221,rspn221,otnrenderer,otnshrenderer,topology221,otntopology,flexgrid,olm221,tapi221,otnend2end,end2end221,gnpy,nbinotifications}: - sh -c "sed -i'_' 's@!/bin/sh@!/bin/sh\'$'\n. $(dirname $0)/../../../../tests/reflectwarn.sh@' ../karaf/target/assembly/bin/karaf" # the following command would be the straight and right way to support both BSD and GNU sed versions # sh -c "sed -i'_' '1 a\'$'\n. \$(dirname \$0)/\.\./\.\./\.\./\.\./tests/reflectwarn.sh\n' ../karaf/target/assembly/bin/karaf" # but tox reinterprets the quotes as # sh -c 'sed -i'"'"'_'"'"' '"'"'1 a\'"'"'$'"'"'\n. \$(dirname \$0)/\.\./\.\./\.\./\.\./tests/reflectwarn.sh\n'"'"' ../karaf/target/assembly/bin/karaf' # ,what results in an unexpected different formating (with a $ on the second line and the dot on the third) #build Lighty if needed - {py3,portmapping,topoPortMapping,rspn,topology,pce,olm,end2end,portmapping221,rspn221,otnrenderer,otnshrenderer,topology221,otntopology,flexgrid,olm221,tapi221,otnend2end,end2end221,gnpy}: - sh -c 'if [ "$USE_LIGHTY" = "True" ]; then (cd ../lighty && ./build.sh); fi' + {py3,portmapping,topoPortMapping,rspn,topology,pce,olm,end2end,portmapping221,rspn221,otnrenderer,otnshrenderer,topology221,otntopology,flexgrid,olm221,tapi221,otnend2end,end2end221,gnpy,nbinotifications}: - sh -c 'if [ "$USE_LIGHTY" = "True" ]; then (cd ../lighty && ./build.sh); fi' #run 1.2.1 functional tests {py3,portmapping}: nosetests --with-xunit transportpce_tests/1.2.1/test_portmapping.py {py3,topoPortMapping}: nosetests --with-xunit transportpce_tests/1.2.1/test_topo_portmapping.py @@ -46,7 +46,7 @@ commands = #E2E 1.2.1 moved at the end before 2.2.1 E2E #run 2.2.1 functional tests #install honeynode 2.2.1 simulators - {py3,portmapping221,rspn221,otnrenderer,otnshrenderer,topology221,otntopology,flexgrid,olm221,tapi221,otnend2end,end2end221}: - sh -c "./install_honeynode.sh 2.2.1" + {py3,portmapping221,rspn221,otnrenderer,otnshrenderer,topology221,otntopology,flexgrid,olm221,tapi221,otnend2end,end2end221,nbinotifications}: - sh -c "./install_honeynode.sh 2.2.1" {py3,portmapping221}: nosetests --with-xunit transportpce_tests/2.2.1/test_portmapping.py {py3,topology221}: nosetests --with-xunit transportpce_tests/2.2.1/test_topology.py {py3,otntopology}: nosetests --with-xunit transportpce_tests/2.2.1/test_otn_topology.py @@ -63,6 +63,9 @@ commands = {gnpy}: - sudo docker run -d -p 8008:5000 --name gnpy_tpce_rest1 atriki/gnpyrest:v1.2 {gnpy}: nosetests --with-xunit transportpce_tests/1.2.1/test_gnpy.py {gnpy}: - sudo docker container rm -f gnpy_tpce_rest1 + {nbinotifications}: - sudo docker-compose -f ./nbinotifications/docker-compose.yml up -d + {nbinotifications}: nosetests --with-xunit transportpce_tests/2.2.1/test_nbinotifications.py + {nbinotifications}: - sudo docker-compose -f ./nbinotifications/docker-compose.yml down --rmi all [testenv:docs] passenv = http_proxy HTTP_PROXY https_proxy HTTPS_PROXY no_proxy NO_PROXY -- 2.36.6