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 com.google.common.util.concurrent.Futures;
import com.google.common.util.concurrent.ListenableFuture;
import io.airlift.airship.shared.AgentLifecycleState;
import io.airlift.airship.shared.AgentStatus;
import io.airlift.airship.shared.Installation;
import io.airlift.airship.shared.SlotLifecycleState;
import io.airlift.airship.shared.SlotStatus;
import io.airlift.discovery.client.ServiceDescriptor;
import java.net.URI;
import java.util.List;
import java.util.Map;
import java.util.UUID;
import static com.google.common.base.Preconditions.checkNotNull;
import static io.airlift.airship.shared.AgentLifecycleState.OFFLINE;
import static io.airlift.airship.shared.HttpUriBuilder.uriBuilderFrom;
import static io.airlift.airship.shared.SlotStatus.createSlotStatus;
public class MockRemoteAgent
implements RemoteAgent
{
private final String instanceId;
private final Map<String, AgentStatus> agents;
public MockRemoteAgent(String instanceId, Map<String, AgentStatus> agents)
{
this.instanceId = instanceId;
this.agents = agents;
}
@Override
public synchronized AgentStatus status()
{
return getAgentStatus();
}
@Override
public synchronized void setInternalUri(URI internalUri)
{
setAgentStatus(getAgentStatus().changeInternalUri(internalUri));
}
@Override
public synchronized List<? extends RemoteSlot> getSlots()
{
return ImmutableList.copyOf(Iterables.transform(getAgentStatus().getSlotStatuses(), new Function<SlotStatus, MockRemoteSlot>()
{
@Override
public MockRemoteSlot apply(SlotStatus slotStatus)
{
return new MockRemoteSlot(slotStatus, MockRemoteAgent.this);
}
}));
}
@Override
public synchronized ListenableFuture<?> updateStatus()
{
return Futures.immediateFuture(null);
}
synchronized void setSlotStatus(SlotStatus slotStatus)
{
AgentStatus agentStatus = getAgentStatus().changeSlotStatus(slotStatus);
setAgentStatus(agentStatus);
}
@Override
public synchronized void setServiceInventory(List<ServiceDescriptor> serviceInventory)
{
}
@Override
public synchronized SlotStatus install(Installation installation)
{
checkNotNull(installation, "installation is null");
AgentStatus agentStatus = getAgentStatus();
Preconditions.checkState(agentStatus.getState() != OFFLINE, "agent is offline");
UUID slotId = UUID.randomUUID();
SlotStatus slotStatus = createSlotStatus(slotId,
uriBuilderFrom(agentStatus.getInternalUri()).appendPath("slot").appendPath(slotId.toString()).build(),
uriBuilderFrom(agentStatus.getExternalUri()).appendPath("slot").appendPath(slotId.toString()).build(),
"instance",
"/location",
SlotLifecycleState.STOPPED,
installation.getAssignment(),
"/" + slotId,
installation.getResources());
agentStatus.changeSlotStatus(slotStatus);
return slotStatus;
}
public synchronized AgentStatus getAgentStatus()
{
AgentStatus agentStatus = agents.get(instanceId);
if (agentStatus != null) {
return agentStatus;
}
else {
return new AgentStatus(null,
AgentLifecycleState.OFFLINE,
instanceId,
null,
null,
null,
null,
ImmutableList.<SlotStatus>of(),
ImmutableMap.<String, Integer>of());
}
}
public synchronized void setAgentStatus(AgentStatus agentStatus)
{
Preconditions.checkNotNull(agentStatus, "agentStatus is null");
agents.put(instanceId, agentStatus);
}
}