f6d7104d50142b485ccc97d699e0ad1932aa8220
[transportpce.git] / common / src / test / java / org / opendaylight / transportpce / common / catalog / CatalogUtilsTest.java
1 /*
2  * Copyright © 2022 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.common.catalog;
10
11 import static org.junit.Assert.assertEquals;
12 import static org.junit.Assert.fail;
13
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;
19 import java.util.Map;
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;
39
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<>();
45
46     //
47     @BeforeClass
48     public static void setUp() throws InterruptedException,
49         ExecutionException {
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)
58                 .getValue();
59             @NonNull
60             WriteTransaction newWriteOnlyTransaction = getDataBroker().newWriteOnlyTransaction();
61             newWriteOnlyTransaction
62                 .put(LogicalDatastoreType.CONFIGURATION,
63                     InstanceIdentifier.create(OperationalModeCatalog.class),
64                     omCatalog);
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 ");
69         }
70     }
71
72     @Test
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.getPceTxTspOperationalModeFromServiceType(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.getPceTxTspOperationalModeFromServiceType(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.getPceTxTspOperationalModeFromServiceType(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.getPceTxTspOperationalModeFromServiceType(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.getPceTxTspOperationalModeFromServiceType(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.getPceTxTspOperationalModeFromServiceType(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.getPceTxTspOperationalModeFromServiceType(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.getPceTxTspOperationalModeFromServiceType(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.getPceTxTspOperationalModeFromServiceType(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.getPceTxTspOperationalModeFromServiceType(CatalogConstant.CatalogNodeType.TSP,
116                 StringConstants.SERVICE_TYPE_OTUC4));
117         assertEquals("Checking retrieval of channel spacing from Operational Mode 100G SC FEC",
118             50.0,
119             catalogUtils.getPceTxTspChannelSpacing(CatalogConstant.ORW100GSC),0.005);
120         assertEquals("Checking retrieval of channel spacing from Operational Mode 100G OFEC 31.6",
121             50.0,
122             catalogUtils.getPceTxTspChannelSpacing(CatalogConstant.ORW100GOFEC316GBD),0.005);
123         assertEquals("Checking retrieval of channel spacing from Operational Mode 200G OFEC 31.6",
124             50.0,
125             catalogUtils.getPceTxTspChannelSpacing(CatalogConstant.ORW200GOFEC316GBD),0.005);
126         assertEquals("Checking retrieval of channel spacing from Operational Mode 200G OFEC 63.1",
127             87.5,
128             catalogUtils.getPceTxTspChannelSpacing(CatalogConstant.ORW200GOFEC631GBD),0.005);
129         assertEquals("Checking retrieval of channel spacing from Operational Mode 300G OFEC 63.1 GBd",
130             87.5,
131             catalogUtils.getPceTxTspChannelSpacing(CatalogConstant.ORW300GOFEC631GBD),0.005);
132         assertEquals("Checking retrieval of channel spacing from Operational Mode 400G OFEC 63.1 Gbd",
133             87.5,
134             catalogUtils.getPceTxTspChannelSpacing(CatalogConstant.ORW400GOFEC631GBD),0.005);
135         assertEquals("Checking 100GSCFEC ONSR Lin",
136             1345.6,
137             catalogUtils.getPceTxTspParameters(CatalogConstant.ORW100GSC, CatalogConstant.MWWRCORE) * 1000000.0,
138             0.5);
139         assertEquals("Checking 100G OFEC 31.6 Gbauds ONSR Lin",
140             450.7,
141             catalogUtils.getPceTxTspParameters(CatalogConstant.ORW100GOFEC316GBD, CatalogConstant.MWWRCORE) * 1000000.0,
142             0.5);
143         assertEquals("Checking 200G OFEC 31.6 Gbauds ONSR Lin",
144             450.7,
145             catalogUtils.getPceTxTspParameters(CatalogConstant.ORW200GOFEC316GBD, CatalogConstant.MWWRCORE) * 1000000.0,
146             0.5);
147         assertEquals("Checking 200G OFEC 63.1 Gbauds ONSR Lin",
148             450.7,
149             catalogUtils.getPceTxTspParameters(CatalogConstant.ORW200GOFEC631GBD, CatalogConstant.MWWRCORE) * 1000000.0,
150             0.5);
151         assertEquals("Checking 300G OFEC 63.1 Gbauds ONSR Lin",
152             450.7,
153             catalogUtils.getPceTxTspParameters(CatalogConstant.ORW300GOFEC631GBD, CatalogConstant.MWWRCORE) * 1000000.0,
154             0.5);
155         assertEquals("Checking 400G OFEC 63.1 Gbauds ONSR Lin",
156             450.7,
157             catalogUtils.getPceTxTspParameters(CatalogConstant.ORW400GOFEC631GBD, CatalogConstant.MWWRCORE) * 1000000.0,
158             0.5);
159         assertEquals("Checking ONSR Lin = 0 for non valid OM",
160             0.0, catalogUtils.getPceTxTspParameters("SPE-non-existing-mode", CatalogConstant.MWWRCORE) * 1000000.0,
161             0.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             -9996.9, catalogUtils.getPceRxTspParameters(CatalogConstant.ORW100GSC, 0.0, 0.0, 6.1, 20.0), 0.5);
168         assertEquals("Checking 100GSCFEC RX margin in Range at max tolerated penalty",
169             3.0, catalogUtils.getPceRxTspParameters(CatalogConstant.ORW100GSC, 17999.0, 29.9, 5.9, 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),
172             0.5);
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),
175             0.5);
176         assertEquals("Checking 400G OFEC 63.1 Gbauds RX margin OOR due to PDL",
177             -9996.9, catalogUtils.getPceRxTspParameters(CatalogConstant.ORW400GOFEC631GBD, 0.0, 0.0, 4.1, 27.0),
178             0.5);
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, 3.9, 28.0),
181             0.05);
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, 1.9, 25.5),
184             0.05);
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, 0.9, 25.0),
187             0.05);
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, 3.9, 25.0),
190             0.05);
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, 0.9, 22.0),
193             0.05);
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, 3.9, 21.0),
196             0.05);
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, 0.9, 18.0),
199             0.05);
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, 3.9, 24.5),
202             0.05);
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, 0.9, 21.5),
205             0.05);
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, 3.9, 16.0),
208             0.05);
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, 0.9, 13.0),
211             0.05);
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", 6.25);
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.0013604391454046147);
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.0, 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.0, 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, 5.76, 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);
247     }
248 }