2 * Copyright © 2020 Orange Labs, 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
8 package org.opendaylight.transportpce.pce.gnpy;
10 import static org.junit.Assert.assertNotNull;
11 import static org.junit.Assert.assertNull;
12 import static org.junit.Assert.fail;
14 import com.google.gson.stream.JsonReader;
15 import java.io.FileNotFoundException;
16 import java.io.FileReader;
17 import java.io.IOException;
18 import java.io.Reader;
20 import java.nio.charset.StandardCharsets;
22 import java.util.concurrent.ExecutionException;
23 import org.glassfish.grizzly.http.server.HttpServer;
24 import org.glassfish.jersey.grizzly2.httpserver.GrizzlyHttpServerFactory;
25 import org.glassfish.jersey.server.ResourceConfig;
26 import org.junit.AfterClass;
27 import org.junit.Assert;
28 import org.junit.Before;
29 import org.junit.BeforeClass;
30 import org.junit.Test;
31 import org.opendaylight.mdsal.common.api.LogicalDatastoreType;
32 import org.opendaylight.transportpce.common.NetworkUtils;
33 import org.opendaylight.transportpce.common.network.NetworkTransactionImpl;
34 import org.opendaylight.transportpce.pce.constraints.PceConstraints;
35 import org.opendaylight.transportpce.pce.constraints.PceConstraintsCalc;
36 import org.opendaylight.transportpce.pce.gnpy.consumer.GnpyConsumer;
37 import org.opendaylight.transportpce.pce.gnpy.consumer.GnpyConsumerImpl;
38 import org.opendaylight.transportpce.pce.gnpy.consumer.GnpyStub;
39 import org.opendaylight.transportpce.pce.utils.JsonUtil;
40 import org.opendaylight.transportpce.pce.utils.PceTestData;
41 import org.opendaylight.transportpce.test.AbstractTest;
42 import org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.pathdescription.rev210705.path.description.AToZDirectionBuilder;
43 import org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.pathdescription.rev210705.path.description.ZToADirectionBuilder;
44 import org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.pathdescription.rev210705.path.description.atoz.direction.AToZ;
45 import org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.pathdescription.rev210705.path.description.atoz.direction.AToZBuilder;
46 import org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.pathdescription.rev210705.path.description.atoz.direction.AToZKey;
47 import org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.pathdescription.rev210705.path.description.ztoa.direction.ZToA;
48 import org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.pathdescription.rev210705.path.description.ztoa.direction.ZToABuilder;
49 import org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.pathdescription.rev210705.path.description.ztoa.direction.ZToAKey;
50 import org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.pathdescription.rev210705.pce.resource.Resource;
51 import org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.pathdescription.rev210705.pce.resource.ResourceBuilder;
52 import org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.pathdescription.rev210705.pce.resource.resource.resource.TerminationPoint;
53 import org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.pathdescription.rev210705.pce.resource.resource.resource.TerminationPointBuilder;
54 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.rev180226.NetworkId;
55 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.rev180226.Networks;
56 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.rev180226.networks.Network;
57 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.rev180226.networks.NetworkKey;
58 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
59 import org.opendaylight.yangtools.yang.common.QName;
60 import org.opendaylight.yangtools.yang.common.Uint32;
61 import org.slf4j.Logger;
62 import org.slf4j.LoggerFactory;
64 public class GnpyUtilitiesImplTest extends AbstractTest {
66 private static final Logger LOG = LoggerFactory.getLogger(GnpyUtilitiesImplTest.class);
67 private GnpyUtilitiesImpl gnpyUtilitiesImpl;
68 private NetworkTransactionImpl networkTransaction;
69 private static HttpServer httpServer;
70 private GnpyConsumer gnpyConsumer;
72 public GnpyUtilitiesImplTest() throws IOException {
73 networkTransaction = new NetworkTransactionImpl(getDataBroker());
74 JsonReader networkReader = null;
75 JsonReader topoReader = null;
78 // load openroadm-network
79 Reader gnpyNetwork = new FileReader("src/test/resources/gnpy/gnpy_network.json",
80 StandardCharsets.UTF_8);
82 networkReader = new JsonReader(gnpyNetwork);
83 Networks networks = (Networks) JsonUtil.getInstance().getDataObjectFromJson(networkReader,
84 QName.create("urn:ietf:params:xml:ns:yang:ietf-network", "2018-02-26", "networks"));
85 saveOpenRoadmNetwork(networks.getNetwork().values().iterator().next(), NetworkUtils.UNDERLAY_NETWORK_ID);
86 // load openroadm-topology
87 Reader gnpyTopo = new FileReader("src/test/resources/gnpy/gnpy_topology.json",
88 StandardCharsets.UTF_8);
89 topoReader = new JsonReader(gnpyTopo);
90 networks = (Networks) JsonUtil.getInstance().getDataObjectFromJson(topoReader,
91 QName.create("urn:ietf:params:xml:ns:yang:ietf-network", "2018-02-26", "networks"));
92 saveOpenRoadmNetwork(networks.getNetwork().values().iterator().next(), NetworkUtils.OVERLAY_NETWORK_ID);
93 } catch (FileNotFoundException | InterruptedException | ExecutionException e) {
94 LOG.error("Cannot init test ", e);
95 fail("Cannot init test ");
99 if (networkReader != null) {
100 networkReader.close();
102 if (topoReader != null) {
105 } catch (IOException e) {
106 LOG.warn("Cannot close reader ", e);
113 public void initConsumer() {
114 gnpyConsumer = new GnpyConsumerImpl("http://localhost:9998", "mylogin", "mypassword",
115 getDataStoreContextUtil().getBindingDOMCodecServices());
119 public static void init() {
120 // here we cannot use JerseyTest as we already extends AbstractTest
121 final ResourceConfig rc = new ResourceConfig(GnpyStub.class);
122 httpServer = GrizzlyHttpServerFactory.createHttpServer(URI.create("http://localhost:9998"), rc);
126 public static void tearDown() {
127 httpServer.shutdownNow();
130 private void saveOpenRoadmNetwork(Network network, String networkId)
131 throws InterruptedException, ExecutionException {
132 InstanceIdentifier<Network> nwInstanceIdentifier = InstanceIdentifier.builder(Networks.class)
133 .child(Network.class, new NetworkKey(new NetworkId(networkId))).build();
134 networkTransaction.put(LogicalDatastoreType.CONFIGURATION, nwInstanceIdentifier, network);
135 networkTransaction.commit().get();
139 public void askNewPathFromGnpyNullResultTest() throws Exception {
140 gnpyUtilitiesImpl = new GnpyUtilitiesImpl(networkTransaction,
141 PceTestData.getGnpyPCERequest("XPONDER-1", "XPONDER-2"),
143 assertNull("No hard constraints should be available", gnpyUtilitiesImpl.askNewPathFromGnpy(null));
148 public void askNewPathFromGnpyTest() throws Exception {
149 gnpyUtilitiesImpl = new GnpyUtilitiesImpl(networkTransaction,
150 PceTestData.getGnpyPCERequest("XPONDER-3", "XPONDER-4"),
152 PceConstraintsCalc constraints = new PceConstraintsCalc(PceTestData.getPCE_simpletopology_test1_request(),
154 PceConstraints pceHardConstraints = constraints.getPceHardConstraints();
155 assertNotNull("Hard constraints should be available", gnpyUtilitiesImpl.askNewPathFromGnpy(pceHardConstraints));
161 public void verifyComputationByGnpyTest() throws Exception {
163 AToZDirectionBuilder atoZDirectionBldr = buildAtZ();
165 ZToADirectionBuilder ztoADirectionBldr = buildZtoA();
167 gnpyUtilitiesImpl = new GnpyUtilitiesImpl(networkTransaction,
168 PceTestData.getGnpyPCERequest("XPONDER-1", "XPONDER-2"),
170 PceConstraintsCalc constraints = new PceConstraintsCalc(PceTestData.getPCE_simpletopology_test1_request(),
172 PceConstraints pceHardConstraints = constraints.getPceHardConstraints();
173 boolean result = gnpyUtilitiesImpl.verifyComputationByGnpy(atoZDirectionBldr.build(),
174 ztoADirectionBldr.build(),
176 Assert.assertFalse("Gnpy Computation should be false",result);
179 private AToZDirectionBuilder buildAtZ() {
180 AToZKey clientKey = new AToZKey("key");
181 TerminationPoint stp = new TerminationPointBuilder()
182 .setTpId("tpName").setTpNodeId("xname")
184 Resource clientResource = new ResourceBuilder().setResource(stp).build();
185 AToZ firstResource = new AToZBuilder().setId("tpName").withKey(clientKey).setResource(clientResource).build();
187 return new AToZDirectionBuilder()
188 .setRate(Uint32.valueOf(100))
189 .setAToZ(Map.of(firstResource.key(),firstResource))
190 .setAToZWavelengthNumber(Uint32.valueOf(0));
194 private ZToADirectionBuilder buildZtoA() {
195 ZToAKey clientKey = new ZToAKey("key");
196 TerminationPoint stp = new TerminationPointBuilder()
197 .setTpId("tpName").setTpNodeId("xname")
199 Resource clientResource = new ResourceBuilder().setResource(stp).build();
200 ZToA firstResource = new ZToABuilder().setId("tpName").withKey(clientKey).setResource(clientResource).build();
201 return new ZToADirectionBuilder()
202 .setRate(Uint32.valueOf(100))
203 .setZToA(Map.of(firstResource.key(),firstResource))
204 .setZToAWavelengthNumber(Uint32.valueOf(0));