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]


Reply via email to