2 * Copyright © 2020 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.networkmodel.service;
12 import static org.junit.jupiter.api.Assertions.assertEquals;
13 import static org.junit.jupiter.api.Assertions.assertNull;
14 import static org.junit.jupiter.api.Assertions.fail;
16 import java.io.FileNotFoundException;
17 import java.io.FileReader;
18 import java.io.IOException;
19 import java.io.Reader;
20 import java.nio.charset.StandardCharsets;
21 import java.util.BitSet;
22 import java.util.Optional;
23 import java.util.concurrent.ExecutionException;
24 import java.util.concurrent.TimeUnit;
25 import java.util.concurrent.TimeoutException;
26 import org.junit.jupiter.api.BeforeAll;
27 import org.junit.jupiter.api.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.stub.rev230228.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;
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);
60 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.transformIntoNormalizedNode(reader).get();
68 pathDescription = (PathDescription) getDataStoreContextUtil()
69 .getBindingDOMCodecServices().fromNormalizedNode(YangInstanceIdentifier
70 .of(PathDescription.QNAME), normalizedNode).getValue();
71 } catch (IOException e) {
72 LOG.error("Cannot load path description ", e);
73 fail("Cannot load path description ");
78 void allocateFrequenciesTest() throws IOException {
79 FrequenciesService service = new FrequenciesServiceImpl(getDataBroker());
80 service.allocateFrequencies(pathDescription.getAToZDirection(), pathDescription.getZToADirection());
81 TerminationPoint1 terminationPoint = getNetworkTerminationPointFromDatastore("ROADM-A1-DEG2", "DEG2-CTP-TXRX");
83 BitSet.valueOf(terminationPoint.getCtpAttributes().getAvailFreqMaps().get(availFreqMapKey).getFreqMap())
86 "Lambda 1 should not be available for ctp-attributes");
87 assertNull(terminationPoint.getCpAttributes(), "cp-attributes should be null");
88 terminationPoint = getNetworkTerminationPointFromDatastore("ROADM-A1-SRG1", "SRG1-PP1-TXRX");
90 BitSet.valueOf(terminationPoint.getPpAttributes().getAvailFreqMaps().get(availFreqMapKey).getFreqMap())
93 "Lambda 1 should not be available for pp-attributes");
94 Node1 node = getNetworkNodeFromDatastore("ROADM-A1-SRG1");
96 BitSet.valueOf(node.getSrgAttributes().getAvailFreqMaps().get(availFreqMapKey).getFreqMap())
99 "Lambda 1 should not be available for srg-attributes");
103 void releaseFrequenciesTest() throws IOException {
104 FrequenciesService service = new FrequenciesServiceImpl(getDataBroker());
105 service.allocateFrequencies(pathDescription.getAToZDirection(), pathDescription.getZToADirection());
106 service.releaseFrequencies(pathDescription.getAToZDirection(), pathDescription.getZToADirection());
107 TerminationPoint1 terminationPoint = getNetworkTerminationPointFromDatastore("ROADM-A1-DEG2", "DEG2-CTP-TXRX");
109 BitSet.valueOf(terminationPoint.getCtpAttributes().getAvailFreqMaps().get(availFreqMapKey)
110 .getFreqMap()).get(760, 768),
112 "Lambda 1 should be available for ctp-attributes");
113 terminationPoint = getNetworkTerminationPointFromDatastore("ROADM-A1-SRG1", "SRG1-PP1-TXRX");
115 BitSet.valueOf(terminationPoint.getPpAttributes().getAvailFreqMaps().get(availFreqMapKey)
116 .getFreqMap()).get(760, 768),
118 "Lambda 1 should be available for pp-attributes");
119 Node1 node = getNetworkNodeFromDatastore("ROADM-A1-SRG1");
121 BitSet.valueOf(node.getSrgAttributes().getAvailFreqMaps().get(availFreqMapKey)
122 .getFreqMap()).get(760, 768),
124 "Lambda 1 should be available for srg-attributes");
127 private TerminationPoint1 getNetworkTerminationPointFromDatastore(String nodeId, String tpId) {
128 InstanceIdentifier<TerminationPoint1> tpIID = InstanceIdentifiers
129 .createNetworkTerminationPoint1IIDBuilder(nodeId, tpId);
130 try (ReadTransaction readTx = getDataBroker().newReadOnlyTransaction()) {
131 Optional<TerminationPoint1> optionalTerminationPoint = readTx
132 .read(LogicalDatastoreType.CONFIGURATION, tpIID)
133 .get(Timeouts.DATASTORE_READ, TimeUnit.MILLISECONDS);
134 if (optionalTerminationPoint.isPresent()) {
135 return optionalTerminationPoint.get();
139 } catch (ExecutionException | TimeoutException e) {
140 LOG.warn("Exception while getting termination {} for node id {} point from {} topology", tpId, nodeId,
141 NetworkUtils.OVERLAY_NETWORK_ID, e);
143 } catch (InterruptedException e) {
144 LOG.warn("Getting termination {} for node id {} point from {} topology was interrupted", tpId, nodeId,
145 NetworkUtils.OVERLAY_NETWORK_ID, e);
146 Thread.currentThread().interrupt();
151 private Node1 getNetworkNodeFromDatastore(String nodeId) {
152 InstanceIdentifier<Node1> nodeIID = OpenRoadmTopology.createNetworkNodeIID(nodeId);
153 try (ReadTransaction nodeReadTx = getDataBroker().newReadOnlyTransaction()) {
154 Optional<Node1> optionalNode = nodeReadTx.read(LogicalDatastoreType.CONFIGURATION, nodeIID)
155 .get(Timeouts.DATASTORE_READ, TimeUnit.MILLISECONDS);
156 if (optionalNode.isPresent()) {
157 return optionalNode.get();
159 LOG.error("Unable to get network node for node id {}from topology {}", nodeId,
160 NetworkUtils.OVERLAY_NETWORK_ID);
163 } catch (ExecutionException | TimeoutException e) {
164 LOG.warn("Exception while getting network node for node id {} from {} topology", nodeId,
165 NetworkUtils.OVERLAY_NETWORK_ID, e);
167 } catch (InterruptedException e) {
168 LOG.warn("Getting network node for node id {} from {} topology was interrupted", nodeId,
169 NetworkUtils.OVERLAY_NETWORK_ID, e);
170 Thread.currentThread().interrupt();