jdeppe-pivotal commented on a change in pull request #6385: URL: https://github.com/apache/geode/pull/6385#discussion_r623158509
########## File path: geode-assembly/src/acceptanceTest/java/org/apache/geode/rules/DockerComposeRule.java ########## @@ -0,0 +1,202 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more contributor license + * agreements. See the NOTICE file distributed with this work for additional information regarding + * copyright ownership. The ASF licenses this file to You under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance with the License. You may obtain a + * copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express + * or implied. See the License for the specific language governing permissions and limitations under + * the License. + */ + +package org.apache.geode.rules; + +import java.io.File; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import com.github.dockerjava.api.DockerClient; +import com.github.dockerjava.api.command.ExecCreateCmdResponse; +import org.apache.logging.log4j.Logger; +import org.junit.rules.ExternalResource; +import org.junit.rules.RuleChain; +import org.junit.runner.Description; +import org.junit.runners.model.Statement; +import org.testcontainers.DockerClientFactory; +import org.testcontainers.containers.Container; +import org.testcontainers.containers.ContainerState; +import org.testcontainers.containers.DockerComposeContainer; +import org.testcontainers.containers.output.BaseConsumer; +import org.testcontainers.containers.output.FrameConsumerResultCallback; +import org.testcontainers.containers.output.OutputFrame; +import org.testcontainers.containers.output.ToStringConsumer; + +import org.apache.geode.logging.internal.log4j.api.LogService; +import org.apache.geode.test.junit.rules.IgnoreOnWindowsRule; + +public class DockerComposeRule extends ExternalResource { + + private static final Logger logger = LogService.getLogger(); + + private final RuleChain delegate; + private final String composeFile; + private final Map<String, List<Integer>> exposedServices; + private DockerComposeContainer<?> composeContainer; + + public DockerComposeRule(String composeFile, Map<String, List<Integer>> exposedServices) { + this.composeFile = composeFile; + this.exposedServices = exposedServices; + delegate = RuleChain.outerRule(new IgnoreOnWindowsRule()); + } + + @Override + public Statement apply(Statement base, Description description) { + Statement containStatement = new Statement() { + @Override + public void evaluate() throws Throwable { + + composeContainer = new DockerComposeContainer<>("compose", new File(composeFile)); + exposedServices.forEach((service, ports) -> ports + .forEach(p -> composeContainer.withExposedService(service, p))); + + composeContainer.start(); + + try { + base.evaluate(); + } finally { + composeContainer.stop(); + } + } + }; + + return delegate.apply(containStatement, description); + } + + /** + * When used with compose, testcontainers does not allow one to have a 'container_name' + * attribute in the compose file. This means that container names end up looking something like: + * {@code project_service_index}. When a container performs a reverse IP lookup it will get a + * hostname that looks something like {@code projectjkh_db_1.my-netwotk}. This can be a problem + * since this hostname is not RFC compliant as it contains underscores. This may cause problems + * in particular with SSL. + */ Review comment: I've renamed the method to `setContainerName` to make it a bit more explicit. I had to use this in `DualServerSNIAcceptanceTest`. Without this it was producing SSL exceptions indicating that a hostname was malformed. When `docker-compose` creates containers the names end up looking something like this: `composeowub3t_locator-maeve_1`. The original 'compose' library we're replacing allowed for `container_name:` attributes in the compose yaml, but _testcontainers_ does not. So if a container does a reverse DNS lookup it gets back a hostname that is actually not RFC compliant because it contains underscores: ``` root@server-dolores:/# dig -x 172.22.0.5 ; <<>> DiG 9.10.3-P4-Debian <<>> -x 172.22.0.5 ;; global options: +cmd ;; Got answer: ;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 17690 ;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 0 ;; QUESTION SECTION: ;5.0.22.172.in-addr.arpa. IN PTR ;; ANSWER SECTION: 5.0.22.172.in-addr.arpa. 600 IN PTR composeowub3t_locator-maeve_1.geode-sni-test. ``` Unfortunately, I don't have the stack trace, but this hostname results in an exception being thrown and SSL cannot establish a connection. Ultimately, this method is here to rename the container exactly as would happen if _testcontainers_ could handle `container_name:`. -- This is an automated message from the Apache Git Service. To respond to the message, please log on to GitHub and use the URL above to go to the specific comment. For queries about this service, please contact Infrastructure at: [email protected]
