diff --git a/src/main/java/net/wouterdanes/docker/maven/AbstractDockerMojo.java b/src/main/java/net/wouterdanes/docker/maven/AbstractDockerMojo.java index 9909a8f..4bafe8c 100644 --- a/src/main/java/net/wouterdanes/docker/maven/AbstractDockerMojo.java +++ b/src/main/java/net/wouterdanes/docker/maven/AbstractDockerMojo.java @@ -60,6 +60,7 @@ public abstract class AbstractDockerMojo extends AbstractMojo { private static final String BUILT_IMAGES_KEY = "builtImages"; private static final String PUSHABLE_IMAGES_KEY = "pushableImages"; private static final String ERRORS_KEY = "errors"; + protected static ArrayList imagesToDeleteAfterPush = new ArrayList<>(); @Component private RepositorySystem repositorySystem; @@ -224,10 +225,10 @@ protected DockerProvider getDockerProvider() { protected Credentials getCredentials() { // priority to credentials from plugin configuration over the ones from settings return Stream.of(getCredentialsFromParameters(), getCredentialsFromSettings()) - .filter(Optional::isPresent) - .map(Optional::get) - .findFirst() - .orElse(null); + .filter(Optional::isPresent) + .map(Optional::get) + .findFirst() + .orElse(null); } private Optional getCredentialsFromParameters() { @@ -240,12 +241,12 @@ private Optional getCredentialsFromParameters() { } private Optional getCredentialsFromSettings() { - if(settings == null) { + if (settings == null) { getLog().debug("No settings.xml"); return empty(); } Server server = settings.getServer(serverId); - if(server == null) { + if (server == null) { getLog().debug("Cannot find server " + serverId + " in Maven settings"); return empty(); } diff --git a/src/main/java/net/wouterdanes/docker/maven/BuildImageMojo.java b/src/main/java/net/wouterdanes/docker/maven/BuildImageMojo.java index a3c13b5..9137185 100644 --- a/src/main/java/net/wouterdanes/docker/maven/BuildImageMojo.java +++ b/src/main/java/net/wouterdanes/docker/maven/BuildImageMojo.java @@ -60,6 +60,9 @@ protected void doExecute() throws MojoExecutionException, MojoFailureException { String imageId = getDockerProvider().buildImage(image); getLog().info(String.format("Image '%s' has Id '%s'", image.getId(), imageId)); registerBuiltImage(imageId, image); + if (image.isPush() && !image.isKeep()) { + imagesToDeleteAfterPush.add(imageId); + } } catch (DockerException e) { String errorMessage = String.format("Cannot build image '%s'", image.getId()); handleDockerException(errorMessage, e); diff --git a/src/main/java/net/wouterdanes/docker/maven/PushImageMojo.java b/src/main/java/net/wouterdanes/docker/maven/PushImageMojo.java index ac58929..412eecd 100644 --- a/src/main/java/net/wouterdanes/docker/maven/PushImageMojo.java +++ b/src/main/java/net/wouterdanes/docker/maven/PushImageMojo.java @@ -50,6 +50,14 @@ public void doExecute() throws MojoExecutionException, MojoFailureException { handleDockerException(message, e); } } + + for (String imageID : imagesToDeleteAfterPush) { + try { + getDockerProvider().removeImage(imageID); + } catch (DockerException e) { + getLog().error("Failed to remove image", e); + } + } } private void ensureThatAllPushableImagesHaveAName() throws MojoFailureException { @@ -64,5 +72,4 @@ private void ensureThatAllPushableImagesHaveAName() throws MojoFailureException throw new MojoFailureException("There are images that need to be pushed without a name."); } } - } \ No newline at end of file diff --git a/src/test/java/net/wouterdanes/docker/maven/BuildImageMojoTest.java b/src/test/java/net/wouterdanes/docker/maven/BuildImageMojoTest.java index 43192da..1255f72 100644 --- a/src/test/java/net/wouterdanes/docker/maven/BuildImageMojoTest.java +++ b/src/test/java/net/wouterdanes/docker/maven/BuildImageMojoTest.java @@ -31,6 +31,7 @@ import java.util.*; +import static net.wouterdanes.docker.maven.AbstractDockerMojo.imagesToDeleteAfterPush; import static org.junit.Assert.*; import static org.mockito.Matchers.any; @@ -39,7 +40,9 @@ public class BuildImageMojoTest { private static final String FAKE_PROVIDER_KEY = UUID.randomUUID().toString(); private static final String IMAGEID = UUID.randomUUID().toString(); private static final String STARTID = UUID.randomUUID().toString(); + private static final String STARTIDTWO = UUID.randomUUID().toString(); private static final String NAMEANDTAG = UUID.randomUUID().toString(); + private static final String NAMEANDTAGTWO = UUID.randomUUID().toString(); private static final String REGISTRY = UUID.randomUUID().toString(); private static final String REGISTRYANDNAMEANDTAG = REGISTRY + "/" + NAMEANDTAG; @@ -49,6 +52,7 @@ public class BuildImageMojoTest { @Before public void setUp() throws Exception { + imagesToDeleteAfterPush = new ArrayList<>(); mojo.setPluginContext(new HashMap()); FakeDockerProvider.instance = Mockito.mock(FakeDockerProvider.class); @@ -70,6 +74,7 @@ public void setUp() throws Exception { @After public void tearDown() throws Exception { DockerProviderSupplier.removeProvider(FAKE_PROVIDER_KEY); + imagesToDeleteAfterPush = new ArrayList<>(); } @Test @@ -134,6 +139,76 @@ public void testThatTheMojoThrowsAnExceptionWhenDuplicateImageIdsExist() throws assertImageEnqueuedForPush(null); } + @Test + public void imageListPropertyNotSetWhenImageIsPushAndIsKeep() throws Exception { + Mockito.when(mockImage.isPush()).thenReturn(true); + Mockito.when(mockImage.isKeep()).thenReturn(true); + + executeMojo(FAKE_PROVIDER_KEY); + + assertEquals(1, mojo.getImagesToPush().size()); + + PushableImage actual = mojo.getImagesToPush().get(0); + + assertEquals(BuildImageMojoTest.IMAGEID, actual.getImageId()); + assertEquals(0, imagesToDeleteAfterPush.size()); + } + + @Test + public void imageListPropertyNotSetWhenImageIsNotPushAndIsNotKeep() throws Exception { + Mockito.when(mockImage.isPush()).thenReturn(false); + Mockito.when(mockImage.isKeep()).thenReturn(false); + + executeMojo(FAKE_PROVIDER_KEY); + + assertEquals(0, mojo.getImagesToPush().size()); + assertEquals(0, imagesToDeleteAfterPush.size()); + } + + @Test + public void imageListPropertySetWhenImageIsPushButNotIsKeep() throws Exception { + ArrayList expectedImagesToBeDeletedAfterPush = new ArrayList<>(); + + Mockito.when(mockImage.isPush()).thenReturn(true); + Mockito.when(mockImage.isKeep()).thenReturn(false); + + executeMojo(FAKE_PROVIDER_KEY); + + assertEquals(1, mojo.getImagesToPush().size()); + + expectedImagesToBeDeletedAfterPush.add(mojo.getImagesToPush().get(0).getImageId()); + + assertEquals(imagesToDeleteAfterPush, expectedImagesToBeDeletedAfterPush); + } + + @Test + public void imageListPropertySetWhenMultipleImagesSetToIsPushButNotIsKeep() throws Exception { + ArrayList expectedImagesToBeDeletedAfterPush = new ArrayList<>(); + + Mockito.when(mockImage.isPush()).thenReturn(true); + Mockito.when(mockImage.isKeep()).thenReturn(false); + + ImageBuildConfiguration mockImageTwo = Mockito.mock(ImageBuildConfiguration.class); + Mockito.when(mockImageTwo.getId()).thenReturn(STARTIDTWO); + Mockito.when(mockImageTwo.getNameAndTag()).thenReturn(NAMEANDTAGTWO); + Mockito.when(mockImageTwo.isPush()).thenReturn(true); + Mockito.when(mockImageTwo.isKeep()).thenReturn(false); + + List images = new ArrayList<>(); + images.add(mockImage); + images.add(mockImageTwo); + mojo.setImages(images); + + executeMojo(FAKE_PROVIDER_KEY); + + assertEquals(2, mojo.getImagesToPush().size()); + + expectedImagesToBeDeletedAfterPush.add(mojo.getImagesToPush().get(0).getImageId()); + expectedImagesToBeDeletedAfterPush.add(mojo.getImagesToPush().get(1).getImageId()); + + assertEquals(imagesToDeleteAfterPush, expectedImagesToBeDeletedAfterPush); + } + private void executeMojo(String provider) throws MojoExecutionException, MojoFailureException { mojo.setProviderName(provider); mojo.execute(); diff --git a/src/test/java/net/wouterdanes/docker/maven/PushImageMojoTest.java b/src/test/java/net/wouterdanes/docker/maven/PushImageMojoTest.java index 649627c..be7a67e 100644 --- a/src/test/java/net/wouterdanes/docker/maven/PushImageMojoTest.java +++ b/src/test/java/net/wouterdanes/docker/maven/PushImageMojoTest.java @@ -25,7 +25,10 @@ import org.junit.Before; import org.junit.Test; import org.mockito.Matchers; +import org.mockito.Mockito; +import org.mockito.internal.verification.VerificationModeFactory; +import java.util.ArrayList; import java.util.HashMap; import java.util.Optional; import java.util.UUID; @@ -36,24 +39,30 @@ public class PushImageMojoTest { private final String fakeProviderKey = UUID.randomUUID().toString(); private PushImageMojo mojo; + private ImageBuildConfiguration mockImage; + + private static final String NAME_AND_TAG = UUID.randomUUID().toString(); @Before public void setUp() throws Exception { + AbstractDockerMojo.imagesToDeleteAfterPush = new ArrayList<>(); + + mockImage = Mockito.mock(ImageBuildConfiguration.class); + Mockito.when(mockImage.getNameAndTag()).thenReturn(NAME_AND_TAG); + Mockito.when(mockImage.isPush()).thenReturn(true); FakeDockerProvider.instance = mock(FakeDockerProvider.class); DockerProviderSupplier.registerProvider(fakeProviderKey, FakeDockerProvider.class); mojo = new PushImageMojo(); mojo.setPluginContext(new HashMap()); - mojo.setProviderName(fakeProviderKey); } @After public void tearDown() throws Exception { - DockerProviderSupplier.removeProvider(fakeProviderKey); - + AbstractDockerMojo.imagesToDeleteAfterPush = new ArrayList<>(); } @Test(expected = MojoFailureException.class) @@ -74,6 +83,39 @@ public void testThatNoImagesArePushedWhenThereAreNoImagesMarkedToPush() throws E } + @Test + public void willNotRemoveImagesIfImageListPropertyIsNotSet() throws Exception { + + mojo.enqueueForPushing("some-image-id", mockImage); + mojo.enqueueForPushing("another-image-id", mockImage); + mojo.execute(); + + verify(FakeDockerProvider.instance, never()).removeImage(Matchers.any()); + } + + @Test + public void willRemoveImagesIfImageListPropertyContainsASingleID() throws Exception { + AbstractDockerMojo.imagesToDeleteAfterPush.add("some-image-id"); + + mojo.enqueueForPushing("some-image-id", mockImage); + mojo.enqueueForPushing("another-image-id", mockImage); + mojo.execute(); + + verify(FakeDockerProvider.instance, VerificationModeFactory.times(1)).removeImage(Matchers.any()); + } + + @Test + public void willRemoveImagesIfImageListPropertyContainsMultipleIDs() throws Exception { + AbstractDockerMojo.imagesToDeleteAfterPush.add("some-image-id"); + AbstractDockerMojo.imagesToDeleteAfterPush.add("some-image-id,another-image-id"); + + mojo.enqueueForPushing("some-image-id", mockImage); + mojo.enqueueForPushing("another-image-id", mockImage); + mojo.execute(); + + verify(FakeDockerProvider.instance, VerificationModeFactory.times(2)).removeImage(Matchers.any()); + } + public static class FakeDockerProvider extends AbstractFakeDockerProvider { private static FakeDockerProvider instance;