package org.alien4cloud.tosca.editor.processors.groups;
import java.util.List;
import java.util.Map;
import java.util.Set;
import alien4cloud.exception.InvalidNameException;
import org.alien4cloud.tosca.editor.EditionContextManager;
import org.alien4cloud.tosca.editor.operations.groups.AddGroupMemberOperation;
import org.alien4cloud.tosca.editor.processors.nodetemplate.AbstractNodeProcessor;
import org.alien4cloud.tosca.model.templates.*;
import org.springframework.stereotype.Component;
import com.google.common.collect.Lists;
import com.google.common.collect.Maps;
import com.google.common.collect.Sets;
import alien4cloud.exception.AlreadyExistException;
import alien4cloud.topology.TopologyUtils;
/**
* Process the addition to a node template to a group. If the group does not exists, it is created.
*/
@Component
public class AddGroupMemberProcessor extends AbstractNodeProcessor<AddGroupMemberOperation> {
@Override
protected void processNodeOperation(AddGroupMemberOperation operation, NodeTemplate nodeTemplate) {
Topology topology = EditionContextManager.getTopology();
// Ensure that the group exist and create it if not.
Map<String, NodeGroup> groups = topology.getGroups();
if (groups == null) {
groups = Maps.newHashMap();
topology.setGroups(groups);
}
NodeGroup nodeGroup = groups.get(operation.getGroupName());
if (nodeGroup == null) {
// If we create the group then check that the name is valid
if (!operation.getGroupName().matches("\\w+")) {
throw new InvalidNameException("groupName", operation.getGroupName(), "\\w+");
}
nodeGroup = new NodeGroup();
nodeGroup.setName(operation.getGroupName());
nodeGroup.setIndex(TopologyUtils.getAvailableGroupIndex(topology));
Set<String> members = Sets.newHashSet();
nodeGroup.setMembers(members);
List<AbstractPolicy> policies = Lists.newArrayList();
// For the moment, groups are created only for HA
AbstractPolicy policy = new HaPolicy();
policy.setName("High Availability");
policies.add(policy);
nodeGroup.setPolicies(policies);
groups.put(operation.getGroupName(), nodeGroup);
}
// Add the node to the group and mark the node as member of the group.
if (nodeTemplate.getGroups() == null) {
nodeTemplate.setGroups(Sets.<String> newHashSet());
}
if (nodeGroup.getMembers().contains(operation.getNodeName())) {
throw new AlreadyExistException("Node <" + operation.getNodeName() + "> is already member of group <" + operation.getGroupName() + ">.");
}
nodeTemplate.getGroups().add(operation.getGroupName());
nodeGroup.getMembers().add(operation.getNodeName());
}
}