From 0558763f875d285f547d5e0609734e92cc6976b5 Mon Sep 17 00:00:00 2001 From: Jeff Mitchell Date: Fri, 12 Jun 2015 19:25:16 +0000 Subject: [PATCH] This puts the image parsing code (mostly) back to how it was before. The regex solution is extremely complex, which makes it hard to debug and understand; the original switches and commenting lay out the various cases in a straightforward fashion. Plus, implementing namespace/repo support in the original code was a simple strings.Join call. --- .../docker/resource_docker_image_funcs.go | 47 +++++++++++-------- 1 file changed, 27 insertions(+), 20 deletions(-) diff --git a/builtin/providers/docker/resource_docker_image_funcs.go b/builtin/providers/docker/resource_docker_image_funcs.go index 8fb58ba28..f45dd2226 100644 --- a/builtin/providers/docker/resource_docker_image_funcs.go +++ b/builtin/providers/docker/resource_docker_image_funcs.go @@ -3,7 +3,6 @@ package docker import ( "fmt" "strings" - "regexp" dc "github.com/fsouza/go-dockerclient" "github.com/hashicorp/terraform/helper/schema" @@ -76,28 +75,36 @@ func pullImage(data *Data, client *dc.Client, image string) error { pullOpts := dc.PullImageOptions{} - // - // Breaks apart an image string into host:port, repo, and tag components - regex := "^(?:(?P(?:[\\w-]+(?:\\.[\\w-]+)+)(?::[\\d]+)?)/)?(?P[\\w.-]+(?:/[\\w.-]*)*)*(?::(?P[\\w.-]*))?" - r, _ := regexp.Compile(regex) + splitImageName := strings.Split(image, ":") + switch len(splitImageName) { - // Result is in form [[image, host, repo, tag]], so we get the head of the - // outer list to pass the inner list to result - result := r.FindAllStringSubmatch(image, -1)[0] + // It's in registry:port/username/repo:tag or registry:port/repo:tag format + case 3: + splitPortRepo := strings.Split(splitImageName[1], "/") + pullOpts.Registry = splitImageName[0] + ":" + splitPortRepo[0] + pullOpts.Tag = splitImageName[2] + pullOpts.Repository = strings.Join(splitPortRepo[1:], "/") - // If the host is not an empty string, then the image is using a private registry - if (result[1] != "") { - pullOpts.Registry = result[1] - // The repository for a private registry should take the form of host/repo rather than just repo - pullOpts.Repository = result[1] + "/" + result[2] - } else if (result[2] != "") { - // Local registries, or the main docker registry will have an image named as just 'repo' - pullOpts.Repository = result[2] - } + // It's either registry:port/username/repo, registry:port/repo, + // or repo:tag with default registry + case 2: + splitPortRepo := strings.Split(splitImageName[1], "/") + switch len(splitPortRepo) { + // repo:tag + case 1: + pullOpts.Repository = splitImageName[0] + pullOpts.Tag = splitImageName[1] - // If there was a tag specified, then set it - if (result[3] != "") { - pullOpts.Tag = result[3] + // registry:port/username/repo or registry:port/repo + default: + pullOpts.Registry = splitImageName[0] + ":" + splitPortRepo[0] + pullOpts.Repository = strings.Join(splitPortRepo[1:], "/") + pullOpts.Tag = "latest" + } + + // Plain username/repo or repo + default: + pullOpts.Repository = image } if err := client.PullImage(pullOpts, dc.AuthConfiguration{}); err != nil {