Supports netdev data path type in OpenstackNode.

Change-Id: I716276a98bd141e87bf20dd5314e52128cf7e495
diff --git a/apps/openstacknode/app/src/main/java/org/onosproject/openstacknode/codec/OpenstackNodeCodec.java b/apps/openstacknode/app/src/main/java/org/onosproject/openstacknode/codec/OpenstackNodeCodec.java
index a94aa10..e9f8e35 100644
--- a/apps/openstacknode/app/src/main/java/org/onosproject/openstacknode/codec/OpenstackNodeCodec.java
+++ b/apps/openstacknode/app/src/main/java/org/onosproject/openstacknode/codec/OpenstackNodeCodec.java
@@ -61,8 +61,10 @@
     private static final String AUTHENTICATION = "authentication";
     private static final String END_POINT = "endPoint";
     private static final String SSH_AUTH = "sshAuth";
+    private static final String DATA_PATH_TYPE = "datapathType";
 
     private static final String MISSING_MESSAGE = " is required in OpenstackNode";
+    private static final String UNSUPPORTED_DATAPATH_TYPE = "Unsupported datapath type";
 
     @Override
     public ObjectNode encode(OpenstackNode node, CodecContext context) {
@@ -72,7 +74,8 @@
                 .put(HOST_NAME, node.hostname())
                 .put(TYPE, node.type().name())
                 .put(STATE, node.state().name())
-                .put(MANAGEMENT_IP, node.managementIp().toString());
+                .put(MANAGEMENT_IP, node.managementIp().toString())
+                .put(DATA_PATH_TYPE, node.datapathType().name());
 
         OpenstackNode.NodeType type = node.type();
 
@@ -164,6 +167,17 @@
             nodeBuilder.dataIp(IpAddress.valueOf(json.get(DATA_IP).asText()));
         }
 
+        JsonNode datapathTypeJson = json.get(DATA_PATH_TYPE);
+
+        if (datapathTypeJson == null ||
+                datapathTypeJson.asText().equals(OpenstackNode.DatapathType.NORMAL.name().toLowerCase())) {
+            nodeBuilder.datapathType(OpenstackNode.DatapathType.NORMAL);
+        } else if (datapathTypeJson.asText().equals(OpenstackNode.DatapathType.NETDEV.name().toLowerCase())) {
+            nodeBuilder.datapathType(OpenstackNode.DatapathType.NETDEV);
+        } else {
+            throw new IllegalArgumentException(UNSUPPORTED_DATAPATH_TYPE + datapathTypeJson.asText());
+        }
+
         // parse physical interfaces
         List<OpenstackPhyInterface> phyIntfs = new ArrayList<>();
         JsonNode phyIntfsJson = json.get(PHYSICAL_INTERFACES);
diff --git a/apps/openstacknode/app/src/main/java/org/onosproject/openstacknode/impl/DefaultOpenstackNodeHandler.java b/apps/openstacknode/app/src/main/java/org/onosproject/openstacknode/impl/DefaultOpenstackNodeHandler.java
index 06b65a3..07d71de 100644
--- a/apps/openstacknode/app/src/main/java/org/onosproject/openstacknode/impl/DefaultOpenstackNodeHandler.java
+++ b/apps/openstacknode/app/src/main/java/org/onosproject/openstacknode/impl/DefaultOpenstackNodeHandler.java
@@ -82,6 +82,7 @@
 import static org.onosproject.openstacknode.api.NodeState.DEVICE_CREATED;
 import static org.onosproject.openstacknode.api.NodeState.INCOMPLETE;
 import static org.onosproject.openstacknode.api.NodeState.INIT;
+import static org.onosproject.openstacknode.api.OpenstackNode.DatapathType.NETDEV;
 import static org.onosproject.openstacknode.api.OpenstackNode.NodeType.CONTROLLER;
 import static org.onosproject.openstacknode.api.OpenstackNode.NodeType.GATEWAY;
 import static org.onosproject.openstacknode.api.OpenstackNodeService.APP_ID;
@@ -272,16 +273,19 @@
 
         String dpid = deviceId.toString().substring(DPID_BEGIN);
 
-        BridgeDescription bridgeDesc = DefaultBridgeDescription.builder()
+        BridgeDescription.Builder builder = DefaultBridgeDescription.builder()
                 .name(bridgeName)
                 .failMode(BridgeDescription.FailMode.SECURE)
                 .datapathId(dpid)
                 .disableInBand()
-                .controllers(controllers)
-                .build();
+                .controllers(controllers);
+
+        if (osNode.datapathType().equals(NETDEV)) {
+            builder.datapathType(osNode.datapathType().name().toLowerCase());
+        }
 
         BridgeConfig bridgeConfig = device.as(BridgeConfig.class);
-        bridgeConfig.addBridge(bridgeDesc);
+        bridgeConfig.addBridge(builder.build());
     }
 
     /**
diff --git a/apps/openstacknode/app/src/main/java/org/onosproject/openstacknode/impl/DistributedOpenstackNodeStore.java b/apps/openstacknode/app/src/main/java/org/onosproject/openstacknode/impl/DistributedOpenstackNodeStore.java
index 106e4ea..f30611b 100644
--- a/apps/openstacknode/app/src/main/java/org/onosproject/openstacknode/impl/DistributedOpenstackNodeStore.java
+++ b/apps/openstacknode/app/src/main/java/org/onosproject/openstacknode/impl/DistributedOpenstackNodeStore.java
@@ -83,6 +83,7 @@
             .register(DefaultOpenstackNode.class)
             .register(OpenstackNode.NodeType.class)
             .register(NodeState.class)
+            .register(OpenstackNode.DatapathType.class)
             .register(OpenstackPhyInterface.class)
             .register(DefaultOpenstackPhyInterface.class)
             .register(ControllerInfo.class)