First round of ClusterMetadata improvements:
    Introduced a PartitionId type for identifying partitions
    Introduced a admin service for making metadata updates
    Update cluster.json format to specify all partitions (including p0) and changed partitionId to be an int.

Change-Id: Ia0617f1ed0ce886680dcee4f5396a4bbdfa225da
diff --git a/core/api/src/main/java/org/onosproject/cluster/Partition.java b/core/api/src/main/java/org/onosproject/cluster/Partition.java
index 1eca4ae..e3a1352 100644
--- a/core/api/src/main/java/org/onosproject/cluster/Partition.java
+++ b/core/api/src/main/java/org/onosproject/cluster/Partition.java
@@ -1,5 +1,5 @@
 /*
- * Copyright 2015 Open Networking Laboratory
+ * Copyright 2016 Open Networking Laboratory
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -15,77 +15,23 @@
  */
 package org.onosproject.cluster;
 
-import java.util.Arrays;
 import java.util.Collection;
-import java.util.Set;
-
-import com.google.common.collect.ImmutableSet;
-import com.google.common.collect.Sets;
-
-import static com.google.common.base.Preconditions.checkNotNull;
 
 /**
- * A data partition.
- * <p>
- * Partition represents a slice of the data space and is made up of a collection
- * of {@link org.onosproject.cluster.ControllerNode nodes}
- * that all maintain copies of this data.
+ * A partition or shard is a group of controller nodes that are work together to maintain state.
+ * A ONOS cluster is typically made of of one or partitions over which the the data is partitioned.
  */
-public class Partition {
-
-    private final String name;
-    private final Set<NodeId> members;
-
-    private Partition() {
-        name = null;
-        members = null;
-    }
-
-    public Partition(String name, Collection<NodeId> members) {
-        this.name = checkNotNull(name);
-        this.members = ImmutableSet.copyOf(checkNotNull(members));
-    }
+public interface Partition {
 
     /**
-     * Returns the partition name.
-     * <p>
-     * Each partition is identified by a unique name.
-     * @return partition name
+     * Returns the partition identifier.
+     * @return partition identifier
      */
-    public String getName() {
-        return this.name;
-    }
+    PartitionId getId();
 
     /**
-     * Returns the collection of controller node identifiers that make up this partition.
+     * Returns the controller nodes that are members of this partition.
      * @return collection of controller node identifiers
      */
-    public Collection<NodeId> getMembers() {
-        return this.members;
-    }
-
-    @Override
-    public int hashCode() {
-        return Arrays.deepHashCode(new Object[] {name, members});
-    }
-
-    @Override
-    public boolean equals(Object other) {
-        if (this == other) {
-            return true;
-        }
-
-        if (other == null || !Partition.class.isInstance(other)) {
-            return false;
-        }
-
-        Partition that = (Partition) other;
-
-        if (!this.name.equals(that.name) || (this.members == null && that.members != null)
-                || (this.members != null && that.members == null) || this.members.size() != that.members.size()) {
-            return false;
-        }
-
-        return Sets.symmetricDifference(this.members, that.members).isEmpty();
-    }
-}
\ No newline at end of file
+    Collection<NodeId> getMembers();
+}