Merge changes I8c049137,I8660893e
[transportpce.git] / pce / src / test / java / org / opendaylight / transportpce / pce / networkanalyzer / PceOpticalNodeTest.java
1 /*
2  * Copyright © 2020 Orange, Inc. and others.  All rights reserved.
3  *
4  * This program and the accompanying materials are made available under the
5  * terms of the Eclipse Public License v1.0 which accompanies this distribution,
6  * and is available at http://www.eclipse.org/legal/epl-v10.html
7  */
8
9 package org.opendaylight.transportpce.pce.networkanalyzer;
10
11 import static org.junit.jupiter.api.Assertions.assertEquals;
12 import static org.junit.jupiter.api.Assertions.assertFalse;
13 import static org.junit.jupiter.api.Assertions.assertNull;
14 import static org.junit.jupiter.api.Assertions.assertTrue;
15
16 import java.util.Arrays;
17 import java.util.BitSet;
18 import java.util.HashMap;
19 import java.util.Map;
20 import org.junit.jupiter.api.BeforeEach;
21 import org.junit.jupiter.api.Test;
22 import org.mockito.Mock;
23 import org.mockito.MockitoAnnotations;
24 import org.opendaylight.transportpce.common.NetworkUtils;
25 import org.opendaylight.transportpce.common.StringConstants;
26 import org.opendaylight.transportpce.common.fixedflex.GridConstant;
27 import org.opendaylight.transportpce.common.fixedflex.GridUtils;
28 import org.opendaylight.transportpce.common.mapping.PortMapping;
29 import org.opendaylight.transportpce.pce.networkanalyzer.port.NoPreference;
30 import org.opendaylight.transportpce.pce.networkanalyzer.port.Preference;
31 import org.opendaylight.transportpce.test.AbstractTest;
32 import org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev230526.Node1;
33 import org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev230526.TerminationPoint1Builder;
34 import org.opendaylight.yang.gen.v1.http.org.openroadm.common.optical.channel.types.rev230526.FrequencyGHz;
35 import org.opendaylight.yang.gen.v1.http.org.openroadm.common.optical.channel.types.rev230526.FrequencyTHz;
36 import org.opendaylight.yang.gen.v1.http.org.openroadm.common.state.types.rev191129.State;
37 import org.opendaylight.yang.gen.v1.http.org.openroadm.equipment.states.types.rev191129.AdminStates;
38 import org.opendaylight.yang.gen.v1.http.org.openroadm.network.topology.rev230526.networks.network.node.DegreeAttributes;
39 import org.opendaylight.yang.gen.v1.http.org.openroadm.network.topology.rev230526.networks.network.node.DegreeAttributesBuilder;
40 import org.opendaylight.yang.gen.v1.http.org.openroadm.network.topology.rev230526.networks.network.node.SrgAttributes;
41 import org.opendaylight.yang.gen.v1.http.org.openroadm.network.topology.rev230526.networks.network.node.SrgAttributesBuilder;
42 import org.opendaylight.yang.gen.v1.http.org.openroadm.network.topology.rev230526.networks.network.node.termination.point.CpAttributesBuilder;
43 import org.opendaylight.yang.gen.v1.http.org.openroadm.network.topology.rev230526.networks.network.node.termination.point.CtpAttributesBuilder;
44 import org.opendaylight.yang.gen.v1.http.org.openroadm.network.topology.rev230526.networks.network.node.termination.point.PpAttributesBuilder;
45 import org.opendaylight.yang.gen.v1.http.org.openroadm.network.topology.rev230526.networks.network.node.termination.point.RxTtpAttributesBuilder;
46 import org.opendaylight.yang.gen.v1.http.org.openroadm.network.topology.rev230526.networks.network.node.termination.point.TxTtpAttributesBuilder;
47 import org.opendaylight.yang.gen.v1.http.org.openroadm.network.topology.rev230526.networks.network.node.termination.point.XpdrClientAttributesBuilder;
48 import org.opendaylight.yang.gen.v1.http.org.openroadm.network.topology.rev230526.networks.network.node.termination.point.XpdrNetworkAttributesBuilder;
49 import org.opendaylight.yang.gen.v1.http.org.openroadm.network.topology.rev230526.networks.network.node.termination.point.XpdrPortAttributesBuilder;
50 import org.opendaylight.yang.gen.v1.http.org.openroadm.network.types.rev230526.OpenroadmNodeType;
51 import org.opendaylight.yang.gen.v1.http.org.openroadm.network.types.rev230526.OpenroadmTpType;
52 import org.opendaylight.yang.gen.v1.http.org.openroadm.network.types.rev230526.available.freq.map.AvailFreqMaps;
53 import org.opendaylight.yang.gen.v1.http.org.openroadm.network.types.rev230526.available.freq.map.AvailFreqMapsBuilder;
54 import org.opendaylight.yang.gen.v1.http.org.openroadm.network.types.rev230526.available.freq.map.AvailFreqMapsKey;
55 import org.opendaylight.yang.gen.v1.http.org.openroadm.service.format.rev191129.ServiceFormat;
56 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.rev180226.NetworkId;
57 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.rev180226.NodeId;
58 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.rev180226.networks.network.Node;
59 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.rev180226.networks.network.NodeBuilder;
60 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.rev180226.networks.network.NodeKey;
61 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.rev180226.networks.network.node.SupportingNode;
62 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.rev180226.networks.network.node.SupportingNodeBuilder;
63 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.rev180226.networks.network.node.SupportingNodeKey;
64 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev180226.Node1Builder;
65 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev180226.TpId;
66 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev180226.networks.network.node.TerminationPoint;
67 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev180226.networks.network.node.TerminationPointBuilder;
68 import org.opendaylight.yangtools.yang.common.Decimal64;
69 import org.opendaylight.yangtools.yang.common.Uint16;
70
71 public class PceOpticalNodeTest extends AbstractTest {
72
73     private PceOpticalNode pceOpticalNode;
74     private Node node;
75     private BitSet usedBitSet = new BitSet(8);
76     private BitSet availableBitSet = new BitSet(8);
77     private String deviceNodeId = "device node";
78     private String serviceType = "100GE";
79     @Mock
80     private PortMapping portMapping;
81     private final Preference portPreference = new NoPreference();
82
83     @BeforeEach
84     void setUp() {
85         NodeBuilder node1Builder = getNodeBuilder(geSupportingNodes(), OpenroadmTpType.SRGTXRXPP);
86         node = node1Builder.setNodeId(new NodeId("test")).build();
87         availableBitSet.set(0,8);
88         MockitoAnnotations.openMocks(this);
89     }
90
91     @Test
92     void isValidTest() {
93         OpenroadmNodeType nodeType = OpenroadmNodeType.ROADM;
94         pceOpticalNode = new PceOpticalNode(deviceNodeId, serviceType, portMapping, node, nodeType,
95             StringConstants.OPENROADM_DEVICE_VERSION_2_2_1, GridConstant.SLOT_WIDTH_50,
96                 GridConstant.SLOT_WIDTH_50);
97         assertTrue(pceOpticalNode.isValid());
98     }
99
100     @Test
101     void testInitSrgTps() {
102
103         pceOpticalNode = new PceOpticalNode(deviceNodeId, serviceType, portMapping, node,
104                 OpenroadmNodeType.ROADM, StringConstants.OPENROADM_DEVICE_VERSION_2_2_1,
105                 GridConstant.SLOT_WIDTH_50, GridConstant.SLOT_WIDTH_50);
106         pceOpticalNode.initSrgTps(portPreference);
107         pceOpticalNode.initXndrTps(ServiceFormat.OMS);
108         pceOpticalNode.initFrequenciesBitSet();
109         assertFalse(pceOpticalNode.isValid());
110         assertNull(pceOpticalNode.getBitSetData());
111         assertTrue(pceOpticalNode.checkTP("testTP"));
112         assertNull(pceOpticalNode.getAvailableTribPorts());
113         assertNull(pceOpticalNode.getAvailableTribPorts());
114         assertNull(pceOpticalNode.getXpdrClient("test"));
115     }
116
117     @Test
118     void testInitXndrTpSrgTypes() {
119         NodeBuilder node1Builder = getNodeBuilder(geSupportingNodes(), OpenroadmTpType.XPONDERNETWORK);
120         Node specificNode = node1Builder.build();
121         pceOpticalNode = new PceOpticalNode(deviceNodeId, serviceType, portMapping, specificNode,
122                 OpenroadmNodeType.SRG, StringConstants.OPENROADM_DEVICE_VERSION_2_2_1,
123                 GridConstant.SLOT_WIDTH_50, GridConstant.SLOT_WIDTH_50);
124         pceOpticalNode.initFrequenciesBitSet();
125         assertTrue(pceOpticalNode.isValid());
126         assertEquals(availableBitSet, pceOpticalNode.getBitSetData().get(88,96));
127         assertTrue(pceOpticalNode.checkTP("testTP"));
128     }
129
130     @Test
131     void testInitXndrTpDegTypes() {
132         pceOpticalNode = new PceOpticalNode(deviceNodeId, serviceType, portMapping, node,
133                 OpenroadmNodeType.DEGREE, StringConstants.OPENROADM_DEVICE_VERSION_2_2_1,
134                 GridConstant.SLOT_WIDTH_50, GridConstant.SLOT_WIDTH_50);
135         pceOpticalNode.initFrequenciesBitSet();
136         assertTrue(pceOpticalNode.isValid());
137         assertEquals(usedBitSet,pceOpticalNode.getBitSetData().get(88,96));
138         assertTrue(pceOpticalNode.checkTP("testTP"));
139     }
140
141     @Test
142     void testInitXndrTpXpondrTypes() {
143         pceOpticalNode = new PceOpticalNode(deviceNodeId, serviceType, portMapping, node,
144                 OpenroadmNodeType.XPONDER, StringConstants.OPENROADM_DEVICE_VERSION_2_2_1,
145                 GridConstant.SLOT_WIDTH_50, GridConstant.SLOT_WIDTH_50);
146         pceOpticalNode.initFrequenciesBitSet();
147         assertTrue(pceOpticalNode.isValid());
148         assertEquals(availableBitSet, pceOpticalNode.getBitSetData().get(88,96));
149         assertTrue(pceOpticalNode.checkTP("testTP"));
150     }
151
152     @Test
153     void testinitFrequenciesBitSet() {
154         pceOpticalNode = new PceOpticalNode(null, null, null, node,
155                 OpenroadmNodeType.ROADM, StringConstants.OPENROADM_DEVICE_VERSION_2_2_1,
156                 GridConstant.SLOT_WIDTH_50, GridConstant.SLOT_WIDTH_50);
157         pceOpticalNode.initXndrTps(ServiceFormat.OMS);
158         pceOpticalNode.initFrequenciesBitSet();
159         assertFalse(pceOpticalNode.isValid());
160         assertNull(pceOpticalNode.getBitSetData());
161         assertTrue(pceOpticalNode.checkTP("testTP"));
162     }
163
164     @Test
165     void testGetRdmSrgClient() {
166         pceOpticalNode = new PceOpticalNode(null, null, null, node,
167                 OpenroadmNodeType.ROADM, StringConstants.OPENROADM_DEVICE_VERSION_2_2_1,
168                 GridConstant.SLOT_WIDTH_50, GridConstant.SLOT_WIDTH_50);
169         pceOpticalNode.initSrgTps(portPreference);
170         assertNull(pceOpticalNode.getRdmSrgClient("7", StringConstants.SERVICE_DIRECTION_AZ));
171         assertFalse(pceOpticalNode.isValid());
172         assertNull(pceOpticalNode.getBitSetData());
173         assertTrue(pceOpticalNode.checkTP("testTP"));
174     }
175
176     @Test
177     void testGetRdmSrgClientEmpty() {
178         NodeBuilder node1Builder = getNodeBuilderEmpty(geSupportingNodes(), OpenroadmTpType.SRGTXRXPP);
179         Node specificNode = node1Builder.setNodeId(new NodeId("test")).build();
180         pceOpticalNode = new PceOpticalNode(null, null, null, specificNode,
181                 OpenroadmNodeType.ROADM, StringConstants.OPENROADM_DEVICE_VERSION_2_2_1,
182                 GridConstant.SLOT_WIDTH_50, GridConstant.SLOT_WIDTH_50);
183         pceOpticalNode.initSrgTps(portPreference);
184         pceOpticalNode.initFrequenciesBitSet();
185         pceOpticalNode.initXndrTps(ServiceFormat.OMS);
186         assertNull(pceOpticalNode.getRdmSrgClient("7" ,StringConstants.SERVICE_DIRECTION_AZ));
187         assertFalse(pceOpticalNode.isValid());
188         assertNull(pceOpticalNode.getBitSetData());
189         assertTrue(pceOpticalNode.checkTP("testTP"));
190     }
191
192     @Test
193     void testGetRdmSrgClientDeg() {
194         pceOpticalNode = new PceOpticalNode(null, null, null, node,
195                 OpenroadmNodeType.DEGREE, StringConstants.OPENROADM_DEVICE_VERSION_2_2_1,
196                 GridConstant.SLOT_WIDTH_50, GridConstant.SLOT_WIDTH_50);
197         pceOpticalNode.initSrgTps(portPreference);
198         assertNull(pceOpticalNode.getRdmSrgClient("7" ,StringConstants.SERVICE_DIRECTION_AZ));
199         assertFalse(pceOpticalNode.isValid());
200         assertNull(pceOpticalNode.getBitSetData());
201         assertTrue(pceOpticalNode.checkTP("testTP"));
202     }
203
204     @Test
205     void testGetRdmSrgClientsrgtxcp() {
206         NodeBuilder node1Builder = getNodeBuilder(geSupportingNodes(), OpenroadmTpType.SRGTXCP);
207         Node specificNode = node1Builder.build();
208         pceOpticalNode = new PceOpticalNode(null, null, null, specificNode,
209                 OpenroadmNodeType.ROADM, StringConstants.OPENROADM_DEVICE_VERSION_2_2_1,
210                 GridConstant.SLOT_WIDTH_50, GridConstant.SLOT_WIDTH_50);
211         pceOpticalNode.initSrgTps(portPreference);
212         assertFalse(pceOpticalNode.isValid());
213         assertNull(pceOpticalNode.getBitSetData());
214         assertTrue(pceOpticalNode.checkTP("testTP"));
215         assertNull(pceOpticalNode.getRdmSrgClient("5", StringConstants.SERVICE_DIRECTION_AZ));
216     }
217
218     @Test
219     void testGetRdmSrgClientDegreerxtpp() {
220         NodeBuilder node1Builder = getNodeBuilder(geSupportingNodes(), OpenroadmTpType.DEGREERXTTP);
221         node = node1Builder.build();
222         pceOpticalNode = new PceOpticalNode(null, null, null, node,
223                 OpenroadmNodeType.ROADM, StringConstants.OPENROADM_DEVICE_VERSION_2_2_1,
224                 GridConstant.SLOT_WIDTH_50, GridConstant.SLOT_WIDTH_50);
225         pceOpticalNode.initSrgTps(portPreference);
226         assertNull(pceOpticalNode.getRdmSrgClient("2" ,StringConstants.SERVICE_DIRECTION_AZ));
227         assertFalse(pceOpticalNode.isValid());
228         assertNull(pceOpticalNode.getBitSetData());
229         assertTrue(pceOpticalNode.checkTP("testTP"));
230     }
231
232     private Map<SupportingNodeKey,SupportingNode> geSupportingNodes() {
233         Map<SupportingNodeKey,SupportingNode> supportingNodes1 = new HashMap<>();
234         SupportingNode supportingNode1 = new SupportingNodeBuilder()
235                 .setNodeRef(new NodeId("node 1"))
236                 .setNetworkRef(new NetworkId(NetworkUtils.CLLI_NETWORK_ID))
237                 .build();
238         supportingNodes1
239                 .put(supportingNode1.key(),supportingNode1);
240
241         SupportingNode supportingNode2 = new SupportingNodeBuilder()
242                 .setNodeRef(new NodeId("node 2"))
243                 .setNetworkRef(new NetworkId(NetworkUtils.UNDERLAY_NETWORK_ID))
244                 .build();
245         supportingNodes1
246                 .put(supportingNode2.key(),supportingNode2);
247         return supportingNodes1;
248     }
249
250     private NodeBuilder getNodeBuilder(Map<SupportingNodeKey,SupportingNode> supportingNodes1,
251             OpenroadmTpType openroadmTpType) {
252
253         TerminationPoint1Builder tp1Bldr = getTerminationPoint1Builder(openroadmTpType);
254         TerminationPointBuilder xpdrTpBldr = getTerminationPointBuilder();
255         xpdrTpBldr.addAugmentation(tp1Bldr.build());
256         xpdrTpBldr.addAugmentation(createAnotherTerminationPoint().build());
257         org.opendaylight.yang.gen.v1.http.org.openroadm.network.topology.rev230526.Node1 node1 = getNode1();
258         TerminationPoint xpdr = xpdrTpBldr.build();
259         org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev180226.Node1 node1Rev180226 =
260                 new Node1Builder()
261                         .setTerminationPoint(Map.of(xpdr.key(),xpdr))
262                         .build();
263         Node1 node11 = new org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev230526.Node1Builder()
264                 .setAdministrativeState(AdminStates.InService).setOperationalState(State.InService).build();
265         return new NodeBuilder()
266                 .setNodeId(new NodeId("node_test"))
267                 .withKey(new NodeKey(new NodeId("node 1")))
268                 .addAugmentation(node1Rev180226)
269                 .addAugmentation(node1)
270                 .addAugmentation(node11)
271                 .setSupportingNode(supportingNodes1);
272     }
273
274     private NodeBuilder getNodeBuilderEmpty(Map<SupportingNodeKey,SupportingNode>  supportingNodes1,
275             OpenroadmTpType openroadmTpType) {
276
277         TerminationPoint1Builder tp1Bldr = getTerminationPoint1Builder(openroadmTpType);
278         TerminationPointBuilder xpdrTpBldr = getTerminationPointBuilder();
279         xpdrTpBldr.addAugmentation(tp1Bldr.build());
280         xpdrTpBldr.addAugmentation(createAnotherTerminationPoint().build());
281
282         org.opendaylight.yang.gen.v1.http.org.openroadm.network.topology.rev230526.Node1 node1 = getNode1Empty();
283         TerminationPoint xpdr = xpdrTpBldr.build();
284         org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev180226.Node1 node1Rev180226 =
285                 new Node1Builder()
286                         .setTerminationPoint(Map.of(xpdr.key(),xpdr))
287                         .build();
288         Node1 node11 = new org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev230526.Node1Builder()
289                 .setAdministrativeState(AdminStates.InService).setOperationalState(State.InService).build();
290         return new NodeBuilder()
291                 .setNodeId(new NodeId("node_test"))
292                 .withKey(new NodeKey(new NodeId("node 1")))
293                 .addAugmentation(node1Rev180226)
294                 .addAugmentation(node1)
295                 .addAugmentation(node11)
296                 .setSupportingNode(supportingNodes1);
297     }
298
299     private org.opendaylight
300             .yang.gen.v1.http.org.openroadm.network.topology.rev230526.Node1 getNode1() {
301         return new org.opendaylight.yang.gen.v1.http.org.openroadm.network.topology.rev230526.Node1Builder()
302                 .setSrgAttributes(getSrgAttributes())
303                 .setDegreeAttributes(getDegAttributes())
304                 .build();
305     }
306
307     private org.opendaylight
308             .yang.gen.v1.http.org.openroadm.network.topology.rev230526.Node1 getNode1Empty() {
309         return new org.opendaylight.yang.gen.v1.http.org.openroadm.network.topology.rev230526.Node1Builder()
310                 .setSrgAttributes(getEmptySrgAttributes())
311                 .setDegreeAttributes(getEmptyDegAttributes())
312                 .build();
313     }
314
315     private DegreeAttributes getDegAttributes() {
316         byte[] byteArray = new byte[GridConstant.NB_OCTECTS];
317         Arrays.fill(byteArray, (byte) GridConstant.USED_SLOT_VALUE);
318         byteArray[7] = (byte) GridConstant.AVAILABLE_SLOT_VALUE;
319         Map<AvailFreqMapsKey, AvailFreqMaps> waveMap = new HashMap<>();
320         AvailFreqMaps availFreqMaps = new AvailFreqMapsBuilder().setMapName(GridConstant.C_BAND)
321                 .setFreqMapGranularity(new FrequencyGHz(Decimal64.valueOf(String.valueOf(GridConstant.GRANULARITY))))
322                 .setStartEdgeFreq(
323                     new FrequencyTHz(Decimal64.valueOf(String.valueOf(GridConstant.START_EDGE_FREQUENCY))))
324                 .setEffectiveBits(Uint16.valueOf(GridConstant.EFFECTIVE_BITS))
325                 .setFreqMap(byteArray)
326                 .build();
327         waveMap.put(availFreqMaps.key(), availFreqMaps);
328         return new DegreeAttributesBuilder()
329                 .setAvailFreqMaps(waveMap)
330                 .build();
331     }
332
333     private SrgAttributes getSrgAttributes() {
334         return new SrgAttributesBuilder().setAvailFreqMaps(GridUtils.initFreqMaps4FixedGrid2Available()).build();
335     }
336
337     private DegreeAttributes getEmptyDegAttributes() {
338         return (new DegreeAttributesBuilder())
339                 .setAvailFreqMaps(Map.of())
340                 .build();
341     }
342
343     private SrgAttributes getEmptySrgAttributes() {
344         return new SrgAttributesBuilder().setAvailFreqMaps(Map.of()).build();
345     }
346
347     private TerminationPointBuilder getTerminationPointBuilder() {
348         return new TerminationPointBuilder().setTpId(new TpId("2"));
349     }
350
351     private TerminationPoint1Builder getTerminationPoint1Builder(OpenroadmTpType openroadmTpType) {
352         return new TerminationPoint1Builder().setTpType(openroadmTpType).setOperationalState(State.InService)
353                 .setAdministrativeState(AdminStates.InService);
354
355     }
356
357     private org.opendaylight.yang.gen
358             .v1.http.org.openroadm.network.topology.rev230526.TerminationPoint1Builder createAnotherTerminationPoint() {
359         return new org.opendaylight
360                 .yang.gen.v1.http.org.openroadm.network.topology.rev230526.TerminationPoint1Builder()
361                 .setCtpAttributes((new CtpAttributesBuilder()).build())
362                 .setCpAttributes((new CpAttributesBuilder()).build())
363                 .setTxTtpAttributes((new TxTtpAttributesBuilder()).setUsedWavelengths(Map.of()).build())
364                 .setRxTtpAttributes((new RxTtpAttributesBuilder()).setUsedWavelengths(Map.of()).build())
365                 .setPpAttributes((new PpAttributesBuilder()).setUsedWavelength(Map.of()).build())
366                 .setXpdrClientAttributes((new XpdrClientAttributesBuilder()).build())
367                 .setXpdrPortAttributes((new XpdrPortAttributesBuilder()).build())
368                 .setXpdrNetworkAttributes(new XpdrNetworkAttributesBuilder()
369                         .setTailEquipmentId("destNode" + "--" + "destTp").build());
370     }
371 }