aboutsummaryrefslogtreecommitdiffstats
path: root/evc/evcmgr/src
diff options
context:
space:
mode:
Diffstat (limited to 'evc/evcmgr/src')
-rw-r--r--evc/evcmgr/src/main/java/com/cablelabs/vcpe/evc/evcmgr/CORSResponseFilter.java24
-rw-r--r--evc/evcmgr/src/main/java/com/cablelabs/vcpe/evc/evcmgr/EvcJaxRsApplication.java18
-rw-r--r--evc/evcmgr/src/main/java/com/cablelabs/vcpe/evc/evcmgr/EvcService.java286
-rw-r--r--evc/evcmgr/src/main/webapp/WEB-INF/web.xml22
-rw-r--r--evc/evcmgr/src/main/webapp/index.jsp8
5 files changed, 358 insertions, 0 deletions
diff --git a/evc/evcmgr/src/main/java/com/cablelabs/vcpe/evc/evcmgr/CORSResponseFilter.java b/evc/evcmgr/src/main/java/com/cablelabs/vcpe/evc/evcmgr/CORSResponseFilter.java
new file mode 100644
index 0000000..c224252
--- /dev/null
+++ b/evc/evcmgr/src/main/java/com/cablelabs/vcpe/evc/evcmgr/CORSResponseFilter.java
@@ -0,0 +1,24 @@
+package com.cablelabs.vcpe.evc.evcmgr;
+
+import javax.ws.rs.container.ContainerRequestContext;
+import javax.ws.rs.container.ContainerResponseContext;
+import javax.ws.rs.container.ContainerResponseFilter;
+import javax.ws.rs.core.MultivaluedMap;
+import java.io.IOException;
+
+//
+// enable cross origin responses, otherwise we can't send rest requests from domain different than that of the server hosting our service
+//
+
+public class CORSResponseFilter implements ContainerResponseFilter {
+
+ public void filter(ContainerRequestContext requestContext, ContainerResponseContext responseContext)
+ throws IOException {
+
+ MultivaluedMap<String, Object> headers = responseContext.getHeaders();
+ headers.add("Access-Control-Allow-Origin", "*");
+ headers.add("Access-Control-Allow-Methods", "GET, POST, DELETE, PUT");
+ headers.add("Access-Control-Allow-Headers", "X-Requested-With, Content-Type, X-Codingpedia");
+ }
+
+}
diff --git a/evc/evcmgr/src/main/java/com/cablelabs/vcpe/evc/evcmgr/EvcJaxRsApplication.java b/evc/evcmgr/src/main/java/com/cablelabs/vcpe/evc/evcmgr/EvcJaxRsApplication.java
new file mode 100644
index 0000000..5d46297
--- /dev/null
+++ b/evc/evcmgr/src/main/java/com/cablelabs/vcpe/evc/evcmgr/EvcJaxRsApplication.java
@@ -0,0 +1,18 @@
+package com.cablelabs.vcpe.evc.evcmgr;
+
+import org.glassfish.jersey.server.ResourceConfig;
+
+//
+// In order to avoid CORS issues, register our CORS Response filter
+//
+
+public class EvcJaxRsApplication extends ResourceConfig {
+
+ /**
+ * Register JAX-RS application components.
+ */
+ public EvcJaxRsApplication() {
+ packages("com.cablelabs.vcpe.cos.cosmgr");
+ register(CORSResponseFilter.class);
+ }
+} \ No newline at end of file
diff --git a/evc/evcmgr/src/main/java/com/cablelabs/vcpe/evc/evcmgr/EvcService.java b/evc/evcmgr/src/main/java/com/cablelabs/vcpe/evc/evcmgr/EvcService.java
new file mode 100644
index 0000000..a9943fd
--- /dev/null
+++ b/evc/evcmgr/src/main/java/com/cablelabs/vcpe/evc/evcmgr/EvcService.java
@@ -0,0 +1,286 @@
+package com.cablelabs.vcpe.evc.evcmgr;
+
+import com.cablelabs.vcpe.common.Dbg;
+import com.cablelabs.vcpe.cos.cosbase.model.CoS;
+import com.cablelabs.vcpe.cos.cosbase.client.CoSClient;
+import com.cablelabs.vcpe.uni.unibase.client.EvcPathClient;
+import com.cablelabs.vcpe.uni.unibase.model.EvcPath;
+import com.cablelabs.vcpe.uni.unibase.model.Uni;
+import com.cablelabs.vcpe.uni.unibase.client.UniClient;
+import com.cablelabs.vcpe.evc.evcbase.model.Evc;
+import com.cablelabs.vcpe.evc.evcbase.repository.EvcRespositoryInMem;
+
+import javax.ws.rs.*;
+import javax.ws.rs.core.GenericEntity;
+import javax.ws.rs.core.MediaType;
+import javax.ws.rs.core.Response;
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * Root resource (exposed at "evc" path)
+ */
+
+//public class EvcService implements EvcServiceJAXRS {
+
+@Path("evc")
+public class EvcService {
+
+ // for proof of concept, evc ID will be unique via this counter. For projecution of course
+ // that does not scale, and does not survive restart, and another method will be needed
+ static private long evcIdCounter = 1;
+ static private long uniIdCounter = 1;
+
+
+ @POST
+ @Consumes(MediaType.APPLICATION_JSON)
+ @Produces(MediaType.APPLICATION_JSON)
+ //--------------------------------------------------------
+ public Response create(Evc evc) throws Exception
+ //--------------------------------------------------------
+ {
+ if ( evc == null ||
+ evc.getUniMacList() == null ||
+ evc.getUniIdList() == null ||
+ evc.getUniMacList().size() != 2 ||
+ evc.getUniIdList().size() != 2 ||
+ evc.getUniIpList().size() != 2 )
+ {
+ return Response.status(Response.Status.BAD_REQUEST).build();
+ }
+
+ Dbg.p("\nADDING [" + evc.getId() + "] to evc repo");
+
+ // Need to get cos params based on incoming cos ID
+ CoSClient cosClient = new CoSClient();
+ CoS cos = cosClient.get(evc.getCosId());
+ if (cos == null) {
+ return Response.status(Response.Status.NOT_FOUND).build();
+ }
+
+ // set the evc Perf properties according to CoS
+ evc.setAllPerfProps( cos.getFrameDelay(),
+ cos.getFrameLoss(),
+ cos.getAvailbility());
+
+ Dbg.p("... EVC SVC: retrieved following cos info");
+ cos.dump(1);
+
+ // We need a unique EVC ID, using internal counter for the prototype
+ evc.setId("evc-"+ evcIdCounter++);
+
+ //
+ // Create the two unis in ODL
+ //
+
+ Uni.SvcSpeed svcSpeed = Uni.cirToSvcSpeed( cos.getCommitedInfoRate());
+ Uni.PhysMedium physMedium = Uni.svcSpeedToPhysMedium(svcSpeed ); // just for demo
+ // for production need to pull from host
+ Uni uni1 = new Uni();
+ uni1.setAllProps("uni-" + uniIdCounter++,
+ svcSpeed,
+ evc.getUniIpList().get(0),
+ evc.getUniMacList().get(0),
+ physMedium,
+ Uni.MacLayer.IEEE_802_3,
+ Uni.SyncMode.ENABLED,
+ Uni.Type.UNITYPE,
+ 1600);
+
+ Uni uni2 = new Uni();
+ uni2.setAllProps("uni-" + uniIdCounter++,
+ svcSpeed,
+ evc.getUniIpList().get(1),
+ evc.getUniMacList().get(1),
+ physMedium,
+ Uni.MacLayer.IEEE_802_3,
+ Uni.SyncMode.ENABLED,
+ Uni.Type.UNITYPE,
+ 1600);
+
+ // RESTCONF expecting PUT on create, so do an update instead of create
+ UniClient uniClient = new UniClient();
+ uniClient.update(uni1);
+ uniClient.update(uni2);
+
+ // Give ODL a chance to finish creating the UNIs before moving on
+ // NOTE: Should be fixed on ODL side eventually via synchronized message handling
+ try{
+ Thread.sleep(1000);
+ } catch(InterruptedException ex)
+ {Thread.currentThread().interrupt();
+ }
+
+ //
+ // Create the evc path in ODL
+ //
+
+ EvcPath evcPath = new EvcPath( evc.getId(), uni1, uni2,
+ svcSpeed, svcSpeed, cos.getId());
+ EvcPathClient evcPathClient = new EvcPathClient();
+ evcPathClient.update(evcPath);
+
+ //
+ // Finish up with the evc
+ //
+
+ // Set our UNI IDs for the EVC here
+ // eventually they will be generated and returned by ODL
+ evc.getUniIdList().set(0,uni1.getId());
+ evc.getUniIdList().set(1,uni2.getId());
+
+ EvcRespositoryInMem.INSTANCE.add(evc);
+ EvcRespositoryInMem.INSTANCE.dump(0);
+ return Response.ok().entity(evc).build();
+ }
+
+ @PUT
+ @Path("{evcId}")
+ @Consumes(MediaType.APPLICATION_JSON)
+ @Produces(MediaType.APPLICATION_JSON)
+ //--------------------------------------------------------
+ public Response update(Evc evc)
+ //--------------------------------------------------------
+ {
+ Dbg.p("\nUPDATING [" + evc.getId()+"]");
+
+ // Need to get cos params based on incoming cos ID
+ CoSClient cosClient = new CoSClient();
+ CoS cos = cosClient.get(evc.getCosId());
+ if (cos == null) {
+ return Response.status(Response.Status.NOT_FOUND).build();
+ }
+
+ evc.setOneWayFrameDelay(cos.getFrameDelay());
+ evc.setOneWayFrameLossRatio(cos.getFrameLoss());
+ evc.setOneWayAvailability(cos.getAvailbility());
+
+ EvcRespositoryInMem.INSTANCE.update(evc);
+ EvcRespositoryInMem.INSTANCE.dump(0);
+ return Response.ok().entity(evc).build();
+ }
+
+ @GET
+ @Path("{evcId}")
+ @Produces(MediaType.APPLICATION_JSON)
+ //--------------------------------------------------------
+ public Response get( @PathParam("evcId") String evcId )
+ //--------------------------------------------------------
+ {
+ if ( evcId == null) {
+ return Response.status(Response.Status.BAD_REQUEST).build();
+ }
+ Dbg.p("\nRETRIEVING ["+evcId+"]");
+ Evc evc = EvcRespositoryInMem.INSTANCE.get(evcId);
+ if (evc == null) {
+ return Response.status(Response.Status.NOT_FOUND).build();
+ }
+ evc.dump(1);
+ return Response.ok().entity(evc).build();
+ }
+
+ @GET
+ @Path("list")
+ @Produces(MediaType.APPLICATION_JSON)
+ //--------------------------------------------------------
+ public Response evcList()
+ //--------------------------------------------------------
+
+ // get a list of all Evc objects
+ {
+ Dbg.p("\nEVC GET ALL:");
+ List evcList = EvcRespositoryInMem.INSTANCE.getAll();
+ if (evcList == null )
+ {
+ return Response.status(Response.Status.NOT_FOUND).build();
+ }
+ return Response.ok().entity(new GenericEntity<List<Evc>>(evcList) {}).build();
+ }
+
+ @DELETE
+ @Path("{evcId}")
+ //--------------------------------------------------------
+ public Response delete(@PathParam("evcId") String evcId)
+ throws Exception
+ //--------------------------------------------------------
+ {
+ if ( evcId == null) {
+ return Response.status(Response.Status.BAD_REQUEST).build();
+ }
+ Dbg.p("\nDELETE:" + evcId);
+
+ Evc evcToDel = EvcRespositoryInMem.INSTANCE.get(evcId);
+ List<String> uniIdList = evcToDel.getUniIdList();
+
+ // Delete EvcPath first (unis can exists independent of EVC, but not vica-versa)
+ EvcPathClient evcPathClient = new EvcPathClient();
+ evcPathClient.delete(evcToDel.getId());
+
+ // Give ODL a chance to finish deleting the evc Path
+ // NOTE: Should be fixed on ODL side eventually via synchronized message handling
+ try{
+ Thread.sleep(1000);
+ } catch(InterruptedException ex)
+ {Thread.currentThread().interrupt();
+ }
+
+ // Delete the UNI's in ODL
+ UniClient uniClient = new UniClient();
+ if ( uniIdList != null && uniIdList.size() > 0 )
+ uniClient.delete(uniIdList.get(0));
+ if ( uniIdList != null && uniIdList.size() > 1 )
+ uniClient.delete(uniIdList.get(1));
+
+ // OK, now we can delete the EVC itself
+ EvcRespositoryInMem.INSTANCE.delete(evcId);
+ EvcRespositoryInMem.INSTANCE.dump(0);
+ return Response.ok().build();
+ }
+
+ @GET
+ @Produces(MediaType.APPLICATION_JSON)
+ //--------------------------------------------------------
+ public Evc testGet()
+ //--------------------------------------------------------
+ // simple get to check out json format
+ {
+ List<String> uniList = new ArrayList<String>();
+ uniList.add("UNI-1");
+ uniList.add("UNI-2");
+
+ List<String> uniMacList = new ArrayList<String>();
+ uniMacList.add("11:00:11:11:11:11");
+ uniMacList.add("11:00:22:22:22:22");
+
+ List<String> uniIpList = new ArrayList<String>();
+ uniIpList.add("192.168.1.1");
+ uniIpList.add("192.168.1.2");
+
+
+ Evc evc = new Evc();
+ evc.setAllNonPerfProps("Eve", // id
+ Evc.EvcType.POINT_TO_POINT, // evcType
+ 2, // maxUnis
+ uniList, uniMacList, uniIpList,
+ Evc.FrameDelivery.UNCONDITIONAL, // unicastFrameDelivery
+ Evc.FrameDelivery.UNCONDITIONAL, // multicastFrameDelivery
+ Evc.FrameDelivery.UNCONDITIONAL, // broadcastFrameDelivery
+ true, // ceVLanIdPreservation
+ true, // ceVlanCosPreservation
+ 1600, // evcMaxSvcFrameSize
+ "gold"); // cosId
+ return evc;
+ }
+
+ @GET
+ @Produces(MediaType.TEXT_PLAIN)
+ //--------------------------------------------------------
+ public String ping()
+ //--------------------------------------------------------
+ // simple ping to check connectivity
+
+ {
+ Dbg.p("In Evc Service: ping test");
+ return "... pingEvc reponse";
+ }
+}
diff --git a/evc/evcmgr/src/main/webapp/WEB-INF/web.xml b/evc/evcmgr/src/main/webapp/WEB-INF/web.xml
new file mode 100644
index 0000000..dfb5cd5
--- /dev/null
+++ b/evc/evcmgr/src/main/webapp/WEB-INF/web.xml
@@ -0,0 +1,22 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- This web.xml file is not required when using Servlet 3.0 container,
+ see implementation details http://jersey.java.net/nonav/documentation/latest/jax-rs.html -->
+<web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
+ <servlet>
+ <servlet-name>Jersey Web Application</servlet-name>
+ <servlet-class>org.glassfish.jersey.servlet.ServletContainer</servlet-class>
+ <init-param>
+ <param-name>jersey.config.server.provider.packages</param-name>
+ <param-value>com.cablelabs.vcpe.evc</param-value>
+ </init-param>
+ <init-param>
+ <param-name>javax.ws.rs.Application</param-name>
+ <param-value>com.cablelabs.vcpe.evc.evcmgr.EvcJaxRsApplication</param-value>
+ </init-param>
+ <load-on-startup>1</load-on-startup>
+ </servlet>
+ <servlet-mapping>
+ <servlet-name>Jersey Web Application</servlet-name>
+ <url-pattern>/webapi/*</url-pattern>
+ </servlet-mapping>
+</web-app>
diff --git a/evc/evcmgr/src/main/webapp/index.jsp b/evc/evcmgr/src/main/webapp/index.jsp
new file mode 100644
index 0000000..a064b45
--- /dev/null
+++ b/evc/evcmgr/src/main/webapp/index.jsp
@@ -0,0 +1,8 @@
+<html>
+<body>
+ <h2>Jersey RESTful Web Application!</h2>
+ <p><a href="webapi/myresource">Jersey resource</a>
+ <p>Visit <a href="http://jersey.java.net">Project Jersey website</a>
+ for more information on Jersey!
+</body>
+</html>