GNPy stub for PCE
[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.util.concurrent.ExecutionException;
21 import org.glassfish.grizzly.http.server.HttpServer;
22 import org.glassfish.jersey.grizzly2.httpserver.GrizzlyHttpServerFactory;
23 import org.glassfish.jersey.server.ResourceConfig;
24 import org.junit.AfterClass;
25 import org.junit.BeforeClass;
26 import org.junit.Test;
27 import org.opendaylight.mdsal.binding.api.WriteTransaction;
28 import org.opendaylight.mdsal.common.api.LogicalDatastoreType;
29 import org.opendaylight.transportpce.common.NetworkUtils;
30 import org.opendaylight.transportpce.common.network.NetworkTransactionImpl;
31 import org.opendaylight.transportpce.common.network.RequestProcessor;
32 import org.opendaylight.transportpce.pce.constraints.PceConstraints;
33 import org.opendaylight.transportpce.pce.constraints.PceConstraintsCalc;
34 import org.opendaylight.transportpce.pce.utils.JsonUtil;
35 import org.opendaylight.transportpce.pce.utils.PceTestData;
36 import org.opendaylight.transportpce.test.AbstractTest;
37 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.rev180226.NetworkId;
38 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.rev180226.Networks;
39 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.rev180226.networks.Network;
40 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.rev180226.networks.NetworkKey;
41 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
42 import org.opendaylight.yangtools.yang.common.QName;
43 import org.slf4j.Logger;
44 import org.slf4j.LoggerFactory;
45
46
47
48 public class GnpyUtilitiesImplTest extends AbstractTest {
49
50     private static final Logger LOG = LoggerFactory.getLogger(GnpyUtilitiesImplTest.class);
51     private GnpyUtilitiesImpl gnpyUtilitiesImpl;
52     private NetworkTransactionImpl networkTransaction;
53     private static HttpServer httpServer;
54
55     public GnpyUtilitiesImplTest() {
56         networkTransaction = new NetworkTransactionImpl(new RequestProcessor(this.getDataBroker()));
57         JsonReader networkReader = null;
58         JsonReader topoReader = null;
59
60         try {
61             // load openroadm-network
62             Reader gnpyNetwork = new FileReader("src/test/resources/gnpy/gnpy_network.json");
63
64             networkReader = new JsonReader(gnpyNetwork);
65             Networks networks = (Networks) JsonUtil.getInstance().getDataObjectFromJson(networkReader,
66                     QName.create("urn:ietf:params:xml:ns:yang:ietf-network", "2018-02-26", "networks"));
67             saveOpenRoadmNetwork(networks.getNetwork().get(0), NetworkUtils.UNDERLAY_NETWORK_ID);
68             // load openroadm-topology
69             Reader gnpyTopo = new FileReader("src/test/resources/gnpy/gnpy_topology.json");
70             topoReader = new JsonReader(gnpyTopo);
71             networks = (Networks) JsonUtil.getInstance().getDataObjectFromJson(topoReader,
72                     QName.create("urn:ietf:params:xml:ns:yang:ietf-network", "2018-02-26", "networks"));
73             saveOpenRoadmNetwork(networks.getNetwork().get(0), NetworkUtils.OVERLAY_NETWORK_ID);
74         } catch (FileNotFoundException | InterruptedException | ExecutionException e) {
75             LOG.error("Cannot init test ", e);
76             fail("Cannot init test ");
77
78         } finally {
79             try {
80                 if (networkReader != null) {
81                     networkReader.close();
82                 }
83                 if (topoReader != null) {
84                     topoReader.close();
85                 }
86             } catch (IOException e) {
87                 LOG.warn("Cannot close reader ", e);
88             }
89         }
90
91     }
92
93     @BeforeClass
94     public static void init() {
95         // here we cannot use JerseyTest as we already extends AbstractTest
96         final ResourceConfig rc = new ResourceConfig(GnpyStub.class);
97         httpServer = GrizzlyHttpServerFactory.createHttpServer(URI.create("http://127.0.0.1:8008"), rc);
98     }
99
100     @AfterClass
101     public static void tearDown() {
102         httpServer.shutdownNow();
103     }
104
105     private void saveOpenRoadmNetwork(Network network, String networkId)
106             throws InterruptedException, ExecutionException {
107         InstanceIdentifier<Network> nwInstanceIdentifier = InstanceIdentifier.builder(Networks.class)
108                 .child(Network.class, new NetworkKey(new NetworkId(networkId))).build();
109         WriteTransaction dataWriteTransaction = this.getDataBroker().newWriteOnlyTransaction();
110         dataWriteTransaction.put(LogicalDatastoreType.CONFIGURATION, nwInstanceIdentifier, network);
111         dataWriteTransaction.commit().get();
112     }
113
114     @Test
115     public void askNewPathFromGnpyNullResultTest() throws Exception {
116         gnpyUtilitiesImpl = new GnpyUtilitiesImpl(networkTransaction,
117                 PceTestData.getGnpyPCERequest("XPONDER-1", "XPONDER-2"));
118         assertNull("No hard constraints should be available", gnpyUtilitiesImpl.askNewPathFromGnpy(null));
119
120     }
121
122     @Test
123     public void askNewPathFromGnpyTest() throws Exception {
124         gnpyUtilitiesImpl = new GnpyUtilitiesImpl(networkTransaction,
125                 PceTestData.getGnpyPCERequest("XPONDER-3", "XPONDER-4"));
126         PceConstraintsCalc constraints = new PceConstraintsCalc(PceTestData.getPCE_simpletopology_test1_request(),
127                 networkTransaction);
128         PceConstraints pceHardConstraints = constraints.getPceHardConstraints();
129         assertNotNull("Hard constraints should be available",gnpyUtilitiesImpl.askNewPathFromGnpy(pceHardConstraints));
130
131
132     }
133
134     @Test(expected = Exception.class)
135     public void gnpyResponseOneDirectionTest() throws Exception {
136         gnpyUtilitiesImpl = new GnpyUtilitiesImpl(networkTransaction, PceTestData.getPCERequest());
137         gnpyUtilitiesImpl.gnpyResponseOneDirection(null);
138     }
139 }