20be031529bc4efb31a57c40d6d37a0e0c53a837
[transportpce.git] / networkmodel / src / test / java / org / opendaylight / transportpce / networkmodel / service / FrequenciesServiceTest.java
1 /*
2  * Copyright © 2020 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.networkmodel.service;
10
11 import static org.junit.Assert.assertEquals;
12 import static org.junit.Assert.assertNull;
13 import static org.junit.Assert.fail;
14
15 import java.io.FileNotFoundException;
16 import java.io.FileReader;
17 import java.io.IOException;
18 import java.io.Reader;
19 import java.nio.charset.StandardCharsets;
20 import java.util.BitSet;
21 import java.util.Optional;
22 import java.util.concurrent.ExecutionException;
23 import java.util.concurrent.TimeUnit;
24 import java.util.concurrent.TimeoutException;
25 import org.junit.BeforeClass;
26 import org.junit.Ignore;
27 import org.junit.Test;
28 import org.opendaylight.mdsal.binding.api.ReadTransaction;
29 import org.opendaylight.mdsal.common.api.LogicalDatastoreType;
30 import org.opendaylight.transportpce.common.InstanceIdentifiers;
31 import org.opendaylight.transportpce.common.NetworkUtils;
32 import org.opendaylight.transportpce.common.Timeouts;
33 import org.opendaylight.transportpce.common.fixedflex.GridConstant;
34 import org.opendaylight.transportpce.networkmodel.util.OpenRoadmTopology;
35 import org.opendaylight.transportpce.test.AbstractTest;
36 import org.opendaylight.transportpce.test.converter.DataObjectConverter;
37 import org.opendaylight.transportpce.test.converter.JSONDataObjectConverter;
38 import org.opendaylight.transportpce.test.utils.TopologyDataUtils;
39 import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.pce.rev220808.service.path.rpc.result.PathDescription;
40 import org.opendaylight.yang.gen.v1.http.org.openroadm.network.topology.rev211210.Node1;
41 import org.opendaylight.yang.gen.v1.http.org.openroadm.network.topology.rev211210.TerminationPoint1;
42 import org.opendaylight.yang.gen.v1.http.org.openroadm.network.types.rev211210.available.freq.map.AvailFreqMapsKey;
43 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
44 import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier;
45 import org.opendaylight.yangtools.yang.data.api.schema.NormalizedNode;
46 import org.slf4j.Logger;
47 import org.slf4j.LoggerFactory;
48
49 @Ignore
50 public class FrequenciesServiceTest extends AbstractTest {
51     private static final Logger LOG = LoggerFactory.getLogger(FrequenciesServiceTest.class);
52     private static final String OPENROADM_TOPOLOGY_FILE = "src/test/resources/openroadm-topology.xml";
53     private static final String PATH_DESCRIPTION_FILE = "src/test/resources/path_description.json";
54     private static PathDescription pathDescription;
55     private final AvailFreqMapsKey availFreqMapKey = new AvailFreqMapsKey(GridConstant.C_BAND);
56     private final BitSet usedBits = new BitSet(8);
57     private static BitSet availableBits = new BitSet(8);
58
59     @BeforeClass
60     public static void setUp() throws InterruptedException, ExecutionException, FileNotFoundException {
61         availableBits.set(0, 8, true);
62         TopologyDataUtils.writeTopologyFromFileToDatastore(getDataStoreContextUtil(), OPENROADM_TOPOLOGY_FILE,
63                 InstanceIdentifiers.OVERLAY_NETWORK_II);
64         DataObjectConverter dataObjectConverter = JSONDataObjectConverter
65                 .createWithDataStoreUtil(getDataStoreContextUtil());
66         try (Reader reader = new FileReader(PATH_DESCRIPTION_FILE, StandardCharsets.UTF_8)) {
67             NormalizedNode normalizedNode = dataObjectConverter
68                     .transformIntoNormalizedNode(reader).get();
69             pathDescription = (PathDescription) getDataStoreContextUtil()
70                     .getBindingDOMCodecServices().fromNormalizedNode(YangInstanceIdentifier
71                             .of(PathDescription.QNAME), normalizedNode).getValue();
72         } catch (IOException e) {
73             LOG.error("Cannot load path description ", e);
74             fail("Cannot load path description ");
75         }
76     }
77
78     @Test
79     public void allocateFrequenciesTest() throws IOException {
80         FrequenciesService service = new FrequenciesServiceImpl(getDataBroker());
81         service.allocateFrequencies(pathDescription.getAToZDirection(), pathDescription.getZToADirection());
82         TerminationPoint1 terminationPoint = getNetworkTerminationPointFromDatastore("ROADM-A1-DEG2", "DEG2-CTP-TXRX");
83         assertEquals("Lambda 1 should not be available for ctp-attributes",
84                 BitSet.valueOf(terminationPoint.getCtpAttributes().getAvailFreqMaps().get(availFreqMapKey)
85                 .getFreqMap()).get(760, 768),usedBits);
86         assertNull("cp-attributes should be null", terminationPoint.getCpAttributes());
87         terminationPoint = getNetworkTerminationPointFromDatastore("ROADM-A1-SRG1", "SRG1-PP1-TXRX");
88         assertEquals("Lambda 1 should not be available for pp-attributes",
89                 BitSet.valueOf(terminationPoint.getPpAttributes().getAvailFreqMaps().get(availFreqMapKey)
90                 .getFreqMap()).get(760, 768),usedBits);
91         Node1 node = getNetworkNodeFromDatastore("ROADM-A1-SRG1");
92         assertEquals("Lambda 1 should not be available for srg-attributes",
93                 BitSet.valueOf(node.getSrgAttributes().getAvailFreqMaps().get(availFreqMapKey)
94                 .getFreqMap()).get(760, 768),usedBits);
95     }
96
97     @Test
98     public void releaseFrequenciesTest() throws IOException {
99         FrequenciesService service = new FrequenciesServiceImpl(getDataBroker());
100         service.allocateFrequencies(pathDescription.getAToZDirection(), pathDescription.getZToADirection());
101         service.releaseFrequencies(pathDescription.getAToZDirection(), pathDescription.getZToADirection());
102         TerminationPoint1 terminationPoint = getNetworkTerminationPointFromDatastore("ROADM-A1-DEG2", "DEG2-CTP-TXRX");
103         assertEquals("Lambda 1 should be available for ctp-attributes",
104                 BitSet.valueOf(terminationPoint.getCtpAttributes().getAvailFreqMaps().get(availFreqMapKey)
105                 .getFreqMap()).get(760, 768),availableBits);
106         terminationPoint = getNetworkTerminationPointFromDatastore("ROADM-A1-SRG1", "SRG1-PP1-TXRX");
107         assertEquals("Lambda 1 should be available for pp-attributes",
108                 BitSet.valueOf(terminationPoint.getPpAttributes().getAvailFreqMaps().get(availFreqMapKey)
109                 .getFreqMap()).get(760, 768),availableBits);
110         Node1 node = getNetworkNodeFromDatastore("ROADM-A1-SRG1");
111         assertEquals("Lambda 1 should be available for srg-attributes",
112                 BitSet.valueOf(node.getSrgAttributes().getAvailFreqMaps().get(availFreqMapKey)
113                 .getFreqMap()).get(760, 768),availableBits);
114     }
115
116     private TerminationPoint1 getNetworkTerminationPointFromDatastore(String nodeId, String tpId) {
117         InstanceIdentifier<TerminationPoint1> tpIID = OpenRoadmTopology
118                 .createNetworkTerminationPointIIDBuilder(nodeId, tpId).build();
119         try (ReadTransaction readTx = getDataBroker().newReadOnlyTransaction()) {
120             Optional<TerminationPoint1> optionalTerminationPoint = readTx
121                     .read(LogicalDatastoreType.CONFIGURATION, tpIID)
122                     .get(Timeouts.DATASTORE_READ, TimeUnit.MILLISECONDS);
123             if (optionalTerminationPoint.isPresent()) {
124                 return optionalTerminationPoint.get();
125             } else {
126                 return null;
127             }
128         } catch (ExecutionException | TimeoutException e) {
129             LOG.warn("Exception while getting termination {} for node id {} point from {} topology", tpId, nodeId,
130                     NetworkUtils.OVERLAY_NETWORK_ID, e);
131             return null;
132         } catch (InterruptedException e) {
133             LOG.warn("Getting termination {} for node id {} point from {} topology was interrupted", tpId, nodeId,
134                     NetworkUtils.OVERLAY_NETWORK_ID, e);
135             Thread.currentThread().interrupt();
136             return null;
137         }
138     }
139
140     private Node1 getNetworkNodeFromDatastore(String nodeId) {
141         InstanceIdentifier<Node1> nodeIID = OpenRoadmTopology.createNetworkNodeIID(nodeId);
142         try (ReadTransaction nodeReadTx = getDataBroker().newReadOnlyTransaction()) {
143             Optional<Node1> optionalNode = nodeReadTx.read(LogicalDatastoreType.CONFIGURATION, nodeIID)
144                     .get(Timeouts.DATASTORE_READ, TimeUnit.MILLISECONDS);
145             if (optionalNode.isPresent()) {
146                 return optionalNode.get();
147             } else {
148                 LOG.error("Unable to get network node for node id {}from topology {}", nodeId,
149                         NetworkUtils.OVERLAY_NETWORK_ID);
150                 return null;
151             }
152         } catch (ExecutionException | TimeoutException e) {
153             LOG.warn("Exception while getting network node for node id {} from {} topology", nodeId,
154                     NetworkUtils.OVERLAY_NETWORK_ID, e);
155             return null;
156         } catch (InterruptedException e) {
157             LOG.warn("Getting network node for node id {} from {} topology was interrupted", nodeId,
158                     NetworkUtils.OVERLAY_NETWORK_ID, e);
159             Thread.currentThread().interrupt();
160             return null;
161         }
162     }
163
164 }