[ONOS-4681] Enables device registration in GossipDeviceStore,
exposes availability, and polls NETCONF device reachability.

Change-Id: I5492c7b6109c3431d71555a9104c7e97fc6e75be
diff --git a/core/api/src/main/java/org/onosproject/net/device/DefaultDeviceDescription.java b/core/api/src/main/java/org/onosproject/net/device/DefaultDeviceDescription.java
index 72ec4ab..91ce5af 100644
--- a/core/api/src/main/java/org/onosproject/net/device/DefaultDeviceDescription.java
+++ b/core/api/src/main/java/org/onosproject/net/device/DefaultDeviceDescription.java
@@ -38,6 +38,7 @@
     private final String swVersion;
     private final String serialNumber;
     private final ChassisId chassisId;
+    private final boolean defaultAvailable;
 
     /**
      * Creates a device description using the supplied information.
@@ -55,6 +56,28 @@
                                     String hwVersion, String swVersion,
                                     String serialNumber, ChassisId chassis,
                                     SparseAnnotations... annotations) {
+        this(uri, type, manufacturer, hwVersion, swVersion, serialNumber,
+             chassis, true, annotations);
+    }
+
+    /**
+     * Creates a device description using the supplied information.
+     *
+     * @param uri            device URI
+     * @param type           device type
+     * @param manufacturer   device manufacturer
+     * @param hwVersion      device HW version
+     * @param swVersion      device SW version
+     * @param serialNumber   device serial number
+     * @param chassis        chassis id
+     * @param defaultAvailable optional whether device is by default available
+     * @param annotations    optional key/value annotations map
+     */
+    public DefaultDeviceDescription(URI uri, Type type, String manufacturer,
+                                    String hwVersion, String swVersion,
+                                    String serialNumber, ChassisId chassis,
+                                    boolean defaultAvailable,
+                                    SparseAnnotations... annotations) {
         super(annotations);
         this.uri = checkNotNull(uri, "Device URI cannot be null");
         this.type = checkNotNull(type, "Device type cannot be null");
@@ -63,6 +86,7 @@
         this.swVersion = swVersion;
         this.serialNumber = serialNumber;
         this.chassisId = chassis;
+        this.defaultAvailable = defaultAvailable;
     }
 
     /**
@@ -74,7 +98,7 @@
                                     SparseAnnotations... annotations) {
         this(base.deviceUri(), base.type(), base.manufacturer(),
              base.hwVersion(), base.swVersion(), base.serialNumber(),
-             base.chassisId(), annotations);
+             base.chassisId(), base.isDefaultAvailable(), annotations);
     }
 
     /**
@@ -83,10 +107,26 @@
      * @param type device type
      * @param annotations Annotations to use.
      */
-    public DefaultDeviceDescription(DeviceDescription base, Type type, SparseAnnotations... annotations) {
+    public DefaultDeviceDescription(DeviceDescription base, Type type,
+                                    SparseAnnotations... annotations) {
         this(base.deviceUri(), type, base.manufacturer(),
                 base.hwVersion(), base.swVersion(), base.serialNumber(),
-                base.chassisId(), annotations);
+                base.chassisId(), base.isDefaultAvailable(), annotations);
+    }
+
+    /**
+     * Creates a device description using the supplied information.
+     *
+     * @param base DeviceDescription to basic information (except for defaultAvailable)
+     * @param defaultAvailable whether device should be made available by default
+     * @param annotations Annotations to use.
+     */
+    public DefaultDeviceDescription(DeviceDescription base,
+                                    boolean defaultAvailable,
+                                    SparseAnnotations... annotations) {
+        this(base.deviceUri(), base.type(), base.manufacturer(),
+             base.hwVersion(), base.swVersion(), base.serialNumber(),
+             base.chassisId(), defaultAvailable, annotations);
     }
 
     @Override
@@ -125,6 +165,11 @@
     }
 
     @Override
+    public boolean isDefaultAvailable() {
+        return defaultAvailable;
+    }
+
+    @Override
     public String toString() {
         return toStringHelper(this)
                 .add("uri", uri).add("type", type).add("mfr", manufacturer)
@@ -137,7 +182,8 @@
     @Override
     public int hashCode() {
         return Objects.hashCode(super.hashCode(), uri, type, manufacturer,
-                                hwVersion, swVersion, serialNumber, chassisId);
+                                hwVersion, swVersion, serialNumber, chassisId,
+                                defaultAvailable);
     }
 
     @Override
@@ -153,7 +199,8 @@
                     && Objects.equal(this.hwVersion, that.hwVersion)
                     && Objects.equal(this.swVersion, that.swVersion)
                     && Objects.equal(this.serialNumber, that.serialNumber)
-                    && Objects.equal(this.chassisId, that.chassisId);
+                    && Objects.equal(this.chassisId, that.chassisId)
+                    && Objects.equal(this.defaultAvailable, that.defaultAvailable);
         }
         return false;
     }
@@ -167,5 +214,6 @@
         this.swVersion = null;
         this.serialNumber = null;
         this.chassisId = null;
+        this.defaultAvailable = true;
     }
 }