d7421e8e9880d5125f88f28eb68c1fbdcbf929e1
[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.test.AbstractTest;
30 import org.opendaylight.transportpce.test.converter.DataObjectConverter;
31 import org.opendaylight.transportpce.test.converter.JSONDataObjectConverter;
32 import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev211210.OperationalModeCatalog;
33 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
34 import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier;
35 import org.opendaylight.yangtools.yang.data.api.schema.NormalizedNode;
36 import org.slf4j.Logger;
37 import org.slf4j.LoggerFactory;
38
39 public class CatalogUtilsTest extends AbstractTest {
40     private static final Logger LOG = LoggerFactory.getLogger(CatalogUtilsTest.class);
41     private static final String CATALOG_FILE = "src/test/resources/apidocCatalog10_1OptSpecV5_1.json";
42     private static OperationalModeCatalog omCatalog;
43     private static Map<String, Double> outputImpairments = new HashMap<>();
44
45     //
46     @BeforeClass
47     public static void setUp() throws InterruptedException,
48         ExecutionException {
49         DataObjectConverter dataObjectConverter = JSONDataObjectConverter
50             .createWithDataStoreUtil(getDataStoreContextUtil());
51         try (Reader reader = new FileReader(CATALOG_FILE, StandardCharsets.UTF_8)) {
52             NormalizedNode normalizedNode = dataObjectConverter
53                 .transformIntoNormalizedNode(reader).get();
54             omCatalog = (OperationalModeCatalog) getDataStoreContextUtil()
55                 .getBindingDOMCodecServices().fromNormalizedNode(YangInstanceIdentifier
56                     .of(OperationalModeCatalog.QNAME), normalizedNode)
57                 .getValue();
58             @NonNull
59             WriteTransaction newWriteOnlyTransaction = getDataBroker().newWriteOnlyTransaction();
60             newWriteOnlyTransaction
61                 .put(LogicalDatastoreType.CONFIGURATION,
62                     InstanceIdentifier.create(OperationalModeCatalog.class),
63                     omCatalog);
64             newWriteOnlyTransaction.commit().get();
65         } catch (IOException e) {
66             LOG.error("Cannot load OpenROADM part of Operational Mode Catalog ", e);
67             fail("Cannot load openROADM operational modes ");
68         }
69     }
70
71     @Test
72     public void catalogPrimitivesTest() {
73         NetworkTransactionService netTransServ = new NetworkTransactionImpl(getDataBroker());
74         CatalogUtils catalogUtils = new CatalogUtils(netTransServ);
75         assertEquals("Checking retrieval of Operational Mode from Node Type ADD",
76             CatalogConstant.MWWRCORE,
77             catalogUtils.getPceOperationalModeFromServiceType(CatalogConstant.CatalogNodeType.ADD,
78                 StringConstants.SERVICE_TYPE_100GE_T));
79         assertEquals("Checking retrieval of Operational Mode from Node Type DROP",
80             CatalogConstant.MWWRCORE,
81             catalogUtils.getPceOperationalModeFromServiceType(CatalogConstant.CatalogNodeType.DROP,
82                 StringConstants.SERVICE_TYPE_100GE_T));
83         assertEquals("Checking retrieval of Operational Mode from Node Type EXPRESS",
84             CatalogConstant.MWMWCORE,
85             catalogUtils.getPceOperationalModeFromServiceType(CatalogConstant.CatalogNodeType.EXPRESS,
86                 StringConstants.SERVICE_TYPE_100GE_T));
87         assertEquals("Checking retrieval of Operational Mode from Node Type AMP",
88             CatalogConstant.MWISTANDARD,
89             catalogUtils.getPceOperationalModeFromServiceType(CatalogConstant.CatalogNodeType.AMP,
90                 StringConstants.SERVICE_TYPE_100GE_T));
91         assertEquals("Checking retrieval of Operational Mode from Node Type and service Type 100GE",
92             CatalogConstant.ORW100GSC,
93             catalogUtils.getPceOperationalModeFromServiceType(CatalogConstant.CatalogNodeType.TSP,
94                 StringConstants.SERVICE_TYPE_100GE_T));
95         assertEquals("Checking retrieval of Operational Mode from Node Type and service Type OTU4",
96             CatalogConstant.ORW100GSC,
97             catalogUtils.getPceOperationalModeFromServiceType(CatalogConstant.CatalogNodeType.TSP,
98                 StringConstants.SERVICE_TYPE_OTU4));
99         assertEquals("Checking retrieval of Operational Mode from Node Type and service Type OTUC2",
100             CatalogConstant.ORW200GOFEC316GBD,
101             catalogUtils.getPceOperationalModeFromServiceType(CatalogConstant.CatalogNodeType.TSP,
102                 StringConstants.SERVICE_TYPE_OTUC2));
103         assertEquals("Checking retrieval of Operational Mode from Node Type and service Type OTUC3",
104             CatalogConstant.ORW300GOFEC631GBD,
105             catalogUtils.getPceOperationalModeFromServiceType(CatalogConstant.CatalogNodeType.TSP,
106                 StringConstants.SERVICE_TYPE_OTUC3));
107         assertEquals("Checking retrieval of Operational Mode from Node Type and service Type 400GE",
108             CatalogConstant.ORW400GOFEC631GBD,
109             catalogUtils.getPceOperationalModeFromServiceType(CatalogConstant.CatalogNodeType.TSP,
110                 StringConstants.SERVICE_TYPE_400GE));
111         assertEquals("Checking retrieval of Operational Mode from Node Type and service Type OTUC4",
112             CatalogConstant.ORW400GOFEC631GBD,
113             catalogUtils.getPceOperationalModeFromServiceType(CatalogConstant.CatalogNodeType.TSP,
114                 StringConstants.SERVICE_TYPE_OTUC4));
115         assertEquals("Checking retrieval of channel spacing from Operational Mode 100G SC FEC",
116             50.0,
117             catalogUtils.getPceTxTspChannelSpacing(CatalogConstant.ORW100GSC),0.005);
118         assertEquals("Checking retrieval of channel spacing from Operational Mode 100G OFEC 31.6",
119             50.0,
120             catalogUtils.getPceTxTspChannelSpacing(CatalogConstant.ORW100GOFEC316GBD),0.005);
121         assertEquals("Checking retrieval of channel spacing from Operational Mode 200G OFEC 31.6",
122             50.0,
123             catalogUtils.getPceTxTspChannelSpacing(CatalogConstant.ORW200GOFEC316GBD),0.005);
124         assertEquals("Checking retrieval of channel spacing from Operational Mode 200G OFEC 63.1",
125             87.5,
126             catalogUtils.getPceTxTspChannelSpacing(CatalogConstant.ORW200GOFEC631GBD),0.005);
127         assertEquals("Checking retrieval of channel spacing from Operational Mode 300G OFEC 63.1 GBd",
128             87.5,
129             catalogUtils.getPceTxTspChannelSpacing(CatalogConstant.ORW300GOFEC631GBD),0.005);
130         assertEquals("Checking retrieval of channel spacing from Operational Mode 400G OFEC 63.1 Gbd",
131             87.5,
132             catalogUtils.getPceTxTspChannelSpacing(CatalogConstant.ORW400GOFEC631GBD),0.005);
133         assertEquals("Checking 100GSCFEC ONSR Lin",
134             1345.6,
135             catalogUtils.getPceTxTspParameters(CatalogConstant.ORW100GSC, CatalogConstant.MWWRCORE) * 1000000.0,
136             0.5);
137         assertEquals("Checking 100G OFEC 31.6 Gbauds ONSR Lin",
138             450.7,
139             catalogUtils.getPceTxTspParameters(CatalogConstant.ORW100GOFEC316GBD, CatalogConstant.MWWRCORE) * 1000000.0,
140             0.5);
141         assertEquals("Checking 200G OFEC 31.6 Gbauds ONSR Lin",
142             450.7,
143             catalogUtils.getPceTxTspParameters(CatalogConstant.ORW200GOFEC316GBD, CatalogConstant.MWWRCORE) * 1000000.0,
144             0.5);
145         assertEquals("Checking 200G OFEC 63.1 Gbauds ONSR Lin",
146             450.7,
147             catalogUtils.getPceTxTspParameters(CatalogConstant.ORW200GOFEC631GBD, CatalogConstant.MWWRCORE) * 1000000.0,
148             0.5);
149         assertEquals("Checking 300G OFEC 63.1 Gbauds ONSR Lin",
150             450.7,
151             catalogUtils.getPceTxTspParameters(CatalogConstant.ORW300GOFEC631GBD, CatalogConstant.MWWRCORE) * 1000000.0,
152             0.5);
153         assertEquals("Checking 400G OFEC 63.1 Gbauds ONSR Lin",
154             450.7,
155             catalogUtils.getPceTxTspParameters(CatalogConstant.ORW400GOFEC631GBD, CatalogConstant.MWWRCORE) * 1000000.0,
156             0.5);
157         assertEquals("Checking ONSR Lin = 0 for non valid OM",
158             0.0, catalogUtils.getPceTxTspParameters("SPE-non-existing-mode", CatalogConstant.MWWRCORE) * 1000000.0,
159             0.0);
160         assertEquals("Checking 100GSCFEC RX margin OOR due to CD",
161             -9996.9, catalogUtils.getPceRxTspParameters(CatalogConstant.ORW100GSC, 18001.0, 0.0, 0.0, 20.0), 0.5);
162         assertEquals("Checking 100GSCFEC RX margin OOR due to PMD",
163             -9996.9, catalogUtils.getPceRxTspParameters(CatalogConstant.ORW100GSC, 0.0, 30.1, 0.0, 20.0), 0.5);
164         assertEquals("Checking 100GSCFEC RX margin OOR due to PDL",
165             0.0, catalogUtils.getPceRxTspParameters(CatalogConstant.ORW100GSC, 0.0, 0.0, 6.0, 20.0), 0.5);
166         assertEquals("Checking 100GSCFEC RX margin in Range at max tolerated penalty",
167             0.0, catalogUtils.getPceRxTspParameters(CatalogConstant.ORW100GSC, 17999.0, 29.9, 6.0, 20.0), 0.05);
168         assertEquals("Checking 400G OFEC 63.1 Gbauds RX margin OOR due to CD",
169             -9996.9, catalogUtils.getPceRxTspParameters(CatalogConstant.ORW400GOFEC631GBD, 12001.0, 0.0, 0.0, 27.0),
170             0.5);
171         assertEquals("Checking 400G OFEC 63.1 Gbauds RX margin OOR due to PMD",
172             -9996.9, catalogUtils.getPceRxTspParameters(CatalogConstant.ORW400GOFEC631GBD, 0.0, 20.1, 0.0, 27.0),
173             0.5);
174         assertEquals("Checking 400G OFEC 63.1 Gbauds RX margin OOR due to PDL",
175             0.0, catalogUtils.getPceRxTspParameters(CatalogConstant.ORW400GOFEC631GBD, 0.0, 0.0, 6.0, 27.0),
176             0.5);
177         assertEquals("Checking 400G OFEC 63.1 Gbauds RX margin in Range at max tolerated penalty",
178             0.5, catalogUtils.getPceRxTspParameters(CatalogConstant.ORW400GOFEC631GBD, 11999.0, 19.9, 5.0, 28.0),
179             0.05);
180         assertEquals("Checking 400G OFEC 63.1 Gbauds RX margin in Range at intermediate tolerated penalty",
181             0.5, catalogUtils.getPceRxTspParameters(CatalogConstant.ORW400GOFEC631GBD, 3999.0, 9.9, 2.0, 25.5),
182             0.05);
183         assertEquals("Checking 400G OFEC 63.1 Gbauds RX margin in Range at min tolerated penalty",
184             0.5, catalogUtils.getPceRxTspParameters(CatalogConstant.ORW400GOFEC631GBD, 3999.0, 9.9, 1.0, 25.0),
185             0.05);
186         assertEquals("Checking 300G OFEC 63.1 Gbauds RX margin in Range at max tolerated penalty",
187             0.5, catalogUtils.getPceRxTspParameters(CatalogConstant.ORW300GOFEC631GBD, 17999.0, 24.9, 5.0, 25.0),
188             0.05);
189         assertEquals("Checking 300G OFEC 63.1 Gbauds RX margin in Range at min tolerated penalty",
190             0.5, catalogUtils.getPceRxTspParameters(CatalogConstant.ORW300GOFEC631GBD, 3999.0, 9.9, 1.0, 22.0),
191             0.05);
192         assertEquals("Checking 200G OFEC 63.1 Gbauds RX margin in Range at max tolerated penalty",
193             0.5, catalogUtils.getPceRxTspParameters(CatalogConstant.ORW200GOFEC631GBD, 23999.0, 24.9, 5.0, 21.0),
194             0.05);
195         assertEquals("Checking 200G OFEC 63.1 Gbauds RX margin in Range at min tolerated penalty",
196             0.5, catalogUtils.getPceRxTspParameters(CatalogConstant.ORW200GOFEC631GBD, 3999.0, 9.9, 1.0, 18.0),
197             0.05);
198         assertEquals("Checking 200G OFEC 31.6 Gbauds RX margin in Range at max tolerated penalty",
199             0.5, catalogUtils.getPceRxTspParameters(CatalogConstant.ORW200GOFEC316GBD, 23999.0, 29.9, 5.0, 24.5),
200             0.05);
201         assertEquals("Checking 200G OFEC 31.6 Gbauds RX margin in Range at min tolerated penalty",
202             0.5, catalogUtils.getPceRxTspParameters(CatalogConstant.ORW200GOFEC316GBD, 3999.0, 9.9, 1.0, 21.5),
203             0.05);
204         assertEquals("Checking 100G OFEC 31.6 Gbauds RX margin in Range at max tolerated penalty",
205             0.5, catalogUtils.getPceRxTspParameters(CatalogConstant.ORW100GOFEC316GBD, 47999.0, 29.9, 5.0, 16.0),
206             0.05);
207         assertEquals("Checking 100G OFEC 31.6 Gbauds RX margin in Range at min tolerated penalty",
208             0.5, catalogUtils.getPceRxTspParameters(CatalogConstant.ORW100GOFEC316GBD, 3999.0, 9.9, 1.0, 13.0),
209             0.05);
210         assertEquals("Checking Margin negative for non valid OM",
211             -9999.9, catalogUtils.getPceRxTspParameters("SPE-non-existing-mode", 0.0, 0.0, 0.0, 30.0), 0.05);
212         outputImpairments.put("CD", 1025.0);
213         outputImpairments.put("DGD2", 18.0);
214         outputImpairments.put("PDL2", 4.4);
215         outputImpairments.put("ONSRLIN", 0.0016307685044580757);
216         // check how to add Delta on an object<String, Double>
217         assertEquals("Checking ROADM Express path contribution to impairments ",
218             outputImpairments, catalogUtils.getPceRoadmAmpParameters(CatalogConstant.CatalogNodeType.EXPRESS,
219             CatalogConstant.MWMWCORE,-15.0, 1000.0, 9.0, 4.0, 0.001000, 50.0));
220         outputImpairments.put("ONSRLIN", 0.0014729700859390747);
221         assertEquals("Checking ROADM Express path contribution to impairments with 87.5 GHz spacing ",
222             outputImpairments, catalogUtils.getPceRoadmAmpParameters(CatalogConstant.CatalogNodeType.EXPRESS,
223             CatalogConstant.MWMWCORE,-15.0, 1000.0, 9.0, 4.0, 0.001000, 87.5));
224         outputImpairments.put("ONSRLIN", 0.0015011872336272727);
225         assertEquals("Checking ROADM Add path contribution to impairments ",
226             outputImpairments, catalogUtils.getPceRoadmAmpParameters(CatalogConstant.CatalogNodeType.ADD,
227             CatalogConstant.MWWRCORE, -15.0, 1000.0, 9.0, 4.2, 0.001, 50.0));
228         outputImpairments.put("ONSRLIN", 0.0016307685044580757);
229         assertEquals("Checking ROADM Drop path contribution to impairments ",
230             outputImpairments, catalogUtils.getPceRoadmAmpParameters(CatalogConstant.CatalogNodeType.DROP,
231             CatalogConstant.MWWRCORE, -15.0, 1000.0, 9.0, 4.2, 0.001, 50.0));
232         outputImpairments.put("ONSRLIN", 0.0015010372326658581);
233         assertEquals("Checking Amp path contribution to impairments ",
234             outputImpairments, catalogUtils.getPceRoadmAmpParameters(CatalogConstant.CatalogNodeType.AMP,
235             CatalogConstant.MWISTANDARD, -15.0, 1025.0, 9.0, 4.36, 0.001, 50.0));
236         assertEquals("Checking empty map returned in case wrong Operational mode provided  ",
237             true, catalogUtils.getPceRoadmAmpParameters(CatalogConstant.CatalogNodeType.AMP,
238                 "ThisIsNotAValidMode", -15.0,1000.0, 0.0, 0.0, 0.001, 50.0).isEmpty());
239         outputImpairments.put("ONSRLIN", 1.0);
240         assertEquals("Checking empty map returned in case wrong Operational mode provided  ",
241             true, catalogUtils.getPceRoadmAmpParameters(CatalogConstant.CatalogNodeType.AMP,
242             "OR-InvalidMode", -15.0, 1025.0, 18.0, 6.25, 0.001, 50.0).isEmpty());
243         assertEquals("Checking Non Linear contribution calculation  ", 0.000114266642501745,
244             catalogUtils.calculateNLonsrContribution(2, 70, 87.5), 0.000000005);
245     }
246 }