[ONOS-7088] Distribute storage partitions evenly during upgrades

Change-Id: Id82f86ddedbe6c7de2322717338c5c341177bc9e
diff --git a/core/net/src/main/java/org/onosproject/cluster/impl/ClusterManager.java b/core/net/src/main/java/org/onosproject/cluster/impl/ClusterManager.java
index 92a3894..95a9b19 100644
--- a/core/net/src/main/java/org/onosproject/cluster/impl/ClusterManager.java
+++ b/core/net/src/main/java/org/onosproject/cluster/impl/ClusterManager.java
@@ -52,6 +52,7 @@
 import org.onosproject.cluster.Partition;
 import org.onosproject.cluster.PartitionId;
 import org.onosproject.core.Version;
+import org.onosproject.core.VersionService;
 import org.onosproject.event.AbstractListenerManager;
 import org.slf4j.Logger;
 
@@ -88,6 +89,9 @@
     @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
     protected SystemService systemService;
 
+    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    protected VersionService versionService;
+
     private final AtomicReference<ClusterMetadata> currentMetadata = new AtomicReference<>();
     private final InternalClusterMetadataListener metadataListener = new InternalClusterMetadataListener();
 
@@ -196,7 +200,7 @@
         }
     }
 
-    private static Set<Partition> buildDefaultPartitions(Collection<ControllerNode> nodes, int partitionSize) {
+    private Set<Partition> buildDefaultPartitions(Collection<ControllerNode> nodes, int partitionSize) {
         List<ControllerNode> sorted = new ArrayList<>(nodes);
         Collections.sort(sorted, (o1, o2) -> o1.id().toString().compareTo(o2.id().toString()));
         Set<Partition> partitions = Sets.newHashSet();
@@ -209,7 +213,7 @@
             for (int j = 0; j < count; j++) {
                 set.add(sorted.get((i + j) % length).id());
             }
-            partitions.add(new DefaultPartition(PartitionId.from((index + 1)), set));
+            partitions.add(new DefaultPartition(PartitionId.from((index + 1)), versionService.version(), set));
         }
         return partitions;
     }
diff --git a/core/net/src/main/java/org/onosproject/cluster/impl/DefaultClusterMetadataProvider.java b/core/net/src/main/java/org/onosproject/cluster/impl/DefaultClusterMetadataProvider.java
index b47f2cd..83fe78b 100644
--- a/core/net/src/main/java/org/onosproject/cluster/impl/DefaultClusterMetadataProvider.java
+++ b/core/net/src/main/java/org/onosproject/cluster/impl/DefaultClusterMetadataProvider.java
@@ -41,6 +41,7 @@
 import org.onosproject.cluster.NodeId;
 import org.onosproject.cluster.Partition;
 import org.onosproject.cluster.PartitionId;
+import org.onosproject.core.VersionService;
 import org.onosproject.net.provider.ProviderId;
 import org.onosproject.store.service.Versioned;
 import org.slf4j.Logger;
@@ -58,6 +59,9 @@
     @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
     protected ClusterMetadataProviderRegistry providerRegistry;
 
+    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    protected VersionService versionService;
+
     private static final String ONOS_IP = "ONOS_IP";
     private static final String ONOS_INTERFACE = "ONOS_INTERFACE";
     private static final String ONOS_ALLOW_IPV6 = "ONOS_ALLOW_IPV6";
@@ -72,7 +76,10 @@
         ControllerNode localNode =
                 new DefaultControllerNode(new NodeId(localIp), IpAddress.valueOf(localIp), DEFAULT_ONOS_PORT);
         // partition 1
-        Partition partition = new DefaultPartition(PartitionId.from(1), ImmutableSet.of(localNode.id()));
+        Partition partition = new DefaultPartition(
+                PartitionId.from(1),
+                versionService.version(),
+                ImmutableSet.of(localNode.id()));
         ClusterMetadata metadata = new ClusterMetadata(PROVIDER_ID,
                                         "default",
                                         ImmutableSet.of(localNode),
diff --git a/core/net/src/main/java/org/onosproject/upgrade/impl/UpgradeManager.java b/core/net/src/main/java/org/onosproject/upgrade/impl/UpgradeManager.java
index 7a83724..ab1b1c3 100644
--- a/core/net/src/main/java/org/onosproject/upgrade/impl/UpgradeManager.java
+++ b/core/net/src/main/java/org/onosproject/upgrade/impl/UpgradeManager.java
@@ -49,7 +49,10 @@
 import org.slf4j.Logger;
 
 import static org.onosproject.security.AppGuard.checkPermission;
-import static org.onosproject.security.AppPermission.Type.*;
+import static org.onosproject.security.AppPermission.Type.CLUSTER_EVENT;
+import static org.onosproject.security.AppPermission.Type.UPGRADE_EVENT;
+import static org.onosproject.security.AppPermission.Type.UPGRADE_READ;
+import static org.onosproject.security.AppPermission.Type.UPGRADE_WRITE;
 import static org.slf4j.LoggerFactory.getLogger;
 
 /**
@@ -86,6 +89,8 @@
 
     @Activate
     public void activate() {
+        eventDispatcher.addSink(UpgradeEvent.class, listenerRegistry);
+
         state = coordinationService.<Upgrade>atomicValueBuilder()
                 .withName("onos-upgrade-state")
                 .withSerializer(Serializer.using(KryoNamespaces.API))
@@ -138,6 +143,7 @@
 
     @Deactivate
     public void deactivate() {
+        eventDispatcher.removeSink(UpgradeEvent.class);
         state.removeListener(stateListener);
         clusterService.removeListener(clusterListener);
         log.info("Stopped");