package com.github.dockerjava.netty.exec;
import static org.hamcrest.MatcherAssert.assertThat;
import static org.hamcrest.Matchers.lessThanOrEqualTo;
import static org.hamcrest.Matchers.notNullValue;
import java.lang.reflect.Method;
import org.testng.ITestResult;
import org.testng.annotations.AfterMethod;
import org.testng.annotations.AfterTest;
import org.testng.annotations.BeforeMethod;
import org.testng.annotations.BeforeTest;
import org.testng.annotations.Test;
import com.github.dockerjava.api.async.ResultCallback;
import com.github.dockerjava.api.command.InspectImageResponse;
import com.github.dockerjava.api.command.PullImageCmd;
import com.github.dockerjava.api.exception.NotFoundException;
import com.github.dockerjava.api.model.Info;
import com.github.dockerjava.api.model.PullResponseItem;
import com.github.dockerjava.core.command.PullImageCmdImpl;
import com.github.dockerjava.core.command.PullImageResultCallback;
import com.github.dockerjava.netty.AbstractNettyDockerClientTest;
@Test(groups = "integration")
public class PullImageCmdExecTest extends AbstractNettyDockerClientTest {
private static final PullImageCmd.Exec NOP_EXEC = new PullImageCmd.Exec() {
public Void exec(PullImageCmd command, ResultCallback<PullResponseItem> resultCallback) {
return null;
};
};
@BeforeTest
public void beforeTest() throws Exception {
super.beforeTest();
}
@AfterTest
public void afterTest() {
super.afterTest();
}
@BeforeMethod
public void beforeMethod(Method method) {
super.beforeMethod(method);
}
@AfterMethod
public void afterMethod(ITestResult result) {
super.afterMethod(result);
}
@Test
public void nullAuthConfig() throws Exception {
PullImageCmdImpl pullImageCmd = new PullImageCmdImpl(NOP_EXEC, null, "");
try {
pullImageCmd.withAuthConfig(null);
fail();
} catch (Exception e) {
assertEquals(e.getMessage(), "authConfig was not specified");
} finally {
pullImageCmd.close();
}
}
@Test
public void testPullImage() throws Exception {
Info info = dockerClient.infoCmd().exec();
LOG.info("Client info: {}", info.toString());
int imgCount = info.getImages();
LOG.info("imgCount1: {}", imgCount);
// This should be an image that is not used by other repositories
// already
// pulled down, preferably small in size. If tag is not used pull will
// download all images in that repository but tmpImgs will only
// deleted 'latest' image but not images with other tags
String testImage = "hackmann/empty";
LOG.info("Removing image: {}", testImage);
try {
dockerClient.removeImageCmd(testImage).withForce(true).exec();
} catch (NotFoundException e) {
// just ignore if not exist
}
info = dockerClient.infoCmd().exec();
LOG.info("Client info: {}", info.toString());
imgCount = info.getImages();
LOG.info("imgCount2: {}", imgCount);
LOG.info("Pulling image: {}", testImage);
dockerClient.pullImageCmd(testImage).exec(new PullImageResultCallback()).awaitSuccess();
info = dockerClient.infoCmd().exec();
LOG.info("Client info after pull, {}", info.toString());
assertThat(imgCount, lessThanOrEqualTo(info.getImages()));
InspectImageResponse inspectImageResponse = dockerClient.inspectImageCmd(testImage).exec();
LOG.info("Image Inspect: {}", inspectImageResponse.toString());
assertThat(inspectImageResponse, notNullValue());
}
@Test
public void testPullNonExistingImage() throws Exception {
// does not throw an exception
// stream needs to be fully read in order to close the underlying connection
dockerClient.pullImageCmd("xvxcv/foo").exec(new PullImageResultCallback()).awaitCompletion();
}
}