mirror of
https://github.com/kyverno/kyverno.git
synced 2025-03-31 03:45:17 +00:00
bug: making images
consistent with image
(#9147)
* adding `ReferenceWithTag` and `GetReferenceWithTag` + Populating them Signed-off-by: Shubham Singh <shubhammahar1306@gmail.com> * Adding tests for the same Signed-off-by: Shubham Singh <shubhammahar1306@gmail.com> * `ReferenceWithTag()` -> `ReferenceWithTag` Signed-off-by: Shubham Singh <shubhammahar1306@gmail.com> * `Strings()` -> `ReferenceWithTag` Signed-off-by: Shubham Singh <shubhammahar1306@gmail.com> * added `ReferenceWithTag` to image_test Signed-off-by: Shubham Singh <shubhammahar1306@gmail.com> * sorting out linter Signed-off-by: Shubham Singh <shubhammahar1306@gmail.com> --------- Signed-off-by: Shubham Singh <shubhammahar1306@gmail.com> Co-authored-by: Vishal Choudhary <vishal.choudhary@nirmata.com>
This commit is contained in:
parent
b54e6230c5
commit
6aaa06702f
4 changed files with 159 additions and 81 deletions
|
@ -292,8 +292,8 @@ func (ctx *context) AddElement(data interface{}, index, nesting int) error {
|
||||||
|
|
||||||
func (ctx *context) AddImageInfo(info apiutils.ImageInfo, cfg config.Configuration) error {
|
func (ctx *context) AddImageInfo(info apiutils.ImageInfo, cfg config.Configuration) error {
|
||||||
data := map[string]interface{}{
|
data := map[string]interface{}{
|
||||||
"reference": info.String(),
|
"reference": info.Reference,
|
||||||
"referenceWithTag": info.ReferenceWithTag(),
|
"referenceWithTag": info.ReferenceWithTag,
|
||||||
"registry": info.Registry,
|
"registry": info.Registry,
|
||||||
"path": info.Path,
|
"path": info.Path,
|
||||||
"name": info.Name,
|
"name": info.Name,
|
||||||
|
|
|
@ -24,10 +24,12 @@ func Test_extractImageInfo(t *testing.T) {
|
||||||
"initContainers": {
|
"initContainers": {
|
||||||
"init": {
|
"init": {
|
||||||
imageutils.ImageInfo{
|
imageutils.ImageInfo{
|
||||||
Registry: "index.docker.io",
|
Registry: "index.docker.io",
|
||||||
Name: "busybox",
|
Name: "busybox",
|
||||||
Path: "busybox",
|
Path: "busybox",
|
||||||
Tag: "v1.2.3",
|
Tag: "v1.2.3",
|
||||||
|
Reference: "index.docker.io/busybox:v1.2.3",
|
||||||
|
ReferenceWithTag: "index.docker.io/busybox:v1.2.3",
|
||||||
},
|
},
|
||||||
"/spec/initContainers/0/image",
|
"/spec/initContainers/0/image",
|
||||||
},
|
},
|
||||||
|
@ -35,10 +37,12 @@ func Test_extractImageInfo(t *testing.T) {
|
||||||
"containers": {
|
"containers": {
|
||||||
"nginx": {
|
"nginx": {
|
||||||
imageutils.ImageInfo{
|
imageutils.ImageInfo{
|
||||||
Registry: "docker.io",
|
Registry: "docker.io",
|
||||||
Name: "nginx",
|
Name: "nginx",
|
||||||
Path: "nginx",
|
Path: "nginx",
|
||||||
Tag: "latest",
|
Tag: "latest",
|
||||||
|
Reference: "docker.io/nginx:latest",
|
||||||
|
ReferenceWithTag: "docker.io/nginx:latest",
|
||||||
},
|
},
|
||||||
"/spec/containers/0/image",
|
"/spec/containers/0/image",
|
||||||
},
|
},
|
||||||
|
@ -46,10 +50,12 @@ func Test_extractImageInfo(t *testing.T) {
|
||||||
"ephemeralContainers": {
|
"ephemeralContainers": {
|
||||||
"ephemeral": {
|
"ephemeral": {
|
||||||
imageutils.ImageInfo{
|
imageutils.ImageInfo{
|
||||||
Registry: "docker.io",
|
Registry: "docker.io",
|
||||||
Name: "nginx",
|
Name: "nginx",
|
||||||
Path: "test/nginx",
|
Path: "test/nginx",
|
||||||
Tag: "latest",
|
Tag: "latest",
|
||||||
|
Reference: "docker.io/test/nginx:latest",
|
||||||
|
ReferenceWithTag: "docker.io/test/nginx:latest",
|
||||||
},
|
},
|
||||||
"/spec/ephemeralContainers/0/image",
|
"/spec/ephemeralContainers/0/image",
|
||||||
},
|
},
|
||||||
|
@ -62,10 +68,12 @@ func Test_extractImageInfo(t *testing.T) {
|
||||||
"containers": {
|
"containers": {
|
||||||
"nginx": {
|
"nginx": {
|
||||||
imageutils.ImageInfo{
|
imageutils.ImageInfo{
|
||||||
Registry: "docker.io",
|
Registry: "docker.io",
|
||||||
Name: "nginx",
|
Name: "nginx",
|
||||||
Path: "test/nginx",
|
Path: "test/nginx",
|
||||||
Tag: "latest",
|
Tag: "latest",
|
||||||
|
Reference: "docker.io/test/nginx:latest",
|
||||||
|
ReferenceWithTag: "docker.io/test/nginx:latest",
|
||||||
},
|
},
|
||||||
"/spec/containers/0/image",
|
"/spec/containers/0/image",
|
||||||
},
|
},
|
||||||
|
@ -78,11 +86,13 @@ func Test_extractImageInfo(t *testing.T) {
|
||||||
"initContainers": {
|
"initContainers": {
|
||||||
"init": {
|
"init": {
|
||||||
imageutils.ImageInfo{
|
imageutils.ImageInfo{
|
||||||
Registry: "fictional.registry.example:10443",
|
Registry: "fictional.registry.example:10443",
|
||||||
Name: "imagename",
|
Name: "imagename",
|
||||||
Path: "imagename",
|
Path: "imagename",
|
||||||
Tag: "tag",
|
Tag: "tag",
|
||||||
Digest: "sha256:ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff",
|
Digest: "sha256:ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff",
|
||||||
|
Reference: "fictional.registry.example:10443/imagename@sha256:ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff",
|
||||||
|
ReferenceWithTag: "fictional.registry.example:10443/imagename:tag",
|
||||||
},
|
},
|
||||||
"/spec/template/spec/initContainers/0/image",
|
"/spec/template/spec/initContainers/0/image",
|
||||||
},
|
},
|
||||||
|
@ -90,10 +100,12 @@ func Test_extractImageInfo(t *testing.T) {
|
||||||
"containers": {
|
"containers": {
|
||||||
"myapp": {
|
"myapp": {
|
||||||
imageutils.ImageInfo{
|
imageutils.ImageInfo{
|
||||||
Registry: "fictional.registry.example:10443",
|
Registry: "fictional.registry.example:10443",
|
||||||
Name: "imagename",
|
Name: "imagename",
|
||||||
Path: "imagename",
|
Path: "imagename",
|
||||||
Tag: "latest",
|
Tag: "latest",
|
||||||
|
Reference: "fictional.registry.example:10443/imagename:latest",
|
||||||
|
ReferenceWithTag: "fictional.registry.example:10443/imagename:latest",
|
||||||
},
|
},
|
||||||
"/spec/template/spec/containers/0/image",
|
"/spec/template/spec/containers/0/image",
|
||||||
},
|
},
|
||||||
|
@ -101,11 +113,13 @@ func Test_extractImageInfo(t *testing.T) {
|
||||||
"ephemeralContainers": {
|
"ephemeralContainers": {
|
||||||
"ephemeral": {
|
"ephemeral": {
|
||||||
imageutils.ImageInfo{
|
imageutils.ImageInfo{
|
||||||
Registry: "fictional.registry.example:10443",
|
Registry: "fictional.registry.example:10443",
|
||||||
Name: "imagename",
|
Name: "imagename",
|
||||||
Path: "imagename",
|
Path: "imagename",
|
||||||
Tag: "tag",
|
Tag: "tag",
|
||||||
Digest: "sha256:eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee",
|
Digest: "sha256:eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee",
|
||||||
|
Reference: "fictional.registry.example:10443/imagename@sha256:eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee",
|
||||||
|
ReferenceWithTag: "fictional.registry.example:10443/imagename:tag",
|
||||||
},
|
},
|
||||||
"/spec/template/spec/ephemeralContainers/0/image",
|
"/spec/template/spec/ephemeralContainers/0/image",
|
||||||
},
|
},
|
||||||
|
@ -118,10 +132,12 @@ func Test_extractImageInfo(t *testing.T) {
|
||||||
"containers": {
|
"containers": {
|
||||||
"hello": {
|
"hello": {
|
||||||
imageutils.ImageInfo{
|
imageutils.ImageInfo{
|
||||||
Registry: "test.example.com",
|
Registry: "test.example.com",
|
||||||
Name: "my-app",
|
Name: "my-app",
|
||||||
Path: "test/my-app",
|
Path: "test/my-app",
|
||||||
Tag: "v2",
|
Tag: "v2",
|
||||||
|
Reference: "test.example.com/test/my-app:v2",
|
||||||
|
ReferenceWithTag: "test.example.com/test/my-app:v2",
|
||||||
},
|
},
|
||||||
"/spec/jobTemplate/spec/template/spec/containers/0/image",
|
"/spec/jobTemplate/spec/template/spec/containers/0/image",
|
||||||
},
|
},
|
||||||
|
@ -139,28 +155,34 @@ func Test_extractImageInfo(t *testing.T) {
|
||||||
"custom": {
|
"custom": {
|
||||||
"/spec/steps/0/image": {
|
"/spec/steps/0/image": {
|
||||||
imageutils.ImageInfo{
|
imageutils.ImageInfo{
|
||||||
Registry: "docker.io",
|
Registry: "docker.io",
|
||||||
Name: "ubuntu",
|
Name: "ubuntu",
|
||||||
Path: "ubuntu",
|
Path: "ubuntu",
|
||||||
Tag: "latest",
|
Tag: "latest",
|
||||||
|
Reference: "docker.io/ubuntu:latest",
|
||||||
|
ReferenceWithTag: "docker.io/ubuntu:latest",
|
||||||
},
|
},
|
||||||
"/spec/steps/0/image",
|
"/spec/steps/0/image",
|
||||||
},
|
},
|
||||||
"/spec/steps/1/image": {
|
"/spec/steps/1/image": {
|
||||||
imageutils.ImageInfo{
|
imageutils.ImageInfo{
|
||||||
Registry: "gcr.io",
|
Registry: "gcr.io",
|
||||||
Name: "build-example",
|
Name: "build-example",
|
||||||
Path: "example-builders/build-example",
|
Path: "example-builders/build-example",
|
||||||
Tag: "latest",
|
Tag: "latest",
|
||||||
|
Reference: "gcr.io/example-builders/build-example:latest",
|
||||||
|
ReferenceWithTag: "gcr.io/example-builders/build-example:latest",
|
||||||
},
|
},
|
||||||
"/spec/steps/1/image",
|
"/spec/steps/1/image",
|
||||||
},
|
},
|
||||||
"/spec/steps/2/image": {
|
"/spec/steps/2/image": {
|
||||||
imageutils.ImageInfo{
|
imageutils.ImageInfo{
|
||||||
Registry: "gcr.io",
|
Registry: "gcr.io",
|
||||||
Name: "push-example",
|
Name: "push-example",
|
||||||
Path: "example-builders/push-example",
|
Path: "example-builders/push-example",
|
||||||
Tag: "latest",
|
Tag: "latest",
|
||||||
|
Reference: "gcr.io/example-builders/push-example:latest",
|
||||||
|
ReferenceWithTag: "gcr.io/example-builders/push-example:latest",
|
||||||
},
|
},
|
||||||
"/spec/steps/2/image",
|
"/spec/steps/2/image",
|
||||||
},
|
},
|
||||||
|
@ -177,19 +199,23 @@ func Test_extractImageInfo(t *testing.T) {
|
||||||
"steps": {
|
"steps": {
|
||||||
"dockerfile-pushexample": {
|
"dockerfile-pushexample": {
|
||||||
imageutils.ImageInfo{
|
imageutils.ImageInfo{
|
||||||
Registry: "gcr.io",
|
Registry: "gcr.io",
|
||||||
Name: "push-example",
|
Name: "push-example",
|
||||||
Path: "example-builders/push-example",
|
Path: "example-builders/push-example",
|
||||||
Tag: "latest",
|
Tag: "latest",
|
||||||
|
Reference: "gcr.io/example-builders/push-example:latest",
|
||||||
|
ReferenceWithTag: "gcr.io/example-builders/push-example:latest",
|
||||||
},
|
},
|
||||||
"/spec/steps/1/image",
|
"/spec/steps/1/image",
|
||||||
},
|
},
|
||||||
"ubuntu-example": {
|
"ubuntu-example": {
|
||||||
imageutils.ImageInfo{
|
imageutils.ImageInfo{
|
||||||
Registry: "docker.io",
|
Registry: "docker.io",
|
||||||
Name: "ubuntu",
|
Name: "ubuntu",
|
||||||
Path: "ubuntu",
|
Path: "ubuntu",
|
||||||
Tag: "latest",
|
Tag: "latest",
|
||||||
|
Reference: "docker.io/ubuntu:latest",
|
||||||
|
ReferenceWithTag: "docker.io/ubuntu:latest",
|
||||||
},
|
},
|
||||||
"/spec/steps/0/image",
|
"/spec/steps/0/image",
|
||||||
},
|
},
|
||||||
|
@ -207,10 +233,12 @@ func Test_extractImageInfo(t *testing.T) {
|
||||||
"steps": {
|
"steps": {
|
||||||
"echo": {
|
"echo": {
|
||||||
imageutils.ImageInfo{
|
imageutils.ImageInfo{
|
||||||
Registry: "docker.io",
|
Registry: "docker.io",
|
||||||
Name: "alpine",
|
Name: "alpine",
|
||||||
Path: "alpine",
|
Path: "alpine",
|
||||||
Tag: "latest",
|
Tag: "latest",
|
||||||
|
Reference: "docker.io/alpine:latest",
|
||||||
|
ReferenceWithTag: "docker.io/alpine:latest",
|
||||||
},
|
},
|
||||||
"/spec/steps/0/image",
|
"/spec/steps/0/image",
|
||||||
},
|
},
|
||||||
|
@ -228,10 +256,12 @@ func Test_extractImageInfo(t *testing.T) {
|
||||||
"custom": {
|
"custom": {
|
||||||
"/spec/source/registry/url": {
|
"/spec/source/registry/url": {
|
||||||
imageutils.ImageInfo{
|
imageutils.ImageInfo{
|
||||||
Registry: "docker.io",
|
Registry: "docker.io",
|
||||||
Name: "fedora-cloud-registry-disk-demo",
|
Name: "fedora-cloud-registry-disk-demo",
|
||||||
Path: "kubevirt/fedora-cloud-registry-disk-demo",
|
Path: "kubevirt/fedora-cloud-registry-disk-demo",
|
||||||
Tag: "latest",
|
Tag: "latest",
|
||||||
|
Reference: "docker.io/kubevirt/fedora-cloud-registry-disk-demo:latest",
|
||||||
|
ReferenceWithTag: "docker.io/kubevirt/fedora-cloud-registry-disk-demo:latest",
|
||||||
},
|
},
|
||||||
"/spec/source/registry/url",
|
"/spec/source/registry/url",
|
||||||
},
|
},
|
||||||
|
|
|
@ -23,6 +23,12 @@ type ImageInfo struct {
|
||||||
|
|
||||||
// Digest is the image digest portion e.g. `sha256:128c6e3534b842a2eec139999b8ce8aa9a2af9907e2b9269550809d18cd832a3`
|
// Digest is the image digest portion e.g. `sha256:128c6e3534b842a2eec139999b8ce8aa9a2af9907e2b9269550809d18cd832a3`
|
||||||
Digest string `json:"digest,omitempty"`
|
Digest string `json:"digest,omitempty"`
|
||||||
|
|
||||||
|
// Reference is an optional readable reference for the image e.g. `docker.io/nginx`
|
||||||
|
Reference string `json:"reference,omitempty"`
|
||||||
|
|
||||||
|
// ReferenceWithTag is an optional readable reference for the image along with the image tag e.g. `docker.io/nginx:v10`
|
||||||
|
ReferenceWithTag string `json:"referenceWithTag,omitempty"`
|
||||||
}
|
}
|
||||||
|
|
||||||
func (i *ImageInfo) String() string {
|
func (i *ImageInfo) String() string {
|
||||||
|
@ -39,14 +45,6 @@ func (i *ImageInfo) String() string {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func (i *ImageInfo) ReferenceWithTag() string {
|
|
||||||
if i.Registry != "" {
|
|
||||||
return fmt.Sprintf("%s/%s:%s", i.Registry, i.Path, i.Tag)
|
|
||||||
} else {
|
|
||||||
return fmt.Sprintf("%s:%s", i.Path, i.Tag)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func GetImageInfo(image string, cfg config.Configuration) (*ImageInfo, error) {
|
func GetImageInfo(image string, cfg config.Configuration) (*ImageInfo, error) {
|
||||||
// adding the default domain in order to properly parse image info
|
// adding the default domain in order to properly parse image info
|
||||||
fullImageName := addDefaultRegistry(image, cfg)
|
fullImageName := addDefaultRegistry(image, cfg)
|
||||||
|
@ -55,7 +53,7 @@ func GetImageInfo(image string, cfg config.Configuration) (*ImageInfo, error) {
|
||||||
return nil, fmt.Errorf("bad image: %s, defaultRegistry: %s, enableDefaultRegistryMutation: %t: %w", fullImageName, config.Configuration.GetDefaultRegistry(cfg), config.Configuration.GetEnableDefaultRegistryMutation(cfg), err)
|
return nil, fmt.Errorf("bad image: %s, defaultRegistry: %s, enableDefaultRegistryMutation: %t: %w", fullImageName, config.Configuration.GetDefaultRegistry(cfg), config.Configuration.GetEnableDefaultRegistryMutation(cfg), err)
|
||||||
}
|
}
|
||||||
|
|
||||||
var registry, path, name, tag, digest string
|
var registry, path, name, tag, digest, referenceWithTag string
|
||||||
if named, ok := ref.(reference.Named); ok {
|
if named, ok := ref.(reference.Named); ok {
|
||||||
registry = reference.Domain(named)
|
registry = reference.Domain(named)
|
||||||
path = reference.Path(named)
|
path = reference.Path(named)
|
||||||
|
@ -77,13 +75,23 @@ func GetImageInfo(image string, cfg config.Configuration) (*ImageInfo, error) {
|
||||||
registry = ""
|
registry = ""
|
||||||
}
|
}
|
||||||
|
|
||||||
return &ImageInfo{
|
if registry != "" {
|
||||||
Registry: registry,
|
referenceWithTag = fmt.Sprintf("%s/%s:%s", registry, path, tag)
|
||||||
Name: name,
|
} else {
|
||||||
Path: path,
|
referenceWithTag = fmt.Sprintf("%s:%s", path, tag)
|
||||||
Tag: tag,
|
}
|
||||||
Digest: digest,
|
|
||||||
}, nil
|
imageInfo := &ImageInfo{
|
||||||
|
Registry: registry,
|
||||||
|
Name: name,
|
||||||
|
Path: path,
|
||||||
|
Tag: tag,
|
||||||
|
Digest: digest,
|
||||||
|
ReferenceWithTag: referenceWithTag,
|
||||||
|
}
|
||||||
|
|
||||||
|
imageInfo.Reference = imageInfo.String()
|
||||||
|
return imageInfo, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
// addDefaultRegistry always adds default registry
|
// addDefaultRegistry always adds default registry
|
||||||
|
|
|
@ -142,7 +142,47 @@ func Test_ReferenceWithTag(t *testing.T) {
|
||||||
for _, test := range testCases {
|
for _, test := range testCases {
|
||||||
imageInfo, err := GetImageInfo(test.input, cfg)
|
imageInfo, err := GetImageInfo(test.input, cfg)
|
||||||
assert.NoError(t, err)
|
assert.NoError(t, err)
|
||||||
assert.Equal(t, test.expected, imageInfo.ReferenceWithTag())
|
assert.Equal(t, test.expected, imageInfo.ReferenceWithTag)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func Test_ReferenceAndReferenceWithTag(t *testing.T) {
|
||||||
|
testCases := []struct {
|
||||||
|
input string
|
||||||
|
expectedReference string
|
||||||
|
expectedReferenceWithTag string
|
||||||
|
}{{
|
||||||
|
input: "nginx",
|
||||||
|
expectedReference: "docker.io/nginx:latest",
|
||||||
|
expectedReferenceWithTag: "docker.io/nginx:latest",
|
||||||
|
}, {
|
||||||
|
input: "nginx:v10.3",
|
||||||
|
expectedReference: "docker.io/nginx:v10.3",
|
||||||
|
expectedReferenceWithTag: "docker.io/nginx:v10.3",
|
||||||
|
}, {
|
||||||
|
input: "docker.io/test/nginx:v10.3",
|
||||||
|
expectedReference: "docker.io/test/nginx:v10.3",
|
||||||
|
expectedReferenceWithTag: "docker.io/test/nginx:v10.3",
|
||||||
|
}, {
|
||||||
|
input: "test/nginx",
|
||||||
|
expectedReference: "docker.io/test/nginx:latest",
|
||||||
|
expectedReferenceWithTag: "docker.io/test/nginx:latest",
|
||||||
|
}, {
|
||||||
|
input: "localhost:4443/test/nginx",
|
||||||
|
expectedReference: "localhost:4443/test/nginx:latest",
|
||||||
|
expectedReferenceWithTag: "localhost:4443/test/nginx:latest",
|
||||||
|
}, {
|
||||||
|
input: "docker.io/test/centos@sha256:dead07b4d8ed7e29e98de0f4504d87e8880d4347859d839686a31da35a3b532f",
|
||||||
|
expectedReference: "docker.io/test/centos@sha256:dead07b4d8ed7e29e98de0f4504d87e8880d4347859d839686a31da35a3b532f",
|
||||||
|
expectedReferenceWithTag: "docker.io/test/centos:",
|
||||||
|
}}
|
||||||
|
cfg, err := initializeMockConfig("docker.io", true)
|
||||||
|
assert.NoError(t, err)
|
||||||
|
for _, test := range testCases {
|
||||||
|
imageInfo, err := GetImageInfo(test.input, cfg)
|
||||||
|
assert.NoError(t, err)
|
||||||
|
assert.Equal(t, test.expectedReference, imageInfo.Reference)
|
||||||
|
assert.Equal(t, test.expectedReferenceWithTag, imageInfo.ReferenceWithTag)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Add table
Reference in a new issue