Skip to content

Commit

Permalink
fix: Fixed handling of docker images with repository domain in path
Browse files Browse the repository at this point in the history
  • Loading branch information
Stephan Lukas committed Apr 21, 2021
1 parent 1dccddf commit 06c778b
Show file tree
Hide file tree
Showing 5 changed files with 101 additions and 3 deletions.
1 change: 1 addition & 0 deletions go.mod
Original file line number Diff line number Diff line change
Expand Up @@ -9,4 +9,5 @@ require (
github.com/jedib0t/go-pretty/v6 v6.1.1 // indirect
github.com/opencontainers/image-spec v1.0.1 // indirect
github.com/pkg/errors v0.9.1 // indirect
github.com/stretchr/testify v1.7.0 // indirect
)
6 changes: 6 additions & 0 deletions go.sum
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@ github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03
github.com/OpenPeeDeeP/depguard v1.0.0/go.mod h1:7/4sitnI9YlQgTLLk734QlzXT8DuHVnAyztLplQjk+o=
github.com/StackExchange/wmi v0.0.0-20180116203802-5d049714c4a6/go.mod h1:3eOhrUMpNV+6aFIbp5/iudMxNCF27Vw2OZgy4xEx0Fg=
github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=
github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
github.com/docker/distribution v0.0.0-20171011171712-7484e51bf6af h1:ujR+JcSHkOZMctuIgvi+a/VHpTn0nSy0W7eV5p34xjg=
github.com/docker/distribution v0.0.0-20171011171712-7484e51bf6af/go.mod h1:J2gT2udsDAN96Uj4KfcMRqY0/ypR+oyYUYmja8H+y+w=
Expand Down Expand Up @@ -98,6 +99,7 @@ github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINE
github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4=
github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
github.com/pkg/profile v1.2.1/go.mod h1:hJw3o1OdXxsrSjjVksARp5W95eeEaEfptyVZyv6JUPA=
github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
github.com/quasilyte/go-consistent v0.0.0-20190521200055-c6f3937de18c/go.mod h1:5STLWrekHfjyYwxBRVRXNOSewLJ3PWfDJd1VyTS21fI=
github.com/rogpeppe/go-internal v1.1.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4=
Expand All @@ -120,6 +122,8 @@ github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+
github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs=
github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4=
github.com/stretchr/testify v1.7.0 h1:nwc3DEeHmmLAfoZucVR881uASk0Mfjw8xYJ99tb5CcY=
github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
github.com/timakin/bodyclose v0.0.0-20190721030226-87058b9bfcec/go.mod h1:Qimiffbc6q9tBWlVV6x0P9sat/ao1xEkREYPPj9hphk=
github.com/ultraware/funlen v0.0.1/go.mod h1:Dp4UiAus7Wdb9KUZsYWZEWiRzGuM2kXM1lPbfaF6xhA=
github.com/valyala/bytebufferpool v1.0.0/go.mod h1:6bBcMArwyJ5K/AmCkWv1jt77kVWyCJ6HpOuEn7z0Csc=
Expand Down Expand Up @@ -170,6 +174,8 @@ gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7/go.mod h1:dt/ZhP58zS4L8KSrWD
gopkg.in/yaml.v2 v2.0.0-20170812160011-eb3733d160e7/go.mod h1:JAlM8MvJe8wmxCU4Bli9HhUf9+ttbYbLASfIpnQbh74=
gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c h1:dUUwHk2QECo/6vqA44rthZ8ie2QXMNeKRTHCNY2nXvo=
gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
mvdan.cc/interfacer v0.0.0-20180901003855-c20040233aed/go.mod h1:Xkxe497xwlCKkIaQYRfC7CSLworTXY9RMqwhhCm+8Nc=
mvdan.cc/lint v0.0.0-20170908181259-adc824a0674b/go.mod h1:2odslEg/xrtNQqCYg2/jCoyKnw3vv5biOc3JnIcYfL4=
mvdan.cc/unparam v0.0.0-20190209190245-fbb59629db34/go.mod h1:H6SUd1XjIs+qQCyskXg5OFSrilMRUkD8ePJpHKDPaeY=
Expand Down
22 changes: 20 additions & 2 deletions src/docker/docker.go
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@ import (
"io/ioutil"
"net/http"
"net/url"
"regexp"
"strings"

"github.com/docker/distribution/manifest/schema2"
Expand All @@ -19,6 +20,9 @@ type ImageIdentifiers struct {
Tag string
}

var RegexpProtocol = regexp.MustCompile("^(http[s]?://)")
var RegexpDoubleSlash = regexp.MustCompile("/{2,}")

func parseBearer(bearer string) map[string]string {
out := make(map[string]string)

Expand All @@ -41,10 +45,24 @@ func parseBearer(bearer string) map[string]string {
return out
}

func ParseImageIdentifiers(dockerImagePath string) (*ImageIdentifiers, error) {
func ParseImageIdentifiers(dockerImagePath string, registryDomain string) (*ImageIdentifiers, error) {
registryDomain = strings.ToLower(registryDomain)
registryDomain = RegexpProtocol.ReplaceAllString(registryDomain, "")
registryDomain = strings.TrimRight(registryDomain, "/")

dockerImagePath = strings.ToLower(dockerImagePath)
dockerImagePath = RegexpProtocol.ReplaceAllString(dockerImagePath, "")
dockerImagePath = RegexpDoubleSlash.ReplaceAllString(dockerImagePath, "/")

if strings.HasPrefix(dockerImagePath, registryDomain) {
// Remove Domain
dockerImagePath = strings.Replace(dockerImagePath, registryDomain, "", 1)
}

dockerImagePathParts := strings.SplitN(dockerImagePath, ":", 2)
repository := ""
tag := ""

switch len(dockerImagePathParts) {
case 1:
repository = dockerImagePathParts[0]
Expand All @@ -57,7 +75,7 @@ func ParseImageIdentifiers(dockerImagePath string) (*ImageIdentifiers, error) {
}

return &ImageIdentifiers{
Repository: repository,
Repository: strings.Trim(repository, "/"),
Tag: tag,
}, nil
}
Expand Down
73 changes: 73 additions & 0 deletions src/docker/docker_test.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,73 @@
package docker

import (
"testing"

"github.com/stretchr/testify/assert"
)

func TestParseImageIdentifiers(t *testing.T) {
path := "myorga/myimage:v1.0.0"

identifier, err := ParseImageIdentifiers(path, "docker.mydomain.com")

assert.NoError(t, err)
assert.NotNil(t, identifier)
assert.Equal(t, "myorga/myimage", identifier.Repository)
assert.Equal(t, "v1.0.0", identifier.Tag)
}

func TestParseImageIdentifiersNoTag(t *testing.T) {
path := "myorga/myimage"

identifier, err := ParseImageIdentifiers(path, "docker.mydomain.com")

assert.NoError(t, err)
assert.NotNil(t, identifier)
assert.Equal(t, "myorga/myimage", identifier.Repository)
assert.Equal(t, "latest", identifier.Tag)
}

func TestParseImageIdentifiersSha256Tag(t *testing.T) {
path := "myorga/myimage:sha256:a3ed95caeb02ffe68cdd9fd84406680ae93d633cb16422d00e8a7c22955b46d4"

identifier, err := ParseImageIdentifiers(path, "docker.mydomain.com")

assert.NoError(t, err)
assert.NotNil(t, identifier)
assert.Equal(t, "myorga/myimage", identifier.Repository)
assert.Equal(t, "sha256:a3ed95caeb02ffe68cdd9fd84406680ae93d633cb16422d00e8a7c22955b46d4", identifier.Tag)
}

func TestParseImageIdentifiersWithDomain(t *testing.T) {
path := "test.domain.com/myorga/myimage:v1.0.0"

identifier, err := ParseImageIdentifiers(path, "test.domain.com")

assert.NoError(t, err)
assert.NotNil(t, identifier)
assert.Equal(t, "myorga/myimage", identifier.Repository)
assert.Equal(t, "v1.0.0", identifier.Tag)
}

func TestParseImageIdentifiersWithHttpURL(t *testing.T) {
path := "http://test.domain.com/myorga/myimage:v1.0.0"

identifier, err := ParseImageIdentifiers(path, "test.domain.com")

assert.NoError(t, err)
assert.NotNil(t, identifier)
assert.Equal(t, "myorga/myimage", identifier.Repository)
assert.Equal(t, "v1.0.0", identifier.Tag)
}

func TestParseImageIdentifiersWithHttpsURL(t *testing.T) {
path := "https://test.DOMAIN.com//myorga/myimage:v1.0.0"

identifier, err := ParseImageIdentifiers(path, "http://test.domain.com//")

assert.NoError(t, err)
assert.NotNil(t, identifier)
assert.Equal(t, "myorga/myimage", identifier.Repository)
assert.Equal(t, "v1.0.0", identifier.Tag)
}
2 changes: 1 addition & 1 deletion src/main.go
Original file line number Diff line number Diff line change
Expand Up @@ -74,7 +74,7 @@ func main() {
return
}

imageIdentifiers, err := docker.ParseImageIdentifiers(*flagImage)
imageIdentifiers, err := docker.ParseImageIdentifiers(*flagImage, dockerClient.GetRegistry())
if err != nil {
fmt.Fprintf(os.Stderr, "Error parsing docker image name: %s\n", err)

Expand Down

0 comments on commit 06c778b

Please sign in to comment.