package io.airlift.airship.coordinator; import com.google.common.base.Function; import com.google.common.base.Preconditions; import com.google.common.collect.ImmutableList; import com.google.common.collect.ImmutableMap; import com.google.common.collect.Iterables; import io.airlift.airship.shared.AgentLifecycleState; import io.airlift.airship.shared.AgentStatus; import io.airlift.airship.shared.CoordinatorLifecycleState; import io.airlift.airship.shared.CoordinatorStatus; import io.airlift.airship.shared.SlotStatus; import java.net.URI; import java.util.List; import java.util.Map; import java.util.UUID; import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.atomic.AtomicInteger; public class MockProvisioner implements Provisioner { private final Map<String, CoordinatorStatus> coordinators = new ConcurrentHashMap<>(); private final Map<String, AgentStatus> agents = new ConcurrentHashMap<>(); private final RemoteCoordinatorFactory coordinatorFactory = new MockRemoteCoordinatorFactory(coordinators); private final RemoteAgentFactory agentFactory = new MockRemoteAgentFactory(agents); private final AtomicInteger nextInstanceId = new AtomicInteger(); public RemoteCoordinatorFactory getCoordinatorFactory() { return coordinatorFactory; } public RemoteAgentFactory getAgentFactory() { return agentFactory; } public void addCoordinators(CoordinatorStatus... instances) { addCoordinators(ImmutableList.copyOf(instances)); } public void addCoordinators(Iterable<CoordinatorStatus> coordinatorStatuses) { for (CoordinatorStatus coordinatorStatus : coordinatorStatuses) { coordinators.put(coordinatorStatus.getInstanceId(), coordinatorStatus); } } public void removeCoordinators(String... coordinatorIds) { removeCoordinators(ImmutableList.copyOf(coordinatorIds)); } public void removeCoordinators(Iterable<String> coordinatorIds) { for (String coordinatorId : coordinatorIds) { coordinators.remove(coordinatorId); } } public void clearCoordinators() { coordinators.clear(); } @Override public List<Instance> listCoordinators() { return ImmutableList.copyOf(Iterables.transform(coordinators.values(), new Function<CoordinatorStatus, Instance>() { @Override public Instance apply(CoordinatorStatus coordinatorStatus) { return new Instance(coordinatorStatus.getInstanceId(), coordinatorStatus.getInstanceType(), coordinatorStatus.getLocation(), coordinatorStatus.getInternalUri(), coordinatorStatus.getExternalUri()); } })); } @Override public List<Instance> provisionCoordinators(String coordinatorConfigSpec, int coordinatorCount, String instanceType, String availabilityZone, String ami, String keyPair, String securityGroup, String provisioningScriptsArtifact) { ImmutableList.Builder<Instance> instances = ImmutableList.builder(); for (int i = 0; i < coordinatorCount; i++) { String coordinatorInstanceId = String.format("i-%05d", nextInstanceId.incrementAndGet()); String location = String.format("/mock/%s/coordinator", coordinatorInstanceId); CoordinatorStatus coordinatorStatus = new CoordinatorStatus(null, CoordinatorLifecycleState.PROVISIONING, coordinatorInstanceId, null, null, location, instanceType); instances.add(new Instance(coordinatorStatus.getInstanceId(), coordinatorStatus.getInstanceType(), coordinatorStatus.getLocation(), null, null)); addCoordinators(coordinatorStatus); } return instances.build(); } public CoordinatorStatus startCoordinator(String instanceId) { CoordinatorStatus coordinatorStatus = coordinators.get(instanceId); Preconditions.checkNotNull(coordinatorStatus, "coordinatorStatus is null"); String coordinatorId = UUID.randomUUID().toString(); URI internalUri = URI.create("fake:/" + coordinatorId + "/internal"); URI externalUri = URI.create("fake:/" + coordinatorId + "/external"); CoordinatorStatus newCoordinatorStatus = new CoordinatorStatus(coordinatorId, CoordinatorLifecycleState.ONLINE, instanceId, internalUri, externalUri, coordinatorStatus.getLocation(), coordinatorStatus.getInstanceType()); coordinators.put(instanceId, newCoordinatorStatus); return newCoordinatorStatus; } public void addAgent(String id, URI agentUri) { addAgent(id, agentUri, ImmutableMap.<String, Integer>of()); } public void addAgent(String id, URI agentUri, Map<String, Integer> resources) { String agentInstanceId = String.format("i-%05d", nextInstanceId.incrementAndGet()); String location = String.format("/mock/%s/agent", agentInstanceId); addAgents(new AgentStatus(id, agentUri != null ? AgentLifecycleState.ONLINE : AgentLifecycleState.OFFLINE, agentInstanceId, agentUri, agentUri, location, "unknown", ImmutableList.<SlotStatus>of(), resources)); } public void addAgents(AgentStatus... agentStatuses) { addAgents(ImmutableList.copyOf(agentStatuses)); } public void addAgents(Iterable<AgentStatus> agentStatuses) { for (AgentStatus agentStatus : agentStatuses) { agents.put(agentStatus.getInstanceId(), agentStatus); } } public void removeAgents(String... instanceIds) { removeAgents(ImmutableList.copyOf(instanceIds)); } public void removeAgents(Iterable<String> instanceIds) { for (String instanceId : instanceIds) { agents.remove(instanceId); } } public void clearAgents() { agents.clear(); } @Override public List<Instance> listAgents() { return ImmutableList.copyOf(Iterables.transform(agents.values(), new Function<AgentStatus, Instance>() { @Override public Instance apply(AgentStatus agentStatus) { return new Instance(agentStatus.getInstanceId(), agentStatus.getInstanceType(), agentStatus.getLocation(), agentStatus.getInternalUri(), agentStatus.getExternalUri()); } })); } @Override public List<Instance> provisionAgents(String agentConfig, int agentCount, String instanceType, String availabilityZone, String ami, String keyPair, String securityGroup, String provisioningScriptsArtifact) { if (instanceType == null) { instanceType = "default"; } ImmutableList.Builder<Instance> instances = ImmutableList.builder(); for (int i = 0; i < agentCount; i++) { String agentInstanceId = String.format("i-%05d", nextInstanceId.incrementAndGet()); String location = String.format("/mock/%s/agent", agentInstanceId); AgentStatus agentStatus = new AgentStatus(null, AgentLifecycleState.PROVISIONING, agentInstanceId, null, null, location, instanceType, ImmutableList.<SlotStatus>of(), ImmutableMap.<String, Integer>of()); instances.add(new Instance(agentStatus.getInstanceId(), agentStatus.getInstanceType(), agentStatus.getLocation(), null, null)); addAgents(agentStatus); } return instances.build(); } @Override public void terminateAgents(Iterable<String> instanceIds) { removeAgents(instanceIds); } public AgentStatus startAgent(String instanceId) { AgentStatus agentStatus = agents.get(instanceId); Preconditions.checkNotNull(agentStatus, "agentStatus is null"); String agentId = UUID.randomUUID().toString(); URI internalUri = URI.create("fake:/" + agentId + "/internal"); URI externalUri = URI.create("fake:/" + agentId + "/external"); AgentStatus newAgentStatus = new AgentStatus(agentId, AgentLifecycleState.ONLINE, instanceId, internalUri, externalUri, agentStatus.getLocation(), agentStatus.getInstanceType(), agentStatus.getSlotStatuses(), agentStatus.getResources()); agents.put(instanceId, newAgentStatus); return newAgentStatus; } }