2 * Copyright © 2020 Orange, Inc. and others. All rights reserved.
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
9 package org.opendaylight.transportpce.pce.networkanalyzer;
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;
16 import java.util.Arrays;
17 import java.util.BitSet;
18 import java.util.HashMap;
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;
71 public class PceOpticalNodeTest extends AbstractTest {
73 private PceOpticalNode pceOpticalNode;
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";
80 private PortMapping portMapping;
81 private final Preference portPreference = new NoPreference();
85 NodeBuilder node1Builder = getNodeBuilder(geSupportingNodes(), OpenroadmTpType.SRGTXRXPP);
86 node = node1Builder.setNodeId(new NodeId("test")).build();
87 availableBitSet.set(0,8);
88 MockitoAnnotations.openMocks(this);
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());
101 void testInitSrgTps() {
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"));
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"));
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"));
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"));
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"));
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"));
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"));
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"));
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));
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"));
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))
239 .put(supportingNode1.key(),supportingNode1);
241 SupportingNode supportingNode2 = new SupportingNodeBuilder()
242 .setNodeRef(new NodeId("node 2"))
243 .setNetworkRef(new NetworkId(NetworkUtils.UNDERLAY_NETWORK_ID))
246 .put(supportingNode2.key(),supportingNode2);
247 return supportingNodes1;
250 private NodeBuilder getNodeBuilder(Map<SupportingNodeKey,SupportingNode> supportingNodes1,
251 OpenroadmTpType openroadmTpType) {
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 =
261 .setTerminationPoint(Map.of(xpdr.key(),xpdr))
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);
274 private NodeBuilder getNodeBuilderEmpty(Map<SupportingNodeKey,SupportingNode> supportingNodes1,
275 OpenroadmTpType openroadmTpType) {
277 TerminationPoint1Builder tp1Bldr = getTerminationPoint1Builder(openroadmTpType);
278 TerminationPointBuilder xpdrTpBldr = getTerminationPointBuilder();
279 xpdrTpBldr.addAugmentation(tp1Bldr.build());
280 xpdrTpBldr.addAugmentation(createAnotherTerminationPoint().build());
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 =
286 .setTerminationPoint(Map.of(xpdr.key(),xpdr))
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);
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())
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())
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))))
323 new FrequencyTHz(Decimal64.valueOf(String.valueOf(GridConstant.START_EDGE_FREQUENCY))))
324 .setEffectiveBits(Uint16.valueOf(GridConstant.EFFECTIVE_BITS))
325 .setFreqMap(byteArray)
327 waveMap.put(availFreqMaps.key(), availFreqMaps);
328 return new DegreeAttributesBuilder()
329 .setAvailFreqMaps(waveMap)
333 private SrgAttributes getSrgAttributes() {
334 return new SrgAttributesBuilder().setAvailFreqMaps(GridUtils.initFreqMaps4FixedGrid2Available()).build();
337 private DegreeAttributes getEmptyDegAttributes() {
338 return (new DegreeAttributesBuilder())
339 .setAvailFreqMaps(Map.of())
343 private SrgAttributes getEmptySrgAttributes() {
344 return new SrgAttributesBuilder().setAvailFreqMaps(Map.of()).build();
347 private TerminationPointBuilder getTerminationPointBuilder() {
348 return new TerminationPointBuilder().setTpId(new TpId("2"));
351 private TerminationPoint1Builder getTerminationPoint1Builder(OpenroadmTpType openroadmTpType) {
352 return new TerminationPoint1Builder().setTpType(openroadmTpType).setOperationalState(State.InService)
353 .setAdministrativeState(AdminStates.InService);
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());