Skip to content

ParseDockerImageReference use docker/distribution reference parser #11245

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

Merged

Conversation

legionus
Copy link
Contributor

@legionus legionus commented Oct 6, 2016

We can't remove ParseDockerImageReference and just use docker/distribution/reference
to parse DockerImageReference because we have to support few special cases related
to docker.io. Keeping it in mind, we can reimplement ParseDockerImageReference
to use new parser.

In addition we got new limits on the length of the DockerImageReference.
So, after refactoring our restrictions are pretty the same as in docker/distribution.

Fix #11211

@ncdc @miminar please review.

@legionus
Copy link
Contributor Author

legionus commented Oct 6, 2016

[test]

@legionus
Copy link
Contributor Author

legionus commented Oct 6, 2016

This parser have a few issues:

  • it tries to apply DockerDefaultNamespace, but not DockerDefaultRegistry. We already have DockerClientDefaults function for that reason. In my opinion, the parser must either apply all default values or not to use them at all. But problem is that if we change ParseDockerImageReference, then we will break backward compatibility.
  • we need to move parser with our special black magic to separate module to able use it in S2I. They also parse DockerImageReference, but doing it the other (not fully compatible) way.

ref.Registry, ref.Name = reference.SplitHostname(named)
} else if named, ok := dockerRef.(reference.Tagged); ok {
ref.Tag = named.Tag()
} else if named, ok := dockerRef.(reference.Digested); ok {
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I believe Tagged and Digested can be considered invalid.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

OK, but in this case type switch no longer needed.

Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Ignore my previous comment. They are valid references.


repoParts := strings.Split(ref.Name, "/")

if !isRegistryName(ref.Registry) && len(repoParts) == 1 {
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

A note for isRegistryName(): use strings.ContainsAny. Also document that it needs to be called with just one path component (no slash allowed).

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

You forget about localhost. So I think this function useful here.

Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

It is. This is a suggestion to modify the isRegistryName() function itself and annotate it with a godoc.

ref.Registry = ""
}

if ref.Namespace == "" && len(repoParts) >= 2 {
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

nit: len(ref.Namespace) == 0

Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Make sure repoParts[0] doesn't look like a registry?

ref.Namespace, ref.Name = repoParts[0], strings.Join(repoParts[1:], "/")
}

if ref.Namespace == "" && IsRegistryDockerHub(ref.Registry) {
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

nit: len(ref.Namespace) == 0

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

fixed

Tag: "tag",
},
{
// docker.io/namespace/name == 255 chars without implicit namespace
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

s/implicit/explicit/ ?

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

fixed

@@ -196,7 +196,9 @@ func ValidateImageStreamTagReference(tagRef api.TagReference, fldPath *field.Pat
}
switch tagRef.From.Kind {
case "DockerImage":
if ref, err := api.ParseDockerImageReference(tagRef.From.Name); err == nil && tagRef.ImportPolicy.Scheduled && len(ref.ID) > 0 {
if ref, err := api.ParseDockerImageReference(tagRef.From.Name); err != nil {
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

... && len(tagRef.From.Name) > 0, which is already covered above.

@miminar
Copy link

miminar commented Oct 6, 2016

I'd rather do it right than stick with the old behavior. Another example is parsing of bar/foo/baz resulting in Registry == "bar". That's wrong. Especially now that we support multiple slashes in repository name.

@@ -297,6 +298,10 @@ func TestParseDockerImageReference(t *testing.T) {
Err: true,
},
{
From: "abc@badid",
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Could you add From: "@sha256:3c87c572822935df60f0f5d3665bd376841a7fcfeb806b5f212de6a00e9a7b25", From: "sha256:3c87c572822935df60f0f5d3665bd376841a7fcfeb806b5f212de6a00e9a7b25" and From: ":tag"?

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Done

@legionus
Copy link
Contributor Author

legionus commented Oct 6, 2016

I'd rather do it right than stick with the old behavior. Another example is parsing of bar/foo/baz resulting in Registry == "bar". That's wrong. Especially now that we support multiple slashes in repository name.

@miminar This behavior right according reference.Parse(). Why it's not right ?

@miminar
Copy link

miminar commented Oct 6, 2016

This behavior right according reference.Parse(). Why it's not right ?

package main
import ("fmt"; "github.com/docker/docker/reference")
func main() {
    ref, err := reference.ParseNamed("bar/foo/baz")
    if err != nil {
        fmt.Println("failed to parse reference: %v", err)
    }
    fmt.Printf("hostname=%q, remotename=%q\n", ref.Hostname(), ref.RemoteName())
}
$ go run above-script.go
hostname="docker.io", remotename="bar/foo/baz"

Which makes more sense to me.

Although if you replace "github.com/docker/docker/reference" with "github.com/docker/distribution/reference", and use reference.SplitHostname(), you'll end up with bar as a hostname and foo/baz as a name.

@legionus
Copy link
Contributor Author

legionus commented Oct 7, 2016

Although if you replace "github.com/docker/docker/reference" with "github.com/docker/distribution/reference", and use reference.SplitHostname(), you'll end up with bar as a hostname and foo/baz as a name.

@miminar Using github.com/docker/docker/reference will cost us a bunch of dependencies:

github.com/docker/docker/daemon/graphdriver
github.com/docker/docker/image
github.com/docker/docker/image/v1
github.com/docker/docker/layer
github.com/docker/docker/pkg/archive
github.com/docker/docker/pkg/chrootarchive
github.com/docker/docker/pkg/fileutils
github.com/docker/docker/pkg/idtools
github.com/docker/docker/pkg/ioutils
github.com/docker/docker/pkg/plugins
github.com/docker/docker/pkg/plugins/transport
github.com/docker/docker/pkg/pools
github.com/docker/docker/pkg/promise
github.com/docker/docker/pkg/random
github.com/docker/docker/pkg/reexec
github.com/docker/docker/pkg/stringid
github.com/docker/docker/pkg/version
github.com/docker/docker/reference
github.com/vbatts/tar-split/archive/tar
github.com/vbatts/tar-split/tar/asm
github.com/vbatts/tar-split/tar/storage

I'm not sure we want it.

@mfojtik
Copy link
Contributor

mfojtik commented Oct 7, 2016

@miminar i don't like vendoring 15 more deps just to get this helper, not saying that we can't even use the helper as it is as we need to get the namespace still..

@legionus legionus force-pushed the refactor-parse-dockerimagereference branch from a1b8c4b to e3afe0b Compare October 7, 2016 09:44
@miminar
Copy link

miminar commented Oct 7, 2016

@legionus, @mfojtik, yeah, that's too many. Let's stick with docker/distribution/reference

@legionus
Copy link
Contributor Author

legionus commented Oct 7, 2016

I took the function to separate the host name and repository from the docker.

--- FAIL: TestParseDockerImageReference (0.00s)
    helper_test.go:341: foo: registry: expected "", got "docker.io"
    helper_test.go:344: foo: namespace: expected "", got "library"
    helper_test.go:341: foo:tag: registry: expected "", got "docker.io"
    helper_test.go:344: foo:tag: namespace: expected "", got "library"
    helper_test.go:341: foo@sha256:3c87c572822935df60f0f5d3665bd376841a7fcfeb806b5f212de6a00e9a7b25: registry: expected "", got "docker.io"
    helper_test.go:344: foo@sha256:3c87c572822935df60f0f5d3665bd376841a7fcfeb806b5f212de6a00e9a7b25: namespace: expected "", got "library"
    helper_test.go:341: bar/foo: registry: expected "", got "docker.io"
    helper_test.go:341: bar/foo:tag: registry: expected "", got "docker.io"
    helper_test.go:341: bar/foo@sha256:3c87c572822935df60f0f5d3665bd376841a7fcfeb806b5f212de6a00e9a7b25: registry: expected "", got "docker.io"
    helper_test.go:341: bar/foo/baz: registry: expected "bar", got "docker.io"
    helper_test.go:344: bar/foo/baz: namespace: expected "foo", got "bar"
    helper_test.go:347: bar/foo/baz: name: expected "baz", got "foo/baz"
    helper_test.go:341: bar/library/baz: registry: expected "bar", got "docker.io"
    helper_test.go:344: bar/library/baz: namespace: expected "library", got "bar"
    helper_test.go:347: bar/library/baz: name: expected "baz", got "library/baz"
    helper_test.go:341: bar/foo/baz:tag: registry: expected "bar", got "docker.io"
    helper_test.go:344: bar/foo/baz:tag: namespace: expected "foo", got "bar"
    helper_test.go:347: bar/foo/baz:tag: name: expected "baz", got "foo/baz"
    helper_test.go:341: bar/foo/baz@sha256:3c87c572822935df60f0f5d3665bd376841a7fcfeb806b5f212de6a00e9a7b25: registry: expected "bar", got "docker.io"
    helper_test.go:344: bar/foo/baz@sha256:3c87c572822935df60f0f5d3665bd376841a7fcfeb806b5f212de6a00e9a7b25: namespace: expected "foo", got "bar"
    helper_test.go:347: bar/foo/baz@sha256:3c87c572822935df60f0f5d3665bd376841a7fcfeb806b5f212de6a00e9a7b25: name: expected "baz", got "foo/baz"
    helper_test.go:341: index.docker.io/bar: registry: expected "index.docker.io", got "docker.io"
    helper_test.go:341: index.docker.io/library/bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb:tag: registry: expected "index.docker.io", got "docker.io"
    helper_test.go:341: index.docker.io/bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb:tag: registry: expected "index.docker.io", got "docker.io"
    helper_test.go:335: index.docker.io/bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb:tag: unexpected non-error
    helper_test.go:341: bar/foo/baz/biz: registry: expected "bar", got "docker.io"
    helper_test.go:344: bar/foo/baz/biz: namespace: expected "foo", got "bar"
    helper_test.go:347: bar/foo/baz/biz: name: expected "baz/biz", got "foo/baz/biz"
FAIL

@legionus
Copy link
Contributor Author

legionus commented Oct 7, 2016

@miminar I think this is unacceptable as well. we will break everyone.

@miminar
Copy link

miminar commented Oct 7, 2016

I think this is unacceptable as well. we will break everyone.

By everyone you mean us? 😄

This PR attempts to get the parsing right. Different output for the same input is expected if the previous parsing was wrong. We just need to make sure that everything works as expected.

I wouldn't default to docker.io for empty registry. Docker image reference without a registry is still a valid reference. We have DockerClientDefaults() for defaulting to docker.io.

@legionus
Copy link
Contributor Author

legionus commented Oct 7, 2016

This PR attempts to get the parsing right. Different output for the same input is expected if the previous parsing was wrong. We just need to make sure that everything works as expected.

OK :)

I wouldn't default to docker.io for empty registry. Docker image reference without a registry is still a valid reference. We have DockerClientDefaults() for defaulting to docker.io.

If we do not want to use docker.io for empty registry then we shouldn't use library as default namespace and leave it empty for same reason (we have DockerClientDefaults()).

@legionus legionus force-pushed the refactor-parse-dockerimagereference branch from e3afe0b to 2ea0593 Compare October 7, 2016 10:40
repoParts := strings.Split(ref.Name, "/")

if len(repoParts) >= 2 {
if isRegistryName(repoParts[0]) {
Copy link

@miminar miminar Oct 7, 2016

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Is this even possible to satisfy? It is with localhost in name (e.g. registry.com/app/localhost/image). But it looks to me like a valid reference.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Fixed

@legionus legionus force-pushed the refactor-parse-dockerimagereference branch 6 times, most recently from 0613aae to d9b7feb Compare October 7, 2016 13:25
Copy link

@miminar miminar left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

LGTM. Just a note: the pkg/image/api/utils modules is intended to be imported in openshift/source-to-image to use the same parser and avoid duplicating the same hacks in different way.

@ncdc would you take a look as well?

break
}
return ref, fmt.Errorf("the docker pull spec %q must be two or three segments separated by slashes", spec)
// It's not enough just to use the reference.ParseNamed(). We have the fill
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

nit: s/We have the/We have to/

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Yes, typo. I'll fix it.

@@ -0,0 +1,53 @@
package utils
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

In kube we try to avoid generic "utils" packages. Not a deal breaker, but I'd recommend a more specific package name.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

github.com/openshift/origin/pkg/image/reference ?

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

WFM

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Fixed

@@ -488,7 +488,7 @@ func TestValidateImageStream(t *testing.T) {
},
},
expected: field.ErrorList{
field.Invalid(field.NewPath("spec", "tags").Key("badid").Child("from", "name"), "abc@badid", "only tags can be scheduled for import"),
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

It looks like we lost a test case where we validate that you can't specify a digest for import where the error returned is "only tags can be scheduled for import"

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

"abc@badid" was always wrong, but previously the error was ignored.
what do you mean "we lost" ?

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

There is no test case that validates it receives "only tags can be scheduled for import" as an error any more. Could you please add a test case that tries to schedule a valid pull-by-digest spec?

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@ncdc Fixed

return ref, err
}

if named, ok := dockerRef.(reference.Named); ok {
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Doesn't reference.ParseNamed return a reference.Named?

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Good catch! thanks!

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Fixed

Tag: "tag",
},
{
// docker.io/namespace/name == 255 chars without explicit namespace
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

s/without/with

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Fixed

@legionus legionus force-pushed the refactor-parse-dockerimagereference branch 3 times, most recently from 78c9a44 to 148e83a Compare October 7, 2016 15:41
@legionus legionus force-pushed the refactor-parse-dockerimagereference branch 4 times, most recently from bf5259e to 8b073e8 Compare October 11, 2016 10:18
@legionus
Copy link
Contributor Author

@ncdc please review again.

@legionus legionus force-pushed the refactor-parse-dockerimagereference branch from 8b073e8 to a9c2463 Compare October 11, 2016 11:34
@ncdc
Copy link
Contributor

ncdc commented Oct 11, 2016

It sure if I'll have time to review today. Feel free to find another
reviewer if needed.

On Tuesday, October 11, 2016, Alexey Gladkov [email protected]
wrote:

@ncdc https://github.com/ncdc please review again.


You are receiving this because you were mentioned.
Reply to this email directly, view it on GitHub
#11245 (comment),
or mute the thread
https://github.com/notifications/unsubscribe-auth/AAABYnjlCnFiwLxFPyxYkAfxPfVl43xrks5qy2KzgaJpZM4KP7r-
.

@legionus
Copy link
Contributor Author

It sure if I'll have time to review today. Feel free to find another reviewer if needed.

@ncdc Then please take off lock on this PR.

@legionus
Copy link
Contributor Author

@liggitt @smarterclayton please review

@legionus legionus force-pushed the refactor-parse-dockerimagereference branch from a9c2463 to e9843b1 Compare October 11, 2016 12:16
Copy link
Contributor

@ncdc ncdc left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Did another pass

@@ -346,6 +347,8 @@ func validImageStreamImage(imageNode *imagegraph.ImageStreamImageNode, imageStre
}
}
return false, dockerImageReference.ID
} else {
fmt.Fprintf(os.Stderr, "ERR(%s): %#+v\n", imageNode.Name, err)
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Is this for debugging purposes? If not, maybe something a bit gentler than "ERR" would be better?

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@ncdc I forgot to remove debugging. Fixed.

)

// NamedDockerImageReference points to a Docker image.
type NamedDockerImageReference struct {
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This type is identical in everything except name to DockerImageReference in pkg/image/api/types.go. And ParseNamedDockerImageReference below is effectively wrapped by pkg/image/api/helpers.go#ParseDockerImageReference. Can we collapse the two types and functions into just 1 type and 1 function?

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I split it to able use this parser in S2I as mentioned in #11245 (comment). S2I can't use ParseDockerImageReference directly because origin imports it. To avoid differences in the parser behavior we need to use one parser everywhere. So I move it into separate module with minimal dependencies.

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Ok

@legionus legionus force-pushed the refactor-parse-dockerimagereference branch from e9843b1 to 0cf14aa Compare October 11, 2016 12:34
@mfojtik
Copy link
Contributor

mfojtik commented Oct 12, 2016

flake: #8571

@mfojtik mfojtik added the lgtm Indicates that a PR is ready to be merged. label Oct 12, 2016
@mfojtik mfojtik added this to the 1.4.0 milestone Oct 12, 2016
@legionus legionus force-pushed the refactor-parse-dockerimagereference branch from 0cf14aa to 2c9ba48 Compare October 12, 2016 14:54
We can't remove ParseDockerImageReference and just use docker/distribution/reference
to parse DockerImageReference because we have to support few special cases related
to docker.io. Keeping it in mind, we can reimplement ParseDockerImageReference
to use new parser.

In addition we got new limits on the length of the DockerImageReference.
So, after refactoring our restrictions are pretty the same as in docker/distribution.

Signed-off-by: Gladkov Alexey <[email protected]>
@legionus legionus force-pushed the refactor-parse-dockerimagereference branch from 2c9ba48 to caa9083 Compare October 13, 2016 14:59
@openshift-bot
Copy link
Contributor

Evaluated for origin test up to caa9083

@openshift-bot
Copy link
Contributor

continuous-integration/openshift-jenkins/test SUCCESS (https://ci.openshift.redhat.com/jenkins/job/test_pr_origin/10015/) (Base Commit: 6b0457c)

@legionus
Copy link
Contributor Author

@mfojtik merge ?

@mfojtik
Copy link
Contributor

mfojtik commented Oct 13, 2016

[merge]

Michal Fojtik

On 13 October 2016 at 19:13:19, Alexey Gladkov ([email protected])
wrote:

@mfojtik https://github.com/mfojtik merge ?


You are receiving this because you were mentioned.
Reply to this email directly, view it on GitHub
#11245 (comment),
or mute the thread
https://github.com/notifications/unsubscribe-auth/AACsaHG9UWTQLfJW8fnIgawCIjyL8RgSks5qzmavgaJpZM4KP7r-
.

@openshift-bot
Copy link
Contributor

openshift-bot commented Oct 13, 2016

continuous-integration/openshift-jenkins/merge SUCCESS (https://ci.openshift.redhat.com/jenkins/job/test_pr_origin/10015/) (Image: devenv-rhel7_5179)

@openshift-bot
Copy link
Contributor

Evaluated for origin merge up to caa9083

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
component/imageregistry lgtm Indicates that a PR is ready to be merged.
Projects
None yet
Development

Successfully merging this pull request may close these issues.

5 participants