2 * Copyright © 2022 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.common.catalog;
12 import static org.junit.jupiter.api.Assertions.assertEquals;
13 import static org.junit.jupiter.api.Assertions.fail;
15 import java.io.FileReader;
16 import java.io.IOException;
17 import java.io.Reader;
18 import java.nio.charset.StandardCharsets;
19 import java.util.HashMap;
21 import java.util.concurrent.ExecutionException;
22 import org.eclipse.jdt.annotation.NonNull;
23 import org.junit.jupiter.api.BeforeAll;
24 import org.junit.jupiter.api.Test;
25 import org.opendaylight.mdsal.binding.api.WriteTransaction;
26 import org.opendaylight.mdsal.common.api.LogicalDatastoreType;
27 import org.opendaylight.transportpce.common.StringConstants;
28 import org.opendaylight.transportpce.common.network.NetworkTransactionImpl;
29 import org.opendaylight.transportpce.common.network.NetworkTransactionService;
30 import org.opendaylight.transportpce.test.AbstractTest;
31 import org.opendaylight.transportpce.test.converter.DataObjectConverter;
32 import org.opendaylight.transportpce.test.converter.JSONDataObjectConverter;
33 import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev211210.OperationalModeCatalog;
34 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
35 import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier;
36 import org.opendaylight.yangtools.yang.data.api.schema.NormalizedNode;
37 import org.slf4j.Logger;
38 import org.slf4j.LoggerFactory;
40 public class CatalogUtilsTest extends AbstractTest {
41 private static final Logger LOG = LoggerFactory.getLogger(CatalogUtilsTest.class);
42 private static final String CATALOG_FILE = "src/test/resources/apidocCatalog10_1OptSpecV5_1.json";
44 private static OperationalModeCatalog omCatalog;
45 private static Map<String, Double> outputImpairments = new HashMap<>();
48 static void setUp() throws InterruptedException,
50 DataObjectConverter dataObjectConverter = JSONDataObjectConverter
51 .createWithDataStoreUtil(getDataStoreContextUtil());
52 try (Reader reader = new FileReader(CATALOG_FILE, StandardCharsets.UTF_8)) {
53 NormalizedNode normalizedNode = dataObjectConverter
54 .transformIntoNormalizedNode(reader).get();
55 omCatalog = (OperationalModeCatalog) getDataStoreContextUtil()
56 .getBindingDOMCodecServices().fromNormalizedNode(YangInstanceIdentifier
57 .of(OperationalModeCatalog.QNAME), normalizedNode)
60 WriteTransaction newWriteOnlyTransaction = getDataBroker().newWriteOnlyTransaction();
61 newWriteOnlyTransaction
62 .put(LogicalDatastoreType.CONFIGURATION,
63 InstanceIdentifier.create(OperationalModeCatalog.class),
65 newWriteOnlyTransaction.commit().get();
66 } catch (IOException e) {
67 LOG.error("Cannot load OpenROADM part of Operational Mode Catalog ", e);
68 fail("Cannot load openROADM operational modes ");
73 void catalogPrimitivesTest() {
74 NetworkTransactionService netTransServ = new NetworkTransactionImpl(getDataBroker());
75 CatalogUtils catalogUtils = new CatalogUtils(netTransServ);
77 CatalogConstant.MWWRCORE,
78 catalogUtils.getPceOperationalModeFromServiceType(CatalogConstant.CatalogNodeType.ADD,
79 StringConstants.SERVICE_TYPE_100GE_T),
80 "Checking retrieval of Operational Mode from Node Type ADD");
82 CatalogConstant.MWWRCORE,
83 catalogUtils.getPceOperationalModeFromServiceType(CatalogConstant.CatalogNodeType.DROP,
84 StringConstants.SERVICE_TYPE_100GE_T),
85 "Checking retrieval of Operational Mode from Node Type DROP");
87 CatalogConstant.MWMWCORE,
88 catalogUtils.getPceOperationalModeFromServiceType(CatalogConstant.CatalogNodeType.EXPRESS,
89 StringConstants.SERVICE_TYPE_100GE_T),
90 "Checking retrieval of Operational Mode from Node Type EXPRESS");
92 CatalogConstant.MWISTANDARD,
93 catalogUtils.getPceOperationalModeFromServiceType(CatalogConstant.CatalogNodeType.AMP,
94 StringConstants.SERVICE_TYPE_100GE_T),
95 "Checking retrieval of Operational Mode from Node Type AMP");
97 CatalogConstant.ORW100GSC,
98 catalogUtils.getPceOperationalModeFromServiceType(CatalogConstant.CatalogNodeType.TSP,
99 StringConstants.SERVICE_TYPE_100GE_T),
100 "Checking retrieval of Operational Mode from Node Type and service Type 100GE");
102 CatalogConstant.ORW100GSC,
103 catalogUtils.getPceOperationalModeFromServiceType(CatalogConstant.CatalogNodeType.TSP,
104 StringConstants.SERVICE_TYPE_OTU4),
105 "Checking retrieval of Operational Mode from Node Type and service Type OTU4");
107 CatalogConstant.ORW200GOFEC316GBD,
108 catalogUtils.getPceOperationalModeFromServiceType(CatalogConstant.CatalogNodeType.TSP,
109 StringConstants.SERVICE_TYPE_OTUC2),
110 "Checking retrieval of Operational Mode from Node Type and service Type OTUC2");
112 CatalogConstant.ORW300GOFEC631GBD,
113 catalogUtils.getPceOperationalModeFromServiceType(CatalogConstant.CatalogNodeType.TSP,
114 StringConstants.SERVICE_TYPE_OTUC3),
115 "Checking retrieval of Operational Mode from Node Type and service Type OTUC3");
117 CatalogConstant.ORW400GOFEC631GBD,
118 catalogUtils.getPceOperationalModeFromServiceType(CatalogConstant.CatalogNodeType.TSP,
119 StringConstants.SERVICE_TYPE_400GE),
120 "Checking retrieval of Operational Mode from Node Type and service Type 400GE");
122 CatalogConstant.ORW400GOFEC631GBD,
123 catalogUtils.getPceOperationalModeFromServiceType(CatalogConstant.CatalogNodeType.TSP,
124 StringConstants.SERVICE_TYPE_OTUC4),
125 "Checking retrieval of Operational Mode from Node Type and service Type OTUC4");
128 catalogUtils.getPceTxTspChannelSpacing(CatalogConstant.ORW100GSC),
130 "Checking retrieval of channel spacing from Operational Mode 100G SC FEC");
133 catalogUtils.getPceTxTspChannelSpacing(CatalogConstant.ORW100GOFEC316GBD),
135 "Checking retrieval of channel spacing from Operational Mode 100G OFEC 31.6");
138 catalogUtils.getPceTxTspChannelSpacing(CatalogConstant.ORW200GOFEC316GBD),
140 "Checking retrieval of channel spacing from Operational Mode 200G OFEC 31.6");
143 catalogUtils.getPceTxTspChannelSpacing(CatalogConstant.ORW200GOFEC631GBD),
145 "Checking retrieval of channel spacing from Operational Mode 200G OFEC 63.1");
148 catalogUtils.getPceTxTspChannelSpacing(CatalogConstant.ORW300GOFEC631GBD),
150 "Checking retrieval of channel spacing from Operational Mode 300G OFEC 63.1 GBd");
153 catalogUtils.getPceTxTspChannelSpacing(CatalogConstant.ORW400GOFEC631GBD),
155 "Checking retrieval of channel spacing from Operational Mode 400G OFEC 63.1 Gbd");
158 catalogUtils.getPceTxTspParameters(CatalogConstant.ORW100GSC, CatalogConstant.MWWRCORE) * 1000000.0,
160 "Checking 100GSCFEC ONSR Lin");
163 catalogUtils.getPceTxTspParameters(CatalogConstant.ORW100GOFEC316GBD, CatalogConstant.MWWRCORE) * 1000000.0,
165 "Checking 100G OFEC 31.6 Gbauds ONSR Lin");
168 catalogUtils.getPceTxTspParameters(CatalogConstant.ORW200GOFEC316GBD, CatalogConstant.MWWRCORE) * 1000000.0,
170 "Checking 200G OFEC 31.6 Gbauds ONSR Lin");
173 catalogUtils.getPceTxTspParameters(CatalogConstant.ORW200GOFEC631GBD, CatalogConstant.MWWRCORE) * 1000000.0,
175 "Checking 200G OFEC 63.1 Gbauds ONSR Lin");
178 catalogUtils.getPceTxTspParameters(CatalogConstant.ORW300GOFEC631GBD, CatalogConstant.MWWRCORE) * 1000000.0,
180 "Checking 300G OFEC 63.1 Gbauds ONSR Lin");
183 catalogUtils.getPceTxTspParameters(CatalogConstant.ORW400GOFEC631GBD, CatalogConstant.MWWRCORE) * 1000000.0,
185 "Checking 400G OFEC 63.1 Gbauds ONSR Lin");
187 0.0, catalogUtils.getPceTxTspParameters("SPE-non-existing-mode", CatalogConstant.MWWRCORE) * 1000000.0,
189 "Checking ONSR Lin = 0 for non valid OM");
192 catalogUtils.getPceRxTspParameters(CatalogConstant.ORW100GSC, 18001.0, 0.0, 0.0, 20.0),
194 "Checking 100GSCFEC RX margin OOR due to CD");
197 catalogUtils.getPceRxTspParameters(CatalogConstant.ORW100GSC, 0.0, 30.1, 0.0, 20.0),
199 "Checking 100GSCFEC RX margin OOR due to PMD");
202 catalogUtils.getPceRxTspParameters(CatalogConstant.ORW100GSC, 0.0, 0.0, 6.0, 20.0),
204 "Checking 100GSCFEC RX margin OOR due to PDL");
207 catalogUtils.getPceRxTspParameters(CatalogConstant.ORW100GSC, 17999.0, 29.9, 6.0, 20.0),
209 "Checking 100GSCFEC RX margin in Range at max tolerated penalty");
212 catalogUtils.getPceRxTspParameters(CatalogConstant.ORW400GOFEC631GBD, 12001.0, 0.0, 0.0, 27.0),
214 "Checking 400G OFEC 63.1 Gbauds RX margin OOR due to CD");
217 catalogUtils.getPceRxTspParameters(CatalogConstant.ORW400GOFEC631GBD, 0.0, 20.1, 0.0, 27.0),
219 "Checking 400G OFEC 63.1 Gbauds RX margin OOR due to PMD");
222 catalogUtils.getPceRxTspParameters(CatalogConstant.ORW400GOFEC631GBD, 0.0, 0.0, 6.0, 27.0),
224 "Checking 400G OFEC 63.1 Gbauds RX margin OOR due to PDL");
227 catalogUtils.getPceRxTspParameters(CatalogConstant.ORW400GOFEC631GBD, 11999.0, 19.9, 5.0, 28.0),
229 "Checking 400G OFEC 63.1 Gbauds RX margin in Range at max tolerated penalty");
232 catalogUtils.getPceRxTspParameters(CatalogConstant.ORW400GOFEC631GBD, 3999.0, 9.9, 2.0, 25.5),
234 "Checking 400G OFEC 63.1 Gbauds RX margin in Range at intermediate tolerated penalty");
237 catalogUtils.getPceRxTspParameters(CatalogConstant.ORW400GOFEC631GBD, 3999.0, 9.9, 1.0, 25.0),
239 "Checking 400G OFEC 63.1 Gbauds RX margin in Range at min tolerated penalty");
242 catalogUtils.getPceRxTspParameters(CatalogConstant.ORW300GOFEC631GBD, 17999.0, 24.9, 5.0, 25.0),
244 "Checking 300G OFEC 63.1 Gbauds RX margin in Range at max tolerated penalty");
247 catalogUtils.getPceRxTspParameters(CatalogConstant.ORW300GOFEC631GBD, 3999.0, 9.9, 1.0, 22.0),
249 "Checking 300G OFEC 63.1 Gbauds RX margin in Range at min tolerated penalty");
252 catalogUtils.getPceRxTspParameters(CatalogConstant.ORW200GOFEC631GBD, 23999.0, 24.9, 5.0, 21.0),
254 "Checking 200G OFEC 63.1 Gbauds RX margin in Range at max tolerated penalty");
257 catalogUtils.getPceRxTspParameters(CatalogConstant.ORW200GOFEC631GBD, 3999.0, 9.9, 1.0, 18.0),
259 "Checking 200G OFEC 63.1 Gbauds RX margin in Range at min tolerated penalty");
262 catalogUtils.getPceRxTspParameters(CatalogConstant.ORW200GOFEC316GBD, 23999.0, 29.9, 5.0, 24.5),
264 "Checking 200G OFEC 31.6 Gbauds RX margin in Range at max tolerated penalty");
267 catalogUtils.getPceRxTspParameters(CatalogConstant.ORW200GOFEC316GBD, 3999.0, 9.9, 1.0, 21.5),
269 "Checking 200G OFEC 31.6 Gbauds RX margin in Range at min tolerated penalty");
272 catalogUtils.getPceRxTspParameters(CatalogConstant.ORW100GOFEC316GBD, 47999.0, 29.9, 5.0, 16.0),
274 "Checking 100G OFEC 31.6 Gbauds RX margin in Range at max tolerated penalty");
277 catalogUtils.getPceRxTspParameters(CatalogConstant.ORW100GOFEC316GBD, 3999.0, 9.9, 1.0, 13.0),
279 "Checking 100G OFEC 31.6 Gbauds RX margin in Range at min tolerated penalty");
282 catalogUtils.getPceRxTspParameters("SPE-non-existing-mode", 0.0, 0.0, 0.0, 30.0),
284 "Checking Margin negative for non valid OM");
285 outputImpairments.put("CD", 1025.0);
286 outputImpairments.put("DGD2", 18.0);
287 outputImpairments.put("PDL2", 4.4);
288 outputImpairments.put("ONSRLIN", 0.0016307685044580757);
289 // check how to add Delta on an object<String, Double>
292 catalogUtils.getPceRoadmAmpParameters(CatalogConstant.CatalogNodeType.EXPRESS, CatalogConstant.MWMWCORE,
293 -15.0, 1000.0, 9.0, 4.0, 0.001000, 50.0),
294 "Checking ROADM Express path contribution to impairments ");
295 outputImpairments.put("ONSRLIN", 0.0014729700859390747);
298 catalogUtils.getPceRoadmAmpParameters(CatalogConstant.CatalogNodeType.EXPRESS, CatalogConstant.MWMWCORE,
299 -15.0, 1000.0, 9.0, 4.0, 0.001000, 87.5),
300 "Checking ROADM Express path contribution to impairments with 87.5 GHz spacing");
301 outputImpairments.put("ONSRLIN", 0.0015011872336272727);
304 catalogUtils.getPceRoadmAmpParameters(CatalogConstant.CatalogNodeType.ADD, CatalogConstant.MWWRCORE,
305 -15.0, 1000.0, 9.0, 4.2, 0.001, 50.0),
306 "Checking ROADM Add path contribution to impairments");
307 outputImpairments.put("ONSRLIN", 0.0016307685044580757);
310 catalogUtils.getPceRoadmAmpParameters(CatalogConstant.CatalogNodeType.DROP, CatalogConstant.MWWRCORE,
311 -15.0, 1000.0, 9.0, 4.2, 0.001, 50.0),
312 "Checking ROADM Drop path contribution to impairments");
313 outputImpairments.put("ONSRLIN", 0.0015010372326658581);
316 catalogUtils.getPceRoadmAmpParameters(CatalogConstant.CatalogNodeType.AMP, CatalogConstant.MWISTANDARD,
317 -15.0, 1025.0, 9.0, 4.36, 0.001, 50.0),
318 "Checking Amp path contribution to impairments");
321 catalogUtils.getPceRoadmAmpParameters(CatalogConstant.CatalogNodeType.AMP, "ThisIsNotAValidMode",
322 -15.0,1000.0, 0.0, 0.0, 0.001, 50.0).isEmpty(),
323 "Checking empty map returned in case wrong Operational mode provided ");
324 outputImpairments.put("ONSRLIN", 1.0);
327 catalogUtils.getPceRoadmAmpParameters(CatalogConstant.CatalogNodeType.AMP, "OR-InvalidMode",
328 -15.0, 1025.0, 18.0, 6.25, 0.001, 50.0).isEmpty(),
329 "Checking empty map returned in case wrong Operational mode provided");
331 0.000114266642501745,
332 catalogUtils.calculateNLonsrContribution(2, 70, 87.5),
334 "Checking Non Linear contribution calculation");