Adapt TransportPCE code to Sulfur
[transportpce.git] / pce / src / test / java / org / opendaylight / transportpce / pce / gnpy / GnpyUtilitiesImplTest.java
1 /*
2  * Copyright © 2020 Orange Labs, 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 package org.opendaylight.transportpce.pce.gnpy;
9
10 import static org.junit.Assert.assertNotNull;
11 import static org.junit.Assert.assertNull;
12 import static org.junit.Assert.fail;
13
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;
19 import java.net.URI;
20 import java.nio.charset.StandardCharsets;
21 import java.util.Map;
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.Ignore;
31 import org.junit.Test;
32 import org.opendaylight.mdsal.binding.api.WriteTransaction;
33 import org.opendaylight.mdsal.common.api.LogicalDatastoreType;
34 import org.opendaylight.transportpce.common.NetworkUtils;
35 import org.opendaylight.transportpce.common.network.NetworkTransactionImpl;
36 import org.opendaylight.transportpce.common.network.RequestProcessor;
37 import org.opendaylight.transportpce.pce.constraints.PceConstraints;
38 import org.opendaylight.transportpce.pce.constraints.PceConstraintsCalc;
39 import org.opendaylight.transportpce.pce.gnpy.consumer.GnpyConsumer;
40 import org.opendaylight.transportpce.pce.gnpy.consumer.GnpyConsumerImpl;
41 import org.opendaylight.transportpce.pce.gnpy.consumer.GnpyStub;
42 import org.opendaylight.transportpce.pce.utils.JsonUtil;
43 import org.opendaylight.transportpce.pce.utils.PceTestData;
44 import org.opendaylight.transportpce.test.AbstractTest;
45 import org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.pathdescription.rev210705.path.description.AToZDirectionBuilder;
46 import org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.pathdescription.rev210705.path.description.ZToADirectionBuilder;
47 import org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.pathdescription.rev210705.path.description.atoz.direction.AToZ;
48 import org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.pathdescription.rev210705.path.description.atoz.direction.AToZBuilder;
49 import org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.pathdescription.rev210705.path.description.atoz.direction.AToZKey;
50 import org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.pathdescription.rev210705.path.description.ztoa.direction.ZToA;
51 import org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.pathdescription.rev210705.path.description.ztoa.direction.ZToABuilder;
52 import org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.pathdescription.rev210705.path.description.ztoa.direction.ZToAKey;
53 import org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.pathdescription.rev210705.pce.resource.Resource;
54 import org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.pathdescription.rev210705.pce.resource.ResourceBuilder;
55 import org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.pathdescription.rev210705.pce.resource.resource.resource.TerminationPoint;
56 import org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.pathdescription.rev210705.pce.resource.resource.resource.TerminationPointBuilder;
57 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.rev180226.NetworkId;
58 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.rev180226.Networks;
59 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.rev180226.networks.Network;
60 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.rev180226.networks.NetworkKey;
61 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
62 import org.opendaylight.yangtools.yang.common.QName;
63 import org.opendaylight.yangtools.yang.common.Uint32;
64 import org.slf4j.Logger;
65 import org.slf4j.LoggerFactory;
66
67 public class GnpyUtilitiesImplTest extends AbstractTest {
68
69     private static final Logger LOG = LoggerFactory.getLogger(GnpyUtilitiesImplTest.class);
70     private GnpyUtilitiesImpl gnpyUtilitiesImpl;
71     private NetworkTransactionImpl networkTransaction;
72     private static HttpServer httpServer;
73     private GnpyConsumer gnpyConsumer;
74
75     public GnpyUtilitiesImplTest() throws IOException {
76         networkTransaction = new NetworkTransactionImpl(new RequestProcessor(getDataBroker()));
77         JsonReader networkReader = null;
78         JsonReader topoReader = null;
79
80         try {
81             // load openroadm-network
82             Reader gnpyNetwork = new FileReader("src/test/resources/gnpy/gnpy_network.json",
83                     StandardCharsets.UTF_8);
84
85             networkReader = new JsonReader(gnpyNetwork);
86             Networks networks = (Networks) JsonUtil.getInstance().getDataObjectFromJson(networkReader,
87                     QName.create("urn:ietf:params:xml:ns:yang:ietf-network", "2018-02-26", "networks"));
88             saveOpenRoadmNetwork(networks.getNetwork().values().iterator().next(), NetworkUtils.UNDERLAY_NETWORK_ID);
89             // load openroadm-topology
90             Reader gnpyTopo = new FileReader("src/test/resources/gnpy/gnpy_topology.json",
91                     StandardCharsets.UTF_8);
92             topoReader = new JsonReader(gnpyTopo);
93             networks = (Networks) JsonUtil.getInstance().getDataObjectFromJson(topoReader,
94                     QName.create("urn:ietf:params:xml:ns:yang:ietf-network", "2018-02-26", "networks"));
95             saveOpenRoadmNetwork(networks.getNetwork().values().iterator().next(), NetworkUtils.OVERLAY_NETWORK_ID);
96         } catch (FileNotFoundException | InterruptedException | ExecutionException e) {
97             LOG.error("Cannot init test ", e);
98             fail("Cannot init test ");
99
100         } finally {
101             try {
102                 if (networkReader != null) {
103                     networkReader.close();
104                 }
105                 if (topoReader != null) {
106                     topoReader.close();
107                 }
108             } catch (IOException e) {
109                 LOG.warn("Cannot close reader ", e);
110             }
111         }
112
113     }
114
115     @Before
116     public void initConsumer() {
117         gnpyConsumer = new GnpyConsumerImpl("http://localhost:9998", "mylogin", "mypassword",
118                 getDataStoreContextUtil().getBindingDOMCodecServices());
119     }
120
121     @BeforeClass
122     public static void init() {
123         // here we cannot use JerseyTest as we already extends AbstractTest
124         final ResourceConfig rc = new ResourceConfig(GnpyStub.class);
125         httpServer = GrizzlyHttpServerFactory.createHttpServer(URI.create("http://localhost:9998"), rc);
126     }
127
128     @AfterClass
129     public static void tearDown() {
130         httpServer.shutdownNow();
131     }
132
133     private void saveOpenRoadmNetwork(Network network, String networkId)
134             throws InterruptedException, ExecutionException {
135         InstanceIdentifier<Network> nwInstanceIdentifier = InstanceIdentifier.builder(Networks.class)
136                 .child(Network.class, new NetworkKey(new NetworkId(networkId))).build();
137         WriteTransaction dataWriteTransaction = getDataBroker().newWriteOnlyTransaction();
138         dataWriteTransaction.put(LogicalDatastoreType.CONFIGURATION, nwInstanceIdentifier, network);
139         dataWriteTransaction.commit().get();
140     }
141
142     @Test
143     public void askNewPathFromGnpyNullResultTest() throws Exception {
144         gnpyUtilitiesImpl = new GnpyUtilitiesImpl(networkTransaction,
145                 PceTestData.getGnpyPCERequest("XPONDER-1", "XPONDER-2"),
146                 gnpyConsumer);
147         assertNull("No hard constraints should be available", gnpyUtilitiesImpl.askNewPathFromGnpy(null));
148
149     }
150
151     @Ignore
152     @Test
153     public void askNewPathFromGnpyTest() throws Exception {
154         gnpyUtilitiesImpl = new GnpyUtilitiesImpl(networkTransaction,
155                 PceTestData.getGnpyPCERequest("XPONDER-3", "XPONDER-4"),
156                 gnpyConsumer);
157         PceConstraintsCalc constraints = new PceConstraintsCalc(PceTestData.getPCE_simpletopology_test1_request(),
158                 networkTransaction);
159         PceConstraints pceHardConstraints = constraints.getPceHardConstraints();
160         assertNotNull("Hard constraints should be available", gnpyUtilitiesImpl.askNewPathFromGnpy(pceHardConstraints));
161
162
163     }
164
165     @Test
166     public void verifyComputationByGnpyTest() throws Exception {
167         // build AtoZ
168         AToZDirectionBuilder atoZDirectionBldr = buildAtZ();
169         // build ZtoA
170         ZToADirectionBuilder ztoADirectionBldr = buildZtoA();
171
172         gnpyUtilitiesImpl = new GnpyUtilitiesImpl(networkTransaction,
173                 PceTestData.getGnpyPCERequest("XPONDER-1", "XPONDER-2"),
174                 gnpyConsumer);
175         PceConstraintsCalc constraints = new PceConstraintsCalc(PceTestData.getPCE_simpletopology_test1_request(),
176                 networkTransaction);
177         PceConstraints pceHardConstraints = constraints.getPceHardConstraints();
178         boolean result = gnpyUtilitiesImpl.verifyComputationByGnpy(atoZDirectionBldr.build(),
179                 ztoADirectionBldr.build(),
180                 pceHardConstraints);
181         Assert.assertFalse("Gnpy Computation should be false",result);
182     }
183
184     private AToZDirectionBuilder buildAtZ() {
185         AToZKey clientKey = new AToZKey("key");
186         TerminationPoint stp = new TerminationPointBuilder()
187                 .setTpId("tpName").setTpNodeId("xname")
188                 .build();
189         Resource clientResource = new ResourceBuilder().setResource(stp).build();
190         AToZ firstResource = new AToZBuilder().setId("tpName").withKey(clientKey).setResource(clientResource).build();
191
192         return new AToZDirectionBuilder()
193                 .setRate(Uint32.valueOf(100))
194                 .setAToZ(Map.of(firstResource.key(),firstResource))
195                 .setAToZWavelengthNumber(Uint32.valueOf(0));
196
197     }
198
199     private ZToADirectionBuilder buildZtoA() {
200         ZToAKey clientKey = new ZToAKey("key");
201         TerminationPoint stp = new TerminationPointBuilder()
202                 .setTpId("tpName").setTpNodeId("xname")
203                 .build();
204         Resource clientResource = new ResourceBuilder().setResource(stp).build();
205         ZToA firstResource = new ZToABuilder().setId("tpName").withKey(clientKey).setResource(clientResource).build();
206         return new ZToADirectionBuilder()
207                 .setRate(Uint32.valueOf(100))
208                 .setZToA(Map.of(firstResource.key(),firstResource))
209                 .setZToAWavelengthNumber(Uint32.valueOf(0));
210
211     }
212 }