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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 literal 0 HcmV?d00001 diff --git a/tdl/src/tdl/AtsPNC_TCs.tdltx b/tdl/src/tdl/AtsPNC_TCs.tdltx new file mode 100644 index 0000000..eafda62 --- /dev/null +++ b/tdl/src/tdl/AtsPNC_TCs.tdltx @@ -0,0 +1,87 @@ +Package AtsPNC_TCs { + Import all from Standard + + Import all from ietf_yang_library + Import all from ietf_networks + + Import all from HTTP + Import all from HTTP.MessageBased + Import all from mWT_Common + Import all from mWT_Common.Data + + Import all from AtsPNC_TPs + + // Mappings for code generation + //Import all from AtsPNC_API.JavaMapping + Import all from HttpJavaMappings + Import all from Java + + Annotation PICS_IUT_PNC + Annotation PICS_RESTCONF + Annotation PICS_SEC_TLS + + Objective: TO_mWT_PNC_RESTCONF_GET_BV_01 + @Test Purpose Description TP_mWT_PNC_RESTCONF_GET_BV_01 + @PICS_IUT_PNC and PICS_RESTCONF and PICS_SEC_TLS + Test Description TC_mWT_PNC_RESTCONF_GET_BV_01 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 )) // FIXME list not empty + 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 + } + + 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