Skip to content

Commit

Permalink
Merge pull request #9 from enoodle/parse_container_image_digest_from_…
Browse files Browse the repository at this point in the history
…docker_daemon

parse docker daemon digest and set it in image_ref
(cherry picked from commit 3688c988234d69b6963450a2e9b49c1c437f1fc1)

https://bugzilla.redhat.com/show_bug.cgi?id=1454446
  • Loading branch information
simon3z authored and simaishi committed May 22, 2017
1 parent 5f3ef08 commit 500a574
Show file tree
Hide file tree
Showing 3 changed files with 86 additions and 51 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -657,7 +657,8 @@ def parse_container_image(image, imageID)
end
end

# old docker references won't yield a digest and will always be distinct
# if a digest exists then it is more identifiying than the image name/repo/tag
# as one image might have many names/repos/tags.
container_image_identity = container_image[:digest] || container_image[:image_ref]
stored_container_image = @data_index.fetch_path(
:container_image, :by_digest, container_image_identity)
Expand Down Expand Up @@ -721,7 +722,7 @@ def parse_base_item(item)
def parse_image_name(image, image_ref)
# parsing using same logic as in docker
# https://github.com/docker/docker/blob/348f6529b71502b561aa493e250fd5be248da0d5/reference/reference.go#L174
image_definition_re = %r{
docker_pullable_re = %r{
\A
(?<protocol>#{ContainerImage::DOCKER_PULLABLE_PREFIX})?
(?:(?:
Expand All @@ -734,24 +735,37 @@ def parse_image_name(image, image_ref)
(?:\@(?<digest>.+))?
\z
}x
image_parts = image_definition_re.match(image)
image_ref_parts = image_definition_re.match(image_ref)

hostname = image_parts[:host] || image_parts[:host2] || image_parts[:localhost]
if image_ref.start_with?(ContainerImage::DOCKER_IMAGE_PREFIX) && image_parts[:digest]
image_ref = "%{prefix}%{registry}%{name}@%{digest}" % {
:prefix => ContainerImage::DOCKER_PULLABLE_PREFIX,
:registry => ("#{hostname}:#{image_parts[:port]}/" if hostname && image_parts[:port]),
docker_daemon_re = %r{
\A
(?<protocol>#{ContainerImage::DOCKER_IMAGE_PREFIX})?
(?<digest>(sha256:)?.+)?
\z
}x
image_parts = docker_pullable_re.match(image)
image_ref_parts = docker_pullable_re.match(image_ref) || docker_daemon_re.match(image_ref)

if image_ref.start_with?(ContainerImage::DOCKER_PULLABLE_PREFIX)
hostname = image_ref_parts[:host] || image_ref_parts[:host2]
port = image_ref_parts[:port]
digest = image_ref_parts[:digest]
else
hostname = image_parts[:host] || image_parts[:host2] || image_parts[:localhost]
port = image_parts[:port]
digest = image_parts[:digest] || image_ref_parts.try(:[], :digest)
registry = ((port.present? ? "#{hostname}:#{port}/" : "#{hostname}/") if hostname.present?)
image_ref = "%{prefix}%{registry}%{name}%{digest}" % {
:prefix => ContainerImage::DOCKER_IMAGE_PREFIX,
:registry => registry,
:name => image_parts[:name],
:digest => image_parts[:digest],
:digest => ("@#{digest}" if !digest.blank?),
}
end

[
{
:name => image_parts[:name],
:tag => image_parts[:tag],
:digest => image_parts[:digest] || (image_ref_parts[:digest] if image_ref_parts),
:digest => digest,
:image_ref => image_ref,
:registered_on => Time.now.utc
},
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -37,123 +37,130 @@
end

describe "parse_image_name" do
example_ref = "docker://abcdefghijklmnopqrstuvwxyz0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"
digest = 'abcdefghijklmnopqrstuvwxyz0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ'
example_ref = "docker://#{digest}"
example_images = [{:image_name => "example",
:image_ref => example_ref,
:image => {:name => "example", :tag => nil, :digest => nil,
:image_ref => example_ref},
:image => {:name => "example", :tag => nil, :digest => digest,
:image_ref => "docker://example@#{digest}"},
:registry => nil},

{:image_name => "example",
:image_ref => "docker://sha256:#{digest}",
:image => {:name => "example", :tag => nil, :digest => "sha256:#{digest}",
:image_ref => "docker://example@sha256:#{digest}"},
:registry => nil},

{:image_name => "example:tag",
:image_ref => example_ref,
:image => {:name => "example", :tag => "tag", :digest => nil,
:image_ref => example_ref},
:image => {:name => "example", :tag => "tag", :digest => digest,
:image_ref => "docker://example@#{digest}"},
:registry => nil},

{:image_name => "user/example",
:image_ref => example_ref,
:image => {:name => "user/example", :tag => nil, :digest => nil,
:image_ref => example_ref},
:image => {:name => "user/example", :tag => nil, :digest => digest,
:image_ref => "docker://user/example@#{digest}"},
:registry => nil},

{:image_name => "user/example:tag",
:image_ref => example_ref,
:image => {:name => "user/example", :tag => "tag", :digest => nil,
:image_ref => example_ref},
:image => {:name => "user/example", :tag => "tag", :digest => digest,
:image_ref => "docker://user/example@#{digest}"},
:registry => nil},

{:image_name => "example/subname/example",
:image_ref => example_ref,
:image => {:name => "example/subname/example", :tag => nil, :digest => nil,
:image_ref => example_ref},
:image => {:name => "example/subname/example", :tag => nil, :digest => digest,
:image_ref => "docker://example/subname/example@#{digest}"},
:registry => nil},

{:image_name => "example/subname/example:tag",
:image_ref => example_ref,
:image => {:name => "example/subname/example", :tag => "tag", :digest => nil,
:image_ref => example_ref},
:image => {:name => "example/subname/example", :tag => "tag", :digest => digest,
:image_ref => "docker://example/subname/example@#{digest}"},
:registry => nil},

{:image_name => "host:1234/subname/example",
:image_ref => example_ref,
:image => {:name => "subname/example", :tag => nil, :digest => nil,
:image_ref => example_ref},
:image => {:name => "subname/example", :tag => nil, :digest => digest,
:image_ref => "docker://host:1234/subname/example@#{digest}"},
:registry => {:name => "host", :host => "host", :port => "1234"}},

{:image_name => "host:1234/subname/example:tag",
:image_ref => example_ref,
:image => {:name => "subname/example", :tag => "tag", :digest => nil,
:image_ref => example_ref},
:image => {:name => "subname/example", :tag => "tag", :digest => digest,
:image_ref => "docker://host:1234/subname/example@#{digest}"},
:registry => {:name => "host", :host => "host", :port => "1234"}},

{:image_name => "host.com:1234/subname/example",
:image_ref => example_ref,
:image => {:name => "subname/example", :tag => nil, :digest => nil,
:image_ref => example_ref},
:image => {:name => "subname/example", :tag => nil, :digest => digest,
:image_ref => "docker://host.com:1234/subname/example@#{digest}"},
:registry => {:name => "host.com", :host => "host.com", :port => "1234"}},

{:image_name => "host.com:1234/subname/example:tag",
:image_ref => example_ref,
:image => {:name => "subname/example", :tag => "tag", :digest => nil,
:image_ref => example_ref},
:image => {:name => "subname/example", :tag => "tag", :digest => digest,
:image_ref => "docker://host.com:1234/subname/example@#{digest}"},
:registry => {:name => "host.com", :host => "host.com", :port => "1234"}},

{:image_name => "host.com/subname/example",
:image_ref => example_ref,
:image => {:name => "subname/example", :tag => nil, :digest => nil,
:image_ref => example_ref},
:image => {:name => "subname/example", :tag => nil, :digest => digest,
:image_ref => "docker://host.com/subname/example@#{digest}"},
:registry => {:name => "host.com", :host => "host.com", :port => nil}},

{:image_name => "host.com/example",
:image_ref => example_ref,
:image => {:name => "example", :tag => nil, :digest => nil,
:image_ref => example_ref},
:image => {:name => "example", :tag => nil, :digest => digest,
:image_ref => "docker://host.com/example@#{digest}"},
:registry => {:name => "host.com", :host => "host.com", :port => nil}},

{:image_name => "host.com:1234/subname/more/names/example:tag",
:image_ref => example_ref,
:image => {:name => "subname/more/names/example", :tag => "tag", :digest => nil,
:image_ref => example_ref},
:image => {:name => "subname/more/names/example", :tag => "tag", :digest => digest,
:image_ref => "docker://host.com:1234/subname/more/names/example@#{digest}"},
:registry => {:name => "host.com", :host => "host.com", :port => "1234"}},

{:image_name => "localhost:1234/name",
:image_ref => example_ref,
:image => {:name => "name", :tag => nil, :digest => nil,
:image_ref => example_ref},
:image => {:name => "name", :tag => nil, :digest => digest,
:image_ref => "docker://localhost:1234/name@#{digest}"},
:registry => {:name => "localhost", :host => "localhost", :port => "1234"}},

{:image_name => "localhost:1234/name@sha256:1234567abcdefg",
:image_ref => example_ref,
:image => {:name => "name", :tag => nil, :digest => "sha256:1234567abcdefg",
:image_ref => "docker-pullable://localhost:1234/name@sha256:1234567abcdefg"},
:image_ref => "docker://localhost:1234/name@sha256:1234567abcdefg"},
:registry => {:name => "localhost", :host => "localhost", :port => "1234"}},

# host with no port. more than one subdomain (a.b.c.com)
{:image_name => "reg.access.rh.com/openshift3/image-inspector",
:image_ref => example_ref,
:image => {:name => "openshift3/image-inspector", :tag => nil, :digest => nil,
:image_ref => example_ref},
:image => {:name => "openshift3/image-inspector", :tag => nil, :digest => digest,
:image_ref => "docker://reg.access.rh.com/openshift3/image-inspector@#{digest}"},
:registry => {:name => "reg.access.rh.com", :host => "reg.access.rh.com", :port => nil}},

# host with port. more than one subdomain (a.b.c.com:1234)
{:image_name => "host.access.com:1234/subname/more/names/example:tag",
:image_ref => example_ref,
:image => {:name => "subname/more/names/example", :tag => "tag", :digest => nil,
:image_ref => example_ref},
:image => {:name => "subname/more/names/example", :tag => "tag", :digest => digest,
:image_ref => "docker://host.access.com:1234/subname/more/names/example@#{digest}"},
:registry => {:name => "host.access.com", :host => "host.access.com", :port => "1234"}},

# localhost no port
{:image_name => "localhost/name",
:image_ref => example_ref,
:image => {:name => "name", :tag => nil, :digest => nil,
:image_ref => example_ref},
:image => {:name => "name", :tag => nil, :digest => digest,
:image_ref => "docker://localhost/name@#{digest}"},
:registry => {:name => "localhost", :host => "localhost", :port => nil}},

# tag and digest together
{:image_name => "reg.example.com:1234/name1:tagos@sha256:123abcdef",
:image_ref => example_ref,
:image => {:name => "name1", :tag => "tagos", :digest => "sha256:123abcdef",
:image_ref => "docker-pullable://reg.example.com:1234/name1@sha256:123abcdef"},
:image_ref => "docker://reg.example.com:1234/name1@sha256:123abcdef"},
:registry => {:name => "reg.example.com", :host => "reg.example.com", :port => "1234"}},

# digest from new docker-pullable
Expand All @@ -163,10 +170,24 @@
:image_ref => "docker-pullable://reg.example.com:1234/name1@sha256:321bcd"},
:registry => {:name => "reg.example.com", :host => "reg.example.com", :port => "1234"}},

# no image ref
{:image_name => "reg.example.com:1234/name1:tagos",
:image_ref => "",
:image => {:name => "name1", :tag => "tagos", :digest => nil,
:image_ref => "docker://reg.example.com:1234/name1"},
:registry => {:name => "reg.example.com", :host => "reg.example.com", :port => "1234"}},

# no image ref, digest in name
{:image_name => "reg.example.com:1234/name1:tagos@sha256:321bcd",
:image_ref => "",
:image => {:name => "name1", :tag => "tagos", :digest => "sha256:321bcd",
:image_ref => "docker://reg.example.com:1234/name1@sha256:321bcd"},
:registry => {:name => "reg.example.com", :host => "reg.example.com", :port => "1234"}},

{:image_name => "example@sha256:1234567abcdefg",
:image_ref => example_ref,
:image => {:name => "example", :tag => nil, :digest => "sha256:1234567abcdefg",
:image_ref => "docker-pullable://example@sha256:1234567abcdefg"},
:image_ref => "docker://example@sha256:1234567abcdefg"},
:registry => nil}]

example_images.each do |ex|
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -356,7 +356,7 @@ def assert_specific_container_image_and_registry
expect(@image).to have_attributes(
:name => "kubernetes/heapster",
:tag => "v0.16.0",
:image_ref => "docker://f79cf2701046bea8d5f1384f7efe79dd4d20620b3594fff5be39142fa862259d",
:image_ref => "docker://example.com:1234/kubernetes/heapster@f79cf2701046bea8d5f1384f7efe79dd4d20620b3594fff5be39142fa862259d",
)

expect(@image.container_image_registry).not_to be_nil
Expand Down

0 comments on commit 500a574

Please sign in to comment.