From 9019b871f054401497b65eabd1dfc95383cb5b29 Mon Sep 17 00:00:00 2001 From: Stefano Franz Date: Wed, 23 Sep 2020 10:57:38 +0100 Subject: [PATCH 1/4] add support for docker-for-windows new bind serialization format --- .../com/github/dockerjava/api/model/Bind.java | 59 +++++----- .../github/dockerjava/api/model/BindTest.java | 107 ++++++++++++++++++ 2 files changed, 138 insertions(+), 28 deletions(-) diff --git a/docker-java-api/src/main/java/com/github/dockerjava/api/model/Bind.java b/docker-java-api/src/main/java/com/github/dockerjava/api/model/Bind.java index c9aecf9d4..b3a92291d 100644 --- a/docker-java-api/src/main/java/com/github/dockerjava/api/model/Bind.java +++ b/docker-java-api/src/main/java/com/github/dockerjava/api/model/Bind.java @@ -99,36 +99,39 @@ public static Bind parse(String serialized) { try { String[] parts = serialized.split(":"); switch (parts.length) { - case 2: { - return new Bind(parts[0], new Volume(parts[1])); - } - case 3: { - String[] flags = parts[2].split(","); - AccessMode accessMode = AccessMode.DEFAULT; - SELContext seMode = SELContext.DEFAULT; - Boolean nocopy = null; - PropagationMode propagationMode = PropagationMode.DEFAULT_MODE; - for (String p : flags) { - if (p.length() == 2) { - accessMode = AccessMode.valueOf(p.toLowerCase()); - } else if ("nocopy".equals(p)) { - nocopy = true; - } else if (PropagationMode.SHARED.toString().equals(p)) { - propagationMode = PropagationMode.SHARED; - } else if (PropagationMode.SLAVE.toString().equals(p)) { - propagationMode = PropagationMode.SLAVE; - } else if (PropagationMode.PRIVATE.toString().equals(p)) { - propagationMode = PropagationMode.PRIVATE; - } else { - seMode = SELContext.fromString(p); - } + case 2: { + return new Bind(parts[0], new Volume(parts[1])); } + case 4: { + parts = new String[]{parts[0] +":"+ parts[1], parts[2], parts[3]}; + } + case 3: { + String[] flags = parts[2].split(","); + AccessMode accessMode = AccessMode.DEFAULT; + SELContext seMode = SELContext.DEFAULT; + Boolean nocopy = null; + PropagationMode propagationMode = PropagationMode.DEFAULT_MODE; + for (String p : flags) { + if (p.length() == 2) { + accessMode = AccessMode.valueOf(p.toLowerCase()); + } else if ("nocopy".equals(p)) { + nocopy = true; + } else if (PropagationMode.SHARED.toString().equals(p)) { + propagationMode = PropagationMode.SHARED; + } else if (PropagationMode.SLAVE.toString().equals(p)) { + propagationMode = PropagationMode.SLAVE; + } else if (PropagationMode.PRIVATE.toString().equals(p)) { + propagationMode = PropagationMode.PRIVATE; + } else { + seMode = SELContext.fromString(p); + } + } - return new Bind(parts[0], new Volume(parts[1]), accessMode, seMode, nocopy, propagationMode); - } - default: { - throw new IllegalArgumentException(); - } + return new Bind(parts[0], new Volume(parts[1]), accessMode, seMode, nocopy, propagationMode); + } + default: { + throw new IllegalArgumentException(); + } } } catch (Exception e) { throw new IllegalArgumentException("Error parsing Bind '" + serialized + "'", e); diff --git a/docker-java/src/test/java/com/github/dockerjava/api/model/BindTest.java b/docker-java/src/test/java/com/github/dockerjava/api/model/BindTest.java index 3343bf6bd..663231151 100644 --- a/docker-java/src/test/java/com/github/dockerjava/api/model/BindTest.java +++ b/docker-java/src/test/java/com/github/dockerjava/api/model/BindTest.java @@ -26,6 +26,113 @@ public void parseUsingDefaultAccessMode() { assertThat(bind.getPropagationMode(), is(PropagationMode.DEFAULT_MODE)); } + @Test + public void parseReadWriteWindows() { + Bind bind = Bind.parse("C:\\host:/container:rw"); + assertThat(bind.getPath(), is("C:\\host")); + assertThat(bind.getVolume().getPath(), is("/container")); + assertThat(bind.getAccessMode(), is(rw)); + assertThat(bind.getSecMode(), is(SELContext.none)); + assertThat(bind.getNoCopy(), nullValue()); + assertThat(bind.getPropagationMode(), is(PropagationMode.DEFAULT_MODE)); + } + + @Test + public void parseReadWriteNoCopyWindows() { + Bind bind = Bind.parse("C:\\host:/container:rw,nocopy"); + assertThat(bind.getPath(), is("C:\\host")); + assertThat(bind.getVolume().getPath(), is("/container")); + assertThat(bind.getAccessMode(), is(rw)); + assertThat(bind.getSecMode(), is(SELContext.none)); + assertThat(bind.getNoCopy(), is(true)); + assertThat(bind.getPropagationMode(), is(PropagationMode.DEFAULT_MODE)); + } + + @Test + public void parseReadWriteSharedWindows() { + Bind bind = Bind.parse("C:\\host:/container:rw,shared"); + assertThat(bind.getPath(), is("C:\\host")); + assertThat(bind.getVolume().getPath(), is("/container")); + assertThat(bind.getAccessMode(), is(rw)); + assertThat(bind.getSecMode(), is(SELContext.none)); + assertThat(bind.getNoCopy(), nullValue()); + assertThat(bind.getPropagationMode(), is(PropagationMode.SHARED)); + } + + @Test + public void parseReadWriteSlaveWindows() { + Bind bind = Bind.parse("C:\\host:/container:rw,slave"); + assertThat(bind.getPath(), is("C:\\host")); + assertThat(bind.getVolume().getPath(), is("/container")); + assertThat(bind.getAccessMode(), is(rw)); + assertThat(bind.getSecMode(), is(SELContext.none)); + assertThat(bind.getNoCopy(), nullValue()); + assertThat(bind.getPropagationMode(), is(PropagationMode.SLAVE)); + } + + @Test + public void parseReadWritePrivateWindows() { + Bind bind = Bind.parse("C:\\host:/container:rw,private"); + assertThat(bind.getPath(), is("C:\\host")); + assertThat(bind.getVolume().getPath(), is("/container")); + assertThat(bind.getAccessMode(), is(rw)); + assertThat(bind.getSecMode(), is(SELContext.none)); + assertThat(bind.getNoCopy(), nullValue()); + assertThat(bind.getPropagationMode(), is(PropagationMode.PRIVATE)); + } + + @Test + public void parseReadOnlyWindows() { + Bind bind = Bind.parse("C:\\host:/container:ro"); + assertThat(bind.getPath(), is("C:\\host")); + assertThat(bind.getVolume().getPath(), is("/container")); + assertThat(bind.getAccessMode(), is(ro)); + assertThat(bind.getSecMode(), is(SELContext.none)); + assertThat(bind.getNoCopy(), nullValue()); + assertThat(bind.getPropagationMode(), is(PropagationMode.DEFAULT_MODE)); + } + + @Test + public void parseSELOnlyWindows() { + Bind bind = Bind.parse("C:\\host:/container:Z"); + assertThat(bind.getPath(), is("C:\\host")); + assertThat(bind.getVolume().getPath(), is("/container")); + assertThat(bind.getAccessMode(), is(AccessMode.DEFAULT)); + assertThat(bind.getSecMode(), is(SELContext.single)); + assertThat(bind.getNoCopy(), nullValue()); + assertThat(bind.getPropagationMode(), is(PropagationMode.DEFAULT_MODE)); + + bind = Bind.parse("C:\\host:/container:z"); + assertThat(bind.getPath(), is("C:\\host")); + assertThat(bind.getVolume().getPath(), is("/container")); + assertThat(bind.getAccessMode(), is(AccessMode.DEFAULT)); + assertThat(bind.getSecMode(), is(SELContext.shared)); + assertThat(bind.getNoCopy(), nullValue()); + assertThat(bind.getPropagationMode(), is(PropagationMode.DEFAULT_MODE)); + } + + @Test + public void parseReadWriteSELWindows() { + Bind bind = Bind.parse("C:\\host:/container:rw,Z"); + assertThat(bind.getPath(), is("C:\\host")); + assertThat(bind.getVolume().getPath(), is("/container")); + assertThat(bind.getAccessMode(), is(rw)); + assertThat(bind.getSecMode(), is(SELContext.single)); + assertThat(bind.getNoCopy(), nullValue()); + assertThat(bind.getPropagationMode(), is(PropagationMode.DEFAULT_MODE)); + } + + @Test + public void parseReadOnlySELWindows() { + Bind bind = Bind.parse("C:\\host:/container:ro,z"); + assertThat(bind.getPath(), is("C:\\host")); + assertThat(bind.getVolume().getPath(), is("/container")); + assertThat(bind.getAccessMode(), is(ro)); + assertThat(bind.getSecMode(), is(SELContext.shared)); + assertThat(bind.getNoCopy(), nullValue()); + assertThat(bind.getPropagationMode(), is(PropagationMode.DEFAULT_MODE)); + } + @Test public void parseReadWrite() { Bind bind = Bind.parse("/host:/container:rw"); From f2eed4b65c83354e604603971d8e858bcee75642 Mon Sep 17 00:00:00 2001 From: Stefano Franz Date: Wed, 23 Sep 2020 11:06:06 +0100 Subject: [PATCH 2/4] add shade version plugin to fix CI --- .../src/main/java/com/github/dockerjava/api/model/Bind.java | 2 +- docker-java-transport-zerodep/pom.xml | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/docker-java-api/src/main/java/com/github/dockerjava/api/model/Bind.java b/docker-java-api/src/main/java/com/github/dockerjava/api/model/Bind.java index b3a92291d..3b8df0e09 100644 --- a/docker-java-api/src/main/java/com/github/dockerjava/api/model/Bind.java +++ b/docker-java-api/src/main/java/com/github/dockerjava/api/model/Bind.java @@ -103,7 +103,7 @@ public static Bind parse(String serialized) { return new Bind(parts[0], new Volume(parts[1])); } case 4: { - parts = new String[]{parts[0] +":"+ parts[1], parts[2], parts[3]}; + parts = new String[]{parts[0] + ":" + parts[1], parts[2], parts[3]}; } case 3: { String[] flags = parts[2].split(","); diff --git a/docker-java-transport-zerodep/pom.xml b/docker-java-transport-zerodep/pom.xml index cec907067..c87936c85 100644 --- a/docker-java-transport-zerodep/pom.xml +++ b/docker-java-transport-zerodep/pom.xml @@ -48,6 +48,7 @@ org.apache.maven.plugins maven-shade-plugin + 3.2.4 true true From b7aa801d0f378b19afc61fa491f609f02ff67d5f Mon Sep 17 00:00:00 2001 From: Sergei Egorov Date: Fri, 20 Nov 2020 14:54:12 +0100 Subject: [PATCH 3/4] Update pom.xml --- docker-java-transport-zerodep/pom.xml | 1 - 1 file changed, 1 deletion(-) diff --git a/docker-java-transport-zerodep/pom.xml b/docker-java-transport-zerodep/pom.xml index c87936c85..cec907067 100644 --- a/docker-java-transport-zerodep/pom.xml +++ b/docker-java-transport-zerodep/pom.xml @@ -48,7 +48,6 @@ org.apache.maven.plugins maven-shade-plugin - 3.2.4 true true From 593849cde7d0484e40f2b75b5a83dfdc1df2f16f Mon Sep 17 00:00:00 2001 From: Sergei Egorov Date: Fri, 20 Nov 2020 15:06:46 +0100 Subject: [PATCH 4/4] Update Bind.java --- .../com/github/dockerjava/api/model/Bind.java | 62 +++++++++---------- 1 file changed, 30 insertions(+), 32 deletions(-) diff --git a/docker-java-api/src/main/java/com/github/dockerjava/api/model/Bind.java b/docker-java-api/src/main/java/com/github/dockerjava/api/model/Bind.java index 3b8df0e09..f82e5d482 100644 --- a/docker-java-api/src/main/java/com/github/dockerjava/api/model/Bind.java +++ b/docker-java-api/src/main/java/com/github/dockerjava/api/model/Bind.java @@ -97,41 +97,39 @@ public PropagationMode getPropagationMode() { */ public static Bind parse(String serialized) { try { - String[] parts = serialized.split(":"); + // Split by ':' but not ':\' (Windows-style path) + String[] parts = serialized.split(":(?!\\\\)"); switch (parts.length) { - case 2: { - return new Bind(parts[0], new Volume(parts[1])); - } - case 4: { - parts = new String[]{parts[0] + ":" + parts[1], parts[2], parts[3]}; - } - case 3: { - String[] flags = parts[2].split(","); - AccessMode accessMode = AccessMode.DEFAULT; - SELContext seMode = SELContext.DEFAULT; - Boolean nocopy = null; - PropagationMode propagationMode = PropagationMode.DEFAULT_MODE; - for (String p : flags) { - if (p.length() == 2) { - accessMode = AccessMode.valueOf(p.toLowerCase()); - } else if ("nocopy".equals(p)) { - nocopy = true; - } else if (PropagationMode.SHARED.toString().equals(p)) { - propagationMode = PropagationMode.SHARED; - } else if (PropagationMode.SLAVE.toString().equals(p)) { - propagationMode = PropagationMode.SLAVE; - } else if (PropagationMode.PRIVATE.toString().equals(p)) { - propagationMode = PropagationMode.PRIVATE; - } else { - seMode = SELContext.fromString(p); - } + case 2: { + return new Bind(parts[0], new Volume(parts[1])); + } + case 3: { + String[] flags = parts[2].split(","); + AccessMode accessMode = AccessMode.DEFAULT; + SELContext seMode = SELContext.DEFAULT; + Boolean nocopy = null; + PropagationMode propagationMode = PropagationMode.DEFAULT_MODE; + for (String p : flags) { + if (p.length() == 2) { + accessMode = AccessMode.valueOf(p.toLowerCase()); + } else if ("nocopy".equals(p)) { + nocopy = true; + } else if (PropagationMode.SHARED.toString().equals(p)) { + propagationMode = PropagationMode.SHARED; + } else if (PropagationMode.SLAVE.toString().equals(p)) { + propagationMode = PropagationMode.SLAVE; + } else if (PropagationMode.PRIVATE.toString().equals(p)) { + propagationMode = PropagationMode.PRIVATE; + } else { + seMode = SELContext.fromString(p); } - - return new Bind(parts[0], new Volume(parts[1]), accessMode, seMode, nocopy, propagationMode); - } - default: { - throw new IllegalArgumentException(); } + + return new Bind(parts[0], new Volume(parts[1]), accessMode, seMode, nocopy, propagationMode); + } + default: { + throw new IllegalArgumentException(); + } } } catch (Exception e) { throw new IllegalArgumentException("Error parsing Bind '" + serialized + "'", e);