mirror of
https://github.com/opennetworkinglab/onos.git
synced 2025-10-17 18:32:28 +02:00
Support DNS storage discovery via cluster metadata
Change-Id: I62499cb8d6bff57d780e7aaaf07eaa84ec332192
This commit is contained in:
parent
ae10293d63
commit
2ef1cf725e
@ -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
|
||||
|
@ -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;
|
||||
}
|
||||
|
@ -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"))
|
||||
|
Loading…
x
Reference in New Issue
Block a user