Add REST API for query/update/delete/enable/disable telemetry config

1. Add unit test for newly added REST APIs
2. Add codec and unit tests for TelemetryConfig
3. Split web package out from app package due to dep conflict

Change-Id: I85f52b2a7d059622e98832843bc9613cb8befa98
diff --git a/apps/openstacktelemetry/app/src/main/java/org/onosproject/openstacktelemetry/codec/FlowInfoJsonCodec.java b/apps/openstacktelemetry/app/src/main/java/org/onosproject/openstacktelemetry/codec/FlowInfoJsonCodec.java
deleted file mode 100644
index be51b15..0000000
--- a/apps/openstacktelemetry/app/src/main/java/org/onosproject/openstacktelemetry/codec/FlowInfoJsonCodec.java
+++ /dev/null
@@ -1,148 +0,0 @@
-/*
- * Copyright 2018-present Open Networking Foundation
- *
- * 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.openstacktelemetry.codec;
-
-import com.fasterxml.jackson.databind.JsonNode;
-import com.fasterxml.jackson.databind.node.ObjectNode;
-import org.onlab.packet.IpAddress;
-import org.onlab.packet.IpPrefix;
-import org.onlab.packet.MacAddress;
-import org.onlab.packet.TpPort;
-import org.onlab.packet.VlanId;
-import org.onosproject.codec.CodecContext;
-import org.onosproject.codec.JsonCodec;
-import org.onosproject.net.DeviceId;
-import org.onosproject.openstacktelemetry.api.FlowInfo;
-import org.onosproject.openstacktelemetry.api.StatsInfo;
-import org.onosproject.openstacktelemetry.impl.DefaultFlowInfo;
-
-import static com.google.common.base.Preconditions.checkNotNull;
-import static org.onlab.packet.VlanId.NO_VID;
-
-/**
- * Openstack telemetry codec used for serializing and de-serializing JSON string.
- */
-public final class FlowInfoJsonCodec extends JsonCodec<FlowInfo> {
-
-    private static final String FLOW_TYPE = "flowType";
-    private static final String DEVICE_ID = "deviceId";
-    private static final String INPUT_INTERFACE_ID = "inputInterfaceId";
-    private static final String OUTPUT_INTERFACE_ID = "outputInterfaceId";
-
-    private static final String VLAN_ID = "vlanId";
-    private static final String VXLAN_ID = "vxlanId";
-    private static final String SRC_IP = "srcIp";
-    private static final String SRC_IP_PREFIX_LEN = "srcIpPrefixLength";
-    private static final String DST_IP = "dstIp";
-    private static final String DST_IP_PREFIX_LEN = "dstIpPrefixLength";
-    private static final String SRC_PORT = "srcPort";
-    private static final String DST_PORT = "dstPort";
-    private static final String PROTOCOL = "protocol";
-    private static final String SRC_MAC = "srcMac";
-    private static final String DST_MAC = "dstMac";
-    private static final String STATS_INFO = "statsInfo";
-
-    @Override
-    public ObjectNode encode(FlowInfo info, CodecContext context) {
-        checkNotNull(info, "FlowInfo cannot be null");
-
-        ObjectNode result = context.mapper().createObjectNode()
-                .put(FLOW_TYPE, info.flowType())
-                .put(DEVICE_ID, info.deviceId().toString())
-                .put(INPUT_INTERFACE_ID, info.inputInterfaceId())
-                .put(OUTPUT_INTERFACE_ID, info.outputInterfaceId())
-                .put(SRC_IP, info.srcIp().address().toString())
-                .put(SRC_IP_PREFIX_LEN, info.srcIp().prefixLength())
-                .put(DST_IP, info.dstIp().address().toString())
-                .put(DST_IP_PREFIX_LEN, info.dstIp().prefixLength())
-                .put(SRC_PORT, info.srcPort().toString())
-                .put(DST_PORT, info.dstPort().toString())
-                .put(PROTOCOL, info.protocol())
-                .put(SRC_MAC, info.srcMac().toString())
-                .put(DST_MAC, info.dstMac().toString());
-
-        if (info.vlanId() != null) {
-            result.put(VLAN_ID, info.vlanId().toString());
-        } else {
-            result.put(VXLAN_ID, info.vxlanId());
-        }
-
-        ObjectNode statsInfoJson =
-                context.codec(StatsInfo.class).encode(info.statsInfo(), context);
-
-        result.put(STATS_INFO, statsInfoJson);
-
-        return result;
-    }
-
-    @Override
-    public FlowInfo decode(ObjectNode json, CodecContext context) {
-        if (json == null || !json.isObject()) {
-            return null;
-        }
-
-        String flowType = json.get(FLOW_TYPE).asText();
-        String deviceId = json.get(DEVICE_ID).asText();
-        int inputInterfaceId = json.get(INPUT_INTERFACE_ID).asInt();
-        int outputInterfaceId = json.get(OUTPUT_INTERFACE_ID).asInt();
-        String srcIp = json.get(SRC_IP).asText();
-        int srcIpPrefixLength = json.get(SRC_IP_PREFIX_LEN).asInt();
-        String dstIp = json.get(DST_IP).asText();
-        int dstIpPrefixLength = json.get(DST_IP_PREFIX_LEN).asInt();
-        int srcPort = json.get(SRC_PORT).asInt();
-        int dstPort = json.get(DST_PORT).asInt();
-        String protocol = json.get(PROTOCOL).asText();
-        String srcMac = json.get(SRC_MAC).asText();
-        String dstMac = json.get(DST_MAC).asText();
-
-        VlanId vlanId;
-        short vxlanId = 0;
-        try {
-            if (json.get(VLAN_ID).isNull()) {
-                vlanId = VlanId.vlanId(NO_VID);
-                if (!(json.get(VXLAN_ID).isNull())) {
-                    vxlanId = (short) json.get(VXLAN_ID).asInt();
-                }
-            } else {
-                vlanId = VlanId.vlanId((short) json.get(VLAN_ID).asInt());
-            }
-        } catch (NullPointerException ex) {
-            vlanId = VlanId.vlanId();
-        }
-
-        JsonNode statsInfoJson = json.get(STATS_INFO);
-
-        JsonCodec<StatsInfo> statsInfoCodec = context.codec(StatsInfo.class);
-        StatsInfo statsInfo = statsInfoCodec.decode((ObjectNode) statsInfoJson.deepCopy(), context);
-
-        return new DefaultFlowInfo.DefaultBuilder()
-                .withFlowType(Byte.valueOf(flowType))
-                .withDeviceId(DeviceId.deviceId(deviceId))
-                .withInputInterfaceId(inputInterfaceId)
-                .withOutputInterfaceId(outputInterfaceId)
-                .withSrcIp(IpPrefix.valueOf(IpAddress.valueOf(srcIp), srcIpPrefixLength))
-                .withDstIp(IpPrefix.valueOf(IpAddress.valueOf(dstIp), dstIpPrefixLength))
-                .withSrcPort(TpPort.tpPort(srcPort))
-                .withDstPort(TpPort.tpPort(dstPort))
-                .withProtocol(Byte.valueOf(protocol))
-                .withSrcMac(MacAddress.valueOf(srcMac))
-                .withDstMac(MacAddress.valueOf(dstMac))
-                .withVlanId(vlanId)
-                .withVxlanId(vxlanId)
-                .withStatsInfo(statsInfo)
-                .build();
-    }
-}
diff --git a/apps/openstacktelemetry/app/src/main/java/org/onosproject/openstacktelemetry/codec/StatsFlowRuleJsonCodec.java b/apps/openstacktelemetry/app/src/main/java/org/onosproject/openstacktelemetry/codec/StatsFlowRuleJsonCodec.java
deleted file mode 100644
index 384987b..0000000
--- a/apps/openstacktelemetry/app/src/main/java/org/onosproject/openstacktelemetry/codec/StatsFlowRuleJsonCodec.java
+++ /dev/null
@@ -1,91 +0,0 @@
-/*
- * Copyright 2018-present Open Networking Foundation
- *
- * 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.openstacktelemetry.codec;
-
-import com.fasterxml.jackson.databind.node.ObjectNode;
-import org.apache.commons.lang3.exception.ExceptionUtils;
-import org.onlab.packet.TpPort;
-import org.onosproject.codec.CodecContext;
-import org.onosproject.codec.JsonCodec;
-import org.onosproject.openstacktelemetry.api.StatsFlowRule;
-import org.onosproject.openstacktelemetry.impl.DefaultStatsFlowRule;
-import org.slf4j.Logger;
-
-import org.onlab.packet.IpPrefix;
-
-import static com.google.common.base.Preconditions.checkNotNull;
-import static org.onosproject.openstacktelemetry.util.OpenstackTelemetryUtil.getProtocolTypeFromString;
-import static org.slf4j.LoggerFactory.getLogger;
-
-/**
- * JSON codec for StatsFlowRule.
- */
-public class StatsFlowRuleJsonCodec extends JsonCodec<StatsFlowRule> {
-
-    private final Logger log = getLogger(getClass());
-
-    public static final String SRC_IP_PREFIX = "srcIpPrefix";
-    public static final String DST_IP_PREFIX = "dstIpPrefix";
-    public static final String IP_PROTOCOL   = "ipProtocol";
-    public static final String SRC_TP_PORT   = "srcTpPort";
-    public static final String DST_TP_PORT   = "dstTpPort";
-
-    public ObjectNode encode(StatsFlowRule flowRule, CodecContext context) {
-        checkNotNull(flowRule, "FlowInfo cannot be null");
-        ObjectNode result = context.mapper().createObjectNode()
-                            .put(SRC_IP_PREFIX, flowRule.srcIpPrefix().toString())
-                            .put(DST_IP_PREFIX, flowRule.dstIpPrefix().toString())
-                            .put(IP_PROTOCOL, flowRule.ipProtocol())
-                            .put(SRC_TP_PORT, flowRule.srcTpPort().toString())
-                            .put(DST_TP_PORT, flowRule.dstTpPort().toString());
-        return result;
-    }
-
-    @Override
-    public StatsFlowRule decode(ObjectNode json, CodecContext context) {
-        if (json == null || !json.isObject()) {
-            return null;
-        }
-        try {
-            String srcIpPrefix = json.get(SRC_IP_PREFIX).asText();
-            String dstIpPrefix = json.get(DST_IP_PREFIX).asText();
-
-            DefaultStatsFlowRule.Builder flowRuleBuilder;
-
-            if (json.get(IP_PROTOCOL) == null) {
-                log.info("ipProtocol: null");
-                flowRuleBuilder = DefaultStatsFlowRule.builder()
-                        .srcIpPrefix(IpPrefix.valueOf(srcIpPrefix))
-                        .dstIpPrefix(IpPrefix.valueOf(dstIpPrefix));
-            } else {
-                byte ipProtocol = getProtocolTypeFromString(json.get(IP_PROTOCOL).asText());
-                int srcTpPort = json.get(SRC_TP_PORT).asInt();
-                int dstTpPort = json.get(DST_TP_PORT).asInt();
-
-                flowRuleBuilder = DefaultStatsFlowRule.builder()
-                                    .srcIpPrefix(IpPrefix.valueOf(srcIpPrefix))
-                                    .dstIpPrefix(IpPrefix.valueOf(dstIpPrefix))
-                                    .ipProtocol(ipProtocol)
-                                    .srcTpPort(TpPort.tpPort(srcTpPort))
-                                    .dstTpPort(TpPort.tpPort(dstTpPort));
-            }
-            return flowRuleBuilder.build();
-        } catch (Exception ex) {
-            log.error("Exception Stack:\n{}", ExceptionUtils.getStackTrace(ex));
-        }
-        return null;
-    }
-}
diff --git a/apps/openstacktelemetry/app/src/main/java/org/onosproject/openstacktelemetry/codec/StatsInfoJsonCodec.java b/apps/openstacktelemetry/app/src/main/java/org/onosproject/openstacktelemetry/codec/StatsInfoJsonCodec.java
deleted file mode 100644
index 905b2ff..0000000
--- a/apps/openstacktelemetry/app/src/main/java/org/onosproject/openstacktelemetry/codec/StatsInfoJsonCodec.java
+++ /dev/null
@@ -1,75 +0,0 @@
-/*
- * Copyright 2018-present Open Networking Foundation
- *
- * 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.openstacktelemetry.codec;
-
-import com.fasterxml.jackson.databind.node.ObjectNode;
-import org.onosproject.codec.CodecContext;
-import org.onosproject.codec.JsonCodec;
-import org.onosproject.openstacktelemetry.api.StatsInfo;
-import org.onosproject.openstacktelemetry.impl.DefaultStatsInfo;
-
-import static com.google.common.base.Preconditions.checkNotNull;
-
-/**
- * Openstack telemetry codec used for serializing and de-serializing JSON string.
- */
-public final class StatsInfoJsonCodec extends JsonCodec<StatsInfo> {
-
-    private static final String STARTUP_TIME = "startupTime";
-    private static final String FST_PKT_ARR_TIME = "fstPktArrTime";
-    private static final String LST_PKT_OFFSET = "lstPktOffset";
-    private static final String PREV_ACC_BYTES = "prevAccBytes";
-    private static final String PREV_ACC_PKTS = "prevAccPkts";
-    private static final String CURR_ACC_BYTES = "currAccBytes";
-    private static final String CURR_ACC_PKTS = "currAccPkts";
-    private static final String ERROR_PKTS = "errorPkts";
-    private static final String DROP_PKTS = "dropPkts";
-
-    @Override
-    public ObjectNode encode(StatsInfo info, CodecContext context) {
-        checkNotNull(info, "StatsInfo cannot be null");
-
-        return context.mapper().createObjectNode()
-                .put(STARTUP_TIME, info.startupTime())
-                .put(FST_PKT_ARR_TIME, info.fstPktArrTime())
-                .put(LST_PKT_OFFSET, info.lstPktOffset())
-                .put(PREV_ACC_BYTES, info.prevAccBytes())
-                .put(PREV_ACC_PKTS, info.prevAccPkts())
-                .put(CURR_ACC_BYTES, info.prevAccBytes())
-                .put(CURR_ACC_PKTS, info.prevAccPkts())
-                .put(ERROR_PKTS, info.errorPkts())
-                .put(DROP_PKTS, info.dropPkts());
-    }
-
-    @Override
-    public StatsInfo decode(ObjectNode json, CodecContext context) {
-        if (json == null || !json.isObject()) {
-            return null;
-        }
-
-        return new DefaultStatsInfo.DefaultBuilder()
-                .withStartupTime(json.get(STARTUP_TIME).asLong())
-                .withFstPktArrTime(json.get(FST_PKT_ARR_TIME).asLong())
-                .withLstPktOffset(json.get(LST_PKT_OFFSET).asInt())
-                .withPrevAccBytes(json.get(PREV_ACC_BYTES).asLong())
-                .withPrevAccPkts(json.get(PREV_ACC_PKTS).asInt())
-                .withCurrAccBytes(json.get(CURR_ACC_BYTES).asLong())
-                .withCurrAccPkts(json.get(CURR_ACC_PKTS).asInt())
-                .withErrorPkts((short) json.get(ERROR_PKTS).asInt())
-                .withDropPkts((short) json.get(DROP_PKTS).asInt())
-                .build();
-    }
-}
diff --git a/apps/openstacktelemetry/app/src/main/java/org/onosproject/openstacktelemetry/codec/TinaFlowInfoByteBufferCodec.java b/apps/openstacktelemetry/app/src/main/java/org/onosproject/openstacktelemetry/codec/bytebuffer/TinaFlowInfoByteBufferCodec.java
similarity index 97%
rename from apps/openstacktelemetry/app/src/main/java/org/onosproject/openstacktelemetry/codec/TinaFlowInfoByteBufferCodec.java
rename to apps/openstacktelemetry/app/src/main/java/org/onosproject/openstacktelemetry/codec/bytebuffer/TinaFlowInfoByteBufferCodec.java
index 2ee625f..759dd5a 100644
--- a/apps/openstacktelemetry/app/src/main/java/org/onosproject/openstacktelemetry/codec/TinaFlowInfoByteBufferCodec.java
+++ b/apps/openstacktelemetry/app/src/main/java/org/onosproject/openstacktelemetry/codec/bytebuffer/TinaFlowInfoByteBufferCodec.java
@@ -13,7 +13,7 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package org.onosproject.openstacktelemetry.codec;
+package org.onosproject.openstacktelemetry.codec.bytebuffer;
 
 import org.onlab.packet.IpAddress;
 import org.onlab.packet.IpAddress.Version;
@@ -25,7 +25,7 @@
 import org.onosproject.openstacktelemetry.api.ByteBufferCodec;
 import org.onosproject.openstacktelemetry.api.FlowInfo;
 import org.onosproject.openstacktelemetry.api.StatsInfo;
-import org.onosproject.openstacktelemetry.impl.DefaultFlowInfo;
+import org.onosproject.openstacktelemetry.api.DefaultFlowInfo;
 
 import java.nio.ByteBuffer;
 
diff --git a/apps/openstacktelemetry/app/src/main/java/org/onosproject/openstacktelemetry/codec/TinaMessageByteBufferCodec.java b/apps/openstacktelemetry/app/src/main/java/org/onosproject/openstacktelemetry/codec/bytebuffer/TinaMessageByteBufferCodec.java
similarity index 97%
rename from apps/openstacktelemetry/app/src/main/java/org/onosproject/openstacktelemetry/codec/TinaMessageByteBufferCodec.java
rename to apps/openstacktelemetry/app/src/main/java/org/onosproject/openstacktelemetry/codec/bytebuffer/TinaMessageByteBufferCodec.java
index 2be5f3e..514bc23 100644
--- a/apps/openstacktelemetry/app/src/main/java/org/onosproject/openstacktelemetry/codec/TinaMessageByteBufferCodec.java
+++ b/apps/openstacktelemetry/app/src/main/java/org/onosproject/openstacktelemetry/codec/bytebuffer/TinaMessageByteBufferCodec.java
@@ -13,7 +13,7 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package org.onosproject.openstacktelemetry.codec;
+package org.onosproject.openstacktelemetry.codec.bytebuffer;
 
 import org.onosproject.openstacktelemetry.api.FlowInfo;
 import org.onosproject.openstacktelemetry.api.TelemetryCodec;
diff --git a/apps/openstacktelemetry/app/src/main/java/org/onosproject/openstacktelemetry/codec/TinaStatsInfoByteBufferCodec.java b/apps/openstacktelemetry/app/src/main/java/org/onosproject/openstacktelemetry/codec/bytebuffer/TinaStatsInfoByteBufferCodec.java
similarity index 95%
rename from apps/openstacktelemetry/app/src/main/java/org/onosproject/openstacktelemetry/codec/TinaStatsInfoByteBufferCodec.java
rename to apps/openstacktelemetry/app/src/main/java/org/onosproject/openstacktelemetry/codec/bytebuffer/TinaStatsInfoByteBufferCodec.java
index ce3faa8..456dc72 100644
--- a/apps/openstacktelemetry/app/src/main/java/org/onosproject/openstacktelemetry/codec/TinaStatsInfoByteBufferCodec.java
+++ b/apps/openstacktelemetry/app/src/main/java/org/onosproject/openstacktelemetry/codec/bytebuffer/TinaStatsInfoByteBufferCodec.java
@@ -13,11 +13,11 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package org.onosproject.openstacktelemetry.codec;
+package org.onosproject.openstacktelemetry.codec.bytebuffer;
 
 import org.onosproject.openstacktelemetry.api.ByteBufferCodec;
 import org.onosproject.openstacktelemetry.api.StatsInfo;
-import org.onosproject.openstacktelemetry.impl.DefaultStatsInfo;
+import org.onosproject.openstacktelemetry.api.DefaultStatsInfo;
 
 import java.nio.ByteBuffer;
 
diff --git a/apps/openstacktelemetry/app/src/main/java/org/onosproject/openstacktelemetry/codec/package-info.java b/apps/openstacktelemetry/app/src/main/java/org/onosproject/openstacktelemetry/codec/bytebuffer/package-info.java
similarity index 91%
rename from apps/openstacktelemetry/app/src/main/java/org/onosproject/openstacktelemetry/codec/package-info.java
rename to apps/openstacktelemetry/app/src/main/java/org/onosproject/openstacktelemetry/codec/bytebuffer/package-info.java
index f7f6401..b8ef80a 100644
--- a/apps/openstacktelemetry/app/src/main/java/org/onosproject/openstacktelemetry/codec/package-info.java
+++ b/apps/openstacktelemetry/app/src/main/java/org/onosproject/openstacktelemetry/codec/bytebuffer/package-info.java
@@ -17,4 +17,4 @@
 /**
  * Implementations of the codec broker and openstack telemetry entity codecs.
  */
-package org.onosproject.openstacktelemetry.codec;
\ No newline at end of file
+package org.onosproject.openstacktelemetry.codec.bytebuffer;
\ No newline at end of file