@Override public AgentStatus status() { AgentStatus agentStatus = agent.getAgentStatus(); return new AgentStatus(agentStatus.getAgentId(), agentStatus.getState(), agentId, agentStatus.getInternalUri(), agentStatus.getExternalUri(), agentStatus.getLocation(), instanceType, agentStatus.getSlotStatuses(), agentStatus.getResources()); }
public AgentStatusRepresentation create(AgentStatus status) { Builder<SlotStatusRepresentation> builder = ImmutableList.builder(); for (SlotStatus slot : status.getSlotStatuses()) { builder.add(SlotStatusRepresentation.from(slot, Integer.MAX_VALUE, repository)); } return new AgentStatusRepresentation( status.getAgentId(), safeTruncate(status.getAgentId(), shortIdPrefixSize), status.getInstanceId(), status.getState(), status.getInternalUri(), status.getExternalUri(), status.getLocation(), trimLeadingSegments(status.getLocation(), '/', commonLocationParts), status.getInstanceType(), builder.build(), status.getResources(), status.getVersion()); } }
@Override public void onFailure(Throwable t) { // error talking to agent -- mark agent offline if (agentStatus.getState() != PROVISIONING && failureCount.incrementAndGet() > 5) { setStatus(agentStatus.changeState(OFFLINE).changeAllSlotsState(SlotLifecycleState.UNKNOWN)); } } });
public static String createAgentsVersion(Iterable<AgentStatus> agents) { Preconditions.checkNotNull(agents, "agents is null"); // canonicalize agent order Map<String, String> agentVersions = new TreeMap<String, String>(); for (AgentStatus agent : agents) { agentVersions.put(agent.getAgentId() + agent.getInstanceId(), agent.getVersion()); } return DigestUtils.md5Hex(agentVersions.values().toString()); }
assertNotNull(agents); assertEquals(agents.size(), 1); String instanceId = agents.get(0).getInstanceId(); assertNotNull(instanceId); String location = agents.get(0).getLocation(); assertNotNull(location); assertEquals(agents.get(0).getInstanceType(), instanceType); assertNull(agents.get(0).getAgentId()); assertNull(agents.get(0).getInternalUri()); assertNull(agents.get(0).getExternalUri()); assertEquals(agents.get(0).getState(), AgentLifecycleState.PROVISIONING); assertEquals(coordinator.getAgent(instanceId).getInstanceId(), instanceId); assertEquals(coordinator.getAgent(instanceId).getInstanceType(), instanceType); assertEquals(coordinator.getAgent(instanceId).getLocation(), location); assertNull(coordinator.getAgent(instanceId).getAgentId()); assertNull(coordinator.getAgent(instanceId).getInternalUri()); assertNull(coordinator.getAgent(instanceId).getExternalUri()); assertEquals(coordinator.getAgent(instanceId).getState(), AgentLifecycleState.PROVISIONING); assertEquals(coordinator.getAgent(instanceId).getInstanceId(), instanceId); assertEquals(coordinator.getAgent(instanceId).getInstanceType(), instanceType); assertEquals(coordinator.getAgent(instanceId).getLocation(), location); assertNull(coordinator.getAgent(instanceId).getAgentId()); assertNull(coordinator.getAgent(instanceId).getInternalUri()); assertNull(coordinator.getAgent(instanceId).getExternalUri()); assertEquals(coordinator.getAgent(instanceId).getState(), AgentLifecycleState.PROVISIONING); coordinator.updateAllAgentsAndWait();
Map<String, Integer> resources = ImmutableMap.of("cpu", 8, "memory", 1024); AgentStatus status = new AgentStatus(agentId, AgentLifecycleState.ONLINE, instanceId, assertEquals(coordinator.getAgents(), ImmutableList.of(status)); AgentStatus actual = coordinator.getAgents().get(0); assertEquals(actual.getAgentId(), agentId); assertEquals(actual.getState(), AgentLifecycleState.ONLINE); assertEquals(actual.getInstanceId(), instanceId); assertEquals(actual.getLocation(), location); assertEquals(actual.getInstanceType(), instanceType); assertEquals(actual.getInternalUri(), internalUri); assertEquals(actual.getExternalUri(), externalUri); assertEquals(actual.getResources(), resources);
@Override public Instance apply(AgentStatus agentStatus) { return new Instance(agentStatus.getInstanceId(), agentStatus.getInstanceType(), agentStatus.getLocation(), agentStatus.getInternalUri(), agentStatus.getExternalUri()); } }));
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; } }
public AgentStatus changeState(AgentLifecycleState state) { return new AgentStatus(agentId, state, instanceId, internalUri, externalUri, location, instanceType, slots.values(), resources); }
@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; }
String location = String.format("/mock/%s/agent", agentInstanceId); AgentStatus agentStatus = new AgentStatus(null, AgentLifecycleState.PROVISIONING, agentInstanceId, ImmutableMap.<String, Integer>of()); instances.add(new Instance(agentStatus.getInstanceId(), agentStatus.getInstanceType(), agentStatus.getLocation(), null, null));
@Override public SlotStatus install(Installation installation) { Preconditions.checkNotNull(installation, "installation is null"); AgentStatus agentStatus = status(); URI internalUri = agentStatus.getInternalUri(); Preconditions.checkState(internalUri != null, "agent is down"); try { Request request = Request.Builder.preparePost() .setUri(uriBuilderFrom(internalUri).replacePath("/v1/agent/slot/").build()) .setHeader(CONTENT_TYPE, APPLICATION_JSON) .setHeader(AIRSHIP_AGENT_VERSION_HEADER, status().getVersion()) .setBodyGenerator(jsonBodyGenerator(installationCodec, InstallationRepresentation.from(installation))) .build(); SlotStatusRepresentation slotStatusRepresentation = httpClient.execute(request, createJsonResponseHandler(slotStatusCodec, Status.CREATED.getStatusCode())); SlotStatus slotStatus = slotStatusRepresentation.toSlotStatus(agentStatus.getInstanceId()); setStatus(agentStatus.changeSlotStatus(slotStatus)); return slotStatus; } catch (Exception e) { throw Throwables.propagate(e); } } }
assertEquals(coordinator.getAgents().size(), 1); assertNotNull(coordinator.getAgent(agentServer.getInstanceId())); assertEquals(coordinator.getAgent(agentServer.getInstanceId()).getState(), AgentLifecycleState.ONLINE); assertNotNull(coordinator.getAgent(agentServer.getInstanceId()).getInternalUri()); assertNotNull(coordinator.getAgent(agentServer.getInstanceId()).getExternalUri());
@Override public boolean apply(@Nullable AgentStatus status) { // We can only install on online agents if ((status == null) || (status.getState() != ONLINE)) { return false; } // Constraints: normally we only allow only instance of a binary+config on each agent if (!allowDuplicateInstallationsOnAnAgent) { for (SlotStatus slot : status.getSlotStatuses()) { if ((slot.getAssignment() != null) && assignmentEqualsIgnoreVersion(slot.getAssignment())) { return false; } } } // agents without declared resources are considered to have unlimited resources if (!status.getResources().isEmpty()) { // verify that required resources are available Installation installation = toInstallation(repository, assignment); Map<String, Integer> availableResources = getAvailableResources(status); if (!resourcesAreAvailable(availableResources, installation.getResources())) { return false; } } return true; }
@Override public boolean apply(@Nullable AgentStatus agentStatus) { return agentStatus != null && (predicate.apply(agentStatus.getExternalUri()) || predicate.apply(agentStatus.getInternalUri())); } }
public AgentStatus terminateAgent(String agentId) { RemoteAgent agent = null; for (Iterator<Entry<String, RemoteAgent>> iterator = agents.entrySet().iterator(); iterator.hasNext(); ) { Entry<String, RemoteAgent> entry = iterator.next(); if (entry.getValue().status().getAgentId().equals(agentId)) { iterator.remove(); agent = entry.getValue(); break; } } if (agent == null) { return null; } if (!agent.getSlots().isEmpty()) { agents.putIfAbsent(agent.status().getInstanceId(), agent); throw new IllegalStateException("Cannot terminate agent that has slots: " + agentId); } provisioner.terminateAgents(ImmutableList.of(agentId)); return agent.status().changeState(AgentLifecycleState.TERMINATED); }
private List<ListenableFuture<?>> updateAllAgents() { Set<String> instanceIds = newHashSet(); for (Instance instance : this.provisioner.listAgents()) { instanceIds.add(instance.getInstanceId()); RemoteAgent remoteAgent = remoteAgentFactory.createRemoteAgent(instance, instance.getInternalUri() != null ? AgentLifecycleState.ONLINE : AgentLifecycleState.OFFLINE); RemoteAgent existing = agents.putIfAbsent(instance.getInstanceId(), remoteAgent); if (existing != null) { existing.setInternalUri(instance.getInternalUri()); } } // add provisioning agents to provisioner list for (RemoteAgent remoteAgent : agents.values()) { if (remoteAgent.status().getState() == AgentLifecycleState.PROVISIONING) { instanceIds.add(remoteAgent.status().getAgentId()); } } // remove any agents not in the provisioner list agents.keySet().retainAll(instanceIds); List<ListenableFuture<?>> futures = new ArrayList<>(); List<ServiceDescriptor> serviceDescriptors = serviceInventory.getServiceInventory(transform(getAllSlots(), getSlotStatus())); for (RemoteAgent remoteAgent : agents.values()) { futures.add(remoteAgent.updateStatus()); remoteAgent.setServiceInventory(serviceDescriptors); } return futures; }
if (agentStatus.getState() == ONLINE) { Preconditions.checkNotNull(serviceInventory, "serviceInventory is null"); final URI internalUri = agentStatus.getInternalUri(); Request request = Request.Builder.preparePut() .setUri(uriBuilderFrom(internalUri).replacePath("/v1/serviceInventory").build())
public static Map<String, Integer> getAvailableResources(AgentStatus agentStatus) { Map<String, Integer> availableResources = new TreeMap<String, Integer>(agentStatus.getResources()); for (SlotStatus slotStatus : agentStatus.getSlotStatuses()) { for (Entry<String, Integer> entry : slotStatus.getResources().entrySet()) { int value = Objects.firstNonNull(availableResources.get(entry.getKey()), 0); availableResources.put(entry.getKey(), value - entry.getValue()); } } return availableResources; }
@Override public void onSuccess(AgentStatusRepresentation result) { // todo deal with out of order responses setStatus(result.toAgentStatus(agentStatus.getInstanceId(), agentStatus.getInstanceType())); failureCount.set(0); }