Add configuration for default vlan

Change-Id: I183def6d1de3d10b2f53895f7fb7723df315379f
diff --git a/src/main/java/org/onosproject/olt/AccessDeviceConfig.java b/src/main/java/org/onosproject/olt/AccessDeviceConfig.java
index 90ed740..07b73c8 100644
--- a/src/main/java/org/onosproject/olt/AccessDeviceConfig.java
+++ b/src/main/java/org/onosproject/olt/AccessDeviceConfig.java
@@ -16,11 +16,14 @@
 
 package org.onosproject.olt;
 
+import com.fasterxml.jackson.databind.JsonNode;
 import org.onlab.packet.VlanId;
 import org.onosproject.net.DeviceId;
 import org.onosproject.net.PortNumber;
 import org.onosproject.net.config.Config;
 
+import java.util.Optional;
+
 /**
  * Config object for access device data.
  */
@@ -28,6 +31,7 @@
 
     private static final String UPLINK = "uplink";
     private static final String VLAN = "vlan";
+    private static final String DEFAULT_VLAN = "defaultVlan";
 
     /**
      * Gets the access device configuration for this device.
@@ -37,7 +41,15 @@
     public AccessDeviceData getOlt() {
         PortNumber uplink = PortNumber.portNumber(node.path(UPLINK).asText());
         VlanId vlan = VlanId.vlanId(Short.parseShort(node.path(VLAN).asText()));
+        JsonNode defaultVlanNode = node.path(DEFAULT_VLAN);
 
-        return new AccessDeviceData(subject(), uplink, vlan);
+        Optional<VlanId> defaultVlan;
+        if (defaultVlanNode.isMissingNode()) {
+            defaultVlan = Optional.empty();
+        } else {
+            defaultVlan = Optional.of(VlanId.vlanId(Short.parseShort(defaultVlanNode.asText())));
+        }
+
+        return new AccessDeviceData(subject(), uplink, vlan, defaultVlan);
     }
 }
diff --git a/src/main/java/org/onosproject/olt/AccessDeviceData.java b/src/main/java/org/onosproject/olt/AccessDeviceData.java
index f7e40e3..18b5e99 100644
--- a/src/main/java/org/onosproject/olt/AccessDeviceData.java
+++ b/src/main/java/org/onosproject/olt/AccessDeviceData.java
@@ -20,6 +20,8 @@
 import org.onosproject.net.DeviceId;
 import org.onosproject.net.PortNumber;
 
+import java.util.Optional;
+
 import static com.google.common.base.Preconditions.checkNotNull;
 
 /**
@@ -33,6 +35,7 @@
     private final DeviceId deviceId;
     private final PortNumber uplink;
     private final VlanId vlan;
+    private final Optional<VlanId> defaultVlan;
 
     /**
      * Class constructor.
@@ -41,10 +44,12 @@
      * @param uplink uplink port number
      * @param vlan device VLAN ID
      */
-    public AccessDeviceData(DeviceId deviceId, PortNumber uplink, VlanId vlan) {
+    public AccessDeviceData(DeviceId deviceId, PortNumber uplink, VlanId vlan,
+                            Optional<VlanId> defaultVlan) {
         this.deviceId = checkNotNull(deviceId, DEVICE_ID_MISSING);
         this.uplink = checkNotNull(uplink, UPLINK_MISSING);
         this.vlan = checkNotNull(vlan, VLAN_MISSING);
+        this.defaultVlan = checkNotNull(defaultVlan);
     }
 
     /**
@@ -68,9 +73,18 @@
     /**
      * Retrieves the VLAN ID assigned to the device.
      *
-     * @return vlan ID
+     * @return VLAN ID
      */
     public VlanId vlan() {
         return vlan;
     }
+
+    /**
+     * Retrieves the default VLAN ID that will be used for this device.
+     *
+     * @return default VLAN ID
+     */
+    public Optional<VlanId> defaultVlan() {
+        return defaultVlan;
+    }
 }
diff --git a/src/main/java/org/onosproject/olt/OLT.java b/src/main/java/org/onosproject/olt/OLT.java
index 9aa8865..d5d7d27 100644
--- a/src/main/java/org/onosproject/olt/OLT.java
+++ b/src/main/java/org/onosproject/olt/OLT.java
@@ -52,6 +52,7 @@
 
 import java.util.Dictionary;
 import java.util.Map;
+import java.util.Optional;
 import java.util.concurrent.ConcurrentHashMap;
 
 import static org.slf4j.LoggerFactory.getLogger;
@@ -247,15 +248,17 @@
             return;
         }
 
-        provisionVlans(olt.deviceId(), olt.uplink(), port.port(), vlan, olt.vlan());
+        provisionVlans(olt.deviceId(), olt.uplink(), port.port(), vlan, olt.vlan(),
+                olt.defaultVlan());
     }
 
     private void provisionVlans(DeviceId deviceId, PortNumber uplinkPort,
                                 PortNumber subscriberPort,
-                                VlanId subscriberVlan, VlanId deviceVlan) {
+                                VlanId subscriberVlan, VlanId deviceVlan,
+                                Optional<VlanId> defaultVlan) {
 
         TrafficSelector upstream = DefaultTrafficSelector.builder()
-                .matchVlanId(DEFAULT_VLAN)
+                .matchVlanId((defaultVlan.isPresent()) ? defaultVlan.get() : DEFAULT_VLAN)
                 .matchInPort(subscriberPort)
                 .build();
 
@@ -273,7 +276,7 @@
 
         TrafficTreatment downstreamTreatment = DefaultTrafficTreatment.builder()
                 .popVlan()
-                .setVlanId(DEFAULT_VLAN)
+                .setVlanId((defaultVlan.isPresent()) ? defaultVlan.get() : DEFAULT_VLAN)
                 .setOutput(subscriberPort)
                 .build();