Skip to content

Commit

Permalink
Refactor configuration file format to use maps rather than lists for …
Browse files Browse the repository at this point in the history
…named objects.
  • Loading branch information
kuujo committed Apr 26, 2018
1 parent ce296bc commit 08cd0ac
Show file tree
Hide file tree
Showing 12 changed files with 79 additions and 62 deletions.
2 changes: 1 addition & 1 deletion agent/src/main/java/io/atomix/agent/AtomixAgent.java
Expand Up @@ -132,7 +132,7 @@ public static void main(String[] args) throws Exception {
if (configString != null) {
AtomixConfig config = loadConfig(configString);
if (localMember != null) {
config.getClusterConfig().getMembers().stream()
config.getClusterConfig().getMembers().values().stream()
.filter(member -> member.getId().equals(localMember.getId()))
.findAny()
.ifPresent(localMemberConfig -> {
Expand Down
19 changes: 10 additions & 9 deletions agent/src/test/resources/atomix.yaml
Expand Up @@ -2,27 +2,28 @@
cluster:
name: test
members:
- id: node1
node1:
type: persistent
address: localhost:5000
- id: node2
node2:
type: persistent
address: localhost:5001
- id: node3
node3:
type: persistent
address: localhost:5002
system-partition-group:
name: system
# The management partition group from which primitives and additional partition groups are managed
management-group:
type: raft
partitions: 1
data-directory: target/test-logs/system
members:
- node1
- node2
- node3
# A list of partition groups
partition-groups:
- type: raft
name: core
raft:
type: raft
storage-level: memory
partitions: 7
partition-size: 3
Expand All @@ -31,8 +32,8 @@ partition-groups:
- node1
- node2
- node3
- type: multi-primary
name: data
data:
type: multi-primary
partitions: 7
# Distributed primitive configurations
primitives:
Expand Down
10 changes: 6 additions & 4 deletions cluster/src/main/java/io/atomix/cluster/AtomixCluster.java
Expand Up @@ -268,11 +268,12 @@ protected static ManagedBroadcastService buildBroadcastService(ClusterConfig con
* Builds a bootstrap metadata service.
*/
protected static ManagedBootstrapMetadataService buildBootstrapMetadataService(ClusterConfig config) {
boolean hasCoreNodes = config.getMembers().stream().anyMatch(node -> node.getType() == Member.Type.PERSISTENT);
boolean hasPersistentNodes = config.getMembers().values().stream().anyMatch(node -> node.getType() == Member.Type.PERSISTENT);
ClusterMetadata metadata = ClusterMetadata.builder()
.withNodes(config.getMembers()
.values()
.stream()
.filter(node -> (!hasCoreNodes && node.getType() == Member.Type.EPHEMERAL) || (hasCoreNodes && node.getType() == Member.Type.PERSISTENT))
.filter(node -> (!hasPersistentNodes && node.getType() == Member.Type.EPHEMERAL) || (hasPersistentNodes && node.getType() == Member.Type.PERSISTENT))
.map(Member::new)
.collect(Collectors.toList()))
.build();
Expand All @@ -285,6 +286,7 @@ protected static ManagedBootstrapMetadataService buildBootstrapMetadataService(C
protected static ManagedPersistentMetadataService buildPersistentMetadataService(ClusterConfig config, MessagingService messagingService) {
ClusterMetadata metadata = ClusterMetadata.builder()
.withNodes(config.getMembers()
.values()
.stream()
.filter(node -> node.getType() == Member.Type.PERSISTENT)
.map(Member::new)
Expand Down Expand Up @@ -313,7 +315,7 @@ protected static ManagedClusterMembershipService buildClusterMembershipService(
} else {
localMember = new Member(config.getLocalMember());
}
return new DefaultClusterMembershipService(localMember, bootstrapMetadataService, persistentMetadataService, messagingService, broadcastService, config.getMembership());
return new DefaultClusterMembershipService(localMember, bootstrapMetadataService, persistentMetadataService, messagingService, broadcastService, config.getMembershipConfig());
}

/**
Expand Down Expand Up @@ -385,7 +387,7 @@ public Builder withMembers(Member... members) {
* @return the Atomix builder
*/
public Builder withMembers(Collection<Member> members) {
config.setMembers(members.stream().map(n -> n.config()).collect(Collectors.toList()));
members.forEach(member -> config.addMember(member.config()));
return this;
}

Expand Down
34 changes: 23 additions & 11 deletions cluster/src/main/java/io/atomix/cluster/ClusterConfig.java
Expand Up @@ -19,8 +19,8 @@
import io.atomix.utils.net.Address;
import io.atomix.utils.net.MalformedAddressException;

import java.util.ArrayList;
import java.util.Collection;
import java.util.HashMap;
import java.util.Map;

/**
* Cluster configuration.
Expand All @@ -32,10 +32,10 @@ public class ClusterConfig implements Config {

private String name = DEFAULT_CLUSTER_NAME;
private MemberConfig localMember;
private Collection<MemberConfig> members = new ArrayList<>();
private Map<String, MemberConfig> members = new HashMap<>();
private boolean multicastEnabled = false;
private Address multicastAddress;
private GroupMembershipConfig membership = new GroupMembershipConfig();
private GroupMembershipConfig membershipConfig = new GroupMembershipConfig();

public ClusterConfig() {
try {
Expand Down Expand Up @@ -90,7 +90,7 @@ public ClusterConfig setLocalMember(MemberConfig localMember) {
*
* @return the cluster nodes
*/
public Collection<MemberConfig> getMembers() {
public Map<String, MemberConfig> getMembers() {
return members;
}

Expand All @@ -100,11 +100,23 @@ public Collection<MemberConfig> getMembers() {
* @param members the cluster nodes
* @return the cluster configuration
*/
public ClusterConfig setMembers(Collection<MemberConfig> members) {
public ClusterConfig setMembers(Map<String, MemberConfig> members) {
members.forEach((id, member) -> member.setId(id));
this.members = members;
return this;
}

/**
* Adds a member to the configuration.
*
* @param member the member to add
* @return the cluster configuration
*/
public ClusterConfig addMember(MemberConfig member) {
members.put(member.getId().id(), member);
return this;
}

/**
* Returns whether multicast is enabled.
*
Expand Down Expand Up @@ -150,18 +162,18 @@ public ClusterConfig setMulticastAddress(Address multicastAddress) {
*
* @return the group membership configuration
*/
public GroupMembershipConfig getMembership() {
return membership;
public GroupMembershipConfig getMembershipConfig() {
return membershipConfig;
}

/**
* Sets the group membership configuration.
*
* @param membership the group membership configuration
* @param membershipConfig the group membership configuration
* @return the cluster configuration
*/
public ClusterConfig setMembership(GroupMembershipConfig membership) {
this.membership = membership;
public ClusterConfig setMembershipConfig(GroupMembershipConfig membershipConfig) {
this.membershipConfig = membershipConfig;
return this;
}
}
Expand Up @@ -58,7 +58,7 @@ public void testEnvFile() throws Exception {
File file = new File(getClass().getClassLoader().getResource("env.yaml").getFile());
assertTrue(provider.isConfigFile(file));
AtomixConfig config = provider.load(file, AtomixConfig.class);
assertEquals("test", config.getPartitionGroups().iterator().next().getName());
assertEquals("test", config.getPartitionGroups().values().iterator().next().getName());
}

@Test
Expand All @@ -67,8 +67,8 @@ public void testEnvString() throws Exception {
ConfigProvider provider = new JacksonConfigProvider();
File file = new File(getClass().getClassLoader().getResource("env.yaml").getFile());
AtomixConfig config = provider.load(IOUtils.toString(file.toURI(), StandardCharsets.UTF_8), AtomixConfig.class);
assertEquals("test", config.getPartitionGroups().iterator().next().getName());
assertEquals(3, config.getPartitionGroups().iterator().next().getPartitions());
assertEquals("test", config.getPartitionGroups().values().iterator().next().getName());
assertEquals(3, config.getPartitionGroups().values().iterator().next().getPartitions());
}

@Test
Expand All @@ -78,7 +78,7 @@ public void testSystemPropertyFile() throws Exception {
File file = new File(getClass().getClassLoader().getResource("sys.yaml").getFile());
assertTrue(provider.isConfigFile(file));
AtomixConfig config = provider.load(file, AtomixConfig.class);
assertEquals("test", config.getPartitionGroups().iterator().next().getName());
assertEquals("test", config.getPartitionGroups().values().iterator().next().getName());
}

@Test
Expand All @@ -88,6 +88,6 @@ public void testSystemPropertyString() throws Exception {
File file = new File(getClass().getClassLoader().getResource("sys.yaml").getFile());
assertTrue(provider.isConfigFile(file));
AtomixConfig config = provider.load(IOUtils.toString(file.toURI(), StandardCharsets.UTF_8), AtomixConfig.class);
assertEquals("test", config.getPartitionGroups().iterator().next().getName());
assertEquals("test", config.getPartitionGroups().values().iterator().next().getName());
}
}
2 changes: 1 addition & 1 deletion config/src/test/resources/config.json
Expand Up @@ -11,7 +11,7 @@
"serializer": {
"types": [
{
"type": "io.atomix.cluster.NodeId"
"type": "io.atomix.cluster.MemberId"
}
]
}
Expand Down
7 changes: 2 additions & 5 deletions config/src/test/resources/config.yaml
Expand Up @@ -3,14 +3,11 @@ cluster:
primitive-types:
- io.atomix.core.map.ConsistentMapType
partition-groups:
- name: foo
foo:
type: multi-primary
member-filter:
type: tag
tag: test
primitives:
foo:
type: consistent-map
serializer:
types:
- type: io.atomix.cluster.NodeId
- type: io.atomix.cluster.MemberId
16 changes: 7 additions & 9 deletions core/src/main/java/io/atomix/core/Atomix.java
Expand Up @@ -43,7 +43,6 @@
import io.atomix.primitive.PrimitiveTypeRegistry;
import io.atomix.primitive.partition.ManagedPartitionGroup;
import io.atomix.primitive.partition.ManagedPartitionService;
import io.atomix.primitive.partition.PartitionGroup;
import io.atomix.primitive.partition.PartitionGroupConfig;
import io.atomix.primitive.partition.PartitionGroups;
import io.atomix.primitive.partition.PartitionService;
Expand All @@ -66,7 +65,6 @@
import java.util.concurrent.CompletableFuture;
import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.stream.Collectors;

import static com.google.common.base.MoreObjects.toStringHelper;
import static com.google.common.base.Preconditions.checkNotNull;
Expand Down Expand Up @@ -362,7 +360,7 @@ private static AtomixConfig loadConfig(File config) {
* Builds the core partition group.
*/
private static ManagedPartitionGroup buildSystemPartitionGroup(AtomixConfig config) {
return config.getSystemPartitionGroup() != null ? PartitionGroups.createGroup(config.getSystemPartitionGroup()) : null;
return config.getManagementGroup() != null ? PartitionGroups.createGroup(config.getManagementGroup()) : null;
}

/**
Expand All @@ -374,7 +372,7 @@ private static ManagedPartitionService buildPartitionService(
ClusterMessagingService messagingService,
PrimitiveTypeRegistry primitiveTypeRegistry) {
List<ManagedPartitionGroup> partitionGroups = new ArrayList<>();
for (PartitionGroupConfig partitionGroupConfig : config.getPartitionGroups()) {
for (PartitionGroupConfig partitionGroupConfig : config.getPartitionGroups().values()) {
partitionGroups.add(PartitionGroups.createGroup(partitionGroupConfig));
}
return new DefaultPartitionService(clusterMembershipService, messagingService, primitiveTypeRegistry, buildSystemPartitionGroup(config), partitionGroups);
Expand Down Expand Up @@ -448,13 +446,13 @@ public Builder addProfile(Profile profile) {
}

/**
* Sets the system partition group.
* Sets the system management partition group.
*
* @param systemPartitionGroup the system partition group
* @param systemManagementGroup the system management partition group
* @return the Atomix builder
*/
public Builder withSystemPartitionGroup(ManagedPartitionGroup systemPartitionGroup) {
config.setSystemPartitionGroup(systemPartitionGroup.config());
public Builder withManagementGroup(ManagedPartitionGroup systemManagementGroup) {
config.setManagementGroup(systemManagementGroup.config());
return this;
}

Expand All @@ -477,7 +475,7 @@ public Builder withPartitionGroups(ManagedPartitionGroup... partitionGroups) {
* @throws NullPointerException if the partition groups are null
*/
public Builder withPartitionGroups(Collection<ManagedPartitionGroup> partitionGroups) {
config.setPartitionGroups(partitionGroups.stream().map(PartitionGroup::config).collect(Collectors.toList()));
partitionGroups.forEach(group -> config.addPartitionGroup(group.config()));
return this;
}

Expand Down
30 changes: 17 additions & 13 deletions core/src/main/java/io/atomix/core/AtomixConfig.java
Expand Up @@ -36,10 +36,12 @@
* Atomix configuration.
*/
public class AtomixConfig implements Config {
private static final String MANAGEMENT_GROUP_NAME = "system";

private ClusterConfig cluster = new ClusterConfig();
private boolean enableShutdownHook;
private PartitionGroupConfig systemPartitionGroup;
private Collection<PartitionGroupConfig> partitionGroups = new ArrayList<>();
private PartitionGroupConfig managementGroup;
private Map<String, PartitionGroupConfig> partitionGroups = new HashMap<>();
private Collection<Class<? extends PrimitiveType>> types = new ArrayList<>();
private Map<String, PrimitiveConfig> primitives = new HashMap<>();
private List<Profile> profiles = new ArrayList<>();
Expand Down Expand Up @@ -85,22 +87,23 @@ public AtomixConfig setEnableShutdownHook(boolean enableShutdownHook) {
}

/**
* Returns the system partition group.
* Returns the system management partition group.
*
* @return the system partition group
* @return the system management partition group
*/
public PartitionGroupConfig getSystemPartitionGroup() {
return systemPartitionGroup;
public PartitionGroupConfig getManagementGroup() {
return managementGroup;
}

/**
* Sets the system partition group.
* Sets the system management partition group.
*
* @param systemPartitionGroup the system partition group
* @param managementGroup the system management partition group
* @return the Atomix configuration
*/
public AtomixConfig setSystemPartitionGroup(PartitionGroupConfig systemPartitionGroup) {
this.systemPartitionGroup = systemPartitionGroup;
public AtomixConfig setManagementGroup(PartitionGroupConfig managementGroup) {
managementGroup.setName(MANAGEMENT_GROUP_NAME);
this.managementGroup = managementGroup;
return this;
}

Expand All @@ -109,7 +112,7 @@ public AtomixConfig setSystemPartitionGroup(PartitionGroupConfig systemPartition
*
* @return the partition group configurations
*/
public Collection<PartitionGroupConfig> getPartitionGroups() {
public Map<String, PartitionGroupConfig> getPartitionGroups() {
return partitionGroups;
}

Expand All @@ -119,7 +122,8 @@ public Collection<PartitionGroupConfig> getPartitionGroups() {
* @param partitionGroups the partition group configurations
* @return the Atomix configuration
*/
public AtomixConfig setPartitionGroups(Collection<PartitionGroupConfig> partitionGroups) {
public AtomixConfig setPartitionGroups(Map<String, PartitionGroupConfig> partitionGroups) {
partitionGroups.forEach((name, group) -> group.setName(name));
this.partitionGroups = partitionGroups;
return this;
}
Expand All @@ -131,7 +135,7 @@ public AtomixConfig setPartitionGroups(Collection<PartitionGroupConfig> partitio
* @return the Atomix configuration
*/
public AtomixConfig addPartitionGroup(PartitionGroupConfig partitionGroup) {
partitionGroups.add(partitionGroup);
partitionGroups.put(partitionGroup.getName(), partitionGroup);
return this;
}

Expand Down

0 comments on commit 08cd0ac

Please sign in to comment.