private static DockerCompositions applyExtendsRules(DockerCompositions dockerCompositions) { for (Map.Entry<String, CubeContainer> containerEntry : dockerCompositions.getContainers().entrySet()) { CubeContainer container = containerEntry.getValue(); if (container.getExtends() != null) { String extendsContainer = container.getExtends(); if (dockerCompositions.get(extendsContainer) == null) { throw new IllegalArgumentException( containerEntry.getKey() + " extends a non existing container definition " + extendsContainer); } CubeContainer extendedContainer = dockerCompositions.get(extendsContainer); container.merge(extendedContainer); } } return dockerCompositions; }
@Override public Map<String, Node> parse() { Map<String, Node> nodes = new HashMap<>(); String[] autoStartContainers = ConfigUtil.trim(expression.split(",")); for (String autoStart : autoStartContainers) { if (containerDefinitions.get(autoStart) != null && !containerDefinitions.get(autoStart).isManual()) { nodes.put(autoStart, Node.from(autoStart)); } } return nodes; }
@Override public Map<String, Node> parse() { Map<String, Node> nodes = new HashMap<>(); String[] autoStartContainers = ConfigUtil.trim(expression.split(",")); for (String autoStart : autoStartContainers) { if (containerDefinitions.get(autoStart) != null && !containerDefinitions.get(autoStart).isManual()) { nodes.put(autoStart, Node.from(autoStart)); } } return nodes; }
@Test public void shouldGetLogFromContainer() throws IOException { File newFolder = temporaryFolder.newFolder(); String content = CONTAINER_LOG_CONFIGURATION; content += newFolder.getAbsolutePath(); content += "mylog.log"; DockerCompositions configuration = ConfigUtil.load(content); CubeContainer config = configuration.get("tomcat_default"); Mockito.when(cube.configuration()).thenReturn(config); fire(new BeforeStop(CUBE_CONTAINER_NAME)); verify(dockerClientExecutor, times(1)).copyLog(eq(CUBE_CONTAINER_NAME), eq(false), eq(false), eq(false), eq(false), eq(-1), any(OutputStream.class)); }
@Test public void shouldBuildImageFromContextProperty() throws URISyntaxException { URI simpleDockerCompose = DockerComposeConverterTest.class.getResource("/simple-docker-compose-build-with-context-dir.yml").toURI(); DockerComposeConverter dockerComposeConverter = DockerComposeConverter.create(Paths.get(simpleDockerCompose)); DockerCompositions convert = dockerComposeConverter.convert(); CubeContainer webapp = convert.get("webapp"); assertThat(webapp.getBuildImage(), is(notNullValue())); }
@Test public void shouldBuildImageFromBuildProperty() throws URISyntaxException { URI simpleDockerCompose = DockerComposeConverterTest.class.getResource("/simple-docker-compose-build-with-dockerfile.yml").toURI(); DockerComposeConverter dockerComposeConverter = DockerComposeConverter.create(Paths.get(simpleDockerCompose)); DockerCompositions convert = dockerComposeConverter.convert(); CubeContainer webapp = convert.get("webapp"); assertThat(webapp.getBuildImage(), is(notNullValue())); }
@Test public void shouldCopyFileFromContainer() throws IOException { File newFolder = temporaryFolder.newFolder(); String content = CONTAINER_COPY_CONFIGURATION; content += newFolder.getAbsolutePath(); DockerCompositions configuration = ConfigUtil.load(content); CubeContainer config = configuration.get("tomcat_default"); Mockito.when(cube.configuration()).thenReturn(config); Mockito.when(dockerClientExecutor.getFileOrDirectoryFromContainerAsTar(eq(CUBE_CONTAINER_NAME), anyString())) .thenReturn(BeforeStopContainerObserverTest.class.getResourceAsStream("/hello.tar")); fire(new BeforeStop(CUBE_CONTAINER_NAME)); verify(dockerClientExecutor).getFileOrDirectoryFromContainerAsTar(eq(CUBE_CONTAINER_NAME), eq("/test")); assertThat(new File(newFolder, "hello.txt").exists(), is(true)); }
private void testCmdSplittedOnSpaces(final String composeDefinition, final String[] expectedInOrderCmds) { Map<String, String> parameters = new HashMap<String, String>(); parameters.put("serverVersion", "1.13"); parameters.put("serverUri", "http://localhost:25123"); parameters.put("dockerContainers", composeDefinition); parameters.put("definitionFormat", DefinitionFormat.COMPOSE.name()); CubeDockerConfiguration cubeConfiguration = CubeDockerConfiguration.fromMap(parameters, null); final DockerCompositions dockerContainersContent = cubeConfiguration.getDockerContainersContent(); final CubeContainer wildfly = dockerContainersContent.get("wildfly"); final Collection<String> commands = wildfly.getCmd(); assertThat(commands, IsIterableContainingInOrder.contains(expectedInOrderCmds)); }
private void testResolvePlaceholders(String dockerComposeFile, String expectedImageName) throws URISyntaxException, IOException { URI readEnvsDockerCompose = DockerComposeConverterTest.class.getResource(dockerComposeFile).toURI(); DockerComposeConverter dockerComposeConverter = DockerComposeConverter.create(Paths.get(readEnvsDockerCompose)); DockerCompositions convert = dockerComposeConverter.convert(); CubeContainer webapp = convert.get("webapp2"); assertThat(webapp.getImage(), is(notNullValue())); final String image = webapp.getImage().toImageRef(); assertThat(image, is(expectedImageName)); }
public void connectToNetworks(@Observes AfterCreate event, CubeDockerConfiguration dockerConfiguration) { final DockerCompositions dockerContainersContent = dockerConfiguration.getDockerContainersContent(); final DockerClientExecutor dockerClientExecutor = dockerClientExecutorInstance.get(); String cubeId = event.getCubeId(); CubeContainer container = dockerContainersContent.get(cubeId); if (container != null && container.getNetworks() != null) { for (String network : container.getNetworks()) { if (!network.equals(container.getNetworkMode())) { dockerClientExecutor.connectToNetwork(network, cubeId); } } } } }
public void connectToNetworks(@Observes AfterCreate event, CubeDockerConfiguration dockerConfiguration) { final DockerCompositions dockerContainersContent = dockerConfiguration.getDockerContainersContent(); final DockerClientExecutor dockerClientExecutor = dockerClientExecutorInstance.get(); String cubeId = event.getCubeId(); CubeContainer container = dockerContainersContent.get(cubeId); if (container != null && container.getNetworks() != null) { for (String network : container.getNetworks()) { if (!network.equals(container.getNetworkMode())) { dockerClientExecutor.connectToNetwork(network, cubeId); } } } } }
@Test public void shouldTransformSimpleDockerComposeV2FormatNetworkAliases() throws URISyntaxException { URI simpleDockerCompose = DockerComposeConverterTest.class.getResource("/simple-docker-compose-network-aliases-v2.yml").toURI(); DockerComposeConverter dockerComposeConverter = DockerComposeConverter.create(Paths.get(simpleDockerCompose)); DockerCompositions convert = dockerComposeConverter.convert(); CubeContainer webapp = convert.get("webapp"); assertThat(webapp, is(notNullValue())); assertThat(webapp.getNetworks()).contains("front-tier"); assertThat(webapp.getAliases()).containsOnly("foo", "bar"); }
@Test public void shouldExecuteCustomBeforeStopOperationForContainer() throws IOException { DockerCompositions configuration = ConfigUtil.load(CONTAINER_CUSTOM_BEFORE_STOP_ACTION_CONFIGURATION); CubeContainer config = configuration.get("tomcat_default"); Mockito.when(cube.configuration()).thenReturn(config); fire(new BeforeStop(CUBE_CONTAINER_NAME)); verify(dockerClientExecutor, times(1)).getDockerUri(); } }
@Test public void should_load_cube_configuration_from_cube_file_if_no_file_is_provided() { Map<String, String> parameters = new HashMap<String, String>(); parameters.put("serverVersion", "1.13"); parameters.put("serverUri", "http://localhost:25123"); parameters.put("definitionFormat", DefinitionFormat.CUBE.name()); CubeDockerConfiguration cubeConfiguration = CubeDockerConfiguration.fromMap(parameters, null); DockerCompositions dockerContainersContent = cubeConfiguration.getDockerContainersContent(); CubeContainer actualTomcat = dockerContainersContent.get("tomcat"); assertThat(actualTomcat, is(notNullValue())); String image = actualTomcat.getImage().toImageRef(); assertThat(image, is("tomcat:7.0")); }
@Test public void should_set_global_removeVolumes_option_if_not_set_on_container_level() { Map<String, String> parameters = new HashMap<String, String>(); parameters.put("dockerContainers", CONTENT); parameters.put("definitionFormat", DefinitionFormat.CUBE.name()); CubeDockerConfiguration cubeConfiguration = CubeDockerConfiguration.fromMap(parameters, null); CubeContainer containerConfig = cubeConfiguration.getDockerContainersContent().get("tomcat"); assertThat(containerConfig.getRemoveVolumes(), is(true)); parameters.put(CubeDockerConfiguration.REMOVE_VOLUMES, "true"); cubeConfiguration = CubeDockerConfiguration.fromMap(parameters, null); containerConfig = cubeConfiguration.getDockerContainersContent().get("tomcat"); assertThat(containerConfig.getRemoveVolumes(), is(true)); }
@Test public void shouldReadEnvironmentVarsFromFile() throws URISyntaxException, IOException { URI readEnvsDockerCompose = DockerComposeConverterTest.class.getResource("/read-envs-docker-compose.yml").toURI(); DockerComposeConverter dockerComposeConverter = DockerComposeConverter.create(Paths.get(readEnvsDockerCompose)); DockerCompositions convert = dockerComposeConverter.convert(); CubeContainer webapp = convert.get("webapp"); assertThat(webapp.getEnv(), is(notNullValue())); Collection<String> env = webapp.getEnv(); assertThat(env, containsInAnyOrder("RACK_ENV=development")); }
@Test public void should_parse_and_load_configuration_from_container_configuration_resource() throws IOException { Map<String, String> parameters = new HashMap<String, String>(); parameters.put("serverVersion", "1.13"); parameters.put("serverUri", "http://localhost:25123"); parameters.put("definitionFormat", DefinitionFormat.CUBE.name()); parameters.put("dockerContainersResource", "test-topologies/topology1.yaml"); CubeDockerConfiguration cubeConfiguration = CubeDockerConfiguration.fromMap(parameters, null); assertThat(cubeConfiguration.getDockerServerUri(), is("http://localhost:25123")); assertThat(cubeConfiguration.getDockerServerVersion(), is("1.13")); DockerCompositions dockerContainersContent = cubeConfiguration.getDockerContainersContent(); CubeContainer actualTomcat = dockerContainersContent.get("tomcat"); assertThat(actualTomcat, is(notNullValue())); String image = actualTomcat.getImage().toImageRef(); assertThat(image, is("tutum/tomcat:7.0")); }
@Test public void should_expand_ports_from_docker_compose_version_2() { Map<String, String> parameters = new HashMap<String, String>(); parameters.put("serverVersion", "1.13"); parameters.put("serverUri", "http://localhost:25123"); parameters.put("dockerContainers", VERSION_2_WITH_PORT_RANGE); parameters.put("definitionFormat", DefinitionFormat.COMPOSE.name()); CubeDockerConfiguration cubeConfiguration = CubeDockerConfiguration.fromMap(parameters, null); final DockerCompositions dockerContainersContent = cubeConfiguration.getDockerContainersContent(); final CubeContainer ngnix = dockerContainersContent.get("nginx"); final Collection<PortBinding> portBindings = ngnix.getPortBindings(); assertThat(portBindings, containsInAnyOrder(PortBinding.valueOf("80->90"), PortBinding.valueOf("81->91"), PortBinding.valueOf("82->92"), PortBinding.valueOf("83->93"), PortBinding.valueOf("84->94"))); }
@Test public void shouldExtendDockerCompose() throws URISyntaxException, IOException { URI readEnvsDockerCompose = DockerComposeConverterTest.class.getResource("/extends-docker-compose.yml").toURI(); DockerComposeConverter dockerComposeConverter = DockerComposeConverter.create(Paths.get(readEnvsDockerCompose)); DockerCompositions convert = dockerComposeConverter.convert(); CubeContainer webapp = convert.get("web"); assertThat(webapp.getEnv(), is(notNullValue())); Collection<String> env = webapp.getEnv(); assertThat(env, containsInAnyOrder("REDIS_HOST=redis-production.example.com")); assertThat(webapp.getPortBindings(), is(notNullValue())); Collection<PortBinding> ports = webapp.getPortBindings(); assertThat(ports, containsInAnyOrder(PortBinding.valueOf("8080->8080"))); }
@Test public void shouldExtendDockerComposeV2() throws URISyntaxException, IOException { URI readEnvsDockerCompose = DockerComposeConverterTest.class.getResource("/extends-docker-compose-v2.yml").toURI(); DockerComposeConverter dockerComposeConverter = DockerComposeConverter.create(Paths.get(readEnvsDockerCompose)); DockerCompositions convert = dockerComposeConverter.convert(); CubeContainer webapp = convert.get("web"); assertThat(webapp.getEnv(), is(notNullValue())); Collection<String> env = webapp.getEnv(); assertThat(env, containsInAnyOrder("REDIS_HOST=redis-production.example.com")); assertThat(webapp.getPortBindings(), is(notNullValue())); Collection<PortBinding> ports = webapp.getPortBindings(); assertThat(ports, containsInAnyOrder(PortBinding.valueOf("8080->8080"))); }