[ONOS-7757] Support onos-local and embedded cluster configurations
- Refactor cluster.json to support internal/external nodes ('controller' and 'storage')
- Bootstrap embedded partitions when 'storage' nodes not present
- Update onos-gen-config script to generate cluster.json based on environment variables
- Update setup scenario to ignore missing $OCC# environment variables

Change-Id: Ia93b64e13d7a7c35ed712da4c681425e3ccf9fe9
diff --git a/core/api/src/main/java/org/onosproject/cluster/ClusterMetadata.java b/core/api/src/main/java/org/onosproject/cluster/ClusterMetadata.java
index 8f7d960..e1f664e 100644
--- a/core/api/src/main/java/org/onosproject/cluster/ClusterMetadata.java
+++ b/core/api/src/main/java/org/onosproject/cluster/ClusterMetadata.java
@@ -44,7 +44,8 @@
     private final ProviderId providerId;
     private final String name;
     private final ControllerNode localNode;
-    private final Set<Node> nodes;
+    private final Set<ControllerNode> controllerNodes;
+    private final Set<Node> storageNodes;
 
     public static final Funnel<ClusterMetadata> HASH_FUNNEL = new Funnel<ClusterMetadata>() {
         @Override
@@ -58,22 +59,26 @@
         providerId = null;
         name = null;
         localNode = null;
-        nodes = null;
+        controllerNodes = null;
+        storageNodes = null;
     }
 
     public ClusterMetadata(
         ProviderId providerId,
         String name,
         ControllerNode localNode,
-        Set<Node> nodes) {
+        Set<ControllerNode> controllerNodes,
+        Set<Node> storageNodes) {
         this.providerId = checkNotNull(providerId);
         this.name = checkNotNull(name);
         this.localNode = localNode;
-        this.nodes = ImmutableSet.copyOf(checkNotNull(nodes));
+        this.controllerNodes = ImmutableSet.copyOf(checkNotNull(controllerNodes));
+        this.storageNodes = ImmutableSet.copyOf(checkNotNull(storageNodes));
     }
 
-    public ClusterMetadata(String name, ControllerNode localNode, Set<Node> nodes) {
-        this(new ProviderId("none", "none"), name, localNode, nodes);
+    public ClusterMetadata(
+            String name, ControllerNode localNode, Set<ControllerNode> controllerNodes, Set<Node> storageNodes) {
+        this(new ProviderId("none", "none"), name, localNode, controllerNodes, storageNodes);
     }
 
     @Override
@@ -102,8 +107,17 @@
      * Returns the collection of {@link org.onosproject.cluster.ControllerNode nodes} that make up the cluster.
      * @return cluster nodes
      */
+    @Deprecated
     public Collection<ControllerNode> getNodes() {
-        return (Collection) nodes;
+        return getControllerNodes();
+    }
+
+    /**
+     * Returns the collection of {@link org.onosproject.cluster.ControllerNode nodes} that make up the cluster.
+     * @return controller nodes
+     */
+    public Collection<ControllerNode> getControllerNodes() {
+        return controllerNodes;
     }
 
     /**
@@ -112,7 +126,7 @@
      * @return the collection of storage nodes
      */
     public Collection<Node> getStorageNodes() {
-        return nodes;
+        return storageNodes;
     }
 
     /**
@@ -131,13 +145,14 @@
         return MoreObjects.toStringHelper(ClusterMetadata.class)
                 .add("providerId", providerId)
                 .add("name", name)
-                .add("nodes", nodes)
+                .add("controllerNodes", controllerNodes)
+                .add("storageNodes", storageNodes)
                 .toString();
     }
 
     @Override
     public int hashCode() {
-        return Arrays.deepHashCode(new Object[] {providerId, name, nodes});
+        return Arrays.deepHashCode(new Object[] {providerId, name, controllerNodes, storageNodes});
     }
 
     /*
@@ -157,8 +172,10 @@
         ClusterMetadata that = (ClusterMetadata) object;
 
         return Objects.equals(this.name, that.name) &&
-               this.localNode.equals(that.localNode) &&
-               Objects.equals(this.nodes.size(), that.nodes.size()) &&
-               Sets.symmetricDifference(this.nodes, that.nodes).isEmpty();
+                this.localNode.equals(that.localNode) &&
+                Objects.equals(this.controllerNodes.size(), that.controllerNodes.size()) &&
+                Sets.symmetricDifference(this.controllerNodes, that.controllerNodes).isEmpty() &&
+                Objects.equals(this.storageNodes.size(), that.storageNodes.size()) &&
+                Sets.symmetricDifference(this.storageNodes, that.storageNodes).isEmpty();
     }
 }