From 8fe8b172c78fc27746ebbc043bd2a5390a1e81eb Mon Sep 17 00:00:00 2001 From: garciay Date: Tue, 12 Mar 2024 07:24:01 +0100 Subject: [PATCH 01/15] Add Yang models --- Reference.txt | 13 + test-purposes/AtsMDSC.tplan2 | 396 +++++++++++++++++++ test-purposes/ietf_inet_types.tplan2 | 25 ++ test-purposes/ietf_microwave_topology.tplan2 | 8 + test-purposes/ietf_networks_topology.tplan2 | 56 +++ test-purposes/ietf_te_topology.tplan2 | 29 ++ test-purposes/ietf_te_types.tplan2 | 9 + test-purposes/ietf_yang_data_base.tplan2 | 27 ++ test-purposes/ietf_yang_library.tplan2 | 32 ++ test-purposes/mWT_Common.tplan2 | 127 ++++++ 10 files changed, 722 insertions(+) create mode 100644 Reference.txt create mode 100644 test-purposes/AtsMDSC.tplan2 create mode 100644 test-purposes/ietf_inet_types.tplan2 create mode 100644 test-purposes/ietf_microwave_topology.tplan2 create mode 100644 test-purposes/ietf_networks_topology.tplan2 create mode 100644 test-purposes/ietf_te_topology.tplan2 create mode 100644 test-purposes/ietf_te_types.tplan2 create mode 100644 test-purposes/ietf_yang_data_base.tplan2 create mode 100644 test-purposes/ietf_yang_library.tplan2 create mode 100644 test-purposes/mWT_Common.tplan2 diff --git a/Reference.txt b/Reference.txt new file mode 100644 index 0000000..8d5e3bc --- /dev/null +++ b/Reference.txt @@ -0,0 +1,13 @@ + +==========+=========================+===============================+ + | Prefix | YANG Module | Reference | + +==========+=========================+===============================+ + | mwt | ietf-microwave-topology | draft-ietf-ccamp-mw-topo-yang | + +----------+-------------------------+-------------------------------+ + | nw | ietf-network | [RFC8345] | + +----------+-------------------------+-------------------------------+ + | nt | ietf-network-topology | [RFC8345] | + +----------+-------------------------+-------------------------------+ + | mw-types | ietf-microwave-types | [RFC8561] | + +----------+-------------------------+-------------------------------+ + | tet | ietf-te-topology | [RFC8795] | + +----------+-------------------------+-------------------------------+ \ No newline at end of file diff --git a/test-purposes/AtsMDSC.tplan2 b/test-purposes/AtsMDSC.tplan2 new file mode 100644 index 0000000..c68b4ec --- /dev/null +++ b/test-purposes/AtsMDSC.tplan2 @@ -0,0 +1,396 @@ +Package AtsMDSC { + + Group "mdsc" { + + import all from mWT_Common; + + Group "Blackbox" { + + Group "MWTopology" { + + import all from mWT_Common; + + Test Purpose { + TP Id TP_mWT_MDSC_MW_TOPO_GET_BV_01 + + Test objective + "Verify that the IUT replies with an error code when requesting microwave topology inventory in case of black box abstraction level." + + Reference + "ETSI GS mWT 024 Clause 4.3.2.1 Definition - point 1", + "RFC 8345" + + PICS Selection IUT_MDSC and ABSTRACT_BB and MW_TOPO + + Initial conditions with { + the IUT entity is idle + } + + Expected behaviour + ensure that { + when { + the IUT entity receives a vRequestGet containing + uri indicating value "/restconf/data/ietf-microwave-topology"; + from the TEST_SYSTEM entity + } then { + the IUT entity sends a r400 + to the TEST_SYSTEM entity + } + } + } + + } // End of Group "MWTopology" + + Group "EthernetTopology" { + + import all from mWT_Common; + + Test Purpose { + TP Id TP_mWT_MDSC_ETH_TOPO_GET_BV_01 + + Test objective + "Verify that the IUT provides the list of available network when requested." + + Reference + "ETSI GS mWT 024 Clause 4.3.2 AL1: Abstraction Level 1 - Black-box", + "RFC 8345" + + Config Id Config_mWT_1 + + PICS Selection IUT_MDSC and ABSTRACT_BB and ETH_TOPO + + Initial conditions with { + the IUT entity is idle + } + + Expected behaviour + ensure that { + when { + the IUT entity receives a vRequestGet containing + uri indicating value "/restconf/data/ietf-te-topology"; + from the TEST_SYSTEM entity + } then { + the IUT entity sends a r200 containing + body containing + networks containing + network_id1 containing + network_types containing + supporting_network containing + network_ref indicating value NETWORK_REFS;, + node containing + node_id indicating value NODE_ID, + supporting_node containing + network_ref indicating value NETWORK_NODE_REFS, + node_ref indicating value NODE_REFS + ;;;;;;; + to the TEST_SYSTEM entity + } + } + } // End of TP Id TP_mWT_MDSC_TOPO_GET_BV_01 + + } // End of Group "EthernetTopology" + + } // End of Group "Blackbox" + + Group "PartiallyTransparent" { + + } // End of Group "PartiallyTransparent" + + } // End of Group "mdsc" + + Group "pnc" { + + Group "RESTCONF" { + + import all from mWT_Common; + + Test Purpose { + TP Id TP_mWT_PNC_RESTCONF_GET_BV_01 + + Test objective + "Verify that the IUT supports RESTCONF API request." + + Reference + "ETSI GS mWT 024 Clause 5.2.1 RESTCONF Protocol", + "RFC 8040 RESTCONF Protocol", + "RFC 8525 YANG Library" + + Config Id Config_mWT_2 + + PICS Selection IUT_PNC and RESTCONF and SEC_TLS + + Initial conditions with { + the IUT entity is idle + } + + Expected behaviour + ensure that { + when { + the IUT entity receives a vRequestGet containing + uri indicating value "/restconf/data/ietf-yang-library:modules-state"; + from the TEST_SYSTEM entity + } then { + the IUT entity sends a r200 containing + headers containing + content_type indicating value "application/yang-data+xml";, + body containing + modules_state containing + name_ indicating value "ietf-yang-library:modules-state", + modules containing + non empty list;;;; + to the TEST_SYSTEM entity + } + } + } + + Test Purpose { + TP Id TP_mWT_PNC_RESTCONF_GET_BV_02 + + Test objective + "Verify that the IUT supports the basic YANG data models." + + Reference + "ETSI GS mWT 024 Clause 5.2.2.1 YANG Version" + + Config Id Config_mWT_2 + + PICS Selection IUT_PNC and RESTCONF and SEC_TLS + + Initial conditions with { + the IUT entity is idle + } + + Expected behaviour + ensure that { + when { + the IUT entity receives a vRequestGet containing + uri indicating value "/restconf/data/ietf-yang-library:modules-state"; + from the TEST_SYSTEM entity + } then { + the IUT entity sends a r200 containing + headers containing + content_type indicating value "application/yang-data+xml";, + body containing + modules_state containing + name_ indicating value "ietf-yang-library:modules-state", + modules containing + entry containing + name_ indicating value "ietf-datastores", + revision indicating value "2018-02-14", + schema indicating value "https://localhost:443/restconf/data/modules/ietf-datastores/2018-02-14", + namespace indicating value "urn:ietf:params:xml:ns:yang:ietf-datastores", + conformance_type indicating value "import";, + entry containing + name_ indicating value "ietf-inet-types", + revision indicating value "2013-07-15", + schema indicating value "https://localhost:443/restconf/data/modules/ietf-inet-types/2013-07-15", + namespace indicating value "urn:ietf:params:xml:ns:yang:ietf-inet-types", + conformance_type indicating value "import";, + entry containing + name_ indicating value "ietf-interfaces", + revision indicating value "2018-02-20", + schema indicating value "https://localhost:443/restconf/data/modules/ietf-interfaces/2018-02-20", + namespace indicating value "urn:ietf:params:xml:ns:yang:ietf-interfaces", + conformance_type indicating value "import", + entry containing + name_ indicating value "ietf-ip", + revision indicating value "2018-02-22", + schema indicating value "https://localhost:443/restconf/data/modules/ietf-ip/2018-02-22", + namespace indicating value "urn:ietf:params:xml:ns:yang:ietf-ip", + conformance_type indicating value "import";, + entry containing + name_ indicating value "ietf-network-instance", + revision indicating value "2019-01-21", + schema indicating value "https://localhost:443/restconf/data/modules/ietf-network-instance/2019-01-21", + namespace indicating value "urn:ietf:params:xml:ns:yang:ietf-network-instance", + conformance_type indicating value "import";, + entry containing + name_ indicating value "ietf-restconf", + revision indicating value "2017-01-26", + schema indicating value "https://localhost:443/restconf/data/modules/ietf-restconf/2017-01-26", + namespace indicating value "urn:ietf:params:xml:ns:yang:ietf-restconf", + conformance_type indicating value "implement";, + entry containing + name_ indicating value "ietf-yang-types", + revision indicating value "2013-07-15", + schema indicating value "https://localhost:443/restconf/data/modules/ietf-restconf/2017-01-26", + namespace indicating value "urn:ietf:params:xml:ns:yang:ietf-restconf", + conformance_type indicating value "import";, + entry containing + name_ indicating value "ietf-yang-library", + revision indicating value "2019-01-04", + schema indicating value "https://localhost:443/restconf/data/modules/ietf-yang-types/2013-07-15", + namespace indicating value "urn:ietf:params:xml:ns:yang:ietf-yang-types", + conformance_type indicating value "implement";;;;;; + to the TEST_SYSTEM entity + } + } + } + + Test Purpose { + TP Id TP_mWT_PNC_RESTCONF_GET_BV_03 + + Test objective + "Verify that the IUT provides the list of supported mWT GS 024 YANG data models." + + Reference + "ETSI GS mWT 024 Clause 5.2.2.2 Common YANG data models", + "ETSI GS mWT 024 Clause 5.2.2.3 YANG Data Models at the Microwave MPI", + "ETSI GS mWT 024 Clause 5.2.2.4 Hierarchical relationship among YANG data models" + + Config Id Config_mWT_2 + + PICS Selection IUT_PNC and RESTCONF and SEC_TLS + + Initial conditions with { + the IUT entity is idle + } + + Expected behaviour + ensure that { + when { + the IUT entity receives a vRequestGet containing + uri indicating value "/restconf/data/ietf-yang-library:modules-state"; + from the TEST_SYSTEM entity + } then { + the IUT entity sends a r200 containing + body containing + modules_state containing + modules containing + entry containing + name_ indicating value "ietf-microwave-topology", + revision indicating value "2021-10-12", + schema indicating value "draft-ietf-ccamp-mw-topo-yang-02", + namespace indicating value "", + conformance_type indicating value "implement";, + entry containing + name_ indicating value "ietf-eth-te-topology", + revision indicating value "2019-11-18", + schema indicating value "draft-ietf-ccamp-eth-client-te-topo-yang-01", + namespace indicating value "", + conformance_type indicating value "implement";, + entry containing + name_ indicating value "idraft-ietf-ccamp-client-signal-yang-06", + revision indicating value "", + schema indicating value "draft-ietf-ccamp-client-signal-yang-06", + namespace indicating value "", + conformance_type indicating value "";;;;; + to the TEST_SYSTEM entity + } + } + } + + } // End of Group Group "RESTCONF" + + Group "Blackbox" { + + Group "MWTopology" { + + import all from mWT_Common; + + Test Purpose { + TP Id TP_mWT_PNC_MW_TOPO_GET_BV_01 + + Test objective + "Verify that the IUT provides the MW network topology for all networks with mandatory mWT GC 024 data elements subset - black box abstraction level." + + Reference + "ETSI GS mWT 024 Annex A.2.2", + "RFC 8345 A YANG Data Model for Network Topologies", + "RFC 8795 YANG Data Model for Traffic Engineering (TE) Topologies", + "draft-ietf-ccamp-mw-topo-yang-02 A YANG Data Model for Microwave Topology" + + Config Id Config_mWT_2 + + PICS Selection IUT_PNC and RESTCONF and SEC_TLS and ABSTRACT_BB and MW_TOPO + + Initial conditions with { + the IUT entity is idle and + the IUT entity having discovered several MW ethernet networks topologies + } + + Expected behaviour + ensure that { + when { + the IUT entity receives a vRequestGet containing + uri indicating value "/restconf/data/ietf-microwave-topology/networks"; + from the TEST_SYSTEM entity + } then { + the IUT entity sends a r200 containing + headers containing + content_type indicating value "application/yang-data+xml";, + body containing + networks containing + networksList containing + name_ indicating value any_value, + networks containing + + network_id indicating value any_value, + network_types containing + te_topology indicating value any_value + mw_topology containing + ;, + node_id indicating value any_value, + termination_points indicating value any_value, + links indicating value any_value + ;;;;; + to the TEST_SYSTEM entity + } + } + } + + Test Purpose { + TP Id TP_mWT_PNC_MW_TOPO_GET_BV_02 + + Test objective + "Verify that the IUT provides the ethernet network topology for a specific network with mandatory mWT GC 024 data elements subset - black box abstraction level." + + Reference + "ETSI GS mWT 024 Annex A.1.2", + "RFC 8345 A YANG Data Model for Network Topologies", + "RFC 8795 YANG Data Model for Traffic Engineering (TE) Topologies" + + Config Id Config_mWT_2 + + PICS Selection IUT_MDSC and ABSTRACT_BB and MW_TOPO + + Initial conditions with { + the IUT entity is idle and + the IUT entity having discovered a network topology NET_TOPO + } + + Expected behaviour + ensure that { + when { + the IUT entity receives a vRequestGet containing + uri indicating value "/restconf/data/ietf-network:networks/network={NETWORK_ID)"; + from the TEST_SYSTEM entity + } then { + the IUT entity sends a r200 containing + headers containing + content_type indicating value "application/yang-data+xml";, + body containing + networks containing + network_id indicating value NETWORK_ID, + network_types containing + te_topology indicating value any_value;, + node_id indicating value any_value, + termination_points indicating value any_value, + links indicating value any_value + ;;; + to the TEST_SYSTEM entity + } + } + } + + } // End of Group "MWTopology" + + } // End of Group "Blackbox" + + Group "PartiallyTransparent" { + + } // End of Group "PartiallyTransparent" + + } // End of Group "pnc" + +} // End of Package AtsMDSC \ No newline at end of file diff --git a/test-purposes/ietf_inet_types.tplan2 b/test-purposes/ietf_inet_types.tplan2 new file mode 100644 index 0000000..c650485 --- /dev/null +++ b/test-purposes/ietf_inet_types.tplan2 @@ -0,0 +1,25 @@ +// RFC xxx +Package ietf_inet_types { + + Data { + + // RFC xxx + type ip_version; // InetVersion (INET_ADDRESS_MIB) + type dscp; // Dscp (DIFFSERV_DSCP_TC) + type ipv6_flow_label; // IPv6FlowLabel (IPV6_FLOW_LABEL_MIB) + type port_number; // InetPortNumber (INET_ADDRESS_MIB) + type ip_address; + type ipv4_address; + type ipv6_address; + type ip_address_no_zone; + type ipv4_address_no_zone; + type ipv6_address_no_zone; + type ip_prefix; + type ipv4_prefix; + type ipv6_prefix; + type domain_name; + type host; + type uri; + } + +} \ No newline at end of file diff --git a/test-purposes/ietf_microwave_topology.tplan2 b/test-purposes/ietf_microwave_topology.tplan2 new file mode 100644 index 0000000..c277f91 --- /dev/null +++ b/test-purposes/ietf_microwave_topology.tplan2 @@ -0,0 +1,8 @@ +// RFC 8561 +Package ietf_microwave_topology { // mwt + + Data { + type Mw_Topology; + } + +} \ No newline at end of file diff --git a/test-purposes/ietf_networks_topology.tplan2 b/test-purposes/ietf_networks_topology.tplan2 new file mode 100644 index 0000000..5eaef95 --- /dev/null +++ b/test-purposes/ietf_networks_topology.tplan2 @@ -0,0 +1,56 @@ +// RFC 8345 +Package ietf_networks_topology { // nt + + import all from ietf_yang_types; + import all from ietf_inet_types; + import all from ietf_te_types; + import all from ietf_yang_library; + + import all from ietf_microwave_topology; + import all from ietf_te_topology; + + Data { + + // RFC 8345 Clause 4.1. Base Network Model + type Networks with // ietf-network + networksList of type NetworksList + ; + + type NetworksList; // FIXME Collection of Network + + type Network with + network_id of type uri, + network_types of type NetworkTypes, + supporting_network of type SupportingNetworkList + ; + + type NetworkTypes with + optional te_topology of type Te_Topology, + optional mw_topology of type Mw_Topology + ; + + type NodesList; // FIXME Collection of Node + + type Node with + node_id of type string, + termination_point of type TerminationPointList + ; + + + + + + type SupportingNetworkList; // FIXME Collection of SupportingNetwork + + type SupportingNetwork with + network_ref of type uri // /nw:networks/nw:network/nw:network-id + ; + + type SupportingNodeList with + network_ref of type string // /networks/network/network-id + ; + + // String declaration + string "/restconf/data/ietf-network/networks"; + } +} \ No newline at end of file diff --git a/test-purposes/ietf_te_topology.tplan2 b/test-purposes/ietf_te_topology.tplan2 new file mode 100644 index 0000000..0edeae0 --- /dev/null +++ b/test-purposes/ietf_te_topology.tplan2 @@ -0,0 +1,29 @@ +// RFC 8795 +Package ietf_te_topology { // tet + + import all from ietf_yang_types; + import all from ietf_inet_types; + import all from ietf_te_types; + import all from ietf_yang_library; + + Data { + type TerminationPointList; // FIXME Collection of TerminationPoint + + type TerminationPoint with + tp_id of type uri, // /nw:networks/nw:network/nw:network-id + SupportingTerminationPoint of type SupportingTerminationPointList, + te of type Te + ; + + type SupportingTerminationPointList; // FIXME Collection of SupportingTermination + + type SupportingTerminationPoint with + network_ref of type uri, + node_ref of type uri, + tp_ref of type uri + ; + + type Te_Topology; + } + +} \ No newline at end of file diff --git a/test-purposes/ietf_te_types.tplan2 b/test-purposes/ietf_te_types.tplan2 new file mode 100644 index 0000000..2b44d03 --- /dev/null +++ b/test-purposes/ietf_te_types.tplan2 @@ -0,0 +1,9 @@ +// RFC 8776 +Package ietf_te_types { + + Data { + type te_common_status; + type te_admin_status; + } + +} \ No newline at end of file diff --git a/test-purposes/ietf_yang_data_base.tplan2 b/test-purposes/ietf_yang_data_base.tplan2 new file mode 100644 index 0000000..a22542b --- /dev/null +++ b/test-purposes/ietf_yang_data_base.tplan2 @@ -0,0 +1,27 @@ +// RFC 6991 +Package ietf_yang_types { + + Data { + + // RFC 6991 Clause 2 Overview + type Counter32; // (SNMPv2-SMI) + type ZeroBasedCounter32; // (RMON2-MIB) + type Counter64; //(SNMPv2-SMI) + type ZeroBasedCounter64; // (HCNUM-TC) + type Gauge32; // (SNMPv2-SMI) + type CounterBasedGauge64; // (HCNUM-TC) + type OID; + type OID128; + type YangIdentifier; + type DateAndTime; + type TimeTicks; // (SNMPv2-SMI) + type TimeStamp; // (SNMPv2-TC) + type PhysAddress; // (SNMPv2-TC) + type MacAddress; // (SNMPv2-TC) + type XPath1_0; + type HexString; + type UUID; + type DottedQuad; + } + +} \ No newline at end of file diff --git a/test-purposes/ietf_yang_library.tplan2 b/test-purposes/ietf_yang_library.tplan2 new file mode 100644 index 0000000..fd0b724 --- /dev/null +++ b/test-purposes/ietf_yang_library.tplan2 @@ -0,0 +1,32 @@ +// RFC 8525 +Package ietf_yang_library { + + import all from ietf_yang_types; + import all from ietf_inet_types; + + Data { + type string; + type json; + type integer; + type boolean; + + type ModulesState with + name_ of type string, + modules of type ModuleList + ; + + type ModuleList with + name_ of type string, + revision of type string, + schema of type uri, + namespace of type uri, + conformance_type of type string + ; + + // String declaration + string "application/yang-data+xml"; + + string "/restconf/data/ietf-yang-library:modules-state"; + } + +} \ No newline at end of file diff --git a/test-purposes/mWT_Common.tplan2 b/test-purposes/mWT_Common.tplan2 new file mode 100644 index 0000000..5eac748 --- /dev/null +++ b/test-purposes/mWT_Common.tplan2 @@ -0,0 +1,127 @@ +Package mWT_Common { + + import all from ietf_yang_library; + import all from ietf_networks; + + Domain { + pics: + - IUT_MDSC // ETSI GS mWT 0029-1 Table A.1.1 + - IUT_PNC // ETSI GS mWT 0029-1 Table A.1.1 + - RESTCONF // ETSI GS mWT 0029-1 Table A.2.1 + - ABSTRACT_BB // ETSI GS mWT 0029-1 Table A.3.1 + - MW_TOPO // ETSI GS mWT 0029-1 Table A.4.1 + - ETH_TOPO // ETSI GS mWT 0029-1 Table A.4.2 + - BWPs_LOCALLY // ETSI GS mWT 0029-1 Table A.5.1 + - BWPs_GLOBALLY // ETSI GS mWT 0029-1 Table A.5.2 + - SEC_TLS // ETSI GS mWT 0029-1 Table Table A.6 + ; + + entities: + - IUT // IUT entity + - TEST_SYSTEM // Test System entity + ; + + events: + - idle // The IUT is ready to serve request + - discovered // The IUT has discovered available network topologies + - send + - sends + - receives + ; + + } + + Data { + type string; + type json; + type integer; + type boolean; + + type HttpMessage with + optional request of type HttpRequest, + optional response of type HttpResponse + ; + + type HttpRequest with + method of type string, + uri of type string, + version_major of type integer, + version_minor of type integer, + headers of type HttpHeaders, + optional body of type json + ; + + type HttpResponse with + version_major of type integer, + version_minor of type integer, + statuscode of type integer, + statustext of type string, + headers of type HttpHeaders, + optional body of type body_restconf, + optional tls of type boolean, + optional mutual_tls of type boolean + ; + + type HttpHeaders with + content_type of type string, + accept of type string, + authorization of type string + // TODO Add missing ones + ; + + type body_restconf with + optional modules_state of type ModulesState, + optional networks of type Networks + ; + + HttpHeaders vHeadersGet containing + content_type set to "application/yang-data+xml", + accept set to "application/yang-data+xml", + authorization set to VALID_TOKEN + ; + + HttpRequest vRequestGet containing + method set to "GET", + uri set to "/", + version_major set to 1, + version_minor set to 1, + headers set to vHeadersGet + ; + + + + // String declaration + string "GET"; + string "application/yang-data+xml"; + string "application/yang-data+xml"; + string VALID_TOKEN; + // URIs declarations + string "/"; + // Integer declaration + integer 1; + + + } + + Configuration { + + Interface Type HttpPort accepts HttpMessage; + + Component Type MDSCComponent with gate httpPort of type HttpPort; + Component Type PNCComponent with gate httpPort of type HttpPort; + + Test Configuration Config_mWT_1 containing + Tester component TEST_SYSTEM of type PNCComponent + SUT component IUT of type MDSCComponent + connection between TEST_SYSTEM.httpPort and IUT.httpPort + ; + + Test Configuration Config_mWT_2 containing + Tester component TEST_SYSTEM of type MDSCComponent + SUT component IUT of type PNCComponent + connection between TEST_SYSTEM.httpPort and IUT.httpPort + ; + + } + +} // End of Package mWT_Common \ No newline at end of file -- GitLab From 563266a4f7a5010ec0367c379ceda9976f33773d Mon Sep 17 00:00:00 2001 From: garciay Date: Tue, 12 Mar 2024 09:12:20 +0100 Subject: [PATCH 02/15] Fix reference issues --- Reference.txt | 13 ----- test-purposes/AtsMDSC.tplan2 | 57 ++++++++++++++++++-- test-purposes/ietf_microwave_topology.tplan2 | 1 + test-purposes/ietf_networks_topology.tplan2 | 18 ++++--- test-purposes/ietf_te_topology.tplan2 | 25 +++++++-- test-purposes/ietf_te_types.tplan2 | 5 +- test-purposes/ietf_yang_library.tplan2 | 1 + test-purposes/mWT_Common.tplan2 | 2 +- 8 files changed, 93 insertions(+), 29 deletions(-) delete mode 100644 Reference.txt diff --git a/Reference.txt b/Reference.txt deleted file mode 100644 index 8d5e3bc..0000000 --- a/Reference.txt +++ /dev/null @@ -1,13 +0,0 @@ - +==========+=========================+===============================+ - | Prefix | YANG Module | Reference | - +==========+=========================+===============================+ - | mwt | ietf-microwave-topology | draft-ietf-ccamp-mw-topo-yang | - +----------+-------------------------+-------------------------------+ - | nw | ietf-network | [RFC8345] | - +----------+-------------------------+-------------------------------+ - | nt | ietf-network-topology | [RFC8345] | - +----------+-------------------------+-------------------------------+ - | mw-types | ietf-microwave-types | [RFC8561] | - +----------+-------------------------+-------------------------------+ - | tet | ietf-te-topology | [RFC8795] | - +----------+-------------------------+-------------------------------+ \ No newline at end of file diff --git a/test-purposes/AtsMDSC.tplan2 b/test-purposes/AtsMDSC.tplan2 index c68b4ec..a709c1a 100644 --- a/test-purposes/AtsMDSC.tplan2 +++ b/test-purposes/AtsMDSC.tplan2 @@ -324,12 +324,11 @@ Package AtsMDSC { networksList containing name_ indicating value any_value, networks containing - network_id indicating value any_value, network_types containing - te_topology indicating value any_value - mw_topology containing - ;, + te_topology containing + mw_topology indicating value any_value + ;;, node_id indicating value any_value, termination_points indicating value any_value, links indicating value any_value @@ -383,6 +382,56 @@ Package AtsMDSC { } } + Test Purpose { + TP Id TP_mWT_PNC_MW_NODE_GET_BV_01 + + Test objective + "Verify that the IUT provides the MW network nodes for a networks with mandatory mWT GC 024 data elements subset - black box abstraction level." + + Reference + "ETSI GS mWT 024 Annex A.2.2", + "RFC 8345 A YANG Data Model for Network Topologies", + "RFC 8795 YANG Data Model for Traffic Engineering (TE) Topologies", + "draft-ietf-ccamp-mw-topo-yang-02 A YANG Data Model for Microwave Topology" + + Config Id Config_mWT_2 + + PICS Selection IUT_PNC and RESTCONF and SEC_TLS and ABSTRACT_BB and MW_TOPO + + Initial conditions with { + the IUT entity is idle and + the IUT entity having discovered several MW ethernet networks topologies + } + + Expected behaviour + ensure that { + when { + the IUT entity receives a vRequestGet containing + uri indicating value "/restconf/data/ietf-microwave-topology/networks/network/node"; + from the TEST_SYSTEM entity + } then { + the IUT entity sends a r200 containing + headers containing + content_type indicating value "application/yang-data+xml";, + body containing + networks containing + networksList containing + name_ indicating value any_value, + networks containing + network_id indicating value any_value, + network_types containing + te_topology containing + mw_topology indicating value any_value + ;;, + node_id indicating value any_value, + termination_points indicating value any_value, + links indicating value any_value + ;;;;; + to the TEST_SYSTEM entity + } + } + } + } // End of Group "MWTopology" } // End of Group "Blackbox" diff --git a/test-purposes/ietf_microwave_topology.tplan2 b/test-purposes/ietf_microwave_topology.tplan2 index c277f91..53f65ab 100644 --- a/test-purposes/ietf_microwave_topology.tplan2 +++ b/test-purposes/ietf_microwave_topology.tplan2 @@ -3,6 +3,7 @@ Package ietf_microwave_topology { // mwt Data { type Mw_Topology; + type MwTp; } } \ No newline at end of file diff --git a/test-purposes/ietf_networks_topology.tplan2 b/test-purposes/ietf_networks_topology.tplan2 index 5eaef95..4307ef5 100644 --- a/test-purposes/ietf_networks_topology.tplan2 +++ b/test-purposes/ietf_networks_topology.tplan2 @@ -32,13 +32,14 @@ Package ietf_networks_topology { // nt type NodesList; // FIXME Collection of Node type Node with - node_id of type string, - termination_point of type TerminationPointList + node_id of type uri, + supported_node of type SupportingNetworkList ; - - - + type Node with + node_id of type uri, + termination_point of type TerminationPointList + ; type SupportingNetworkList; // FIXME Collection of SupportingNetwork @@ -46,8 +47,11 @@ Package ietf_networks_topology { // nt network_ref of type uri // /nw:networks/nw:network/nw:network-id ; - type SupportingNodeList with - network_ref of type string // /networks/network/network-id + type SupportingNodeList; // FIXME Collection of SupportingNode + + type SupportingNode with + network_ref of type uri, // /networks/network/network-id + node_id of type uri // /networks/network/node/node-id ; // String declaration diff --git a/test-purposes/ietf_te_topology.tplan2 b/test-purposes/ietf_te_topology.tplan2 index 0edeae0..9ed3db3 100644 --- a/test-purposes/ietf_te_topology.tplan2 +++ b/test-purposes/ietf_te_topology.tplan2 @@ -6,13 +6,18 @@ Package ietf_te_topology { // tet import all from ietf_te_types; import all from ietf_yang_library; + import all from ietf_microwave_topology; + + import all from ietf_geop_json; + Data { type TerminationPointList; // FIXME Collection of TerminationPoint type TerminationPoint with - tp_id of type uri, // /nw:networks/nw:network/nw:network-id - SupportingTerminationPoint of type SupportingTerminationPointList, - te of type Te + tp_id of type uri, // /nw:networks/nw:network/nw:network-id + supporting_termination_point of type SupportingTerminationPointList, + te_tp_id of type TeTpId, //te-types:te-tp-id + te of type Te // ; type SupportingTerminationPointList; // FIXME Collection of SupportingTermination @@ -23,6 +28,20 @@ Package ietf_te_topology { // tet tp_ref of type uri ; + type TeTpId; + + type Te with + name_ of type string, + optional geolocation of type Geolocation, + mw_tp of type MwTp // Cyclic import with ietf_microwave_topology + ; + + type Geolocation with + optional altitude of type int64, + optional latitude of type GeographicCoordinateDegree, + optional longitude of type GeographicCoordinateDegree + ; + type Te_Topology; } diff --git a/test-purposes/ietf_te_types.tplan2 b/test-purposes/ietf_te_types.tplan2 index 2b44d03..36feea4 100644 --- a/test-purposes/ietf_te_types.tplan2 +++ b/test-purposes/ietf_te_types.tplan2 @@ -1,9 +1,12 @@ // RFC 8776 -Package ietf_te_types { +Package ietf_te_types { // te + + import all from ietf_yang_library; Data { type te_common_status; type te_admin_status; + } } \ No newline at end of file diff --git a/test-purposes/ietf_yang_library.tplan2 b/test-purposes/ietf_yang_library.tplan2 index fd0b724..1f3c440 100644 --- a/test-purposes/ietf_yang_library.tplan2 +++ b/test-purposes/ietf_yang_library.tplan2 @@ -8,6 +8,7 @@ Package ietf_yang_library { type string; type json; type integer; + type int64; type boolean; type ModulesState with diff --git a/test-purposes/mWT_Common.tplan2 b/test-purposes/mWT_Common.tplan2 index 5eac748..89610dc 100644 --- a/test-purposes/mWT_Common.tplan2 +++ b/test-purposes/mWT_Common.tplan2 @@ -1,7 +1,7 @@ Package mWT_Common { import all from ietf_yang_library; - import all from ietf_networks; + import all from ietf_networks_topology; Domain { pics: -- GitLab From 864b68baceefba456b0eb540450af3ad2b25b8c4 Mon Sep 17 00:00:00 2001 From: garciay Date: Tue, 12 Mar 2024 10:33:40 +0100 Subject: [PATCH 03/15] Fix reference issues --- test-purposes/Reference.txt | 23 +++++++++++++++++++++++ test-purposes/ietf_geo_json.tplan2 | 9 +++++++++ 2 files changed, 32 insertions(+) create mode 100644 test-purposes/Reference.txt create mode 100644 test-purposes/ietf_geo_json.tplan2 diff --git a/test-purposes/Reference.txt b/test-purposes/Reference.txt new file mode 100644 index 0000000..d9022a4 --- /dev/null +++ b/test-purposes/Reference.txt @@ -0,0 +1,23 @@ + +==========+=========================+===============================+ + | Prefix | YANG Module | Reference | + +==========+=========================+===============================+ + | yang | ietf-[yang|inet]-types | [RFC6991] | + +----------+-------------------------+-------------------------------+ + | mwt | ietf-microwave-topology | draft-ietf-ccamp-mw-topo-yang | + +----------+-------------------------+-------------------------------+ + | nw | ietf-network | [RFC8345] | + +----------+-------------------------+-------------------------------+ + | nt | ietf-network-topology | [RFC8345] | + +----------+-------------------------+-------------------------------+ + | mw-types | ietf-microwave-types | [RFC8561] | + +----------+-------------------------+-------------------------------+ + | te | ietf-te-type | [RFC8776] | + +----------+-------------------------+-------------------------------+ + | tet | ietf-te-topology | [RFC8795] | + +----------+-------------------------+-------------------------------+ + | | geo-json | [RFC7946] | + +----------+-------------------------+-------------------------------+ + + + + \ No newline at end of file diff --git a/test-purposes/ietf_geo_json.tplan2 b/test-purposes/ietf_geo_json.tplan2 new file mode 100644 index 0000000..b71da5e --- /dev/null +++ b/test-purposes/ietf_geo_json.tplan2 @@ -0,0 +1,9 @@ +// RFC 8525 +Package ietf_geop_json { + + Data { + type GeographicCoordinateDegree; + + } + +} \ No newline at end of file -- GitLab From 79f2087e7c2a39725b93e9e0e47a3068683a92cf Mon Sep 17 00:00:00 2001 From: garciay Date: Tue, 12 Mar 2024 10:52:43 +0100 Subject: [PATCH 04/15] Create group for both MW and ETH --- test-purposes/AtsMDSC.tplan2 | 156 ++++++++++++++++++++++++++++++++++- test-purposes/Reference.txt | 2 +- 2 files changed, 154 insertions(+), 4 deletions(-) diff --git a/test-purposes/AtsMDSC.tplan2 b/test-purposes/AtsMDSC.tplan2 index a709c1a..92023c0 100644 --- a/test-purposes/AtsMDSC.tplan2 +++ b/test-purposes/AtsMDSC.tplan2 @@ -342,7 +342,7 @@ Package AtsMDSC { TP Id TP_mWT_PNC_MW_TOPO_GET_BV_02 Test objective - "Verify that the IUT provides the ethernet network topology for a specific network with mandatory mWT GC 024 data elements subset - black box abstraction level." + "Verify that the IUT provides the MW network topology for a specific network with mandatory mWT GC 024 data elements subset - black box abstraction level." Reference "ETSI GS mWT 024 Annex A.1.2", @@ -362,7 +362,7 @@ Package AtsMDSC { ensure that { when { the IUT entity receives a vRequestGet containing - uri indicating value "/restconf/data/ietf-network:networks/network={NETWORK_ID)"; + uri indicating value "/restconf/data/ietf-microwave-topology/networks/network={NETWORK_ID)"; from the TEST_SYSTEM entity } then { the IUT entity sends a r200 containing @@ -407,7 +407,7 @@ Package AtsMDSC { ensure that { when { the IUT entity receives a vRequestGet containing - uri indicating value "/restconf/data/ietf-microwave-topology/networks/network/node"; + uri indicating value "/restconf/data/ietf-microwave-topology/networks/network={NETWORK_ID)/node"; from the TEST_SYSTEM entity } then { the IUT entity sends a r200 containing @@ -434,6 +434,156 @@ Package AtsMDSC { } // End of Group "MWTopology" + Group "EthernetTopology" { + + import all from mWT_Common; + + Test Purpose { + TP Id TP_mWT_PNC_ETH_TOPO_GET_BV_01 + + Test objective + "Verify that the IUT provides the Ethernet network topology for all networks with mandatory mWT GC 024 data elements subset - black box abstraction level." + + Reference + "ETSI GS mWT 024 Annex A.2.2", + "RFC 8345 A YANG Data Model for Network Topologies", + "RFC 8795 YANG Data Model for Traffic Engineering (TE) Topologies", + "draft-ietf-ccamp-mw-topo-yang-02 A YANG Data Model for Microwave Topology" + + Config Id Config_mWT_2 + + PICS Selection IUT_PNC and RESTCONF and SEC_TLS and ABSTRACT_BB and MW_TOPO + + Initial conditions with { + the IUT entity is idle and + the IUT entity having discovered several MW ethernet networks topologies + } + + Expected behaviour + ensure that { + when { + the IUT entity receives a vRequestGet containing + uri indicating value "/restconf/data/networks"; + from the TEST_SYSTEM entity + } then { + the IUT entity sends a r200 containing + headers containing + content_type indicating value "application/yang-data+xml";, + body containing + networks containing + networksList containing + name_ indicating value any_value, + networks containing + network_id indicating value any_value, + network_types containing + te_topology containing + mw_topology indicating value any_value + ;;, + node_id indicating value any_value, + termination_points indicating value any_value, + links indicating value any_value + ;;;;; + to the TEST_SYSTEM entity + } + } + } + + Test Purpose { + TP Id TP_mWT_PNC_ETH_TOPO_GET_BV_02 + + Test objective + "Verify that the IUT provides the Ethernet network topology for a specific network with mandatory mWT GC 024 data elements subset - black box abstraction level." + + Reference + "ETSI GS mWT 024 Annex A.1.2", + "RFC 8345 A YANG Data Model for Network Topologies", + "RFC 8795 YANG Data Model for Traffic Engineering (TE) Topologies" + + Config Id Config_mWT_2 + + PICS Selection IUT_MDSC and ABSTRACT_BB and MW_TOPO + + Initial conditions with { + the IUT entity is idle and + the IUT entity having discovered a network topology NET_TOPO + } + + Expected behaviour + ensure that { + when { + the IUT entity receives a vRequestGet containing + uri indicating value "/restconf/data/networks/network={NETWORK_ID)"; + from the TEST_SYSTEM entity + } then { + the IUT entity sends a r200 containing + headers containing + content_type indicating value "application/yang-data+xml";, + body containing + networks containing + network_id indicating value NETWORK_ID, + network_types containing + te_topology indicating value any_value;, + node_id indicating value any_value, + termination_points indicating value any_value, + links indicating value any_value + ;;; + to the TEST_SYSTEM entity + } + } + } + + Test Purpose { + TP Id TP_mWT_PNC_ETH_NODE_GET_BV_01 + + Test objective + "Verify that the IUT provides the Ethernet network nodes for a networks with mandatory mWT GC 024 data elements subset - black box abstraction level." + + Reference + "ETSI GS mWT 024 Annex A.2.2", + "RFC 8345 A YANG Data Model for Network Topologies", + "RFC 8795 YANG Data Model for Traffic Engineering (TE) Topologies", + "draft-ietf-ccamp-mw-topo-yang-02 A YANG Data Model for Microwave Topology" + + Config Id Config_mWT_2 + + PICS Selection IUT_PNC and RESTCONF and SEC_TLS and ABSTRACT_BB and MW_TOPO + + Initial conditions with { + the IUT entity is idle and + the IUT entity having discovered several MW ethernet networks topologies + } + + Expected behaviour + ensure that { + when { + the IUT entity receives a vRequestGet containing + uri indicating value "/restconf/data/networks/network={NETWORK_ID)/node"; + from the TEST_SYSTEM entity + } then { + the IUT entity sends a r200 containing + headers containing + content_type indicating value "application/yang-data+xml";, + body containing + networks containing + networksList containing + name_ indicating value any_value, + networks containing + network_id indicating value any_value, + network_types containing + te_topology containing + mw_topology indicating value any_value + ;;, + node_id indicating value any_value, + termination_points indicating value any_value, + links indicating value any_value + ;;;;; + to the TEST_SYSTEM entity + } + } + } + + } // End of Group "EthernetTopology" + } // End of Group "Blackbox" Group "PartiallyTransparent" { diff --git a/test-purposes/Reference.txt b/test-purposes/Reference.txt index d9022a4..2137b1f 100644 --- a/test-purposes/Reference.txt +++ b/test-purposes/Reference.txt @@ -1,5 +1,5 @@ +==========+=========================+===============================+ - | Prefix | YANG Module | Reference | + | Prefix | YANG Module | References | +==========+=========================+===============================+ | yang | ietf-[yang|inet]-types | [RFC6991] | +----------+-------------------------+-------------------------------+ -- GitLab From 88be24cd55c9486d60c48b347dd86dd34933e187 Mon Sep 17 00:00:00 2001 From: garciay Date: Fri, 12 Apr 2024 10:54:06 +0200 Subject: [PATCH 05/15] Add TDL project --- README.md | 0 install.sh | 0 tdl/.project | 17 ++ .../org.etsi.mts.tdl.execution.java-1.0.0.jar | Bin 0 -> 58588 bytes tdl/src/tdl/AtsPNC_TCs.tdltx | 87 +++++++++ tdl/src/tdl/AtsPNC_TPs.tdltx | 175 ++++++++++++++++++ tdl/src/tdl/HTTP.tdltx | 127 +++++++++++++ tdl/src/tdl/HttpJavaMappings.tdltx | 58 ++++++ tdl/src/tdl/Java.tdltx | 56 ++++++ tdl/src/tdl/Standard.tdltx | 56 ++++++ tdl/src/tdl/TdlRuntime.tdltx | 3 + tdl/src/tdl/ietf_networks.tdltx | 21 +++ tdl/src/tdl/ietf_yang_library.tdltx | 46 +++++ tdl/src/tdl/mWT_Common.tdltx | 94 ++++++++++ 14 files changed, 740 insertions(+) create mode 100644 README.md create mode 100755 install.sh create mode 100644 tdl/.project create mode 100644 tdl/src/lib/org.etsi.mts.tdl.execution.java-1.0.0.jar create mode 100644 tdl/src/tdl/AtsPNC_TCs.tdltx create mode 100644 tdl/src/tdl/AtsPNC_TPs.tdltx create mode 100644 tdl/src/tdl/HTTP.tdltx create mode 100644 tdl/src/tdl/HttpJavaMappings.tdltx create mode 100644 tdl/src/tdl/Java.tdltx create mode 100644 tdl/src/tdl/Standard.tdltx create mode 100644 tdl/src/tdl/TdlRuntime.tdltx create mode 100644 tdl/src/tdl/ietf_networks.tdltx create mode 100644 tdl/src/tdl/ietf_yang_library.tdltx create mode 100644 tdl/src/tdl/mWT_Common.tdltx diff --git a/README.md b/README.md new file mode 100644 index 0000000..e69de29 diff --git a/install.sh b/install.sh new file mode 100755 index 0000000..e69de29 diff --git a/tdl/.project b/tdl/.project new file mode 100644 index 0000000..507451c --- /dev/null +++ b/tdl/.project @@ -0,0 +1,17 @@ + + + TTF T029 Ext + + + + + + org.eclipse.xtext.ui.shared.xtextBuilder + + + + + + org.eclipse.xtext.ui.shared.xtextNature + + diff --git a/tdl/src/lib/org.etsi.mts.tdl.execution.java-1.0.0.jar b/tdl/src/lib/org.etsi.mts.tdl.execution.java-1.0.0.jar new file mode 100644 index 0000000000000000000000000000000000000000..d7c31c8cdfd963232c54908f5cf8b57bf89fbcd3 GIT binary patch literal 58588 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 if using timers + timeout on TEST_SYSTEM::receiveTimer + set verdict to inconclusive + } // End of 'alternate' statement + } + + Objective: TO_mWT_PNC_RESTCONF_GET_BV_02 + @Test Purpose Description + @PICS_IUT_PNC and PICS_RESTCONF and PICS_SEC_TLS + Test Description TC_mWT_PNC_RESTCONF_GET_BV_02 uses Config_mWT_2 { + IUT receives vRequestGet(uri="/restconf/data/ietf-yang-library:modules-state") + from TEST_SYSTEM + start TEST_SYSTEM::receiveTimer for default_recv_timeout + alternatively { + IUT sends r200 to TEST_SYSTEM + body = ( + modules_state = ( + name_ = "ietf-yang-library:modules-state", + modules = ( // A list of items + ( + name_ = "ietf-datastores", + revision = ?, + schema = ?, + namespace = ?, + conformance_type = ? + ), + ( + name_ = "ietf-inet-types", + revision = ?, + schema = ?, + namespace = ?, + conformance_type = ? + ) + // FIXME list of item + ))) + set verdict to pass + } or { + IUT sends vErrorResponse to TEST_SYSTEM + set verdict to fail + } or { + // Timeout -> if using timers + timeout on TEST_SYSTEM::receiveTimer + set verdict to inconclusive + } // End of 'alternate' statement + } + +} // End of Package AtsPNC_TCs \ No newline at end of file diff --git a/tdl/src/tdl/AtsPNC_TPs.tdltx b/tdl/src/tdl/AtsPNC_TPs.tdltx new file mode 100644 index 0000000..8b39757 --- /dev/null +++ b/tdl/src/tdl/AtsPNC_TPs.tdltx @@ -0,0 +1,175 @@ +Package AtsPNC_TPs { + Import all from Standard + Import all from HTTP + Import all from HTTP.MessageBased + Import all from ietf_yang_library + Import all from ietf_networks + Import all from mWT_Common + Import all from mWT_Common.Data + + Boolean IUT_PNC + Boolean RESTCONF + Boolean SEC_TLS + + Objective TO_mWT_PNC_RESTCONF_GET_BV_01 { + Description: "Verify that the IUT supports RESTCONF API request" + References: "ETSI GS mWT 024 Clause 5.2.1 RESTCONF Protocol", + "RFC 8040 RESTCONF Protocol", + "RFC 8525 YANG Library" + } + + Test Purpose Description TP_mWT_PNC_RESTCONF_GET_BV_01 { + Objective: TO_mWT_PNC_RESTCONF_GET_BV_01 + Configuration: Config_mWT_2 + PICS: { IUT_PNC and { RESTCONF and SEC_TLS } } + Initial conditions with { + the IUT entity is idle + } + Expected behaviour + ensure that { + when { + the IUT entity receives a vRequestGet containing + uri indicating value "/restconf/data/ietf-yang-library:modules-state"; + from the TEST_SYSTEM entity + } then { + the IUT entity sends a r200 containing + headers containing + content_type indicating value "application/yang-data+xml";, + body containing + modules_state containing + name_ indicating value "ietf-yang-library:modules-state", + modules containing + non empty list;;;; // FIXME How to express it + to the TEST_SYSTEM entity + } + } + } + + Objective TO_mWT_PNC_RESTCONF_GET_BV_02 { + Description: "Verify that the IUT supports the basic YANG data models" + References: "ETSI GS mWT 024 Clause 5.2.2.1 YANG Version" + } + + Test Purpose Description TP_mWT_PNC_RESTCONF_GET_BV_02 { + Objective: TO_mWT_PNC_RESTCONF_GET_BV_02 + Configuration: Config_mWT_2 + PICS: IUT_PNC and RESTCONF and SEC_TLS + Initial conditions with { + the IUT entity is idle + } + Expected behaviour + ensure that { + when { + the IUT entity receives a vRequestGet containing + uri indicating value "/restconf/data/ietf-yang-library:modules-state"; + from the TEST_SYSTEM entity + } then { + the IUT entity sends a r200 containing + headers containing + content_type indicating value "application/yang-data+xml";, + body containing + modules_state containing + name_ indicating value "ietf-yang-library:modules-state", + modules containing + entry containing + name_ indicating value "ietf-datastores", + revision indicating value "2018-02-14", + schema indicating value "https://localhost:443/restconf/data/modules/ietf-datastores/2018-02-14", + namespace indicating value "urn:ietf:params:xml:ns:yang:ietf-datastores", + conformance_type indicating value "import";, + entry containing + name_ indicating value "ietf-inet-types", + revision indicating value "2013-07-15", + schema indicating value "https://localhost:443/restconf/data/modules/ietf-inet-types/2013-07-15", + namespace indicating value "urn:ietf:params:xml:ns:yang:ietf-inet-types", + conformance_type indicating value "import";, + entry containing + name_ indicating value "ietf-interfaces", + revision indicating value "2018-02-20", + schema indicating value "https://localhost:443/restconf/data/modules/ietf-interfaces/2018-02-20", + namespace indicating value "urn:ietf:params:xml:ns:yang:ietf-interfaces", + conformance_type indicating value "import", + entry containing + name_ indicating value "ietf-ip", + revision indicating value "2018-02-22", + schema indicating value "https://localhost:443/restconf/data/modules/ietf-ip/2018-02-22", + namespace indicating value "urn:ietf:params:xml:ns:yang:ietf-ip", + conformance_type indicating value "import";, + entry containing + name_ indicating value "ietf-network-instance", + revision indicating value "2019-01-21", + schema indicating value "https://localhost:443/restconf/data/modules/ietf-network-instance/2019-01-21", + namespace indicating value "urn:ietf:params:xml:ns:yang:ietf-network-instance", + conformance_type indicating value "import";, + entry containing + name_ indicating value "ietf-restconf", + revision indicating value "2017-01-26", + schema indicating value "https://localhost:443/restconf/data/modules/ietf-restconf/2017-01-26", + namespace indicating value "urn:ietf:params:xml:ns:yang:ietf-restconf", + conformance_type indicating value "implement";, + entry containing + name_ indicating value "ietf-yang-types", + revision indicating value "2013-07-15", + schema indicating value "https://localhost:443/restconf/data/modules/ietf-restconf/2017-01-26", + namespace indicating value "urn:ietf:params:xml:ns:yang:ietf-restconf", + conformance_type indicating value "import";, + entry containing + name_ indicating value "ietf-yang-library", + revision indicating value "2019-01-04", + schema indicating value "https://localhost:443/restconf/data/modules/ietf-yang-types/2013-07-15", + namespace indicating value "urn:ietf:params:xml:ns:yang:ietf-yang-types", + conformance_type indicating value "implement";;;;;; + to the TEST_SYSTEM entity + } + } + } + + Objective TO_mWT_PNC_RESTCONF_GET_BV_03 { + Description: "Verify that the IUT provides the list of supported mWT GS 024 YANG data models" + References: "ETSI GS mWT 024 Clause 5.2.2.2 Common YANG data models", + "ETSI GS mWT 024 Clause 5.2.2.3 YANG Data Models at the Microwave MPI", + "ETSI GS mWT 024 Clause 5.2.2.4 Hierarchical relationship among YANG data models" + } + + Test Purpose Description TP_mWT_PNC_RESTCONF_GET_BV_03 { + Objective: TO_mWT_PNC_RESTCONF_GET_BV_03 + Configuration: Config_mWT_2 + PICS: IUT_PNC and RESTCONF and SEC_TLS + Initial conditions with { + the IUT entity is idle + } + Expected behaviour + ensure that { + when { + the IUT entity receives a vRequestGet containing + uri indicating value "/restconf/data/ietf-yang-library:modules-state"; + from the TEST_SYSTEM entity + } then { + the IUT entity sends a r200 containing + body containing + modules_state containing + modules containing + entry containing + name_ indicating value "ietf-microwave-topology", + revision indicating value "2021-10-12", + schema indicating value "draft-ietf-ccamp-mw-topo-yang-02", + namespace indicating value "", + conformance_type indicating value "implement";, + entry containing + name_ indicating value "ietf-eth-te-topology", + revision indicating value "2019-11-18", + schema indicating value "draft-ietf-ccamp-eth-client-te-topo-yang-01", + namespace indicating value "", + conformance_type indicating value "implement";, + entry containing + name_ indicating value "idraft-ietf-ccamp-client-signal-yang-06", + revision indicating value "", + schema indicating value "draft-ietf-ccamp-client-signal-yang-06", + namespace indicating value "", + conformance_type indicating value "";;;;; + to the TEST_SYSTEM entity + } + } + } + +} // End of Package AtsPNC_TPs diff --git a/tdl/src/tdl/HTTP.tdltx b/tdl/src/tdl/HTTP.tdltx new file mode 100644 index 0000000..f06ce31 --- /dev/null +++ b/tdl/src/tdl/HTTP.tdltx @@ -0,0 +1,127 @@ +Package HTTP { + Package MessageBasedConfiguration { + Import all from MessageBased + Message Gate HTTPGate accepts Request,Response + Message Gate HTTPSGate accepts Request,Response + Component API { + //Add variables and timers here or define new component types and configurations + gate HTTPGate http + } + Configuration BasicClientServer { + API client as Tester, + API server as SUT, + connect client::http to server::http + } + + } Note : "Message based types and instances" + + Package MessageBased { + Import all from Standard + + //Generic Method type -> required for generation!!! + Enumerated Method { + Method GET, + Method POST, + Method PUT, + Method PATCH, + Method DELETE + } + + //Generic Request type + Structure Request ( + String uri, + optional Method method, + optional Headers headers, + optional Parameters parameters, + optional Body body + ) + + //Generic Request instances + Request GET ( ) + Request POST ( ) + Request PUT ( ) + Request PATCH ( ) + Request DELETE ( ) + + //Generic Response type + Structure Response ( + optional Integer status, + optional String statusMessage, + optional Headers headers, + optional Body body + ) + + //Generic Response instances, name = status code + + Response r200 (statusMessage = "OK") + Response r201 (statusMessage = "Created") + Response r204 (statusMessage = "No Content") + Response r400 (statusMessage = "Bad Request") + Response r401 (statusMessage = "Not Found") + Response r403 (statusMessage = "Not Authorized") + Response r404 (statusMessage = "Forbidden") + + //Generic Response instances, name = status message + Response OK (status = "200") + Response Created (status = "201") + Response NoContent (status = "204") + Response BadRequest (status = "400") + Response NotFound (status = "404") + Response NotAuthorized (status = "401") + Response Forbidden (status = "403") + + //supporting types + Collection Parameters of Parameter + Structure Parameter ( + Location location, + String ^name, + String ^value + ) + Type Location + Location path + Location query + + //may need a structure, not necessarily relevant in standardized testing + Location cookie + + //separate headers -> not necessary + //Location header; + Collection Headers of Header + Structure Header ( + String ^name, + String ^value + //not relevant in TDL? + //optional contentLength of type Integer, + //optional contentType of type String + ) + + //Base body for extension + Structure Body ( ) + + //Basic string body + Structure StringBody extends Body ( + String text + ) + + //Basic wrapper for collection responses + Structure CollectionBody extends Body ( + Bodies items + ) + + //Any body can be included + //If consistent type is needed, a custom subtype shall be defined and used + Collection Bodies of Body + + //Custom collection data instances can be defined + // - inline in the responses + // - predefined as a separate data element + //Custom collection data instances can be defined + //to enforce type consistency specific for API + + //Basic form body + Structure FormBody extends Body ( + String field, + String content + ) + } +} \ No newline at end of file diff --git a/tdl/src/tdl/HttpJavaMappings.tdltx b/tdl/src/tdl/HttpJavaMappings.tdltx new file mode 100644 index 0000000..0685641 --- /dev/null +++ b/tdl/src/tdl/HttpJavaMappings.tdltx @@ -0,0 +1,58 @@ +Package HttpJavaMappings { + Import all from Standard + Import all from Java + Import all from HTTP.MessageBased + + @JavaPackage + @MappingName : "Java" + Use "org.etsi.mts.tdl.execution.java.adapters.http" as HttpAdapter + + @JavaClass + Map Request to "HttpRequestData" in HttpAdapter as Request_Mapping { + uri -> "uri", + method -> "method", + headers -> "headers", + parameters -> "parameters", + body -> "body" + } + @JavaClass + Map Response to "HttpResponseData" in HttpAdapter as Response_Mapping { + status -> "status", + statusMessage -> "statusMessage", + headers -> "headers", + body -> "body" + } + @JavaClass + Map Header to "HttpHeader" in HttpAdapter as Header_Mapping { + ^name -> "name", + ^value -> "value" + } + @JavaClass + Map Parameter to "HttpRequestParameter" in HttpAdapter as Parameter_Mapping { + location -> "location", + ^name -> "name", + ^value -> "value" + } + @JavaClass + Map Location to "HttpParameterLocation" in HttpAdapter as Location_Mapping + + @JavaClass + @MappingName : "Java" + Use "org.etsi.mts.tdl.execution.java.adapters.http.HttpParameterLocation" as HttpParameterLocation + Map path to "path" in HttpParameterLocation as path_mapping + Map query to "query" in HttpParameterLocation as query_mapping + Map cookie to "cookie" in HttpParameterLocation as cookie_mapping + + + @JavaClass + Map Method to "HttpMethod" in HttpAdapter as Method_Mapping + + @JavaClass + @MappingName : "Java" + Use "org.etsi.mts.tdl.execution.java.adapters.http.HttpMethod" as HttpMethod + Map GET to "GET" in HttpMethod as GET_mapping + Map POST to "POST" in HttpMethod as POST_mapping + Map PUT to "PUT" in HttpMethod as PUT_mapping + Map PATCH to "PATCH" in HttpMethod as PATCH_mapping + Map DELETE to "DELETE" in HttpMethod as DELETE_mapping +} diff --git a/tdl/src/tdl/Java.tdltx b/tdl/src/tdl/Java.tdltx new file mode 100644 index 0000000..8651f4d --- /dev/null +++ b/tdl/src/tdl/Java.tdltx @@ -0,0 +1,56 @@ +Package Java { + Import all from Standard + + /* Applied to a DataResourceMapping to specify a package */ + Annotation JavaPackage + /* Applied to a DataElementMapping to specify an instance method */ + Annotation JavaMethod + /* Applied to a DataElementMapping to specify an class method */ + Annotation JavaStaticMethod + /* Applied to a DataResourceMapping or DataElementMapping to specify a class */ + Annotation JavaClass + /* Applied to a DataElementMapping to specify a field (of a class) */ + Annotation JavaField + /* Applied to a DataElementMapping to specify a static field (of a class) */ + Annotation JavaStaticField + /* Applied to a ParameterMapping to specify an instance method that returns the value of a field */ + Annotation JavaGetter + /* Applied to a ParameterMapping to specify an instance method that sets the field value */ + Annotation JavaSetter + + + @JavaPackage + @MappingName : "Java" + Use "java.lang" as JavaLang + Map Boolean to "Boolean" in JavaLang as Boolean_mapping + Map Integer to "Integer" in JavaLang as Integer_mapping + Map String to "String" in JavaLang as String_mapping + + + + @JavaPackage + @MappingName : "Java" + Use "org.etsi.mts.tdl.execution.java.tri" as Tri + + @JavaClass + Map Verdict to "Verdict" in Tri as Verdict_Mapping + + @JavaClass + @MappingName : "Java" + Use "org.etsi.mts.tdl.execution.java.tri.Verdict" as VerdictClass + Map pass to "pass" in VerdictClass as pass_mapping + Map fail to "fail" in VerdictClass as fail_mapping + Map inconclusive to "inconclusive" in VerdictClass as inconclusive_mapping + + + @JavaPackage + @MappingName : "Java" + Use "org.etsi.mts.tdl.execution.java.rt.core" as RuntimeCore + + @JavaClass + @MappingName : "Java" + Use "org.etsi.mts.tdl.execution.java.rt.core.TimeUnit" as TimeUnitClass + Map second to "Second" in TimeUnitClass as second_mapping + + +} \ No newline at end of file diff --git a/tdl/src/tdl/Standard.tdltx b/tdl/src/tdl/Standard.tdltx new file mode 100644 index 0000000..4500c30 --- /dev/null +++ b/tdl/src/tdl/Standard.tdltx @@ -0,0 +1,56 @@ +Package Standard { + //TODO: extract to standard library + Constraint length + Constraint minLength + Constraint maxLength + Constraint range + Constraint format + Constraint union + Constraint uniontype + + Type Boolean + Type Integer + Type String + Type Verdict + + //TODO: these do not work at present -> literal values take precedence? +// Boolean true +// Boolean false + Boolean True + Boolean False + + Verdict pass + Verdict fail + Verdict inconclusive + + Time second + + Annotation Master + Annotation MappingName + + //standard annotations for STO + Annotation Initial conditions + Annotation Expected behaviour + Annotation Final conditions + Annotation Test Purpose Description + Annotation when + Annotation then + + Predefined == returns Boolean + Predefined != returns Boolean + Predefined and returns Boolean + Predefined or returns Boolean + Predefined xor returns Boolean + Predefined not returns Boolean + Predefined < returns Boolean + Predefined > returns Boolean + Predefined <= returns Boolean + Predefined >= returns Boolean + Predefined + + Predefined - + Predefined * + Predefined / + Predefined mod + Predefined size returns Integer + +} \ No newline at end of file diff --git a/tdl/src/tdl/TdlRuntime.tdltx b/tdl/src/tdl/TdlRuntime.tdltx new file mode 100644 index 0000000..07cd10d --- /dev/null +++ b/tdl/src/tdl/TdlRuntime.tdltx @@ -0,0 +1,3 @@ +Package TdlRuntime { + Annotation Language +} \ No newline at end of file diff --git a/tdl/src/tdl/ietf_networks.tdltx b/tdl/src/tdl/ietf_networks.tdltx new file mode 100644 index 0000000..d8eda23 --- /dev/null +++ b/tdl/src/tdl/ietf_networks.tdltx @@ -0,0 +1,21 @@ +Package ietf_networks { + + Import all from Standard + Import all from ietf_yang_library + + Structure Networks ( + String name_, + NetworksList networks + ) + + Structure Network ( + String network_id, + String network_types + // TODO + ) + Collection NetworksList of Network + + // String declaration + //String "/restconf/data/ietf-network:networks"; + +} \ No newline at end of file diff --git a/tdl/src/tdl/ietf_yang_library.tdltx b/tdl/src/tdl/ietf_yang_library.tdltx new file mode 100644 index 0000000..e26ba31 --- /dev/null +++ b/tdl/src/tdl/ietf_yang_library.tdltx @@ -0,0 +1,46 @@ +Package ietf_yang_library { + + Import all from Standard + + // RFC 6991 + Type Counter32 // (SNMPv2-SMI) + Type ZeroBasedCounter32 // (RMON2-MIB) + Type Counter64 //(SNMPv2-SMI) + Type ZeroBasedCounter64 // (HCNUM-TC) + Type Gauge32 // (SNMPv2-SMI) + Type CounterBasedGauge64 // (HCNUM-TC) + Type OID + Type OID128 + Type YangIdentifier + Type DateAndTime + Type TimeTicks // (SNMPv2-SMI) + Type TimeStamp // (SNMPv2-TC) + Type PhysAddress // (SNMPv2-TC) + Type MacAddress // (SNMPv2-TC) + Type XPath1_0 + Type HexString + Type UUID + Type DottedQuad + Type URI // e.g., "https://localhost:443/restconf/tailf/modules/ietf-yang-library/2019-01-04" + + // RFC 8525 + Structure ModuleState ( + String name_, + ModuleList modules + ) + + Structure Module ( + String name_, + String revision, + URI schema, + URI namespace, + String conformance_type + ) + Collection ModuleList of Module + + // String declaration + //String "application/yang-data+xml"; + + //String "/restconf/data/ietf-yang-library:modules-state"; +} + diff --git a/tdl/src/tdl/mWT_Common.tdltx b/tdl/src/tdl/mWT_Common.tdltx new file mode 100644 index 0000000..db9c5ad --- /dev/null +++ b/tdl/src/tdl/mWT_Common.tdltx @@ -0,0 +1,94 @@ +Package mWT_Common { + Import all from Standard + Import all from ietf_yang_library + Import all from ietf_networks + Import all from HTTP + Import all from HTTP.MessageBased + + PICS IUT_MDSC // ETSI GS mWT 0029-1 Table A.1.1 + PICS IUT_PNC // ETSI GS mWT 0029-1 Table A.1.1 + PICS RESTCONF // ETSI GS mWT 0029-1 Table A.2.1 + PICS ABSTRACT_BB // ETSI GS mWT 0029-1 Table A.3.1 + PICS MW_TOPO // ETSI GS mWT 0029-1 Table A.4.1 + PICS ETH_TOPO // ETSI GS mWT 0029-1 Table A.4.2 + PICS BWPs_LOCALLY // ETSI GS mWT 0029-1 Table A.5.1 + PICS BWPs_GLOBALLY // ETSI GS mWT 0029-1 Table A.5.2 + PICS SEC_TLS // ETSI GS mWT 0029-1 Table Table A.6 + + Entity IUT // IUT entity + Entity TEST_SYSTEM // Test System entity + + Event idle // The IUT is ready to serve request + Event discovered // The IUT has discovered available network topologies + Event send + Event sends + Event receives + + Package Data { + Import all from Standard + Import all from HTTP.MessageBased + Import all from HTTP.MessageBasedConfiguration + + Import all from ietf_yang_library + Import all from ietf_networks + + String VALID_TOKEN + + Headers vHeadersGet [ + new Header ( + ^name = "Content-Type", + ^value = "application/yang-data+xml" + ), + new Header ( + ^name = "Accept", + ^value = "application/yang-data+xml" + ), + new Header ( + ^name = "Authorization", + ^value = VALID_TOKEN ) + ] + + Request vRequestGet ( + method = GET, + uri = "/", + // HTTP version currently not supported + headers = vHeadersGet + ) + + Response vErrorResponse ( + + ) + + Structure mWTBody extends Body ( + optional ModuleState modules_state, + optional Networks networks + ) + + second default_recv_timeout + + Component MDSCComponent { + // Add variables and timers here or define new component types and configurations + gate HTTPGate http + gate HTTPSGate https + timer receiveTimer + } + Component PNCComponent { + // Add variables and timers here or define new component types and configurations + gate HTTPGate http + gate HTTPSGate https + timer receiveTimer + } + Configuration Config_mWT_1 + { + PNCComponent TEST_SYSTEM as Tester, + MDSCComponent IUT as SUT, + connect TEST_SYSTEM=TEST_SYSTEM::http to IUT=IUT::http + } + Configuration Config_mWT_2 + { + MDSCComponent TEST_SYSTEM as Tester, + PNCComponent IUT as SUT, + connect TEST_SYSTEM=TEST_SYSTEM::http to IUT=IUT::http + } + } +} // End of Package mWT_Common \ No newline at end of file -- GitLab From aedf13960873001e8dda6bee4a2ae0844a876fc1 Mon Sep 17 00:00:00 2001 From: garciay Date: Wed, 17 Apr 2024 10:20:29 +0200 Subject: [PATCH 06/15] Finalyze Blacbox test purposes --- test-purposes/AtsMDSC.tplan2 | 1105 +++++++++++++++++--- test-purposes/Reference.txt | 45 +- test-purposes/ietf_eth_tran_service.tplan2 | 37 + test-purposes/ietf_eth_tran_types.tplan2 | 26 + test-purposes/mWT_Common.tplan2 | 55 +- 5 files changed, 1093 insertions(+), 175 deletions(-) create mode 100644 test-purposes/ietf_eth_tran_service.tplan2 create mode 100644 test-purposes/ietf_eth_tran_types.tplan2 diff --git a/test-purposes/AtsMDSC.tplan2 b/test-purposes/AtsMDSC.tplan2 index 92023c0..c492c34 100644 --- a/test-purposes/AtsMDSC.tplan2 +++ b/test-purposes/AtsMDSC.tplan2 @@ -2,100 +2,6 @@ Package AtsMDSC { Group "mdsc" { - import all from mWT_Common; - - Group "Blackbox" { - - Group "MWTopology" { - - import all from mWT_Common; - - Test Purpose { - TP Id TP_mWT_MDSC_MW_TOPO_GET_BV_01 - - Test objective - "Verify that the IUT replies with an error code when requesting microwave topology inventory in case of black box abstraction level." - - Reference - "ETSI GS mWT 024 Clause 4.3.2.1 Definition - point 1", - "RFC 8345" - - PICS Selection IUT_MDSC and ABSTRACT_BB and MW_TOPO - - Initial conditions with { - the IUT entity is idle - } - - Expected behaviour - ensure that { - when { - the IUT entity receives a vRequestGet containing - uri indicating value "/restconf/data/ietf-microwave-topology"; - from the TEST_SYSTEM entity - } then { - the IUT entity sends a r400 - to the TEST_SYSTEM entity - } - } - } - - } // End of Group "MWTopology" - - Group "EthernetTopology" { - - import all from mWT_Common; - - Test Purpose { - TP Id TP_mWT_MDSC_ETH_TOPO_GET_BV_01 - - Test objective - "Verify that the IUT provides the list of available network when requested." - - Reference - "ETSI GS mWT 024 Clause 4.3.2 AL1: Abstraction Level 1 - Black-box", - "RFC 8345" - - Config Id Config_mWT_1 - - PICS Selection IUT_MDSC and ABSTRACT_BB and ETH_TOPO - - Initial conditions with { - the IUT entity is idle - } - - Expected behaviour - ensure that { - when { - the IUT entity receives a vRequestGet containing - uri indicating value "/restconf/data/ietf-te-topology"; - from the TEST_SYSTEM entity - } then { - the IUT entity sends a r200 containing - body containing - networks containing - network_id1 containing - network_types containing - supporting_network containing - network_ref indicating value NETWORK_REFS;, - node containing - node_id indicating value NODE_ID, - supporting_node containing - network_ref indicating value NETWORK_NODE_REFS, - node_ref indicating value NODE_REFS - ;;;;;;; - to the TEST_SYSTEM entity - } - } - } // End of TP Id TP_mWT_MDSC_TOPO_GET_BV_01 - - } // End of Group "EthernetTopology" - - } // End of Group "Blackbox" - - Group "PartiallyTransparent" { - - } // End of Group "PartiallyTransparent" - } // End of Group "mdsc" Group "pnc" { @@ -150,7 +56,10 @@ Package AtsMDSC { "Verify that the IUT supports the basic YANG data models." Reference - "ETSI GS mWT 024 Clause 5.2.2.1 YANG Version" + "ETSI GS mWT 024 Clause 5.2.1 RESTCONF Protocol", + "ETSI GS mWT 024 Clause 5.2.2 YANG Version", + "RFC 8040 RESTCONF Protocol", + "RFC 8525 YANG Library" Config Id Config_mWT_2 @@ -284,7 +193,7 @@ Package AtsMDSC { Group "Blackbox" { - Group "MWTopology" { + Group "MWTopologyDiscovery" { import all from mWT_Common; @@ -313,7 +222,7 @@ Package AtsMDSC { ensure that { when { the IUT entity receives a vRequestGet containing - uri indicating value "/restconf/data/ietf-microwave-topology/networks"; + uri indicating value "/restconf/data/ietf-network:networks/topologyId/mw-native-topology"; from the TEST_SYSTEM entity } then { the IUT entity sends a r200 containing @@ -351,7 +260,7 @@ Package AtsMDSC { Config Id Config_mWT_2 - PICS Selection IUT_MDSC and ABSTRACT_BB and MW_TOPO + PICS Selection IUT_PNC and RESTCONF and SEC_TLS and ABSTRACT_BB and MW_TOPO Initial conditions with { the IUT entity is idle and @@ -362,7 +271,7 @@ Package AtsMDSC { ensure that { when { the IUT entity receives a vRequestGet containing - uri indicating value "/restconf/data/ietf-microwave-topology/networks/network={NETWORK_ID)"; + uri indicating value "/restconf/data/ietf-microwave-topology/ietf-network:networks/network={NETWORK_ID)/topologyId/mw-native-topology"; from the TEST_SYSTEM entity } then { the IUT entity sends a r200 containing @@ -372,7 +281,9 @@ Package AtsMDSC { networks containing network_id indicating value NETWORK_ID, network_types containing - te_topology indicating value any_value;, + te_topology containing + mw_topology indicating value any_value + ;;, node_id indicating value any_value, termination_points indicating value any_value, links indicating value any_value @@ -382,11 +293,79 @@ Package AtsMDSC { } } + Test Purpose { + TP Id TP_mWT_PNC_MW_TOPO_GET_BO_01 + + Test objective + "Verify that the IUT replies with an error code when the request is malformed - black box abstraction level." + + Reference + "ETSI GS mWT 024 Clause 5.3.2 Exception Handling", + "ETSI GS mWT 024 Annex A.1.2", + "RFC 8345 A YANG Data Model for Network Topologies", + "RFC 8795 YANG Data Model for Traffic Engineering (TE) Topologies" + + Config Id Config_mWT_2 + + PICS Selection IUT_PNC and RESTCONF and SEC_TLS and ABSTRACT_BB and MW_TOPO + + Initial conditions with { + the IUT entity is idle and + the IUT entity having discovered a network topology NET_TOPO + } + + Expected behaviour + ensure that { + when { + the IUT entity receives a vRequestGet containing + uri indicating value "/restconf/data/networks"; // Malformed URI + from the TEST_SYSTEM entity + } then { + the IUT entity sends a r400 + to the TEST_SYSTEM entity + } + } + } + + Test Purpose { + TP Id TP_mWT_PNC_MW_TOPO_GET_BO_02 + + Test objective + "Verify that the IUT replies with an error code when the network identifier is unknown - black box abstraction level." + + Reference + "ETSI GS mWT 024 Clause 5.3.2 Exception Handling", + "ETSI GS mWT 024 Annex A.1.2", + "RFC 8345 A YANG Data Model for Network Topologies", + "RFC 8795 YANG Data Model for Traffic Engineering (TE) Topologies" + + Config Id Config_mWT_2 + + PICS Selection IUT_PNC and RESTCONF and SEC_TLS and ABSTRACT_BB and MW_TOPO + + Initial conditions with { + the IUT entity is idle and + the IUT entity having discovered a network topology NET_TOPO + } + + Expected behaviour + ensure that { + when { + the IUT entity receives a vRequestGet containing + uri indicating value "/restconf/data/ietf-network:networks/network={UNKNOWN_NETWORK_ID)/topologyId/mw-native-topology"; + from the TEST_SYSTEM entity + } then { + the IUT entity sends a r404 + to the TEST_SYSTEM entity + } + } + } + Test Purpose { TP Id TP_mWT_PNC_MW_NODE_GET_BV_01 Test objective - "Verify that the IUT provides the MW network nodes for a networks with mandatory mWT GC 024 data elements subset - black box abstraction level." + "Verify that the IUT provides the MW network topology for all nodes with mandatory mWT GC 024 data elements subset - black box abstraction level." Reference "ETSI GS mWT 024 Annex A.2.2", @@ -407,7 +386,7 @@ Package AtsMDSC { ensure that { when { the IUT entity receives a vRequestGet containing - uri indicating value "/restconf/data/ietf-microwave-topology/networks/network={NETWORK_ID)/node"; + uri indicating value "/restconf/data/ietf-microwave-topology/ietf-network:networks/network={NETWORK_ID)/node/topologyId/mw-native-topology"; from the TEST_SYSTEM entity } then { the IUT entity sends a r200 containing @@ -421,7 +400,7 @@ Package AtsMDSC { network_id indicating value any_value, network_types containing te_topology containing - mw_topology indicating value any_value + mw_native_topology indicating value any_value ;;, node_id indicating value any_value, termination_points indicating value any_value, @@ -432,9 +411,95 @@ Package AtsMDSC { } } - } // End of Group "MWTopology" + Test Purpose { + TP Id TP_mWT_PNC_MW_NODE_GET_BV_02 + + Test objective + "Verify that the IUT provides the MW network topology for a specific node with mandatory mWT GC 024 data elements subset - black box abstraction level." + + Reference + "ETSI GS mWT 024 Annex A.2.2", + "RFC 8345 A YANG Data Model for Network Topologies", + "RFC 8795 YANG Data Model for Traffic Engineering (TE) Topologies", + "draft-ietf-ccamp-mw-topo-yang-02 A YANG Data Model for Microwave Topology" + + Config Id Config_mWT_2 + + PICS Selection IUT_PNC and RESTCONF and SEC_TLS and ABSTRACT_BB and MW_TOPO + + Initial conditions with { + the IUT entity is idle and + the IUT entity having discovered several MW ethernet networks topologies + } + + Expected behaviour + ensure that { + when { + the IUT entity receives a vRequestGet containing + uri indicating value "/restconf/data/ietf-microwave-topology/ietf-network:networks/network={NETWORK_ID)/node={NODE_ID}/topologyId/mw-native-topology"; + from the TEST_SYSTEM entity + } then { + the IUT entity sends a r200 containing + headers containing + content_type indicating value "application/yang-data+xml";, + body containing + networks containing + networksList containing + name_ indicating value any_value, + networks containing + network_id indicating value any_value, + network_types containing + te_topology containing + mw_native_topology indicating value any_value + ;;, + node_id indicating value any_value, + termination_points indicating value any_value, + links indicating value any_value + ;;;;; + to the TEST_SYSTEM entity + } + } + } + + Test Purpose { + TP Id TP_mWT_PNC_MW_NODE_GET_BO_01 + + Test objective + "Verify that the IUT replies with an error code when the node identifier is unknown - black box abstraction level." + + Reference + "ETSI GS mWT 024 Clause 5.3.2 Exception Handling", + "ETSI GS mWT 024 Annex A.2.2", + "RFC 8345 A YANG Data Model for Network Topologies", + "RFC 8795 YANG Data Model for Traffic Engineering (TE) Topologies", + "draft-ietf-ccamp-mw-topo-yang-02 A YANG Data Model for Microwave Topology" + + Config Id Config_mWT_2 + + PICS Selection IUT_PNC and RESTCONF and SEC_TLS and ABSTRACT_BB and MW_TOPO + + Initial conditions with { + the IUT entity is idle and + the IUT entity having discovered several MW ethernet networks topologies + } - Group "EthernetTopology" { + Expected behaviour + ensure that { + when { + the IUT entity receives a vRequestGet containing + uri indicating value "/restconf/data/ietf-microwave-topology/ietf-network:networks/network={NETWORK_ID)/node={UNKNOWN_NODE_ID}/topologyId/mw-native-topology"; + from the TEST_SYSTEM entity + } then { + the IUT entity sends a r404 + to the TEST_SYSTEM entity + } + } + } + + } // End of Group "MWTopologyDiscovery" + + Group "EthernetTopologyDiscovery" { // https://documenter.getpostman.com/view/26248101/2s93RTPrfd#6217d4c4-1c88-40de-8cb5-1141b0c2dcd3 + // IETF Logical Inventory restconf API import all from mWT_Common; @@ -452,7 +517,7 @@ Package AtsMDSC { Config Id Config_mWT_2 - PICS Selection IUT_PNC and RESTCONF and SEC_TLS and ABSTRACT_BB and MW_TOPO + PICS Selection IUT_PNC and RESTCONF and SEC_TLS and ABSTRACT_BB and ETH_TOPO Initial conditions with { the IUT entity is idle and @@ -463,7 +528,7 @@ Package AtsMDSC { ensure that { when { the IUT entity receives a vRequestGet containing - uri indicating value "/restconf/data/networks"; + uri indicating value "/restconf/data/ietf-network:networks"; from the TEST_SYSTEM entity } then { the IUT entity sends a r200 containing @@ -501,7 +566,7 @@ Package AtsMDSC { Config Id Config_mWT_2 - PICS Selection IUT_MDSC and ABSTRACT_BB and MW_TOPO + PICS Selection IUT_PNC and RESTCONF and SEC_TLS and ABSTRACT_BB and ETH_TOPO Initial conditions with { the IUT entity is idle and @@ -512,7 +577,7 @@ Package AtsMDSC { ensure that { when { the IUT entity receives a vRequestGet containing - uri indicating value "/restconf/data/networks/network={NETWORK_ID)"; + uri indicating value "/restconf/data/ietf-network:networks/network={NETWORK_ID)"; from the TEST_SYSTEM entity } then { the IUT entity sends a r200 containing @@ -533,56 +598,826 @@ Package AtsMDSC { } Test Purpose { - TP Id TP_mWT_PNC_ETH_NODE_GET_BV_01 + TP Id TP_mWT_PNC_ETH_TOPO_GET_BO_01 Test objective - "Verify that the IUT provides the Ethernet network nodes for a networks with mandatory mWT GC 024 data elements subset - black box abstraction level." + "Verify that the IUT replies with an error code when the request is malformed - black box abstraction level." Reference - "ETSI GS mWT 024 Annex A.2.2", + "ETSI GS mWT 024 Clause 5.3.2 Exception Handling", + "ETSI GS mWT 024 Annex A.1.2", "RFC 8345 A YANG Data Model for Network Topologies", - "RFC 8795 YANG Data Model for Traffic Engineering (TE) Topologies", - "draft-ietf-ccamp-mw-topo-yang-02 A YANG Data Model for Microwave Topology" + "RFC 8795 YANG Data Model for Traffic Engineering (TE) Topologies" Config Id Config_mWT_2 - PICS Selection IUT_PNC and RESTCONF and SEC_TLS and ABSTRACT_BB and MW_TOPO + PICS Selection IUT_PNC and RESTCONF and SEC_TLS and ABSTRACT_BB and ETH_TOPO Initial conditions with { the IUT entity is idle and - the IUT entity having discovered several MW ethernet networks topologies + the IUT entity having discovered a network topology NET_TOPO } Expected behaviour ensure that { when { the IUT entity receives a vRequestGet containing - uri indicating value "/restconf/data/networks/network={NETWORK_ID)/node"; + uri indicating value "/restconf/data/networks/NETWORK_ID"; // Malformed URI from the TEST_SYSTEM entity } then { - the IUT entity sends a r200 containing - headers containing - content_type indicating value "application/yang-data+xml";, - body containing - networks containing - networksList containing - name_ indicating value any_value, - networks containing - network_id indicating value any_value, - network_types containing - te_topology containing - mw_topology indicating value any_value - ;;, - node_id indicating value any_value, - termination_points indicating value any_value, - links indicating value any_value - ;;;;; + the IUT entity sends a r400 + to the TEST_SYSTEM entity + } + } + } + + Test Purpose { + TP Id TP_mWT_PNC_ETH_TOPO_GET_BO_02 + + Test objective + "Verify that the IUT replies with an error code when the network identifier is unknown - black box abstraction level." + + Reference + "ETSI GS mWT 024 Clause 5.3.2 Exception Handling", + "ETSI GS mWT 024 Annex A.1.2", + "RFC 8345 A YANG Data Model for Network Topologies", + "RFC 8795 YANG Data Model for Traffic Engineering (TE) Topologies" + + Config Id Config_mWT_2 + + PICS Selection IUT_PNC and RESTCONF and SEC_TLS and ABSTRACT_BB and ETH_TOPO + + Initial conditions with { + the IUT entity is idle and + the IUT entity having discovered a network topology NET_TOPO + } + + Expected behaviour + ensure that { + when { + the IUT entity receives a vRequestGet containing + uri indicating value "/restconf/data/ietf-network:networks/network={UNKNOWN_NETWORK_ID)"; + from the TEST_SYSTEM entity + } then { + the IUT entity sends a r404 + to the TEST_SYSTEM entity + } + } + } + + Test Purpose { + TP Id TP_mWT_PNC_ETH_NODE_GET_BV_01 + + Test objective + "Verify that the IUT provides the Ethernet network topology for all nodes with mandatory mWT GC 024 data elements subset - black box abstraction level." + + Reference + "ETSI GS mWT 024 Annex A.2.2", + "RFC 8345 A YANG Data Model for Network Topologies", + "RFC 8795 YANG Data Model for Traffic Engineering (TE) Topologies", + "draft-ietf-ccamp-mw-topo-yang-02 A YANG Data Model for Microwave Topology" + + Config Id Config_mWT_2 + + PICS Selection IUT_PNC and RESTCONF and SEC_TLS and ABSTRACT_BB and ETH_TOPO + + Initial conditions with { + the IUT entity is idle and + the IUT entity having discovered several MW ethernet networks topologies + } + + Expected behaviour + ensure that { + when { + the IUT entity receives a vRequestGet containing + uri indicating value "/restconf/data/ietf-network:networks/network={NETWORK_ID)/node"; + from the TEST_SYSTEM entity + } then { + the IUT entity sends a r200 containing + headers containing + content_type indicating value "application/yang-data+xml";, + body containing + networks containing + networksList containing + name_ indicating value any_value, + networks containing + network_id indicating value any_value, + network_types containing + te_topology containing + mw_topology indicating value any_value + ;;, + node_id indicating value any_value, + termination_points indicating value any_value, + links indicating value any_value + ;;;;; + to the TEST_SYSTEM entity + } + } + } + + Test Purpose { + TP Id TP_mWT_PNC_ETH_NODE_GET_BV_02 + + Test objective + "Verify that the IUT provides the Ethernet network topology for specific node with mandatory mWT GC 024 data elements subset - black box abstraction level." + + Reference + "ETSI GS mWT 024 Annex A.2.2", + "RFC 8345 A YANG Data Model for Network Topologies", + "RFC 8795 YANG Data Model for Traffic Engineering (TE) Topologies", + "draft-ietf-ccamp-mw-topo-yang-02 A YANG Data Model for Microwave Topology" + + Config Id Config_mWT_2 + + PICS Selection IUT_PNC and RESTCONF and SEC_TLS and ABSTRACT_BB and ETH_TOPO + + Initial conditions with { + the IUT entity is idle and + the IUT entity having discovered several MW ethernet networks topologies + } + + Expected behaviour + ensure that { + when { + the IUT entity receives a vRequestGet containing + uri indicating value "/restconf/data/ietf-network:networks/network={NETWORK_ID)/node={NODE_ID)"; + from the TEST_SYSTEM entity + } then { + the IUT entity sends a r200 containing + headers containing + content_type indicating value "application/yang-data+xml";, + body containing + networks containing + networksList containing + name_ indicating value any_value, + networks containing + network_id indicating value any_value, + network_types containing + te_topology containing + mw_topology indicating value any_value + ;;, + node_id indicating value any_value, + termination_points indicating value any_value, + links indicating value any_value + ;;;;; + to the TEST_SYSTEM entity + } + } + } + + Test Purpose { + TP Id TP_mWT_PNC_ETH_NODE_GET_BO_01 + + Test objective + "Verify that the IUT replies with an error code when the node identifier is unknown - black box abstraction level." + + Reference + "ETSI GS mWT 024 Clause 5.3.2 Exception Handling", + "ETSI GS mWT 024 Annex A.2.2", + "RFC 8345 A YANG Data Model for Network Topologies", + "RFC 8795 YANG Data Model for Traffic Engineering (TE) Topologies", + "draft-ietf-ccamp-mw-topo-yang-02 A YANG Data Model for Microwave Topology" + + Config Id Config_mWT_2 + + PICS Selection IUT_PNC and RESTCONF and SEC_TLS and ABSTRACT_BB and ETH_TOPO + + Initial conditions with { + the IUT entity is idle and + the IUT entity having discovered several MW ethernet networks topologies + } + + Expected behaviour + ensure that { + when { + the IUT entity receives a vRequestGet containing + uri indicating value "/restconf/data/ietf-network:networks/network={NETWORK_ID)/node={UNKNOWN_NODE_ID)"; + from the TEST_SYSTEM entity + } then { + the IUT entity sends a r404 + to the TEST_SYSTEM entity + } + } + } + + } // End of Group "EthernetTopologyDiscovery" + + Group "EthernetService" { + + import all from mWT_Common; + + Test Purpose { + TP Id TP_mWT_PNC_ETH_SVC_GET_BV_01 + + Test objective + "Verify that the IUT provides all the Bandwidth profiles with mandatory mWT GC 024 data elements subset - black box abstraction level." + + Reference + "ETSI GS mWT 024 Annex A.2.2", + "RFC 8345 A YANG Data Model for Network Topologies", + "RFC 8795 YANG Data Model for Traffic Engineering (TE) Topologies", + "draft-ietf-ccamp-client-signal-yang-05 A YANG Data Model for Transport Network Client Signals" + + Config Id Config_mWT_2 + + PICS Selection IUT_PNC and RESTCONF and SEC_TLS and ABSTRACT_BB + + Initial conditions with { + the IUT entity is idle and + the IUT entity having discovered several MW ethernet networks topologies and + the IUT entity having a Bandwidth profile created and + the IUT entity having a service profile created + } + + Expected behaviour + ensure that { + when { + the IUT entity receives a vRequestGet containing + uri indicating value "/restconf/data/ietf-eth-tran-service:etht-svc/globals"; + from the TEST_SYSTEM entity + } then { + the IUT entity sends a r200 containing + headers containing + content_type indicating value "application/yang-data+xml";, + body containing + ethtSvc containing + globals containing + band_width_profiles containing + band_width_profile indicating value BAND_WIDTH_PROFILE + ;;, + ethtSvcInstanceList containing + ethtSvcInstance containing + name_ indicating value any_value, + title indicating value any_value, + desc indicating value any_value, + customer indicating value any_value + ;;;;; + to the TEST_SYSTEM entity + } + } + } + + Test Purpose { + TP Id TP_mWT_PNC_ETH_SVC_GET_BO_01 + + Test objective + "Verify that the IUT replies with an error code when the request is malformed - black box abstraction level." + + Reference + "ETSI GS mWT 024 Clause 4.2.2.1 Ethernet Ethernet Services", + "ETSI GS mWT 024 Clause 5.3.2 Exception Handling", + "ETSI GS mWT 024 Annex A.2.4", + "RFC 6991 Common YANG Data Types", + "RFC 8776 Common YANG Data Types for Traffic Engineering", + "draft-ietf-ccamp-client-signal-yang-05 A YANG Data Model for Transport Network Client Signals" + + Config Id Config_mWT_2 + + PICS Selection IUT_PNC and RESTCONF and SEC_TLS and ABSTRACT_BB + + Initial conditions with { + the IUT entity is idle and + the IUT entity having discovered several MW ethernet networks topologies + } + + Expected behaviour + ensure that { + when { + the IUT entity receives a vRequestGet containing + uri indicating value "/restconf/data/tran-service:etht-svc/globals"; // Malformed URI + from the TEST_SYSTEM entity + } then { + the IUT entity sends a r400 + to the TEST_SYSTEM entity + } + } + } + + Test Purpose { + TP Id TP_mWT_PNC_ETH_SVC_POST_BV_01 + + Test objective + "Verify that the IUT creates a new Bandwidth profile with mandatory mWT GC 024 data elements subset - black box abstraction level." + + Reference + "ETSI GS mWT 024 Clause 4.2.2.1 Ethernet Ethernet Services", + "ETSI GS mWT 024 Annex A.2.4", + "RFC 6991 Common YANG Data Types", + "RFC 8776 Common YANG Data Types for Traffic Engineering", + "draft-ietf-ccamp-client-signal-yang-05 A YANG Data Model for Transport Network Client Signals" + + Config Id Config_mWT_2 + + PICS Selection IUT_PNC and RESTCONF and SEC_TLS and ABSTRACT_BB and not BWP_SVS_IN_ONE_REQUEST + + Initial conditions with { + the IUT entity is idle and + the IUT entity having discovered several MW ethernet networks topologies and + the IUT entity not having a Bandwidth profile created + } + + Expected behaviour + ensure that { + when { + the IUT entity receives a vRequestPost containing + uri indicating value "/restconf/data/ietf-eth-tran-service:etht-svc/globals", + body containing + ethtSvc containing + ethtSvcInstanceList containing + ethtSvcInstance containing + name_ indicating value ETHT_SVC_NAME, + title indicating value any_value, + desc indicating value any_value, + customer indicating value any_value + ;;;;; + from the TEST_SYSTEM entity + } then { + the IUT entity sends a r201 containing + headers containing + content_type indicating value "application/yang-data+xml";, + body containing + ethtSvc containing + ethtSvcInstanceList containing + ethtSvcInstance containing + name_ indicating value ETHT_SVC_NAME, + title indicating value any_value, + desc indicating value any_value, + customer indicating value any_value + ;;;;; + to the TEST_SYSTEM entity + } + } + } + + Test Purpose { + TP Id TP_mWT_PNC_ETH_SVC_POST_BV_02 + + Test objective + "Verify that the IUT creates a new ethernet service with mandatory mWT GC 024 data elements subset - black box abstraction level." + + Reference + "ETSI GS mWT 024 Clause 4.2.2.1 Ethernet Ethernet Services", + "ETSI GS mWT 024 Annex A.2.4", + "RFC 6991 Common YANG Data Types", + "RFC 8776 Common YANG Data Types for Traffic Engineering", + "draft-ietf-ccamp-client-signal-yang-05 A YANG Data Model for Transport Network Client Signals" + + Config Id Config_mWT_2 + + PICS Selection IUT_PNC and RESTCONF and SEC_TLS and ABSTRACT_BB and not BWP_SVS_IN_ONE_REQUEST + + Initial conditions with { + the IUT entity is idle and + the IUT entity having discovered several MW ethernet networks topologies and + the IUT entity having a Bandwidth profile created and + the IUT entity not having a service profile created + } + + Expected behaviour + ensure that { + when { + the IUT entity receives a vRequestPost containing + uri indicating value "/restconf/data/ietf-eth-tran-service:etht-svc", + body containing + ethtSvc containing + ethtSvcInstanceList containing + ethtSvcInstance containing + name_ indicating value ETHT_SVC_NAME, + title indicating value any_value, + desc indicating value any_value, + customer indicating value any_value + ;;;;; + from the TEST_SYSTEM entity + } then { + the IUT entity sends a r201 containing + headers containing + content_type indicating value "application/yang-data+xml";, + body containing + ethtSvc containing + ethtSvcInstanceList containing + ethtSvcInstance containing + name_ indicating value ETHT_SVC_NAME, + title indicating value any_value, + desc indicating value any_value, + customer indicating value any_value + ;, + ethtSvcInstance containing + name_ indicating value ETHT_SVC_NAME, + title indicating value ETH_SVC_TITLE, + desc indicating value ETH_SVC_DESC, + customer indicating value ETH_SVC_CUSTOMER + ;;;;; + to the TEST_SYSTEM entity + } + } + } + + Test Purpose { + TP Id TP_mWT_PNC_ETH_SVC_POST_BV_03 + + Test objective + "Verify that the IUT creates a new Bandwidth profile and and a new ethernet service in one POST with mandatory mWT GC 024 data elements subset - black box abstraction level." + + Reference + "ETSI GS mWT 024 Clause 4.2.2.1 Ethernet Ethernet Services", + "ETSI GS mWT 024 Annex A.2.4", + "RFC 6991 Common YANG Data Types", + "RFC 8776 Common YANG Data Types for Traffic Engineering", + "draft-ietf-ccamp-client-signal-yang-05 A YANG Data Model for Transport Network Client Signals" + + Config Id Config_mWT_2 + + PICS Selection IUT_PNC and RESTCONF and SEC_TLS and ABSTRACT_BB and BWP_SVS_IN_ONE_REQUEST + + Initial conditions with { + the IUT entity is idle and + the IUT entity having discovered several MW ethernet networks topologies and + the IUT entity not having a Bandwidth profile created + } + + Expected behaviour + ensure that { + when { + the IUT entity receives a vRequestPost containing + uri indicating value "/restconf/data/ietf-eth-tran-service:etht-svc/globals", + body containing + ethtSvc containing + ethtSvcInstanceList containing + ethtSvcInstance containing + name_ indicating value ETHT_SVC_NAME, + title indicating value ETH_SVC_TITLE, + desc indicating value ETH_SVC_DESC, + customer indicating value ETH_SVC_CUSTOMER + ;;;;; + from the TEST_SYSTEM entity + } then { + the IUT entity sends a r201 containing + headers containing + content_type indicating value "application/yang-data+xml";, + body containing + ethtSvc containing + ethtSvcInstanceList containing + ethtSvcInstance containing + name_ indicating value ETHT_SVC_NAME, + title indicating value ETH_SVC_TITLE, + desc indicating value ETH_SVC_DESC, + customer indicating value ETH_SVC_CUSTOMER + ;;;;; + to the TEST_SYSTEM entity + } + } + } + + Test Purpose { + TP Id TP_mWT_PNC_ETH_SVC_POST_BO_01 + + Test objective + "Verify that the IUT replies with an error when the request is malformed - black box abstraction level." + + Reference + "ETSI GS mWT 024 Clause 5.3.2 Exception Handling", + "ETSI GS mWT 024 Annex A.2.4", + "RFC 6991 Common YANG Data Types", + "RFC 8776 Common YANG Data Types for Traffic Engineering", + "draft-ietf-ccamp-client-signal-yang-05 A YANG Data Model for Transport Network Client Signals" + + Config Id Config_mWT_2 + + PICS Selection IUT_PNC and RESTCONF and SEC_TLS and ABSTRACT_BB and not BWP_SVS_IN_ONE_REQUEST + + Initial conditions with { + the IUT entity is idle and + the IUT entity having discovered several MW ethernet networks topologies + } + + Expected behaviour + ensure that { + when { + the IUT entity receives a vRequestPost containing + uri indicating value "/restconf/data/etht-svc/globals", // Malformed URI + body containing + ethtSvc containing + ethtSvcInstanceList containing + ethtSvcInstance containing + name_ indicating value ETHT_SVC_NAME, + title indicating value ETH_SVC_TITLE, + desc indicating value ETH_SVC_DESC, + customer indicating value ETH_SVC_CUSTOMER + ;;;;; + from the TEST_SYSTEM entity + } then { + the IUT entity sends a r400 + to the TEST_SYSTEM entity + } + } + } + + Test Purpose { + TP Id TP_mWT_PNC_ETH_SVC_PUT_BV_01 + + Test objective + "Verify that the IUT updates an existing Bandwidth profile with mandatory mWT GC 024 data elements subset - black box abstraction level." + + Reference + "ETSI GS mWT 024 Clause 4.2.2.1 Ethernet Ethernet Services", + "ETSI GS mWT 024 Annex A.2.4", + "RFC 6991 Common YANG Data Types", + "RFC 8776 Common YANG Data Types for Traffic Engineering", + "draft-ietf-ccamp-client-signal-yang-05 A YANG Data Model for Transport Network Client Signals" + + Config Id Config_mWT_2 + + PICS Selection IUT_PNC and RESTCONF and SEC_TLS and ABSTRACT_BB + + Initial conditions with { + the IUT entity is idle and + the IUT entity having discovered several MW ethernet networks topologies and + the IUT entity having a Bandwidth profile created + } + + Expected behaviour + ensure that { + when { + the IUT entity receives a vRequestPut containing + uri indicating value "/restconf/data/ietf-eth-tran-service:etht-svc/globals", + body containing + ethtSvc containing + globals containing + namedBandwidthProfile containing + bandwidth_profile_name indicating value BANDWIDTH_PROFILE_NAME, + CIR indicating value CIR_VALUE, + CBS indicating value CBS_VALUE, + EIR indicating value EIR_VALUE, + EBS indicating value EBS_VALUE, + color_aware indicating value COLOR_AWARE, + coupling_flag indicating value COUPLING_FLAG + ;;;;; + from the TEST_SYSTEM entity + } then { + the IUT entity sends a r201 containing + headers containing + content_type indicating value "application/yang-data+xml";, + body containing + ethtSvc containing + globals containing + namedBandwidthProfile containing + bandwidth_profile_name indicating value BANDWIDTH_PROFILE_NAME, + CIR indicating value CIR_VALUE, + CBS indicating value CBS_VALUE, + EIR indicating value EIR_VALUE, + EBS indicating value EBS_VALUE, + color_aware indicating value COLOR_AWARE, + coupling_flag indicating value COUPLING_FLAG + ;;;;; + to the TEST_SYSTEM entity + } + } + } + + Test Purpose { + TP Id TP_mWT_PNC_ETH_SVC_PUT_BV_02 + + Test objective + "Verify that the IUT updates an existing etehrnet service - black box abstraction level." + + Reference + "ETSI GS mWT 024 Clause 4.2.2.1 Ethernet Ethernet Services", + "ETSI GS mWT 024 Annex A.2.4", + "RFC 6991 Common YANG Data Types", + "RFC 8776 Common YANG Data Types for Traffic Engineering", + "draft-ietf-ccamp-client-signal-yang-05 A YANG Data Model for Transport Network Client Signals" + + Config Id Config_mWT_2 + + PICS Selection IUT_PNC and RESTCONF and SEC_TLS and ABSTRACT_BB + + Initial conditions with { + the IUT entity is idle and + the IUT entity having discovered several MW ethernet networks topologies and + the IUT entity having a Bandwidth profile created + } + + Expected behaviour + ensure that { + when { + the IUT entity receives a vRequestPut containing + uri indicating value "/restconf/data/ietf-eth-tran-service:etht-svc/globals", + body containing + ethtSvc containing + ethtSvcInstanceList containing + ethtSvcInstance containing + name_ indicating value ETHT_SVC_NAME, + title indicating value ETH_SVC_TITLE, + desc indicating value ETH_SVC_DESC, + customer indicating value ETH_SVC_CUSTOMER + ;;;;; + from the TEST_SYSTEM entity + } then { + the IUT entity sends a r201 containing + headers containing + content_type indicating value "application/yang-data+xml";, + body containing + ethtSvc containing + ethtSvcInstanceList containing + ethtSvcInstance containing + name_ indicating value ETHT_SVC_NAME, + title indicating value ETH_SVC_TITLE, + desc indicating value ETH_SVC_DESC, + customer indicating value ETH_SVC_CUSTOMER + ;;;;; + to the TEST_SYSTEM entity + } + } + } + + Test Purpose { + TP Id TP_mWT_PNC_ETH_SVC_PUT_BO_01 + + Test objective + "Verify that the IUT replies with an error code when updating an unknown Bandwidth profile with mandatory mWT GC 024 data elements subset - black box abstraction level." + + Reference + "ETSI GS mWT 024 Clause 5.3.2 Exception Handling", + "ETSI GS mWT 024 Annex A.2.4", + "RFC 6991 Common YANG Data Types", + "RFC 8776 Common YANG Data Types for Traffic Engineering", + "draft-ietf-ccamp-client-signal-yang-05 A YANG Data Model for Transport Network Client Signals" + + Config Id Config_mWT_2 + + PICS Selection IUT_PNC and RESTCONF and SEC_TLS and ABSTRACT_BB + + Initial conditions with { + the IUT entity is idle and + the IUT entity having discovered several MW ethernet networks topologies + } + + Expected behaviour + ensure that { + when { + the IUT entity receives a vRequestPut containing + uri indicating value "/restconf/data/ietf-eth-tran-service:etht-svc/globals", + body containing + ethtSvc containing + ethtSvcInstanceList containing + ethtSvcInstance containing + name_ indicating value UNKNOWN_ETHT_SVC_NAME, + title indicating value ETH_SVC_TITLE, + desc indicating value ETH_SVC_DESC, + customer indicating value ETH_SVC_CUSTOMER + ;;;;; + from the TEST_SYSTEM entity + } then { + the IUT entity sends a r404 + to the TEST_SYSTEM entity + } + } + } + + Test Purpose { + TP Id TP_mWT_PNC_ETH_SVC_DELETE_BV_01 + + Test objective + "Verify that the IUT deletes an existing ethernet service - black box abstraction level." + + Reference + "ETSI GS mWT 024 Clause 4.2.2.1 Ethernet Ethernet Services", + "ETSI GS mWT 024 Annex A.2.4", + "RFC 6991 Common YANG Data Types", + "RFC 8776 Common YANG Data Types for Traffic Engineering", + "draft-ietf-ccamp-client-signal-yang-05 A YANG Data Model for Transport Network Client Signals" + + Config Id Config_mWT_2 + + PICS Selection IUT_PNC and RESTCONF and SEC_TLS and ABSTRACT_BB + + Initial conditions with { + the IUT entity is idle and + the IUT entity having discovered several MW ethernet networks topologies and + the IUT entity having a Bandwidth profile created and + the IUT entity having a service profile created + } + + Expected behaviour + ensure that { + when { + the IUT entity receives a vRequestDelete containing + uri indicating value "/restconf/data/ietf-eth-tran-service:etht-svc/etht-svc-instances=ETHT_SVC_NAME"; + from the TEST_SYSTEM entity + } then { + the IUT entity sends a r204 + to the TEST_SYSTEM entity + } + } + } + + Test Purpose { + TP Id TP_mWT_PNC_ETH_SVC_DELETE_BV_02 + + Test objective + "Verify that the IUT deletes an existing bandwidth profile - black box abstraction level." + + Reference + "ETSI GS mWT 024 Clause 4.2.2.1 Ethernet Ethernet Services", + "ETSI GS mWT 024 Annex A.2.4", + "RFC 6991 Common YANG Data Types", + "RFC 8776 Common YANG Data Types for Traffic Engineering", + "draft-ietf-ccamp-client-signal-yang-05 A YANG Data Model for Transport Network Client Signals" + + Config Id Config_mWT_2 + + PICS Selection IUT_PNC and RESTCONF and SEC_TLS and ABSTRACT_BB + + Initial conditions with { + the IUT entity is idle and + the IUT entity having discovered several MW ethernet networks topologies and + the IUT entity having a Bandwidth profile created + } + + Expected behaviour + ensure that { + when { + the IUT entity receives a vRequestDelete containing + uri indicating value "/restconf/data/ietf-eth-tran-service:etht-svc/globls/bandwitdh_profile_name=BANDWIDTH_PROFILE_NAME"; + from the TEST_SYSTEM entity + } then { + the IUT entity sends a r204 + to the TEST_SYSTEM entity + } + } + } + + Test Purpose { + TP Id TP_mWT_PNC_ETH_SVC_DELETE_BO_01 + + Test objective + "Verify that the IUT replies with an error code when the request is malformed - black box abstraction level." + + Reference + "ETSI GS mWT 024 Clause 5.3.2 Exception Handling", + "ETSI GS mWT 024 Annex A.2.4", + "RFC 6991 Common YANG Data Types", + "RFC 8776 Common YANG Data Types for Traffic Engineering", + "draft-ietf-ccamp-client-signal-yang-05 A YANG Data Model for Transport Network Client Signals" + + Config Id Config_mWT_2 + + PICS Selection IUT_PNC and RESTCONF and SEC_TLS and ABSTRACT_BB + + Initial conditions with { + the IUT entity is idle and + the IUT entity having discovered several MW ethernet networks topologies + } + + Expected behaviour + ensure that { + when { + the IUT entity receives a vRequestDelete containing + uri indicating value "/restconf/data/ietf-eth-tran-service:etht-svc/nstances=ETHT_SVC_NAME"; // Malformed URI + from the TEST_SYSTEM entity + } then { + the IUT entity sends a r400 + to the TEST_SYSTEM entity + } + } + } + + Test Purpose { + TP Id TP_mWT_PNC_ETH_SVC_DELETE_BO_02 + + Test objective + "Verify that the IUT replies with an error code when it is requested to delete an unknown Bandwidth profile - black box abstraction level." + + Reference + "ETSI GS mWT 024 Clause 5.3.2 Exception Handling", + "ETSI GS mWT 024 Annex A.2.4", + "RFC 6991 Common YANG Data Types", + "RFC 8776 Common YANG Data Types for Traffic Engineering", + "draft-ietf-ccamp-client-signal-yang-05 A YANG Data Model for Transport Network Client Signals" + + Config Id Config_mWT_2 + + PICS Selection IUT_PNC and RESTCONF and SEC_TLS and ABSTRACT_BB + + Initial conditions with { + the IUT entity is idle and + the IUT entity having discovered several MW ethernet networks topologies + } + + Expected behaviour + ensure that { + when { + the IUT entity receives a vRequestDelete containing + uri indicating value "/restconf/data/ietf-eth-tran-service:etht-svc/etht-svc-instances=UNKNOWN_ETHT_SVC_NAME"; + from the TEST_SYSTEM entity + } then { + the IUT entity sends a r404 to the TEST_SYSTEM entity } } } - } // End of Group "EthernetTopology" + } // End of Group "EthernetService" } // End of Group "Blackbox" diff --git a/test-purposes/Reference.txt b/test-purposes/Reference.txt index 2137b1f..1847919 100644 --- a/test-purposes/Reference.txt +++ b/test-purposes/Reference.txt @@ -1,23 +1,28 @@ - +==========+=========================+===============================+ - | Prefix | YANG Module | References | - +==========+=========================+===============================+ - | yang | ietf-[yang|inet]-types | [RFC6991] | - +----------+-------------------------+-------------------------------+ - | mwt | ietf-microwave-topology | draft-ietf-ccamp-mw-topo-yang | - +----------+-------------------------+-------------------------------+ - | nw | ietf-network | [RFC8345] | - +----------+-------------------------+-------------------------------+ - | nt | ietf-network-topology | [RFC8345] | - +----------+-------------------------+-------------------------------+ - | mw-types | ietf-microwave-types | [RFC8561] | - +----------+-------------------------+-------------------------------+ - | te | ietf-te-type | [RFC8776] | - +----------+-------------------------+-------------------------------+ - | tet | ietf-te-topology | [RFC8795] | - +----------+-------------------------+-------------------------------+ - | | geo-json | [RFC7946] | - +----------+-------------------------+-------------------------------+ + +==========+=========================+===================================+ + | Prefix | YANG Module | References | + +==========+=========================+===================================+ + | yang | ietf-[yang|inet]-types | [RFC6991] | + +----------+-------------------------+-----------------------------------+ + | mwt | ietf-microwave-topology | draft-ietf-ccamp-mw-topo-yang | + +----------+-------------------------+-----------------------------------+ + | nw | ietf-network | [RFC8345] | + +----------+-------------------------+-----------------------------------+ + | nt | ietf-network-topology | [RFC8345] | + +----------+-------------------------+-----------------------------------+ + | mw-types | ietf-microwave-types | [RFC8561] | + +----------+-------------------------+-----------------------------------+ + | te | ietf-te-type | [RFC8776] | + +----------+-------------------------+-----------------------------------+ + | tet | ietf-te-topology | [RFC8795] | + +----------+-------------------------+-----------------------------------+ + |etht-types| ietf-eth-tran-types |draft-ietf-ccamp-client-signal-yang-05| + +----------+-------------------------+-----------------------------------+ + | clnt-svc |ietf-trans-client-service|draft-ietf-ccamp-client-signal-yang-05| + +----------+-------------------------+-----------------------------------+ + | etht-svc | ietf-eth-tran-service |draft-ietf-ccamp-client-signal-yang-05| + +----------+-------------------------+-----------------------------------+ + | | geo-json | [RFC7946] | + +----------+-------------------------+-----------------------------------+ - \ No newline at end of file diff --git a/test-purposes/ietf_eth_tran_service.tplan2 b/test-purposes/ietf_eth_tran_service.tplan2 new file mode 100644 index 0000000..309e094 --- /dev/null +++ b/test-purposes/ietf_eth_tran_service.tplan2 @@ -0,0 +1,37 @@ +// draft_ietf_ccamp_client_signal_yang_05 +Package ietf_eth_tran_types { + + import all from ietf_eth_tran_service; + import all from mWT_Common; + + + Data { + + type Globals with + named_bandwidth_profiles of type NamedBandwidthProfiles + ; + + type NamedBandwidthProfile with + bandwidth_profile_name of type string, + bandwidth_profile_type of type BandwidthProfileType + ; + collection of NamedBandwidthProfile NamedBandwidthProfiles + + type EthtSvcInstance with + etht_svc_name of type string, + etht_svc_title of type string, + etht_svc_descr of type string, + etht_svc_customer of type string, + etht_svc_type of type service_type, + etht_svc_lifecycle of type lifecycle_status + ; + collection of EthtSvcInstance EthtSvcInstances + + type EthtSvc with + globals of type Globals, + etht_svc_instances of type EthtSvcInstances + ; + + } + +} // End of Package ietf_eth_tran_types \ No newline at end of file diff --git a/test-purposes/ietf_eth_tran_types.tplan2 b/test-purposes/ietf_eth_tran_types.tplan2 new file mode 100644 index 0000000..210e6b4 --- /dev/null +++ b/test-purposes/ietf_eth_tran_types.tplan2 @@ -0,0 +1,26 @@ +// draft-ietf-ccamp-client-signal-yang-05 +Package ietf_eth_tran_service { + + import all from mWT_Common; + + Data { + + type vlanid; + type service_type; + type performance; + type access_role; + type eth_tag_type; + type eth_tag_classify; + type vid_range_type; + type lifecycle_status; + + type BandwidthProfileType with + CIR of type uint64, + CBS of type uint64, + EIR of type uint64, + BS of type uint64, + color_aware of type boolean, + coupling_flag of type boolean + ; + } +} // End of Package ietf_eth_tran_service \ No newline at end of file diff --git a/test-purposes/mWT_Common.tplan2 b/test-purposes/mWT_Common.tplan2 index 89610dc..416d0e6 100644 --- a/test-purposes/mWT_Common.tplan2 +++ b/test-purposes/mWT_Common.tplan2 @@ -5,15 +5,14 @@ Package mWT_Common { Domain { pics: - - IUT_MDSC // ETSI GS mWT 0029-1 Table A.1.1 - - IUT_PNC // ETSI GS mWT 0029-1 Table A.1.1 - - RESTCONF // ETSI GS mWT 0029-1 Table A.2.1 - - ABSTRACT_BB // ETSI GS mWT 0029-1 Table A.3.1 - - MW_TOPO // ETSI GS mWT 0029-1 Table A.4.1 - - ETH_TOPO // ETSI GS mWT 0029-1 Table A.4.2 - - BWPs_LOCALLY // ETSI GS mWT 0029-1 Table A.5.1 - - BWPs_GLOBALLY // ETSI GS mWT 0029-1 Table A.5.2 - - SEC_TLS // ETSI GS mWT 0029-1 Table Table A.6 + - IUT_MDSC // ETSI GS mWT 0029-1 Table A.1.1 + - IUT_PNC // ETSI GS mWT 0029-1 Table A.1.1 + - RESTCONF // ETSI GS mWT 0029-1 Table A.2.1 + - ABSTRACT_BB // ETSI GS mWT 0029-1 Table A.3.1 + - MW_TOPO // ETSI GS mWT 0029-1 Table A.4.1 + - ETH_TOPO // ETSI GS mWT 0029-1 Table A.4.2 + - BWP_SVS_IN_ONE_REQUEST // + - SEC_TLS // ETSI GS mWT 0029-1 Table Table A.6 ; entities: @@ -35,8 +34,18 @@ Package mWT_Common { type string; type json; type integer; + type uint64; type boolean; + // String declaration + string "GET"; + string "application/yang-data+xml"; + string "application/yang-data+xml"; + // URIs declarations + string "/"; + // Integer declaration + integer 1; + type HttpMessage with optional request of type HttpRequest, optional response of type HttpResponse @@ -88,18 +97,24 @@ Package mWT_Common { headers set to vHeadersGet ; - - - // String declaration - string "GET"; - string "application/yang-data+xml"; - string "application/yang-data+xml"; + // Pixits string VALID_TOKEN; - // URIs declarations - string "/"; - // Integer declaration - integer 1; - + string NETWORK_ID; + string UNKNOWN_NETWORK_ID; + string NODE_ID; + string UNKNOWN_NODE_ID; + string BANDWIDTH_PROFILE_NAME; + string ETHT_SVC_NAME; + string UNKNOWN_ETHT_SVC_NAME; + uint64 CIR_VALUE; + uint64 CBS_VALUE; + uint64 EIR_VALUE; + uint64 EBS_VALUE; + boolean COLOR_AWARE; + boolean COUPLING_FLAG; + string ETH_SVC_TITLE; + string ETH_SVC_DESC; + string ETH_SVC_CUSTOMER; } -- GitLab From 70e2d2ee212cecccbfa9c28ce60fb8ddcaaf775c Mon Sep 17 00:00:00 2001 From: garciay Date: Mon, 13 May 2024 09:25:02 +0200 Subject: [PATCH 07/15] Reorganize Blackbox/PartiallyTransparent groups --- test-purposes/AtsMDSC.tplan2 | 8 ++++---- test-purposes/ietf_eth_tran_service.tplan2 | 4 ++-- test-purposes/mWT_Common.tplan2 | 2 ++ 3 files changed, 8 insertions(+), 6 deletions(-) diff --git a/test-purposes/AtsMDSC.tplan2 b/test-purposes/AtsMDSC.tplan2 index c492c34..76777cf 100644 --- a/test-purposes/AtsMDSC.tplan2 +++ b/test-purposes/AtsMDSC.tplan2 @@ -193,6 +193,10 @@ Package AtsMDSC { Group "Blackbox" { + } // End of Group "Blackbox" + + Group "PartiallyTransparent" { + Group "MWTopologyDiscovery" { import all from mWT_Common; @@ -1419,10 +1423,6 @@ Package AtsMDSC { } // End of Group "EthernetService" - } // End of Group "Blackbox" - - Group "PartiallyTransparent" { - } // End of Group "PartiallyTransparent" } // End of Group "pnc" diff --git a/test-purposes/ietf_eth_tran_service.tplan2 b/test-purposes/ietf_eth_tran_service.tplan2 index 309e094..bcb46ca 100644 --- a/test-purposes/ietf_eth_tran_service.tplan2 +++ b/test-purposes/ietf_eth_tran_service.tplan2 @@ -15,7 +15,7 @@ Package ietf_eth_tran_types { bandwidth_profile_name of type string, bandwidth_profile_type of type BandwidthProfileType ; - collection of NamedBandwidthProfile NamedBandwidthProfiles + type NamedBandwidthProfiles; // List of NamedBandwidthProfile type EthtSvcInstance with etht_svc_name of type string, @@ -25,7 +25,7 @@ Package ietf_eth_tran_types { etht_svc_type of type service_type, etht_svc_lifecycle of type lifecycle_status ; - collection of EthtSvcInstance EthtSvcInstances + type EthtSvcInstances; // List of EthtSvcInstance type EthtSvc with globals of type Globals, diff --git a/test-purposes/mWT_Common.tplan2 b/test-purposes/mWT_Common.tplan2 index 416d0e6..0d14624 100644 --- a/test-purposes/mWT_Common.tplan2 +++ b/test-purposes/mWT_Common.tplan2 @@ -26,6 +26,8 @@ Package mWT_Common { - send - sends - receives + - having + - created ; } -- GitLab From 0b5bdd9865a4bfe36d18f8e8854c9095c9b71a98 Mon Sep 17 00:00:00 2001 From: garciay Date: Tue, 4 Jun 2024 08:00:10 +0200 Subject: [PATCH 08/15] Update TPs --- test-purposes/AtsMDSC.tplan2 | 460 +++++++++++++++++++++++--------- test-purposes/mWT_Common.tplan2 | 3 + 2 files changed, 336 insertions(+), 127 deletions(-) diff --git a/test-purposes/AtsMDSC.tplan2 b/test-purposes/AtsMDSC.tplan2 index 76777cf..62f53e1 100644 --- a/test-purposes/AtsMDSC.tplan2 +++ b/test-purposes/AtsMDSC.tplan2 @@ -193,6 +193,96 @@ Package AtsMDSC { Group "Blackbox" { + import all from mWT_Common; + + Test Purpose { + TP Id TP_mWT_PNC_BB_MW_TOPO_GET_BV_01 + + Test objective + "Verify that the IUT does not provide any MW network topology." + + Reference + "ETSI GS mWT 024 Clause 4.3.2", + "ETSI GS mWT 024 Annex A.2.3", + "RFC 8345 A YANG Data Model for Network Topologies", + "RFC 8795 YANG Data Model for Traffic Engineering (TE) Topologies" + + Config Id Config_mWT_2 + + PICS Selection IUT_PNC and RESTCONF and SEC_TLS and ABSTRACT_BB and MW_TOPO + + Initial conditions with { + the IUT entity is idle + } + + Expected behaviour + ensure that { + when { + the IUT entity receives a vRequestGet containing + uri indicating value "/restconf/data/ietf-network:networks"; + from the TEST_SYSTEM entity + } then { + the IUT entity sends a r200 containing + headers containing + content_type indicating value "application/yang-data+xml";, + body containing + networks containing + networksList containing + name_ indicating value any_value, + networks containing + network_id indicating value any_value, + network_types containing + not te_topology + ;, + node_id indicating value any_value, + termination_points indicating value any_value, + links indicating value any_value + ;;;;; + to the TEST_SYSTEM entity + } + } + } + + Test Purpose { + TP Id TP_mWT_PNC_BB_MW_TOPO_GET_BV_01 + + Test objective + "Verify that the IUT provides a network list containing only one node." + + Reference + "ETSI GS mWT 024 Clause 4.3.2", + "ETSI GS mWT 024 Annex A.2.3", + "RFC 8345 A YANG Data Model for Network Topologies", + "RFC 8795 YANG Data Model for Traffic Engineering (TE) Topologies" + + Config Id Config_mWT_2 + + PICS Selection IUT_PNC and RESTCONF and SEC_TLS and ABSTRACT_BB and MW_TOPO + + Initial conditions with { + the IUT entity is idle + } + + Expected behaviour + ensure that { + when { + the IUT entity receives a vRequestGet containing + uri indicating value "/restconf/data/ietf-network:networks"; + from the TEST_SYSTEM entity + } then { + the IUT entity sends a r200 containing + headers containing + content_type indicating value "application/yang-data+xml";, + body containing + networks containing + networksList containing + one network node + ;;;; + to the TEST_SYSTEM entity + } + } + } + } // End of Group "Blackbox" Group "PartiallyTransparent" { @@ -202,12 +292,13 @@ Package AtsMDSC { import all from mWT_Common; Test Purpose { - TP Id TP_mWT_PNC_MW_TOPO_GET_BV_01 + TP Id TP_mWT_PNC_PT_MW_TOPO_GET_BV_01 Test objective - "Verify that the IUT provides the MW network topology for all networks with mandatory mWT GC 024 data elements subset - black box abstraction level." + "Verify that the IUT provides the MW network topology for all networks with mandatory mWT GC 024 data elements subset." Reference + "ETSI GS mWT 024 Clause 4.3.3", "ETSI GS mWT 024 Annex A.2.2", "RFC 8345 A YANG Data Model for Network Topologies", "RFC 8795 YANG Data Model for Traffic Engineering (TE) Topologies", @@ -215,7 +306,7 @@ Package AtsMDSC { Config Id Config_mWT_2 - PICS Selection IUT_PNC and RESTCONF and SEC_TLS and ABSTRACT_BB and MW_TOPO + PICS Selection IUT_PNC and RESTCONF and SEC_TLS and ABSTRACT_PT and MW_TOPO Initial conditions with { the IUT entity is idle and @@ -226,7 +317,9 @@ Package AtsMDSC { ensure that { when { the IUT entity receives a vRequestGet containing - uri indicating value "/restconf/data/ietf-network:networks/topologyId/mw-native-topology"; + uri indicating value "/restconf/data/ietf-network:networks/topologyId/mw-native-topology", + headers containing + content_type indicating value "application/yang-data+xml";; from the TEST_SYSTEM entity } then { the IUT entity sends a r200 containing @@ -240,8 +333,9 @@ Package AtsMDSC { network_id indicating value any_value, network_types containing te_topology containing - mw_topology indicating value any_value - ;;, + mw_topology containing + mw_tp_choice indicating value any_value + ;;;, node_id indicating value any_value, termination_points indicating value any_value, links indicating value any_value @@ -252,30 +346,33 @@ Package AtsMDSC { } Test Purpose { - TP Id TP_mWT_PNC_MW_TOPO_GET_BV_02 + TP Id TP_mWT_PNC_PT_MW_TOPO_GET_BV_02 Test objective - "Verify that the IUT provides the MW network topology for a specific network with mandatory mWT GC 024 data elements subset - black box abstraction level." + "Verify that the IUT provides the MW network topology for a specific network with mandatory mWT GC 024 data elements subset." Reference - "ETSI GS mWT 024 Annex A.1.2", + "ETSI GS mWT 024 Clause 4.3.3", + "ETSI GS mWT 024 Annex A.2.2.1", "RFC 8345 A YANG Data Model for Network Topologies", "RFC 8795 YANG Data Model for Traffic Engineering (TE) Topologies" Config Id Config_mWT_2 - PICS Selection IUT_PNC and RESTCONF and SEC_TLS and ABSTRACT_BB and MW_TOPO + PICS Selection IUT_PNC and RESTCONF and SEC_TLS and ABSTRACT_PT and MW_TOPO Initial conditions with { the IUT entity is idle and - the IUT entity having discovered a network topology NET_TOPO + the IUT entity having discovered a network topology NETWORK_TOPO } Expected behaviour ensure that { when { the IUT entity receives a vRequestGet containing - uri indicating value "/restconf/data/ietf-microwave-topology/ietf-network:networks/network={NETWORK_ID)/topologyId/mw-native-topology"; + uri indicating value "/restconf/data/ietf-microwave-topology/ietf-network:networks/network={NETWORK_ID)/topologyId/mw-native-topology", + headers containing + content_type indicating value "application/yang-data+xml";; from the TEST_SYSTEM entity } then { the IUT entity sends a r200 containing @@ -286,8 +383,9 @@ Package AtsMDSC { network_id indicating value NETWORK_ID, network_types containing te_topology containing - mw_topology indicating value any_value - ;;, + mw_topology containing + mw_tp_choice indicating value any_value + ;;;, node_id indicating value any_value, termination_points indicating value any_value, links indicating value any_value @@ -298,24 +396,25 @@ Package AtsMDSC { } Test Purpose { - TP Id TP_mWT_PNC_MW_TOPO_GET_BO_01 + TP Id TP_mWT_PNC_PT_MW_TOPO_GET_BO_01 Test objective - "Verify that the IUT replies with an error code when the request is malformed - black box abstraction level." + "Verify that the IUT replies with an error code when the request is malformed." Reference + "ETSI GS mWT 024 Clause 4.3.3", "ETSI GS mWT 024 Clause 5.3.2 Exception Handling", - "ETSI GS mWT 024 Annex A.1.2", + "ETSI GS mWT 024 Annex A.2.2", "RFC 8345 A YANG Data Model for Network Topologies", "RFC 8795 YANG Data Model for Traffic Engineering (TE) Topologies" Config Id Config_mWT_2 - PICS Selection IUT_PNC and RESTCONF and SEC_TLS and ABSTRACT_BB and MW_TOPO + PICS Selection IUT_PNC and RESTCONF and SEC_TLS and ABSTRACT_PT and MW_TOPO Initial conditions with { the IUT entity is idle and - the IUT entity having discovered a network topology NET_TOPO + the IUT entity having discovered a network topology NETWORK_TOPO } Expected behaviour @@ -332,24 +431,25 @@ Package AtsMDSC { } Test Purpose { - TP Id TP_mWT_PNC_MW_TOPO_GET_BO_02 + TP Id TP_mWT_PNC_PT_MW_TOPO_GET_BO_02 Test objective - "Verify that the IUT replies with an error code when the network identifier is unknown - black box abstraction level." + "Verify that the IUT replies with an error code when the network identifier is unknown." Reference + "ETSI GS mWT 024 Clause 4.3.3", "ETSI GS mWT 024 Clause 5.3.2 Exception Handling", - "ETSI GS mWT 024 Annex A.1.2", + "ETSI GS mWT 024 Annex A.2.2", "RFC 8345 A YANG Data Model for Network Topologies", "RFC 8795 YANG Data Model for Traffic Engineering (TE) Topologies" Config Id Config_mWT_2 - PICS Selection IUT_PNC and RESTCONF and SEC_TLS and ABSTRACT_BB and MW_TOPO + PICS Selection IUT_PNC and RESTCONF and SEC_TLS and ABSTRACT_PT and MW_TOPO Initial conditions with { the IUT entity is idle and - the IUT entity having discovered a network topology NET_TOPO + the IUT entity having discovered a network topology NETWORK_TOPO } Expected behaviour @@ -366,20 +466,21 @@ Package AtsMDSC { } Test Purpose { - TP Id TP_mWT_PNC_MW_NODE_GET_BV_01 + TP Id TP_mWT_PNC_PT_MW_NODE_GET_BV_01 Test objective - "Verify that the IUT provides the MW network topology for all nodes with mandatory mWT GC 024 data elements subset - black box abstraction level." + "Verify that the IUT provides the MW network topology for all nodes with mandatory mWT GC 024 data elements subset." Reference - "ETSI GS mWT 024 Annex A.2.2", + "ETSI GS mWT 024 Clause 4.3.3", + "ETSI GS mWT 024 Annex A.2.2.1", "RFC 8345 A YANG Data Model for Network Topologies", "RFC 8795 YANG Data Model for Traffic Engineering (TE) Topologies", "draft-ietf-ccamp-mw-topo-yang-02 A YANG Data Model for Microwave Topology" Config Id Config_mWT_2 - PICS Selection IUT_PNC and RESTCONF and SEC_TLS and ABSTRACT_BB and MW_TOPO + PICS Selection IUT_PNC and RESTCONF and SEC_TLS and ABSTRACT_PT and MW_TOPO Initial conditions with { the IUT entity is idle and @@ -416,20 +517,21 @@ Package AtsMDSC { } Test Purpose { - TP Id TP_mWT_PNC_MW_NODE_GET_BV_02 + TP Id TP_mWT_PNC_PT_MW_NODE_GET_BV_02 Test objective - "Verify that the IUT provides the MW network topology for a specific node with mandatory mWT GC 024 data elements subset - black box abstraction level." + "Verify that the IUT provides the MW network topology for a specific node with mandatory mWT GC 024 data elements subset." Reference - "ETSI GS mWT 024 Annex A.2.2", + "ETSI GS mWT 024 Clause 4.3.3", + "ETSI GS mWT 024 Annex A.2.2.1", "RFC 8345 A YANG Data Model for Network Topologies", "RFC 8795 YANG Data Model for Traffic Engineering (TE) Topologies", "draft-ietf-ccamp-mw-topo-yang-02 A YANG Data Model for Microwave Topology" Config Id Config_mWT_2 - PICS Selection IUT_PNC and RESTCONF and SEC_TLS and ABSTRACT_BB and MW_TOPO + PICS Selection IUT_PNC and RESTCONF and SEC_TLS and ABSTRACT_PT and MW_TOPO Initial conditions with { the IUT entity is idle and @@ -451,12 +553,12 @@ Package AtsMDSC { networksList containing name_ indicating value any_value, networks containing - network_id indicating value any_value, + network_id indicating value NETWORK_ID, network_types containing te_topology containing mw_native_topology indicating value any_value ;;, - node_id indicating value any_value, + node_id indicating value NODE_ID, termination_points indicating value any_value, links indicating value any_value ;;;;; @@ -466,12 +568,13 @@ Package AtsMDSC { } Test Purpose { - TP Id TP_mWT_PNC_MW_NODE_GET_BO_01 + TP Id TP_mWT_PNC_PT_MW_NODE_GET_BO_01 Test objective - "Verify that the IUT replies with an error code when the node identifier is unknown - black box abstraction level." + "Verify that the IUT replies with an error code when the node identifier is unknown." Reference + "ETSI GS mWT 024 Clause 4.3.3", "ETSI GS mWT 024 Clause 5.3.2 Exception Handling", "ETSI GS mWT 024 Annex A.2.2", "RFC 8345 A YANG Data Model for Network Topologies", @@ -480,7 +583,7 @@ Package AtsMDSC { Config Id Config_mWT_2 - PICS Selection IUT_PNC and RESTCONF and SEC_TLS and ABSTRACT_BB and MW_TOPO + PICS Selection IUT_PNC and RESTCONF and SEC_TLS and ABSTRACT_PT and MW_TOPO Initial conditions with { the IUT entity is idle and @@ -502,18 +605,18 @@ Package AtsMDSC { } // End of Group "MWTopologyDiscovery" - Group "EthernetTopologyDiscovery" { // https://documenter.getpostman.com/view/26248101/2s93RTPrfd#6217d4c4-1c88-40de-8cb5-1141b0c2dcd3 - // IETF Logical Inventory restconf API + Group "EthernetTopologyDiscovery" { import all from mWT_Common; Test Purpose { - TP Id TP_mWT_PNC_ETH_TOPO_GET_BV_01 + TP Id TP_mWT_PNC_PT_ETH_TOPO_GET_BV_01 Test objective - "Verify that the IUT provides the Ethernet network topology for all networks with mandatory mWT GC 024 data elements subset - black box abstraction level." + "Verify that the IUT provides the Ethernet network topology for all networks with mandatory mWT GC 024 data elements subset." Reference + "ETSI GS mWT 024 Clause 4.3.3", "ETSI GS mWT 024 Annex A.2.2", "RFC 8345 A YANG Data Model for Network Topologies", "RFC 8795 YANG Data Model for Traffic Engineering (TE) Topologies", @@ -521,7 +624,7 @@ Package AtsMDSC { Config Id Config_mWT_2 - PICS Selection IUT_PNC and RESTCONF and SEC_TLS and ABSTRACT_BB and ETH_TOPO + PICS Selection IUT_PNC and RESTCONF and SEC_TLS and ABSTRACT_PT and ETH_TOPO Initial conditions with { the IUT entity is idle and @@ -532,7 +635,9 @@ Package AtsMDSC { ensure that { when { the IUT entity receives a vRequestGet containing - uri indicating value "/restconf/data/ietf-network:networks"; + uri indicating value "/restconf/data/ietf-network:networks", + headers containing + content_type indicating value "application/yang-data+xml";; from the TEST_SYSTEM entity } then { the IUT entity sends a r200 containing @@ -546,8 +651,9 @@ Package AtsMDSC { network_id indicating value any_value, network_types containing te_topology containing - mw_topology indicating value any_value - ;;, + mw_topology containing + mw_tp_choice indicating value any_value + ;;;, node_id indicating value any_value, termination_points indicating value any_value, links indicating value any_value @@ -558,30 +664,33 @@ Package AtsMDSC { } Test Purpose { - TP Id TP_mWT_PNC_ETH_TOPO_GET_BV_02 + TP Id TP_mWT_PNC_PT_ETH_TOPO_GET_BV_02 Test objective - "Verify that the IUT provides the Ethernet network topology for a specific network with mandatory mWT GC 024 data elements subset - black box abstraction level." + "Verify that the IUT provides the Ethernet network topology for a specific network with mandatory mWT GC 024 data elements subset." Reference + "ETSI GS mWT 024 Clause 4.3.3", "ETSI GS mWT 024 Annex A.1.2", "RFC 8345 A YANG Data Model for Network Topologies", "RFC 8795 YANG Data Model for Traffic Engineering (TE) Topologies" Config Id Config_mWT_2 - PICS Selection IUT_PNC and RESTCONF and SEC_TLS and ABSTRACT_BB and ETH_TOPO + PICS Selection IUT_PNC and RESTCONF and SEC_TLS and ABSTRACT_PT and ETH_TOPO Initial conditions with { the IUT entity is idle and - the IUT entity having discovered a network topology NET_TOPO + the IUT entity having discovered a network topology NETWORK_TOPO } Expected behaviour ensure that { when { the IUT entity receives a vRequestGet containing - uri indicating value "/restconf/data/ietf-network:networks/network={NETWORK_ID)"; + uri indicating value "/restconf/data/ietf-network:networks/network={NETWORK_ID)", + headers containing + content_type indicating value "application/yang-data+xml";; from the TEST_SYSTEM entity } then { the IUT entity sends a r200 containing @@ -602,12 +711,13 @@ Package AtsMDSC { } Test Purpose { - TP Id TP_mWT_PNC_ETH_TOPO_GET_BO_01 + TP Id TP_mWT_PNC_PT_ETH_TOPO_GET_BO_01 Test objective - "Verify that the IUT replies with an error code when the request is malformed - black box abstraction level." + "Verify that the IUT replies with an error code when the request is malformed." Reference + "ETSI GS mWT 024 Clause 4.3.3", "ETSI GS mWT 024 Clause 5.3.2 Exception Handling", "ETSI GS mWT 024 Annex A.1.2", "RFC 8345 A YANG Data Model for Network Topologies", @@ -615,11 +725,11 @@ Package AtsMDSC { Config Id Config_mWT_2 - PICS Selection IUT_PNC and RESTCONF and SEC_TLS and ABSTRACT_BB and ETH_TOPO + PICS Selection IUT_PNC and RESTCONF and SEC_TLS and ABSTRACT_PT and ETH_TOPO Initial conditions with { the IUT entity is idle and - the IUT entity having discovered a network topology NET_TOPO + the IUT entity having discovered a network topology NETWORK_TOPO } Expected behaviour @@ -636,12 +746,13 @@ Package AtsMDSC { } Test Purpose { - TP Id TP_mWT_PNC_ETH_TOPO_GET_BO_02 + TP Id TP_mWT_PNC_PT_ETH_TOPO_GET_BO_02 Test objective - "Verify that the IUT replies with an error code when the network identifier is unknown - black box abstraction level." + "Verify that the IUT replies with an error code when the network identifier is unknown." Reference + "ETSI GS mWT 024 Clause 4.3.3", "ETSI GS mWT 024 Clause 5.3.2 Exception Handling", "ETSI GS mWT 024 Annex A.1.2", "RFC 8345 A YANG Data Model for Network Topologies", @@ -649,11 +760,11 @@ Package AtsMDSC { Config Id Config_mWT_2 - PICS Selection IUT_PNC and RESTCONF and SEC_TLS and ABSTRACT_BB and ETH_TOPO + PICS Selection IUT_PNC and RESTCONF and SEC_TLS and ABSTRACT_PT and ETH_TOPO Initial conditions with { the IUT entity is idle and - the IUT entity having discovered a network topology NET_TOPO + the IUT entity having discovered a network topology NETWORK_TOPO } Expected behaviour @@ -670,12 +781,13 @@ Package AtsMDSC { } Test Purpose { - TP Id TP_mWT_PNC_ETH_NODE_GET_BV_01 + TP Id TP_mWT_PNC_PT_ETH_NODE_GET_BV_01 Test objective - "Verify that the IUT provides the Ethernet network topology for all nodes with mandatory mWT GC 024 data elements subset - black box abstraction level." + "Verify that the IUT provides the Ethernet network topology for all nodes with mandatory mWT GC 024 data elements subset." Reference + "ETSI GS mWT 024 Clause 4.3.3", "ETSI GS mWT 024 Annex A.2.2", "RFC 8345 A YANG Data Model for Network Topologies", "RFC 8795 YANG Data Model for Traffic Engineering (TE) Topologies", @@ -683,7 +795,7 @@ Package AtsMDSC { Config Id Config_mWT_2 - PICS Selection IUT_PNC and RESTCONF and SEC_TLS and ABSTRACT_BB and ETH_TOPO + PICS Selection IUT_PNC and RESTCONF and SEC_TLS and ABSTRACT_PT and ETH_TOPO Initial conditions with { the IUT entity is idle and @@ -708,8 +820,9 @@ Package AtsMDSC { network_id indicating value any_value, network_types containing te_topology containing - mw_topology indicating value any_value - ;;, + mw_topology containing + mw_tp_choice indicating value any_value + ;;;, node_id indicating value any_value, termination_points indicating value any_value, links indicating value any_value @@ -720,12 +833,13 @@ Package AtsMDSC { } Test Purpose { - TP Id TP_mWT_PNC_ETH_NODE_GET_BV_02 + TP Id TP_mWT_PNC_PT_ETH_NODE_GET_BV_02 Test objective - "Verify that the IUT provides the Ethernet network topology for specific node with mandatory mWT GC 024 data elements subset - black box abstraction level." + "Verify that the IUT provides the Ethernet network topology for specific node with mandatory mWT GC 024 data elements subset." Reference + "ETSI GS mWT 024 Clause 4.3.3", "ETSI GS mWT 024 Annex A.2.2", "RFC 8345 A YANG Data Model for Network Topologies", "RFC 8795 YANG Data Model for Traffic Engineering (TE) Topologies", @@ -733,7 +847,7 @@ Package AtsMDSC { Config Id Config_mWT_2 - PICS Selection IUT_PNC and RESTCONF and SEC_TLS and ABSTRACT_BB and ETH_TOPO + PICS Selection IUT_PNC and RESTCONF and SEC_TLS and ABSTRACT_PT and ETH_TOPO Initial conditions with { the IUT entity is idle and @@ -758,8 +872,9 @@ Package AtsMDSC { network_id indicating value any_value, network_types containing te_topology containing - mw_topology indicating value any_value - ;;, + mw_topology containing + mw_tp_choice indicating value any_value + ;;;, node_id indicating value any_value, termination_points indicating value any_value, links indicating value any_value @@ -770,12 +885,13 @@ Package AtsMDSC { } Test Purpose { - TP Id TP_mWT_PNC_ETH_NODE_GET_BO_01 + TP Id TP_mWT_PNC_PT_ETH_NODE_GET_BO_01 Test objective - "Verify that the IUT replies with an error code when the node identifier is unknown - black box abstraction level." + "Verify that the IUT replies with an error code when the node identifier is unknown." Reference + "ETSI GS mWT 024 Clause 4.3.3", "ETSI GS mWT 024 Clause 5.3.2 Exception Handling", "ETSI GS mWT 024 Annex A.2.2", "RFC 8345 A YANG Data Model for Network Topologies", @@ -784,7 +900,7 @@ Package AtsMDSC { Config Id Config_mWT_2 - PICS Selection IUT_PNC and RESTCONF and SEC_TLS and ABSTRACT_BB and ETH_TOPO + PICS Selection IUT_PNC and RESTCONF and SEC_TLS and ABSTRACT_PT and ETH_TOPO Initial conditions with { the IUT entity is idle and @@ -811,12 +927,13 @@ Package AtsMDSC { import all from mWT_Common; Test Purpose { - TP Id TP_mWT_PNC_ETH_SVC_GET_BV_01 + TP Id TP_mWT_PNC_PT_ETH_SVC_GET_BV_01 Test objective - "Verify that the IUT provides all the Bandwidth profiles with mandatory mWT GC 024 data elements subset - black box abstraction level." + "Verify that the IUT provides all the Bandwidth profiles with mandatory mWT GC 024 data elements subset." Reference + "ETSI GS mWT 024 Clause 4.3.3", "ETSI GS mWT 024 Annex A.2.2", "RFC 8345 A YANG Data Model for Network Topologies", "RFC 8795 YANG Data Model for Traffic Engineering (TE) Topologies", @@ -824,7 +941,7 @@ Package AtsMDSC { Config Id Config_mWT_2 - PICS Selection IUT_PNC and RESTCONF and SEC_TLS and ABSTRACT_BB + PICS Selection IUT_PNC and RESTCONF and SEC_TLS and ABSTRACT_PT Initial conditions with { the IUT entity is idle and @@ -844,7 +961,7 @@ Package AtsMDSC { headers containing content_type indicating value "application/yang-data+xml";, body containing - ethtSvc containing + eth_svc containing globals containing band_width_profiles containing band_width_profile indicating value BAND_WIDTH_PROFILE @@ -862,13 +979,14 @@ Package AtsMDSC { } Test Purpose { - TP Id TP_mWT_PNC_ETH_SVC_GET_BO_01 + TP Id TP_mWT_PNC_PT_ETH_SVC_GET_BO_01 Test objective - "Verify that the IUT replies with an error code when the request is malformed - black box abstraction level." + "Verify that the IUT replies with an error code when the request is malformed." Reference "ETSI GS mWT 024 Clause 4.2.2.1 Ethernet Ethernet Services", + "ETSI GS mWT 024 Clause 4.3.3", "ETSI GS mWT 024 Clause 5.3.2 Exception Handling", "ETSI GS mWT 024 Annex A.2.4", "RFC 6991 Common YANG Data Types", @@ -877,7 +995,7 @@ Package AtsMDSC { Config Id Config_mWT_2 - PICS Selection IUT_PNC and RESTCONF and SEC_TLS and ABSTRACT_BB + PICS Selection IUT_PNC and RESTCONF and SEC_TLS and ABSTRACT_PT Initial conditions with { the IUT entity is idle and @@ -898,13 +1016,14 @@ Package AtsMDSC { } Test Purpose { - TP Id TP_mWT_PNC_ETH_SVC_POST_BV_01 + TP Id TP_mWT_PNC_PT_ETH_SVC_POST_BV_01 Test objective - "Verify that the IUT creates a new Bandwidth profile with mandatory mWT GC 024 data elements subset - black box abstraction level." + "Verify that the IUT creates a new Bandwidth profile with mandatory mWT GC 024 data elements subset." Reference "ETSI GS mWT 024 Clause 4.2.2.1 Ethernet Ethernet Services", + "ETSI GS mWT 024 Clause 4.3.3", "ETSI GS mWT 024 Annex A.2.4", "RFC 6991 Common YANG Data Types", "RFC 8776 Common YANG Data Types for Traffic Engineering", @@ -912,7 +1031,7 @@ Package AtsMDSC { Config Id Config_mWT_2 - PICS Selection IUT_PNC and RESTCONF and SEC_TLS and ABSTRACT_BB and not BWP_SVS_IN_ONE_REQUEST + PICS Selection IUT_PNC and RESTCONF and SEC_TLS and ABSTRACT_PT and not BWP_SVS_IN_ONE_REQUEST Initial conditions with { the IUT entity is idle and @@ -926,7 +1045,7 @@ Package AtsMDSC { the IUT entity receives a vRequestPost containing uri indicating value "/restconf/data/ietf-eth-tran-service:etht-svc/globals", body containing - ethtSvc containing + eth_svc containing ethtSvcInstanceList containing ethtSvcInstance containing name_ indicating value ETHT_SVC_NAME, @@ -940,7 +1059,7 @@ Package AtsMDSC { headers containing content_type indicating value "application/yang-data+xml";, body containing - ethtSvc containing + eth_svc containing ethtSvcInstanceList containing ethtSvcInstance containing name_ indicating value ETHT_SVC_NAME, @@ -954,13 +1073,14 @@ Package AtsMDSC { } Test Purpose { - TP Id TP_mWT_PNC_ETH_SVC_POST_BV_02 + TP Id TP_mWT_PNC_PT_ETH_SVC_POST_BV_02_01 Test objective - "Verify that the IUT creates a new ethernet service with mandatory mWT GC 024 data elements subset - black box abstraction level." + "Verify that the IUT creates a new ethernet service with mandatory mWT GC 024 data elements subset." Reference "ETSI GS mWT 024 Clause 4.2.2.1 Ethernet Ethernet Services", + "ETSI GS mWT 024 Clause 4.3.3", "ETSI GS mWT 024 Annex A.2.4", "RFC 6991 Common YANG Data Types", "RFC 8776 Common YANG Data Types for Traffic Engineering", @@ -968,7 +1088,7 @@ Package AtsMDSC { Config Id Config_mWT_2 - PICS Selection IUT_PNC and RESTCONF and SEC_TLS and ABSTRACT_BB and not BWP_SVS_IN_ONE_REQUEST + PICS Selection IUT_PNC and RESTCONF and SEC_TLS and ABSTRACT_PT and not BWP_SVS_IN_ONE_REQUEST Initial conditions with { the IUT entity is idle and @@ -982,8 +1102,10 @@ Package AtsMDSC { when { the IUT entity receives a vRequestPost containing uri indicating value "/restconf/data/ietf-eth-tran-service:etht-svc", + headers containing + content_type indicating value "application/yang-data+xml";, body containing - ethtSvc containing + eth_svc containing ethtSvcInstanceList containing ethtSvcInstance containing name_ indicating value ETHT_SVC_NAME, @@ -997,7 +1119,7 @@ Package AtsMDSC { headers containing content_type indicating value "application/yang-data+xml";, body containing - ethtSvc containing + eth_svc containing ethtSvcInstanceList containing ethtSvcInstance containing name_ indicating value ETHT_SVC_NAME, @@ -1017,13 +1139,75 @@ Package AtsMDSC { } Test Purpose { - TP Id TP_mWT_PNC_ETH_SVC_POST_BV_03 + TP Id TP_mWT_PNC_PT_ETH_SVC_POST_BV_02_02 Test objective - "Verify that the IUT creates a new Bandwidth profile and and a new ethernet service in one POST with mandatory mWT GC 024 data elements subset - black box abstraction level." + "Verify that the IUT creates successfully a new Bandwidth profile ." + + Reference + "ETSI GS mWT 024 Clause 4.3.3", + "ETSI GS mWT 024 Annex A.2.2", + "RFC 8345 A YANG Data Model for Network Topologies", + "RFC 8795 YANG Data Model for Traffic Engineering (TE) Topologies", + "draft-ietf-ccamp-client-signal-yang-05 A YANG Data Model for Transport Network Client Signals" + + Config Id Config_mWT_2 + + PICS Selection IUT_PNC and RESTCONF and SEC_TLS and ABSTRACT_PT and not BWP_SVS_IN_ONE_REQUEST + + Initial conditions with { + the IUT entity is idle and + the IUT entity having discovered several MW ethernet networks topologies and + the IUT entity having a Bandwidth profile created and + the IUT entity not having a Bandwidth profile containing + bandwidthProfileName indicating value SDN_BANDWIDTH_PROFILE_NAME; and + the IUT entity having a service profile created + } + + Expected behaviour + ensure that { + when { + the IUT entity receives a vRequestPost containing + uri indicating value "/restconf/data/ietf-eth-tran-service:etht-svc/globals", + headers containing + content_type indicating value "application/yang-data+xml";, + body containing + bandwidthProfiles containing + bandwidthProfileName indicating value SDN_BANDWIDTH_PROFILE_NAME, + bandwidthProfileType indicating value SDN_SERVICE_TYPE, + bandwidthProfileCir indicating value CIR, + bandwidthProfileEir indicating value EIR, + bandwidthProfileColorAware indicating value COLOR_AWARE, + bandwidthCouplingFlag indicating value true + ;;; + from the TEST_SYSTEM entity + } then { + the IUT entity sends a r201 containing + headers containing + content_type indicating value "application/yang-data+xml";, + body containing + bandwidthProfiles containing + bandwidthProfileName indicating value SDN_BANDWIDTH_PROFILE_NAME, + bandwidthProfileType indicating value SDN_SERVICE_TYPE, + bandwidthProfileCir indicating value CIR, + bandwidthProfileEir indicating value EIR, + bandwidthProfileColorAware indicating value COLOR_AWARE, + bandwidthCouplingFlag indicating value true + ;;; + to the TEST_SYSTEM entity + } + } + } + + Test Purpose { + TP Id TP_mWT_PNC_PT_ETH_SVC_POST_BV_03 + + Test objective + "Verify that the IUT creates a new Bandwidth profile and and a new ethernet service in one POST with mandatory mWT GC 024 data elements subset." Reference "ETSI GS mWT 024 Clause 4.2.2.1 Ethernet Ethernet Services", + "ETSI GS mWT 024 Clause 4.3.3", "ETSI GS mWT 024 Annex A.2.4", "RFC 6991 Common YANG Data Types", "RFC 8776 Common YANG Data Types for Traffic Engineering", @@ -1031,7 +1215,7 @@ Package AtsMDSC { Config Id Config_mWT_2 - PICS Selection IUT_PNC and RESTCONF and SEC_TLS and ABSTRACT_BB and BWP_SVS_IN_ONE_REQUEST + PICS Selection IUT_PNC and RESTCONF and SEC_TLS and ABSTRACT_PT and BWP_SVS_IN_ONE_REQUEST Initial conditions with { the IUT entity is idle and @@ -1044,22 +1228,28 @@ Package AtsMDSC { when { the IUT entity receives a vRequestPost containing uri indicating value "/restconf/data/ietf-eth-tran-service:etht-svc/globals", + headers containing + content_type indicating value "application/yang-data+xml", body containing - ethtSvc containing + eth_svc containing ethtSvcInstanceList containing ethtSvcInstance containing name_ indicating value ETHT_SVC_NAME, title indicating value ETH_SVC_TITLE, desc indicating value ETH_SVC_DESC, - customer indicating value ETH_SVC_CUSTOMER - ;;;;; + customer indicating value ETH_SVC_CUSTOMER, + ingress_egress_bandwidth_profile containing + bandwidth_profile_type indicating value BANDWIDTH_PROFILE_TYPE, + cir indicating value CIR, + eir indicating value EIR + ;;;;;;; from the TEST_SYSTEM entity } then { the IUT entity sends a r201 containing headers containing content_type indicating value "application/yang-data+xml";, body containing - ethtSvc containing + eth_svc containing ethtSvcInstanceList containing ethtSvcInstance containing name_ indicating value ETHT_SVC_NAME, @@ -1073,12 +1263,13 @@ Package AtsMDSC { } Test Purpose { - TP Id TP_mWT_PNC_ETH_SVC_POST_BO_01 + TP Id TP_mWT_PNC_PT_ETH_SVC_POST_BO_01 Test objective - "Verify that the IUT replies with an error when the request is malformed - black box abstraction level." + "Verify that the IUT replies with an error when the request is malformed." Reference + "ETSI GS mWT 024 Clause 4.3.3", "ETSI GS mWT 024 Clause 5.3.2 Exception Handling", "ETSI GS mWT 024 Annex A.2.4", "RFC 6991 Common YANG Data Types", @@ -1087,7 +1278,7 @@ Package AtsMDSC { Config Id Config_mWT_2 - PICS Selection IUT_PNC and RESTCONF and SEC_TLS and ABSTRACT_BB and not BWP_SVS_IN_ONE_REQUEST + PICS Selection IUT_PNC and RESTCONF and SEC_TLS and ABSTRACT_PT and not BWP_SVS_IN_ONE_REQUEST Initial conditions with { the IUT entity is idle and @@ -1100,7 +1291,7 @@ Package AtsMDSC { the IUT entity receives a vRequestPost containing uri indicating value "/restconf/data/etht-svc/globals", // Malformed URI body containing - ethtSvc containing + eth_svc containing ethtSvcInstanceList containing ethtSvcInstance containing name_ indicating value ETHT_SVC_NAME, @@ -1117,13 +1308,14 @@ Package AtsMDSC { } Test Purpose { - TP Id TP_mWT_PNC_ETH_SVC_PUT_BV_01 + TP Id TP_mWT_PNC_PT_ETH_SVC_PUT_BV_01 Test objective - "Verify that the IUT updates an existing Bandwidth profile with mandatory mWT GC 024 data elements subset - black box abstraction level." + "Verify that the IUT updates an existing Bandwidth profile with mandatory mWT GC 024 data elements subset." Reference "ETSI GS mWT 024 Clause 4.2.2.1 Ethernet Ethernet Services", + "ETSI GS mWT 024 Clause 4.3.3", "ETSI GS mWT 024 Annex A.2.4", "RFC 6991 Common YANG Data Types", "RFC 8776 Common YANG Data Types for Traffic Engineering", @@ -1131,7 +1323,7 @@ Package AtsMDSC { Config Id Config_mWT_2 - PICS Selection IUT_PNC and RESTCONF and SEC_TLS and ABSTRACT_BB + PICS Selection IUT_PNC and RESTCONF and SEC_TLS and ABSTRACT_PT Initial conditions with { the IUT entity is idle and @@ -1144,8 +1336,10 @@ Package AtsMDSC { when { the IUT entity receives a vRequestPut containing uri indicating value "/restconf/data/ietf-eth-tran-service:etht-svc/globals", + headers containing + content_type indicating value "application/yang-data+xml";, body containing - ethtSvc containing + eth_svc containing globals containing namedBandwidthProfile containing bandwidth_profile_name indicating value BANDWIDTH_PROFILE_NAME, @@ -1162,7 +1356,7 @@ Package AtsMDSC { headers containing content_type indicating value "application/yang-data+xml";, body containing - ethtSvc containing + eth_svc containing globals containing namedBandwidthProfile containing bandwidth_profile_name indicating value BANDWIDTH_PROFILE_NAME, @@ -1179,13 +1373,14 @@ Package AtsMDSC { } Test Purpose { - TP Id TP_mWT_PNC_ETH_SVC_PUT_BV_02 + TP Id TP_mWT_PNC_PT_ETH_SVC_PUT_BV_02 Test objective - "Verify that the IUT updates an existing etehrnet service - black box abstraction level." + "Verify that the IUT updates an existing ethernet service." Reference "ETSI GS mWT 024 Clause 4.2.2.1 Ethernet Ethernet Services", + "ETSI GS mWT 024 Clause 4.3.3", "ETSI GS mWT 024 Annex A.2.4", "RFC 6991 Common YANG Data Types", "RFC 8776 Common YANG Data Types for Traffic Engineering", @@ -1193,7 +1388,7 @@ Package AtsMDSC { Config Id Config_mWT_2 - PICS Selection IUT_PNC and RESTCONF and SEC_TLS and ABSTRACT_BB + PICS Selection IUT_PNC and RESTCONF and SEC_TLS and ABSTRACT_PT Initial conditions with { the IUT entity is idle and @@ -1206,8 +1401,10 @@ Package AtsMDSC { when { the IUT entity receives a vRequestPut containing uri indicating value "/restconf/data/ietf-eth-tran-service:etht-svc/globals", + headers containing + content_type indicating value "application/yang-data+xml";, body containing - ethtSvc containing + eth_svc containing ethtSvcInstanceList containing ethtSvcInstance containing name_ indicating value ETHT_SVC_NAME, @@ -1221,7 +1418,7 @@ Package AtsMDSC { headers containing content_type indicating value "application/yang-data+xml";, body containing - ethtSvc containing + eth_svc containing ethtSvcInstanceList containing ethtSvcInstance containing name_ indicating value ETHT_SVC_NAME, @@ -1235,13 +1432,14 @@ Package AtsMDSC { } Test Purpose { - TP Id TP_mWT_PNC_ETH_SVC_PUT_BO_01 + TP Id TP_mWT_PNC_PT_ETH_SVC_PUT_BO_01 Test objective - "Verify that the IUT replies with an error code when updating an unknown Bandwidth profile with mandatory mWT GC 024 data elements subset - black box abstraction level." + "Verify that the IUT replies with an error code when updating an unknown Bandwidth profile with mandatory mWT GC 024 data elements subset." Reference "ETSI GS mWT 024 Clause 5.3.2 Exception Handling", + "ETSI GS mWT 024 Clause 4.3.3", "ETSI GS mWT 024 Annex A.2.4", "RFC 6991 Common YANG Data Types", "RFC 8776 Common YANG Data Types for Traffic Engineering", @@ -1249,7 +1447,7 @@ Package AtsMDSC { Config Id Config_mWT_2 - PICS Selection IUT_PNC and RESTCONF and SEC_TLS and ABSTRACT_BB + PICS Selection IUT_PNC and RESTCONF and SEC_TLS and ABSTRACT_PT Initial conditions with { the IUT entity is idle and @@ -1262,7 +1460,7 @@ Package AtsMDSC { the IUT entity receives a vRequestPut containing uri indicating value "/restconf/data/ietf-eth-tran-service:etht-svc/globals", body containing - ethtSvc containing + eth_svc containing ethtSvcInstanceList containing ethtSvcInstance containing name_ indicating value UNKNOWN_ETHT_SVC_NAME, @@ -1279,13 +1477,14 @@ Package AtsMDSC { } Test Purpose { - TP Id TP_mWT_PNC_ETH_SVC_DELETE_BV_01 + TP Id TP_mWT_PNC_PT_ETH_SVC_DELETE_BV_01 Test objective - "Verify that the IUT deletes an existing ethernet service - black box abstraction level." + "Verify that the IUT deletes an existing ethernet service." Reference "ETSI GS mWT 024 Clause 4.2.2.1 Ethernet Ethernet Services", + "ETSI GS mWT 024 Clause 4.3.3", "ETSI GS mWT 024 Annex A.2.4", "RFC 6991 Common YANG Data Types", "RFC 8776 Common YANG Data Types for Traffic Engineering", @@ -1293,7 +1492,7 @@ Package AtsMDSC { Config Id Config_mWT_2 - PICS Selection IUT_PNC and RESTCONF and SEC_TLS and ABSTRACT_BB + PICS Selection IUT_PNC and RESTCONF and SEC_TLS and ABSTRACT_PT Initial conditions with { the IUT entity is idle and @@ -1306,7 +1505,9 @@ Package AtsMDSC { ensure that { when { the IUT entity receives a vRequestDelete containing - uri indicating value "/restconf/data/ietf-eth-tran-service:etht-svc/etht-svc-instances=ETHT_SVC_NAME"; + uri indicating value "/restconf/data/ietf-eth-tran-service:etht-svc/etht-svc-instances=ETHT_SVC_NAME", + headers containing + content_type indicating value "application/yang-data+xml";; from the TEST_SYSTEM entity } then { the IUT entity sends a r204 @@ -1316,13 +1517,14 @@ Package AtsMDSC { } Test Purpose { - TP Id TP_mWT_PNC_ETH_SVC_DELETE_BV_02 + TP Id TP_mWT_PNC_PT_ETH_SVC_DELETE_BV_02 Test objective - "Verify that the IUT deletes an existing bandwidth profile - black box abstraction level." + "Verify that the IUT deletes an existing bandwidth profile." Reference "ETSI GS mWT 024 Clause 4.2.2.1 Ethernet Ethernet Services", + "ETSI GS mWT 024 Clause 4.3.3", "ETSI GS mWT 024 Annex A.2.4", "RFC 6991 Common YANG Data Types", "RFC 8776 Common YANG Data Types for Traffic Engineering", @@ -1330,7 +1532,7 @@ Package AtsMDSC { Config Id Config_mWT_2 - PICS Selection IUT_PNC and RESTCONF and SEC_TLS and ABSTRACT_BB + PICS Selection IUT_PNC and RESTCONF and SEC_TLS and ABSTRACT_PT Initial conditions with { the IUT entity is idle and @@ -1342,7 +1544,9 @@ Package AtsMDSC { ensure that { when { the IUT entity receives a vRequestDelete containing - uri indicating value "/restconf/data/ietf-eth-tran-service:etht-svc/globls/bandwitdh_profile_name=BANDWIDTH_PROFILE_NAME"; + uri indicating value "/restconf/data/ietf-eth-tran-service:etht-svc/globals/bandwitdh_profile_name=BANDWIDTH_PROFILE_NAME", + headers containing + content_type indicating value "application/yang-data+xml";; from the TEST_SYSTEM entity } then { the IUT entity sends a r204 @@ -1352,12 +1556,13 @@ Package AtsMDSC { } Test Purpose { - TP Id TP_mWT_PNC_ETH_SVC_DELETE_BO_01 + TP Id TP_mWT_PNC_PT_ETH_SVC_DELETE_BO_01 Test objective - "Verify that the IUT replies with an error code when the request is malformed - black box abstraction level." + "Verify that the IUT replies with an error code when the request is malformed." Reference + "ETSI GS mWT 024 Clause 4.3.3", "ETSI GS mWT 024 Clause 5.3.2 Exception Handling", "ETSI GS mWT 024 Annex A.2.4", "RFC 6991 Common YANG Data Types", @@ -1366,7 +1571,7 @@ Package AtsMDSC { Config Id Config_mWT_2 - PICS Selection IUT_PNC and RESTCONF and SEC_TLS and ABSTRACT_BB + PICS Selection IUT_PNC and RESTCONF and SEC_TLS and ABSTRACT_PT Initial conditions with { the IUT entity is idle and @@ -1387,12 +1592,13 @@ Package AtsMDSC { } Test Purpose { - TP Id TP_mWT_PNC_ETH_SVC_DELETE_BO_02 + TP Id TP_mWT_PNC_ETH_PT_SVC_DELETE_BO_02 Test objective - "Verify that the IUT replies with an error code when it is requested to delete an unknown Bandwidth profile - black box abstraction level." + "Verify that the IUT replies with an error code when it is requested to delete an unknown Bandwidth profile." Reference + "ETSI GS mWT 024 Clause 4.3.3", "ETSI GS mWT 024 Clause 5.3.2 Exception Handling", "ETSI GS mWT 024 Annex A.2.4", "RFC 6991 Common YANG Data Types", @@ -1401,7 +1607,7 @@ Package AtsMDSC { Config Id Config_mWT_2 - PICS Selection IUT_PNC and RESTCONF and SEC_TLS and ABSTRACT_BB + PICS Selection IUT_PNC and RESTCONF and SEC_TLS and ABSTRACT_PT Initial conditions with { the IUT entity is idle and diff --git a/test-purposes/mWT_Common.tplan2 b/test-purposes/mWT_Common.tplan2 index 0d14624..251fa25 100644 --- a/test-purposes/mWT_Common.tplan2 +++ b/test-purposes/mWT_Common.tplan2 @@ -9,6 +9,7 @@ Package mWT_Common { - IUT_PNC // ETSI GS mWT 0029-1 Table A.1.1 - RESTCONF // ETSI GS mWT 0029-1 Table A.2.1 - ABSTRACT_BB // ETSI GS mWT 0029-1 Table A.3.1 + - ABSTRACT_PT // ETSI GS mWT 0029-1 Table A.3.2 - MW_TOPO // ETSI GS mWT 0029-1 Table A.4.1 - ETH_TOPO // ETSI GS mWT 0029-1 Table A.4.2 - BWP_SVS_IN_ONE_REQUEST // @@ -108,6 +109,8 @@ Package mWT_Common { string BANDWIDTH_PROFILE_NAME; string ETHT_SVC_NAME; string UNKNOWN_ETHT_SVC_NAME; + string NETWORK_TOPO; + string BANDWIDTH_PROFILE_TYPE; uint64 CIR_VALUE; uint64 CBS_VALUE; uint64 EIR_VALUE; -- GitLab From 32d6a28c2e4ac285f5b313bdb7ff7ee34d7cc7e8 Mon Sep 17 00:00:00 2001 From: garciay Date: Tue, 4 Jun 2024 08:02:56 +0200 Subject: [PATCH 09/15] Add draft of Postman ATS --- postman/TTF_T029.postman_collection.json | 948 +++++++++++++++++++++++ 1 file changed, 948 insertions(+) create mode 100644 postman/TTF_T029.postman_collection.json diff --git a/postman/TTF_T029.postman_collection.json b/postman/TTF_T029.postman_collection.json new file mode 100644 index 0000000..8bda046 --- /dev/null +++ b/postman/TTF_T029.postman_collection.json @@ -0,0 +1,948 @@ +{ + "info": { + "_postman_id": "c9163952-03f7-4301-bae0-32c78f9702ce", + "name": "TTF_T029", + "schema": "https://schema.getpostman.com/json/collection/v2.1.0/collection.json", + "_exporter_id": "152820", + "_collection_link": "https://red-trinity-563699.postman.co/workspace/d54f0e73-b65d-41a2-8e4e-35b7b23cdd96/collection/152820-c9163952-03f7-4301-bae0-32c78f9702ce?action=share&source=collection_link&creator=152820" + }, + "item": [ + { + "name": "RESTCONF", + "item": [ + { + "name": "TC_mWT_PNC_RESTCONF_GET_BV_01", + "item": [ + { + "name": "TC_mWT_PNC_RESTCONF_GET_BV_01", + "event": [ + { + "listen": "test", + "script": { + "exec": [ + "pm.test(\"Verify that the response status code is 200\", function () {\r", + " pm.response.to.have.status(200);\r", + "});\r", + "\r", + "var responseData = '';\r", + "var topLevelPropertyName = '';\r", + "\r", + "pm.test(\"Verify that headers.Content-Type is 'application/yang-data+json'\", function () {\r", + " pm.expect(pm.response.headers.get('Content-Type')).is.equals('application/yang-data+json');\r", + " responseData = pm.response.json();\r", + " topLevelPropertyName = responseData.hasOwnProperty('modules-state') ? 'modules-state' : 'ietf-yang-library:modules-state';\r", + " console.info(topLevelPropertyName)\r", + "});\r", + "\r", + "var moduleList = {};\r", + "\r", + "pm.test(\"Validate the main field is 'ietf-yang-library:modules-state'\", function () {\r", + " pm.expect(responseData).to.be.an('object');\r", + " pm.expect(responseData).to.have.property(topLevelPropertyName);\r", + " });\r", + "\r", + "pm.test(\"Verify that the 'module' array is present and not empty\", function () {\r", + " pm.expect(responseData).to.be.an('object');\r", + " pm.expect(responseData[topLevelPropertyName][\"module\"]).to.be.an('array').with.lengthOf.at.least(1);\r", + " // Build the module list\r", + " responseData[topLevelPropertyName].module.forEach(function(item, index) {\r", + " pm.expect(item).to.have.property('name');\r", + " pm.expect(item).to.have.property('revision');\r", + " pm.expect(item).to.have.property('namespace');\r", + " if (moduleList.hasOwnProperty(item.name)) {\r", + " if (moduleList[item.name].revision < item.revision) {\r", + " moduleList[item.name] = item;\r", + " }\r", + " } else {\r", + " moduleList[item.name] = item;\r", + " }\r", + " });\r", + "});\r", + "" + ], + "type": "text/javascript", + "packages": {} + } + }, + { + "listen": "prerequest", + "script": { + "exec": [ + "// Check PICS requirements\r", + "if ((pm.environment.get('PICS_IUT_PNC') != \"true\") || (pm.environment.get('PICS_RESTCONF') != \"true\") || (pm.environment.get('PICS_SEC_TLS') != \"true\")) {\r", + " throw new Error('PICS_IUT_PNC and PICS_RESTCONF and PICS_SEC_TLS are required.');\r", + "}\r", + " \r", + "" + ], + "type": "text/javascript", + "packages": {} + } + } + ], + "request": { + "auth": { + "type": "basic", + "basic": [ + { + "key": "password", + "value": "{{PX_USER_PASSWD}}", + "type": "string" + }, + { + "key": "username", + "value": "{{PX_USER}}", + "type": "string" + } + ] + }, + "method": "GET", + "header": [ + { + "key": "Accept", + "value": "application/yang-data+json", + "type": "text" + } + ], + "url": { + "raw": "{{PX_PROTOCOL}}://{{PX_IUT_IP_ADDRESS}}:{{PX_IUT_IP_PORT}}/{{PX_ROOT_API}}/ietf-yang-library:modules-state", + "protocol": "{{PX_PROTOCOL}}", + "host": [ + "{{PX_IUT_IP_ADDRESS}}" + ], + "port": "{{PX_IUT_IP_PORT}}", + "path": [ + "{{PX_ROOT_API}}", + "ietf-yang-library:modules-state" + ] + }, + "description": "/restconf/data/ietf-yang-library:modules-state" + }, + "response": [ + { + "name": "TC_mWT_PNC_RESTCONF_GET_BV_01", + "originalRequest": { + "method": "GET", + "header": [ + { + "key": "Accept", + "value": "application/yang-data+json", + "type": "text" + } + ], + "url": { + "raw": "{{PROTOCOL}}://{{PX_IUT_IP_ADDRESS}}:{{PX_IUT_IP_PORT}}/{{PX_ROOT_API}}/ietf-yang-library:modules-state", + "protocol": "{{PROTOCOL}}", + "host": [ + "{{PX_IUT_IP_ADDRESS}}" + ], + "port": "{{PX_IUT_IP_PORT}}", + "path": [ + "{{PX_ROOT_API}}", + "ietf-yang-library:modules-state" + ] + } + }, + "status": "OK", + "code": 200, + "_postman_previewlanguage": "json", + "header": [ + { + "key": "Server", + "value": "nginx/1.13.12" + }, + { + "key": "Date", + "value": "Mon, 15 Jan 2024 13:05:11 GMT" + }, + { + "key": "Content-Type", + "value": "application/yang-data+json" + }, + { + "key": "Transfer-Encoding", + "value": "chunked" + }, + { + "key": "Connection", + "value": "keep-alive" + }, + { + "key": "Last-Modified", + "value": "Fri, 05 Jan 2024 23:51:47 GMT" + }, + { + "key": "Cache-Control", + "value": "private, no-cache, must-revalidate, proxy-revalidate" + }, + { + "key": "Etag", + "value": "\"1704-498707-561003\"" + }, + { + "key": "Pragma", + "value": "no-cache" + }, + { + "key": "Content-Security-Policy", + "value": "default-src 'self'; block-all-mixed-content; base-uri 'self'; frame-ancestors 'none';" + }, + { + "key": "Strict-Transport-Security", + "value": "max-age=15552000; includeSubDomains" + }, + { + "key": "X-Content-Type-Options", + "value": "nosniff" + }, + { + "key": "X-Frame-Options", + "value": "DENY" + }, + { + "key": "X-XSS-Protection", + "value": "1; mode=block" + } + ], + "cookie": [], + "body": "{\n \"ietf-yang-library:modules-state\": {\n \"module-set-id\": \"f02b3be052f1d4283e0f6a59f79b6082\",\n \"module\": [\n {\n \"name\": \"cisco-asa-cli\",\n \"revision\": \"\",\n \"schema\": \"https://localhost:443/restconf/tailf/modules/cisco-asa-cli\",\n \"namespace\": \"http://tail-f.com/ns/ned-id/cisco-asa-cli\",\n \"conformance-type\": \"import\"\n },\n {\n \"name\": \"cisco-asa-cli-6.12\",\n \"revision\": \"\",\n \"schema\": \"https://localhost:443/restconf/tailf/modules/cisco-asa-cli-6.12\",\n \"namespace\": \"http://tail-f.com/ns/ned-id/cisco-asa-cli-6.12\",\n \"conformance-type\": \"import\"\n },\n {\n \"name\": \"cisco-ios-cli\",\n \"revision\": \"\",\n \"schema\": \"https://localhost:443/restconf/tailf/modules/cisco-ios-cli\",\n \"namespace\": \"http://tail-f.com/ns/ned-id/cisco-ios-cli\",\n \"conformance-type\": \"import\"\n },\n {\n \"name\": \"cisco-ios-cli-6.67\",\n \"revision\": \"\",\n \"schema\": \"https://localhost:443/restconf/tailf/modules/cisco-ios-cli-6.67\",\n \"namespace\": \"http://tail-f.com/ns/ned-id/cisco-ios-cli-6.67\",\n \"conformance-type\": \"import\"\n },\n {\n \"name\": \"cisco-iosxr-cli\",\n \"revision\": \"\",\n \"schema\": \"https://localhost:443/restconf/tailf/modules/cisco-iosxr-cli\",\n \"namespace\": \"http://tail-f.com/ns/ned-id/cisco-iosxr-cli\",\n \"conformance-type\": \"import\"\n },\n {\n \"name\": \"cisco-iosxr-cli-7.32\",\n \"revision\": \"\",\n \"schema\": \"https://localhost:443/restconf/tailf/modules/cisco-iosxr-cli-7.32\",\n \"namespace\": \"http://tail-f.com/ns/ned-id/cisco-iosxr-cli-7.32\",\n \"conformance-type\": \"import\"\n },\n {\n \"name\": \"cisco-nx-cli\",\n \"revision\": \"\",\n \"schema\": \"https://localhost:443/restconf/tailf/modules/cisco-nx-cli\",\n \"namespace\": \"http://tail-f.com/ns/ned-id/cisco-nx-cli\",\n \"conformance-type\": \"import\"\n },\n {\n \"name\": \"cisco-nx-cli-5.20\",\n \"revision\": \"\",\n \"schema\": \"https://localhost:443/restconf/tailf/modules/cisco-nx-cli-5.20\",\n \"namespace\": \"http://tail-f.com/ns/ned-id/cisco-nx-cli-5.20\",\n \"conformance-type\": \"import\"\n },\n {\n \"name\": \"encryption-usm\",\n \"revision\": \"\",\n \"schema\": \"https://localhost:443/restconf/tailf/modules/encryption-usm\",\n \"namespace\": \"http://tailf.com/ns/encryption-usm\",\n \"conformance-type\": \"implement\"\n },\n {\n \"name\": \"iana-crypt-hash\",\n \"revision\": \"2014-08-06\",\n \"schema\": \"https://localhost:443/restconf/tailf/modules/iana-crypt-hash/2014-08-06\",\n \"namespace\": \"urn:ietf:params:xml:ns:yang:iana-crypt-hash\",\n \"feature\": [\n \"crypt-hash-md5\",\n \"crypt-hash-sha-256\",\n \"crypt-hash-sha-512\"\n ],\n \"conformance-type\": \"implement\"\n },\n {\n \"name\": \"id-allocator\",\n \"revision\": \"2017-08-14\",\n \"schema\": \"https://localhost:443/restconf/tailf/modules/id-allocator/2017-08-14\",\n \"namespace\": \"http://tail-f.com/pkg/id-allocator\",\n \"conformance-type\": \"implement\",\n \"submodule\": [\n {\n \"name\": \"id-allocator-alarms\",\n \"revision\": \"2017-02-09\",\n \"schema\": \"https://localhost:443/restconf/tailf/modules/id-allocator-alarms/2017-02-09\"\n }\n ]\n },\n {\n \"name\": \"id-allocator-oper\",\n \"revision\": \"2015-10-20\",\n \"schema\": \"https://localhost:443/restconf/tailf/modules/id-allocator-oper/2015-10-20\",\n \"namespace\": \"http://tail-f.com/pkg/id-allocator-oper\",\n \"conformance-type\": \"implement\"\n },\n {\n \"name\": \"ietf-datastores\",\n \"revision\": \"2018-02-14\",\n \"schema\": \"https://localhost:443/restconf/tailf/modules/ietf-datastores/2018-02-14\",\n \"namespace\": \"urn:ietf:params:xml:ns:yang:ietf-datastores\",\n \"conformance-type\": \"import\"\n },\n {\n \"name\": \"ietf-inet-types\",\n \"revision\": \"2013-07-15\",\n \"schema\": \"https://localhost:443/restconf/tailf/modules/ietf-inet-types/2013-07-15\",\n \"namespace\": \"urn:ietf:params:xml:ns:yang:ietf-inet-types\",\n \"conformance-type\": \"import\"\n },\n {\n \"name\": \"ietf-interfaces\",\n \"revision\": \"2018-02-20\",\n \"schema\": \"https://localhost:443/restconf/tailf/modules/ietf-interfaces/2018-02-20\",\n \"namespace\": \"urn:ietf:params:xml:ns:yang:ietf-interfaces\",\n \"feature\": [\n \"arbitrary-names\",\n \"if-mib\",\n \"pre-provisioning\"\n ],\n \"conformance-type\": \"import\"\n },\n {\n \"name\": \"ietf-ip\",\n \"revision\": \"2018-02-22\",\n \"schema\": \"https://localhost:443/restconf/tailf/modules/ietf-ip/2018-02-22\",\n \"namespace\": \"urn:ietf:params:xml:ns:yang:ietf-ip\",\n \"feature\": [\n \"ipv4-non-contiguous-netmasks\",\n \"ipv6-privacy-autoconf\"\n ],\n \"conformance-type\": \"import\"\n },\n {\n \"name\": \"ietf-netconf-acm\",\n \"revision\": \"2018-02-14\",\n \"schema\": \"https://localhost:443/restconf/tailf/modules/ietf-netconf-acm/2018-02-14\",\n \"namespace\": \"urn:ietf:params:xml:ns:yang:ietf-netconf-acm\",\n \"conformance-type\": \"implement\"\n },\n {\n \"name\": \"ietf-netconf-monitoring\",\n \"revision\": \"2010-10-04\",\n \"schema\": \"https://localhost:443/restconf/tailf/modules/ietf-netconf-monitoring/2010-10-04\",\n \"namespace\": \"urn:ietf:params:xml:ns:yang:ietf-netconf-monitoring\",\n \"conformance-type\": \"implement\"\n },\n {\n \"name\": \"ietf-netconf-notifications\",\n \"revision\": \"2012-02-06\",\n \"schema\": \"https://localhost:443/restconf/tailf/modules/ietf-netconf-notifications/2012-02-06\",\n \"namespace\": \"urn:ietf:params:xml:ns:yang:ietf-netconf-notifications\",\n \"conformance-type\": \"implement\"\n },\n {\n \"name\": \"ietf-network-instance\",\n \"revision\": \"2019-01-21\",\n \"schema\": \"https://localhost:443/restconf/tailf/modules/ietf-network-instance/2019-01-21\",\n \"namespace\": \"urn:ietf:params:xml:ns:yang:ietf-network-instance\",\n \"conformance-type\": \"import\"\n },\n {\n \"name\": \"ietf-origin\",\n \"revision\": \"2018-02-14\",\n \"schema\": \"https://localhost:443/restconf/tailf/modules/ietf-origin/2018-02-14\",\n \"namespace\": \"urn:ietf:params:xml:ns:yang:ietf-origin\",\n \"conformance-type\": \"import\"\n },\n {\n \"name\": \"ietf-restconf\",\n \"revision\": \"2017-01-26\",\n \"schema\": \"https://localhost:443/restconf/tailf/modules/ietf-restconf/2017-01-26\",\n \"namespace\": \"urn:ietf:params:xml:ns:yang:ietf-restconf\",\n \"conformance-type\": \"implement\"\n },\n {\n \"name\": \"ietf-restconf-monitoring\",\n \"revision\": \"2017-01-26\",\n \"schema\": \"https://localhost:443/restconf/tailf/modules/ietf-restconf-monitoring/2017-01-26\",\n \"namespace\": \"urn:ietf:params:xml:ns:yang:ietf-restconf-monitoring\",\n \"conformance-type\": \"implement\"\n },\n {\n \"name\": \"ietf-x509-cert-to-name\",\n \"revision\": \"2014-12-10\",\n \"schema\": \"https://localhost:443/restconf/tailf/modules/ietf-x509-cert-to-name/2014-12-10\",\n \"namespace\": \"urn:ietf:params:xml:ns:yang:ietf-x509-cert-to-name\",\n \"conformance-type\": \"import\"\n },\n {\n \"name\": \"ietf-yang-library\",\n \"revision\": \"2019-01-04\",\n \"schema\": \"https://localhost:443/restconf/tailf/modules/ietf-yang-library/2019-01-04\",\n \"namespace\": \"urn:ietf:params:xml:ns:yang:ietf-yang-library\",\n \"conformance-type\": \"implement\"\n },\n {\n \"name\": \"ietf-yang-patch\",\n \"revision\": \"2017-02-22\",\n \"schema\": \"https://localhost:443/restconf/tailf/modules/ietf-yang-patch/2017-02-22\",\n \"namespace\": \"urn:ietf:params:xml:ns:yang:ietf-yang-patch\",\n \"conformance-type\": \"implement\"\n },\n {\n \"name\": \"ietf-yang-schema-mount\",\n \"revision\": \"2019-01-14\",\n \"schema\": \"https://localhost:443/restconf/tailf/modules/ietf-yang-schema-mount/2019-01-14\",\n \"namespace\": \"urn:ietf:params:xml:ns:yang:ietf-yang-schema-mount\",\n \"conformance-type\": \"implement\"\n },\n {\n \"name\": \"ietf-yang-smiv2\",\n \"revision\": \"2012-06-22\",\n \"schema\": \"https://localhost:443/restconf/tailf/modules/ietf-yang-smiv2/2012-06-22\",\n \"namespace\": \"urn:ietf:params:xml:ns:yang:ietf-yang-smiv2\",\n \"conformance-type\": \"import\"\n },\n {\n \"name\": \"ietf-yang-types\",\n \"revision\": \"2013-07-15\",\n \"schema\": \"https://localhost:443/restconf/tailf/modules/ietf-yang-types/2013-07-15\",\n \"namespace\": \"urn:ietf:params:xml:ns:yang:ietf-yang-types\",\n \"conformance-type\": \"import\"\n },\n {\n \"name\": \"ipaddress-allocator\",\n \"revision\": \"2018-02-27\",\n \"schema\": \"https://localhost:443/restconf/tailf/modules/ipaddress-allocator/2018-02-27\",\n \"namespace\": \"http://tail-f.com/pkg/ipaddress-allocator\",\n \"conformance-type\": \"implement\",\n \"submodule\": [\n {\n \"name\": \"ipaddress-allocator-alarms\",\n \"revision\": \"2017-02-09\",\n \"schema\": \"https://localhost:443/restconf/tailf/modules/ipaddress-allocator-alarms/2017-02-09\"\n }\n ]\n },\n {\n \"name\": \"ipaddress-allocator-oper\",\n \"revision\": \"2015-10-20\",\n \"schema\": \"https://localhost:443/restconf/tailf/modules/ipaddress-allocator-oper/2015-10-20\",\n \"namespace\": \"http://tail-f.com/pkg/ipaddress-allocator-oper\",\n \"conformance-type\": \"implement\"\n },\n {\n \"name\": \"resource-allocator\",\n \"revision\": \"2020-07-29\",\n \"schema\": \"https://localhost:443/restconf/tailf/modules/resource-allocator/2020-07-29\",\n \"namespace\": \"http://tail-f.com/pkg/resource-allocator\",\n \"conformance-type\": \"implement\"\n },\n {\n \"name\": \"selftest\",\n \"revision\": \"2016-12-05\",\n \"schema\": \"https://localhost:443/restconf/tailf/modules/selftest/2016-12-05\",\n \"namespace\": \"http://cisco.com/self-test-action\",\n \"conformance-type\": \"implement\"\n },\n {\n \"name\": \"snmp\",\n \"revision\": \"2010-10-22\",\n \"schema\": \"https://localhost:443/restconf/tailf/modules/snmp/2010-10-22\",\n \"namespace\": \"http://tailf.com/ns/snmp\",\n \"conformance-type\": \"implement\",\n \"submodule\": [\n {\n \"name\": \"snmp-agent\",\n \"revision\": \"\",\n \"schema\": \"https://localhost:443/restconf/tailf/modules/snmp-agent\"\n },\n {\n \"name\": \"snmp-common\",\n \"revision\": \"\",\n \"schema\": \"https://localhost:443/restconf/tailf/modules/snmp-common\"\n },\n {\n \"name\": \"snmp-community\",\n \"revision\": \"\",\n \"schema\": \"https://localhost:443/restconf/tailf/modules/snmp-community\"\n },\n {\n \"name\": \"snmp-notification\",\n \"revision\": \"\",\n \"schema\": \"https://localhost:443/restconf/tailf/modules/snmp-notification\"\n },\n {\n \"name\": \"snmp-target\",\n \"revision\": \"\",\n \"schema\": \"https://localhost:443/restconf/tailf/modules/snmp-target\"\n },\n {\n \"name\": \"snmp-target-params\",\n \"revision\": \"\",\n \"schema\": \"https://localhost:443/restconf/tailf/modules/snmp-target-params\"\n },\n {\n \"name\": \"snmp-usm\",\n \"revision\": \"\",\n \"schema\": \"https://localhost:443/restconf/tailf/modules/snmp-usm\"\n },\n {\n \"name\": \"snmp-vacm\",\n \"revision\": \"\",\n \"schema\": \"https://localhost:443/restconf/tailf/modules/snmp-vacm\"\n }\n ]\n },\n {\n \"name\": \"svi_verify_example\",\n \"revision\": \"2016-01-01\",\n \"schema\": \"https://localhost:443/restconf/tailf/modules/svi_verify_example/2016-01-01\",\n \"namespace\": \"http://example.com/svi_verify_example\",\n \"conformance-type\": \"implement\"\n },\n {\n \"name\": \"tailf-aaa\",\n \"revision\": \"2018-09-12\",\n \"schema\": \"https://localhost:443/restconf/tailf/modules/tailf-aaa/2018-09-12\",\n \"namespace\": \"http://tail-f.com/ns/aaa/1.1\",\n \"conformance-type\": \"implement\"\n },\n {\n \"name\": \"tailf-acm\",\n \"revision\": \"2013-03-07\",\n \"schema\": \"https://localhost:443/restconf/tailf/modules/tailf-acm/2013-03-07\",\n \"namespace\": \"http://tail-f.com/yang/acm\",\n \"conformance-type\": \"implement\"\n },\n {\n \"name\": \"tailf-common\",\n \"revision\": \"2020-12-08\",\n \"schema\": \"https://localhost:443/restconf/tailf/modules/tailf-common/2020-12-08\",\n \"namespace\": \"http://tail-f.com/yang/common\",\n \"conformance-type\": \"import\",\n \"submodule\": [\n {\n \"name\": \"tailf-cli-extensions\",\n \"revision\": \"2020-04-17\",\n \"schema\": \"https://localhost:443/restconf/tailf/modules/tailf-cli-extensions/2020-04-17\"\n },\n {\n \"name\": \"tailf-meta-extensions\",\n \"revision\": \"2017-03-08\",\n \"schema\": \"https://localhost:443/restconf/tailf/modules/tailf-meta-extensions/2017-03-08\"\n }\n ]\n },\n {\n \"name\": \"tailf-common-monitoring\",\n \"revision\": \"2019-04-09\",\n \"schema\": \"https://localhost:443/restconf/tailf/modules/tailf-common-monitoring/2019-04-09\",\n \"namespace\": \"http://tail-f.com/yang/common-monitoring\",\n \"conformance-type\": \"import\"\n },\n {\n \"name\": \"tailf-common-query\",\n \"revision\": \"2017-12-15\",\n \"schema\": \"https://localhost:443/restconf/tailf/modules/tailf-common-query/2017-12-15\",\n \"namespace\": \"http://tail-f.com/ns/common/query\",\n \"conformance-type\": \"import\"\n },\n {\n \"name\": \"tailf-configuration-policy\",\n \"revision\": \"2010-11-04\",\n \"schema\": \"https://localhost:443/restconf/tailf/modules/tailf-configuration-policy/2010-11-04\",\n \"namespace\": \"http://tail-f.com/yang/configuration-policy\",\n \"conformance-type\": \"implement\"\n },\n {\n \"name\": \"tailf-kicker\",\n \"revision\": \"2017-09-28\",\n \"schema\": \"https://localhost:443/restconf/tailf/modules/tailf-kicker/2017-09-28\",\n \"namespace\": \"http://tail-f.com/ns/kicker\",\n \"conformance-type\": \"implement\"\n },\n {\n \"name\": \"tailf-last-login\",\n \"revision\": \"2019-11-21\",\n \"schema\": \"https://localhost:443/restconf/tailf/modules/tailf-last-login/2019-11-21\",\n \"namespace\": \"http://tail-f.com/yang/last-login\",\n \"conformance-type\": \"implement\"\n },\n {\n \"name\": \"tailf-ncs\",\n \"revision\": \"2021-03-09\",\n \"schema\": \"https://localhost:443/restconf/tailf/modules/tailf-ncs/2021-03-09\",\n \"namespace\": \"http://tail-f.com/ns/ncs\",\n \"conformance-type\": \"implement\",\n \"submodule\": [\n {\n \"name\": \"tailf-ncs-cluster\",\n \"revision\": \"2019-11-28\",\n \"schema\": \"https://localhost:443/restconf/tailf/modules/tailf-ncs-cluster/2019-11-28\"\n },\n {\n \"name\": \"tailf-ncs-common\",\n \"revision\": \"2019-11-28\",\n \"schema\": \"https://localhost:443/restconf/tailf/modules/tailf-ncs-common/2019-11-28\"\n },\n {\n \"name\": \"tailf-ncs-compliance\",\n \"revision\": \"2016-05-26\",\n \"schema\": \"https://localhost:443/restconf/tailf/modules/tailf-ncs-compliance/2016-05-26\"\n },\n {\n \"name\": \"tailf-ncs-customers\",\n \"revision\": \"2012-08-30\",\n \"schema\": \"https://localhost:443/restconf/tailf/modules/tailf-ncs-customers/2012-08-30\"\n },\n {\n \"name\": \"tailf-ncs-devices\",\n \"revision\": \"2020-12-08\",\n \"schema\": \"https://localhost:443/restconf/tailf/modules/tailf-ncs-devices/2020-12-08\"\n },\n {\n \"name\": \"tailf-ncs-high-availability\",\n \"revision\": \"2020-06-25\",\n \"schema\": \"https://localhost:443/restconf/tailf/modules/tailf-ncs-high-availability/2020-06-25\"\n },\n {\n \"name\": \"tailf-ncs-java-vm\",\n \"revision\": \"2019-11-28\",\n \"schema\": \"https://localhost:443/restconf/tailf/modules/tailf-ncs-java-vm/2019-11-28\"\n },\n {\n \"name\": \"tailf-ncs-log\",\n \"revision\": \"2019-04-09\",\n \"schema\": \"https://localhost:443/restconf/tailf/modules/tailf-ncs-log/2019-04-09\"\n },\n {\n \"name\": \"tailf-ncs-packages\",\n \"revision\": \"2020-06-25\",\n \"schema\": \"https://localhost:443/restconf/tailf/modules/tailf-ncs-packages/2020-06-25\"\n },\n {\n \"name\": \"tailf-ncs-plan\",\n \"revision\": \"2020-12-08\",\n \"schema\": \"https://localhost:443/restconf/tailf/modules/tailf-ncs-plan/2020-12-08\"\n },\n {\n \"name\": \"tailf-ncs-python-vm\",\n \"revision\": \"2019-04-09\",\n \"schema\": \"https://localhost:443/restconf/tailf/modules/tailf-ncs-python-vm/2019-04-09\"\n },\n {\n \"name\": \"tailf-ncs-service-progress-monitoring\",\n \"revision\": \"2018-06-01\",\n \"schema\": \"https://localhost:443/restconf/tailf/modules/tailf-ncs-service-progress-monitoring/2018-06-01\"\n },\n {\n \"name\": \"tailf-ncs-services\",\n \"revision\": \"2020-12-08\",\n \"schema\": \"https://localhost:443/restconf/tailf/modules/tailf-ncs-services/2020-12-08\"\n },\n {\n \"name\": \"tailf-ncs-smart-license\",\n \"revision\": \"2020-06-25\",\n \"schema\": \"https://localhost:443/restconf/tailf/modules/tailf-ncs-smart-license/2020-06-25\"\n },\n {\n \"name\": \"tailf-ncs-snmp-notification-receiver\",\n \"revision\": \"2012-08-30\",\n \"schema\": \"https://localhost:443/restconf/tailf/modules/tailf-ncs-snmp-notification-receiver/2012-08-30\"\n },\n {\n \"name\": \"tailf-ncs-software\",\n \"revision\": \"2021-03-09\",\n \"schema\": \"https://localhost:443/restconf/tailf/modules/tailf-ncs-software/2021-03-09\"\n },\n {\n \"name\": \"tailf-ncs-ssh\",\n \"revision\": \"2019-11-28\",\n \"schema\": \"https://localhost:443/restconf/tailf/modules/tailf-ncs-ssh/2019-11-28\"\n }\n ]\n },\n {\n \"name\": \"tailf-ncs-acm\",\n \"revision\": \"2019-11-28\",\n \"schema\": \"https://localhost:443/restconf/tailf/modules/tailf-ncs-acm/2019-11-28\",\n \"namespace\": \"http://tail-f.com/yang/ncs-acm\",\n \"conformance-type\": \"implement\"\n },\n {\n \"name\": \"tailf-ncs-alarms\",\n \"revision\": \"2020-06-25\",\n \"schema\": \"https://localhost:443/restconf/tailf/modules/tailf-ncs-alarms/2020-06-25\",\n \"namespace\": \"http://tail-f.com/ns/ncs-alarms\",\n \"conformance-type\": \"implement\"\n },\n {\n \"name\": \"tailf-ncs-devices-yang-library\",\n \"revision\": \"2019-11-28\",\n \"schema\": \"https://localhost:443/restconf/tailf/modules/tailf-ncs-devices-yang-library/2019-11-28\",\n \"namespace\": \"http://tail-f.com/ns/ncs/devices-yang-library\",\n \"conformance-type\": \"implement\"\n },\n {\n \"name\": \"tailf-ncs-kicker-extension\",\n \"revision\": \"2019-04-09\",\n \"schema\": \"https://localhost:443/restconf/tailf/modules/tailf-ncs-kicker-extension/2019-04-09\",\n \"namespace\": \"http://tail-f.com/ns/ncs-kicker\",\n \"conformance-type\": \"implement\"\n },\n {\n \"name\": \"tailf-ncs-monitoring\",\n \"revision\": \"2019-04-09\",\n \"schema\": \"https://localhost:443/restconf/tailf/modules/tailf-ncs-monitoring/2019-04-09\",\n \"namespace\": \"http://tail-f.com/yang/ncs-monitoring\",\n \"conformance-type\": \"implement\"\n },\n {\n \"name\": \"tailf-ncs-ned\",\n \"revision\": \"2019-04-09\",\n \"schema\": \"https://localhost:443/restconf/tailf/modules/tailf-ncs-ned/2019-04-09\",\n \"namespace\": \"http://tail-f.com/ns/ncs-ned\",\n \"conformance-type\": \"import\"\n },\n {\n \"name\": \"tailf-ncs-netconf-ned-builder\",\n \"revision\": \"2020-06-25\",\n \"schema\": \"https://localhost:443/restconf/tailf/modules/tailf-ncs-netconf-ned-builder/2020-06-25\",\n \"namespace\": \"http://tail-f.com/ns/ncs/netconf-ned-builder\",\n \"conformance-type\": \"implement\"\n },\n {\n \"name\": \"tailf-ncs-progress\",\n \"revision\": \"2020-06-25\",\n \"schema\": \"https://localhost:443/restconf/tailf/modules/tailf-ncs-progress/2020-06-25\",\n \"namespace\": \"http://tail-f.com/ns/ncs-progress\",\n \"conformance-type\": \"implement\"\n },\n {\n \"name\": \"tailf-ncs-scheduler\",\n \"revision\": \"2020-12-08\",\n \"schema\": \"https://localhost:443/restconf/tailf/modules/tailf-ncs-scheduler/2020-12-08\",\n \"namespace\": \"http://tail-f.com/ns/ncs-scheduler\",\n \"conformance-type\": \"implement\"\n },\n {\n \"name\": \"tailf-ncs-snmp\",\n \"revision\": \"2017-03-16\",\n \"schema\": \"https://localhost:443/restconf/tailf/modules/tailf-ncs-snmp/2017-03-16\",\n \"namespace\": \"http://tail-f.com/ns/ncs-snmp\",\n \"conformance-type\": \"implement\"\n },\n {\n \"name\": \"tailf-ncs-webui\",\n \"revision\": \"2013-01-16\",\n \"schema\": \"https://localhost:443/restconf/tailf/modules/tailf-ncs-webui/2013-01-16\",\n \"namespace\": \"http://tail-f.com/ns/ncs-webui\",\n \"conformance-type\": \"implement\"\n },\n {\n \"name\": \"tailf-ned-cisco-asa-meta\",\n \"revision\": \"2020-11-27\",\n \"schema\": \"https://localhost:443/restconf/tailf/modules/tailf-ned-cisco-asa-meta/2020-11-27\",\n \"namespace\": \"http://cisco.com/ned/asa-meta\",\n \"conformance-type\": \"implement\"\n },\n {\n \"name\": \"tailf-ned-cisco-ios-meta\",\n \"revision\": \"2020-12-04\",\n \"schema\": \"https://localhost:443/restconf/tailf/modules/tailf-ned-cisco-ios-meta/2020-12-04\",\n \"namespace\": \"urn:ios-meta\",\n \"conformance-type\": \"implement\"\n },\n {\n \"name\": \"tailf-ned-cisco-ios-oper\",\n \"revision\": \"2020-12-04\",\n \"schema\": \"https://localhost:443/restconf/tailf/modules/tailf-ned-cisco-ios-oper/2020-12-04\",\n \"namespace\": \"http://tail-f.com/ned/cisco-ios/oper\",\n \"conformance-type\": \"implement\"\n },\n {\n \"name\": \"tailf-ned-cisco-ios-xr-meta\",\n \"revision\": \"2020-12-04\",\n \"schema\": \"https://localhost:443/restconf/tailf/modules/tailf-ned-cisco-ios-xr-meta/2020-12-04\",\n \"namespace\": \"http://tail-f.com/ned/cisco-iosxr/meta\",\n \"conformance-type\": \"implement\"\n },\n {\n \"name\": \"tailf-ned-cisco-ios-xr-oper\",\n \"revision\": \"2020-12-04\",\n \"schema\": \"https://localhost:443/restconf/tailf/modules/tailf-ned-cisco-ios-xr-oper/2020-12-04\",\n \"namespace\": \"http://tail-f.com/ned/cisco-iosxr/oper\",\n \"conformance-type\": \"implement\"\n },\n {\n \"name\": \"tailf-ned-cisco-nx-meta\",\n \"revision\": \"2020-12-08\",\n \"schema\": \"https://localhost:443/restconf/tailf/modules/tailf-ned-cisco-nx-meta/2020-12-08\",\n \"namespace\": \"http://tail-f.com/ned/cisco-nx/meta\",\n \"conformance-type\": \"implement\"\n },\n {\n \"name\": \"tailf-ned-cisco-nx-oper\",\n \"revision\": \"2020-12-08\",\n \"schema\": \"https://localhost:443/restconf/tailf/modules/tailf-ned-cisco-nx-oper/2020-12-08\",\n \"namespace\": \"http://tail-f.com/ned/cisco-nx/oper\",\n \"conformance-type\": \"implement\"\n },\n {\n \"name\": \"tailf-ned-loginscripts\",\n \"revision\": \"\",\n \"schema\": \"https://localhost:443/restconf/tailf/modules/tailf-ned-loginscripts\",\n \"namespace\": \"http://tail-f.com/ned/ned-loginscripts\",\n \"conformance-type\": \"implement\"\n },\n {\n \"name\": \"tailf-ned-secrets\",\n \"revision\": \"2019-04-17\",\n \"schema\": \"https://localhost:443/restconf/tailf/modules/tailf-ned-secrets/2019-04-17\",\n \"namespace\": \"http://tail-f.com/ned/ned-secrets\",\n \"conformance-type\": \"implement\"\n },\n {\n \"name\": \"tailf-netconf-monitoring\",\n \"revision\": \"2019-03-28\",\n \"schema\": \"https://localhost:443/restconf/tailf/modules/tailf-netconf-monitoring/2019-03-28\",\n \"namespace\": \"http://tail-f.com/yang/netconf-monitoring\",\n \"conformance-type\": \"implement\"\n },\n {\n \"name\": \"tailf-progress\",\n \"revision\": \"2020-06-25\",\n \"schema\": \"https://localhost:443/restconf/tailf/modules/tailf-progress/2020-06-25\",\n \"namespace\": \"http://tail-f.com/ns/progress\",\n \"conformance-type\": \"implement\"\n },\n {\n \"name\": \"tailf-rest-query\",\n \"revision\": \"2017-01-06\",\n \"schema\": \"https://localhost:443/restconf/tailf/modules/tailf-rest-query/2017-01-06\",\n \"namespace\": \"http://tail-f.com/ns/tailf-rest-query\",\n \"conformance-type\": \"implement\"\n },\n {\n \"name\": \"tailf-restconf-ncs\",\n \"revision\": \"2020-06-25\",\n \"schema\": \"https://localhost:443/restconf/tailf/modules/tailf-restconf-ncs/2020-06-25\",\n \"namespace\": \"http://tail-f.com/ns/restconf/ncs\",\n \"conformance-type\": \"implement\"\n },\n {\n \"name\": \"tailf-rollback\",\n \"revision\": \"2020-06-25\",\n \"schema\": \"https://localhost:443/restconf/tailf/modules/tailf-rollback/2020-06-25\",\n \"namespace\": \"http://tail-f.com/ns/rollback\",\n \"conformance-type\": \"implement\"\n },\n {\n \"name\": \"tailf-tls\",\n \"revision\": \"2019-06-13\",\n \"schema\": \"https://localhost:443/restconf/tailf/modules/tailf-tls/2019-06-13\",\n \"namespace\": \"http://tail-f.com/ns/tls\",\n \"conformance-type\": \"implement\"\n },\n {\n \"name\": \"tailf-webui\",\n \"revision\": \"2013-03-07\",\n \"schema\": \"https://localhost:443/restconf/tailf/modules/tailf-webui/2013-03-07\",\n \"namespace\": \"http://tail-f.com/ns/webui\",\n \"conformance-type\": \"implement\"\n },\n {\n \"name\": \"tailf-webui-one\",\n \"revision\": \"2019-06-27\",\n \"schema\": \"https://localhost:443/restconf/tailf/modules/tailf-webui-one/2019-06-27\",\n \"namespace\": \"http://tail-f.com/ns/webui-one\",\n \"conformance-type\": \"implement\"\n },\n {\n \"name\": \"tailf-xsd-types\",\n \"revision\": \"2017-11-20\",\n \"schema\": \"https://localhost:443/restconf/tailf/modules/tailf-xsd-types/2017-11-20\",\n \"namespace\": \"http://tail-f.com/yang/xsd-types\",\n \"conformance-type\": \"import\"\n }\n ]\n }\n}" + } + ] + } + ], + "description": "Test objective\n\n- \"Verify that the IUT supports RESTCONF API request.\"\n \n\nReference\n\n- \"ETSI GS mWT 024 Clause 5.2.1 RESTCONF Protocol\",\n- \"RFC 8040 RESTCONF Protocol\",\n- \"RFC 8525 YANG Library\"\n \n\nPICS Selection IUT_PNC and RESTCONF and SEC_TLS" + }, + { + "name": "TC_mWT_PNC_RESTCONF_GET_BV_02", + "item": [ + { + "name": "TC_mWT_PNC_RESTCONF_GET_BV_02", + "event": [ + { + "listen": "test", + "script": { + "exec": [ + "pm.test(\"Verify that the response status code is 200\", function () {\r", + " pm.response.to.have.status(200);\r", + "});\r", + "\r", + "var responseData = '';\r", + "var topLevelPropertyName = '';\r", + "\r", + "pm.test(\"Verify that headers.Content-Type is 'application/yang-data+json'\", function () {\r", + " pm.expect(pm.response.headers.get('Content-Type')).is.equals('application/yang-data+json');\r", + " responseData = pm.response.json();\r", + " topLevelPropertyName = responseData.hasOwnProperty('modules-state') ? 'modules-state' : 'ietf-yang-library:modules-state';\r", + " console.info(topLevelPropertyName)\r", + "});\r", + "\r", + "var moduleList = {};\r", + "\r", + "pm.test(\"Validate the main field is 'ietf-yang-library:modules-state'\", function () {\r", + " pm.expect(responseData).to.be.an('object');\r", + " pm.expect(responseData).to.have.property(topLevelPropertyName);\r", + "});\r", + "\r", + "pm.test(\"Verify that the 'module' array is present and not empty\", function () {\r", + " pm.expect(responseData).to.be.an('object');\r", + " pm.expect(responseData[topLevelPropertyName][\"module\"]).to.be.an('array').with.lengthOf.at.least(1);\r", + " // Build the module list\r", + " responseData[topLevelPropertyName].module.forEach(function(item, index) {\r", + " pm.expect(item).to.have.property('name');\r", + " pm.expect(item).to.have.property('revision');\r", + " pm.expect(item).to.have.property('namespace');\r", + " if (moduleList.hasOwnProperty(item.name)) {\r", + " if (moduleList[item.name].revision < item.revision) {\r", + " moduleList[item.name] = item;\r", + " }\r", + " } else {\r", + " moduleList[item.name] = item;\r", + " }\r", + " });\r", + "});\r", + "\r", + "pm.test('Verify that the basics YANG modules are supported', function() {\r", + " pm.expect(moduleList).to.have.property(\"ietf-restconf\");\r", + " console.log(moduleList[\"ietf-restconf\"].schema);\r", + " pm.expect(moduleList).to.have.property(\"ietf-yang-library\");\r", + " pm.expect(moduleList).to.have.property(\"ietf-datastores\");\r", + " pm.expect(moduleList).to.have.property(\"ietf-inet-types\");\r", + " pm.expect(moduleList).to.have.property(\"ietf-interfaces\");\r", + " pm.expect(moduleList).to.have.property(\"ietf-ip\");\r", + "});\r", + "\r", + "pm.test('Verify ietf-restconf YANG modules', function() {\r", + " var m = moduleList[\"ietf-restconf\"];\r", + " console.log(m);\r", + " // Check revision\r", + " pm.expect(m).to.have.property(\"revision\");\r", + " console.log(m[\"revision\"]);\r", + " // Check schema\r", + " pm.expect(m).to.have.property(\"schema\");\r", + " console.log(m[\"schema\"]);\r", + "});\r", + "\r", + "" + ], + "type": "text/javascript", + "packages": {} + } + }, + { + "listen": "prerequest", + "script": { + "exec": [ + "// Check PICS requirements\r", + "if ((pm.environment.get('PICS_IUT_PNC') != \"true\") || (pm.environment.get('PICS_RESTCONF') != \"true\") || (pm.environment.get('PICS_SEC_TLS') != \"true\")) {\r", + " throw new Error('PICS_IUT_PNC and PICS_RESTCONF and PICS_SEC_TLS are required.');\r", + "}\r", + "" + ], + "type": "text/javascript", + "packages": {} + } + } + ], + "request": { + "auth": { + "type": "basic", + "basic": [ + { + "key": "password", + "value": "Services4Ever", + "type": "string" + }, + { + "key": "username", + "value": "developer", + "type": "string" + } + ] + }, + "method": "GET", + "header": [ + { + "key": "Accept", + "value": "application/yang-data+json", + "type": "text" + } + ], + "url": { + "raw": "{{PX_PROTOCOL}}://{{PX_IUT_IP_ADDRESS}}:{{PX_IUT_IP_PORT}}/{{PX_ROOT_API}}/ietf-yang-library:modules-state", + "protocol": "{{PX_PROTOCOL}}", + "host": [ + "{{PX_IUT_IP_ADDRESS}}" + ], + "port": "{{PX_IUT_IP_PORT}}", + "path": [ + "{{PX_ROOT_API}}", + "ietf-yang-library:modules-state" + ] + }, + "description": "/restconf/data/ietf-yang-library:modules-state" + }, + "response": [] + } + ], + "description": "Test objective\n\n- \"Verify that the IUT supports the basic YANG data models.\"\n \n\nReference\n\n- \"ETSI GS mWT 024 Clause 5.2.2.1 YANG Version\"\n \n\nPICS Selection IUT_PNC and RESTCONF and SEC_TLS" + }, + { + "name": "TC_mWT_PNC_RESTCONF_GET_BV_03", + "item": [ + { + "name": "TC_mWT_PNC_RESTCONF_GET_BV_03", + "event": [ + { + "listen": "test", + "script": { + "exec": [ + "pm.test(\"Verify that the response status code is 200\", function () {\r", + " pm.response.to.have.status(200);\r", + "});\r", + "\r", + "var responseData = '';\r", + "var topLevelPropertyName = '';\r", + "\r", + "pm.test(\"Verify that headers.Content-Type is 'application/yang-data+json'\", function () {\r", + " pm.expect(pm.response.headers.get('Content-Type')).is.equals('application/yang-data+json');\r", + " responseData = pm.response.json();\r", + " topLevelPropertyName = responseData.hasOwnProperty('modules-state') ? 'modules-state' : 'ietf-yang-library:modules-state';\r", + " console.info(topLevelPropertyName)\r", + "});\r", + "\r", + "var moduleList = {};\r", + "\r", + "pm.test(\"Validate the main field is 'ietf-yang-library:modules-state'\", function () {\r", + " pm.expect(responseData).to.be.an('object');\r", + " pm.expect(responseData).to.have.property(topLevelPropertyName);\r", + " });\r", + "\r", + "pm.test(\"Verify that the 'module' array is present and not empty\", function () {\r", + " pm.expect(responseData).to.be.an('object');\r", + " pm.expect(responseData[topLevelPropertyName][\"module\"]).to.be.an('array').with.lengthOf.at.least(1);\r", + " // Build the module list\r", + " responseData[topLevelPropertyName].module.forEach(function(item, index) {\r", + " pm.expect(item).to.have.property('name');\r", + " pm.expect(item).to.have.property('revision');\r", + " pm.expect(item).to.have.property('namespace');\r", + " if (moduleList.hasOwnProperty(item.name)) {\r", + " if (moduleList[item.name].revision < item.revision) {\r", + " moduleList[item.name] = item;\r", + " }\r", + " } else {\r", + " moduleList[item.name] = item;\r", + " }\r", + " });\r", + " //console.log(moduleList);\r", + "});\r", + "\r", + "pm.test('Verify that the basics YANG modules are supported', function() {\r", + " pm.expect(moduleList).to.have.property(\"ietf-restconf\");\r", + " console.log(moduleList[\"ietf-restconf\"].schema);\r", + " pm.expect(moduleList).to.have.property(\"ietf-yang-library\");\r", + " pm.expect(moduleList).to.have.property(\"ietf-datastores\");\r", + " pm.expect(moduleList).to.have.property(\"ietf-inet-types\");\r", + " pm.expect(moduleList).to.have.property(\"ietf-interfaces\");\r", + " pm.expect(moduleList).to.have.property(\"ietf-ip\");\r", + "});\r", + "\r", + "pm.test('Verify ietf-restconf YANG modules', function() {\r", + " var m = moduleList[\"ietf-restconf\"];\r", + " console.log(m);\r", + " // Check revision\r", + " pm.expect(m).to.have.property(\"revision\");\r", + " console.log(m[\"revision\"]);\r", + " // Check schema\r", + " pm.expect(m).to.have.property(\"schema\");\r", + " console.log(m[\"schema\"]);\r", + "});\r", + "\r", + "" + ], + "type": "text/javascript", + "packages": {} + } + }, + { + "listen": "prerequest", + "script": { + "exec": [ + "// Check PICS requirements\r", + "if ((pm.environment.get('PICS_IUT_PNC') != \"true\") || (pm.environment.get('PICS_RESTCONF') != \"true\") || (pm.environment.get('PICS_SEC_TLS') != \"true\")) {\r", + " throw new Error('PICS_IUT_PNC and PICS_RESTCONF and PICS_SEC_TLS are required.');\r", + "}\r", + "" + ], + "type": "text/javascript", + "packages": {} + } + } + ], + "request": { + "auth": { + "type": "basic", + "basic": [ + { + "key": "password", + "value": "Services4Ever", + "type": "string" + }, + { + "key": "username", + "value": "developer", + "type": "string" + } + ] + }, + "method": "GET", + "header": [ + { + "key": "Accept", + "value": "application/yang-data+json", + "type": "text" + } + ], + "url": { + "raw": "{{PX_PROTOCOL}}://{{PX_IUT_IP_ADDRESS}}:{{PX_IUT_IP_PORT}}/{{PX_ROOT_API}}/ietf-yang-library:modules-state", + "protocol": "{{PX_PROTOCOL}}", + "host": [ + "{{PX_IUT_IP_ADDRESS}}" + ], + "port": "{{PX_IUT_IP_PORT}}", + "path": [ + "{{PX_ROOT_API}}", + "ietf-yang-library:modules-state" + ] + }, + "description": "/restconf/data/ietf-yang-library:modules-state" + }, + "response": [] + } + ], + "description": "Test objective\n\n- \"Verify that the IUT provides the list of supported mWT GS 024 YANG data models.\"\n \n\nReference\n\n- \"ETSI GS mWT 024 Clause 5.2.2.2 Common YANG data models\",\n \n- \"ETSI GS mWT 024 Clause 5.2.2.3 YANG Data Models at the Microwave MPI\",\n \n- \"ETSI GS mWT 024 Clause 5.2.2.4 Hierarchical relationship among YANG data models\"EndFragment\n \n\nPICS Selection IUT_PNC and RESTCONF and SEC_TLS" + } + ] + }, + { + "name": "PartiallyTransparent", + "item": [ + { + "name": "MWTopology", + "item": [ + { + "name": "TC_mWT_PNC_MW_TOPO_GET_BV_01", + "item": [ + { + "name": "TC_mWT_PNC_MW_TOPO_GET_BV_01", + "event": [ + { + "listen": "test", + "script": { + "exec": [ + "pm.test(\"Verify that the response status code is 200\", function () {\r", + " pm.response.to.have.status(200);\r", + "});\r", + "\r", + "var responseData = '';\r", + "var topLevelPropertyName = '';\r", + "\r", + "pm.test(\"Verify that headers.Content-Type is 'application/yang-data+json'\", function () {\r", + " pm.expect(pm.response.headers.get('Content-Type')).is.equals('application/yang-data+json');\r", + " responseData = pm.response.json();\r", + " topLevelPropertyName = responseData.hasOwnProperty('modules-state') ? 'modules-state' : 'ietf-yang-library:modules-state';\r", + " console.info(topLevelPropertyName)\r", + "});\r", + "\r", + "// var moduleList = {};\r", + "\r", + "// pm.test(\"Validate the main field is 'ietf-yang-library:modules-state'\", function () {\r", + "// pm.expect(responseData).to.be.an('object');\r", + "// pm.expect(responseData).to.have.property(topLevelPropertyName);\r", + "// });\r", + "\r", + "// pm.test(\"Verify that the 'module' array is present and not empty\", function () {\r", + "// pm.expect(responseData).to.be.an('object');\r", + "// pm.expect(responseData[topLevelPropertyName][\"module\"]).to.be.an('array').with.lengthOf.at.least(1);\r", + "// // Build the module list\r", + "// responseData[topLevelPropertyName].module.forEach(function(item, index) {\r", + "// pm.expect(item).to.have.property('name');\r", + "// pm.expect(item).to.have.property('revision');\r", + "// pm.expect(item).to.have.property('namespace');\r", + "// if (moduleList.hasOwnProperty(item.name)) {\r", + "// if (moduleList[item.name].revision < item.revision) {\r", + "// moduleList[item.name] = item;\r", + "// }\r", + "// } else {\r", + "// moduleList[item.name] = item;\r", + "// }\r", + "// });\r", + "\r", + "// });\r", + "\r", + "// pm.test('Verify that the basics YANG modules are supported', function() {\r", + "// pm.expect(moduleList).to.have.property(\"ietf-restconf\");\r", + "// pm.expect(moduleList).to.have.property(\"ietf-yang-library\");\r", + "// pm.expect(moduleList).to.have.property(\"ietf-datastores\");\r", + "// pm.expect(moduleList).to.have.property(\"ietf-inet-types\");\r", + "// pm.expect(moduleList).to.have.property(\"ietf-interfaces\");\r", + "// pm.expect(moduleList).to.have.property(\"ietf-ip\");\r", + "//});" + ], + "type": "text/javascript", + "packages": {} + } + }, + { + "listen": "prerequest", + "script": { + "exec": [ + "// Check PICS requirements\r", + "if ((pm.environment.get('PICS_IUT_PNC') != \"true\") || (pm.environment.get('PICS_RESTCONF') != \"true\") || (pm.environment.get('PICS_SEC_TLS') != \"true\") || (pm.environment.get('PICS_ABSTRACT_BB') != \"true\") || (pm.environment.get('PICS_MW_TOPO') != \"true\")) {\r", + " throw new Error('PICS_IUT_PNC and PICS_RESTCONF and PICS_SEC_TLS and PICS_ABSTRACT_BB and PICS_MW_TOPO are required.');\r", + "}\r", + "" + ], + "type": "text/javascript", + "packages": {} + } + } + ], + "request": { + "auth": { + "type": "basic", + "basic": [ + { + "key": "password", + "value": "Services4Ever", + "type": "string" + }, + { + "key": "username", + "value": "developer", + "type": "string" + } + ] + }, + "method": "GET", + "header": [ + { + "key": "Accept", + "value": "application/yang-data+json", + "type": "text" + } + ], + "url": { + "raw": "{{PX_PROTOCOL}}://{{PX_IUT_IP_ADDRESS}}:{{PX_IUT_IP_PORT}}/{{PX_ROOT_API}}/ietf-network:networks/network", + "protocol": "{{PX_PROTOCOL}}", + "host": [ + "{{PX_IUT_IP_ADDRESS}}" + ], + "port": "{{PX_IUT_IP_PORT}}", + "path": [ + "{{PX_ROOT_API}}", + "ietf-network:networks", + "network" + ] + }, + "description": "/restconf/data/ietf-yang-library:modules-state" + }, + "response": [] + }, + { + "name": "TC_mWT_PNC_MW_TOPO_GET_BV_02", + "event": [ + { + "listen": "test", + "script": { + "exec": [ + "pm.test(\"Verify that the response status code is 200\", function () {\r", + " pm.response.to.have.status(200);\r", + "});\r", + "\r", + "var responseData = '';\r", + "var topLevelPropertyName = '';\r", + "\r", + "pm.test(\"Verify that headers.Content-Type is 'application/yang-data+json'\", function () {\r", + " pm.expect(pm.response.headers.get('Content-Type')).is.equals('application/yang-data+json');\r", + " responseData = pm.response.json();\r", + " topLevelPropertyName = responseData.hasOwnProperty('modules-state') ? 'modules-state' : 'ietf-yang-library:modules-state';\r", + " console.info(topLevelPropertyName)\r", + "});\r", + "\r", + "// var moduleList = {};\r", + "\r", + "// pm.test(\"Validate the main field is 'ietf-yang-library:modules-state'\", function () {\r", + "// pm.expect(responseData).to.be.an('object');\r", + "// pm.expect(responseData).to.have.property(topLevelPropertyName);\r", + "// });\r", + "\r", + "// pm.test(\"Verify that the 'module' array is present and not empty\", function () {\r", + "// pm.expect(responseData).to.be.an('object');\r", + "// pm.expect(responseData[topLevelPropertyName][\"module\"]).to.be.an('array').with.lengthOf.at.least(1);\r", + "// // Build the module list\r", + "// responseData[topLevelPropertyName].module.forEach(function(item, index) {\r", + "// pm.expect(item).to.have.property('name');\r", + "// pm.expect(item).to.have.property('revision');\r", + "// pm.expect(item).to.have.property('namespace');\r", + "// if (moduleList.hasOwnProperty(item.name)) {\r", + "// if (moduleList[item.name].revision < item.revision) {\r", + "// moduleList[item.name] = item;\r", + "// }\r", + "// } else {\r", + "// moduleList[item.name] = item;\r", + "// }\r", + "// });\r", + "\r", + "// });\r", + "\r", + "// pm.test('Verify that the basics YANG modules are supported', function() {\r", + "// pm.expect(moduleList).to.have.property(\"ietf-restconf\");\r", + "// pm.expect(moduleList).to.have.property(\"ietf-yang-library\");\r", + "// pm.expect(moduleList).to.have.property(\"ietf-datastores\");\r", + "// pm.expect(moduleList).to.have.property(\"ietf-inet-types\");\r", + "// pm.expect(moduleList).to.have.property(\"ietf-interfaces\");\r", + "// pm.expect(moduleList).to.have.property(\"ietf-ip\");\r", + "//});" + ], + "type": "text/javascript", + "packages": {} + } + }, + { + "listen": "prerequest", + "script": { + "exec": [ + "// Check PICS requirements\r", + "if ((pm.environment.get('PICS_IUT_PNC') != \"true\") || (pm.environment.get('PICS_RESTCONF') != \"true\") || (pm.environment.get('PICS_SEC_TLS') != \"true\") || (pm.environment.get('PICS_ABSTRACT_BB') != \"true\") || (pm.environment.get('PICS_MW_TOPO') != \"true\")) {\r", + " throw new Error('PICS_IUT_PNC and PICS_RESTCONF and PICS_SEC_TLS and PICS_ABSTRACT_BB and PICS_MW_TOPO are required.');\r", + "}\r", + "" + ], + "type": "text/javascript", + "packages": {} + } + } + ], + "request": { + "auth": { + "type": "basic", + "basic": [ + { + "key": "password", + "value": "Services4Ever", + "type": "string" + }, + { + "key": "username", + "value": "developer", + "type": "string" + } + ] + }, + "method": "GET", + "header": [ + { + "key": "Accept", + "value": "application/yang-data+json", + "type": "text" + } + ], + "url": { + "raw": "{{PX_PROTOCOL}}://{{PX_IUT_IP_ADDRESS}}:{{PX_IUT_IP_PORT}}/{{PX_ROOT_API}}/ietf-network:networks/network", + "protocol": "{{PX_PROTOCOL}}", + "host": [ + "{{PX_IUT_IP_ADDRESS}}" + ], + "port": "{{PX_IUT_IP_PORT}}", + "path": [ + "{{PX_ROOT_API}}", + "ietf-network:networks", + "network" + ] + }, + "description": "/restconf/data/ietf-yang-library:modules-state" + }, + "response": [] + }, + { + "name": "TC_mWT_PNC_MW_TOPO_GET_BO_01", + "event": [ + { + "listen": "test", + "script": { + "exec": [ + "pm.test(\"Verify that the response status code is 200\", function () {\r", + " pm.response.to.have.status(400);\r", + "});\r", + "\r", + "var responseData = '';\r", + "var topLevelPropertyName = '';\r", + "\r", + "pm.test(\"Verify that headers.Content-Type is 'application/yang-data+json'\", function () {\r", + " pm.expect(pm.response.headers.get('Content-Type')).is.equals('application/yang-data+json');\r", + " responseData = pm.response.json();\r", + " topLevelPropertyName = responseData.hasOwnProperty('modules-state') ? 'modules-state' : 'ietf-yang-library:modules-state';\r", + " console.info(topLevelPropertyName)\r", + "});\r", + "\r", + "// var moduleList = {};\r", + "\r", + "// pm.test(\"Validate the main field is 'ietf-yang-library:modules-state'\", function () {\r", + "// pm.expect(responseData).to.be.an('object');\r", + "// pm.expect(responseData).to.have.property(topLevelPropertyName);\r", + "// });\r", + "\r", + "// pm.test(\"Verify that the 'module' array is present and not empty\", function () {\r", + "// pm.expect(responseData).to.be.an('object');\r", + "// pm.expect(responseData[topLevelPropertyName][\"module\"]).to.be.an('array').with.lengthOf.at.least(1);\r", + "// // Build the module list\r", + "// responseData[topLevelPropertyName].module.forEach(function(item, index) {\r", + "// pm.expect(item).to.have.property('name');\r", + "// pm.expect(item).to.have.property('revision');\r", + "// pm.expect(item).to.have.property('namespace');\r", + "// if (moduleList.hasOwnProperty(item.name)) {\r", + "// if (moduleList[item.name].revision < item.revision) {\r", + "// moduleList[item.name] = item;\r", + "// }\r", + "// } else {\r", + "// moduleList[item.name] = item;\r", + "// }\r", + "// });\r", + "\r", + "// });\r", + "\r", + "// pm.test('Verify that the basics YANG modules are supported', function() {\r", + "// pm.expect(moduleList).to.have.property(\"ietf-restconf\");\r", + "// pm.expect(moduleList).to.have.property(\"ietf-yang-library\");\r", + "// pm.expect(moduleList).to.have.property(\"ietf-datastores\");\r", + "// pm.expect(moduleList).to.have.property(\"ietf-inet-types\");\r", + "// pm.expect(moduleList).to.have.property(\"ietf-interfaces\");\r", + "// pm.expect(moduleList).to.have.property(\"ietf-ip\");\r", + "//});" + ], + "type": "text/javascript", + "packages": {} + } + }, + { + "listen": "prerequest", + "script": { + "exec": [ + "// Check PICS requirements\r", + "if ((pm.environment.get('PICS_IUT_PNC') != \"true\") || (pm.environment.get('PICS_RESTCONF') != \"true\") || (pm.environment.get('PICS_SEC_TLS') != \"true\") || (pm.environment.get('PICS_ABSTRACT_BB') != \"true\") || (pm.environment.get('PICS_MW_TOPO') != \"true\")) {\r", + " throw new Error('PICS_IUT_PNC and PICS_RESTCONF and PICS_SEC_TLS and PICS_ABSTRACT_BB and PICS_MW_TOPO are required.');\r", + "}\r", + "" + ], + "type": "text/javascript", + "packages": {} + } + } + ], + "request": { + "auth": { + "type": "basic", + "basic": [ + { + "key": "password", + "value": "Services4Ever", + "type": "string" + }, + { + "key": "username", + "value": "developer", + "type": "string" + } + ] + }, + "method": "GET", + "header": [ + { + "key": "Accept", + "value": "application/yang-data+json", + "type": "text" + } + ], + "url": { + "raw": "{{PX_PROTOCOL}}://{{PX_IUT_IP_ADDRESS}}:{{PX_IUT_IP_PORT}}/{{PX_ROOT_API}}/networks", + "protocol": "{{PX_PROTOCOL}}", + "host": [ + "{{PX_IUT_IP_ADDRESS}}" + ], + "port": "{{PX_IUT_IP_PORT}}", + "path": [ + "{{PX_ROOT_API}}", + "networks" + ] + }, + "description": "/restconf/data/ietf-yang-library:modules-state" + }, + "response": [] + } + ], + "description": "Test objective\n\n\"Verify that the IUT provides the MW network topology for all networks with mandatory mWT GC 024 data elements subset - black box abstraction level.\"\n\nReference\n\n- \"ETSI GS mWT 024 Annex A.1.2\",\n- \"RFC 8345 A YANG Data Model for Network Topologies\",\n- \"RFC 8795 YANG Data Model for Traffic Engineering (TE) Topologies\",\n \n- \"draft-ietf-ccamp-mw-topo-yang-02 A YANG Data Model for Microwave Topology\"\n \n\nPICS Selection PICS_IUT_PNC and PICS_RESTCONF and PICS_SEC_TLS and PICS_ABSTRACT_BB and PICS_MW_TOPO" + }, + { + "name": "TC_mWT_PNC_MW_TOPO_GET_BO_02", + "item": [ + { + "name": "TC_mWT_PNC_MW_TOPO_GET_BO_02", + "event": [ + { + "listen": "test", + "script": { + "exec": [ + "pm.test(\"Verify that the response status code is 200\", function () {\r", + " pm.response.to.have.status(404);\r", + "});\r", + "\r", + "var responseData = '';\r", + "var topLevelPropertyName = '';\r", + "\r", + "pm.test(\"Verify that headers.Content-Type is 'application/yang-data+json'\", function () {\r", + " pm.expect(pm.response.headers.get('Content-Type')).is.equals('application/yang-data+json');\r", + " responseData = pm.response.json();\r", + " topLevelPropertyName = responseData.hasOwnProperty('modules-state') ? 'modules-state' : 'ietf-yang-library:modules-state';\r", + " console.info(topLevelPropertyName)\r", + "});\r", + "" + ], + "type": "text/javascript", + "packages": {} + } + }, + { + "listen": "prerequest", + "script": { + "exec": [ + "// Check PICS requirements\r", + "if ((pm.environment.get('PICS_IUT_PNC') != \"true\") || (pm.environment.get('PICS_RESTCONF') != \"true\") || (pm.environment.get('PICS_SEC_TLS') != \"true\") || (pm.environment.get('PICS_ABSTRACT_BB') != \"true\") || (pm.environment.get('PICS_MW_TOPO') != \"true\")) {\r", + " throw new Error('PICS_IUT_PNC and PICS_RESTCONF and PICS_SEC_TLS and PICS_ABSTRACT_BB and PICS_MW_TOPO are required.');\r", + "}\r", + "" + ], + "type": "text/javascript", + "packages": {} + } + } + ], + "request": { + "auth": { + "type": "basic", + "basic": [ + { + "key": "password", + "value": "Services4Ever", + "type": "string" + }, + { + "key": "username", + "value": "developer", + "type": "string" + } + ] + }, + "method": "GET", + "header": [ + { + "key": "Accept", + "value": "application/yang-data+json", + "type": "text" + } + ], + "url": { + "raw": "{{PX_PROTOCOL}}://{{PX_IUT_IP_ADDRESS}}:{{PX_IUT_IP_PORT}}/{{PX_ROOT_API}}/ietf-network:networks/network", + "protocol": "{{PX_PROTOCOL}}", + "host": [ + "{{PX_IUT_IP_ADDRESS}}" + ], + "port": "{{PX_IUT_IP_PORT}}", + "path": [ + "{{PX_ROOT_API}}", + "ietf-network:networks", + "network" + ] + }, + "description": "/restconf/data/ietf-yang-library:modules-state" + }, + "response": [] + } + ], + "description": "Test objective\n\n\"Verify that the IUT replies with an error code when the network identifier is unknown - black box abstraction level.\"\n\nReference\n\n- \"ETSI GS mWT 024 Clause 5.3.2 Exception Handling\",\n- \"ETSI GS mWT 024 Annex A.1.2\",\n- \"RFC 8345 A YANG Data Model for Network Topologies\",\n- \"RFC 8795 YANG Data Model for Traffic Engineering (TE) Topologies\"\n \n\nPICS Selection IUT_MDSC and ABSTRACT_BB and MW_TOPO" + } + ] + }, + { + "name": "ETHTopology", + "item": [] + } + ], + "description": "This group provides test case for PartiallyTransparent abstraction level.\n\nReference\n\n- \"4.3.3 AL2: Abstraction Level 2 - \"Partially Transparent\"\"" + }, + { + "name": "Blackbox", + "item": [], + "description": "This group provides test case for Black-box abstraction level.\n\nReference\n\n- \"4.3.2 AL1: Abstraction Level 1 - \"Black-box\"\"" + } + ] +} \ No newline at end of file -- GitLab From 3259998b39efaaf76333e556fab4f0df343ec272 Mon Sep 17 00:00:00 2001 From: garciay Date: Fri, 21 Jun 2024 15:15:34 +0200 Subject: [PATCH 10/15] Start implementing ATS in Postman --- postman/TTF_T029.postman_collection.json | 3411 +++++++++++++++++++-- postman/TTF_T029.postman_environment.json | 153 + test-purposes/AtsMDSC.tplan2 | 94 +- test-purposes/ietf_yang_library.tplan2 | 14 +- test-purposes/mWT_Common.tplan2 | 2 +- 5 files changed, 3359 insertions(+), 315 deletions(-) create mode 100644 postman/TTF_T029.postman_environment.json diff --git a/postman/TTF_T029.postman_collection.json b/postman/TTF_T029.postman_collection.json index 8bda046..7b5ab4f 100644 --- a/postman/TTF_T029.postman_collection.json +++ b/postman/TTF_T029.postman_collection.json @@ -4,9 +4,154 @@ "name": "TTF_T029", "schema": "https://schema.getpostman.com/json/collection/v2.1.0/collection.json", "_exporter_id": "152820", - "_collection_link": "https://red-trinity-563699.postman.co/workspace/d54f0e73-b65d-41a2-8e4e-35b7b23cdd96/collection/152820-c9163952-03f7-4301-bae0-32c78f9702ce?action=share&source=collection_link&creator=152820" + "_collection_link": "https://red-trinity-563699.postman.co/workspace/New-Team-Workspace~d54f0e73-b65d-41a2-8e4e-35b7b23cdd96/collection/152820-c9163952-03f7-4301-bae0-32c78f9702ce?action=share&source=collection_link&creator=152820" }, "item": [ + { + "name": "Nokia Lab Testion", + "item": [ + { + "name": "Initial Authentication - Get Token", + "request": { + "auth": { + "type": "basic", + "basic": [ + { + "key": "username", + "value": "{{PX_USER}}", + "type": "string" + }, + { + "key": "password", + "value": "{{PX_USER_PASSWD}}", + "type": "string" + } + ] + }, + "method": "POST", + "header": [], + "body": { + "mode": "raw", + "raw": "{\r\n \"grant_type\": \"client_credentials\"\r\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "{{PX_PROTOCOL}}://{{PX_IUT_IP_ADDRESS}}/rest-gateway/rest/api/v1/auth/token", + "protocol": "{{PX_PROTOCOL}}", + "host": [ + "{{PX_IUT_IP_ADDRESS}}" + ], + "path": [ + "rest-gateway", + "rest", + "api", + "v1", + "auth", + "token" + ] + } + }, + "response": [] + }, + { + "name": "Initial Authentication - Refresh Token", + "request": { + "auth": { + "type": "basic", + "basic": [ + { + "key": "username", + "value": "{{PX_USER}}", + "type": "string" + }, + { + "key": "password", + "value": "{{PX_USER_PASSWD}}", + "type": "string" + } + ] + }, + "method": "POST", + "header": [], + "body": { + "mode": "raw", + "raw": "{\r\n \"grant_type\": \"refresh_token\",\r\n \"refresh_token\": \"{{refreshToken}}\"\r\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "{{PX_PROTOCOL}}://{{PX_IUT_IP_ADDRESS}}/rest-gateway/rest/api/v1/auth/token", + "protocol": "{{PX_PROTOCOL}}", + "host": [ + "{{PX_IUT_IP_ADDRESS}}" + ], + "path": [ + "rest-gateway", + "rest", + "api", + "v1", + "auth", + "token" + ] + } + }, + "response": [] + }, + { + "name": "Location Services", + "protocolProfileBehavior": { + "disableBodyPruning": true + }, + "request": { + "auth": { + "type": "bearer", + "bearer": [ + { + "key": "token", + "value": "{{PX_ACCESS_TOKEN}}", + "type": "string" + } + ] + }, + "method": "GET", + "header": [], + "body": { + "mode": "raw", + "raw": "", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "{{PX_PROTOCOL}}://{{PX_IUT_IP_ADDRESS}}/rest-gateway/rest/api/v1/location/services", + "protocol": "{{PX_PROTOCOL}}", + "host": [ + "{{PX_IUT_IP_ADDRESS}}" + ], + "path": [ + "rest-gateway", + "rest", + "api", + "v1", + "location", + "services" + ] + } + }, + "response": [] + } + ], + "description": "Request to get Nokia Lab bearer token (see [https://network.developer.nokia.com/cloudlab/lab-catalog/public-lab/IP/](https://network.developer.nokia.com/cloudlab/lab-catalog/public-lab/IP/))" + }, { "name": "RESTCONF", "item": [ @@ -20,44 +165,41 @@ "listen": "test", "script": { "exec": [ - "pm.test(\"Verify that the response status code is 200\", function () {\r", - " pm.response.to.have.status(200);\r", - "});\r", - "\r", - "var responseData = '';\r", - "var topLevelPropertyName = '';\r", - "\r", - "pm.test(\"Verify that headers.Content-Type is 'application/yang-data+json'\", function () {\r", - " pm.expect(pm.response.headers.get('Content-Type')).is.equals('application/yang-data+json');\r", - " responseData = pm.response.json();\r", - " topLevelPropertyName = responseData.hasOwnProperty('modules-state') ? 'modules-state' : 'ietf-yang-library:modules-state';\r", - " console.info(topLevelPropertyName)\r", - "});\r", - "\r", - "var moduleList = {};\r", - "\r", - "pm.test(\"Validate the main field is 'ietf-yang-library:modules-state'\", function () {\r", - " pm.expect(responseData).to.be.an('object');\r", - " pm.expect(responseData).to.have.property(topLevelPropertyName);\r", - " });\r", - "\r", - "pm.test(\"Verify that the 'module' array is present and not empty\", function () {\r", - " pm.expect(responseData).to.be.an('object');\r", - " pm.expect(responseData[topLevelPropertyName][\"module\"]).to.be.an('array').with.lengthOf.at.least(1);\r", - " // Build the module list\r", - " responseData[topLevelPropertyName].module.forEach(function(item, index) {\r", - " pm.expect(item).to.have.property('name');\r", - " pm.expect(item).to.have.property('revision');\r", - " pm.expect(item).to.have.property('namespace');\r", - " if (moduleList.hasOwnProperty(item.name)) {\r", - " if (moduleList[item.name].revision < item.revision) {\r", - " moduleList[item.name] = item;\r", - " }\r", - " } else {\r", - " moduleList[item.name] = item;\r", - " }\r", - " });\r", - "});\r", + "pm.test(\"Verify that the response status code is 200\", function () {", + " pm.response.to.have.status(200);", + "});", + "", + "var responseData = '';", + "", + "pm.test(\"Verify that headers.Content-Type is 'application/yang-data+json'\", function () {", + " pm.expect(pm.response.headers.get('Content-Type')).is.equals('application/yang-data+json');", + " responseData = pm.response.json()['ietf-yang-library:yang-library'];", + " pm.expect(responseData).to.be.an('object');", + " pm.expect(responseData).to.have.property('content-id');", + "});", + "", + "var topLevelPropertyName = '';", + "var moduleList = {};", + "", + "pm.test(\"Validate the main field is 'module-set'\", function () {", + " topLevelPropertyName = 'module-set';", + " pm.expect(responseData[topLevelPropertyName]).to.be.an('array');", + " pm.expect(responseData[topLevelPropertyName]).to.be.an('array').with.lengthOf.at.least(1);", + " // Build the list of the modules", + " responseData[topLevelPropertyName][0].module.forEach(function (item, index) {", + " pm.expect(item).to.have.property('name');", + " pm.expect(item).to.have.property('revision');", + " pm.expect(item).to.have.property('namespace');", + " if (moduleList.hasOwnProperty(item.name)) {", + " if (moduleList[item.name].revision < item.revision) {", + " moduleList[item.name] = item;", + " }", + " } else {", + " moduleList[item.name] = item;", + " }", + " });", + " console.info(\"moduleList=\", moduleList)", + "});", "" ], "type": "text/javascript", @@ -82,16 +224,11 @@ ], "request": { "auth": { - "type": "basic", - "basic": [ - { - "key": "password", - "value": "{{PX_USER_PASSWD}}", - "type": "string" - }, + "type": "bearer", + "bearer": [ { - "key": "username", - "value": "{{PX_USER}}", + "key": "token", + "value": "{{PX_ACCESS_TOKEN}}", "type": "string" } ] @@ -105,7 +242,7 @@ } ], "url": { - "raw": "{{PX_PROTOCOL}}://{{PX_IUT_IP_ADDRESS}}:{{PX_IUT_IP_PORT}}/{{PX_ROOT_API}}/ietf-yang-library:modules-state", + "raw": "{{PX_PROTOCOL}}://{{PX_IUT_IP_ADDRESS}}:{{PX_IUT_IP_PORT}}/{{PX_ROOT_API}}/ietf-yang-library:yang-library", "protocol": "{{PX_PROTOCOL}}", "host": [ "{{PX_IUT_IP_ADDRESS}}" @@ -113,7 +250,7 @@ "port": "{{PX_IUT_IP_PORT}}", "path": [ "{{PX_ROOT_API}}", - "ietf-yang-library:modules-state" + "ietf-yang-library:yang-library" ] }, "description": "/restconf/data/ietf-yang-library:modules-state" @@ -222,67 +359,58 @@ "listen": "test", "script": { "exec": [ - "pm.test(\"Verify that the response status code is 200\", function () {\r", - " pm.response.to.have.status(200);\r", - "});\r", - "\r", - "var responseData = '';\r", - "var topLevelPropertyName = '';\r", - "\r", - "pm.test(\"Verify that headers.Content-Type is 'application/yang-data+json'\", function () {\r", - " pm.expect(pm.response.headers.get('Content-Type')).is.equals('application/yang-data+json');\r", - " responseData = pm.response.json();\r", - " topLevelPropertyName = responseData.hasOwnProperty('modules-state') ? 'modules-state' : 'ietf-yang-library:modules-state';\r", - " console.info(topLevelPropertyName)\r", - "});\r", - "\r", - "var moduleList = {};\r", - "\r", - "pm.test(\"Validate the main field is 'ietf-yang-library:modules-state'\", function () {\r", - " pm.expect(responseData).to.be.an('object');\r", - " pm.expect(responseData).to.have.property(topLevelPropertyName);\r", - "});\r", - "\r", - "pm.test(\"Verify that the 'module' array is present and not empty\", function () {\r", - " pm.expect(responseData).to.be.an('object');\r", - " pm.expect(responseData[topLevelPropertyName][\"module\"]).to.be.an('array').with.lengthOf.at.least(1);\r", - " // Build the module list\r", - " responseData[topLevelPropertyName].module.forEach(function(item, index) {\r", - " pm.expect(item).to.have.property('name');\r", - " pm.expect(item).to.have.property('revision');\r", - " pm.expect(item).to.have.property('namespace');\r", - " if (moduleList.hasOwnProperty(item.name)) {\r", - " if (moduleList[item.name].revision < item.revision) {\r", - " moduleList[item.name] = item;\r", - " }\r", - " } else {\r", - " moduleList[item.name] = item;\r", - " }\r", - " });\r", - "});\r", - "\r", - "pm.test('Verify that the basics YANG modules are supported', function() {\r", - " pm.expect(moduleList).to.have.property(\"ietf-restconf\");\r", - " console.log(moduleList[\"ietf-restconf\"].schema);\r", - " pm.expect(moduleList).to.have.property(\"ietf-yang-library\");\r", - " pm.expect(moduleList).to.have.property(\"ietf-datastores\");\r", - " pm.expect(moduleList).to.have.property(\"ietf-inet-types\");\r", - " pm.expect(moduleList).to.have.property(\"ietf-interfaces\");\r", - " pm.expect(moduleList).to.have.property(\"ietf-ip\");\r", - "});\r", - "\r", - "pm.test('Verify ietf-restconf YANG modules', function() {\r", - " var m = moduleList[\"ietf-restconf\"];\r", - " console.log(m);\r", - " // Check revision\r", - " pm.expect(m).to.have.property(\"revision\");\r", - " console.log(m[\"revision\"]);\r", - " // Check schema\r", - " pm.expect(m).to.have.property(\"schema\");\r", - " console.log(m[\"schema\"]);\r", - "});\r", - "\r", - "" + "pm.test(\"Verify that the response status code is 200\", function () {", + " pm.response.to.have.status(200);", + "});", + "", + "var responseData = '';", + "", + "pm.test(\"Verify that headers.Content-Type is 'application/yang-data+json'\", function () {", + " pm.expect(pm.response.headers.get('Content-Type')).is.equals('application/yang-data+json');", + " responseData = pm.response.json()['ietf-yang-library:yang-library'];", + " pm.expect(responseData).to.be.an('object');", + " pm.expect(responseData).to.have.property('content-id');", + "});", + "", + "var topLevelPropertyName = '';", + "var moduleList = {};", + "", + "pm.test(\"Validate the main field is 'module-set'\", function () {", + " topLevelPropertyName = 'module-set';", + " pm.expect(responseData[topLevelPropertyName]).to.be.an('array');", + " pm.expect(responseData[topLevelPropertyName]).to.be.an('array').with.lengthOf.at.least(1);", + " // Build the list of the modules", + " responseData[topLevelPropertyName][0].module.forEach(function (item, index) {", + " pm.expect(item).to.have.property('name');", + " pm.expect(item).to.have.property('revision');", + " pm.expect(item).to.have.property('namespace');", + " if (moduleList.hasOwnProperty(item.name)) {", + " if (moduleList[item.name].revision < item.revision) {", + " moduleList[item.name] = item;", + " }", + " } else {", + " moduleList[item.name] = item;", + " }", + " });", + " console.info(\"moduleList=\", moduleList)", + "});", + "", + "var modulesVersion = {", + " 'ietf-yang-library':[pm.environment.get('PX_IETF_YANG_LIBRARY_VERSION'), pm.environment.get('PX_IETF_YANG_LIBRARY_NAMESPACE')], ", + " 'ietf-restconf':[pm.environment.get('PX_IETF_RESTCONF_VERSION'), pm.environment.get('PX_IETF_RESTCONF_NAMESPACE')]", + "};", + "pm.test(\"Verify that the 'module' array contains all mandatories IETF Yang modules'\", function () {", + " pm.expect(moduleList).to.have.property(\"ietf-restconf\");", + " pm.expect(moduleList).to.have.property(\"ietf-yang-library\"); ", + " for (var key in moduleList) {", + " var item = moduleList[key];", + " console.info(\"Processing item \", item);", + " if (modulesVersion[key] !== undefined) {", + " pm.expect(item).to.have.property('revision', modulesVersion[key][0]);", + " pm.expect(item).to.have.property('namespace');", + " }", + " }; // End of 'for' statement", + "});" ], "type": "text/javascript", "packages": {} @@ -296,6 +424,7 @@ "if ((pm.environment.get('PICS_IUT_PNC') != \"true\") || (pm.environment.get('PICS_RESTCONF') != \"true\") || (pm.environment.get('PICS_SEC_TLS') != \"true\")) {\r", " throw new Error('PICS_IUT_PNC and PICS_RESTCONF and PICS_SEC_TLS are required.');\r", "}\r", + " \r", "" ], "type": "text/javascript", @@ -305,16 +434,11 @@ ], "request": { "auth": { - "type": "basic", - "basic": [ - { - "key": "password", - "value": "Services4Ever", - "type": "string" - }, + "type": "bearer", + "bearer": [ { - "key": "username", - "value": "developer", + "key": "token", + "value": "{{PX_ACCESS_TOKEN}}", "type": "string" } ] @@ -328,7 +452,7 @@ } ], "url": { - "raw": "{{PX_PROTOCOL}}://{{PX_IUT_IP_ADDRESS}}:{{PX_IUT_IP_PORT}}/{{PX_ROOT_API}}/ietf-yang-library:modules-state", + "raw": "{{PX_PROTOCOL}}://{{PX_IUT_IP_ADDRESS}}:{{PX_IUT_IP_PORT}}/{{PX_ROOT_API}}/ietf-yang-library:yang-library", "protocol": "{{PX_PROTOCOL}}", "host": [ "{{PX_IUT_IP_ADDRESS}}" @@ -336,12 +460,101 @@ "port": "{{PX_IUT_IP_PORT}}", "path": [ "{{PX_ROOT_API}}", - "ietf-yang-library:modules-state" + "ietf-yang-library:yang-library" ] }, "description": "/restconf/data/ietf-yang-library:modules-state" }, - "response": [] + "response": [ + { + "name": "TC_mWT_PNC_RESTCONF_GET_BV_01", + "originalRequest": { + "method": "GET", + "header": [ + { + "key": "Accept", + "value": "application/yang-data+json", + "type": "text" + } + ], + "url": { + "raw": "{{PROTOCOL}}://{{PX_IUT_IP_ADDRESS}}:{{PX_IUT_IP_PORT}}/{{PX_ROOT_API}}/ietf-yang-library:modules-state", + "protocol": "{{PROTOCOL}}", + "host": [ + "{{PX_IUT_IP_ADDRESS}}" + ], + "port": "{{PX_IUT_IP_PORT}}", + "path": [ + "{{PX_ROOT_API}}", + "ietf-yang-library:modules-state" + ] + } + }, + "status": "OK", + "code": 200, + "_postman_previewlanguage": "json", + "header": [ + { + "key": "Server", + "value": "nginx/1.13.12" + }, + { + "key": "Date", + "value": "Mon, 15 Jan 2024 13:05:11 GMT" + }, + { + "key": "Content-Type", + "value": "application/yang-data+json" + }, + { + "key": "Transfer-Encoding", + "value": "chunked" + }, + { + "key": "Connection", + "value": "keep-alive" + }, + { + "key": "Last-Modified", + "value": "Fri, 05 Jan 2024 23:51:47 GMT" + }, + { + "key": "Cache-Control", + "value": "private, no-cache, must-revalidate, proxy-revalidate" + }, + { + "key": "Etag", + "value": "\"1704-498707-561003\"" + }, + { + "key": "Pragma", + "value": "no-cache" + }, + { + "key": "Content-Security-Policy", + "value": "default-src 'self'; block-all-mixed-content; base-uri 'self'; frame-ancestors 'none';" + }, + { + "key": "Strict-Transport-Security", + "value": "max-age=15552000; includeSubDomains" + }, + { + "key": "X-Content-Type-Options", + "value": "nosniff" + }, + { + "key": "X-Frame-Options", + "value": "DENY" + }, + { + "key": "X-XSS-Protection", + "value": "1; mode=block" + } + ], + "cookie": [], + "body": "{\n \"ietf-yang-library:modules-state\": {\n \"module-set-id\": \"f02b3be052f1d4283e0f6a59f79b6082\",\n \"module\": [\n {\n \"name\": \"cisco-asa-cli\",\n \"revision\": \"\",\n \"schema\": \"https://localhost:443/restconf/tailf/modules/cisco-asa-cli\",\n \"namespace\": \"http://tail-f.com/ns/ned-id/cisco-asa-cli\",\n \"conformance-type\": \"import\"\n },\n {\n \"name\": \"cisco-asa-cli-6.12\",\n \"revision\": \"\",\n \"schema\": \"https://localhost:443/restconf/tailf/modules/cisco-asa-cli-6.12\",\n \"namespace\": \"http://tail-f.com/ns/ned-id/cisco-asa-cli-6.12\",\n \"conformance-type\": \"import\"\n },\n {\n \"name\": \"cisco-ios-cli\",\n \"revision\": \"\",\n \"schema\": \"https://localhost:443/restconf/tailf/modules/cisco-ios-cli\",\n \"namespace\": \"http://tail-f.com/ns/ned-id/cisco-ios-cli\",\n \"conformance-type\": \"import\"\n },\n {\n \"name\": \"cisco-ios-cli-6.67\",\n \"revision\": \"\",\n \"schema\": \"https://localhost:443/restconf/tailf/modules/cisco-ios-cli-6.67\",\n \"namespace\": \"http://tail-f.com/ns/ned-id/cisco-ios-cli-6.67\",\n \"conformance-type\": \"import\"\n },\n {\n \"name\": \"cisco-iosxr-cli\",\n \"revision\": \"\",\n \"schema\": \"https://localhost:443/restconf/tailf/modules/cisco-iosxr-cli\",\n \"namespace\": \"http://tail-f.com/ns/ned-id/cisco-iosxr-cli\",\n \"conformance-type\": \"import\"\n },\n {\n \"name\": \"cisco-iosxr-cli-7.32\",\n \"revision\": \"\",\n \"schema\": \"https://localhost:443/restconf/tailf/modules/cisco-iosxr-cli-7.32\",\n \"namespace\": \"http://tail-f.com/ns/ned-id/cisco-iosxr-cli-7.32\",\n \"conformance-type\": \"import\"\n },\n {\n \"name\": \"cisco-nx-cli\",\n \"revision\": \"\",\n \"schema\": \"https://localhost:443/restconf/tailf/modules/cisco-nx-cli\",\n \"namespace\": \"http://tail-f.com/ns/ned-id/cisco-nx-cli\",\n \"conformance-type\": \"import\"\n },\n {\n \"name\": \"cisco-nx-cli-5.20\",\n \"revision\": \"\",\n \"schema\": \"https://localhost:443/restconf/tailf/modules/cisco-nx-cli-5.20\",\n \"namespace\": \"http://tail-f.com/ns/ned-id/cisco-nx-cli-5.20\",\n \"conformance-type\": \"import\"\n },\n {\n \"name\": \"encryption-usm\",\n \"revision\": \"\",\n \"schema\": \"https://localhost:443/restconf/tailf/modules/encryption-usm\",\n \"namespace\": \"http://tailf.com/ns/encryption-usm\",\n \"conformance-type\": \"implement\"\n },\n {\n \"name\": \"iana-crypt-hash\",\n \"revision\": \"2014-08-06\",\n \"schema\": \"https://localhost:443/restconf/tailf/modules/iana-crypt-hash/2014-08-06\",\n \"namespace\": \"urn:ietf:params:xml:ns:yang:iana-crypt-hash\",\n \"feature\": [\n \"crypt-hash-md5\",\n \"crypt-hash-sha-256\",\n \"crypt-hash-sha-512\"\n ],\n \"conformance-type\": \"implement\"\n },\n {\n \"name\": \"id-allocator\",\n \"revision\": \"2017-08-14\",\n \"schema\": \"https://localhost:443/restconf/tailf/modules/id-allocator/2017-08-14\",\n \"namespace\": \"http://tail-f.com/pkg/id-allocator\",\n \"conformance-type\": \"implement\",\n \"submodule\": [\n {\n \"name\": \"id-allocator-alarms\",\n \"revision\": \"2017-02-09\",\n \"schema\": \"https://localhost:443/restconf/tailf/modules/id-allocator-alarms/2017-02-09\"\n }\n ]\n },\n {\n \"name\": \"id-allocator-oper\",\n \"revision\": \"2015-10-20\",\n \"schema\": \"https://localhost:443/restconf/tailf/modules/id-allocator-oper/2015-10-20\",\n \"namespace\": \"http://tail-f.com/pkg/id-allocator-oper\",\n \"conformance-type\": \"implement\"\n },\n {\n \"name\": \"ietf-datastores\",\n \"revision\": \"2018-02-14\",\n \"schema\": \"https://localhost:443/restconf/tailf/modules/ietf-datastores/2018-02-14\",\n \"namespace\": \"urn:ietf:params:xml:ns:yang:ietf-datastores\",\n \"conformance-type\": \"import\"\n },\n {\n \"name\": \"ietf-inet-types\",\n \"revision\": \"2013-07-15\",\n \"schema\": \"https://localhost:443/restconf/tailf/modules/ietf-inet-types/2013-07-15\",\n \"namespace\": \"urn:ietf:params:xml:ns:yang:ietf-inet-types\",\n \"conformance-type\": \"import\"\n },\n {\n \"name\": \"ietf-interfaces\",\n \"revision\": \"2018-02-20\",\n \"schema\": \"https://localhost:443/restconf/tailf/modules/ietf-interfaces/2018-02-20\",\n \"namespace\": \"urn:ietf:params:xml:ns:yang:ietf-interfaces\",\n \"feature\": [\n \"arbitrary-names\",\n \"if-mib\",\n \"pre-provisioning\"\n ],\n \"conformance-type\": \"import\"\n },\n {\n \"name\": \"ietf-ip\",\n \"revision\": \"2018-02-22\",\n \"schema\": \"https://localhost:443/restconf/tailf/modules/ietf-ip/2018-02-22\",\n \"namespace\": \"urn:ietf:params:xml:ns:yang:ietf-ip\",\n \"feature\": [\n \"ipv4-non-contiguous-netmasks\",\n \"ipv6-privacy-autoconf\"\n ],\n \"conformance-type\": \"import\"\n },\n {\n \"name\": \"ietf-netconf-acm\",\n \"revision\": \"2018-02-14\",\n \"schema\": \"https://localhost:443/restconf/tailf/modules/ietf-netconf-acm/2018-02-14\",\n \"namespace\": \"urn:ietf:params:xml:ns:yang:ietf-netconf-acm\",\n \"conformance-type\": \"implement\"\n },\n {\n \"name\": \"ietf-netconf-monitoring\",\n \"revision\": \"2010-10-04\",\n \"schema\": \"https://localhost:443/restconf/tailf/modules/ietf-netconf-monitoring/2010-10-04\",\n \"namespace\": \"urn:ietf:params:xml:ns:yang:ietf-netconf-monitoring\",\n \"conformance-type\": \"implement\"\n },\n {\n \"name\": \"ietf-netconf-notifications\",\n \"revision\": \"2012-02-06\",\n \"schema\": \"https://localhost:443/restconf/tailf/modules/ietf-netconf-notifications/2012-02-06\",\n \"namespace\": \"urn:ietf:params:xml:ns:yang:ietf-netconf-notifications\",\n \"conformance-type\": \"implement\"\n },\n {\n \"name\": \"ietf-network-instance\",\n \"revision\": \"2019-01-21\",\n \"schema\": \"https://localhost:443/restconf/tailf/modules/ietf-network-instance/2019-01-21\",\n \"namespace\": \"urn:ietf:params:xml:ns:yang:ietf-network-instance\",\n \"conformance-type\": \"import\"\n },\n {\n \"name\": \"ietf-origin\",\n \"revision\": \"2018-02-14\",\n \"schema\": \"https://localhost:443/restconf/tailf/modules/ietf-origin/2018-02-14\",\n \"namespace\": \"urn:ietf:params:xml:ns:yang:ietf-origin\",\n \"conformance-type\": \"import\"\n },\n {\n \"name\": \"ietf-restconf\",\n \"revision\": \"2017-01-26\",\n \"schema\": \"https://localhost:443/restconf/tailf/modules/ietf-restconf/2017-01-26\",\n \"namespace\": \"urn:ietf:params:xml:ns:yang:ietf-restconf\",\n \"conformance-type\": \"implement\"\n },\n {\n \"name\": \"ietf-restconf-monitoring\",\n \"revision\": \"2017-01-26\",\n \"schema\": \"https://localhost:443/restconf/tailf/modules/ietf-restconf-monitoring/2017-01-26\",\n \"namespace\": \"urn:ietf:params:xml:ns:yang:ietf-restconf-monitoring\",\n \"conformance-type\": \"implement\"\n },\n {\n \"name\": \"ietf-x509-cert-to-name\",\n \"revision\": \"2014-12-10\",\n \"schema\": \"https://localhost:443/restconf/tailf/modules/ietf-x509-cert-to-name/2014-12-10\",\n \"namespace\": \"urn:ietf:params:xml:ns:yang:ietf-x509-cert-to-name\",\n \"conformance-type\": \"import\"\n },\n {\n \"name\": \"ietf-yang-library\",\n \"revision\": \"2019-01-04\",\n \"schema\": \"https://localhost:443/restconf/tailf/modules/ietf-yang-library/2019-01-04\",\n \"namespace\": \"urn:ietf:params:xml:ns:yang:ietf-yang-library\",\n \"conformance-type\": \"implement\"\n },\n {\n \"name\": \"ietf-yang-patch\",\n \"revision\": \"2017-02-22\",\n \"schema\": \"https://localhost:443/restconf/tailf/modules/ietf-yang-patch/2017-02-22\",\n \"namespace\": \"urn:ietf:params:xml:ns:yang:ietf-yang-patch\",\n \"conformance-type\": \"implement\"\n },\n {\n \"name\": \"ietf-yang-schema-mount\",\n \"revision\": \"2019-01-14\",\n \"schema\": \"https://localhost:443/restconf/tailf/modules/ietf-yang-schema-mount/2019-01-14\",\n \"namespace\": \"urn:ietf:params:xml:ns:yang:ietf-yang-schema-mount\",\n \"conformance-type\": \"implement\"\n },\n {\n \"name\": \"ietf-yang-smiv2\",\n \"revision\": \"2012-06-22\",\n \"schema\": \"https://localhost:443/restconf/tailf/modules/ietf-yang-smiv2/2012-06-22\",\n \"namespace\": \"urn:ietf:params:xml:ns:yang:ietf-yang-smiv2\",\n \"conformance-type\": \"import\"\n },\n {\n \"name\": \"ietf-yang-types\",\n \"revision\": \"2013-07-15\",\n \"schema\": \"https://localhost:443/restconf/tailf/modules/ietf-yang-types/2013-07-15\",\n \"namespace\": \"urn:ietf:params:xml:ns:yang:ietf-yang-types\",\n \"conformance-type\": \"import\"\n },\n {\n \"name\": \"ipaddress-allocator\",\n \"revision\": \"2018-02-27\",\n \"schema\": \"https://localhost:443/restconf/tailf/modules/ipaddress-allocator/2018-02-27\",\n \"namespace\": \"http://tail-f.com/pkg/ipaddress-allocator\",\n \"conformance-type\": \"implement\",\n \"submodule\": [\n {\n \"name\": \"ipaddress-allocator-alarms\",\n \"revision\": \"2017-02-09\",\n \"schema\": \"https://localhost:443/restconf/tailf/modules/ipaddress-allocator-alarms/2017-02-09\"\n }\n ]\n },\n {\n \"name\": \"ipaddress-allocator-oper\",\n \"revision\": \"2015-10-20\",\n \"schema\": \"https://localhost:443/restconf/tailf/modules/ipaddress-allocator-oper/2015-10-20\",\n \"namespace\": \"http://tail-f.com/pkg/ipaddress-allocator-oper\",\n \"conformance-type\": \"implement\"\n },\n {\n \"name\": \"resource-allocator\",\n \"revision\": \"2020-07-29\",\n \"schema\": \"https://localhost:443/restconf/tailf/modules/resource-allocator/2020-07-29\",\n \"namespace\": \"http://tail-f.com/pkg/resource-allocator\",\n \"conformance-type\": \"implement\"\n },\n {\n \"name\": \"selftest\",\n \"revision\": \"2016-12-05\",\n \"schema\": \"https://localhost:443/restconf/tailf/modules/selftest/2016-12-05\",\n \"namespace\": \"http://cisco.com/self-test-action\",\n \"conformance-type\": \"implement\"\n },\n {\n \"name\": \"snmp\",\n \"revision\": \"2010-10-22\",\n \"schema\": \"https://localhost:443/restconf/tailf/modules/snmp/2010-10-22\",\n \"namespace\": \"http://tailf.com/ns/snmp\",\n \"conformance-type\": \"implement\",\n \"submodule\": [\n {\n \"name\": \"snmp-agent\",\n \"revision\": \"\",\n \"schema\": \"https://localhost:443/restconf/tailf/modules/snmp-agent\"\n },\n {\n \"name\": \"snmp-common\",\n \"revision\": \"\",\n \"schema\": \"https://localhost:443/restconf/tailf/modules/snmp-common\"\n },\n {\n \"name\": \"snmp-community\",\n \"revision\": \"\",\n \"schema\": \"https://localhost:443/restconf/tailf/modules/snmp-community\"\n },\n {\n \"name\": \"snmp-notification\",\n \"revision\": \"\",\n \"schema\": \"https://localhost:443/restconf/tailf/modules/snmp-notification\"\n },\n {\n \"name\": \"snmp-target\",\n \"revision\": \"\",\n \"schema\": \"https://localhost:443/restconf/tailf/modules/snmp-target\"\n },\n {\n \"name\": \"snmp-target-params\",\n \"revision\": \"\",\n \"schema\": \"https://localhost:443/restconf/tailf/modules/snmp-target-params\"\n },\n {\n \"name\": \"snmp-usm\",\n \"revision\": \"\",\n \"schema\": \"https://localhost:443/restconf/tailf/modules/snmp-usm\"\n },\n {\n \"name\": \"snmp-vacm\",\n \"revision\": \"\",\n \"schema\": \"https://localhost:443/restconf/tailf/modules/snmp-vacm\"\n }\n ]\n },\n {\n \"name\": \"svi_verify_example\",\n \"revision\": \"2016-01-01\",\n \"schema\": \"https://localhost:443/restconf/tailf/modules/svi_verify_example/2016-01-01\",\n \"namespace\": \"http://example.com/svi_verify_example\",\n \"conformance-type\": \"implement\"\n },\n {\n \"name\": \"tailf-aaa\",\n \"revision\": \"2018-09-12\",\n \"schema\": \"https://localhost:443/restconf/tailf/modules/tailf-aaa/2018-09-12\",\n \"namespace\": \"http://tail-f.com/ns/aaa/1.1\",\n \"conformance-type\": \"implement\"\n },\n {\n \"name\": \"tailf-acm\",\n \"revision\": \"2013-03-07\",\n \"schema\": \"https://localhost:443/restconf/tailf/modules/tailf-acm/2013-03-07\",\n \"namespace\": \"http://tail-f.com/yang/acm\",\n \"conformance-type\": \"implement\"\n },\n {\n \"name\": \"tailf-common\",\n \"revision\": \"2020-12-08\",\n \"schema\": \"https://localhost:443/restconf/tailf/modules/tailf-common/2020-12-08\",\n \"namespace\": \"http://tail-f.com/yang/common\",\n \"conformance-type\": \"import\",\n \"submodule\": [\n {\n \"name\": \"tailf-cli-extensions\",\n \"revision\": \"2020-04-17\",\n \"schema\": \"https://localhost:443/restconf/tailf/modules/tailf-cli-extensions/2020-04-17\"\n },\n {\n \"name\": \"tailf-meta-extensions\",\n \"revision\": \"2017-03-08\",\n \"schema\": \"https://localhost:443/restconf/tailf/modules/tailf-meta-extensions/2017-03-08\"\n }\n ]\n },\n {\n \"name\": \"tailf-common-monitoring\",\n \"revision\": \"2019-04-09\",\n \"schema\": \"https://localhost:443/restconf/tailf/modules/tailf-common-monitoring/2019-04-09\",\n \"namespace\": \"http://tail-f.com/yang/common-monitoring\",\n \"conformance-type\": \"import\"\n },\n {\n \"name\": \"tailf-common-query\",\n \"revision\": \"2017-12-15\",\n \"schema\": \"https://localhost:443/restconf/tailf/modules/tailf-common-query/2017-12-15\",\n \"namespace\": \"http://tail-f.com/ns/common/query\",\n \"conformance-type\": \"import\"\n },\n {\n \"name\": \"tailf-configuration-policy\",\n \"revision\": \"2010-11-04\",\n \"schema\": \"https://localhost:443/restconf/tailf/modules/tailf-configuration-policy/2010-11-04\",\n \"namespace\": \"http://tail-f.com/yang/configuration-policy\",\n \"conformance-type\": \"implement\"\n },\n {\n \"name\": \"tailf-kicker\",\n \"revision\": \"2017-09-28\",\n \"schema\": \"https://localhost:443/restconf/tailf/modules/tailf-kicker/2017-09-28\",\n \"namespace\": \"http://tail-f.com/ns/kicker\",\n \"conformance-type\": \"implement\"\n },\n {\n \"name\": \"tailf-last-login\",\n \"revision\": \"2019-11-21\",\n \"schema\": \"https://localhost:443/restconf/tailf/modules/tailf-last-login/2019-11-21\",\n \"namespace\": \"http://tail-f.com/yang/last-login\",\n \"conformance-type\": \"implement\"\n },\n {\n \"name\": \"tailf-ncs\",\n \"revision\": \"2021-03-09\",\n \"schema\": \"https://localhost:443/restconf/tailf/modules/tailf-ncs/2021-03-09\",\n \"namespace\": \"http://tail-f.com/ns/ncs\",\n \"conformance-type\": \"implement\",\n \"submodule\": [\n {\n \"name\": \"tailf-ncs-cluster\",\n \"revision\": \"2019-11-28\",\n \"schema\": \"https://localhost:443/restconf/tailf/modules/tailf-ncs-cluster/2019-11-28\"\n },\n {\n \"name\": \"tailf-ncs-common\",\n \"revision\": \"2019-11-28\",\n \"schema\": \"https://localhost:443/restconf/tailf/modules/tailf-ncs-common/2019-11-28\"\n },\n {\n \"name\": \"tailf-ncs-compliance\",\n \"revision\": \"2016-05-26\",\n \"schema\": \"https://localhost:443/restconf/tailf/modules/tailf-ncs-compliance/2016-05-26\"\n },\n {\n \"name\": \"tailf-ncs-customers\",\n \"revision\": \"2012-08-30\",\n \"schema\": \"https://localhost:443/restconf/tailf/modules/tailf-ncs-customers/2012-08-30\"\n },\n {\n \"name\": \"tailf-ncs-devices\",\n \"revision\": \"2020-12-08\",\n \"schema\": \"https://localhost:443/restconf/tailf/modules/tailf-ncs-devices/2020-12-08\"\n },\n {\n \"name\": \"tailf-ncs-high-availability\",\n \"revision\": \"2020-06-25\",\n \"schema\": \"https://localhost:443/restconf/tailf/modules/tailf-ncs-high-availability/2020-06-25\"\n },\n {\n \"name\": \"tailf-ncs-java-vm\",\n \"revision\": \"2019-11-28\",\n \"schema\": \"https://localhost:443/restconf/tailf/modules/tailf-ncs-java-vm/2019-11-28\"\n },\n {\n \"name\": \"tailf-ncs-log\",\n \"revision\": \"2019-04-09\",\n \"schema\": \"https://localhost:443/restconf/tailf/modules/tailf-ncs-log/2019-04-09\"\n },\n {\n \"name\": \"tailf-ncs-packages\",\n \"revision\": \"2020-06-25\",\n \"schema\": \"https://localhost:443/restconf/tailf/modules/tailf-ncs-packages/2020-06-25\"\n },\n {\n \"name\": \"tailf-ncs-plan\",\n \"revision\": \"2020-12-08\",\n \"schema\": \"https://localhost:443/restconf/tailf/modules/tailf-ncs-plan/2020-12-08\"\n },\n {\n \"name\": \"tailf-ncs-python-vm\",\n \"revision\": \"2019-04-09\",\n \"schema\": \"https://localhost:443/restconf/tailf/modules/tailf-ncs-python-vm/2019-04-09\"\n },\n {\n \"name\": \"tailf-ncs-service-progress-monitoring\",\n \"revision\": \"2018-06-01\",\n \"schema\": \"https://localhost:443/restconf/tailf/modules/tailf-ncs-service-progress-monitoring/2018-06-01\"\n },\n {\n \"name\": \"tailf-ncs-services\",\n \"revision\": \"2020-12-08\",\n \"schema\": \"https://localhost:443/restconf/tailf/modules/tailf-ncs-services/2020-12-08\"\n },\n {\n \"name\": \"tailf-ncs-smart-license\",\n \"revision\": \"2020-06-25\",\n \"schema\": \"https://localhost:443/restconf/tailf/modules/tailf-ncs-smart-license/2020-06-25\"\n },\n {\n \"name\": \"tailf-ncs-snmp-notification-receiver\",\n \"revision\": \"2012-08-30\",\n \"schema\": \"https://localhost:443/restconf/tailf/modules/tailf-ncs-snmp-notification-receiver/2012-08-30\"\n },\n {\n \"name\": \"tailf-ncs-software\",\n \"revision\": \"2021-03-09\",\n \"schema\": \"https://localhost:443/restconf/tailf/modules/tailf-ncs-software/2021-03-09\"\n },\n {\n \"name\": \"tailf-ncs-ssh\",\n \"revision\": \"2019-11-28\",\n \"schema\": \"https://localhost:443/restconf/tailf/modules/tailf-ncs-ssh/2019-11-28\"\n }\n ]\n },\n {\n \"name\": \"tailf-ncs-acm\",\n \"revision\": \"2019-11-28\",\n \"schema\": \"https://localhost:443/restconf/tailf/modules/tailf-ncs-acm/2019-11-28\",\n \"namespace\": \"http://tail-f.com/yang/ncs-acm\",\n \"conformance-type\": \"implement\"\n },\n {\n \"name\": \"tailf-ncs-alarms\",\n \"revision\": \"2020-06-25\",\n \"schema\": \"https://localhost:443/restconf/tailf/modules/tailf-ncs-alarms/2020-06-25\",\n \"namespace\": \"http://tail-f.com/ns/ncs-alarms\",\n \"conformance-type\": \"implement\"\n },\n {\n \"name\": \"tailf-ncs-devices-yang-library\",\n \"revision\": \"2019-11-28\",\n \"schema\": \"https://localhost:443/restconf/tailf/modules/tailf-ncs-devices-yang-library/2019-11-28\",\n \"namespace\": \"http://tail-f.com/ns/ncs/devices-yang-library\",\n \"conformance-type\": \"implement\"\n },\n {\n \"name\": \"tailf-ncs-kicker-extension\",\n \"revision\": \"2019-04-09\",\n \"schema\": \"https://localhost:443/restconf/tailf/modules/tailf-ncs-kicker-extension/2019-04-09\",\n \"namespace\": \"http://tail-f.com/ns/ncs-kicker\",\n \"conformance-type\": \"implement\"\n },\n {\n \"name\": \"tailf-ncs-monitoring\",\n \"revision\": \"2019-04-09\",\n \"schema\": \"https://localhost:443/restconf/tailf/modules/tailf-ncs-monitoring/2019-04-09\",\n \"namespace\": \"http://tail-f.com/yang/ncs-monitoring\",\n \"conformance-type\": \"implement\"\n },\n {\n \"name\": \"tailf-ncs-ned\",\n \"revision\": \"2019-04-09\",\n \"schema\": \"https://localhost:443/restconf/tailf/modules/tailf-ncs-ned/2019-04-09\",\n \"namespace\": \"http://tail-f.com/ns/ncs-ned\",\n \"conformance-type\": \"import\"\n },\n {\n \"name\": \"tailf-ncs-netconf-ned-builder\",\n \"revision\": \"2020-06-25\",\n \"schema\": \"https://localhost:443/restconf/tailf/modules/tailf-ncs-netconf-ned-builder/2020-06-25\",\n \"namespace\": \"http://tail-f.com/ns/ncs/netconf-ned-builder\",\n \"conformance-type\": \"implement\"\n },\n {\n \"name\": \"tailf-ncs-progress\",\n \"revision\": \"2020-06-25\",\n \"schema\": \"https://localhost:443/restconf/tailf/modules/tailf-ncs-progress/2020-06-25\",\n \"namespace\": \"http://tail-f.com/ns/ncs-progress\",\n \"conformance-type\": \"implement\"\n },\n {\n \"name\": \"tailf-ncs-scheduler\",\n \"revision\": \"2020-12-08\",\n \"schema\": \"https://localhost:443/restconf/tailf/modules/tailf-ncs-scheduler/2020-12-08\",\n \"namespace\": \"http://tail-f.com/ns/ncs-scheduler\",\n \"conformance-type\": \"implement\"\n },\n {\n \"name\": \"tailf-ncs-snmp\",\n \"revision\": \"2017-03-16\",\n \"schema\": \"https://localhost:443/restconf/tailf/modules/tailf-ncs-snmp/2017-03-16\",\n \"namespace\": \"http://tail-f.com/ns/ncs-snmp\",\n \"conformance-type\": \"implement\"\n },\n {\n \"name\": \"tailf-ncs-webui\",\n \"revision\": \"2013-01-16\",\n \"schema\": \"https://localhost:443/restconf/tailf/modules/tailf-ncs-webui/2013-01-16\",\n \"namespace\": \"http://tail-f.com/ns/ncs-webui\",\n \"conformance-type\": \"implement\"\n },\n {\n \"name\": \"tailf-ned-cisco-asa-meta\",\n \"revision\": \"2020-11-27\",\n \"schema\": \"https://localhost:443/restconf/tailf/modules/tailf-ned-cisco-asa-meta/2020-11-27\",\n \"namespace\": \"http://cisco.com/ned/asa-meta\",\n \"conformance-type\": \"implement\"\n },\n {\n \"name\": \"tailf-ned-cisco-ios-meta\",\n \"revision\": \"2020-12-04\",\n \"schema\": \"https://localhost:443/restconf/tailf/modules/tailf-ned-cisco-ios-meta/2020-12-04\",\n \"namespace\": \"urn:ios-meta\",\n \"conformance-type\": \"implement\"\n },\n {\n \"name\": \"tailf-ned-cisco-ios-oper\",\n \"revision\": \"2020-12-04\",\n \"schema\": \"https://localhost:443/restconf/tailf/modules/tailf-ned-cisco-ios-oper/2020-12-04\",\n \"namespace\": \"http://tail-f.com/ned/cisco-ios/oper\",\n \"conformance-type\": \"implement\"\n },\n {\n \"name\": \"tailf-ned-cisco-ios-xr-meta\",\n \"revision\": \"2020-12-04\",\n \"schema\": \"https://localhost:443/restconf/tailf/modules/tailf-ned-cisco-ios-xr-meta/2020-12-04\",\n \"namespace\": \"http://tail-f.com/ned/cisco-iosxr/meta\",\n \"conformance-type\": \"implement\"\n },\n {\n \"name\": \"tailf-ned-cisco-ios-xr-oper\",\n \"revision\": \"2020-12-04\",\n \"schema\": \"https://localhost:443/restconf/tailf/modules/tailf-ned-cisco-ios-xr-oper/2020-12-04\",\n \"namespace\": \"http://tail-f.com/ned/cisco-iosxr/oper\",\n \"conformance-type\": \"implement\"\n },\n {\n \"name\": \"tailf-ned-cisco-nx-meta\",\n \"revision\": \"2020-12-08\",\n \"schema\": \"https://localhost:443/restconf/tailf/modules/tailf-ned-cisco-nx-meta/2020-12-08\",\n \"namespace\": \"http://tail-f.com/ned/cisco-nx/meta\",\n \"conformance-type\": \"implement\"\n },\n {\n \"name\": \"tailf-ned-cisco-nx-oper\",\n \"revision\": \"2020-12-08\",\n \"schema\": \"https://localhost:443/restconf/tailf/modules/tailf-ned-cisco-nx-oper/2020-12-08\",\n \"namespace\": \"http://tail-f.com/ned/cisco-nx/oper\",\n \"conformance-type\": \"implement\"\n },\n {\n \"name\": \"tailf-ned-loginscripts\",\n \"revision\": \"\",\n \"schema\": \"https://localhost:443/restconf/tailf/modules/tailf-ned-loginscripts\",\n \"namespace\": \"http://tail-f.com/ned/ned-loginscripts\",\n \"conformance-type\": \"implement\"\n },\n {\n \"name\": \"tailf-ned-secrets\",\n \"revision\": \"2019-04-17\",\n \"schema\": \"https://localhost:443/restconf/tailf/modules/tailf-ned-secrets/2019-04-17\",\n \"namespace\": \"http://tail-f.com/ned/ned-secrets\",\n \"conformance-type\": \"implement\"\n },\n {\n \"name\": \"tailf-netconf-monitoring\",\n \"revision\": \"2019-03-28\",\n \"schema\": \"https://localhost:443/restconf/tailf/modules/tailf-netconf-monitoring/2019-03-28\",\n \"namespace\": \"http://tail-f.com/yang/netconf-monitoring\",\n \"conformance-type\": \"implement\"\n },\n {\n \"name\": \"tailf-progress\",\n \"revision\": \"2020-06-25\",\n \"schema\": \"https://localhost:443/restconf/tailf/modules/tailf-progress/2020-06-25\",\n \"namespace\": \"http://tail-f.com/ns/progress\",\n \"conformance-type\": \"implement\"\n },\n {\n \"name\": \"tailf-rest-query\",\n \"revision\": \"2017-01-06\",\n \"schema\": \"https://localhost:443/restconf/tailf/modules/tailf-rest-query/2017-01-06\",\n \"namespace\": \"http://tail-f.com/ns/tailf-rest-query\",\n \"conformance-type\": \"implement\"\n },\n {\n \"name\": \"tailf-restconf-ncs\",\n \"revision\": \"2020-06-25\",\n \"schema\": \"https://localhost:443/restconf/tailf/modules/tailf-restconf-ncs/2020-06-25\",\n \"namespace\": \"http://tail-f.com/ns/restconf/ncs\",\n \"conformance-type\": \"implement\"\n },\n {\n \"name\": \"tailf-rollback\",\n \"revision\": \"2020-06-25\",\n \"schema\": \"https://localhost:443/restconf/tailf/modules/tailf-rollback/2020-06-25\",\n \"namespace\": \"http://tail-f.com/ns/rollback\",\n \"conformance-type\": \"implement\"\n },\n {\n \"name\": \"tailf-tls\",\n \"revision\": \"2019-06-13\",\n \"schema\": \"https://localhost:443/restconf/tailf/modules/tailf-tls/2019-06-13\",\n \"namespace\": \"http://tail-f.com/ns/tls\",\n \"conformance-type\": \"implement\"\n },\n {\n \"name\": \"tailf-webui\",\n \"revision\": \"2013-03-07\",\n \"schema\": \"https://localhost:443/restconf/tailf/modules/tailf-webui/2013-03-07\",\n \"namespace\": \"http://tail-f.com/ns/webui\",\n \"conformance-type\": \"implement\"\n },\n {\n \"name\": \"tailf-webui-one\",\n \"revision\": \"2019-06-27\",\n \"schema\": \"https://localhost:443/restconf/tailf/modules/tailf-webui-one/2019-06-27\",\n \"namespace\": \"http://tail-f.com/ns/webui-one\",\n \"conformance-type\": \"implement\"\n },\n {\n \"name\": \"tailf-xsd-types\",\n \"revision\": \"2017-11-20\",\n \"schema\": \"https://localhost:443/restconf/tailf/modules/tailf-xsd-types/2017-11-20\",\n \"namespace\": \"http://tail-f.com/yang/xsd-types\",\n \"conformance-type\": \"import\"\n }\n ]\n }\n}" + } + ] } ], "description": "Test objective\n\n- \"Verify that the IUT supports the basic YANG data models.\"\n \n\nReference\n\n- \"ETSI GS mWT 024 Clause 5.2.2.1 YANG Version\"\n \n\nPICS Selection IUT_PNC and RESTCONF and SEC_TLS" @@ -361,27 +574,23 @@ "});\r", "\r", "var responseData = '';\r", - "var topLevelPropertyName = '';\r", "\r", "pm.test(\"Verify that headers.Content-Type is 'application/yang-data+json'\", function () {\r", " pm.expect(pm.response.headers.get('Content-Type')).is.equals('application/yang-data+json');\r", - " responseData = pm.response.json();\r", - " topLevelPropertyName = responseData.hasOwnProperty('modules-state') ? 'modules-state' : 'ietf-yang-library:modules-state';\r", - " console.info(topLevelPropertyName)\r", + " responseData = pm.response.json()['ietf-yang-library:yang-library'];\r", + " pm.expect(responseData).to.be.an('object');\r", + " pm.expect(responseData).to.have.property('content-id');\r", "});\r", "\r", + "var topLevelPropertyName = '';\r", "var moduleList = {};\r", "\r", - "pm.test(\"Validate the main field is 'ietf-yang-library:modules-state'\", function () {\r", - " pm.expect(responseData).to.be.an('object');\r", - " pm.expect(responseData).to.have.property(topLevelPropertyName);\r", - " });\r", - "\r", - "pm.test(\"Verify that the 'module' array is present and not empty\", function () {\r", - " pm.expect(responseData).to.be.an('object');\r", - " pm.expect(responseData[topLevelPropertyName][\"module\"]).to.be.an('array').with.lengthOf.at.least(1);\r", - " // Build the module list\r", - " responseData[topLevelPropertyName].module.forEach(function(item, index) {\r", + "pm.test(\"Validate the main field is 'module-set'\", function () {\r", + " topLevelPropertyName = 'module-set';\r", + " pm.expect(responseData[topLevelPropertyName]).to.be.an('array');\r", + " pm.expect(responseData[topLevelPropertyName]).to.be.an('array').with.lengthOf.at.least(1);\r", + " // Build the list of the modules\r", + " responseData[topLevelPropertyName][0].module.forEach(function (item, index) {\r", " pm.expect(item).to.have.property('name');\r", " pm.expect(item).to.have.property('revision');\r", " pm.expect(item).to.have.property('namespace');\r", @@ -393,31 +602,30 @@ " moduleList[item.name] = item;\r", " }\r", " });\r", - " //console.log(moduleList);\r", + " console.info(\"moduleList=\", moduleList)\r", "});\r", "\r", - "pm.test('Verify that the basics YANG modules are supported', function() {\r", - " pm.expect(moduleList).to.have.property(\"ietf-restconf\");\r", - " console.log(moduleList[\"ietf-restconf\"].schema);\r", - " pm.expect(moduleList).to.have.property(\"ietf-yang-library\");\r", - " pm.expect(moduleList).to.have.property(\"ietf-datastores\");\r", - " pm.expect(moduleList).to.have.property(\"ietf-inet-types\");\r", - " pm.expect(moduleList).to.have.property(\"ietf-interfaces\");\r", - " pm.expect(moduleList).to.have.property(\"ietf-ip\");\r", - "});\r", - "\r", - "pm.test('Verify ietf-restconf YANG modules', function() {\r", - " var m = moduleList[\"ietf-restconf\"];\r", - " console.log(m);\r", - " // Check revision\r", - " pm.expect(m).to.have.property(\"revision\");\r", - " console.log(m[\"revision\"]);\r", - " // Check schema\r", - " pm.expect(m).to.have.property(\"schema\");\r", - " console.log(m[\"schema\"]);\r", - "});\r", + "var modulesVersion = {\r", + " 'ietf-network':[pm.environment.get('PX_IETF_YANG_LIBRARY_VERSION'), pm.environment.get('PX_IETF_YANG_LIBRARY_NAMESPACE')], \r", + " 'ietf-network-topology':[pm.environment.get('PX_IETF_RESTCONF_VERSION'), pm.environment.get('PX_IETF_RESTCONF_NAMESPACE')],\r", + " 'ietf-microwave-topology':[pm.environment.get('PX_IETF_RESTCONF_VERSION'), pm.environment.get('PX_IETF_RESTCONF_NAMESPACE')],\r", + " 'ietf-eth-te-topology':[pm.environment.get('PX_IETF_RESTCONF_VERSION'), pm.environment.get('PX_IETF_RESTCONF_NAMESPACE')],\r", + " 'ietf-eth-tran-service':[pm.environment.get('PX_IETF_RESTCONF_VERSION'), pm.environment.get('PX_IETF_RESTCONF_NAMESPACE')],\r", + " 'ietf-eth-tran-types':[pm.environment.get('PX_IETF_RESTCONF_VERSION'), pm.environment.get('PX_IETF_RESTCONF_NAMESPACE')]\r", + "};\r", "\r", - "" + "pm.test(\"Verify that the 'module' array contains all mandatories IETF Yang modules'\", function () {\r", + " pm.expect(moduleList).to.have.property(\"ietf-restconf\");\r", + " pm.expect(moduleList).to.have.property(\"ietf-yang-library\"); \r", + " for (var key in moduleList) {\r", + " var item = moduleList[key];\r", + " console.info(\"Processing item \", item);\r", + " if (modulesVersion[key] !== undefined) {\r", + " pm.expect(item).to.have.property('revision', modulesVersion[key][0]);\r", + " pm.expect(item).to.have.property('namespace');\r", + " }\r", + " }; // End of 'for' statement\r", + "});" ], "type": "text/javascript", "packages": {} @@ -447,53 +655,2563 @@ "value": "Services4Ever", "type": "string" }, - { - "key": "username", - "value": "developer", - "type": "string" - } - ] - }, - "method": "GET", - "header": [ - { - "key": "Accept", - "value": "application/yang-data+json", - "type": "text" - } - ], - "url": { - "raw": "{{PX_PROTOCOL}}://{{PX_IUT_IP_ADDRESS}}:{{PX_IUT_IP_PORT}}/{{PX_ROOT_API}}/ietf-yang-library:modules-state", - "protocol": "{{PX_PROTOCOL}}", - "host": [ - "{{PX_IUT_IP_ADDRESS}}" - ], - "port": "{{PX_IUT_IP_PORT}}", - "path": [ - "{{PX_ROOT_API}}", - "ietf-yang-library:modules-state" - ] - }, - "description": "/restconf/data/ietf-yang-library:modules-state" - }, - "response": [] - } - ], - "description": "Test objective\n\n- \"Verify that the IUT provides the list of supported mWT GS 024 YANG data models.\"\n \n\nReference\n\n- \"ETSI GS mWT 024 Clause 5.2.2.2 Common YANG data models\",\n \n- \"ETSI GS mWT 024 Clause 5.2.2.3 YANG Data Models at the Microwave MPI\",\n \n- \"ETSI GS mWT 024 Clause 5.2.2.4 Hierarchical relationship among YANG data models\"EndFragment\n \n\nPICS Selection IUT_PNC and RESTCONF and SEC_TLS" - } - ] - }, - { - "name": "PartiallyTransparent", - "item": [ - { - "name": "MWTopology", - "item": [ + { + "key": "username", + "value": "developer", + "type": "string" + } + ] + }, + "method": "GET", + "header": [ + { + "key": "Accept", + "value": "application/yang-data+json", + "type": "text" + } + ], + "url": { + "raw": "{{PX_PROTOCOL}}://{{PX_IUT_IP_ADDRESS}}:{{PX_IUT_IP_PORT}}/{{PX_ROOT_API}}/ietf-yang-library:yang-library", + "protocol": "{{PX_PROTOCOL}}", + "host": [ + "{{PX_IUT_IP_ADDRESS}}" + ], + "port": "{{PX_IUT_IP_PORT}}", + "path": [ + "{{PX_ROOT_API}}", + "ietf-yang-library:yang-library" + ] + }, + "description": "/restconf/data/ietf-yang-library:modules-state" + }, + "response": [] + } + ], + "description": "Test objective\n\n- \"Verify that the IUT provides the list of supported mWT GS 024 YANG data models.\"\n \n\nReference\n\n- \"ETSI GS mWT 024 Clause 5.2.2.2 Common YANG data models\",\n \n- \"ETSI GS mWT 024 Clause 5.2.2.3 YANG Data Models at the Microwave MPI\",\n \n- \"ETSI GS mWT 024 Clause 5.2.2.4 Hierarchical relationship among YANG data models\"EndFragment\n \n\nPICS Selection IUT_PNC and RESTCONF and SEC_TLS" + } + ] + }, + { + "name": "Blackbox", + "item": [ + { + "name": "TC_mWT_PNC_BB_MW_TOPO_GET_BV_01", + "item": [ + { + "name": "TC_mWT_PNC_BB_MW_TOPO_GET_BV_01", + "event": [ + { + "listen": "test", + "script": { + "exec": [ + "pm.test(\"Verify that the response status code is 200\", function () {\r", + " pm.response.to.have.status(200);\r", + "});\r", + "\r", + "var responseData = '';\r", + "var topLevelPropertyName = '';\r", + "\r", + "pm.test(\"Verify that headers.Content-Type is 'application/yang-data+json'\", function () {\r", + " pm.expect(pm.response.headers.get('Content-Type')).is.equals('application/yang-data+json');\r", + " responseData = pm.response.json();\r", + " topLevelPropertyName = responseData.hasOwnProperty('modules-state') ? 'modules-state' : 'ietf-yang-library:modules-state';\r", + " console.info(topLevelPropertyName)\r", + "});\r", + "\r", + "var networks = {};\r", + "\r", + "" + ], + "type": "text/javascript", + "packages": {} + } + } + ], + "request": { + "auth": { + "type": "basic", + "basic": [ + { + "key": "password", + "value": "{{PX_USER_PASSWD}}", + "type": "string" + }, + { + "key": "username", + "value": "{{PX_USER}}", + "type": "string" + } + ] + }, + "method": "GET", + "header": [], + "url": { + "raw": "{{PX_PROTOCOL}}://{{PX_IUT_IP_ADDRESS}}:{{PX_IUT_IP_PORT}}/{{PX_ROOT_API}}//ietf-network:networks", + "protocol": "{{PX_PROTOCOL}}", + "host": [ + "{{PX_IUT_IP_ADDRESS}}" + ], + "port": "{{PX_IUT_IP_PORT}}", + "path": [ + "{{PX_ROOT_API}}", + "", + "ietf-network:networks" + ] + } + }, + "response": [] + } + ], + "description": "Test objective\n\n- \"Verify that the IUT does not provide any MW network topology\"\n \n\nReference\n\n- \"ETSI GS mWT 024 Clause 4.3.2\",\n \n- \"ETSI GS mWT 024 Annex A.2.3\",\n \n- \"RFC 8345 A YANG Data Model for Network Topologies\",\n \n- \"RFC 8795 YANG Data Model for Traffic Engineering (TE) Topologies\"\n \n\nPICS Selection IUT_PNC and RESTCONF and SEC_TLS and ABSTRACT_BB and MW_TOPO" + }, + { + "name": "TC_mWT_PNC_BB_MW_TOPO_GET_BV_02", + "item": [ + { + "name": "TC_mWT_PNC_BB_MW_TOPO_GET_BV_02", + "event": [ + { + "listen": "test", + "script": { + "exec": [ + "pm.test(\"Verify that the response status code is 200\", function () {\r", + " pm.response.to.have.status(200);\r", + "});\r", + "\r", + "var responseData = '';\r", + "var topLevelPropertyName = '';\r", + "\r", + "pm.test(\"Verify that headers.Content-Type is 'application/yang-data+json'\", function () {\r", + " pm.expect(pm.response.headers.get('Content-Type')).is.equals('application/yang-data+json');\r", + " responseData = pm.response.json();\r", + " topLevelPropertyName = responseData.hasOwnProperty('modules-state') ? 'modules-state' : 'ietf-yang-library:modules-state';\r", + " console.info(topLevelPropertyName)\r", + "});\r", + "\r", + "var networks = {};\r", + "\r", + "" + ], + "type": "text/javascript", + "packages": {} + } + } + ], + "request": { + "auth": { + "type": "basic", + "basic": [ + { + "key": "password", + "value": "{{PX_USER_PASSWD}}", + "type": "string" + }, + { + "key": "username", + "value": "{{PX_USER}}", + "type": "string" + } + ] + }, + "method": "GET", + "header": [], + "url": { + "raw": "{{PX_PROTOCOL}}://{{PX_IUT_IP_ADDRESS}}:{{PX_IUT_IP_PORT}}/{{PX_ROOT_API}}//ietf-network:networks", + "protocol": "{{PX_PROTOCOL}}", + "host": [ + "{{PX_IUT_IP_ADDRESS}}" + ], + "port": "{{PX_IUT_IP_PORT}}", + "path": [ + "{{PX_ROOT_API}}", + "", + "ietf-network:networks" + ] + } + }, + "response": [] + } + ], + "description": "Test objective\n\n- \"Verify that the IUT provides a network list containing only one node.\"\n \n\nReference\n\n- \"ETSI GS mWT 024 Clause 4.3.2\",\n \n- \"ETSI GS mWT 024 Annex A.2.3\",\n \n- \"RFC 8345 A YANG Data Model for Network Topologies\",\n \n- \"RFC 8795 YANG Data Model for Traffic Engineering (TE) Topologies\"\n \n\nPICS Selection IUT_PNC and RESTCONF and SEC_TLS and ABSTRACT_BB and MW_TOPO" + } + ], + "description": "This group provides test case for Black-box abstraction level.\n\nReference\n\n- \"4.3.2 AL1: Abstraction Level 1 - \"Black-box\"\"" + }, + { + "name": "PartiallyTransparent", + "item": [ + { + "name": "MWTopologyDiscovery", + "item": [ + { + "name": "TC_mWT_PNC_MW_TOPO_GET_BV_01", + "item": [ + { + "name": "TC_mWT_PNC_MW_TOPO_GET_BV_01", + "event": [ + { + "listen": "test", + "script": { + "exec": [ + "pm.test(\"Verify that the response status code is 200\", function () {\r", + " pm.response.to.have.status(200);\r", + "});\r", + "\r", + "var responseData = '';\r", + "var topLevelPropertyName = '';\r", + "\r", + "pm.test(\"Verify that headers.Content-Type is 'application/yang-data+json'\", function () {\r", + " pm.expect(pm.response.headers.get('Content-Type')).is.equals('application/yang-data+json');\r", + " responseData = pm.response.json();\r", + " topLevelPropertyName = responseData.hasOwnProperty('modules-state') ? 'modules-state' : 'ietf-yang-library:modules-state';\r", + " console.info(topLevelPropertyName)\r", + "});\r", + "\r", + "// var moduleList = {};\r", + "\r", + "// pm.test(\"Validate the main field is 'ietf-yang-library:modules-state'\", function () {\r", + "// pm.expect(responseData).to.be.an('object');\r", + "// pm.expect(responseData).to.have.property(topLevelPropertyName);\r", + "// });\r", + "\r", + "// pm.test(\"Verify that the 'module' array is present and not empty\", function () {\r", + "// pm.expect(responseData).to.be.an('object');\r", + "// pm.expect(responseData[topLevelPropertyName][\"module\"]).to.be.an('array').with.lengthOf.at.least(1);\r", + "// // Build the module list\r", + "// responseData[topLevelPropertyName].module.forEach(function(item, index) {\r", + "// pm.expect(item).to.have.property('name');\r", + "// pm.expect(item).to.have.property('revision');\r", + "// pm.expect(item).to.have.property('namespace');\r", + "// if (moduleList.hasOwnProperty(item.name)) {\r", + "// if (moduleList[item.name].revision < item.revision) {\r", + "// moduleList[item.name] = item;\r", + "// }\r", + "// } else {\r", + "// moduleList[item.name] = item;\r", + "// }\r", + "// });\r", + "\r", + "// });\r", + "\r", + "// pm.test('Verify that the basics YANG modules are supported', function() {\r", + "// pm.expect(moduleList).to.have.property(\"ietf-restconf\");\r", + "// pm.expect(moduleList).to.have.property(\"ietf-yang-library\");\r", + "// pm.expect(moduleList).to.have.property(\"ietf-datastores\");\r", + "// pm.expect(moduleList).to.have.property(\"ietf-inet-types\");\r", + "// pm.expect(moduleList).to.have.property(\"ietf-interfaces\");\r", + "// pm.expect(moduleList).to.have.property(\"ietf-ip\");\r", + "//});" + ], + "type": "text/javascript", + "packages": {} + } + }, + { + "listen": "prerequest", + "script": { + "exec": [ + "// Check PICS requirements\r", + "if ((pm.environment.get('PICS_IUT_PNC') != \"true\") || (pm.environment.get('PICS_RESTCONF') != \"true\") || (pm.environment.get('PICS_SEC_TLS') != \"true\") || (pm.environment.get('PICS_ABSTRACT_BB') != \"true\") || (pm.environment.get('PICS_MW_TOPO') != \"true\")) {\r", + " throw new Error('PICS_IUT_PNC and PICS_RESTCONF and PICS_SEC_TLS and PICS_ABSTRACT_BB and PICS_MW_TOPO are required.');\r", + "}\r", + "" + ], + "type": "text/javascript", + "packages": {} + } + } + ], + "request": { + "auth": { + "type": "basic", + "basic": [ + { + "key": "password", + "value": "{{PX_USER_PASSWD}}", + "type": "string" + }, + { + "key": "username", + "value": "{{PX_USER}}", + "type": "string" + } + ] + }, + "method": "GET", + "header": [ + { + "key": "Accept", + "value": "application/yang-data+json" + } + ], + "url": { + "raw": "{{PX_PROTOCOL}}://{{PX_IUT_IP_ADDRESS}}:{{PX_IUT_IP_PORT}}/{{PX_ROOT_API}}/ietf-network:networks/topologyId/mw-native-topology", + "protocol": "{{PX_PROTOCOL}}", + "host": [ + "{{PX_IUT_IP_ADDRESS}}" + ], + "port": "{{PX_IUT_IP_PORT}}", + "path": [ + "{{PX_ROOT_API}}", + "ietf-network:networks", + "topologyId", + "mw-native-topology" + ] + }, + "description": "/restconf/data/ietf-yang-library:modules-state" + }, + "response": [] + } + ], + "description": "Test objective\n\n\"Verify that the IUT provides the MW network topology for all networks with mandatory mWT GC 024 data elements subset - black box abstraction level.\"\n\nReference\n\n- \"ETSI GS mWT 024 Annex A.1.2\",\n \n- \"RFC 8345 A YANG Data Model for Network Topologies\",\n \n- \"RFC 8795 YANG Data Model for Traffic Engineering (TE) Topologies\",\n \n- \"draft-ietf-ccamp-mw-topo-yang-02 A YANG Data Model for Microwave Topology\"\n \n\nPICS Selection StartFragmentIUT_PNC and RESTCONF and SEC_TLS and ABSTRACT_PT and MW_TOPO" + }, + { + "name": "TC_mWT_PNC_MW_TOPO_GET_BO_01", + "item": [ + { + "name": "TC_mWT_PNC_MW_TOPO_GET_BO_01", + "event": [ + { + "listen": "test", + "script": { + "exec": [ + "pm.test(\"Verify that the response status code is 200\", function () {\r", + " pm.response.to.have.status(400);\r", + "});\r", + "\r", + "var responseData = '';\r", + "var topLevelPropertyName = '';\r", + "\r", + "pm.test(\"Verify that headers.Content-Type is 'application/yang-data+json'\", function () {\r", + " pm.expect(pm.response.headers.get('Content-Type')).is.equals('application/yang-data+json');\r", + " responseData = pm.response.json();\r", + " topLevelPropertyName = responseData.hasOwnProperty('modules-state') ? 'modules-state' : 'ietf-yang-library:modules-state';\r", + " console.info(topLevelPropertyName)\r", + "});\r", + "\r", + "// var moduleList = {};\r", + "\r", + "// pm.test(\"Validate the main field is 'ietf-yang-library:modules-state'\", function () {\r", + "// pm.expect(responseData).to.be.an('object');\r", + "// pm.expect(responseData).to.have.property(topLevelPropertyName);\r", + "// });\r", + "\r", + "// pm.test(\"Verify that the 'module' array is present and not empty\", function () {\r", + "// pm.expect(responseData).to.be.an('object');\r", + "// pm.expect(responseData[topLevelPropertyName][\"module\"]).to.be.an('array').with.lengthOf.at.least(1);\r", + "// // Build the module list\r", + "// responseData[topLevelPropertyName].module.forEach(function(item, index) {\r", + "// pm.expect(item).to.have.property('name');\r", + "// pm.expect(item).to.have.property('revision');\r", + "// pm.expect(item).to.have.property('namespace');\r", + "// if (moduleList.hasOwnProperty(item.name)) {\r", + "// if (moduleList[item.name].revision < item.revision) {\r", + "// moduleList[item.name] = item;\r", + "// }\r", + "// } else {\r", + "// moduleList[item.name] = item;\r", + "// }\r", + "// });\r", + "\r", + "// });\r", + "\r", + "// pm.test('Verify that the basics YANG modules are supported', function() {\r", + "// pm.expect(moduleList).to.have.property(\"ietf-restconf\");\r", + "// pm.expect(moduleList).to.have.property(\"ietf-yang-library\");\r", + "// pm.expect(moduleList).to.have.property(\"ietf-datastores\");\r", + "// pm.expect(moduleList).to.have.property(\"ietf-inet-types\");\r", + "// pm.expect(moduleList).to.have.property(\"ietf-interfaces\");\r", + "// pm.expect(moduleList).to.have.property(\"ietf-ip\");\r", + "//});" + ], + "type": "text/javascript", + "packages": {} + } + }, + { + "listen": "prerequest", + "script": { + "exec": [ + "// Check PICS requirements\r", + "if ((pm.environment.get('PICS_IUT_PNC') != \"true\") || (pm.environment.get('PICS_RESTCONF') != \"true\") || (pm.environment.get('PICS_SEC_TLS') != \"true\") || (pm.environment.get('PICS_ABSTRACT_BB') != \"true\") || (pm.environment.get('PICS_MW_TOPO') != \"true\")) {\r", + " throw new Error('PICS_IUT_PNC and PICS_RESTCONF and PICS_SEC_TLS and PICS_ABSTRACT_BB and PICS_MW_TOPO are required.');\r", + "}\r", + "" + ], + "type": "text/javascript", + "packages": {} + } + } + ], + "request": { + "auth": { + "type": "basic", + "basic": [ + { + "key": "password", + "value": "{{PX_USER_PASSWD}}", + "type": "string" + }, + { + "key": "username", + "value": "{{PX_USER}}", + "type": "string" + } + ] + }, + "method": "GET", + "header": [ + { + "key": "Accept", + "value": "application/yang-data+json" + } + ], + "url": { + "raw": "{{PX_PROTOCOL}}://{{PX_IUT_IP_ADDRESS}}:{{PX_IUT_IP_PORT}}/{{PX_ROOT_API}}/networks", + "protocol": "{{PX_PROTOCOL}}", + "host": [ + "{{PX_IUT_IP_ADDRESS}}" + ], + "port": "{{PX_IUT_IP_PORT}}", + "path": [ + "{{PX_ROOT_API}}", + "networks" + ] + }, + "description": "/restconf/data/ietf-yang-library:modules-state" + }, + "response": [] + } + ], + "description": "Test objective\n\n- \"Verify that the IUT replies with an error code when the request is malformed.\"\n \n\nReference\n\n- \"ETSI GS mWT 024 Clause 4.3.3\",\n \n- \"ETSI GS mWT 024 Clause 5.3.2 Exception Handling\",\n \n- \"ETSI GS mWT 024 Annex A.2.2\",\n \n- \"RFC 8345 A YANG Data Model for Network Topologies\",\n \n- \"RFC 8795 YANG Data Model for Traffic Engineering (TE) Topologies\"\n \n\nPICS Selection IUT_PNC and RESTCONF and SEC_TLS and ABSTRACT_PT and MW_TOPO" + }, + { + "name": "TC_mWT_PNC_MW_TOPO_GET_BV_02", + "item": [ + { + "name": "TC_mWT_PNC_MW_TOPO_GET_BV_02", + "event": [ + { + "listen": "test", + "script": { + "exec": [ + "pm.test(\"Verify that the response status code is 200\", function () {\r", + " pm.response.to.have.status(200);\r", + "});\r", + "\r", + "var responseData = '';\r", + "var topLevelPropertyName = '';\r", + "\r", + "pm.test(\"Verify that headers.Content-Type is 'application/yang-data+json'\", function () {\r", + " pm.expect(pm.response.headers.get('Content-Type')).is.equals('application/yang-data+json');\r", + " responseData = pm.response.json();\r", + " topLevelPropertyName = responseData.hasOwnProperty('modules-state') ? 'modules-state' : 'ietf-yang-library:modules-state';\r", + " console.info(topLevelPropertyName)\r", + "});\r", + "\r", + "// var moduleList = {};\r", + "\r", + "// pm.test(\"Validate the main field is 'ietf-yang-library:modules-state'\", function () {\r", + "// pm.expect(responseData).to.be.an('object');\r", + "// pm.expect(responseData).to.have.property(topLevelPropertyName);\r", + "// });\r", + "\r", + "// pm.test(\"Verify that the 'module' array is present and not empty\", function () {\r", + "// pm.expect(responseData).to.be.an('object');\r", + "// pm.expect(responseData[topLevelPropertyName][\"module\"]).to.be.an('array').with.lengthOf.at.least(1);\r", + "// // Build the module list\r", + "// responseData[topLevelPropertyName].module.forEach(function(item, index) {\r", + "// pm.expect(item).to.have.property('name');\r", + "// pm.expect(item).to.have.property('revision');\r", + "// pm.expect(item).to.have.property('namespace');\r", + "// if (moduleList.hasOwnProperty(item.name)) {\r", + "// if (moduleList[item.name].revision < item.revision) {\r", + "// moduleList[item.name] = item;\r", + "// }\r", + "// } else {\r", + "// moduleList[item.name] = item;\r", + "// }\r", + "// });\r", + "\r", + "// });\r", + "\r", + "// pm.test('Verify that the basics YANG modules are supported', function() {\r", + "// pm.expect(moduleList).to.have.property(\"ietf-restconf\");\r", + "// pm.expect(moduleList).to.have.property(\"ietf-yang-library\");\r", + "// pm.expect(moduleList).to.have.property(\"ietf-datastores\");\r", + "// pm.expect(moduleList).to.have.property(\"ietf-inet-types\");\r", + "// pm.expect(moduleList).to.have.property(\"ietf-interfaces\");\r", + "// pm.expect(moduleList).to.have.property(\"ietf-ip\");\r", + "//});" + ], + "type": "text/javascript", + "packages": {} + } + }, + { + "listen": "prerequest", + "script": { + "exec": [ + "// Check PICS requirements\r", + "if ((pm.environment.get('PICS_IUT_PNC') != \"true\") || (pm.environment.get('PICS_RESTCONF') != \"true\") || (pm.environment.get('PICS_SEC_TLS') != \"true\") || (pm.environment.get('PICS_ABSTRACT_BB') != \"true\") || (pm.environment.get('PICS_MW_TOPO') != \"true\")) {\r", + " throw new Error('PICS_IUT_PNC and PICS_RESTCONF and PICS_SEC_TLS and PICS_ABSTRACT_BB and PICS_MW_TOPO are required.');\r", + "}\r", + "" + ], + "type": "text/javascript", + "packages": {} + } + } + ], + "request": { + "auth": { + "type": "basic", + "basic": [ + { + "key": "password", + "value": "{{PX_USER_PASSWD}}", + "type": "string" + }, + { + "key": "username", + "value": "{{PX_USER}}", + "type": "string" + } + ] + }, + "method": "GET", + "header": [ + { + "key": "Accept", + "value": "application/yang-data+json" + } + ], + "url": { + "raw": "{{PX_PROTOCOL}}://{{PX_IUT_IP_ADDRESS}}:{{PX_IUT_IP_PORT}}/{{PX_ROOT_API}}/ietf-microwave-topology/ietf-network:networks/network={PX_NETWORK_ID}/topologyId/mw-native-topology", + "protocol": "{{PX_PROTOCOL}}", + "host": [ + "{{PX_IUT_IP_ADDRESS}}" + ], + "port": "{{PX_IUT_IP_PORT}}", + "path": [ + "{{PX_ROOT_API}}", + "ietf-microwave-topology", + "ietf-network:networks", + "network={PX_NETWORK_ID}", + "topologyId", + "mw-native-topology" + ] + }, + "description": "/restconf/data/ietf-yang-library:modules-state" + }, + "response": [] + } + ], + "description": "Test objective\n\n- \"Verify that the IUT provides the MW network topology for a specific network with mandatory mWT GC 024 data elements subset.\"\n \n\nReference\n\n- \"ETSI GS mWT 024 Clause 4.3.3\",\n \n- \"ETSI GS mWT 024 Annex A.2.2.1\",\n \n- \"RFC 8345 A YANG Data Model for Network Topologies\",\n \n- \"RFC 8795 YANG Data Model for Traffic Engineering (TE) Topologies\"\n \n\nPICS Selection IUT_PNC and RESTCONF and SEC_TLS and ABSTRACT_PT and MW_TOPO" + }, + { + "name": "TC_mWT_PNC_MW_TOPO_GET_BO_02", + "item": [ + { + "name": "TC_mWT_PNC_MW_TOPO_GET_BO_02", + "event": [ + { + "listen": "test", + "script": { + "exec": [ + "pm.test(\"Verify that the response status code is 200\", function () {\r", + " pm.response.to.have.status(404);\r", + "});\r", + "" + ], + "type": "text/javascript", + "packages": {} + } + }, + { + "listen": "prerequest", + "script": { + "exec": [ + "// Check PICS requirements\r", + "if ((pm.environment.get('PICS_IUT_PNC') != \"true\") || (pm.environment.get('PICS_RESTCONF') != \"true\") || (pm.environment.get('PICS_SEC_TLS') != \"true\") || (pm.environment.get('PICS_ABSTRACT_BB') != \"true\") || (pm.environment.get('PICS_MW_TOPO') != \"true\")) {\r", + " throw new Error('PICS_IUT_PNC and PICS_RESTCONF and PICS_SEC_TLS and PICS_ABSTRACT_BB and PICS_MW_TOPO are required.');\r", + "}\r", + "" + ], + "type": "text/javascript", + "packages": {} + } + } + ], + "request": { + "auth": { + "type": "basic", + "basic": [ + { + "key": "username", + "value": "{{PX_USER}}", + "type": "string" + }, + { + "key": "password", + "value": "{{PX_USER_PASSWD}}", + "type": "string" + } + ] + }, + "method": "GET", + "header": [ + { + "key": "Accept", + "value": "application/yang-data+json" + } + ], + "url": { + "raw": "{{PX_PROTOCOL}}://{{PX_IUT_IP_ADDRESS}}:{{PX_IUT_IP_PORT}}/{{PX_ROOT_API}}/ietf-network:networks/network={PX_UNKNOWN_NETWORK_ID}/topologyId/mw-native-topology", + "protocol": "{{PX_PROTOCOL}}", + "host": [ + "{{PX_IUT_IP_ADDRESS}}" + ], + "port": "{{PX_IUT_IP_PORT}}", + "path": [ + "{{PX_ROOT_API}}", + "ietf-network:networks", + "network={PX_UNKNOWN_NETWORK_ID}", + "topologyId", + "mw-native-topology" + ] + }, + "description": "/restconf/data/ietf-yang-library:modules-state" + }, + "response": [] + } + ], + "description": "Test objective\n\n\"Verify that the IUT replies with an error code when the network identifier is unknown - black box abstraction level.\"\n\nReference\n\n- \"ETSI GS mWT 024 Clause 5.3.2 Exception Handling\",\n- \"ETSI GS mWT 024 Annex A.1.2\",\n- \"RFC 8345 A YANG Data Model for Network Topologies\",\n- \"RFC 8795 YANG Data Model for Traffic Engineering (TE) Topologies\"\n \n\nPICS Selection IUT_MDSC and ABSTRACT_BB and MW_TOPO" + }, + { + "name": "TC_mWT_PNC_PT_MW_NODE_GET_BV_01", + "item": [ + { + "name": "TC_mWT_PNC_PT_MW_NODE_GET_BV_01", + "event": [ + { + "listen": "test", + "script": { + "exec": [ + "pm.test(\"Verify that the response status code is 200\", function () {\r", + " pm.response.to.have.status(200);\r", + "});\r", + "\r", + "var responseData = '';\r", + "var topLevelPropertyName = '';\r", + "\r", + "pm.test(\"Verify that headers.Content-Type is 'application/yang-data+json'\", function () {\r", + " pm.expect(pm.response.headers.get('Content-Type')).is.equals('application/yang-data+json');\r", + " responseData = pm.response.json();\r", + " topLevelPropertyName = responseData.hasOwnProperty('modules-state') ? 'modules-state' : 'ietf-yang-library:modules-state';\r", + " console.info(topLevelPropertyName)\r", + "});\r", + "\r", + "// var moduleList = {};\r", + "\r", + "// pm.test(\"Validate the main field is 'ietf-yang-library:modules-state'\", function () {\r", + "// pm.expect(responseData).to.be.an('object');\r", + "// pm.expect(responseData).to.have.property(topLevelPropertyName);\r", + "// });\r", + "\r", + "// pm.test(\"Verify that the 'module' array is present and not empty\", function () {\r", + "// pm.expect(responseData).to.be.an('object');\r", + "// pm.expect(responseData[topLevelPropertyName][\"module\"]).to.be.an('array').with.lengthOf.at.least(1);\r", + "// // Build the module list\r", + "// responseData[topLevelPropertyName].module.forEach(function(item, index) {\r", + "// pm.expect(item).to.have.property('name');\r", + "// pm.expect(item).to.have.property('revision');\r", + "// pm.expect(item).to.have.property('namespace');\r", + "// if (moduleList.hasOwnProperty(item.name)) {\r", + "// if (moduleList[item.name].revision < item.revision) {\r", + "// moduleList[item.name] = item;\r", + "// }\r", + "// } else {\r", + "// moduleList[item.name] = item;\r", + "// }\r", + "// });\r", + "\r", + "// });\r", + "\r", + "// pm.test('Verify that the basics YANG modules are supported', function() {\r", + "// pm.expect(moduleList).to.have.property(\"ietf-restconf\");\r", + "// pm.expect(moduleList).to.have.property(\"ietf-yang-library\");\r", + "// pm.expect(moduleList).to.have.property(\"ietf-datastores\");\r", + "// pm.expect(moduleList).to.have.property(\"ietf-inet-types\");\r", + "// pm.expect(moduleList).to.have.property(\"ietf-interfaces\");\r", + "// pm.expect(moduleList).to.have.property(\"ietf-ip\");\r", + "//});" + ], + "type": "text/javascript", + "packages": {} + } + } + ], + "request": { + "auth": { + "type": "basic", + "basic": [ + { + "key": "username", + "value": "{{PX_USER}}", + "type": "string" + }, + { + "key": "password", + "value": "{{PX_USER_PASSWD}}", + "type": "string" + } + ] + }, + "method": "GET", + "header": [], + "url": { + "raw": "{{PX_PROTOCOL}}://{{PX_IUT_IP_ADDRESS}}:{{PX_IUT_IP_PORT}}/{{PX_ROOT_API}}/ietf-microwave-topology/ietf-network:networks/network={PX_NETWORK_ID}/node/topologyId/mw-native-topology", + "protocol": "{{PX_PROTOCOL}}", + "host": [ + "{{PX_IUT_IP_ADDRESS}}" + ], + "port": "{{PX_IUT_IP_PORT}}", + "path": [ + "{{PX_ROOT_API}}", + "ietf-microwave-topology", + "ietf-network:networks", + "network={PX_NETWORK_ID}", + "node", + "topologyId", + "mw-native-topology" + ] + } + }, + "response": [] + } + ], + "description": "Test objective\n\n- \"Verify that the IUT provides the MW network topology for all nodes with mandatory mWT GC 024 data elements subset.\"\n \n\nReference\n\n- \"ETSI GS mWT 024 Clause 4.3.3\",\n \n- \"ETSI GS mWT 024 Annex A.2.2.1\",\n \n- \"RFC 8345 A YANG Data Model for Network Topologies\",\n \n- \"RFC 8795 YANG Data Model for Traffic Engineering (TE) Topologies\",\n \n- \"draft-ietf-ccamp-mw-topo-yang-02 A YANG Data Model for Microwave Topology\"\n \n\nPICS Selection IUT_PNC and RESTCONF and SEC_TLS and ABSTRACT_PT and MW_TOPO" + }, + { + "name": "TC_mWT_PNC_PT_MW_NODE_GET_BO_01", + "item": [ + { + "name": "TC_mWT_PNC_PT_MW_NODE_GET_BO_01", + "event": [ + { + "listen": "test", + "script": { + "exec": [ + "pm.test(\"Verify that the response status code is 200\", function () {\r", + " pm.response.to.have.status(404);\r", + "});\r", + "\r", + "var responseData = '';\r", + "var topLevelPropertyName = '';\r", + "\r", + "pm.test(\"Verify that headers.Content-Type is 'application/yang-data+json'\", function () {\r", + " pm.expect(pm.response.headers.get('Content-Type')).is.equals('application/yang-data+json');\r", + " responseData = pm.response.json();\r", + " topLevelPropertyName = responseData.hasOwnProperty('modules-state') ? 'modules-state' : 'ietf-yang-library:modules-state';\r", + " console.info(topLevelPropertyName)\r", + "});\r", + "\r", + "// var moduleList = {};\r", + "\r", + "// pm.test(\"Validate the main field is 'ietf-yang-library:modules-state'\", function () {\r", + "// pm.expect(responseData).to.be.an('object');\r", + "// pm.expect(responseData).to.have.property(topLevelPropertyName);\r", + "// });\r", + "\r", + "// pm.test(\"Verify that the 'module' array is present and not empty\", function () {\r", + "// pm.expect(responseData).to.be.an('object');\r", + "// pm.expect(responseData[topLevelPropertyName][\"module\"]).to.be.an('array').with.lengthOf.at.least(1);\r", + "// // Build the module list\r", + "// responseData[topLevelPropertyName].module.forEach(function(item, index) {\r", + "// pm.expect(item).to.have.property('name');\r", + "// pm.expect(item).to.have.property('revision');\r", + "// pm.expect(item).to.have.property('namespace');\r", + "// if (moduleList.hasOwnProperty(item.name)) {\r", + "// if (moduleList[item.name].revision < item.revision) {\r", + "// moduleList[item.name] = item;\r", + "// }\r", + "// } else {\r", + "// moduleList[item.name] = item;\r", + "// }\r", + "// });\r", + "\r", + "// });\r", + "\r", + "// pm.test('Verify that the basics YANG modules are supported', function() {\r", + "// pm.expect(moduleList).to.have.property(\"ietf-restconf\");\r", + "// pm.expect(moduleList).to.have.property(\"ietf-yang-library\");\r", + "// pm.expect(moduleList).to.have.property(\"ietf-datastores\");\r", + "// pm.expect(moduleList).to.have.property(\"ietf-inet-types\");\r", + "// pm.expect(moduleList).to.have.property(\"ietf-interfaces\");\r", + "// pm.expect(moduleList).to.have.property(\"ietf-ip\");\r", + "//});" + ], + "type": "text/javascript", + "packages": {} + } + } + ], + "request": { + "auth": { + "type": "basic", + "basic": [ + { + "key": "username", + "value": "{{PX_USER}}", + "type": "string" + }, + { + "key": "password", + "value": "{{PX_USER_PASSWD}}", + "type": "string" + } + ] + }, + "method": "GET", + "header": [], + "url": { + "raw": "{{PX_PROTOCOL}}://{{PX_IUT_IP_ADDRESS}}:{{PX_IUT_IP_PORT}}/{{PX_ROOT_API}}/ietf-microwave-topology/ietf-network:networks/network={PX_NETWORK_ID}/node={PX_UNKNOWN_NODE_ID}/topologyId/mw-native-topology", + "protocol": "{{PX_PROTOCOL}}", + "host": [ + "{{PX_IUT_IP_ADDRESS}}" + ], + "port": "{{PX_IUT_IP_PORT}}", + "path": [ + "{{PX_ROOT_API}}", + "ietf-microwave-topology", + "ietf-network:networks", + "network={PX_NETWORK_ID}", + "node={PX_UNKNOWN_NODE_ID}", + "topologyId", + "mw-native-topology" + ] + } + }, + "response": [] + } + ], + "description": "Test objective\n\n- \"Verify that the IUT replies with an error code when the node identifier is unknown\"\n \n\nReference\n\n- \"ETSI GS mWT 024 Clause 4.3.3\",\n \n- \"ETSI GS mWT 024 Clause 5.3.2 Exception Handling\",\n \n- \"ETSI GS mWT 024 Annex A.2.2\",\n \n- \"RFC 8345 A YANG Data Model for Network Topologies\",\n \n- \"RFC 8795 YANG Data Model for Traffic Engineering (TE) Topologies\",\n \n- \"draft-ietf-ccamp-mw-topo-yang-02 A YANG Data Model for Microwave Topology\"EndFragment\n \n\nPICS Selection IUT_PNC and RESTCONF and SEC_TLS and ABSTRACT_PT and MW_TOPO" + }, + { + "name": "TC_mWT_PNC_PT_MW_NODE_GET_BV_02", + "item": [ + { + "name": "TC_mWT_PNC_PT_MW_NODE_GET_BV_02", + "event": [ + { + "listen": "test", + "script": { + "exec": [ + "pm.test(\"Verify that the response status code is 200\", function () {\r", + " pm.response.to.have.status(200);\r", + "});\r", + "\r", + "var responseData = '';\r", + "var topLevelPropertyName = '';\r", + "\r", + "pm.test(\"Verify that headers.Content-Type is 'application/yang-data+json'\", function () {\r", + " pm.expect(pm.response.headers.get('Content-Type')).is.equals('application/yang-data+json');\r", + " responseData = pm.response.json();\r", + " topLevelPropertyName = responseData.hasOwnProperty('modules-state') ? 'modules-state' : 'ietf-yang-library:modules-state';\r", + " console.info(topLevelPropertyName)\r", + "});\r", + "\r", + "// var moduleList = {};\r", + "\r", + "// pm.test(\"Validate the main field is 'ietf-yang-library:modules-state'\", function () {\r", + "// pm.expect(responseData).to.be.an('object');\r", + "// pm.expect(responseData).to.have.property(topLevelPropertyName);\r", + "// });\r", + "\r", + "// pm.test(\"Verify that the 'module' array is present and not empty\", function () {\r", + "// pm.expect(responseData).to.be.an('object');\r", + "// pm.expect(responseData[topLevelPropertyName][\"module\"]).to.be.an('array').with.lengthOf.at.least(1);\r", + "// // Build the module list\r", + "// responseData[topLevelPropertyName].module.forEach(function(item, index) {\r", + "// pm.expect(item).to.have.property('name');\r", + "// pm.expect(item).to.have.property('revision');\r", + "// pm.expect(item).to.have.property('namespace');\r", + "// if (moduleList.hasOwnProperty(item.name)) {\r", + "// if (moduleList[item.name].revision < item.revision) {\r", + "// moduleList[item.name] = item;\r", + "// }\r", + "// } else {\r", + "// moduleList[item.name] = item;\r", + "// }\r", + "// });\r", + "\r", + "// });\r", + "\r", + "// pm.test('Verify that the basics YANG modules are supported', function() {\r", + "// pm.expect(moduleList).to.have.property(\"ietf-restconf\");\r", + "// pm.expect(moduleList).to.have.property(\"ietf-yang-library\");\r", + "// pm.expect(moduleList).to.have.property(\"ietf-datastores\");\r", + "// pm.expect(moduleList).to.have.property(\"ietf-inet-types\");\r", + "// pm.expect(moduleList).to.have.property(\"ietf-interfaces\");\r", + "// pm.expect(moduleList).to.have.property(\"ietf-ip\");\r", + "//});" + ], + "type": "text/javascript", + "packages": {} + } + } + ], + "request": { + "auth": { + "type": "basic", + "basic": [ + { + "key": "username", + "value": "{{PX_USER}}", + "type": "string" + }, + { + "key": "password", + "value": "{{PX_USER_PASSWD}}", + "type": "string" + } + ] + }, + "method": "GET", + "header": [], + "url": { + "raw": "{{PX_PROTOCOL}}://{{PX_IUT_IP_ADDRESS}}:{{PX_IUT_IP_PORT}}/{{PX_ROOT_API}}/ietf-microwave-topology/ietf-network:networks/network={PX_NETWORK_ID}/node={PX_NODE_ID}/topologyId/mw-native-topology", + "protocol": "{{PX_PROTOCOL}}", + "host": [ + "{{PX_IUT_IP_ADDRESS}}" + ], + "port": "{{PX_IUT_IP_PORT}}", + "path": [ + "{{PX_ROOT_API}}", + "ietf-microwave-topology", + "ietf-network:networks", + "network={PX_NETWORK_ID}", + "node={PX_NODE_ID}", + "topologyId", + "mw-native-topology" + ] + } + }, + "response": [] + } + ], + "description": "Test objective\n\n- \"Verify that the IUT provides the MW network topology for a specific node with mandatory mWT GC 024 data elements subset.\"\n \n\nReference\n\n- \"ETSI GS mWT 024 Clause 4.3.3\",\n \n- \"ETSI GS mWT 024 Annex A.2.2.1\",\n \n- \"RFC 8345 A YANG Data Model for Network Topologies\",\n \n- \"RFC 8795 YANG Data Model for Traffic Engineering (TE) Topologies\",\n \n- \"draft-ietf-ccamp-mw-topo-yang-02 A YANG Data Model for Microwave Topology\"\n \n\nPICS Selection IUT_PNC and RESTCONF and SEC_TLS and ABSTRACT_PT and MW_TOPO" + } + ] + }, + { + "name": "EthernetTopologyDiscovery", + "item": [ + { + "name": "TC_mWT_PNC_PT_ETH_TOPO_NETWORK_GET_BV_01", + "item": [ + { + "name": "TC_mWT_PNC_PT_ETH_TOPO_NETWORK_GET_BV_01", + "event": [ + { + "listen": "test", + "script": { + "exec": [ + "pm.test(\"Verify that the response status code is 200\", function () {\r", + " pm.response.to.have.status(200);\r", + "});\r", + "\r", + "var responseData = '';\r", + "var topLevelPropertyName = '';\r", + "\r", + "pm.test(\"Verify that headers.Content-Type is 'application/yang-data+json'\", function () {\r", + " pm.expect(pm.response.headers.get('Content-Type')).is.equals('application/yang-data+json');\r", + " responseData = pm.response.json();\r", + " topLevelPropertyName = responseData.hasOwnProperty('modules-state') ? 'modules-state' : 'ietf-yang-library:modules-state';\r", + " console.info(topLevelPropertyName)\r", + "});\r", + "\r", + "// var moduleList = {};\r", + "\r", + "// pm.test(\"Validate the main field is 'ietf-yang-library:modules-state'\", function () {\r", + "// pm.expect(responseData).to.be.an('object');\r", + "// pm.expect(responseData).to.have.property(topLevelPropertyName);\r", + "// });\r", + "\r", + "// pm.test(\"Verify that the 'module' array is present and not empty\", function () {\r", + "// pm.expect(responseData).to.be.an('object');\r", + "// pm.expect(responseData[topLevelPropertyName][\"module\"]).to.be.an('array').with.lengthOf.at.least(1);\r", + "// // Build the module list\r", + "// responseData[topLevelPropertyName].module.forEach(function(item, index) {\r", + "// pm.expect(item).to.have.property('name');\r", + "// pm.expect(item).to.have.property('revision');\r", + "// pm.expect(item).to.have.property('namespace');\r", + "// if (moduleList.hasOwnProperty(item.name)) {\r", + "// if (moduleList[item.name].revision < item.revision) {\r", + "// moduleList[item.name] = item;\r", + "// }\r", + "// } else {\r", + "// moduleList[item.name] = item;\r", + "// }\r", + "// });\r", + "\r", + "// });\r", + "\r", + "// pm.test('Verify that the basics YANG modules are supported', function() {\r", + "// pm.expect(moduleList).to.have.property(\"ietf-restconf\");\r", + "// pm.expect(moduleList).to.have.property(\"ietf-yang-library\");\r", + "// pm.expect(moduleList).to.have.property(\"ietf-datastores\");\r", + "// pm.expect(moduleList).to.have.property(\"ietf-inet-types\");\r", + "// pm.expect(moduleList).to.have.property(\"ietf-interfaces\");\r", + "// pm.expect(moduleList).to.have.property(\"ietf-ip\");\r", + "//});" + ], + "type": "text/javascript", + "packages": {} + } + }, + { + "listen": "prerequest", + "script": { + "exec": [ + "// Check PICS requirements\r", + "if ((pm.environment.get('PICS_IUT_PNC') != \"true\") || (pm.environment.get('PICS_RESTCONF') != \"true\") || (pm.environment.get('PICS_SEC_TLS') != \"true\") || (pm.environment.get('PICS_ABSTRACT_BB') != \"true\") || (pm.environment.get('PICS_MW_TOPO') != \"true\")) {\r", + " throw new Error('PICS_IUT_PNC and PICS_RESTCONF and PICS_SEC_TLS and PICS_ABSTRACT_BB and PICS_MW_TOPO are required.');\r", + "}\r", + "" + ], + "type": "text/javascript", + "packages": {} + } + } + ], + "request": { + "auth": { + "type": "basic", + "basic": [ + { + "key": "password", + "value": "{{PX_USER_PASSWD}}", + "type": "string" + }, + { + "key": "username", + "value": "{{PX_USER}}", + "type": "string" + } + ] + }, + "method": "GET", + "header": [ + { + "key": "Accept", + "value": "application/yang-data+json" + } + ], + "url": { + "raw": "{{PX_PROTOCOL}}://{{PX_IUT_IP_ADDRESS}}:{{PX_IUT_IP_PORT}}/{{PX_ROOT_API}}/ietf-network:networks", + "protocol": "{{PX_PROTOCOL}}", + "host": [ + "{{PX_IUT_IP_ADDRESS}}" + ], + "port": "{{PX_IUT_IP_PORT}}", + "path": [ + "{{PX_ROOT_API}}", + "ietf-network:networks" + ] + }, + "description": "/restconf/data/ietf-yang-library:modules-state" + }, + "response": [] + } + ], + "description": "Test objective\n\n- \"Verify that the IUT provides the Ethernet network topology for all networks with mandatory mWT GC 024 data elements subset.\"\n \n\nReference\n\n- \"ETSI GS mWT 024 Clause 4.3.3\",\n \n- \"ETSI GS mWT 024 Annex A.2.2\",\n \n- \"RFC 8345 A YANG Data Model for Network Topologies\",\n \n- \"RFC 8795 YANG Data Model for Traffic Engineering (TE) Topologies\",\n \n- \"draft-ietf-ccamp-mw-topo-yang-02 A YANG Data Model for Microwave Topology\"\n \n\nPICS Selection IUT_PNC and RESTCONF and SEC_TLS and ABSTRACT_PT and ETH_TOPO" + }, + { + "name": "TC_mWT_PNC_PT_ETH_TOPO_NETWORK_GET_BV_02", + "item": [ + { + "name": "TC_mWT_PNC_PT_ETH_TOPO_NETWORK_GET_BV_02", + "event": [ + { + "listen": "test", + "script": { + "exec": [ + "pm.test(\"Verify that the response status code is 200\", function () {\r", + " pm.response.to.have.status(200);\r", + "});\r", + "\r", + "var responseData = '';\r", + "var topLevelPropertyName = '';\r", + "\r", + "pm.test(\"Verify that headers.Content-Type is 'application/yang-data+json'\", function () {\r", + " pm.expect(pm.response.headers.get('Content-Type')).is.equals('application/yang-data+json');\r", + " responseData = pm.response.json();\r", + " topLevelPropertyName = responseData.hasOwnProperty('modules-state') ? 'modules-state' : 'ietf-yang-library:modules-state';\r", + " console.info(topLevelPropertyName)\r", + "});\r", + "\r", + "// var moduleList = {};\r", + "\r", + "// pm.test(\"Validate the main field is 'ietf-yang-library:modules-state'\", function () {\r", + "// pm.expect(responseData).to.be.an('object');\r", + "// pm.expect(responseData).to.have.property(topLevelPropertyName);\r", + "// });\r", + "\r", + "// pm.test(\"Verify that the 'module' array is present and not empty\", function () {\r", + "// pm.expect(responseData).to.be.an('object');\r", + "// pm.expect(responseData[topLevelPropertyName][\"module\"]).to.be.an('array').with.lengthOf.at.least(1);\r", + "// // Build the module list\r", + "// responseData[topLevelPropertyName].module.forEach(function(item, index) {\r", + "// pm.expect(item).to.have.property('name');\r", + "// pm.expect(item).to.have.property('revision');\r", + "// pm.expect(item).to.have.property('namespace');\r", + "// if (moduleList.hasOwnProperty(item.name)) {\r", + "// if (moduleList[item.name].revision < item.revision) {\r", + "// moduleList[item.name] = item;\r", + "// }\r", + "// } else {\r", + "// moduleList[item.name] = item;\r", + "// }\r", + "// });\r", + "\r", + "// });\r", + "\r", + "// pm.test('Verify that the basics YANG modules are supported', function() {\r", + "// pm.expect(moduleList).to.have.property(\"ietf-restconf\");\r", + "// pm.expect(moduleList).to.have.property(\"ietf-yang-library\");\r", + "// pm.expect(moduleList).to.have.property(\"ietf-datastores\");\r", + "// pm.expect(moduleList).to.have.property(\"ietf-inet-types\");\r", + "// pm.expect(moduleList).to.have.property(\"ietf-interfaces\");\r", + "// pm.expect(moduleList).to.have.property(\"ietf-ip\");\r", + "//});" + ], + "type": "text/javascript", + "packages": {} + } + }, + { + "listen": "prerequest", + "script": { + "exec": [ + "// Check PICS requirements\r", + "if ((pm.environment.get('PICS_IUT_PNC') != \"true\") || (pm.environment.get('PICS_RESTCONF') != \"true\") || (pm.environment.get('PICS_SEC_TLS') != \"true\") || (pm.environment.get('PICS_ABSTRACT_BB') != \"true\") || (pm.environment.get('PICS_MW_TOPO') != \"true\")) {\r", + " throw new Error('PICS_IUT_PNC and PICS_RESTCONF and PICS_SEC_TLS and PICS_ABSTRACT_BB and PICS_MW_TOPO are required.');\r", + "}\r", + "" + ], + "type": "text/javascript", + "packages": {} + } + } + ], + "request": { + "auth": { + "type": "basic", + "basic": [ + { + "key": "password", + "value": "{{PX_USER_PASSWD}}", + "type": "string" + }, + { + "key": "username", + "value": "{{PX_USER}}", + "type": "string" + } + ] + }, + "method": "GET", + "header": [ + { + "key": "Accept", + "value": "application/yang-data+json" + } + ], + "url": { + "raw": "{{PX_PROTOCOL}}://{{PX_IUT_IP_ADDRESS}}:{{PX_IUT_IP_PORT}}/{{PX_ROOT_API}}/ietf-network:networks/network={PX_NETWORK_ID}", + "protocol": "{{PX_PROTOCOL}}", + "host": [ + "{{PX_IUT_IP_ADDRESS}}" + ], + "port": "{{PX_IUT_IP_PORT}}", + "path": [ + "{{PX_ROOT_API}}", + "ietf-network:networks", + "network={PX_NETWORK_ID}" + ] + }, + "description": "/restconf/data/ietf-yang-library:modules-state" + }, + "response": [] + } + ], + "description": "Test objective\n\n- \"Verify that the IUT provides the Ethernet network topology for a specific network with mandatory mWT GC 024 data elements subset.\"\n \n\nReference\n\n- \"ETSI GS mWT 024 Clause 4.3.3\",\n \n- \"ETSI GS mWT 024 Annex A.1.2\",\n \n- \"RFC 8345 A YANG Data Model for Network Topologies\",\n \n- \"RFC 8795 YANG Data Model for Traffic Engineering (TE) Topologies\"\n \n\nPICS Selection IUT_PNC and RESTCONF and SEC_TLS and ABSTRACT_PT and ETH_TOPO" + }, + { + "name": "TC_mWT_PNC_PT_ETH_TOPO_NETWORK_GET_BO_01", + "item": [ + { + "name": "TC_mWT_PNC_PT_ETH_TOPO_NETWORK_GET_BO_01", + "event": [ + { + "listen": "test", + "script": { + "exec": [ + "pm.test(\"Verify that the response status code is 200\", function () {\r", + " pm.response.to.have.status(400);\r", + "});\r", + "" + ], + "type": "text/javascript", + "packages": {} + } + }, + { + "listen": "prerequest", + "script": { + "exec": [ + "// Check PICS requirements\r", + "if ((pm.environment.get('PICS_IUT_PNC') != \"true\") || (pm.environment.get('PICS_RESTCONF') != \"true\") || (pm.environment.get('PICS_SEC_TLS') != \"true\") || (pm.environment.get('PICS_ABSTRACT_BB') != \"true\") || (pm.environment.get('PICS_MW_TOPO') != \"true\")) {\r", + " throw new Error('PICS_IUT_PNC and PICS_RESTCONF and PICS_SEC_TLS and PICS_ABSTRACT_BB and PICS_MW_TOPO are required.');\r", + "}\r", + "" + ], + "type": "text/javascript", + "packages": {} + } + } + ], + "request": { + "auth": { + "type": "basic", + "basic": [ + { + "key": "password", + "value": "{{PX_USER_PASSWD}}", + "type": "string" + }, + { + "key": "username", + "value": "{{PX_USER}}", + "type": "string" + } + ] + }, + "method": "GET", + "header": [ + { + "key": "Accept", + "value": "application/yang-data+json" + } + ], + "url": { + "raw": "{{PX_PROTOCOL}}://{{PX_IUT_IP_ADDRESS}}:{{PX_IUT_IP_PORT}}/{{PX_ROOT_API}}/networks/{PX_NETWORK_ID}", + "protocol": "{{PX_PROTOCOL}}", + "host": [ + "{{PX_IUT_IP_ADDRESS}}" + ], + "port": "{{PX_IUT_IP_PORT}}", + "path": [ + "{{PX_ROOT_API}}", + "networks", + "{PX_NETWORK_ID}" + ] + }, + "description": "/restconf/data/ietf-yang-library:modules-state" + }, + "response": [] + } + ], + "description": "Test objective\n\n- \"Verify that the IUT replies with an error code when the request is malformed.\"\n \n\nReference\n\n- \"ETSI GS mWT 024 Clause 4.3.3\",\n \n- \"ETSI GS mWT 024 Clause 5.3.2 Exception HandlingEndFragment\",\n \n- \"ETSI GS mWT 024 Annex A.1.3\",\n \n- \"RFC 8345 A YANG Data Model for Network Topologies\",\n \n- \"RFC 8795 YANG Data Model for Traffic Engineering (TE) Topologies\"\n \n\nPICS Selection IUT_PNC and RESTCONF and SEC_TLS and ABSTRACT_PT and ETH_TOPO" + }, + { + "name": "TC_mWT_PNC_PT_ETH_TOPO_NETWORK_GET_BO_02", + "item": [ + { + "name": "TC_mWT_PNC_PT_ETH_TOPO_NETWORK_GET_BO_02", + "event": [ + { + "listen": "test", + "script": { + "exec": [ + "pm.test(\"Verify that the response status code is 200\", function () {\r", + " pm.response.to.have.status(404);\r", + "});\r", + "" + ], + "type": "text/javascript", + "packages": {} + } + }, + { + "listen": "prerequest", + "script": { + "exec": [ + "// Check PICS requirements\r", + "if ((pm.environment.get('PICS_IUT_PNC') != \"true\") || (pm.environment.get('PICS_RESTCONF') != \"true\") || (pm.environment.get('PICS_SEC_TLS') != \"true\") || (pm.environment.get('PICS_ABSTRACT_BB') != \"true\") || (pm.environment.get('PICS_MW_TOPO') != \"true\")) {\r", + " throw new Error('PICS_IUT_PNC and PICS_RESTCONF and PICS_SEC_TLS and PICS_ABSTRACT_BB and PICS_MW_TOPO are required.');\r", + "}\r", + "" + ], + "type": "text/javascript", + "packages": {} + } + } + ], + "request": { + "auth": { + "type": "basic", + "basic": [ + { + "key": "password", + "value": "{{PX_USER_PASSWD}}", + "type": "string" + }, + { + "key": "username", + "value": "{{PX_USER}}", + "type": "string" + } + ] + }, + "method": "GET", + "header": [ + { + "key": "Accept", + "value": "application/yang-data+json" + } + ], + "url": { + "raw": "{{PX_PROTOCOL}}://{{PX_IUT_IP_ADDRESS}}:{{PX_IUT_IP_PORT}}/{{PX_ROOT_API}}/networks/{PX_UNKNOWN_NETWORK_ID}", + "protocol": "{{PX_PROTOCOL}}", + "host": [ + "{{PX_IUT_IP_ADDRESS}}" + ], + "port": "{{PX_IUT_IP_PORT}}", + "path": [ + "{{PX_ROOT_API}}", + "networks", + "{PX_UNKNOWN_NETWORK_ID}" + ] + }, + "description": "/restconf/data/ietf-yang-library:modules-state" + }, + "response": [] + } + ], + "description": "Test objective\n\n- \"Verify that the IUT replies with an error code when the network identifier is unknown.\"\n \n\nReference\n\n- \"ETSI GS mWT 024 Clause 4.3.3\",\n \n- \"ETSI GS mWT 024 Clause 5.3.2 Exception HandlingEndFragment\",\n \n- \"ETSI GS mWT 024 Annex A.1.2\",\n \n- \"RFC 8345 A YANG Data Model for Network Topologies\",\n \n- \"RFC 8795 YANG Data Model for Traffic Engineering (TE) Topologies\"\n \n\nPICS Selection IUT_PNC and RESTCONF and SEC_TLS and ABSTRACT_PT and ETH_TOPO" + }, + { + "name": "TC_mWT_PNC_PT_ETH_TOPO_NODE_GET_BV_01", + "item": [ + { + "name": "TC_mWT_PNC_PT_ETH_TOPO_NODE_GET_BV_01", + "event": [ + { + "listen": "test", + "script": { + "exec": [ + "pm.test(\"Verify that the response status code is 200\", function () {\r", + " pm.response.to.have.status(200);\r", + "});\r", + "\r", + "var responseData = '';\r", + "var topLevelPropertyName = '';\r", + "\r", + "pm.test(\"Verify that headers.Content-Type is 'application/yang-data+json'\", function () {\r", + " pm.expect(pm.response.headers.get('Content-Type')).is.equals('application/yang-data+json');\r", + " responseData = pm.response.json();\r", + " topLevelPropertyName = responseData.hasOwnProperty('modules-state') ? 'modules-state' : 'ietf-yang-library:modules-state';\r", + " console.info(topLevelPropertyName)\r", + "});\r", + "\r", + "// var moduleList = {};\r", + "\r", + "// pm.test(\"Validate the main field is 'ietf-yang-library:modules-state'\", function () {\r", + "// pm.expect(responseData).to.be.an('object');\r", + "// pm.expect(responseData).to.have.property(topLevelPropertyName);\r", + "// });\r", + "\r", + "// pm.test(\"Verify that the 'module' array is present and not empty\", function () {\r", + "// pm.expect(responseData).to.be.an('object');\r", + "// pm.expect(responseData[topLevelPropertyName][\"module\"]).to.be.an('array').with.lengthOf.at.least(1);\r", + "// // Build the module list\r", + "// responseData[topLevelPropertyName].module.forEach(function(item, index) {\r", + "// pm.expect(item).to.have.property('name');\r", + "// pm.expect(item).to.have.property('revision');\r", + "// pm.expect(item).to.have.property('namespace');\r", + "// if (moduleList.hasOwnProperty(item.name)) {\r", + "// if (moduleList[item.name].revision < item.revision) {\r", + "// moduleList[item.name] = item;\r", + "// }\r", + "// } else {\r", + "// moduleList[item.name] = item;\r", + "// }\r", + "// });\r", + "\r", + "// });\r", + "\r", + "// pm.test('Verify that the basics YANG modules are supported', function() {\r", + "// pm.expect(moduleList).to.have.property(\"ietf-restconf\");\r", + "// pm.expect(moduleList).to.have.property(\"ietf-yang-library\");\r", + "// pm.expect(moduleList).to.have.property(\"ietf-datastores\");\r", + "// pm.expect(moduleList).to.have.property(\"ietf-inet-types\");\r", + "// pm.expect(moduleList).to.have.property(\"ietf-interfaces\");\r", + "// pm.expect(moduleList).to.have.property(\"ietf-ip\");\r", + "//});" + ], + "type": "text/javascript", + "packages": {} + } + }, + { + "listen": "prerequest", + "script": { + "exec": [ + "// Check PICS requirements\r", + "if ((pm.environment.get('PICS_IUT_PNC') != \"true\") || (pm.environment.get('PICS_RESTCONF') != \"true\") || (pm.environment.get('PICS_SEC_TLS') != \"true\") || (pm.environment.get('PICS_ABSTRACT_BB') != \"true\") || (pm.environment.get('PICS_MW_TOPO') != \"true\")) {\r", + " throw new Error('PICS_IUT_PNC and PICS_RESTCONF and PICS_SEC_TLS and PICS_ABSTRACT_BB and PICS_MW_TOPO are required.');\r", + "}\r", + "" + ], + "type": "text/javascript", + "packages": {} + } + } + ], + "request": { + "auth": { + "type": "basic", + "basic": [ + { + "key": "password", + "value": "{{PX_USER_PASSWD}}", + "type": "string" + }, + { + "key": "username", + "value": "{{PX_USER}}", + "type": "string" + } + ] + }, + "method": "GET", + "header": [ + { + "key": "Accept", + "value": "application/yang-data+json" + } + ], + "url": { + "raw": "{{PX_PROTOCOL}}://{{PX_IUT_IP_ADDRESS}}:{{PX_IUT_IP_PORT}}/{{PX_ROOT_API}}/ietf-network:networks/network={PX_NETWORK_ID}/node", + "protocol": "{{PX_PROTOCOL}}", + "host": [ + "{{PX_IUT_IP_ADDRESS}}" + ], + "port": "{{PX_IUT_IP_PORT}}", + "path": [ + "{{PX_ROOT_API}}", + "ietf-network:networks", + "network={PX_NETWORK_ID}", + "node" + ] + }, + "description": "/restconf/data/ietf-yang-library:modules-state" + }, + "response": [] + } + ], + "description": "Test objective\n\n- \"Verify that the IUT provides the Ethernet network topology for all nodes with mandatory mWT GC 024 data elements subset.\"\n \n\nReference\n\n- \"ETSI GS mWT 024 Clause 4.3.3\",\n \n- \"ETSI GS mWT 024 Annex A.2.2\",\n \n- \"RFC 8345 A YANG Data Model for Network Topologies\",\n \n- \"RFC 8795 YANG Data Model for Traffic Engineering (TE) Topologies\",\n \n- \"draft-ietf-ccamp-mw-topo-yang-02 A YANG Data Model for Microwave Topology\"\n \n\nPICS Selection IUT_PNC and RESTCONF and SEC_TLS and ABSTRACT_PT and ETH_TOPO" + }, + { + "name": "TC_mWT_PNC_PT_ETH_TOPO_NODE_GET_BV_02", + "item": [ + { + "name": "TC_mWT_PNC_PT_ETH_TOPO_NODE_GET_BV_02", + "event": [ + { + "listen": "test", + "script": { + "exec": [ + "pm.test(\"Verify that the response status code is 200\", function () {\r", + " pm.response.to.have.status(200);\r", + "});\r", + "\r", + "var responseData = '';\r", + "var topLevelPropertyName = '';\r", + "\r", + "pm.test(\"Verify that headers.Content-Type is 'application/yang-data+json'\", function () {\r", + " pm.expect(pm.response.headers.get('Content-Type')).is.equals('application/yang-data+json');\r", + " responseData = pm.response.json();\r", + " topLevelPropertyName = responseData.hasOwnProperty('modules-state') ? 'modules-state' : 'ietf-yang-library:modules-state';\r", + " console.info(topLevelPropertyName)\r", + "});\r", + "\r", + "// var moduleList = {};\r", + "\r", + "// pm.test(\"Validate the main field is 'ietf-yang-library:modules-state'\", function () {\r", + "// pm.expect(responseData).to.be.an('object');\r", + "// pm.expect(responseData).to.have.property(topLevelPropertyName);\r", + "// });\r", + "\r", + "// pm.test(\"Verify that the 'module' array is present and not empty\", function () {\r", + "// pm.expect(responseData).to.be.an('object');\r", + "// pm.expect(responseData[topLevelPropertyName][\"module\"]).to.be.an('array').with.lengthOf.at.least(1);\r", + "// // Build the module list\r", + "// responseData[topLevelPropertyName].module.forEach(function(item, index) {\r", + "// pm.expect(item).to.have.property('name');\r", + "// pm.expect(item).to.have.property('revision');\r", + "// pm.expect(item).to.have.property('namespace');\r", + "// if (moduleList.hasOwnProperty(item.name)) {\r", + "// if (moduleList[item.name].revision < item.revision) {\r", + "// moduleList[item.name] = item;\r", + "// }\r", + "// } else {\r", + "// moduleList[item.name] = item;\r", + "// }\r", + "// });\r", + "\r", + "// });\r", + "\r", + "// pm.test('Verify that the basics YANG modules are supported', function() {\r", + "// pm.expect(moduleList).to.have.property(\"ietf-restconf\");\r", + "// pm.expect(moduleList).to.have.property(\"ietf-yang-library\");\r", + "// pm.expect(moduleList).to.have.property(\"ietf-datastores\");\r", + "// pm.expect(moduleList).to.have.property(\"ietf-inet-types\");\r", + "// pm.expect(moduleList).to.have.property(\"ietf-interfaces\");\r", + "// pm.expect(moduleList).to.have.property(\"ietf-ip\");\r", + "//});" + ], + "type": "text/javascript", + "packages": {} + } + }, + { + "listen": "prerequest", + "script": { + "exec": [ + "// Check PICS requirements\r", + "if ((pm.environment.get('PICS_IUT_PNC') != \"true\") || (pm.environment.get('PICS_RESTCONF') != \"true\") || (pm.environment.get('PICS_SEC_TLS') != \"true\") || (pm.environment.get('PICS_ABSTRACT_BB') != \"true\") || (pm.environment.get('PICS_MW_TOPO') != \"true\")) {\r", + " throw new Error('PICS_IUT_PNC and PICS_RESTCONF and PICS_SEC_TLS and PICS_ABSTRACT_BB and PICS_MW_TOPO are required.');\r", + "}\r", + "" + ], + "type": "text/javascript", + "packages": {} + } + } + ], + "request": { + "auth": { + "type": "basic", + "basic": [ + { + "key": "password", + "value": "{{PX_USER_PASSWD}}", + "type": "string" + }, + { + "key": "username", + "value": "{{PX_USER}}", + "type": "string" + } + ] + }, + "method": "GET", + "header": [ + { + "key": "Accept", + "value": "application/yang-data+json" + } + ], + "url": { + "raw": "{{PX_PROTOCOL}}://{{PX_IUT_IP_ADDRESS}}:{{PX_IUT_IP_PORT}}/{{PX_ROOT_API}}/ietf-network:networks/network={PX_NETWORK_ID}/node={PX_NODE_ID}", + "protocol": "{{PX_PROTOCOL}}", + "host": [ + "{{PX_IUT_IP_ADDRESS}}" + ], + "port": "{{PX_IUT_IP_PORT}}", + "path": [ + "{{PX_ROOT_API}}", + "ietf-network:networks", + "network={PX_NETWORK_ID}", + "node={PX_NODE_ID}" + ] + }, + "description": "/restconf/data/ietf-yang-library:modules-state" + }, + "response": [] + } + ], + "description": "Test objective\n\n- \"Verify that the IUT provides the Ethernet network topology for specific node with mandatory mWT GC 024 data elements subset\"\n \n\nReference\n\n- \"ETSI GS mWT 024 Clause 4.3.3\",\n \n- \"ETSI GS mWT 024 Annex A.2.2\",\n \n- \"RFC 8345 A YANG Data Model for Network Topologies\",\n \n- \"RFC 8795 YANG Data Model for Traffic Engineering (TE) Topologies\",\n \n- \"draft-ietf-ccamp-mw-topo-yang-02 A YANG Data Model for Microwave Topology\"\n \n\nPICS Selection IUT_PNC and RESTCONF and SEC_TLS and ABSTRACT_PT and ETH_TOPO" + }, + { + "name": "TC_mWT_PNC_PT_ETH_TOPO_NODE_GET_BO_01", + "item": [ + { + "name": "TC_mWT_PNC_PT_ETH_TOPO_NODE_GET_BO_01", + "event": [ + { + "listen": "test", + "script": { + "exec": [ + "pm.test(\"Verify that the response status code is 200\", function () {\r", + " pm.response.to.have.status(404);\r", + "});\r", + "" + ], + "type": "text/javascript", + "packages": {} + } + }, + { + "listen": "prerequest", + "script": { + "exec": [ + "// Check PICS requirements\r", + "if ((pm.environment.get('PICS_IUT_PNC') != \"true\") || (pm.environment.get('PICS_RESTCONF') != \"true\") || (pm.environment.get('PICS_SEC_TLS') != \"true\") || (pm.environment.get('PICS_ABSTRACT_BB') != \"true\") || (pm.environment.get('PICS_MW_TOPO') != \"true\")) {\r", + " throw new Error('PICS_IUT_PNC and PICS_RESTCONF and PICS_SEC_TLS and PICS_ABSTRACT_BB and PICS_MW_TOPO are required.');\r", + "}\r", + "" + ], + "type": "text/javascript", + "packages": {} + } + } + ], + "request": { + "auth": { + "type": "basic", + "basic": [ + { + "key": "password", + "value": "{{PX_USER_PASSWD}}", + "type": "string" + }, + { + "key": "username", + "value": "{{PX_USER}}", + "type": "string" + } + ] + }, + "method": "GET", + "header": [ + { + "key": "Accept", + "value": "application/yang-data+json" + } + ], + "url": { + "raw": "{{PX_PROTOCOL}}://{{PX_IUT_IP_ADDRESS}}:{{PX_IUT_IP_PORT}}/{{PX_ROOT_API}}/ietf-network:networks/network={PX_NETWORK_ID}/node={PX_UNKNOWN_NODE_ID}", + "protocol": "{{PX_PROTOCOL}}", + "host": [ + "{{PX_IUT_IP_ADDRESS}}" + ], + "port": "{{PX_IUT_IP_PORT}}", + "path": [ + "{{PX_ROOT_API}}", + "ietf-network:networks", + "network={PX_NETWORK_ID}", + "node={PX_UNKNOWN_NODE_ID}" + ] + }, + "description": "/restconf/data/ietf-yang-library:modules-state" + }, + "response": [] + } + ], + "description": "Test objective\n\n- \"Verify that the IUT replies with an error code when the node identifier is unknown.\"\n \n\nReference\n\n- \"ETSI GS mWT 024 Clause 4.3.3\",\n \n- \"ETSI GS mWT 024 Clause 5.3.2 Exception Handling\",\n \n- \"ETSI GS mWT 024 Annex A.2.2\",\n \n- \"RFC 8345 A YANG Data Model for Network Topologies\",\n \n- \"RFC 8795 YANG Data Model for Traffic Engineering (TE) Topologies\",\n \n- \"draft-ietf-ccamp-mw-topo-yang-02 A YANG Data Model for Microwave Topology\"\n \n\nPICS Selection IUT_PNC and RESTCONF and SEC_TLS and ABSTRACT_PT and ETH_TOPO" + } + ] + }, + { + "name": "EthernetService", + "item": [ + { + "name": "TC_mWT_PNC_PT_ETH_SVC_GET_BV_01", + "item": [ + { + "name": "TC_mWT_PNC_PT_ETH_SVC_GET_BV_01", + "event": [ + { + "listen": "test", + "script": { + "exec": [ + "pm.test(\"Verify that the response status code is 200\", function () {\r", + " pm.response.to.have.status(200);\r", + "});\r", + "\r", + "var responseData = '';\r", + "var topLevelPropertyName = '';\r", + "\r", + "pm.test(\"Verify that headers.Content-Type is 'application/yang-data+json'\", function () {\r", + " pm.expect(pm.response.headers.get('Content-Type')).is.equals('application/yang-data+json');\r", + " responseData = pm.response.json();\r", + " topLevelPropertyName = responseData.hasOwnProperty('modules-state') ? 'modules-state' : 'ietf-yang-library:modules-state';\r", + " console.info(topLevelPropertyName)\r", + "});\r", + "\r", + "// var moduleList = {};\r", + "\r", + "// pm.test(\"Validate the main field is 'ietf-yang-library:modules-state'\", function () {\r", + "// pm.expect(responseData).to.be.an('object');\r", + "// pm.expect(responseData).to.have.property(topLevelPropertyName);\r", + "// });\r", + "\r", + "// pm.test(\"Verify that the 'module' array is present and not empty\", function () {\r", + "// pm.expect(responseData).to.be.an('object');\r", + "// pm.expect(responseData[topLevelPropertyName][\"module\"]).to.be.an('array').with.lengthOf.at.least(1);\r", + "// // Build the module list\r", + "// responseData[topLevelPropertyName].module.forEach(function(item, index) {\r", + "// pm.expect(item).to.have.property('name');\r", + "// pm.expect(item).to.have.property('revision');\r", + "// pm.expect(item).to.have.property('namespace');\r", + "// if (moduleList.hasOwnProperty(item.name)) {\r", + "// if (moduleList[item.name].revision < item.revision) {\r", + "// moduleList[item.name] = item;\r", + "// }\r", + "// } else {\r", + "// moduleList[item.name] = item;\r", + "// }\r", + "// });\r", + "\r", + "// });\r", + "\r", + "// pm.test('Verify that the basics YANG modules are supported', function() {\r", + "// pm.expect(moduleList).to.have.property(\"ietf-restconf\");\r", + "// pm.expect(moduleList).to.have.property(\"ietf-yang-library\");\r", + "// pm.expect(moduleList).to.have.property(\"ietf-datastores\");\r", + "// pm.expect(moduleList).to.have.property(\"ietf-inet-types\");\r", + "// pm.expect(moduleList).to.have.property(\"ietf-interfaces\");\r", + "// pm.expect(moduleList).to.have.property(\"ietf-ip\");\r", + "//});" + ], + "type": "text/javascript", + "packages": {} + } + }, + { + "listen": "prerequest", + "script": { + "exec": [ + "// Check PICS requirements\r", + "if ((pm.environment.get('PICS_IUT_PNC') != \"true\") || (pm.environment.get('PICS_RESTCONF') != \"true\") || (pm.environment.get('PICS_SEC_TLS') != \"true\") || (pm.environment.get('PICS_ABSTRACT_BB') != \"true\") || (pm.environment.get('PICS_MW_TOPO') != \"true\")) {\r", + " throw new Error('PICS_IUT_PNC and PICS_RESTCONF and PICS_SEC_TLS and PICS_ABSTRACT_BB and PICS_MW_TOPO are required.');\r", + "}\r", + "" + ], + "type": "text/javascript", + "packages": {} + } + } + ], + "request": { + "auth": { + "type": "basic", + "basic": [ + { + "key": "password", + "value": "{{PX_USER_PASSWD}}", + "type": "string" + }, + { + "key": "username", + "value": "{{PX_USER}}", + "type": "string" + } + ] + }, + "method": "GET", + "header": [ + { + "key": "Accept", + "value": "application/yang-data+json" + } + ], + "url": { + "raw": "{{PX_PROTOCOL}}://{{PX_IUT_IP_ADDRESS}}:{{PX_IUT_IP_PORT}}/{{PX_ROOT_API}}/ietf-eth-tran-service:etht-svc/globals", + "protocol": "{{PX_PROTOCOL}}", + "host": [ + "{{PX_IUT_IP_ADDRESS}}" + ], + "port": "{{PX_IUT_IP_PORT}}", + "path": [ + "{{PX_ROOT_API}}", + "ietf-eth-tran-service:etht-svc", + "globals" + ] + }, + "description": "/restconf/data/ietf-yang-library:modules-state" + }, + "response": [] + } + ], + "description": "Test objective\n\n- \"Verify that the IUT provides all the Bandwidth profiles with mandatory mWT GC 024 data elements subset.\"\n \n\nReference\n\n- \"ETSI GS mWT 024 Clause 4.3.3\",\n \n- \"ETSI GS mWT 024 Annex A.2.2\",\n \n- \"RFC 8345 A YANG Data Model for Network Topologies\",\n \n- \"RFC 8795 YANG Data Model for Traffic Engineering (TE) Topologies\",\n \n- \"draft-ietf-ccamp-client-signal-yang-05 A YANG Data Model for Transport Network Client Signals\"\n \n\nPICS Selection IUT_PNC and RESTCONF and SEC_TLS and ABSTRACT_PT" + }, + { + "name": "TC_mWT_PNC_PT_ETH_SVC_GET_BO_01", + "item": [ + { + "name": "TC_mWT_PNC_PT_ETH_SVC_GET_BO_01", + "event": [ + { + "listen": "test", + "script": { + "exec": [ + "pm.test(\"Verify that the response status code is 200\", function () {\r", + " pm.response.to.have.status(400);\r", + "});" + ], + "type": "text/javascript", + "packages": {} + } + }, + { + "listen": "prerequest", + "script": { + "exec": [ + "// Check PICS requirements\r", + "if ((pm.environment.get('PICS_IUT_PNC') != \"true\") || (pm.environment.get('PICS_RESTCONF') != \"true\") || (pm.environment.get('PICS_SEC_TLS') != \"true\") || (pm.environment.get('PICS_ABSTRACT_BB') != \"true\") || (pm.environment.get('PICS_MW_TOPO') != \"true\")) {\r", + " throw new Error('PICS_IUT_PNC and PICS_RESTCONF and PICS_SEC_TLS and PICS_ABSTRACT_BB and PICS_MW_TOPO are required.');\r", + "}\r", + "" + ], + "type": "text/javascript", + "packages": {} + } + } + ], + "request": { + "auth": { + "type": "basic", + "basic": [ + { + "key": "password", + "value": "{{PX_USER_PASSWD}}", + "type": "string" + }, + { + "key": "username", + "value": "{{PX_USER}}", + "type": "string" + } + ] + }, + "method": "GET", + "header": [ + { + "key": "Accept", + "value": "application/yang-data+json" + } + ], + "url": { + "raw": "{{PX_PROTOCOL}}://{{PX_IUT_IP_ADDRESS}}:{{PX_IUT_IP_PORT}}/{{PX_ROOT_API}}/tran-service:etht-svc/globals", + "protocol": "{{PX_PROTOCOL}}", + "host": [ + "{{PX_IUT_IP_ADDRESS}}" + ], + "port": "{{PX_IUT_IP_PORT}}", + "path": [ + "{{PX_ROOT_API}}", + "tran-service:etht-svc", + "globals" + ] + }, + "description": "/restconf/data/ietf-yang-library:modules-state" + }, + "response": [] + } + ], + "description": "Test objective\n\n- \"Verify that the IUT replies with an error code when the request is malformed.\"\n \n\nReference\n\n- \"ETSI GS mWT 024 Clause 4.2.2.1 Ethernet Ethernet Services\",\n \n- \"ETSI GS mWT 024 Clause 4.3.3\",\n \n- \"ETSI GS mWT 024 Clause 5.3.2 Exception Handling\",\n \n- \"ETSI GS mWT 024 Annex A.2.4\",\n \n- \"RFC 6991 Common YANG Data Types\",\n \n- \"RFC 8776 Common YANG Data Types for Traffic Engineering\",\n \n- \"draft-ietf-ccamp-client-signal-yang-05 A YANG Data Model for Transport Network Client Signals\"\n \n\nPICS Selection IUT_PNC and RESTCONF and SEC_TLS and ABSTRACT_PT" + }, + { + "name": "TC_mWT_PNC_PT_ETH_SVC_POST_BV_01", + "item": [ + { + "name": "TC_mWT_PNC_PT_ETH_SVC_POST_BV_01", + "event": [ + { + "listen": "test", + "script": { + "exec": [ + "pm.test(\"Verify that the response status code is 200\", function () {\r", + " pm.response.to.have.status(200);\r", + "});\r", + "\r", + "var responseData = '';\r", + "var topLevelPropertyName = '';\r", + "\r", + "pm.test(\"Verify that headers.Content-Type is 'application/yang-data+json'\", function () {\r", + " pm.expect(pm.response.headers.get('Content-Type')).is.equals('application/yang-data+json');\r", + " responseData = pm.response.json();\r", + " topLevelPropertyName = responseData.hasOwnProperty('modules-state') ? 'modules-state' : 'ietf-yang-library:modules-state';\r", + " console.info(topLevelPropertyName)\r", + "});\r", + "\r", + "// var moduleList = {};\r", + "\r", + "// pm.test(\"Validate the main field is 'ietf-yang-library:modules-state'\", function () {\r", + "// pm.expect(responseData).to.be.an('object');\r", + "// pm.expect(responseData).to.have.property(topLevelPropertyName);\r", + "// });\r", + "\r", + "// pm.test(\"Verify that the 'module' array is present and not empty\", function () {\r", + "// pm.expect(responseData).to.be.an('object');\r", + "// pm.expect(responseData[topLevelPropertyName][\"module\"]).to.be.an('array').with.lengthOf.at.least(1);\r", + "// // Build the module list\r", + "// responseData[topLevelPropertyName].module.forEach(function(item, index) {\r", + "// pm.expect(item).to.have.property('name');\r", + "// pm.expect(item).to.have.property('revision');\r", + "// pm.expect(item).to.have.property('namespace');\r", + "// if (moduleList.hasOwnProperty(item.name)) {\r", + "// if (moduleList[item.name].revision < item.revision) {\r", + "// moduleList[item.name] = item;\r", + "// }\r", + "// } else {\r", + "// moduleList[item.name] = item;\r", + "// }\r", + "// });\r", + "\r", + "// });\r", + "\r", + "// pm.test('Verify that the basics YANG modules are supported', function() {\r", + "// pm.expect(moduleList).to.have.property(\"ietf-restconf\");\r", + "// pm.expect(moduleList).to.have.property(\"ietf-yang-library\");\r", + "// pm.expect(moduleList).to.have.property(\"ietf-datastores\");\r", + "// pm.expect(moduleList).to.have.property(\"ietf-inet-types\");\r", + "// pm.expect(moduleList).to.have.property(\"ietf-interfaces\");\r", + "// pm.expect(moduleList).to.have.property(\"ietf-ip\");\r", + "//});" + ], + "type": "text/javascript", + "packages": {} + } + }, + { + "listen": "prerequest", + "script": { + "exec": [ + "// Check PICS requirements\r", + "if ((pm.environment.get('PICS_IUT_PNC') != \"true\") || (pm.environment.get('PICS_RESTCONF') != \"true\") || (pm.environment.get('PICS_SEC_TLS') != \"true\") || (pm.environment.get('PICS_ABSTRACT_BB') != \"true\") || (pm.environment.get('PICS_MW_TOPO') != \"true\")) {\r", + " throw new Error('PICS_IUT_PNC and PICS_RESTCONF and PICS_SEC_TLS and PICS_ABSTRACT_BB and PICS_MW_TOPO are required.');\r", + "}\r", + "" + ], + "type": "text/javascript", + "packages": {} + } + } + ], + "request": { + "auth": { + "type": "basic", + "basic": [ + { + "key": "password", + "value": "{{PX_USER_PASSWD}}", + "type": "string" + }, + { + "key": "username", + "value": "{{PX_USER}}", + "type": "string" + } + ] + }, + "method": "POST", + "header": [ + { + "key": "Accept", + "value": "application/yang-data+json" + } + ], + "url": { + "raw": "{{PX_PROTOCOL}}://{{PX_IUT_IP_ADDRESS}}:{{PX_IUT_IP_PORT}}/{{PX_ROOT_API}}/ietf-eth-tran-service:etht-svc/globals", + "protocol": "{{PX_PROTOCOL}}", + "host": [ + "{{PX_IUT_IP_ADDRESS}}" + ], + "port": "{{PX_IUT_IP_PORT}}", + "path": [ + "{{PX_ROOT_API}}", + "ietf-eth-tran-service:etht-svc", + "globals" + ] + }, + "description": "/restconf/data/ietf-yang-library:modules-state" + }, + "response": [] + } + ], + "description": "Test objective\n\n- \"Verify that the IUT creates a new Bandwidth profile with mandatory mWT GC 024 data elements subset.\"\n \n\nReference\n\n- \"ETSI GS mWT 024 Clause 4.2.2.1 Ethernet Ethernet Services\",\n \n- \"ETSI GS mWT 024 Clause 4.3.3\",\n \n- \"ETSI GS mWT 024 Annex A.2.4\",\n \n- \"RFC 6991 Common YANG Data Types\",\n \n- \"RFC 8776 Common YANG Data Types for Traffic Engineering\",\n \n- \"draft-ietf-ccamp-client-signal-yang-05 A YANG Data Model for Transport Network Client Signals\"\n \n\nPICS Selection IUT_PNC and RESTCONF and SEC_TLS and ABSTRACT_PT and not BWP_SVS_IN_ONE_REQUEST" + }, + { + "name": "TC_mWT_PNC_PT_ETH_SVC_POST_BV_02_01", + "item": [ + { + "name": "TC_mWT_PNC_PT_ETH_SVC_POST_BV_02_01", + "event": [ + { + "listen": "test", + "script": { + "exec": [ + "pm.test(\"Verify that the response status code is 200\", function () {\r", + " pm.response.to.have.status(200);\r", + "});\r", + "\r", + "var responseData = '';\r", + "var topLevelPropertyName = '';\r", + "\r", + "pm.test(\"Verify that headers.Content-Type is 'application/yang-data+json'\", function () {\r", + " pm.expect(pm.response.headers.get('Content-Type')).is.equals('application/yang-data+json');\r", + " responseData = pm.response.json();\r", + " topLevelPropertyName = responseData.hasOwnProperty('modules-state') ? 'modules-state' : 'ietf-yang-library:modules-state';\r", + " console.info(topLevelPropertyName)\r", + "});\r", + "\r", + "// var moduleList = {};\r", + "\r", + "// pm.test(\"Validate the main field is 'ietf-yang-library:modules-state'\", function () {\r", + "// pm.expect(responseData).to.be.an('object');\r", + "// pm.expect(responseData).to.have.property(topLevelPropertyName);\r", + "// });\r", + "\r", + "// pm.test(\"Verify that the 'module' array is present and not empty\", function () {\r", + "// pm.expect(responseData).to.be.an('object');\r", + "// pm.expect(responseData[topLevelPropertyName][\"module\"]).to.be.an('array').with.lengthOf.at.least(1);\r", + "// // Build the module list\r", + "// responseData[topLevelPropertyName].module.forEach(function(item, index) {\r", + "// pm.expect(item).to.have.property('name');\r", + "// pm.expect(item).to.have.property('revision');\r", + "// pm.expect(item).to.have.property('namespace');\r", + "// if (moduleList.hasOwnProperty(item.name)) {\r", + "// if (moduleList[item.name].revision < item.revision) {\r", + "// moduleList[item.name] = item;\r", + "// }\r", + "// } else {\r", + "// moduleList[item.name] = item;\r", + "// }\r", + "// });\r", + "\r", + "// });\r", + "\r", + "// pm.test('Verify that the basics YANG modules are supported', function() {\r", + "// pm.expect(moduleList).to.have.property(\"ietf-restconf\");\r", + "// pm.expect(moduleList).to.have.property(\"ietf-yang-library\");\r", + "// pm.expect(moduleList).to.have.property(\"ietf-datastores\");\r", + "// pm.expect(moduleList).to.have.property(\"ietf-inet-types\");\r", + "// pm.expect(moduleList).to.have.property(\"ietf-interfaces\");\r", + "// pm.expect(moduleList).to.have.property(\"ietf-ip\");\r", + "//});" + ], + "type": "text/javascript", + "packages": {} + } + }, + { + "listen": "prerequest", + "script": { + "exec": [ + "// Check PICS requirements\r", + "if ((pm.environment.get('PICS_IUT_PNC') != \"true\") || (pm.environment.get('PICS_RESTCONF') != \"true\") || (pm.environment.get('PICS_SEC_TLS') != \"true\") || (pm.environment.get('PICS_ABSTRACT_BB') != \"true\") || (pm.environment.get('PICS_MW_TOPO') != \"true\")) {\r", + " throw new Error('PICS_IUT_PNC and PICS_RESTCONF and PICS_SEC_TLS and PICS_ABSTRACT_BB and PICS_MW_TOPO are required.');\r", + "}\r", + "" + ], + "type": "text/javascript", + "packages": {} + } + } + ], + "request": { + "auth": { + "type": "basic", + "basic": [ + { + "key": "password", + "value": "{{PX_USER_PASSWD}}", + "type": "string" + }, + { + "key": "username", + "value": "{{PX_USER}}", + "type": "string" + } + ] + }, + "method": "POST", + "header": [ + { + "key": "Accept", + "value": "application/yang-data+json" + } + ], + "url": { + "raw": "{{PX_PROTOCOL}}://{{PX_IUT_IP_ADDRESS}}:{{PX_IUT_IP_PORT}}/{{PX_ROOT_API}}/ietf-eth-tran-service:etht-svc", + "protocol": "{{PX_PROTOCOL}}", + "host": [ + "{{PX_IUT_IP_ADDRESS}}" + ], + "port": "{{PX_IUT_IP_PORT}}", + "path": [ + "{{PX_ROOT_API}}", + "ietf-eth-tran-service:etht-svc" + ] + }, + "description": "/restconf/data/ietf-yang-library:modules-state" + }, + "response": [] + } + ], + "description": "Test objective\n\n- \"Verify that the IUT creates a new ethernet service with mandatory mWT GC 024 data elements subset.\"\n \n\nReference\n\n- \"ETSI GS mWT 024 Clause 4.2.2.1 Ethernet Ethernet Services\",\n \n- \"ETSI GS mWT 024 Clause 4.3.3\",\n \n- \"ETSI GS mWT 024 Annex A.2.4\",\n \n- \"RFC 6991 Common YANG Data Types\",\n \n- \"RFC 8776 Common YANG Data Types for Traffic Engineering\",\n \n- \"draft-ietf-ccamp-client-signal-yang-05 A YANG Data Model for Transport Network Client Signals\"\n \n\nPICS Selection IUT_PNC and RESTCONF and SEC_TLS and ABSTRACT_PT and not BWP_SVS_IN_ONE_REQUEST" + }, + { + "name": "TC_mWT_PNC_PT_ETH_SVC_POST_BV_02_02", + "item": [ + { + "name": "TC_mWT_PNC_PT_ETH_SVC_POST_BV_02_02", + "event": [ + { + "listen": "test", + "script": { + "exec": [ + "pm.test(\"Verify that the response status code is 200\", function () {\r", + " pm.response.to.have.status(200);\r", + "});\r", + "\r", + "var responseData = '';\r", + "var topLevelPropertyName = '';\r", + "\r", + "pm.test(\"Verify that headers.Content-Type is 'application/yang-data+json'\", function () {\r", + " pm.expect(pm.response.headers.get('Content-Type')).is.equals('application/yang-data+json');\r", + " responseData = pm.response.json();\r", + " topLevelPropertyName = responseData.hasOwnProperty('modules-state') ? 'modules-state' : 'ietf-yang-library:modules-state';\r", + " console.info(topLevelPropertyName)\r", + "});\r", + "\r", + "// var moduleList = {};\r", + "\r", + "// pm.test(\"Validate the main field is 'ietf-yang-library:modules-state'\", function () {\r", + "// pm.expect(responseData).to.be.an('object');\r", + "// pm.expect(responseData).to.have.property(topLevelPropertyName);\r", + "// });\r", + "\r", + "// pm.test(\"Verify that the 'module' array is present and not empty\", function () {\r", + "// pm.expect(responseData).to.be.an('object');\r", + "// pm.expect(responseData[topLevelPropertyName][\"module\"]).to.be.an('array').with.lengthOf.at.least(1);\r", + "// // Build the module list\r", + "// responseData[topLevelPropertyName].module.forEach(function(item, index) {\r", + "// pm.expect(item).to.have.property('name');\r", + "// pm.expect(item).to.have.property('revision');\r", + "// pm.expect(item).to.have.property('namespace');\r", + "// if (moduleList.hasOwnProperty(item.name)) {\r", + "// if (moduleList[item.name].revision < item.revision) {\r", + "// moduleList[item.name] = item;\r", + "// }\r", + "// } else {\r", + "// moduleList[item.name] = item;\r", + "// }\r", + "// });\r", + "\r", + "// });\r", + "\r", + "// pm.test('Verify that the basics YANG modules are supported', function() {\r", + "// pm.expect(moduleList).to.have.property(\"ietf-restconf\");\r", + "// pm.expect(moduleList).to.have.property(\"ietf-yang-library\");\r", + "// pm.expect(moduleList).to.have.property(\"ietf-datastores\");\r", + "// pm.expect(moduleList).to.have.property(\"ietf-inet-types\");\r", + "// pm.expect(moduleList).to.have.property(\"ietf-interfaces\");\r", + "// pm.expect(moduleList).to.have.property(\"ietf-ip\");\r", + "//});" + ], + "type": "text/javascript", + "packages": {} + } + }, + { + "listen": "prerequest", + "script": { + "exec": [ + "// Check PICS requirements\r", + "if ((pm.environment.get('PICS_IUT_PNC') != \"true\") || (pm.environment.get('PICS_RESTCONF') != \"true\") || (pm.environment.get('PICS_SEC_TLS') != \"true\") || (pm.environment.get('PICS_ABSTRACT_BB') != \"true\") || (pm.environment.get('PICS_MW_TOPO') != \"true\")) {\r", + " throw new Error('PICS_IUT_PNC and PICS_RESTCONF and PICS_SEC_TLS and PICS_ABSTRACT_BB and PICS_MW_TOPO are required.');\r", + "}\r", + "" + ], + "type": "text/javascript", + "packages": {} + } + } + ], + "request": { + "auth": { + "type": "basic", + "basic": [ + { + "key": "password", + "value": "{{PX_USER_PASSWD}}", + "type": "string" + }, + { + "key": "username", + "value": "{{PX_USER}}", + "type": "string" + } + ] + }, + "method": "POST", + "header": [ + { + "key": "Accept", + "value": "application/yang-data+json" + } + ], + "url": { + "raw": "{{PX_PROTOCOL}}://{{PX_IUT_IP_ADDRESS}}:{{PX_IUT_IP_PORT}}/{{PX_ROOT_API}}/ietf-eth-tran-service:etht-svc/globals", + "protocol": "{{PX_PROTOCOL}}", + "host": [ + "{{PX_IUT_IP_ADDRESS}}" + ], + "port": "{{PX_IUT_IP_PORT}}", + "path": [ + "{{PX_ROOT_API}}", + "ietf-eth-tran-service:etht-svc", + "globals" + ] + }, + "description": "/restconf/data/ietf-yang-library:modules-state" + }, + "response": [] + } + ], + "description": "Test objective\n\n- \"Verify that the IUT creates successfully a new Bandwidth profile.\"\n \n\nReference\n\n- \"ETSI GS mWT 024 Clause 4.3.3\",\n \n- \"ETSI GS mWT 024 Annex A.2.4\",\n \n- \"RFC 6991 Common YANG Data Types\",\n \n- \"RFC 8776 Common YANG Data Types for Traffic Engineering\",\n \n- \"draft-ietf-ccamp-client-signal-yang-05 A YANG Data Model for Transport Network Client Signals\"\n \n\nPICS Selection IUT_PNC and RESTCONF and SEC_TLS and ABSTRACT_PT and not BWP_SVS_IN_ONE_REQUEST" + }, + { + "name": "TC_mWT_PNC_PT_ETH_SVC_POST_BV_03", + "item": [ + { + "name": "TC_mWT_PNC_PT_ETH_SVC_POST_BV_03", + "event": [ + { + "listen": "test", + "script": { + "exec": [ + "pm.test(\"Verify that the response status code is 200\", function () {\r", + " pm.response.to.have.status(200);\r", + "});\r", + "\r", + "var responseData = '';\r", + "var topLevelPropertyName = '';\r", + "\r", + "pm.test(\"Verify that headers.Content-Type is 'application/yang-data+json'\", function () {\r", + " pm.expect(pm.response.headers.get('Content-Type')).is.equals('application/yang-data+json');\r", + " responseData = pm.response.json();\r", + " topLevelPropertyName = responseData.hasOwnProperty('modules-state') ? 'modules-state' : 'ietf-yang-library:modules-state';\r", + " console.info(topLevelPropertyName)\r", + "});\r", + "\r", + "// var moduleList = {};\r", + "\r", + "// pm.test(\"Validate the main field is 'ietf-yang-library:modules-state'\", function () {\r", + "// pm.expect(responseData).to.be.an('object');\r", + "// pm.expect(responseData).to.have.property(topLevelPropertyName);\r", + "// });\r", + "\r", + "// pm.test(\"Verify that the 'module' array is present and not empty\", function () {\r", + "// pm.expect(responseData).to.be.an('object');\r", + "// pm.expect(responseData[topLevelPropertyName][\"module\"]).to.be.an('array').with.lengthOf.at.least(1);\r", + "// // Build the module list\r", + "// responseData[topLevelPropertyName].module.forEach(function(item, index) {\r", + "// pm.expect(item).to.have.property('name');\r", + "// pm.expect(item).to.have.property('revision');\r", + "// pm.expect(item).to.have.property('namespace');\r", + "// if (moduleList.hasOwnProperty(item.name)) {\r", + "// if (moduleList[item.name].revision < item.revision) {\r", + "// moduleList[item.name] = item;\r", + "// }\r", + "// } else {\r", + "// moduleList[item.name] = item;\r", + "// }\r", + "// });\r", + "\r", + "// });\r", + "\r", + "// pm.test('Verify that the basics YANG modules are supported', function() {\r", + "// pm.expect(moduleList).to.have.property(\"ietf-restconf\");\r", + "// pm.expect(moduleList).to.have.property(\"ietf-yang-library\");\r", + "// pm.expect(moduleList).to.have.property(\"ietf-datastores\");\r", + "// pm.expect(moduleList).to.have.property(\"ietf-inet-types\");\r", + "// pm.expect(moduleList).to.have.property(\"ietf-interfaces\");\r", + "// pm.expect(moduleList).to.have.property(\"ietf-ip\");\r", + "//});" + ], + "type": "text/javascript", + "packages": {} + } + }, + { + "listen": "prerequest", + "script": { + "exec": [ + "// Check PICS requirements\r", + "if ((pm.environment.get('PICS_IUT_PNC') != \"true\") || (pm.environment.get('PICS_RESTCONF') != \"true\") || (pm.environment.get('PICS_SEC_TLS') != \"true\") || (pm.environment.get('PICS_ABSTRACT_BB') != \"true\") || (pm.environment.get('PICS_MW_TOPO') != \"true\")) {\r", + " throw new Error('PICS_IUT_PNC and PICS_RESTCONF and PICS_SEC_TLS and PICS_ABSTRACT_BB and PICS_MW_TOPO are required.');\r", + "}\r", + "" + ], + "type": "text/javascript", + "packages": {} + } + } + ], + "request": { + "auth": { + "type": "basic", + "basic": [ + { + "key": "password", + "value": "{{PX_USER_PASSWD}}", + "type": "string" + }, + { + "key": "username", + "value": "{{PX_USER}}", + "type": "string" + } + ] + }, + "method": "POST", + "header": [ + { + "key": "Accept", + "value": "application/yang-data+json" + } + ], + "url": { + "raw": "{{PX_PROTOCOL}}://{{PX_IUT_IP_ADDRESS}}:{{PX_IUT_IP_PORT}}/{{PX_ROOT_API}}/ietf-eth-tran-service:etht-svc/globals", + "protocol": "{{PX_PROTOCOL}}", + "host": [ + "{{PX_IUT_IP_ADDRESS}}" + ], + "port": "{{PX_IUT_IP_PORT}}", + "path": [ + "{{PX_ROOT_API}}", + "ietf-eth-tran-service:etht-svc", + "globals" + ] + }, + "description": "/restconf/data/ietf-yang-library:modules-state" + }, + "response": [] + } + ], + "description": "Test objective\n\n- \"Verify that the IUT creates a new Bandwidth profile and and a new ethernet service in one POST with mandatory mWT GC 024 data elements subset.\"\n \n\nReference\n\n- \"ETSI GS mWT 024 Clause 4.2.2.1 Ethernet Ethernet Services\",\n \n- \"ETSI GS mWT 024 Clause 4.3.3\",\n \n- \"ETSI GS mWT 024 Annex A.2.4\",\n \n- \"RFC 6991 Common YANG Data Types\",\n \n- \"RFC 8776 Common YANG Data Types for Traffic Engineering\",\n \n- \"draft-ietf-ccamp-client-signal-yang-05 A YANG Data Model for Transport Network Client Signals\"\n \n\nPICS Selection IUT_PNC and RESTCONF and SEC_TLS and ABSTRACT_PT and BWP_SVS_IN_ONE_REQUEST" + }, + { + "name": "TC_mWT_PNC_PT_ETH_SVC_POST_BO_01", + "item": [ + { + "name": "TC_mWT_PNC_PT_ETH_SVC_POST_BO_01", + "event": [ + { + "listen": "test", + "script": { + "exec": [ + "pm.test(\"Verify that the response status code is 200\", function () {\r", + " pm.response.to.have.status(400);\r", + "});" + ], + "type": "text/javascript", + "packages": {} + } + }, + { + "listen": "prerequest", + "script": { + "exec": [ + "// Check PICS requirements\r", + "if ((pm.environment.get('PICS_IUT_PNC') != \"true\") || (pm.environment.get('PICS_RESTCONF') != \"true\") || (pm.environment.get('PICS_SEC_TLS') != \"true\") || (pm.environment.get('PICS_ABSTRACT_BB') != \"true\") || (pm.environment.get('PICS_MW_TOPO') != \"true\")) {\r", + " throw new Error('PICS_IUT_PNC and PICS_RESTCONF and PICS_SEC_TLS and PICS_ABSTRACT_BB and PICS_MW_TOPO are required.');\r", + "}\r", + "" + ], + "type": "text/javascript", + "packages": {} + } + } + ], + "request": { + "auth": { + "type": "basic", + "basic": [ + { + "key": "password", + "value": "{{PX_USER_PASSWD}}", + "type": "string" + }, + { + "key": "username", + "value": "{{PX_USER}}", + "type": "string" + } + ] + }, + "method": "POST", + "header": [ + { + "key": "Accept", + "value": "application/yang-data+json" + } + ], + "url": { + "raw": "{{PX_PROTOCOL}}://{{PX_IUT_IP_ADDRESS}}:{{PX_IUT_IP_PORT}}/{{PX_ROOT_API}}/etht-svc/globals", + "protocol": "{{PX_PROTOCOL}}", + "host": [ + "{{PX_IUT_IP_ADDRESS}}" + ], + "port": "{{PX_IUT_IP_PORT}}", + "path": [ + "{{PX_ROOT_API}}", + "etht-svc", + "globals" + ] + }, + "description": "/restconf/data/ietf-yang-library:modules-state" + }, + "response": [] + } + ], + "description": "Test objective\n\n- \"Verify that the IUT replies with an error when the request is malformed.\"\n \n\nReference\n\n- \"ETSI GS mWT 024 Clause 4.3.3\",\n \n- \"ETSI GS mWT 024 Clause 5.3.2 Exception Handling\",\n \n- \"ETSI GS mWT 024 Annex A.2.4\",\n \n- \"RFC 6991 Common YANG Data Types\",\n \n- \"RFC 8776 Common YANG Data Types for Traffic Engineering\",\n \n- \"draft-ietf-ccamp-client-signal-yang-05 A YANG Data Model for Transport Network Client Signals\"\n \n\nPICS Selection IUT_PNC and RESTCONF and SEC_TLS and ABSTRACT_PT and not BWP_SVS_IN_ONE_REQUEST" + }, + { + "name": "TC_mWT_PNC_PT_ETH_SVC_PUT_BV_01", + "item": [ + { + "name": "TC_mWT_PNC_PT_ETH_SVC_PUT_BV_01", + "event": [ + { + "listen": "test", + "script": { + "exec": [ + "pm.test(\"Verify that the response status code is 200\", function () {\r", + " pm.response.to.have.status(200);\r", + "});\r", + "\r", + "var responseData = '';\r", + "var topLevelPropertyName = '';\r", + "\r", + "pm.test(\"Verify that headers.Content-Type is 'application/yang-data+json'\", function () {\r", + " pm.expect(pm.response.headers.get('Content-Type')).is.equals('application/yang-data+json');\r", + " responseData = pm.response.json();\r", + " topLevelPropertyName = responseData.hasOwnProperty('modules-state') ? 'modules-state' : 'ietf-yang-library:modules-state';\r", + " console.info(topLevelPropertyName)\r", + "});\r", + "\r", + "// var moduleList = {};\r", + "\r", + "// pm.test(\"Validate the main field is 'ietf-yang-library:modules-state'\", function () {\r", + "// pm.expect(responseData).to.be.an('object');\r", + "// pm.expect(responseData).to.have.property(topLevelPropertyName);\r", + "// });\r", + "\r", + "// pm.test(\"Verify that the 'module' array is present and not empty\", function () {\r", + "// pm.expect(responseData).to.be.an('object');\r", + "// pm.expect(responseData[topLevelPropertyName][\"module\"]).to.be.an('array').with.lengthOf.at.least(1);\r", + "// // Build the module list\r", + "// responseData[topLevelPropertyName].module.forEach(function(item, index) {\r", + "// pm.expect(item).to.have.property('name');\r", + "// pm.expect(item).to.have.property('revision');\r", + "// pm.expect(item).to.have.property('namespace');\r", + "// if (moduleList.hasOwnProperty(item.name)) {\r", + "// if (moduleList[item.name].revision < item.revision) {\r", + "// moduleList[item.name] = item;\r", + "// }\r", + "// } else {\r", + "// moduleList[item.name] = item;\r", + "// }\r", + "// });\r", + "\r", + "// });\r", + "\r", + "// pm.test('Verify that the basics YANG modules are supported', function() {\r", + "// pm.expect(moduleList).to.have.property(\"ietf-restconf\");\r", + "// pm.expect(moduleList).to.have.property(\"ietf-yang-library\");\r", + "// pm.expect(moduleList).to.have.property(\"ietf-datastores\");\r", + "// pm.expect(moduleList).to.have.property(\"ietf-inet-types\");\r", + "// pm.expect(moduleList).to.have.property(\"ietf-interfaces\");\r", + "// pm.expect(moduleList).to.have.property(\"ietf-ip\");\r", + "//});" + ], + "type": "text/javascript", + "packages": {} + } + }, + { + "listen": "prerequest", + "script": { + "exec": [ + "// Check PICS requirements\r", + "if ((pm.environment.get('PICS_IUT_PNC') != \"true\") || (pm.environment.get('PICS_RESTCONF') != \"true\") || (pm.environment.get('PICS_SEC_TLS') != \"true\") || (pm.environment.get('PICS_ABSTRACT_BB') != \"true\") || (pm.environment.get('PICS_MW_TOPO') != \"true\")) {\r", + " throw new Error('PICS_IUT_PNC and PICS_RESTCONF and PICS_SEC_TLS and PICS_ABSTRACT_BB and PICS_MW_TOPO are required.');\r", + "}\r", + "" + ], + "type": "text/javascript", + "packages": {} + } + } + ], + "request": { + "auth": { + "type": "basic", + "basic": [ + { + "key": "password", + "value": "{{PX_USER_PASSWD}}", + "type": "string" + }, + { + "key": "username", + "value": "{{PX_USER}}", + "type": "string" + } + ] + }, + "method": "PUT", + "header": [ + { + "key": "Accept", + "value": "application/yang-data+json" + } + ], + "url": { + "raw": "{{PX_PROTOCOL}}://{{PX_IUT_IP_ADDRESS}}:{{PX_IUT_IP_PORT}}/{{PX_ROOT_API}}/ietf-eth-tran-service:etht-svc/globals", + "protocol": "{{PX_PROTOCOL}}", + "host": [ + "{{PX_IUT_IP_ADDRESS}}" + ], + "port": "{{PX_IUT_IP_PORT}}", + "path": [ + "{{PX_ROOT_API}}", + "ietf-eth-tran-service:etht-svc", + "globals" + ] + }, + "description": "/restconf/data/ietf-yang-library:modules-state" + }, + "response": [] + } + ], + "description": "Test objective\n\n- \"Verify that the IUT updates an existing Bandwidth profile with mandatory mWT GC 024 data elements subset.\"\n \n\nReference\n\n- \"ETSI GS mWT 024 Clause 4.2.2.1 Ethernet Ethernet Services\",\n \n- \"ETSI GS mWT 024 Clause 4.3.3\",\n \n- \"ETSI GS mWT 024 Annex A.2.4\",\n \n- \"RFC 6991 Common YANG Data Types\",\n \n- \"RFC 8776 Common YANG Data Types for Traffic Engineering\",\n \n- \"draft-ietf-ccamp-client-signal-yang-05 A YANG Data Model for Transport Network Client Signals\"\n \n\nPICS Selection IUT_PNC and RESTCONF and SEC_TLS and ABSTRACT_PT" + }, { - "name": "TC_mWT_PNC_MW_TOPO_GET_BV_01", + "name": "TC_mWT_PNC_PT_ETH_SVC_PUT_BV_02", "item": [ { - "name": "TC_mWT_PNC_MW_TOPO_GET_BV_01", + "name": "TC_mWT_PNC_PT_ETH_SVC_PUT_BV_02", "event": [ { "listen": "test", @@ -573,26 +3291,25 @@ "basic": [ { "key": "password", - "value": "Services4Ever", + "value": "{{PX_USER_PASSWD}}", "type": "string" }, { "key": "username", - "value": "developer", + "value": "{{PX_USER}}", "type": "string" } ] }, - "method": "GET", + "method": "PUT", "header": [ { "key": "Accept", - "value": "application/yang-data+json", - "type": "text" + "value": "application/yang-data+json" } ], "url": { - "raw": "{{PX_PROTOCOL}}://{{PX_IUT_IP_ADDRESS}}:{{PX_IUT_IP_PORT}}/{{PX_ROOT_API}}/ietf-network:networks/network", + "raw": "{{PX_PROTOCOL}}://{{PX_IUT_IP_ADDRESS}}:{{PX_IUT_IP_PORT}}/{{PX_ROOT_API}}/ietf-eth-tran-service:etht-svc/globals", "protocol": "{{PX_PROTOCOL}}", "host": [ "{{PX_IUT_IP_ADDRESS}}" @@ -600,16 +3317,22 @@ "port": "{{PX_IUT_IP_PORT}}", "path": [ "{{PX_ROOT_API}}", - "ietf-network:networks", - "network" + "ietf-eth-tran-service:etht-svc", + "globals" ] }, "description": "/restconf/data/ietf-yang-library:modules-state" }, "response": [] - }, + } + ], + "description": "Test objective\n\n- \"Verify that the IUT updates an existing ethernet service.\"\n \n\nReference\n\n- \"ETSI GS mWT 024 Clause 4.2.2.1 Ethernet Ethernet Services\",\n \n- \"ETSI GS mWT 024 Clause 4.3.3\",\n \n- \"ETSI GS mWT 024 Annex A.2.4\",\n \n- \"RFC 6991 Common YANG Data Types\",\n \n- \"RFC 8776 Common YANG Data Types for Traffic Engineering\",\n \n- \"draft-ietf-ccamp-client-signal-yang-05 A YANG Data Model for Transport Network Client Signals\"\n \n\nPICS Selection IUT_PNC and RESTCONF and SEC_TLS and ABSTRACT_PT" + }, + { + "name": "TC_mWT_PNC_PT_ETH_SVC_PUT_BO_01", + "item": [ { - "name": "TC_mWT_PNC_MW_TOPO_GET_BV_02", + "name": "TC_mWT_PNC_PT_ETH_SVC_PUT_BO_01", "event": [ { "listen": "test", @@ -689,26 +3412,25 @@ "basic": [ { "key": "password", - "value": "Services4Ever", + "value": "{{PX_USER_PASSWD}}", "type": "string" }, { "key": "username", - "value": "developer", + "value": "{{PX_USER}}", "type": "string" } ] }, - "method": "GET", + "method": "PUT", "header": [ { "key": "Accept", - "value": "application/yang-data+json", - "type": "text" + "value": "application/yang-data+json" } ], "url": { - "raw": "{{PX_PROTOCOL}}://{{PX_IUT_IP_ADDRESS}}:{{PX_IUT_IP_PORT}}/{{PX_ROOT_API}}/ietf-network:networks/network", + "raw": "{{PX_PROTOCOL}}://{{PX_IUT_IP_ADDRESS}}:{{PX_IUT_IP_PORT}}/{{PX_ROOT_API}}/ietf-eth-tran-service:etht-svc/globals", "protocol": "{{PX_PROTOCOL}}", "host": [ "{{PX_IUT_IP_ADDRESS}}" @@ -716,23 +3438,29 @@ "port": "{{PX_IUT_IP_PORT}}", "path": [ "{{PX_ROOT_API}}", - "ietf-network:networks", - "network" + "ietf-eth-tran-service:etht-svc", + "globals" ] }, "description": "/restconf/data/ietf-yang-library:modules-state" }, "response": [] - }, + } + ], + "description": "Test objective\n\n- \"Verify that the IUT replies with an error code when updating an unknown Bandwidth profile with mandatory mWT GC 024 data elements subset.\"\n \n\nReference\n\n- \"ETSI GS mWT 024 Clause 5.3.2 Exception Handling\",\n \n- \"ETSI GS mWT 024 Clause 4.3.3\",\n \n- \"ETSI GS mWT 024 Annex A.2.4\",\n \n- \"RFC 6991 Common YANG Data Types\",\n \n- \"RFC 8776 Common YANG Data Types for Traffic Engineering\",\n \n- \"draft-ietf-ccamp-client-signal-yang-05 A YANG Data Model for Transport Network Client Signals\"EndFragment\n \n\nPICS Selection IUT_PNC and RESTCONF and SEC_TLS and ABSTRACT_PT" + }, + { + "name": "TC_mWT_PNC_PT_ETH_SVC_DELETE_BV_01", + "item": [ { - "name": "TC_mWT_PNC_MW_TOPO_GET_BO_01", + "name": "TC_mWT_PNC_PT_ETH_SVC_DELETE_BV_01", "event": [ { "listen": "test", "script": { "exec": [ "pm.test(\"Verify that the response status code is 200\", function () {\r", - " pm.response.to.have.status(400);\r", + " pm.response.to.have.status(200);\r", "});\r", "\r", "var responseData = '';\r", @@ -805,26 +3533,25 @@ "basic": [ { "key": "password", - "value": "Services4Ever", + "value": "{{PX_USER_PASSWD}}", "type": "string" }, { "key": "username", - "value": "developer", + "value": "{{PX_USER}}", "type": "string" } ] }, - "method": "GET", + "method": "DELETE", "header": [ { "key": "Accept", - "value": "application/yang-data+json", - "type": "text" + "value": "application/yang-data+json" } ], "url": { - "raw": "{{PX_PROTOCOL}}://{{PX_IUT_IP_ADDRESS}}:{{PX_IUT_IP_PORT}}/{{PX_ROOT_API}}/networks", + "raw": "{{PX_PROTOCOL}}://{{PX_IUT_IP_ADDRESS}}:{{PX_IUT_IP_PORT}}/{{PX_ROOT_API}}/ietf-eth-tran-service:etht-svc/etht-svc-instances={PX_ETHT_SVC_NAME}", "protocol": "{{PX_PROTOCOL}}", "host": [ "{{PX_IUT_IP_ADDRESS}}" @@ -832,7 +3559,8 @@ "port": "{{PX_IUT_IP_PORT}}", "path": [ "{{PX_ROOT_API}}", - "networks" + "ietf-eth-tran-service:etht-svc", + "etht-svc-instances={PX_ETHT_SVC_NAME}" ] }, "description": "/restconf/data/ietf-yang-library:modules-state" @@ -840,20 +3568,20 @@ "response": [] } ], - "description": "Test objective\n\n\"Verify that the IUT provides the MW network topology for all networks with mandatory mWT GC 024 data elements subset - black box abstraction level.\"\n\nReference\n\n- \"ETSI GS mWT 024 Annex A.1.2\",\n- \"RFC 8345 A YANG Data Model for Network Topologies\",\n- \"RFC 8795 YANG Data Model for Traffic Engineering (TE) Topologies\",\n \n- \"draft-ietf-ccamp-mw-topo-yang-02 A YANG Data Model for Microwave Topology\"\n \n\nPICS Selection PICS_IUT_PNC and PICS_RESTCONF and PICS_SEC_TLS and PICS_ABSTRACT_BB and PICS_MW_TOPO" + "description": "Test objective\n\n- \"Verify that the IUT deletes an existing ethernet service.\"\n \n\nReference\n\n- \"ETSI GS mWT 024 Clause 4.2.2.1 Ethernet Ethernet Services\",\n \n- \"ETSI GS mWT 024 Clause 4.3.3\",\n \n- \"ETSI GS mWT 024 Annex A.2.4\",\n \n- \"RFC 6991 Common YANG Data Types\",\n \n- \"RFC 8776 Common YANG Data Types for Traffic Engineering\",\n \n- \"draft-ietf-ccamp-client-signal-yang-05 A YANG Data Model for Transport Network Client Signals\"EndFragment\n \n\nPICS Selection IUT_PNC and RESTCONF and SEC_TLS and ABSTRACT_PT and not BWP_SVS_IN_ONE_REQUEST" }, { - "name": "TC_mWT_PNC_MW_TOPO_GET_BO_02", + "name": "TC_mWT_PNC_PT_ETH_SVC_DELETE_BV_02", "item": [ { - "name": "TC_mWT_PNC_MW_TOPO_GET_BO_02", + "name": "TC_mWT_PNC_PT_ETH_SVC_DELETE_BV_02", "event": [ { "listen": "test", "script": { "exec": [ "pm.test(\"Verify that the response status code is 200\", function () {\r", - " pm.response.to.have.status(404);\r", + " pm.response.to.have.status(200);\r", "});\r", "\r", "var responseData = '';\r", @@ -865,11 +3593,122 @@ " topLevelPropertyName = responseData.hasOwnProperty('modules-state') ? 'modules-state' : 'ietf-yang-library:modules-state';\r", " console.info(topLevelPropertyName)\r", "});\r", + "\r", + "// var moduleList = {};\r", + "\r", + "// pm.test(\"Validate the main field is 'ietf-yang-library:modules-state'\", function () {\r", + "// pm.expect(responseData).to.be.an('object');\r", + "// pm.expect(responseData).to.have.property(topLevelPropertyName);\r", + "// });\r", + "\r", + "// pm.test(\"Verify that the 'module' array is present and not empty\", function () {\r", + "// pm.expect(responseData).to.be.an('object');\r", + "// pm.expect(responseData[topLevelPropertyName][\"module\"]).to.be.an('array').with.lengthOf.at.least(1);\r", + "// // Build the module list\r", + "// responseData[topLevelPropertyName].module.forEach(function(item, index) {\r", + "// pm.expect(item).to.have.property('name');\r", + "// pm.expect(item).to.have.property('revision');\r", + "// pm.expect(item).to.have.property('namespace');\r", + "// if (moduleList.hasOwnProperty(item.name)) {\r", + "// if (moduleList[item.name].revision < item.revision) {\r", + "// moduleList[item.name] = item;\r", + "// }\r", + "// } else {\r", + "// moduleList[item.name] = item;\r", + "// }\r", + "// });\r", + "\r", + "// });\r", + "\r", + "// pm.test('Verify that the basics YANG modules are supported', function() {\r", + "// pm.expect(moduleList).to.have.property(\"ietf-restconf\");\r", + "// pm.expect(moduleList).to.have.property(\"ietf-yang-library\");\r", + "// pm.expect(moduleList).to.have.property(\"ietf-datastores\");\r", + "// pm.expect(moduleList).to.have.property(\"ietf-inet-types\");\r", + "// pm.expect(moduleList).to.have.property(\"ietf-interfaces\");\r", + "// pm.expect(moduleList).to.have.property(\"ietf-ip\");\r", + "//});" + ], + "type": "text/javascript", + "packages": {} + } + }, + { + "listen": "prerequest", + "script": { + "exec": [ + "// Check PICS requirements\r", + "if ((pm.environment.get('PICS_IUT_PNC') != \"true\") || (pm.environment.get('PICS_RESTCONF') != \"true\") || (pm.environment.get('PICS_SEC_TLS') != \"true\") || (pm.environment.get('PICS_ABSTRACT_BB') != \"true\") || (pm.environment.get('PICS_MW_TOPO') != \"true\")) {\r", + " throw new Error('PICS_IUT_PNC and PICS_RESTCONF and PICS_SEC_TLS and PICS_ABSTRACT_BB and PICS_MW_TOPO are required.');\r", + "}\r", "" ], "type": "text/javascript", "packages": {} } + } + ], + "request": { + "auth": { + "type": "basic", + "basic": [ + { + "key": "password", + "value": "{{PX_USER_PASSWD}}", + "type": "string" + }, + { + "key": "username", + "value": "{{PX_USER}}", + "type": "string" + } + ] + }, + "method": "DELETE", + "header": [ + { + "key": "Accept", + "value": "application/yang-data+json" + } + ], + "url": { + "raw": "{{PX_PROTOCOL}}://{{PX_IUT_IP_ADDRESS}}:{{PX_IUT_IP_PORT}}/{{PX_ROOT_API}}/ietf-eth-tran-service:etht-svc/globals/bandwitdh_profile_name={PX_BANDWIDTH_PROFILE_NAME}", + "protocol": "{{PX_PROTOCOL}}", + "host": [ + "{{PX_IUT_IP_ADDRESS}}" + ], + "port": "{{PX_IUT_IP_PORT}}", + "path": [ + "{{PX_ROOT_API}}", + "ietf-eth-tran-service:etht-svc", + "globals", + "bandwitdh_profile_name={PX_BANDWIDTH_PROFILE_NAME}" + ] + }, + "description": "/restconf/data/ietf-yang-library:modules-state" + }, + "response": [] + } + ], + "description": "Test objective\n\n- \"Verify that the IUT deletes an existing bandwidth profile.\"\n \n\nReference\n\n- \"ETSI GS mWT 024 Clause 4.2.2.1 Ethernet Ethernet Services\",\n \n- \"ETSI GS mWT 024 Clause 4.3.3\",\n \n- \"ETSI GS mWT 024 Annex A.2.4\",\n \n- \"RFC 6991 Common YANG Data Types\",\n \n- \"RFC 8776 Common YANG Data Types for Traffic Engineering\",\n \n- \"draft-ietf-ccamp-client-signal-yang-05 A YANG Data Model for Transport Network Client Signals\"EndFragment\n \n\nPICS Selection IUT_PNC and RESTCONF and SEC_TLS and ABSTRACT_PT and not BWP_SVS_IN_ONE_REQUEST" + }, + { + "name": "TC_mWT_PNC_PT_ETH_SVC_DELETE_BO_01", + "item": [ + { + "name": "TC_mWT_PNC_PT_ETH_SVC_DELETE_BO_01", + "event": [ + { + "listen": "test", + "script": { + "exec": [ + "pm.test(\"Verify that the response status code is 200\", function () {\r", + " pm.response.to.have.status(400);\r", + "});" + ], + "type": "text/javascript", + "packages": {} + } }, { "listen": "prerequest", @@ -892,26 +3731,25 @@ "basic": [ { "key": "password", - "value": "Services4Ever", + "value": "{{PX_USER_PASSWD}}", "type": "string" }, { "key": "username", - "value": "developer", + "value": "{{PX_USER}}", "type": "string" } ] }, - "method": "GET", + "method": "DELETE", "header": [ { "key": "Accept", - "value": "application/yang-data+json", - "type": "text" + "value": "application/yang-data+json" } ], "url": { - "raw": "{{PX_PROTOCOL}}://{{PX_IUT_IP_ADDRESS}}:{{PX_IUT_IP_PORT}}/{{PX_ROOT_API}}/ietf-network:networks/network", + "raw": "{{PX_PROTOCOL}}://{{PX_IUT_IP_ADDRESS}}:{{PX_IUT_IP_PORT}}/{{PX_ROOT_API}}/ietf-eth-tran-service:etht-svc/nstances={PX_ETHT_SVC_NAME}", "protocol": "{{PX_PROTOCOL}}", "host": [ "{{PX_IUT_IP_ADDRESS}}" @@ -919,8 +3757,8 @@ "port": "{{PX_IUT_IP_PORT}}", "path": [ "{{PX_ROOT_API}}", - "ietf-network:networks", - "network" + "ietf-eth-tran-service:etht-svc", + "nstances={PX_ETHT_SVC_NAME}" ] }, "description": "/restconf/data/ietf-yang-library:modules-state" @@ -928,21 +3766,88 @@ "response": [] } ], - "description": "Test objective\n\n\"Verify that the IUT replies with an error code when the network identifier is unknown - black box abstraction level.\"\n\nReference\n\n- \"ETSI GS mWT 024 Clause 5.3.2 Exception Handling\",\n- \"ETSI GS mWT 024 Annex A.1.2\",\n- \"RFC 8345 A YANG Data Model for Network Topologies\",\n- \"RFC 8795 YANG Data Model for Traffic Engineering (TE) Topologies\"\n \n\nPICS Selection IUT_MDSC and ABSTRACT_BB and MW_TOPO" + "description": "Test objective\n\n- \"Verify that the IUT replies with an error code when the request is malformed.\"\n \n\nReference\n\n- \"ETSI GS mWT 024 Clause 4.3.3\",\n \n- \"ETSI GS mWT 024 Clause 5.3.2 Exception Handling\",\n \n- \"ETSI GS mWT 024 Annex A.2.4\",\n \n- \"RFC 6991 Common YANG Data Types\",\n \n- \"RFC 8776 Common YANG Data Types for Traffic Engineering\",\n \n- \"draft-ietf-ccamp-client-signal-yang-05 A YANG Data Model for Transport Network Client Signals\"EndFragment\n \n\nPICS Selection IUT_PNC and RESTCONF and SEC_TLS and ABSTRACT_PT and not BWP_SVS_IN_ONE_REQUEST" + }, + { + "name": "TC_mWT_PNC_PT_ETH_SVC_DELETE_BO_02", + "item": [ + { + "name": "TC_mWT_PNC_PT_ETH_SVC_DELETE_BO_02", + "event": [ + { + "listen": "test", + "script": { + "exec": [ + "pm.test(\"Verify that the response status code is 200\", function () {\r", + " pm.response.to.have.status(404);\r", + "});" + ], + "type": "text/javascript", + "packages": {} + } + }, + { + "listen": "prerequest", + "script": { + "exec": [ + "// Check PICS requirements\r", + "if ((pm.environment.get('PICS_IUT_PNC') != \"true\") || (pm.environment.get('PICS_RESTCONF') != \"true\") || (pm.environment.get('PICS_SEC_TLS') != \"true\") || (pm.environment.get('PICS_ABSTRACT_BB') != \"true\") || (pm.environment.get('PICS_MW_TOPO') != \"true\")) {\r", + " throw new Error('PICS_IUT_PNC and PICS_RESTCONF and PICS_SEC_TLS and PICS_ABSTRACT_BB and PICS_MW_TOPO are required.');\r", + "}\r", + "" + ], + "type": "text/javascript", + "packages": {} + } + } + ], + "request": { + "auth": { + "type": "basic", + "basic": [ + { + "key": "password", + "value": "{{PX_USER_PASSWD}}", + "type": "string" + }, + { + "key": "username", + "value": "{{PX_USER}}", + "type": "string" + } + ] + }, + "method": "DELETE", + "header": [ + { + "key": "Accept", + "value": "application/yang-data+json" + } + ], + "url": { + "raw": "{{PX_PROTOCOL}}://{{PX_IUT_IP_ADDRESS}}:{{PX_IUT_IP_PORT}}/{{PX_ROOT_API}}/ietf-eth-tran-service:etht-svc/etht-svc-instances={PX_UNKNOWN_ETHT_SVC_NAME}", + "protocol": "{{PX_PROTOCOL}}", + "host": [ + "{{PX_IUT_IP_ADDRESS}}" + ], + "port": "{{PX_IUT_IP_PORT}}", + "path": [ + "{{PX_ROOT_API}}", + "ietf-eth-tran-service:etht-svc", + "etht-svc-instances={PX_UNKNOWN_ETHT_SVC_NAME}" + ] + }, + "description": "/restconf/data/ietf-yang-library:modules-state" + }, + "response": [] + } + ], + "description": "Test objective\n\n- \"Verify that the IUT replies with an error code when it is requested to delete an unknown Bandwidth profile.\"\n \n\nReference\n\n- \"ETSI GS mWT 024 Clause 4.3.3\",\n \n- \"ETSI GS mWT 024 Clause 5.3.2 Exception Handling\",\n \n- \"ETSI GS mWT 024 Annex A.2.4\",\n \n- \"RFC 6991 Common YANG Data Types\",\n \n- \"RFC 8776 Common YANG Data Types for Traffic Engineering\",\n \n- \"draft-ietf-ccamp-client-signal-yang-05 A YANG Data Model for Transport Network Client Signals\"EndFragment\n \n\nPICS Selection IUT_PNC and RESTCONF and SEC_TLS and ABSTRACT_PT and not BWP_SVS_IN_ONE_REQUEST" } ] - }, - { - "name": "ETHTopology", - "item": [] } ], "description": "This group provides test case for PartiallyTransparent abstraction level.\n\nReference\n\n- \"4.3.3 AL2: Abstraction Level 2 - \"Partially Transparent\"\"" - }, - { - "name": "Blackbox", - "item": [], - "description": "This group provides test case for Black-box abstraction level.\n\nReference\n\n- \"4.3.2 AL1: Abstraction Level 1 - \"Black-box\"\"" } ] } \ No newline at end of file diff --git a/postman/TTF_T029.postman_environment.json b/postman/TTF_T029.postman_environment.json new file mode 100644 index 0000000..60c5eb0 --- /dev/null +++ b/postman/TTF_T029.postman_environment.json @@ -0,0 +1,153 @@ +{ + "id": "254f0cf6-86f9-4e52-9d62-fc5f5d73708e", + "name": "TTF_T029", + "values": [ + { + "key": "PX_IUT_IP_ADDRESS", + "value": "127.0.01", + "type": "default", + "enabled": true + }, + { + "key": "PX_PROTOCOL", + "value": "https", + "type": "default", + "enabled": true + }, + { + "key": "PX_IUT_IP_PORT", + "value": "443", + "type": "default", + "enabled": true + }, + { + "key": "PX_ROOT_API", + "value": "restconf/data", + "type": "default", + "enabled": true + }, + { + "key": "PX_USER", + "value": "user", + "type": "default", + "enabled": true + }, + { + "key": "PX_USER_PASSWD", + "value": "passwd", + "type": "default", + "enabled": true + }, + { + "key": "PX_ACCESS_TOKEN", + "value": "token", + "type": "default", + "enabled": true + }, + { + "key": "PX_IETF_YANG_LIBRARY_VERSION", + "value": "2019-01-04", + "type": "default", + "enabled": true + }, + { + "key": "PX_IETF_YANG_LIBRARY_NAMESPACE", + "value": "urn:ietf:params:xml:ns:yang:ietf-yang-library", + "type": "default", + "enabled": true + }, + { + "key": "PX_IETF_RESTCONF_VERSION", + "value": "2016-08-15", + "type": "default", + "enabled": true + }, + { + "key": "PX_IETF_RESTCONF_NAMESPACE", + "value": "urn:ietf:params:xml:ns:yang:ietf-restconf", + "type": "default", + "enabled": true + }, + { + "key": "PICS_IUT_PNC", + "value": "true", + "type": "default", + "enabled": true + }, + { + "key": "PICS_RESTCONF", + "value": "true", + "type": "default", + "enabled": true + }, + { + "key": "PICS_SEC_TLS", + "value": "true", + "type": "default", + "enabled": true + }, + { + "key": "PICS_ABSTRACT_BB", + "value": "true", + "type": "default", + "enabled": true + }, + { + "key": "PICS_MW_TOPO", + "value": "true", + "type": "default", + "enabled": true + }, + { + "key": "PX_NETWORK_ID", + "value": "network1", + "type": "default", + "enabled": true + }, + { + "key": "PX_UNKNOWN_NETWORK_ID", + "value": "johndoe", + "type": "default", + "enabled": true + }, + { + "key": "PX_NODE_ID", + "value": "node1", + "type": "default", + "enabled": true + }, + { + "key": "PX_UNKNOWN_NODE_ID", + "value": "johndoe", + "type": "default", + "enabled": true + }, + { + "key": "PX_ETHT_SVC_NAME", + "value": "svc_name", + "type": "default", + "enabled": true + }, + { + "key": "PX_UNKNOWN_ETHT_SVC_NAME", + "value": "johndoe", + "type": "default", + "enabled": true + }, + { + "key": "PX_BANDWIDTH_PROFILE_NAME", + "value": "bandwidth1", + "type": "default", + "enabled": true + }, + { + "key": "PX_UNKNOWN_BANDWIDTH_PROFILE_NAME", + "value": "johndoe", + "type": "default", + "enabled": true + } + ], + "_postman_variable_scope": "environment", + "_postman_exported_at": "2024-06-21T08:09:51.143Z", + "_postman_exported_using": "Postman/11.2.12" +} \ No newline at end of file diff --git a/test-purposes/AtsMDSC.tplan2 b/test-purposes/AtsMDSC.tplan2 index 62f53e1..50a9a1b 100644 --- a/test-purposes/AtsMDSC.tplan2 +++ b/test-purposes/AtsMDSC.tplan2 @@ -33,15 +33,15 @@ Package AtsMDSC { ensure that { when { the IUT entity receives a vRequestGet containing - uri indicating value "/restconf/data/ietf-yang-library:modules-state"; + uri indicating value "/restconf/data/ietf-yang-library:module-set"; from the TEST_SYSTEM entity } then { the IUT entity sends a r200 containing headers containing content_type indicating value "application/yang-data+xml";, body containing - modules_state containing - name_ indicating value "ietf-yang-library:modules-state", + module_setate containing + name_ indicating value "ietf-yang-library:module-set", modules containing non empty list;;;; to the TEST_SYSTEM entity @@ -73,64 +73,47 @@ Package AtsMDSC { ensure that { when { the IUT entity receives a vRequestGet containing - uri indicating value "/restconf/data/ietf-yang-library:modules-state"; + uri indicating value "/restconf/data/ietf-yang-library:module-set"; from the TEST_SYSTEM entity } then { the IUT entity sends a r200 containing headers containing content_type indicating value "application/yang-data+xml";, body containing - modules_state containing - name_ indicating value "ietf-yang-library:modules-state", + module_setles_state containing + name_ indicating value "ietf-yang-library:module-set", modules containing entry containing name_ indicating value "ietf-datastores", revision indicating value "2018-02-14", - schema indicating value "https://localhost:443/restconf/data/modules/ietf-datastores/2018-02-14", - namespace indicating value "urn:ietf:params:xml:ns:yang:ietf-datastores", - conformance_type indicating value "import";, + namespace indicating value "urn:ietf:params:xml:ns:yang:ietf-datastores";, entry containing name_ indicating value "ietf-inet-types", revision indicating value "2013-07-15", - schema indicating value "https://localhost:443/restconf/data/modules/ietf-inet-types/2013-07-15", - namespace indicating value "urn:ietf:params:xml:ns:yang:ietf-inet-types", - conformance_type indicating value "import";, + namespace indicating value "urn:ietf:params:xml:ns:yang:ietf-inet-types";, entry containing name_ indicating value "ietf-interfaces", revision indicating value "2018-02-20", - schema indicating value "https://localhost:443/restconf/data/modules/ietf-interfaces/2018-02-20", - namespace indicating value "urn:ietf:params:xml:ns:yang:ietf-interfaces", - conformance_type indicating value "import", + namespace indicating value "urn:ietf:params:xml:ns:yang:ietf-interfaces";, entry containing name_ indicating value "ietf-ip", revision indicating value "2018-02-22", - schema indicating value "https://localhost:443/restconf/data/modules/ietf-ip/2018-02-22", - namespace indicating value "urn:ietf:params:xml:ns:yang:ietf-ip", - conformance_type indicating value "import";, + namespace indicating value "urn:ietf:params:xml:ns:yang:ietf-ip";, entry containing name_ indicating value "ietf-network-instance", revision indicating value "2019-01-21", - schema indicating value "https://localhost:443/restconf/data/modules/ietf-network-instance/2019-01-21", - namespace indicating value "urn:ietf:params:xml:ns:yang:ietf-network-instance", - conformance_type indicating value "import";, + namespace indicating value "urn:ietf:params:xml:ns:yang:ietf-network-instance";, entry containing name_ indicating value "ietf-restconf", - revision indicating value "2017-01-26", - schema indicating value "https://localhost:443/restconf/data/modules/ietf-restconf/2017-01-26", - namespace indicating value "urn:ietf:params:xml:ns:yang:ietf-restconf", - conformance_type indicating value "implement";, + namespace indicating value "urn:ietf:params:xml:ns:yang:ietf-restconf";, entry containing name_ indicating value "ietf-yang-types", revision indicating value "2013-07-15", - schema indicating value "https://localhost:443/restconf/data/modules/ietf-restconf/2017-01-26", - namespace indicating value "urn:ietf:params:xml:ns:yang:ietf-restconf", - conformance_type indicating value "import";, + namespace indicating value "urn:ietf:params:xml:ns:yang:ietf-restconf";, entry containing name_ indicating value "ietf-yang-library", revision indicating value "2019-01-04", - schema indicating value "https://localhost:443/restconf/data/modules/ietf-yang-types/2013-07-15", - namespace indicating value "urn:ietf:params:xml:ns:yang:ietf-yang-types", - conformance_type indicating value "implement";;;;;; + namespace indicating value "urn:ietf:params:xml:ns:yang:ietf-yang-library";;;;; to the TEST_SYSTEM entity } } @@ -159,31 +142,26 @@ Package AtsMDSC { ensure that { when { the IUT entity receives a vRequestGet containing - uri indicating value "/restconf/data/ietf-yang-library:modules-state"; + uri indicating value "/restconf/data/ietf-yang-library:module-set"; from the TEST_SYSTEM entity } then { the IUT entity sends a r200 containing body containing - modules_state containing + module_set modules_state containing modules containing entry containing name_ indicating value "ietf-microwave-topology", revision indicating value "2021-10-12", schema indicating value "draft-ietf-ccamp-mw-topo-yang-02", - namespace indicating value "", - conformance_type indicating value "implement";, + namespace indicating value "";, entry containing name_ indicating value "ietf-eth-te-topology", revision indicating value "2019-11-18", - schema indicating value "draft-ietf-ccamp-eth-client-te-topo-yang-01", - namespace indicating value "", - conformance_type indicating value "implement";, + namespace indicating value "";, entry containing name_ indicating value "idraft-ietf-ccamp-client-signal-yang-06", revision indicating value "", - schema indicating value "draft-ietf-ccamp-client-signal-yang-06", - namespace indicating value "", - conformance_type indicating value "";;;;; + namespace indicating value "";;;;; to the TEST_SYSTEM entity } } @@ -244,7 +222,7 @@ Package AtsMDSC { } Test Purpose { - TP Id TP_mWT_PNC_BB_MW_TOPO_GET_BV_01 + TP Id TP_mWT_PNC_BB_MW_TOPO_GET_BV_02 Test objective "Verify that the IUT provides a network list containing only one node." @@ -610,7 +588,7 @@ Package AtsMDSC { import all from mWT_Common; Test Purpose { - TP Id TP_mWT_PNC_PT_ETH_TOPO_GET_BV_01 + TP Id TP_mWT_PNC_PT_ETH_TOPO_NETWORK_GET_BV_01 Test objective "Verify that the IUT provides the Ethernet network topology for all networks with mandatory mWT GC 024 data elements subset." @@ -664,7 +642,7 @@ Package AtsMDSC { } Test Purpose { - TP Id TP_mWT_PNC_PT_ETH_TOPO_GET_BV_02 + TP Id TP_mWT_PNC_PT_ETH_TOPO_NETWORK_GET_BV_02 Test objective "Verify that the IUT provides the Ethernet network topology for a specific network with mandatory mWT GC 024 data elements subset." @@ -688,7 +666,7 @@ Package AtsMDSC { ensure that { when { the IUT entity receives a vRequestGet containing - uri indicating value "/restconf/data/ietf-network:networks/network={NETWORK_ID)", + uri indicating value "/restconf/data/ietf-network:networks/network={NETWORK_ID}", headers containing content_type indicating value "application/yang-data+xml";; from the TEST_SYSTEM entity @@ -711,7 +689,7 @@ Package AtsMDSC { } Test Purpose { - TP Id TP_mWT_PNC_PT_ETH_TOPO_GET_BO_01 + TP Id TP_mWT_PNC_PT_ETH_TOPO_NETWORK_GET_BO_01 Test objective "Verify that the IUT replies with an error code when the request is malformed." @@ -736,7 +714,7 @@ Package AtsMDSC { ensure that { when { the IUT entity receives a vRequestGet containing - uri indicating value "/restconf/data/networks/NETWORK_ID"; // Malformed URI + uri indicating value "/restconf/data/networks/{NETWORK_ID}"; // Malformed URI from the TEST_SYSTEM entity } then { the IUT entity sends a r400 @@ -746,7 +724,7 @@ Package AtsMDSC { } Test Purpose { - TP Id TP_mWT_PNC_PT_ETH_TOPO_GET_BO_02 + TP Id TP_mWT_PNC_PT_ETH_TOPO_NETWORK_GET_BO_02 Test objective "Verify that the IUT replies with an error code when the network identifier is unknown." @@ -771,7 +749,7 @@ Package AtsMDSC { ensure that { when { the IUT entity receives a vRequestGet containing - uri indicating value "/restconf/data/ietf-network:networks/network={UNKNOWN_NETWORK_ID)"; + uri indicating value "/restconf/data/ietf-network:networks/network={UNKNOWN_NETWORK_ID}"; from the TEST_SYSTEM entity } then { the IUT entity sends a r404 @@ -781,7 +759,7 @@ Package AtsMDSC { } Test Purpose { - TP Id TP_mWT_PNC_PT_ETH_NODE_GET_BV_01 + TP Id TP_mWT_PNC_PT_ETH_TOPO_NODE_GET_BV_01 Test objective "Verify that the IUT provides the Ethernet network topology for all nodes with mandatory mWT GC 024 data elements subset." @@ -806,7 +784,7 @@ Package AtsMDSC { ensure that { when { the IUT entity receives a vRequestGet containing - uri indicating value "/restconf/data/ietf-network:networks/network={NETWORK_ID)/node"; + uri indicating value "/restconf/data/ietf-network:networks/network={NETWORK_ID}/node"; from the TEST_SYSTEM entity } then { the IUT entity sends a r200 containing @@ -858,7 +836,7 @@ Package AtsMDSC { ensure that { when { the IUT entity receives a vRequestGet containing - uri indicating value "/restconf/data/ietf-network:networks/network={NETWORK_ID)/node={NODE_ID)"; + uri indicating value "/restconf/data/ietf-network:networks/network={NETWORK_ID}/node={NODE_ID}"; from the TEST_SYSTEM entity } then { the IUT entity sends a r200 containing @@ -911,7 +889,7 @@ Package AtsMDSC { ensure that { when { the IUT entity receives a vRequestGet containing - uri indicating value "/restconf/data/ietf-network:networks/network={NETWORK_ID)/node={UNKNOWN_NODE_ID)"; + uri indicating value "/restconf/data/ietf-network:networks/network={NETWORK_ID}/node={UNKNOWN_NODE_ID}"; from the TEST_SYSTEM entity } then { the IUT entity sends a r404 @@ -1142,7 +1120,7 @@ Package AtsMDSC { TP Id TP_mWT_PNC_PT_ETH_SVC_POST_BV_02_02 Test objective - "Verify that the IUT creates successfully a new Bandwidth profile ." + "Verify that the IUT creates successfully a new Bandwidth profile." Reference "ETSI GS mWT 024 Clause 4.3.3", @@ -1505,7 +1483,7 @@ Package AtsMDSC { ensure that { when { the IUT entity receives a vRequestDelete containing - uri indicating value "/restconf/data/ietf-eth-tran-service:etht-svc/etht-svc-instances=ETHT_SVC_NAME", + uri indicating value "/restconf/data/ietf-eth-tran-service:etht-svc/etht-svc-instances={ETHT_SVC_NAME}", headers containing content_type indicating value "application/yang-data+xml";; from the TEST_SYSTEM entity @@ -1544,7 +1522,7 @@ Package AtsMDSC { ensure that { when { the IUT entity receives a vRequestDelete containing - uri indicating value "/restconf/data/ietf-eth-tran-service:etht-svc/globals/bandwitdh_profile_name=BANDWIDTH_PROFILE_NAME", + uri indicating value "/restconf/data/ietf-eth-tran-service:etht-svc/globals/bandwitdh_profile_name={BANDWIDTH_PROFILE_NAME}", headers containing content_type indicating value "application/yang-data+xml";; from the TEST_SYSTEM entity @@ -1582,7 +1560,7 @@ Package AtsMDSC { ensure that { when { the IUT entity receives a vRequestDelete containing - uri indicating value "/restconf/data/ietf-eth-tran-service:etht-svc/nstances=ETHT_SVC_NAME"; // Malformed URI + uri indicating value "/restconf/data/ietf-eth-tran-service:etht-svc/nstances={ETHT_SVC_NAME}"; // Malformed URI from the TEST_SYSTEM entity } then { the IUT entity sends a r400 @@ -1618,7 +1596,7 @@ Package AtsMDSC { ensure that { when { the IUT entity receives a vRequestDelete containing - uri indicating value "/restconf/data/ietf-eth-tran-service:etht-svc/etht-svc-instances=UNKNOWN_ETHT_SVC_NAME"; + uri indicating value "/restconf/data/ietf-eth-tran-service:etht-svc/etht-svc-instances={UNKNOWN_ETHT_SVC_NAME}"; from the TEST_SYSTEM entity } then { the IUT entity sends a r404 diff --git a/test-purposes/ietf_yang_library.tplan2 b/test-purposes/ietf_yang_library.tplan2 index 1f3c440..b1a6227 100644 --- a/test-purposes/ietf_yang_library.tplan2 +++ b/test-purposes/ietf_yang_library.tplan2 @@ -13,15 +13,23 @@ Package ietf_yang_library { type ModulesState with name_ of type string, - modules of type ModuleList + optional modules of type ModuleList, + optional import_only_module of type ModuleList, + content_id of type string ; type ModuleList with name_ of type string, revision of type string, - schema of type uri, namespace of type uri, - conformance_type of type string + optional location of type uri, + optional submodule of type Submodule + ; + + type Submodule with + name_ of type string, + revision of type string, + optional location of type uri ; // String declaration diff --git a/test-purposes/mWT_Common.tplan2 b/test-purposes/mWT_Common.tplan2 index 251fa25..62934e8 100644 --- a/test-purposes/mWT_Common.tplan2 +++ b/test-purposes/mWT_Common.tplan2 @@ -82,7 +82,7 @@ Package mWT_Common { ; type body_restconf with - optional modules_state of type ModulesState, + optional module_set of type ModulesState, optional networks of type Networks ; -- GitLab From a4266745ac7374e7a16821705148a744265d3c40 Mon Sep 17 00:00:00 2001 From: garciay Date: Fri, 12 Jul 2024 08:13:12 +0200 Subject: [PATCH 11/15] Implementing ATS in Postman --- postman/TTF_T029.postman_collection.json | 2518 +++++++++++++-------- postman/TTF_T029.postman_environment.json | 128 +- test-purposes/AtsMDSC.tplan2 | 44 +- 3 files changed, 1734 insertions(+), 956 deletions(-) diff --git a/postman/TTF_T029.postman_collection.json b/postman/TTF_T029.postman_collection.json index 7b5ab4f..cd8503f 100644 --- a/postman/TTF_T029.postman_collection.json +++ b/postman/TTF_T029.postman_collection.json @@ -1,10 +1,11 @@ { "info": { - "_postman_id": "c9163952-03f7-4301-bae0-32c78f9702ce", + "_postman_id": "1f2d95ce-fcc4-4fae-8f20-9e17093456e0", "name": "TTF_T029", + "description": "This is is the Enmvironment used by the ETSI TTF T029 millimetre Wave Transmission (mWT); \nDefinition of a Wireless Transport Profile for Standard SDN Northbound Interfaces Conformance test suite", "schema": "https://schema.getpostman.com/json/collection/v2.1.0/collection.json", "_exporter_id": "152820", - "_collection_link": "https://red-trinity-563699.postman.co/workspace/New-Team-Workspace~d54f0e73-b65d-41a2-8e4e-35b7b23cdd96/collection/152820-c9163952-03f7-4301-bae0-32c78f9702ce?action=share&source=collection_link&creator=152820" + "_collection_link": "https://red-trinity-563699.postman.co/workspace/New-Team-Workspace~d54f0e73-b65d-41a2-8e4e-35b7b23cdd96/collection/152820-1f2d95ce-fcc4-4fae-8f20-9e17093456e0?action=share&source=collection_link&creator=152820" }, "item": [ { @@ -268,15 +269,15 @@ } ], "url": { - "raw": "{{PROTOCOL}}://{{PX_IUT_IP_ADDRESS}}:{{PX_IUT_IP_PORT}}/{{PX_ROOT_API}}/ietf-yang-library:modules-state", - "protocol": "{{PROTOCOL}}", + "raw": "{{PX_PROTOCOL}}://{{PX_IUT_IP_ADDRESS}}:{{PX_IUT_IP_PORT}}/{{PX_ROOT_API}}/ietf-yang-library:yang-library", + "protocol": "{{PX_PROTOCOL}}", "host": [ "{{PX_IUT_IP_ADDRESS}}" ], "port": "{{PX_IUT_IP_PORT}}", "path": [ "{{PX_ROOT_API}}", - "ietf-yang-library:modules-state" + "ietf-yang-library:yang-library" ] } }, @@ -284,13 +285,9 @@ "code": 200, "_postman_previewlanguage": "json", "header": [ - { - "key": "Server", - "value": "nginx/1.13.12" - }, { "key": "Date", - "value": "Mon, 15 Jan 2024 13:05:11 GMT" + "value": "Mon, 08 Jul 2024 06:56:11 GMT" }, { "key": "Content-Type", @@ -305,44 +302,60 @@ "value": "keep-alive" }, { - "key": "Last-Modified", - "value": "Fri, 05 Jan 2024 23:51:47 GMT" + "key": "Cache-Control", + "value": "no-store, no-cache, max-age=0, must-revalidate" }, { "key": "Cache-Control", - "value": "private, no-cache, must-revalidate, proxy-revalidate" + "value": "no-cache" }, { - "key": "Etag", - "value": "\"1704-498707-561003\"" + "key": "Expires", + "value": "Thu, 01 Jan 1970 00:00:00 GMT" }, { "key": "Pragma", "value": "no-cache" }, { - "key": "Content-Security-Policy", - "value": "default-src 'self'; block-all-mixed-content; base-uri 'self'; frame-ancestors 'none';" + "key": "Strict-Transport-Security", + "value": "max-age=0" }, { - "key": "Strict-Transport-Security", - "value": "max-age=15552000; includeSubDomains" + "key": "X-Frame-Options", + "value": "SAMEORIGIN" }, { "key": "X-Content-Type-Options", "value": "nosniff" }, - { - "key": "X-Frame-Options", - "value": "DENY" - }, { "key": "X-XSS-Protection", "value": "1; mode=block" + }, + { + "key": "Content-Security-Policy", + "value": "frame-src * https://10.233.20.198:* https://10.233.31.14:* https://139.178.74.218:* https://139.178.74.219:* https://10.233.13.232:* https://10.233.20.242:*; frame-ancestors 'self' https://10.233.20.198:* https://10.233.31.14:* https://139.178.74.218:* https://139.178.74.219:* https://10.233.13.232:* https://10.233.20.242:*; connect-src 'self' wss://139.178.74.219:* wss://139.178.74.218:* wss://10.233.20.242:* wss://10.233.31.14:* wss://10.233.20.198:* wss://10.233.13.232:* https://10.233.20.198:* https://10.233.31.14:* https://139.178.74.218:* https://139.178.74.219:* https://10.233.13.232:* https://10.233.20.242:*; default-src 'self' data: https://10.233.20.198:* https://10.233.31.14:* https://139.178.74.218:* https://139.178.74.219:* https://10.233.13.232:* https://10.233.20.242:* 'unsafe-inline' ; img-src * data:;" + }, + { + "key": "Set-Cookie", + "value": "NSPOSAPP2_JSESSIONID=91336A5B017792076A4A1B2B49F3AB8F; Expires=Wed, 07 Aug 2024 06:56:11 GMT; Path=/restconf; Secure; HttpOnly" + }, + { + "key": "total-count", + "value": "0" + }, + { + "key": "start-index", + "value": "0" + }, + { + "key": "end-index", + "value": "-1" } ], "cookie": [], - "body": "{\n \"ietf-yang-library:modules-state\": {\n \"module-set-id\": \"f02b3be052f1d4283e0f6a59f79b6082\",\n \"module\": [\n {\n \"name\": \"cisco-asa-cli\",\n \"revision\": \"\",\n \"schema\": \"https://localhost:443/restconf/tailf/modules/cisco-asa-cli\",\n \"namespace\": \"http://tail-f.com/ns/ned-id/cisco-asa-cli\",\n \"conformance-type\": \"import\"\n },\n {\n \"name\": \"cisco-asa-cli-6.12\",\n \"revision\": \"\",\n \"schema\": \"https://localhost:443/restconf/tailf/modules/cisco-asa-cli-6.12\",\n \"namespace\": \"http://tail-f.com/ns/ned-id/cisco-asa-cli-6.12\",\n \"conformance-type\": \"import\"\n },\n {\n \"name\": \"cisco-ios-cli\",\n \"revision\": \"\",\n \"schema\": \"https://localhost:443/restconf/tailf/modules/cisco-ios-cli\",\n \"namespace\": \"http://tail-f.com/ns/ned-id/cisco-ios-cli\",\n \"conformance-type\": \"import\"\n },\n {\n \"name\": \"cisco-ios-cli-6.67\",\n \"revision\": \"\",\n \"schema\": \"https://localhost:443/restconf/tailf/modules/cisco-ios-cli-6.67\",\n \"namespace\": \"http://tail-f.com/ns/ned-id/cisco-ios-cli-6.67\",\n \"conformance-type\": \"import\"\n },\n {\n \"name\": \"cisco-iosxr-cli\",\n \"revision\": \"\",\n \"schema\": \"https://localhost:443/restconf/tailf/modules/cisco-iosxr-cli\",\n \"namespace\": \"http://tail-f.com/ns/ned-id/cisco-iosxr-cli\",\n \"conformance-type\": \"import\"\n },\n {\n \"name\": \"cisco-iosxr-cli-7.32\",\n \"revision\": \"\",\n \"schema\": \"https://localhost:443/restconf/tailf/modules/cisco-iosxr-cli-7.32\",\n \"namespace\": \"http://tail-f.com/ns/ned-id/cisco-iosxr-cli-7.32\",\n \"conformance-type\": \"import\"\n },\n {\n \"name\": \"cisco-nx-cli\",\n \"revision\": \"\",\n \"schema\": \"https://localhost:443/restconf/tailf/modules/cisco-nx-cli\",\n \"namespace\": \"http://tail-f.com/ns/ned-id/cisco-nx-cli\",\n \"conformance-type\": \"import\"\n },\n {\n \"name\": \"cisco-nx-cli-5.20\",\n \"revision\": \"\",\n \"schema\": \"https://localhost:443/restconf/tailf/modules/cisco-nx-cli-5.20\",\n \"namespace\": \"http://tail-f.com/ns/ned-id/cisco-nx-cli-5.20\",\n \"conformance-type\": \"import\"\n },\n {\n \"name\": \"encryption-usm\",\n \"revision\": \"\",\n \"schema\": \"https://localhost:443/restconf/tailf/modules/encryption-usm\",\n \"namespace\": \"http://tailf.com/ns/encryption-usm\",\n \"conformance-type\": \"implement\"\n },\n {\n \"name\": \"iana-crypt-hash\",\n \"revision\": \"2014-08-06\",\n \"schema\": \"https://localhost:443/restconf/tailf/modules/iana-crypt-hash/2014-08-06\",\n \"namespace\": \"urn:ietf:params:xml:ns:yang:iana-crypt-hash\",\n \"feature\": [\n \"crypt-hash-md5\",\n \"crypt-hash-sha-256\",\n \"crypt-hash-sha-512\"\n ],\n \"conformance-type\": \"implement\"\n },\n {\n \"name\": \"id-allocator\",\n \"revision\": \"2017-08-14\",\n \"schema\": \"https://localhost:443/restconf/tailf/modules/id-allocator/2017-08-14\",\n \"namespace\": \"http://tail-f.com/pkg/id-allocator\",\n \"conformance-type\": \"implement\",\n \"submodule\": [\n {\n \"name\": \"id-allocator-alarms\",\n \"revision\": \"2017-02-09\",\n \"schema\": \"https://localhost:443/restconf/tailf/modules/id-allocator-alarms/2017-02-09\"\n }\n ]\n },\n {\n \"name\": \"id-allocator-oper\",\n \"revision\": \"2015-10-20\",\n \"schema\": \"https://localhost:443/restconf/tailf/modules/id-allocator-oper/2015-10-20\",\n \"namespace\": \"http://tail-f.com/pkg/id-allocator-oper\",\n \"conformance-type\": \"implement\"\n },\n {\n \"name\": \"ietf-datastores\",\n \"revision\": \"2018-02-14\",\n \"schema\": \"https://localhost:443/restconf/tailf/modules/ietf-datastores/2018-02-14\",\n \"namespace\": \"urn:ietf:params:xml:ns:yang:ietf-datastores\",\n \"conformance-type\": \"import\"\n },\n {\n \"name\": \"ietf-inet-types\",\n \"revision\": \"2013-07-15\",\n \"schema\": \"https://localhost:443/restconf/tailf/modules/ietf-inet-types/2013-07-15\",\n \"namespace\": \"urn:ietf:params:xml:ns:yang:ietf-inet-types\",\n \"conformance-type\": \"import\"\n },\n {\n \"name\": \"ietf-interfaces\",\n \"revision\": \"2018-02-20\",\n \"schema\": \"https://localhost:443/restconf/tailf/modules/ietf-interfaces/2018-02-20\",\n \"namespace\": \"urn:ietf:params:xml:ns:yang:ietf-interfaces\",\n \"feature\": [\n \"arbitrary-names\",\n \"if-mib\",\n \"pre-provisioning\"\n ],\n \"conformance-type\": \"import\"\n },\n {\n \"name\": \"ietf-ip\",\n \"revision\": \"2018-02-22\",\n \"schema\": \"https://localhost:443/restconf/tailf/modules/ietf-ip/2018-02-22\",\n \"namespace\": \"urn:ietf:params:xml:ns:yang:ietf-ip\",\n \"feature\": [\n \"ipv4-non-contiguous-netmasks\",\n \"ipv6-privacy-autoconf\"\n ],\n \"conformance-type\": \"import\"\n },\n {\n \"name\": \"ietf-netconf-acm\",\n \"revision\": \"2018-02-14\",\n \"schema\": \"https://localhost:443/restconf/tailf/modules/ietf-netconf-acm/2018-02-14\",\n \"namespace\": \"urn:ietf:params:xml:ns:yang:ietf-netconf-acm\",\n \"conformance-type\": \"implement\"\n },\n {\n \"name\": \"ietf-netconf-monitoring\",\n \"revision\": \"2010-10-04\",\n \"schema\": \"https://localhost:443/restconf/tailf/modules/ietf-netconf-monitoring/2010-10-04\",\n \"namespace\": \"urn:ietf:params:xml:ns:yang:ietf-netconf-monitoring\",\n \"conformance-type\": \"implement\"\n },\n {\n \"name\": \"ietf-netconf-notifications\",\n \"revision\": \"2012-02-06\",\n \"schema\": \"https://localhost:443/restconf/tailf/modules/ietf-netconf-notifications/2012-02-06\",\n \"namespace\": \"urn:ietf:params:xml:ns:yang:ietf-netconf-notifications\",\n \"conformance-type\": \"implement\"\n },\n {\n \"name\": \"ietf-network-instance\",\n \"revision\": \"2019-01-21\",\n \"schema\": \"https://localhost:443/restconf/tailf/modules/ietf-network-instance/2019-01-21\",\n \"namespace\": \"urn:ietf:params:xml:ns:yang:ietf-network-instance\",\n \"conformance-type\": \"import\"\n },\n {\n \"name\": \"ietf-origin\",\n \"revision\": \"2018-02-14\",\n \"schema\": \"https://localhost:443/restconf/tailf/modules/ietf-origin/2018-02-14\",\n \"namespace\": \"urn:ietf:params:xml:ns:yang:ietf-origin\",\n \"conformance-type\": \"import\"\n },\n {\n \"name\": \"ietf-restconf\",\n \"revision\": \"2017-01-26\",\n \"schema\": \"https://localhost:443/restconf/tailf/modules/ietf-restconf/2017-01-26\",\n \"namespace\": \"urn:ietf:params:xml:ns:yang:ietf-restconf\",\n \"conformance-type\": \"implement\"\n },\n {\n \"name\": \"ietf-restconf-monitoring\",\n \"revision\": \"2017-01-26\",\n \"schema\": \"https://localhost:443/restconf/tailf/modules/ietf-restconf-monitoring/2017-01-26\",\n \"namespace\": \"urn:ietf:params:xml:ns:yang:ietf-restconf-monitoring\",\n \"conformance-type\": \"implement\"\n },\n {\n \"name\": \"ietf-x509-cert-to-name\",\n \"revision\": \"2014-12-10\",\n \"schema\": \"https://localhost:443/restconf/tailf/modules/ietf-x509-cert-to-name/2014-12-10\",\n \"namespace\": \"urn:ietf:params:xml:ns:yang:ietf-x509-cert-to-name\",\n \"conformance-type\": \"import\"\n },\n {\n \"name\": \"ietf-yang-library\",\n \"revision\": \"2019-01-04\",\n \"schema\": \"https://localhost:443/restconf/tailf/modules/ietf-yang-library/2019-01-04\",\n \"namespace\": \"urn:ietf:params:xml:ns:yang:ietf-yang-library\",\n \"conformance-type\": \"implement\"\n },\n {\n \"name\": \"ietf-yang-patch\",\n \"revision\": \"2017-02-22\",\n \"schema\": \"https://localhost:443/restconf/tailf/modules/ietf-yang-patch/2017-02-22\",\n \"namespace\": \"urn:ietf:params:xml:ns:yang:ietf-yang-patch\",\n \"conformance-type\": \"implement\"\n },\n {\n \"name\": \"ietf-yang-schema-mount\",\n \"revision\": \"2019-01-14\",\n \"schema\": \"https://localhost:443/restconf/tailf/modules/ietf-yang-schema-mount/2019-01-14\",\n \"namespace\": \"urn:ietf:params:xml:ns:yang:ietf-yang-schema-mount\",\n \"conformance-type\": \"implement\"\n },\n {\n \"name\": \"ietf-yang-smiv2\",\n \"revision\": \"2012-06-22\",\n \"schema\": \"https://localhost:443/restconf/tailf/modules/ietf-yang-smiv2/2012-06-22\",\n \"namespace\": \"urn:ietf:params:xml:ns:yang:ietf-yang-smiv2\",\n \"conformance-type\": \"import\"\n },\n {\n \"name\": \"ietf-yang-types\",\n \"revision\": \"2013-07-15\",\n \"schema\": \"https://localhost:443/restconf/tailf/modules/ietf-yang-types/2013-07-15\",\n \"namespace\": \"urn:ietf:params:xml:ns:yang:ietf-yang-types\",\n \"conformance-type\": \"import\"\n },\n {\n \"name\": \"ipaddress-allocator\",\n \"revision\": \"2018-02-27\",\n \"schema\": \"https://localhost:443/restconf/tailf/modules/ipaddress-allocator/2018-02-27\",\n \"namespace\": \"http://tail-f.com/pkg/ipaddress-allocator\",\n \"conformance-type\": \"implement\",\n \"submodule\": [\n {\n \"name\": \"ipaddress-allocator-alarms\",\n \"revision\": \"2017-02-09\",\n \"schema\": \"https://localhost:443/restconf/tailf/modules/ipaddress-allocator-alarms/2017-02-09\"\n }\n ]\n },\n {\n \"name\": \"ipaddress-allocator-oper\",\n \"revision\": \"2015-10-20\",\n \"schema\": \"https://localhost:443/restconf/tailf/modules/ipaddress-allocator-oper/2015-10-20\",\n \"namespace\": \"http://tail-f.com/pkg/ipaddress-allocator-oper\",\n \"conformance-type\": \"implement\"\n },\n {\n \"name\": \"resource-allocator\",\n \"revision\": \"2020-07-29\",\n \"schema\": \"https://localhost:443/restconf/tailf/modules/resource-allocator/2020-07-29\",\n \"namespace\": \"http://tail-f.com/pkg/resource-allocator\",\n \"conformance-type\": \"implement\"\n },\n {\n \"name\": \"selftest\",\n \"revision\": \"2016-12-05\",\n \"schema\": \"https://localhost:443/restconf/tailf/modules/selftest/2016-12-05\",\n \"namespace\": \"http://cisco.com/self-test-action\",\n \"conformance-type\": \"implement\"\n },\n {\n \"name\": \"snmp\",\n \"revision\": \"2010-10-22\",\n \"schema\": \"https://localhost:443/restconf/tailf/modules/snmp/2010-10-22\",\n \"namespace\": \"http://tailf.com/ns/snmp\",\n \"conformance-type\": \"implement\",\n \"submodule\": [\n {\n \"name\": \"snmp-agent\",\n \"revision\": \"\",\n \"schema\": \"https://localhost:443/restconf/tailf/modules/snmp-agent\"\n },\n {\n \"name\": \"snmp-common\",\n \"revision\": \"\",\n \"schema\": \"https://localhost:443/restconf/tailf/modules/snmp-common\"\n },\n {\n \"name\": \"snmp-community\",\n \"revision\": \"\",\n \"schema\": \"https://localhost:443/restconf/tailf/modules/snmp-community\"\n },\n {\n \"name\": \"snmp-notification\",\n \"revision\": \"\",\n \"schema\": \"https://localhost:443/restconf/tailf/modules/snmp-notification\"\n },\n {\n \"name\": \"snmp-target\",\n \"revision\": \"\",\n \"schema\": \"https://localhost:443/restconf/tailf/modules/snmp-target\"\n },\n {\n \"name\": \"snmp-target-params\",\n \"revision\": \"\",\n \"schema\": \"https://localhost:443/restconf/tailf/modules/snmp-target-params\"\n },\n {\n \"name\": \"snmp-usm\",\n \"revision\": \"\",\n \"schema\": \"https://localhost:443/restconf/tailf/modules/snmp-usm\"\n },\n {\n \"name\": \"snmp-vacm\",\n \"revision\": \"\",\n \"schema\": \"https://localhost:443/restconf/tailf/modules/snmp-vacm\"\n }\n ]\n },\n {\n \"name\": \"svi_verify_example\",\n \"revision\": \"2016-01-01\",\n \"schema\": \"https://localhost:443/restconf/tailf/modules/svi_verify_example/2016-01-01\",\n \"namespace\": \"http://example.com/svi_verify_example\",\n \"conformance-type\": \"implement\"\n },\n {\n \"name\": \"tailf-aaa\",\n \"revision\": \"2018-09-12\",\n \"schema\": \"https://localhost:443/restconf/tailf/modules/tailf-aaa/2018-09-12\",\n \"namespace\": \"http://tail-f.com/ns/aaa/1.1\",\n \"conformance-type\": \"implement\"\n },\n {\n \"name\": \"tailf-acm\",\n \"revision\": \"2013-03-07\",\n \"schema\": \"https://localhost:443/restconf/tailf/modules/tailf-acm/2013-03-07\",\n \"namespace\": \"http://tail-f.com/yang/acm\",\n \"conformance-type\": \"implement\"\n },\n {\n \"name\": \"tailf-common\",\n \"revision\": \"2020-12-08\",\n \"schema\": \"https://localhost:443/restconf/tailf/modules/tailf-common/2020-12-08\",\n \"namespace\": \"http://tail-f.com/yang/common\",\n \"conformance-type\": \"import\",\n \"submodule\": [\n {\n \"name\": \"tailf-cli-extensions\",\n \"revision\": \"2020-04-17\",\n \"schema\": \"https://localhost:443/restconf/tailf/modules/tailf-cli-extensions/2020-04-17\"\n },\n {\n \"name\": \"tailf-meta-extensions\",\n \"revision\": \"2017-03-08\",\n \"schema\": \"https://localhost:443/restconf/tailf/modules/tailf-meta-extensions/2017-03-08\"\n }\n ]\n },\n {\n \"name\": \"tailf-common-monitoring\",\n \"revision\": \"2019-04-09\",\n \"schema\": \"https://localhost:443/restconf/tailf/modules/tailf-common-monitoring/2019-04-09\",\n \"namespace\": \"http://tail-f.com/yang/common-monitoring\",\n \"conformance-type\": \"import\"\n },\n {\n \"name\": \"tailf-common-query\",\n \"revision\": \"2017-12-15\",\n \"schema\": \"https://localhost:443/restconf/tailf/modules/tailf-common-query/2017-12-15\",\n \"namespace\": \"http://tail-f.com/ns/common/query\",\n \"conformance-type\": \"import\"\n },\n {\n \"name\": \"tailf-configuration-policy\",\n \"revision\": \"2010-11-04\",\n \"schema\": \"https://localhost:443/restconf/tailf/modules/tailf-configuration-policy/2010-11-04\",\n \"namespace\": \"http://tail-f.com/yang/configuration-policy\",\n \"conformance-type\": \"implement\"\n },\n {\n \"name\": \"tailf-kicker\",\n \"revision\": \"2017-09-28\",\n \"schema\": \"https://localhost:443/restconf/tailf/modules/tailf-kicker/2017-09-28\",\n \"namespace\": \"http://tail-f.com/ns/kicker\",\n \"conformance-type\": \"implement\"\n },\n {\n \"name\": \"tailf-last-login\",\n \"revision\": \"2019-11-21\",\n \"schema\": \"https://localhost:443/restconf/tailf/modules/tailf-last-login/2019-11-21\",\n \"namespace\": \"http://tail-f.com/yang/last-login\",\n \"conformance-type\": \"implement\"\n },\n {\n \"name\": \"tailf-ncs\",\n \"revision\": \"2021-03-09\",\n \"schema\": \"https://localhost:443/restconf/tailf/modules/tailf-ncs/2021-03-09\",\n \"namespace\": \"http://tail-f.com/ns/ncs\",\n \"conformance-type\": \"implement\",\n \"submodule\": [\n {\n \"name\": \"tailf-ncs-cluster\",\n \"revision\": \"2019-11-28\",\n \"schema\": \"https://localhost:443/restconf/tailf/modules/tailf-ncs-cluster/2019-11-28\"\n },\n {\n \"name\": \"tailf-ncs-common\",\n \"revision\": \"2019-11-28\",\n \"schema\": \"https://localhost:443/restconf/tailf/modules/tailf-ncs-common/2019-11-28\"\n },\n {\n \"name\": \"tailf-ncs-compliance\",\n \"revision\": \"2016-05-26\",\n \"schema\": \"https://localhost:443/restconf/tailf/modules/tailf-ncs-compliance/2016-05-26\"\n },\n {\n \"name\": \"tailf-ncs-customers\",\n \"revision\": \"2012-08-30\",\n \"schema\": \"https://localhost:443/restconf/tailf/modules/tailf-ncs-customers/2012-08-30\"\n },\n {\n \"name\": \"tailf-ncs-devices\",\n \"revision\": \"2020-12-08\",\n \"schema\": \"https://localhost:443/restconf/tailf/modules/tailf-ncs-devices/2020-12-08\"\n },\n {\n \"name\": \"tailf-ncs-high-availability\",\n \"revision\": \"2020-06-25\",\n \"schema\": \"https://localhost:443/restconf/tailf/modules/tailf-ncs-high-availability/2020-06-25\"\n },\n {\n \"name\": \"tailf-ncs-java-vm\",\n \"revision\": \"2019-11-28\",\n \"schema\": \"https://localhost:443/restconf/tailf/modules/tailf-ncs-java-vm/2019-11-28\"\n },\n {\n \"name\": \"tailf-ncs-log\",\n \"revision\": \"2019-04-09\",\n \"schema\": \"https://localhost:443/restconf/tailf/modules/tailf-ncs-log/2019-04-09\"\n },\n {\n \"name\": \"tailf-ncs-packages\",\n \"revision\": \"2020-06-25\",\n \"schema\": \"https://localhost:443/restconf/tailf/modules/tailf-ncs-packages/2020-06-25\"\n },\n {\n \"name\": \"tailf-ncs-plan\",\n \"revision\": \"2020-12-08\",\n \"schema\": \"https://localhost:443/restconf/tailf/modules/tailf-ncs-plan/2020-12-08\"\n },\n {\n \"name\": \"tailf-ncs-python-vm\",\n \"revision\": \"2019-04-09\",\n \"schema\": \"https://localhost:443/restconf/tailf/modules/tailf-ncs-python-vm/2019-04-09\"\n },\n {\n \"name\": \"tailf-ncs-service-progress-monitoring\",\n \"revision\": \"2018-06-01\",\n \"schema\": \"https://localhost:443/restconf/tailf/modules/tailf-ncs-service-progress-monitoring/2018-06-01\"\n },\n {\n \"name\": \"tailf-ncs-services\",\n \"revision\": \"2020-12-08\",\n \"schema\": \"https://localhost:443/restconf/tailf/modules/tailf-ncs-services/2020-12-08\"\n },\n {\n \"name\": \"tailf-ncs-smart-license\",\n \"revision\": \"2020-06-25\",\n \"schema\": \"https://localhost:443/restconf/tailf/modules/tailf-ncs-smart-license/2020-06-25\"\n },\n {\n \"name\": \"tailf-ncs-snmp-notification-receiver\",\n \"revision\": \"2012-08-30\",\n \"schema\": \"https://localhost:443/restconf/tailf/modules/tailf-ncs-snmp-notification-receiver/2012-08-30\"\n },\n {\n \"name\": \"tailf-ncs-software\",\n \"revision\": \"2021-03-09\",\n \"schema\": \"https://localhost:443/restconf/tailf/modules/tailf-ncs-software/2021-03-09\"\n },\n {\n \"name\": \"tailf-ncs-ssh\",\n \"revision\": \"2019-11-28\",\n \"schema\": \"https://localhost:443/restconf/tailf/modules/tailf-ncs-ssh/2019-11-28\"\n }\n ]\n },\n {\n \"name\": \"tailf-ncs-acm\",\n \"revision\": \"2019-11-28\",\n \"schema\": \"https://localhost:443/restconf/tailf/modules/tailf-ncs-acm/2019-11-28\",\n \"namespace\": \"http://tail-f.com/yang/ncs-acm\",\n \"conformance-type\": \"implement\"\n },\n {\n \"name\": \"tailf-ncs-alarms\",\n \"revision\": \"2020-06-25\",\n \"schema\": \"https://localhost:443/restconf/tailf/modules/tailf-ncs-alarms/2020-06-25\",\n \"namespace\": \"http://tail-f.com/ns/ncs-alarms\",\n \"conformance-type\": \"implement\"\n },\n {\n \"name\": \"tailf-ncs-devices-yang-library\",\n \"revision\": \"2019-11-28\",\n \"schema\": \"https://localhost:443/restconf/tailf/modules/tailf-ncs-devices-yang-library/2019-11-28\",\n \"namespace\": \"http://tail-f.com/ns/ncs/devices-yang-library\",\n \"conformance-type\": \"implement\"\n },\n {\n \"name\": \"tailf-ncs-kicker-extension\",\n \"revision\": \"2019-04-09\",\n \"schema\": \"https://localhost:443/restconf/tailf/modules/tailf-ncs-kicker-extension/2019-04-09\",\n \"namespace\": \"http://tail-f.com/ns/ncs-kicker\",\n \"conformance-type\": \"implement\"\n },\n {\n \"name\": \"tailf-ncs-monitoring\",\n \"revision\": \"2019-04-09\",\n \"schema\": \"https://localhost:443/restconf/tailf/modules/tailf-ncs-monitoring/2019-04-09\",\n \"namespace\": \"http://tail-f.com/yang/ncs-monitoring\",\n \"conformance-type\": \"implement\"\n },\n {\n \"name\": \"tailf-ncs-ned\",\n \"revision\": \"2019-04-09\",\n \"schema\": \"https://localhost:443/restconf/tailf/modules/tailf-ncs-ned/2019-04-09\",\n \"namespace\": \"http://tail-f.com/ns/ncs-ned\",\n \"conformance-type\": \"import\"\n },\n {\n \"name\": \"tailf-ncs-netconf-ned-builder\",\n \"revision\": \"2020-06-25\",\n \"schema\": \"https://localhost:443/restconf/tailf/modules/tailf-ncs-netconf-ned-builder/2020-06-25\",\n \"namespace\": \"http://tail-f.com/ns/ncs/netconf-ned-builder\",\n \"conformance-type\": \"implement\"\n },\n {\n \"name\": \"tailf-ncs-progress\",\n \"revision\": \"2020-06-25\",\n \"schema\": \"https://localhost:443/restconf/tailf/modules/tailf-ncs-progress/2020-06-25\",\n \"namespace\": \"http://tail-f.com/ns/ncs-progress\",\n \"conformance-type\": \"implement\"\n },\n {\n \"name\": \"tailf-ncs-scheduler\",\n \"revision\": \"2020-12-08\",\n \"schema\": \"https://localhost:443/restconf/tailf/modules/tailf-ncs-scheduler/2020-12-08\",\n \"namespace\": \"http://tail-f.com/ns/ncs-scheduler\",\n \"conformance-type\": \"implement\"\n },\n {\n \"name\": \"tailf-ncs-snmp\",\n \"revision\": \"2017-03-16\",\n \"schema\": \"https://localhost:443/restconf/tailf/modules/tailf-ncs-snmp/2017-03-16\",\n \"namespace\": \"http://tail-f.com/ns/ncs-snmp\",\n \"conformance-type\": \"implement\"\n },\n {\n \"name\": \"tailf-ncs-webui\",\n \"revision\": \"2013-01-16\",\n \"schema\": \"https://localhost:443/restconf/tailf/modules/tailf-ncs-webui/2013-01-16\",\n \"namespace\": \"http://tail-f.com/ns/ncs-webui\",\n \"conformance-type\": \"implement\"\n },\n {\n \"name\": \"tailf-ned-cisco-asa-meta\",\n \"revision\": \"2020-11-27\",\n \"schema\": \"https://localhost:443/restconf/tailf/modules/tailf-ned-cisco-asa-meta/2020-11-27\",\n \"namespace\": \"http://cisco.com/ned/asa-meta\",\n \"conformance-type\": \"implement\"\n },\n {\n \"name\": \"tailf-ned-cisco-ios-meta\",\n \"revision\": \"2020-12-04\",\n \"schema\": \"https://localhost:443/restconf/tailf/modules/tailf-ned-cisco-ios-meta/2020-12-04\",\n \"namespace\": \"urn:ios-meta\",\n \"conformance-type\": \"implement\"\n },\n {\n \"name\": \"tailf-ned-cisco-ios-oper\",\n \"revision\": \"2020-12-04\",\n \"schema\": \"https://localhost:443/restconf/tailf/modules/tailf-ned-cisco-ios-oper/2020-12-04\",\n \"namespace\": \"http://tail-f.com/ned/cisco-ios/oper\",\n \"conformance-type\": \"implement\"\n },\n {\n \"name\": \"tailf-ned-cisco-ios-xr-meta\",\n \"revision\": \"2020-12-04\",\n \"schema\": \"https://localhost:443/restconf/tailf/modules/tailf-ned-cisco-ios-xr-meta/2020-12-04\",\n \"namespace\": \"http://tail-f.com/ned/cisco-iosxr/meta\",\n \"conformance-type\": \"implement\"\n },\n {\n \"name\": \"tailf-ned-cisco-ios-xr-oper\",\n \"revision\": \"2020-12-04\",\n \"schema\": \"https://localhost:443/restconf/tailf/modules/tailf-ned-cisco-ios-xr-oper/2020-12-04\",\n \"namespace\": \"http://tail-f.com/ned/cisco-iosxr/oper\",\n \"conformance-type\": \"implement\"\n },\n {\n \"name\": \"tailf-ned-cisco-nx-meta\",\n \"revision\": \"2020-12-08\",\n \"schema\": \"https://localhost:443/restconf/tailf/modules/tailf-ned-cisco-nx-meta/2020-12-08\",\n \"namespace\": \"http://tail-f.com/ned/cisco-nx/meta\",\n \"conformance-type\": \"implement\"\n },\n {\n \"name\": \"tailf-ned-cisco-nx-oper\",\n \"revision\": \"2020-12-08\",\n \"schema\": \"https://localhost:443/restconf/tailf/modules/tailf-ned-cisco-nx-oper/2020-12-08\",\n \"namespace\": \"http://tail-f.com/ned/cisco-nx/oper\",\n \"conformance-type\": \"implement\"\n },\n {\n \"name\": \"tailf-ned-loginscripts\",\n \"revision\": \"\",\n \"schema\": \"https://localhost:443/restconf/tailf/modules/tailf-ned-loginscripts\",\n \"namespace\": \"http://tail-f.com/ned/ned-loginscripts\",\n \"conformance-type\": \"implement\"\n },\n {\n \"name\": \"tailf-ned-secrets\",\n \"revision\": \"2019-04-17\",\n \"schema\": \"https://localhost:443/restconf/tailf/modules/tailf-ned-secrets/2019-04-17\",\n \"namespace\": \"http://tail-f.com/ned/ned-secrets\",\n \"conformance-type\": \"implement\"\n },\n {\n \"name\": \"tailf-netconf-monitoring\",\n \"revision\": \"2019-03-28\",\n \"schema\": \"https://localhost:443/restconf/tailf/modules/tailf-netconf-monitoring/2019-03-28\",\n \"namespace\": \"http://tail-f.com/yang/netconf-monitoring\",\n \"conformance-type\": \"implement\"\n },\n {\n \"name\": \"tailf-progress\",\n \"revision\": \"2020-06-25\",\n \"schema\": \"https://localhost:443/restconf/tailf/modules/tailf-progress/2020-06-25\",\n \"namespace\": \"http://tail-f.com/ns/progress\",\n \"conformance-type\": \"implement\"\n },\n {\n \"name\": \"tailf-rest-query\",\n \"revision\": \"2017-01-06\",\n \"schema\": \"https://localhost:443/restconf/tailf/modules/tailf-rest-query/2017-01-06\",\n \"namespace\": \"http://tail-f.com/ns/tailf-rest-query\",\n \"conformance-type\": \"implement\"\n },\n {\n \"name\": \"tailf-restconf-ncs\",\n \"revision\": \"2020-06-25\",\n \"schema\": \"https://localhost:443/restconf/tailf/modules/tailf-restconf-ncs/2020-06-25\",\n \"namespace\": \"http://tail-f.com/ns/restconf/ncs\",\n \"conformance-type\": \"implement\"\n },\n {\n \"name\": \"tailf-rollback\",\n \"revision\": \"2020-06-25\",\n \"schema\": \"https://localhost:443/restconf/tailf/modules/tailf-rollback/2020-06-25\",\n \"namespace\": \"http://tail-f.com/ns/rollback\",\n \"conformance-type\": \"implement\"\n },\n {\n \"name\": \"tailf-tls\",\n \"revision\": \"2019-06-13\",\n \"schema\": \"https://localhost:443/restconf/tailf/modules/tailf-tls/2019-06-13\",\n \"namespace\": \"http://tail-f.com/ns/tls\",\n \"conformance-type\": \"implement\"\n },\n {\n \"name\": \"tailf-webui\",\n \"revision\": \"2013-03-07\",\n \"schema\": \"https://localhost:443/restconf/tailf/modules/tailf-webui/2013-03-07\",\n \"namespace\": \"http://tail-f.com/ns/webui\",\n \"conformance-type\": \"implement\"\n },\n {\n \"name\": \"tailf-webui-one\",\n \"revision\": \"2019-06-27\",\n \"schema\": \"https://localhost:443/restconf/tailf/modules/tailf-webui-one/2019-06-27\",\n \"namespace\": \"http://tail-f.com/ns/webui-one\",\n \"conformance-type\": \"implement\"\n },\n {\n \"name\": \"tailf-xsd-types\",\n \"revision\": \"2017-11-20\",\n \"schema\": \"https://localhost:443/restconf/tailf/modules/tailf-xsd-types/2017-11-20\",\n \"namespace\": \"http://tail-f.com/yang/xsd-types\",\n \"conformance-type\": \"import\"\n }\n ]\n }\n}" + "body": "{\n \"ietf-yang-library:yang-library\": {\n \"content-id\": \"NSP-2019-05-20\",\n \"module-set\": [\n {\n \"name\": \"NSP-MDC-2019-05-20\",\n \"module\": [\n {\n \"name\": \"network-device-mgr\",\n \"revision\": \"2018-06-06\",\n \"namespace\": \"urn:nokia:nsp:mdm:network-device-mgr\",\n \"conformance-type\": \"implement\"\n },\n {\n \"name\": \"ietf-yang-library\",\n \"revision\": \"2019-01-04\",\n \"namespace\": \"urn:ietf:params:xml:ns:yang:ietf-yang-library\",\n \"conformance-type\": \"implement\"\n },\n {\n \"name\": \"ietf-yang-schema-mount\",\n \"revision\": \"2017-10-09\",\n \"namespace\": \"urn:ietf:params:xml:ns:yang:ietf-yang-schema-mount\",\n \"conformance-type\": \"implement\"\n },\n {\n \"name\": \"ietf-restconf\",\n \"revision\": \"2016-08-15\",\n \"namespace\": \"urn:ietf:params:xml:ns:yang:ietf-restconf\",\n \"conformance-type\": \"implement\"\n }\n ]\n }\n ]\n }\n}" } ] } @@ -397,7 +410,8 @@ "", "var modulesVersion = {", " 'ietf-yang-library':[pm.environment.get('PX_IETF_YANG_LIBRARY_VERSION'), pm.environment.get('PX_IETF_YANG_LIBRARY_NAMESPACE')], ", - " 'ietf-restconf':[pm.environment.get('PX_IETF_RESTCONF_VERSION'), pm.environment.get('PX_IETF_RESTCONF_NAMESPACE')]", + " 'ietf-restconf':[pm.environment.get('PX_IETF_RESTCONF_VERSION'), pm.environment.get('PX_IETF_RESTCONF_NAMESPACE')],", + " 'ietf-network':[pm.environment.get('PX_IETF_NETWORK_VERSION'), pm.environment.get('PX_IETF_NETWORK_NAMESPACE')]", "};", "pm.test(\"Verify that the 'module' array contains all mandatories IETF Yang modules'\", function () {", " pm.expect(moduleList).to.have.property(\"ietf-restconf\");", @@ -407,7 +421,7 @@ " console.info(\"Processing item \", item);", " if (modulesVersion[key] !== undefined) {", " pm.expect(item).to.have.property('revision', modulesVersion[key][0]);", - " pm.expect(item).to.have.property('namespace');", + " pm.expect(item).to.have.property('namespace', modulesVersion[key][1]);", " }", " }; // End of 'for' statement", "});" @@ -467,7 +481,7 @@ }, "response": [ { - "name": "TC_mWT_PNC_RESTCONF_GET_BV_01", + "name": "TC_mWT_PNC_RESTCONF_GET_BV_02", "originalRequest": { "method": "GET", "header": [ @@ -478,15 +492,15 @@ } ], "url": { - "raw": "{{PROTOCOL}}://{{PX_IUT_IP_ADDRESS}}:{{PX_IUT_IP_PORT}}/{{PX_ROOT_API}}/ietf-yang-library:modules-state", - "protocol": "{{PROTOCOL}}", + "raw": "{{PX_PROTOCOL}}://{{PX_IUT_IP_ADDRESS}}:{{PX_IUT_IP_PORT}}/{{PX_ROOT_API}}/ietf-yang-library:yang-library", + "protocol": "{{PX_PROTOCOL}}", "host": [ "{{PX_IUT_IP_ADDRESS}}" ], "port": "{{PX_IUT_IP_PORT}}", "path": [ "{{PX_ROOT_API}}", - "ietf-yang-library:modules-state" + "ietf-yang-library:yang-library" ] } }, @@ -494,13 +508,9 @@ "code": 200, "_postman_previewlanguage": "json", "header": [ - { - "key": "Server", - "value": "nginx/1.13.12" - }, { "key": "Date", - "value": "Mon, 15 Jan 2024 13:05:11 GMT" + "value": "Mon, 08 Jul 2024 06:56:35 GMT" }, { "key": "Content-Type", @@ -515,44 +525,60 @@ "value": "keep-alive" }, { - "key": "Last-Modified", - "value": "Fri, 05 Jan 2024 23:51:47 GMT" + "key": "Cache-Control", + "value": "no-store, no-cache, max-age=0, must-revalidate" }, { "key": "Cache-Control", - "value": "private, no-cache, must-revalidate, proxy-revalidate" + "value": "no-cache" }, { - "key": "Etag", - "value": "\"1704-498707-561003\"" + "key": "Expires", + "value": "Thu, 01 Jan 1970 00:00:00 GMT" }, { "key": "Pragma", "value": "no-cache" }, { - "key": "Content-Security-Policy", - "value": "default-src 'self'; block-all-mixed-content; base-uri 'self'; frame-ancestors 'none';" + "key": "Strict-Transport-Security", + "value": "max-age=0" }, { - "key": "Strict-Transport-Security", - "value": "max-age=15552000; includeSubDomains" + "key": "X-Frame-Options", + "value": "SAMEORIGIN" }, { "key": "X-Content-Type-Options", "value": "nosniff" }, - { - "key": "X-Frame-Options", - "value": "DENY" - }, { "key": "X-XSS-Protection", "value": "1; mode=block" + }, + { + "key": "Content-Security-Policy", + "value": "frame-src * https://10.233.20.198:* https://10.233.31.14:* https://139.178.74.218:* https://139.178.74.219:* https://10.233.13.232:* https://10.233.20.242:*; frame-ancestors 'self' https://10.233.20.198:* https://10.233.31.14:* https://139.178.74.218:* https://139.178.74.219:* https://10.233.13.232:* https://10.233.20.242:*; connect-src 'self' wss://139.178.74.219:* wss://139.178.74.218:* wss://10.233.20.242:* wss://10.233.31.14:* wss://10.233.20.198:* wss://10.233.13.232:* https://10.233.20.198:* https://10.233.31.14:* https://139.178.74.218:* https://139.178.74.219:* https://10.233.13.232:* https://10.233.20.242:*; default-src 'self' data: https://10.233.20.198:* https://10.233.31.14:* https://139.178.74.218:* https://139.178.74.219:* https://10.233.13.232:* https://10.233.20.242:* 'unsafe-inline' ; img-src * data:;" + }, + { + "key": "Set-Cookie", + "value": "NSPOSAPP2_JSESSIONID=17B1C61E6B573FFA8D8406EE03A3D116; Expires=Wed, 07 Aug 2024 06:56:35 GMT; Path=/restconf; Secure; HttpOnly" + }, + { + "key": "total-count", + "value": "0" + }, + { + "key": "start-index", + "value": "0" + }, + { + "key": "end-index", + "value": "-1" } ], "cookie": [], - "body": "{\n \"ietf-yang-library:modules-state\": {\n \"module-set-id\": \"f02b3be052f1d4283e0f6a59f79b6082\",\n \"module\": [\n {\n \"name\": \"cisco-asa-cli\",\n \"revision\": \"\",\n \"schema\": \"https://localhost:443/restconf/tailf/modules/cisco-asa-cli\",\n \"namespace\": \"http://tail-f.com/ns/ned-id/cisco-asa-cli\",\n \"conformance-type\": \"import\"\n },\n {\n \"name\": \"cisco-asa-cli-6.12\",\n \"revision\": \"\",\n \"schema\": \"https://localhost:443/restconf/tailf/modules/cisco-asa-cli-6.12\",\n \"namespace\": \"http://tail-f.com/ns/ned-id/cisco-asa-cli-6.12\",\n \"conformance-type\": \"import\"\n },\n {\n \"name\": \"cisco-ios-cli\",\n \"revision\": \"\",\n \"schema\": \"https://localhost:443/restconf/tailf/modules/cisco-ios-cli\",\n \"namespace\": \"http://tail-f.com/ns/ned-id/cisco-ios-cli\",\n \"conformance-type\": \"import\"\n },\n {\n \"name\": \"cisco-ios-cli-6.67\",\n \"revision\": \"\",\n \"schema\": \"https://localhost:443/restconf/tailf/modules/cisco-ios-cli-6.67\",\n \"namespace\": \"http://tail-f.com/ns/ned-id/cisco-ios-cli-6.67\",\n \"conformance-type\": \"import\"\n },\n {\n \"name\": \"cisco-iosxr-cli\",\n \"revision\": \"\",\n \"schema\": \"https://localhost:443/restconf/tailf/modules/cisco-iosxr-cli\",\n \"namespace\": \"http://tail-f.com/ns/ned-id/cisco-iosxr-cli\",\n \"conformance-type\": \"import\"\n },\n {\n \"name\": \"cisco-iosxr-cli-7.32\",\n \"revision\": \"\",\n \"schema\": \"https://localhost:443/restconf/tailf/modules/cisco-iosxr-cli-7.32\",\n \"namespace\": \"http://tail-f.com/ns/ned-id/cisco-iosxr-cli-7.32\",\n \"conformance-type\": \"import\"\n },\n {\n \"name\": \"cisco-nx-cli\",\n \"revision\": \"\",\n \"schema\": \"https://localhost:443/restconf/tailf/modules/cisco-nx-cli\",\n \"namespace\": \"http://tail-f.com/ns/ned-id/cisco-nx-cli\",\n \"conformance-type\": \"import\"\n },\n {\n \"name\": \"cisco-nx-cli-5.20\",\n \"revision\": \"\",\n \"schema\": \"https://localhost:443/restconf/tailf/modules/cisco-nx-cli-5.20\",\n \"namespace\": \"http://tail-f.com/ns/ned-id/cisco-nx-cli-5.20\",\n \"conformance-type\": \"import\"\n },\n {\n \"name\": \"encryption-usm\",\n \"revision\": \"\",\n \"schema\": \"https://localhost:443/restconf/tailf/modules/encryption-usm\",\n \"namespace\": \"http://tailf.com/ns/encryption-usm\",\n \"conformance-type\": \"implement\"\n },\n {\n \"name\": \"iana-crypt-hash\",\n \"revision\": \"2014-08-06\",\n \"schema\": \"https://localhost:443/restconf/tailf/modules/iana-crypt-hash/2014-08-06\",\n \"namespace\": \"urn:ietf:params:xml:ns:yang:iana-crypt-hash\",\n \"feature\": [\n \"crypt-hash-md5\",\n \"crypt-hash-sha-256\",\n \"crypt-hash-sha-512\"\n ],\n \"conformance-type\": \"implement\"\n },\n {\n \"name\": \"id-allocator\",\n \"revision\": \"2017-08-14\",\n \"schema\": \"https://localhost:443/restconf/tailf/modules/id-allocator/2017-08-14\",\n \"namespace\": \"http://tail-f.com/pkg/id-allocator\",\n \"conformance-type\": \"implement\",\n \"submodule\": [\n {\n \"name\": \"id-allocator-alarms\",\n \"revision\": \"2017-02-09\",\n \"schema\": \"https://localhost:443/restconf/tailf/modules/id-allocator-alarms/2017-02-09\"\n }\n ]\n },\n {\n \"name\": \"id-allocator-oper\",\n \"revision\": \"2015-10-20\",\n \"schema\": \"https://localhost:443/restconf/tailf/modules/id-allocator-oper/2015-10-20\",\n \"namespace\": \"http://tail-f.com/pkg/id-allocator-oper\",\n \"conformance-type\": \"implement\"\n },\n {\n \"name\": \"ietf-datastores\",\n \"revision\": \"2018-02-14\",\n \"schema\": \"https://localhost:443/restconf/tailf/modules/ietf-datastores/2018-02-14\",\n \"namespace\": \"urn:ietf:params:xml:ns:yang:ietf-datastores\",\n \"conformance-type\": \"import\"\n },\n {\n \"name\": \"ietf-inet-types\",\n \"revision\": \"2013-07-15\",\n \"schema\": \"https://localhost:443/restconf/tailf/modules/ietf-inet-types/2013-07-15\",\n \"namespace\": \"urn:ietf:params:xml:ns:yang:ietf-inet-types\",\n \"conformance-type\": \"import\"\n },\n {\n \"name\": \"ietf-interfaces\",\n \"revision\": \"2018-02-20\",\n \"schema\": \"https://localhost:443/restconf/tailf/modules/ietf-interfaces/2018-02-20\",\n \"namespace\": \"urn:ietf:params:xml:ns:yang:ietf-interfaces\",\n \"feature\": [\n \"arbitrary-names\",\n \"if-mib\",\n \"pre-provisioning\"\n ],\n \"conformance-type\": \"import\"\n },\n {\n \"name\": \"ietf-ip\",\n \"revision\": \"2018-02-22\",\n \"schema\": \"https://localhost:443/restconf/tailf/modules/ietf-ip/2018-02-22\",\n \"namespace\": \"urn:ietf:params:xml:ns:yang:ietf-ip\",\n \"feature\": [\n \"ipv4-non-contiguous-netmasks\",\n \"ipv6-privacy-autoconf\"\n ],\n \"conformance-type\": \"import\"\n },\n {\n \"name\": \"ietf-netconf-acm\",\n \"revision\": \"2018-02-14\",\n \"schema\": \"https://localhost:443/restconf/tailf/modules/ietf-netconf-acm/2018-02-14\",\n \"namespace\": \"urn:ietf:params:xml:ns:yang:ietf-netconf-acm\",\n \"conformance-type\": \"implement\"\n },\n {\n \"name\": \"ietf-netconf-monitoring\",\n \"revision\": \"2010-10-04\",\n \"schema\": \"https://localhost:443/restconf/tailf/modules/ietf-netconf-monitoring/2010-10-04\",\n \"namespace\": \"urn:ietf:params:xml:ns:yang:ietf-netconf-monitoring\",\n \"conformance-type\": \"implement\"\n },\n {\n \"name\": \"ietf-netconf-notifications\",\n \"revision\": \"2012-02-06\",\n \"schema\": \"https://localhost:443/restconf/tailf/modules/ietf-netconf-notifications/2012-02-06\",\n \"namespace\": \"urn:ietf:params:xml:ns:yang:ietf-netconf-notifications\",\n \"conformance-type\": \"implement\"\n },\n {\n \"name\": \"ietf-network-instance\",\n \"revision\": \"2019-01-21\",\n \"schema\": \"https://localhost:443/restconf/tailf/modules/ietf-network-instance/2019-01-21\",\n \"namespace\": \"urn:ietf:params:xml:ns:yang:ietf-network-instance\",\n \"conformance-type\": \"import\"\n },\n {\n \"name\": \"ietf-origin\",\n \"revision\": \"2018-02-14\",\n \"schema\": \"https://localhost:443/restconf/tailf/modules/ietf-origin/2018-02-14\",\n \"namespace\": \"urn:ietf:params:xml:ns:yang:ietf-origin\",\n \"conformance-type\": \"import\"\n },\n {\n \"name\": \"ietf-restconf\",\n \"revision\": \"2017-01-26\",\n \"schema\": \"https://localhost:443/restconf/tailf/modules/ietf-restconf/2017-01-26\",\n \"namespace\": \"urn:ietf:params:xml:ns:yang:ietf-restconf\",\n \"conformance-type\": \"implement\"\n },\n {\n \"name\": \"ietf-restconf-monitoring\",\n \"revision\": \"2017-01-26\",\n \"schema\": \"https://localhost:443/restconf/tailf/modules/ietf-restconf-monitoring/2017-01-26\",\n \"namespace\": \"urn:ietf:params:xml:ns:yang:ietf-restconf-monitoring\",\n \"conformance-type\": \"implement\"\n },\n {\n \"name\": \"ietf-x509-cert-to-name\",\n \"revision\": \"2014-12-10\",\n \"schema\": \"https://localhost:443/restconf/tailf/modules/ietf-x509-cert-to-name/2014-12-10\",\n \"namespace\": \"urn:ietf:params:xml:ns:yang:ietf-x509-cert-to-name\",\n \"conformance-type\": \"import\"\n },\n {\n \"name\": \"ietf-yang-library\",\n \"revision\": \"2019-01-04\",\n \"schema\": \"https://localhost:443/restconf/tailf/modules/ietf-yang-library/2019-01-04\",\n \"namespace\": \"urn:ietf:params:xml:ns:yang:ietf-yang-library\",\n \"conformance-type\": \"implement\"\n },\n {\n \"name\": \"ietf-yang-patch\",\n \"revision\": \"2017-02-22\",\n \"schema\": \"https://localhost:443/restconf/tailf/modules/ietf-yang-patch/2017-02-22\",\n \"namespace\": \"urn:ietf:params:xml:ns:yang:ietf-yang-patch\",\n \"conformance-type\": \"implement\"\n },\n {\n \"name\": \"ietf-yang-schema-mount\",\n \"revision\": \"2019-01-14\",\n \"schema\": \"https://localhost:443/restconf/tailf/modules/ietf-yang-schema-mount/2019-01-14\",\n \"namespace\": \"urn:ietf:params:xml:ns:yang:ietf-yang-schema-mount\",\n \"conformance-type\": \"implement\"\n },\n {\n \"name\": \"ietf-yang-smiv2\",\n \"revision\": \"2012-06-22\",\n \"schema\": \"https://localhost:443/restconf/tailf/modules/ietf-yang-smiv2/2012-06-22\",\n \"namespace\": \"urn:ietf:params:xml:ns:yang:ietf-yang-smiv2\",\n \"conformance-type\": \"import\"\n },\n {\n \"name\": \"ietf-yang-types\",\n \"revision\": \"2013-07-15\",\n \"schema\": \"https://localhost:443/restconf/tailf/modules/ietf-yang-types/2013-07-15\",\n \"namespace\": \"urn:ietf:params:xml:ns:yang:ietf-yang-types\",\n \"conformance-type\": \"import\"\n },\n {\n \"name\": \"ipaddress-allocator\",\n \"revision\": \"2018-02-27\",\n \"schema\": \"https://localhost:443/restconf/tailf/modules/ipaddress-allocator/2018-02-27\",\n \"namespace\": \"http://tail-f.com/pkg/ipaddress-allocator\",\n \"conformance-type\": \"implement\",\n \"submodule\": [\n {\n \"name\": \"ipaddress-allocator-alarms\",\n \"revision\": \"2017-02-09\",\n \"schema\": \"https://localhost:443/restconf/tailf/modules/ipaddress-allocator-alarms/2017-02-09\"\n }\n ]\n },\n {\n \"name\": \"ipaddress-allocator-oper\",\n \"revision\": \"2015-10-20\",\n \"schema\": \"https://localhost:443/restconf/tailf/modules/ipaddress-allocator-oper/2015-10-20\",\n \"namespace\": \"http://tail-f.com/pkg/ipaddress-allocator-oper\",\n \"conformance-type\": \"implement\"\n },\n {\n \"name\": \"resource-allocator\",\n \"revision\": \"2020-07-29\",\n \"schema\": \"https://localhost:443/restconf/tailf/modules/resource-allocator/2020-07-29\",\n \"namespace\": \"http://tail-f.com/pkg/resource-allocator\",\n \"conformance-type\": \"implement\"\n },\n {\n \"name\": \"selftest\",\n \"revision\": \"2016-12-05\",\n \"schema\": \"https://localhost:443/restconf/tailf/modules/selftest/2016-12-05\",\n \"namespace\": \"http://cisco.com/self-test-action\",\n \"conformance-type\": \"implement\"\n },\n {\n \"name\": \"snmp\",\n \"revision\": \"2010-10-22\",\n \"schema\": \"https://localhost:443/restconf/tailf/modules/snmp/2010-10-22\",\n \"namespace\": \"http://tailf.com/ns/snmp\",\n \"conformance-type\": \"implement\",\n \"submodule\": [\n {\n \"name\": \"snmp-agent\",\n \"revision\": \"\",\n \"schema\": \"https://localhost:443/restconf/tailf/modules/snmp-agent\"\n },\n {\n \"name\": \"snmp-common\",\n \"revision\": \"\",\n \"schema\": \"https://localhost:443/restconf/tailf/modules/snmp-common\"\n },\n {\n \"name\": \"snmp-community\",\n \"revision\": \"\",\n \"schema\": \"https://localhost:443/restconf/tailf/modules/snmp-community\"\n },\n {\n \"name\": \"snmp-notification\",\n \"revision\": \"\",\n \"schema\": \"https://localhost:443/restconf/tailf/modules/snmp-notification\"\n },\n {\n \"name\": \"snmp-target\",\n \"revision\": \"\",\n \"schema\": \"https://localhost:443/restconf/tailf/modules/snmp-target\"\n },\n {\n \"name\": \"snmp-target-params\",\n \"revision\": \"\",\n \"schema\": \"https://localhost:443/restconf/tailf/modules/snmp-target-params\"\n },\n {\n \"name\": \"snmp-usm\",\n \"revision\": \"\",\n \"schema\": \"https://localhost:443/restconf/tailf/modules/snmp-usm\"\n },\n {\n \"name\": \"snmp-vacm\",\n \"revision\": \"\",\n \"schema\": \"https://localhost:443/restconf/tailf/modules/snmp-vacm\"\n }\n ]\n },\n {\n \"name\": \"svi_verify_example\",\n \"revision\": \"2016-01-01\",\n \"schema\": \"https://localhost:443/restconf/tailf/modules/svi_verify_example/2016-01-01\",\n \"namespace\": \"http://example.com/svi_verify_example\",\n \"conformance-type\": \"implement\"\n },\n {\n \"name\": \"tailf-aaa\",\n \"revision\": \"2018-09-12\",\n \"schema\": \"https://localhost:443/restconf/tailf/modules/tailf-aaa/2018-09-12\",\n \"namespace\": \"http://tail-f.com/ns/aaa/1.1\",\n \"conformance-type\": \"implement\"\n },\n {\n \"name\": \"tailf-acm\",\n \"revision\": \"2013-03-07\",\n \"schema\": \"https://localhost:443/restconf/tailf/modules/tailf-acm/2013-03-07\",\n \"namespace\": \"http://tail-f.com/yang/acm\",\n \"conformance-type\": \"implement\"\n },\n {\n \"name\": \"tailf-common\",\n \"revision\": \"2020-12-08\",\n \"schema\": \"https://localhost:443/restconf/tailf/modules/tailf-common/2020-12-08\",\n \"namespace\": \"http://tail-f.com/yang/common\",\n \"conformance-type\": \"import\",\n \"submodule\": [\n {\n \"name\": \"tailf-cli-extensions\",\n \"revision\": \"2020-04-17\",\n \"schema\": \"https://localhost:443/restconf/tailf/modules/tailf-cli-extensions/2020-04-17\"\n },\n {\n \"name\": \"tailf-meta-extensions\",\n \"revision\": \"2017-03-08\",\n \"schema\": \"https://localhost:443/restconf/tailf/modules/tailf-meta-extensions/2017-03-08\"\n }\n ]\n },\n {\n \"name\": \"tailf-common-monitoring\",\n \"revision\": \"2019-04-09\",\n \"schema\": \"https://localhost:443/restconf/tailf/modules/tailf-common-monitoring/2019-04-09\",\n \"namespace\": \"http://tail-f.com/yang/common-monitoring\",\n \"conformance-type\": \"import\"\n },\n {\n \"name\": \"tailf-common-query\",\n \"revision\": \"2017-12-15\",\n \"schema\": \"https://localhost:443/restconf/tailf/modules/tailf-common-query/2017-12-15\",\n \"namespace\": \"http://tail-f.com/ns/common/query\",\n \"conformance-type\": \"import\"\n },\n {\n \"name\": \"tailf-configuration-policy\",\n \"revision\": \"2010-11-04\",\n \"schema\": \"https://localhost:443/restconf/tailf/modules/tailf-configuration-policy/2010-11-04\",\n \"namespace\": \"http://tail-f.com/yang/configuration-policy\",\n \"conformance-type\": \"implement\"\n },\n {\n \"name\": \"tailf-kicker\",\n \"revision\": \"2017-09-28\",\n \"schema\": \"https://localhost:443/restconf/tailf/modules/tailf-kicker/2017-09-28\",\n \"namespace\": \"http://tail-f.com/ns/kicker\",\n \"conformance-type\": \"implement\"\n },\n {\n \"name\": \"tailf-last-login\",\n \"revision\": \"2019-11-21\",\n \"schema\": \"https://localhost:443/restconf/tailf/modules/tailf-last-login/2019-11-21\",\n \"namespace\": \"http://tail-f.com/yang/last-login\",\n \"conformance-type\": \"implement\"\n },\n {\n \"name\": \"tailf-ncs\",\n \"revision\": \"2021-03-09\",\n \"schema\": \"https://localhost:443/restconf/tailf/modules/tailf-ncs/2021-03-09\",\n \"namespace\": \"http://tail-f.com/ns/ncs\",\n \"conformance-type\": \"implement\",\n \"submodule\": [\n {\n \"name\": \"tailf-ncs-cluster\",\n \"revision\": \"2019-11-28\",\n \"schema\": \"https://localhost:443/restconf/tailf/modules/tailf-ncs-cluster/2019-11-28\"\n },\n {\n \"name\": \"tailf-ncs-common\",\n \"revision\": \"2019-11-28\",\n \"schema\": \"https://localhost:443/restconf/tailf/modules/tailf-ncs-common/2019-11-28\"\n },\n {\n \"name\": \"tailf-ncs-compliance\",\n \"revision\": \"2016-05-26\",\n \"schema\": \"https://localhost:443/restconf/tailf/modules/tailf-ncs-compliance/2016-05-26\"\n },\n {\n \"name\": \"tailf-ncs-customers\",\n \"revision\": \"2012-08-30\",\n \"schema\": \"https://localhost:443/restconf/tailf/modules/tailf-ncs-customers/2012-08-30\"\n },\n {\n \"name\": \"tailf-ncs-devices\",\n \"revision\": \"2020-12-08\",\n \"schema\": \"https://localhost:443/restconf/tailf/modules/tailf-ncs-devices/2020-12-08\"\n },\n {\n \"name\": \"tailf-ncs-high-availability\",\n \"revision\": \"2020-06-25\",\n \"schema\": \"https://localhost:443/restconf/tailf/modules/tailf-ncs-high-availability/2020-06-25\"\n },\n {\n \"name\": \"tailf-ncs-java-vm\",\n \"revision\": \"2019-11-28\",\n \"schema\": \"https://localhost:443/restconf/tailf/modules/tailf-ncs-java-vm/2019-11-28\"\n },\n {\n \"name\": \"tailf-ncs-log\",\n \"revision\": \"2019-04-09\",\n \"schema\": \"https://localhost:443/restconf/tailf/modules/tailf-ncs-log/2019-04-09\"\n },\n {\n \"name\": \"tailf-ncs-packages\",\n \"revision\": \"2020-06-25\",\n \"schema\": \"https://localhost:443/restconf/tailf/modules/tailf-ncs-packages/2020-06-25\"\n },\n {\n \"name\": \"tailf-ncs-plan\",\n \"revision\": \"2020-12-08\",\n \"schema\": \"https://localhost:443/restconf/tailf/modules/tailf-ncs-plan/2020-12-08\"\n },\n {\n \"name\": \"tailf-ncs-python-vm\",\n \"revision\": \"2019-04-09\",\n \"schema\": \"https://localhost:443/restconf/tailf/modules/tailf-ncs-python-vm/2019-04-09\"\n },\n {\n \"name\": \"tailf-ncs-service-progress-monitoring\",\n \"revision\": \"2018-06-01\",\n \"schema\": \"https://localhost:443/restconf/tailf/modules/tailf-ncs-service-progress-monitoring/2018-06-01\"\n },\n {\n \"name\": \"tailf-ncs-services\",\n \"revision\": \"2020-12-08\",\n \"schema\": \"https://localhost:443/restconf/tailf/modules/tailf-ncs-services/2020-12-08\"\n },\n {\n \"name\": \"tailf-ncs-smart-license\",\n \"revision\": \"2020-06-25\",\n \"schema\": \"https://localhost:443/restconf/tailf/modules/tailf-ncs-smart-license/2020-06-25\"\n },\n {\n \"name\": \"tailf-ncs-snmp-notification-receiver\",\n \"revision\": \"2012-08-30\",\n \"schema\": \"https://localhost:443/restconf/tailf/modules/tailf-ncs-snmp-notification-receiver/2012-08-30\"\n },\n {\n \"name\": \"tailf-ncs-software\",\n \"revision\": \"2021-03-09\",\n \"schema\": \"https://localhost:443/restconf/tailf/modules/tailf-ncs-software/2021-03-09\"\n },\n {\n \"name\": \"tailf-ncs-ssh\",\n \"revision\": \"2019-11-28\",\n \"schema\": \"https://localhost:443/restconf/tailf/modules/tailf-ncs-ssh/2019-11-28\"\n }\n ]\n },\n {\n \"name\": \"tailf-ncs-acm\",\n \"revision\": \"2019-11-28\",\n \"schema\": \"https://localhost:443/restconf/tailf/modules/tailf-ncs-acm/2019-11-28\",\n \"namespace\": \"http://tail-f.com/yang/ncs-acm\",\n \"conformance-type\": \"implement\"\n },\n {\n \"name\": \"tailf-ncs-alarms\",\n \"revision\": \"2020-06-25\",\n \"schema\": \"https://localhost:443/restconf/tailf/modules/tailf-ncs-alarms/2020-06-25\",\n \"namespace\": \"http://tail-f.com/ns/ncs-alarms\",\n \"conformance-type\": \"implement\"\n },\n {\n \"name\": \"tailf-ncs-devices-yang-library\",\n \"revision\": \"2019-11-28\",\n \"schema\": \"https://localhost:443/restconf/tailf/modules/tailf-ncs-devices-yang-library/2019-11-28\",\n \"namespace\": \"http://tail-f.com/ns/ncs/devices-yang-library\",\n \"conformance-type\": \"implement\"\n },\n {\n \"name\": \"tailf-ncs-kicker-extension\",\n \"revision\": \"2019-04-09\",\n \"schema\": \"https://localhost:443/restconf/tailf/modules/tailf-ncs-kicker-extension/2019-04-09\",\n \"namespace\": \"http://tail-f.com/ns/ncs-kicker\",\n \"conformance-type\": \"implement\"\n },\n {\n \"name\": \"tailf-ncs-monitoring\",\n \"revision\": \"2019-04-09\",\n \"schema\": \"https://localhost:443/restconf/tailf/modules/tailf-ncs-monitoring/2019-04-09\",\n \"namespace\": \"http://tail-f.com/yang/ncs-monitoring\",\n \"conformance-type\": \"implement\"\n },\n {\n \"name\": \"tailf-ncs-ned\",\n \"revision\": \"2019-04-09\",\n \"schema\": \"https://localhost:443/restconf/tailf/modules/tailf-ncs-ned/2019-04-09\",\n \"namespace\": \"http://tail-f.com/ns/ncs-ned\",\n \"conformance-type\": \"import\"\n },\n {\n \"name\": \"tailf-ncs-netconf-ned-builder\",\n \"revision\": \"2020-06-25\",\n \"schema\": \"https://localhost:443/restconf/tailf/modules/tailf-ncs-netconf-ned-builder/2020-06-25\",\n \"namespace\": \"http://tail-f.com/ns/ncs/netconf-ned-builder\",\n \"conformance-type\": \"implement\"\n },\n {\n \"name\": \"tailf-ncs-progress\",\n \"revision\": \"2020-06-25\",\n \"schema\": \"https://localhost:443/restconf/tailf/modules/tailf-ncs-progress/2020-06-25\",\n \"namespace\": \"http://tail-f.com/ns/ncs-progress\",\n \"conformance-type\": \"implement\"\n },\n {\n \"name\": \"tailf-ncs-scheduler\",\n \"revision\": \"2020-12-08\",\n \"schema\": \"https://localhost:443/restconf/tailf/modules/tailf-ncs-scheduler/2020-12-08\",\n \"namespace\": \"http://tail-f.com/ns/ncs-scheduler\",\n \"conformance-type\": \"implement\"\n },\n {\n \"name\": \"tailf-ncs-snmp\",\n \"revision\": \"2017-03-16\",\n \"schema\": \"https://localhost:443/restconf/tailf/modules/tailf-ncs-snmp/2017-03-16\",\n \"namespace\": \"http://tail-f.com/ns/ncs-snmp\",\n \"conformance-type\": \"implement\"\n },\n {\n \"name\": \"tailf-ncs-webui\",\n \"revision\": \"2013-01-16\",\n \"schema\": \"https://localhost:443/restconf/tailf/modules/tailf-ncs-webui/2013-01-16\",\n \"namespace\": \"http://tail-f.com/ns/ncs-webui\",\n \"conformance-type\": \"implement\"\n },\n {\n \"name\": \"tailf-ned-cisco-asa-meta\",\n \"revision\": \"2020-11-27\",\n \"schema\": \"https://localhost:443/restconf/tailf/modules/tailf-ned-cisco-asa-meta/2020-11-27\",\n \"namespace\": \"http://cisco.com/ned/asa-meta\",\n \"conformance-type\": \"implement\"\n },\n {\n \"name\": \"tailf-ned-cisco-ios-meta\",\n \"revision\": \"2020-12-04\",\n \"schema\": \"https://localhost:443/restconf/tailf/modules/tailf-ned-cisco-ios-meta/2020-12-04\",\n \"namespace\": \"urn:ios-meta\",\n \"conformance-type\": \"implement\"\n },\n {\n \"name\": \"tailf-ned-cisco-ios-oper\",\n \"revision\": \"2020-12-04\",\n \"schema\": \"https://localhost:443/restconf/tailf/modules/tailf-ned-cisco-ios-oper/2020-12-04\",\n \"namespace\": \"http://tail-f.com/ned/cisco-ios/oper\",\n \"conformance-type\": \"implement\"\n },\n {\n \"name\": \"tailf-ned-cisco-ios-xr-meta\",\n \"revision\": \"2020-12-04\",\n \"schema\": \"https://localhost:443/restconf/tailf/modules/tailf-ned-cisco-ios-xr-meta/2020-12-04\",\n \"namespace\": \"http://tail-f.com/ned/cisco-iosxr/meta\",\n \"conformance-type\": \"implement\"\n },\n {\n \"name\": \"tailf-ned-cisco-ios-xr-oper\",\n \"revision\": \"2020-12-04\",\n \"schema\": \"https://localhost:443/restconf/tailf/modules/tailf-ned-cisco-ios-xr-oper/2020-12-04\",\n \"namespace\": \"http://tail-f.com/ned/cisco-iosxr/oper\",\n \"conformance-type\": \"implement\"\n },\n {\n \"name\": \"tailf-ned-cisco-nx-meta\",\n \"revision\": \"2020-12-08\",\n \"schema\": \"https://localhost:443/restconf/tailf/modules/tailf-ned-cisco-nx-meta/2020-12-08\",\n \"namespace\": \"http://tail-f.com/ned/cisco-nx/meta\",\n \"conformance-type\": \"implement\"\n },\n {\n \"name\": \"tailf-ned-cisco-nx-oper\",\n \"revision\": \"2020-12-08\",\n \"schema\": \"https://localhost:443/restconf/tailf/modules/tailf-ned-cisco-nx-oper/2020-12-08\",\n \"namespace\": \"http://tail-f.com/ned/cisco-nx/oper\",\n \"conformance-type\": \"implement\"\n },\n {\n \"name\": \"tailf-ned-loginscripts\",\n \"revision\": \"\",\n \"schema\": \"https://localhost:443/restconf/tailf/modules/tailf-ned-loginscripts\",\n \"namespace\": \"http://tail-f.com/ned/ned-loginscripts\",\n \"conformance-type\": \"implement\"\n },\n {\n \"name\": \"tailf-ned-secrets\",\n \"revision\": \"2019-04-17\",\n \"schema\": \"https://localhost:443/restconf/tailf/modules/tailf-ned-secrets/2019-04-17\",\n \"namespace\": \"http://tail-f.com/ned/ned-secrets\",\n \"conformance-type\": \"implement\"\n },\n {\n \"name\": \"tailf-netconf-monitoring\",\n \"revision\": \"2019-03-28\",\n \"schema\": \"https://localhost:443/restconf/tailf/modules/tailf-netconf-monitoring/2019-03-28\",\n \"namespace\": \"http://tail-f.com/yang/netconf-monitoring\",\n \"conformance-type\": \"implement\"\n },\n {\n \"name\": \"tailf-progress\",\n \"revision\": \"2020-06-25\",\n \"schema\": \"https://localhost:443/restconf/tailf/modules/tailf-progress/2020-06-25\",\n \"namespace\": \"http://tail-f.com/ns/progress\",\n \"conformance-type\": \"implement\"\n },\n {\n \"name\": \"tailf-rest-query\",\n \"revision\": \"2017-01-06\",\n \"schema\": \"https://localhost:443/restconf/tailf/modules/tailf-rest-query/2017-01-06\",\n \"namespace\": \"http://tail-f.com/ns/tailf-rest-query\",\n \"conformance-type\": \"implement\"\n },\n {\n \"name\": \"tailf-restconf-ncs\",\n \"revision\": \"2020-06-25\",\n \"schema\": \"https://localhost:443/restconf/tailf/modules/tailf-restconf-ncs/2020-06-25\",\n \"namespace\": \"http://tail-f.com/ns/restconf/ncs\",\n \"conformance-type\": \"implement\"\n },\n {\n \"name\": \"tailf-rollback\",\n \"revision\": \"2020-06-25\",\n \"schema\": \"https://localhost:443/restconf/tailf/modules/tailf-rollback/2020-06-25\",\n \"namespace\": \"http://tail-f.com/ns/rollback\",\n \"conformance-type\": \"implement\"\n },\n {\n \"name\": \"tailf-tls\",\n \"revision\": \"2019-06-13\",\n \"schema\": \"https://localhost:443/restconf/tailf/modules/tailf-tls/2019-06-13\",\n \"namespace\": \"http://tail-f.com/ns/tls\",\n \"conformance-type\": \"implement\"\n },\n {\n \"name\": \"tailf-webui\",\n \"revision\": \"2013-03-07\",\n \"schema\": \"https://localhost:443/restconf/tailf/modules/tailf-webui/2013-03-07\",\n \"namespace\": \"http://tail-f.com/ns/webui\",\n \"conformance-type\": \"implement\"\n },\n {\n \"name\": \"tailf-webui-one\",\n \"revision\": \"2019-06-27\",\n \"schema\": \"https://localhost:443/restconf/tailf/modules/tailf-webui-one/2019-06-27\",\n \"namespace\": \"http://tail-f.com/ns/webui-one\",\n \"conformance-type\": \"implement\"\n },\n {\n \"name\": \"tailf-xsd-types\",\n \"revision\": \"2017-11-20\",\n \"schema\": \"https://localhost:443/restconf/tailf/modules/tailf-xsd-types/2017-11-20\",\n \"namespace\": \"http://tail-f.com/yang/xsd-types\",\n \"conformance-type\": \"import\"\n }\n ]\n }\n}" + "body": "{\n \"ietf-yang-library:yang-library\": {\n \"content-id\": \"NSP-2019-05-20\",\n \"module-set\": [\n {\n \"name\": \"NSP-MDC-2019-05-20\",\n \"module\": [\n {\n \"name\": \"network-device-mgr\",\n \"revision\": \"2018-06-06\",\n \"namespace\": \"urn:nokia:nsp:mdm:network-device-mgr\",\n \"conformance-type\": \"implement\"\n },\n {\n \"name\": \"ietf-yang-library\",\n \"revision\": \"2019-01-04\",\n \"namespace\": \"urn:ietf:params:xml:ns:yang:ietf-yang-library\",\n \"conformance-type\": \"implement\"\n },\n {\n \"name\": \"ietf-yang-schema-mount\",\n \"revision\": \"2017-10-09\",\n \"namespace\": \"urn:ietf:params:xml:ns:yang:ietf-yang-schema-mount\",\n \"conformance-type\": \"implement\"\n },\n {\n \"name\": \"ietf-restconf\",\n \"revision\": \"2016-08-15\",\n \"namespace\": \"urn:ietf:params:xml:ns:yang:ietf-restconf\",\n \"conformance-type\": \"implement\"\n }\n ]\n }\n ]\n }\n}" } ] } @@ -606,25 +632,31 @@ "});\r", "\r", "var modulesVersion = {\r", - " 'ietf-network':[pm.environment.get('PX_IETF_YANG_LIBRARY_VERSION'), pm.environment.get('PX_IETF_YANG_LIBRARY_NAMESPACE')], \r", - " 'ietf-network-topology':[pm.environment.get('PX_IETF_RESTCONF_VERSION'), pm.environment.get('PX_IETF_RESTCONF_NAMESPACE')],\r", - " 'ietf-microwave-topology':[pm.environment.get('PX_IETF_RESTCONF_VERSION'), pm.environment.get('PX_IETF_RESTCONF_NAMESPACE')],\r", - " 'ietf-eth-te-topology':[pm.environment.get('PX_IETF_RESTCONF_VERSION'), pm.environment.get('PX_IETF_RESTCONF_NAMESPACE')],\r", - " 'ietf-eth-tran-service':[pm.environment.get('PX_IETF_RESTCONF_VERSION'), pm.environment.get('PX_IETF_RESTCONF_NAMESPACE')],\r", - " 'ietf-eth-tran-types':[pm.environment.get('PX_IETF_RESTCONF_VERSION'), pm.environment.get('PX_IETF_RESTCONF_NAMESPACE')]\r", + " 'ietf-network-topology':[pm.environment.get('PX_IETF_NETWORK_TOPOLOGY_VERSION'), pm.environment.get('PX_IETF_NETWORK_TOPOLOGY_NAMESPACE')],\r", + " 'ietf-te-topology':[pm.environment.get('PX_IETF_TE_TOPOLOGY_VERSION'), pm.environment.get('PX_IETF_TE_TOPOLOGY_NAMESPACE')],\r", + " 'ietf-eth-te-topology':[pm.environment.get('PX_IETF_ETH_TE_TOPOLOGY_VERSION'), pm.environment.get('PX_IETF_ETH_TE_TOPOLOGY_NAMESPACE')],\r", + " 'ietf-microwave-topology':[pm.environment.get('PX_IETF_MW_TOPOLOGY_VERSION'), pm.environment.get('PX_IETF_MW_TOPOLOGY_NAMESPACE')],\r", + " 'ietf-eth-tran-service':[pm.environment.get('PX_IETF_ETH_TRAN_SVC_VERSION'), pm.environment.get('PX_IETF_ETH_TRAN_SVC_NAMESPACE')],\r", + " 'ietf-eth-tran-types':[pm.environment.get('PX_IETF_ETH_TRAN_TYPES_VERSION'), pm.environment.get('PX_IETF_ETH_TRAN_TYPES_NAMESPACE')]\r", "};\r", "\r", "pm.test(\"Verify that the 'module' array contains all mandatories IETF Yang modules'\", function () {\r", " pm.expect(moduleList).to.have.property(\"ietf-restconf\");\r", - " pm.expect(moduleList).to.have.property(\"ietf-yang-library\"); \r", + " pm.expect(moduleList).to.have.property(\"ietf-yang-library\");\r", + " var counter = 0\r", " for (var key in moduleList) {\r", " var item = moduleList[key];\r", " console.info(\"Processing item \", item);\r", " if (modulesVersion[key] !== undefined) {\r", " pm.expect(item).to.have.property('revision', modulesVersion[key][0]);\r", - " pm.expect(item).to.have.property('namespace');\r", + " pm.expect(item).to.have.property('namespace', modulesVersion[key][1]);\r", + " counter += 1\r", " }\r", " }; // End of 'for' statement\r", + "\r", + " if (counter !== modulesVersion.length) {\r", + " throw new Error('Mandatories modules are missing');\r", + " }\r", "});" ], "type": "text/javascript", @@ -648,16 +680,11 @@ ], "request": { "auth": { - "type": "basic", - "basic": [ - { - "key": "password", - "value": "Services4Ever", - "type": "string" - }, + "type": "bearer", + "bearer": [ { - "key": "username", - "value": "developer", + "key": "token", + "value": "{{PX_ACCESS_TOKEN}}", "type": "string" } ] @@ -684,7 +711,108 @@ }, "description": "/restconf/data/ietf-yang-library:modules-state" }, - "response": [] + "response": [ + { + "name": "TC_mWT_PNC_RESTCONF_GET_BV_03", + "originalRequest": { + "method": "GET", + "header": [ + { + "key": "Accept", + "value": "application/yang-data+json", + "type": "text" + } + ], + "url": { + "raw": "{{PX_PROTOCOL}}://{{PX_IUT_IP_ADDRESS}}:{{PX_IUT_IP_PORT}}/{{PX_ROOT_API}}/ietf-yang-library:yang-library", + "protocol": "{{PX_PROTOCOL}}", + "host": [ + "{{PX_IUT_IP_ADDRESS}}" + ], + "port": "{{PX_IUT_IP_PORT}}", + "path": [ + "{{PX_ROOT_API}}", + "ietf-yang-library:yang-library" + ] + } + }, + "status": "OK", + "code": 200, + "_postman_previewlanguage": "json", + "header": [ + { + "key": "Date", + "value": "Mon, 08 Jul 2024 06:57:08 GMT" + }, + { + "key": "Content-Type", + "value": "application/yang-data+json" + }, + { + "key": "Transfer-Encoding", + "value": "chunked" + }, + { + "key": "Connection", + "value": "keep-alive" + }, + { + "key": "Cache-Control", + "value": "no-store, no-cache, max-age=0, must-revalidate" + }, + { + "key": "Cache-Control", + "value": "no-cache" + }, + { + "key": "Expires", + "value": "Thu, 01 Jan 1970 00:00:00 GMT" + }, + { + "key": "Pragma", + "value": "no-cache" + }, + { + "key": "Strict-Transport-Security", + "value": "max-age=0" + }, + { + "key": "X-Frame-Options", + "value": "SAMEORIGIN" + }, + { + "key": "X-Content-Type-Options", + "value": "nosniff" + }, + { + "key": "X-XSS-Protection", + "value": "1; mode=block" + }, + { + "key": "Content-Security-Policy", + "value": "frame-src * https://10.233.20.198:* https://10.233.31.14:* https://139.178.74.218:* https://139.178.74.219:* https://10.233.13.232:* https://10.233.20.242:*; frame-ancestors 'self' https://10.233.20.198:* https://10.233.31.14:* https://139.178.74.218:* https://139.178.74.219:* https://10.233.13.232:* https://10.233.20.242:*; connect-src 'self' wss://139.178.74.219:* wss://139.178.74.218:* wss://10.233.20.242:* wss://10.233.31.14:* wss://10.233.20.198:* wss://10.233.13.232:* https://10.233.20.198:* https://10.233.31.14:* https://139.178.74.218:* https://139.178.74.219:* https://10.233.13.232:* https://10.233.20.242:*; default-src 'self' data: https://10.233.20.198:* https://10.233.31.14:* https://139.178.74.218:* https://139.178.74.219:* https://10.233.13.232:* https://10.233.20.242:* 'unsafe-inline' ; img-src * data:;" + }, + { + "key": "Set-Cookie", + "value": "NSPOSAPP2_JSESSIONID=7F3F9CD1A85087309F705C1ACE2A16CF; Expires=Wed, 07 Aug 2024 06:57:08 GMT; Path=/restconf; Secure; HttpOnly" + }, + { + "key": "total-count", + "value": "0" + }, + { + "key": "start-index", + "value": "0" + }, + { + "key": "end-index", + "value": "-1" + } + ], + "cookie": [], + "body": "{\n \"ietf-yang-library:yang-library\": {\n \"content-id\": \"NSP-2019-05-20\",\n \"module-set\": [\n {\n \"name\": \"NSP-MDC-2019-05-20\",\n \"module\": [\n {\n \"name\": \"network-device-mgr\",\n \"revision\": \"2018-06-06\",\n \"namespace\": \"urn:nokia:nsp:mdm:network-device-mgr\",\n \"conformance-type\": \"implement\"\n },\n {\n \"name\": \"ietf-yang-library\",\n \"revision\": \"2019-01-04\",\n \"namespace\": \"urn:ietf:params:xml:ns:yang:ietf-yang-library\",\n \"conformance-type\": \"implement\"\n },\n {\n \"name\": \"ietf-yang-schema-mount\",\n \"revision\": \"2017-10-09\",\n \"namespace\": \"urn:ietf:params:xml:ns:yang:ietf-yang-schema-mount\",\n \"conformance-type\": \"implement\"\n },\n {\n \"name\": \"ietf-restconf\",\n \"revision\": \"2016-08-15\",\n \"namespace\": \"urn:ietf:params:xml:ns:yang:ietf-restconf\",\n \"conformance-type\": \"implement\"\n }\n ]\n }\n ]\n }\n}" + } + ] } ], "description": "Test objective\n\n- \"Verify that the IUT provides the list of supported mWT GS 024 YANG data models.\"\n \n\nReference\n\n- \"ETSI GS mWT 024 Clause 5.2.2.2 Common YANG data models\",\n \n- \"ETSI GS mWT 024 Clause 5.2.2.3 YANG Data Models at the Microwave MPI\",\n \n- \"ETSI GS mWT 024 Clause 5.2.2.4 Hierarchical relationship among YANG data models\"EndFragment\n \n\nPICS Selection IUT_PNC and RESTCONF and SEC_TLS" @@ -708,37 +836,104 @@ " pm.response.to.have.status(200);\r", "});\r", "\r", - "var responseData = '';\r", - "var topLevelPropertyName = '';\r", + "var responseJson = pm.response.json();\r", + "var networkList = null;\r", + "var eth = null;\r", + "var mw = null\r", "\r", - "pm.test(\"Verify that headers.Content-Type is 'application/yang-data+json'\", function () {\r", - " pm.expect(pm.response.headers.get('Content-Type')).is.equals('application/yang-data+json');\r", - " responseData = pm.response.json();\r", - " topLevelPropertyName = responseData.hasOwnProperty('modules-state') ? 'modules-state' : 'ietf-yang-library:modules-state';\r", - " console.info(topLevelPropertyName)\r", + "pm.test(\"Verify that headers.Content-Type is 'application/yang-data+json; charset=utf-8'\", function () {\r", + " pm.expect(pm.response.headers.get('Content-Type')).is.equals('application/yang-data+json; charset=utf-8');\r", + " responseJson = pm.response.json();\r", + " parseAllNetworks()\r", + " console.info('networkList: ', networkList)\r", + " console.info('eth: ', eth)\r", + " console.info('mw: ', mw)\r", + "});\r", + "\r", + "pm.test('Verify that the IUT contains network information', function() {\r", + " pm.expect(eth).to.not.equal(null);\r", + "});\r", + "\r", + "pm.test('Verify that the IUT does not contain microwave network information', function() {\r", + " mw = findMWNetwork(networksObj.network);\r", + " pm.expect(mw).to.equal(null);\r", "});\r", "\r", - "var networks = {};\r", + "function parseAllNetworks() {\r", + " var topLevelPropertyName = responseJson.hasOwnProperty('networks') ? 'networks' : 'ietf-network:networks';\r", + " console.info('topLevelPropertyName=', topLevelPropertyName)\r", + " pm.test('The response body should contain information about networks', function() {\r", + " pm.expect(responseJson).to.have.property(topLevelPropertyName);\r", + " pm.expect(responseJson[topLevelPropertyName]).to.have.property('network');\r", + " responseJson[topLevelPropertyName].network.forEach(function(item, index) {\r", + " pm.expect(item).to.have.property('network-id');\r", + " pm.expect(networkList).to.not.have.property(item['network-id']); // Make sure each network-id appears only once\r", + " networkList[item['network-id']] = item;\r", + " });\r", + " });\r", + " \r", + " eth = findEthNetwork(responseJson[topLevelPropertyName].network);\r", + "\r", + " mw = findMWNetwork(responseJson[topLevelPropertyName].network);\r", + "}\r", + "\r", + "function findEthNetwork(networks) {\r", + " var len = networks.length;\r", + " var i;\r", + " var net;\r", + " for (i = 0; i < len; ++i) {\r", + " net = networks[i];\r", + " if (net['network-types']\r", + " && net['network-types']['ietf-te-topology:te-topology']\r", + " && net['network-types']['ietf-te-topology:te-topology']['ietf-eth-te-topology:eth-tran-topology']) {\r", + " return net;\r", + " }\r", + " }\r", + " return null;\r", + "}\r", "\r", + "function findMWNetwork(networks) {\r", + " var len = networks.length;\r", + " var i;\r", + " var net;\r", + " for (i = 0; i < len; ++i) {\r", + " net = networks[i];\r", + " if (net['network-types']\r", + " && net['network-types']['ietf-te-topology:te-topology']\r", + " && net['network-types']['ietf-te-topology:te-topology']['ietf-microwave-topology:mw-topology']) {\r", + " return net; \r", + " }\r", + " }\r", + " return null;\r", + "}\r", "" ], "type": "text/javascript", "packages": {} } + }, + { + "listen": "prerequest", + "script": { + "exec": [ + "// Check PICS requirements\r", + "if ((pm.environment.get('PICS_IUT_PNC') != \"true\") || (pm.environment.get('PICS_RESTCONF') != \"true\") || (pm.environment.get('PICS_SEC_TLS') != \"true\") || (pm.environment.get('PICS_ABSTRACT_BB') != \"true\")) {\r", + " throw new Error('PICS_IUT_PNC and PICS_RESTCONF and PICS_SEC_TLS and PICS_ABSTRACT_BB are required.');\r", + "}\r", + " " + ], + "type": "text/javascript", + "packages": {} + } } ], "request": { "auth": { - "type": "basic", - "basic": [ - { - "key": "password", - "value": "{{PX_USER_PASSWD}}", - "type": "string" - }, + "type": "bearer", + "bearer": [ { - "key": "username", - "value": "{{PX_USER}}", + "key": "token", + "value": "{{PX_ACCESS_TOKEN}}", "type": "string" } ] @@ -746,7 +941,7 @@ "method": "GET", "header": [], "url": { - "raw": "{{PX_PROTOCOL}}://{{PX_IUT_IP_ADDRESS}}:{{PX_IUT_IP_PORT}}/{{PX_ROOT_API}}//ietf-network:networks", + "raw": "{{PX_PROTOCOL}}://{{PX_IUT_IP_ADDRESS}}:{{PX_IUT_IP_PORT}}/{{PX_ROOT_API}}/ietf-network:networks", "protocol": "{{PX_PROTOCOL}}", "host": [ "{{PX_IUT_IP_ADDRESS}}" @@ -754,7 +949,6 @@ "port": "{{PX_IUT_IP_PORT}}", "path": [ "{{PX_ROOT_API}}", - "", "ietf-network:networks" ] } @@ -778,37 +972,105 @@ " pm.response.to.have.status(200);\r", "});\r", "\r", - "var responseData = '';\r", - "var topLevelPropertyName = '';\r", + "var responseJson = pm.response.json();\r", + "var networkList = null;\r", + "var eth = null;\r", + "var mw = null\r", "\r", - "pm.test(\"Verify that headers.Content-Type is 'application/yang-data+json'\", function () {\r", - " pm.expect(pm.response.headers.get('Content-Type')).is.equals('application/yang-data+json');\r", - " responseData = pm.response.json();\r", - " topLevelPropertyName = responseData.hasOwnProperty('modules-state') ? 'modules-state' : 'ietf-yang-library:modules-state';\r", - " console.info(topLevelPropertyName)\r", + "pm.test(\"Verify that headers.Content-Type is 'application/yang-data+json; charset=utf-8'\", function () {\r", + " pm.expect(pm.response.headers.get('Content-Type')).is.equals('application/yang-data+json; charset=utf-8');\r", + " responseJson = pm.response.json();\r", + " parseAllNetworks()\r", + " console.info('networkList: ', networkList)\r", + " console.info('eth: ', eth)\r", + " console.info('mw: ', mw)\r", + "});\r", + "\r", + "pm.test('Verify that the IUT provides a network list containing only one node', function() {\r", + " pm.expect(eth).to.not.equal(null);\r", + " pm.expect(networkList.length).to.equal(1);\r", + "});\r", + "\r", + "pm.test('Verify that the IUT does not contain microwave network information', function() {\r", + " mw = findMWNetwork(networksObj.network);\r", + " pm.expect(mw).to.equal(null);\r", "});\r", "\r", - "var networks = {};\r", + "function parseAllNetworks() {\r", + " var topLevelPropertyName = responseJson.hasOwnProperty('networks') ? 'networks' : 'ietf-network:networks';\r", + " console.info('topLevelPropertyName=', topLevelPropertyName)\r", + " pm.test('The response body should contain information about networks', function() {\r", + " pm.expect(responseJson).to.have.property(topLevelPropertyName);\r", + " pm.expect(responseJson[topLevelPropertyName]).to.have.property('network');\r", + " responseJson[topLevelPropertyName].network.forEach(function(item, index) {\r", + " pm.expect(item).to.have.property('network-id');\r", + " pm.expect(networkList).to.not.have.property(item['network-id']); // Make sure each network-id appears only once\r", + " networkList[item['network-id']] = item;\r", + " });\r", + " });\r", + " \r", + " eth = findEthNetwork(responseJson[topLevelPropertyName].network);\r", + "\r", + " mw = findMWNetwork(responseJson[topLevelPropertyName].network);\r", + "}\r", + "\r", + "function findEthNetwork(networks) {\r", + " var len = networks.length;\r", + " var i;\r", + " var net;\r", + " for (i = 0; i < len; ++i) {\r", + " net = networks[i];\r", + " if (net['network-types']\r", + " && net['network-types']['ietf-te-topology:te-topology']\r", + " && net['network-types']['ietf-te-topology:te-topology']['ietf-eth-te-topology:eth-tran-topology']) {\r", + " return net;\r", + " }\r", + " }\r", + " return null;\r", + "}\r", "\r", + "function findMWNetwork(networks) {\r", + " var len = networks.length;\r", + " var i;\r", + " var net;\r", + " for (i = 0; i < len; ++i) {\r", + " net = networks[i];\r", + " if (net['network-types']\r", + " && net['network-types']['ietf-te-topology:te-topology']\r", + " && net['network-types']['ietf-te-topology:te-topology']['ietf-microwave-topology:mw-topology']) {\r", + " return net; \r", + " }\r", + " }\r", + " return null;\r", + "}\r", "" ], "type": "text/javascript", "packages": {} } + }, + { + "listen": "prerequest", + "script": { + "exec": [ + "// Check PICS requirements\r", + "if ((pm.environment.get('PICS_IUT_PNC') != \"true\") || (pm.environment.get('PICS_RESTCONF') != \"true\") || (pm.environment.get('PICS_SEC_TLS') != \"true\") || (pm.environment.get('PICS_ABSTRACT_BB') != \"true\")) {\r", + " throw new Error('PICS_IUT_PNC and PICS_RESTCONF and PICS_SEC_TLS and PICS_ABSTRACT_BB are required.');\r", + "}\r", + " " + ], + "type": "text/javascript", + "packages": {} + } } ], "request": { "auth": { - "type": "basic", - "basic": [ - { - "key": "password", - "value": "{{PX_USER_PASSWD}}", - "type": "string" - }, + "type": "bearer", + "bearer": [ { - "key": "username", - "value": "{{PX_USER}}", + "key": "token", + "value": "{{PX_ACCESS_TOKEN}}", "type": "string" } ] @@ -816,7 +1078,7 @@ "method": "GET", "header": [], "url": { - "raw": "{{PX_PROTOCOL}}://{{PX_IUT_IP_ADDRESS}}:{{PX_IUT_IP_PORT}}/{{PX_ROOT_API}}//ietf-network:networks", + "raw": "{{PX_PROTOCOL}}://{{PX_IUT_IP_ADDRESS}}:{{PX_IUT_IP_PORT}}/{{PX_ROOT_API}}/ietf-network:networks", "protocol": "{{PX_PROTOCOL}}", "host": [ "{{PX_IUT_IP_ADDRESS}}" @@ -824,7 +1086,6 @@ "port": "{{PX_IUT_IP_PORT}}", "path": [ "{{PX_ROOT_API}}", - "", "ietf-network:networks" ] } @@ -844,10 +1105,10 @@ "name": "MWTopologyDiscovery", "item": [ { - "name": "TC_mWT_PNC_MW_TOPO_GET_BV_01", + "name": "TC_mWT_PNC_PT_MW_TOPO_GET_BV_01", "item": [ { - "name": "TC_mWT_PNC_MW_TOPO_GET_BV_01", + "name": "TC_mWT_PNC_PT_MW_TOPO_GET_BV_01", "event": [ { "listen": "test", @@ -857,50 +1118,82 @@ " pm.response.to.have.status(200);\r", "});\r", "\r", - "var responseData = '';\r", - "var topLevelPropertyName = '';\r", - "\r", - "pm.test(\"Verify that headers.Content-Type is 'application/yang-data+json'\", function () {\r", - " pm.expect(pm.response.headers.get('Content-Type')).is.equals('application/yang-data+json');\r", - " responseData = pm.response.json();\r", - " topLevelPropertyName = responseData.hasOwnProperty('modules-state') ? 'modules-state' : 'ietf-yang-library:modules-state';\r", - " console.info(topLevelPropertyName)\r", + "var responseJson = pm.response.json();\r", + "var networkList = null;\r", + "var eth = null;\r", + "var mw = null;\r", + "\r", + "pm.test(\"Verify that headers.Content-Type is 'application/yang-data+json; charset=utf-8'\", function () {\r", + " pm.expect(pm.response.headers.get('Content-Type')).is.equals('application/yang-data+json; charset=utf-8');\r", + " responseJson = pm.response.json();\r", + " parseAllNetworks()\r", + " console.info('networkList: ', networkList)\r", + " console.info('eth: ', eth)\r", + " console.info('mw: ', mw)\r", "});\r", "\r", - "// var moduleList = {};\r", + "pm.test('Verify that are present all mandatories microwave topology attributes', function() {\r", + " pm.expect(mw).to.have.property('network-id');\r", "\r", - "// pm.test(\"Validate the main field is 'ietf-yang-library:modules-state'\", function () {\r", - "// pm.expect(responseData).to.be.an('object');\r", - "// pm.expect(responseData).to.have.property(topLevelPropertyName);\r", - "// });\r", + " pm.expect(mw).to.have.property('network-types');\r", + " pm.expect(mw['network-types']).to.have.property('ietf-te-topology:te-topology');\r", + " pm.expect(mw['network-types']['ietf-te-topology:te-topology']).to.have.property('ietf-microwave-topology:mw-topology');\r", "\r", - "// pm.test(\"Verify that the 'module' array is present and not empty\", function () {\r", - "// pm.expect(responseData).to.be.an('object');\r", - "// pm.expect(responseData[topLevelPropertyName][\"module\"]).to.be.an('array').with.lengthOf.at.least(1);\r", - "// // Build the module list\r", - "// responseData[topLevelPropertyName].module.forEach(function(item, index) {\r", - "// pm.expect(item).to.have.property('name');\r", - "// pm.expect(item).to.have.property('revision');\r", - "// pm.expect(item).to.have.property('namespace');\r", - "// if (moduleList.hasOwnProperty(item.name)) {\r", - "// if (moduleList[item.name].revision < item.revision) {\r", - "// moduleList[item.name] = item;\r", - "// }\r", - "// } else {\r", - "// moduleList[item.name] = item;\r", - "// }\r", - "// });\r", + " pm.expect(mw).to.have.property(\"ietf-te-topology:provider-id\"); //, provider_id);\r", + " pm.expect(mw).to.have.property(\"ietf-te-topology:client-id\"); //, client_id);\r", + " pm.expect(mw).to.have.property(\"ietf-te-topology:te-topology-id\"); //, mw_topology_id);\r", + " pm.expect(mw).to.have.property(\"ietf-te-topology:te\");\r", + " pm.expect(mw['ietf-te-topology:te']).to.have.property('name'); //, mw_network_name);\r", + "});\r", "\r", - "// });\r", + "function parseAllNetworks() {\r", + " var topLevelPropertyName = responseJson.hasOwnProperty('networks') ? 'networks' : 'ietf-network:networks';\r", + " console.info('topLevelPropertyName=', topLevelPropertyName)\r", + " pm.test('The response body should contain information about networks', function() {\r", + " pm.expect(responseJson).to.have.property(topLevelPropertyName);\r", + " pm.expect(responseJson[topLevelPropertyName]).to.have.property('network');\r", + " responseJson[topLevelPropertyName].network.forEach(function(item, index) {\r", + " pm.expect(item).to.have.property('network-id');\r", + " pm.expect(networkList).to.not.have.property(item['network-id']); // Make sure each network-id appears only once\r", + " networkList[item['network-id']] = item;\r", + " });\r", + " });\r", + " \r", + " eth = findEthNetwork(responseJson[topLevelPropertyName].network);\r", + "\r", + " mw = findMWNetwork(responseJson[topLevelPropertyName].network);\r", + "}\r", "\r", - "// pm.test('Verify that the basics YANG modules are supported', function() {\r", - "// pm.expect(moduleList).to.have.property(\"ietf-restconf\");\r", - "// pm.expect(moduleList).to.have.property(\"ietf-yang-library\");\r", - "// pm.expect(moduleList).to.have.property(\"ietf-datastores\");\r", - "// pm.expect(moduleList).to.have.property(\"ietf-inet-types\");\r", - "// pm.expect(moduleList).to.have.property(\"ietf-interfaces\");\r", - "// pm.expect(moduleList).to.have.property(\"ietf-ip\");\r", - "//});" + "function findEthNetwork(networks) {\r", + " var len = networks.length;\r", + " var i;\r", + " var net;\r", + " for (i = 0; i < len; ++i) {\r", + " net = networks[i];\r", + " if (net['network-types']\r", + " && net['network-types']['ietf-te-topology:te-topology']\r", + " && net['network-types']['ietf-te-topology:te-topology']['ietf-eth-te-topology:eth-tran-topology']) {\r", + " return net;\r", + " }\r", + " }\r", + " return null;\r", + "}\r", + "\r", + "function findMWNetwork(networks) {\r", + " var len = networks.length;\r", + " var i;\r", + " var net;\r", + " for (i = 0; i < len; ++i) {\r", + " net = networks[i];\r", + " if (net['network-types']\r", + " && net['network-types']['ietf-te-topology:te-topology']\r", + " && net['network-types']['ietf-te-topology:te-topology']['ietf-microwave-topology:mw-topology']) {\r", + " return net; \r", + " }\r", + " }\r", + " return null;\r", + "}\r", + "" ], "type": "text/javascript", "packages": {} @@ -911,8 +1204,8 @@ "script": { "exec": [ "// Check PICS requirements\r", - "if ((pm.environment.get('PICS_IUT_PNC') != \"true\") || (pm.environment.get('PICS_RESTCONF') != \"true\") || (pm.environment.get('PICS_SEC_TLS') != \"true\") || (pm.environment.get('PICS_ABSTRACT_BB') != \"true\") || (pm.environment.get('PICS_MW_TOPO') != \"true\")) {\r", - " throw new Error('PICS_IUT_PNC and PICS_RESTCONF and PICS_SEC_TLS and PICS_ABSTRACT_BB and PICS_MW_TOPO are required.');\r", + "if ((pm.environment.get('PICS_IUT_PNC') != \"true\") || (pm.environment.get('PICS_RESTCONF') != \"true\") || (pm.environment.get('PICS_SEC_TLS') != \"true\") || (pm.environment.get('ABSTRACT_PT') != \"true\") || (pm.environment.get('PICS_MW_TOPO') != \"true\")) {\r", + " throw new Error('PICS_IUT_PNC and PICS_RESTCONF and PICS_SEC_TLS and ABSTRACT_PT and PICS_MW_TOPO are required.');\r", "}\r", "" ], @@ -923,16 +1216,11 @@ ], "request": { "auth": { - "type": "basic", - "basic": [ + "type": "bearer", + "bearer": [ { - "key": "password", - "value": "{{PX_USER_PASSWD}}", - "type": "string" - }, - { - "key": "username", - "value": "{{PX_USER}}", + "key": "token", + "value": "{{PX_ACCESS_TOKEN}}", "type": "string" } ] @@ -963,66 +1251,22 @@ "response": [] } ], - "description": "Test objective\n\n\"Verify that the IUT provides the MW network topology for all networks with mandatory mWT GC 024 data elements subset - black box abstraction level.\"\n\nReference\n\n- \"ETSI GS mWT 024 Annex A.1.2\",\n \n- \"RFC 8345 A YANG Data Model for Network Topologies\",\n \n- \"RFC 8795 YANG Data Model for Traffic Engineering (TE) Topologies\",\n \n- \"draft-ietf-ccamp-mw-topo-yang-02 A YANG Data Model for Microwave Topology\"\n \n\nPICS Selection StartFragmentIUT_PNC and RESTCONF and SEC_TLS and ABSTRACT_PT and MW_TOPO" + "description": "Test objective\n\n\"Verify that the IUT provides the MW network topology for all networks with mandatory mWT GC 024 data elements subset.\"\n\nReference\n\n- \"ETSI GS mWT 024 Annex A.1.2\",\n \n- \"RFC 8345 A YANG Data Model for Network Topologies\",\n \n- \"RFC 8795 YANG Data Model for Traffic Engineering (TE) Topologies\",\n \n- \"draft-ietf-ccamp-mw-topo-yang-02 A YANG Data Model for Microwave Topology\"\n \n\nPICS Selection StartFragmentIUT_PNC and RESTCONF and SEC_TLS and ABSTRACT_PT and MW_TOPO" }, { - "name": "TC_mWT_PNC_MW_TOPO_GET_BO_01", + "name": "TC_mWT_PNC_PT_MW_TOPO_GET_BO_01", "item": [ { - "name": "TC_mWT_PNC_MW_TOPO_GET_BO_01", + "name": "TC_mWT_PNC_PT_MW_TOPO_GET_BO_01", "event": [ { "listen": "test", "script": { "exec": [ - "pm.test(\"Verify that the response status code is 200\", function () {\r", + "pm.test(\"Verify that the response status code is 400\", function () {\r", " pm.response.to.have.status(400);\r", "});\r", - "\r", - "var responseData = '';\r", - "var topLevelPropertyName = '';\r", - "\r", - "pm.test(\"Verify that headers.Content-Type is 'application/yang-data+json'\", function () {\r", - " pm.expect(pm.response.headers.get('Content-Type')).is.equals('application/yang-data+json');\r", - " responseData = pm.response.json();\r", - " topLevelPropertyName = responseData.hasOwnProperty('modules-state') ? 'modules-state' : 'ietf-yang-library:modules-state';\r", - " console.info(topLevelPropertyName)\r", - "});\r", - "\r", - "// var moduleList = {};\r", - "\r", - "// pm.test(\"Validate the main field is 'ietf-yang-library:modules-state'\", function () {\r", - "// pm.expect(responseData).to.be.an('object');\r", - "// pm.expect(responseData).to.have.property(topLevelPropertyName);\r", - "// });\r", - "\r", - "// pm.test(\"Verify that the 'module' array is present and not empty\", function () {\r", - "// pm.expect(responseData).to.be.an('object');\r", - "// pm.expect(responseData[topLevelPropertyName][\"module\"]).to.be.an('array').with.lengthOf.at.least(1);\r", - "// // Build the module list\r", - "// responseData[topLevelPropertyName].module.forEach(function(item, index) {\r", - "// pm.expect(item).to.have.property('name');\r", - "// pm.expect(item).to.have.property('revision');\r", - "// pm.expect(item).to.have.property('namespace');\r", - "// if (moduleList.hasOwnProperty(item.name)) {\r", - "// if (moduleList[item.name].revision < item.revision) {\r", - "// moduleList[item.name] = item;\r", - "// }\r", - "// } else {\r", - "// moduleList[item.name] = item;\r", - "// }\r", - "// });\r", - "\r", - "// });\r", - "\r", - "// pm.test('Verify that the basics YANG modules are supported', function() {\r", - "// pm.expect(moduleList).to.have.property(\"ietf-restconf\");\r", - "// pm.expect(moduleList).to.have.property(\"ietf-yang-library\");\r", - "// pm.expect(moduleList).to.have.property(\"ietf-datastores\");\r", - "// pm.expect(moduleList).to.have.property(\"ietf-inet-types\");\r", - "// pm.expect(moduleList).to.have.property(\"ietf-interfaces\");\r", - "// pm.expect(moduleList).to.have.property(\"ietf-ip\");\r", - "//});" + "" ], "type": "text/javascript", "packages": {} @@ -1033,8 +1277,8 @@ "script": { "exec": [ "// Check PICS requirements\r", - "if ((pm.environment.get('PICS_IUT_PNC') != \"true\") || (pm.environment.get('PICS_RESTCONF') != \"true\") || (pm.environment.get('PICS_SEC_TLS') != \"true\") || (pm.environment.get('PICS_ABSTRACT_BB') != \"true\") || (pm.environment.get('PICS_MW_TOPO') != \"true\")) {\r", - " throw new Error('PICS_IUT_PNC and PICS_RESTCONF and PICS_SEC_TLS and PICS_ABSTRACT_BB and PICS_MW_TOPO are required.');\r", + "if ((pm.environment.get('PICS_IUT_PNC') != \"true\") || (pm.environment.get('PICS_RESTCONF') != \"true\") || (pm.environment.get('PICS_SEC_TLS') != \"true\") || (pm.environment.get('ABSTRACT_PT') != \"true\") || (pm.environment.get('PICS_MW_TOPO') != \"true\")) {\r", + " throw new Error('PICS_IUT_PNC and PICS_RESTCONF and PICS_SEC_TLS and ABSTRACT_PT and PICS_MW_TOPO are required.');\r", "}\r", "" ], @@ -1045,16 +1289,11 @@ ], "request": { "auth": { - "type": "basic", - "basic": [ - { - "key": "password", - "value": "{{PX_USER_PASSWD}}", - "type": "string" - }, + "type": "bearer", + "bearer": [ { - "key": "username", - "value": "{{PX_USER}}", + "key": "token", + "value": "{{PX_ACCESS_TOKEN}}", "type": "string" } ] @@ -1086,10 +1325,10 @@ "description": "Test objective\n\n- \"Verify that the IUT replies with an error code when the request is malformed.\"\n \n\nReference\n\n- \"ETSI GS mWT 024 Clause 4.3.3\",\n \n- \"ETSI GS mWT 024 Clause 5.3.2 Exception Handling\",\n \n- \"ETSI GS mWT 024 Annex A.2.2\",\n \n- \"RFC 8345 A YANG Data Model for Network Topologies\",\n \n- \"RFC 8795 YANG Data Model for Traffic Engineering (TE) Topologies\"\n \n\nPICS Selection IUT_PNC and RESTCONF and SEC_TLS and ABSTRACT_PT and MW_TOPO" }, { - "name": "TC_mWT_PNC_MW_TOPO_GET_BV_02", + "name": "TC_mWT_PNC_PT_MW_TOPO_GET_BV_02", "item": [ { - "name": "TC_mWT_PNC_MW_TOPO_GET_BV_02", + "name": "TC_mWT_PNC_PT_MW_TOPO_GET_BV_02", "event": [ { "listen": "test", @@ -1099,50 +1338,103 @@ " pm.response.to.have.status(200);\r", "});\r", "\r", - "var responseData = '';\r", - "var topLevelPropertyName = '';\r", - "\r", - "pm.test(\"Verify that headers.Content-Type is 'application/yang-data+json'\", function () {\r", - " pm.expect(pm.response.headers.get('Content-Type')).is.equals('application/yang-data+json');\r", - " responseData = pm.response.json();\r", - " topLevelPropertyName = responseData.hasOwnProperty('modules-state') ? 'modules-state' : 'ietf-yang-library:modules-state';\r", - " console.info(topLevelPropertyName)\r", + "var responseJson = pm.response.json();\r", + "var networkList = null;\r", + "var eth = null;\r", + "var mw = null;\r", + "\r", + "pm.test(\"Verify that headers.Content-Type is 'application/yang-data+json; charset=utf-8'\", function () {\r", + " pm.expect(pm.response.headers.get('Content-Type')).is.equals('application/yang-data+json; charset=utf-8');\r", + " responseJson = pm.response.json();\r", + " parseAllNetworks()\r", + " console.info('networkList: ', networkList)\r", + " console.info('eth: ', eth)\r", + " console.info('mw: ', mw)\r", "});\r", "\r", - "// var moduleList = {};\r", + "pm.test('Verify that are present all mandatories microwave topology attributes', function() {\r", + " pm.expect(mw).to.have.property('network-id');\r", "\r", - "// pm.test(\"Validate the main field is 'ietf-yang-library:modules-state'\", function () {\r", - "// pm.expect(responseData).to.be.an('object');\r", - "// pm.expect(responseData).to.have.property(topLevelPropertyName);\r", - "// });\r", + " pm.expect(mw).to.have.property('network-types');\r", + " pm.expect(mw['network-types']).to.have.property('ietf-te-topology:te-topology');\r", + " pm.expect(mw['network-types']['ietf-te-topology:te-topology']).to.have.property('ietf-microwave-topology:mw-topology');\r", "\r", - "// pm.test(\"Verify that the 'module' array is present and not empty\", function () {\r", - "// pm.expect(responseData).to.be.an('object');\r", - "// pm.expect(responseData[topLevelPropertyName][\"module\"]).to.be.an('array').with.lengthOf.at.least(1);\r", - "// // Build the module list\r", - "// responseData[topLevelPropertyName].module.forEach(function(item, index) {\r", - "// pm.expect(item).to.have.property('name');\r", - "// pm.expect(item).to.have.property('revision');\r", - "// pm.expect(item).to.have.property('namespace');\r", - "// if (moduleList.hasOwnProperty(item.name)) {\r", - "// if (moduleList[item.name].revision < item.revision) {\r", - "// moduleList[item.name] = item;\r", - "// }\r", - "// } else {\r", - "// moduleList[item.name] = item;\r", - "// }\r", - "// });\r", + " pm.expect(mw).to.have.property(\"ietf-te-topology:provider-id\"); //, provider_id);\r", + " pm.expect(mw).to.have.property(\"ietf-te-topology:client-id\"); //, client_id);\r", + " pm.expect(mw).to.have.property(\"ietf-te-topology:te-topology-id\"); //, mw_topology_id);\r", + " pm.expect(mw).to.have.property(\"ietf-te-topology:te\");\r", + " pm.expect(mw['ietf-te-topology:te']).to.have.property('name'); //, mw_network_name);\r", + "});\r", "\r", - "// });\r", + "pm.test('Verifiy that Microwave topology nodes conatins all mandatory fileds', function() {\r", + " var nodeListMW = {};\r", + " pm.expect(mw).to.have.property('node');\r", + " mw.node.forEach(function(item, index) {\r", + " pm.expect(item).to.have.property('node-id');\r", + " pm.expect(nodeListMW).to.not.have.property(item['node-id']); // Make sure each node-id appears only once\r", + " nodeListMW[item['node-id']] = item;\r", + " var regExpStr = '^(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\\.'\r", + " + '(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\\.'\r", + " + '(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\\.'\r", + " + '(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)$';\r", + " var regExp = new RegExp(regExpStr);\r", + " pm.expect(regExp.test(item['node-id'])).to.be.true;\r", + " pm.expect(item).to.have.property('ietf-te-topology:te-node-id', item['node-id']);\r", + " pm.expect(item).to.have.property('ietf-te-topology:te');\r", + " pm.expect(item['ietf-te-topology:te']).to.have.property('te-node-attributes');\r", + " pm.expect(item['ietf-te-topology:te']['te-node-attributes']).to.have.property('name'); //vendor independent\r", + " });\r", + " pm.expect(Object.keys(nodeListMW).length).to.equal(2);\r", + "});\r", "\r", - "// pm.test('Verify that the basics YANG modules are supported', function() {\r", - "// pm.expect(moduleList).to.have.property(\"ietf-restconf\");\r", - "// pm.expect(moduleList).to.have.property(\"ietf-yang-library\");\r", - "// pm.expect(moduleList).to.have.property(\"ietf-datastores\");\r", - "// pm.expect(moduleList).to.have.property(\"ietf-inet-types\");\r", - "// pm.expect(moduleList).to.have.property(\"ietf-interfaces\");\r", - "// pm.expect(moduleList).to.have.property(\"ietf-ip\");\r", - "//});" + "function parseAllNetworks() {\r", + " var topLevelPropertyName = responseJson.hasOwnProperty('networks') ? 'networks' : 'ietf-network:networks';\r", + " console.info('topLevelPropertyName=', topLevelPropertyName)\r", + " pm.test('The response body should contain information about networks', function() {\r", + " pm.expect(responseJson).to.have.property(topLevelPropertyName);\r", + " pm.expect(responseJson[topLevelPropertyName]).to.have.property('network');\r", + " responseJson[topLevelPropertyName].network.forEach(function(item, index) {\r", + " pm.expect(item).to.have.property('network-id');\r", + " pm.expect(networkList).to.not.have.property(item['network-id']); // Make sure each network-id appears only once\r", + " networkList[item['network-id']] = item;\r", + " });\r", + " });\r", + " \r", + " eth = findEthNetwork(responseJson[topLevelPropertyName].network);\r", + "\r", + " mw = findMWNetwork(responseJson[topLevelPropertyName].network);\r", + "}\r", + "\r", + "function findEthNetwork(networks) {\r", + " var len = networks.length;\r", + " var i;\r", + " var net;\r", + " for (i = 0; i < len; ++i) {\r", + " net = networks[i];\r", + " if (net['network-types']\r", + " && net['network-types']['ietf-te-topology:te-topology']\r", + " && net['network-types']['ietf-te-topology:te-topology']['ietf-eth-te-topology:eth-tran-topology']) {\r", + " return net;\r", + " }\r", + " }\r", + " return null;\r", + "}\r", + "\r", + "function findMWNetwork(networks) {\r", + " var len = networks.length;\r", + " var i;\r", + " var net;\r", + " for (i = 0; i < len; ++i) {\r", + " net = networks[i];\r", + " if (net['network-types']\r", + " && net['network-types']['ietf-te-topology:te-topology']\r", + " && net['network-types']['ietf-te-topology:te-topology']['ietf-microwave-topology:mw-topology']) {\r", + " return net; \r", + " }\r", + " }\r", + " return null;\r", + "}\r", + "" ], "type": "text/javascript", "packages": {} @@ -1153,8 +1445,8 @@ "script": { "exec": [ "// Check PICS requirements\r", - "if ((pm.environment.get('PICS_IUT_PNC') != \"true\") || (pm.environment.get('PICS_RESTCONF') != \"true\") || (pm.environment.get('PICS_SEC_TLS') != \"true\") || (pm.environment.get('PICS_ABSTRACT_BB') != \"true\") || (pm.environment.get('PICS_MW_TOPO') != \"true\")) {\r", - " throw new Error('PICS_IUT_PNC and PICS_RESTCONF and PICS_SEC_TLS and PICS_ABSTRACT_BB and PICS_MW_TOPO are required.');\r", + "if ((pm.environment.get('PICS_IUT_PNC') != \"true\") || (pm.environment.get('PICS_RESTCONF') != \"true\") || (pm.environment.get('PICS_SEC_TLS') != \"true\") || (pm.environment.get('ABSTRACT_PT') != \"true\") || (pm.environment.get('PICS_MW_TOPO') != \"true\")) {\r", + " throw new Error('PICS_IUT_PNC and PICS_RESTCONF and PICS_SEC_TLS and ABSTRACT_PT and PICS_MW_TOPO are required.');\r", "}\r", "" ], @@ -1165,16 +1457,11 @@ ], "request": { "auth": { - "type": "basic", - "basic": [ - { - "key": "password", - "value": "{{PX_USER_PASSWD}}", - "type": "string" - }, + "type": "bearer", + "bearer": [ { - "key": "username", - "value": "{{PX_USER}}", + "key": "token", + "value": "{{PX_ACCESS_TOKEN}}", "type": "string" } ] @@ -1187,7 +1474,7 @@ } ], "url": { - "raw": "{{PX_PROTOCOL}}://{{PX_IUT_IP_ADDRESS}}:{{PX_IUT_IP_PORT}}/{{PX_ROOT_API}}/ietf-microwave-topology/ietf-network:networks/network={PX_NETWORK_ID}/topologyId/mw-native-topology", + "raw": "{{PX_PROTOCOL}}://{{PX_IUT_IP_ADDRESS}}:{{PX_IUT_IP_PORT}}/{{PX_ROOT_API}}/ietf-microwave-topology/ietf-network:networks/network={{PX_NETWORK_ID}}/topologyId/mw-native-topology", "protocol": "{{PX_PROTOCOL}}", "host": [ "{{PX_IUT_IP_ADDRESS}}" @@ -1197,7 +1484,7 @@ "{{PX_ROOT_API}}", "ietf-microwave-topology", "ietf-network:networks", - "network={PX_NETWORK_ID}", + "network={{PX_NETWORK_ID}}", "topologyId", "mw-native-topology" ] @@ -1210,16 +1497,16 @@ "description": "Test objective\n\n- \"Verify that the IUT provides the MW network topology for a specific network with mandatory mWT GC 024 data elements subset.\"\n \n\nReference\n\n- \"ETSI GS mWT 024 Clause 4.3.3\",\n \n- \"ETSI GS mWT 024 Annex A.2.2.1\",\n \n- \"RFC 8345 A YANG Data Model for Network Topologies\",\n \n- \"RFC 8795 YANG Data Model for Traffic Engineering (TE) Topologies\"\n \n\nPICS Selection IUT_PNC and RESTCONF and SEC_TLS and ABSTRACT_PT and MW_TOPO" }, { - "name": "TC_mWT_PNC_MW_TOPO_GET_BO_02", + "name": "TC_mWT_PNC_PT_MW_TOPO_GET_BO_02", "item": [ { - "name": "TC_mWT_PNC_MW_TOPO_GET_BO_02", + "name": "TC_mWT_PNC_PT_MW_TOPO_GET_BO_02", "event": [ { "listen": "test", "script": { "exec": [ - "pm.test(\"Verify that the response status code is 200\", function () {\r", + "pm.test(\"Verify that the response status code is 400\", function () {\r", " pm.response.to.have.status(404);\r", "});\r", "" @@ -1233,8 +1520,8 @@ "script": { "exec": [ "// Check PICS requirements\r", - "if ((pm.environment.get('PICS_IUT_PNC') != \"true\") || (pm.environment.get('PICS_RESTCONF') != \"true\") || (pm.environment.get('PICS_SEC_TLS') != \"true\") || (pm.environment.get('PICS_ABSTRACT_BB') != \"true\") || (pm.environment.get('PICS_MW_TOPO') != \"true\")) {\r", - " throw new Error('PICS_IUT_PNC and PICS_RESTCONF and PICS_SEC_TLS and PICS_ABSTRACT_BB and PICS_MW_TOPO are required.');\r", + "if ((pm.environment.get('PICS_IUT_PNC') != \"true\") || (pm.environment.get('PICS_RESTCONF') != \"true\") || (pm.environment.get('PICS_SEC_TLS') != \"true\") || (pm.environment.get('ABSTRACT_PT') != \"true\") || (pm.environment.get('PICS_MW_TOPO') != \"true\")) {\r", + " throw new Error('PICS_IUT_PNC and PICS_RESTCONF and PICS_SEC_TLS and ABSTRACT_PT and PICS_MW_TOPO are required.');\r", "}\r", "" ], @@ -1245,16 +1532,11 @@ ], "request": { "auth": { - "type": "basic", - "basic": [ + "type": "bearer", + "bearer": [ { - "key": "username", - "value": "{{PX_USER}}", - "type": "string" - }, - { - "key": "password", - "value": "{{PX_USER_PASSWD}}", + "key": "token", + "value": "{{PX_ACCESS_TOKEN}}", "type": "string" } ] @@ -1267,7 +1549,7 @@ } ], "url": { - "raw": "{{PX_PROTOCOL}}://{{PX_IUT_IP_ADDRESS}}:{{PX_IUT_IP_PORT}}/{{PX_ROOT_API}}/ietf-network:networks/network={PX_UNKNOWN_NETWORK_ID}/topologyId/mw-native-topology", + "raw": "{{PX_PROTOCOL}}://{{PX_IUT_IP_ADDRESS}}:{{PX_IUT_IP_PORT}}/{{PX_ROOT_API}}/ietf-network:networks/network={{PX_UNKNOWN_NETWORK_ID}}/topologyId/mw-native-topology", "protocol": "{{PX_PROTOCOL}}", "host": [ "{{PX_IUT_IP_ADDRESS}}" @@ -1276,7 +1558,7 @@ "path": [ "{{PX_ROOT_API}}", "ietf-network:networks", - "network={PX_UNKNOWN_NETWORK_ID}", + "network={{PX_UNKNOWN_NETWORK_ID}}", "topologyId", "mw-native-topology" ] @@ -1286,7 +1568,7 @@ "response": [] } ], - "description": "Test objective\n\n\"Verify that the IUT replies with an error code when the network identifier is unknown - black box abstraction level.\"\n\nReference\n\n- \"ETSI GS mWT 024 Clause 5.3.2 Exception Handling\",\n- \"ETSI GS mWT 024 Annex A.1.2\",\n- \"RFC 8345 A YANG Data Model for Network Topologies\",\n- \"RFC 8795 YANG Data Model for Traffic Engineering (TE) Topologies\"\n \n\nPICS Selection IUT_MDSC and ABSTRACT_BB and MW_TOPO" + "description": "Test objective\n\n\"Verify that the IUT replies with an error code when the network identifier is unknown.\"\n\nReference\n\n- \"ETSI GS mWT 024 Clause 5.3.2 Exception Handling\",\n \n- \"ETSI GS mWT 024 Annex A.1.2\",\n \n- \"RFC 8345 A YANG Data Model for Network Topologies\",\n \n- \"RFC 8795 YANG Data Model for Traffic Engineering (TE) Topologies\"\n \n\nPICS Selection IUT_MDSC and ABSTRACT_BB and MW_TOPO" }, { "name": "TC_mWT_PNC_PT_MW_NODE_GET_BV_01", @@ -1302,50 +1584,218 @@ " pm.response.to.have.status(200);\r", "});\r", "\r", - "var responseData = '';\r", - "var topLevelPropertyName = '';\r", + "var responseJson = pm.response.json();\r", + "var networkList = null;\r", + "var eth = null;\r", + "var mw = null;\r", + "var nodes = null;\r", + "\r", + "pm.test(\"Verify that headers.Content-Type is 'application/yang-data+json; charset=utf-8'\", function () {\r", + " pm.expect(pm.response.headers.get('Content-Type')).is.equals('application/yang-data+json; charset=utf-8');\r", + " responseJson = pm.response.json();\r", + " parseAllNetworks()\r", + " console.info('networkList: ', networkList)\r", + " console.info('eth: ', eth)\r", + " console.info('mw: ', mw)\r", + "});\r", "\r", - "pm.test(\"Verify that headers.Content-Type is 'application/yang-data+json'\", function () {\r", - " pm.expect(pm.response.headers.get('Content-Type')).is.equals('application/yang-data+json');\r", - " responseData = pm.response.json();\r", - " topLevelPropertyName = responseData.hasOwnProperty('modules-state') ? 'modules-state' : 'ietf-yang-library:modules-state';\r", - " console.info(topLevelPropertyName)\r", + "pm.test('Verify that are present all mandatories microwave topology attributes', function() {\r", + " pm.expect(mw).to.have.property('network-id');\r", + "\r", + " pm.expect(mw).to.have.property('network-types');\r", + " pm.expect(mw['network-types']).to.have.property('ietf-te-topology:te-topology');\r", + " pm.expect(mw['network-types']['ietf-te-topology:te-topology']).to.have.property('ietf-microwave-topology:mw-topology');\r", + "\r", + " pm.expect(mw).to.have.property(\"ietf-te-topology:provider-id\"); //, provider_id);\r", + " pm.expect(mw).to.have.property(\"ietf-te-topology:client-id\"); //, client_id);\r", + " pm.expect(mw).to.have.property(\"ietf-te-topology:te-topology-id\"); //, mw_topology_id);\r", + " pm.expect(mw).to.have.property(\"ietf-te-topology:te\");\r", + " pm.expect(mw['ietf-te-topology:te']).to.have.property('name'); //, mw_network_name);\r", "});\r", "\r", - "// var moduleList = {};\r", + "pm.test('Verifiy that Microwave topology nodes conatins all mandatory fileds', function() {\r", + " pm.expect(mw).to.have.property('node');\r", + " pm.expect(Object.keys(nodes).length).to.equal(2);\r", + " nodes.forEach(function(item, index) {\r", + " pm.expect(item).to.have.property('ietf-te-topology:te-node-id', item['node-id']);\r", + " pm.expect(item).to.have.property('ietf-te-topology:te');\r", + " pm.expect(item['ietf-te-topology:te']).to.have.property('te-node-attributes');\r", + " pm.expect(item['ietf-te-topology:te']['te-node-attributes']).to.have.property('name'); //vendor independent\r", + " });\r", + "});\r", "\r", - "// pm.test(\"Validate the main field is 'ietf-yang-library:modules-state'\", function () {\r", - "// pm.expect(responseData).to.be.an('object');\r", - "// pm.expect(responseData).to.have.property(topLevelPropertyName);\r", - "// });\r", + "pm.test('Microwave topology nodes OPER verification', function() {\r", + " for (var key in nodes) {\r", + " pm.expect(nodes[key]['ietf-te-topology:te']).to.have.property('oper-status', 'up');\r", + " }\r", + "});\r", "\r", - "// pm.test(\"Verify that the 'module' array is present and not empty\", function () {\r", - "// pm.expect(responseData).to.be.an('object');\r", - "// pm.expect(responseData[topLevelPropertyName][\"module\"]).to.be.an('array').with.lengthOf.at.least(1);\r", - "// // Build the module list\r", - "// responseData[topLevelPropertyName].module.forEach(function(item, index) {\r", - "// pm.expect(item).to.have.property('name');\r", - "// pm.expect(item).to.have.property('revision');\r", - "// pm.expect(item).to.have.property('namespace');\r", - "// if (moduleList.hasOwnProperty(item.name)) {\r", - "// if (moduleList[item.name].revision < item.revision) {\r", - "// moduleList[item.name] = item;\r", - "// }\r", - "// } else {\r", - "// moduleList[item.name] = item;\r", - "// }\r", - "// });\r", + "pm.test('Microwave topology termination points verification', function() {\r", + " for (var key in nodes) {\r", + " var node = nodes[key];\r", + " pm.expect(node).to.have.property('ietf-network-topology:termination-point');\r", + " node.tp = {};\r", + " node['ietf-network-topology:termination-point'].sort(compare_tpid);\r", + " node['ietf-network-topology:termination-point'].forEach(function(tp, index) {\r", + " pm.expect(tp).to.have.property('tp-id'); // Vendor independent, only check existence\r", + " pm.expect(node.tp).to.not.have.property(tp['tp-id']); // Make sure each tp-id appears only once\r", + " node.tp[tp['tp-id']] = tp;\r", + " pm.expect(tp).to.have.property('ietf-te-topology:te-tp-id'); // Vendor independent, only check existence\r", + " pm.expect(tp).to.have.property('ietf-te-topology:te');\r", + " pm.expect(tp['ietf-te-topology:te']).to.have.property('admin-status', 'up');\r", + " pm.expect(tp['ietf-te-topology:te']).to.have.property('name');\r", + " });\r", + " }\r", + "});\r", "\r", - "// });\r", + "// Ensure nodes have the full tp information when the above verification partially fails, or the link verification will fail\r", + "for (var key in nodes) {\r", + " var node = nodes[key];\r", + " node.tp = {};\r", + " node['ietf-network-topology:termination-point'].sort(compare_tpid);\r", + " node['ietf-network-topology:termination-point'].forEach(function(tp, index) {\r", + " node.tp[tp['tp-id']] = tp;\r", + " });\r", + "}\r", "\r", - "// pm.test('Verify that the basics YANG modules are supported', function() {\r", - "// pm.expect(moduleList).to.have.property(\"ietf-restconf\");\r", - "// pm.expect(moduleList).to.have.property(\"ietf-yang-library\");\r", - "// pm.expect(moduleList).to.have.property(\"ietf-datastores\");\r", - "// pm.expect(moduleList).to.have.property(\"ietf-inet-types\");\r", - "// pm.expect(moduleList).to.have.property(\"ietf-interfaces\");\r", - "// pm.expect(moduleList).to.have.property(\"ietf-ip\");\r", - "//});" + "pm.test('Microwave topology termination points OPER verification', function() {\r", + " for (var key in nodes) {\r", + " var node = nodes[key];\r", + " pm.expect(node).to.have.property('ietf-network-topology:termination-point');\r", + " node['ietf-network-topology:termination-point'].forEach(function(tp, index) {\r", + " pm.expect(tp['ietf-te-topology:te']).to.have.property('oper-status', 'up');\r", + " });\r", + " }\r", + "});\r", + "\r", + "pm.test('Microwave topology links verification', function() {\r", + " var mwLinkPoints = [];\r", + " pm.expect(mw).to.have.property('ietf-network-topology:link');\r", + " mw['ietf-network-topology:link'].forEach(function(item, index) {\r", + " pm.expect(item).to.have.property('link-id');\r", + " pm.expect(linkListMW).to.not.have.property(item['link-id']); // Make sure each link-id appears only once\r", + " linkListMW[item['link-id']] = item;\r", + " pm.expect(item).to.have.property('source');\r", + " pm.expect(item.source).to.have.property('source-node');\r", + " pm.expect(item.source).to.have.property('source-tp');\r", + " pm.expect(nodes).to.have.property(item.source['source-node']);\r", + " pm.expect(nodes[item.source['source-node']].tp).to.have.property(item.source['source-tp']);\r", + " pm.expect(item).to.have.property('destination');\r", + " pm.expect(item.destination).to.have.property('dest-node');\r", + " pm.expect(item.destination).to.have.property('dest-tp');\r", + " pm.expect(nodes).to.have.property(item.destination['dest-node']);\r", + " pm.expect(nodes[item.destination['dest-node']].tp).to.have.property(item.destination['dest-tp']);\r", + "\r", + " pm.expect(item).to.have.property('ietf-te-topology:te');\r", + " pm.expect(item['ietf-te-topology:te']).to.have.property('te-link-attributes');\r", + "\r", + " pm.expect(item['ietf-te-topology:te']['te-link-attributes']).to.have.property('admin-status', 'up');\r", + " pm.expect(item['ietf-te-topology:te']['te-link-attributes']).to.have.property('ietf-microwave-topology:mw-link-frequency');\r", + " pm.expect(item['ietf-te-topology:te']['te-link-attributes']).to.have.property('ietf-microwave-topology:mw-link-channel-separation');\r", + " // pm.expect(item['ietf-te-topology:te']['te-link-attributes']).to.have.property('ietf-microwave-topology:mw-link-availability');\r", + " // TODO - do we need to check anything with the availability? Likely not. Do we need this at all for now?\r", + " });\r", + " pm.expect(Object.keys(linkListMW).length).to.equal(2);\r", + " pm.expect(mwLinkPoints.length).to.equal(2);\r", + " pm.expect(mwLinkPoints[0][0][\"te-node-id\"]).to.equal(\r", + " mwLinkPoints[1][1][\"te-node-id\"]);\r", + " pm.expect(mwLinkPoints[0][0][\"te-tp-id\"]).to.equal(\r", + " mwLinkPoints[1][1][\"te-tp-id\"]);\r", + " pm.expect(mwLinkPoints[0][1][\"te-node-id\"]).to.equal(\r", + " mwLinkPoints[1][0][\"te-node-id\"]);\r", + " pm.expect(mwLinkPoints[0][1][\"te-tp-id\"]).to.equal(\r", + " mwLinkPoints[1][0][\"te-tp-id\"]);\r", + " pm.environment.set('TD_SDN_SETTINGS', settings);\r", + "});\r", + "\r", + "pm.test('Microwave topology links OPER verification', function() {\r", + " for (var key in linkListMW) {\r", + " var link = linkListMW[key];\r", + " pm.expect(link).to.have.property('ietf-te-topology:te');\r", + " pm.expect(link['ietf-te-topology:te']).to.have.property(\"oper-status\", \"up\");\r", + " pm.expect(link['ietf-te-topology:te']).to.have.property('te-link-attributes');\r", + " pm.expect(link['ietf-te-topology:te']['te-link-attributes']).to.have.property('ietf-microwave-topology:mw-link-nominal-bandwidth');\r", + " pm.expect(link['ietf-te-topology:te']['te-link-attributes']).to.have.property('ietf-microwave-topology:mw-link-current-bandwidth');\r", + " pm.expect(link['ietf-te-topology:te']['te-link-attributes']).to.have.property('ietf-microwave-topology:mw-link-unreserved-bandwidth'); \r", + " }\r", + "});\r", + "\r", + "function parseAllNetworks() {\r", + " var topLevelPropertyName = responseJson.hasOwnProperty('networks') ? 'networks' : 'ietf-network:networks';\r", + " console.info('topLevelPropertyName=', topLevelPropertyName)\r", + " pm.test('The response body should contain information about networks', function() {\r", + " pm.expect(responseJson).to.have.property(topLevelPropertyName);\r", + " pm.expect(responseJson[topLevelPropertyName]).to.have.property('network');\r", + " responseJson[topLevelPropertyName].network.forEach(function(item, index) {\r", + " pm.expect(item).to.have.property('network-id');\r", + " pm.expect(networkList).to.not.have.property(item['network-id']); // Make sure each network-id appears only once\r", + " networkList[item['network-id']] = item;\r", + " });\r", + " });\r", + " \r", + " eth = findEthNetwork(responseJson[topLevelPropertyName].network);\r", + "\r", + " mw = findMWNetwork(responseJson[topLevelPropertyName].network);\r", + "}\r", + "\r", + "function findEthNetwork(networks) {\r", + " var len = networks.length;\r", + " var i;\r", + " var net;\r", + " for (i = 0; i < len; ++i) {\r", + " net = networks[i];\r", + " if (net['network-types']\r", + " && net['network-types']['ietf-te-topology:te-topology']\r", + " && net['network-types']['ietf-te-topology:te-topology']['ietf-eth-te-topology:eth-tran-topology']) {\r", + " return net;\r", + " }\r", + " }\r", + " return null;\r", + "}\r", + "\r", + "function findMWNetwork(networks) {\r", + " var len = networks.length;\r", + " var i;\r", + " var net;\r", + " for (i = 0; i < len; ++i) {\r", + " net = networks[i];\r", + " if (net['network-types']\r", + " && net['network-types']['ietf-te-topology:te-topology']\r", + " && net['network-types']['ietf-te-topology:te-topology']['ietf-microwave-topology:mw-topology']) {\r", + " return net; \r", + " }\r", + " }\r", + " return null;\r", + "}\r", + "\r", + "function findNetworkNodes(networks) {\r", + " networks.node.forEach(function(item, index) {\r", + " pm.expect(item).to.have.property('node-id');\r", + " pm.expect(nodes).to.not.have.property(item['node-id']); // Make sure each node-id appears only once\r", + " nodes[item['node-id']] = item;\r", + " var regExpStr = '^(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\\.'\r", + " + '(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\\.'\r", + " + '(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\\.'\r", + " + '(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)$';\r", + " var regExp = new RegExp(regExpStr);\r", + " pm.expect(regExp.test(item['node-id'])).to.be.true;\r", + " });\r", + "}\r", + "" + ], + "type": "text/javascript", + "packages": {} + } + }, + { + "listen": "prerequest", + "script": { + "exec": [ + "// Check PICS requirements\r", + "if ((pm.environment.get('PICS_IUT_PNC') != \"true\") || (pm.environment.get('PICS_RESTCONF') != \"true\") || (pm.environment.get('PICS_SEC_TLS') != \"true\") || (pm.environment.get('ABSTRACT_PT') != \"true\") || (pm.environment.get('PICS_MW_TOPO') != \"true\")) {\r", + " throw new Error('PICS_IUT_PNC and PICS_RESTCONF and PICS_SEC_TLS and ABSTRACT_PT and PICS_MW_TOPO are required.');\r", + "}\r", + "" ], "type": "text/javascript", "packages": {} @@ -1354,16 +1804,11 @@ ], "request": { "auth": { - "type": "basic", - "basic": [ - { - "key": "username", - "value": "{{PX_USER}}", - "type": "string" - }, + "type": "bearer", + "bearer": [ { - "key": "password", - "value": "{{PX_USER_PASSWD}}", + "key": "token", + "value": "{{PX_ACCESS_TOKEN}}", "type": "string" } ] @@ -1371,7 +1816,7 @@ "method": "GET", "header": [], "url": { - "raw": "{{PX_PROTOCOL}}://{{PX_IUT_IP_ADDRESS}}:{{PX_IUT_IP_PORT}}/{{PX_ROOT_API}}/ietf-microwave-topology/ietf-network:networks/network={PX_NETWORK_ID}/node/topologyId/mw-native-topology", + "raw": "{{PX_PROTOCOL}}://{{PX_IUT_IP_ADDRESS}}:{{PX_IUT_IP_PORT}}/{{PX_ROOT_API}}/ietf-microwave-topology/ietf-network:networks/network={{PX_NETWORK_ID}}/node/topologyId/mw-native-topology", "protocol": "{{PX_PROTOCOL}}", "host": [ "{{PX_IUT_IP_ADDRESS}}" @@ -1381,7 +1826,7 @@ "{{PX_ROOT_API}}", "ietf-microwave-topology", "ietf-network:networks", - "network={PX_NETWORK_ID}", + "network={{PX_NETWORK_ID}}", "node", "topologyId", "mw-native-topology" @@ -1403,54 +1848,24 @@ "listen": "test", "script": { "exec": [ - "pm.test(\"Verify that the response status code is 200\", function () {\r", + "pm.test(\"Verify that the response status code is 404\", function () {\r", " pm.response.to.have.status(404);\r", "});\r", - "\r", - "var responseData = '';\r", - "var topLevelPropertyName = '';\r", - "\r", - "pm.test(\"Verify that headers.Content-Type is 'application/yang-data+json'\", function () {\r", - " pm.expect(pm.response.headers.get('Content-Type')).is.equals('application/yang-data+json');\r", - " responseData = pm.response.json();\r", - " topLevelPropertyName = responseData.hasOwnProperty('modules-state') ? 'modules-state' : 'ietf-yang-library:modules-state';\r", - " console.info(topLevelPropertyName)\r", - "});\r", - "\r", - "// var moduleList = {};\r", - "\r", - "// pm.test(\"Validate the main field is 'ietf-yang-library:modules-state'\", function () {\r", - "// pm.expect(responseData).to.be.an('object');\r", - "// pm.expect(responseData).to.have.property(topLevelPropertyName);\r", - "// });\r", - "\r", - "// pm.test(\"Verify that the 'module' array is present and not empty\", function () {\r", - "// pm.expect(responseData).to.be.an('object');\r", - "// pm.expect(responseData[topLevelPropertyName][\"module\"]).to.be.an('array').with.lengthOf.at.least(1);\r", - "// // Build the module list\r", - "// responseData[topLevelPropertyName].module.forEach(function(item, index) {\r", - "// pm.expect(item).to.have.property('name');\r", - "// pm.expect(item).to.have.property('revision');\r", - "// pm.expect(item).to.have.property('namespace');\r", - "// if (moduleList.hasOwnProperty(item.name)) {\r", - "// if (moduleList[item.name].revision < item.revision) {\r", - "// moduleList[item.name] = item;\r", - "// }\r", - "// } else {\r", - "// moduleList[item.name] = item;\r", - "// }\r", - "// });\r", - "\r", - "// });\r", - "\r", - "// pm.test('Verify that the basics YANG modules are supported', function() {\r", - "// pm.expect(moduleList).to.have.property(\"ietf-restconf\");\r", - "// pm.expect(moduleList).to.have.property(\"ietf-yang-library\");\r", - "// pm.expect(moduleList).to.have.property(\"ietf-datastores\");\r", - "// pm.expect(moduleList).to.have.property(\"ietf-inet-types\");\r", - "// pm.expect(moduleList).to.have.property(\"ietf-interfaces\");\r", - "// pm.expect(moduleList).to.have.property(\"ietf-ip\");\r", - "//});" + "" + ], + "type": "text/javascript", + "packages": {} + } + }, + { + "listen": "prerequest", + "script": { + "exec": [ + "// Check PICS requirements\r", + "if ((pm.environment.get('PICS_IUT_PNC') != \"true\") || (pm.environment.get('PICS_RESTCONF') != \"true\") || (pm.environment.get('PICS_SEC_TLS') != \"true\") || (pm.environment.get('ABSTRACT_PT') != \"true\") || (pm.environment.get('PICS_MW_TOPO') != \"true\")) {\r", + " throw new Error('PICS_IUT_PNC and PICS_RESTCONF and PICS_SEC_TLS and ABSTRACT_PT and PICS_MW_TOPO are required.');\r", + "}\r", + "" ], "type": "text/javascript", "packages": {} @@ -1459,16 +1874,11 @@ ], "request": { "auth": { - "type": "basic", - "basic": [ + "type": "bearer", + "bearer": [ { - "key": "username", - "value": "{{PX_USER}}", - "type": "string" - }, - { - "key": "password", - "value": "{{PX_USER_PASSWD}}", + "key": "token", + "value": "{{PX_ACCESS_TOKEN}}", "type": "string" } ] @@ -1476,7 +1886,7 @@ "method": "GET", "header": [], "url": { - "raw": "{{PX_PROTOCOL}}://{{PX_IUT_IP_ADDRESS}}:{{PX_IUT_IP_PORT}}/{{PX_ROOT_API}}/ietf-microwave-topology/ietf-network:networks/network={PX_NETWORK_ID}/node={PX_UNKNOWN_NODE_ID}/topologyId/mw-native-topology", + "raw": "{{PX_PROTOCOL}}://{{PX_IUT_IP_ADDRESS}}:{{PX_IUT_IP_PORT}}/{{PX_ROOT_API}}/ietf-microwave-topology/ietf-network:networks/network={{PX_NETWORK_ID}}/node={{PX_UNKNOWN_NODE_ID}}/topologyId/mw-native-topology", "protocol": "{{PX_PROTOCOL}}", "host": [ "{{PX_IUT_IP_ADDRESS}}" @@ -1486,8 +1896,8 @@ "{{PX_ROOT_API}}", "ietf-microwave-topology", "ietf-network:networks", - "network={PX_NETWORK_ID}", - "node={PX_UNKNOWN_NODE_ID}", + "network={{PX_NETWORK_ID}}", + "node={{PX_UNKNOWN_NODE_ID}}", "topologyId", "mw-native-topology" ] @@ -1512,50 +1922,218 @@ " pm.response.to.have.status(200);\r", "});\r", "\r", - "var responseData = '';\r", - "var topLevelPropertyName = '';\r", + "var responseJson = pm.response.json();\r", + "var networkList = null;\r", + "var eth = null;\r", + "var mw = null;\r", + "var nodes = null;\r", + "\r", + "pm.test(\"Verify that headers.Content-Type is 'application/yang-data+json; charset=utf-8'\", function () {\r", + " pm.expect(pm.response.headers.get('Content-Type')).is.equals('application/yang-data+json; charset=utf-8');\r", + " responseJson = pm.response.json();\r", + " parseAllNetworks()\r", + " console.info('networkList: ', networkList)\r", + " console.info('eth: ', eth)\r", + " console.info('mw: ', mw)\r", + "});\r", "\r", - "pm.test(\"Verify that headers.Content-Type is 'application/yang-data+json'\", function () {\r", - " pm.expect(pm.response.headers.get('Content-Type')).is.equals('application/yang-data+json');\r", - " responseData = pm.response.json();\r", - " topLevelPropertyName = responseData.hasOwnProperty('modules-state') ? 'modules-state' : 'ietf-yang-library:modules-state';\r", - " console.info(topLevelPropertyName)\r", + "pm.test('Verify that are present all mandatories microwave topology attributes', function() {\r", + " pm.expect(mw).to.have.property('network-id');\r", + "\r", + " pm.expect(mw).to.have.property('network-types');\r", + " pm.expect(mw['network-types']).to.have.property('ietf-te-topology:te-topology');\r", + " pm.expect(mw['network-types']['ietf-te-topology:te-topology']).to.have.property('ietf-microwave-topology:mw-topology');\r", + "\r", + " pm.expect(mw).to.have.property(\"ietf-te-topology:provider-id\"); //, provider_id);\r", + " pm.expect(mw).to.have.property(\"ietf-te-topology:client-id\"); //, client_id);\r", + " pm.expect(mw).to.have.property(\"ietf-te-topology:te-topology-id\"); //, mw_topology_id);\r", + " pm.expect(mw).to.have.property(\"ietf-te-topology:te\");\r", + " pm.expect(mw['ietf-te-topology:te']).to.have.property('name'); //, mw_network_name);\r", "});\r", "\r", - "// var moduleList = {};\r", + "pm.test('Verifiy that Microwave topology nodes conatins all mandatory fileds', function() {\r", + " pm.expect(mw).to.have.property('node');\r", + " pm.expect(Object.keys(nodes).length).to.equal(2);\r", + " nodes.forEach(function(item, index) {\r", + " pm.expect(item).to.have.property('ietf-te-topology:te-node-id', item['node-id']);\r", + " pm.expect(item).to.have.property('ietf-te-topology:te');\r", + " pm.expect(item['ietf-te-topology:te']).to.have.property('te-node-attributes');\r", + " pm.expect(item['ietf-te-topology:te']['te-node-attributes']).to.have.property('name'); //vendor independent\r", + " });\r", + "});\r", "\r", - "// pm.test(\"Validate the main field is 'ietf-yang-library:modules-state'\", function () {\r", - "// pm.expect(responseData).to.be.an('object');\r", - "// pm.expect(responseData).to.have.property(topLevelPropertyName);\r", - "// });\r", + "pm.test('Microwave topology nodes OPER verification', function() {\r", + " for (var key in nodes) {\r", + " pm.expect(nodes[key]['ietf-te-topology:te']).to.have.property('oper-status', 'up');\r", + " }\r", + "});\r", "\r", - "// pm.test(\"Verify that the 'module' array is present and not empty\", function () {\r", - "// pm.expect(responseData).to.be.an('object');\r", - "// pm.expect(responseData[topLevelPropertyName][\"module\"]).to.be.an('array').with.lengthOf.at.least(1);\r", - "// // Build the module list\r", - "// responseData[topLevelPropertyName].module.forEach(function(item, index) {\r", - "// pm.expect(item).to.have.property('name');\r", - "// pm.expect(item).to.have.property('revision');\r", - "// pm.expect(item).to.have.property('namespace');\r", - "// if (moduleList.hasOwnProperty(item.name)) {\r", - "// if (moduleList[item.name].revision < item.revision) {\r", - "// moduleList[item.name] = item;\r", - "// }\r", - "// } else {\r", - "// moduleList[item.name] = item;\r", - "// }\r", - "// });\r", + "pm.test('Microwave topology termination points verification', function() {\r", + " for (var key in nodes) {\r", + " var node = nodes[key];\r", + " pm.expect(node).to.have.property('ietf-network-topology:termination-point');\r", + " node.tp = {};\r", + " node['ietf-network-topology:termination-point'].sort(compare_tpid);\r", + " node['ietf-network-topology:termination-point'].forEach(function(tp, index) {\r", + " pm.expect(tp).to.have.property('tp-id'); // Vendor independent, only check existence\r", + " pm.expect(node.tp).to.not.have.property(tp['tp-id']); // Make sure each tp-id appears only once\r", + " node.tp[tp['tp-id']] = tp;\r", + " pm.expect(tp).to.have.property('ietf-te-topology:te-tp-id'); // Vendor independent, only check existence\r", + " pm.expect(tp).to.have.property('ietf-te-topology:te');\r", + " pm.expect(tp['ietf-te-topology:te']).to.have.property('admin-status', 'up');\r", + " pm.expect(tp['ietf-te-topology:te']).to.have.property('name');\r", + " });\r", + " }\r", + "});\r", "\r", - "// });\r", + "// Ensure nodes have the full tp information when the above verification partially fails, or the link verification will fail\r", + "for (var key in nodes) {\r", + " var node = nodes[key];\r", + " node.tp = {};\r", + " node['ietf-network-topology:termination-point'].sort(compare_tpid);\r", + " node['ietf-network-topology:termination-point'].forEach(function(tp, index) {\r", + " node.tp[tp['tp-id']] = tp;\r", + " });\r", + "}\r", "\r", - "// pm.test('Verify that the basics YANG modules are supported', function() {\r", - "// pm.expect(moduleList).to.have.property(\"ietf-restconf\");\r", - "// pm.expect(moduleList).to.have.property(\"ietf-yang-library\");\r", - "// pm.expect(moduleList).to.have.property(\"ietf-datastores\");\r", - "// pm.expect(moduleList).to.have.property(\"ietf-inet-types\");\r", - "// pm.expect(moduleList).to.have.property(\"ietf-interfaces\");\r", - "// pm.expect(moduleList).to.have.property(\"ietf-ip\");\r", - "//});" + "pm.test('Microwave topology termination points OPER verification', function() {\r", + " for (var key in nodes) {\r", + " var node = nodes[key];\r", + " pm.expect(node).to.have.property('ietf-network-topology:termination-point');\r", + " node['ietf-network-topology:termination-point'].forEach(function(tp, index) {\r", + " pm.expect(tp['ietf-te-topology:te']).to.have.property('oper-status', 'up');\r", + " });\r", + " }\r", + "});\r", + "\r", + "pm.test('Microwave topology links verification', function() {\r", + " var mwLinkPoints = [];\r", + " pm.expect(mw).to.have.property('ietf-network-topology:link');\r", + " mw['ietf-network-topology:link'].forEach(function(item, index) {\r", + " pm.expect(item).to.have.property('link-id');\r", + " pm.expect(linkListMW).to.not.have.property(item['link-id']); // Make sure each link-id appears only once\r", + " linkListMW[item['link-id']] = item;\r", + " pm.expect(item).to.have.property('source');\r", + " pm.expect(item.source).to.have.property('source-node');\r", + " pm.expect(item.source).to.have.property('source-tp');\r", + " pm.expect(nodes).to.have.property(item.source['source-node']);\r", + " pm.expect(nodes[item.source['source-node']].tp).to.have.property(item.source['source-tp']);\r", + " pm.expect(item).to.have.property('destination');\r", + " pm.expect(item.destination).to.have.property('dest-node');\r", + " pm.expect(item.destination).to.have.property('dest-tp');\r", + " pm.expect(nodes).to.have.property(item.destination['dest-node']);\r", + " pm.expect(nodes[item.destination['dest-node']].tp).to.have.property(item.destination['dest-tp']);\r", + "\r", + " pm.expect(item).to.have.property('ietf-te-topology:te');\r", + " pm.expect(item['ietf-te-topology:te']).to.have.property('te-link-attributes');\r", + "\r", + " pm.expect(item['ietf-te-topology:te']['te-link-attributes']).to.have.property('admin-status', 'up');\r", + " pm.expect(item['ietf-te-topology:te']['te-link-attributes']).to.have.property('ietf-microwave-topology:mw-link-frequency');\r", + " pm.expect(item['ietf-te-topology:te']['te-link-attributes']).to.have.property('ietf-microwave-topology:mw-link-channel-separation');\r", + " // pm.expect(item['ietf-te-topology:te']['te-link-attributes']).to.have.property('ietf-microwave-topology:mw-link-availability');\r", + " // TODO - do we need to check anything with the availability? Likely not. Do we need this at all for now?\r", + " });\r", + " pm.expect(Object.keys(linkListMW).length).to.equal(2);\r", + " pm.expect(mwLinkPoints.length).to.equal(2);\r", + " pm.expect(mwLinkPoints[0][0][\"te-node-id\"]).to.equal(\r", + " mwLinkPoints[1][1][\"te-node-id\"]);\r", + " pm.expect(mwLinkPoints[0][0][\"te-tp-id\"]).to.equal(\r", + " mwLinkPoints[1][1][\"te-tp-id\"]);\r", + " pm.expect(mwLinkPoints[0][1][\"te-node-id\"]).to.equal(\r", + " mwLinkPoints[1][0][\"te-node-id\"]);\r", + " pm.expect(mwLinkPoints[0][1][\"te-tp-id\"]).to.equal(\r", + " mwLinkPoints[1][0][\"te-tp-id\"]);\r", + " pm.environment.set('TD_SDN_SETTINGS', settings);\r", + "});\r", + "\r", + "pm.test('Microwave topology links OPER verification', function() {\r", + " for (var key in linkListMW) {\r", + " var link = linkListMW[key];\r", + " pm.expect(link).to.have.property('ietf-te-topology:te');\r", + " pm.expect(link['ietf-te-topology:te']).to.have.property(\"oper-status\", \"up\");\r", + " pm.expect(link['ietf-te-topology:te']).to.have.property('te-link-attributes');\r", + " pm.expect(link['ietf-te-topology:te']['te-link-attributes']).to.have.property('ietf-microwave-topology:mw-link-nominal-bandwidth');\r", + " pm.expect(link['ietf-te-topology:te']['te-link-attributes']).to.have.property('ietf-microwave-topology:mw-link-current-bandwidth');\r", + " pm.expect(link['ietf-te-topology:te']['te-link-attributes']).to.have.property('ietf-microwave-topology:mw-link-unreserved-bandwidth'); \r", + " }\r", + "});\r", + "\r", + "function parseAllNetworks() {\r", + " var topLevelPropertyName = responseJson.hasOwnProperty('networks') ? 'networks' : 'ietf-network:networks';\r", + " console.info('topLevelPropertyName=', topLevelPropertyName)\r", + " pm.test('The response body should contain information about networks', function() {\r", + " pm.expect(responseJson).to.have.property(topLevelPropertyName);\r", + " pm.expect(responseJson[topLevelPropertyName]).to.have.property('network');\r", + " responseJson[topLevelPropertyName].network.forEach(function(item, index) {\r", + " pm.expect(item).to.have.property('network-id');\r", + " pm.expect(networkList).to.not.have.property(item['network-id']); // Make sure each network-id appears only once\r", + " networkList[item['network-id']] = item;\r", + " });\r", + " });\r", + " \r", + " eth = findEthNetwork(responseJson[topLevelPropertyName].network);\r", + "\r", + " mw = findMWNetwork(responseJson[topLevelPropertyName].network);\r", + "}\r", + "\r", + "function findEthNetwork(networks) {\r", + " var len = networks.length;\r", + " var i;\r", + " var net;\r", + " for (i = 0; i < len; ++i) {\r", + " net = networks[i];\r", + " if (net['network-types']\r", + " && net['network-types']['ietf-te-topology:te-topology']\r", + " && net['network-types']['ietf-te-topology:te-topology']['ietf-eth-te-topology:eth-tran-topology']) {\r", + " return net;\r", + " }\r", + " }\r", + " return null;\r", + "}\r", + "\r", + "function findMWNetwork(networks) {\r", + " var len = networks.length;\r", + " var i;\r", + " var net;\r", + " for (i = 0; i < len; ++i) {\r", + " net = networks[i];\r", + " if (net['network-types']\r", + " && net['network-types']['ietf-te-topology:te-topology']\r", + " && net['network-types']['ietf-te-topology:te-topology']['ietf-microwave-topology:mw-topology']) {\r", + " return net; \r", + " }\r", + " }\r", + " return null;\r", + "}\r", + "\r", + "function findNetworkNodes(networks) {\r", + " networks.node.forEach(function(item, index) {\r", + " pm.expect(item).to.have.property('node-id');\r", + " pm.expect(nodes).to.not.have.property(item['node-id']); // Make sure each node-id appears only once\r", + " nodes[item['node-id']] = item;\r", + " var regExpStr = '^(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\\.'\r", + " + '(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\\.'\r", + " + '(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\\.'\r", + " + '(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)$';\r", + " var regExp = new RegExp(regExpStr);\r", + " pm.expect(regExp.test(item['node-id'])).to.be.true;\r", + " });\r", + "}\r", + "" + ], + "type": "text/javascript", + "packages": {} + } + }, + { + "listen": "prerequest", + "script": { + "exec": [ + "// Check PICS requirements\r", + "if ((pm.environment.get('PICS_IUT_PNC') != \"true\") || (pm.environment.get('PICS_RESTCONF') != \"true\") || (pm.environment.get('PICS_SEC_TLS') != \"true\") || (pm.environment.get('ABSTRACT_PT') != \"true\") || (pm.environment.get('PICS_MW_TOPO') != \"true\")) {\r", + " throw new Error('PICS_IUT_PNC and PICS_RESTCONF and PICS_SEC_TLS and ABSTRACT_PT and PICS_MW_TOPO are required.');\r", + "}\r", + "" ], "type": "text/javascript", "packages": {} @@ -1564,16 +2142,11 @@ ], "request": { "auth": { - "type": "basic", - "basic": [ - { - "key": "username", - "value": "{{PX_USER}}", - "type": "string" - }, + "type": "bearer", + "bearer": [ { - "key": "password", - "value": "{{PX_USER_PASSWD}}", + "key": "token", + "value": "{{PX_ACCESS_TOKEN}}", "type": "string" } ] @@ -1581,7 +2154,7 @@ "method": "GET", "header": [], "url": { - "raw": "{{PX_PROTOCOL}}://{{PX_IUT_IP_ADDRESS}}:{{PX_IUT_IP_PORT}}/{{PX_ROOT_API}}/ietf-microwave-topology/ietf-network:networks/network={PX_NETWORK_ID}/node={PX_NODE_ID}/topologyId/mw-native-topology", + "raw": "{{PX_PROTOCOL}}://{{PX_IUT_IP_ADDRESS}}:{{PX_IUT_IP_PORT}}/{{PX_ROOT_API}}/ietf-microwave-topology/ietf-network:networks/network={{PX_NETWORK_ID}}/node={{PX_NODE_ID}}/topologyId/mw-native-topology", "protocol": "{{PX_PROTOCOL}}", "host": [ "{{PX_IUT_IP_ADDRESS}}" @@ -1591,8 +2164,8 @@ "{{PX_ROOT_API}}", "ietf-microwave-topology", "ietf-network:networks", - "network={PX_NETWORK_ID}", - "node={PX_NODE_ID}", + "network={{PX_NETWORK_ID}}", + "node={{PX_NODE_ID}}", "topologyId", "mw-native-topology" ] @@ -1622,50 +2195,88 @@ " pm.response.to.have.status(200);\r", "});\r", "\r", - "var responseData = '';\r", - "var topLevelPropertyName = '';\r", - "\r", - "pm.test(\"Verify that headers.Content-Type is 'application/yang-data+json'\", function () {\r", - " pm.expect(pm.response.headers.get('Content-Type')).is.equals('application/yang-data+json');\r", - " responseData = pm.response.json();\r", - " topLevelPropertyName = responseData.hasOwnProperty('modules-state') ? 'modules-state' : 'ietf-yang-library:modules-state';\r", - " console.info(topLevelPropertyName)\r", + "var responseJson = pm.response.json();\r", + "var networkList = null;\r", + "var eth = null;\r", + "var mw = null;\r", + "\r", + "pm.test(\"Verify that headers.Content-Type is 'application/yang-data+json; charset=utf-8'\", function () {\r", + " pm.expect(pm.response.headers.get('Content-Type')).is.equals('application/yang-data+json; charset=utf-8');\r", + " responseJson = pm.response.json();\r", + " parseAllNetworks()\r", + " console.info('networkList: ', networkList)\r", + " console.info('eth: ', eth)\r", + " console.info('mw: ', mw)\r", "});\r", "\r", - "// var moduleList = {};\r", + "pm.test('Verify that the IUT contains network information', function() {\r", + " pm.expect(eth).to.not.equal(null);\r", + "});\r", "\r", - "// pm.test(\"Validate the main field is 'ietf-yang-library:modules-state'\", function () {\r", - "// pm.expect(responseData).to.be.an('object');\r", - "// pm.expect(responseData).to.have.property(topLevelPropertyName);\r", - "// });\r", + "pm.test('Ethernet topology attributes verification', function() {\r", + " pm.expect(eth).to.have.property('network-id');\r", + " pm.expect(eth).to.have.property('ietf-te-topology:provider-id');\r", + " pm.expect(eth).to.have.property('ietf-te-topology:client-id');\r", + " pm.expect(eth).to.have.property('ietf-te-topology:te-topology-id');\r", + " pm.expect(eth).to.have.property('ietf-te-topology:te');\r", + " pm.expect(eth['ietf-te-topology:te']).to.have.property('name');\r", + "\r", + " if (!eth.hasOwnProperty('network-id')\r", + " || !eth.hasOwnProperty('ietf-te-topology:provider-id')\r", + " || !eth.hasOwnProperty('ietf-te-topology:client-id')\r", + " || !eth.hasOwnProperty('ietf-te-topology:te-topology-id')) {\r", + " throw new Error('One of the identifiers is missing'); \r", + " }\r", + "});\r", "\r", - "// pm.test(\"Verify that the 'module' array is present and not empty\", function () {\r", - "// pm.expect(responseData).to.be.an('object');\r", - "// pm.expect(responseData[topLevelPropertyName][\"module\"]).to.be.an('array').with.lengthOf.at.least(1);\r", - "// // Build the module list\r", - "// responseData[topLevelPropertyName].module.forEach(function(item, index) {\r", - "// pm.expect(item).to.have.property('name');\r", - "// pm.expect(item).to.have.property('revision');\r", - "// pm.expect(item).to.have.property('namespace');\r", - "// if (moduleList.hasOwnProperty(item.name)) {\r", - "// if (moduleList[item.name].revision < item.revision) {\r", - "// moduleList[item.name] = item;\r", - "// }\r", - "// } else {\r", - "// moduleList[item.name] = item;\r", - "// }\r", - "// });\r", + "function parseAllNetworks() {\r", + " var topLevelPropertyName = responseJson.hasOwnProperty('networks') ? 'networks' : 'ietf-network:networks';\r", + " console.info('topLevelPropertyName=', topLevelPropertyName)\r", + " pm.test('The response body should contain information about networks', function() {\r", + " pm.expect(responseJson).to.have.property(topLevelPropertyName);\r", + " pm.expect(responseJson[topLevelPropertyName]).to.have.property('network');\r", + " responseJson[topLevelPropertyName].network.forEach(function(item, index) {\r", + " pm.expect(item).to.have.property('network-id');\r", + " pm.expect(networkList).to.not.have.property(item['network-id']); // Make sure each network-id appears only once\r", + " networkList[item['network-id']] = item;\r", + " });\r", + " });\r", + " \r", + " eth = findEthNetwork(responseJson[topLevelPropertyName].network);\r", + "\r", + " mw = findMWNetwork(responseJson[topLevelPropertyName].network);\r", + "}\r", "\r", - "// });\r", + "function findEthNetwork(networks) {\r", + " var len = networks.length;\r", + " var i;\r", + " var net;\r", + " for (i = 0; i < len; ++i) {\r", + " net = networks[i];\r", + " if (net['network-types']\r", + " && net['network-types']['ietf-te-topology:te-topology']\r", + " && net['network-types']['ietf-te-topology:te-topology']['ietf-eth-te-topology:eth-tran-topology']) {\r", + " return net;\r", + " }\r", + " }\r", + " return null;\r", + "}\r", "\r", - "// pm.test('Verify that the basics YANG modules are supported', function() {\r", - "// pm.expect(moduleList).to.have.property(\"ietf-restconf\");\r", - "// pm.expect(moduleList).to.have.property(\"ietf-yang-library\");\r", - "// pm.expect(moduleList).to.have.property(\"ietf-datastores\");\r", - "// pm.expect(moduleList).to.have.property(\"ietf-inet-types\");\r", - "// pm.expect(moduleList).to.have.property(\"ietf-interfaces\");\r", - "// pm.expect(moduleList).to.have.property(\"ietf-ip\");\r", - "//});" + "function findMWNetwork(networks) {\r", + " var len = networks.length;\r", + " var i;\r", + " var net;\r", + " for (i = 0; i < len; ++i) {\r", + " net = networks[i];\r", + " if (net['network-types']\r", + " && net['network-types']['ietf-te-topology:te-topology']\r", + " && net['network-types']['ietf-te-topology:te-topology']['ietf-microwave-topology:mw-topology']) {\r", + " return net; \r", + " }\r", + " }\r", + " return null;\r", + "}\r", + "" ], "type": "text/javascript", "packages": {} @@ -1676,8 +2287,8 @@ "script": { "exec": [ "// Check PICS requirements\r", - "if ((pm.environment.get('PICS_IUT_PNC') != \"true\") || (pm.environment.get('PICS_RESTCONF') != \"true\") || (pm.environment.get('PICS_SEC_TLS') != \"true\") || (pm.environment.get('PICS_ABSTRACT_BB') != \"true\") || (pm.environment.get('PICS_MW_TOPO') != \"true\")) {\r", - " throw new Error('PICS_IUT_PNC and PICS_RESTCONF and PICS_SEC_TLS and PICS_ABSTRACT_BB and PICS_MW_TOPO are required.');\r", + "if ((pm.environment.get('PICS_IUT_PNC') != \"true\") || (pm.environment.get('PICS_RESTCONF') != \"true\") || (pm.environment.get('PICS_SEC_TLS') != \"true\") || (pm.environment.get('ABSTRACT_PT') != \"true\") || (pm.environment.get('ETH_TOPO') != \"true\")) {\r", + " throw new Error('PICS_IUT_PNC and PICS_RESTCONF and PICS_SEC_TLS and ABSTRACT_PT and ETH_TOPO are required.');\r", "}\r", "" ], @@ -1688,16 +2299,11 @@ ], "request": { "auth": { - "type": "basic", - "basic": [ + "type": "bearer", + "bearer": [ { - "key": "password", - "value": "{{PX_USER_PASSWD}}", - "type": "string" - }, - { - "key": "username", - "value": "{{PX_USER}}", + "key": "token", + "value": "{{PX_ACCESS_TOKEN}}", "type": "string" } ] @@ -1742,50 +2348,104 @@ " pm.response.to.have.status(200);\r", "});\r", "\r", - "var responseData = '';\r", - "var topLevelPropertyName = '';\r", + "var responseJson = pm.response.json();\r", + "var networkList = null;\r", + "var eth = null;\r", + "var ethNodes = {};\r", + "var mw = null;\r", + "\r", + "pm.test(\"Verify that headers.Content-Type is 'application/yang-data+json; charset=utf-8'\", function () {\r", + " pm.expect(pm.response.headers.get('Content-Type')).is.equals('application/yang-data+json; charset=utf-8');\r", + " responseJson = pm.response.json();\r", + " parseAllNetworks()\r", + " console.info('networkList: ', networkList)\r", + " console.info('eth: ', eth)\r", + " console.info('ethNodes: ', ethNodes)\r", + " console.info('mw: ', mw)\r", + "});\r", "\r", - "pm.test(\"Verify that headers.Content-Type is 'application/yang-data+json'\", function () {\r", - " pm.expect(pm.response.headers.get('Content-Type')).is.equals('application/yang-data+json');\r", - " responseData = pm.response.json();\r", - " topLevelPropertyName = responseData.hasOwnProperty('modules-state') ? 'modules-state' : 'ietf-yang-library:modules-state';\r", - " console.info(topLevelPropertyName)\r", + "pm.test('Verify that the IUT contains network information', function() {\r", + " pm.expect(ethNodes).to.not.equal(null);\r", + " pm.expect(ethNodes.len).to.not.equal(0);\r", "});\r", "\r", - "// var moduleList = {};\r", + "pm.test('Ethernet topology attributes verification', function() {\r", + " pm.expect(eth).to.have.property('network-id');\r", + " pm.expect(eth).to.have.property('ietf-te-topology:provider-id');\r", + " pm.expect(eth).to.have.property('ietf-te-topology:client-id');\r", + " pm.expect(eth).to.have.property('ietf-te-topology:te-topology-id');\r", + " pm.expect(eth).to.have.property('ietf-te-topology:te');\r", + " pm.expect(eth['ietf-te-topology:te']).to.have.property('name');\r", + "\r", + " if (!eth.hasOwnProperty('network-id')\r", + " || !eth.hasOwnProperty('ietf-te-topology:provider-id')\r", + " || !eth.hasOwnProperty('ietf-te-topology:client-id')\r", + " || !eth.hasOwnProperty('ietf-te-topology:te-topology-id')) {\r", + " throw new Error('One of the identifiers is missing'); \r", + " }\r", + "});\r", "\r", - "// pm.test(\"Validate the main field is 'ietf-yang-library:modules-state'\", function () {\r", - "// pm.expect(responseData).to.be.an('object');\r", - "// pm.expect(responseData).to.have.property(topLevelPropertyName);\r", - "// });\r", + "function parseAllNetworks() {\r", + " var topLevelPropertyName = responseJson.hasOwnProperty('networks') ? 'networks' : 'ietf-network:networks';\r", + " console.info('topLevelPropertyName=', topLevelPropertyName)\r", + " pm.test('The response body should contain information about networks', function() {\r", + " pm.expect(responseJson).to.have.property(topLevelPropertyName);\r", + " pm.expect(responseJson[topLevelPropertyName]).to.have.property('network');\r", + " responseJson[topLevelPropertyName].network.forEach(function(item, index) {\r", + " pm.expect(item).to.have.property('network-id');\r", + " pm.expect(networkList).to.not.have.property(item['network-id']); // Make sure each network-id appears only once\r", + " networkList[item['network-id']] = item;\r", + " });\r", + " });\r", + " \r", + " eth = findEthNetwork(responseJson[topLevelPropertyName].network);\r", + " ethNodes = findNetworkNodes(eth)\r", + "\r", + " mw = findMWNetwork(responseJson[topLevelPropertyName].network);\r", + "}\r", "\r", - "// pm.test(\"Verify that the 'module' array is present and not empty\", function () {\r", - "// pm.expect(responseData).to.be.an('object');\r", - "// pm.expect(responseData[topLevelPropertyName][\"module\"]).to.be.an('array').with.lengthOf.at.least(1);\r", - "// // Build the module list\r", - "// responseData[topLevelPropertyName].module.forEach(function(item, index) {\r", - "// pm.expect(item).to.have.property('name');\r", - "// pm.expect(item).to.have.property('revision');\r", - "// pm.expect(item).to.have.property('namespace');\r", - "// if (moduleList.hasOwnProperty(item.name)) {\r", - "// if (moduleList[item.name].revision < item.revision) {\r", - "// moduleList[item.name] = item;\r", - "// }\r", - "// } else {\r", - "// moduleList[item.name] = item;\r", - "// }\r", - "// });\r", + "function findEthNetwork(networks) {\r", + " var len = networks.length;\r", + " var i;\r", + " var net;\r", + " for (i = 0; i < len; ++i) {\r", + " net = networks[i];\r", + " if (net['network-types']\r", + " && net['network-types']['ietf-te-topology:te-topology']\r", + " && net['network-types']['ietf-te-topology:te-topology']['ietf-eth-te-topology:eth-tran-topology']) {\r", + " return net;\r", + " }\r", + " }\r", + " return null;\r", + "}\r", "\r", - "// });\r", + "function findMWNetwork(networks) {\r", + " var len = networks.length;\r", + " var i;\r", + " var net;\r", + " for (i = 0; i < len; ++i) {\r", + " net = networks[i];\r", + " if (net['network-types']\r", + " && net['network-types']['ietf-te-topology:te-topology']\r", + " && net['network-types']['ietf-te-topology:te-topology']['ietf-microwave-topology:mw-topology']) {\r", + " return net; \r", + " }\r", + " }\r", + " return null;\r", + "}\r", "\r", - "// pm.test('Verify that the basics YANG modules are supported', function() {\r", - "// pm.expect(moduleList).to.have.property(\"ietf-restconf\");\r", - "// pm.expect(moduleList).to.have.property(\"ietf-yang-library\");\r", - "// pm.expect(moduleList).to.have.property(\"ietf-datastores\");\r", - "// pm.expect(moduleList).to.have.property(\"ietf-inet-types\");\r", - "// pm.expect(moduleList).to.have.property(\"ietf-interfaces\");\r", - "// pm.expect(moduleList).to.have.property(\"ietf-ip\");\r", - "//});" + "function findNetworkNodes(networks) {\r", + " var nodeListETH = {}\r", + "\r", + " networks.node.forEach(function(item, index) {\r", + " if(networks.node != null){\r", + " nodeListETH[item['node-id']] = item;\r", + " }\r", + " });\r", + "\r", + " return nodeListETH\r", + "}\r", + "" ], "type": "text/javascript", "packages": {} @@ -1796,8 +2456,8 @@ "script": { "exec": [ "// Check PICS requirements\r", - "if ((pm.environment.get('PICS_IUT_PNC') != \"true\") || (pm.environment.get('PICS_RESTCONF') != \"true\") || (pm.environment.get('PICS_SEC_TLS') != \"true\") || (pm.environment.get('PICS_ABSTRACT_BB') != \"true\") || (pm.environment.get('PICS_MW_TOPO') != \"true\")) {\r", - " throw new Error('PICS_IUT_PNC and PICS_RESTCONF and PICS_SEC_TLS and PICS_ABSTRACT_BB and PICS_MW_TOPO are required.');\r", + "if ((pm.environment.get('PICS_IUT_PNC') != \"true\") || (pm.environment.get('PICS_RESTCONF') != \"true\") || (pm.environment.get('PICS_SEC_TLS') != \"true\") || (pm.environment.get('ABSTRACT_PT') != \"true\") || (pm.environment.get('ETH_TOPO') != \"true\")) {\r", + " throw new Error('PICS_IUT_PNC and PICS_RESTCONF and PICS_SEC_TLS and ABSTRACT_PT and ETH_TOPO are required.');\r", "}\r", "" ], @@ -1808,16 +2468,11 @@ ], "request": { "auth": { - "type": "basic", - "basic": [ - { - "key": "password", - "value": "{{PX_USER_PASSWD}}", - "type": "string" - }, + "type": "bearer", + "bearer": [ { - "key": "username", - "value": "{{PX_USER}}", + "key": "token", + "value": "{{PX_ACCESS_TOKEN}}", "type": "string" } ] @@ -1830,7 +2485,7 @@ } ], "url": { - "raw": "{{PX_PROTOCOL}}://{{PX_IUT_IP_ADDRESS}}:{{PX_IUT_IP_PORT}}/{{PX_ROOT_API}}/ietf-network:networks/network={PX_NETWORK_ID}", + "raw": "{{PX_PROTOCOL}}://{{PX_IUT_IP_ADDRESS}}:{{PX_IUT_IP_PORT}}/{{PX_ROOT_API}}/ietf-network:networks/network={{PX_NETWORK_ID}}", "protocol": "{{PX_PROTOCOL}}", "host": [ "{{PX_IUT_IP_ADDRESS}}" @@ -1839,7 +2494,7 @@ "path": [ "{{PX_ROOT_API}}", "ietf-network:networks", - "network={PX_NETWORK_ID}" + "network={{PX_NETWORK_ID}}" ] }, "description": "/restconf/data/ietf-yang-library:modules-state" @@ -1859,7 +2514,7 @@ "listen": "test", "script": { "exec": [ - "pm.test(\"Verify that the response status code is 200\", function () {\r", + "pm.test(\"Verify that the response status code is 400\", function () {\r", " pm.response.to.have.status(400);\r", "});\r", "" @@ -1873,8 +2528,8 @@ "script": { "exec": [ "// Check PICS requirements\r", - "if ((pm.environment.get('PICS_IUT_PNC') != \"true\") || (pm.environment.get('PICS_RESTCONF') != \"true\") || (pm.environment.get('PICS_SEC_TLS') != \"true\") || (pm.environment.get('PICS_ABSTRACT_BB') != \"true\") || (pm.environment.get('PICS_MW_TOPO') != \"true\")) {\r", - " throw new Error('PICS_IUT_PNC and PICS_RESTCONF and PICS_SEC_TLS and PICS_ABSTRACT_BB and PICS_MW_TOPO are required.');\r", + "if ((pm.environment.get('PICS_IUT_PNC') != \"true\") || (pm.environment.get('PICS_RESTCONF') != \"true\") || (pm.environment.get('PICS_SEC_TLS') != \"true\") || (pm.environment.get('ABSTRACT_PT') != \"true\") || (pm.environment.get('ETH_TOPO') != \"true\")) {\r", + " throw new Error('PICS_IUT_PNC and PICS_RESTCONF and PICS_SEC_TLS and ABSTRACT_PT and ETH_TOPO are required.');\r", "}\r", "" ], @@ -1885,16 +2540,11 @@ ], "request": { "auth": { - "type": "basic", - "basic": [ - { - "key": "password", - "value": "{{PX_USER_PASSWD}}", - "type": "string" - }, + "type": "bearer", + "bearer": [ { - "key": "username", - "value": "{{PX_USER}}", + "key": "token", + "value": "{{PX_ACCESS_TOKEN}}", "type": "string" } ] @@ -1907,7 +2557,7 @@ } ], "url": { - "raw": "{{PX_PROTOCOL}}://{{PX_IUT_IP_ADDRESS}}:{{PX_IUT_IP_PORT}}/{{PX_ROOT_API}}/networks/{PX_NETWORK_ID}", + "raw": "{{PX_PROTOCOL}}://{{PX_IUT_IP_ADDRESS}}:{{PX_IUT_IP_PORT}}/{{PX_ROOT_API}}/networks/{{PX_NETWORK_ID}}", "protocol": "{{PX_PROTOCOL}}", "host": [ "{{PX_IUT_IP_ADDRESS}}" @@ -1916,7 +2566,7 @@ "path": [ "{{PX_ROOT_API}}", "networks", - "{PX_NETWORK_ID}" + "{{PX_NETWORK_ID}}" ] }, "description": "/restconf/data/ietf-yang-library:modules-state" @@ -1936,7 +2586,7 @@ "listen": "test", "script": { "exec": [ - "pm.test(\"Verify that the response status code is 200\", function () {\r", + "pm.test(\"Verify that the response status code is 404\", function () {\r", " pm.response.to.have.status(404);\r", "});\r", "" @@ -1950,8 +2600,8 @@ "script": { "exec": [ "// Check PICS requirements\r", - "if ((pm.environment.get('PICS_IUT_PNC') != \"true\") || (pm.environment.get('PICS_RESTCONF') != \"true\") || (pm.environment.get('PICS_SEC_TLS') != \"true\") || (pm.environment.get('PICS_ABSTRACT_BB') != \"true\") || (pm.environment.get('PICS_MW_TOPO') != \"true\")) {\r", - " throw new Error('PICS_IUT_PNC and PICS_RESTCONF and PICS_SEC_TLS and PICS_ABSTRACT_BB and PICS_MW_TOPO are required.');\r", + "if ((pm.environment.get('PICS_IUT_PNC') != \"true\") || (pm.environment.get('PICS_RESTCONF') != \"true\") || (pm.environment.get('PICS_SEC_TLS') != \"true\") || (pm.environment.get('ABSTRACT_PT') != \"true\") || (pm.environment.get('ETH_TOPO') != \"true\")) {\r", + " throw new Error('PICS_IUT_PNC and PICS_RESTCONF and PICS_SEC_TLS and ABSTRACT_PT and ETH_TOPO are required.');\r", "}\r", "" ], @@ -1962,16 +2612,11 @@ ], "request": { "auth": { - "type": "basic", - "basic": [ - { - "key": "password", - "value": "{{PX_USER_PASSWD}}", - "type": "string" - }, + "type": "bearer", + "bearer": [ { - "key": "username", - "value": "{{PX_USER}}", + "key": "token", + "value": "{{PX_ACCESS_TOKEN}}", "type": "string" } ] @@ -1984,7 +2629,7 @@ } ], "url": { - "raw": "{{PX_PROTOCOL}}://{{PX_IUT_IP_ADDRESS}}:{{PX_IUT_IP_PORT}}/{{PX_ROOT_API}}/networks/{PX_UNKNOWN_NETWORK_ID}", + "raw": "{{PX_PROTOCOL}}://{{PX_IUT_IP_ADDRESS}}:{{PX_IUT_IP_PORT}}/{{PX_ROOT_API}}/ietf-network:networks/network-id={{PX_UNKNOWN_NETWORK_ID}}", "protocol": "{{PX_PROTOCOL}}", "host": [ "{{PX_IUT_IP_ADDRESS}}" @@ -1992,8 +2637,8 @@ "port": "{{PX_IUT_IP_PORT}}", "path": [ "{{PX_ROOT_API}}", - "networks", - "{PX_UNKNOWN_NETWORK_ID}" + "ietf-network:networks", + "network-id={{PX_UNKNOWN_NETWORK_ID}}" ] }, "description": "/restconf/data/ietf-yang-library:modules-state" @@ -2017,50 +2662,115 @@ " pm.response.to.have.status(200);\r", "});\r", "\r", - "var responseData = '';\r", - "var topLevelPropertyName = '';\r", + "var responseJson = pm.response.json();\r", + "var networkList = null;\r", + "var eth = null;\r", + "var mw = null;\r", + "var nodes = null;\r", + "\r", + "pm.test(\"Verify that headers.Content-Type is 'application/yang-data+json; charset=utf-8'\", function () {\r", + " pm.expect(pm.response.headers.get('Content-Type')).is.equals('application/yang-data+json; charset=utf-8');\r", + " responseJson = pm.response.json();\r", + " parseAllNetworks()\r", + " console.info('networkList: ', networkList)\r", + " console.info('eth: ', eth)\r", + " console.info('mw: ', mw)\r", + "});\r", "\r", - "pm.test(\"Verify that headers.Content-Type is 'application/yang-data+json'\", function () {\r", - " pm.expect(pm.response.headers.get('Content-Type')).is.equals('application/yang-data+json');\r", - " responseData = pm.response.json();\r", - " topLevelPropertyName = responseData.hasOwnProperty('modules-state') ? 'modules-state' : 'ietf-yang-library:modules-state';\r", - " console.info(topLevelPropertyName)\r", + "pm.test('Verify that the IUT contains network information', function() {\r", + " pm.expect(eth).to.not.equal(null);\r", "});\r", "\r", - "// var moduleList = {};\r", + "pm.test('Ethernet topology attributes verification', function() {\r", + " pm.expect(eth).to.have.property('network-id');\r", + " pm.expect(eth).to.have.property('ietf-te-topology:provider-id');\r", + " pm.expect(eth).to.have.property('ietf-te-topology:client-id');\r", + " pm.expect(eth).to.have.property('ietf-te-topology:te-topology-id');\r", + " pm.expect(eth).to.have.property('ietf-te-topology:te');\r", + " pm.expect(eth['ietf-te-topology:te']).to.have.property('name');\r", + "\r", + " if (!eth.hasOwnProperty('network-id')\r", + " || !eth.hasOwnProperty('ietf-te-topology:provider-id')\r", + " || !eth.hasOwnProperty('ietf-te-topology:client-id')\r", + " || !eth.hasOwnProperty('ietf-te-topology:te-topology-id')) {\r", + " throw new Error('One of the identifiers is missing'); \r", + " }\r", + "});\r", "\r", - "// pm.test(\"Validate the main field is 'ietf-yang-library:modules-state'\", function () {\r", - "// pm.expect(responseData).to.be.an('object');\r", - "// pm.expect(responseData).to.have.property(topLevelPropertyName);\r", - "// });\r", + "pm.test('Ethernet topology nodes verification', function() {\r", + " pm.expect(eth).to.have.property('node');\r", + " pm.expect(Object.keys(nodes).length).to.equal(2);\r", + " pm.expect(mw).to.have.property('node');\r", + " nodes.forEach(function(item, index) {\r", + " pm.expect(item).to.have.property('ietf-te-topology:te-node-id', item['node-id']);\r", + " pm.expect(item).to.have.property('ietf-te-topology:te');\r", + " pm.expect(item['ietf-te-topology:te']).to.have.property('te-node-attributes');\r", + " pm.expect(item['ietf-te-topology:te']['te-node-attributes']).to.have.property('name'); //vendor independent\r", + " });\r", + "});\r", "\r", - "// pm.test(\"Verify that the 'module' array is present and not empty\", function () {\r", - "// pm.expect(responseData).to.be.an('object');\r", - "// pm.expect(responseData[topLevelPropertyName][\"module\"]).to.be.an('array').with.lengthOf.at.least(1);\r", - "// // Build the module list\r", - "// responseData[topLevelPropertyName].module.forEach(function(item, index) {\r", - "// pm.expect(item).to.have.property('name');\r", - "// pm.expect(item).to.have.property('revision');\r", - "// pm.expect(item).to.have.property('namespace');\r", - "// if (moduleList.hasOwnProperty(item.name)) {\r", - "// if (moduleList[item.name].revision < item.revision) {\r", - "// moduleList[item.name] = item;\r", - "// }\r", - "// } else {\r", - "// moduleList[item.name] = item;\r", - "// }\r", - "// });\r", + "function parseAllNetworks() {\r", + " var topLevelPropertyName = responseJson.hasOwnProperty('networks') ? 'networks' : 'ietf-network:networks';\r", + " console.info('topLevelPropertyName=', topLevelPropertyName)\r", + " pm.test('The response body should contain information about networks', function() {\r", + " pm.expect(responseJson).to.have.property(topLevelPropertyName);\r", + " pm.expect(responseJson[topLevelPropertyName]).to.have.property('network');\r", + " responseJson[topLevelPropertyName].network.forEach(function(item, index) {\r", + " pm.expect(item).to.have.property('network-id');\r", + " pm.expect(networkList).to.not.have.property(item['network-id']); // Make sure each network-id appears only once\r", + " networkList[item['network-id']] = item;\r", + " });\r", + " });\r", + " \r", + " eth = findEthNetwork(responseJson[topLevelPropertyName].network);\r", + "\r", + " mw = findMWNetwork(responseJson[topLevelPropertyName].network);\r", + "}\r", "\r", - "// });\r", + "function findEthNetwork(networks) {\r", + " var len = networks.length;\r", + " var i;\r", + " var net;\r", + " for (i = 0; i < len; ++i) {\r", + " net = networks[i];\r", + " if (net['network-types']\r", + " && net['network-types']['ietf-te-topology:te-topology']\r", + " && net['network-types']['ietf-te-topology:te-topology']['ietf-eth-te-topology:eth-tran-topology']) {\r", + " return net;\r", + " }\r", + " }\r", + " return null;\r", + "}\r", "\r", - "// pm.test('Verify that the basics YANG modules are supported', function() {\r", - "// pm.expect(moduleList).to.have.property(\"ietf-restconf\");\r", - "// pm.expect(moduleList).to.have.property(\"ietf-yang-library\");\r", - "// pm.expect(moduleList).to.have.property(\"ietf-datastores\");\r", - "// pm.expect(moduleList).to.have.property(\"ietf-inet-types\");\r", - "// pm.expect(moduleList).to.have.property(\"ietf-interfaces\");\r", - "// pm.expect(moduleList).to.have.property(\"ietf-ip\");\r", - "//});" + "function findMWNetwork(networks) {\r", + " var len = networks.length;\r", + " var i;\r", + " var net;\r", + " for (i = 0; i < len; ++i) {\r", + " net = networks[i];\r", + " if (net['network-types']\r", + " && net['network-types']['ietf-te-topology:te-topology']\r", + " && net['network-types']['ietf-te-topology:te-topology']['ietf-microwave-topology:mw-topology']) {\r", + " return net; \r", + " }\r", + " }\r", + " return null;\r", + "}\r", + "\r", + "function findNetworkNodes(networks) {\r", + " networks.node.forEach(function(item, index) {\r", + " pm.expect(item).to.have.property('node-id');\r", + " pm.expect(nodes).to.not.have.property(item['node-id']); // Make sure each node-id appears only once\r", + " nodes[item['node-id']] = item;\r", + " var regExpStr = '^(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\\.'\r", + " + '(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\\.'\r", + " + '(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\\.'\r", + " + '(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)$';\r", + " var regExp = new RegExp(regExpStr);\r", + " pm.expect(regExp.test(item['node-id'])).to.be.true;\r", + " });\r", + "}\r", + "" ], "type": "text/javascript", "packages": {} @@ -2071,8 +2781,8 @@ "script": { "exec": [ "// Check PICS requirements\r", - "if ((pm.environment.get('PICS_IUT_PNC') != \"true\") || (pm.environment.get('PICS_RESTCONF') != \"true\") || (pm.environment.get('PICS_SEC_TLS') != \"true\") || (pm.environment.get('PICS_ABSTRACT_BB') != \"true\") || (pm.environment.get('PICS_MW_TOPO') != \"true\")) {\r", - " throw new Error('PICS_IUT_PNC and PICS_RESTCONF and PICS_SEC_TLS and PICS_ABSTRACT_BB and PICS_MW_TOPO are required.');\r", + "if ((pm.environment.get('PICS_IUT_PNC') != \"true\") || (pm.environment.get('PICS_RESTCONF') != \"true\") || (pm.environment.get('PICS_SEC_TLS') != \"true\") || (pm.environment.get('ABSTRACT_PT') != \"true\") || (pm.environment.get('ETH_TOPO') != \"true\")) {\r", + " throw new Error('PICS_IUT_PNC and PICS_RESTCONF and PICS_SEC_TLS and ABSTRACT_PT and ETH_TOPO are required.');\r", "}\r", "" ], @@ -2083,16 +2793,11 @@ ], "request": { "auth": { - "type": "basic", - "basic": [ - { - "key": "password", - "value": "{{PX_USER_PASSWD}}", - "type": "string" - }, + "type": "bearer", + "bearer": [ { - "key": "username", - "value": "{{PX_USER}}", + "key": "token", + "value": "{{PX_ACCESS_TOKEN}}", "type": "string" } ] @@ -2105,7 +2810,7 @@ } ], "url": { - "raw": "{{PX_PROTOCOL}}://{{PX_IUT_IP_ADDRESS}}:{{PX_IUT_IP_PORT}}/{{PX_ROOT_API}}/ietf-network:networks/network={PX_NETWORK_ID}/node", + "raw": "{{PX_PROTOCOL}}://{{PX_IUT_IP_ADDRESS}}:{{PX_IUT_IP_PORT}}/{{PX_ROOT_API}}/ietf-network:networks/network={{PX_NETWORK_ID}}/node", "protocol": "{{PX_PROTOCOL}}", "host": [ "{{PX_IUT_IP_ADDRESS}}" @@ -2114,7 +2819,7 @@ "path": [ "{{PX_ROOT_API}}", "ietf-network:networks", - "network={PX_NETWORK_ID}", + "network={{PX_NETWORK_ID}}", "node" ] }, @@ -2139,50 +2844,115 @@ " pm.response.to.have.status(200);\r", "});\r", "\r", - "var responseData = '';\r", - "var topLevelPropertyName = '';\r", + "var responseJson = pm.response.json();\r", + "var networkList = null;\r", + "var eth = null;\r", + "var mw = null;\r", + "var nodes = null;\r", + "\r", + "pm.test(\"Verify that headers.Content-Type is 'application/yang-data+json; charset=utf-8'\", function () {\r", + " pm.expect(pm.response.headers.get('Content-Type')).is.equals('application/yang-data+json; charset=utf-8');\r", + " responseJson = pm.response.json();\r", + " parseAllNetworks()\r", + " console.info('networkList: ', networkList)\r", + " console.info('eth: ', eth)\r", + " console.info('mw: ', mw)\r", + "});\r", "\r", - "pm.test(\"Verify that headers.Content-Type is 'application/yang-data+json'\", function () {\r", - " pm.expect(pm.response.headers.get('Content-Type')).is.equals('application/yang-data+json');\r", - " responseData = pm.response.json();\r", - " topLevelPropertyName = responseData.hasOwnProperty('modules-state') ? 'modules-state' : 'ietf-yang-library:modules-state';\r", - " console.info(topLevelPropertyName)\r", + "pm.test('Verify that the IUT contains network information', function() {\r", + " pm.expect(eth).to.not.equal(null);\r", "});\r", "\r", - "// var moduleList = {};\r", + "pm.test('Ethernet topology attributes verification', function() {\r", + " pm.expect(eth).to.have.property('network-id');\r", + " pm.expect(eth).to.have.property('ietf-te-topology:provider-id');\r", + " pm.expect(eth).to.have.property('ietf-te-topology:client-id');\r", + " pm.expect(eth).to.have.property('ietf-te-topology:te-topology-id');\r", + " pm.expect(eth).to.have.property('ietf-te-topology:te');\r", + " pm.expect(eth['ietf-te-topology:te']).to.have.property('name');\r", + "\r", + " if (!eth.hasOwnProperty('network-id')\r", + " || !eth.hasOwnProperty('ietf-te-topology:provider-id')\r", + " || !eth.hasOwnProperty('ietf-te-topology:client-id')\r", + " || !eth.hasOwnProperty('ietf-te-topology:te-topology-id')) {\r", + " throw new Error('One of the identifiers is missing'); \r", + " }\r", + "});\r", "\r", - "// pm.test(\"Validate the main field is 'ietf-yang-library:modules-state'\", function () {\r", - "// pm.expect(responseData).to.be.an('object');\r", - "// pm.expect(responseData).to.have.property(topLevelPropertyName);\r", - "// });\r", + "pm.test('Ethernet topology nodes verification', function() {\r", + " pm.expect(eth).to.have.property('node');\r", + " pm.expect(Object.keys(nodes).length).to.equal(2);\r", + " pm.expect(mw).to.have.property('node');\r", + " nodes.forEach(function(item, index) {\r", + " pm.expect(item).to.have.property('ietf-te-topology:te-node-id', item['node-id']);\r", + " pm.expect(item).to.have.property('ietf-te-topology:te');\r", + " pm.expect(item['ietf-te-topology:te']).to.have.property('te-node-attributes');\r", + " pm.expect(item['ietf-te-topology:te']['te-node-attributes']).to.have.property('name'); //vendor independent\r", + " });\r", + "});\r", "\r", - "// pm.test(\"Verify that the 'module' array is present and not empty\", function () {\r", - "// pm.expect(responseData).to.be.an('object');\r", - "// pm.expect(responseData[topLevelPropertyName][\"module\"]).to.be.an('array').with.lengthOf.at.least(1);\r", - "// // Build the module list\r", - "// responseData[topLevelPropertyName].module.forEach(function(item, index) {\r", - "// pm.expect(item).to.have.property('name');\r", - "// pm.expect(item).to.have.property('revision');\r", - "// pm.expect(item).to.have.property('namespace');\r", - "// if (moduleList.hasOwnProperty(item.name)) {\r", - "// if (moduleList[item.name].revision < item.revision) {\r", - "// moduleList[item.name] = item;\r", - "// }\r", - "// } else {\r", - "// moduleList[item.name] = item;\r", - "// }\r", - "// });\r", + "function parseAllNetworks() {\r", + " var topLevelPropertyName = responseJson.hasOwnProperty('networks') ? 'networks' : 'ietf-network:networks';\r", + " console.info('topLevelPropertyName=', topLevelPropertyName)\r", + " pm.test('The response body should contain information about networks', function() {\r", + " pm.expect(responseJson).to.have.property(topLevelPropertyName);\r", + " pm.expect(responseJson[topLevelPropertyName]).to.have.property('network');\r", + " responseJson[topLevelPropertyName].network.forEach(function(item, index) {\r", + " pm.expect(item).to.have.property('network-id');\r", + " pm.expect(networkList).to.not.have.property(item['network-id']); // Make sure each network-id appears only once\r", + " networkList[item['network-id']] = item;\r", + " });\r", + " });\r", + " \r", + " eth = findEthNetwork(responseJson[topLevelPropertyName].network);\r", + "\r", + " mw = findMWNetwork(responseJson[topLevelPropertyName].network);\r", + "}\r", "\r", - "// });\r", + "function findEthNetwork(networks) {\r", + " var len = networks.length;\r", + " var i;\r", + " var net;\r", + " for (i = 0; i < len; ++i) {\r", + " net = networks[i];\r", + " if (net['network-types']\r", + " && net['network-types']['ietf-te-topology:te-topology']\r", + " && net['network-types']['ietf-te-topology:te-topology']['ietf-eth-te-topology:eth-tran-topology']) {\r", + " return net;\r", + " }\r", + " }\r", + " return null;\r", + "}\r", "\r", - "// pm.test('Verify that the basics YANG modules are supported', function() {\r", - "// pm.expect(moduleList).to.have.property(\"ietf-restconf\");\r", - "// pm.expect(moduleList).to.have.property(\"ietf-yang-library\");\r", - "// pm.expect(moduleList).to.have.property(\"ietf-datastores\");\r", - "// pm.expect(moduleList).to.have.property(\"ietf-inet-types\");\r", - "// pm.expect(moduleList).to.have.property(\"ietf-interfaces\");\r", - "// pm.expect(moduleList).to.have.property(\"ietf-ip\");\r", - "//});" + "function findMWNetwork(networks) {\r", + " var len = networks.length;\r", + " var i;\r", + " var net;\r", + " for (i = 0; i < len; ++i) {\r", + " net = networks[i];\r", + " if (net['network-types']\r", + " && net['network-types']['ietf-te-topology:te-topology']\r", + " && net['network-types']['ietf-te-topology:te-topology']['ietf-microwave-topology:mw-topology']) {\r", + " return net; \r", + " }\r", + " }\r", + " return null;\r", + "}\r", + "\r", + "function findNetworkNodes(networks) {\r", + " networks.node.forEach(function(item, index) {\r", + " pm.expect(item).to.have.property('node-id');\r", + " pm.expect(nodes).to.not.have.property(item['node-id']); // Make sure each node-id appears only once\r", + " nodes[item['node-id']] = item;\r", + " var regExpStr = '^(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\\.'\r", + " + '(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\\.'\r", + " + '(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\\.'\r", + " + '(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)$';\r", + " var regExp = new RegExp(regExpStr);\r", + " pm.expect(regExp.test(item['node-id'])).to.be.true;\r", + " });\r", + "}\r", + "" ], "type": "text/javascript", "packages": {} @@ -2193,8 +2963,8 @@ "script": { "exec": [ "// Check PICS requirements\r", - "if ((pm.environment.get('PICS_IUT_PNC') != \"true\") || (pm.environment.get('PICS_RESTCONF') != \"true\") || (pm.environment.get('PICS_SEC_TLS') != \"true\") || (pm.environment.get('PICS_ABSTRACT_BB') != \"true\") || (pm.environment.get('PICS_MW_TOPO') != \"true\")) {\r", - " throw new Error('PICS_IUT_PNC and PICS_RESTCONF and PICS_SEC_TLS and PICS_ABSTRACT_BB and PICS_MW_TOPO are required.');\r", + "if ((pm.environment.get('PICS_IUT_PNC') != \"true\") || (pm.environment.get('PICS_RESTCONF') != \"true\") || (pm.environment.get('PICS_SEC_TLS') != \"true\") || (pm.environment.get('ABSTRACT_PT') != \"true\") || (pm.environment.get('ETH_TOPO') != \"true\")) {\r", + " throw new Error('PICS_IUT_PNC and PICS_RESTCONF and PICS_SEC_TLS and ABSTRACT_PT and ETH_TOPO are required.');\r", "}\r", "" ], @@ -2205,16 +2975,11 @@ ], "request": { "auth": { - "type": "basic", - "basic": [ - { - "key": "password", - "value": "{{PX_USER_PASSWD}}", - "type": "string" - }, + "type": "bearer", + "bearer": [ { - "key": "username", - "value": "{{PX_USER}}", + "key": "token", + "value": "{{PX_ACCESS_TOKEN}}", "type": "string" } ] @@ -2227,7 +2992,7 @@ } ], "url": { - "raw": "{{PX_PROTOCOL}}://{{PX_IUT_IP_ADDRESS}}:{{PX_IUT_IP_PORT}}/{{PX_ROOT_API}}/ietf-network:networks/network={PX_NETWORK_ID}/node={PX_NODE_ID}", + "raw": "{{PX_PROTOCOL}}://{{PX_IUT_IP_ADDRESS}}:{{PX_IUT_IP_PORT}}/{{PX_ROOT_API}}/ietf-network:networks/network={{PX_NETWORK_ID}}/node={{PX_NODE_ID}}", "protocol": "{{PX_PROTOCOL}}", "host": [ "{{PX_IUT_IP_ADDRESS}}" @@ -2236,8 +3001,8 @@ "path": [ "{{PX_ROOT_API}}", "ietf-network:networks", - "network={PX_NETWORK_ID}", - "node={PX_NODE_ID}" + "network={{PX_NETWORK_ID}}", + "node={{PX_NODE_ID}}" ] }, "description": "/restconf/data/ietf-yang-library:modules-state" @@ -2271,8 +3036,8 @@ "script": { "exec": [ "// Check PICS requirements\r", - "if ((pm.environment.get('PICS_IUT_PNC') != \"true\") || (pm.environment.get('PICS_RESTCONF') != \"true\") || (pm.environment.get('PICS_SEC_TLS') != \"true\") || (pm.environment.get('PICS_ABSTRACT_BB') != \"true\") || (pm.environment.get('PICS_MW_TOPO') != \"true\")) {\r", - " throw new Error('PICS_IUT_PNC and PICS_RESTCONF and PICS_SEC_TLS and PICS_ABSTRACT_BB and PICS_MW_TOPO are required.');\r", + "if ((pm.environment.get('PICS_IUT_PNC') != \"true\") || (pm.environment.get('PICS_RESTCONF') != \"true\") || (pm.environment.get('PICS_SEC_TLS') != \"true\") || (pm.environment.get('ABSTRACT_PT') != \"true\") || (pm.environment.get('ETH_TOPO') != \"true\")) {\r", + " throw new Error('PICS_IUT_PNC and PICS_RESTCONF and PICS_SEC_TLS and ABSTRACT_PT and ETH_TOPO are required.');\r", "}\r", "" ], @@ -2283,16 +3048,11 @@ ], "request": { "auth": { - "type": "basic", - "basic": [ - { - "key": "password", - "value": "{{PX_USER_PASSWD}}", - "type": "string" - }, + "type": "bearer", + "bearer": [ { - "key": "username", - "value": "{{PX_USER}}", + "key": "token", + "value": "{{PX_ACCESS_TOKEN}}", "type": "string" } ] @@ -2305,7 +3065,7 @@ } ], "url": { - "raw": "{{PX_PROTOCOL}}://{{PX_IUT_IP_ADDRESS}}:{{PX_IUT_IP_PORT}}/{{PX_ROOT_API}}/ietf-network:networks/network={PX_NETWORK_ID}/node={PX_UNKNOWN_NODE_ID}", + "raw": "{{PX_PROTOCOL}}://{{PX_IUT_IP_ADDRESS}}:{{PX_IUT_IP_PORT}}/{{PX_ROOT_API}}/ietf-network:networks/network={{PX_NETWORK_ID}}/node={{PX_UNKNOWN_NODE_ID}}", "protocol": "{{PX_PROTOCOL}}", "host": [ "{{PX_IUT_IP_ADDRESS}}" @@ -2314,8 +3074,8 @@ "path": [ "{{PX_ROOT_API}}", "ietf-network:networks", - "network={PX_NETWORK_ID}", - "node={PX_UNKNOWN_NODE_ID}" + "network={{PX_NETWORK_ID}}", + "node={{PX_UNKNOWN_NODE_ID}}" ] }, "description": "/restconf/data/ietf-yang-library:modules-state" @@ -2398,8 +3158,8 @@ "script": { "exec": [ "// Check PICS requirements\r", - "if ((pm.environment.get('PICS_IUT_PNC') != \"true\") || (pm.environment.get('PICS_RESTCONF') != \"true\") || (pm.environment.get('PICS_SEC_TLS') != \"true\") || (pm.environment.get('PICS_ABSTRACT_BB') != \"true\") || (pm.environment.get('PICS_MW_TOPO') != \"true\")) {\r", - " throw new Error('PICS_IUT_PNC and PICS_RESTCONF and PICS_SEC_TLS and PICS_ABSTRACT_BB and PICS_MW_TOPO are required.');\r", + "if ((pm.environment.get('PICS_IUT_PNC') != \"true\") || (pm.environment.get('PICS_RESTCONF') != \"true\") || (pm.environment.get('PICS_SEC_TLS') != \"true\") || (pm.environment.get('ABSTRACT_PT') != \"true\")) {\r", + " throw new Error('PICS_IUT_PNC and PICS_RESTCONF and PICS_SEC_TLS and ABSTRACT_PT are required.');\r", "}\r", "" ], @@ -2410,16 +3170,11 @@ ], "request": { "auth": { - "type": "basic", - "basic": [ - { - "key": "password", - "value": "{{PX_USER_PASSWD}}", - "type": "string" - }, + "type": "bearer", + "bearer": [ { - "key": "username", - "value": "{{PX_USER}}", + "key": "token", + "value": "{{PX_ACCESS_TOKEN}}", "type": "string" } ] @@ -2461,7 +3216,7 @@ "listen": "test", "script": { "exec": [ - "pm.test(\"Verify that the response status code is 200\", function () {\r", + "pm.test(\"Verify that the response status code is 400\", function () {\r", " pm.response.to.have.status(400);\r", "});" ], @@ -2474,8 +3229,8 @@ "script": { "exec": [ "// Check PICS requirements\r", - "if ((pm.environment.get('PICS_IUT_PNC') != \"true\") || (pm.environment.get('PICS_RESTCONF') != \"true\") || (pm.environment.get('PICS_SEC_TLS') != \"true\") || (pm.environment.get('PICS_ABSTRACT_BB') != \"true\") || (pm.environment.get('PICS_MW_TOPO') != \"true\")) {\r", - " throw new Error('PICS_IUT_PNC and PICS_RESTCONF and PICS_SEC_TLS and PICS_ABSTRACT_BB and PICS_MW_TOPO are required.');\r", + "if ((pm.environment.get('PICS_IUT_PNC') != \"true\") || (pm.environment.get('PICS_RESTCONF') != \"true\") || (pm.environment.get('PICS_SEC_TLS') != \"true\") || (pm.environment.get('ABSTRACT_PT') != \"true\")) {\r", + " throw new Error('PICS_IUT_PNC and PICS_RESTCONF and PICS_SEC_TLS and ABSTRACT_PT are required.');\r", "}\r", "" ], @@ -2486,16 +3241,11 @@ ], "request": { "auth": { - "type": "basic", - "basic": [ - { - "key": "password", - "value": "{{PX_USER_PASSWD}}", - "type": "string" - }, + "type": "bearer", + "bearer": [ { - "key": "username", - "value": "{{PX_USER}}", + "key": "token", + "value": "{{PX_ACCESS_TOKEN}}", "type": "string" } ] @@ -2537,8 +3287,8 @@ "listen": "test", "script": { "exec": [ - "pm.test(\"Verify that the response status code is 200\", function () {\r", - " pm.response.to.have.status(200);\r", + "pm.test(\"Verify that the response status code is 201\", function () {\r", + " pm.response.to.have.status(201);\r", "});\r", "\r", "var responseData = '';\r", @@ -2595,8 +3345,8 @@ "script": { "exec": [ "// Check PICS requirements\r", - "if ((pm.environment.get('PICS_IUT_PNC') != \"true\") || (pm.environment.get('PICS_RESTCONF') != \"true\") || (pm.environment.get('PICS_SEC_TLS') != \"true\") || (pm.environment.get('PICS_ABSTRACT_BB') != \"true\") || (pm.environment.get('PICS_MW_TOPO') != \"true\")) {\r", - " throw new Error('PICS_IUT_PNC and PICS_RESTCONF and PICS_SEC_TLS and PICS_ABSTRACT_BB and PICS_MW_TOPO are required.');\r", + "if ((pm.environment.get('PICS_IUT_PNC') != \"true\") || (pm.environment.get('PICS_RESTCONF') != \"true\") || (pm.environment.get('PICS_SEC_TLS') != \"true\") || (pm.environment.get('ABSTRACT_PT') != \"true\")) {\r", + " throw new Error('PICS_IUT_PNC and PICS_RESTCONF and PICS_SEC_TLS and ABSTRACT_PT are required.');\r", "}\r", "" ], @@ -2607,16 +3357,11 @@ ], "request": { "auth": { - "type": "basic", - "basic": [ - { - "key": "password", - "value": "{{PX_USER_PASSWD}}", - "type": "string" - }, + "type": "bearer", + "bearer": [ { - "key": "username", - "value": "{{PX_USER}}", + "key": "token", + "value": "{{PX_ACCESS_TOKEN}}", "type": "string" } ] @@ -2658,8 +3403,8 @@ "listen": "test", "script": { "exec": [ - "pm.test(\"Verify that the response status code is 200\", function () {\r", - " pm.response.to.have.status(200);\r", + "pm.test(\"Verify that the response status code is 201\", function () {\r", + " pm.response.to.have.status(201);\r", "});\r", "\r", "var responseData = '';\r", @@ -2716,8 +3461,8 @@ "script": { "exec": [ "// Check PICS requirements\r", - "if ((pm.environment.get('PICS_IUT_PNC') != \"true\") || (pm.environment.get('PICS_RESTCONF') != \"true\") || (pm.environment.get('PICS_SEC_TLS') != \"true\") || (pm.environment.get('PICS_ABSTRACT_BB') != \"true\") || (pm.environment.get('PICS_MW_TOPO') != \"true\")) {\r", - " throw new Error('PICS_IUT_PNC and PICS_RESTCONF and PICS_SEC_TLS and PICS_ABSTRACT_BB and PICS_MW_TOPO are required.');\r", + "if ((pm.environment.get('PICS_IUT_PNC') != \"true\") || (pm.environment.get('PICS_RESTCONF') != \"true\") || (pm.environment.get('PICS_SEC_TLS') != \"true\") || (pm.environment.get('ABSTRACT_PT') != \"true\")) {\r", + " throw new Error('PICS_IUT_PNC and PICS_RESTCONF and PICS_SEC_TLS and ABSTRACT_PT are required.');\r", "}\r", "" ], @@ -2728,16 +3473,41 @@ ], "request": { "auth": { - "type": "basic", - "basic": [ + "type": "jwt", + "jwt": [ { - "key": "password", - "value": "{{PX_USER_PASSWD}}", + "key": "algorithm", + "value": "HS256", "type": "string" }, { - "key": "username", - "value": "{{PX_USER}}", + "key": "isSecretBase64Encoded", + "value": false, + "type": "boolean" + }, + { + "key": "payload", + "value": "{}", + "type": "string" + }, + { + "key": "addTokenTo", + "value": "header", + "type": "string" + }, + { + "key": "headerPrefix", + "value": "Bearer", + "type": "string" + }, + { + "key": "queryParamKey", + "value": "token", + "type": "string" + }, + { + "key": "header", + "value": "{}", "type": "string" } ] @@ -2778,8 +3548,8 @@ "listen": "test", "script": { "exec": [ - "pm.test(\"Verify that the response status code is 200\", function () {\r", - " pm.response.to.have.status(200);\r", + "pm.test(\"Verify that the response status code is 201\", function () {\r", + " pm.response.to.have.status(201);\r", "});\r", "\r", "var responseData = '';\r", @@ -2836,8 +3606,8 @@ "script": { "exec": [ "// Check PICS requirements\r", - "if ((pm.environment.get('PICS_IUT_PNC') != \"true\") || (pm.environment.get('PICS_RESTCONF') != \"true\") || (pm.environment.get('PICS_SEC_TLS') != \"true\") || (pm.environment.get('PICS_ABSTRACT_BB') != \"true\") || (pm.environment.get('PICS_MW_TOPO') != \"true\")) {\r", - " throw new Error('PICS_IUT_PNC and PICS_RESTCONF and PICS_SEC_TLS and PICS_ABSTRACT_BB and PICS_MW_TOPO are required.');\r", + "if ((pm.environment.get('PICS_IUT_PNC') != \"true\") || (pm.environment.get('PICS_RESTCONF') != \"true\") || (pm.environment.get('PICS_SEC_TLS') != \"true\") || (pm.environment.get('ABSTRACT_PT') != \"true\")) {\r", + " throw new Error('PICS_IUT_PNC and PICS_RESTCONF and PICS_SEC_TLS and ABSTRACT_PT are required.');\r", "}\r", "" ], @@ -2848,16 +3618,11 @@ ], "request": { "auth": { - "type": "basic", - "basic": [ - { - "key": "password", - "value": "{{PX_USER_PASSWD}}", - "type": "string" - }, + "type": "bearer", + "bearer": [ { - "key": "username", - "value": "{{PX_USER}}", + "key": "token", + "value": "{{PX_ACCESS_TOKEN}}", "type": "string" } ] @@ -2899,8 +3664,8 @@ "listen": "test", "script": { "exec": [ - "pm.test(\"Verify that the response status code is 200\", function () {\r", - " pm.response.to.have.status(200);\r", + "pm.test(\"Verify that the response status code is 201\", function () {\r", + " pm.response.to.have.status(201);\r", "});\r", "\r", "var responseData = '';\r", @@ -2957,8 +3722,8 @@ "script": { "exec": [ "// Check PICS requirements\r", - "if ((pm.environment.get('PICS_IUT_PNC') != \"true\") || (pm.environment.get('PICS_RESTCONF') != \"true\") || (pm.environment.get('PICS_SEC_TLS') != \"true\") || (pm.environment.get('PICS_ABSTRACT_BB') != \"true\") || (pm.environment.get('PICS_MW_TOPO') != \"true\")) {\r", - " throw new Error('PICS_IUT_PNC and PICS_RESTCONF and PICS_SEC_TLS and PICS_ABSTRACT_BB and PICS_MW_TOPO are required.');\r", + "if ((pm.environment.get('PICS_IUT_PNC') != \"true\") || (pm.environment.get('PICS_RESTCONF') != \"true\") || (pm.environment.get('PICS_SEC_TLS') != \"true\") || (pm.environment.get('ABSTRACT_PT') != \"true\")) {\r", + " throw new Error('PICS_IUT_PNC and PICS_RESTCONF and PICS_SEC_TLS and ABSTRACT_PT are required.');\r", "}\r", "" ], @@ -2969,16 +3734,11 @@ ], "request": { "auth": { - "type": "basic", - "basic": [ - { - "key": "password", - "value": "{{PX_USER_PASSWD}}", - "type": "string" - }, + "type": "bearer", + "bearer": [ { - "key": "username", - "value": "{{PX_USER}}", + "key": "token", + "value": "{{PX_ACCESS_TOKEN}}", "type": "string" } ] @@ -3020,7 +3780,7 @@ "listen": "test", "script": { "exec": [ - "pm.test(\"Verify that the response status code is 200\", function () {\r", + "pm.test(\"Verify that the response status code is 400\", function () {\r", " pm.response.to.have.status(400);\r", "});" ], @@ -3033,8 +3793,8 @@ "script": { "exec": [ "// Check PICS requirements\r", - "if ((pm.environment.get('PICS_IUT_PNC') != \"true\") || (pm.environment.get('PICS_RESTCONF') != \"true\") || (pm.environment.get('PICS_SEC_TLS') != \"true\") || (pm.environment.get('PICS_ABSTRACT_BB') != \"true\") || (pm.environment.get('PICS_MW_TOPO') != \"true\")) {\r", - " throw new Error('PICS_IUT_PNC and PICS_RESTCONF and PICS_SEC_TLS and PICS_ABSTRACT_BB and PICS_MW_TOPO are required.');\r", + "if ((pm.environment.get('PICS_IUT_PNC') != \"true\") || (pm.environment.get('PICS_RESTCONF') != \"true\") || (pm.environment.get('PICS_SEC_TLS') != \"true\") || (pm.environment.get('ABSTRACT_PT') != \"true\")) {\r", + " throw new Error('PICS_IUT_PNC and PICS_RESTCONF and PICS_SEC_TLS and ABSTRACT_PT are required.');\r", "}\r", "" ], @@ -3045,16 +3805,11 @@ ], "request": { "auth": { - "type": "basic", - "basic": [ + "type": "bearer", + "bearer": [ { - "key": "password", - "value": "{{PX_USER_PASSWD}}", - "type": "string" - }, - { - "key": "username", - "value": "{{PX_USER}}", + "key": "token", + "value": "{{PX_ACCESS_TOKEN}}", "type": "string" } ] @@ -3154,8 +3909,8 @@ "script": { "exec": [ "// Check PICS requirements\r", - "if ((pm.environment.get('PICS_IUT_PNC') != \"true\") || (pm.environment.get('PICS_RESTCONF') != \"true\") || (pm.environment.get('PICS_SEC_TLS') != \"true\") || (pm.environment.get('PICS_ABSTRACT_BB') != \"true\") || (pm.environment.get('PICS_MW_TOPO') != \"true\")) {\r", - " throw new Error('PICS_IUT_PNC and PICS_RESTCONF and PICS_SEC_TLS and PICS_ABSTRACT_BB and PICS_MW_TOPO are required.');\r", + "if ((pm.environment.get('PICS_IUT_PNC') != \"true\") || (pm.environment.get('PICS_RESTCONF') != \"true\") || (pm.environment.get('PICS_SEC_TLS') != \"true\") || (pm.environment.get('ABSTRACT_PT') != \"true\")) {\r", + " throw new Error('PICS_IUT_PNC and PICS_RESTCONF and PICS_SEC_TLS and ABSTRACT_PT are required.');\r", "}\r", "" ], @@ -3166,16 +3921,11 @@ ], "request": { "auth": { - "type": "basic", - "basic": [ - { - "key": "password", - "value": "{{PX_USER_PASSWD}}", - "type": "string" - }, + "type": "bearer", + "bearer": [ { - "key": "username", - "value": "{{PX_USER}}", + "key": "token", + "value": "{{PX_ACCESS_TOKEN}}", "type": "string" } ] @@ -3275,8 +4025,8 @@ "script": { "exec": [ "// Check PICS requirements\r", - "if ((pm.environment.get('PICS_IUT_PNC') != \"true\") || (pm.environment.get('PICS_RESTCONF') != \"true\") || (pm.environment.get('PICS_SEC_TLS') != \"true\") || (pm.environment.get('PICS_ABSTRACT_BB') != \"true\") || (pm.environment.get('PICS_MW_TOPO') != \"true\")) {\r", - " throw new Error('PICS_IUT_PNC and PICS_RESTCONF and PICS_SEC_TLS and PICS_ABSTRACT_BB and PICS_MW_TOPO are required.');\r", + "if ((pm.environment.get('PICS_IUT_PNC') != \"true\") || (pm.environment.get('PICS_RESTCONF') != \"true\") || (pm.environment.get('PICS_SEC_TLS') != \"true\") || (pm.environment.get('ABSTRACT_PT') != \"true\")) {\r", + " throw new Error('PICS_IUT_PNC and PICS_RESTCONF and PICS_SEC_TLS and ABSTRACT_PT are required.');\r", "}\r", "" ], @@ -3287,16 +4037,11 @@ ], "request": { "auth": { - "type": "basic", - "basic": [ - { - "key": "password", - "value": "{{PX_USER_PASSWD}}", - "type": "string" - }, + "type": "bearer", + "bearer": [ { - "key": "username", - "value": "{{PX_USER}}", + "key": "token", + "value": "{{PX_ACCESS_TOKEN}}", "type": "string" } ] @@ -3396,8 +4141,8 @@ "script": { "exec": [ "// Check PICS requirements\r", - "if ((pm.environment.get('PICS_IUT_PNC') != \"true\") || (pm.environment.get('PICS_RESTCONF') != \"true\") || (pm.environment.get('PICS_SEC_TLS') != \"true\") || (pm.environment.get('PICS_ABSTRACT_BB') != \"true\") || (pm.environment.get('PICS_MW_TOPO') != \"true\")) {\r", - " throw new Error('PICS_IUT_PNC and PICS_RESTCONF and PICS_SEC_TLS and PICS_ABSTRACT_BB and PICS_MW_TOPO are required.');\r", + "if ((pm.environment.get('PICS_IUT_PNC') != \"true\") || (pm.environment.get('PICS_RESTCONF') != \"true\") || (pm.environment.get('PICS_SEC_TLS') != \"true\") || (pm.environment.get('ABSTRACT_PT') != \"true\")) {\r", + " throw new Error('PICS_IUT_PNC and PICS_RESTCONF and PICS_SEC_TLS and ABSTRACT_PT are required.');\r", "}\r", "" ], @@ -3408,16 +4153,11 @@ ], "request": { "auth": { - "type": "basic", - "basic": [ - { - "key": "password", - "value": "{{PX_USER_PASSWD}}", - "type": "string" - }, + "type": "bearer", + "bearer": [ { - "key": "username", - "value": "{{PX_USER}}", + "key": "token", + "value": "{{PX_ACCESS_TOKEN}}", "type": "string" } ] @@ -3459,54 +4199,10 @@ "listen": "test", "script": { "exec": [ - "pm.test(\"Verify that the response status code is 200\", function () {\r", - " pm.response.to.have.status(200);\r", - "});\r", - "\r", - "var responseData = '';\r", - "var topLevelPropertyName = '';\r", - "\r", - "pm.test(\"Verify that headers.Content-Type is 'application/yang-data+json'\", function () {\r", - " pm.expect(pm.response.headers.get('Content-Type')).is.equals('application/yang-data+json');\r", - " responseData = pm.response.json();\r", - " topLevelPropertyName = responseData.hasOwnProperty('modules-state') ? 'modules-state' : 'ietf-yang-library:modules-state';\r", - " console.info(topLevelPropertyName)\r", + "pm.test(\"Verify that the response status code is 204\", function () {\r", + " pm.response.to.have.status(204);\r", "});\r", - "\r", - "// var moduleList = {};\r", - "\r", - "// pm.test(\"Validate the main field is 'ietf-yang-library:modules-state'\", function () {\r", - "// pm.expect(responseData).to.be.an('object');\r", - "// pm.expect(responseData).to.have.property(topLevelPropertyName);\r", - "// });\r", - "\r", - "// pm.test(\"Verify that the 'module' array is present and not empty\", function () {\r", - "// pm.expect(responseData).to.be.an('object');\r", - "// pm.expect(responseData[topLevelPropertyName][\"module\"]).to.be.an('array').with.lengthOf.at.least(1);\r", - "// // Build the module list\r", - "// responseData[topLevelPropertyName].module.forEach(function(item, index) {\r", - "// pm.expect(item).to.have.property('name');\r", - "// pm.expect(item).to.have.property('revision');\r", - "// pm.expect(item).to.have.property('namespace');\r", - "// if (moduleList.hasOwnProperty(item.name)) {\r", - "// if (moduleList[item.name].revision < item.revision) {\r", - "// moduleList[item.name] = item;\r", - "// }\r", - "// } else {\r", - "// moduleList[item.name] = item;\r", - "// }\r", - "// });\r", - "\r", - "// });\r", - "\r", - "// pm.test('Verify that the basics YANG modules are supported', function() {\r", - "// pm.expect(moduleList).to.have.property(\"ietf-restconf\");\r", - "// pm.expect(moduleList).to.have.property(\"ietf-yang-library\");\r", - "// pm.expect(moduleList).to.have.property(\"ietf-datastores\");\r", - "// pm.expect(moduleList).to.have.property(\"ietf-inet-types\");\r", - "// pm.expect(moduleList).to.have.property(\"ietf-interfaces\");\r", - "// pm.expect(moduleList).to.have.property(\"ietf-ip\");\r", - "//});" + "" ], "type": "text/javascript", "packages": {} @@ -3517,8 +4213,8 @@ "script": { "exec": [ "// Check PICS requirements\r", - "if ((pm.environment.get('PICS_IUT_PNC') != \"true\") || (pm.environment.get('PICS_RESTCONF') != \"true\") || (pm.environment.get('PICS_SEC_TLS') != \"true\") || (pm.environment.get('PICS_ABSTRACT_BB') != \"true\") || (pm.environment.get('PICS_MW_TOPO') != \"true\")) {\r", - " throw new Error('PICS_IUT_PNC and PICS_RESTCONF and PICS_SEC_TLS and PICS_ABSTRACT_BB and PICS_MW_TOPO are required.');\r", + "if ((pm.environment.get('PICS_IUT_PNC') != \"true\") || (pm.environment.get('PICS_RESTCONF') != \"true\") || (pm.environment.get('PICS_SEC_TLS') != \"true\") || (pm.environment.get('ABSTRACT_PT') != \"true\")) {\r", + " throw new Error('PICS_IUT_PNC and PICS_RESTCONF and PICS_SEC_TLS and ABSTRACT_PT are required.');\r", "}\r", "" ], @@ -3529,16 +4225,11 @@ ], "request": { "auth": { - "type": "basic", - "basic": [ - { - "key": "password", - "value": "{{PX_USER_PASSWD}}", - "type": "string" - }, + "type": "bearer", + "bearer": [ { - "key": "username", - "value": "{{PX_USER}}", + "key": "token", + "value": "{{PX_ACCESS_TOKEN}}", "type": "string" } ] @@ -3551,7 +4242,7 @@ } ], "url": { - "raw": "{{PX_PROTOCOL}}://{{PX_IUT_IP_ADDRESS}}:{{PX_IUT_IP_PORT}}/{{PX_ROOT_API}}/ietf-eth-tran-service:etht-svc/etht-svc-instances={PX_ETHT_SVC_NAME}", + "raw": "{{PX_PROTOCOL}}://{{PX_IUT_IP_ADDRESS}}:{{PX_IUT_IP_PORT}}/{{PX_ROOT_API}}/ietf-eth-tran-service:etht-svc/etht-svc-instances={{PX_ETHT_SVC_NAME}}", "protocol": "{{PX_PROTOCOL}}", "host": [ "{{PX_IUT_IP_ADDRESS}}" @@ -3560,7 +4251,7 @@ "path": [ "{{PX_ROOT_API}}", "ietf-eth-tran-service:etht-svc", - "etht-svc-instances={PX_ETHT_SVC_NAME}" + "etht-svc-instances={{PX_ETHT_SVC_NAME}}" ] }, "description": "/restconf/data/ietf-yang-library:modules-state" @@ -3580,54 +4271,9 @@ "listen": "test", "script": { "exec": [ - "pm.test(\"Verify that the response status code is 200\", function () {\r", - " pm.response.to.have.status(200);\r", - "});\r", - "\r", - "var responseData = '';\r", - "var topLevelPropertyName = '';\r", - "\r", - "pm.test(\"Verify that headers.Content-Type is 'application/yang-data+json'\", function () {\r", - " pm.expect(pm.response.headers.get('Content-Type')).is.equals('application/yang-data+json');\r", - " responseData = pm.response.json();\r", - " topLevelPropertyName = responseData.hasOwnProperty('modules-state') ? 'modules-state' : 'ietf-yang-library:modules-state';\r", - " console.info(topLevelPropertyName)\r", - "});\r", - "\r", - "// var moduleList = {};\r", - "\r", - "// pm.test(\"Validate the main field is 'ietf-yang-library:modules-state'\", function () {\r", - "// pm.expect(responseData).to.be.an('object');\r", - "// pm.expect(responseData).to.have.property(topLevelPropertyName);\r", - "// });\r", - "\r", - "// pm.test(\"Verify that the 'module' array is present and not empty\", function () {\r", - "// pm.expect(responseData).to.be.an('object');\r", - "// pm.expect(responseData[topLevelPropertyName][\"module\"]).to.be.an('array').with.lengthOf.at.least(1);\r", - "// // Build the module list\r", - "// responseData[topLevelPropertyName].module.forEach(function(item, index) {\r", - "// pm.expect(item).to.have.property('name');\r", - "// pm.expect(item).to.have.property('revision');\r", - "// pm.expect(item).to.have.property('namespace');\r", - "// if (moduleList.hasOwnProperty(item.name)) {\r", - "// if (moduleList[item.name].revision < item.revision) {\r", - "// moduleList[item.name] = item;\r", - "// }\r", - "// } else {\r", - "// moduleList[item.name] = item;\r", - "// }\r", - "// });\r", - "\r", - "// });\r", - "\r", - "// pm.test('Verify that the basics YANG modules are supported', function() {\r", - "// pm.expect(moduleList).to.have.property(\"ietf-restconf\");\r", - "// pm.expect(moduleList).to.have.property(\"ietf-yang-library\");\r", - "// pm.expect(moduleList).to.have.property(\"ietf-datastores\");\r", - "// pm.expect(moduleList).to.have.property(\"ietf-inet-types\");\r", - "// pm.expect(moduleList).to.have.property(\"ietf-interfaces\");\r", - "// pm.expect(moduleList).to.have.property(\"ietf-ip\");\r", - "//});" + "pm.test(\"Verify that the response status code is 204\", function () {\r", + " pm.response.to.have.status(204);\r", + "});" ], "type": "text/javascript", "packages": {} @@ -3638,8 +4284,8 @@ "script": { "exec": [ "// Check PICS requirements\r", - "if ((pm.environment.get('PICS_IUT_PNC') != \"true\") || (pm.environment.get('PICS_RESTCONF') != \"true\") || (pm.environment.get('PICS_SEC_TLS') != \"true\") || (pm.environment.get('PICS_ABSTRACT_BB') != \"true\") || (pm.environment.get('PICS_MW_TOPO') != \"true\")) {\r", - " throw new Error('PICS_IUT_PNC and PICS_RESTCONF and PICS_SEC_TLS and PICS_ABSTRACT_BB and PICS_MW_TOPO are required.');\r", + "if ((pm.environment.get('PICS_IUT_PNC') != \"true\") || (pm.environment.get('PICS_RESTCONF') != \"true\") || (pm.environment.get('PICS_SEC_TLS') != \"true\") || (pm.environment.get('ABSTRACT_PT') != \"true\")) {\r", + " throw new Error('PICS_IUT_PNC and PICS_RESTCONF and PICS_SEC_TLS and ABSTRACT_PT are required.');\r", "}\r", "" ], @@ -3650,16 +4296,11 @@ ], "request": { "auth": { - "type": "basic", - "basic": [ - { - "key": "password", - "value": "{{PX_USER_PASSWD}}", - "type": "string" - }, + "type": "bearer", + "bearer": [ { - "key": "username", - "value": "{{PX_USER}}", + "key": "token", + "value": "{{PX_ACCESS_TOKEN}}", "type": "string" } ] @@ -3672,7 +4313,7 @@ } ], "url": { - "raw": "{{PX_PROTOCOL}}://{{PX_IUT_IP_ADDRESS}}:{{PX_IUT_IP_PORT}}/{{PX_ROOT_API}}/ietf-eth-tran-service:etht-svc/globals/bandwitdh_profile_name={PX_BANDWIDTH_PROFILE_NAME}", + "raw": "{{PX_PROTOCOL}}://{{PX_IUT_IP_ADDRESS}}:{{PX_IUT_IP_PORT}}/{{PX_ROOT_API}}/ietf-eth-tran-service:etht-svc/globals/bandwitdh_profile_name={{PX_BANDWIDTH_PROFILE_NAME}}", "protocol": "{{PX_PROTOCOL}}", "host": [ "{{PX_IUT_IP_ADDRESS}}" @@ -3682,7 +4323,7 @@ "{{PX_ROOT_API}}", "ietf-eth-tran-service:etht-svc", "globals", - "bandwitdh_profile_name={PX_BANDWIDTH_PROFILE_NAME}" + "bandwitdh_profile_name={{PX_BANDWIDTH_PROFILE_NAME}}" ] }, "description": "/restconf/data/ietf-yang-library:modules-state" @@ -3702,7 +4343,7 @@ "listen": "test", "script": { "exec": [ - "pm.test(\"Verify that the response status code is 200\", function () {\r", + "pm.test(\"Verify that the response status code is 400\", function () {\r", " pm.response.to.have.status(400);\r", "});" ], @@ -3715,8 +4356,8 @@ "script": { "exec": [ "// Check PICS requirements\r", - "if ((pm.environment.get('PICS_IUT_PNC') != \"true\") || (pm.environment.get('PICS_RESTCONF') != \"true\") || (pm.environment.get('PICS_SEC_TLS') != \"true\") || (pm.environment.get('PICS_ABSTRACT_BB') != \"true\") || (pm.environment.get('PICS_MW_TOPO') != \"true\")) {\r", - " throw new Error('PICS_IUT_PNC and PICS_RESTCONF and PICS_SEC_TLS and PICS_ABSTRACT_BB and PICS_MW_TOPO are required.');\r", + "if ((pm.environment.get('PICS_IUT_PNC') != \"true\") || (pm.environment.get('PICS_RESTCONF') != \"true\") || (pm.environment.get('PICS_SEC_TLS') != \"true\") || (pm.environment.get('ABSTRACT_PT') != \"true\")) {\r", + " throw new Error('PICS_IUT_PNC and PICS_RESTCONF and PICS_SEC_TLS and ABSTRACT_PT are required.');\r", "}\r", "" ], @@ -3749,7 +4390,7 @@ } ], "url": { - "raw": "{{PX_PROTOCOL}}://{{PX_IUT_IP_ADDRESS}}:{{PX_IUT_IP_PORT}}/{{PX_ROOT_API}}/ietf-eth-tran-service:etht-svc/nstances={PX_ETHT_SVC_NAME}", + "raw": "{{PX_PROTOCOL}}://{{PX_IUT_IP_ADDRESS}}:{{PX_IUT_IP_PORT}}/{{PX_ROOT_API}}/ietf-eth-tran-service:etht-svc/nstances={{PX_ETHT_SVC_NAME}}", "protocol": "{{PX_PROTOCOL}}", "host": [ "{{PX_IUT_IP_ADDRESS}}" @@ -3758,7 +4399,7 @@ "path": [ "{{PX_ROOT_API}}", "ietf-eth-tran-service:etht-svc", - "nstances={PX_ETHT_SVC_NAME}" + "nstances={{PX_ETHT_SVC_NAME}}" ] }, "description": "/restconf/data/ietf-yang-library:modules-state" @@ -3778,7 +4419,7 @@ "listen": "test", "script": { "exec": [ - "pm.test(\"Verify that the response status code is 200\", function () {\r", + "pm.test(\"Verify that the response status code is 404\", function () {\r", " pm.response.to.have.status(404);\r", "});" ], @@ -3791,8 +4432,8 @@ "script": { "exec": [ "// Check PICS requirements\r", - "if ((pm.environment.get('PICS_IUT_PNC') != \"true\") || (pm.environment.get('PICS_RESTCONF') != \"true\") || (pm.environment.get('PICS_SEC_TLS') != \"true\") || (pm.environment.get('PICS_ABSTRACT_BB') != \"true\") || (pm.environment.get('PICS_MW_TOPO') != \"true\")) {\r", - " throw new Error('PICS_IUT_PNC and PICS_RESTCONF and PICS_SEC_TLS and PICS_ABSTRACT_BB and PICS_MW_TOPO are required.');\r", + "if ((pm.environment.get('PICS_IUT_PNC') != \"true\") || (pm.environment.get('PICS_RESTCONF') != \"true\") || (pm.environment.get('PICS_SEC_TLS') != \"true\") || (pm.environment.get('ABSTRACT_PT') != \"true\")) {\r", + " throw new Error('PICS_IUT_PNC and PICS_RESTCONF and PICS_SEC_TLS and ABSTRACT_PT are required.');\r", "}\r", "" ], @@ -3803,16 +4444,11 @@ ], "request": { "auth": { - "type": "basic", - "basic": [ - { - "key": "password", - "value": "{{PX_USER_PASSWD}}", - "type": "string" - }, + "type": "bearer", + "bearer": [ { - "key": "username", - "value": "{{PX_USER}}", + "key": "token", + "value": "{{PX_ACCESS_TOKEN}}", "type": "string" } ] @@ -3825,7 +4461,7 @@ } ], "url": { - "raw": "{{PX_PROTOCOL}}://{{PX_IUT_IP_ADDRESS}}:{{PX_IUT_IP_PORT}}/{{PX_ROOT_API}}/ietf-eth-tran-service:etht-svc/etht-svc-instances={PX_UNKNOWN_ETHT_SVC_NAME}", + "raw": "{{PX_PROTOCOL}}://{{PX_IUT_IP_ADDRESS}}:{{PX_IUT_IP_PORT}}/{{PX_ROOT_API}}/ietf-eth-tran-service:etht-svc/etht-svc-instances={{PX_UNKNOWN_ETHT_SVC_NAME}}", "protocol": "{{PX_PROTOCOL}}", "host": [ "{{PX_IUT_IP_ADDRESS}}" @@ -3834,7 +4470,7 @@ "path": [ "{{PX_ROOT_API}}", "ietf-eth-tran-service:etht-svc", - "etht-svc-instances={PX_UNKNOWN_ETHT_SVC_NAME}" + "etht-svc-instances={{PX_UNKNOWN_ETHT_SVC_NAME}}" ] }, "description": "/restconf/data/ietf-yang-library:modules-state" diff --git a/postman/TTF_T029.postman_environment.json b/postman/TTF_T029.postman_environment.json index 60c5eb0..ea66c2f 100644 --- a/postman/TTF_T029.postman_environment.json +++ b/postman/TTF_T029.postman_environment.json @@ -1,7 +1,37 @@ { - "id": "254f0cf6-86f9-4e52-9d62-fc5f5d73708e", + "id": "c7214617-e241-497c-a967-2c5d67723939", "name": "TTF_T029", "values": [ + { + "key": "PICS_IUT_PNC", + "value": "true", + "type": "default", + "enabled": true + }, + { + "key": "PICS_RESTCONF", + "value": "true", + "type": "default", + "enabled": true + }, + { + "key": "PICS_SEC_TLS", + "value": "true", + "type": "default", + "enabled": true + }, + { + "key": "PICS_ABSTRACT_BB", + "value": "true", + "type": "default", + "enabled": true + }, + { + "key": "PICS_MW_TOPO", + "value": "true", + "type": "default", + "enabled": true + }, { "key": "PX_IUT_IP_ADDRESS", "value": "127.0.01", @@ -69,32 +99,104 @@ "enabled": true }, { - "key": "PICS_IUT_PNC", - "value": "true", + "key": "PX_IETF_NETWORK_VERSION", + "value": "2018-02-26", "type": "default", "enabled": true }, { - "key": "PICS_RESTCONF", - "value": "true", + "key": "PX_IETF_NETWORK_NAMESPACE", + "value": "urn:ietf:params:xml:ns:yang:ietf-network", "type": "default", "enabled": true }, { - "key": "PICS_SEC_TLS", - "value": "true", + "key": "PX_IETF_NETWORK_TOPOLOGY_VERSION", + "value": "2018-02-26", "type": "default", "enabled": true }, { - "key": "PICS_ABSTRACT_BB", - "value": "true", + "key": "PX_IETF_NETWORK_TOPOLOGY_NAMESPACE", + "value": "urn:ietf:params:xml:ns:yang:ietf-network-topology", "type": "default", "enabled": true }, { - "key": "PICS_MW_TOPO", - "value": "true", + "key": "PX_IETF_TE_TOPOLOGY_VERSION", + "value": "2018-06-15", + "type": "default", + "enabled": true + }, + { + "key": "PX_IETF_TE_TOPOLOGY_NAMESPACE", + "value": "urn:ietf:params:xml:ns:yang:ietf-te-topology", + "type": "default", + "enabled": true + }, + { + "key": "PX_IETF_ETH_TE_TOPOLOGY_VERSION", + "value": "2018-03-01", + "type": "default", + "enabled": true + }, + { + "key": "PX_IETF_ETH_TE_TOPOLOGY_NAMESPACE", + "value": "urn:ietf:params:xml:ns:yang:ietf-eth-te-topology", + "type": "default", + "enabled": true + }, + { + "key": "PX_IETF_MW_TOPOLOGY_VERSION", + "value": "2018-10-22", + "type": "default", + "enabled": true + }, + { + "key": "PX_IETF_MW_TOPOLOGY_NAMESPACE", + "value": "urn:ietf:params:xml:ns:yang:ietf-microwave-topology", + "type": "default", + "enabled": true + }, + { + "key": "PX_IETF_ETH_TRAN_SVC_VERSION", + "value": "2018-08-30", + "type": "default", + "enabled": true + }, + { + "key": "PX_IETF_ETH_TRAN_SVC_NAMESPACE", + "value": "urn:ietf:params:xml:ns:yang:ietf-eth-tran-service", + "type": "default", + "enabled": true + }, + { + "key": "PX_IETF_ETH_TRAN_TYPES_VERSION", + "value": "2018-08-30", + "type": "default", + "enabled": true + }, + { + "key": "PX_IETF_ETH_TRAN_TYPES_NAMESPACE", + "value": "urn:ietf:params:xml:ns:yang:ietf-eth-tran-types", + "type": "default", + "enabled": true + }, + { + "key": "PX_BB_NETWORK_ID", + "value": "network1", + "type": "default", + "enabled": true + }, + { + "key": "PX_BB_PROVIDER_ID", + "value": "provider1", + "type": "default", + "enabled": true + }, + { + "key": "PX_BB_CLIENT_ID", + "value": "client1", "type": "default", "enabled": true }, @@ -148,6 +250,6 @@ } ], "_postman_variable_scope": "environment", - "_postman_exported_at": "2024-06-21T08:09:51.143Z", - "_postman_exported_using": "Postman/11.2.12" + "_postman_exported_at": "2024-07-04T13:52:27.737Z", + "_postman_exported_using": "Postman/11.2.27" } \ No newline at end of file diff --git a/test-purposes/AtsMDSC.tplan2 b/test-purposes/AtsMDSC.tplan2 index 50a9a1b..2ee8492 100644 --- a/test-purposes/AtsMDSC.tplan2 +++ b/test-purposes/AtsMDSC.tplan2 @@ -187,7 +187,7 @@ Package AtsMDSC { Config Id Config_mWT_2 - PICS Selection IUT_PNC and RESTCONF and SEC_TLS and ABSTRACT_BB and MW_TOPO + PICS Selection IUT_PNC and RESTCONF and SEC_TLS and ABSTRACT_BB Initial conditions with { the IUT entity is idle @@ -235,7 +235,47 @@ Package AtsMDSC { Config Id Config_mWT_2 - PICS Selection IUT_PNC and RESTCONF and SEC_TLS and ABSTRACT_BB and MW_TOPO + PICS Selection IUT_PNC and RESTCONF and SEC_TLS and ABSTRACT_BB + + Initial conditions with { + the IUT entity is idle + } + + Expected behaviour + ensure that { + when { + the IUT entity receives a vRequestGet containing + uri indicating value "/restconf/data/ietf-network:networks"; + from the TEST_SYSTEM entity + } then { + the IUT entity sends a r200 containing + headers containing + content_type indicating value "application/yang-data+xml";, + body containing + networks containing + networksList containing + one network node + ;;;; + to the TEST_SYSTEM entity + } + } + } + + Test Purpose { + TP Id TP_mWT_PNC_BB_MW_TOPO_GET_BV_03 + + Test objective + "Verify that the IUT provides a network list containing ietf-network entries." + + Reference + "ETSI GS mWT 024 Clause 4.3.2", + "ETSI GS mWT 024 Annex A.2.3", + "RFC 8345 A YANG Data Model for Network Topologies", + "RFC 8795 YANG Data Model for Traffic Engineering (TE) Topologies" + + Config Id Config_mWT_2 + + PICS Selection IUT_PNC and RESTCONF and SEC_TLS and ABSTRACT_BB Initial conditions with { the IUT entity is idle -- GitLab From a5bd455bcd816928d72110b96f684387be8921e2 Mon Sep 17 00:00:00 2001 From: garciay Date: Mon, 12 Aug 2024 14:04:42 +0200 Subject: [PATCH 12/15] Test commit after moving ETSI forge repo --- postman/TTF_T029.postman_collection.json | 705 ++++++++++++++-------- postman/TTF_T029.postman_environment.json | 126 +++- 2 files changed, 571 insertions(+), 260 deletions(-) diff --git a/postman/TTF_T029.postman_collection.json b/postman/TTF_T029.postman_collection.json index cd8503f..7baf9c2 100644 --- a/postman/TTF_T029.postman_collection.json +++ b/postman/TTF_T029.postman_collection.json @@ -1204,8 +1204,8 @@ "script": { "exec": [ "// Check PICS requirements\r", - "if ((pm.environment.get('PICS_IUT_PNC') != \"true\") || (pm.environment.get('PICS_RESTCONF') != \"true\") || (pm.environment.get('PICS_SEC_TLS') != \"true\") || (pm.environment.get('ABSTRACT_PT') != \"true\") || (pm.environment.get('PICS_MW_TOPO') != \"true\")) {\r", - " throw new Error('PICS_IUT_PNC and PICS_RESTCONF and PICS_SEC_TLS and ABSTRACT_PT and PICS_MW_TOPO are required.');\r", + "if ((pm.environment.get('PICS_IUT_PNC') != \"true\") || (pm.environment.get('PICS_RESTCONF') != \"true\") || (pm.environment.get('PICS_SEC_TLS') != \"true\") || (pm.environment.get('PICS_ABSTRACT_PT') != \"true\") || (pm.environment.get('PICS_MW_TOPO') != \"true\")) {\r", + " throw new Error('PICS_IUT_PNC and PICS_RESTCONF and PICS_SEC_TLS and PICS_ABSTRACT_PT and PICS_MW_TOPO are required.');\r", "}\r", "" ], @@ -1277,8 +1277,8 @@ "script": { "exec": [ "// Check PICS requirements\r", - "if ((pm.environment.get('PICS_IUT_PNC') != \"true\") || (pm.environment.get('PICS_RESTCONF') != \"true\") || (pm.environment.get('PICS_SEC_TLS') != \"true\") || (pm.environment.get('ABSTRACT_PT') != \"true\") || (pm.environment.get('PICS_MW_TOPO') != \"true\")) {\r", - " throw new Error('PICS_IUT_PNC and PICS_RESTCONF and PICS_SEC_TLS and ABSTRACT_PT and PICS_MW_TOPO are required.');\r", + "if ((pm.environment.get('PICS_IUT_PNC') != \"true\") || (pm.environment.get('PICS_RESTCONF') != \"true\") || (pm.environment.get('PICS_SEC_TLS') != \"true\") || (pm.environment.get('PICS_ABSTRACT_PT') != \"true\") || (pm.environment.get('PICS_MW_TOPO') != \"true\")) {\r", + " throw new Error('PICS_IUT_PNC and PICS_RESTCONF and PICS_SEC_TLS and PICS_ABSTRACT_PT and PICS_MW_TOPO are required.');\r", "}\r", "" ], @@ -1445,8 +1445,8 @@ "script": { "exec": [ "// Check PICS requirements\r", - "if ((pm.environment.get('PICS_IUT_PNC') != \"true\") || (pm.environment.get('PICS_RESTCONF') != \"true\") || (pm.environment.get('PICS_SEC_TLS') != \"true\") || (pm.environment.get('ABSTRACT_PT') != \"true\") || (pm.environment.get('PICS_MW_TOPO') != \"true\")) {\r", - " throw new Error('PICS_IUT_PNC and PICS_RESTCONF and PICS_SEC_TLS and ABSTRACT_PT and PICS_MW_TOPO are required.');\r", + "if ((pm.environment.get('PICS_IUT_PNC') != \"true\") || (pm.environment.get('PICS_RESTCONF') != \"true\") || (pm.environment.get('PICS_SEC_TLS') != \"true\") || (pm.environment.get('PICS_ABSTRACT_PT') != \"true\") || (pm.environment.get('PICS_MW_TOPO') != \"true\")) {\r", + " throw new Error('PICS_IUT_PNC and PICS_RESTCONF and PICS_SEC_TLS and PICS_ABSTRACT_PT and PICS_MW_TOPO are required.');\r", "}\r", "" ], @@ -1520,8 +1520,8 @@ "script": { "exec": [ "// Check PICS requirements\r", - "if ((pm.environment.get('PICS_IUT_PNC') != \"true\") || (pm.environment.get('PICS_RESTCONF') != \"true\") || (pm.environment.get('PICS_SEC_TLS') != \"true\") || (pm.environment.get('ABSTRACT_PT') != \"true\") || (pm.environment.get('PICS_MW_TOPO') != \"true\")) {\r", - " throw new Error('PICS_IUT_PNC and PICS_RESTCONF and PICS_SEC_TLS and ABSTRACT_PT and PICS_MW_TOPO are required.');\r", + "if ((pm.environment.get('PICS_IUT_PNC') != \"true\") || (pm.environment.get('PICS_RESTCONF') != \"true\") || (pm.environment.get('PICS_SEC_TLS') != \"true\") || (pm.environment.get('PICS_ABSTRACT_PT') != \"true\") || (pm.environment.get('PICS_MW_TOPO') != \"true\")) {\r", + " throw new Error('PICS_IUT_PNC and PICS_RESTCONF and PICS_SEC_TLS and PICS_ABSTRACT_PT and PICS_MW_TOPO are required.');\r", "}\r", "" ], @@ -1705,7 +1705,6 @@ " mwLinkPoints[1][0][\"te-node-id\"]);\r", " pm.expect(mwLinkPoints[0][1][\"te-tp-id\"]).to.equal(\r", " mwLinkPoints[1][0][\"te-tp-id\"]);\r", - " pm.environment.set('TD_SDN_SETTINGS', settings);\r", "});\r", "\r", "pm.test('Microwave topology links OPER verification', function() {\r", @@ -1792,8 +1791,8 @@ "script": { "exec": [ "// Check PICS requirements\r", - "if ((pm.environment.get('PICS_IUT_PNC') != \"true\") || (pm.environment.get('PICS_RESTCONF') != \"true\") || (pm.environment.get('PICS_SEC_TLS') != \"true\") || (pm.environment.get('ABSTRACT_PT') != \"true\") || (pm.environment.get('PICS_MW_TOPO') != \"true\")) {\r", - " throw new Error('PICS_IUT_PNC and PICS_RESTCONF and PICS_SEC_TLS and ABSTRACT_PT and PICS_MW_TOPO are required.');\r", + "if ((pm.environment.get('PICS_IUT_PNC') != \"true\") || (pm.environment.get('PICS_RESTCONF') != \"true\") || (pm.environment.get('PICS_SEC_TLS') != \"true\") || (pm.environment.get('PICS_ABSTRACT_PT') != \"true\") || (pm.environment.get('PICS_MW_TOPO') != \"true\")) {\r", + " throw new Error('PICS_IUT_PNC and PICS_RESTCONF and PICS_SEC_TLS and PICS_ABSTRACT_PT and PICS_MW_TOPO are required.');\r", "}\r", "" ], @@ -1862,8 +1861,8 @@ "script": { "exec": [ "// Check PICS requirements\r", - "if ((pm.environment.get('PICS_IUT_PNC') != \"true\") || (pm.environment.get('PICS_RESTCONF') != \"true\") || (pm.environment.get('PICS_SEC_TLS') != \"true\") || (pm.environment.get('ABSTRACT_PT') != \"true\") || (pm.environment.get('PICS_MW_TOPO') != \"true\")) {\r", - " throw new Error('PICS_IUT_PNC and PICS_RESTCONF and PICS_SEC_TLS and ABSTRACT_PT and PICS_MW_TOPO are required.');\r", + "if ((pm.environment.get('PICS_IUT_PNC') != \"true\") || (pm.environment.get('PICS_RESTCONF') != \"true\") || (pm.environment.get('PICS_SEC_TLS') != \"true\") || (pm.environment.get('PICS_ABSTRACT_PT') != \"true\") || (pm.environment.get('PICS_MW_TOPO') != \"true\")) {\r", + " throw new Error('PICS_IUT_PNC and PICS_RESTCONF and PICS_SEC_TLS and PICS_ABSTRACT_PT and PICS_MW_TOPO are required.');\r", "}\r", "" ], @@ -2043,7 +2042,6 @@ " mwLinkPoints[1][0][\"te-node-id\"]);\r", " pm.expect(mwLinkPoints[0][1][\"te-tp-id\"]).to.equal(\r", " mwLinkPoints[1][0][\"te-tp-id\"]);\r", - " pm.environment.set('TD_SDN_SETTINGS', settings);\r", "});\r", "\r", "pm.test('Microwave topology links OPER verification', function() {\r", @@ -2130,8 +2128,8 @@ "script": { "exec": [ "// Check PICS requirements\r", - "if ((pm.environment.get('PICS_IUT_PNC') != \"true\") || (pm.environment.get('PICS_RESTCONF') != \"true\") || (pm.environment.get('PICS_SEC_TLS') != \"true\") || (pm.environment.get('ABSTRACT_PT') != \"true\") || (pm.environment.get('PICS_MW_TOPO') != \"true\")) {\r", - " throw new Error('PICS_IUT_PNC and PICS_RESTCONF and PICS_SEC_TLS and ABSTRACT_PT and PICS_MW_TOPO are required.');\r", + "if ((pm.environment.get('PICS_IUT_PNC') != \"true\") || (pm.environment.get('PICS_RESTCONF') != \"true\") || (pm.environment.get('PICS_SEC_TLS') != \"true\") || (pm.environment.get('PICS_ABSTRACT_PT') != \"true\") || (pm.environment.get('PICS_MW_TOPO') != \"true\")) {\r", + " throw new Error('PICS_IUT_PNC and PICS_RESTCONF and PICS_SEC_TLS and PICS_ABSTRACT_PT and PICS_MW_TOPO are required.');\r", "}\r", "" ], @@ -2287,8 +2285,8 @@ "script": { "exec": [ "// Check PICS requirements\r", - "if ((pm.environment.get('PICS_IUT_PNC') != \"true\") || (pm.environment.get('PICS_RESTCONF') != \"true\") || (pm.environment.get('PICS_SEC_TLS') != \"true\") || (pm.environment.get('ABSTRACT_PT') != \"true\") || (pm.environment.get('ETH_TOPO') != \"true\")) {\r", - " throw new Error('PICS_IUT_PNC and PICS_RESTCONF and PICS_SEC_TLS and ABSTRACT_PT and ETH_TOPO are required.');\r", + "if ((pm.environment.get('PICS_IUT_PNC') != \"true\") || (pm.environment.get('PICS_RESTCONF') != \"true\") || (pm.environment.get('PICS_SEC_TLS') != \"true\") || (pm.environment.get('PICS_ABSTRACT_PT') != \"true\") || (pm.environment.get('PICS_ETH_TOPO') != \"true\")) {\r", + " throw new Error('PICS_IUT_PNC and PICS_RESTCONF and PICS_SEC_TLS and PICS_ABSTRACT_PT and PICS_ETH_TOPO are required.');\r", "}\r", "" ], @@ -2456,8 +2454,8 @@ "script": { "exec": [ "// Check PICS requirements\r", - "if ((pm.environment.get('PICS_IUT_PNC') != \"true\") || (pm.environment.get('PICS_RESTCONF') != \"true\") || (pm.environment.get('PICS_SEC_TLS') != \"true\") || (pm.environment.get('ABSTRACT_PT') != \"true\") || (pm.environment.get('ETH_TOPO') != \"true\")) {\r", - " throw new Error('PICS_IUT_PNC and PICS_RESTCONF and PICS_SEC_TLS and ABSTRACT_PT and ETH_TOPO are required.');\r", + "if ((pm.environment.get('PICS_IUT_PNC') != \"true\") || (pm.environment.get('PICS_RESTCONF') != \"true\") || (pm.environment.get('PICS_SEC_TLS') != \"true\") || (pm.environment.get('PICS_ABSTRACT_PT') != \"true\") || (pm.environment.get('PICS_ETH_TOPO') != \"true\")) {\r", + " throw new Error('PICS_IUT_PNC and PICS_RESTCONF and PICS_SEC_TLS and PICS_ABSTRACT_PT and PICS_ETH_TOPO are required.');\r", "}\r", "" ], @@ -2528,8 +2526,8 @@ "script": { "exec": [ "// Check PICS requirements\r", - "if ((pm.environment.get('PICS_IUT_PNC') != \"true\") || (pm.environment.get('PICS_RESTCONF') != \"true\") || (pm.environment.get('PICS_SEC_TLS') != \"true\") || (pm.environment.get('ABSTRACT_PT') != \"true\") || (pm.environment.get('ETH_TOPO') != \"true\")) {\r", - " throw new Error('PICS_IUT_PNC and PICS_RESTCONF and PICS_SEC_TLS and ABSTRACT_PT and ETH_TOPO are required.');\r", + "if ((pm.environment.get('PICS_IUT_PNC') != \"true\") || (pm.environment.get('PICS_RESTCONF') != \"true\") || (pm.environment.get('PICS_SEC_TLS') != \"true\") || (pm.environment.get('PICS_ABSTRACT_PT') != \"true\") || (pm.environment.get('PICS_ETH_TOPO') != \"true\")) {\r", + " throw new Error('PICS_IUT_PNC and PICS_RESTCONF and PICS_SEC_TLS and PICS_ABSTRACT_PT and PICS_ETH_TOPO are required.');\r", "}\r", "" ], @@ -2600,8 +2598,8 @@ "script": { "exec": [ "// Check PICS requirements\r", - "if ((pm.environment.get('PICS_IUT_PNC') != \"true\") || (pm.environment.get('PICS_RESTCONF') != \"true\") || (pm.environment.get('PICS_SEC_TLS') != \"true\") || (pm.environment.get('ABSTRACT_PT') != \"true\") || (pm.environment.get('ETH_TOPO') != \"true\")) {\r", - " throw new Error('PICS_IUT_PNC and PICS_RESTCONF and PICS_SEC_TLS and ABSTRACT_PT and ETH_TOPO are required.');\r", + "if ((pm.environment.get('PICS_IUT_PNC') != \"true\") || (pm.environment.get('PICS_RESTCONF') != \"true\") || (pm.environment.get('PICS_SEC_TLS') != \"true\") || (pm.environment.get('PICS_ABSTRACT_PT') != \"true\") || (pm.environment.get('PICS_ETH_TOPO') != \"true\")) {\r", + " throw new Error('PICS_IUT_PNC and PICS_RESTCONF and PICS_SEC_TLS and PICS_ABSTRACT_PT and PICS_ETH_TOPO are required.');\r", "}\r", "" ], @@ -2781,8 +2779,8 @@ "script": { "exec": [ "// Check PICS requirements\r", - "if ((pm.environment.get('PICS_IUT_PNC') != \"true\") || (pm.environment.get('PICS_RESTCONF') != \"true\") || (pm.environment.get('PICS_SEC_TLS') != \"true\") || (pm.environment.get('ABSTRACT_PT') != \"true\") || (pm.environment.get('ETH_TOPO') != \"true\")) {\r", - " throw new Error('PICS_IUT_PNC and PICS_RESTCONF and PICS_SEC_TLS and ABSTRACT_PT and ETH_TOPO are required.');\r", + "if ((pm.environment.get('PICS_IUT_PNC') != \"true\") || (pm.environment.get('PICS_RESTCONF') != \"true\") || (pm.environment.get('PICS_SEC_TLS') != \"true\") || (pm.environment.get('PICS_ABSTRACT_PT') != \"true\") || (pm.environment.get('PICS_ETH_TOPO') != \"true\")) {\r", + " throw new Error('PICS_IUT_PNC and PICS_RESTCONF and PICS_SEC_TLS and PICS_ABSTRACT_PT and PICS_ETH_TOPO are required.');\r", "}\r", "" ], @@ -2963,8 +2961,8 @@ "script": { "exec": [ "// Check PICS requirements\r", - "if ((pm.environment.get('PICS_IUT_PNC') != \"true\") || (pm.environment.get('PICS_RESTCONF') != \"true\") || (pm.environment.get('PICS_SEC_TLS') != \"true\") || (pm.environment.get('ABSTRACT_PT') != \"true\") || (pm.environment.get('ETH_TOPO') != \"true\")) {\r", - " throw new Error('PICS_IUT_PNC and PICS_RESTCONF and PICS_SEC_TLS and ABSTRACT_PT and ETH_TOPO are required.');\r", + "if ((pm.environment.get('PICS_IUT_PNC') != \"true\") || (pm.environment.get('PICS_RESTCONF') != \"true\") || (pm.environment.get('PICS_SEC_TLS') != \"true\") || (pm.environment.get('PICS_ABSTRACT_PT') != \"true\") || (pm.environment.get('PICS_ETH_TOPO') != \"true\")) {\r", + " throw new Error('PICS_IUT_PNC and PICS_RESTCONF and PICS_SEC_TLS and PICS_ABSTRACT_PT and PICS_ETH_TOPO are required.');\r", "}\r", "" ], @@ -3036,8 +3034,8 @@ "script": { "exec": [ "// Check PICS requirements\r", - "if ((pm.environment.get('PICS_IUT_PNC') != \"true\") || (pm.environment.get('PICS_RESTCONF') != \"true\") || (pm.environment.get('PICS_SEC_TLS') != \"true\") || (pm.environment.get('ABSTRACT_PT') != \"true\") || (pm.environment.get('ETH_TOPO') != \"true\")) {\r", - " throw new Error('PICS_IUT_PNC and PICS_RESTCONF and PICS_SEC_TLS and ABSTRACT_PT and ETH_TOPO are required.');\r", + "if ((pm.environment.get('PICS_IUT_PNC') != \"true\") || (pm.environment.get('PICS_RESTCONF') != \"true\") || (pm.environment.get('PICS_SEC_TLS') != \"true\") || (pm.environment.get('PICS_ABSTRACT_PT') != \"true\") || (pm.environment.get('PICS_ETH_TOPO') != \"true\")) {\r", + " throw new Error('PICS_IUT_PNC and PICS_RESTCONF and PICS_SEC_TLS and PICS_ABSTRACT_PT and PICS_ETH_TOPO are required.');\r", "}\r", "" ], @@ -3100,54 +3098,379 @@ "listen": "test", "script": { "exec": [ - "pm.test(\"Verify that the response status code is 200\", function () {\r", - " pm.response.to.have.status(200);\r", + "pm.test('Response is OK', function() {\r", + " pm.expect(pm.response).to.have.property('code', 200);\r", "});\r", "\r", - "var responseData = '';\r", - "var topLevelPropertyName = '';\r", + "var responseJson = pm.response.json();\r", "\r", - "pm.test(\"Verify that headers.Content-Type is 'application/yang-data+json'\", function () {\r", - " pm.expect(pm.response.headers.get('Content-Type')).is.equals('application/yang-data+json');\r", - " responseData = pm.response.json();\r", - " topLevelPropertyName = responseData.hasOwnProperty('modules-state') ? 'modules-state' : 'ietf-yang-library:modules-state';\r", - " console.info(topLevelPropertyName)\r", + "var profileName = 'bw_profile_' + pm.environment.get('PX_ETH_SVC_NAME');\r", + "\r", + "var provider_id = pm.environment.get('PX_BB_PROVIDER_ID');\r", + "var client_id = pm.environment.get('PX_BB_CLIENT_ID');\r", + "var eth_topology_id = pm.environment.get('PX_NETWORK_ID');\r", + "\r", + "// id of the nodes\r", + "var access_node_1_id = pm.environment.get('PX_ACCESS_NODE_ID_1');\r", + "var access_node_2_id = pm.environment.get('PX_ACCESS_NODE_ID_2');\r", + "\r", + "// id of node1 -> a-link-aggr\r", + "var access_node_1_ltp_aggr_access_port_id = 1;\r", + "var access_node_1_ltp_aggr_access_ltp_id = pm.environment.get('PX_LINK_AGGREG_ID_1');\r", + "\r", + "// id of node2 -> a-link-local\r", + "var access_node_2_ltp_local_access_port_id = 2; \r", + "var access_node_2_ltp_local_access_ltp_id = pm.environment.get('PX_LINK_AGGREG_ID_2');\r", + "\r", + "// id of node2 -> inter-d-w\r", + "var access_node_2_ltp_west_access_port_id = 2;\r", + "var access_node_2_ltp_west_access_ltp_id = pm.environment.get('PX_I_D_LINK_W_ID');\r", + "\r", + "// id of node2 -> inter-d-e\r", + "var access_node_2_ltp_east_access_port_id = 2;\r", + "var access_node_2_ltp_east_access_ltp_id = pm.environment.get('PX_I_D_LINK_E_ID');\r", + "\r", + "var sVlan = 'ietf-eth-tran-types:classify-s-vlan';\r", + "var cVlan = 'ietf-eth-tran-types:classify-c-vlan';\r", + "\r", + "var topLevelPropertyName = null;\r", + "var topLevelObject = null;\r", + "pm.test('Verify that response contains ietf-eth-tran-service:etht-svc', function() {\r", + " topLevelPropertyName = responseJson.hasOwnProperty('etht-svc') ? 'etht-svc' : 'ietf-eth-tran-service:etht-svc';\r", + " pm.expect(responseJson).to.have.property(topLevelPropertyName);\r", + " topLevelObject = responseJson[topLevelPropertyName];\r", "});\r", "\r", - "// var moduleList = {};\r", + "var bandwidthProfile = null;\r", + "pm.test('Verify that Ethernet services contain bandwidth profiles', function() {\r", + " pm.expect(topLevelObject).to.have.property('globals');\r", + " pm.expect(responseJson[topLevelPropertyName].globals).to.have.property('etht-svc-bandwidth-profiles');\r", "\r", - "// pm.test(\"Validate the main field is 'ietf-yang-library:modules-state'\", function () {\r", - "// pm.expect(responseData).to.be.an('object');\r", - "// pm.expect(responseData).to.have.property(topLevelPropertyName);\r", - "// });\r", + " var profileArr = responseJson[topLevelPropertyName].globals['etht-svc-bandwidth-profiles'];\r", + " pm.expect(Array.isArray(profileArr)).be.true;\r", + " bandwidthProfile = findBWProfile(profileArr);\r", + " pm.expect(bandwidthProfile !== null).to.be.true;\r", "\r", - "// pm.test(\"Verify that the 'module' array is present and not empty\", function () {\r", - "// pm.expect(responseData).to.be.an('object');\r", - "// pm.expect(responseData[topLevelPropertyName][\"module\"]).to.be.an('array').with.lengthOf.at.least(1);\r", - "// // Build the module list\r", - "// responseData[topLevelPropertyName].module.forEach(function(item, index) {\r", - "// pm.expect(item).to.have.property('name');\r", - "// pm.expect(item).to.have.property('revision');\r", - "// pm.expect(item).to.have.property('namespace');\r", - "// if (moduleList.hasOwnProperty(item.name)) {\r", - "// if (moduleList[item.name].revision < item.revision) {\r", - "// moduleList[item.name] = item;\r", - "// }\r", - "// } else {\r", - "// moduleList[item.name] = item;\r", - "// }\r", - "// });\r", + " parseProfileValues(bandwidthProfile)\r", "\r", - "// });\r", + "});\r", "\r", - "// pm.test('Verify that the basics YANG modules are supported', function() {\r", - "// pm.expect(moduleList).to.have.property(\"ietf-restconf\");\r", - "// pm.expect(moduleList).to.have.property(\"ietf-yang-library\");\r", - "// pm.expect(moduleList).to.have.property(\"ietf-datastores\");\r", - "// pm.expect(moduleList).to.have.property(\"ietf-inet-types\");\r", - "// pm.expect(moduleList).to.have.property(\"ietf-interfaces\");\r", - "// pm.expect(moduleList).to.have.property(\"ietf-ip\");\r", - "//});" + "var serviceNames; // FIXME Use PX parameters\r", + "if (pm.info.iteration === 0) {\r", + " serviceNames = ['S1-local', 'S2-local-1', 'S3-local-1', 'S1-inter-d-1', 'S2-inter-d-1', 'S3-inter-d-1', 'S4-inter-d-1', 'S1-leaf-2', 'S2-leaf-2', 'S3-leaf-1'];\r", + "} else if (pm.info.iteration === 1) {\r", + " serviceNames = ['S1-local-1', 'S1-inter-d-2', 'S2-inter-d-2', 'S1-leaf-1', 'S2-leaf-1'];\r", + "} else if (pm.info.iteration === 2) {\r", + " serviceNames = ['S3-local-1', 'S3-inter-d-2', 'S4-inter-d-2', 'S2-leaf-3', 'S3-leaf-2'];\r", + "}\r", + "pm.test('Verify that Ethernet services contain services instances', function() {\r", + " var serviceInstances = responseJson[topLevelPropertyName][\"etht-svc-instances\"];\r", + " for(var i = 0; i < serviceNames.length; i++) {\r", + " var serviceName = serviceNames[i];\r", + " var service = findService(serviceInstances, serviceName);\r", + " pm.expect(service !== null).to.be.true;\r", + " parseServiceValues(pm.info.iteration + 1, service, serviceName);\r", + " }\r", + "});\r", + "\r", + "function findBWProfile(profileArr) {\r", + " var len = profileArr.length;\r", + " for (var i = 0; i < len; ++i) {\r", + " var prof = profileArr[i];\r", + " if (prof['bandwidth-profile-name'] === profileName) {\r", + " return prof;\r", + " }\r", + " }\r", + " return null;\r", + "}\r", + "\r", + "function parseProfileValues(bandwidthProfile) {\r", + " pm.test('Bandwidth profile values check', function(){\r", + " pm.expect(bandwidthProfile).to.have.property('bandwidth-profile-type','ietf-eth-tran-types:mef-10-bwp');\r", + " pm.expect(bandwidthProfile).to.have.property('CIR');\r", + " pm.expect(parseInt(bandwidthProfile['CIR'])).to.equal(parseInt(pm.environment.get('PX_CIR_VALUE')));\r", + " pm.expect(bandwidthProfile).to.have.property('EIR');\r", + " pm.expect(parseInt(bandwidthProfile['EIR'])).to.equal(parseInt(pm.environment.get('PX_EIR_VALUE')));\r", + " pm.expect(bandwidthProfile).to.have.property('color-aware');\r", + " if (typeof(bandwidthProfile['color-aware']) === 'boolean') {\r", + " pm.expect(bandwidthProfile['color-aware']).be.true;\r", + " } else {\r", + " pm.expect('' + bandwidthProfile['color-aware']).to.equal('' + true);\r", + " }\r", + " pm.expect(bandwidthProfile).to.have.property('coupling-flag');\r", + " if (typeof(bandwidthProfile['coupling-flag']) === 'boolean') {\r", + " pm.expect(bandwidthProfile['coupling-flag']).be.true;\r", + " } else {\r", + " pm.expect('' + bandwidthProfile['coupling-flag']).to.equal('' + true);\r", + " }\r", + " });\r", + "}\r", + "\r", + "function findService(instanceArr, serviceName) {\r", + " var len = instanceArr.length;\r", + " for (var i = 0; i < len; ++i) {\r", + " var svc = instanceArr[i];\r", + " if (svc['etht-svc-name'] === serviceName) {\r", + " return svc;\r", + " }\r", + " }\r", + " return null;\r", + "}\r", + "\r", + "function parseServiceValues(domainIndex, service) { // FIXME To be reviewed during validations\r", + " var serviceName = service['etht-svc-name'];\r", + " \r", + " pm.test('Validate service values: ' + serviceName, function() {\r", + " checkServiceBeginning(service);\r", + " checkServiceEnding(service);\r", + " \r", + " var accessPortId1 = 1;\r", + " var accessNodeId1;\r", + " var accessLtpId1;\r", + " var vlanId1;\r", + " var vlanType1;\r", + " \r", + " var accessPortId2 = 2;\r", + " var accessNodeId2;\r", + " var accessLtpId2;\r", + " var vlanId2;\r", + " var vlanType2;\r", + " \r", + " if (1 === domainIndex) {\r", + " if ( 'S1-local' === serviceName) {\r", + " accessNodeId1 = access_node_1_id;\r", + " accessLtpId1 = access_node_1_ltp_aggr_access_ltp_id;\r", + " vlanId1 = 201;\r", + " vlanType1 = sVlan;\r", + " accessNodeId2 = access_node_2_id;\r", + " accessLtpId2 = access_node_2_ltp_local_access_ltp_id;\r", + " vlanId2 = 101;\r", + " vlanType2 = cVlan;\r", + " } else if ('S2-local-1' === serviceName) {\r", + " accessNodeId1 = access_node_1_id;\r", + " accessLtpId1 = access_node_1_ltp_aggr_access_ltp_id;\r", + " vlanId1 = 202;\r", + " vlanType1 = sVlan;\r", + " accessNodeId2 = access_node_2_id;\r", + " accessLtpId2 = access_node_2_ltp_west_access_ltp_id;\r", + " vlanId2 = 202;\r", + " vlanType2 = sVlan;\r", + " } else if ('S3-local-1' === serviceName) {\r", + " accessNodeId1 = access_node_1_id;\r", + " accessLtpId1 = access_node_1_ltp_aggr_access_ltp_id;\r", + " vlanId1 = 203;\r", + " vlanType1 = sVlan;\r", + " accessNodeId2 = access_node_2_id;\r", + " accessLtpId2 = access_node_2_ltp_east_access_ltp_id;\r", + " vlanId2 = 203;\r", + " vlanType2 = sVlan;\r", + " } else if ('S1-inter-d-1' === serviceName) {\r", + " accessNodeId1 = access_node_1_id;\r", + " accessLtpId1 = access_node_1_ltp_aggr_access_ltp_id;\r", + " vlanId1 = 204;\r", + " vlanType1 = sVlan;\r", + " accessNodeId2 = access_node_2_id;\r", + " accessLtpId2 = access_node_2_ltp_west_access_ltp_id;\r", + " vlanId2 = 204;\r", + " vlanType2 = sVlan;\r", + " } else if ('S2-inter-d-1' === serviceName) {\r", + " accessNodeId1 = access_node_1_id;\r", + " accessLtpId1 = access_node_1_ltp_aggr_access_ltp_id;\r", + " vlanId1 = 205;\r", + " vlanType1 = sVlan;\r", + " accessNodeId2 = access_node_2_id;\r", + " accessLtpId2 = access_node_2_ltp_west_access_ltp_id;\r", + " vlanId2 = 205;\r", + " vlanType2 = sVlan;\r", + " } else if ('S3-inter-d-1' === serviceName) {\r", + " accessNodeId1 = access_node_1_id;\r", + " accessLtpId1 = access_node_1_ltp_aggr_access_ltp_id;\r", + " vlanId1 = 206;\r", + " vlanType1 = sVlan;\r", + " accessNodeId2 = access_node_2_id;\r", + " accessLtpId2 = access_node_2_ltp_east_access_ltp_id;\r", + " vlanId2 = 206;\r", + " vlanType2 = sVlan;\r", + " } else if ('S4-inter-d-1' === serviceName) {\r", + " accessNodeId1 = access_node_1_id;\r", + " accessLtpId1 = access_node_1_ltp_aggr_access_ltp_id;\r", + " vlanId1 = 207;\r", + " vlanType1 = sVlan;\r", + " accessNodeId2 = access_node_2_id;\r", + " accessLtpId2 = access_node_2_ltp_east_access_ltp_id;\r", + " vlanId2 = 207;\r", + " vlanType2 = sVlan;\r", + " } else if ('S1-leaf-2' === serviceName) {\r", + " accessNodeId1 = access_node_2_id;\r", + " accessLtpId1 = access_node_2_ltp_west_access_ltp_id;\r", + " vlanId1 = 208;\r", + " vlanType1 = sVlan;\r", + " accessNodeId2 = access_node_2_id;\r", + " accessLtpId2 = access_node_2_ltp_east_access_ltp_id;\r", + " vlanId2 = 208;\r", + " vlanType2 = sVlan;\r", + " } else if ('S2-leaf-2' === serviceName) {\r", + " accessNodeId1 = access_node_2_id;\r", + " accessLtpId1 = access_node_2_ltp_west_access_ltp_id;\r", + " vlanId1 = 209;\r", + " vlanType1 = sVlan;\r", + " accessNodeId2 = access_node_2_id;\r", + " accessLtpId2 = access_node_2_ltp_local_access_ltp_id;\r", + " vlanId2 = 103;\r", + " vlanType2 = cVlan; \r", + " } else if ('S3-leaf-1' === serviceName) {\r", + " accessNodeId1 = access_node_2_id;\r", + " accessLtpId1 = access_node_2_ltp_local_access_ltp_id;\r", + " vlanId1 = 104;\r", + " vlanType1 = cVlan;\r", + " accessNodeId2 = access_node_2_id;\r", + " accessLtpId2 = access_node_2_ltp_east_access_ltp_id;\r", + " vlanId2 = 210;\r", + " vlanType2 = sVlan;\r", + " }\r", + " } else if (2 === domainIndex) {\r", + " if ( 'S2-local-2' === serviceName) {\r", + " accessNodeId1 = access_node_1_id;\r", + " accessLtpId1 = access_node_1_ltp_aggr_access_ltp_id;\r", + " vlanId1 = 202;\r", + " vlanType1 = sVlan;\r", + " accessNodeId2 = access_node_2_id;\r", + " accessLtpId2 = access_node_2_ltp_local_access_ltp_id;\r", + " vlanId2 = 101;\r", + " vlanType2 = cVlan;\r", + " } else if ('S1-inter-d-2' === serviceName) {\r", + " accessNodeId1 = access_node_1_id;\r", + " accessLtpId1 = access_node_1_ltp_aggr_access_ltp_id;\r", + " vlanId1 = 204;\r", + " vlanType1 = sVlan;\r", + " accessNodeId2 = access_node_2_id;\r", + " accessLtpId2 = access_node_2_ltp_west_access_ltp_id;\r", + " vlanId2 = 204;\r", + " vlanType2 = sVlan;\r", + " } else if ('S2-inter-d-2' === serviceName) {\r", + " accessNodeId1 = access_node_1_id;\r", + " accessLtpId1 = access_node_1_ltp_aggr_access_ltp_id;\r", + " vlanId1 = 205;\r", + " vlanType1 = sVlan;\r", + " accessNodeId2 = access_node_2_id;\r", + " accessLtpId2 = access_node_2_ltp_east_access_ltp_id;\r", + " vlanId2 = 205;\r", + " vlanType2 = sVlan;\r", + " } else if ('S1-leaf-1' === serviceName) {\r", + " accessNodeId1 = access_node_2_id;\r", + " accessLtpId1 = access_node_2_ltp_local_access_ltp_id;\r", + " vlanId1 = 102;\r", + " vlanType1 = cVlan;\r", + " accessNodeId2 = access_node_1_id;\r", + " accessLtpId2 = access_node_1_ltp_aggr_access_ltp_id;\r", + " vlanId2 = 208;\r", + " vlanType2 = sVlan;\r", + " } else if ('S2-leaf-2' === serviceName) {\r", + " accessNodeId1 = access_node_2_id;\r", + " accessLtpId1 = access_node_2_ltp_local_access_ltp_id;\r", + " vlanId1 = 103;\r", + " vlanType1 = cVlan;\r", + " accessNodeId2 = access_node_1_id;\r", + " accessLtpId2 = access_node_1_ltp_aggr_access_ltp_id;\r", + " vlanId2 = 209;\r", + " vlanType2 = sVlan;\r", + " } \r", + " } else if (3 === domainIndex) {\r", + " if ( 'S3-local-2' === serviceName) {\r", + " accessNodeId1 = access_node_1_id;\r", + " accessLtpId1 = access_node_1_ltp_aggr_access_ltp_id;\r", + " vlanId1 = 203;\r", + " vlanType1 = sVlan;\r", + " accessNodeId2 = access_node_2_id;\r", + " accessLtpId2 = access_node_2_ltp_local_access_ltp_id;\r", + " vlanId2 = 101;\r", + " vlanType2 = cVlan;\r", + " } else if ('S3-inter-d-2' === serviceName) {\r", + " accessNodeId1 = access_node_1_id;\r", + " accessLtpId1 = access_node_1_ltp_aggr_access_ltp_id;\r", + " vlanId1 = 206;\r", + " vlanType1 = sVlan;\r", + " accessNodeId2 = access_node_2_id;\r", + " accessLtpId2 = access_node_2_ltp_west_access_ltp_id;\r", + " vlanId2 = 206;\r", + " vlanType2 = sVlan;\r", + " } else if ('S4-inter-d-2' === serviceName) {\r", + " accessNodeId1 = access_node_1_id;\r", + " accessLtpId1 = access_node_1_ltp_aggr_access_ltp_id;\r", + " vlanId1 = 207;\r", + " vlanType1 = sVlan;\r", + " accessNodeId2 = access_node_2_id;\r", + " accessLtpId2 = access_node_2_ltp_east_access_ltp_id;\r", + " vlanId2 = 207;\r", + " vlanType2 = sVlan;\r", + " } else if ('S1-leaf-3' === serviceName) {\r", + " accessNodeId1 = access_node_1_id;\r", + " accessLtpId1 = access_node_1_ltp_aggr_access_ltp_id;\r", + " vlanId1 = 208;\r", + " vlanType1 = sVlan;\r", + " accessNodeId2 = access_node_2_id;\r", + " accessLtpId2 = access_node_2_ltp_local_access_ltp_id;\r", + " vlanId2 = 102;\r", + " vlanType2 = cVlan;\r", + " } else if ('S3-leaf-2' === serviceName) {\r", + " accessNodeId1 = access_node_1_id;\r", + " accessLtpId1 = access_node_1_ltp_aggr_access_ltp_id;\r", + " vlanId1 = 210;\r", + " vlanType1 = sVlan;\r", + " accessNodeId2 = access_node_2_id;\r", + " accessLtpId2 = access_node_2_ltp_local_access_ltp_id;\r", + " vlanId2 = 104;\r", + " vlanType2 = cVlan;\r", + " } \r", + " }\r", + " \r", + " checkServiceElement(service, 0, accessPortId1, accessNodeId1, accessLtpId1, vlanId1, vlanType1);\r", + " checkServiceElement(service, 1, accessPortId2, accessNodeId2, accessLtpId2, vlanId2, vlanType2);\r", + " });\r", + " \r", + "}\r", + "\r", + "function checkServiceBeginning(service) {\r", + " pm.expect(service).to.have.property('etht-svc-type','ietf-eth-tran-types:p2p-svc');\r", + " pm.expect(service).to.have.property('access-provider-id',provider_id);\r", + " pm.expect(service).to.have.property('access-client-id',client_id);\r", + " pm.expect(service).to.have.property('access-topology-id',eth_topology_id);\r", + "}\r", + "\r", + "function checkServiceElement(service, n, accessPortId, accessNodeId, accessLtpPortId, vlanId, vlanType) {\r", + " pm.expect(service['etht-svc-access-ports'][n]).to.have.property('access-port-id',accessPortId);\r", + " pm.expect(service['etht-svc-access-ports'][n]).to.have.property('access-node-id',accessNodeId);\r", + " pm.expect(service['etht-svc-access-ports'][n]).to.have.property('access-ltp-id', accessLtpPortId);\r", + " pm.expect(service['etht-svc-access-ports'][n]).to.have.property('service-classification-type','ietf-eth-tran-types:vlan-classification');\r", + " pm.expect(service['etht-svc-access-ports'][n]).to.have.property('outer-tag');\r", + " pm.expect(service['etht-svc-access-ports'][n]['outer-tag']).to.have.property('tag-type',vlanType);\r", + " pm.expect(service['etht-svc-access-ports'][n]['outer-tag']).to.have.property('vlan-value', vlanId);\r", + " if (vlanType === 'ietf-eth-tran-types:classify-c-vlan') {\r", + " pm.expect(service['etht-svc-access-ports'][n]).to.have.property('ingress-egress-bandwidth-profile-name', profileName);\r", + " } else {\r", + " pm.expect(service['etht-svc-access-ports'][n]).to.not.have.property('ingress-egress-bandwidth-profile-name');\r", + " }\r", + "}\r", + "\r", + "function checkServiceEnding(service) {\r", + " var state = \"up\";\r", + " var serviceName = service[\"etht-svc-name\"];\r", + " if ('Intracom' === companyName && ['S1-local', 'S3-leaf-1', 'S2-leaf-2'].includes(serviceName) && currentlyActiveLocalService !== serviceName) {\r", + " state = \"down\";\r", + " }\r", + " pm.expect(service).to.have.property('admin-status','ietf-te-types:tunnel-state-' + state);\r", + " pm.expect(service).to.have.property('state');\r", + " pm.expect(service['state']).to.have.property('operational-state','ietf-te-types:tunnel-state-' + state);\r", + " pm.expect(service['state']).to.have.property('provisioning-state','ietf-te-types:lsp-state-up');\r", + "}\r", + "\r", + "\r", + "\r", + "\r", + "\r", + "\r", + "\r", + "" ], "type": "text/javascript", "packages": {} @@ -3158,8 +3481,8 @@ "script": { "exec": [ "// Check PICS requirements\r", - "if ((pm.environment.get('PICS_IUT_PNC') != \"true\") || (pm.environment.get('PICS_RESTCONF') != \"true\") || (pm.environment.get('PICS_SEC_TLS') != \"true\") || (pm.environment.get('ABSTRACT_PT') != \"true\")) {\r", - " throw new Error('PICS_IUT_PNC and PICS_RESTCONF and PICS_SEC_TLS and ABSTRACT_PT are required.');\r", + "if ((pm.environment.get('PICS_IUT_PNC') != \"true\") || (pm.environment.get('PICS_RESTCONF') != \"true\") || (pm.environment.get('PICS_SEC_TLS') != \"true\") || (pm.environment.get('PICS_ABSTRACT_PT') != \"true\")) {\r", + " throw new Error('PICS_IUT_PNC and PICS_RESTCONF and PICS_SEC_TLS and PICS_ABSTRACT_PT are required.');\r", "}\r", "" ], @@ -3229,8 +3552,8 @@ "script": { "exec": [ "// Check PICS requirements\r", - "if ((pm.environment.get('PICS_IUT_PNC') != \"true\") || (pm.environment.get('PICS_RESTCONF') != \"true\") || (pm.environment.get('PICS_SEC_TLS') != \"true\") || (pm.environment.get('ABSTRACT_PT') != \"true\")) {\r", - " throw new Error('PICS_IUT_PNC and PICS_RESTCONF and PICS_SEC_TLS and ABSTRACT_PT are required.');\r", + "if ((pm.environment.get('PICS_IUT_PNC') != \"true\") || (pm.environment.get('PICS_RESTCONF') != \"true\") || (pm.environment.get('PICS_SEC_TLS') != \"true\") || (pm.environment.get('PICS_ABSTRACT_PT') != \"true\")) {\r", + " throw new Error('PICS_IUT_PNC and PICS_RESTCONF and PICS_SEC_TLS and PICS_ABSTRACT_PT are required.');\r", "}\r", "" ], @@ -3291,50 +3614,14 @@ " pm.response.to.have.status(201);\r", "});\r", "\r", - "var responseData = '';\r", - "var topLevelPropertyName = '';\r", + "var responseJson = pm.response.json();\r", "\r", - "pm.test(\"Verify that headers.Content-Type is 'application/yang-data+json'\", function () {\r", - " pm.expect(pm.response.headers.get('Content-Type')).is.equals('application/yang-data+json');\r", - " responseData = pm.response.json();\r", - " topLevelPropertyName = responseData.hasOwnProperty('modules-state') ? 'modules-state' : 'ietf-yang-library:modules-state';\r", - " console.info(topLevelPropertyName)\r", + "pm.test(\"Verify that headers.Content-Type is 'application/yang-data+json; charset=utf-8'\", function () {\r", + " pm.expect(pm.response.headers.get('Content-Type')).is.equals('application/yang-data+json; charset=utf-8');\r", + " responseJson = pm.response.json();\r", "});\r", "\r", - "// var moduleList = {};\r", - "\r", - "// pm.test(\"Validate the main field is 'ietf-yang-library:modules-state'\", function () {\r", - "// pm.expect(responseData).to.be.an('object');\r", - "// pm.expect(responseData).to.have.property(topLevelPropertyName);\r", - "// });\r", - "\r", - "// pm.test(\"Verify that the 'module' array is present and not empty\", function () {\r", - "// pm.expect(responseData).to.be.an('object');\r", - "// pm.expect(responseData[topLevelPropertyName][\"module\"]).to.be.an('array').with.lengthOf.at.least(1);\r", - "// // Build the module list\r", - "// responseData[topLevelPropertyName].module.forEach(function(item, index) {\r", - "// pm.expect(item).to.have.property('name');\r", - "// pm.expect(item).to.have.property('revision');\r", - "// pm.expect(item).to.have.property('namespace');\r", - "// if (moduleList.hasOwnProperty(item.name)) {\r", - "// if (moduleList[item.name].revision < item.revision) {\r", - "// moduleList[item.name] = item;\r", - "// }\r", - "// } else {\r", - "// moduleList[item.name] = item;\r", - "// }\r", - "// });\r", - "\r", - "// });\r", - "\r", - "// pm.test('Verify that the basics YANG modules are supported', function() {\r", - "// pm.expect(moduleList).to.have.property(\"ietf-restconf\");\r", - "// pm.expect(moduleList).to.have.property(\"ietf-yang-library\");\r", - "// pm.expect(moduleList).to.have.property(\"ietf-datastores\");\r", - "// pm.expect(moduleList).to.have.property(\"ietf-inet-types\");\r", - "// pm.expect(moduleList).to.have.property(\"ietf-interfaces\");\r", - "// pm.expect(moduleList).to.have.property(\"ietf-ip\");\r", - "//});" + "" ], "type": "text/javascript", "packages": {} @@ -3345,8 +3632,8 @@ "script": { "exec": [ "// Check PICS requirements\r", - "if ((pm.environment.get('PICS_IUT_PNC') != \"true\") || (pm.environment.get('PICS_RESTCONF') != \"true\") || (pm.environment.get('PICS_SEC_TLS') != \"true\") || (pm.environment.get('ABSTRACT_PT') != \"true\")) {\r", - " throw new Error('PICS_IUT_PNC and PICS_RESTCONF and PICS_SEC_TLS and ABSTRACT_PT are required.');\r", + "if ((pm.environment.get('PICS_IUT_PNC') != \"true\") || (pm.environment.get('PICS_RESTCONF') != \"true\") || (pm.environment.get('PICS_SEC_TLS') != \"true\") || (pm.environment.get('PICS_ABSTRACT_PT') != \"true\") || (pm.environment.get('PICS_BWP_SVS_IN_ONE_REQUEST') == \"true\")) {\r", + " throw new Error('PICS_IUT_PNC and PICS_RESTCONF and PICS_SEC_TLS and PICS_ABSTRACT_PT and not PICS_BWP_SVS_IN_ONE_REQUEST are required.');\r", "}\r", "" ], @@ -3373,6 +3660,15 @@ "value": "application/yang-data+json" } ], + "body": { + "mode": "raw", + "raw": "{\r\n \"etht-svc-bandwidth-profiles\": [\r\n {\r\n \"bandwidth-profile-name\": \"bw_profile_{{PX_ETH_SVC_NAME}}\",\r\n \"bandwidth-profile-type\": \"ietf-eth-tran-types:mef-10-bwp\",\r\n \"CIR\": \"{{PX_CIR_VALUE}}\",\r\n \"EIR\": \"{{PX_EIR_VALUE}}\",\r\n \"color-aware\": {{PX_COLOR_AWARE}},\r\n \"coupling-flag\": {{PX_COUPLING_FLAG}}\r\n }\r\n ]\r\n}", + "options": { + "raw": { + "language": "json" + } + } + }, "url": { "raw": "{{PX_PROTOCOL}}://{{PX_IUT_IP_ADDRESS}}:{{PX_IUT_IP_PORT}}/{{PX_ROOT_API}}/ietf-eth-tran-service:etht-svc/globals", "protocol": "{{PX_PROTOCOL}}", @@ -3406,51 +3702,7 @@ "pm.test(\"Verify that the response status code is 201\", function () {\r", " pm.response.to.have.status(201);\r", "});\r", - "\r", - "var responseData = '';\r", - "var topLevelPropertyName = '';\r", - "\r", - "pm.test(\"Verify that headers.Content-Type is 'application/yang-data+json'\", function () {\r", - " pm.expect(pm.response.headers.get('Content-Type')).is.equals('application/yang-data+json');\r", - " responseData = pm.response.json();\r", - " topLevelPropertyName = responseData.hasOwnProperty('modules-state') ? 'modules-state' : 'ietf-yang-library:modules-state';\r", - " console.info(topLevelPropertyName)\r", - "});\r", - "\r", - "// var moduleList = {};\r", - "\r", - "// pm.test(\"Validate the main field is 'ietf-yang-library:modules-state'\", function () {\r", - "// pm.expect(responseData).to.be.an('object');\r", - "// pm.expect(responseData).to.have.property(topLevelPropertyName);\r", - "// });\r", - "\r", - "// pm.test(\"Verify that the 'module' array is present and not empty\", function () {\r", - "// pm.expect(responseData).to.be.an('object');\r", - "// pm.expect(responseData[topLevelPropertyName][\"module\"]).to.be.an('array').with.lengthOf.at.least(1);\r", - "// // Build the module list\r", - "// responseData[topLevelPropertyName].module.forEach(function(item, index) {\r", - "// pm.expect(item).to.have.property('name');\r", - "// pm.expect(item).to.have.property('revision');\r", - "// pm.expect(item).to.have.property('namespace');\r", - "// if (moduleList.hasOwnProperty(item.name)) {\r", - "// if (moduleList[item.name].revision < item.revision) {\r", - "// moduleList[item.name] = item;\r", - "// }\r", - "// } else {\r", - "// moduleList[item.name] = item;\r", - "// }\r", - "// });\r", - "\r", - "// });\r", - "\r", - "// pm.test('Verify that the basics YANG modules are supported', function() {\r", - "// pm.expect(moduleList).to.have.property(\"ietf-restconf\");\r", - "// pm.expect(moduleList).to.have.property(\"ietf-yang-library\");\r", - "// pm.expect(moduleList).to.have.property(\"ietf-datastores\");\r", - "// pm.expect(moduleList).to.have.property(\"ietf-inet-types\");\r", - "// pm.expect(moduleList).to.have.property(\"ietf-interfaces\");\r", - "// pm.expect(moduleList).to.have.property(\"ietf-ip\");\r", - "//});" + "" ], "type": "text/javascript", "packages": {} @@ -3461,8 +3713,8 @@ "script": { "exec": [ "// Check PICS requirements\r", - "if ((pm.environment.get('PICS_IUT_PNC') != \"true\") || (pm.environment.get('PICS_RESTCONF') != \"true\") || (pm.environment.get('PICS_SEC_TLS') != \"true\") || (pm.environment.get('ABSTRACT_PT') != \"true\")) {\r", - " throw new Error('PICS_IUT_PNC and PICS_RESTCONF and PICS_SEC_TLS and ABSTRACT_PT are required.');\r", + "if ((pm.environment.get('PICS_IUT_PNC') != \"true\") || (pm.environment.get('PICS_RESTCONF') != \"true\") || (pm.environment.get('PICS_SEC_TLS') != \"true\") || (pm.environment.get('PICS_ABSTRACT_PT') != \"true\") || (pm.environment.get('PICS_BWP_SVS_IN_ONE_REQUEST') == \"true\")) {\r", + " throw new Error('PICS_IUT_PNC and PICS_RESTCONF and PICS_SEC_TLS and ABSTRACT_PT and not PICS_BWP_SVS_IN_ONE_REQUEST are required.');\r", "}\r", "" ], @@ -3519,6 +3771,15 @@ "value": "application/yang-data+json" } ], + "body": { + "mode": "raw", + "raw": "{\r\n \"ietf-eth-tran-service:etht-svc-instances\": [\r\n {\r\n \"etht-svc-name\": \"S1_local\",\r\n \"access-provider-id\": \"{{PX_ETH_PROVIDER_ID}}\",\r\n \"access-client-id\": \"{{PX_ETH_CLIENT_ID}}\",\r\n \"access-topology-id\": \"{{PX_ETH_TOPOLOGY_ID}}\",\r\n \"etht-svc-type\": \"ietf-eth-tran-types:p2p-svc\",\r\n \"admin-status\": \"ietf-te-types:tunnel-state-{{PX_LOCAL_ADMIN_STATUS_1}}\",\r\n \"etht-svc-access-ports\": [\r\n {\r\n \"access-port-id\": 1,\r\n \"access-node-id\": \"{{PX_ACCESS_NODE_ID_1}}\",\r\n \"access-ltp-id\": {{PX_LINK_AGGREG_ID_1}},\r\n \"service-classification-type\": \"ietf-eth-tran-types:vlan-classification\",\r\n \"outer-tag\": {\r\n \"tag-type\": \"ietf-eth-tran-types:classify-s-vlan\",\r\n \"vlan-value\": 201\r\n }\r\n },\r\n {\r\n \"access-port-id\": 2,\r\n \"access-node-id\": \"{{PX_ACCESS_NODE_ID_2}}\",\r\n \"access-ltp-id\": {{PX_LINK_AGGREG_ID_2}},\r\n \"service-classification-type\": \"ietf-eth-tran-types:vlan-classification\",\r\n \"outer-tag\": {\r\n \"tag-type\": \"ietf-eth-tran-types:classify-c-vlan\",\r\n \"vlan-value\": 101\r\n },\r\n \"ingress-egress-bandwidth-profile-name\": \"bw_profile_{{PX_ETH_SVC_NAME}}\"\r\n }\r\n ]\r\n },\r\n {\r\n \"etht-svc-name\": \"S2_local\",\r\n \"access-provider-id\": \"{{PX_ETH_PROVIDER_ID}}\",\r\n \"access-client-id\": \"{{PX_ETH_CLIENT_ID}}\",\r\n \"access-topology-id\": \"{{PX_ETH_TOPOLOGY_ID}}\",\r\n \"etht-svc-type\": \"ietf-eth-tran-types:p2p-svc\",\r\n \"admin-status\": \"ietf-te-types:tunnel-state-{{PX_LOCAL_ADMIN_STATUS_2}}\",\r\n \"etht-svc-access-ports\": [\r\n {\r\n \"access-port-id\": 1,\r\n \"access-node-id\": \"{{PX_ACCESS_NODE_ID_1}}\",\r\n \"access-ltp-id\": {{PX_LINK_AGGREG_ID_1}},\r\n \"service-classification-type\": \"ietf-eth-tran-types:vlan-classification\",\r\n \"outer-tag\": {\r\n \"tag-type\": \"ietf-eth-tran-types:classify-s-vlan\",\r\n \"vlan-value\": 209\r\n }\r\n },\r\n {\r\n \"access-port-id\": 2,\r\n \"access-node-id\": \"{{PX_ACCESS_NODE_ID_2}}\",\r\n \"access-ltp-id\": {{PX_LINK_AGGREG_ID_2}},\r\n \"service-classification-type\": \"ietf-eth-tran-types:vlan-classification\",\r\n \"outer-tag\": {\r\n \"tag-type\": \"ietf-eth-tran-types:classify-c-vlan\",\r\n \"vlan-value\": 103\r\n },\r\n \"ingress-egress-bandwidth-profile-name\": \"bw_profile_{{PX_ETH_SVC_NAME}}\"\r\n }\r\n ]\r\n },\r\n {\r\n \"etht-svc-name\": \"S3_local\",\r\n \"access-provider-id\": \"{{PX_ETH_PROVIDER_ID}}\",\r\n \"access-client-id\": \"{{PX_ETH_CLIENT_ID}}\",\r\n \"access-topology-id\": \"{{PX_ETH_TOPOLOGY_ID}}\",\r\n \"etht-svc-type\": \"ietf-eth-tran-types:p2p-svc\",\r\n \"admin-status\": \"ietf-te-types:tunnel-state-{{PX_LOCAL_ADMIN_STATUS_3}}\",\r\n \"etht-svc-access-ports\": [\r\n {\r\n \"access-port-id\": 1,\r\n \"access-node-id\": \"{{PX_ACCESS_NODE_ID_1}}\",\r\n \"access-ltp-id\": {{PX_LINK_AGGREG_ID_2}},\r\n \"service-classification-type\": \"ietf-eth-tran-types:vlan-classification\",\r\n \"outer-tag\": {\r\n \"tag-type\": \"ietf-eth-tran-types:classify-s-vlan\",\r\n \"vlan-value\": 210\r\n }\r\n },\r\n {\r\n \"access-port-id\": 2,\r\n \"access-node-id\": \"{{PX_ACCESS_NODE_ID_2}}\",\r\n \"access-ltp-id\": {{PX_LINK_AGGREG_ID_2}},\r\n \"service-classification-type\": \"ietf-eth-tran-types:vlan-classification\",\r\n \"outer-tag\": {\r\n \"tag-type\": \"ietf-eth-tran-types:classify-c-vlan\",\r\n \"vlan-value\": 104\r\n },\r\n \"ingress-egress-bandwidth-profile-name\": \"bw_profile_{{PX_SERVICE_NAME}}\"\r\n }\r\n ]\r\n },\r\n {\r\n \"etht-svc-name\": \"S1-inter-d\",\r\n \"access-provider-id\": \"{{PX_ETH_PROVIDER_ID}}\",\r\n \"access-client-id\": \"{{PX_ETH_CLIENT_ID}}\",\r\n \"access-topology-id\": \"{{PX_ETH_TOPOLOGY_ID}}\",\r\n \"etht-svc-type\": \"ietf-eth-tran-types:p2p-svc\",\r\n \"admin-status\": \"ietf-te-types:tunnel-state-up\",\r\n \"etht-svc-access-ports\": [\r\n {\r\n \"access-port-id\": 1,\r\n \"access-node-id\": \"{{PX_ACCESS_NODE_ID_1}}\",\r\n \"access-ltp-id\": {{PX_LINK_AGGREG_ID_1}},\r\n \"service-classification-type\": \"ietf-eth-tran-types:vlan-classification\",\r\n \"outer-tag\": {\r\n \"tag-type\": \"ietf-eth-tran-types:classify-s-vlan\",\r\n \"vlan-value\": 202\r\n }\r\n },\r\n {\r\n \"access-port-id\": 2,\r\n \"access-node-id\": \"{{PX_ACCESS_NODE_ID_2}}\",\r\n \"access-ltp-id\": {{PX_LINK_AGGREG_ID_2}},\r\n \"service-classification-type\": \"ietf-eth-tran-types:vlan-classification\",\r\n \"outer-tag\": {\r\n \"tag-type\": \"ietf-eth-tran-types:classify-s-vlan\",\r\n \"vlan-value\": 202\r\n }\r\n }\r\n ]\r\n },\r\n {\r\n \"etht-svc-name\": \"S2-inter-d\",\r\n \"access-provider-id\": \"{{PX_ETH_PROVIDER_ID}}\",\r\n \"access-client-id\": \"{{PX_ETH_CLIENT_ID}}\",\r\n \"access-topology-id\": \"{{PX_ETH_TOPOLOGY_ID}}\",\r\n \"etht-svc-type\": \"ietf-eth-tran-types:p2p-svc\",\r\n \"admin-status\": \"ietf-te-types:tunnel-state-up\",\r\n \"etht-svc-access-ports\": [\r\n {\r\n \"access-port-id\": 1,\r\n \"access-node-id\": \"{{PX_ACCESS_NODE_ID_1}}\",\r\n \"access-ltp-id\": {{PX_LINK_AGGREG_ID_1}},\r\n \"service-classification-type\": \"ietf-eth-tran-types:vlan-classification\",\r\n \"outer-tag\": {\r\n \"tag-type\": \"ietf-eth-tran-types:classify-s-vlan\",\r\n \"vlan-value\": 203\r\n }\r\n },\r\n {\r\n \"access-port-id\": 2,\r\n \"access-node-id\": \"{{PX_ACCESS_NODE_ID_2}}\",\r\n \"access-ltp-id\": {{PX_LINK_AGGREG_ID_2}},\r\n \"service-classification-type\": \"ietf-eth-tran-types:vlan-classification\",\r\n \"outer-tag\": {\r\n \"tag-type\": \"ietf-eth-tran-types:classify-s-vlan\",\r\n \"vlan-value\": 203\r\n }\r\n }\r\n ]\r\n }\r\n ]\r\n}", + "options": { + "raw": { + "language": "json" + } + } + }, "url": { "raw": "{{PX_PROTOCOL}}://{{PX_IUT_IP_ADDRESS}}:{{PX_IUT_IP_PORT}}/{{PX_ROOT_API}}/ietf-eth-tran-service:etht-svc", "protocol": "{{PX_PROTOCOL}}", @@ -3551,51 +3812,7 @@ "pm.test(\"Verify that the response status code is 201\", function () {\r", " pm.response.to.have.status(201);\r", "});\r", - "\r", - "var responseData = '';\r", - "var topLevelPropertyName = '';\r", - "\r", - "pm.test(\"Verify that headers.Content-Type is 'application/yang-data+json'\", function () {\r", - " pm.expect(pm.response.headers.get('Content-Type')).is.equals('application/yang-data+json');\r", - " responseData = pm.response.json();\r", - " topLevelPropertyName = responseData.hasOwnProperty('modules-state') ? 'modules-state' : 'ietf-yang-library:modules-state';\r", - " console.info(topLevelPropertyName)\r", - "});\r", - "\r", - "// var moduleList = {};\r", - "\r", - "// pm.test(\"Validate the main field is 'ietf-yang-library:modules-state'\", function () {\r", - "// pm.expect(responseData).to.be.an('object');\r", - "// pm.expect(responseData).to.have.property(topLevelPropertyName);\r", - "// });\r", - "\r", - "// pm.test(\"Verify that the 'module' array is present and not empty\", function () {\r", - "// pm.expect(responseData).to.be.an('object');\r", - "// pm.expect(responseData[topLevelPropertyName][\"module\"]).to.be.an('array').with.lengthOf.at.least(1);\r", - "// // Build the module list\r", - "// responseData[topLevelPropertyName].module.forEach(function(item, index) {\r", - "// pm.expect(item).to.have.property('name');\r", - "// pm.expect(item).to.have.property('revision');\r", - "// pm.expect(item).to.have.property('namespace');\r", - "// if (moduleList.hasOwnProperty(item.name)) {\r", - "// if (moduleList[item.name].revision < item.revision) {\r", - "// moduleList[item.name] = item;\r", - "// }\r", - "// } else {\r", - "// moduleList[item.name] = item;\r", - "// }\r", - "// });\r", - "\r", - "// });\r", - "\r", - "// pm.test('Verify that the basics YANG modules are supported', function() {\r", - "// pm.expect(moduleList).to.have.property(\"ietf-restconf\");\r", - "// pm.expect(moduleList).to.have.property(\"ietf-yang-library\");\r", - "// pm.expect(moduleList).to.have.property(\"ietf-datastores\");\r", - "// pm.expect(moduleList).to.have.property(\"ietf-inet-types\");\r", - "// pm.expect(moduleList).to.have.property(\"ietf-interfaces\");\r", - "// pm.expect(moduleList).to.have.property(\"ietf-ip\");\r", - "//});" + "" ], "type": "text/javascript", "packages": {} @@ -3606,8 +3823,8 @@ "script": { "exec": [ "// Check PICS requirements\r", - "if ((pm.environment.get('PICS_IUT_PNC') != \"true\") || (pm.environment.get('PICS_RESTCONF') != \"true\") || (pm.environment.get('PICS_SEC_TLS') != \"true\") || (pm.environment.get('ABSTRACT_PT') != \"true\")) {\r", - " throw new Error('PICS_IUT_PNC and PICS_RESTCONF and PICS_SEC_TLS and ABSTRACT_PT are required.');\r", + "if ((pm.environment.get('PICS_IUT_PNC') != \"true\") || (pm.environment.get('PICS_RESTCONF') != \"true\") || (pm.environment.get('PICS_SEC_TLS') != \"true\") || (pm.environment.get('PICS_ABSTRACT_PT') != \"true\") || (pm.environment.get('PICS_BWP_SVS_IN_ONE_REQUEST') == \"true\")) {\r", + " throw new Error('PICS_IUT_PNC and PICS_RESTCONF and PICS_SEC_TLS and PICS_ABSTRACT_PT and not PICS_BWP_SVS_IN_ONE_REQUEST are required.');\r", "}\r", "" ], @@ -3634,6 +3851,15 @@ "value": "application/yang-data+json" } ], + "body": { + "mode": "raw", + "raw": "{\r\n \"ietf-eth-tran-service:etht-svc-instances\": [\r\n {\r\n \"etht-svc-name\": \"S1_local\",\r\n \"access-provider-id\": \"{{PX_ETH_PROVIDER_ID}}\",\r\n \"access-client-id\": \"{{PX_ETH_CLIENT_ID}}\",\r\n \"access-topology-id\": \"{{PX_ETH_TOPOLOGY_ID}}\",\r\n \"etht-svc-type\": \"ietf-eth-tran-types:p2p-svc\",\r\n \"admin-status\": \"ietf-te-types:tunnel-state-{{PX_LOCAL_ADMIN_STATUS_1}}\",\r\n \"etht-svc-access-ports\": [\r\n {\r\n \"access-port-id\": 1,\r\n \"access-node-id\": \"{{PX_ACCESS_NODE_ID_1}}\",\r\n \"access-ltp-id\": {{PX_LINK_AGGREG_ID_1}},\r\n \"service-classification-type\": \"ietf-eth-tran-types:vlan-classification\",\r\n \"outer-tag\": {\r\n \"tag-type\": \"ietf-eth-tran-types:classify-s-vlan\",\r\n \"vlan-value\": 201\r\n }\r\n },\r\n {\r\n \"access-port-id\": 2,\r\n \"access-node-id\": \"{{PX_ACCESS_NODE_ID_2}}\",\r\n \"access-ltp-id\": {{PX_LINK_AGGREG_ID_2}},\r\n \"service-classification-type\": \"ietf-eth-tran-types:vlan-classification\",\r\n \"outer-tag\": {\r\n \"tag-type\": \"ietf-eth-tran-types:classify-c-vlan\",\r\n \"vlan-value\": 101\r\n },\r\n \"ingress-egress-bandwidth-profile-name\": \"bw_profile_{{PX_ETH_SVC_NAME}}\"\r\n }\r\n ]\r\n },\r\n {\r\n \"etht-svc-name\": \"S2_local\",\r\n \"access-provider-id\": \"{{PX_ETH_PROVIDER_ID}}\",\r\n \"access-client-id\": \"{{PX_ETH_CLIENT_ID}}\",\r\n \"access-topology-id\": \"{{PX_ETH_TOPOLOGY_ID}}\",\r\n \"etht-svc-type\": \"ietf-eth-tran-types:p2p-svc\",\r\n \"admin-status\": \"ietf-te-types:tunnel-state-{{PX_LOCAL_ADMIN_STATUS_2}}\",\r\n \"etht-svc-access-ports\": [\r\n {\r\n \"access-port-id\": 1,\r\n \"access-node-id\": \"{{PX_ACCESS_NODE_ID_1}}\",\r\n \"access-ltp-id\": {{PX_LINK_AGGREG_ID_1}},\r\n \"service-classification-type\": \"ietf-eth-tran-types:vlan-classification\",\r\n \"outer-tag\": {\r\n \"tag-type\": \"ietf-eth-tran-types:classify-s-vlan\",\r\n \"vlan-value\": 209\r\n }\r\n },\r\n {\r\n \"access-port-id\": 2,\r\n \"access-node-id\": \"{{PX_ACCESS_NODE_ID_2}}\",\r\n \"access-ltp-id\": {{PX_LINK_AGGREG_ID_2}},\r\n \"service-classification-type\": \"ietf-eth-tran-types:vlan-classification\",\r\n \"outer-tag\": {\r\n \"tag-type\": \"ietf-eth-tran-types:classify-c-vlan\",\r\n \"vlan-value\": 103\r\n },\r\n \"ingress-egress-bandwidth-profile-name\": \"bw_profile_{{PX_ETH_SVC_NAME}}\"\r\n }\r\n ]\r\n },\r\n {\r\n \"etht-svc-name\": \"S3_local\",\r\n \"access-provider-id\": \"{{PX_ETH_PROVIDER_ID}}\",\r\n \"access-client-id\": \"{{PX_ETH_CLIENT_ID}}\",\r\n \"access-topology-id\": \"{{PX_ETH_TOPOLOGY_ID}}\",\r\n \"etht-svc-type\": \"ietf-eth-tran-types:p2p-svc\",\r\n \"admin-status\": \"ietf-te-types:tunnel-state-{{PX_LOCAL_ADMIN_STATUS_3}}\",\r\n \"etht-svc-access-ports\": [\r\n {\r\n \"access-port-id\": 1,\r\n \"access-node-id\": \"{{PX_ACCESS_NODE_ID_1}}\",\r\n \"access-ltp-id\": {{PX_LINK_AGGREG_ID_2}},\r\n \"service-classification-type\": \"ietf-eth-tran-types:vlan-classification\",\r\n \"outer-tag\": {\r\n \"tag-type\": \"ietf-eth-tran-types:classify-s-vlan\",\r\n \"vlan-value\": 210\r\n }\r\n },\r\n {\r\n \"access-port-id\": 2,\r\n \"access-node-id\": \"{{PX_ACCESS_NODE_ID_2}}\",\r\n \"access-ltp-id\": {{PX_LINK_AGGREG_ID_2}},\r\n \"service-classification-type\": \"ietf-eth-tran-types:vlan-classification\",\r\n \"outer-tag\": {\r\n \"tag-type\": \"ietf-eth-tran-types:classify-c-vlan\",\r\n \"vlan-value\": 104\r\n },\r\n \"ingress-egress-bandwidth-profile-name\": \"bw_profile_{{PX_SERVICE_NAME}}\"\r\n }\r\n ]\r\n },\r\n {\r\n \"etht-svc-name\": \"S1-inter-d\",\r\n \"access-provider-id\": \"{{PX_ETH_PROVIDER_ID}}\",\r\n \"access-client-id\": \"{{PX_ETH_CLIENT_ID}}\",\r\n \"access-topology-id\": \"{{PX_ETH_TOPOLOGY_ID}}\",\r\n \"etht-svc-type\": \"ietf-eth-tran-types:p2p-svc\",\r\n \"admin-status\": \"ietf-te-types:tunnel-state-up\",\r\n \"etht-svc-access-ports\": [\r\n {\r\n \"access-port-id\": 1,\r\n \"access-node-id\": \"{{PX_ACCESS_NODE_ID_1}}\",\r\n \"access-ltp-id\": {{PX_LINK_AGGREG_ID_1}},\r\n \"service-classification-type\": \"ietf-eth-tran-types:vlan-classification\",\r\n \"outer-tag\": {\r\n \"tag-type\": \"ietf-eth-tran-types:classify-s-vlan\",\r\n \"vlan-value\": 202\r\n }\r\n },\r\n {\r\n \"access-port-id\": 2,\r\n \"access-node-id\": \"{{PX_ACCESS_NODE_ID_2}}\",\r\n \"access-ltp-id\": {{PX_LINK_AGGREG_ID_2}},\r\n \"service-classification-type\": \"ietf-eth-tran-types:vlan-classification\",\r\n \"outer-tag\": {\r\n \"tag-type\": \"ietf-eth-tran-types:classify-s-vlan\",\r\n \"vlan-value\": 202\r\n }\r\n }\r\n ]\r\n },\r\n {\r\n \"etht-svc-name\": \"S2-inter-d\",\r\n \"access-provider-id\": \"{{PX_ETH_PROVIDER_ID}}\",\r\n \"access-client-id\": \"{{PX_ETH_CLIENT_ID}}\",\r\n \"access-topology-id\": \"{{PX_ETH_TOPOLOGY_ID}}\",\r\n \"etht-svc-type\": \"ietf-eth-tran-types:p2p-svc\",\r\n \"admin-status\": \"ietf-te-types:tunnel-state-up\",\r\n \"etht-svc-access-ports\": [\r\n {\r\n \"access-port-id\": 1,\r\n \"access-node-id\": \"{{PX_ACCESS_NODE_ID_1}}\",\r\n \"access-ltp-id\": {{PX_LINK_AGGREG_ID_1}},\r\n \"service-classification-type\": \"ietf-eth-tran-types:vlan-classification\",\r\n \"outer-tag\": {\r\n \"tag-type\": \"ietf-eth-tran-types:classify-s-vlan\",\r\n \"vlan-value\": 203\r\n }\r\n },\r\n {\r\n \"access-port-id\": 2,\r\n \"access-node-id\": \"{{PX_ACCESS_NODE_ID_2}}\",\r\n \"access-ltp-id\": {{PX_LINK_AGGREG_ID_2}},\r\n \"service-classification-type\": \"ietf-eth-tran-types:vlan-classification\",\r\n \"outer-tag\": {\r\n \"tag-type\": \"ietf-eth-tran-types:classify-s-vlan\",\r\n \"vlan-value\": 203\r\n }\r\n }\r\n ]\r\n }\r\n ]\r\n}", + "options": { + "raw": { + "language": "json" + } + } + }, "url": { "raw": "{{PX_PROTOCOL}}://{{PX_IUT_IP_ADDRESS}}:{{PX_IUT_IP_PORT}}/{{PX_ROOT_API}}/ietf-eth-tran-service:etht-svc/globals", "protocol": "{{PX_PROTOCOL}}", @@ -3667,51 +3893,7 @@ "pm.test(\"Verify that the response status code is 201\", function () {\r", " pm.response.to.have.status(201);\r", "});\r", - "\r", - "var responseData = '';\r", - "var topLevelPropertyName = '';\r", - "\r", - "pm.test(\"Verify that headers.Content-Type is 'application/yang-data+json'\", function () {\r", - " pm.expect(pm.response.headers.get('Content-Type')).is.equals('application/yang-data+json');\r", - " responseData = pm.response.json();\r", - " topLevelPropertyName = responseData.hasOwnProperty('modules-state') ? 'modules-state' : 'ietf-yang-library:modules-state';\r", - " console.info(topLevelPropertyName)\r", - "});\r", - "\r", - "// var moduleList = {};\r", - "\r", - "// pm.test(\"Validate the main field is 'ietf-yang-library:modules-state'\", function () {\r", - "// pm.expect(responseData).to.be.an('object');\r", - "// pm.expect(responseData).to.have.property(topLevelPropertyName);\r", - "// });\r", - "\r", - "// pm.test(\"Verify that the 'module' array is present and not empty\", function () {\r", - "// pm.expect(responseData).to.be.an('object');\r", - "// pm.expect(responseData[topLevelPropertyName][\"module\"]).to.be.an('array').with.lengthOf.at.least(1);\r", - "// // Build the module list\r", - "// responseData[topLevelPropertyName].module.forEach(function(item, index) {\r", - "// pm.expect(item).to.have.property('name');\r", - "// pm.expect(item).to.have.property('revision');\r", - "// pm.expect(item).to.have.property('namespace');\r", - "// if (moduleList.hasOwnProperty(item.name)) {\r", - "// if (moduleList[item.name].revision < item.revision) {\r", - "// moduleList[item.name] = item;\r", - "// }\r", - "// } else {\r", - "// moduleList[item.name] = item;\r", - "// }\r", - "// });\r", - "\r", - "// });\r", - "\r", - "// pm.test('Verify that the basics YANG modules are supported', function() {\r", - "// pm.expect(moduleList).to.have.property(\"ietf-restconf\");\r", - "// pm.expect(moduleList).to.have.property(\"ietf-yang-library\");\r", - "// pm.expect(moduleList).to.have.property(\"ietf-datastores\");\r", - "// pm.expect(moduleList).to.have.property(\"ietf-inet-types\");\r", - "// pm.expect(moduleList).to.have.property(\"ietf-interfaces\");\r", - "// pm.expect(moduleList).to.have.property(\"ietf-ip\");\r", - "//});" + "" ], "type": "text/javascript", "packages": {} @@ -3722,8 +3904,8 @@ "script": { "exec": [ "// Check PICS requirements\r", - "if ((pm.environment.get('PICS_IUT_PNC') != \"true\") || (pm.environment.get('PICS_RESTCONF') != \"true\") || (pm.environment.get('PICS_SEC_TLS') != \"true\") || (pm.environment.get('ABSTRACT_PT') != \"true\")) {\r", - " throw new Error('PICS_IUT_PNC and PICS_RESTCONF and PICS_SEC_TLS and ABSTRACT_PT are required.');\r", + "if ((pm.environment.get('PICS_IUT_PNC') != \"true\") || (pm.environment.get('PICS_RESTCONF') != \"true\") || (pm.environment.get('PICS_SEC_TLS') != \"true\") || (pm.environment.get('PICS_ABSTRACT_PT') != \"true\") || (pm.environment.get('PICS_BWP_SVS_IN_ONE_REQUEST') != \"true\")) {\r", + " throw new Error('PICS_IUT_PNC and PICS_RESTCONF and PICS_SEC_TLS and PICS_ABSTRACT_PT and PICS_BWP_SVS_IN_ONE_REQUEST are required.');\r", "}\r", "" ], @@ -3750,6 +3932,15 @@ "value": "application/yang-data+json" } ], + "body": { + "mode": "raw", + "raw": "{\r\n \"ietf-eth-tran-service:etht-svc-instances\": [\r\n {\r\n \"etht-svc-name\": \"S1_local\",\r\n \"te-topology-identifier\": {\r\n \"provider-id\": {{PX_ETH_PROVIDER_ID}},\r\n \"client-id\": {{PX_ETH_CLIENT_ID}},\r\n \"topology-id\": \"{{PX_ETH_TOPOLOGY_ID}}\"\r\n },\r\n \"etht-svc-type\": \"ietf-eth-tran-types:p2p-svc\",\r\n \"etht-svc-end-points\": [\r\n {\r\n \"etht-svc-access-points\": [\r\n {\r\n \"access-point-id\": \"1\",\r\n \"access-node-id\": \"{{PX_ACCESS_NODE_ID_1}}\",\r\n \"access-ltp-id\": {{PX_LINK_AGGREG_ID_1}}\r\n }\r\n ],\r\n \"service-classification-type\": \"ietf-eth-tran-types:vlan-classification\",\r\n \"outer-tag\": {\r\n \"tag-type\": \"ietf-eth-tran-types:classify-s-vlan\",\r\n \"vlan-value\": 201\r\n }\r\n },\r\n {\r\n \"etht-svc-access-points\": [\r\n {\r\n \"access-point-id\": \"2\",\r\n \"access-node-id\": \"{{PX_ACCESS_NODE_ID_2}}\",\r\n \"access-ltp-id\": {{PX_LINK_AGGREG_ID_2}}\r\n }\r\n ],\r\n \"service-classification-type\": \"ietf-eth-tran-types:vlan-classification\",\r\n \"outer-tag\": {\r\n \"tag-type\": \"ietf-eth-tran-types:classify-c-vlan\",\r\n \"vlan-value\": 101\r\n },\r\n \"ingress-egress-bandwidth-profile\": {\r\n \"bandwidth-profile-type\": \"ietf-eth-tran-types:mef-10-bwp\",\r\n \"CIR\": \"{{PX_CIR_VALUE}}\",\r\n \"EIR\": \"{{PX_EIR_VALUE}}\"\r\n }\r\n }\r\n ]\r\n },\r\n\t\t{\r\n \"etht-svc-name\": \"S2_local\",\r\n \"te-topology-identifier\": {\r\n \"provider-id\": {{PX_ETH_PROVIDER_ID}},\r\n \"client-id\": {{PX_ETH_CLIENT_ID}},\r\n \"topology-id\": \"{{PX_ETH_TOPOLOGY_ID}}\"\r\n },\r\n \"etht-svc-type\": \"ietf-eth-tran-types:p2p-svc\",\r\n \"etht-svc-end-points\": [\r\n {\r\n \"etht-svc-access-points\": [\r\n {\r\n \"access-point-id\": \"1\",\r\n \"access-node-id\": \"{{PX_ACCESS_NODE_ID_1}}\",\r\n \"access-ltp-id\": {{PX_LINK_AGGREG_ID_1}}\r\n }\r\n ],\r\n \"service-classification-type\": \"ietf-eth-tran-types:vlan-classification\",\r\n \"outer-tag\": {\r\n \"tag-type\": \"ietf-eth-tran-types:classify-s-vlan\",\r\n \"vlan-value\": 209\r\n }\r\n },\r\n {\r\n \"etht-svc-access-points\": [\r\n {\r\n \"access-point-id\": \"2\",\r\n \"access-node-id\": \"{{PX_ACCESS_NODE_ID_2}}\",\r\n \"access-ltp-id\": {{PX_LINK_AGGREG_ID_2}}\r\n }\r\n ],\r\n \"service-classification-type\": \"ietf-eth-tran-types:vlan-classification\",\r\n \"outer-tag\": {\r\n \"tag-type\": \"ietf-eth-tran-types:classify-c-vlan\",\r\n \"vlan-value\": 103\r\n },\r\n \"ingress-egress-bandwidth-profile\": {\r\n \"bandwidth-profile-type\": \"ietf-eth-tran-types:mef-10-bwp\",\r\n \"CIR\": \"{{PX_CIR_VALUE}}\",\r\n \"EIR\": \"{{PX_EIR_VALUE}}\"\r\n }\r\n }\r\n ]\r\n },\r\n\t\t{\r\n \"etht-svc-name\": \"S3_local\",\r\n \"te-topology-identifier\": {\r\n \"provider-id\": {{PX_ETH_PROVIDER_ID}},\r\n \"client-id\": {{PX_ETH_CLIENT_ID}},\r\n \"topology-id\": \"{{PX_ETH_TOPOLOGY_ID}}\"\r\n },\r\n \"etht-svc-type\": \"ietf-eth-tran-types:p2p-svc\",\r\n \"etht-svc-end-points\": [\r\n {\r\n \"etht-svc-access-points\": [\r\n {\r\n \"access-point-id\": \"1\",\r\n \"access-node-id\": \"{{PX_ACCESS_NODE_ID_1}}\",\r\n \"access-ltp-id\": {{PX_LINK_AGGREG_ID_1}}\r\n }\r\n ],\r\n \"service-classification-type\": \"ietf-eth-tran-types:vlan-classification\",\r\n \"outer-tag\": {\r\n \"tag-type\": \"ietf-eth-tran-types:classify-s-vlan\",\r\n \"vlan-value\": 210\r\n }\r\n },\r\n {\r\n \"etht-svc-access-points\": [\r\n {\r\n \"access-point-id\": \"2\",\r\n \"access-node-id\": \"{{PX_ACCESS_NODE_ID_2}}\",\r\n \"access-ltp-id\": {{PX_LINK_AGGREG_ID_2}}\r\n }\r\n ],\r\n \"service-classification-type\": \"ietf-eth-tran-types:vlan-classification\",\r\n \"outer-tag\": {\r\n \"tag-type\": \"ietf-eth-tran-types:classify-c-vlan\",\r\n \"vlan-value\": 104\r\n },\r\n \"ingress-egress-bandwidth-profile\": {\r\n \"bandwidth-profile-type\": \"ietf-eth-tran-types:mef-10-bwp\",\r\n \"CIR\": \"{{PX_CIR_VALUE}}\",\r\n \"EIR\": \"{{PX_EIR_VALUE}}\"\r\n }\r\n }\r\n ]\r\n },\r\n\t\t{\r\n \"etht-svc-name\": \"S1-inter-d\",\r\n \"te-topology-identifier\": {\r\n \"provider-id\": {{PX_ETH_PROVIDER_ID}},\r\n \"client-id\": {{PX_ETH_CLIENT_ID}},\r\n \"topology-id\": \"{{PX_ETH_TOPOLOGY_ID}}\"\r\n },\r\n \"etht-svc-type\": \"ietf-eth-tran-types:p2p-svc\",\r\n \"etht-svc-end-points\": [\r\n {\r\n \"etht-svc-access-points\": [\r\n {\r\n \"access-point-id\": \"1\",\r\n \"access-node-id\": \"{{PX_ACCESS_NODE_ID_1}}\",\r\n \"access-ltp-id\": {{PX_LINK_AGGREG_ID_1}}\r\n }\r\n ],\r\n \"service-classification-type\": \"ietf-eth-tran-types:vlan-classification\",\r\n \"outer-tag\": {\r\n \"tag-type\": \"ietf-eth-tran-types:classify-s-vlan\",\r\n \"vlan-value\": 202\r\n }\r\n },\r\n {\r\n \"etht-svc-access-points\": [\r\n {\r\n \"access-point-id\": \"2\",\r\n \"access-node-id\": \"{{PX_ACCESS_NODE_ID_2}}\",\r\n \"access-ltp-id\": {{PX_I_D_LINK_W_ID}}\r\n }\r\n ],\r\n \"service-classification-type\": \"ietf-eth-tran-types:vlan-classification\",\r\n \"outer-tag\": {\r\n \"tag-type\": \"ietf-eth-tran-types:classify-s-vlan\",\r\n \"vlan-value\": 202\r\n }\r\n }\r\n ]\r\n },\r\n\t\t{\r\n \"etht-svc-name\": \"S2-inter-d\",\r\n \"te-topology-identifier\": {\r\n \"provider-id\": {{PX_ETH_PROVIDER_ID}},\r\n \"client-id\": {{PX_ETH_CLIENT_ID}},\r\n \"topology-id\": \"{{PX_ETH_TOPOLOGY_ID}}\"\r\n },\r\n \"etht-svc-type\": \"ietf-eth-tran-types:p2p-svc\",\r\n \"etht-svc-end-points\": [\r\n {\r\n \"etht-svc-access-points\": [\r\n {\r\n \"access-point-id\": \"1\",\r\n \"access-node-id\": \"{{PX_ACCESS_NODE_ID_1}}\",\r\n \"access-ltp-id\": {{PX_LINK_AGGREG_ID_1}}\r\n }\r\n ],\r\n \"service-classification-type\": \"ietf-eth-tran-types:vlan-classification\",\r\n \"outer-tag\": {\r\n \"tag-type\": \"ietf-eth-tran-types:classify-s-vlan\",\r\n \"vlan-value\": 203\r\n }\r\n },\r\n {\r\n \"etht-svc-access-points\": [\r\n {\r\n \"access-point-id\": \"2\",\r\n \"access-node-id\": \"{{PX_ACCESS_NODE_ID_2}}\",\r\n \"access-ltp-id\": {{PX_I_D_LINK_E_ID}}\r\n }\r\n ],\r\n \"service-classification-type\": \"ietf-eth-tran-types:vlan-classification\",\r\n \"outer-tag\": {\r\n \"tag-type\": \"ietf-eth-tran-types:classify-s-vlan\",\r\n \"vlan-value\": 203\r\n }\r\n }\r\n ]\r\n },\r\n {\r\n \"etht-svc-name\": \"S1-leaf2\",\r\n \"te-topology-identifier\": {\r\n \"provider-id\": {{PX_ETH_PROVIDER_ID}},\r\n \"client-id\": {{PX_ETH_CLIENT_ID}},\r\n \"topology-id\": \"{{PX_ETH_TOPOLOGY_ID}}\"\r\n },\r\n \"etht-svc-type\": \"ietf-eth-tran-types:p2p-svc\",\r\n \"etht-svc-end-points\": [\r\n {\r\n \"etht-svc-access-points\": [\r\n {\r\n \"access-point-id\": \"1\",\r\n \"access-node-id\": \"{{PX_ACCESS_NODE_ID_2}}\",\r\n \"access-ltp-id\": {{PX_I_D_LINK_W_ID}}\r\n }\r\n ],\r\n \"service-classification-type\": \"ietf-eth-tran-types:vlan-classification\",\r\n \"outer-tag\": {\r\n \"tag-type\": \"ietf-eth-tran-types:classify-s-vlan\",\r\n \"vlan-value\": 208\r\n }\r\n },\r\n {\r\n \"etht-svc-access-points\": [\r\n {\r\n \"access-point-id\": \"2\",\r\n \"access-node-id\": \"{{PX_ACCESS_NODE_ID_2}}\",\r\n \"access-ltp-id\": {{PX_I_D_LINK_E_ID}}\r\n }\r\n ],\r\n \"service-classification-type\": \"ietf-eth-tran-types:vlan-classification\",\r\n \"outer-tag\": {\r\n \"tag-type\": \"ietf-eth-tran-types:classify-s-vlan\",\r\n \"vlan-value\": 208\r\n }\r\n }\r\n ]\r\n },\r\n {\r\n \"etht-svc-name\": \"S2-leaf2\",\r\n \"te-topology-identifier\": {\r\n \"provider-id\": {{PX_ETH_PROVIDER_ID}},\r\n \"client-id\": {{PX_ETH_CLIENT_ID}},\r\n \"topology-id\": \"{{PX_ETH_TOPOLOGY_ID}}\"\r\n },\r\n \"etht-svc-type\": \"ietf-eth-tran-types:p2p-svc\",\r\n \"etht-svc-end-points\": [\r\n {\r\n \"etht-svc-access-points\": [\r\n {\r\n \"access-point-id\": \"1\",\r\n \"access-node-id\": \"{{PX_ACCESS_NODE_ID_2}}\",\r\n \"access-ltp-id\": {{PX_I_D_LINK_W_ID}}\r\n }\r\n ],\r\n \"service-classification-type\": \"ietf-eth-tran-types:vlan-classification\",\r\n \"outer-tag\": {\r\n \"tag-type\": \"ietf-eth-tran-types:classify-s-vlan\",\r\n \"vlan-value\": 2009\r\n }\r\n },\r\n {\r\n \"etht-svc-access-points\": [\r\n {\r\n \"access-point-id\": \"2\",\r\n \"access-node-id\": \"{{PX_ACCESS_NODE_ID_2}}\",\r\n \"access-ltp-id\": {{PX_LINK_AGGREG_ID_2}}\r\n }\r\n ],\r\n \"service-classification-type\": \"ietf-eth-tran-types:vlan-classification\",\r\n \"outer-tag\": {\r\n \"tag-type\": \"ietf-eth-tran-types:classify-c-vlan\",\r\n \"vlan-value\": 1003\r\n }\r\n }\r\n ]\r\n }\r\n ]\r\n}", + "options": { + "raw": { + "language": "json" + } + } + }, "url": { "raw": "{{PX_PROTOCOL}}://{{PX_IUT_IP_ADDRESS}}:{{PX_IUT_IP_PORT}}/{{PX_ROOT_API}}/ietf-eth-tran-service:etht-svc/globals", "protocol": "{{PX_PROTOCOL}}", diff --git a/postman/TTF_T029.postman_environment.json b/postman/TTF_T029.postman_environment.json index ea66c2f..8757c44 100644 --- a/postman/TTF_T029.postman_environment.json +++ b/postman/TTF_T029.postman_environment.json @@ -225,7 +225,7 @@ "enabled": true }, { - "key": "PX_ETHT_SVC_NAME", + "key": "PX_ETH_SVC_NAME", "value": "svc_name", "type": "default", "enabled": true @@ -247,9 +247,129 @@ "value": "johndoe", "type": "default", "enabled": true + }, + { + "key": "PX_CIR_VALUE", + "value": "1", + "type": "default", + "enabled": true + }, + { + "key": "PX_CBS_VALUE", + "value": "1", + "type": "default", + "enabled": true + }, + { + "key": "PX_EIR_VALUE", + "value": "1", + "type": "default", + "enabled": true + }, + { + "key": "PX_EBS_VALUE", + "value": "1", + "type": "default", + "enabled": true + }, + { + "key": "PX_COLOR_AWARE", + "value": "true", + "type": "default", + "enabled": true + }, + { + "key": "PX_COUPLING_FLAG", + "value": "false", + "type": "default", + "enabled": true + }, + { + "key": "PX_ETH_SVC_TITLE", + "value": "", + "type": "default", + "enabled": true + }, + { + "key": "PX_ETH_SVC_DESC", + "value": "", + "type": "default", + "enabled": true + }, + { + "key": "PX_ETH_SVC_CUSTOMER", + "value": "", + "type": "default", + "enabled": true + }, + { + "key": "PX_ACCESS_NODE_ID_1", + "value": "", + "type": "default", + "enabled": true + }, + { + "key": "PX_ACCESS_NODE_ID_2", + "value": "", + "type": "default", + "enabled": true + }, + { + "key": "PX_LINK_AGGREG_ID_1", + "value": "", + "type": "default", + "enabled": true + }, + { + "key": "PX_LINK_AGGREG_ID_2", + "value": "", + "type": "default", + "enabled": true + }, + { + "key": "PX_I_D_LINK_W_ID", + "value": "", + "type": "default", + "enabled": true + }, + { + "key": "PX_I_D_LINK_E_ID", + "value": "", + "type": "default", + "enabled": true + }, + { + "key": "PX_LOCAL_ADMIN_STATUS_1", + "value": "", + "type": "default", + "enabled": true + }, + { + "key": "PX_ETH_CLIENT_ID", + "value": "", + "type": "default", + "enabled": true + }, + { + "key": "PX_ETH_TOPOLOGY_ID", + "value": "", + "type": "default", + "enabled": true + }, + { + "key": "PX_LOCAL_ADMIN_STATUS_1", + "value": "", + "type": "default", + "enabled": true + }, + { + "key": "PX_LOCAL_ADMIN_STATUS_2", + "value": "", + "type": "default", + "enabled": true } ], "_postman_variable_scope": "environment", - "_postman_exported_at": "2024-07-04T13:52:27.737Z", - "_postman_exported_using": "Postman/11.2.27" + "_postman_exported_at": "2024-07-24T08:01:54.815Z", + "_postman_exported_using": "Postman/11.3.2" } \ No newline at end of file -- GitLab From 3ff6ab77de9b6a6ceb9bbc21554c6dc5421783b5 Mon Sep 17 00:00:00 2001 From: garciay Date: Wed, 14 Aug 2024 08:04:44 +0200 Subject: [PATCH 13/15] Implementing DELETE ATS in Postman --- postman/TTF_T029.postman_collection.json | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-) diff --git a/postman/TTF_T029.postman_collection.json b/postman/TTF_T029.postman_collection.json index 7baf9c2..72e98dc 100644 --- a/postman/TTF_T029.postman_collection.json +++ b/postman/TTF_T029.postman_collection.json @@ -1,15 +1,15 @@ { "info": { - "_postman_id": "1f2d95ce-fcc4-4fae-8f20-9e17093456e0", + "_postman_id": "52110c8a-6639-4da2-9fcb-553004c29de9", "name": "TTF_T029", "description": "This is is the Enmvironment used by the ETSI TTF T029 millimetre Wave Transmission (mWT); \nDefinition of a Wireless Transport Profile for Standard SDN Northbound Interfaces Conformance test suite", "schema": "https://schema.getpostman.com/json/collection/v2.1.0/collection.json", "_exporter_id": "152820", - "_collection_link": "https://red-trinity-563699.postman.co/workspace/New-Team-Workspace~d54f0e73-b65d-41a2-8e4e-35b7b23cdd96/collection/152820-1f2d95ce-fcc4-4fae-8f20-9e17093456e0?action=share&source=collection_link&creator=152820" + "_collection_link": "https://red-trinity-563699.postman.co/workspace/New-Team-Workspace~d54f0e73-b65d-41a2-8e4e-35b7b23cdd96/collection/152820-52110c8a-6639-4da2-9fcb-553004c29de9?action=share&source=collection_link&creator=152820" }, "item": [ { - "name": "Nokia Lab Testion", + "name": "Nokia Lab Testing", "item": [ { "name": "Initial Authentication - Get Token", @@ -3904,7 +3904,7 @@ "script": { "exec": [ "// Check PICS requirements\r", - "if ((pm.environment.get('PICS_IUT_PNC') != \"true\") || (pm.environment.get('PICS_RESTCONF') != \"true\") || (pm.environment.get('PICS_SEC_TLS') != \"true\") || (pm.environment.get('PICS_ABSTRACT_PT') != \"true\") || (pm.environment.get('PICS_BWP_SVS_IN_ONE_REQUEST') != \"true\")) {\r", + "if ((pm.environment.get('PICS_IUT_PNC') != \"true\") || (pm.environment.get('PICS_RESTCONF') != \"true\") || (pm.environment.get('PICS_SEC_TLS') != \"true\") || (pm.environment.get('PICS_ABSTRACT_PT') != \"true\") || (pm.environment.get('PICS_BWP_SVS_IN_ONE_REQUEST') != \"true\")) {\r", " throw new Error('PICS_IUT_PNC and PICS_RESTCONF and PICS_SEC_TLS and PICS_ABSTRACT_PT and PICS_BWP_SVS_IN_ONE_REQUEST are required.');\r", "}\r", "" @@ -4042,6 +4042,9 @@ "listen": "test", "script": { "exec": [ + "//postman.setNextRequest('TD_MSP_03-Step-1');\r", + "\r", + "\r", "pm.test(\"Verify that the response status code is 200\", function () {\r", " pm.response.to.have.status(200);\r", "});\r", @@ -4581,7 +4584,7 @@ } ], "url": { - "raw": "{{PX_PROTOCOL}}://{{PX_IUT_IP_ADDRESS}}:{{PX_IUT_IP_PORT}}/{{PX_ROOT_API}}/ietf-eth-tran-service:etht-svc/nstances={{PX_ETHT_SVC_NAME}}", + "raw": "{{PX_PROTOCOL}}://{{PX_IUT_IP_ADDRESS}}:{{PX_IUT_IP_PORT}}/{{PX_ROOT_API}}/ietf-eth-tran-service:etht-svc/instances={{PX_ETHT_SVC_NAME}}", "protocol": "{{PX_PROTOCOL}}", "host": [ "{{PX_IUT_IP_ADDRESS}}" @@ -4590,7 +4593,7 @@ "path": [ "{{PX_ROOT_API}}", "ietf-eth-tran-service:etht-svc", - "nstances={{PX_ETHT_SVC_NAME}}" + "instances={{PX_ETHT_SVC_NAME}}" ] }, "description": "/restconf/data/ietf-yang-library:modules-state" -- GitLab From 5fea55ec80bd3682c10ae6374cfb2d30c9d9e60a Mon Sep 17 00:00:00 2001 From: garciay Date: Wed, 14 Aug 2024 08:17:55 +0200 Subject: [PATCH 14/15] Editorial changes in TPs --- postman/TTF_T029.postman_collection.json | 93 +- test-purposes/AtsMDSC.tplan2 | 3306 +++++++++++----------- 2 files changed, 1675 insertions(+), 1724 deletions(-) diff --git a/postman/TTF_T029.postman_collection.json b/postman/TTF_T029.postman_collection.json index 72e98dc..fd96ad9 100644 --- a/postman/TTF_T029.postman_collection.json +++ b/postman/TTF_T029.postman_collection.json @@ -3812,6 +3812,14 @@ "pm.test(\"Verify that the response status code is 201\", function () {\r", " pm.response.to.have.status(201);\r", "});\r", + "\r", + "var responseJson = pm.response.json();\r", + "\r", + "pm.test(\"Verify that headers.Content-Type is 'application/yang-data+json; charset=utf-8'\", function () {\r", + " pm.expect(pm.response.headers.get('Content-Type')).is.equals('application/yang-data+json; charset=utf-8');\r", + " responseJson = pm.response.json();\r", + "});\r", + "\r", "" ], "type": "text/javascript", @@ -3893,6 +3901,14 @@ "pm.test(\"Verify that the response status code is 201\", function () {\r", " pm.response.to.have.status(201);\r", "});\r", + "\r", + "var responseJson = pm.response.json();\r", + "\r", + "pm.test(\"Verify that headers.Content-Type is 'application/yang-data+json; charset=utf-8'\", function () {\r", + " pm.expect(pm.response.headers.get('Content-Type')).is.equals('application/yang-data+json; charset=utf-8');\r", + " responseJson = pm.response.json();\r", + "});\r", + "\r", "" ], "type": "text/javascript", @@ -4042,7 +4058,7 @@ "listen": "test", "script": { "exec": [ - "//postman.setNextRequest('TD_MSP_03-Step-1');\r", + "//postman.setNextRequest('TC_mWT_PNC_PT_ETH_SVC_POST_BV_01');\r", "\r", "\r", "pm.test(\"Verify that the response status code is 200\", function () {\r", @@ -4058,41 +4074,7 @@ " topLevelPropertyName = responseData.hasOwnProperty('modules-state') ? 'modules-state' : 'ietf-yang-library:modules-state';\r", " console.info(topLevelPropertyName)\r", "});\r", - "\r", - "// var moduleList = {};\r", - "\r", - "// pm.test(\"Validate the main field is 'ietf-yang-library:modules-state'\", function () {\r", - "// pm.expect(responseData).to.be.an('object');\r", - "// pm.expect(responseData).to.have.property(topLevelPropertyName);\r", - "// });\r", - "\r", - "// pm.test(\"Verify that the 'module' array is present and not empty\", function () {\r", - "// pm.expect(responseData).to.be.an('object');\r", - "// pm.expect(responseData[topLevelPropertyName][\"module\"]).to.be.an('array').with.lengthOf.at.least(1);\r", - "// // Build the module list\r", - "// responseData[topLevelPropertyName].module.forEach(function(item, index) {\r", - "// pm.expect(item).to.have.property('name');\r", - "// pm.expect(item).to.have.property('revision');\r", - "// pm.expect(item).to.have.property('namespace');\r", - "// if (moduleList.hasOwnProperty(item.name)) {\r", - "// if (moduleList[item.name].revision < item.revision) {\r", - "// moduleList[item.name] = item;\r", - "// }\r", - "// } else {\r", - "// moduleList[item.name] = item;\r", - "// }\r", - "// });\r", - "\r", - "// });\r", - "\r", - "// pm.test('Verify that the basics YANG modules are supported', function() {\r", - "// pm.expect(moduleList).to.have.property(\"ietf-restconf\");\r", - "// pm.expect(moduleList).to.have.property(\"ietf-yang-library\");\r", - "// pm.expect(moduleList).to.have.property(\"ietf-datastores\");\r", - "// pm.expect(moduleList).to.have.property(\"ietf-inet-types\");\r", - "// pm.expect(moduleList).to.have.property(\"ietf-interfaces\");\r", - "// pm.expect(moduleList).to.have.property(\"ietf-ip\");\r", - "//});" + "" ], "type": "text/javascript", "packages": {} @@ -4161,6 +4143,9 @@ "listen": "test", "script": { "exec": [ + "//postman.setNextRequest('TC_mWT_PNC_PT_ETH_SVC_POST_BV_01');\r", + "\r", + "\r", "pm.test(\"Verify that the response status code is 200\", function () {\r", " pm.response.to.have.status(200);\r", "});\r", @@ -4174,41 +4159,7 @@ " topLevelPropertyName = responseData.hasOwnProperty('modules-state') ? 'modules-state' : 'ietf-yang-library:modules-state';\r", " console.info(topLevelPropertyName)\r", "});\r", - "\r", - "// var moduleList = {};\r", - "\r", - "// pm.test(\"Validate the main field is 'ietf-yang-library:modules-state'\", function () {\r", - "// pm.expect(responseData).to.be.an('object');\r", - "// pm.expect(responseData).to.have.property(topLevelPropertyName);\r", - "// });\r", - "\r", - "// pm.test(\"Verify that the 'module' array is present and not empty\", function () {\r", - "// pm.expect(responseData).to.be.an('object');\r", - "// pm.expect(responseData[topLevelPropertyName][\"module\"]).to.be.an('array').with.lengthOf.at.least(1);\r", - "// // Build the module list\r", - "// responseData[topLevelPropertyName].module.forEach(function(item, index) {\r", - "// pm.expect(item).to.have.property('name');\r", - "// pm.expect(item).to.have.property('revision');\r", - "// pm.expect(item).to.have.property('namespace');\r", - "// if (moduleList.hasOwnProperty(item.name)) {\r", - "// if (moduleList[item.name].revision < item.revision) {\r", - "// moduleList[item.name] = item;\r", - "// }\r", - "// } else {\r", - "// moduleList[item.name] = item;\r", - "// }\r", - "// });\r", - "\r", - "// });\r", - "\r", - "// pm.test('Verify that the basics YANG modules are supported', function() {\r", - "// pm.expect(moduleList).to.have.property(\"ietf-restconf\");\r", - "// pm.expect(moduleList).to.have.property(\"ietf-yang-library\");\r", - "// pm.expect(moduleList).to.have.property(\"ietf-datastores\");\r", - "// pm.expect(moduleList).to.have.property(\"ietf-inet-types\");\r", - "// pm.expect(moduleList).to.have.property(\"ietf-interfaces\");\r", - "// pm.expect(moduleList).to.have.property(\"ietf-ip\");\r", - "//});" + "" ], "type": "text/javascript", "packages": {} diff --git a/test-purposes/AtsMDSC.tplan2 b/test-purposes/AtsMDSC.tplan2 index 2ee8492..d37d062 100644 --- a/test-purposes/AtsMDSC.tplan2 +++ b/test-purposes/AtsMDSC.tplan2 @@ -1,1654 +1,1654 @@ -Package AtsMDSC { - - Group "mdsc" { - - } // End of Group "mdsc" - - Group "pnc" { - - Group "RESTCONF" { - - import all from mWT_Common; - - Test Purpose { - TP Id TP_mWT_PNC_RESTCONF_GET_BV_01 - - Test objective - "Verify that the IUT supports RESTCONF API request." - - Reference - "ETSI GS mWT 024 Clause 5.2.1 RESTCONF Protocol", - "RFC 8040 RESTCONF Protocol", - "RFC 8525 YANG Library" - - Config Id Config_mWT_2 - - PICS Selection IUT_PNC and RESTCONF and SEC_TLS - - Initial conditions with { - the IUT entity is idle - } - - Expected behaviour - ensure that { - when { - the IUT entity receives a vRequestGet containing - uri indicating value "/restconf/data/ietf-yang-library:module-set"; - from the TEST_SYSTEM entity - } then { - the IUT entity sends a r200 containing - headers containing - content_type indicating value "application/yang-data+xml";, - body containing - module_setate containing - name_ indicating value "ietf-yang-library:module-set", - modules containing - non empty list;;;; - to the TEST_SYSTEM entity - } - } - } - - Test Purpose { - TP Id TP_mWT_PNC_RESTCONF_GET_BV_02 - - Test objective - "Verify that the IUT supports the basic YANG data models." - - Reference - "ETSI GS mWT 024 Clause 5.2.1 RESTCONF Protocol", - "ETSI GS mWT 024 Clause 5.2.2 YANG Version", - "RFC 8040 RESTCONF Protocol", - "RFC 8525 YANG Library" - - Config Id Config_mWT_2 - - PICS Selection IUT_PNC and RESTCONF and SEC_TLS - - Initial conditions with { - the IUT entity is idle - } - - Expected behaviour - ensure that { - when { - the IUT entity receives a vRequestGet containing - uri indicating value "/restconf/data/ietf-yang-library:module-set"; - from the TEST_SYSTEM entity - } then { - the IUT entity sends a r200 containing - headers containing - content_type indicating value "application/yang-data+xml";, - body containing - module_setles_state containing - name_ indicating value "ietf-yang-library:module-set", - modules containing - entry containing - name_ indicating value "ietf-datastores", - revision indicating value "2018-02-14", - namespace indicating value "urn:ietf:params:xml:ns:yang:ietf-datastores";, - entry containing - name_ indicating value "ietf-inet-types", - revision indicating value "2013-07-15", - namespace indicating value "urn:ietf:params:xml:ns:yang:ietf-inet-types";, - entry containing - name_ indicating value "ietf-interfaces", - revision indicating value "2018-02-20", - namespace indicating value "urn:ietf:params:xml:ns:yang:ietf-interfaces";, - entry containing - name_ indicating value "ietf-ip", - revision indicating value "2018-02-22", - namespace indicating value "urn:ietf:params:xml:ns:yang:ietf-ip";, - entry containing - name_ indicating value "ietf-network-instance", - revision indicating value "2019-01-21", - namespace indicating value "urn:ietf:params:xml:ns:yang:ietf-network-instance";, - entry containing - name_ indicating value "ietf-restconf", - namespace indicating value "urn:ietf:params:xml:ns:yang:ietf-restconf";, - entry containing - name_ indicating value "ietf-yang-types", - revision indicating value "2013-07-15", - namespace indicating value "urn:ietf:params:xml:ns:yang:ietf-restconf";, - entry containing - name_ indicating value "ietf-yang-library", - revision indicating value "2019-01-04", - namespace indicating value "urn:ietf:params:xml:ns:yang:ietf-yang-library";;;;; - to the TEST_SYSTEM entity - } - } - } - - Test Purpose { - TP Id TP_mWT_PNC_RESTCONF_GET_BV_03 - - Test objective - "Verify that the IUT provides the list of supported mWT GS 024 YANG data models." - - Reference - "ETSI GS mWT 024 Clause 5.2.2.2 Common YANG data models", - "ETSI GS mWT 024 Clause 5.2.2.3 YANG Data Models at the Microwave MPI", - "ETSI GS mWT 024 Clause 5.2.2.4 Hierarchical relationship among YANG data models" - - Config Id Config_mWT_2 - - PICS Selection IUT_PNC and RESTCONF and SEC_TLS - - Initial conditions with { - the IUT entity is idle - } - - Expected behaviour - ensure that { - when { - the IUT entity receives a vRequestGet containing - uri indicating value "/restconf/data/ietf-yang-library:module-set"; - from the TEST_SYSTEM entity - } then { - the IUT entity sends a r200 containing - body containing - module_set modules_state containing - modules containing - entry containing - name_ indicating value "ietf-microwave-topology", - revision indicating value "2021-10-12", - schema indicating value "draft-ietf-ccamp-mw-topo-yang-02", - namespace indicating value "";, - entry containing - name_ indicating value "ietf-eth-te-topology", - revision indicating value "2019-11-18", - namespace indicating value "";, - entry containing - name_ indicating value "idraft-ietf-ccamp-client-signal-yang-06", - revision indicating value "", - namespace indicating value "";;;;; - to the TEST_SYSTEM entity - } - } - } - - } // End of Group Group "RESTCONF" - - Group "Blackbox" { - - import all from mWT_Common; - - Test Purpose { - TP Id TP_mWT_PNC_BB_MW_TOPO_GET_BV_01 - - Test objective - "Verify that the IUT does not provide any MW network topology." - - Reference - "ETSI GS mWT 024 Clause 4.3.2", - "ETSI GS mWT 024 Annex A.2.3", - "RFC 8345 A YANG Data Model for Network Topologies", - "RFC 8795 YANG Data Model for Traffic Engineering (TE) Topologies" - - Config Id Config_mWT_2 - - PICS Selection IUT_PNC and RESTCONF and SEC_TLS and ABSTRACT_BB - - Initial conditions with { - the IUT entity is idle - } - - Expected behaviour - ensure that { - when { - the IUT entity receives a vRequestGet containing - uri indicating value "/restconf/data/ietf-network:networks"; - from the TEST_SYSTEM entity - } then { - the IUT entity sends a r200 containing - headers containing - content_type indicating value "application/yang-data+xml";, - body containing - networks containing - networksList containing - name_ indicating value any_value, - networks containing - network_id indicating value any_value, - network_types containing - not te_topology - ;, - node_id indicating value any_value, - termination_points indicating value any_value, - links indicating value any_value - ;;;;; - to the TEST_SYSTEM entity - } - } - } - - Test Purpose { - TP Id TP_mWT_PNC_BB_MW_TOPO_GET_BV_02 - - Test objective - "Verify that the IUT provides a network list containing only one node." - - Reference - "ETSI GS mWT 024 Clause 4.3.2", - "ETSI GS mWT 024 Annex A.2.3", - "RFC 8345 A YANG Data Model for Network Topologies", - "RFC 8795 YANG Data Model for Traffic Engineering (TE) Topologies" - - Config Id Config_mWT_2 - - PICS Selection IUT_PNC and RESTCONF and SEC_TLS and ABSTRACT_BB - - Initial conditions with { - the IUT entity is idle - } - - Expected behaviour - ensure that { - when { - the IUT entity receives a vRequestGet containing - uri indicating value "/restconf/data/ietf-network:networks"; - from the TEST_SYSTEM entity - } then { - the IUT entity sends a r200 containing - headers containing - content_type indicating value "application/yang-data+xml";, - body containing - networks containing - networksList containing - one network node - ;;;; - to the TEST_SYSTEM entity - } - } - } - - Test Purpose { - TP Id TP_mWT_PNC_BB_MW_TOPO_GET_BV_03 - - Test objective - "Verify that the IUT provides a network list containing ietf-network entries." - - Reference - "ETSI GS mWT 024 Clause 4.3.2", - "ETSI GS mWT 024 Annex A.2.3", - "RFC 8345 A YANG Data Model for Network Topologies", - "RFC 8795 YANG Data Model for Traffic Engineering (TE) Topologies" - - Config Id Config_mWT_2 - - PICS Selection IUT_PNC and RESTCONF and SEC_TLS and ABSTRACT_BB - - Initial conditions with { - the IUT entity is idle - } - - Expected behaviour - ensure that { - when { - the IUT entity receives a vRequestGet containing - uri indicating value "/restconf/data/ietf-network:networks"; - from the TEST_SYSTEM entity - } then { - the IUT entity sends a r200 containing - headers containing - content_type indicating value "application/yang-data+xml";, - body containing - networks containing - networksList containing - one network node - ;;;; - to the TEST_SYSTEM entity - } - } - } - - } // End of Group "Blackbox" - - Group "PartiallyTransparent" { - - Group "MWTopologyDiscovery" { - - import all from mWT_Common; - - Test Purpose { - TP Id TP_mWT_PNC_PT_MW_TOPO_GET_BV_01 - - Test objective - "Verify that the IUT provides the MW network topology for all networks with mandatory mWT GC 024 data elements subset." - - Reference - "ETSI GS mWT 024 Clause 4.3.3", - "ETSI GS mWT 024 Annex A.2.2", - "RFC 8345 A YANG Data Model for Network Topologies", - "RFC 8795 YANG Data Model for Traffic Engineering (TE) Topologies", - "draft-ietf-ccamp-mw-topo-yang-02 A YANG Data Model for Microwave Topology" - - Config Id Config_mWT_2 - - PICS Selection IUT_PNC and RESTCONF and SEC_TLS and ABSTRACT_PT and MW_TOPO - - Initial conditions with { - the IUT entity is idle and - the IUT entity having discovered several MW ethernet networks topologies - } - - Expected behaviour - ensure that { - when { - the IUT entity receives a vRequestGet containing - uri indicating value "/restconf/data/ietf-network:networks/topologyId/mw-native-topology", - headers containing - content_type indicating value "application/yang-data+xml";; - from the TEST_SYSTEM entity - } then { - the IUT entity sends a r200 containing - headers containing - content_type indicating value "application/yang-data+xml";, - body containing - networks containing - networksList containing - name_ indicating value any_value, - networks containing - network_id indicating value any_value, - network_types containing - te_topology containing - mw_topology containing - mw_tp_choice indicating value any_value - ;;;, - node_id indicating value any_value, - termination_points indicating value any_value, - links indicating value any_value - ;;;;; - to the TEST_SYSTEM entity - } - } - } - - Test Purpose { - TP Id TP_mWT_PNC_PT_MW_TOPO_GET_BV_02 - - Test objective - "Verify that the IUT provides the MW network topology for a specific network with mandatory mWT GC 024 data elements subset." - - Reference - "ETSI GS mWT 024 Clause 4.3.3", - "ETSI GS mWT 024 Annex A.2.2.1", - "RFC 8345 A YANG Data Model for Network Topologies", - "RFC 8795 YANG Data Model for Traffic Engineering (TE) Topologies" - - Config Id Config_mWT_2 - - PICS Selection IUT_PNC and RESTCONF and SEC_TLS and ABSTRACT_PT and MW_TOPO - - Initial conditions with { - the IUT entity is idle and - the IUT entity having discovered a network topology NETWORK_TOPO - } - - Expected behaviour - ensure that { - when { - the IUT entity receives a vRequestGet containing - uri indicating value "/restconf/data/ietf-microwave-topology/ietf-network:networks/network={NETWORK_ID)/topologyId/mw-native-topology", - headers containing - content_type indicating value "application/yang-data+xml";; - from the TEST_SYSTEM entity - } then { - the IUT entity sends a r200 containing - headers containing - content_type indicating value "application/yang-data+xml";, - body containing - networks containing - network_id indicating value NETWORK_ID, - network_types containing - te_topology containing - mw_topology containing - mw_tp_choice indicating value any_value - ;;;, - node_id indicating value any_value, - termination_points indicating value any_value, - links indicating value any_value - ;;; - to the TEST_SYSTEM entity - } - } - } - - Test Purpose { - TP Id TP_mWT_PNC_PT_MW_TOPO_GET_BO_01 - - Test objective - "Verify that the IUT replies with an error code when the request is malformed." - - Reference - "ETSI GS mWT 024 Clause 4.3.3", - "ETSI GS mWT 024 Clause 5.3.2 Exception Handling", - "ETSI GS mWT 024 Annex A.2.2", - "RFC 8345 A YANG Data Model for Network Topologies", - "RFC 8795 YANG Data Model for Traffic Engineering (TE) Topologies" - - Config Id Config_mWT_2 - - PICS Selection IUT_PNC and RESTCONF and SEC_TLS and ABSTRACT_PT and MW_TOPO - - Initial conditions with { - the IUT entity is idle and - the IUT entity having discovered a network topology NETWORK_TOPO - } - - Expected behaviour - ensure that { - when { - the IUT entity receives a vRequestGet containing - uri indicating value "/restconf/data/networks"; // Malformed URI - from the TEST_SYSTEM entity - } then { - the IUT entity sends a r400 - to the TEST_SYSTEM entity - } - } - } - - Test Purpose { - TP Id TP_mWT_PNC_PT_MW_TOPO_GET_BO_02 - - Test objective - "Verify that the IUT replies with an error code when the network identifier is unknown." - - Reference - "ETSI GS mWT 024 Clause 4.3.3", - "ETSI GS mWT 024 Clause 5.3.2 Exception Handling", - "ETSI GS mWT 024 Annex A.2.2", - "RFC 8345 A YANG Data Model for Network Topologies", - "RFC 8795 YANG Data Model for Traffic Engineering (TE) Topologies" - - Config Id Config_mWT_2 - - PICS Selection IUT_PNC and RESTCONF and SEC_TLS and ABSTRACT_PT and MW_TOPO - - Initial conditions with { - the IUT entity is idle and - the IUT entity having discovered a network topology NETWORK_TOPO - } - - Expected behaviour - ensure that { - when { - the IUT entity receives a vRequestGet containing - uri indicating value "/restconf/data/ietf-network:networks/network={UNKNOWN_NETWORK_ID)/topologyId/mw-native-topology"; - from the TEST_SYSTEM entity - } then { - the IUT entity sends a r404 - to the TEST_SYSTEM entity - } - } - } - - Test Purpose { - TP Id TP_mWT_PNC_PT_MW_NODE_GET_BV_01 - - Test objective - "Verify that the IUT provides the MW network topology for all nodes with mandatory mWT GC 024 data elements subset." - - Reference - "ETSI GS mWT 024 Clause 4.3.3", - "ETSI GS mWT 024 Annex A.2.2.1", - "RFC 8345 A YANG Data Model for Network Topologies", - "RFC 8795 YANG Data Model for Traffic Engineering (TE) Topologies", - "draft-ietf-ccamp-mw-topo-yang-02 A YANG Data Model for Microwave Topology" - - Config Id Config_mWT_2 - - PICS Selection IUT_PNC and RESTCONF and SEC_TLS and ABSTRACT_PT and MW_TOPO - - Initial conditions with { - the IUT entity is idle and - the IUT entity having discovered several MW ethernet networks topologies - } - - Expected behaviour - ensure that { - when { - the IUT entity receives a vRequestGet containing - uri indicating value "/restconf/data/ietf-microwave-topology/ietf-network:networks/network={NETWORK_ID)/node/topologyId/mw-native-topology"; - from the TEST_SYSTEM entity - } then { - the IUT entity sends a r200 containing - headers containing - content_type indicating value "application/yang-data+xml";, - body containing - networks containing - networksList containing - name_ indicating value any_value, - networks containing - network_id indicating value any_value, - network_types containing - te_topology containing - mw_native_topology indicating value any_value - ;;, - node_id indicating value any_value, - termination_points indicating value any_value, - links indicating value any_value - ;;;;; - to the TEST_SYSTEM entity - } - } - } - - Test Purpose { - TP Id TP_mWT_PNC_PT_MW_NODE_GET_BV_02 - - Test objective - "Verify that the IUT provides the MW network topology for a specific node with mandatory mWT GC 024 data elements subset." - - Reference - "ETSI GS mWT 024 Clause 4.3.3", - "ETSI GS mWT 024 Annex A.2.2.1", - "RFC 8345 A YANG Data Model for Network Topologies", - "RFC 8795 YANG Data Model for Traffic Engineering (TE) Topologies", - "draft-ietf-ccamp-mw-topo-yang-02 A YANG Data Model for Microwave Topology" - - Config Id Config_mWT_2 - - PICS Selection IUT_PNC and RESTCONF and SEC_TLS and ABSTRACT_PT and MW_TOPO - - Initial conditions with { - the IUT entity is idle and - the IUT entity having discovered several MW ethernet networks topologies - } - - Expected behaviour - ensure that { - when { - the IUT entity receives a vRequestGet containing - uri indicating value "/restconf/data/ietf-microwave-topology/ietf-network:networks/network={NETWORK_ID)/node={NODE_ID}/topologyId/mw-native-topology"; - from the TEST_SYSTEM entity - } then { - the IUT entity sends a r200 containing - headers containing - content_type indicating value "application/yang-data+xml";, - body containing - networks containing - networksList containing - name_ indicating value any_value, - networks containing - network_id indicating value NETWORK_ID, - network_types containing - te_topology containing - mw_native_topology indicating value any_value - ;;, - node_id indicating value NODE_ID, - termination_points indicating value any_value, - links indicating value any_value - ;;;;; - to the TEST_SYSTEM entity - } - } - } - - Test Purpose { - TP Id TP_mWT_PNC_PT_MW_NODE_GET_BO_01 - - Test objective - "Verify that the IUT replies with an error code when the node identifier is unknown." - - Reference - "ETSI GS mWT 024 Clause 4.3.3", - "ETSI GS mWT 024 Clause 5.3.2 Exception Handling", - "ETSI GS mWT 024 Annex A.2.2", - "RFC 8345 A YANG Data Model for Network Topologies", - "RFC 8795 YANG Data Model for Traffic Engineering (TE) Topologies", - "draft-ietf-ccamp-mw-topo-yang-02 A YANG Data Model for Microwave Topology" - - Config Id Config_mWT_2 - - PICS Selection IUT_PNC and RESTCONF and SEC_TLS and ABSTRACT_PT and MW_TOPO - - Initial conditions with { - the IUT entity is idle and - the IUT entity having discovered several MW ethernet networks topologies - } - - Expected behaviour - ensure that { - when { - the IUT entity receives a vRequestGet containing - uri indicating value "/restconf/data/ietf-microwave-topology/ietf-network:networks/network={NETWORK_ID)/node={UNKNOWN_NODE_ID}/topologyId/mw-native-topology"; - from the TEST_SYSTEM entity - } then { - the IUT entity sends a r404 - to the TEST_SYSTEM entity - } - } - } - - } // End of Group "MWTopologyDiscovery" - - Group "EthernetTopologyDiscovery" { - - import all from mWT_Common; - - Test Purpose { - TP Id TP_mWT_PNC_PT_ETH_TOPO_NETWORK_GET_BV_01 - - Test objective - "Verify that the IUT provides the Ethernet network topology for all networks with mandatory mWT GC 024 data elements subset." - - Reference - "ETSI GS mWT 024 Clause 4.3.3", - "ETSI GS mWT 024 Annex A.2.2", - "RFC 8345 A YANG Data Model for Network Topologies", - "RFC 8795 YANG Data Model for Traffic Engineering (TE) Topologies", - "draft-ietf-ccamp-mw-topo-yang-02 A YANG Data Model for Microwave Topology" - - Config Id Config_mWT_2 - - PICS Selection IUT_PNC and RESTCONF and SEC_TLS and ABSTRACT_PT and ETH_TOPO - - Initial conditions with { - the IUT entity is idle and - the IUT entity having discovered several MW ethernet networks topologies - } - - Expected behaviour - ensure that { - when { - the IUT entity receives a vRequestGet containing - uri indicating value "/restconf/data/ietf-network:networks", - headers containing - content_type indicating value "application/yang-data+xml";; - from the TEST_SYSTEM entity - } then { - the IUT entity sends a r200 containing - headers containing - content_type indicating value "application/yang-data+xml";, - body containing - networks containing - networksList containing - name_ indicating value any_value, - networks containing - network_id indicating value any_value, - network_types containing - te_topology containing - mw_topology containing - mw_tp_choice indicating value any_value - ;;;, - node_id indicating value any_value, - termination_points indicating value any_value, - links indicating value any_value - ;;;;; - to the TEST_SYSTEM entity - } - } - } - - Test Purpose { - TP Id TP_mWT_PNC_PT_ETH_TOPO_NETWORK_GET_BV_02 - - Test objective - "Verify that the IUT provides the Ethernet network topology for a specific network with mandatory mWT GC 024 data elements subset." - - Reference - "ETSI GS mWT 024 Clause 4.3.3", - "ETSI GS mWT 024 Annex A.1.2", - "RFC 8345 A YANG Data Model for Network Topologies", - "RFC 8795 YANG Data Model for Traffic Engineering (TE) Topologies" - - Config Id Config_mWT_2 - - PICS Selection IUT_PNC and RESTCONF and SEC_TLS and ABSTRACT_PT and ETH_TOPO - - Initial conditions with { - the IUT entity is idle and - the IUT entity having discovered a network topology NETWORK_TOPO - } - - Expected behaviour - ensure that { - when { - the IUT entity receives a vRequestGet containing - uri indicating value "/restconf/data/ietf-network:networks/network={NETWORK_ID}", - headers containing - content_type indicating value "application/yang-data+xml";; - from the TEST_SYSTEM entity - } then { - the IUT entity sends a r200 containing - headers containing - content_type indicating value "application/yang-data+xml";, - body containing - networks containing - network_id indicating value NETWORK_ID, - network_types containing - te_topology indicating value any_value;, - node_id indicating value any_value, - termination_points indicating value any_value, - links indicating value any_value - ;;; - to the TEST_SYSTEM entity - } - } - } - - Test Purpose { - TP Id TP_mWT_PNC_PT_ETH_TOPO_NETWORK_GET_BO_01 - - Test objective - "Verify that the IUT replies with an error code when the request is malformed." - - Reference - "ETSI GS mWT 024 Clause 4.3.3", - "ETSI GS mWT 024 Clause 5.3.2 Exception Handling", - "ETSI GS mWT 024 Annex A.1.2", - "RFC 8345 A YANG Data Model for Network Topologies", - "RFC 8795 YANG Data Model for Traffic Engineering (TE) Topologies" - - Config Id Config_mWT_2 - - PICS Selection IUT_PNC and RESTCONF and SEC_TLS and ABSTRACT_PT and ETH_TOPO - - Initial conditions with { - the IUT entity is idle and - the IUT entity having discovered a network topology NETWORK_TOPO - } - - Expected behaviour - ensure that { - when { - the IUT entity receives a vRequestGet containing - uri indicating value "/restconf/data/networks/{NETWORK_ID}"; // Malformed URI - from the TEST_SYSTEM entity - } then { - the IUT entity sends a r400 - to the TEST_SYSTEM entity - } - } - } - - Test Purpose { - TP Id TP_mWT_PNC_PT_ETH_TOPO_NETWORK_GET_BO_02 - - Test objective - "Verify that the IUT replies with an error code when the network identifier is unknown." - - Reference - "ETSI GS mWT 024 Clause 4.3.3", - "ETSI GS mWT 024 Clause 5.3.2 Exception Handling", - "ETSI GS mWT 024 Annex A.1.2", - "RFC 8345 A YANG Data Model for Network Topologies", - "RFC 8795 YANG Data Model for Traffic Engineering (TE) Topologies" - - Config Id Config_mWT_2 - - PICS Selection IUT_PNC and RESTCONF and SEC_TLS and ABSTRACT_PT and ETH_TOPO - - Initial conditions with { - the IUT entity is idle and - the IUT entity having discovered a network topology NETWORK_TOPO - } - - Expected behaviour - ensure that { - when { - the IUT entity receives a vRequestGet containing - uri indicating value "/restconf/data/ietf-network:networks/network={UNKNOWN_NETWORK_ID}"; - from the TEST_SYSTEM entity - } then { - the IUT entity sends a r404 - to the TEST_SYSTEM entity - } - } - } - - Test Purpose { - TP Id TP_mWT_PNC_PT_ETH_TOPO_NODE_GET_BV_01 - - Test objective - "Verify that the IUT provides the Ethernet network topology for all nodes with mandatory mWT GC 024 data elements subset." - - Reference - "ETSI GS mWT 024 Clause 4.3.3", - "ETSI GS mWT 024 Annex A.2.2", - "RFC 8345 A YANG Data Model for Network Topologies", - "RFC 8795 YANG Data Model for Traffic Engineering (TE) Topologies", - "draft-ietf-ccamp-mw-topo-yang-02 A YANG Data Model for Microwave Topology" - - Config Id Config_mWT_2 - - PICS Selection IUT_PNC and RESTCONF and SEC_TLS and ABSTRACT_PT and ETH_TOPO - - Initial conditions with { - the IUT entity is idle and - the IUT entity having discovered several MW ethernet networks topologies - } - - Expected behaviour - ensure that { - when { - the IUT entity receives a vRequestGet containing - uri indicating value "/restconf/data/ietf-network:networks/network={NETWORK_ID}/node"; - from the TEST_SYSTEM entity - } then { - the IUT entity sends a r200 containing - headers containing - content_type indicating value "application/yang-data+xml";, - body containing - networks containing - networksList containing - name_ indicating value any_value, - networks containing - network_id indicating value any_value, - network_types containing - te_topology containing - mw_topology containing - mw_tp_choice indicating value any_value - ;;;, - node_id indicating value any_value, - termination_points indicating value any_value, - links indicating value any_value - ;;;;; - to the TEST_SYSTEM entity - } - } - } - - Test Purpose { - TP Id TP_mWT_PNC_PT_ETH_NODE_GET_BV_02 - - Test objective - "Verify that the IUT provides the Ethernet network topology for specific node with mandatory mWT GC 024 data elements subset." - - Reference - "ETSI GS mWT 024 Clause 4.3.3", - "ETSI GS mWT 024 Annex A.2.2", - "RFC 8345 A YANG Data Model for Network Topologies", - "RFC 8795 YANG Data Model for Traffic Engineering (TE) Topologies", - "draft-ietf-ccamp-mw-topo-yang-02 A YANG Data Model for Microwave Topology" - - Config Id Config_mWT_2 - - PICS Selection IUT_PNC and RESTCONF and SEC_TLS and ABSTRACT_PT and ETH_TOPO - - Initial conditions with { - the IUT entity is idle and - the IUT entity having discovered several MW ethernet networks topologies - } - - Expected behaviour - ensure that { - when { - the IUT entity receives a vRequestGet containing - uri indicating value "/restconf/data/ietf-network:networks/network={NETWORK_ID}/node={NODE_ID}"; - from the TEST_SYSTEM entity - } then { - the IUT entity sends a r200 containing - headers containing - content_type indicating value "application/yang-data+xml";, - body containing - networks containing - networksList containing - name_ indicating value any_value, - networks containing - network_id indicating value any_value, - network_types containing - te_topology containing - mw_topology containing - mw_tp_choice indicating value any_value - ;;;, - node_id indicating value any_value, - termination_points indicating value any_value, - links indicating value any_value - ;;;;; - to the TEST_SYSTEM entity - } - } - } - - Test Purpose { - TP Id TP_mWT_PNC_PT_ETH_NODE_GET_BO_01 - - Test objective - "Verify that the IUT replies with an error code when the node identifier is unknown." - - Reference - "ETSI GS mWT 024 Clause 4.3.3", - "ETSI GS mWT 024 Clause 5.3.2 Exception Handling", - "ETSI GS mWT 024 Annex A.2.2", - "RFC 8345 A YANG Data Model for Network Topologies", - "RFC 8795 YANG Data Model for Traffic Engineering (TE) Topologies", - "draft-ietf-ccamp-mw-topo-yang-02 A YANG Data Model for Microwave Topology" - - Config Id Config_mWT_2 - - PICS Selection IUT_PNC and RESTCONF and SEC_TLS and ABSTRACT_PT and ETH_TOPO - - Initial conditions with { - the IUT entity is idle and - the IUT entity having discovered several MW ethernet networks topologies - } - - Expected behaviour - ensure that { - when { - the IUT entity receives a vRequestGet containing - uri indicating value "/restconf/data/ietf-network:networks/network={NETWORK_ID}/node={UNKNOWN_NODE_ID}"; - from the TEST_SYSTEM entity - } then { - the IUT entity sends a r404 - to the TEST_SYSTEM entity - } - } - } - - } // End of Group "EthernetTopologyDiscovery" - - Group "EthernetService" { - - import all from mWT_Common; - - Test Purpose { - TP Id TP_mWT_PNC_PT_ETH_SVC_GET_BV_01 - - Test objective - "Verify that the IUT provides all the Bandwidth profiles with mandatory mWT GC 024 data elements subset." - - Reference - "ETSI GS mWT 024 Clause 4.3.3", - "ETSI GS mWT 024 Annex A.2.2", - "RFC 8345 A YANG Data Model for Network Topologies", - "RFC 8795 YANG Data Model for Traffic Engineering (TE) Topologies", - "draft-ietf-ccamp-client-signal-yang-05 A YANG Data Model for Transport Network Client Signals" - - Config Id Config_mWT_2 - - PICS Selection IUT_PNC and RESTCONF and SEC_TLS and ABSTRACT_PT - - Initial conditions with { - the IUT entity is idle and - the IUT entity having discovered several MW ethernet networks topologies and - the IUT entity having a Bandwidth profile created and - the IUT entity having a service profile created - } - - Expected behaviour - ensure that { - when { - the IUT entity receives a vRequestGet containing - uri indicating value "/restconf/data/ietf-eth-tran-service:etht-svc/globals"; - from the TEST_SYSTEM entity - } then { - the IUT entity sends a r200 containing - headers containing - content_type indicating value "application/yang-data+xml";, - body containing - eth_svc containing - globals containing - band_width_profiles containing - band_width_profile indicating value BAND_WIDTH_PROFILE - ;;, - ethtSvcInstanceList containing - ethtSvcInstance containing - name_ indicating value any_value, - title indicating value any_value, - desc indicating value any_value, - customer indicating value any_value - ;;;;; - to the TEST_SYSTEM entity - } - } - } - - Test Purpose { - TP Id TP_mWT_PNC_PT_ETH_SVC_GET_BO_01 - - Test objective - "Verify that the IUT replies with an error code when the request is malformed." - - Reference - "ETSI GS mWT 024 Clause 4.2.2.1 Ethernet Ethernet Services", - "ETSI GS mWT 024 Clause 4.3.3", - "ETSI GS mWT 024 Clause 5.3.2 Exception Handling", - "ETSI GS mWT 024 Annex A.2.4", - "RFC 6991 Common YANG Data Types", - "RFC 8776 Common YANG Data Types for Traffic Engineering", - "draft-ietf-ccamp-client-signal-yang-05 A YANG Data Model for Transport Network Client Signals" - - Config Id Config_mWT_2 - - PICS Selection IUT_PNC and RESTCONF and SEC_TLS and ABSTRACT_PT - - Initial conditions with { - the IUT entity is idle and - the IUT entity having discovered several MW ethernet networks topologies - } - - Expected behaviour - ensure that { - when { - the IUT entity receives a vRequestGet containing - uri indicating value "/restconf/data/tran-service:etht-svc/globals"; // Malformed URI - from the TEST_SYSTEM entity - } then { - the IUT entity sends a r400 - to the TEST_SYSTEM entity - } - } - } - - Test Purpose { - TP Id TP_mWT_PNC_PT_ETH_SVC_POST_BV_01 - - Test objective - "Verify that the IUT creates a new Bandwidth profile with mandatory mWT GC 024 data elements subset." - - Reference - "ETSI GS mWT 024 Clause 4.2.2.1 Ethernet Ethernet Services", - "ETSI GS mWT 024 Clause 4.3.3", - "ETSI GS mWT 024 Annex A.2.4", - "RFC 6991 Common YANG Data Types", - "RFC 8776 Common YANG Data Types for Traffic Engineering", - "draft-ietf-ccamp-client-signal-yang-05 A YANG Data Model for Transport Network Client Signals" - - Config Id Config_mWT_2 - - PICS Selection IUT_PNC and RESTCONF and SEC_TLS and ABSTRACT_PT and not BWP_SVS_IN_ONE_REQUEST - - Initial conditions with { - the IUT entity is idle and - the IUT entity having discovered several MW ethernet networks topologies and - the IUT entity not having a Bandwidth profile created - } - - Expected behaviour - ensure that { - when { - the IUT entity receives a vRequestPost containing - uri indicating value "/restconf/data/ietf-eth-tran-service:etht-svc/globals", - body containing - eth_svc containing - ethtSvcInstanceList containing - ethtSvcInstance containing - name_ indicating value ETHT_SVC_NAME, - title indicating value any_value, - desc indicating value any_value, - customer indicating value any_value - ;;;;; - from the TEST_SYSTEM entity - } then { - the IUT entity sends a r201 containing - headers containing - content_type indicating value "application/yang-data+xml";, - body containing - eth_svc containing - ethtSvcInstanceList containing - ethtSvcInstance containing - name_ indicating value ETHT_SVC_NAME, - title indicating value any_value, - desc indicating value any_value, - customer indicating value any_value - ;;;;; - to the TEST_SYSTEM entity - } - } - } - - Test Purpose { - TP Id TP_mWT_PNC_PT_ETH_SVC_POST_BV_02_01 - - Test objective - "Verify that the IUT creates a new ethernet service with mandatory mWT GC 024 data elements subset." - - Reference - "ETSI GS mWT 024 Clause 4.2.2.1 Ethernet Ethernet Services", - "ETSI GS mWT 024 Clause 4.3.3", - "ETSI GS mWT 024 Annex A.2.4", - "RFC 6991 Common YANG Data Types", - "RFC 8776 Common YANG Data Types for Traffic Engineering", - "draft-ietf-ccamp-client-signal-yang-05 A YANG Data Model for Transport Network Client Signals" - - Config Id Config_mWT_2 - - PICS Selection IUT_PNC and RESTCONF and SEC_TLS and ABSTRACT_PT and not BWP_SVS_IN_ONE_REQUEST - - Initial conditions with { - the IUT entity is idle and - the IUT entity having discovered several MW ethernet networks topologies and - the IUT entity having a Bandwidth profile created and - the IUT entity not having a service profile created - } - - Expected behaviour - ensure that { - when { - the IUT entity receives a vRequestPost containing - uri indicating value "/restconf/data/ietf-eth-tran-service:etht-svc", - headers containing - content_type indicating value "application/yang-data+xml";, - body containing - eth_svc containing - ethtSvcInstanceList containing - ethtSvcInstance containing - name_ indicating value ETHT_SVC_NAME, - title indicating value any_value, - desc indicating value any_value, - customer indicating value any_value - ;;;;; - from the TEST_SYSTEM entity - } then { - the IUT entity sends a r201 containing - headers containing - content_type indicating value "application/yang-data+xml";, - body containing - eth_svc containing - ethtSvcInstanceList containing - ethtSvcInstance containing - name_ indicating value ETHT_SVC_NAME, - title indicating value any_value, - desc indicating value any_value, - customer indicating value any_value - ;, - ethtSvcInstance containing - name_ indicating value ETHT_SVC_NAME, - title indicating value ETH_SVC_TITLE, - desc indicating value ETH_SVC_DESC, - customer indicating value ETH_SVC_CUSTOMER - ;;;;; - to the TEST_SYSTEM entity - } - } - } - - Test Purpose { - TP Id TP_mWT_PNC_PT_ETH_SVC_POST_BV_02_02 - - Test objective - "Verify that the IUT creates successfully a new Bandwidth profile." - - Reference - "ETSI GS mWT 024 Clause 4.3.3", - "ETSI GS mWT 024 Annex A.2.2", - "RFC 8345 A YANG Data Model for Network Topologies", - "RFC 8795 YANG Data Model for Traffic Engineering (TE) Topologies", - "draft-ietf-ccamp-client-signal-yang-05 A YANG Data Model for Transport Network Client Signals" - - Config Id Config_mWT_2 - - PICS Selection IUT_PNC and RESTCONF and SEC_TLS and ABSTRACT_PT and not BWP_SVS_IN_ONE_REQUEST - - Initial conditions with { - the IUT entity is idle and - the IUT entity having discovered several MW ethernet networks topologies and - the IUT entity having a Bandwidth profile created and - the IUT entity not having a Bandwidth profile containing - bandwidthProfileName indicating value SDN_BANDWIDTH_PROFILE_NAME; and - the IUT entity having a service profile created - } - - Expected behaviour - ensure that { - when { - the IUT entity receives a vRequestPost containing - uri indicating value "/restconf/data/ietf-eth-tran-service:etht-svc/globals", - headers containing - content_type indicating value "application/yang-data+xml";, - body containing - bandwidthProfiles containing - bandwidthProfileName indicating value SDN_BANDWIDTH_PROFILE_NAME, - bandwidthProfileType indicating value SDN_SERVICE_TYPE, - bandwidthProfileCir indicating value CIR, - bandwidthProfileEir indicating value EIR, - bandwidthProfileColorAware indicating value COLOR_AWARE, - bandwidthCouplingFlag indicating value true - ;;; - from the TEST_SYSTEM entity - } then { - the IUT entity sends a r201 containing - headers containing - content_type indicating value "application/yang-data+xml";, - body containing - bandwidthProfiles containing - bandwidthProfileName indicating value SDN_BANDWIDTH_PROFILE_NAME, - bandwidthProfileType indicating value SDN_SERVICE_TYPE, - bandwidthProfileCir indicating value CIR, - bandwidthProfileEir indicating value EIR, - bandwidthProfileColorAware indicating value COLOR_AWARE, - bandwidthCouplingFlag indicating value true - ;;; - to the TEST_SYSTEM entity - } - } - } - - Test Purpose { - TP Id TP_mWT_PNC_PT_ETH_SVC_POST_BV_03 - - Test objective - "Verify that the IUT creates a new Bandwidth profile and and a new ethernet service in one POST with mandatory mWT GC 024 data elements subset." - - Reference - "ETSI GS mWT 024 Clause 4.2.2.1 Ethernet Ethernet Services", - "ETSI GS mWT 024 Clause 4.3.3", - "ETSI GS mWT 024 Annex A.2.4", - "RFC 6991 Common YANG Data Types", - "RFC 8776 Common YANG Data Types for Traffic Engineering", - "draft-ietf-ccamp-client-signal-yang-05 A YANG Data Model for Transport Network Client Signals" - - Config Id Config_mWT_2 - - PICS Selection IUT_PNC and RESTCONF and SEC_TLS and ABSTRACT_PT and BWP_SVS_IN_ONE_REQUEST - - Initial conditions with { - the IUT entity is idle and - the IUT entity having discovered several MW ethernet networks topologies and - the IUT entity not having a Bandwidth profile created - } - - Expected behaviour - ensure that { - when { - the IUT entity receives a vRequestPost containing - uri indicating value "/restconf/data/ietf-eth-tran-service:etht-svc/globals", - headers containing - content_type indicating value "application/yang-data+xml", - body containing - eth_svc containing - ethtSvcInstanceList containing - ethtSvcInstance containing - name_ indicating value ETHT_SVC_NAME, - title indicating value ETH_SVC_TITLE, - desc indicating value ETH_SVC_DESC, - customer indicating value ETH_SVC_CUSTOMER, - ingress_egress_bandwidth_profile containing - bandwidth_profile_type indicating value BANDWIDTH_PROFILE_TYPE, - cir indicating value CIR, - eir indicating value EIR - ;;;;;;; - from the TEST_SYSTEM entity - } then { - the IUT entity sends a r201 containing - headers containing - content_type indicating value "application/yang-data+xml";, - body containing - eth_svc containing - ethtSvcInstanceList containing - ethtSvcInstance containing - name_ indicating value ETHT_SVC_NAME, - title indicating value ETH_SVC_TITLE, - desc indicating value ETH_SVC_DESC, - customer indicating value ETH_SVC_CUSTOMER - ;;;;; - to the TEST_SYSTEM entity - } - } - } - - Test Purpose { - TP Id TP_mWT_PNC_PT_ETH_SVC_POST_BO_01 - - Test objective - "Verify that the IUT replies with an error when the request is malformed." - - Reference - "ETSI GS mWT 024 Clause 4.3.3", - "ETSI GS mWT 024 Clause 5.3.2 Exception Handling", - "ETSI GS mWT 024 Annex A.2.4", - "RFC 6991 Common YANG Data Types", - "RFC 8776 Common YANG Data Types for Traffic Engineering", - "draft-ietf-ccamp-client-signal-yang-05 A YANG Data Model for Transport Network Client Signals" - - Config Id Config_mWT_2 - - PICS Selection IUT_PNC and RESTCONF and SEC_TLS and ABSTRACT_PT and not BWP_SVS_IN_ONE_REQUEST - - Initial conditions with { - the IUT entity is idle and - the IUT entity having discovered several MW ethernet networks topologies - } - - Expected behaviour - ensure that { - when { - the IUT entity receives a vRequestPost containing - uri indicating value "/restconf/data/etht-svc/globals", // Malformed URI - body containing - eth_svc containing - ethtSvcInstanceList containing - ethtSvcInstance containing - name_ indicating value ETHT_SVC_NAME, - title indicating value ETH_SVC_TITLE, - desc indicating value ETH_SVC_DESC, - customer indicating value ETH_SVC_CUSTOMER - ;;;;; - from the TEST_SYSTEM entity - } then { - the IUT entity sends a r400 - to the TEST_SYSTEM entity - } - } - } - - Test Purpose { - TP Id TP_mWT_PNC_PT_ETH_SVC_PUT_BV_01 - - Test objective - "Verify that the IUT updates an existing Bandwidth profile with mandatory mWT GC 024 data elements subset." - - Reference - "ETSI GS mWT 024 Clause 4.2.2.1 Ethernet Ethernet Services", - "ETSI GS mWT 024 Clause 4.3.3", - "ETSI GS mWT 024 Annex A.2.4", - "RFC 6991 Common YANG Data Types", - "RFC 8776 Common YANG Data Types for Traffic Engineering", - "draft-ietf-ccamp-client-signal-yang-05 A YANG Data Model for Transport Network Client Signals" - - Config Id Config_mWT_2 - - PICS Selection IUT_PNC and RESTCONF and SEC_TLS and ABSTRACT_PT - - Initial conditions with { - the IUT entity is idle and - the IUT entity having discovered several MW ethernet networks topologies and - the IUT entity having a Bandwidth profile created - } - - Expected behaviour - ensure that { - when { - the IUT entity receives a vRequestPut containing - uri indicating value "/restconf/data/ietf-eth-tran-service:etht-svc/globals", - headers containing - content_type indicating value "application/yang-data+xml";, - body containing - eth_svc containing - globals containing - namedBandwidthProfile containing - bandwidth_profile_name indicating value BANDWIDTH_PROFILE_NAME, - CIR indicating value CIR_VALUE, - CBS indicating value CBS_VALUE, - EIR indicating value EIR_VALUE, - EBS indicating value EBS_VALUE, - color_aware indicating value COLOR_AWARE, - coupling_flag indicating value COUPLING_FLAG - ;;;;; - from the TEST_SYSTEM entity - } then { - the IUT entity sends a r201 containing - headers containing - content_type indicating value "application/yang-data+xml";, - body containing - eth_svc containing - globals containing - namedBandwidthProfile containing - bandwidth_profile_name indicating value BANDWIDTH_PROFILE_NAME, - CIR indicating value CIR_VALUE, - CBS indicating value CBS_VALUE, - EIR indicating value EIR_VALUE, - EBS indicating value EBS_VALUE, - color_aware indicating value COLOR_AWARE, - coupling_flag indicating value COUPLING_FLAG - ;;;;; - to the TEST_SYSTEM entity - } - } - } - - Test Purpose { - TP Id TP_mWT_PNC_PT_ETH_SVC_PUT_BV_02 - - Test objective - "Verify that the IUT updates an existing ethernet service." - - Reference - "ETSI GS mWT 024 Clause 4.2.2.1 Ethernet Ethernet Services", - "ETSI GS mWT 024 Clause 4.3.3", - "ETSI GS mWT 024 Annex A.2.4", - "RFC 6991 Common YANG Data Types", - "RFC 8776 Common YANG Data Types for Traffic Engineering", - "draft-ietf-ccamp-client-signal-yang-05 A YANG Data Model for Transport Network Client Signals" - - Config Id Config_mWT_2 - - PICS Selection IUT_PNC and RESTCONF and SEC_TLS and ABSTRACT_PT - - Initial conditions with { - the IUT entity is idle and - the IUT entity having discovered several MW ethernet networks topologies and - the IUT entity having a Bandwidth profile created - } - - Expected behaviour - ensure that { - when { - the IUT entity receives a vRequestPut containing - uri indicating value "/restconf/data/ietf-eth-tran-service:etht-svc/globals", - headers containing - content_type indicating value "application/yang-data+xml";, - body containing - eth_svc containing - ethtSvcInstanceList containing - ethtSvcInstance containing - name_ indicating value ETHT_SVC_NAME, - title indicating value ETH_SVC_TITLE, - desc indicating value ETH_SVC_DESC, - customer indicating value ETH_SVC_CUSTOMER - ;;;;; - from the TEST_SYSTEM entity - } then { - the IUT entity sends a r201 containing - headers containing - content_type indicating value "application/yang-data+xml";, - body containing - eth_svc containing - ethtSvcInstanceList containing - ethtSvcInstance containing - name_ indicating value ETHT_SVC_NAME, - title indicating value ETH_SVC_TITLE, - desc indicating value ETH_SVC_DESC, - customer indicating value ETH_SVC_CUSTOMER - ;;;;; - to the TEST_SYSTEM entity - } - } - } - - Test Purpose { - TP Id TP_mWT_PNC_PT_ETH_SVC_PUT_BO_01 - - Test objective - "Verify that the IUT replies with an error code when updating an unknown Bandwidth profile with mandatory mWT GC 024 data elements subset." - - Reference - "ETSI GS mWT 024 Clause 5.3.2 Exception Handling", - "ETSI GS mWT 024 Clause 4.3.3", - "ETSI GS mWT 024 Annex A.2.4", - "RFC 6991 Common YANG Data Types", - "RFC 8776 Common YANG Data Types for Traffic Engineering", - "draft-ietf-ccamp-client-signal-yang-05 A YANG Data Model for Transport Network Client Signals" - - Config Id Config_mWT_2 - - PICS Selection IUT_PNC and RESTCONF and SEC_TLS and ABSTRACT_PT - - Initial conditions with { - the IUT entity is idle and - the IUT entity having discovered several MW ethernet networks topologies - } - - Expected behaviour - ensure that { - when { - the IUT entity receives a vRequestPut containing - uri indicating value "/restconf/data/ietf-eth-tran-service:etht-svc/globals", - body containing - eth_svc containing - ethtSvcInstanceList containing - ethtSvcInstance containing - name_ indicating value UNKNOWN_ETHT_SVC_NAME, - title indicating value ETH_SVC_TITLE, - desc indicating value ETH_SVC_DESC, - customer indicating value ETH_SVC_CUSTOMER - ;;;;; - from the TEST_SYSTEM entity - } then { - the IUT entity sends a r404 - to the TEST_SYSTEM entity - } - } - } - - Test Purpose { - TP Id TP_mWT_PNC_PT_ETH_SVC_DELETE_BV_01 - - Test objective - "Verify that the IUT deletes an existing ethernet service." - - Reference - "ETSI GS mWT 024 Clause 4.2.2.1 Ethernet Ethernet Services", - "ETSI GS mWT 024 Clause 4.3.3", - "ETSI GS mWT 024 Annex A.2.4", - "RFC 6991 Common YANG Data Types", - "RFC 8776 Common YANG Data Types for Traffic Engineering", - "draft-ietf-ccamp-client-signal-yang-05 A YANG Data Model for Transport Network Client Signals" - - Config Id Config_mWT_2 - - PICS Selection IUT_PNC and RESTCONF and SEC_TLS and ABSTRACT_PT - - Initial conditions with { - the IUT entity is idle and - the IUT entity having discovered several MW ethernet networks topologies and - the IUT entity having a Bandwidth profile created and - the IUT entity having a service profile created - } - - Expected behaviour - ensure that { - when { - the IUT entity receives a vRequestDelete containing - uri indicating value "/restconf/data/ietf-eth-tran-service:etht-svc/etht-svc-instances={ETHT_SVC_NAME}", - headers containing - content_type indicating value "application/yang-data+xml";; - from the TEST_SYSTEM entity - } then { - the IUT entity sends a r204 - to the TEST_SYSTEM entity - } - } - } - - Test Purpose { - TP Id TP_mWT_PNC_PT_ETH_SVC_DELETE_BV_02 - - Test objective - "Verify that the IUT deletes an existing bandwidth profile." - - Reference - "ETSI GS mWT 024 Clause 4.2.2.1 Ethernet Ethernet Services", - "ETSI GS mWT 024 Clause 4.3.3", - "ETSI GS mWT 024 Annex A.2.4", - "RFC 6991 Common YANG Data Types", - "RFC 8776 Common YANG Data Types for Traffic Engineering", - "draft-ietf-ccamp-client-signal-yang-05 A YANG Data Model for Transport Network Client Signals" - - Config Id Config_mWT_2 - - PICS Selection IUT_PNC and RESTCONF and SEC_TLS and ABSTRACT_PT - - Initial conditions with { - the IUT entity is idle and - the IUT entity having discovered several MW ethernet networks topologies and - the IUT entity having a Bandwidth profile created - } - - Expected behaviour - ensure that { - when { - the IUT entity receives a vRequestDelete containing - uri indicating value "/restconf/data/ietf-eth-tran-service:etht-svc/globals/bandwitdh_profile_name={BANDWIDTH_PROFILE_NAME}", - headers containing - content_type indicating value "application/yang-data+xml";; - from the TEST_SYSTEM entity - } then { - the IUT entity sends a r204 - to the TEST_SYSTEM entity - } - } - } - - Test Purpose { - TP Id TP_mWT_PNC_PT_ETH_SVC_DELETE_BO_01 - - Test objective - "Verify that the IUT replies with an error code when the request is malformed." - - Reference - "ETSI GS mWT 024 Clause 4.3.3", - "ETSI GS mWT 024 Clause 5.3.2 Exception Handling", - "ETSI GS mWT 024 Annex A.2.4", - "RFC 6991 Common YANG Data Types", - "RFC 8776 Common YANG Data Types for Traffic Engineering", - "draft-ietf-ccamp-client-signal-yang-05 A YANG Data Model for Transport Network Client Signals" - - Config Id Config_mWT_2 - - PICS Selection IUT_PNC and RESTCONF and SEC_TLS and ABSTRACT_PT - - Initial conditions with { - the IUT entity is idle and - the IUT entity having discovered several MW ethernet networks topologies - } - - Expected behaviour - ensure that { - when { - the IUT entity receives a vRequestDelete containing - uri indicating value "/restconf/data/ietf-eth-tran-service:etht-svc/nstances={ETHT_SVC_NAME}"; // Malformed URI - from the TEST_SYSTEM entity - } then { - the IUT entity sends a r400 - to the TEST_SYSTEM entity - } - } - } - - Test Purpose { - TP Id TP_mWT_PNC_ETH_PT_SVC_DELETE_BO_02 - - Test objective - "Verify that the IUT replies with an error code when it is requested to delete an unknown Bandwidth profile." - - Reference - "ETSI GS mWT 024 Clause 4.3.3", - "ETSI GS mWT 024 Clause 5.3.2 Exception Handling", - "ETSI GS mWT 024 Annex A.2.4", - "RFC 6991 Common YANG Data Types", - "RFC 8776 Common YANG Data Types for Traffic Engineering", - "draft-ietf-ccamp-client-signal-yang-05 A YANG Data Model for Transport Network Client Signals" - - Config Id Config_mWT_2 - - PICS Selection IUT_PNC and RESTCONF and SEC_TLS and ABSTRACT_PT - - Initial conditions with { - the IUT entity is idle and - the IUT entity having discovered several MW ethernet networks topologies - } - - Expected behaviour - ensure that { - when { - the IUT entity receives a vRequestDelete containing - uri indicating value "/restconf/data/ietf-eth-tran-service:etht-svc/etht-svc-instances={UNKNOWN_ETHT_SVC_NAME}"; - from the TEST_SYSTEM entity - } then { - the IUT entity sends a r404 - to the TEST_SYSTEM entity - } - } - } - - } // End of Group "EthernetService" - - } // End of Group "PartiallyTransparent" - - } // End of Group "pnc" - +Package AtsMDSC { + + Group "mdsc" { + + } // End of Group "mdsc" + + Group "pnc" { + + Group "RESTCONF" { + + import all from mWT_Common; + + Test Purpose { + TP Id TP_mWT_PNC_RESTCONF_GET_BV_01 + + Test objective + "Verify that the IUT supports RESTCONF API request." + + Reference + "ETSI GS mWT 024 Clause 5.2.1 RESTCONF Protocol", + "RFC 8040 RESTCONF Protocol", + "RFC 8525 YANG Library" + + Config Id Config_mWT_2 + + PICS Selection IUT_PNC and RESTCONF and SEC_TLS + + Initial conditions with { + the IUT entity is idle + } + + Expected behaviour + ensure that { + when { + the IUT entity receives a vRequestGet containing + uri indicating value "/restconf/data/ietf-yang-library:module-set"; + from the TEST_SYSTEM entity + } then { + the IUT entity sends a r200 containing + headers containing + content_type indicating value "application/yang-data+xml";, + body containing + module_setate containing + name_ indicating value "ietf-yang-library:module-set", + modules containing + non empty list;;;; + to the TEST_SYSTEM entity + } + } + } + + Test Purpose { + TP Id TP_mWT_PNC_RESTCONF_GET_BV_02 + + Test objective + "Verify that the IUT supports the basic YANG data models." + + Reference + "ETSI GS mWT 024 Clause 5.2.1 RESTCONF Protocol", + "ETSI GS mWT 024 Clause 5.2.2 YANG Version", + "RFC 8040 RESTCONF Protocol", + "RFC 8525 YANG Library" + + Config Id Config_mWT_2 + + PICS Selection IUT_PNC and RESTCONF and SEC_TLS + + Initial conditions with { + the IUT entity is idle + } + + Expected behaviour + ensure that { + when { + the IUT entity receives a vRequestGet containing + uri indicating value "/restconf/data/ietf-yang-library:module-set"; + from the TEST_SYSTEM entity + } then { + the IUT entity sends a r200 containing + headers containing + content_type indicating value "application/yang-data+xml";, + body containing + module_setles_state containing + name_ indicating value "ietf-yang-library:module-set", + modules containing + entry containing + name_ indicating value "ietf-datastores", + revision indicating value "2018-02-14", + namespace indicating value "urn:ietf:params:xml:ns:yang:ietf-datastores";, + entry containing + name_ indicating value "ietf-inet-types", + revision indicating value "2013-07-15", + namespace indicating value "urn:ietf:params:xml:ns:yang:ietf-inet-types";, + entry containing + name_ indicating value "ietf-interfaces", + revision indicating value "2018-02-20", + namespace indicating value "urn:ietf:params:xml:ns:yang:ietf-interfaces";, + entry containing + name_ indicating value "ietf-ip", + revision indicating value "2018-02-22", + namespace indicating value "urn:ietf:params:xml:ns:yang:ietf-ip";, + entry containing + name_ indicating value "ietf-network-instance", + revision indicating value "2019-01-21", + namespace indicating value "urn:ietf:params:xml:ns:yang:ietf-network-instance";, + entry containing + name_ indicating value "ietf-restconf", + namespace indicating value "urn:ietf:params:xml:ns:yang:ietf-restconf";, + entry containing + name_ indicating value "ietf-yang-types", + revision indicating value "2013-07-15", + namespace indicating value "urn:ietf:params:xml:ns:yang:ietf-restconf";, + entry containing + name_ indicating value "ietf-yang-library", + revision indicating value "2019-01-04", + namespace indicating value "urn:ietf:params:xml:ns:yang:ietf-yang-library";;;;; + to the TEST_SYSTEM entity + } + } + } + + Test Purpose { + TP Id TP_mWT_PNC_RESTCONF_GET_BV_03 + + Test objective + "Verify that the IUT provides the list of supported mWT GS 024 YANG data models." + + Reference + "ETSI GS mWT 024 Clause 5.2.2.2 Common YANG data models", + "ETSI GS mWT 024 Clause 5.2.2.3 YANG Data Models at the Microwave MPI", + "ETSI GS mWT 024 Clause 5.2.2.4 Hierarchical relationship among YANG data models" + + Config Id Config_mWT_2 + + PICS Selection IUT_PNC and RESTCONF and SEC_TLS + + Initial conditions with { + the IUT entity is idle + } + + Expected behaviour + ensure that { + when { + the IUT entity receives a vRequestGet containing + uri indicating value "/restconf/data/ietf-yang-library:module-set"; + from the TEST_SYSTEM entity + } then { + the IUT entity sends a r200 containing + body containing + module_set modules_state containing + modules containing + entry containing + name_ indicating value "ietf-microwave-topology", + revision indicating value "2021-10-12", + schema indicating value "draft-ietf-ccamp-mw-topo-yang-02", + namespace indicating value "";, + entry containing + name_ indicating value "ietf-eth-te-topology", + revision indicating value "2019-11-18", + namespace indicating value "";, + entry containing + name_ indicating value "idraft-ietf-ccamp-client-signal-yang-06", + revision indicating value "", + namespace indicating value "";;;;; + to the TEST_SYSTEM entity + } + } + } + + } // End of Group Group "RESTCONF" + + Group "Blackbox" { + + import all from mWT_Common; + + Test Purpose { + TP Id TP_mWT_PNC_BB_MW_TOPO_GET_BV_01 + + Test objective + "Verify that the IUT does not provide any MW network topology." + + Reference + "ETSI GS mWT 024 Clause 4.3.2", + "ETSI GS mWT 024 Annex A.2.3", + "RFC 8345 A YANG Data Model for Network Topologies", + "RFC 8795 YANG Data Model for Traffic Engineering (TE) Topologies" + + Config Id Config_mWT_2 + + PICS Selection IUT_PNC and RESTCONF and SEC_TLS and ABSTRACT_BB + + Initial conditions with { + the IUT entity is idle + } + + Expected behaviour + ensure that { + when { + the IUT entity receives a vRequestGet containing + uri indicating value "/restconf/data/ietf-network:networks"; + from the TEST_SYSTEM entity + } then { + the IUT entity sends a r200 containing + headers containing + content_type indicating value "application/yang-data+xml";, + body containing + networks containing + networksList containing + name_ indicating value any_value, + networks containing + network_id indicating value any_value, + network_types containing + not te_topology + ;, + node_id indicating value any_value, + termination_points indicating value any_value, + links indicating value any_value + ;;;;; + to the TEST_SYSTEM entity + } + } + } + + Test Purpose { + TP Id TP_mWT_PNC_BB_MW_TOPO_GET_BV_02 + + Test objective + "Verify that the IUT provides a network list containing only one node." + + Reference + "ETSI GS mWT 024 Clause 4.3.2", + "ETSI GS mWT 024 Annex A.2.3", + "RFC 8345 A YANG Data Model for Network Topologies", + "RFC 8795 YANG Data Model for Traffic Engineering (TE) Topologies" + + Config Id Config_mWT_2 + + PICS Selection IUT_PNC and RESTCONF and SEC_TLS and ABSTRACT_BB + + Initial conditions with { + the IUT entity is idle + } + + Expected behaviour + ensure that { + when { + the IUT entity receives a vRequestGet containing + uri indicating value "/restconf/data/ietf-network:networks"; + from the TEST_SYSTEM entity + } then { + the IUT entity sends a r200 containing + headers containing + content_type indicating value "application/yang-data+xml";, + body containing + networks containing + networksList containing + one network node + ;;;; + to the TEST_SYSTEM entity + } + } + } + + Test Purpose { + TP Id TP_mWT_PNC_BB_MW_TOPO_GET_BV_03 + + Test objective + "Verify that the IUT provides a network list containing ietf-network entries." + + Reference + "ETSI GS mWT 024 Clause 4.3.2", + "ETSI GS mWT 024 Annex A.2.3", + "RFC 8345 A YANG Data Model for Network Topologies", + "RFC 8795 YANG Data Model for Traffic Engineering (TE) Topologies" + + Config Id Config_mWT_2 + + PICS Selection IUT_PNC and RESTCONF and SEC_TLS and ABSTRACT_BB + + Initial conditions with { + the IUT entity is idle + } + + Expected behaviour + ensure that { + when { + the IUT entity receives a vRequestGet containing + uri indicating value "/restconf/data/ietf-network:networks"; + from the TEST_SYSTEM entity + } then { + the IUT entity sends a r200 containing + headers containing + content_type indicating value "application/yang-data+xml";, + body containing + networks containing + networksList containing + one network node + ;;;; + to the TEST_SYSTEM entity + } + } + } + + } // End of Group "Blackbox" + + Group "PartiallyTransparent" { + + Group "MWTopologyDiscovery" { + + import all from mWT_Common; + + Test Purpose { + TP Id TP_mWT_PNC_PT_MW_TOPO_GET_BV_01 + + Test objective + "Verify that the IUT provides the MW network topology for all networks with mandatory mWT GC 024 data elements subset." + + Reference + "ETSI GS mWT 024 Clause 4.3.3", + "ETSI GS mWT 024 Annex A.2.2", + "RFC 8345 A YANG Data Model for Network Topologies", + "RFC 8795 YANG Data Model for Traffic Engineering (TE) Topologies", + "draft-ietf-ccamp-mw-topo-yang-02 A YANG Data Model for Microwave Topology" + + Config Id Config_mWT_2 + + PICS Selection IUT_PNC and RESTCONF and SEC_TLS and ABSTRACT_PT and MW_TOPO + + Initial conditions with { + the IUT entity is idle and + the IUT entity having discovered several MW ethernet networks topologies + } + + Expected behaviour + ensure that { + when { + the IUT entity receives a vRequestGet containing + uri indicating value "/restconf/data/ietf-network:networks/topologyId/mw-native-topology", + headers containing + content_type indicating value "application/yang-data+xml";; + from the TEST_SYSTEM entity + } then { + the IUT entity sends a r200 containing + headers containing + content_type indicating value "application/yang-data+xml";, + body containing + networks containing + networksList containing + name_ indicating value any_value, + networks containing + network_id indicating value any_value, + network_types containing + te_topology containing + mw_topology containing + mw_tp_choice indicating value any_value + ;;;, + node_id indicating value any_value, + termination_points indicating value any_value, + links indicating value any_value + ;;;;; + to the TEST_SYSTEM entity + } + } + } + + Test Purpose { + TP Id TP_mWT_PNC_PT_MW_TOPO_GET_BV_02 + + Test objective + "Verify that the IUT provides the MW network topology for a specific network with mandatory mWT GC 024 data elements subset." + + Reference + "ETSI GS mWT 024 Clause 4.3.3", + "ETSI GS mWT 024 Annex A.2.2.1", + "RFC 8345 A YANG Data Model for Network Topologies", + "RFC 8795 YANG Data Model for Traffic Engineering (TE) Topologies" + + Config Id Config_mWT_2 + + PICS Selection IUT_PNC and RESTCONF and SEC_TLS and ABSTRACT_PT and MW_TOPO + + Initial conditions with { + the IUT entity is idle and + the IUT entity having discovered a network topology NETWORK_TOPO + } + + Expected behaviour + ensure that { + when { + the IUT entity receives a vRequestGet containing + uri indicating value "/restconf/data/ietf-microwave-topology/ietf-network:networks/network={NETWORK_ID)/topologyId/mw-native-topology", + headers containing + content_type indicating value "application/yang-data+xml";; + from the TEST_SYSTEM entity + } then { + the IUT entity sends a r200 containing + headers containing + content_type indicating value "application/yang-data+xml";, + body containing + networks containing + network_id indicating value NETWORK_ID, + network_types containing + te_topology containing + mw_topology containing + mw_tp_choice indicating value any_value + ;;;, + node_id indicating value any_value, + termination_points indicating value any_value, + links indicating value any_value + ;;; + to the TEST_SYSTEM entity + } + } + } + + Test Purpose { + TP Id TP_mWT_PNC_PT_MW_TOPO_GET_BO_01 + + Test objective + "Verify that the IUT replies with an error code when the request is malformed." + + Reference + "ETSI GS mWT 024 Clause 4.3.3", + "ETSI GS mWT 024 Clause 5.3.2 Exception Handling", + "ETSI GS mWT 024 Annex A.2.2", + "RFC 8345 A YANG Data Model for Network Topologies", + "RFC 8795 YANG Data Model for Traffic Engineering (TE) Topologies" + + Config Id Config_mWT_2 + + PICS Selection IUT_PNC and RESTCONF and SEC_TLS and ABSTRACT_PT and MW_TOPO + + Initial conditions with { + the IUT entity is idle and + the IUT entity having discovered a network topology NETWORK_TOPO + } + + Expected behaviour + ensure that { + when { + the IUT entity receives a vRequestGet containing + uri indicating value "/restconf/data/networks"; // Malformed URI + from the TEST_SYSTEM entity + } then { + the IUT entity sends a r400 + to the TEST_SYSTEM entity + } + } + } + + Test Purpose { + TP Id TP_mWT_PNC_PT_MW_TOPO_GET_BO_02 + + Test objective + "Verify that the IUT replies with an error code when the network identifier is unknown." + + Reference + "ETSI GS mWT 024 Clause 4.3.3", + "ETSI GS mWT 024 Clause 5.3.2 Exception Handling", + "ETSI GS mWT 024 Annex A.2.2", + "RFC 8345 A YANG Data Model for Network Topologies", + "RFC 8795 YANG Data Model for Traffic Engineering (TE) Topologies" + + Config Id Config_mWT_2 + + PICS Selection IUT_PNC and RESTCONF and SEC_TLS and ABSTRACT_PT and MW_TOPO + + Initial conditions with { + the IUT entity is idle and + the IUT entity having discovered a network topology NETWORK_TOPO + } + + Expected behaviour + ensure that { + when { + the IUT entity receives a vRequestGet containing + uri indicating value "/restconf/data/ietf-network:networks/network={UNKNOWN_NETWORK_ID)/topologyId/mw-native-topology"; + from the TEST_SYSTEM entity + } then { + the IUT entity sends a r404 + to the TEST_SYSTEM entity + } + } + } + + Test Purpose { + TP Id TP_mWT_PNC_PT_MW_NODE_GET_BV_01 + + Test objective + "Verify that the IUT provides the MW network topology for all nodes with mandatory mWT GC 024 data elements subset." + + Reference + "ETSI GS mWT 024 Clause 4.3.3", + "ETSI GS mWT 024 Annex A.2.2.1", + "RFC 8345 A YANG Data Model for Network Topologies", + "RFC 8795 YANG Data Model for Traffic Engineering (TE) Topologies", + "draft-ietf-ccamp-mw-topo-yang-02 A YANG Data Model for Microwave Topology" + + Config Id Config_mWT_2 + + PICS Selection IUT_PNC and RESTCONF and SEC_TLS and ABSTRACT_PT and MW_TOPO + + Initial conditions with { + the IUT entity is idle and + the IUT entity having discovered several MW ethernet networks topologies + } + + Expected behaviour + ensure that { + when { + the IUT entity receives a vRequestGet containing + uri indicating value "/restconf/data/ietf-microwave-topology/ietf-network:networks/network={NETWORK_ID)/node/topologyId/mw-native-topology"; + from the TEST_SYSTEM entity + } then { + the IUT entity sends a r200 containing + headers containing + content_type indicating value "application/yang-data+xml";, + body containing + networks containing + networksList containing + name_ indicating value any_value, + networks containing + network_id indicating value any_value, + network_types containing + te_topology containing + mw_native_topology indicating value any_value + ;;, + node_id indicating value any_value, + termination_points indicating value any_value, + links indicating value any_value + ;;;;; + to the TEST_SYSTEM entity + } + } + } + + Test Purpose { + TP Id TP_mWT_PNC_PT_MW_NODE_GET_BV_02 + + Test objective + "Verify that the IUT provides the MW network topology for a specific node with mandatory mWT GC 024 data elements subset." + + Reference + "ETSI GS mWT 024 Clause 4.3.3", + "ETSI GS mWT 024 Annex A.2.2.1", + "RFC 8345 A YANG Data Model for Network Topologies", + "RFC 8795 YANG Data Model for Traffic Engineering (TE) Topologies", + "draft-ietf-ccamp-mw-topo-yang-02 A YANG Data Model for Microwave Topology" + + Config Id Config_mWT_2 + + PICS Selection IUT_PNC and RESTCONF and SEC_TLS and ABSTRACT_PT and MW_TOPO + + Initial conditions with { + the IUT entity is idle and + the IUT entity having discovered several MW ethernet networks topologies + } + + Expected behaviour + ensure that { + when { + the IUT entity receives a vRequestGet containing + uri indicating value "/restconf/data/ietf-microwave-topology/ietf-network:networks/network={NETWORK_ID)/node={NODE_ID}/topologyId/mw-native-topology"; + from the TEST_SYSTEM entity + } then { + the IUT entity sends a r200 containing + headers containing + content_type indicating value "application/yang-data+xml";, + body containing + networks containing + networksList containing + name_ indicating value any_value, + networks containing + network_id indicating value NETWORK_ID, + network_types containing + te_topology containing + mw_native_topology indicating value any_value + ;;, + node_id indicating value NODE_ID, + termination_points indicating value any_value, + links indicating value any_value + ;;;;; + to the TEST_SYSTEM entity + } + } + } + + Test Purpose { + TP Id TP_mWT_PNC_PT_MW_NODE_GET_BO_01 + + Test objective + "Verify that the IUT replies with an error code when the node identifier is unknown." + + Reference + "ETSI GS mWT 024 Clause 4.3.3", + "ETSI GS mWT 024 Clause 5.3.2 Exception Handling", + "ETSI GS mWT 024 Annex A.2.2", + "RFC 8345 A YANG Data Model for Network Topologies", + "RFC 8795 YANG Data Model for Traffic Engineering (TE) Topologies", + "draft-ietf-ccamp-mw-topo-yang-02 A YANG Data Model for Microwave Topology" + + Config Id Config_mWT_2 + + PICS Selection IUT_PNC and RESTCONF and SEC_TLS and ABSTRACT_PT and MW_TOPO + + Initial conditions with { + the IUT entity is idle and + the IUT entity having discovered several MW ethernet networks topologies + } + + Expected behaviour + ensure that { + when { + the IUT entity receives a vRequestGet containing + uri indicating value "/restconf/data/ietf-microwave-topology/ietf-network:networks/network={NETWORK_ID)/node={UNKNOWN_NODE_ID}/topologyId/mw-native-topology"; + from the TEST_SYSTEM entity + } then { + the IUT entity sends a r404 + to the TEST_SYSTEM entity + } + } + } + + } // End of Group "MWTopologyDiscovery" + + Group "EthernetTopologyDiscovery" { + + import all from mWT_Common; + + Test Purpose { + TP Id TP_mWT_PNC_PT_ETH_TOPO_NETWORK_GET_BV_01 + + Test objective + "Verify that the IUT provides the Ethernet network topology for all networks with mandatory mWT GC 024 data elements subset." + + Reference + "ETSI GS mWT 024 Clause 4.3.3", + "ETSI GS mWT 024 Annex A.2.2", + "RFC 8345 A YANG Data Model for Network Topologies", + "RFC 8795 YANG Data Model for Traffic Engineering (TE) Topologies", + "draft-ietf-ccamp-mw-topo-yang-02 A YANG Data Model for Microwave Topology" + + Config Id Config_mWT_2 + + PICS Selection IUT_PNC and RESTCONF and SEC_TLS and ABSTRACT_PT and ETH_TOPO + + Initial conditions with { + the IUT entity is idle and + the IUT entity having discovered several MW ethernet networks topologies + } + + Expected behaviour + ensure that { + when { + the IUT entity receives a vRequestGet containing + uri indicating value "/restconf/data/ietf-network:networks", + headers containing + content_type indicating value "application/yang-data+xml";; + from the TEST_SYSTEM entity + } then { + the IUT entity sends a r200 containing + headers containing + content_type indicating value "application/yang-data+xml";, + body containing + networks containing + networksList containing + name_ indicating value any_value, + networks containing + network_id indicating value any_value, + network_types containing + te_topology containing + mw_topology containing + mw_tp_choice indicating value any_value + ;;;, + node_id indicating value any_value, + termination_points indicating value any_value, + links indicating value any_value + ;;;;; + to the TEST_SYSTEM entity + } + } + } + + Test Purpose { + TP Id TP_mWT_PNC_PT_ETH_TOPO_NETWORK_GET_BV_02 + + Test objective + "Verify that the IUT provides the Ethernet network topology for a specific network with mandatory mWT GC 024 data elements subset." + + Reference + "ETSI GS mWT 024 Clause 4.3.3", + "ETSI GS mWT 024 Annex A.1.2", + "RFC 8345 A YANG Data Model for Network Topologies", + "RFC 8795 YANG Data Model for Traffic Engineering (TE) Topologies" + + Config Id Config_mWT_2 + + PICS Selection IUT_PNC and RESTCONF and SEC_TLS and ABSTRACT_PT and ETH_TOPO + + Initial conditions with { + the IUT entity is idle and + the IUT entity having discovered a network topology NETWORK_TOPO + } + + Expected behaviour + ensure that { + when { + the IUT entity receives a vRequestGet containing + uri indicating value "/restconf/data/ietf-network:networks/network={NETWORK_ID}", + headers containing + content_type indicating value "application/yang-data+xml";; + from the TEST_SYSTEM entity + } then { + the IUT entity sends a r200 containing + headers containing + content_type indicating value "application/yang-data+xml";, + body containing + networks containing + network_id indicating value NETWORK_ID, + network_types containing + te_topology indicating value any_value;, + node_id indicating value any_value, + termination_points indicating value any_value, + links indicating value any_value + ;;; + to the TEST_SYSTEM entity + } + } + } + + Test Purpose { + TP Id TP_mWT_PNC_PT_ETH_TOPO_NETWORK_GET_BO_01 + + Test objective + "Verify that the IUT replies with an error code when the request is malformed." + + Reference + "ETSI GS mWT 024 Clause 4.3.3", + "ETSI GS mWT 024 Clause 5.3.2 Exception Handling", + "ETSI GS mWT 024 Annex A.1.2", + "RFC 8345 A YANG Data Model for Network Topologies", + "RFC 8795 YANG Data Model for Traffic Engineering (TE) Topologies" + + Config Id Config_mWT_2 + + PICS Selection IUT_PNC and RESTCONF and SEC_TLS and ABSTRACT_PT and ETH_TOPO + + Initial conditions with { + the IUT entity is idle and + the IUT entity having discovered a network topology NETWORK_TOPO + } + + Expected behaviour + ensure that { + when { + the IUT entity receives a vRequestGet containing + uri indicating value "/restconf/data/networks/{NETWORK_ID}"; // Malformed URI + from the TEST_SYSTEM entity + } then { + the IUT entity sends a r400 + to the TEST_SYSTEM entity + } + } + } + + Test Purpose { + TP Id TP_mWT_PNC_PT_ETH_TOPO_NETWORK_GET_BO_02 + + Test objective + "Verify that the IUT replies with an error code when the network identifier is unknown." + + Reference + "ETSI GS mWT 024 Clause 4.3.3", + "ETSI GS mWT 024 Clause 5.3.2 Exception Handling", + "ETSI GS mWT 024 Annex A.1.2", + "RFC 8345 A YANG Data Model for Network Topologies", + "RFC 8795 YANG Data Model for Traffic Engineering (TE) Topologies" + + Config Id Config_mWT_2 + + PICS Selection IUT_PNC and RESTCONF and SEC_TLS and ABSTRACT_PT and ETH_TOPO + + Initial conditions with { + the IUT entity is idle and + the IUT entity having discovered a network topology NETWORK_TOPO + } + + Expected behaviour + ensure that { + when { + the IUT entity receives a vRequestGet containing + uri indicating value "/restconf/data/ietf-network:networks/network={UNKNOWN_NETWORK_ID}"; + from the TEST_SYSTEM entity + } then { + the IUT entity sends a r404 + to the TEST_SYSTEM entity + } + } + } + + Test Purpose { + TP Id TP_mWT_PNC_PT_ETH_TOPO_NODE_GET_BV_01 + + Test objective + "Verify that the IUT provides the Ethernet network topology for all nodes with mandatory mWT GC 024 data elements subset." + + Reference + "ETSI GS mWT 024 Clause 4.3.3", + "ETSI GS mWT 024 Annex A.2.2", + "RFC 8345 A YANG Data Model for Network Topologies", + "RFC 8795 YANG Data Model for Traffic Engineering (TE) Topologies", + "draft-ietf-ccamp-mw-topo-yang-02 A YANG Data Model for Microwave Topology" + + Config Id Config_mWT_2 + + PICS Selection IUT_PNC and RESTCONF and SEC_TLS and ABSTRACT_PT and ETH_TOPO + + Initial conditions with { + the IUT entity is idle and + the IUT entity having discovered several MW ethernet networks topologies + } + + Expected behaviour + ensure that { + when { + the IUT entity receives a vRequestGet containing + uri indicating value "/restconf/data/ietf-network:networks/network={NETWORK_ID}/node"; + from the TEST_SYSTEM entity + } then { + the IUT entity sends a r200 containing + headers containing + content_type indicating value "application/yang-data+xml";, + body containing + networks containing + networksList containing + name_ indicating value any_value, + networks containing + network_id indicating value any_value, + network_types containing + te_topology containing + mw_topology containing + mw_tp_choice indicating value any_value + ;;;, + node_id indicating value any_value, + termination_points indicating value any_value, + links indicating value any_value + ;;;;; + to the TEST_SYSTEM entity + } + } + } + + Test Purpose { + TP Id TP_mWT_PNC_PT_ETH_NODE_GET_BV_02 + + Test objective + "Verify that the IUT provides the Ethernet network topology for specific node with mandatory mWT GC 024 data elements subset." + + Reference + "ETSI GS mWT 024 Clause 4.3.3", + "ETSI GS mWT 024 Annex A.2.2", + "RFC 8345 A YANG Data Model for Network Topologies", + "RFC 8795 YANG Data Model for Traffic Engineering (TE) Topologies", + "draft-ietf-ccamp-mw-topo-yang-02 A YANG Data Model for Microwave Topology" + + Config Id Config_mWT_2 + + PICS Selection IUT_PNC and RESTCONF and SEC_TLS and ABSTRACT_PT and ETH_TOPO + + Initial conditions with { + the IUT entity is idle and + the IUT entity having discovered several MW ethernet networks topologies + } + + Expected behaviour + ensure that { + when { + the IUT entity receives a vRequestGet containing + uri indicating value "/restconf/data/ietf-network:networks/network={NETWORK_ID}/node={NODE_ID}"; + from the TEST_SYSTEM entity + } then { + the IUT entity sends a r200 containing + headers containing + content_type indicating value "application/yang-data+xml";, + body containing + networks containing + networksList containing + name_ indicating value any_value, + networks containing + network_id indicating value any_value, + network_types containing + te_topology containing + mw_topology containing + mw_tp_choice indicating value any_value + ;;;, + node_id indicating value any_value, + termination_points indicating value any_value, + links indicating value any_value + ;;;;; + to the TEST_SYSTEM entity + } + } + } + + Test Purpose { + TP Id TP_mWT_PNC_PT_ETH_NODE_GET_BO_01 + + Test objective + "Verify that the IUT replies with an error code when the node identifier is unknown." + + Reference + "ETSI GS mWT 024 Clause 4.3.3", + "ETSI GS mWT 024 Clause 5.3.2 Exception Handling", + "ETSI GS mWT 024 Annex A.2.2", + "RFC 8345 A YANG Data Model for Network Topologies", + "RFC 8795 YANG Data Model for Traffic Engineering (TE) Topologies", + "draft-ietf-ccamp-mw-topo-yang-02 A YANG Data Model for Microwave Topology" + + Config Id Config_mWT_2 + + PICS Selection IUT_PNC and RESTCONF and SEC_TLS and ABSTRACT_PT and ETH_TOPO + + Initial conditions with { + the IUT entity is idle and + the IUT entity having discovered several MW ethernet networks topologies + } + + Expected behaviour + ensure that { + when { + the IUT entity receives a vRequestGet containing + uri indicating value "/restconf/data/ietf-network:networks/network={NETWORK_ID}/node={UNKNOWN_NODE_ID}"; + from the TEST_SYSTEM entity + } then { + the IUT entity sends a r404 + to the TEST_SYSTEM entity + } + } + } + + } // End of Group "EthernetTopologyDiscovery" + + Group "EthernetService" { + + import all from mWT_Common; + + Test Purpose { + TP Id TP_mWT_PNC_PT_ETH_SVC_GET_BV_01 + + Test objective + "Verify that the IUT provides all the Bandwidth profiles with mandatory mWT GC 024 data elements subset." + + Reference + "ETSI GS mWT 024 Clause 4.3.3", + "ETSI GS mWT 024 Annex A.2.2", + "RFC 8345 A YANG Data Model for Network Topologies", + "RFC 8795 YANG Data Model for Traffic Engineering (TE) Topologies", + "draft-ietf-ccamp-client-signal-yang-05 A YANG Data Model for Transport Network Client Signals" + + Config Id Config_mWT_2 + + PICS Selection IUT_PNC and RESTCONF and SEC_TLS and ABSTRACT_PT + + Initial conditions with { + the IUT entity is idle and + the IUT entity having discovered several MW ethernet networks topologies and + the IUT entity having a Bandwidth profile created and + the IUT entity having a service profile created + } + + Expected behaviour + ensure that { + when { + the IUT entity receives a vRequestGet containing + uri indicating value "/restconf/data/ietf-eth-tran-service:etht-svc/globals"; + from the TEST_SYSTEM entity + } then { + the IUT entity sends a r200 containing + headers containing + content_type indicating value "application/yang-data+xml";, + body containing + eth_svc containing + globals containing + band_width_profiles containing + band_width_profile indicating value BAND_WIDTH_PROFILE + ;;, + ethtSvcInstanceList containing + ethtSvcInstance containing + name_ indicating value any_value, + title indicating value any_value, + desc indicating value any_value, + customer indicating value any_value + ;;;;; + to the TEST_SYSTEM entity + } + } + } + + Test Purpose { + TP Id TP_mWT_PNC_PT_ETH_SVC_GET_BO_01 + + Test objective + "Verify that the IUT replies with an error code when the request is malformed." + + Reference + "ETSI GS mWT 024 Clause 4.2.2.1 Ethernet Ethernet Services", + "ETSI GS mWT 024 Clause 4.3.3", + "ETSI GS mWT 024 Clause 5.3.2 Exception Handling", + "ETSI GS mWT 024 Annex A.2.4", + "RFC 6991 Common YANG Data Types", + "RFC 8776 Common YANG Data Types for Traffic Engineering", + "draft-ietf-ccamp-client-signal-yang-05 A YANG Data Model for Transport Network Client Signals" + + Config Id Config_mWT_2 + + PICS Selection IUT_PNC and RESTCONF and SEC_TLS and ABSTRACT_PT + + Initial conditions with { + the IUT entity is idle and + the IUT entity having discovered several MW ethernet networks topologies + } + + Expected behaviour + ensure that { + when { + the IUT entity receives a vRequestGet containing + uri indicating value "/restconf/data/tran-service:etht-svc/globals"; // Malformed URI + from the TEST_SYSTEM entity + } then { + the IUT entity sends a r400 + to the TEST_SYSTEM entity + } + } + } + + Test Purpose { + TP Id TP_mWT_PNC_PT_ETH_SVC_POST_BV_01 + + Test objective + "Verify that the IUT creates a new Bandwidth profile with mandatory mWT GC 024 data elements subset." + + Reference + "ETSI GS mWT 024 Clause 4.2.2.1 Ethernet Ethernet Services", + "ETSI GS mWT 024 Clause 4.3.3", + "ETSI GS mWT 024 Annex A.2.4", + "RFC 6991 Common YANG Data Types", + "RFC 8776 Common YANG Data Types for Traffic Engineering", + "draft-ietf-ccamp-client-signal-yang-05 A YANG Data Model for Transport Network Client Signals" + + Config Id Config_mWT_2 + + PICS Selection IUT_PNC and RESTCONF and SEC_TLS and ABSTRACT_PT and not BWP_SVS_IN_ONE_REQUEST + + Initial conditions with { + the IUT entity is idle and + the IUT entity having discovered several MW ethernet networks topologies and + the IUT entity not having a Bandwidth profile created + } + + Expected behaviour + ensure that { + when { + the IUT entity receives a vRequestPost containing + uri indicating value "/restconf/data/ietf-eth-tran-service:etht-svc/globals", + body containing + eth_svc containing + ethtSvcInstanceList containing + ethtSvcInstance containing + name_ indicating value ETHT_SVC_NAME, + title indicating value any_value, + desc indicating value any_value, + customer indicating value any_value + ;;;;; + from the TEST_SYSTEM entity + } then { + the IUT entity sends a r201 containing + headers containing + content_type indicating value "application/yang-data+xml";, + body containing + eth_svc containing + ethtSvcInstanceList containing + ethtSvcInstance containing + name_ indicating value ETHT_SVC_NAME, + title indicating value any_value, + desc indicating value any_value, + customer indicating value any_value + ;;;;; + to the TEST_SYSTEM entity + } + } + } + + Test Purpose { + TP Id TP_mWT_PNC_PT_ETH_SVC_POST_BV_02_01 + + Test objective + "Verify that the IUT creates a new ethernet service with mandatory mWT GC 024 data elements subset." + + Reference + "ETSI GS mWT 024 Clause 4.2.2.1 Ethernet Ethernet Services", + "ETSI GS mWT 024 Clause 4.3.3", + "ETSI GS mWT 024 Annex A.2.4", + "RFC 6991 Common YANG Data Types", + "RFC 8776 Common YANG Data Types for Traffic Engineering", + "draft-ietf-ccamp-client-signal-yang-05 A YANG Data Model for Transport Network Client Signals" + + Config Id Config_mWT_2 + + PICS Selection IUT_PNC and RESTCONF and SEC_TLS and ABSTRACT_PT and not BWP_SVS_IN_ONE_REQUEST + + Initial conditions with { + the IUT entity is idle and + the IUT entity having discovered several MW ethernet networks topologies and + the IUT entity having a Bandwidth profile created and + the IUT entity not having a service profile created + } + + Expected behaviour + ensure that { + when { + the IUT entity receives a vRequestPost containing + uri indicating value "/restconf/data/ietf-eth-tran-service:etht-svc", + headers containing + content_type indicating value "application/yang-data+xml";, + body containing + eth_svc containing + ethtSvcInstanceList containing + ethtSvcInstance containing + name_ indicating value ETHT_SVC_NAME, + title indicating value any_value, + desc indicating value any_value, + customer indicating value any_value + ;;;;; + from the TEST_SYSTEM entity + } then { + the IUT entity sends a r201 containing + headers containing + content_type indicating value "application/yang-data+xml";, + body containing + eth_svc containing + ethtSvcInstanceList containing + ethtSvcInstance containing + name_ indicating value ETHT_SVC_NAME, + title indicating value any_value, + desc indicating value any_value, + customer indicating value any_value + ;, + ethtSvcInstance containing + name_ indicating value ETHT_SVC_NAME, + title indicating value ETH_SVC_TITLE, + desc indicating value ETH_SVC_DESC, + customer indicating value ETH_SVC_CUSTOMER + ;;;;; + to the TEST_SYSTEM entity + } + } + } + + Test Purpose { + TP Id TP_mWT_PNC_PT_ETH_SVC_POST_BV_02_02 + + Test objective + "Verify that the IUT creates successfully a new Bandwidth profile." + + Reference + "ETSI GS mWT 024 Clause 4.3.3", + "ETSI GS mWT 024 Annex A.2.2", + "RFC 8345 A YANG Data Model for Network Topologies", + "RFC 8795 YANG Data Model for Traffic Engineering (TE) Topologies", + "draft-ietf-ccamp-client-signal-yang-05 A YANG Data Model for Transport Network Client Signals" + + Config Id Config_mWT_2 + + PICS Selection IUT_PNC and RESTCONF and SEC_TLS and ABSTRACT_PT and not BWP_SVS_IN_ONE_REQUEST + + Initial conditions with { + the IUT entity is idle and + the IUT entity having discovered several MW ethernet networks topologies and + the IUT entity having a Bandwidth profile created and + the IUT entity not having a Bandwidth profile containing + bandwidthProfileName indicating value SDN_BANDWIDTH_PROFILE_NAME; and + the IUT entity having a service profile created + } + + Expected behaviour + ensure that { + when { + the IUT entity receives a vRequestPost containing + uri indicating value "/restconf/data/ietf-eth-tran-service:etht-svc/globals", + headers containing + content_type indicating value "application/yang-data+xml";, + body containing + bandwidthProfiles containing + bandwidthProfileName indicating value SDN_BANDWIDTH_PROFILE_NAME, + bandwidthProfileType indicating value SDN_SERVICE_TYPE, + bandwidthProfileCir indicating value CIR, + bandwidthProfileEir indicating value EIR, + bandwidthProfileColorAware indicating value COLOR_AWARE, + bandwidthCouplingFlag indicating value true + ;;; + from the TEST_SYSTEM entity + } then { + the IUT entity sends a r201 containing + headers containing + content_type indicating value "application/yang-data+xml";, + body containing + bandwidthProfiles containing + bandwidthProfileName indicating value SDN_BANDWIDTH_PROFILE_NAME, + bandwidthProfileType indicating value SDN_SERVICE_TYPE, + bandwidthProfileCir indicating value CIR, + bandwidthProfileEir indicating value EIR, + bandwidthProfileColorAware indicating value COLOR_AWARE, + bandwidthCouplingFlag indicating value true + ;;; + to the TEST_SYSTEM entity + } + } + } + + Test Purpose { + TP Id TP_mWT_PNC_PT_ETH_SVC_POST_BV_03 + + Test objective + "Verify that the IUT creates a new Bandwidth profile and and a new ethernet service in one POST with mandatory mWT GC 024 data elements subset." + + Reference + "ETSI GS mWT 024 Clause 4.2.2.1 Ethernet Ethernet Services", + "ETSI GS mWT 024 Clause 4.3.3", + "ETSI GS mWT 024 Annex A.2.4", + "RFC 6991 Common YANG Data Types", + "RFC 8776 Common YANG Data Types for Traffic Engineering", + "draft-ietf-ccamp-client-signal-yang-05 A YANG Data Model for Transport Network Client Signals" + + Config Id Config_mWT_2 + + PICS Selection IUT_PNC and RESTCONF and SEC_TLS and ABSTRACT_PT and BWP_SVS_IN_ONE_REQUEST + + Initial conditions with { + the IUT entity is idle and + the IUT entity having discovered several MW ethernet networks topologies and + the IUT entity not having a Bandwidth profile created + } + + Expected behaviour + ensure that { + when { + the IUT entity receives a vRequestPost containing + uri indicating value "/restconf/data/ietf-eth-tran-service:etht-svc/globals", + headers containing + content_type indicating value "application/yang-data+xml", + body containing + eth_svc containing + ethtSvcInstanceList containing + ethtSvcInstance containing + name_ indicating value ETHT_SVC_NAME, + title indicating value ETH_SVC_TITLE, + desc indicating value ETH_SVC_DESC, + customer indicating value ETH_SVC_CUSTOMER, + ingress_egress_bandwidth_profile containing + bandwidth_profile_type indicating value BANDWIDTH_PROFILE_TYPE, + cir indicating value CIR, + eir indicating value EIR + ;;;;;;; + from the TEST_SYSTEM entity + } then { + the IUT entity sends a r201 containing + headers containing + content_type indicating value "application/yang-data+xml";, + body containing + eth_svc containing + ethtSvcInstanceList containing + ethtSvcInstance containing + name_ indicating value ETHT_SVC_NAME, + title indicating value ETH_SVC_TITLE, + desc indicating value ETH_SVC_DESC, + customer indicating value ETH_SVC_CUSTOMER + ;;;;; + to the TEST_SYSTEM entity + } + } + } + + Test Purpose { + TP Id TP_mWT_PNC_PT_ETH_SVC_POST_BO_01 + + Test objective + "Verify that the IUT replies with an error when the request is malformed." + + Reference + "ETSI GS mWT 024 Clause 4.3.3", + "ETSI GS mWT 024 Clause 5.3.2 Exception Handling", + "ETSI GS mWT 024 Annex A.2.4", + "RFC 6991 Common YANG Data Types", + "RFC 8776 Common YANG Data Types for Traffic Engineering", + "draft-ietf-ccamp-client-signal-yang-05 A YANG Data Model for Transport Network Client Signals" + + Config Id Config_mWT_2 + + PICS Selection IUT_PNC and RESTCONF and SEC_TLS and ABSTRACT_PT and not BWP_SVS_IN_ONE_REQUEST + + Initial conditions with { + the IUT entity is idle and + the IUT entity having discovered several MW ethernet networks topologies + } + + Expected behaviour + ensure that { + when { + the IUT entity receives a vRequestPost containing + uri indicating value "/restconf/data/etht-svc/globals", // Malformed URI + body containing + eth_svc containing + ethtSvcInstanceList containing + ethtSvcInstance containing + name_ indicating value ETHT_SVC_NAME, + title indicating value ETH_SVC_TITLE, + desc indicating value ETH_SVC_DESC, + customer indicating value ETH_SVC_CUSTOMER + ;;;;; + from the TEST_SYSTEM entity + } then { + the IUT entity sends a r400 + to the TEST_SYSTEM entity + } + } + } + + Test Purpose { + TP Id TP_mWT_PNC_PT_ETH_SVC_PUT_BV_01 + + Test objective + "Verify that the IUT updates an existing Bandwidth profile with mandatory mWT GC 024 data elements subset." + + Reference + "ETSI GS mWT 024 Clause 4.2.2.1 Ethernet Ethernet Services", + "ETSI GS mWT 024 Clause 4.3.3", + "ETSI GS mWT 024 Annex A.2.4", + "RFC 6991 Common YANG Data Types", + "RFC 8776 Common YANG Data Types for Traffic Engineering", + "draft-ietf-ccamp-client-signal-yang-05 A YANG Data Model for Transport Network Client Signals" + + Config Id Config_mWT_2 + + PICS Selection IUT_PNC and RESTCONF and SEC_TLS and ABSTRACT_PT + + Initial conditions with { + the IUT entity is idle and + the IUT entity having discovered several MW ethernet networks topologies and + the IUT entity having a Bandwidth profile created + } + + Expected behaviour + ensure that { + when { + the IUT entity receives a vRequestPut containing + uri indicating value "/restconf/data/ietf-eth-tran-service:etht-svc/globals", + headers containing + content_type indicating value "application/yang-data+xml";, + body containing + eth_svc containing + globals containing + namedBandwidthProfile containing + bandwidth_profile_name indicating value BANDWIDTH_PROFILE_NAME, + CIR indicating value CIR_VALUE, + CBS indicating value CBS_VALUE, + EIR indicating value EIR_VALUE, + EBS indicating value EBS_VALUE, + color_aware indicating value COLOR_AWARE, + coupling_flag indicating value COUPLING_FLAG + ;;;;; + from the TEST_SYSTEM entity + } then { + the IUT entity sends a r201 containing + headers containing + content_type indicating value "application/yang-data+xml";, + body containing + eth_svc containing + globals containing + namedBandwidthProfile containing + bandwidth_profile_name indicating value BANDWIDTH_PROFILE_NAME, + CIR indicating value CIR_VALUE, + CBS indicating value CBS_VALUE, + EIR indicating value EIR_VALUE, + EBS indicating value EBS_VALUE, + color_aware indicating value COLOR_AWARE, + coupling_flag indicating value COUPLING_FLAG + ;;;;; + to the TEST_SYSTEM entity + } + } + } + + Test Purpose { + TP Id TP_mWT_PNC_PT_ETH_SVC_PUT_BV_02 + + Test objective + "Verify that the IUT updates an existing ethernet service." + + Reference + "ETSI GS mWT 024 Clause 4.2.2.1 Ethernet Ethernet Services", + "ETSI GS mWT 024 Clause 4.3.3", + "ETSI GS mWT 024 Annex A.2.4", + "RFC 6991 Common YANG Data Types", + "RFC 8776 Common YANG Data Types for Traffic Engineering", + "draft-ietf-ccamp-client-signal-yang-05 A YANG Data Model for Transport Network Client Signals" + + Config Id Config_mWT_2 + + PICS Selection IUT_PNC and RESTCONF and SEC_TLS and ABSTRACT_PT + + Initial conditions with { + the IUT entity is idle and + the IUT entity having discovered several MW ethernet networks topologies and + the IUT entity having a Bandwidth profile created + } + + Expected behaviour + ensure that { + when { + the IUT entity receives a vRequestPut containing + uri indicating value "/restconf/data/ietf-eth-tran-service:etht-svc/globals", + headers containing + content_type indicating value "application/yang-data+xml";, + body containing + eth_svc containing + ethtSvcInstanceList containing + ethtSvcInstance containing + name_ indicating value ETHT_SVC_NAME, + title indicating value ETH_SVC_TITLE, + desc indicating value ETH_SVC_DESC, + customer indicating value ETH_SVC_CUSTOMER + ;;;;; + from the TEST_SYSTEM entity + } then { + the IUT entity sends a r201 containing + headers containing + content_type indicating value "application/yang-data+xml";, + body containing + eth_svc containing + ethtSvcInstanceList containing + ethtSvcInstance containing + name_ indicating value ETHT_SVC_NAME, + title indicating value ETH_SVC_TITLE, + desc indicating value ETH_SVC_DESC, + customer indicating value ETH_SVC_CUSTOMER + ;;;;; + to the TEST_SYSTEM entity + } + } + } + + Test Purpose { + TP Id TP_mWT_PNC_PT_ETH_SVC_PUT_BO_01 + + Test objective + "Verify that the IUT replies with an error code when updating an unknown Bandwidth profile with mandatory mWT GC 024 data elements subset." + + Reference + "ETSI GS mWT 024 Clause 5.3.2 Exception Handling", + "ETSI GS mWT 024 Clause 4.3.3", + "ETSI GS mWT 024 Annex A.2.4", + "RFC 6991 Common YANG Data Types", + "RFC 8776 Common YANG Data Types for Traffic Engineering", + "draft-ietf-ccamp-client-signal-yang-05 A YANG Data Model for Transport Network Client Signals" + + Config Id Config_mWT_2 + + PICS Selection IUT_PNC and RESTCONF and SEC_TLS and ABSTRACT_PT + + Initial conditions with { + the IUT entity is idle and + the IUT entity having discovered several MW ethernet networks topologies + } + + Expected behaviour + ensure that { + when { + the IUT entity receives a vRequestPut containing + uri indicating value "/restconf/data/ietf-eth-tran-service:etht-svc/globals", + body containing + eth_svc containing + ethtSvcInstanceList containing + ethtSvcInstance containing + name_ indicating value UNKNOWN_ETHT_SVC_NAME, + title indicating value ETH_SVC_TITLE, + desc indicating value ETH_SVC_DESC, + customer indicating value ETH_SVC_CUSTOMER + ;;;;; + from the TEST_SYSTEM entity + } then { + the IUT entity sends a r404 + to the TEST_SYSTEM entity + } + } + } + + Test Purpose { + TP Id TP_mWT_PNC_PT_ETH_SVC_DELETE_BV_01 + + Test objective + "Verify that the IUT deletes an existing ethernet service." + + Reference + "ETSI GS mWT 024 Clause 4.2.2.1 Ethernet Ethernet Services", + "ETSI GS mWT 024 Clause 4.3.3", + "ETSI GS mWT 024 Annex A.2.4", + "RFC 6991 Common YANG Data Types", + "RFC 8776 Common YANG Data Types for Traffic Engineering", + "draft-ietf-ccamp-client-signal-yang-05 A YANG Data Model for Transport Network Client Signals" + + Config Id Config_mWT_2 + + PICS Selection IUT_PNC and RESTCONF and SEC_TLS and ABSTRACT_PT + + Initial conditions with { + the IUT entity is idle and + the IUT entity having discovered several MW ethernet networks topologies and + the IUT entity having a Bandwidth profile created and + the IUT entity having a service profile created + } + + Expected behaviour + ensure that { + when { + the IUT entity receives a vRequestDelete containing + uri indicating value "/restconf/data/ietf-eth-tran-service:etht-svc/etht-svc-instances={ETHT_SVC_NAME}", + headers containing + content_type indicating value "application/yang-data+xml";; + from the TEST_SYSTEM entity + } then { + the IUT entity sends a r204 + to the TEST_SYSTEM entity + } + } + } + + Test Purpose { + TP Id TP_mWT_PNC_PT_ETH_SVC_DELETE_BV_02 + + Test objective + "Verify that the IUT deletes an existing bandwidth profile." + + Reference + "ETSI GS mWT 024 Clause 4.2.2.1 Ethernet Ethernet Services", + "ETSI GS mWT 024 Clause 4.3.3", + "ETSI GS mWT 024 Annex A.2.4", + "RFC 6991 Common YANG Data Types", + "RFC 8776 Common YANG Data Types for Traffic Engineering", + "draft-ietf-ccamp-client-signal-yang-05 A YANG Data Model for Transport Network Client Signals" + + Config Id Config_mWT_2 + + PICS Selection IUT_PNC and RESTCONF and SEC_TLS and ABSTRACT_PT + + Initial conditions with { + the IUT entity is idle and + the IUT entity having discovered several MW ethernet networks topologies and + the IUT entity having a Bandwidth profile created + } + + Expected behaviour + ensure that { + when { + the IUT entity receives a vRequestDelete containing + uri indicating value "/restconf/data/ietf-eth-tran-service:etht-svc/globals/bandwitdh_profile_name={BANDWIDTH_PROFILE_NAME}", + headers containing + content_type indicating value "application/yang-data+xml";; + from the TEST_SYSTEM entity + } then { + the IUT entity sends a r204 + to the TEST_SYSTEM entity + } + } + } + + Test Purpose { + TP Id TP_mWT_PNC_PT_ETH_SVC_DELETE_BO_01 + + Test objective + "Verify that the IUT replies with an error code when the request is malformed." + + Reference + "ETSI GS mWT 024 Clause 4.3.3", + "ETSI GS mWT 024 Clause 5.3.2 Exception Handling", + "ETSI GS mWT 024 Annex A.2.4", + "RFC 6991 Common YANG Data Types", + "RFC 8776 Common YANG Data Types for Traffic Engineering", + "draft-ietf-ccamp-client-signal-yang-05 A YANG Data Model for Transport Network Client Signals" + + Config Id Config_mWT_2 + + PICS Selection IUT_PNC and RESTCONF and SEC_TLS and ABSTRACT_PT + + Initial conditions with { + the IUT entity is idle and + the IUT entity having discovered several MW ethernet networks topologies + } + + Expected behaviour + ensure that { + when { + the IUT entity receives a vRequestDelete containing + uri indicating value "/restconf/data/ietf-eth-tran-service:etht-svc/instances={ETHT_SVC_NAME}"; // Malformed URI + from the TEST_SYSTEM entity + } then { + the IUT entity sends a r400 + to the TEST_SYSTEM entity + } + } + } + + Test Purpose { + TP Id TP_mWT_PNC_ETH_PT_SVC_DELETE_BO_02 + + Test objective + "Verify that the IUT replies with an error code when it is requested to delete an unknown Bandwidth profile." + + Reference + "ETSI GS mWT 024 Clause 4.3.3", + "ETSI GS mWT 024 Clause 5.3.2 Exception Handling", + "ETSI GS mWT 024 Annex A.2.4", + "RFC 6991 Common YANG Data Types", + "RFC 8776 Common YANG Data Types for Traffic Engineering", + "draft-ietf-ccamp-client-signal-yang-05 A YANG Data Model for Transport Network Client Signals" + + Config Id Config_mWT_2 + + PICS Selection IUT_PNC and RESTCONF and SEC_TLS and ABSTRACT_PT + + Initial conditions with { + the IUT entity is idle and + the IUT entity having discovered several MW ethernet networks topologies + } + + Expected behaviour + ensure that { + when { + the IUT entity receives a vRequestDelete containing + uri indicating value "/restconf/data/ietf-eth-tran-service:etht-svc/etht-svc-instances={UNKNOWN_ETHT_SVC_NAME}"; + from the TEST_SYSTEM entity + } then { + the IUT entity sends a r404 + to the TEST_SYSTEM entity + } + } + } + + } // End of Group "EthernetService" + + } // End of Group "PartiallyTransparent" + + } // End of Group "pnc" + } // End of Package AtsMDSC \ No newline at end of file -- GitLab From 3847fabb5e1b6e96d7c0f719ea7ea6831fcbb086 Mon Sep 17 00:00:00 2001 From: garciay Date: Mon, 19 Aug 2024 08:32:26 +0200 Subject: [PATCH 15/15] Implementing PUT ATS in Postman; Global review --- postman/TTF_T029.postman_collection.json | 22 ++++++++++++++++++++-- 1 file changed, 20 insertions(+), 2 deletions(-) diff --git a/postman/TTF_T029.postman_collection.json b/postman/TTF_T029.postman_collection.json index fd96ad9..1d040f0 100644 --- a/postman/TTF_T029.postman_collection.json +++ b/postman/TTF_T029.postman_collection.json @@ -3702,6 +3702,10 @@ "pm.test(\"Verify that the response status code is 201\", function () {\r", " pm.response.to.have.status(201);\r", "});\r", + "\r", + "\r", + "// Postamble\r", + "// TODO Use pm.sendRequest to initiate the delete: see TC_mWT_PNC_PT_ETH_SVC_DELETE_BV_01\r", "" ], "type": "text/javascript", @@ -3820,6 +3824,8 @@ " responseJson = pm.response.json();\r", "});\r", "\r", + "// Postamble\r", + "// TODO Use pm.sendRequest to initiate the delete: see TC_mWT_PNC_PT_ETH_SVC_DELETE_BV_01\r", "" ], "type": "text/javascript", @@ -3909,6 +3915,8 @@ " responseJson = pm.response.json();\r", "});\r", "\r", + "// Postamble\r", + "// TODO Use pm.sendRequest to initiate the delete: see TC_mWT_PNC_PT_ETH_SVC_DELETE_BV_01\r", "" ], "type": "text/javascript", @@ -4058,7 +4066,8 @@ "listen": "test", "script": { "exec": [ - "//postman.setNextRequest('TC_mWT_PNC_PT_ETH_SVC_POST_BV_01');\r", + "// Preamble\r", + "// TODO Use pm.sendRequest to initiate the post: see TC_mWT_PNC_PT_ETH_SVC_POST_BV_01\r", "\r", "\r", "pm.test(\"Verify that the response status code is 200\", function () {\r", @@ -4074,6 +4083,10 @@ " topLevelPropertyName = responseData.hasOwnProperty('modules-state') ? 'modules-state' : 'ietf-yang-library:modules-state';\r", " console.info(topLevelPropertyName)\r", "});\r", + "\r", + "// Postamble\r", + "// TODO Use pm.sendRequest to initiate the delete: see TC_mWT_PNC_PT_ETH_SVC_DELETE_BV_01\r", + "\r", "" ], "type": "text/javascript", @@ -4143,7 +4156,8 @@ "listen": "test", "script": { "exec": [ - "//postman.setNextRequest('TC_mWT_PNC_PT_ETH_SVC_POST_BV_01');\r", + "// Preamble\r", + "// TODO Use pm.sendRequest to initiate the post: see TC_mWT_PNC_PT_ETH_SVC_POST_BV_01\r", "\r", "\r", "pm.test(\"Verify that the response status code is 200\", function () {\r", @@ -4159,6 +4173,10 @@ " topLevelPropertyName = responseData.hasOwnProperty('modules-state') ? 'modules-state' : 'ietf-yang-library:modules-state';\r", " console.info(topLevelPropertyName)\r", "});\r", + "\r", + "// Postamble\r", + "// TODO Use pm.sendRequest to initiate the delete: see TC_mWT_PNC_PT_ETH_SVC_DELETE_BV_01\r", + "\r", "" ], "type": "text/javascript", -- GitLab