Functional tests for 100 OFEC 31.6 GBaud 78/101278/3
authorBalagangadhar Bathula <bb4341@att.com>
Tue, 24 May 2022 17:03:39 +0000 (13:03 -0400)
committerBalagangadhar Bathula <bb4341@att.com>
Thu, 26 May 2022 11:49:31 +0000 (07:49 -0400)
- Update the configuration files with the new
  capabilities for 100G OFEC.
- Add functional tests to render the 100G 31.6 Gbaud
  (50 GHz) interfaces.

JIRA: TRNSPRTPCE-637

Change-Id: I5e0be59be3a2dcc41f276078020ed9e2b66b588a
Signed-off-by: Balagangadhar Bathula <bb4341@att.com>
tests/sample_configs/openroadm/7.1/oper-XPDRA2.xml
tests/sample_configs/openroadm/7.1/oper-XPDRC2.xml
tests/transportpce_tests/7.1/test03_renderer_or_modes.py [new file with mode: 0644]
tests/transportpce_tests/hybrid/test02_B100G_end2end.py

index 7a753f8e43ad17282e9f690bc9e011afe3a798e8..18388fd436e28930dcbc9b4776a068b48caaab32 100644 (file)
       <serial-id>serial-id</serial-id>
     </shelves>
     <otsigroup-capability-profile>
-      <profile-name>FOIC3.6-OTUC3</profile-name>
-      <otucn-n-rate>4</otucn-n-rate>
-      <foic-type xmlns:x="http://org/openroadm/common-optical-channel-types">x:foic4.8</foic-type>
-      <otn-odu-mux-hierarchy-profile-name>one-stage-ODUCn-ODUflex-ODU4</otn-odu-mux-hierarchy-profile-name>
+      <profile-name>FOIC1.4-OTUC1</profile-name>
+      <otucn-n-rate>1</otucn-n-rate>
+      <foic-type xmlns:x="http://org/openroadm/common-optical-channel-types">x:foic1.4</foic-type>
+      <otn-odu-mux-hierarchy-profile-name>one-stage-ODUCn-ODU4</otn-odu-mux-hierarchy-profile-name>
       <otn-capability-profile-name>Otn-ODUCn-TTP-no-protection</otn-capability-profile-name>
       <if-cap-type xmlns:x="http://org/openroadm/port/types">x:if-OTUCn-ODUCn</if-cap-type>
     </otsigroup-capability-profile>
     <otsigroup-capability-profile>
-      <profile-name>FOIC4.8-OTUC4</profile-name>
-      <otucn-n-rate>4</otucn-n-rate>
-      <foic-type xmlns:x="http://org/openroadm/common-optical-channel-types">x:foic4.8</foic-type>
-      <otn-odu-mux-hierarchy-profile-name>one-stage-ODUCn-ODUflex-ODU4</otn-odu-mux-hierarchy-profile-name>
+      <profile-name>FOIC2.4-FOIC2.8-OTUC2</profile-name>
+      <otucn-n-rate>2</otucn-n-rate>
+      <foic-type xmlns:x="http://org/openroadm/common-optical-channel-types">x:foic2.8</foic-type>
+      <foic-type xmlns:x="http://org/openroadm/common-optical-channel-types">x:foic2.4</foic-type>
+      <otn-odu-mux-hierarchy-profile-name>one-stage-ODUCn-ODU4</otn-odu-mux-hierarchy-profile-name>
       <otn-capability-profile-name>Otn-ODUCn-TTP-no-protection</otn-capability-profile-name>
       <if-cap-type xmlns:x="http://org/openroadm/port/types">x:if-OTUCn-ODUCn</if-cap-type>
     </otsigroup-capability-profile>
     <otsigroup-capability-profile>
-      <profile-name>FOIC2.4-OTUC2</profile-name>
-      <otucn-n-rate>4</otucn-n-rate>
-      <foic-type xmlns:x="http://org/openroadm/common-optical-channel-types">x:foic4.8</foic-type>
-      <otn-odu-mux-hierarchy-profile-name>one-stage-ODUCn-ODUflex-ODU4</otn-odu-mux-hierarchy-profile-name>
-      <otn-capability-profile-name>Otn-ODUCn-TTP-no-protection</otn-capability-profile-name>
+      <profile-name>FOIC3.6-OTUC3</profile-name>
       <if-cap-type xmlns:x="http://org/openroadm/port/types">x:if-OTUCn-ODUCn</if-cap-type>
+      <otn-odu-mux-hierarchy-profile-name>one-stage-ODUCn-ODU4</otn-odu-mux-hierarchy-profile-name>
+      <foic-type xmlns:x="http://org/openroadm/common-optical-channel-types">x:foic3.6</foic-type>
+      <otucn-n-rate>3</otucn-n-rate>
+      <otn-capability-profile-name>otn-ODUCn-TTP-no-protection</otn-capability-profile-name>
+    </otsigroup-capability-profile>
+    <otsigroup-capability-profile>
+      <profile-name>FOIC4.8-OTUC4</profile-name>
+      <if-cap-type xmlns:x="http://org/openroadm/port/types">x:if-OTUCn-ODUCn</if-cap-type>
+      <otn-odu-mux-hierarchy-profile-name>one-stage-ODUCn-ODUflex-ODU4</otn-odu-mux-hierarchy-profile-name>
+      <foic-type xmlns:x="http://org/openroadm/common-optical-channel-types">x:foic4.8</foic-type>
+      <otucn-n-rate>4</otucn-n-rate>
+      <otn-capability-profile-name>otn-ODUCn-TTP-no-protection</otn-capability-profile-name>
     </otsigroup-capability-profile>
     <mc-capability-profile>
       <profile-name>mc-capa-profile1</profile-name>
       <hardware-version>hardware-version</hardware-version>
       <serial-id>serial-id</serial-id>
     </circuit-packs>
+    <circuit-packs>
+      <circuit-pack-name>1/1/3-PLUG-CLIENT</circuit-pack-name>
+      <product-code>product-code</product-code>
+      <circuit-pack-product-code>circuit-pack-product-code</circuit-pack-product-code>
+      <is-physical>true</is-physical>
+      <clei>clei</clei>
+      <model>model</model>
+      <manufacture-date>2021-02-08T15:23:43Z</manufacture-date>
+      <shelf>1</shelf>
+      <ports>
+        <port-name>C1</port-name>
+        <administrative-state>inService</administrative-state>
+        <port-capabilities xmlns="http://org/openroadm/port-capability">
+          <supported-interface-capability>
+            <if-cap-type xmlns:x="http://org/openroadm/port/types">x:if-OCH-OTU4-ODU4</if-cap-type>
+            <otn-capability>
+              <otn-capability-profile-name>xponder-client-no-protection</otn-capability-profile-name>
+            </otn-capability>
+          </supported-interface-capability>
+          <supported-interface-capability>
+            <if-cap-type xmlns:x="http://org/openroadm/port/types">x:if-100GE</if-cap-type>
+          </supported-interface-capability>
+        </port-capabilities>
+        <port-type>QSFP28</port-type>
+        <faceplate-label>faceplate-label</faceplate-label>
+        <is-physical>true</is-physical>
+        <operational-state>inService</operational-state>
+        <port-direction>bidirectional</port-direction>
+        <lifecycle-state>deployed</lifecycle-state>
+        <port-qual>xpdr-client</port-qual>
+      </ports>
+      <type>Plug_Client_100GE</type>
+      <is-pluggable-optics>true</is-pluggable-optics>
+      <slot>1</slot>
+      <administrative-state>inService</administrative-state>
+      <parent-circuit-pack>
+        <circuit-pack-name>1/1</circuit-pack-name>
+        <cp-slot-name>slot-1</cp-slot-name>
+      </parent-circuit-pack>
+      <faceplate-label>faceplate-label</faceplate-label>
+      <vendor>vendor-A</vendor>
+      <is-passive>false</is-passive>
+      <circuit-pack-category>
+        <type>circuitPack</type>
+      </circuit-pack-category>
+      <operational-state>inService</operational-state>
+      <lifecycle-state>deployed</lifecycle-state>
+      <equipment-state>not-reserved-available</equipment-state>
+      <circuit-pack-type>Plug_Client_100GE</circuit-pack-type>
+      <hardware-version>hardware-version</hardware-version>
+      <serial-id>serial-id</serial-id>
+    </circuit-packs>
     <circuit-packs>
       <circuit-pack-name>1/2/2-PLUG-NET</circuit-pack-name>
       <product-code>product-code</product-code>
             <if-cap-type xmlns:x="http://org/openroadm/port/types">x:if-otsi-otsigroup</if-cap-type>
             <otsigroup-capability-profile-name>FOIC4.8-OTUC4</otsigroup-capability-profile-name>
             <otsigroup-capability-profile-name>FOIC3.6-OTUC3</otsigroup-capability-profile-name>
-            <otsigroup-capability-profile-name>FOIC2.4-OTUC2</otsigroup-capability-profile-name>
+            <otsigroup-capability-profile-name>FOIC2.4-FOIC2.8-OTUC2</otsigroup-capability-profile-name>
+            <otsigroup-capability-profile-name>FOIC1.4-OTUC1</otsigroup-capability-profile-name>
+            <optical-operational-mode-profile-name>OR-W-100G-oFEC-31.6Gbd</optical-operational-mode-profile-name>
+            <optical-operational-mode-profile-name>OR-W-200G-oFEC-31.6Gbd</optical-operational-mode-profile-name>
           </supported-interface-capability>
         </port-capabilities>
         <is-physical>true</is-physical>
             <if-cap-type xmlns:x="http://org/openroadm/port/types">x:if-otsi-otsigroup</if-cap-type>
             <otsigroup-capability-profile-name>FOIC4.8-OTUC4</otsigroup-capability-profile-name>
             <otsigroup-capability-profile-name>FOIC3.6-OTUC3</otsigroup-capability-profile-name>
-            <otsigroup-capability-profile-name>FOIC2.4-OTUC2</otsigroup-capability-profile-name>
+            <otsigroup-capability-profile-name>FOIC2.4-FOIC2.8-OTUC2</otsigroup-capability-profile-name>
+            <otsigroup-capability-profile-name>FOIC1.4-OTUC1</otsigroup-capability-profile-name>
+            <optical-operational-mode-profile-name>OR-W-100G-oFEC-31.6Gbd</optical-operational-mode-profile-name>
+            <optical-operational-mode-profile-name>OR-W-200G-oFEC-31.6Gbd</optical-operational-mode-profile-name>
           </supported-interface-capability>
         </port-capabilities>
         <is-physical>true</is-physical>
       <hardware-version>hardware-version</hardware-version>
       <serial-id>serial-id</serial-id>
     </circuit-packs>
+    <circuit-packs>
+      <circuit-pack-name>1/1/4-PLUG-NET</circuit-pack-name>
+      <product-code>product-code</product-code>
+      <circuit-pack-product-code>circuit-pack-product-code</circuit-pack-product-code>
+      <is-physical>true</is-physical>
+      <clei>clei</clei>
+      <model>model</model>
+      <manufacture-date>2021-02-08T15:23:43Z</manufacture-date>
+      <shelf>1</shelf>
+      <ports>
+        <port-name>L1</port-name>
+        <port-capabilities xmlns="http://org/openroadm/port-capability">
+          <supported-interface-capability>
+            <if-cap-type xmlns:x="http://org/openroadm/port/types">x:if-otsi-otsigroup</if-cap-type>
+            <otsigroup-capability-profile-name>FOIC4.8-OTUC4</otsigroup-capability-profile-name>
+            <otsigroup-capability-profile-name>FOIC3.6-OTUC3</otsigroup-capability-profile-name>
+            <otsigroup-capability-profile-name>FOIC2.4-FOIC2.8-OTUC2</otsigroup-capability-profile-name>
+            <otsigroup-capability-profile-name>FOIC1.4-OTUC1</otsigroup-capability-profile-name>
+            <optical-operational-mode-profile-name>OR-W-100G-oFEC-31.6Gbd</optical-operational-mode-profile-name>
+            <optical-operational-mode-profile-name>OR-W-200G-oFEC-31.6Gbd</optical-operational-mode-profile-name>
+          </supported-interface-capability>
+        </port-capabilities>
+        <is-physical>true</is-physical>
+        <port-direction>bidirectional</port-direction>
+        <port-wavelength-type>wavelength</port-wavelength-type>
+        <port-qual>xpdr-network</port-qual>
+        <administrative-state>inService</administrative-state>
+        <port-type>CFP2-DCO</port-type>
+        <faceplate-label>faceplate-label</faceplate-label>
+        <operational-state>inService</operational-state>
+        <transponder-port>
+          <port-power-capability-max-rx>13</port-power-capability-max-rx>
+          <port-power-capability-min-tx>-5</port-power-capability-min-tx>
+          <port-power-capability-min-rx>-22</port-power-capability-min-rx>
+          <port-power-capability-max-tx>0</port-power-capability-max-tx>
+        </transponder-port>
+        <lifecycle-state>deployed</lifecycle-state>
+        <mc-capability-profile-name>mc-capability-profile</mc-capability-profile-name>
+      </ports>
+      <type>Plug_Line_400G</type>
+      <is-pluggable-optics>true</is-pluggable-optics>
+      <slot>4</slot>
+      <administrative-state>inService</administrative-state>
+      <parent-circuit-pack>
+        <circuit-pack-name>1/1</circuit-pack-name>
+        <cp-slot-name>slot-2</cp-slot-name>
+      </parent-circuit-pack>
+      <faceplate-label>faceplate-label</faceplate-label>
+      <vendor>vendor-A</vendor>
+      <is-passive>false</is-passive>
+      <circuit-pack-category>
+        <type>circuitPack</type>
+      </circuit-pack-category>
+      <operational-state>inService</operational-state>
+      <lifecycle-state>deployed</lifecycle-state>
+      <equipment-state>not-reserved-available</equipment-state>
+      <circuit-pack-type>Plug_Line_400G</circuit-pack-type>
+      <hardware-version>hardware-version</hardware-version>
+      <serial-id>serial-id</serial-id>
+    </circuit-packs>
     <circuit-packs>
       <circuit-pack-name>1/2</circuit-pack-name>
       <product-code>product-code</product-code>
       <slot>1</slot>
       <cp-slots>
         <slot-name>slot-4</slot-name>
-        <slot-status>empty-not-prov</slot-status>
+        <slot-status>installed-prov-match</slot-status>
+        <provisioned-circuit-pack>1/1/4-PLUG-NETWORK</provisioned-circuit-pack>
         <label>4</label>
       </cp-slots>
       <cp-slots>
       </cp-slots>
       <cp-slots>
         <slot-name>slot-3</slot-name>
-        <slot-status>empty-not-prov</slot-status>
+        <slot-status>installed-prov-match</slot-status>
         <label>3</label>
+        <provisioned-circuit-pack>1/1/3-PLUG-CLIENT</provisioned-circuit-pack>
       </cp-slots>
       <cp-slots>
         <slot-name>slot-1</slot-name>
       <xpdr-type>mpdr</xpdr-type>
       <lifecycle-state>deployed</lifecycle-state>
     </xponder>
+    <xponder>
+      <xpdr-number>3</xpdr-number>
+      <xpdr-port>
+        <index>2</index>
+        <port-name>L1</port-name>
+        <circuit-pack-name>1/1/4-PLUG-NET</circuit-pack-name>
+      </xpdr-port>
+      <xpdr-port>
+        <index>1</index>
+        <port-name>C1</port-name>
+        <circuit-pack-name>1/1/3-PLUG-CLIENT</circuit-pack-name>
+      </xpdr-port>
+      <xpdr-type>tpdr</xpdr-type>
+      <lifecycle-state>deployed</lifecycle-state>
+    </xponder>
   </org-openroadm-device>
 </data>
index 88f38339501cf50694b429f217bbde32860d76f4..02ee4a010d6e8a508172c5bb162244dfd1e90137 100644 (file)
       <serial-id>serial-id</serial-id>
     </shelves>
     <otsigroup-capability-profile>
-      <profile-name>FOIC3.6-OTUC3</profile-name>
-      <otucn-n-rate>4</otucn-n-rate>
-      <foic-type xmlns:x="http://org/openroadm/common-optical-channel-types">x:foic4.8</foic-type>
-      <otn-odu-mux-hierarchy-profile-name>one-stage-ODUCn-ODUflex-ODU4</otn-odu-mux-hierarchy-profile-name>
+      <profile-name>FOIC1.4-OTUC1</profile-name>
+      <otucn-n-rate>1</otucn-n-rate>
+      <foic-type xmlns:x="http://org/openroadm/common-optical-channel-types">x:foic1.4</foic-type>
+      <otn-odu-mux-hierarchy-profile-name>one-stage-ODUCn-ODU4</otn-odu-mux-hierarchy-profile-name>
       <otn-capability-profile-name>Otn-ODUCn-TTP-no-protection</otn-capability-profile-name>
       <if-cap-type xmlns:x="http://org/openroadm/port/types">x:if-OTUCn-ODUCn</if-cap-type>
     </otsigroup-capability-profile>
     <otsigroup-capability-profile>
-      <profile-name>FOIC4.8-OTUC4</profile-name>
-      <otucn-n-rate>4</otucn-n-rate>
-      <foic-type xmlns:x="http://org/openroadm/common-optical-channel-types">x:foic4.8</foic-type>
-      <otn-odu-mux-hierarchy-profile-name>one-stage-ODUCn-ODUflex-ODU4</otn-odu-mux-hierarchy-profile-name>
+      <profile-name>FOIC2.4-FOIC2.8-OTUC2</profile-name>
+      <otucn-n-rate>2</otucn-n-rate>
+      <foic-type xmlns:x="http://org/openroadm/common-optical-channel-types">x:foic2.8</foic-type>
+      <foic-type xmlns:x="http://org/openroadm/common-optical-channel-types">x:foic2.4</foic-type>
+      <otn-odu-mux-hierarchy-profile-name>one-stage-ODUCn-ODU4</otn-odu-mux-hierarchy-profile-name>
       <otn-capability-profile-name>Otn-ODUCn-TTP-no-protection</otn-capability-profile-name>
       <if-cap-type xmlns:x="http://org/openroadm/port/types">x:if-OTUCn-ODUCn</if-cap-type>
     </otsigroup-capability-profile>
     <otsigroup-capability-profile>
-      <profile-name>FOCI2.4-OTUC2</profile-name>
-      <otucn-n-rate>4</otucn-n-rate>
-      <foic-type xmlns:x="http://org/openroadm/common-optical-channel-types">x:foic4.8</foic-type>
-      <otn-odu-mux-hierarchy-profile-name>one-stage-ODUCn-ODUflex-ODU4</otn-odu-mux-hierarchy-profile-name>
-      <otn-capability-profile-name>Otn-ODUCn-TTP-no-protection</otn-capability-profile-name>
+      <profile-name>FOIC3.6-OTUC3</profile-name>
+      <if-cap-type xmlns:x="http://org/openroadm/port/types">x:if-OTUCn-ODUCn</if-cap-type>
+      <otn-odu-mux-hierarchy-profile-name>one-stage-ODUCn-ODU4</otn-odu-mux-hierarchy-profile-name>
+      <foic-type xmlns:x="http://org/openroadm/common-optical-channel-types">x:foic3.6</foic-type>
+      <otucn-n-rate>3</otucn-n-rate>
+      <otn-capability-profile-name>otn-ODUCn-TTP-no-protection</otn-capability-profile-name>
+    </otsigroup-capability-profile>
+    <otsigroup-capability-profile>
+      <profile-name>FOIC4.8-OTUC4</profile-name>
       <if-cap-type xmlns:x="http://org/openroadm/port/types">x:if-OTUCn-ODUCn</if-cap-type>
+      <otn-odu-mux-hierarchy-profile-name>one-stage-ODUCn-ODUflex-ODU4</otn-odu-mux-hierarchy-profile-name>
+      <foic-type xmlns:x="http://org/openroadm/common-optical-channel-types">x:foic4.8</foic-type>
+      <otucn-n-rate>4</otucn-n-rate>
+      <otn-capability-profile-name>otn-ODUCn-TTP-no-protection</otn-capability-profile-name>
     </otsigroup-capability-profile>
     <mc-capability-profile>
       <profile-name>mc-capa-profile1</profile-name>
       <hardware-version>hardware-version</hardware-version>
       <serial-id>serial-id</serial-id>
     </circuit-packs>
+    <circuit-packs>
+      <circuit-pack-name>1/1/3-PLUG-CLIENT</circuit-pack-name>
+      <product-code>product-code</product-code>
+      <circuit-pack-product-code>circuit-pack-product-code</circuit-pack-product-code>
+      <is-physical>true</is-physical>
+      <clei>clei</clei>
+      <model>model</model>
+      <manufacture-date>2021-02-08T15:23:43Z</manufacture-date>
+      <shelf>1</shelf>
+      <ports>
+        <port-name>C1</port-name>
+        <administrative-state>inService</administrative-state>
+        <port-capabilities xmlns="http://org/openroadm/port-capability">
+          <supported-interface-capability>
+            <if-cap-type xmlns:x="http://org/openroadm/port/types">x:if-OCH-OTU4-ODU4</if-cap-type>
+              <otn-capability>
+                <otn-capability-profile-name>xponder-client-no-protection</otn-capability-profile-name>
+              </otn-capability>
+          </supported-interface-capability>
+          <supported-interface-capability>
+            <if-cap-type xmlns:x="http://org/openroadm/port/types">x:if-100GE</if-cap-type>
+        </supported-interface-capability>
+        </port-capabilities>
+        <port-type>QSFP28</port-type>
+        <faceplate-label>faceplate-label</faceplate-label>
+        <is-physical>true</is-physical>
+        <operational-state>inService</operational-state>
+        <port-direction>bidirectional</port-direction>
+        <lifecycle-state>deployed</lifecycle-state>
+        <port-qual>xpdr-client</port-qual>
+      </ports>
+      <type>Plug_Client_100GE</type>
+      <is-pluggable-optics>true</is-pluggable-optics>
+      <slot>1</slot>
+      <administrative-state>inService</administrative-state>
+      <parent-circuit-pack>
+        <circuit-pack-name>1/1</circuit-pack-name>
+        <cp-slot-name>slot-1</cp-slot-name>
+      </parent-circuit-pack>
+      <faceplate-label>faceplate-label</faceplate-label>
+      <vendor>vendor-A</vendor>
+      <is-passive>false</is-passive>
+      <circuit-pack-category>
+        <type>circuitPack</type>
+      </circuit-pack-category>
+      <operational-state>inService</operational-state>
+      <lifecycle-state>deployed</lifecycle-state>
+      <equipment-state>not-reserved-available</equipment-state>
+      <circuit-pack-type>Plug_Client_100GE</circuit-pack-type>
+      <hardware-version>hardware-version</hardware-version>
+      <serial-id>serial-id</serial-id>
+    </circuit-packs>
     <circuit-packs>
       <circuit-pack-name>1/2/2-PLUG-NET</circuit-pack-name>
       <product-code>product-code</product-code>
             <if-cap-type xmlns:x="http://org/openroadm/port/types">x:if-otsi-otsigroup</if-cap-type>
             <otsigroup-capability-profile-name>FOIC4.8-OTUC4</otsigroup-capability-profile-name>
             <otsigroup-capability-profile-name>FOIC3.6-OTUC3</otsigroup-capability-profile-name>
-            <otsigroup-capability-profile-name>FOCI2.4-OTUC2</otsigroup-capability-profile-name>
+            <otsigroup-capability-profile-name>FOIC2.4-FOIC2.8-OTUC2</otsigroup-capability-profile-name>
+            <otsigroup-capability-profile-name>FOIC1.4-OTUC1</otsigroup-capability-profile-name>
+            <optical-operational-mode-profile-name>OR-W-100G-oFEC-31.6Gbd</optical-operational-mode-profile-name>
+            <optical-operational-mode-profile-name>OR-W-200G-oFEC-31.6Gbd</optical-operational-mode-profile-name>
           </supported-interface-capability>
         </port-capabilities>
         <is-physical>true</is-physical>
             <if-cap-type xmlns:x="http://org/openroadm/port/types">x:if-otsi-otsigroup</if-cap-type>
             <otsigroup-capability-profile-name>FOIC4.8-OTUC4</otsigroup-capability-profile-name>
             <otsigroup-capability-profile-name>FOIC3.6-OTUC3</otsigroup-capability-profile-name>
-            <otsigroup-capability-profile-name>FOCI2.4-OTUC2</otsigroup-capability-profile-name>
+            <otsigroup-capability-profile-name>FOIC2.4-FOIC2.8-OTUC2</otsigroup-capability-profile-name>
+            <otsigroup-capability-profile-name>FOIC1.4-OTUC1</otsigroup-capability-profile-name>
+            <optical-operational-mode-profile-name>OR-W-100G-oFEC-31.6Gbd</optical-operational-mode-profile-name>
+            <optical-operational-mode-profile-name>OR-W-200G-oFEC-31.6Gbd</optical-operational-mode-profile-name>
           </supported-interface-capability>
         </port-capabilities>
         <is-physical>true</is-physical>
       <hardware-version>hardware-version</hardware-version>
       <serial-id>serial-id</serial-id>
     </circuit-packs>
+    <circuit-packs>
+      <circuit-pack-name>1/1/4-PLUG-NET</circuit-pack-name>
+      <product-code>product-code</product-code>
+      <circuit-pack-product-code>circuit-pack-product-code</circuit-pack-product-code>
+      <is-physical>true</is-physical>
+      <clei>clei</clei>
+      <model>model</model>
+      <manufacture-date>2021-02-08T15:23:43Z</manufacture-date>
+      <shelf>1</shelf>
+      <ports>
+        <port-name>L1</port-name>
+        <port-capabilities xmlns="http://org/openroadm/port-capability">
+          <supported-interface-capability>
+            <if-cap-type xmlns:x="http://org/openroadm/port/types">x:if-otsi-otsigroup</if-cap-type>
+            <otsigroup-capability-profile-name>FOIC4.8-OTUC4</otsigroup-capability-profile-name>
+            <otsigroup-capability-profile-name>FOIC3.6-OTUC3</otsigroup-capability-profile-name>
+            <otsigroup-capability-profile-name>FOIC2.4-FOIC2.8-OTUC2</otsigroup-capability-profile-name>
+            <otsigroup-capability-profile-name>FOIC1.4-OTUC1</otsigroup-capability-profile-name>
+            <optical-operational-mode-profile-name>OR-W-100G-oFEC-31.6Gbd</optical-operational-mode-profile-name>
+            <optical-operational-mode-profile-name>OR-W-200G-oFEC-31.6Gbd</optical-operational-mode-profile-name>
+          </supported-interface-capability>
+        </port-capabilities>
+        <is-physical>true</is-physical>
+        <port-direction>bidirectional</port-direction>
+        <port-wavelength-type>wavelength</port-wavelength-type>
+        <port-qual>xpdr-network</port-qual>
+        <administrative-state>inService</administrative-state>
+        <port-type>CFP2-DCO</port-type>
+        <faceplate-label>faceplate-label</faceplate-label>
+        <operational-state>inService</operational-state>
+        <transponder-port>
+          <port-power-capability-max-rx>13</port-power-capability-max-rx>
+          <port-power-capability-min-tx>-5</port-power-capability-min-tx>
+          <port-power-capability-min-rx>-22</port-power-capability-min-rx>
+          <port-power-capability-max-tx>0</port-power-capability-max-tx>
+        </transponder-port>
+        <lifecycle-state>deployed</lifecycle-state>
+        <mc-capability-profile-name>mc-capability-profile</mc-capability-profile-name>
+      </ports>
+      <type>Plug_Line_400G</type>
+      <is-pluggable-optics>true</is-pluggable-optics>
+      <slot>4</slot>
+      <administrative-state>inService</administrative-state>
+      <parent-circuit-pack>
+        <circuit-pack-name>1/1</circuit-pack-name>
+        <cp-slot-name>slot-2</cp-slot-name>
+      </parent-circuit-pack>
+      <faceplate-label>faceplate-label</faceplate-label>
+      <vendor>vendor-A</vendor>
+      <is-passive>false</is-passive>
+      <circuit-pack-category>
+        <type>circuitPack</type>
+      </circuit-pack-category>
+      <operational-state>inService</operational-state>
+      <lifecycle-state>deployed</lifecycle-state>
+      <equipment-state>not-reserved-available</equipment-state>
+      <circuit-pack-type>Plug_Line_400G</circuit-pack-type>
+      <hardware-version>hardware-version</hardware-version>
+      <serial-id>serial-id</serial-id>
+    </circuit-packs>
     <circuit-packs>
       <circuit-pack-name>1/2</circuit-pack-name>
       <product-code>product-code</product-code>
       <slot>1</slot>
       <cp-slots>
         <slot-name>slot-4</slot-name>
-        <slot-status>empty-not-prov</slot-status>
+        <slot-status>installed-prov-match</slot-status>
+        <provisioned-circuit-pack>1/1/4-PLUG-NETWORK</provisioned-circuit-pack>
         <label>4</label>
       </cp-slots>
       <cp-slots>
       </cp-slots>
       <cp-slots>
         <slot-name>slot-3</slot-name>
-        <slot-status>empty-not-prov</slot-status>
+        <slot-status>installed-prov-match</slot-status>
         <label>3</label>
+        <provisioned-circuit-pack>1/1/3-PLUG-CLIENT</provisioned-circuit-pack>
       </cp-slots>
       <cp-slots>
         <slot-name>slot-1</slot-name>
       <xpdr-type>mpdr</xpdr-type>
       <lifecycle-state>deployed</lifecycle-state>
     </xponder>
+    <xponder>
+      <xpdr-number>3</xpdr-number>
+      <xpdr-port>
+        <index>2</index>
+        <port-name>L1</port-name>
+        <circuit-pack-name>1/1/4-PLUG-NET</circuit-pack-name>
+      </xpdr-port>
+      <xpdr-port>
+        <index>1</index>
+        <port-name>C1</port-name>
+        <circuit-pack-name>1/1/3-PLUG-CLIENT</circuit-pack-name>
+      </xpdr-port>
+      <xpdr-type>tpdr</xpdr-type>
+      <lifecycle-state>deployed</lifecycle-state>
+    </xponder>
   </org-openroadm-device>
 </data>
diff --git a/tests/transportpce_tests/7.1/test03_renderer_or_modes.py b/tests/transportpce_tests/7.1/test03_renderer_or_modes.py
new file mode 100644 (file)
index 0000000..4f988f6
--- /dev/null
@@ -0,0 +1,582 @@
+#!/usr/bin/env python
+##############################################################################
+# Copyright (c) 2022 AT&T, Inc. and others.  All rights reserved.
+#
+# All rights reserved. This program and the accompanying materials
+# are made available under the terms of the Apache License, Version 2.0
+# which accompanies this distribution, and is available at
+# http://www.apache.org/licenses/LICENSE-2.0
+##############################################################################
+
+# pylint: disable=no-member
+# pylint: disable=too-many-public-methods
+
+import unittest
+import time
+import requests
+# pylint: disable=wrong-import-order
+import sys
+sys.path.append("transportpce_tests/common")
+# pylint: disable=wrong-import-position
+# pylint: disable=import-error
+import test_utils_rfc8040  # nopep8
+
+
+class TransportPCE400GPortMappingTesting(unittest.TestCase):
+
+    processes = None
+    NETWORK2_CHECK_DICT = {"logical-connection-point": "XPDR3-NETWORK1",
+                           "supporting-port": "L1",
+                           "supported-interface-capability": [
+                               "org-openroadm-port-types:if-otsi-otsigroup"
+                           ],
+                           "port-direction": "bidirectional",
+                           "port-qual": "xpdr-network",
+                           "supporting-circuit-pack-name": "1/1/4-PLUG-NET",
+                           "xponder-type": "tpdr",
+                           "port-admin-state": "InService",
+                           "port-oper-state": "InService"}
+    CLIENT_CAPABILITIES = ["org-openroadm-port-types:if-OCH-OTU4-ODU4",
+                           "org-openroadm-port-types:if-100GE"]
+    NODE_VERSION = "7.1"
+
+    @classmethod
+    def setUpClass(cls):
+        cls.processes = test_utils_rfc8040.start_tpce()
+        cls.processes = test_utils_rfc8040.start_sims([("xpdra2", cls.NODE_VERSION),
+                                                       ("xpdrc2", cls.NODE_VERSION)])
+
+    @classmethod
+    def tearDownClass(cls):
+        # pylint: disable=not-an-iterable
+        for process in cls.processes:
+            test_utils_rfc8040.shutdown_process(process)
+        print("all processes killed")
+
+    def setUp(self):
+        # pylint: disable=consider-using-f-string
+        print("execution of {}".format(self.id().split(".")[-1]))
+        time.sleep(10)
+
+    def test_01_xpdr_device_connection(self):
+        response = test_utils_rfc8040.mount_device("XPDR-A2",
+                                                   ("xpdra2", self.NODE_VERSION))
+        self.assertEqual(response.status_code, requests.codes.created,
+                         test_utils_rfc8040.CODE_SHOULD_BE_201)
+
+    def test_01a_xpdr_device_connection(self):
+        response = test_utils_rfc8040.mount_device("XPDR-C2",
+                                                   ("xpdrc2", self.NODE_VERSION))
+        self.assertEqual(response.status_code, requests.codes.created,
+                         test_utils_rfc8040.CODE_SHOULD_BE_201)
+
+    # Check the correct capabilities for the client ports (if-100GE, if-100GE-ODU4,
+    # if-OCH-OTU4-ODU4)
+    def test_02_check_client_capabilities(self):
+        response = test_utils_rfc8040.portmapping_request("XPDR-A2", "XPDR3-CLIENT1")
+        self.assertEqual(response["status_code"], requests.codes.ok)
+        self.assertEqual(
+            self.CLIENT_CAPABILITIES,
+            response["mapping"][0]["supported-interface-capability"])
+
+    def test_03_check_client_capabilities(self):
+        response = test_utils_rfc8040.portmapping_request("XPDR-C2", "XPDR3-CLIENT1")
+        self.assertEqual(response["status_code"], requests.codes.ok)
+        self.assertEqual(
+            self.CLIENT_CAPABILITIES,
+            response["mapping"][0]["supported-interface-capability"])
+
+    def test_04_100g_ofec_service_path_create(self):
+        response = test_utils_rfc8040.transportpce_api_rpc_request(
+            "transportpce-device-renderer", "service-path",
+            {
+                "service-name": "service_100GE_ofec",
+                "wave-number": "0",
+                "modulation-format": "dp-qpsk",
+                "operation": "create",
+                "nodes": [{
+                    "node-id": "XPDR-A2",
+                    "src-tp": "XPDR3-CLIENT1",
+                    "dest-tp": "XPDR3-NETWORK1"
+                },
+                    {
+                    "node-id": "XPDR-C2",
+                    "src-tp": "XPDR3-CLIENT1",
+                    "dest-tp": "XPDR3-NETWORK1"
+                }],
+                "center-freq": 193.0,
+                "nmc-width": 37.5,
+                "min-freq": 192.975,
+                "max-freq": 193.025,
+                "lower-spectral-slot-number": 265,
+                "higher-spectral-slot-number": 272,
+            })
+        self.assertEqual(response["status_code"], requests.codes.ok)
+        self.assertIn("Interfaces created successfully for nodes: ", response["output"]["result"])
+        # node-interface is list which does not preserve the order
+        a_side = "XPDR-A2"
+        z_side = "XPDR-C2"
+        if response["output"]["node-interface"][0]["node-id"] == z_side:
+            a_side, z_side = z_side, a_side
+        self.assertEqual(
+            {"node-id": a_side,
+             "otu-interface-id": [
+                 "XPDR3-NETWORK1-OTUC1"
+             ],
+             "odu-interface-id": [
+                 "XPDR3-NETWORK1-ODUC1",
+                 "XPDR3-NETWORK1-ODU4"
+             ],
+             "och-interface-id": [
+                 "XPDR3-NETWORK1-265:272",
+                 "XPDR3-NETWORK1-OTSIGROUP-100G"
+             ],
+             "eth-interface-id": [
+                 "XPDR3-CLIENT1-ETHERNET"
+             ]},
+            response["output"]["node-interface"][0])
+        self.assertEqual(
+            {"node-id": z_side,
+             "otu-interface-id": [
+                 "XPDR3-NETWORK1-OTUC1"
+             ],
+             "odu-interface-id": [
+                 "XPDR3-NETWORK1-ODUC1",
+                 "XPDR3-NETWORK1-ODU4"
+             ],
+             "och-interface-id": [
+                 "XPDR3-NETWORK1-265:272",
+                 "XPDR3-NETWORK1-OTSIGROUP-100G"
+             ],
+             "eth-interface-id": [
+                 "XPDR3-CLIENT1-ETHERNET"
+             ]},
+            response["output"]["node-interface"][1])
+
+    def test_05_get_portmapping_network1(self):
+        response = test_utils_rfc8040.portmapping_request("XPDR-A2", "XPDR3-NETWORK1")
+        self.assertEqual(response["status_code"], requests.codes.ok)
+        self.NETWORK2_CHECK_DICT["supporting-otucn"] = "XPDR3-NETWORK1-OTUC1"
+        self.NETWORK2_CHECK_DICT["lcp-hash-val"] = "FDvaQIf2Z08="
+        self.assertIn(
+            self.NETWORK2_CHECK_DICT,
+            response["mapping"])
+
+    def test_06_get_portmapping_network1(self):
+        response = test_utils_rfc8040.portmapping_request("XPDR-C2", "XPDR3-NETWORK1")
+        self.assertEqual(response["status_code"], requests.codes.ok)
+        self.NETWORK2_CHECK_DICT["supporting-otucn"] = "XPDR3-NETWORK1-OTUC1"
+        self.NETWORK2_CHECK_DICT["lcp-hash-val"] = "AJpkaVmZKJk5"
+        self.assertIn(
+            self.NETWORK2_CHECK_DICT,
+            response["mapping"])
+
+    def test_07_check_interface_otsi(self):
+        # pylint: disable=line-too-long
+        response = test_utils_rfc8040.check_node_attribute_request("XPDR-A2", "interface", "XPDR3-NETWORK1-265:272")
+        self.assertEqual(response["status_code"], requests.codes.ok)
+        input_dict_1 = {"name": "XPDR3-NETWORK1-265:272",
+                        "administrative-state": "inService",
+                        "supporting-circuit-pack-name": "1/1/4-PLUG-NET",
+                        "type": "org-openroadm-interfaces:otsi",
+                        "supporting-port": "L1"}
+        input_dict_2 = {
+            "frequency": 193.00000,
+            "otsi-rate": "org-openroadm-common-optical-channel-types:R100G-otsi",
+            "fec": "org-openroadm-common-types:ofec",
+            "transmit-power": -5,
+            "provision-mode": "explicit",
+            "modulation-format": "dp-qpsk"}
+
+        self.assertDictEqual(dict(input_dict_1, **response["interface"][0]),
+                             response["interface"][0])
+        self.assertDictEqual(dict(input_dict_2,
+                                  **response["interface"][0]["org-openroadm-optical-tributary-signal-interfaces:otsi"]),
+                             response["interface"][0]["org-openroadm-optical-tributary-signal-interfaces:otsi"])
+        self.assertDictEqual({"foic-type": "org-openroadm-common-optical-channel-types:foic1.4", "iid": [1]},
+                             response["interface"][0]["org-openroadm-optical-tributary-signal-interfaces:otsi"]["flexo"])
+
+    def test_08_check_interface_otsi(self):
+        # pylint: disable=line-too-long
+        response = test_utils_rfc8040.check_node_attribute_request("XPDR-C2", "interface", "XPDR3-NETWORK1-265:272")
+        self.assertEqual(response["status_code"], requests.codes.ok)
+        input_dict_1 = {"name": "XPDR3-NETWORK1-265:272",
+                        "administrative-state": "inService",
+                        "supporting-circuit-pack-name": "1/1/4-PLUG-NET",
+                        "type": "org-openroadm-interfaces:otsi",
+                        "supporting-port": "L1"}
+        input_dict_2 = {
+            "frequency": 193.00000,
+            "otsi-rate": "org-openroadm-common-optical-channel-types:R100G-otsi",
+            "fec": "org-openroadm-common-types:ofec",
+            "transmit-power": -5,
+            "provision-mode": "explicit",
+            "modulation-format": "dp-qpsk"}
+
+        self.assertDictEqual(dict(input_dict_1, **response["interface"][0]),
+                             response["interface"][0])
+        self.assertDictEqual(dict(input_dict_2,
+                                  **response["interface"][0]["org-openroadm-optical-tributary-signal-interfaces:otsi"]),
+                             response["interface"][0]["org-openroadm-optical-tributary-signal-interfaces:otsi"])
+        self.assertDictEqual({"foic-type": "org-openroadm-common-optical-channel-types:foic1.4", "iid": [1]},
+                             response["interface"][0]["org-openroadm-optical-tributary-signal-interfaces:otsi"]["flexo"])
+
+    def test_09_check_interface_otsig(self):
+        response = test_utils_rfc8040.check_node_attribute_request(
+            "XPDR-A2", "interface", "XPDR3-NETWORK1-OTSIGROUP-100G")
+        self.assertEqual(response["status_code"], requests.codes.ok)
+        input_dict_1 = {"name": "XPDR3-NETWORK1-OTSIGROUP-100G",
+                        "administrative-state": "inService",
+                        "supporting-circuit-pack-name": "1/1/4-PLUG-NET",
+                        ["supporting-interface-list"][0]: "XPDR3-NETWORK1-265:272",
+                        "type": "org-openroadm-interfaces:otsi-group",
+                        "supporting-port": "L1"}
+        input_dict_2 = {"group-id": 1,
+                        "group-rate": "org-openroadm-common-optical-channel-types:R100G-otsi"}
+
+        self.assertDictEqual(dict(input_dict_1, **response["interface"][0]),
+                             response["interface"][0])
+        self.assertDictEqual(dict(input_dict_2,
+                                  **response["interface"][0]["org-openroadm-otsi-group-interfaces:otsi-group"]),
+                             response["interface"][0]["org-openroadm-otsi-group-interfaces:otsi-group"])
+
+    def test_10_check_interface_otsig(self):
+        response = test_utils_rfc8040.check_node_attribute_request(
+            "XPDR-C2", "interface", "XPDR3-NETWORK1-OTSIGROUP-100G")
+        self.assertEqual(response["status_code"], requests.codes.ok)
+        input_dict_1 = {"name": "XPDR3-NETWORK1-OTSIGROUP-100G",
+                        "administrative-state": "inService",
+                        "supporting-circuit-pack-name": "1/1/4-PLUG-NET",
+                        ["supporting-interface-list"][0]: "XPDR3-NETWORK1-265:272",
+                        "type": "org-openroadm-interfaces:otsi-group",
+                        "supporting-port": "L1"}
+        input_dict_2 = {"group-id": 1,
+                        "group-rate": "org-openroadm-common-optical-channel-types:R100G-otsi"}
+
+        self.assertDictEqual(dict(input_dict_1, **response["interface"][0]),
+                             response["interface"][0])
+        self.assertDictEqual(dict(input_dict_2,
+                                  **response["interface"][0]["org-openroadm-otsi-group-interfaces:otsi-group"]),
+                             response["interface"][0]["org-openroadm-otsi-group-interfaces:otsi-group"])
+
+    def test_11_check_interface_otuc1(self):
+        response = test_utils_rfc8040.check_node_attribute_request(
+            "XPDR-A2", "interface", "XPDR3-NETWORK1-OTUC1")
+        self.assertEqual(response["status_code"], requests.codes.ok)
+        input_dict_1 = {"name": "XPDR3-NETWORK1-OTUC1",
+                        "administrative-state": "inService",
+                        "supporting-circuit-pack-name": "1/1/4-PLUG_NET",
+                        ["supporting-interface-list"][0]: "XPDR3-NETWORK1-OTSIGROUP-100G",
+                        "type": "org-openroadm-interfaces:otnOtu",
+                        "supporting-port": "L1"}
+        input_dict_2 = {"rate": "org-openroadm-otn-common-types:OTUCn",
+                        "degthr-percentage": 100,
+                        "tim-detect-mode": "Disabled",
+                        "otucn-n-rate": 1,
+                        "degm-intervals": 2}
+
+        self.assertDictEqual(dict(input_dict_1, **response["interface"][0]),
+                             response["interface"][0])
+        self.assertDictEqual(dict(input_dict_2,
+                                  **response["interface"][0]["org-openroadm-otn-otu-interfaces:otu"]),
+                             response["interface"][0]["org-openroadm-otn-otu-interfaces:otu"])
+
+    def test_12_check_interface_otuc1(self):
+        response = test_utils_rfc8040.check_node_attribute_request(
+            "XPDR-C2", "interface", "XPDR3-NETWORK1-OTUC1")
+        self.assertEqual(response["status_code"], requests.codes.ok)
+        input_dict_1 = {"name": "XPDR3-NETWORK1-OTUC1",
+                        "administrative-state": "inService",
+                        "supporting-circuit-pack-name": "1/1/4-PLUG_NET",
+                        ["supporting-interface-list"][0]: "XPDR3-NETWORK1-OTSIGROUP-100G",
+                        "type": "org-openroadm-interfaces:otnOtu",
+                        "supporting-port": "L1"}
+        input_dict_2 = {"rate": "org-openroadm-otn-common-types:OTUCn",
+                        "degthr-percentage": 100,
+                        "tim-detect-mode": "Disabled",
+                        "otucn-n-rate": 1,
+                        "degm-intervals": 2}
+
+        self.assertDictEqual(dict(input_dict_1, **response["interface"][0]),
+                             response["interface"][0])
+        self.assertDictEqual(dict(input_dict_2,
+                                  **response["interface"][0]["org-openroadm-otn-otu-interfaces:otu"]),
+                             response["interface"][0]["org-openroadm-otn-otu-interfaces:otu"])
+
+    def test_13_check_interface_oduc1(self):
+        response = test_utils_rfc8040.check_node_attribute_request(
+            "XPDR-A2", "interface", "XPDR3-NETWORK1-ODUC1")
+        self.assertEqual(response["status_code"], requests.codes.ok)
+        input_dict_1 = {"name": "XPDR3-NETWORK1-ODUC1",
+                        "administrative-state": "inService",
+                        "supporting-circuit-pack-name": "1/1/4-PLUG_NET",
+                        "supporting-interface-list": "XPDR3-NETWORK1-OTUC1",
+                        "type": "org-openroadm-interfaces:otnOdu",
+                        "supporting-port": "L1"}
+
+        input_dict_2 = {"odu-function": "org-openroadm-otn-common-types:ODU-TTP",
+                        "rate": "org-openroadm-otn-common-types:ODUCn",
+                        "degm-intervals": 2,
+                        "degthr-percentage": 100,
+                        "monitoring-mode": "terminated",
+                        "oducn-n-rate": 1
+                        }
+        self.assertDictEqual(dict(input_dict_1, **response["interface"][0]),
+                             response["interface"][0])
+        self.assertDictEqual(dict(input_dict_2, **response["interface"][0]["org-openroadm-otn-odu-interfaces:odu"]),
+                             response["interface"][0]["org-openroadm-otn-odu-interfaces:odu"])
+        self.assertDictEqual(
+            {"payload-type": "22", "exp-payload-type": "22"},
+            response["interface"][0]["org-openroadm-otn-odu-interfaces:odu"]["opu"])
+
+    def test_14_check_interface_oduc1(self):
+        response = test_utils_rfc8040.check_node_attribute_request(
+            "XPDR-C2", "interface", "XPDR3-NETWORK1-ODUC1")
+        self.assertEqual(response["status_code"], requests.codes.ok)
+
+        input_dict_1 = {"name": "XPDR3-NETWORK1-ODUC1",
+                        "administrative-state": "inService",
+                        "supporting-circuit-pack-name": "1/1/4-PLUG_NET",
+                        "supporting-interface-list": "XPDR3-NETWORK1-OTUC1",
+                        "type": "org-openroadm-interfaces:otnOdu",
+                        "supporting-port": "L1"}
+
+        input_dict_2 = {"odu-function": "org-openroadm-otn-common-types:ODU-TTP",
+                        "rate": "org-openroadm-otn-common-types:ODUCn",
+                        "degm-intervals": 2,
+                        "degthr-percentage": 100,
+                        "monitoring-mode": "terminated",
+                        "oducn-n-rate": 1
+                        }
+        self.assertDictEqual(dict(input_dict_1, **response["interface"][0]),
+                             response["interface"][0])
+        self.assertDictEqual(dict(input_dict_2, **response["interface"][0]["org-openroadm-otn-odu-interfaces:odu"]),
+                             response["interface"][0]["org-openroadm-otn-odu-interfaces:odu"])
+        self.assertDictEqual(
+            {"payload-type": "22", "exp-payload-type": "22"},
+            response["interface"][0]["org-openroadm-otn-odu-interfaces:odu"]["opu"])
+
+    def test_15_check_interface_odu4(self):
+        response = test_utils_rfc8040.check_node_attribute_request(
+            "XPDR-A2", "interface", "XPDR3-NETWORK1-ODU4")
+        self.assertEqual(response["status_code"], requests.codes.ok)
+
+        input_dict_1 = {"name": "XPDR3-NETWORK1-ODU4",
+                        "administrative-state": "inService",
+                        "supporting-circuit-pack-name": "1/1/4-PLUG_NET",
+                        "supporting-interface-list": "XPDR3-NETWORK1-ODUC1",
+                        "type": "org-openroadm-interfaces:otnOdu",
+                        "supporting-port": "L1"}
+
+        input_dict_2 = {"odu-function": "org-openroadm-otn-common-types:ODU-TTP-CTP",
+                        "rate": "org-openroadm-otn-common-types:ODU4",
+                        "degm-intervals": 2,
+                        "degthr-percentage": 100,
+                        "monitoring-mode": "terminated"
+                        }
+        self.assertDictEqual(dict(input_dict_1, **response["interface"][0]),
+                             response["interface"][0])
+        self.assertDictEqual(dict(input_dict_2, **response["interface"][0]["org-openroadm-otn-odu-interfaces:odu"]),
+                             response["interface"][0]["org-openroadm-otn-odu-interfaces:odu"])
+        self.assertDictEqual(
+            {"payload-type": "07", "exp-payload-type": "07"},
+            response["interface"][0]["org-openroadm-otn-odu-interfaces:odu"]["opu"])
+
+        # TODO: Check the trib-port numbering
+
+    def test_16_check_interface_odu4(self):
+        response = test_utils_rfc8040.check_node_attribute_request(
+            "XPDR-C2", "interface", "XPDR3-NETWORK1-ODU4")
+        self.assertEqual(response["status_code"], requests.codes.ok)
+
+        input_dict_1 = {"name": "XPDR3-NETWORK1-ODU4",
+                        "administrative-state": "inService",
+                        "supporting-circuit-pack-name": "1/1/4-PLUG_NET",
+                        "supporting-interface-list": "XPDR3-NETWORK1-ODUC1",
+                        "type": "org-openroadm-interfaces:otnOdu",
+                        "supporting-port": "L1"}
+
+        input_dict_2 = {"odu-function": "org-openroadm-otn-common-types:ODU-TTP-CTP",
+                        "rate": "org-openroadm-otn-common-types:ODU4",
+                        "degm-intervals": 2,
+                        "degthr-percentage": 100,
+                        "monitoring-mode": "terminated"
+                        }
+        self.assertDictEqual(dict(input_dict_1, **response["interface"][0]),
+                             response["interface"][0])
+        self.assertDictEqual(dict(input_dict_2, **response["interface"][0]["org-openroadm-otn-odu-interfaces:odu"]),
+                             response["interface"][0]["org-openroadm-otn-odu-interfaces:odu"])
+        self.assertDictEqual(
+            {"payload-type": "07", "exp-payload-type": "07"},
+            response["interface"][0]["org-openroadm-otn-odu-interfaces:odu"]["opu"])
+
+        # TODO: Check the trib-port numbering
+
+    def test_17_check_interface_100ge_client(self):
+        response = test_utils_rfc8040.check_node_attribute_request(
+            "XPDR-A2", "interface", "XPDR3-CLIENT1-ETHERNET")
+        self.assertEqual(response["status_code"], requests.codes.ok)
+        input_dict_1 = {"name": "XPDR3-CLIENT1-ETHERNET-100G",
+                        "administrative-state": "inService",
+                        "supporting-circuit-pack-name": "1/1/3-PLUG-CLIENT",
+                        "type": "org-openroadm-interfaces:ethernetCsmacd",
+                        "supporting-port": "C1"
+                        }
+        input_dict_2 = {"speed": 100000,
+                        "fec": "org-openroadm-common-types:off"}
+        self.assertDictEqual(dict(input_dict_1, **response["interface"][0]),
+                             response["interface"][0])
+        self.assertDictEqual(dict(input_dict_2,
+                                  **response["interface"][0]["org-openroadm-ethernet-interfaces:ethernet"]),
+                             response["interface"][0]["org-openroadm-ethernet-interfaces:ethernet"])
+
+    def test_18_check_interface_100ge_client(self):
+        response = test_utils_rfc8040.check_node_attribute_request(
+            "XPDR-C2", "interface", "XPDR3-CLIENT1-ETHERNET")
+        self.assertEqual(response["status_code"], requests.codes.ok)
+        input_dict_1 = {"name": "XPDR3-CLIENT1-ETHERNET-100G",
+                        "administrative-state": "inService",
+                        "supporting-circuit-pack-name": "1/1/3-PLUG-CLIENT",
+                        "type": "org-openroadm-interfaces:ethernetCsmacd",
+                        "supporting-port": "C1"
+                        }
+        input_dict_2 = {"speed": 100000,
+                        "fec": "org-openroadm-common-types:off"}
+        self.assertDictEqual(dict(input_dict_1, **response["interface"][0]),
+                             response["interface"][0])
+        self.assertDictEqual(dict(input_dict_2,
+                                  **response["interface"][0]["org-openroadm-ethernet-interfaces:ethernet"]),
+                             response["interface"][0]["org-openroadm-ethernet-interfaces:ethernet"])
+
+    # Delete the service path
+    def test_19_service_path_delete_100ge(self):
+        response = test_utils_rfc8040.transportpce_api_rpc_request(
+            "transportpce-device-renderer", "service-path",
+            {
+                "service-name": "service_100GE_ofec",
+                "wave-number": "0",
+                "modulation-format": "dp-qpsk",
+                "operation": "delete",
+                "nodes": [{
+                    "node-id": "XPDR-A2",
+                    "src-tp": "XPDR3-CLIENT1",
+                    "dest-tp": "XPDR3-NETWORK1"
+                },
+                    {
+                    "node-id": "XPDR-C2",
+                    "src-tp": "XPDR3-CLIENT1",
+                    "dest-tp": "XPDR3-NETWORK1"
+                }],
+                "center-freq": 193.0,
+                "nmc-width": 37.5,
+                "min-freq": 192.975,
+                "max-freq": 193.025,
+                "lower-spectral-slot-number": 265,
+                "higher-spectral-slot-number": 272,
+            })
+        self.assertEqual(response["status_code"], requests.codes.ok)
+        self.assertIn("Request processed", response["output"]["result"])
+
+    def test_20_check_no_interface_100ge_client(self):
+        response = test_utils_rfc8040.check_node_attribute_request(
+            "XPDR-A2", "interface", "XPDR3-CLIENT1-ETHERNET")
+        self.assertEqual(response["status_code"], requests.codes.conflict)
+
+    def test_21_check_no_interface_100ge_client(self):
+        response = test_utils_rfc8040.check_node_attribute_request(
+            "XPDR-C2", "interface", "XPDR3-CLIENT1-ETHERNET")
+        self.assertEqual(response["status_code"], requests.codes.conflict)
+
+    def test_22_check_no_interface_odu4(self):
+        response = test_utils_rfc8040.check_node_attribute_request(
+            "XPDR-A2", "interface", "XPDR3-NETWORK1-ODU4")
+        self.assertEqual(response["status_code"], requests.codes.conflict)
+
+    def test_23_check_no_interface_odu4(self):
+        response = test_utils_rfc8040.check_node_attribute_request(
+            "XPDR-C2", "interface", "XPDR3-NETWORK1-ODU4")
+        self.assertEqual(response["status_code"], requests.codes.conflict)
+
+    def test_24_check_no_interface_otuc2(self):
+        response = test_utils_rfc8040.check_node_attribute_request(
+            "XPDR-A2", "interface", "XPDR3-NETWORK1-ODUC1")
+        self.assertEqual(response["status_code"], requests.codes.conflict)
+
+    def test_25_check_no_interface_otuc2(self):
+        response = test_utils_rfc8040.check_node_attribute_request(
+            "XPDR-C2", "interface", "XPDR3-NETWORK1-ODUC1")
+        self.assertEqual(response["status_code"], requests.codes.conflict)
+
+    # Check if port-mapping data is updated, where the supporting-otucn is deleted
+    def test_26_check_no_otuc1(self):
+        response = test_utils_rfc8040.portmapping_request("XPDR-A2", "XPDR3-NETWORK1")
+        self.assertRaises(KeyError, lambda: response["supporting-otucn"])
+
+    def test_27_check_no_otuc1(self):
+        response = test_utils_rfc8040.portmapping_request("XPDR-C2", "XPDR3-NETWORK1")
+        self.assertRaises(KeyError, lambda: response["supporting-otucn"])
+
+    def test_28_check_no_interface_otsig(self):
+        response = test_utils_rfc8040.check_node_attribute_request(
+            "XPDR-A2", "interface", "XPDR3-NETWORK1-OTSIGROUP-100G")
+        self.assertEqual(response["status_code"], requests.codes.conflict)
+
+    def test_29_check_no_interface_otsig(self):
+        response = test_utils_rfc8040.check_node_attribute_request(
+            "XPDR-C2", "interface", "XPDR3-NETWORK1-OTSIGROUP-100G")
+        self.assertEqual(response["status_code"], requests.codes.conflict)
+
+    def test_30_check_no_interface_otsi(self):
+        response = test_utils_rfc8040.check_node_attribute_request(
+            "XPDR-A2", "interface", "XPDR3-NETWORK1-265:272")
+        self.assertEqual(response["status_code"], requests.codes.conflict)
+
+    def test_31_check_no_interface_otsi(self):
+        response = test_utils_rfc8040.check_node_attribute_request(
+            "XPDR-C2", "interface", "XPDR3-NETWORK1-265:272")
+        self.assertEqual(response["status_code"], requests.codes.conflict)
+
+    # Disconnect the XPDR
+    def test_32_xpdr_device_disconnection(self):
+        response = test_utils_rfc8040.unmount_device("XPDR-A2")
+        self.assertIn(response.status_code, (requests.codes.ok, requests.codes.no_content))
+
+    def test_33_xpdr_device_disconnected(self):
+        response = test_utils_rfc8040.check_device_connection("XPDR-A2")
+        self.assertEqual(response["status_code"], requests.codes.conflict)
+        self.assertIn(response["connection-status"]["error-type"], ("protocol", "application"))
+        self.assertEqual(response["connection-status"]["error-tag"], "data-missing")
+        self.assertEqual(response["connection-status"]["error-message"],
+                         "Request could not be completed because the relevant data model content does not exist")
+
+    def test_34_xpdr_device_not_connected(self):
+        response = test_utils_rfc8040.get_portmapping_node_info("XPDR-A2")
+        self.assertEqual(response["status_code"], requests.codes.conflict)
+        self.assertIn(response["node-info"]["error-type"], ("protocol", "application"))
+        self.assertEqual(response["node-info"]["error-tag"], "data-missing")
+        self.assertEqual(response["node-info"]["error-message"],
+                         "Request could not be completed because the relevant data model content does not exist")
+
+    def test_35_xpdr_device_disconnection(self):
+        response = test_utils_rfc8040.unmount_device("XPDR-C2")
+        self.assertIn(response.status_code, (requests.codes.ok, requests.codes.no_content))
+
+    def test_36_xpdr_device_disconnected(self):
+        response = test_utils_rfc8040.check_device_connection("XPDR-C2")
+        self.assertEqual(response["status_code"], requests.codes.conflict)
+        self.assertIn(response["connection-status"]["error-type"], ("protocol", "application"))
+        self.assertEqual(response["connection-status"]["error-tag"], "data-missing")
+        self.assertEqual(response["connection-status"]["error-message"],
+                         "Request could not be completed because the relevant data model content does not exist")
+
+    def test_37_xpdr_device_not_connected(self):
+        response = test_utils_rfc8040.get_portmapping_node_info("XPDR-C2")
+        self.assertEqual(response["status_code"], requests.codes.conflict)
+        self.assertIn(response["node-info"]["error-type"], ("protocol", "application"))
+        self.assertEqual(response["node-info"]["error-tag"], "data-missing")
+        self.assertEqual(response["node-info"]["error-message"],
+                         "Request could not be completed because the relevant data model content does not exist")
+
+
+if __name__ == "__main__":
+    unittest.main(verbosity=2)
index 51dc2e60ba2bc940f6d203f8c191461ee3afc16d..fa90adc38e0684497c567719f75cd2d29a661483 100644 (file)
@@ -239,7 +239,7 @@ class TransportPCEtesting(unittest.TestCase):
         self.assertEqual(response.status_code, requests.codes.ok)
         res = response.json()
         nbNode = len(res['network'][0]['node'])
-        self.assertEqual(nbNode, 4, 'There should be 4 nodes')
+        self.assertEqual(nbNode, 6, 'There should be 6 nodes')
         self.assertNotIn('ietf-network-topology:link', res['network'][0])
 
     def test_12_create_OTUC4_service(self):