-
-
Notifications
You must be signed in to change notification settings - Fork 1.6k
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Allow testcontainers to have custom labels #725
Changes from 1 commit
8a5bab7
42a114b
8f6609a
0d2f9a9
73eba48
9740782
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -110,6 +110,9 @@ public class GenericContainer<SELF extends GenericContainer<SELF>> | |
@NonNull | ||
private Map<String, String> env = new HashMap<>(); | ||
|
||
@NonNull | ||
private Map<String, String> labels = new HashMap<>(); | ||
|
||
@NonNull | ||
private String[] commandParts = new String[0]; | ||
|
||
|
@@ -473,6 +476,7 @@ private void applyConfiguration(CreateContainerCmd createCommand) { | |
Map<String, String> labels = createCommand.getLabels(); | ||
labels = new HashMap<>(labels != null ? labels : Collections.emptyMap()); | ||
labels.putAll(DockerClientFactory.DEFAULT_LABELS); | ||
labels.putAll(this.labels); | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. I would do it before There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. I a developer really wants to overwrite the default labels he or she should be able to do so. There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. sorry, IMO this is too dangerous. There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Ok - should we silently ignore There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. an exception, plus an order change ( There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. As the university is closing down - I'll change this tomorrow. There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Sure! Thanks for your contribution :) There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. @bsideup done :) Please review all the changes, I will squash the commits when you give your okay ;) There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Thanks! No need to squash, GitHub allows us to do it automatically 🎉 |
||
createCommand.withLabels(labels); | ||
} | ||
|
||
|
@@ -580,6 +584,14 @@ public void addEnv(String key, String value) { | |
env.put(key, value); | ||
} | ||
|
||
/** | ||
* {@inheritDoc} | ||
*/ | ||
@Override | ||
public void addLabel(String key, String value) { | ||
labels.put(key, value); | ||
} | ||
|
||
/** | ||
* {@inheritDoc} | ||
*/ | ||
|
@@ -700,6 +712,24 @@ public SELF withEnv(Map<String, String> env) { | |
return self(); | ||
} | ||
|
||
/** | ||
* {@inheritDoc} | ||
*/ | ||
@Override | ||
public SELF withLabel(String key, String value) { | ||
this.addLabel(key, value); | ||
return self(); | ||
} | ||
|
||
/** | ||
* {@inheritDoc} | ||
*/ | ||
@Override | ||
public SELF withLabels(Map<String, String> labels) { | ||
labels.forEach(this::addLabel); | ||
return self(); | ||
} | ||
|
||
/** | ||
* {@inheritDoc} | ||
*/ | ||
|
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -22,6 +22,7 @@ | |
import java.net.Socket; | ||
import java.time.Duration; | ||
import java.util.Arrays; | ||
import java.util.Map; | ||
import java.util.concurrent.TimeUnit; | ||
import java.util.concurrent.TimeoutException; | ||
import java.util.regex.Matcher; | ||
|
@@ -127,6 +128,15 @@ public static void setupContent() throws FileNotFoundException { | |
.withExtraHost("somehost", "192.168.1.10") | ||
.withCommand("/bin/sh", "-c", "while true; do cat /etc/hosts | nc -l -p 80; done"); | ||
|
||
/** | ||
* Create a container with a custom label for testing. | ||
*/ | ||
@ClassRule | ||
public static GenericContainer alpineCustomLabel = new GenericContainer("alpine:3.2") | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. please use There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Also, the container for this test can be as simple as: new GenericContainer()
.withLabel("our.custom", "label")
.withCommand("ps") There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. So it behaves like every other container in this test class ;) There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. not every, rather legacy ;) There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. See There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. I see - much better :) |
||
.withExposedPorts(80) | ||
.withLabel("our.custom", "label") | ||
.withCommand("/bin/sh", "-c", "while true; do cat /etc/hosts | nc -l -p 80; done"); | ||
|
||
// @Test | ||
// public void simpleRedisTest() { | ||
// String ipAddress = redis.getContainerIpAddress(); | ||
|
@@ -220,6 +230,14 @@ public void environmentFromMapTest() throws IOException { | |
assertEquals("Environment variables can be passed into a command from a map", "42 and 50", line); | ||
} | ||
|
||
@Test | ||
public void customLabelTest() { | ||
Map<String, String> labels = alpineCustomLabel.getCurrentContainerInfo().getConfig().getLabels(); | ||
assertTrue("org.testcontainers label is present", labels.containsKey("org.testcontainers")); | ||
assertTrue("our.custom label is present", labels.containsKey("our.custom")); | ||
assertEquals("our.custom label value is label", labels.get("our.custom"), "label"); | ||
} | ||
|
||
@Test | ||
public void customClasspathResourceMappingTest() throws IOException { | ||
// Note: This functionality doesn't work if you are running your build inside a Docker container; | ||
|
@@ -341,7 +359,7 @@ public void copyToContainerTest() throws Exception { | |
|
||
try (final GenericContainer alpineCopyToContainer = new GenericContainer("alpine:3.2") | ||
.withCommand("top")){ | ||
|
||
alpineCopyToContainer.start(); | ||
final MountableFile mountableFile = MountableFile.forClasspathResource("test_copy_to_container.txt"); | ||
alpineCopyToContainer.copyFileToContainer(mountableFile, "/home/"); | ||
|
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -23,12 +23,15 @@ public static GenericContainer redis = | |
|
||
// Set up a plain OS container and customize environment, | ||
// command and exposed ports. This just listens on port 80 | ||
// and always returns '42' | ||
// and always returns '42'. | ||
// The container will have a custom label named 'our.custom' | ||
// with a value 'label'. | ||
@ClassRule | ||
public static GenericContainer alpine = | ||
new GenericContainer("alpine:3.2") | ||
.withExposedPorts(80) | ||
.withEnv("MAGIC_NUMBER", "42") | ||
.withLabel("our.custom", "label") | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. I think this use case (labels) is way too specific and should be documented separately (this examples shows common usage of the There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Okay, fair enough |
||
.withCommand("/bin/sh", "-c", | ||
"while true; do echo \"$MAGIC_NUMBER\" | nc -l -p 80; done"); | ||
``` | ||
|
@@ -46,4 +49,4 @@ The class rule provides methods for discovering how your tests can interact with | |
For example, with the Redis example above, the following will allow your tests to access the Redis service: | ||
```java | ||
String redisUrl = redis.getContainerIpAddress() + ":" + redis.getMappedPort(6379); | ||
``` | ||
``` |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
should we avoid having non-fluent version of such methods? Or is there any value it adds?
/cc @rnorth @kiview
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I would be okay with deprecating the old ones and not adding new ones.