Manage 100GE on XPDR with a list of xponder
[transportpce.git] / tests / transportpce_tests / 2.2.1 / test03_topology.py
1 #!/usr/bin/env python
2
3 ##############################################################################
4 # Copyright (c) 2017 Orange, Inc. and others.  All rights reserved.
5 #
6 # All rights reserved. This program and the accompanying materials
7 # are made available under the terms of the Apache License, Version 2.0
8 # which accompanies this distribution, and is available at
9 # http://www.apache.org/licenses/LICENSE-2.0
10 ##############################################################################
11
12 # pylint: disable=no-member
13 # pylint: disable=too-many-public-methods
14 # pylint: disable=too-many-lines
15
16 import unittest
17 import time
18 import logging
19 import requests
20 # pylint: disable=wrong-import-order
21 import sys
22 sys.path.append('transportpce_tests/common/')
23 # pylint: disable=wrong-import-position
24 # pylint: disable=import-error
25 import test_utils_rfc8040  # nopep8
26
27
28 class TransportPCEtesting(unittest.TestCase):
29
30     processes = None
31     CHECK_DICT1 = {
32         'ROADM-A1-SRG1': {
33             'node_type': 'SRG',
34             'checks_tp': [({'tp-id': 'SRG1-CP-TXRX', 'org-openroadm-common-network:administrative-state': 'inService',
35                             'org-openroadm-common-network:tp-type': 'SRG-TXRX-CP',
36                             'org-openroadm-common-network:operational-state': 'inService'}),
37                           ({'tp-id': 'SRG1-PP1-TXRX', 'org-openroadm-common-network:administrative-state': 'inService',
38                             'org-openroadm-common-network:tp-type': 'SRG-TXRX-PP',
39                             'org-openroadm-common-network:operational-state': 'inService'})]
40         },
41         'ROADM-A1-SRG3': {
42             'node_type': 'SRG',
43             'checks_tp': [({'tp-id': 'SRG3-CP-TXRX', 'org-openroadm-common-network:administrative-state': 'inService',
44                             'org-openroadm-common-network:tp-type': 'SRG-TXRX-CP',
45                             'org-openroadm-common-network:operational-state': 'inService'}),
46                           ({'tp-id': 'SRG3-PP1-TXRX', 'org-openroadm-common-network:administrative-state': 'inService',
47                             'org-openroadm-common-network:tp-type': 'SRG-TXRX-PP',
48                             'org-openroadm-common-network:operational-state': 'inService'})]
49         },
50         'ROADM-A1-DEG1': {
51             'node_type': 'DEGREE',
52             'checks_tp': [({'tp-id': 'DEG1-TTP-TXRX', 'org-openroadm-common-network:administrative-state': 'inService',
53                             'org-openroadm-common-network:tp-type': 'DEGREE-TXRX-TTP',
54                             'org-openroadm-common-network:operational-state': 'inService'}),
55                           ({'tp-id': 'DEG1-CTP-TXRX', 'org-openroadm-common-network:administrative-state': 'inService',
56                             'org-openroadm-common-network:tp-type': 'DEGREE-TXRX-CTP',
57                             'org-openroadm-common-network:operational-state': 'inService'})]
58         },
59         'ROADM-A1-DEG2': {
60             'node_type': 'DEGREE',
61             'checks_tp': [({'tp-id': 'DEG2-TTP-TXRX', 'org-openroadm-common-network:administrative-state': 'inService',
62                             'org-openroadm-common-network:tp-type': 'DEGREE-TXRX-TTP',
63                             'org-openroadm-common-network:operational-state': 'inService'}),
64                           ({'tp-id': 'DEG2-CTP-TXRX', 'org-openroadm-common-network:administrative-state': 'inService',
65                             'org-openroadm-common-network:tp-type': 'DEGREE-TXRX-CTP',
66                             'org-openroadm-common-network:operational-state': 'inService'})]
67         }
68     }
69     CHECK_DICT2 = {
70         'ROADM-C1-SRG1': {
71             'node_type': 'SRG',
72             'checks_tp': [({'tp-id': 'SRG1-CP-TXRX', 'org-openroadm-common-network:administrative-state': 'inService',
73                             'org-openroadm-common-network:tp-type': 'SRG-TXRX-CP',
74                             'org-openroadm-common-network:operational-state': 'inService'}),
75                           ({'tp-id': 'SRG1-PP1-TXRX', 'org-openroadm-common-network:administrative-state': 'inService',
76                             'org-openroadm-common-network:tp-type': 'SRG-TXRX-PP',
77                             'org-openroadm-common-network:operational-state': 'inService'})]
78         },
79         'ROADM-C1-DEG1': {
80             'node_type': 'DEGREE',
81             'checks_tp': [({'tp-id': 'DEG1-TTP-TXRX', 'org-openroadm-common-network:administrative-state': 'inService',
82                             'org-openroadm-common-network:tp-type': 'DEGREE-TXRX-TTP',
83                             'org-openroadm-common-network:operational-state': 'inService'}),
84                           ({'tp-id': 'DEG1-CTP-TXRX', 'org-openroadm-common-network:administrative-state': 'inService',
85                             'org-openroadm-common-network:tp-type': 'DEGREE-TXRX-CTP',
86                             'org-openroadm-common-network:operational-state': 'inService'})]
87         },
88         'ROADM-C1-DEG2': {
89             'node_type': 'DEGREE',
90             'checks_tp': [({'tp-id': 'DEG2-TTP-TXRX', 'org-openroadm-common-network:administrative-state': 'inService',
91                             'org-openroadm-common-network:tp-type': 'DEGREE-TXRX-TTP',
92                             'org-openroadm-common-network:operational-state': 'inService'}),
93                           ({'tp-id': 'DEG2-CTP-TXRX', 'org-openroadm-common-network:administrative-state': 'inService',
94                             'org-openroadm-common-network:tp-type': 'DEGREE-TXRX-CTP',
95                             'org-openroadm-common-network:operational-state': 'inService'})]
96         }
97     }
98     NODE_VERSION = '2.2.1'
99
100     @classmethod
101     def setUpClass(cls):
102         cls.processes = test_utils_rfc8040.start_tpce()
103         cls.processes = test_utils_rfc8040.start_sims([('xpdra', cls.NODE_VERSION), ('roadma', cls.NODE_VERSION),
104                                                        ('roadmb', cls.NODE_VERSION), ('roadmc', cls.NODE_VERSION)])
105
106     @classmethod
107     def tearDownClass(cls):
108         # pylint: disable=not-an-iterable
109         for process in cls.processes:
110             test_utils_rfc8040.shutdown_process(process)
111         print("all processes killed")
112
113     def setUp(self):
114         time.sleep(5)
115
116     def test_01_connect_ROADM_A1(self):
117         response = test_utils_rfc8040.mount_device("ROADM-A1", ('roadma', self.NODE_VERSION))
118         self.assertEqual(response.status_code, requests.codes.created, test_utils_rfc8040.CODE_SHOULD_BE_201)
119
120     def test_02_getClliNetwork(self):
121         response = test_utils_rfc8040.get_ietf_network_request('clli-network', 'config')
122         self.assertEqual(response['status_code'], requests.codes.ok)
123         logging.info(response)
124         self.assertEqual(response['network'][0]['node'][0]['node-id'], 'NodeA')
125         self.assertEqual(response['network'][0]['node'][0]['org-openroadm-clli-network:clli'], 'NodeA')
126
127     def test_03_getOpenRoadmNetwork(self):
128         response = test_utils_rfc8040.get_ietf_network_request('openroadm-network', 'config')
129         self.assertEqual(response['status_code'], requests.codes.ok)
130         self.assertEqual(response['network'][0]['node'][0]['node-id'], 'ROADM-A1')
131         self.assertEqual(response['network'][0]['node'][0]['supporting-node'][0]['network-ref'], 'clli-network')
132         self.assertEqual(response['network'][0]['node'][0]['supporting-node'][0]['node-ref'], 'NodeA')
133         self.assertEqual(response['network'][0]['node'][0]['org-openroadm-common-network:node-type'], 'ROADM')
134         self.assertEqual(response['network'][0]['node'][0]['org-openroadm-network:model'], 'model2')
135
136     def test_04_getLinks_OpenroadmTopology(self):
137         # pylint: disable=redundant-unittest-assert
138         response = test_utils_rfc8040.get_ietf_network_request('openroadm-topology', 'config')
139         self.assertEqual(response['status_code'], requests.codes.ok)
140         self.assertEqual(len(response['network'][0]['ietf-network-topology:link']), 10)
141         check_list = {'EXPRESS-LINK': ['ROADM-A1-DEG2-DEG2-CTP-TXRXtoROADM-A1-DEG1-DEG1-CTP-TXRX',
142                                        'ROADM-A1-DEG1-DEG1-CTP-TXRXtoROADM-A1-DEG2-DEG2-CTP-TXRX'],
143                       'ADD-LINK': ['ROADM-A1-SRG1-SRG1-CP-TXRXtoROADM-A1-DEG2-DEG2-CTP-TXRX',
144                                    'ROADM-A1-SRG1-SRG1-CP-TXRXtoROADM-A1-DEG1-DEG1-CTP-TXRX',
145                                    'ROADM-A1-SRG3-SRG3-CP-TXRXtoROADM-A1-DEG2-DEG2-CTP-TXRX',
146                                    'ROADM-A1-SRG3-SRG3-CP-TXRXtoROADM-A1-DEG1-DEG1-CTP-TXRX'],
147                       'DROP-LINK': ['ROADM-A1-DEG1-DEG1-CTP-TXRXtoROADM-A1-SRG1-SRG1-CP-TXRX',
148                                     'ROADM-A1-DEG2-DEG2-CTP-TXRXtoROADM-A1-SRG1-SRG1-CP-TXRX',
149                                     'ROADM-A1-DEG1-DEG1-CTP-TXRXtoROADM-A1-SRG3-SRG3-CP-TXRX',
150                                     'ROADM-A1-DEG2-DEG2-CTP-TXRXtoROADM-A1-SRG3-SRG3-CP-TXRX']
151                       }
152         for link in response['network'][0]['ietf-network-topology:link']:
153             linkId = link['link-id']
154             linkType = link['org-openroadm-common-network:link-type']
155             self.assertIn(linkType, check_list)
156             find = linkId in check_list[linkType]
157             self.assertEqual(find, True)
158             (check_list[linkType]).remove(linkId)
159         for link in check_list.values():
160             self.assertEqual(len(link), 0)
161
162     def test_05_getNodes_OpenRoadmTopology(self):
163         # pylint: disable=redundant-unittest-assert
164         response = test_utils_rfc8040.get_ietf_network_request('openroadm-topology', 'config')
165         self.assertEqual(response['status_code'], requests.codes.ok)
166         self.assertEqual(len(response['network'][0]['node']), 4)
167         listNode = ['ROADM-A1-SRG1', 'ROADM-A1-SRG3', 'ROADM-A1-DEG1', 'ROADM-A1-DEG2']
168         for node in response['network'][0]['node']:
169             self.assertIn({'network-ref': 'openroadm-network', 'node-ref': 'ROADM-A1'}, node['supporting-node'])
170             nodeType = node['org-openroadm-common-network:node-type']
171             nodeId = node['node-id']
172             self.assertIn(nodeId, self.CHECK_DICT1)
173             self.assertEqual(nodeType, self.CHECK_DICT1[nodeId]['node_type'])
174             if self.CHECK_DICT1[nodeId]['node_type'] == 'SRG':
175                 self.assertEqual(len(node['ietf-network-topology:termination-point']), 5)
176             for tp in self.CHECK_DICT1[nodeId]['checks_tp']:
177                 self.assertIn(tp, node['ietf-network-topology:termination-point'])
178             self.assertIn({'network-ref': 'clli-network', 'node-ref': 'NodeA'}, node['supporting-node'])
179             self.assertIn({'network-ref': 'openroadm-network', 'node-ref': 'ROADM-A1'}, node['supporting-node'])
180             listNode.remove(nodeId)
181         self.assertEqual(len(listNode), 0)
182
183     def test_06_connect_XPDRA(self):
184         response = test_utils_rfc8040.mount_device("XPDR-A1", ('xpdra', self.NODE_VERSION))
185         self.assertEqual(response.status_code, requests.codes.created, test_utils_rfc8040.CODE_SHOULD_BE_201)
186
187     def test_07_getClliNetwork(self):
188         response = test_utils_rfc8040.get_ietf_network_request('clli-network', 'config')
189         self.assertEqual(response['status_code'], requests.codes.ok)
190         self.assertEqual(response['network'][0]['node'][0]['node-id'], 'NodeA')
191         self.assertEqual(response['network'][0]['node'][0]['org-openroadm-clli-network:clli'], 'NodeA')
192
193     def test_08_getOpenRoadmNetwork(self):
194         # pylint: disable=redundant-unittest-assert
195         response = test_utils_rfc8040.get_ietf_network_request('openroadm-network', 'config')
196         self.assertEqual(response['status_code'], requests.codes.ok)
197         nbNode = len(response['network'][0]['node'])
198         self.assertEqual(nbNode, 2)
199         for node in response['network'][0]['node']:
200             self.assertEqual(node['supporting-node'][0]['network-ref'], 'clli-network')
201             self.assertEqual(node['supporting-node'][0]['node-ref'], 'NodeA')
202             nodeId = node['node-id']
203             if nodeId == 'XPDR-A1':
204                 self.assertEqual(node['org-openroadm-common-network:node-type'], 'XPONDER')
205             elif nodeId == 'ROADM-A1':
206                 self.assertEqual(node['org-openroadm-common-network:node-type'], 'ROADM')
207             else:
208                 self.assertFalse(True)
209                 continue
210             self.assertEqual(node['org-openroadm-network:model'], 'model2')
211
212     def test_09_getNodes_OpenRoadmTopology(self):
213         # pylint: disable=redundant-unittest-assert
214         response = test_utils_rfc8040.get_ietf_network_request('openroadm-topology', 'config')
215         self.assertEqual(response['status_code'], requests.codes.ok)
216         self.assertEqual(len(response['network'][0]['node']), 5)
217         listNode = ['XPDR-A1-XPDR1', 'ROADM-A1-SRG1', 'ROADM-A1-SRG3', 'ROADM-A1-DEG1', 'ROADM-A1-DEG2']
218         for node in response['network'][0]['node']:
219             nodeType = node['org-openroadm-common-network:node-type']
220             nodeId = node['node-id']
221             # Tests related to XPDRA nodes
222             if nodeId == 'XPDR-A1-XPDR1':
223                 self.assertIn({'network-ref': 'openroadm-network', 'node-ref': 'XPDR-A1'}, node['supporting-node'])
224                 self.assertIn({'network-ref': 'clli-network', 'node-ref': 'NodeA'}, node['supporting-node'])
225                 self.assertEqual(nodeType, 'XPONDER')
226                 client = 0
227                 network = 0
228                 for tp in node['ietf-network-topology:termination-point']:
229                     tpType = (tp['org-openroadm-common-network:tp-type'])
230                     tpId = tp['tp-id']
231                     if tpType == 'XPONDER-CLIENT':
232                         client += 1
233                     elif tpType == 'XPONDER-NETWORK':
234                         network += 1
235                     if tpId == 'XPDR1-NETWORK2':
236                         self.assertEqual(tp['transportpce-topology:associated-connection-map-port'], 'XPDR1-CLIENT2')
237                     if tpId == 'XPDR1-CLIENT2':
238                         self.assertEqual(tp['transportpce-topology:associated-connection-map-port'], 'XPDR1-NETWORK2')
239                 self.assertEqual(client, 2)
240                 self.assertEqual(network, 2)
241                 listNode.remove(nodeId)
242             elif nodeId in self.CHECK_DICT1:
243                 self.assertEqual(nodeType, self.CHECK_DICT1[nodeId]['node_type'])
244                 if self.CHECK_DICT1[nodeId]['node_type'] == 'SRG':
245                     self.assertEqual(len(node['ietf-network-topology:termination-point']), 5)
246                 for tp in self.CHECK_DICT1[nodeId]['checks_tp']:
247                     self.assertIn(tp, node['ietf-network-topology:termination-point'])
248                 self.assertIn({'network-ref': 'clli-network', 'node-ref': 'NodeA'}, node['supporting-node'])
249                 self.assertIn({'network-ref': 'openroadm-network', 'node-ref': 'ROADM-A1'}, node['supporting-node'])
250                 listNode.remove(nodeId)
251             else:
252                 self.assertFalse(True)
253         self.assertEqual(len(listNode), 0)
254
255     # Connect the tail XPDRA to ROADMA and vice versa
256     def test_10_connect_tail_xpdr_rdm(self):
257         # Connect the tail: XPDRA to ROADMA
258         response = test_utils_rfc8040.connect_xpdr_to_rdm_request(
259             {'xpdr-node': 'XPDR-A1', 'xpdr-num': '1', 'network-num': '1',
260              'rdm-node': 'ROADM-A1', 'srg-num': '1', 'termination-point-num': 'SRG1-PP1-TXRX'})
261         self.assertEqual(response.status_code, requests.codes.ok)
262
263     def test_11_connect_tail_rdm_xpdr(self):
264         response = test_utils_rfc8040.connect_rdm_to_xpdr_request(
265             {'xpdr-node': 'XPDR-A1', 'xpdr-num': '1', 'network-num': '1',
266              'rdm-node': 'ROADM-A1', 'srg-num': '1', 'termination-point-num': 'SRG1-PP1-TXRX'})
267         self.assertEqual(response.status_code, requests.codes.ok)
268
269     def test_12_getLinks_OpenRoadmTopology(self):
270         # pylint: disable=redundant-unittest-assert
271         response = test_utils_rfc8040.get_ietf_network_request('openroadm-topology', 'config')
272         self.assertEqual(response['status_code'], requests.codes.ok)
273         self.assertEqual(len(response['network'][0]['ietf-network-topology:link']), 12)
274         check_list = {'EXPRESS-LINK': ['ROADM-A1-DEG2-DEG2-CTP-TXRXtoROADM-A1-DEG1-DEG1-CTP-TXRX',
275                                        'ROADM-A1-DEG1-DEG1-CTP-TXRXtoROADM-A1-DEG2-DEG2-CTP-TXRX'],
276                       'ADD-LINK': ['ROADM-A1-SRG1-SRG1-CP-TXRXtoROADM-A1-DEG2-DEG2-CTP-TXRX',
277                                    'ROADM-A1-SRG1-SRG1-CP-TXRXtoROADM-A1-DEG1-DEG1-CTP-TXRX',
278                                    'ROADM-A1-SRG3-SRG3-CP-TXRXtoROADM-A1-DEG2-DEG2-CTP-TXRX',
279                                    'ROADM-A1-SRG3-SRG3-CP-TXRXtoROADM-A1-DEG1-DEG1-CTP-TXRX'],
280                       'DROP-LINK': ['ROADM-A1-DEG1-DEG1-CTP-TXRXtoROADM-A1-SRG1-SRG1-CP-TXRX',
281                                     'ROADM-A1-DEG2-DEG2-CTP-TXRXtoROADM-A1-SRG1-SRG1-CP-TXRX',
282                                     'ROADM-A1-DEG1-DEG1-CTP-TXRXtoROADM-A1-SRG3-SRG3-CP-TXRX',
283                                     'ROADM-A1-DEG2-DEG2-CTP-TXRXtoROADM-A1-SRG3-SRG3-CP-TXRX'],
284                       'XPONDER-INPUT': ['ROADM-A1-SRG1-SRG1-PP1-TXRXtoXPDR-A1-XPDR1-XPDR1-NETWORK1'],
285                       'XPONDER-OUTPUT': ['XPDR-A1-XPDR1-XPDR1-NETWORK1toROADM-A1-SRG1-SRG1-PP1-TXRX']
286                       }
287         for link in response['network'][0]['ietf-network-topology:link']:
288             linkId = link['link-id']
289             linkType = link['org-openroadm-common-network:link-type']
290             self.assertIn(linkType, check_list)
291             find = linkId in check_list[linkType]
292             self.assertEqual(find, True)
293             (check_list[linkType]).remove(linkId)
294         for link in check_list.values():
295             self.assertEqual(len(link), 0)
296
297     def test_13_connect_ROADMC(self):
298         response = test_utils_rfc8040.mount_device("ROADM-C1", ('roadmc', self.NODE_VERSION))
299         self.assertEqual(response.status_code, requests.codes.created, test_utils_rfc8040.CODE_SHOULD_BE_201)
300
301     def test_14_omsAttributes_ROADMA_ROADMC(self):
302         # Config ROADMA-ROADMC oms-attributes
303         data = {"span": {
304             "auto-spanloss": "true",
305             "engineered-spanloss": 12.2,
306             "link-concatenation": [{
307                 "SRLG-Id": 0,
308                 "fiber-type": "smf",
309                 "SRLG-length": 100000,
310                 "pmd": 0.5}]}}
311         response = test_utils_rfc8040.add_oms_attr_request(
312             "ROADM-A1-DEG2-DEG2-TTP-TXRXtoROADM-C1-DEG1-DEG1-TTP-TXRX", data)
313         self.assertEqual(response.status_code, requests.codes.created)
314
315     def test_15_omsAttributes_ROADMC_ROADMA(self):
316         # Config ROADM-C1-ROADM-A1 oms-attributes
317         data = {"span": {
318             "auto-spanloss": "true",
319             "engineered-spanloss": 12.2,
320             "link-concatenation": [{
321                 "SRLG-Id": 0,
322                 "fiber-type": "smf",
323                 "SRLG-length": 100000,
324                 "pmd": 0.5}]}}
325
326         response = test_utils_rfc8040.add_oms_attr_request(
327             "ROADM-C1-DEG1-DEG1-TTP-TXRXtoROADM-A1-DEG2-DEG2-TTP-TXRX", data)
328         self.assertEqual(response.status_code, requests.codes.created)
329
330     def test_16_getClliNetwork(self):
331         # pylint: disable=redundant-unittest-assert
332         response = test_utils_rfc8040.get_ietf_network_request('clli-network', 'config')
333         self.assertEqual(response['status_code'], requests.codes.ok)
334         listNode = ['NodeA', 'NodeC']
335         for node in response['network'][0]['node']:
336             nodeId = node['node-id']
337             self.assertIn(nodeId, listNode)
338             self.assertEqual(node['org-openroadm-clli-network:clli'], nodeId)
339             listNode.remove(nodeId)
340         self.assertEqual(len(listNode), 0)
341
342     def test_17_getOpenRoadmNetwork(self):
343         # pylint: disable=redundant-unittest-assert
344         response = test_utils_rfc8040.get_ietf_network_request('openroadm-network', 'config')
345         self.assertEqual(response['status_code'], requests.codes.ok)
346         nbNode = len(response['network'][0]['node'])
347         self.assertEqual(nbNode, 3)
348         listNode = ['XPDR-A1', 'ROADM-A1', 'ROADM-C1']
349         CHECK_LIST = {'XPDR-A1': {'node-ref': 'NodeA', 'node-type': 'XPONDER'},
350                       'ROADM-A1': {'node-ref': 'NodeA', 'node-type': 'ROADM'},
351                       'ROADM-C1': {'node-ref': 'NodeC', 'node-type': 'ROADM'}
352                       }
353         for node in response['network'][0]['node']:
354             self.assertEqual(node['supporting-node'][0]['network-ref'], 'clli-network')
355             nodeId = node['node-id']
356             if nodeId in CHECK_LIST:
357                 self.assertEqual(node['supporting-node'][0]['node-ref'], CHECK_LIST[nodeId]['node-ref'])
358                 self.assertEqual(node['org-openroadm-common-network:node-type'], CHECK_LIST[nodeId]['node-type'])
359                 listNode.remove(nodeId)
360             else:
361                 self.assertFalse(True)
362                 continue
363             self.assertEqual(node['org-openroadm-network:model'], 'model2')
364         self.assertEqual(len(listNode), 0)
365
366     def test_18_getROADMLinkOpenRoadmTopology(self):
367         # pylint: disable=redundant-unittest-assert
368         response = test_utils_rfc8040.get_ietf_network_request('openroadm-topology', 'config')
369         self.assertEqual(response['status_code'], requests.codes.ok)
370         self.assertEqual(len(response['network'][0]['ietf-network-topology:link']), 20)
371         check_list = {'EXPRESS-LINK': ['ROADM-A1-DEG2-DEG2-CTP-TXRXtoROADM-A1-DEG1-DEG1-CTP-TXRX',
372                                        'ROADM-A1-DEG1-DEG1-CTP-TXRXtoROADM-A1-DEG2-DEG2-CTP-TXRX',
373                                        'ROADM-C1-DEG2-DEG2-CTP-TXRXtoROADM-C1-DEG1-DEG1-CTP-TXRX',
374                                        'ROADM-C1-DEG1-DEG1-CTP-TXRXtoROADM-C1-DEG2-DEG2-CTP-TXRX'],
375                       'ADD-LINK': ['ROADM-A1-SRG1-SRG1-CP-TXRXtoROADM-A1-DEG2-DEG2-CTP-TXRX',
376                                    'ROADM-A1-SRG1-SRG1-CP-TXRXtoROADM-A1-DEG1-DEG1-CTP-TXRX',
377                                    'ROADM-A1-SRG3-SRG3-CP-TXRXtoROADM-A1-DEG2-DEG2-CTP-TXRX',
378                                    'ROADM-A1-SRG3-SRG3-CP-TXRXtoROADM-A1-DEG1-DEG1-CTP-TXRX',
379                                    'ROADM-C1-SRG1-SRG1-CP-TXRXtoROADM-C1-DEG2-DEG2-CTP-TXRX',
380                                    'ROADM-C1-SRG1-SRG1-CP-TXRXtoROADM-C1-DEG1-DEG1-CTP-TXRX'],
381                       'DROP-LINK': ['ROADM-A1-DEG1-DEG1-CTP-TXRXtoROADM-A1-SRG1-SRG1-CP-TXRX',
382                                     'ROADM-A1-DEG2-DEG2-CTP-TXRXtoROADM-A1-SRG1-SRG1-CP-TXRX',
383                                     'ROADM-A1-DEG1-DEG1-CTP-TXRXtoROADM-A1-SRG3-SRG3-CP-TXRX',
384                                     'ROADM-A1-DEG2-DEG2-CTP-TXRXtoROADM-A1-SRG3-SRG3-CP-TXRX',
385                                     'ROADM-C1-DEG1-DEG1-CTP-TXRXtoROADM-C1-SRG1-SRG1-CP-TXRX',
386                                     'ROADM-C1-DEG2-DEG2-CTP-TXRXtoROADM-C1-SRG1-SRG1-CP-TXRX'],
387                       'ROADM-TO-ROADM': ['ROADM-A1-DEG2-DEG2-TTP-TXRXtoROADM-C1-DEG1-DEG1-TTP-TXRX',
388                                          'ROADM-C1-DEG1-DEG1-TTP-TXRXtoROADM-A1-DEG2-DEG2-TTP-TXRX'],
389                       'XPONDER-INPUT': ['ROADM-A1-SRG1-SRG1-PP1-TXRXtoXPDR-A1-XPDR1-XPDR1-NETWORK1'],
390                       'XPONDER-OUTPUT': ['XPDR-A1-XPDR1-XPDR1-NETWORK1toROADM-A1-SRG1-SRG1-PP1-TXRX']
391                       }
392         for link in response['network'][0]['ietf-network-topology:link']:
393             linkId = link['link-id']
394             linkType = link['org-openroadm-common-network:link-type']
395             self.assertIn(linkType, check_list)
396             find = linkId in check_list[linkType]
397             self.assertEqual(find, True)
398             (check_list[linkType]).remove(linkId)
399         for link in check_list.values():
400             self.assertEqual(len(link), 0)
401
402     def test_19_getLinkOmsAttributesOpenRoadmTopology(self):
403         response = test_utils_rfc8040.get_ietf_network_request('openroadm-topology', 'config')
404         self.assertEqual(response['status_code'], requests.codes.ok)
405         self.assertEqual(len(response['network'][0]['ietf-network-topology:link']), 20)
406         R2RLink = ['ROADM-A1-DEG2-DEG2-TTP-TXRXtoROADM-C1-DEG1-DEG1-TTP-TXRX',
407                    'ROADM-C1-DEG1-DEG1-TTP-TXRXtoROADM-A1-DEG2-DEG2-TTP-TXRX']
408         for link in response['network'][0]['ietf-network-topology:link']:
409             link_id = link['link-id']
410             if link_id in R2RLink:
411                 find = False
412                 spanLoss = link['org-openroadm-network-topology:OMS-attributes']['span']['engineered-spanloss']
413                 # pylint: disable=line-too-long
414                 length = link['org-openroadm-network-topology:OMS-attributes']['span']['link-concatenation'][0]['SRLG-length']
415                 if (spanLoss is not None) & (length is not None):
416                     find = True
417                 self.assertTrue(find)
418                 R2RLink.remove(link_id)
419         self.assertEqual(len(R2RLink), 0)
420
421     def test_20_getNodes_OpenRoadmTopology(self):
422         # pylint: disable=redundant-unittest-assert
423         response = test_utils_rfc8040.get_ietf_network_request('openroadm-topology', 'config')
424         self.assertEqual(response['status_code'], requests.codes.ok)
425         self.assertEqual(len(response['network'][0]['node']), 8)
426         listNode = ['XPDR-A1-XPDR1',
427                     'ROADM-A1-SRG1', 'ROADM-A1-SRG3', 'ROADM-A1-DEG1', 'ROADM-A1-DEG2',
428                     'ROADM-C1-SRG1', 'ROADM-C1-DEG1', 'ROADM-C1-DEG2']
429         # Tests related to XPDRA nodes
430         for node in response['network'][0]['node']:
431             nodeType = node['org-openroadm-common-network:node-type']
432             nodeId = node['node-id']
433             if nodeId == 'XPDR-A1-XPDR1':
434                 self.assertIn({'network-ref': 'openroadm-network', 'node-ref': 'XPDR-A1'}, node['supporting-node'])
435                 self.assertEqual(nodeType, 'XPONDER')
436                 nbTps = len(node['ietf-network-topology:termination-point'])
437                 self.assertTrue(nbTps >= 4)
438                 client = 0
439                 network = 0
440                 for tp in node['ietf-network-topology:termination-point']:
441                     tpType = (tp['org-openroadm-common-network:tp-type'])
442                     if tpType == 'XPONDER-CLIENT':
443                         client += 1
444                     elif tpType == 'XPONDER-NETWORK':
445                         network += 1
446                 self.assertTrue(client == 2)
447                 self.assertTrue(network == 2)
448                 listNode.remove(nodeId)
449         # Tests related to ROADMA nodes
450             elif nodeId in self.CHECK_DICT1:
451                 self.assertEqual(nodeType, self.CHECK_DICT1[nodeId]['node_type'])
452                 if self.CHECK_DICT1[nodeId]['node_type'] == 'SRG':
453                     self.assertEqual(len(node['ietf-network-topology:termination-point']), 5)
454                 for tp in self.CHECK_DICT1[nodeId]['checks_tp']:
455                     self.assertIn(tp, node['ietf-network-topology:termination-point'])
456                 self.assertIn({'network-ref': 'clli-network', 'node-ref': 'NodeA'}, node['supporting-node'])
457                 self.assertIn({'network-ref': 'openroadm-network', 'node-ref': 'ROADM-A1'}, node['supporting-node'])
458                 self.assertEqual(node['org-openroadm-common-network:node-type'], self.CHECK_DICT1[nodeId]['node_type'])
459                 listNode.remove(nodeId)
460         # Tests related to ROADMA nodes
461             elif nodeId in self.CHECK_DICT2:
462                 self.assertEqual(nodeType, self.CHECK_DICT2[nodeId]['node_type'])
463                 if self.CHECK_DICT2[nodeId]['node_type'] == 'SRG':
464                     self.assertEqual(len(node['ietf-network-topology:termination-point']), 5)
465                 for tp in self.CHECK_DICT2[nodeId]['checks_tp']:
466                     self.assertIn(tp, node['ietf-network-topology:termination-point'])
467                 self.assertIn({'network-ref': 'clli-network', 'node-ref': 'NodeC'}, node['supporting-node'])
468                 self.assertIn({'network-ref': 'openroadm-network', 'node-ref': 'ROADM-C1'}, node['supporting-node'])
469                 self.assertEqual(node['org-openroadm-common-network:node-type'], self.CHECK_DICT2[nodeId]['node_type'])
470                 listNode.remove(nodeId)
471         self.assertEqual(len(listNode), 0)
472
473     def test_21_connect_ROADMB(self):
474         response = test_utils_rfc8040.mount_device("ROADM-B1", ('roadmb', self.NODE_VERSION))
475         self.assertEqual(response.status_code, requests.codes.created, test_utils_rfc8040.CODE_SHOULD_BE_201)
476
477     def test_22_omsAttributes_ROADMA_ROADMB(self):
478         # Config ROADM-A1-ROADM-B1 oms-attributes
479         data = {"span": {
480                 "auto-spanloss": "true",
481                 "engineered-spanloss": 12.2,
482                 "spanloss-current": 12,
483                 "spanloss-base": 11.4,
484                 "link-concatenation": [{
485                     "SRLG-Id": 0,
486                     "fiber-type": "smf",
487                     "SRLG-length": 100000,
488                     "pmd": 0.5}]}}
489         response = test_utils_rfc8040.add_oms_attr_request(
490             "ROADM-A1-DEG1-DEG1-TTP-TXRXtoROADM-B1-DEG1-DEG1-TTP-TXRX", data)
491         self.assertEqual(response.status_code, requests.codes.created)
492
493     def test_23_omsAttributes_ROADMB_ROADMA(self):
494         # Config ROADM-B1-ROADM-A1 oms-attributes
495         data = {"span": {
496                 "auto-spanloss": "true",
497                 "engineered-spanloss": 12.2,
498                 "spanloss-current": 12,
499                 "spanloss-base": 11.4,
500                 "link-concatenation": [{
501                     "SRLG-Id": 0,
502                     "fiber-type": "smf",
503                     "SRLG-length": 100000,
504                     "pmd": 0.5}]}}
505         response = test_utils_rfc8040.add_oms_attr_request(
506             "ROADM-B1-DEG1-DEG1-TTP-TXRXtoROADM-A1-DEG1-DEG1-TTP-TXRX", data)
507         self.assertEqual(response.status_code, requests.codes.created)
508
509     def test_24_omsAttributes_ROADMB_ROADMC(self):
510         # Config ROADM-B1-ROADM-C1 oms-attributes
511         data = {"span": {
512                 "auto-spanloss": "true",
513                 "engineered-spanloss": 12.2,
514                 "spanloss-current": 12,
515                 "spanloss-base": 11.4,
516                 "link-concatenation": [{
517                     "SRLG-Id": 0,
518                     "fiber-type": "smf",
519                     "SRLG-length": 100000,
520                     "pmd": 0.5}]}}
521         response = test_utils_rfc8040.add_oms_attr_request(
522             "ROADM-B1-DEG2-DEG2-TTP-TXRXtoROADM-C1-DEG2-DEG2-TTP-TXRX", data)
523         self.assertEqual(response.status_code, requests.codes.created)
524
525     def test_25_omsAttributes_ROADMC_ROADMB(self):
526         # Config ROADM-C1-ROADM-B1 oms-attributes
527         data = {"span": {
528                 "auto-spanloss": "true",
529                 "engineered-spanloss": 12.2,
530                 "link-concatenation": [{
531                     "SRLG-Id": 0,
532                     "fiber-type": "smf",
533                     "SRLG-length": 100000,
534                     "pmd": 0.5}]}}
535         response = test_utils_rfc8040.add_oms_attr_request(
536             "ROADM-C1-DEG2-DEG2-TTP-TXRXtoROADM-B1-DEG2-DEG2-TTP-TXRX", data)
537         self.assertEqual(response.status_code, requests.codes.created)
538
539     def test_26_getClliNetwork(self):
540         # pylint: disable=redundant-unittest-assert
541         response = test_utils_rfc8040.get_ietf_network_request('clli-network', 'config')
542         self.assertEqual(response['status_code'], requests.codes.ok)
543         listNode = ['NodeA', 'NodeB', 'NodeC']
544         for node in response['network'][0]['node']:
545             nodeId = node['node-id']
546             self.assertIn(nodeId, listNode)
547             self.assertEqual(node['org-openroadm-clli-network:clli'], nodeId)
548             listNode.remove(nodeId)
549         self.assertEqual(len(listNode), 0)
550
551     def test_27_verifyDegree(self):
552         response = test_utils_rfc8040.get_ietf_network_request('openroadm-topology', 'config')
553         self.assertEqual(response['status_code'], requests.codes.ok)
554         listR2RLink = ['ROADM-A1-DEG2-DEG2-TTP-TXRXtoROADM-C1-DEG1-DEG1-TTP-TXRX',
555                        'ROADM-C1-DEG1-DEG1-TTP-TXRXtoROADM-A1-DEG2-DEG2-TTP-TXRX',
556                        'ROADM-A1-DEG1-DEG1-TTP-TXRXtoROADM-B1-DEG1-DEG1-TTP-TXRX',
557                        'ROADM-C1-DEG2-DEG2-TTP-TXRXtoROADM-B1-DEG2-DEG2-TTP-TXRX',
558                        'ROADM-B1-DEG1-DEG1-TTP-TXRXtoROADM-A1-DEG1-DEG1-TTP-TXRX',
559                        'ROADM-B1-DEG2-DEG2-TTP-TXRXtoROADM-C1-DEG2-DEG2-TTP-TXRX']
560         for link in response['network'][0]['ietf-network-topology:link']:
561             if link['org-openroadm-common-network:link-type'] == 'ROADM-TO-ROADM':
562                 link_id = link['link-id']
563                 find = link_id in listR2RLink
564                 self.assertEqual(find, True)
565                 listR2RLink.remove(link_id)
566         self.assertEqual(len(listR2RLink), 0)
567
568     def test_28_verifyOppositeLinkTopology(self):
569         response = test_utils_rfc8040.get_ietf_network_request('openroadm-topology', 'config')
570         self.assertEqual(response['status_code'], requests.codes.ok)
571         self.assertEqual(len(response['network'][0]['ietf-network-topology:link']), 30)
572         for link in response['network'][0]['ietf-network-topology:link']:
573             link_id = link['link-id']
574             link_type = link['org-openroadm-common-network:link-type']
575             link_src = link['source']['source-node']
576             link_dest = link['destination']['dest-node']
577             oppLink_id = link['org-openroadm-common-network:opposite-link']
578             # Find the opposite link
579             res_oppLink = test_utils_rfc8040.get_ietf_network_link_request('openroadm-topology', oppLink_id, 'config')
580             self.assertEqual(res_oppLink['status_code'], requests.codes.ok)
581             self.assertEqual(res_oppLink['link']['org-openroadm-common-network:opposite-link'], link_id)
582             self.assertEqual(res_oppLink['link']['source']['source-node'], link_dest)
583             self.assertEqual(res_oppLink['link']['destination']['dest-node'], link_src)
584             oppLink_type = res_oppLink['link']['org-openroadm-common-network:link-type']
585             CHECK_DICT = {'ADD-LINK': 'DROP-LINK', 'DROP-LINK': 'ADD-LINK',
586                           'EXPRESS-LINK': 'EXPRESS-LINK', 'ROADM-TO-ROADM': 'ROADM-TO-ROADM',
587                           'XPONDER-INPUT': 'XPONDER-OUTPUT', 'XPONDER-OUTUT': 'XPONDER-INPUT'}
588             if link_type in CHECK_DICT:
589                 self.assertEqual(oppLink_type, CHECK_DICT[link_type])
590
591     def test_29_getLinkOmsAttributesOpenRoadmTopology(self):
592         response = test_utils_rfc8040.get_ietf_network_request('openroadm-topology', 'config')
593         self.assertEqual(response['status_code'], requests.codes.ok)
594         R2RLink = ['ROADM-A1-DEG2-DEG2-TTP-TXRXtoROADM-C1-DEG1-DEG1-TTP-TXRX',
595                    'ROADM-C1-DEG1-DEG1-TTP-TXRXtoROADM-A1-DEG2-DEG2-TTP-TXRX',
596                    'ROADM-A1-DEG1-DEG1-TTP-TXRXtoROADM-B1-DEG1-DEG1-TTP-TXRX',
597                    'ROADM-C1-DEG2-DEG2-TTP-TXRXtoROADM-B1-DEG2-DEG2-TTP-TXRX',
598                    'ROADM-B1-DEG1-DEG1-TTP-TXRXtoROADM-A1-DEG1-DEG1-TTP-TXRX',
599                    'ROADM-B1-DEG2-DEG2-TTP-TXRXtoROADM-C1-DEG2-DEG2-TTP-TXRX']
600         for link in response['network'][0]['ietf-network-topology:link']:
601             link_id = link['link-id']
602             if link_id in R2RLink:
603                 find = False
604                 spanLoss = link['org-openroadm-network-topology:OMS-attributes']['span']["engineered-spanloss"]
605                 # pylint: disable=line-too-long
606                 length = link['org-openroadm-network-topology:OMS-attributes']['span']['link-concatenation'][0]['SRLG-length']
607                 if (spanLoss is not None) & (length is not None):
608                     find = True
609                 self.assertTrue(find)
610                 R2RLink.remove(link_id)
611         self.assertEqual(len(R2RLink), 0)
612
613     def test_30_disconnect_ROADMB(self):
614         # Delete in the topology-netconf
615         response = test_utils_rfc8040.unmount_device("ROADM-B1")
616         self.assertIn(response.status_code, (requests.codes.ok, requests.codes.no_content))
617         # Delete in the clli-network
618         response = test_utils_rfc8040.del_ietf_network_node_request('clli-network', 'NodeB', 'config')
619         self.assertIn(response.status_code, (requests.codes.ok, requests.codes.no_content))
620
621     def test_31_disconnect_ROADMC(self):
622         # Delete in the topology-netconf
623         response = test_utils_rfc8040.unmount_device("ROADM-C1")
624         self.assertIn(response.status_code, (requests.codes.ok, requests.codes.no_content))
625         # Delete in the clli-network
626         response = test_utils_rfc8040.del_ietf_network_node_request('clli-network', 'NodeC', 'config')
627         self.assertIn(response.status_code, (requests.codes.ok, requests.codes.no_content))
628
629     def test_32_getNodes_OpenRoadmTopology(self):
630         # pylint: disable=redundant-unittest-assert
631         response = test_utils_rfc8040.get_ietf_network_request('openroadm-topology', 'config')
632         self.assertEqual(response['status_code'], requests.codes.ok)
633         self.assertEqual(len(response['network'][0]['node']), 5)
634         listNode = ['XPDR-A1-XPDR1', 'ROADM-A1-SRG1', 'ROADM-A1-SRG3', 'ROADM-A1-DEG1', 'ROADM-A1-DEG2']
635         for node in response['network'][0]['node']:
636             nodeType = node['org-openroadm-common-network:node-type']
637             nodeId = node['node-id']
638             # Tests related to XPDRA nodes
639             if nodeId == 'XPDR-A1-XPDR1':
640                 for tp in node['ietf-network-topology:termination-point']:
641                     tpid = tp['tp-id']
642                     if tpid == 'XPDR1-CLIENT1':
643                         self.assertEqual((tp['org-openroadm-common-network:tp-type']), 'XPONDER-CLIENT')
644                     elif tpid == 'XPDR1-NETWORK1':
645                         self.assertEqual((tp['org-openroadm-common-network:tp-type']), 'XPONDER-NETWORK')
646                         # pylint: disable=line-too-long
647                         self.assertEqual((tp['org-openroadm-network-topology:xpdr-network-attributes']['tail-equipment-id']),
648                                          'ROADM-A1-SRG1--SRG1-PP1-TXRX')
649                     elif tpid == 'XPDR2-NETWORK1':
650                         self.assertEqual((tp['org-openroadm-common-network:tp-type']), 'XPONDER-NETWORK')
651                         # pylint: disable=line-too-long
652                 self.assertIn({'network-ref': 'openroadm-network', 'node-ref': 'XPDR-A1'}, node['supporting-node'])
653                 listNode.remove(nodeId)
654             # Tests related to ROADMA nodes
655             elif nodeId in self.CHECK_DICT1:
656                 self.assertEqual(nodeType, self.CHECK_DICT1[nodeId]['node_type'])
657                 if self.CHECK_DICT1[nodeId]['node_type'] == 'SRG':
658                     self.assertEqual(len(node['ietf-network-topology:termination-point']), 5)
659                 for tp in self.CHECK_DICT1[nodeId]['checks_tp']:
660                     self.assertIn(tp, node['ietf-network-topology:termination-point'])
661                 self.assertIn({'network-ref': 'clli-network', 'node-ref': 'NodeA'}, node['supporting-node'])
662                 self.assertIn({'network-ref': 'openroadm-network', 'node-ref': 'ROADM-A1'}, node['supporting-node'])
663                 listNode.remove(nodeId)
664             else:
665                 self.assertFalse(True)
666         self.assertEqual(len(listNode), 0)
667         # Test related to SRG1 of ROADMC
668         for node in response['network'][0]['node']:
669             self.assertNotEqual(node['node-id'], 'ROADM-C1-SRG1')
670             self.assertNotEqual(node['node-id'], 'ROADM-C1-DEG1')
671             self.assertNotEqual(node['node-id'], 'ROADM-C1-DEG2')
672
673     def test_33_getOpenRoadmNetwork(self):
674         response = test_utils_rfc8040.get_ietf_network_request('openroadm-network', 'config')
675         self.assertEqual(response['status_code'], requests.codes.ok)
676         nbNode = len(response['network'][0]['node'])
677         self.assertEqual(nbNode, 2)
678         for node in response['network'][0]['node']:
679             self.assertNotEqual(node['node-id'], 'ROADM-C1')
680             self.assertNotEqual(node['node-id'], 'ROADM-B1')
681
682     def test_34_getClliNetwork(self):
683         response = test_utils_rfc8040.get_ietf_network_request('clli-network', 'config')
684         self.assertEqual(response['status_code'], requests.codes.ok)
685         self.assertEqual(len(response['network'][0]['node']), 1)
686         self.assertNotEqual(response['network'][0]['node'][0]['org-openroadm-clli-network:clli'], 'NodeC')
687
688     def test_35_disconnect_XPDRA(self):
689         response = test_utils_rfc8040.unmount_device("XPDR-A1")
690         self.assertIn(response.status_code, (requests.codes.ok, requests.codes.no_content))
691
692     def test_36_getClliNetwork(self):
693         response = test_utils_rfc8040.get_ietf_network_request('clli-network', 'config')
694         self.assertEqual(response['status_code'], requests.codes.ok)
695         self.assertEqual(len(response['network'][0]['node']), 1)
696         self.assertEqual(response['network'][0]['node'][0]['org-openroadm-clli-network:clli'], 'NodeA')
697
698     def test_37_getOpenRoadmNetwork(self):
699         response = test_utils_rfc8040.get_ietf_network_request('openroadm-network', 'config')
700         self.assertEqual(response['status_code'], requests.codes.ok)
701         self.assertEqual(len(response['network'][0]['node']), 1)
702         self.assertNotEqual(response['network'][0]['node'][0]['node-id'], 'XPDR-A1')
703
704     def test_38_getNodes_OpenRoadmTopology(self):
705         response = test_utils_rfc8040.get_ietf_network_request('openroadm-topology', 'config')
706         self.assertEqual(response['status_code'], requests.codes.ok)
707         self.assertEqual(len(response['network'][0]['node']), 4)
708         listNode = ['ROADM-A1-SRG1', 'ROADM-A1-SRG3', 'ROADM-A1-DEG1', 'ROADM-A1-DEG2']
709         for node in response['network'][0]['node']:
710             self.assertIn({'network-ref': 'openroadm-network', 'node-ref': 'ROADM-A1'}, node['supporting-node'])
711             nodeType = node['org-openroadm-common-network:node-type']
712             nodeId = node['node-id']
713             self.assertIn(nodeId, self.CHECK_DICT1)
714             self.assertEqual(nodeType, self.CHECK_DICT1[nodeId]['node_type'])
715             if self.CHECK_DICT1[nodeId]['node_type'] == 'SRG':
716                 self.assertEqual(len(node['ietf-network-topology:termination-point']), 5)
717             for tp in self.CHECK_DICT1[nodeId]['checks_tp']:
718                 self.assertIn(tp, node['ietf-network-topology:termination-point'])
719             self.assertIn({'network-ref': 'clli-network', 'node-ref': 'NodeA'}, node['supporting-node'])
720             self.assertIn({'network-ref': 'openroadm-network', 'node-ref': 'ROADM-A1'}, node['supporting-node'])
721             listNode.remove(nodeId)
722         self.assertEqual(len(listNode), 0)
723
724     def test_39_disconnect_ROADM_XPDRA_link(self):
725         # Link-1
726         response = test_utils_rfc8040.del_ietf_network_link_request(
727             'openroadm-topology',
728             'XPDR-A1-XPDR1-XPDR1-NETWORK1toROADM-A1-SRG1-SRG1-PP1-TXRX',
729             'config')
730         # Link-2
731         response2 = test_utils_rfc8040.del_ietf_network_link_request(
732             'openroadm-topology',
733             'ROADM-A1-SRG1-SRG1-PP1-TXRXtoXPDR-A1-XPDR1-XPDR1-NETWORK1',
734             'config')
735         self.assertIn(response.status_code, (requests.codes.ok, requests.codes.no_content))
736         self.assertIn(response2.status_code, (requests.codes.ok, requests.codes.no_content))
737
738     def test_40_getLinks_OpenRoadmTopology(self):
739         response = test_utils_rfc8040.get_ietf_network_request('openroadm-topology', 'config')
740         self.assertEqual(response['status_code'], requests.codes.ok)
741         self.assertEqual(len(response['network'][0]['ietf-network-topology:link']), 16)
742         check_list = {'EXPRESS-LINK': ['ROADM-A1-DEG2-DEG2-CTP-TXRXtoROADM-A1-DEG1-DEG1-CTP-TXRX',
743                                        'ROADM-A1-DEG1-DEG1-CTP-TXRXtoROADM-A1-DEG2-DEG2-CTP-TXRX'],
744                       'ADD-LINK': ['ROADM-A1-SRG1-SRG1-CP-TXRXtoROADM-A1-DEG2-DEG2-CTP-TXRX',
745                                    'ROADM-A1-SRG1-SRG1-CP-TXRXtoROADM-A1-DEG1-DEG1-CTP-TXRX',
746                                    'ROADM-A1-SRG3-SRG3-CP-TXRXtoROADM-A1-DEG2-DEG2-CTP-TXRX',
747                                    'ROADM-A1-SRG3-SRG3-CP-TXRXtoROADM-A1-DEG1-DEG1-CTP-TXRX'],
748                       'DROP-LINK': ['ROADM-A1-DEG1-DEG1-CTP-TXRXtoROADM-A1-SRG1-SRG1-CP-TXRX',
749                                     'ROADM-A1-DEG2-DEG2-CTP-TXRXtoROADM-A1-SRG1-SRG1-CP-TXRX',
750                                     'ROADM-A1-DEG1-DEG1-CTP-TXRXtoROADM-A1-SRG3-SRG3-CP-TXRX',
751                                     'ROADM-A1-DEG2-DEG2-CTP-TXRXtoROADM-A1-SRG3-SRG3-CP-TXRX']
752                       }
753         roadmtoroadmLink = 0
754         for link in response['network'][0]['ietf-network-topology:link']:
755             linkId = link['link-id']
756             linkType = link['org-openroadm-common-network:link-type']
757             if linkType in check_list:
758                 find = linkId in check_list[linkType]
759                 self.assertEqual(find, True)
760                 (check_list[linkType]).remove(linkId)
761             else:
762                 roadmtoroadmLink += 1
763         for link in check_list.values():
764             self.assertEqual(len(link), 0)
765         self.assertEqual(roadmtoroadmLink, 6)
766         for link in response['network'][0]['ietf-network-topology:link']:
767             self.assertNotEqual(link['org-openroadm-common-network:link-type'], 'XPONDER-OUTPUT')
768             self.assertNotEqual(link['org-openroadm-common-network:link-type'], 'XPONDER-INPUT')
769
770     def test_41_disconnect_ROADMA(self):
771         response = test_utils_rfc8040.unmount_device("ROADM-A1")
772         self.assertIn(response.status_code, (requests.codes.ok, requests.codes.no_content))
773         # Delete in the clli-network
774         response = test_utils_rfc8040.del_ietf_network_node_request('clli-network', 'NodeA', 'config')
775         self.assertIn(response.status_code, (requests.codes.ok, requests.codes.no_content))
776
777     def test_42_getClliNetwork(self):
778         response = test_utils_rfc8040.get_ietf_network_request('clli-network', 'config')
779         self.assertEqual(response['status_code'], requests.codes.ok)
780         self.assertNotIn('node', response['network'][0])
781
782     def test_43_getOpenRoadmNetwork(self):
783         response = test_utils_rfc8040.get_ietf_network_request('openroadm-network', 'config')
784         self.assertEqual(response['status_code'], requests.codes.ok)
785         self.assertNotIn('node', response['network'][0])
786
787     def test_44_check_roadm2roadm_link_persistence(self):
788         response = test_utils_rfc8040.get_ietf_network_request('openroadm-topology', 'config')
789         self.assertEqual(response['status_code'], requests.codes.ok)
790         self.assertNotIn('node', response['network'][0])
791         self.assertEqual(len(response['network'][0]['ietf-network-topology:link']), 6)
792
793
794 if __name__ == "__main__":
795     unittest.main(verbosity=2)