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 bf3e4a0f18..521e20a3c7 100644 --- a/core/api/src/main/java/org/onosproject/cluster/ClusterMetadata.java +++ b/core/api/src/main/java/org/onosproject/cluster/ClusterMetadata.java @@ -41,10 +41,14 @@ import static com.google.common.base.Preconditions.checkNotNull; */ public final class ClusterMetadata implements Provided { + private static final ProviderId NONE_PROVIDER_ID = new ProviderId("none", "none"); + private static final String DEFAULT_CLUSTER_SECRET = "INSECURE!"; + private final ProviderId providerId; private final String name; private final ControllerNode localNode; private final Set controllerNodes; + private final String storageDnsService; private final Set storageNodes; private final String clusterSecret; @@ -62,6 +66,7 @@ public final class ClusterMetadata implements Provided { name = null; localNode = null; controllerNodes = null; + storageDnsService = null; storageNodes = null; clusterSecret = null; } @@ -72,6 +77,7 @@ public final class ClusterMetadata implements Provided { * @param name The cluster Name * @param localNode The local node * @param controllerNodes Set of nodes in cluster + * @param storageDnsService The storage DNS service name * @param storageNodes Set of storage nodes */ @Deprecated @@ -80,13 +86,19 @@ public final class ClusterMetadata implements Provided { String name, ControllerNode localNode, Set controllerNodes, + String storageDnsService, Set storageNodes) { - this.providerId = checkNotNull(providerId); - this.name = checkNotNull(name); - this.localNode = localNode; - this.controllerNodes = ImmutableSet.copyOf(checkNotNull(controllerNodes)); - this.storageNodes = ImmutableSet.copyOf(checkNotNull(storageNodes)); - this.clusterSecret = "INSECURE!"; + this(providerId, name, localNode, controllerNodes, storageDnsService, storageNodes, DEFAULT_CLUSTER_SECRET); + } + + public ClusterMetadata( + ProviderId providerId, + String name, + ControllerNode localNode, + Set controllerNodes, + Set storageNodes, + String clusterSecret) { + this(providerId, name, localNode, controllerNodes, null, storageNodes, clusterSecret); } public ClusterMetadata( @@ -94,12 +106,14 @@ public final class ClusterMetadata implements Provided { String name, ControllerNode localNode, Set controllerNodes, + String storageDnsService, Set storageNodes, String clusterSecret) { this.providerId = checkNotNull(providerId); this.name = checkNotNull(name); this.localNode = localNode; this.controllerNodes = ImmutableSet.copyOf(checkNotNull(controllerNodes)); + this.storageDnsService = storageDnsService; this.storageNodes = ImmutableSet.copyOf(checkNotNull(storageNodes)); this.clusterSecret = clusterSecret; } @@ -113,14 +127,20 @@ public final class ClusterMetadata implements Provided { */ @Deprecated public ClusterMetadata( - String name, ControllerNode localNode, Set controllerNodes, Set storageNodes) { - this(new ProviderId("none", "none"), name, localNode, controllerNodes, storageNodes, "INSECURE!"); + String name, + ControllerNode localNode, + Set controllerNodes, + Set storageNodes) { + this(NONE_PROVIDER_ID, name, localNode, controllerNodes, null, storageNodes, DEFAULT_CLUSTER_SECRET); } public ClusterMetadata( - String name, ControllerNode localNode, Set controllerNodes, Set storageNodes, + String name, + ControllerNode localNode, + Set controllerNodes, + Set storageNodes, String clusterSecret) { - this(new ProviderId("none", "none"), name, localNode, controllerNodes, storageNodes, clusterSecret); + this(NONE_PROVIDER_ID, name, localNode, controllerNodes, null, storageNodes, clusterSecret); } @Override @@ -137,6 +157,15 @@ public final class ClusterMetadata implements Provided { return this.name; } + /** + * Returns the DNS service through which to locate storage nodes. + * + * @return the DNS service through which to locate storage nodes + */ + public String getStorageDnsService() { + return storageDnsService; + } + /** * Returns the local controller node. * @return the local controller node diff --git a/core/net/src/main/java/org/onosproject/cluster/impl/ConfigFileBasedClusterMetadataProvider.java b/core/net/src/main/java/org/onosproject/cluster/impl/ConfigFileBasedClusterMetadataProvider.java index 807a1433d6..f3711e20ed 100644 --- a/core/net/src/main/java/org/onosproject/cluster/impl/ConfigFileBasedClusterMetadataProvider.java +++ b/core/net/src/main/java/org/onosproject/cluster/impl/ConfigFileBasedClusterMetadataProvider.java @@ -117,6 +117,7 @@ public class ConfigFileBasedClusterMetadataProvider implements ClusterMetadataPr .stream() .map(this::toPrototype) .collect(Collectors.toSet())); + prototype.setStorageDnsService(metadata.getStorageDnsService()); prototype.setStorage(metadata.getStorageNodes() .stream() .map(this::toPrototype) @@ -274,6 +275,7 @@ public class ConfigFileBasedClusterMetadataProvider implements ClusterMetadataPr .stream() .map(node -> new DefaultControllerNode(getNodeId(node), getNodeHost(node), getNodePort(node))) .collect(Collectors.toSet()), + metadata.getStorageDnsService(), metadata.getStorage() .stream() .map(node -> new DefaultControllerNode(getNodeId(node), getNodeHost(node), getNodePort(node))) @@ -310,6 +312,7 @@ public class ConfigFileBasedClusterMetadataProvider implements ClusterMetadataPr private String name; private NodePrototype node; private Set controller = Sets.newHashSet(); + private String storageDnsService; private Set storage = Sets.newHashSet(); private String clusterSecret; @@ -337,6 +340,14 @@ public class ConfigFileBasedClusterMetadataProvider implements ClusterMetadataPr this.controller = controller; } + public String getStorageDnsService() { + return storageDnsService; + } + + public void setStorageDnsService(String storageDnsService) { + this.storageDnsService = storageDnsService; + } + public Set getStorage() { return storage; } diff --git a/core/store/primitives/src/main/java/org/onosproject/store/atomix/impl/AtomixManager.java b/core/store/primitives/src/main/java/org/onosproject/store/atomix/impl/AtomixManager.java index c46ce87bf3..3f2edf5110 100644 --- a/core/store/primitives/src/main/java/org/onosproject/store/atomix/impl/AtomixManager.java +++ b/core/store/primitives/src/main/java/org/onosproject/store/atomix/impl/AtomixManager.java @@ -17,6 +17,8 @@ package org.onosproject.store.atomix.impl; import io.atomix.cluster.Node; import io.atomix.cluster.discovery.BootstrapDiscoveryProvider; +import io.atomix.cluster.discovery.DnsDiscoveryProvider; +import io.atomix.cluster.discovery.NodeDiscoveryProvider; import io.atomix.core.Atomix; import io.atomix.protocols.raft.partition.RaftPartitionGroup; import org.onosproject.cluster.ClusterMetadata; @@ -72,6 +74,26 @@ public class AtomixManager { private Atomix createAtomix() { ClusterMetadata metadata = metadataService.getClusterMetadata(); + + // If a storage DNS service was provided, use the DNS service for service discovery. + // Otherwise, use a static list of storage nodes. + NodeDiscoveryProvider discovery; + if (metadata.getStorageDnsService() != null) { + discovery = DnsDiscoveryProvider.builder() + .withService(metadata.getStorageDnsService()) + .build(); + } else { + discovery = BootstrapDiscoveryProvider.builder() + .withNodes(metadata.getStorageNodes().stream() + .map(node -> Node.builder() + .withId(node.id().id()) + .withHost(node.host()) + .withPort(node.tcpPort()) + .build()) + .collect(Collectors.toList())) + .build(); + } + if (!metadata.getStorageNodes().isEmpty()) { // If storage nodes are defined, construct an instance that connects to them for service discovery. return Atomix.builder(getClass().getClassLoader()) @@ -80,15 +102,7 @@ public class AtomixManager { .withHost(metadata.getLocalNode().host()) .withPort(metadata.getLocalNode().tcpPort()) .withProperty("type", "onos") - .withMembershipProvider(BootstrapDiscoveryProvider.builder() - .withNodes(metadata.getStorageNodes().stream() - .map(node -> Node.builder() - .withId(node.id().id()) - .withHost(node.host()) - .withPort(node.tcpPort()) - .build()) - .collect(Collectors.toList())) - .build()) + .withMembershipProvider(discovery) .build(); } else { log.warn("No storage nodes found in cluster metadata!"); @@ -107,15 +121,7 @@ public class AtomixManager { .withHost(metadata.getLocalNode().host()) .withPort(metadata.getLocalNode().tcpPort()) .withProperty("type", "onos") - .withMembershipProvider(BootstrapDiscoveryProvider.builder() - .withNodes(metadata.getControllerNodes().stream() - .map(node -> io.atomix.cluster.Node.builder() - .withId(node.id().id()) - .withHost(node.host()) - .withPort(node.tcpPort()) - .build()) - .collect(Collectors.toList())) - .build()) + .withMembershipProvider(discovery) .withManagementGroup(RaftPartitionGroup.builder("system") .withNumPartitions(1) .withDataDirectory(new File(LOCAL_DATA_DIR, "system"))