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;
11 import static org.junit.Assert.assertEquals;
12 import static org.junit.Assert.fail;
14 import java.io.FileReader;
15 import java.io.IOException;
16 import java.io.Reader;
17 import java.nio.charset.StandardCharsets;
18 import java.util.HashMap;
20 import java.util.concurrent.ExecutionException;
21 import org.eclipse.jdt.annotation.NonNull;
22 import org.junit.BeforeClass;
23 import org.junit.Test;
24 import org.opendaylight.mdsal.binding.api.WriteTransaction;
25 import org.opendaylight.mdsal.common.api.LogicalDatastoreType;
26 import org.opendaylight.transportpce.common.StringConstants;
27 import org.opendaylight.transportpce.common.network.NetworkTransactionImpl;
28 import org.opendaylight.transportpce.common.network.NetworkTransactionService;
29 import org.opendaylight.transportpce.common.network.RequestProcessor;
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";
43 private static OperationalModeCatalog omCatalog;
44 private static Map<String, Double> outputImpairments = new HashMap<>();
48 public 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 public void catalogPrimitivesTest() {
74 RequestProcessor reqProc = new RequestProcessor(getDataBroker());
75 NetworkTransactionService netTransServ = new NetworkTransactionImpl(reqProc);
76 CatalogUtils catalogUtils = new CatalogUtils(netTransServ);
77 assertEquals("Checking retrieval of Operational Mode from Node Type ADD",
78 CatalogConstant.MWWRCORE,
79 catalogUtils.getPceOperationalModeFromServiceType(CatalogConstant.CatalogNodeType.ADD,
80 StringConstants.SERVICE_TYPE_100GE_T));
81 assertEquals("Checking retrieval of Operational Mode from Node Type DROP",
82 CatalogConstant.MWWRCORE,
83 catalogUtils.getPceOperationalModeFromServiceType(CatalogConstant.CatalogNodeType.DROP,
84 StringConstants.SERVICE_TYPE_100GE_T));
85 assertEquals("Checking retrieval of Operational Mode from Node Type EXPRESS",
86 CatalogConstant.MWMWCORE,
87 catalogUtils.getPceOperationalModeFromServiceType(CatalogConstant.CatalogNodeType.EXPRESS,
88 StringConstants.SERVICE_TYPE_100GE_T));
89 assertEquals("Checking retrieval of Operational Mode from Node Type AMP",
90 CatalogConstant.MWISTANDARD,
91 catalogUtils.getPceOperationalModeFromServiceType(CatalogConstant.CatalogNodeType.AMP,
92 StringConstants.SERVICE_TYPE_100GE_T));
93 assertEquals("Checking retrieval of Operational Mode from Node Type and service Type 100GE",
94 CatalogConstant.ORW100GSC,
95 catalogUtils.getPceOperationalModeFromServiceType(CatalogConstant.CatalogNodeType.TSP,
96 StringConstants.SERVICE_TYPE_100GE_T));
97 assertEquals("Checking retrieval of Operational Mode from Node Type and service Type OTU4",
98 CatalogConstant.ORW100GSC,
99 catalogUtils.getPceOperationalModeFromServiceType(CatalogConstant.CatalogNodeType.TSP,
100 StringConstants.SERVICE_TYPE_OTU4));
101 assertEquals("Checking retrieval of Operational Mode from Node Type and service Type OTUC2",
102 CatalogConstant.ORW200GOFEC316GBD,
103 catalogUtils.getPceOperationalModeFromServiceType(CatalogConstant.CatalogNodeType.TSP,
104 StringConstants.SERVICE_TYPE_OTUC2));
105 assertEquals("Checking retrieval of Operational Mode from Node Type and service Type OTUC3",
106 CatalogConstant.ORW300GOFEC631GBD,
107 catalogUtils.getPceOperationalModeFromServiceType(CatalogConstant.CatalogNodeType.TSP,
108 StringConstants.SERVICE_TYPE_OTUC3));
109 assertEquals("Checking retrieval of Operational Mode from Node Type and service Type 400GE",
110 CatalogConstant.ORW400GOFEC631GBD,
111 catalogUtils.getPceOperationalModeFromServiceType(CatalogConstant.CatalogNodeType.TSP,
112 StringConstants.SERVICE_TYPE_400GE));
113 assertEquals("Checking retrieval of Operational Mode from Node Type and service Type OTUC4",
114 CatalogConstant.ORW400GOFEC631GBD,
115 catalogUtils.getPceOperationalModeFromServiceType(CatalogConstant.CatalogNodeType.TSP,
116 StringConstants.SERVICE_TYPE_OTUC4));
117 assertEquals("Checking retrieval of channel spacing from Operational Mode 100G SC FEC",
119 catalogUtils.getPceTxTspChannelSpacing(CatalogConstant.ORW100GSC),0.005);
120 assertEquals("Checking retrieval of channel spacing from Operational Mode 100G OFEC 31.6",
122 catalogUtils.getPceTxTspChannelSpacing(CatalogConstant.ORW100GOFEC316GBD),0.005);
123 assertEquals("Checking retrieval of channel spacing from Operational Mode 200G OFEC 31.6",
125 catalogUtils.getPceTxTspChannelSpacing(CatalogConstant.ORW200GOFEC316GBD),0.005);
126 assertEquals("Checking retrieval of channel spacing from Operational Mode 200G OFEC 63.1",
128 catalogUtils.getPceTxTspChannelSpacing(CatalogConstant.ORW200GOFEC631GBD),0.005);
129 assertEquals("Checking retrieval of channel spacing from Operational Mode 300G OFEC 63.1 GBd",
131 catalogUtils.getPceTxTspChannelSpacing(CatalogConstant.ORW300GOFEC631GBD),0.005);
132 assertEquals("Checking retrieval of channel spacing from Operational Mode 400G OFEC 63.1 Gbd",
134 catalogUtils.getPceTxTspChannelSpacing(CatalogConstant.ORW400GOFEC631GBD),0.005);
135 assertEquals("Checking 100GSCFEC ONSR Lin",
137 catalogUtils.getPceTxTspParameters(CatalogConstant.ORW100GSC, CatalogConstant.MWWRCORE) * 1000000.0,
139 assertEquals("Checking 100G OFEC 31.6 Gbauds ONSR Lin",
141 catalogUtils.getPceTxTspParameters(CatalogConstant.ORW100GOFEC316GBD, CatalogConstant.MWWRCORE) * 1000000.0,
143 assertEquals("Checking 200G OFEC 31.6 Gbauds ONSR Lin",
145 catalogUtils.getPceTxTspParameters(CatalogConstant.ORW200GOFEC316GBD, CatalogConstant.MWWRCORE) * 1000000.0,
147 assertEquals("Checking 200G OFEC 63.1 Gbauds ONSR Lin",
149 catalogUtils.getPceTxTspParameters(CatalogConstant.ORW200GOFEC631GBD, CatalogConstant.MWWRCORE) * 1000000.0,
151 assertEquals("Checking 300G OFEC 63.1 Gbauds ONSR Lin",
153 catalogUtils.getPceTxTspParameters(CatalogConstant.ORW300GOFEC631GBD, CatalogConstant.MWWRCORE) * 1000000.0,
155 assertEquals("Checking 400G OFEC 63.1 Gbauds ONSR Lin",
157 catalogUtils.getPceTxTspParameters(CatalogConstant.ORW400GOFEC631GBD, CatalogConstant.MWWRCORE) * 1000000.0,
159 assertEquals("Checking ONSR Lin = 0 for non valid OM",
160 0.0, catalogUtils.getPceTxTspParameters("SPE-non-existing-mode", CatalogConstant.MWWRCORE) * 1000000.0,
162 assertEquals("Checking 100GSCFEC RX margin OOR due to CD",
163 -9996.9, catalogUtils.getPceRxTspParameters(CatalogConstant.ORW100GSC, 18001.0, 0.0, 0.0, 20.0), 0.5);
164 assertEquals("Checking 100GSCFEC RX margin OOR due to PMD",
165 -9996.9, catalogUtils.getPceRxTspParameters(CatalogConstant.ORW100GSC, 0.0, 30.1, 0.0, 20.0), 0.5);
166 assertEquals("Checking 100GSCFEC RX margin OOR due to PDL",
167 0.0, catalogUtils.getPceRxTspParameters(CatalogConstant.ORW100GSC, 0.0, 0.0, 6.0, 20.0), 0.5);
168 assertEquals("Checking 100GSCFEC RX margin in Range at max tolerated penalty",
169 0.0, catalogUtils.getPceRxTspParameters(CatalogConstant.ORW100GSC, 17999.0, 29.9, 6.0, 20.0), 0.05);
170 assertEquals("Checking 400G OFEC 63.1 Gbauds RX margin OOR due to CD",
171 -9996.9, catalogUtils.getPceRxTspParameters(CatalogConstant.ORW400GOFEC631GBD, 12001.0, 0.0, 0.0, 27.0),
173 assertEquals("Checking 400G OFEC 63.1 Gbauds RX margin OOR due to PMD",
174 -9996.9, catalogUtils.getPceRxTspParameters(CatalogConstant.ORW400GOFEC631GBD, 0.0, 20.1, 0.0, 27.0),
176 assertEquals("Checking 400G OFEC 63.1 Gbauds RX margin OOR due to PDL",
177 0.0, catalogUtils.getPceRxTspParameters(CatalogConstant.ORW400GOFEC631GBD, 0.0, 0.0, 6.0, 27.0),
179 assertEquals("Checking 400G OFEC 63.1 Gbauds RX margin in Range at max tolerated penalty",
180 0.5, catalogUtils.getPceRxTspParameters(CatalogConstant.ORW400GOFEC631GBD, 11999.0, 19.9, 5.0, 28.0),
182 assertEquals("Checking 400G OFEC 63.1 Gbauds RX margin in Range at intermediate tolerated penalty",
183 0.5, catalogUtils.getPceRxTspParameters(CatalogConstant.ORW400GOFEC631GBD, 3999.0, 9.9, 2.0, 25.5),
185 assertEquals("Checking 400G OFEC 63.1 Gbauds RX margin in Range at min tolerated penalty",
186 0.5, catalogUtils.getPceRxTspParameters(CatalogConstant.ORW400GOFEC631GBD, 3999.0, 9.9, 1.0, 25.0),
188 assertEquals("Checking 300G OFEC 63.1 Gbauds RX margin in Range at max tolerated penalty",
189 0.5, catalogUtils.getPceRxTspParameters(CatalogConstant.ORW300GOFEC631GBD, 17999.0, 24.9, 5.0, 25.0),
191 assertEquals("Checking 300G OFEC 63.1 Gbauds RX margin in Range at min tolerated penalty",
192 0.5, catalogUtils.getPceRxTspParameters(CatalogConstant.ORW300GOFEC631GBD, 3999.0, 9.9, 1.0, 22.0),
194 assertEquals("Checking 200G OFEC 63.1 Gbauds RX margin in Range at max tolerated penalty",
195 0.5, catalogUtils.getPceRxTspParameters(CatalogConstant.ORW200GOFEC631GBD, 23999.0, 24.9, 5.0, 21.0),
197 assertEquals("Checking 200G OFEC 63.1 Gbauds RX margin in Range at min tolerated penalty",
198 0.5, catalogUtils.getPceRxTspParameters(CatalogConstant.ORW200GOFEC631GBD, 3999.0, 9.9, 1.0, 18.0),
200 assertEquals("Checking 200G OFEC 31.6 Gbauds RX margin in Range at max tolerated penalty",
201 0.5, catalogUtils.getPceRxTspParameters(CatalogConstant.ORW200GOFEC316GBD, 23999.0, 29.9, 5.0, 24.5),
203 assertEquals("Checking 200G OFEC 31.6 Gbauds RX margin in Range at min tolerated penalty",
204 0.5, catalogUtils.getPceRxTspParameters(CatalogConstant.ORW200GOFEC316GBD, 3999.0, 9.9, 1.0, 21.5),
206 assertEquals("Checking 100G OFEC 31.6 Gbauds RX margin in Range at max tolerated penalty",
207 0.5, catalogUtils.getPceRxTspParameters(CatalogConstant.ORW100GOFEC316GBD, 47999.0, 29.9, 5.0, 16.0),
209 assertEquals("Checking 100G OFEC 31.6 Gbauds RX margin in Range at min tolerated penalty",
210 0.5, catalogUtils.getPceRxTspParameters(CatalogConstant.ORW100GOFEC316GBD, 3999.0, 9.9, 1.0, 13.0),
212 assertEquals("Checking Margin negative for non valid OM",
213 -9999.9, catalogUtils.getPceRxTspParameters("SPE-non-existing-mode", 0.0, 0.0, 0.0, 30.0), 0.05);
214 outputImpairments.put("CD", 1025.0);
215 outputImpairments.put("DGD2", 18.0);
216 outputImpairments.put("PDL2", 4.4);
217 outputImpairments.put("ONSRLIN", 0.0016307685044580757);
218 // check how to add Delta on an object<String, Double>
219 assertEquals("Checking ROADM Express path contribution to impairments ",
220 outputImpairments, catalogUtils.getPceRoadmAmpParameters(CatalogConstant.CatalogNodeType.EXPRESS,
221 CatalogConstant.MWMWCORE,-15.0, 1000.0, 9.0, 4.0, 0.001000, 50.0));
222 outputImpairments.put("ONSRLIN", 0.0014729700859390747);
223 assertEquals("Checking ROADM Express path contribution to impairments with 87.5 GHz spacing ",
224 outputImpairments, catalogUtils.getPceRoadmAmpParameters(CatalogConstant.CatalogNodeType.EXPRESS,
225 CatalogConstant.MWMWCORE,-15.0, 1000.0, 9.0, 4.0, 0.001000, 87.5));
226 outputImpairments.put("ONSRLIN", 0.0015011872336272727);
227 assertEquals("Checking ROADM Add path contribution to impairments ",
228 outputImpairments, catalogUtils.getPceRoadmAmpParameters(CatalogConstant.CatalogNodeType.ADD,
229 CatalogConstant.MWWRCORE, -15.0, 1000.0, 9.0, 4.2, 0.001, 50.0));
230 outputImpairments.put("ONSRLIN", 0.0016307685044580757);
231 assertEquals("Checking ROADM Drop path contribution to impairments ",
232 outputImpairments, catalogUtils.getPceRoadmAmpParameters(CatalogConstant.CatalogNodeType.DROP,
233 CatalogConstant.MWWRCORE, -15.0, 1000.0, 9.0, 4.2, 0.001, 50.0));
234 outputImpairments.put("ONSRLIN", 0.0015010372326658581);
235 assertEquals("Checking Amp path contribution to impairments ",
236 outputImpairments, catalogUtils.getPceRoadmAmpParameters(CatalogConstant.CatalogNodeType.AMP,
237 CatalogConstant.MWISTANDARD, -15.0, 1025.0, 9.0, 4.36, 0.001, 50.0));
238 assertEquals("Checking empty map returned in case wrong Operational mode provided ",
239 true, catalogUtils.getPceRoadmAmpParameters(CatalogConstant.CatalogNodeType.AMP,
240 "ThisIsNotAValidMode", -15.0,1000.0, 0.0, 0.0, 0.001, 50.0).isEmpty());
241 outputImpairments.put("ONSRLIN", 1.0);
242 assertEquals("Checking empty map returned in case wrong Operational mode provided ",
243 true, catalogUtils.getPceRoadmAmpParameters(CatalogConstant.CatalogNodeType.AMP,
244 "OR-InvalidMode", -15.0, 1025.0, 18.0, 6.25, 0.001, 50.0).isEmpty());
245 assertEquals("Checking Non Linear contribution calculation ", 0.000114266642501745,
246 catalogUtils.calculateNLonsrContribution(2, 70, 87.5), 0.000000005);