X-Git-Url: https://git.opendaylight.org/gerrit/gitweb?a=blobdiff_plain;f=pce%2Fsrc%2Ftest%2Fjava%2Forg%2Fopendaylight%2Ftransportpce%2Fpce%2Fgnpy%2FGnpyUtilitiesImplTest.java;h=3a52ac2249c637b44b562597477e6c67f273efaf;hb=5a59a59e40a4c6d8176666965f469d0c3f6d7487;hp=986d782fe5c979297c5f897650ea1dd8556d425e;hpb=e631441244bd5437554d1f85ff4b591ed4a54e7a;p=transportpce.git diff --git a/pce/src/test/java/org/opendaylight/transportpce/pce/gnpy/GnpyUtilitiesImplTest.java b/pce/src/test/java/org/opendaylight/transportpce/pce/gnpy/GnpyUtilitiesImplTest.java index 986d782fe..3a52ac224 100644 --- a/pce/src/test/java/org/opendaylight/transportpce/pce/gnpy/GnpyUtilitiesImplTest.java +++ b/pce/src/test/java/org/opendaylight/transportpce/pce/gnpy/GnpyUtilitiesImplTest.java @@ -7,42 +7,193 @@ */ package org.opendaylight.transportpce.pce.gnpy; -import org.junit.Before; -import org.junit.Ignore; -import org.junit.Test; + +import static org.junit.jupiter.api.Assertions.assertFalse; +import static org.junit.jupiter.api.Assertions.assertNotNull; +import static org.junit.jupiter.api.Assertions.assertNull; +import static org.junit.jupiter.api.Assertions.fail; + +import com.google.gson.stream.JsonReader; +import java.io.FileNotFoundException; +import java.io.FileReader; +import java.io.IOException; +import java.io.Reader; +import java.net.URI; +import java.nio.charset.StandardCharsets; +import java.util.Map; +import java.util.concurrent.ExecutionException; +import org.glassfish.grizzly.http.server.HttpServer; +import org.glassfish.jersey.grizzly2.httpserver.GrizzlyHttpServerFactory; +import org.glassfish.jersey.server.ResourceConfig; +import org.junit.jupiter.api.AfterAll; +import org.junit.jupiter.api.BeforeAll; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.opendaylight.mdsal.common.api.LogicalDatastoreType; +import org.opendaylight.transportpce.common.NetworkUtils; import org.opendaylight.transportpce.common.network.NetworkTransactionImpl; -import org.opendaylight.transportpce.common.network.RequestProcessor; import org.opendaylight.transportpce.pce.constraints.PceConstraints; import org.opendaylight.transportpce.pce.constraints.PceConstraintsCalc; +import org.opendaylight.transportpce.pce.gnpy.consumer.GnpyConsumer; +import org.opendaylight.transportpce.pce.gnpy.consumer.GnpyConsumerImpl; +import org.opendaylight.transportpce.pce.gnpy.consumer.GnpyStub; +import org.opendaylight.transportpce.pce.utils.JsonUtil; import org.opendaylight.transportpce.pce.utils.PceTestData; import org.opendaylight.transportpce.test.AbstractTest; - -@Ignore +import org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.pathdescription.rev230501.path.description.AToZDirectionBuilder; +import org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.pathdescription.rev230501.path.description.ZToADirectionBuilder; +import org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.pathdescription.rev230501.path.description.atoz.direction.AToZ; +import org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.pathdescription.rev230501.path.description.atoz.direction.AToZBuilder; +import org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.pathdescription.rev230501.path.description.atoz.direction.AToZKey; +import org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.pathdescription.rev230501.path.description.ztoa.direction.ZToA; +import org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.pathdescription.rev230501.path.description.ztoa.direction.ZToABuilder; +import org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.pathdescription.rev230501.path.description.ztoa.direction.ZToAKey; +import org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.pathdescription.rev230501.pce.resource.Resource; +import org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.pathdescription.rev230501.pce.resource.ResourceBuilder; +import org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.pathdescription.rev230501.pce.resource.resource.resource.TerminationPoint; +import org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.pathdescription.rev230501.pce.resource.resource.resource.TerminationPointBuilder; +import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.rev180226.NetworkId; +import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.rev180226.Networks; +import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.rev180226.networks.Network; +import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.rev180226.networks.NetworkKey; +import org.opendaylight.yangtools.yang.binding.InstanceIdentifier; +import org.opendaylight.yangtools.yang.common.Uint32; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; public class GnpyUtilitiesImplTest extends AbstractTest { + private static final Logger LOG = LoggerFactory.getLogger(GnpyUtilitiesImplTest.class); private GnpyUtilitiesImpl gnpyUtilitiesImpl; private NetworkTransactionImpl networkTransaction; + private static HttpServer httpServer; + private GnpyConsumer gnpyConsumer; + + public GnpyUtilitiesImplTest() throws IOException { + networkTransaction = new NetworkTransactionImpl(getDataBroker()); + JsonReader networkReader = null; + JsonReader topoReader = null; + + try { + // load openroadm-network + Reader gnpyNetwork = new FileReader("src/test/resources/gnpy/gnpy_network.json", + StandardCharsets.UTF_8); + + networkReader = new JsonReader(gnpyNetwork); + Networks networks = (Networks) JsonUtil.getInstance().getDataObjectFromJson(networkReader, Networks.QNAME); + saveOpenRoadmNetwork(networks.getNetwork().values().iterator().next(), NetworkUtils.UNDERLAY_NETWORK_ID); + // load openroadm-topology + Reader gnpyTopo = new FileReader("src/test/resources/gnpy/gnpy_topology.json", + StandardCharsets.UTF_8); + topoReader = new JsonReader(gnpyTopo); + networks = (Networks) JsonUtil.getInstance().getDataObjectFromJson(topoReader, Networks.QNAME); + saveOpenRoadmNetwork(networks.getNetwork().values().iterator().next(), NetworkUtils.OVERLAY_NETWORK_ID); + } catch (FileNotFoundException | InterruptedException | ExecutionException e) { + LOG.error("Cannot init test ", e); + fail("Cannot init test "); + + } finally { + try { + if (networkReader != null) { + networkReader.close(); + } + if (topoReader != null) { + topoReader.close(); + } + } catch (IOException e) { + LOG.warn("Cannot close reader ", e); + } + } + + } + + @BeforeEach + void initConsumer() { + gnpyConsumer = new GnpyConsumerImpl("http://localhost:9998", "mylogin", "mypassword", + getDataStoreContextUtil().getBindingDOMCodecServices()); + } + + @BeforeAll + static void init() { + // here we cannot use JerseyTest as we already extends AbstractTest + final ResourceConfig rc = new ResourceConfig(GnpyStub.class); + httpServer = GrizzlyHttpServerFactory.createHttpServer(URI.create("http://localhost:9998"), rc); + } + + @AfterAll + static void tearDown() { + httpServer.shutdownNow(); + } - @Before - public void setUp()throws Exception { - networkTransaction = new NetworkTransactionImpl(new RequestProcessor(this.getNewDataBroker())); + private void saveOpenRoadmNetwork(Network network, String networkId) + throws InterruptedException, ExecutionException { + InstanceIdentifier nwInstanceIdentifier = InstanceIdentifier.builder(Networks.class) + .child(Network.class, new NetworkKey(new NetworkId(networkId))).build(); + networkTransaction.put(LogicalDatastoreType.CONFIGURATION, nwInstanceIdentifier, network); + networkTransaction.commit().get(); + } - gnpyUtilitiesImpl = new GnpyUtilitiesImpl(networkTransaction, PceTestData.getPCE_test1_request_54()); + @Test + void askNewPathFromGnpyNullResultTest() throws Exception { + gnpyUtilitiesImpl = new GnpyUtilitiesImpl(networkTransaction, + PceTestData.getGnpyPCERequest("XPONDER-1", "XPONDER-2"), + gnpyConsumer); + assertNull(gnpyUtilitiesImpl.askNewPathFromGnpy(null), "No hard constraints should be available"); } - @Test(expected = Exception.class) - public void askNewPathFromGnpyTest() throws Exception { - PceConstraintsCalc constraints = - new PceConstraintsCalc(PceTestData.getPCE_simpletopology_test1_request(), networkTransaction); + @Test + void askNewPathFromGnpyTest() throws Exception { + gnpyUtilitiesImpl = new GnpyUtilitiesImpl(networkTransaction, + PceTestData.getGnpyPCERequest("XPONDER-3", "XPONDER-4"), + gnpyConsumer); + PceConstraintsCalc constraints = new PceConstraintsCalc(PceTestData.getPCE_simpletopology_test1_request(), + networkTransaction); PceConstraints pceHardConstraints = constraints.getPceHardConstraints(); - gnpyUtilitiesImpl.askNewPathFromGnpy(pceHardConstraints); + assertNotNull(gnpyUtilitiesImpl.askNewPathFromGnpy(pceHardConstraints), "Hard constraints should be available"); } - @Test(expected = Exception.class) - public void gnpyResponseOneDirectionTest() throws Exception { - gnpyUtilitiesImpl.gnpyResponseOneDirection(null); + @Test + void verifyComputationByGnpyTest() throws Exception { + // build AtoZ + AToZDirectionBuilder atoZDirectionBldr = buildAtZ(); + // build ZtoA + ZToADirectionBuilder ztoADirectionBldr = buildZtoA(); + + gnpyUtilitiesImpl = new GnpyUtilitiesImpl(networkTransaction, + PceTestData.getGnpyPCERequest("XPONDER-1", "XPONDER-2"), + gnpyConsumer); + PceConstraintsCalc constraints = new PceConstraintsCalc(PceTestData.getPCE_simpletopology_test1_request(), + networkTransaction); + PceConstraints pceHardConstraints = constraints.getPceHardConstraints(); + boolean result = gnpyUtilitiesImpl.verifyComputationByGnpy(atoZDirectionBldr.build(), + ztoADirectionBldr.build(), + pceHardConstraints); + assertFalse(result, "Gnpy Computation should be false"); } + private AToZDirectionBuilder buildAtZ() { + AToZKey clientKey = new AToZKey("key"); + TerminationPoint stp = new TerminationPointBuilder() + .setTpId("tpName").setTpNodeId("xname") + .build(); + Resource clientResource = new ResourceBuilder().setResource(stp).build(); + AToZ firstResource = new AToZBuilder().setId("tpName").withKey(clientKey).setResource(clientResource).build(); + return new AToZDirectionBuilder() + .setRate(Uint32.valueOf(100)) + .setAToZ(Map.of(firstResource.key(),firstResource)) + .setAToZWavelengthNumber(Uint32.valueOf(0)); + } + private ZToADirectionBuilder buildZtoA() { + ZToAKey clientKey = new ZToAKey("key"); + TerminationPoint stp = new TerminationPointBuilder() + .setTpId("tpName").setTpNodeId("xname") + .build(); + Resource clientResource = new ResourceBuilder().setResource(stp).build(); + ZToA firstResource = new ZToABuilder().setId("tpName").withKey(clientKey).setResource(clientResource).build(); + return new ZToADirectionBuilder() + .setRate(Uint32.valueOf(100)) + .setZToA(Map.of(firstResource.key(),firstResource)) + .setZToAWavelengthNumber(Uint32.valueOf(0)); + } }