summaryrefslogtreecommitdiffstats
path: root/docker-api
diff options
context:
space:
mode:
authorValerij Fredriksen <valerijf@oath.com>2017-10-06 13:39:32 +0200
committerValerij Fredriksen <valerijf@oath.com>2017-10-06 13:39:32 +0200
commit00a1d90ea6133f519424de86976313a90b809770 (patch)
tree5e6e19c496b5cc0ead2de2c031a040066a674129 /docker-api
parent73f7c6d30771a8a685e5458a7d9346076e82f950 (diff)
Generate deterministically random MAC addresses for docker containers
Diffstat (limited to 'docker-api')
-rw-r--r--docker-api/src/main/java/com/yahoo/vespa/hosted/dockerapi/CreateContainerCommandImpl.java22
1 files changed, 16 insertions, 6 deletions
diff --git a/docker-api/src/main/java/com/yahoo/vespa/hosted/dockerapi/CreateContainerCommandImpl.java b/docker-api/src/main/java/com/yahoo/vespa/hosted/dockerapi/CreateContainerCommandImpl.java
index e676a86d9fd..1f568b325b9 100644
--- a/docker-api/src/main/java/com/yahoo/vespa/hosted/dockerapi/CreateContainerCommandImpl.java
+++ b/docker-api/src/main/java/com/yahoo/vespa/hosted/dockerapi/CreateContainerCommandImpl.java
@@ -9,6 +9,7 @@ import com.github.dockerjava.api.model.Ulimit;
import java.net.Inet6Address;
import java.net.InetAddress;
+import java.security.NoSuchAlgorithmException;
import java.security.SecureRandom;
import java.util.ArrayList;
import java.util.HashMap;
@@ -19,6 +20,7 @@ import java.util.Optional;
import java.util.Random;
import java.util.Set;
import java.util.stream.Collectors;
+import java.util.stream.IntStream;
class CreateContainerCommandImpl implements Docker.CreateContainerCommand {
private final DockerClient docker;
@@ -205,17 +207,25 @@ class CreateContainerCommandImpl implements Docker.CreateContainerCommand {
}
private String generateRandomMACAddress() {
- Random rand = new SecureRandom();
+ final String seed = hostName + ipv4Address.orElse("") + ipv6Address.orElse("");
+ Random rand = getPRNG(seed);
byte[] macAddr = new byte[6];
rand.nextBytes(macAddr);
// Set second-last bit (locally administered MAC address), unset last bit (unicast)
macAddr[0] = (byte) ((macAddr[0] | 2) & 254);
- StringBuilder sb = new StringBuilder(18);
- for (byte b : macAddr) {
- sb.append(":").append(String.format("%02x", b));
- }
+ return IntStream.range(0, macAddr.length)
+ .mapToObj(i -> String.format("%02x", macAddr[i]))
+ .collect(Collectors.joining(":"));
+ }
- return sb.substring(1);
+ private static Random getPRNG(String seed) {
+ try {
+ SecureRandom rand = SecureRandom.getInstance("SHA1PRNG");
+ rand.setSeed(seed.getBytes());
+ return rand;
+ } catch (NoSuchAlgorithmException e) {
+ throw new RuntimeException("Failed to get pseudo-random number generator", e);
+ }
}
}