use of com.spotify.docker.client.exceptions.DockerTimeoutException in project linuxtools by eclipse.
the class DockerConnection method getContainerIdsWithLabels.
public Set<String> getContainerIdsWithLabels(Map<String, String> labels) throws DockerException {
Set<String> labelSet = new HashSet<>();
try {
final List<Container> nativeContainers = new ArrayList<>();
synchronized (clientLock) {
// containers list left in the queue
if (client == null) {
// there's no client.
return Collections.emptySet();
}
DockerClient clientCopy = getClientCopy();
DockerClient.ListContainersParam[] parms = new DockerClient.ListContainersParam[2];
parms[0] = DockerClient.ListContainersParam.allContainers();
// DockerClient doesn't support multiple labels with its
// ListContainersParam so we have
// to do a kludge and put in control chars ourselves and pretend
// we have a label with no value.
// $NON-NLS-1$
String separator = "";
StringBuffer labelString = new StringBuffer();
for (Entry<String, String> entry : labels.entrySet()) {
labelString.append(separator);
if (// $NON-NLS-1$
entry.getValue() == null || "".equals(entry.getValue()))
labelString.append(entry.getKey());
else {
labelString.append(// $NON-NLS-1$
entry.getKey() + "=" + entry.getValue());
}
// $NON-NLS-1$
separator = "\",\"";
}
parms[1] = DockerClient.ListContainersParam.withLabel(labelString.toString());
nativeContainers.addAll(clientCopy.listContainers(parms));
}
// Containers
for (Container nativeContainer : nativeContainers) {
labelSet.add(nativeContainer.id());
}
} catch (DockerTimeoutException e) {
if (isOpen()) {
Activator.log(new Status(IStatus.WARNING, Activator.PLUGIN_ID, Messages.Docker_Connection_Timeout, e));
close();
}
} catch (com.spotify.docker.client.exceptions.DockerException | InterruptedException e) {
if (isOpen() && e.getCause() != null && e.getCause().getCause() != null && e.getCause().getCause() instanceof ProcessingException) {
close();
} else {
throw new DockerException(e.getMessage());
}
}
return labelSet;
}
use of com.spotify.docker.client.exceptions.DockerTimeoutException in project helios by spotify.
the class TaskRunnerTest method testPullTimeoutVariation.
@Test
public void testPullTimeoutVariation() throws Throwable {
doThrow(new DockerTimeoutException("x", new URI("http://example.com"), null)).when(mockDocker).pull(IMAGE);
doThrow(new ImageNotFoundException("not found")).when(mockDocker).inspectImage(IMAGE);
final TaskRunner tr = TaskRunner.builder().delayMillis(0).config(TaskConfig.builder().namespace("test").host(HOST).job(JOB).containerDecorators(ImmutableList.of(containerDecorator)).build()).docker(mockDocker).listener(new TaskRunner.NopListener()).build();
tr.run();
try {
tr.resultFuture().get();
fail("this should throw");
} catch (Exception t) {
assertTrue(t instanceof ExecutionException);
assertEquals(ImagePullFailedException.class, t.getCause().getClass());
}
}
use of com.spotify.docker.client.exceptions.DockerTimeoutException in project linuxtools by eclipse.
the class DockerConnection method listContainers.
private List<IDockerContainer> listContainers() throws DockerException {
final Map<String, IDockerContainer> updatedContainersById = new HashMap<>();
List<IDockerContainer> sortedContainers;
synchronized (containerLock) {
try {
final List<Container> nativeContainers = new ArrayList<>();
synchronized (clientLock) {
// containers list left in the queue
if (client == null) {
// there's no client.
return Collections.emptyList();
}
nativeContainers.addAll(client.listContainers(DockerClient.ListContainersParam.allContainers()));
}
// in the future.
for (Container nativeContainer : nativeContainers) {
// them with a logging thread.
if (nativeContainer.status() != null && nativeContainer.status().startsWith(Messages.Exited_specifier)) {
synchronized (loggingThreads) {
if (loggingThreads.containsKey(nativeContainer.id())) {
loggingThreads.get(nativeContainer.id()).requestStop();
loggingThreads.remove(nativeContainer.id());
}
}
}
// skip containers that are being removed
if (nativeContainer.status() != null && nativeContainer.status().equals(Messages.Removal_In_Progress_specifier)) {
continue;
}
// re-use info from existing container with same id
if (this.containers != null && this.containersById.containsKey(nativeContainer.id())) {
final IDockerContainer container = this.containersById.get(nativeContainer.id());
updatedContainersById.put(nativeContainer.id(), new DockerContainer(this, nativeContainer, container.info()));
} else {
updatedContainersById.put(nativeContainer.id(), new DockerContainer(this, nativeContainer));
}
}
} catch (DockerTimeoutException e) {
if (isOpen()) {
Activator.log(new Status(IStatus.WARNING, Activator.PLUGIN_ID, Messages.Docker_Connection_Timeout, e));
close();
}
} catch (com.spotify.docker.client.exceptions.DockerException | InterruptedException e) {
if (isOpen() && e.getCause() != null && e.getCause().getCause() != null && e.getCause().getCause() instanceof ProcessingException) {
close();
} else {
throw new DockerException(e.getMessage());
}
} finally {
this.containersById = updatedContainersById;
sortedContainers = sort(updatedContainersById.values(), (container, otherContainer) -> container.name().compareTo(otherContainer.name()));
this.containers = sortedContainers;
}
}
// perform notification outside of containerLock so we don't have a View
// causing a deadlock
// TODO: we should probably notify the listeners only if the containers
// list changed.
notifyContainerListeners(sortedContainers);
return sortedContainers;
}
use of com.spotify.docker.client.exceptions.DockerTimeoutException in project docker-client by spotify.
the class DefaultDockerClient method propagate.
private RuntimeException propagate(final String method, final WebTarget resource, final Exception ex) throws DockerException, InterruptedException {
Throwable cause = ex.getCause();
// So we unpack it here.
if (ex instanceof MultiException) {
cause = cause.getCause();
}
Response response = null;
if (cause instanceof ResponseProcessingException) {
response = ((ResponseProcessingException) cause).getResponse();
} else if (cause instanceof WebApplicationException) {
response = ((WebApplicationException) cause).getResponse();
} else if ((cause instanceof ProcessingException) && (cause.getCause() != null)) {
// For a ProcessingException, The exception message or nested Throwable cause SHOULD contain
// additional information about the reason of the processing failure.
cause = cause.getCause();
}
if (response != null) {
throw new DockerRequestException(method, resource.getUri(), response.getStatus(), message(response), cause);
} else if ((cause instanceof SocketTimeoutException) || (cause instanceof ConnectTimeoutException)) {
throw new DockerTimeoutException(method, resource.getUri(), ex);
} else if ((cause instanceof InterruptedIOException) || (cause instanceof InterruptedException)) {
throw new InterruptedException("Interrupted: " + method + " " + resource);
} else {
throw new DockerException(ex);
}
}
use of com.spotify.docker.client.exceptions.DockerTimeoutException in project helios by spotify.
the class TaskRunner method pullImage.
private void pullImage(final String image) throws DockerException, InterruptedException {
listener.pulling();
DockerTimeoutException wasTimeout = null;
final Stopwatch pullTime = Stopwatch.createStarted();
// Attempt to pull. Failure, while less than ideal, is ok.
try {
docker.pull(image);
listener.pulled();
log.info("Pulled image {} in {}s", image, pullTime.elapsed(SECONDS));
} catch (DockerTimeoutException e) {
log.warn("Pulling image {} failed with timeout after {}s", image, pullTime.elapsed(SECONDS), e);
listener.pullFailed();
wasTimeout = e;
} catch (DockerException e) {
log.warn("Pulling image {} failed after {}s", image, pullTime.elapsed(SECONDS), e);
listener.pullFailed();
}
try {
// If we don't have the image by now, fail.
docker.inspectImage(image);
} catch (ImageNotFoundException e) {
// to know, as the pull should have fixed the not found-ness.
if (wasTimeout != null) {
throw new ImagePullFailedException("Failed pulling image " + image + " because of timeout", wasTimeout);
}
throw e;
}
}
Aggregations