Support DNS storage discovery via cluster metadata

Change-Id: I62499cb8d6bff57d780e7aaaf07eaa84ec332192
This commit is contained in:
Jordan Halterman 2019-01-25 15:07:11 -08:00
parent ae10293d63
commit 2ef1cf725e
3 changed files with 74 additions and 28 deletions

View File

@ -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<ControllerNode> controllerNodes;
private final String storageDnsService;
private final Set<Node> 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<ControllerNode> controllerNodes,
String storageDnsService,
Set<Node> 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<ControllerNode> controllerNodes,
Set<Node> 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<ControllerNode> controllerNodes,
String storageDnsService,
Set<Node> 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<ControllerNode> controllerNodes, Set<Node> storageNodes) {
this(new ProviderId("none", "none"), name, localNode, controllerNodes, storageNodes, "INSECURE!");
String name,
ControllerNode localNode,
Set<ControllerNode> controllerNodes,
Set<Node> storageNodes) {
this(NONE_PROVIDER_ID, name, localNode, controllerNodes, null, storageNodes, DEFAULT_CLUSTER_SECRET);
}
public ClusterMetadata(
String name, ControllerNode localNode, Set<ControllerNode> controllerNodes, Set<Node> storageNodes,
String name,
ControllerNode localNode,
Set<ControllerNode> controllerNodes,
Set<Node> 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

View File

@ -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<NodePrototype> controller = Sets.newHashSet();
private String storageDnsService;
private Set<NodePrototype> 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<NodePrototype> getStorage() {
return storage;
}

View File

@ -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"))