Skip to content

Commit 21c5956

Browse files
authored
Merge pull request #339 from iExecBlockchainComputing/feature/docker-image-name
Normalize docker image name
2 parents baa1655 + bf415cf commit 21c5956

File tree

3 files changed

+57
-5
lines changed

3 files changed

+57
-5
lines changed

gradle.properties

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
version=5.0.1-rc1
1+
version=5.0.1-rc2
22
iexecCommonVersion=5.0.1-rc1
33
nexusUser=fake
44
nexusPassword=fake

src/main/java/com/iexec/worker/docker/DockerClientService.java

Lines changed: 32 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -108,6 +108,8 @@ public boolean pullImage(String imageName) {
108108
NameParser.ReposTag repoAndTag = NameParser.parseRepositoryTag(imageName);
109109
if (StringUtils.isEmpty(repoAndTag.repos)
110110
|| StringUtils.isEmpty(repoAndTag.tag)) {
111+
Exception e = new Exception("Error parsing image name");
112+
logError("pull image", imageName, "", e);
111113
return false;
112114
}
113115
try (PullImageCmd pullImageCmd =
@@ -125,17 +127,18 @@ public boolean pullImage(String imageName) {
125127
}
126128

127129
public String getImageId(String imageName) {
128-
if (StringUtils.isEmpty(imageName)) {
130+
String normalizedImageName = normalizeImageName(imageName);
131+
if (StringUtils.isEmpty(normalizedImageName)) {
129132
return "";
130133
}
131134
try (ListImagesCmd listImagesCmd = getClient().listImagesCmd()) {
132135
return listImagesCmd
133136
.withDanglingFilter(false)
134-
.withImageNameFilter(imageName)
137+
.withImageNameFilter(normalizedImageName)
135138
.exec()
136139
.stream()
137140
.filter(image -> !StringUtils.isEmpty(image.getRepoTags()))
138-
.filter(image -> Arrays.asList(image.getRepoTags()).contains(imageName))
141+
.filter(image -> Arrays.asList(image.getRepoTags()).contains(normalizedImageName))
139142
.map(Image::getId)
140143
.findFirst()
141144
.orElse("");
@@ -395,6 +398,32 @@ DockerClient getClient() {
395398
return dockerConnectorService.getClient();
396399
}
397400

401+
/**
402+
* Docker image names have the form:
403+
* registry-url/namespace/image:tag
404+
* Since the registry-url is optional
405+
* we need to remove it to have a
406+
* predictable format.
407+
*
408+
* @param imageName
409+
* @return imageName without registry url
410+
*/
411+
public String normalizeImageName(String imageName) {
412+
// TODO: check image tag here.
413+
if (StringUtils.isEmpty(imageName)) {
414+
return "";
415+
}
416+
String[] parts = imageName.split("/");
417+
int n = parts.length;
418+
if (n == 1) {
419+
// official images do not have namespaces
420+
return imageName;
421+
}
422+
// We are not sure if the registry url can
423+
// contain slashes so we anticipate that case.
424+
return parts[n-2] + "/" + parts[n-1];
425+
}
426+
398427
private void logInfo(String infoMessage, String name, String id) {
399428
log.info("{} [name:'{}', id:'{}']", infoMessage, name, id);
400429
}

src/test/java/com/iexec/worker/docker/DockerClientServiceTests.java

Lines changed: 24 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,6 @@
4040

4141
import static com.iexec.worker.docker.DockerClientService.WORKER_DOCKER_NETWORK;
4242
import static org.assertj.core.api.Assertions.assertThat;
43-
import static org.mockito.ArgumentMatchers.any;
4443
import static org.mockito.Mockito.*;
4544

4645

@@ -628,6 +627,30 @@ public void shouldNotRemoveContainerSinceDockerCmdException() {
628627
assertThat(dockerClientService.removeContainer(getRandomString())).isFalse();
629628
}
630629

630+
@Test
631+
public void shouldRemoveRegistryUrlFromImageName() {
632+
assertThat(
633+
dockerClientService
634+
.normalizeImageName("registry/namespace/image:tag")
635+
).isEqualTo("namespace/image:tag");
636+
}
637+
638+
@Test
639+
public void shouldAcceptImageNameWithoutRegistryUrl() {
640+
assertThat(
641+
dockerClientService
642+
.normalizeImageName("namespace/image:tag")
643+
).isEqualTo("namespace/image:tag");
644+
}
645+
646+
@Test
647+
public void ShouldAcceptOfficialImageName() {
648+
assertThat(
649+
dockerClientService
650+
.normalizeImageName("official:tag")
651+
).isEqualTo("official:tag");
652+
}
653+
631654
private String getRandomString() {
632655
return RandomStringUtils.randomAlphanumeric(20);
633656
}

0 commit comments

Comments
 (0)