2022-05-03 10:45:08 +02:00
package api
2022-04-11 10:30:38 +01:00
import (
"testing"
2022-05-03 10:45:08 +02:00
kyvernov1 "github.com/kyverno/kyverno/api/kyverno/v1"
2023-01-02 18:14:40 +01:00
"github.com/kyverno/kyverno/pkg/config"
2022-04-11 10:30:38 +01:00
imageutils "github.com/kyverno/kyverno/pkg/utils/image"
2023-01-03 13:02:15 +01:00
kubeutils "github.com/kyverno/kyverno/pkg/utils/kube"
2022-04-11 10:30:38 +01:00
"gotest.tools/assert"
)
2023-04-04 15:05:29 +02:00
var cfg = config . NewDefaultConfiguration ( false )
2023-01-02 18:14:40 +01:00
2022-04-11 10:30:38 +01:00
func Test_extractImageInfo ( t * testing . T ) {
tests := [ ] struct {
2022-05-03 10:45:08 +02:00
extractionConfig kyvernov1 . ImageExtractorConfigs
2022-04-14 17:08:30 +01:00
raw [ ] byte
2022-04-20 17:01:02 +02:00
images map [ string ] map [ string ] ImageInfo
2022-04-11 10:30:38 +01:00
} {
{
raw : [ ] byte ( ` { "apiVersion": "v1","kind": "Pod","metadata": { "name": "myapp"},"spec": { "initContainers": [ { "name": "init","image": "index.docker.io/busybox:v1.2.3"}],"containers": [ { "name": "nginx","image": "nginx:latest"}], "ephemeralContainers": [ { "name": "ephemeral", "image":"test/nginx:latest"}]}} ` ) ,
2022-04-20 17:01:02 +02:00
images : map [ string ] map [ string ] ImageInfo {
2022-04-11 10:30:38 +01:00
"initContainers" : {
2022-04-20 17:01:02 +02:00
"init" : {
imageutils . ImageInfo {
Registry : "index.docker.io" ,
Name : "busybox" ,
Path : "busybox" ,
Tag : "v1.2.3" ,
} ,
"/spec/initContainers/0/image" ,
} ,
2022-04-11 10:30:38 +01:00
} ,
"containers" : {
2022-04-20 17:01:02 +02:00
"nginx" : {
imageutils . ImageInfo {
Registry : "docker.io" ,
Name : "nginx" ,
Path : "nginx" ,
Tag : "latest" ,
} ,
"/spec/containers/0/image" ,
} ,
2022-04-11 10:30:38 +01:00
} ,
"ephemeralContainers" : {
2022-04-20 17:01:02 +02:00
"ephemeral" : {
imageutils . ImageInfo {
Registry : "docker.io" ,
Name : "nginx" ,
Path : "test/nginx" ,
Tag : "latest" ,
} ,
"/spec/ephemeralContainers/0/image" ,
} ,
2022-04-11 10:30:38 +01:00
} ,
} ,
} ,
{
raw : [ ] byte ( ` { "apiVersion": "v1","kind": "Pod","metadata": { "name": "myapp"},"spec": { "containers": [ { "name": "nginx","image": "test/nginx:latest"}]}} ` ) ,
2022-04-20 17:01:02 +02:00
images : map [ string ] map [ string ] ImageInfo {
2022-04-11 10:30:38 +01:00
"containers" : {
2022-04-20 17:01:02 +02:00
"nginx" : {
imageutils . ImageInfo {
Registry : "docker.io" ,
Name : "nginx" ,
Path : "test/nginx" ,
Tag : "latest" ,
} ,
"/spec/containers/0/image" ,
} ,
2022-04-11 10:30:38 +01:00
} ,
} ,
} ,
{
raw : [ ] byte ( ` { "apiVersion": "apps/v1","kind": "Deployment","metadata": { "name": "myapp"},"spec": { "selector": { "matchLabels": { "app": "myapp"}},"template": { "metadata": { "labels": { "app": "myapp"}},"spec": { "initContainers": [ { "name": "init","image": "fictional.registry.example:10443/imagename:tag@sha256:ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"}],"containers": [ { "name": "myapp","image": "fictional.registry.example:10443/imagename"}],"ephemeralContainers": [ { "name": "ephemeral","image": "fictional.registry.example:10443/imagename:tag@sha256:eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee"}] }}}} ` ) ,
2022-04-20 17:01:02 +02:00
images : map [ string ] map [ string ] ImageInfo {
2022-04-11 10:30:38 +01:00
"initContainers" : {
2022-04-20 17:01:02 +02:00
"init" : {
imageutils . ImageInfo {
Registry : "fictional.registry.example:10443" ,
Name : "imagename" ,
Path : "imagename" ,
Tag : "tag" ,
Digest : "sha256:ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff" ,
} ,
"/spec/template/spec/initContainers/0/image" ,
} ,
2022-04-11 10:30:38 +01:00
} ,
"containers" : {
2022-04-20 17:01:02 +02:00
"myapp" : {
imageutils . ImageInfo {
Registry : "fictional.registry.example:10443" ,
Name : "imagename" ,
Path : "imagename" ,
Tag : "latest" ,
} ,
"/spec/template/spec/containers/0/image" ,
} ,
2022-04-11 10:30:38 +01:00
} ,
"ephemeralContainers" : {
2022-04-20 17:01:02 +02:00
"ephemeral" : {
imageutils . ImageInfo {
Registry : "fictional.registry.example:10443" ,
Name : "imagename" ,
Path : "imagename" ,
Tag : "tag" ,
Digest : "sha256:eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee" ,
} ,
"/spec/template/spec/ephemeralContainers/0/image" ,
} ,
2022-04-11 10:30:38 +01:00
} ,
} ,
} ,
{
raw : [ ] byte ( ` { "apiVersion": "batch/v1beta1","kind": "CronJob","metadata": { "name": "hello"},"spec": { "schedule": "*/1 * * * *","jobTemplate": { "spec": { "template": { "spec": { "containers": [ { "name": "hello","image": "test.example.com/test/my-app:v2"}]}}}}}} ` ) ,
2022-04-20 17:01:02 +02:00
images : map [ string ] map [ string ] ImageInfo {
2022-04-11 10:30:38 +01:00
"containers" : {
2022-04-20 17:01:02 +02:00
"hello" : {
imageutils . ImageInfo {
Registry : "test.example.com" ,
Name : "my-app" ,
Path : "test/my-app" ,
Tag : "v2" ,
} ,
"/spec/jobTemplate/spec/template/spec/containers/0/image" ,
} ,
2022-04-11 10:30:38 +01:00
} ,
} ,
} ,
2022-04-14 17:08:30 +01:00
{
2022-05-03 10:45:08 +02:00
extractionConfig : kyvernov1 . ImageExtractorConfigs {
"Task" : [ ] kyvernov1 . ImageExtractorConfig {
2022-04-14 17:08:30 +01:00
{ Path : "/spec/steps/*/image" } ,
} ,
} ,
raw : [ ] byte ( ` { "apiVersion":"tekton.dev/v1beta1","kind":"Task","metadata": { "name":"example-task-name"},"spec": { "params":[ { "name":"pathToDockerFile","type":"string","description":"The path to the dockerfile to build","default":"/workspace/workspace/Dockerfile"}],"resources": { "inputs":[ { "name":"workspace","type":"git"}],"outputs":[ { "name":"builtImage","type":"image"}]},"steps":[ { "name":"ubuntu-example","image":"ubuntu","args":["ubuntu-build-example","SECRETS-example.md"]}, { "image":"gcr.io/example-builders/build-example","command":["echo"],"args":["$(params.pathToDockerFile)"]}, { "name":"dockerfile-pushexample","image":"gcr.io/example-builders/push-example","args":["push","$(resources.outputs.builtImage.url)"],"volumeMounts":[ { "name":"docker-socket-example","mountPath":"/var/run/docker.sock"}]}],"volumes":[ { "name":"example-volume","emptyDir": { }}]}} ` ) ,
2022-04-20 17:01:02 +02:00
images : map [ string ] map [ string ] ImageInfo {
2022-04-14 17:08:30 +01:00
"custom" : {
"/spec/steps/0/image" : {
2022-04-20 17:01:02 +02:00
imageutils . ImageInfo {
Registry : "docker.io" ,
Name : "ubuntu" ,
Path : "ubuntu" ,
Tag : "latest" ,
} ,
"/spec/steps/0/image" ,
2022-04-14 17:08:30 +01:00
} ,
"/spec/steps/1/image" : {
2022-04-20 17:01:02 +02:00
imageutils . ImageInfo {
Registry : "gcr.io" ,
Name : "build-example" ,
Path : "example-builders/build-example" ,
Tag : "latest" ,
} ,
"/spec/steps/1/image" ,
2022-04-14 17:08:30 +01:00
} ,
"/spec/steps/2/image" : {
2022-04-20 17:01:02 +02:00
imageutils . ImageInfo {
Registry : "gcr.io" ,
Name : "push-example" ,
Path : "example-builders/push-example" ,
Tag : "latest" ,
} ,
"/spec/steps/2/image" ,
2022-04-14 17:08:30 +01:00
} ,
} ,
} ,
} ,
{
2022-05-03 10:45:08 +02:00
extractionConfig : kyvernov1 . ImageExtractorConfigs {
"Task" : [ ] kyvernov1 . ImageExtractorConfig {
2022-04-14 17:08:30 +01:00
{ Name : "steps" , Path : "/spec/steps/*" , Value : "image" , Key : "name" } ,
} ,
} , raw : [ ] byte ( ` { "apiVersion":"tekton.dev/v1beta1","kind":"Task","metadata": { "name":"example-task-name"},"spec": { "steps":[ { "name":"ubuntu-example","image":"ubuntu","args":["ubuntu-build-example","SECRETS-example.md"]}, { "name":"dockerfile-pushexample","image":"gcr.io/example-builders/push-example","args":["push","$(resources.outputs.builtImage.url)"]}]}} ` ) ,
2022-04-20 17:01:02 +02:00
images : map [ string ] map [ string ] ImageInfo {
2022-04-14 17:08:30 +01:00
"steps" : {
"dockerfile-pushexample" : {
2022-04-20 17:01:02 +02:00
imageutils . ImageInfo {
Registry : "gcr.io" ,
Name : "push-example" ,
Path : "example-builders/push-example" ,
Tag : "latest" ,
} ,
"/spec/steps/1/image" ,
2022-04-14 17:08:30 +01:00
} ,
"ubuntu-example" : {
2022-04-20 17:01:02 +02:00
imageutils . ImageInfo {
Registry : "docker.io" ,
Name : "ubuntu" ,
Path : "ubuntu" ,
Tag : "latest" ,
} ,
"/spec/steps/0/image" ,
2022-04-14 17:08:30 +01:00
} ,
} ,
} ,
} ,
2022-05-01 16:44:51 -07:00
{
2022-05-03 10:45:08 +02:00
extractionConfig : kyvernov1 . ImageExtractorConfigs {
"ClusterTask" : [ ] kyvernov1 . ImageExtractorConfig {
2022-05-01 16:44:51 -07:00
{ Name : "steps" , Path : "/spec/steps/*" , Value : "image" , Key : "name" } ,
} ,
} ,
raw : [ ] byte ( ` { "apiVersion":"tekton.dev/v1beta1","kind":"ClusterTask","metadata": { "name":"hello","resourceVersion":"5752181","uid":"395010b6-fe0e-4364-a7b4-6abb86974d54"},"spec": { "steps":[ { "image":"alpine","name":"echo","resources": { },"script":"#!/bin/sh\necho \"Hello World\"\n"}]}} ` ) ,
images : map [ string ] map [ string ] ImageInfo {
"steps" : {
"echo" : {
imageutils . ImageInfo {
Registry : "docker.io" ,
Name : "alpine" ,
Path : "alpine" ,
Tag : "latest" ,
} ,
"/spec/steps/0/image" ,
} ,
} ,
} ,
} ,
2023-02-08 06:54:59 -05:00
{
extractionConfig : kyvernov1 . ImageExtractorConfigs {
"DataVolume" : [ ] kyvernov1 . ImageExtractorConfig {
{ Path : "/spec/source/registry/url" , JMESPath : "trim_prefix(@, 'docker://')" } ,
} ,
} ,
raw : [ ] byte ( ` { "apiVersion":"cdi.kubevirt.io/v1beta1","kind":"DataVolume","metadata": { "name":"registry-image-datavolume"},"spec": { "source": { "registry": { "url":"docker://kubevirt/fedora-cloud-registry-disk-demo"}},"pvc": { "accessModes":["ReadWriteOnce"],"resources": { "requests": { "storage":"5Gi"}}}}} ` ) ,
images : map [ string ] map [ string ] ImageInfo {
"custom" : {
"/spec/source/registry/url" : {
imageutils . ImageInfo {
Registry : "docker.io" ,
Name : "fedora-cloud-registry-disk-demo" ,
Path : "kubevirt/fedora-cloud-registry-disk-demo" ,
Tag : "latest" ,
} ,
"/spec/source/registry/url" ,
} ,
} ,
} ,
} ,
2022-04-11 10:30:38 +01:00
}
for _ , test := range tests {
2023-01-03 13:02:15 +01:00
resource , err := kubeutils . BytesToUnstructured ( test . raw )
2022-04-11 10:30:38 +01:00
assert . NilError ( t , err )
2023-01-02 18:14:40 +01:00
images , err := ExtractImagesFromResource ( * resource , test . extractionConfig , cfg )
2022-05-01 16:44:51 -07:00
assert . NilError ( t , err )
2022-04-11 10:30:38 +01:00
assert . DeepEqual ( t , test . images , images )
}
}