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 { 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 ProviderId providerId;
private final String name; private final String name;
private final ControllerNode localNode; private final ControllerNode localNode;
private final Set<ControllerNode> controllerNodes; private final Set<ControllerNode> controllerNodes;
private final String storageDnsService;
private final Set<Node> storageNodes; private final Set<Node> storageNodes;
private final String clusterSecret; private final String clusterSecret;
@ -62,6 +66,7 @@ public final class ClusterMetadata implements Provided {
name = null; name = null;
localNode = null; localNode = null;
controllerNodes = null; controllerNodes = null;
storageDnsService = null;
storageNodes = null; storageNodes = null;
clusterSecret = null; clusterSecret = null;
} }
@ -72,6 +77,7 @@ public final class ClusterMetadata implements Provided {
* @param name The cluster Name * @param name The cluster Name
* @param localNode The local node * @param localNode The local node
* @param controllerNodes Set of nodes in cluster * @param controllerNodes Set of nodes in cluster
* @param storageDnsService The storage DNS service name
* @param storageNodes Set of storage nodes * @param storageNodes Set of storage nodes
*/ */
@Deprecated @Deprecated
@ -80,13 +86,19 @@ public final class ClusterMetadata implements Provided {
String name, String name,
ControllerNode localNode, ControllerNode localNode,
Set<ControllerNode> controllerNodes, Set<ControllerNode> controllerNodes,
String storageDnsService,
Set<Node> storageNodes) { Set<Node> storageNodes) {
this.providerId = checkNotNull(providerId); this(providerId, name, localNode, controllerNodes, storageDnsService, storageNodes, DEFAULT_CLUSTER_SECRET);
this.name = checkNotNull(name); }
this.localNode = localNode;
this.controllerNodes = ImmutableSet.copyOf(checkNotNull(controllerNodes)); public ClusterMetadata(
this.storageNodes = ImmutableSet.copyOf(checkNotNull(storageNodes)); ProviderId providerId,
this.clusterSecret = "INSECURE!"; String name,
ControllerNode localNode,
Set<ControllerNode> controllerNodes,
Set<Node> storageNodes,
String clusterSecret) {
this(providerId, name, localNode, controllerNodes, null, storageNodes, clusterSecret);
} }
public ClusterMetadata( public ClusterMetadata(
@ -94,12 +106,14 @@ public final class ClusterMetadata implements Provided {
String name, String name,
ControllerNode localNode, ControllerNode localNode,
Set<ControllerNode> controllerNodes, Set<ControllerNode> controllerNodes,
String storageDnsService,
Set<Node> storageNodes, Set<Node> storageNodes,
String clusterSecret) { String clusterSecret) {
this.providerId = checkNotNull(providerId); this.providerId = checkNotNull(providerId);
this.name = checkNotNull(name); this.name = checkNotNull(name);
this.localNode = localNode; this.localNode = localNode;
this.controllerNodes = ImmutableSet.copyOf(checkNotNull(controllerNodes)); this.controllerNodes = ImmutableSet.copyOf(checkNotNull(controllerNodes));
this.storageDnsService = storageDnsService;
this.storageNodes = ImmutableSet.copyOf(checkNotNull(storageNodes)); this.storageNodes = ImmutableSet.copyOf(checkNotNull(storageNodes));
this.clusterSecret = clusterSecret; this.clusterSecret = clusterSecret;
} }
@ -113,14 +127,20 @@ public final class ClusterMetadata implements Provided {
*/ */
@Deprecated @Deprecated
public ClusterMetadata( public ClusterMetadata(
String name, ControllerNode localNode, Set<ControllerNode> controllerNodes, Set<Node> storageNodes) { String name,
this(new ProviderId("none", "none"), name, localNode, controllerNodes, storageNodes, "INSECURE!"); ControllerNode localNode,
Set<ControllerNode> controllerNodes,
Set<Node> storageNodes) {
this(NONE_PROVIDER_ID, name, localNode, controllerNodes, null, storageNodes, DEFAULT_CLUSTER_SECRET);
} }
public ClusterMetadata( public ClusterMetadata(
String name, ControllerNode localNode, Set<ControllerNode> controllerNodes, Set<Node> storageNodes, String name,
ControllerNode localNode,
Set<ControllerNode> controllerNodes,
Set<Node> storageNodes,
String clusterSecret) { String clusterSecret) {
this(new ProviderId("none", "none"), name, localNode, controllerNodes, storageNodes, clusterSecret); this(NONE_PROVIDER_ID, name, localNode, controllerNodes, null, storageNodes, clusterSecret);
} }
@Override @Override
@ -137,6 +157,15 @@ public final class ClusterMetadata implements Provided {
return this.name; 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. * Returns the local controller node.
* @return the local controller node * @return the local controller node

View File

@ -117,6 +117,7 @@ public class ConfigFileBasedClusterMetadataProvider implements ClusterMetadataPr
.stream() .stream()
.map(this::toPrototype) .map(this::toPrototype)
.collect(Collectors.toSet())); .collect(Collectors.toSet()));
prototype.setStorageDnsService(metadata.getStorageDnsService());
prototype.setStorage(metadata.getStorageNodes() prototype.setStorage(metadata.getStorageNodes()
.stream() .stream()
.map(this::toPrototype) .map(this::toPrototype)
@ -274,6 +275,7 @@ public class ConfigFileBasedClusterMetadataProvider implements ClusterMetadataPr
.stream() .stream()
.map(node -> new DefaultControllerNode(getNodeId(node), getNodeHost(node), getNodePort(node))) .map(node -> new DefaultControllerNode(getNodeId(node), getNodeHost(node), getNodePort(node)))
.collect(Collectors.toSet()), .collect(Collectors.toSet()),
metadata.getStorageDnsService(),
metadata.getStorage() metadata.getStorage()
.stream() .stream()
.map(node -> new DefaultControllerNode(getNodeId(node), getNodeHost(node), getNodePort(node))) .map(node -> new DefaultControllerNode(getNodeId(node), getNodeHost(node), getNodePort(node)))
@ -310,6 +312,7 @@ public class ConfigFileBasedClusterMetadataProvider implements ClusterMetadataPr
private String name; private String name;
private NodePrototype node; private NodePrototype node;
private Set<NodePrototype> controller = Sets.newHashSet(); private Set<NodePrototype> controller = Sets.newHashSet();
private String storageDnsService;
private Set<NodePrototype> storage = Sets.newHashSet(); private Set<NodePrototype> storage = Sets.newHashSet();
private String clusterSecret; private String clusterSecret;
@ -337,6 +340,14 @@ public class ConfigFileBasedClusterMetadataProvider implements ClusterMetadataPr
this.controller = controller; this.controller = controller;
} }
public String getStorageDnsService() {
return storageDnsService;
}
public void setStorageDnsService(String storageDnsService) {
this.storageDnsService = storageDnsService;
}
public Set<NodePrototype> getStorage() { public Set<NodePrototype> getStorage() {
return storage; return storage;
} }

View File

@ -17,6 +17,8 @@ package org.onosproject.store.atomix.impl;
import io.atomix.cluster.Node; import io.atomix.cluster.Node;
import io.atomix.cluster.discovery.BootstrapDiscoveryProvider; 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.core.Atomix;
import io.atomix.protocols.raft.partition.RaftPartitionGroup; import io.atomix.protocols.raft.partition.RaftPartitionGroup;
import org.onosproject.cluster.ClusterMetadata; import org.onosproject.cluster.ClusterMetadata;
@ -72,6 +74,26 @@ public class AtomixManager {
private Atomix createAtomix() { private Atomix createAtomix() {
ClusterMetadata metadata = metadataService.getClusterMetadata(); 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 (!metadata.getStorageNodes().isEmpty()) {
// If storage nodes are defined, construct an instance that connects to them for service discovery. // If storage nodes are defined, construct an instance that connects to them for service discovery.
return Atomix.builder(getClass().getClassLoader()) return Atomix.builder(getClass().getClassLoader())
@ -80,15 +102,7 @@ public class AtomixManager {
.withHost(metadata.getLocalNode().host()) .withHost(metadata.getLocalNode().host())
.withPort(metadata.getLocalNode().tcpPort()) .withPort(metadata.getLocalNode().tcpPort())
.withProperty("type", "onos") .withProperty("type", "onos")
.withMembershipProvider(BootstrapDiscoveryProvider.builder() .withMembershipProvider(discovery)
.withNodes(metadata.getStorageNodes().stream()
.map(node -> Node.builder()
.withId(node.id().id())
.withHost(node.host())
.withPort(node.tcpPort())
.build())
.collect(Collectors.toList()))
.build())
.build(); .build();
} else { } else {
log.warn("No storage nodes found in cluster metadata!"); log.warn("No storage nodes found in cluster metadata!");
@ -107,15 +121,7 @@ public class AtomixManager {
.withHost(metadata.getLocalNode().host()) .withHost(metadata.getLocalNode().host())
.withPort(metadata.getLocalNode().tcpPort()) .withPort(metadata.getLocalNode().tcpPort())
.withProperty("type", "onos") .withProperty("type", "onos")
.withMembershipProvider(BootstrapDiscoveryProvider.builder() .withMembershipProvider(discovery)
.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())
.withManagementGroup(RaftPartitionGroup.builder("system") .withManagementGroup(RaftPartitionGroup.builder("system")
.withNumPartitions(1) .withNumPartitions(1)
.withDataDirectory(new File(LOCAL_DATA_DIR, "system")) .withDataDirectory(new File(LOCAL_DATA_DIR, "system"))