Adding EVC rest enpoint for CarrierEthernet app

Change-Id: Ie6a1c0e5ab1fe1cd17d0fefb892f51cf540ead3e
diff --git a/carrierethernet/pom.xml b/carrierethernet/pom.xml
index 4ef8f36..1a97a99 100644
--- a/carrierethernet/pom.xml
+++ b/carrierethernet/pom.xml
@@ -13,20 +13,19 @@
   ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
   ~ See the License for the specific language governing permissions and
   ~ limitations under the License.
-  -->
-<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+  --><project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
     <modelVersion>4.0.0</modelVersion>
 
     <parent>
         <groupId>org.onosproject</groupId>
         <artifactId>onos-dependencies</artifactId>
-        <version>1.8.0</version>
+        <version>1.9.0</version>
         <relativePath/><!-- parent is remote -->
     </parent>
 
     <groupId>org.onosproject</groupId>
     <artifactId>onos-app-carrierethernet</artifactId>
-    <version>1.8.0-SNAPSHOT</version>
+    <version>04.2017</version>
     <packaging>bundle</packaging>
 
     <description>Application for installing MEF services in ONOS</description>
@@ -34,12 +33,17 @@
 
     <properties>
         <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
-        <onos.version>1.8.0</onos.version>
+        <onos.version>1.9.0</onos.version>
+        <api.version>1.0.0</api.version>
         <onos.app.name>org.onosproject.ecord.carrierethernet</onos.app.name>
         <onos.app.origin>ON.Lab</onos.app.origin>
         <onos.app.requires>org.onosproject.newoptical</onos.app.requires>
+        <api.description>Carrier Ethernet REST APIs</api.description>
         <onos.app.category>Traffic Steering</onos.app.category>
+        <web.context>/onos</web.context>
+        <api.title>Carrier Ethernet REST APIs</api.title>
         <onos.app.title>Carrier Ethernet</onos.app.title>
+        <api.package>org.onosproject.ecord.carrierethernet.rest</api.package>
         <onos.app.url>https://wiki.onosproject.org/display/ONOS/Carrier+Ethernet+Application</onos.app.url>
     </properties>
 
@@ -64,7 +68,7 @@
         <dependency>
             <groupId>org.onosproject</groupId>
             <artifactId>onos-apps-newoptical</artifactId>
-            <version>${onos.version}</version>
+            <version>1.10.0-SNAPSHOT</version>
         </dependency>
 
         <dependency>
@@ -109,6 +113,48 @@
             <version>5.0.0</version>
             <scope>provided</scope>
         </dependency>
+        <dependency>
+      <groupId>javax.ws.rs</groupId>
+      <artifactId>javax.ws.rs-api</artifactId>
+      <version>2.0.1</version>
+      <scope>provided</scope>
+    </dependency>
+        <dependency>
+      <groupId>com.fasterxml.jackson.core</groupId>
+      <artifactId>jackson-databind</artifactId>
+      <version>2.8.6</version>
+      <scope>provided</scope>
+    </dependency>
+        <dependency>
+      <groupId>org.onosproject</groupId>
+      <artifactId>onos-rest</artifactId>
+      <version>${onos.version}</version>
+      <scope>provided</scope>
+    </dependency>
+        <dependency>
+      <groupId>com.fasterxml.jackson.core</groupId>
+      <artifactId>jackson-annotations</artifactId>
+      <version>2.8.6</version>
+      <scope>provided</scope>
+    </dependency>
+        <dependency>
+      <groupId>org.glassfish.jersey.containers</groupId>
+      <artifactId>jersey-container-servlet</artifactId>
+      <version>2.25</version>
+      <scope>provided</scope>
+    </dependency>
+        <dependency>
+      <groupId>org.osgi</groupId>
+      <artifactId>org.osgi.core</artifactId>
+      <version>5.0.0</version>
+      <scope>provided</scope>
+    </dependency>
+        <dependency>
+      <groupId>org.onosproject</groupId>
+      <artifactId>onlab-rest</artifactId>
+      <version>${onos.version}</version>
+      <scope>provided</scope>
+    </dependency>
     </dependencies>
 
     <build>
@@ -128,6 +174,16 @@
                 <artifactId>maven-bundle-plugin</artifactId>
                 <version>2.5.3</version>
                 <extensions>true</extensions>
+                <configuration>
+          <instructions>
+            <_wab>src/main/webapp/</_wab>
+            <Include-Resource>WEB-INF/classes/apidoc/swagger.json=target/swagger.json,
+                            {maven-resources}</Include-Resource>
+            <Bundle-SymbolicName>${project.groupId}.${project.artifactId}</Bundle-SymbolicName>
+            <Import-Package>*,org.glassfish.jersey.servlet</Import-Package>
+            <Web-ContextPath>${web.context}</Web-ContextPath>
+          </instructions>
+        </configuration>
             </plugin>
             <plugin>
                 <groupId>org.apache.maven.plugins</groupId>
diff --git a/carrierethernet/src/main/java/org/onosproject/ecord/carrierethernet/app/CarrierEthernetEvcUtils.java b/carrierethernet/src/main/java/org/onosproject/ecord/carrierethernet/app/CarrierEthernetEvcUtils.java
new file mode 100644
index 0000000..fab928b
--- /dev/null
+++ b/carrierethernet/src/main/java/org/onosproject/ecord/carrierethernet/app/CarrierEthernetEvcUtils.java
@@ -0,0 +1,159 @@
+package org.onosproject.ecord.carrierethernet.app;
+
+import org.onlab.packet.VlanId;
+import org.onlab.util.Bandwidth;
+import org.onosproject.net.ConnectPoint;
+
+import java.util.HashSet;
+import java.util.List;
+import java.util.Set;
+
+import static org.onosproject.ecord.carrierethernet.app.CarrierEthernetVirtualConnection.MAX_NUM_UNI;
+
+/**
+ * Utilities to build EthernetVirtualConnections.
+ */
+public final class CarrierEthernetEvcUtils {
+
+    // no instantiation
+    private CarrierEthernetEvcUtils() {
+    }
+
+    /**
+     * Return the CE-VLAN ID for the CE evc based on the CLI-supplied argument.
+     *
+     * @param argCeVlanId vlanID
+     * @return CE-VLAN ID for the CE evc
+     */
+    public static VlanId generateCeVlanId(short argCeVlanId) {
+        return ((argCeVlanId == -1) ? null : VlanId.vlanId(argCeVlanId));
+    }
+
+    /**
+     * Return the CE evc type based on the CLI-supplied arguments.
+     *
+     * @param evcTypeString EVC type
+     * @param uniList       UNIs list
+     * @return the CE evc type
+     */
+    public static CarrierEthernetConnection.Type generateEvcType(String evcTypeString, List<String> uniList) {
+        if (evcTypeString == null) {
+            return ((uniList.size() > 2) ?
+                    CarrierEthernetConnection.Type.MULTIPOINT_TO_MULTIPOINT :
+                    CarrierEthernetConnection.Type.POINT_TO_POINT);
+        } else {
+            // TODO: Catch exception
+            return CarrierEthernetConnection.Type.valueOf(evcTypeString);
+        }
+    }
+
+    /**
+     * Return the EVC maxNumUni parameter based on the CLI-supplied arguments.
+     *
+     * @param maxNumUni     maximum numbers of UNIs
+     * @param evcTypeString EVC Type
+     * @param uniList       UNIs list
+     * @return the maxNumUni parameter
+     */
+    public static Integer generateMaxNumUni(int maxNumUni, String evcTypeString, List<String> uniList) {
+        if (maxNumUni == -1) {
+            if (evcTypeString == null) {
+                return ((uniList.size() > 2) ?
+                        MAX_NUM_UNI : 2);
+            } else {
+                // TODO: Catch exception
+                CarrierEthernetConnection.Type evcType =
+                        CarrierEthernetConnection.Type.valueOf(evcTypeString);
+                return (evcType.equals(CarrierEthernetConnection.Type.POINT_TO_POINT) ? 2 :
+                        MAX_NUM_UNI);
+            }
+        } else {
+            return maxNumUni;
+        }
+    }
+
+    /**
+     * Return the BW profile type based on the CLI-supplied arguments.
+     *
+     * @param ceVlanId vlanID
+     * @return the BWP profile type
+     */
+    public static CarrierEthernetBandwidthProfile.Type generateBandwidthProfileType(short ceVlanId) {
+        // TODO: Add the CoS BW profile case
+        return ((ceVlanId == -1) ?
+                CarrierEthernetBandwidthProfile.Type.INTERFACE : CarrierEthernetBandwidthProfile.Type.EVC);
+    }
+
+    /**
+     * Return the BW profile id based on the CLI-supplied arguments.
+     *
+     * @param uniId    UNI id
+     * @param evcCfgId EVC configuration Id
+     * @param ceVlanId vlanID
+     * @return the BW profile id
+     */
+    public static String generateBandwidthProfileId(String uniId, String evcCfgId, int ceVlanId) {
+        // TODO: Add the CoS BW profile case
+        return ((ceVlanId == -1) ? uniId : evcCfgId);
+    }
+
+    /**
+     * Return the set of UNIs for the CE EVC based on the CLI-supplied arguments.
+     *
+     * @param evcTypeString Type of the UNI
+     * @param uniList       list of remaning UNIs
+     * @param ceVlanId      vlanID
+     * @param firstUni      first UNI id
+     * @param evcCfgId      EVC configuration Id
+     * @param cir           The CIR in Mbps
+     * @param eir           The EIR in Mbps
+     * @param cbs           The CBS in Byte
+     * @param ebs           The EBS in Byte
+     * @return the set of UNIs for the CE EVC
+     */
+    public static Set<CarrierEthernetUni> generateUniSet(String evcTypeString, List<String> uniList,
+                                                         short ceVlanId, String firstUni, String evcCfgId,
+                                                         Double cir, Double eir, Long cbs, Long ebs) {
+
+        Set<CarrierEthernetUni> uniSet = new HashSet<>();
+
+        CarrierEthernetConnection.Type evcType = generateEvcType(evcTypeString, uniList);
+
+        // We assume that first UNI supplied is always root
+        uniSet.add(CarrierEthernetUni.builder()
+                           .cp(ConnectPoint.deviceConnectPoint(firstUni))
+                           .role(CarrierEthernetUni.Role.ROOT)
+                           .ceVlanId(generateCeVlanId(ceVlanId))
+                           .bwp(CarrierEthernetBandwidthProfile.builder()
+                                        .id(generateBandwidthProfileId(firstUni, evcCfgId, ceVlanId))
+                                        .type(generateBandwidthProfileType(ceVlanId))
+                                        .cir(Bandwidth.mbps(cir))
+                                        .eir(Bandwidth.mbps(eir))
+                                        .cbs(cbs)
+                                        .ebs(ebs)
+                                        .build())
+                           .build());
+
+        final CarrierEthernetUni.Role role;
+        // For E-Line and E-LAN all UNIs are roots. For E-Tree all UNIs are leafs except from one
+        role = ((evcType == CarrierEthernetConnection.Type.ROOT_MULTIPOINT) ?
+                CarrierEthernetUni.Role.LEAF : CarrierEthernetUni.Role.ROOT);
+
+       uniList.forEach(argUni -> uniSet.add(
+                CarrierEthernetUni.builder()
+                        .cp(ConnectPoint.deviceConnectPoint(argUni))
+                        .role(role)
+                        .ceVlanId(generateCeVlanId(ceVlanId))
+                        .bwp(CarrierEthernetBandwidthProfile.builder()
+                                     .id(generateBandwidthProfileId(argUni, evcCfgId, ceVlanId))
+                                     .type(generateBandwidthProfileType(ceVlanId))
+                                     .cir(Bandwidth.mbps(cir))
+                                     .eir(Bandwidth.mbps(eir))
+                                     .cbs(cbs)
+                                     .ebs(ebs)
+                                     .build())
+                        .build()));
+
+        return uniSet;
+    }
+}
diff --git a/carrierethernet/src/main/java/org/onosproject/ecord/carrierethernet/cli/commands/CarrierEthernetCreateEvcCommand.java b/carrierethernet/src/main/java/org/onosproject/ecord/carrierethernet/cli/commands/CarrierEthernetCreateEvcCommand.java
index b3c4225..c5ce82e 100644
--- a/carrierethernet/src/main/java/org/onosproject/ecord/carrierethernet/cli/commands/CarrierEthernetCreateEvcCommand.java
+++ b/carrierethernet/src/main/java/org/onosproject/ecord/carrierethernet/cli/commands/CarrierEthernetCreateEvcCommand.java
@@ -19,24 +19,19 @@
 import org.apache.karaf.shell.commands.Argument;
 import org.apache.karaf.shell.commands.Command;
 import org.apache.karaf.shell.commands.Option;
-import org.onlab.packet.VlanId;
-import org.onlab.util.Bandwidth;
 import org.onosproject.cli.AbstractShellCommand;
 import org.onosproject.ecord.carrierethernet.api.CarrierEthernetService;
-import org.onosproject.ecord.carrierethernet.app.CarrierEthernetBandwidthProfile;
-import org.onosproject.ecord.carrierethernet.app.CarrierEthernetUni;
 import org.onosproject.ecord.carrierethernet.app.CarrierEthernetVirtualConnection;
-import org.onosproject.net.ConnectPoint;
 
-import java.util.HashSet;
 import java.util.List;
-import java.util.Set;
+
+import static org.onosproject.ecord.carrierethernet.app.CarrierEthernetEvcUtils.*;
 
 /**
  * CLI command for installing an Ethernet Virtual Connection.
  */
 @Command(scope = "onos", name = "ce-evc-create",
-         description = "Carrier Ethernet EVC creation command.")
+        description = "Carrier Ethernet EVC creation command.")
 public class CarrierEthernetCreateEvcCommand extends AbstractShellCommand {
 
     @Argument(index = 0, name = "argEvcCfgId",
@@ -46,160 +41,40 @@
             "EVC type (defaults to POINT_TO_POINT or MULTIPOINT_TO_MULTIPOINT, depending on number of UNIs)",
             required = false, multiValued = false)
     String argEvcType = null;
-    @Argument(index = 2, name = "argFirstUni", description =
-            "First UNI in list (if point to multipoint, this is the root)", required = true, multiValued = false)
-    String argFirstUni = null;
     @Argument(index = 3, name = "argUniList",
-            description = "List of remaining UNIs (if point to multipoint, these are the leaves)",
+            description = "List of UNIs (if point to multipoint, first is root, other are leaves)",
             required = true, multiValued = true)
     List<String> argUniList = Lists.newArrayList();
     @Option(name = "-v", aliases = "--cevlan", description = "CE-VLAN ID (applied to all UNIs)",
             required = false, multiValued = false)
-    String argCeVlanId = null;
+    short argCeVlanId = -1;
     @Option(name = "-id", aliases = "--evc-id", description = "The ID of a evc to be updated" +
             " (if evc does not exist, a new evc will be installed)", required = false, multiValued = false)
     String argEvcId = null;
     @Option(name = "-u", aliases = "--maxNumUni", description = "The maximum number of UNIs in the EVC",
             required = false, multiValued = false)
-    String argMaxNumUni = null;
+    int argMaxNumUni = -1;
     @Option(name = "-c", aliases = "--cir", description = "The CIR in Mbps", required = false, multiValued = false)
-    String argCir = "0";
+    double argCir = 0;
     @Option(name = "-e", aliases = "--eir", description = "The EIR in Mbps", required = false, multiValued = false)
-    String argEir = "0";
+    double argEir = 0;
     @Option(name = "-cbs", aliases = "--cbs", description = "The CBS in Bytes", required = false, multiValued = false)
-    String argCbs = "0";
+    long argCbs = 0;
     @Option(name = "-ebs", aliases = "--ebs", description = "The EBS in Bytes", required = false, multiValued = false)
-    String argEbs = "0";
+    long argEbs = 0;
 
     // TODO: Add further arguments for VLAN tag preservation, CoS preservation etc.
 
     @Override
     protected void execute() {
         CarrierEthernetService ceManager = get(CarrierEthernetService.class);
-        ceManager.installEvc(CarrierEthernetVirtualConnection.builder()
-                                     .id(argEvcId)
-                                     .cfgId(argEvcCfgId)
-                                     .type(generateEvcType())
-                                     .maxNumUni(generateMaxNumUni())
-                                     .uniSet(generateUniSet())
+        ceManager.installEvc(CarrierEthernetVirtualConnection.builder().id(argEvcId).cfgId(argEvcCfgId)
+                                     .type(generateEvcType(argEvcType, argUniList))
+                                     .maxNumUni(generateMaxNumUni(argMaxNumUni, argEvcType, argUniList))
+                                     .uniSet(generateUniSet(argEvcType,  argUniList.subList(1, argUniList.size()),
+                                                            argCeVlanId, argUniList.get(0), argEvcCfgId, argCir,
+                                                            argEir, argCbs, argEbs))
                                      .build());
     }
 
-    /**
-     * Return the CE-VLAN ID for the CE evc based on the CLI-supplied argument.
-     *
-     * @return CE-VLAN ID for the CE evc
-     */
-    VlanId generateCeVlanId() {
-        return ((argCeVlanId == null) ? null : VlanId.vlanId(Short.parseShort(argCeVlanId)));
-    }
-
-    /**
-     * Return the CE evc type based on the CLI-supplied arguments.
-     *
-     * @return the CE evc type
-     */
-    CarrierEthernetVirtualConnection.Type generateEvcType() {
-        if (argEvcType == null) {
-            return ((argUniList.size() > 2) ?
-                    CarrierEthernetVirtualConnection.Type.MULTIPOINT_TO_MULTIPOINT :
-                    CarrierEthernetVirtualConnection.Type.POINT_TO_POINT);
-        } else {
-            // TODO: Catch exception
-            return CarrierEthernetVirtualConnection.Type.valueOf(argEvcType);
-        }
-    }
-
-    /**
-     * Return the EVC maxNumUni parameter based on the CLI-supplied arguments.
-     *
-     * @return the maxNumUni parameter
-     */
-    Integer generateMaxNumUni() {
-        if (argMaxNumUni == null) {
-            if (argEvcType == null) {
-                return ((argUniList.size() > 2) ?
-                        CarrierEthernetVirtualConnection.MAX_NUM_UNI : 2);
-            } else {
-                // TODO: Catch exception
-                CarrierEthernetVirtualConnection.Type evcType =
-                        CarrierEthernetVirtualConnection.Type.valueOf(argEvcType);
-                return (evcType.equals(CarrierEthernetVirtualConnection.Type.POINT_TO_POINT) ? 2 :
-                        CarrierEthernetVirtualConnection.MAX_NUM_UNI);
-            }
-        } else {
-            return Integer.valueOf(argMaxNumUni);
-        }
-    }
-
-    /**
-     * Return the BW profile type based on the CLI-supplied arguments.
-     *
-     * @return the BWP profile type
-     */
-    CarrierEthernetBandwidthProfile.Type generateBandwidthProfileType() {
-        // TODO: Add the CoS BW profile case
-        return ((argCeVlanId == null) ?
-                CarrierEthernetBandwidthProfile.Type.INTERFACE : CarrierEthernetBandwidthProfile.Type.EVC);
-    }
-
-    /**
-     * Return the BW profile id based on the CLI-supplied arguments.
-     *
-     * @param uniId the UNI id
-     * @return the BW profile id
-     */
-    String generateBandwidthProfileId(String uniId) {
-        // TODO: Add the CoS BW profile case
-        return ((argCeVlanId == null) ? uniId : argEvcCfgId);
-    }
-
-    /**
-     * Return the set of UNIs for the CE EVC based on the CLI-supplied arguments.
-     *
-     * @return the set of UNIs for the CE EVC
-     */
-    Set<CarrierEthernetUni> generateUniSet() {
-
-        Set<CarrierEthernetUni> uniSet = new HashSet<>();
-
-        CarrierEthernetVirtualConnection.Type evcType = generateEvcType();
-
-        // We assume that first UNI supplied is always root
-        uniSet.add(CarrierEthernetUni.builder()
-                           .cp(ConnectPoint.deviceConnectPoint(argFirstUni))
-                           .role(CarrierEthernetUni.Role.ROOT)
-                           .ceVlanId(generateCeVlanId())
-                           .bwp(CarrierEthernetBandwidthProfile.builder()
-                                        .id(generateBandwidthProfileId(argFirstUni))
-                                        .type(generateBandwidthProfileType())
-                                        .cir(Bandwidth.mbps(Double.parseDouble(argCir)))
-                                        .eir(Bandwidth.mbps(Double.parseDouble(argEir)))
-                                        .cbs(Long.parseLong(argCbs))
-                                        .ebs(Long.parseLong(argEbs))
-                                        .build())
-                           .build());
-
-        final CarrierEthernetUni.Role role;
-        // For E-Line and E-LAN all UNIs are roots. For E-Tree all UNIs are leafs except from one
-        role = ((evcType == CarrierEthernetVirtualConnection.Type.ROOT_MULTIPOINT) ?
-                CarrierEthernetUni.Role.LEAF : CarrierEthernetUni.Role.ROOT);
-
-        argUniList.forEach(argUni -> uniSet.add(
-                CarrierEthernetUni.builder()
-                        .cp(ConnectPoint.deviceConnectPoint(argUni))
-                        .role(role)
-                        .ceVlanId(generateCeVlanId())
-                        .bwp(CarrierEthernetBandwidthProfile.builder()
-                                     .id(generateBandwidthProfileId(argUni))
-                                     .type(generateBandwidthProfileType())
-                                     .cir(Bandwidth.mbps(Double.parseDouble(argCir)))
-                                     .eir(Bandwidth.mbps(Double.parseDouble(argEir)))
-                                     .cbs(Long.parseLong(argCbs))
-                                     .ebs(Long.parseLong(argEbs))
-                                     .build())
-                        .build()));
-
-        return uniSet;
-    }
-}
+}
\ No newline at end of file
diff --git a/carrierethernet/src/main/java/org/onosproject/ecord/carrierethernet/rest/CarrierEthernetWebApplication.java b/carrierethernet/src/main/java/org/onosproject/ecord/carrierethernet/rest/CarrierEthernetWebApplication.java
new file mode 100644
index 0000000..a56dba1
--- /dev/null
+++ b/carrierethernet/src/main/java/org/onosproject/ecord/carrierethernet/rest/CarrierEthernetWebApplication.java
@@ -0,0 +1,31 @@
+/*
+ * Copyright 2017-present Open Networking Laboratory
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.onosproject.ecord.carrierethernet.rest;
+
+import org.onlab.rest.AbstractWebApplication;
+
+import java.util.Set;
+
+/**
+ * CarrierEthernet REST API web application.
+ */
+public class CarrierEthernetWebApplication extends AbstractWebApplication {
+    @Override
+    public Set<Class<?>> getClasses() {
+        return getClasses(CarrierEthernetWebResource.class);
+    }
+}
diff --git a/carrierethernet/src/main/java/org/onosproject/ecord/carrierethernet/rest/CarrierEthernetWebResource.java b/carrierethernet/src/main/java/org/onosproject/ecord/carrierethernet/rest/CarrierEthernetWebResource.java
new file mode 100644
index 0000000..f606026
--- /dev/null
+++ b/carrierethernet/src/main/java/org/onosproject/ecord/carrierethernet/rest/CarrierEthernetWebResource.java
@@ -0,0 +1,129 @@
+/*
+ * Copyright 2017-present Open Networking Laboratory
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.onosproject.ecord.carrierethernet.rest;
+
+import com.fasterxml.jackson.databind.node.ArrayNode;
+import com.fasterxml.jackson.databind.node.ObjectNode;
+import org.onosproject.ecord.carrierethernet.api.CarrierEthernetService;
+import org.onosproject.ecord.carrierethernet.app.CarrierEthernetVirtualConnection;
+import org.onosproject.rest.AbstractWebResource;
+
+import javax.ws.rs.Consumes;
+import javax.ws.rs.DELETE;
+import javax.ws.rs.GET;
+import javax.ws.rs.POST;
+import javax.ws.rs.Path;
+import javax.ws.rs.PathParam;
+import javax.ws.rs.Produces;
+import javax.ws.rs.core.MediaType;
+import javax.ws.rs.core.Response;
+import java.io.IOException;
+import java.io.InputStream;
+
+/**
+ * Carrier Ethernet web resource.
+ */
+@Path("carrierethernet")
+public class CarrierEthernetWebResource extends AbstractWebResource {
+
+    private static final String EVCS = "evcs";
+    private final ObjectNode root = mapper().createObjectNode();
+    private final ArrayNode evcsNode = root.putArray(EVCS);
+
+    CarrierEthernetService ceManager = get(CarrierEthernetService.class);
+
+    /**
+     * Gets all EVC entries. Returns array of all EVCs in the system.
+     *
+     * @return 200 OK with a collection of Evcs
+     */
+    @GET
+    @Produces(MediaType.APPLICATION_JSON)
+    @Path("evc")
+    public Response getEvcs() {
+        ceManager.evcMap().values().stream()
+                .forEach(evc -> evcsNode.add(
+                        codec(CarrierEthernetVirtualConnection.class)
+                                .encode(evc, this)));
+
+
+        return ok(root).build();
+    }
+
+    /**
+     * Gets an EVC entry by deviceId.
+     *
+     * @return 200 OK with the requested Evc.
+     */
+    @GET
+    @Produces(MediaType.APPLICATION_JSON)
+    @Path("evc/{evcId}")
+    public Response getEvc(@PathParam("evcId") String evcId) {
+        ObjectNode evc = codec(CarrierEthernetVirtualConnection.class)
+                .encode(ceManager.getEvc(evcId), this);
+        return ok(evc).build();
+    }
+
+    /**
+     * Install an EVC with given parameters.
+     *
+     * @return 200 OK if the EVC was installed
+     */
+    @POST
+    @Path("evc")
+    @Consumes(MediaType.APPLICATION_JSON)
+    public Response setEvc(InputStream stream) {
+        ObjectNode root = mapper().createObjectNode();
+        try {
+            ObjectNode jsonTree = (ObjectNode) mapper().readTree(stream);
+            CarrierEthernetVirtualConnection evc =
+                    codec(CarrierEthernetVirtualConnection.class).decode(jsonTree, this);
+            ceManager.installEvc(evc);
+            root.put("evcId", evc.id());
+        } catch (IOException e) {
+            throw new IllegalArgumentException(e.getMessage());
+        }
+        return ok(root).build();
+    }
+
+    /**
+     * Removes all EVCs installed in the CE app.
+     *
+     * @return 204 NO CONTENT
+     */
+    @DELETE
+    @Produces(MediaType.APPLICATION_JSON)
+    @Path("evc")
+    public Response removeAllEvc() {
+        ceManager.removeAllEvcs();
+        return Response.noContent().build();
+    }
+
+    /**
+     * Removes one EVCs by evcId.
+     *
+     * @param evcId the EVC to remove.
+     * @return 204 NO CONTENT
+     */
+    @DELETE
+    @Produces(MediaType.APPLICATION_JSON)
+    @Path("evc/{evcId}")
+    public Response removeEvcWithId(@PathParam("evcId") String evcId) {
+        ceManager.removeEvc(evcId);
+        return Response.noContent().build();
+    }
+
+}
diff --git a/carrierethernet/src/main/java/org/onosproject/ecord/carrierethernet/rest/EvcCodec.java b/carrierethernet/src/main/java/org/onosproject/ecord/carrierethernet/rest/EvcCodec.java
new file mode 100644
index 0000000..cfc378f
--- /dev/null
+++ b/carrierethernet/src/main/java/org/onosproject/ecord/carrierethernet/rest/EvcCodec.java
@@ -0,0 +1,95 @@
+package org.onosproject.ecord.carrierethernet.rest;
+
+import com.fasterxml.jackson.databind.node.ArrayNode;
+import com.fasterxml.jackson.databind.node.ObjectNode;
+import org.onosproject.codec.CodecContext;
+import org.onosproject.codec.JsonCodec;
+import org.onosproject.ecord.carrierethernet.app.CarrierEthernetBandwidthProfile;
+import org.onosproject.ecord.carrierethernet.app.CarrierEthernetNetworkInterface;
+import org.onosproject.ecord.carrierethernet.app.CarrierEthernetUni;
+import org.onosproject.ecord.carrierethernet.app.CarrierEthernetVirtualConnection;
+import org.slf4j.Logger;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.stream.Collectors;
+
+import static org.onlab.util.Tools.nullIsIllegal;
+import static org.onosproject.ecord.carrierethernet.app.CarrierEthernetEvcUtils.*;
+import static org.onosproject.ecord.carrierethernet.app.CarrierEthernetVirtualConnection.builder;
+import static org.slf4j.LoggerFactory.getLogger;
+
+/**
+ * Implementation of encoder for Alarm codec.
+ */
+public class EvcCodec extends JsonCodec<CarrierEthernetVirtualConnection> {
+
+    private static final String EVC_ID_REQUIRED = "EVC Id Must be specified";
+    private static final String EVC_TYPE_REQUIRED = "EVC Type Must be specified";
+    private static final String ARRAY_REQUIRED = "UNI array was not specified";
+
+    private final Logger log = getLogger(getClass());
+
+    @Override
+    public ObjectNode encode(CarrierEthernetVirtualConnection evc, CodecContext context) {
+        ObjectNode evcRoot = context.mapper().createObjectNode();
+        evcRoot.put("evcCfgId", evc.cfgId());
+        evcRoot.put("evcId", evc.id());
+        ArrayNode uniList = context.mapper()
+                .valueToTree(evc.uniSet().stream()
+                                     .map(CarrierEthernetNetworkInterface::id)
+                                     .collect(Collectors.toList()));
+        evcRoot.putArray("uniList").addAll(uniList);
+        evcRoot.put("maxNumUni", evc.maxNumUni());
+        CarrierEthernetUni uni = evc.uniSet().iterator().next();
+        evcRoot.put("vlanId", uni.ceVlanId().toString());
+        CarrierEthernetBandwidthProfile bwp = uni.bwp();
+        if (bwp != null) {
+            evcRoot.put("cir", bwp.cir().bps());
+            evcRoot.put("eir", bwp.eir().bps());
+            evcRoot.put("cbs", bwp.cbs());
+            evcRoot.put("ebs", bwp.ebs());
+        }
+        return evcRoot;
+    }
+
+    @Override
+    public CarrierEthernetVirtualConnection decode(ObjectNode json, CodecContext context) {
+        String argEvcCfgId = json.get("evcCfgId").asText(null);
+        String argEvcId = null;
+        if (json.has("evcId")) {
+            argEvcId = json.get("evcId").asText();
+        }
+        ArrayNode uniArray = nullIsIllegal((ArrayNode) json.get("uniList"),
+                                           ARRAY_REQUIRED);
+        List<String> uniList = new ArrayList<>();
+        uniArray.forEach(jsonNode -> uniList.add(jsonNode.asText()));
+        String evcTypeString = nullIsIllegal(json.get("evcType").asText(),
+                                             EVC_TYPE_REQUIRED);
+        int maxNumUni = -1;
+        if (json.has("maxNumUni")) {
+            maxNumUni = json.get("maxNumUni").asInt(-1);
+        }
+
+        short vlanId = -1;
+        if (json.has("vlanId")) {
+            vlanId = json.get("vlanId").shortValue();
+        }
+        double cir = json.get("cir").asDouble(0.0);
+        double eir = json.get("eir").asDouble(0.0);
+        long cbs = json.get("cbs").asLong(0L);
+        long ebs = json.get("ebs").asLong(0L);
+        log.info("Received REST call with parameters: " + "evcCfgId={}, evcId={}," +
+                         " uniList={}, evcType={}, maxNumUni={}, vlanId={}, cir={}, " +
+                         "eir={}, cbs={}, ebs={}", argEvcCfgId, argEvcId, uniList,
+                 evcTypeString, maxNumUni, vlanId, cir, eir, cbs, ebs);
+        return builder().id(argEvcId).cfgId(argEvcCfgId)
+                .type(generateEvcType(evcTypeString, uniList))
+                .maxNumUni(generateMaxNumUni(maxNumUni, evcTypeString, uniList))
+                .uniSet(generateUniSet(evcTypeString, uniList.subList(1, uniList.size()),
+                                       vlanId, uniList.get(0), argEvcCfgId, cir, eir,
+                                       cbs, ebs))
+                .build();
+    }
+
+}
diff --git a/carrierethernet/src/main/java/org/onosproject/ecord/carrierethernet/rest/EvcCodecRegistrator.java b/carrierethernet/src/main/java/org/onosproject/ecord/carrierethernet/rest/EvcCodecRegistrator.java
new file mode 100644
index 0000000..9405b7c
--- /dev/null
+++ b/carrierethernet/src/main/java/org/onosproject/ecord/carrierethernet/rest/EvcCodecRegistrator.java
@@ -0,0 +1,34 @@
+package org.onosproject.ecord.carrierethernet.rest;
+
+import org.apache.felix.scr.annotations.Activate;
+import org.apache.felix.scr.annotations.Component;
+import org.apache.felix.scr.annotations.Deactivate;
+import org.apache.felix.scr.annotations.Reference;
+import org.apache.felix.scr.annotations.ReferenceCardinality;
+import org.onosproject.codec.CodecService;
+import org.onosproject.ecord.carrierethernet.app.CarrierEthernetVirtualConnection;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+/**
+ * Implementation of the JSON codec brokering service for Carrier Ethernet app.
+ */
+@Component(immediate = true)
+public class EvcCodecRegistrator {
+
+    private static final Logger log = LoggerFactory.getLogger(EvcCodecRegistrator.class);
+
+    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    protected CodecService codecService;
+
+    @Activate
+    public void activate() {
+        codecService.registerCodec(CarrierEthernetVirtualConnection.class, new EvcCodec());
+        log.info("Started");
+    }
+
+    @Deactivate
+    public void deactivate() {
+        log.info("Stopped");
+    }
+}
diff --git a/carrierethernet/src/main/java/org/onosproject/ecord/carrierethernet/rest/package-info.java b/carrierethernet/src/main/java/org/onosproject/ecord/carrierethernet/rest/package-info.java
new file mode 100644
index 0000000..400df6e
--- /dev/null
+++ b/carrierethernet/src/main/java/org/onosproject/ecord/carrierethernet/rest/package-info.java
@@ -0,0 +1,20 @@
+/*
+ * Copyright 2016-present Open Networking Laboratory
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/**
+ * CLI implementation for the Carrier Ethernet Application.
+ */
+package org.onosproject.ecord.carrierethernet.rest;
\ No newline at end of file
diff --git a/carrierethernet/src/main/resources/sampleEVC.json b/carrierethernet/src/main/resources/sampleEVC.json
new file mode 100644
index 0000000..2eaf759
--- /dev/null
+++ b/carrierethernet/src/main/resources/sampleEVC.json
@@ -0,0 +1,14 @@
+{
+  "evcId": "evc1",
+  "evcCfgId": "evpl1",
+  "uniList": [
+    "netconf:192.168.56.10:830/0",
+    "netconf:192.168.56.20:830/0"
+  ],
+  "evcType": "POINT_TO_POINT",
+  "vlanId": 100,
+  "cir": "400",
+  "eir": "200",
+  "cbs": "3000",
+  "ebs": "2000"
+}
\ No newline at end of file
diff --git a/carrierethernet/src/main/webapp/WEB-INF/web.xml b/carrierethernet/src/main/webapp/WEB-INF/web.xml
new file mode 100644
index 0000000..5774d22
--- /dev/null
+++ b/carrierethernet/src/main/webapp/WEB-INF/web.xml
@@ -0,0 +1,37 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+  ~ Copyright 2017-present Open Networking Laboratory
+  ~
+  ~ Licensed under the Apache License, Version 2.0 (the "License");
+  ~ you may not use this file except in compliance with the License.
+  ~ You may obtain a copy of the License at
+  ~
+  ~     http://www.apache.org/licenses/LICENSE-2.0
+  ~
+  ~ Unless required by applicable law or agreed to in writing, software
+  ~ distributed under the License is distributed on an "AS IS" BASIS,
+  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  ~ See the License for the specific language governing permissions and
+  ~ limitations under the License.
+  -->
+<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xmlns="http://java.sun.com/xml/ns/javaee"
+         xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
+         id="ONOS" version="2.5">
+    <display-name>CarrierEthernet REST APIs</display-name>
+
+    <servlet>
+        <servlet-name>JAX-RS Service</servlet-name>
+        <servlet-class>org.glassfish.jersey.servlet.ServletContainer</servlet-class>
+        <init-param>
+            <param-name>javax.ws.rs.Application</param-name>
+            <param-value>org.onosproject.ecord.carrierethernet.rest.CarrierEthernetWebApplication</param-value>
+        </init-param>
+        <load-on-startup>1</load-on-startup>
+    </servlet>
+
+    <servlet-mapping>
+        <servlet-name>JAX-RS Service</servlet-name>
+        <url-pattern>/*</url-pattern>
+    </servlet-mapping>
+</web-app>