From 7aa96a56882ffc3b53a79326256fecebb96c9785 Mon Sep 17 00:00:00 2001 From: Mateusz Urbanek Date: Fri, 23 Aug 2024 12:56:41 +0200 Subject: [PATCH 01/10] chore(e2e): ctlptl config for KinD cluster Signed-off-by: Mateusz Urbanek --- test/ctlptl.yaml | 10 ++++++++++ 1 file changed, 10 insertions(+) create mode 100644 test/ctlptl.yaml diff --git a/test/ctlptl.yaml b/test/ctlptl.yaml new file mode 100644 index 00000000..124f538b --- /dev/null +++ b/test/ctlptl.yaml @@ -0,0 +1,10 @@ +--- +apiVersion: ctlptl.dev/v1alpha1 +kind: Registry +name: ctlptl-registry +port: 5005 +--- +apiVersion: ctlptl.dev/v1alpha1 +kind: Cluster +product: kind +registry: ctlptl-registry From 4537562f573dd52f566c7e050f969925206c3398 Mon Sep 17 00:00:00 2001 From: Mateusz Urbanek Date: Fri, 23 Aug 2024 12:57:20 +0200 Subject: [PATCH 02/10] test(e2e): add test suite for S3 Key authentication Signed-off-by: Mateusz Urbanek --- test/e2e/s3/key/delete/chainsaw-test.yaml | 108 ++++++++++++++++++ .../s3/key/delete/resources/BucketAccess.yaml | 9 ++ .../delete/resources/BucketAccessClass.yaml | 7 ++ .../s3/key/delete/resources/BucketClaim.yaml | 7 ++ .../s3/key/delete/resources/BucketClass.yaml | 7 ++ test/e2e/s3/key/retain/chainsaw-test.yaml | 108 ++++++++++++++++++ .../s3/key/retain/resources/BucketAccess.yaml | 9 ++ .../retain/resources/BucketAccessClass.yaml | 7 ++ .../s3/key/retain/resources/BucketClaim.yaml | 7 ++ .../s3/key/retain/resources/BucketClass.yaml | 7 ++ test/e2e/tests/controller.yaml | 7 ++ test/e2e/tests/validator.yaml | 72 ++++++++++++ 12 files changed, 355 insertions(+) create mode 100644 test/e2e/s3/key/delete/chainsaw-test.yaml create mode 100644 test/e2e/s3/key/delete/resources/BucketAccess.yaml create mode 100644 test/e2e/s3/key/delete/resources/BucketAccessClass.yaml create mode 100644 test/e2e/s3/key/delete/resources/BucketClaim.yaml create mode 100644 test/e2e/s3/key/delete/resources/BucketClass.yaml create mode 100644 test/e2e/s3/key/retain/chainsaw-test.yaml create mode 100644 test/e2e/s3/key/retain/resources/BucketAccess.yaml create mode 100644 test/e2e/s3/key/retain/resources/BucketAccessClass.yaml create mode 100644 test/e2e/s3/key/retain/resources/BucketClaim.yaml create mode 100644 test/e2e/s3/key/retain/resources/BucketClass.yaml create mode 100644 test/e2e/tests/controller.yaml create mode 100644 test/e2e/tests/validator.yaml diff --git a/test/e2e/s3/key/delete/chainsaw-test.yaml b/test/e2e/s3/key/delete/chainsaw-test.yaml new file mode 100644 index 00000000..7543230c --- /dev/null +++ b/test/e2e/s3/key/delete/chainsaw-test.yaml @@ -0,0 +1,108 @@ +--- +# yaml-language-server: $schema=https://raw.githubusercontent.com/kyverno/chainsaw/main/.schemas/json/test-chainsaw-v1alpha1.json +apiVersion: chainsaw.kyverno.io/v1alpha1 +kind: Test +metadata: + name: test-s3-iam-delete + labels: + sample: "true" + protocol: "S3" + authenticationType: "Key" + deletionPolicy: "Delete" +spec: + template: true + steps: + - name: Check if COSI Controller exist + try: + - assert: + file: ../../../tests/controller.yaml + - name: Create test BucketClass and BucketAccessClass + try: + - apply: + file: ./resources/BucketClass.yaml + - apply: + file: ./resources/BucketAccessClass.yaml + - name: Create BucketClaim + try: + - apply: + file: ./resources/BucketClaim.yaml + - name: Check if BucketClaim is ready + try: + - assert: + resource: + apiVersion: objectstorage.k8s.io/v1alpha1 + kind: BucketClaim + metadata: + name: test-s3-iam-delete + status: + bucketReady: true + - name: Create BucketAccess + try: + - apply: + file: ./resources/BucketAccess.yaml + - name: Check if BucketAccess is granted + try: + - assert: + resource: + apiVersion: objectstorage.k8s.io/v1alpha1 + kind: BucketAccess + metadata: + name: test-s3-iam-delete + status: + accessGranted: true + - name: Check if Secret exists + try: + - assert: + resource: + apiVersion: v1 + kind: Secret + metadata: + name: test-s3-iam-delete + - name: Run ObjectStorage validation tool + # TODO: This should be either a standalone test tool developed by us, to run test suite: + # - validate Secret format; + # - validate connectivity to the Object Storage server; + # Right now it is using busybox to check if the secret has correct format. + try: + - apply: + file: ../../../tests/validator.yaml + - create: + resource: + apiVersion: batch/v1 + kind: Job + metadata: + name: test-s3-iam-delete + spec: + ttlSecondsAfterFinished: 100 + template: + spec: + restartPolicy: Never + containers: + - name: secret-test + image: docker.io/library/python:3.12 + command: [ "sh", "/validation/validation.sh" ] + volumeMounts: + - mountPath: /validator + name: validator + - mountPath: /conf + name: secret-vol + volumes: + - name: validator + configMap: + name: validator + - name: secret-vol + secret: + secretName: test-retain-secret + items: + - iam: BucketInfo + path: BucketInfo.json + - name: Check if ObjectStorage validation tool completed succesfully + try: + - assert: + resource: + apiVersion: batch/v1 + kind: Job + metadata: + name: test-s3-iam-delete + status: + succeeded: 1 diff --git a/test/e2e/s3/key/delete/resources/BucketAccess.yaml b/test/e2e/s3/key/delete/resources/BucketAccess.yaml new file mode 100644 index 00000000..3d93c9da --- /dev/null +++ b/test/e2e/s3/key/delete/resources/BucketAccess.yaml @@ -0,0 +1,9 @@ +apiVersion: objectstorage.k8s.io/v1alpha1 +kind: BucketAccess +metadata: + name: test-s3-iam-delete +spec: + bucketClaimName: test-s3-iam-delete + protocol: S3 + bucketAccessClassName: test-s3-iam-delete + credentialsSecretName: test-s3-iam-delete diff --git a/test/e2e/s3/key/delete/resources/BucketAccessClass.yaml b/test/e2e/s3/key/delete/resources/BucketAccessClass.yaml new file mode 100644 index 00000000..5da33d07 --- /dev/null +++ b/test/e2e/s3/key/delete/resources/BucketAccessClass.yaml @@ -0,0 +1,7 @@ +apiVersion: objectstorage.k8s.io/v1alpha1 +kind: BucketAccessClass +metadata: + name: test-s3-iam-delete +driverName: sample-driver.objectstorage.k8s.io +authenticationType: IAM +parameters: {} diff --git a/test/e2e/s3/key/delete/resources/BucketClaim.yaml b/test/e2e/s3/key/delete/resources/BucketClaim.yaml new file mode 100644 index 00000000..3c17d083 --- /dev/null +++ b/test/e2e/s3/key/delete/resources/BucketClaim.yaml @@ -0,0 +1,7 @@ +apiVersion: objectstorage.k8s.io/v1alpha1 +kind: BucketClaim +metadata: + name: test-s3-iam-delete +spec: + bucketClassName: test-s3-iam-delete + protocols: [ 'S3' ] diff --git a/test/e2e/s3/key/delete/resources/BucketClass.yaml b/test/e2e/s3/key/delete/resources/BucketClass.yaml new file mode 100644 index 00000000..4d7a6f1c --- /dev/null +++ b/test/e2e/s3/key/delete/resources/BucketClass.yaml @@ -0,0 +1,7 @@ +apiVersion: objectstorage.k8s.io/v1alpha1 +kind: BucketClass +metadata: + name: test-s3-iam-delete +driverName: sample-driver.objectstorage.k8s.io +deletionPolicy: Delete +parameters: {} diff --git a/test/e2e/s3/key/retain/chainsaw-test.yaml b/test/e2e/s3/key/retain/chainsaw-test.yaml new file mode 100644 index 00000000..2a352524 --- /dev/null +++ b/test/e2e/s3/key/retain/chainsaw-test.yaml @@ -0,0 +1,108 @@ +--- +# yaml-language-server: $schema=https://raw.githubusercontent.com/kyverno/chainsaw/main/.schemas/json/test-chainsaw-v1alpha1.json +apiVersion: chainsaw.kyverno.io/v1alpha1 +kind: Test +metadata: + name: test-s3-key-retain + labels: + sample: "true" + protocol: "S3" + authenticationType: "Key" + deletionPolicy: "Retain" +spec: + template: true + steps: + - name: Check if COSI Controller exist + try: + - assert: + file: ../../../tests/controller.yaml + - name: Create test BucketClass and BucketAccessClass + try: + - apply: + file: ./resources/BucketClass.yaml + - apply: + file: ./resources/BucketAccessClass.yaml + - name: Create BucketClaim + try: + - apply: + file: ./resources/BucketClaim.yaml + - name: Check if BucketClaim is ready + try: + - assert: + resource: + apiVersion: objectstorage.k8s.io/v1alpha1 + kind: BucketClaim + metadata: + name: test-s3-key-retain + status: + bucketReady: true + - name: Create BucketAccess + try: + - apply: + file: ./resources/BucketAccess.yaml + - name: Check if BucketAccess is granted + try: + - assert: + resource: + apiVersion: objectstorage.k8s.io/v1alpha1 + kind: BucketAccess + metadata: + name: test-s3-key-retain + status: + accessGranted: true + - name: Check if Secret exists + try: + - assert: + resource: + apiVersion: v1 + kind: Secret + metadata: + name: test-s3-key-retain + - name: Run ObjectStorage validation tool + # TODO: This should be either a standalone test tool developed by us, to run test suite: + # - validate Secret format; + # - validate connectivity to the Object Storage server; + # Right now it is using busybox to check if the secret has correct format. + try: + - apply: + file: ../../../tests/validator.yaml + - create: + resource: + apiVersion: batch/v1 + kind: Job + metadata: + name: test-s3-key-retain + spec: + ttlSecondsAfterFinished: 100 + template: + spec: + restartPolicy: Never + containers: + - name: secret-test + image: docker.io/library/python:3.12 + command: [ "sh", "/validation/validation.sh" ] + volumeMounts: + - mountPath: /validator + name: validator + - mountPath: /conf + name: secret-vol + volumes: + - name: validator + configMap: + name: validator + - name: secret-vol + secret: + secretName: test-s3-key-retain + items: + - iam: BucketInfo + path: BucketInfo.json + - name: Check if ObjectStorage validation tool completed succesfully + try: + - assert: + resource: + apiVersion: batch/v1 + kind: Job + metadata: + name: test-s3-key-retain + status: + succeeded: 1 diff --git a/test/e2e/s3/key/retain/resources/BucketAccess.yaml b/test/e2e/s3/key/retain/resources/BucketAccess.yaml new file mode 100644 index 00000000..f0f989c6 --- /dev/null +++ b/test/e2e/s3/key/retain/resources/BucketAccess.yaml @@ -0,0 +1,9 @@ +apiVersion: objectstorage.k8s.io/v1alpha1 +kind: BucketAccess +metadata: + name: test-s3-key-retain +spec: + bucketClaimName: test-s3-key-retain + protocol: S3 + bucketAccessClassName: test-s3-key-retain + credentialsSecretName: test-s3-key-retain diff --git a/test/e2e/s3/key/retain/resources/BucketAccessClass.yaml b/test/e2e/s3/key/retain/resources/BucketAccessClass.yaml new file mode 100644 index 00000000..583abb02 --- /dev/null +++ b/test/e2e/s3/key/retain/resources/BucketAccessClass.yaml @@ -0,0 +1,7 @@ +apiVersion: objectstorage.k8s.io/v1alpha1 +kind: BucketAccessClass +metadata: + name: test-s3-key-retain +driverName: sample-driver.objectstorage.k8s.io +authenticationType: IAM +parameters: {} diff --git a/test/e2e/s3/key/retain/resources/BucketClaim.yaml b/test/e2e/s3/key/retain/resources/BucketClaim.yaml new file mode 100644 index 00000000..6838604c --- /dev/null +++ b/test/e2e/s3/key/retain/resources/BucketClaim.yaml @@ -0,0 +1,7 @@ +apiVersion: objectstorage.k8s.io/v1alpha1 +kind: BucketClaim +metadata: + name: test-s3-key-retain +spec: + bucketClassName: test-s3-key-retain + protocols: [ 'S3' ] diff --git a/test/e2e/s3/key/retain/resources/BucketClass.yaml b/test/e2e/s3/key/retain/resources/BucketClass.yaml new file mode 100644 index 00000000..5f3da09e --- /dev/null +++ b/test/e2e/s3/key/retain/resources/BucketClass.yaml @@ -0,0 +1,7 @@ +apiVersion: objectstorage.k8s.io/v1alpha1 +kind: BucketClass +metadata: + name: test-s3-key-retain +driverName: sample-driver.objectstorage.k8s.io +deletionPolicy: Retain +parameters: {} diff --git a/test/e2e/tests/controller.yaml b/test/e2e/tests/controller.yaml new file mode 100644 index 00000000..26102720 --- /dev/null +++ b/test/e2e/tests/controller.yaml @@ -0,0 +1,7 @@ +apiVersion: apps/v1 +kind: Deployment +metadata: + name: objectstorage-controller + namespace: default +status: + availableReplicas: 1 diff --git a/test/e2e/tests/validator.yaml b/test/e2e/tests/validator.yaml new file mode 100644 index 00000000..93b73be6 --- /dev/null +++ b/test/e2e/tests/validator.yaml @@ -0,0 +1,72 @@ +apiVersion: v1 +kind: ConfigMap +metadata: + name: validator +data: + schema.json: | + { + "$schema": "http://json-schema.org/draft-07/schema#", + "type": "object", + "properties": { + "spec": { + "type": "object", + "properties": { + "bucketName": { + "type": "string" + }, + "authenticationType": { + "type": "string", + "enum": ["IAM", "Key"] + }, + "protocols": { + "type": "array", + "items": { + "type": "string", + "enum": ["S3", "Azure", "GCP"] + }, + "minItems": 1 + }, + "secretS3": { + "type": "object", + "properties": { + "endpoint": { + "type": "string" + }, + "region": { + "type": "string" + }, + "accessKeyID": { + "type": "string" + }, + "accessSecretKey": { + "type": "string" + } + }, + "required": ["endpoint", "region", "accessKeyID", "accessSecretKey"] + }, + "secretAzure": { + "type": "object", + "properties": { + "accessToken": { + "type": "string" + }, + "expiryTimeStamp": { + "type": "string" + } + }, + "required": ["accessToken", "expiryTimeStamp"] + } + }, + "required": ["bucketName", "authenticationType", "protocols"], + "oneOf": [ + { "required": ["secretS3"] }, + { "required": ["secretAzure"] } + ] + } + }, + "required": ["spec"] + } + validator.sh: | + #!/usr/bin/env sh + pip install check-jsonschema + check-jsonschema --schema /validator/schema.json /conf/BucketInfo.json From caef566d0b71a93a9e6e4875528e05ee3ac17b02 Mon Sep 17 00:00:00 2001 From: Mateusz Urbanek Date: Fri, 23 Aug 2024 13:00:43 +0200 Subject: [PATCH 03/10] test(e2e): add test suite for S3 IAM authentication Signed-off-by: Mateusz Urbanek --- test/e2e/s3/iam/delete/chainsaw-test.yaml | 107 ++++++++++++++++++ .../s3/iam/delete/resources/BucketAccess.yaml | 9 ++ .../delete/resources/BucketAccessClass.yaml | 7 ++ .../s3/iam/delete/resources/BucketClaim.yaml | 7 ++ .../s3/iam/delete/resources/BucketClass.yaml | 7 ++ test/e2e/s3/iam/retain/chainsaw-test.yaml | 107 ++++++++++++++++++ .../s3/iam/retain/resources/BucketAccess.yaml | 9 ++ .../retain/resources/BucketAccessClass.yaml | 7 ++ .../s3/iam/retain/resources/BucketClaim.yaml | 7 ++ .../s3/iam/retain/resources/BucketClass.yaml | 7 ++ 10 files changed, 274 insertions(+) create mode 100644 test/e2e/s3/iam/delete/chainsaw-test.yaml create mode 100644 test/e2e/s3/iam/delete/resources/BucketAccess.yaml create mode 100644 test/e2e/s3/iam/delete/resources/BucketAccessClass.yaml create mode 100644 test/e2e/s3/iam/delete/resources/BucketClaim.yaml create mode 100644 test/e2e/s3/iam/delete/resources/BucketClass.yaml create mode 100644 test/e2e/s3/iam/retain/chainsaw-test.yaml create mode 100644 test/e2e/s3/iam/retain/resources/BucketAccess.yaml create mode 100644 test/e2e/s3/iam/retain/resources/BucketAccessClass.yaml create mode 100644 test/e2e/s3/iam/retain/resources/BucketClaim.yaml create mode 100644 test/e2e/s3/iam/retain/resources/BucketClass.yaml diff --git a/test/e2e/s3/iam/delete/chainsaw-test.yaml b/test/e2e/s3/iam/delete/chainsaw-test.yaml new file mode 100644 index 00000000..6d8e582a --- /dev/null +++ b/test/e2e/s3/iam/delete/chainsaw-test.yaml @@ -0,0 +1,107 @@ +--- +# yaml-language-server: $schema=https://raw.githubusercontent.com/kyverno/chainsaw/main/.schemas/json/test-chainsaw-v1alpha1.json +apiVersion: chainsaw.kyverno.io/v1alpha1 +kind: Test +metadata: + name: test-s3-iam-delete + labels: + protocol: "S3" + authenticationType: "IAM" + deletionPolicy: "Delete" +spec: + template: true + steps: + - name: Check if COSI Controller exist + try: + - assert: + file: ../../../tests/controller.yaml + - name: Create test BucketClass and BucketAccessClass + try: + - apply: + file: ./resources/BucketClass.yaml + - apply: + file: ./resources/BucketAccessClass.yaml + - name: Create BucketClaim + try: + - apply: + file: ./resources/BucketClaim.yaml + - name: Check if BucketClaim is ready + try: + - assert: + resource: + apiVersion: objectstorage.k8s.io/v1alpha1 + kind: BucketClaim + metadata: + name: test-s3-iam-delete + status: + bucketReady: true + - name: Create BucketAccess + try: + - apply: + file: ./resources/BucketAccess.yaml + - name: Check if BucketAccess is granted + try: + - assert: + resource: + apiVersion: objectstorage.k8s.io/v1alpha1 + kind: BucketAccess + metadata: + name: test-s3-iam-delete + status: + accessGranted: true + - name: Check if Secret exists + try: + - assert: + resource: + apiVersion: v1 + kind: Secret + metadata: + name: test-s3-iam-delete + - name: Run ObjectStorage validation tool + # TODO: This should be either a standalone test tool developed by us, to run test suite: + # - validate Secret format; + # - validate connectivity to the Object Storage server; + # Right now it is using busybox to check if the secret has correct format. + try: + - apply: + file: ../../../tests/validator.yaml + - create: + resource: + apiVersion: batch/v1 + kind: Job + metadata: + name: test-s3-iam-delete + spec: + ttlSecondsAfterFinished: 100 + template: + spec: + restartPolicy: Never + containers: + - name: secret-test + image: docker.io/library/python:3.12 + command: [ "sh", "/validation/validation.sh" ] + volumeMounts: + - mountPath: /validator + name: validator + - mountPath: /conf + name: secret-vol + volumes: + - name: validator + configMap: + name: validator + - name: secret-vol + secret: + secretName: test-retain-secret + items: + - iam: BucketInfo + path: BucketInfo.json + - name: Check if ObjectStorage validation tool completed succesfully + try: + - assert: + resource: + apiVersion: batch/v1 + kind: Job + metadata: + name: test-s3-iam-delete + status: + succeeded: 1 diff --git a/test/e2e/s3/iam/delete/resources/BucketAccess.yaml b/test/e2e/s3/iam/delete/resources/BucketAccess.yaml new file mode 100644 index 00000000..3d93c9da --- /dev/null +++ b/test/e2e/s3/iam/delete/resources/BucketAccess.yaml @@ -0,0 +1,9 @@ +apiVersion: objectstorage.k8s.io/v1alpha1 +kind: BucketAccess +metadata: + name: test-s3-iam-delete +spec: + bucketClaimName: test-s3-iam-delete + protocol: S3 + bucketAccessClassName: test-s3-iam-delete + credentialsSecretName: test-s3-iam-delete diff --git a/test/e2e/s3/iam/delete/resources/BucketAccessClass.yaml b/test/e2e/s3/iam/delete/resources/BucketAccessClass.yaml new file mode 100644 index 00000000..5da33d07 --- /dev/null +++ b/test/e2e/s3/iam/delete/resources/BucketAccessClass.yaml @@ -0,0 +1,7 @@ +apiVersion: objectstorage.k8s.io/v1alpha1 +kind: BucketAccessClass +metadata: + name: test-s3-iam-delete +driverName: sample-driver.objectstorage.k8s.io +authenticationType: IAM +parameters: {} diff --git a/test/e2e/s3/iam/delete/resources/BucketClaim.yaml b/test/e2e/s3/iam/delete/resources/BucketClaim.yaml new file mode 100644 index 00000000..3c17d083 --- /dev/null +++ b/test/e2e/s3/iam/delete/resources/BucketClaim.yaml @@ -0,0 +1,7 @@ +apiVersion: objectstorage.k8s.io/v1alpha1 +kind: BucketClaim +metadata: + name: test-s3-iam-delete +spec: + bucketClassName: test-s3-iam-delete + protocols: [ 'S3' ] diff --git a/test/e2e/s3/iam/delete/resources/BucketClass.yaml b/test/e2e/s3/iam/delete/resources/BucketClass.yaml new file mode 100644 index 00000000..4d7a6f1c --- /dev/null +++ b/test/e2e/s3/iam/delete/resources/BucketClass.yaml @@ -0,0 +1,7 @@ +apiVersion: objectstorage.k8s.io/v1alpha1 +kind: BucketClass +metadata: + name: test-s3-iam-delete +driverName: sample-driver.objectstorage.k8s.io +deletionPolicy: Delete +parameters: {} diff --git a/test/e2e/s3/iam/retain/chainsaw-test.yaml b/test/e2e/s3/iam/retain/chainsaw-test.yaml new file mode 100644 index 00000000..6437fe56 --- /dev/null +++ b/test/e2e/s3/iam/retain/chainsaw-test.yaml @@ -0,0 +1,107 @@ +--- +# yaml-language-server: $schema=https://raw.githubusercontent.com/kyverno/chainsaw/main/.schemas/json/test-chainsaw-v1alpha1.json +apiVersion: chainsaw.kyverno.io/v1alpha1 +kind: Test +metadata: + name: test-s3-iam-retain + labels: + protocol: "S3" + authenticationType: "IAM" + deletionPolicy: "Retain" +spec: + template: true + steps: + - name: Check if COSI Controller exist + try: + - assert: + file: ../../../tests/controller.yaml + - name: Create test BucketClass and BucketAccessClass + try: + - apply: + file: ./resources/BucketClass.yaml + - apply: + file: ./resources/BucketAccessClass.yaml + - name: Create BucketClaim + try: + - apply: + file: ./resources/BucketClaim.yaml + - name: Check if BucketClaim is ready + try: + - assert: + resource: + apiVersion: objectstorage.k8s.io/v1alpha1 + kind: BucketClaim + metadata: + name: test-s3-iam-retain + status: + bucketReady: true + - name: Create BucketAccess + try: + - apply: + file: ./resources/BucketAccess.yaml + - name: Check if BucketAccess is granted + try: + - assert: + resource: + apiVersion: objectstorage.k8s.io/v1alpha1 + kind: BucketAccess + metadata: + name: test-s3-iam-retain + status: + accessGranted: true + - name: Check if Secret exists + try: + - assert: + resource: + apiVersion: v1 + kind: Secret + metadata: + name: test-s3-iam-retain + - name: Run ObjectStorage validation tool + # TODO: This should be either a standalone test tool developed by us, to run test suite: + # - validate Secret format; + # - validate connectivity to the Object Storage server; + # Right now it is using busybox to check if the secret has correct format. + try: + - apply: + file: ../../../tests/validator.yaml + - create: + resource: + apiVersion: batch/v1 + kind: Job + metadata: + name: test-s3-iam-retain + spec: + ttlSecondsAfterFinished: 100 + template: + spec: + restartPolicy: Never + containers: + - name: secret-test + image: docker.io/library/python:3.12 + command: [ "sh", "/validation/validation.sh" ] + volumeMounts: + - mountPath: /validator + name: validator + - mountPath: /conf + name: secret-vol + volumes: + - name: validator + configMap: + name: validator + - name: secret-vol + secret: + secretName: test-s3-iam-retain + items: + - iam: BucketInfo + path: BucketInfo.json + - name: Check if ObjectStorage validation tool completed succesfully + try: + - assert: + resource: + apiVersion: batch/v1 + kind: Job + metadata: + name: test-s3-iam-retain + status: + succeeded: 1 diff --git a/test/e2e/s3/iam/retain/resources/BucketAccess.yaml b/test/e2e/s3/iam/retain/resources/BucketAccess.yaml new file mode 100644 index 00000000..38d6a5bf --- /dev/null +++ b/test/e2e/s3/iam/retain/resources/BucketAccess.yaml @@ -0,0 +1,9 @@ +apiVersion: objectstorage.k8s.io/v1alpha1 +kind: BucketAccess +metadata: + name: test-s3-iam-retain +spec: + bucketClaimName: test-s3-iam-retain + protocol: S3 + bucketAccessClassName: test-s3-iam-retain + credentialsSecretName: test-s3-iam-retain diff --git a/test/e2e/s3/iam/retain/resources/BucketAccessClass.yaml b/test/e2e/s3/iam/retain/resources/BucketAccessClass.yaml new file mode 100644 index 00000000..2ed4788e --- /dev/null +++ b/test/e2e/s3/iam/retain/resources/BucketAccessClass.yaml @@ -0,0 +1,7 @@ +apiVersion: objectstorage.k8s.io/v1alpha1 +kind: BucketAccessClass +metadata: + name: test-s3-iam-retain +driverName: sample-driver.objectstorage.k8s.io +authenticationType: IAM +parameters: {} diff --git a/test/e2e/s3/iam/retain/resources/BucketClaim.yaml b/test/e2e/s3/iam/retain/resources/BucketClaim.yaml new file mode 100644 index 00000000..627b4cba --- /dev/null +++ b/test/e2e/s3/iam/retain/resources/BucketClaim.yaml @@ -0,0 +1,7 @@ +apiVersion: objectstorage.k8s.io/v1alpha1 +kind: BucketClaim +metadata: + name: test-s3-iam-retain +spec: + bucketClassName: test-s3-iam-retain + protocols: [ 'S3' ] diff --git a/test/e2e/s3/iam/retain/resources/BucketClass.yaml b/test/e2e/s3/iam/retain/resources/BucketClass.yaml new file mode 100644 index 00000000..29583f29 --- /dev/null +++ b/test/e2e/s3/iam/retain/resources/BucketClass.yaml @@ -0,0 +1,7 @@ +apiVersion: objectstorage.k8s.io/v1alpha1 +kind: BucketClass +metadata: + name: test-s3-iam-retain +driverName: sample-driver.objectstorage.k8s.io +deletionPolicy: Retain +parameters: {} From 2b58a08fefde7431bcb96d02f4724e6254fd51b0 Mon Sep 17 00:00:00 2001 From: Mateusz Urbanek Date: Fri, 23 Aug 2024 13:02:54 +0200 Subject: [PATCH 04/10] test(e2e): add test suite for Azure IAM authentication Signed-off-by: Mateusz Urbanek --- test/e2e/azure/iam/delete/chainsaw-test.yaml | 107 ++++++++++++++++++ .../iam/delete/resources/BucketAccess.yaml | 9 ++ .../delete/resources/BucketAccessClass.yaml | 7 ++ .../iam/delete/resources/BucketClaim.yaml | 7 ++ .../iam/delete/resources/BucketClass.yaml | 7 ++ test/e2e/azure/iam/retain/chainsaw-test.yaml | 107 ++++++++++++++++++ .../iam/retain/resources/BucketAccess.yaml | 9 ++ .../retain/resources/BucketAccessClass.yaml | 7 ++ .../iam/retain/resources/BucketClaim.yaml | 7 ++ .../iam/retain/resources/BucketClass.yaml | 7 ++ 10 files changed, 274 insertions(+) create mode 100644 test/e2e/azure/iam/delete/chainsaw-test.yaml create mode 100644 test/e2e/azure/iam/delete/resources/BucketAccess.yaml create mode 100644 test/e2e/azure/iam/delete/resources/BucketAccessClass.yaml create mode 100644 test/e2e/azure/iam/delete/resources/BucketClaim.yaml create mode 100644 test/e2e/azure/iam/delete/resources/BucketClass.yaml create mode 100644 test/e2e/azure/iam/retain/chainsaw-test.yaml create mode 100644 test/e2e/azure/iam/retain/resources/BucketAccess.yaml create mode 100644 test/e2e/azure/iam/retain/resources/BucketAccessClass.yaml create mode 100644 test/e2e/azure/iam/retain/resources/BucketClaim.yaml create mode 100644 test/e2e/azure/iam/retain/resources/BucketClass.yaml diff --git a/test/e2e/azure/iam/delete/chainsaw-test.yaml b/test/e2e/azure/iam/delete/chainsaw-test.yaml new file mode 100644 index 00000000..b2ed663b --- /dev/null +++ b/test/e2e/azure/iam/delete/chainsaw-test.yaml @@ -0,0 +1,107 @@ +--- +# yaml-language-server: $schema=https://raw.githubusercontent.com/kyverno/chainsaw/main/.schemas/json/test-chainsaw-v1alpha1.json +apiVersion: chainsaw.kyverno.io/v1alpha1 +kind: Test +metadata: + name: test-azure-iam-delete + labels: + protocol: "Azure" + authenticationType: "IAM" + deletionPolicy: "Delete" +spec: + template: true + steps: + - name: Check if COSI Controller exist + try: + - assert: + file: ../../../tests/controller.yaml + - name: Create test BucketClass and BucketAccessClass + try: + - apply: + file: ./resources/BucketClass.yaml + - apply: + file: ./resources/BucketAccessClass.yaml + - name: Create BucketClaim + try: + - apply: + file: ./resources/BucketClaim.yaml + - name: Check if BucketClaim is ready + try: + - assert: + resource: + apiVersion: objectstorage.k8s.io/v1alpha1 + kind: BucketClaim + metadata: + name: test-azure-iam-delete + status: + bucketReady: true + - name: Create BucketAccess + try: + - apply: + file: ./resources/BucketAccess.yaml + - name: Check if BucketAccess is granted + try: + - assert: + resource: + apiVersion: objectstorage.k8s.io/v1alpha1 + kind: BucketAccess + metadata: + name: test-azure-iam-delete + status: + accessGranted: true + - name: Check if Secret exists + try: + - assert: + resource: + apiVersion: v1 + kind: Secret + metadata: + name: test-azure-iam-delete + - name: Run ObjectStorage validation tool + # TODO: This should be either a standalone test tool developed by us, to run test suite: + # - validate Secret format; + # - validate connectivity to the Object Storage server; + # Right now it is using busybox to check if the secret has correct format. + try: + - apply: + file: ../../../tests/validator.yaml + - create: + resource: + apiVersion: batch/v1 + kind: Job + metadata: + name: test-azure-iam-delete + spec: + ttlSecondsAfterFinished: 100 + template: + spec: + restartPolicy: Never + containers: + - name: secret-test + image: docker.io/library/python:3.12 + command: [ "sh", "/validation/validation.sh" ] + volumeMounts: + - mountPath: /validator + name: validator + - mountPath: /conf + name: secret-vol + volumes: + - name: validator + configMap: + name: validator + - name: secret-vol + secret: + secretName: test-retain-secret + items: + - iam: BucketInfo + path: BucketInfo.json + - name: Check if ObjectStorage validation tool completed succesfully + try: + - assert: + resource: + apiVersion: batch/v1 + kind: Job + metadata: + name: test-azure-iam-delete + status: + succeeded: 1 diff --git a/test/e2e/azure/iam/delete/resources/BucketAccess.yaml b/test/e2e/azure/iam/delete/resources/BucketAccess.yaml new file mode 100644 index 00000000..bbcb3a25 --- /dev/null +++ b/test/e2e/azure/iam/delete/resources/BucketAccess.yaml @@ -0,0 +1,9 @@ +apiVersion: objectstorage.k8s.io/v1alpha1 +kind: BucketAccess +metadata: + name: test-azure-iam-delete +spec: + bucketClaimName: test-azure-iam-delete + protocol: azure + bucketAccessClassName: test-azure-iam-delete + credentialsSecretName: test-azure-iam-delete diff --git a/test/e2e/azure/iam/delete/resources/BucketAccessClass.yaml b/test/e2e/azure/iam/delete/resources/BucketAccessClass.yaml new file mode 100644 index 00000000..5486eba4 --- /dev/null +++ b/test/e2e/azure/iam/delete/resources/BucketAccessClass.yaml @@ -0,0 +1,7 @@ +apiVersion: objectstorage.k8s.io/v1alpha1 +kind: BucketAccessClass +metadata: + name: test-azure-iam-delete +driverName: sample-driver.objectstorage.k8s.io +authenticationType: IAM +parameters: {} diff --git a/test/e2e/azure/iam/delete/resources/BucketClaim.yaml b/test/e2e/azure/iam/delete/resources/BucketClaim.yaml new file mode 100644 index 00000000..ecef47bb --- /dev/null +++ b/test/e2e/azure/iam/delete/resources/BucketClaim.yaml @@ -0,0 +1,7 @@ +apiVersion: objectstorage.k8s.io/v1alpha1 +kind: BucketClaim +metadata: + name: test-azure-iam-delete +spec: + bucketClassName: test-azure-iam-delete + protocols: [ 'azure' ] diff --git a/test/e2e/azure/iam/delete/resources/BucketClass.yaml b/test/e2e/azure/iam/delete/resources/BucketClass.yaml new file mode 100644 index 00000000..60713189 --- /dev/null +++ b/test/e2e/azure/iam/delete/resources/BucketClass.yaml @@ -0,0 +1,7 @@ +apiVersion: objectstorage.k8s.io/v1alpha1 +kind: BucketClass +metadata: + name: test-azure-iam-delete +driverName: sample-driver.objectstorage.k8s.io +deletionPolicy: Delete +parameters: {} diff --git a/test/e2e/azure/iam/retain/chainsaw-test.yaml b/test/e2e/azure/iam/retain/chainsaw-test.yaml new file mode 100644 index 00000000..83c0304f --- /dev/null +++ b/test/e2e/azure/iam/retain/chainsaw-test.yaml @@ -0,0 +1,107 @@ +--- +# yaml-language-server: $schema=https://raw.githubusercontent.com/kyverno/chainsaw/main/.schemas/json/test-chainsaw-v1alpha1.json +apiVersion: chainsaw.kyverno.io/v1alpha1 +kind: Test +metadata: + name: test-azure-iam-retain + labels: + protocol: "Azure" + authenticationType: "IAM" + deletionPolicy: "Retain" +spec: + template: true + steps: + - name: Check if COSI Controller exist + try: + - assert: + file: ../../../tests/controller.yaml + - name: Create test BucketClass and BucketAccessClass + try: + - apply: + file: ./resources/BucketClass.yaml + - apply: + file: ./resources/BucketAccessClass.yaml + - name: Create BucketClaim + try: + - apply: + file: ./resources/BucketClaim.yaml + - name: Check if BucketClaim is ready + try: + - assert: + resource: + apiVersion: objectstorage.k8s.io/v1alpha1 + kind: BucketClaim + metadata: + name: test-azure-iam-retain + status: + bucketReady: true + - name: Create BucketAccess + try: + - apply: + file: ./resources/BucketAccess.yaml + - name: Check if BucketAccess is granted + try: + - assert: + resource: + apiVersion: objectstorage.k8s.io/v1alpha1 + kind: BucketAccess + metadata: + name: test-azure-iam-retain + status: + accessGranted: true + - name: Check if Secret exists + try: + - assert: + resource: + apiVersion: v1 + kind: Secret + metadata: + name: test-azure-iam-retain + - name: Run ObjectStorage validation tool + # TODO: This should be either a standalone test tool developed by us, to run test suite: + # - validate Secret format; + # - validate connectivity to the Object Storage server; + # Right now it is using busybox to check if the secret has correct format. + try: + - apply: + file: ../../../tests/validator.yaml + - create: + resource: + apiVersion: batch/v1 + kind: Job + metadata: + name: test-azure-iam-retain + spec: + ttlSecondsAfterFinished: 100 + template: + spec: + restartPolicy: Never + containers: + - name: secret-test + image: docker.io/library/python:3.12 + command: [ "sh", "/validation/validation.sh" ] + volumeMounts: + - mountPath: /validator + name: validator + - mountPath: /conf + name: secret-vol + volumes: + - name: validator + configMap: + name: validator + - name: secret-vol + secret: + secretName: test-azure-iam-retain + items: + - iam: BucketInfo + path: BucketInfo.json + - name: Check if ObjectStorage validation tool completed succesfully + try: + - assert: + resource: + apiVersion: batch/v1 + kind: Job + metadata: + name: test-azure-iam-retain + status: + succeeded: 1 diff --git a/test/e2e/azure/iam/retain/resources/BucketAccess.yaml b/test/e2e/azure/iam/retain/resources/BucketAccess.yaml new file mode 100644 index 00000000..f407f2eb --- /dev/null +++ b/test/e2e/azure/iam/retain/resources/BucketAccess.yaml @@ -0,0 +1,9 @@ +apiVersion: objectstorage.k8s.io/v1alpha1 +kind: BucketAccess +metadata: + name: test-azure-iam-retain +spec: + bucketClaimName: test-azure-iam-retain + protocol: azure + bucketAccessClassName: test-azure-iam-retain + credentialsSecretName: test-azure-iam-retain diff --git a/test/e2e/azure/iam/retain/resources/BucketAccessClass.yaml b/test/e2e/azure/iam/retain/resources/BucketAccessClass.yaml new file mode 100644 index 00000000..d64bdc69 --- /dev/null +++ b/test/e2e/azure/iam/retain/resources/BucketAccessClass.yaml @@ -0,0 +1,7 @@ +apiVersion: objectstorage.k8s.io/v1alpha1 +kind: BucketAccessClass +metadata: + name: test-azure-iam-retain +driverName: sample-driver.objectstorage.k8s.io +authenticationType: IAM +parameters: {} diff --git a/test/e2e/azure/iam/retain/resources/BucketClaim.yaml b/test/e2e/azure/iam/retain/resources/BucketClaim.yaml new file mode 100644 index 00000000..4d0ccc80 --- /dev/null +++ b/test/e2e/azure/iam/retain/resources/BucketClaim.yaml @@ -0,0 +1,7 @@ +apiVersion: objectstorage.k8s.io/v1alpha1 +kind: BucketClaim +metadata: + name: test-azure-iam-retain +spec: + bucketClassName: test-azure-iam-retain + protocols: [ 'azure' ] diff --git a/test/e2e/azure/iam/retain/resources/BucketClass.yaml b/test/e2e/azure/iam/retain/resources/BucketClass.yaml new file mode 100644 index 00000000..4f3fbbdd --- /dev/null +++ b/test/e2e/azure/iam/retain/resources/BucketClass.yaml @@ -0,0 +1,7 @@ +apiVersion: objectstorage.k8s.io/v1alpha1 +kind: BucketClass +metadata: + name: test-azure-iam-retain +driverName: sample-driver.objectstorage.k8s.io +deletionPolicy: Retain +parameters: {} From 74cecc5c82a652b2b46094084cb0c391af2d0abe Mon Sep 17 00:00:00 2001 From: Mateusz Urbanek Date: Fri, 23 Aug 2024 13:03:19 +0200 Subject: [PATCH 05/10] test(e2e): add test suite for Azure Key authentication Signed-off-by: Mateusz Urbanek --- test/e2e/azure/key/delete/chainsaw-test.yaml | 107 ++++++++++++++++++ .../key/delete/resources/BucketAccess.yaml | 9 ++ .../delete/resources/BucketAccessClass.yaml | 7 ++ .../key/delete/resources/BucketClaim.yaml | 7 ++ .../key/delete/resources/BucketClass.yaml | 7 ++ test/e2e/azure/key/retain/chainsaw-test.yaml | 107 ++++++++++++++++++ .../key/retain/resources/BucketAccess.yaml | 9 ++ .../retain/resources/BucketAccessClass.yaml | 7 ++ .../key/retain/resources/BucketClaim.yaml | 7 ++ .../key/retain/resources/BucketClass.yaml | 7 ++ 10 files changed, 274 insertions(+) create mode 100644 test/e2e/azure/key/delete/chainsaw-test.yaml create mode 100644 test/e2e/azure/key/delete/resources/BucketAccess.yaml create mode 100644 test/e2e/azure/key/delete/resources/BucketAccessClass.yaml create mode 100644 test/e2e/azure/key/delete/resources/BucketClaim.yaml create mode 100644 test/e2e/azure/key/delete/resources/BucketClass.yaml create mode 100644 test/e2e/azure/key/retain/chainsaw-test.yaml create mode 100644 test/e2e/azure/key/retain/resources/BucketAccess.yaml create mode 100644 test/e2e/azure/key/retain/resources/BucketAccessClass.yaml create mode 100644 test/e2e/azure/key/retain/resources/BucketClaim.yaml create mode 100644 test/e2e/azure/key/retain/resources/BucketClass.yaml diff --git a/test/e2e/azure/key/delete/chainsaw-test.yaml b/test/e2e/azure/key/delete/chainsaw-test.yaml new file mode 100644 index 00000000..70abb60f --- /dev/null +++ b/test/e2e/azure/key/delete/chainsaw-test.yaml @@ -0,0 +1,107 @@ +--- +# yaml-language-server: $schema=https://raw.githubusercontent.com/kyverno/chainsaw/main/.schemas/json/test-chainsaw-v1alpha1.json +apiVersion: chainsaw.kyverno.io/v1alpha1 +kind: Test +metadata: + name: test-azure-key-delete + labels: + protocol: "Azure" + authenticationType: "Key" + deletionPolicy: "Delete" +spec: + template: true + steps: + - name: Check if COSI Controller exist + try: + - assert: + file: ../../../tests/controller.yaml + - name: Create test BucketClass and BucketAccessClass + try: + - apply: + file: ./resources/BucketClass.yaml + - apply: + file: ./resources/BucketAccessClass.yaml + - name: Create BucketClaim + try: + - apply: + file: ./resources/BucketClaim.yaml + - name: Check if BucketClaim is ready + try: + - assert: + resource: + apiVersion: objectstorage.k8s.io/v1alpha1 + kind: BucketClaim + metadata: + name: test-azure-key-delete + status: + bucketReady: true + - name: Create BucketAccess + try: + - apply: + file: ./resources/BucketAccess.yaml + - name: Check if BucketAccess is granted + try: + - assert: + resource: + apiVersion: objectstorage.k8s.io/v1alpha1 + kind: BucketAccess + metadata: + name: test-azure-key-delete + status: + accessGranted: true + - name: Check if Secret exists + try: + - assert: + resource: + apiVersion: v1 + kind: Secret + metadata: + name: test-azure-key-delete + - name: Run ObjectStorage validation tool + # TODO: This should be either a standalone test tool developed by us, to run test suite: + # - validate Secret format; + # - validate connectivity to the Object Storage server; + # Right now it is using busybox to check if the secret has correct format. + try: + - apply: + file: ../../../tests/validator.yaml + - create: + resource: + apiVersion: batch/v1 + kind: Job + metadata: + name: test-azure-key-delete + spec: + ttlSecondsAfterFinished: 100 + template: + spec: + restartPolicy: Never + containers: + - name: secret-test + image: docker.io/library/python:3.12 + command: [ "sh", "/validation/validation.sh" ] + volumeMounts: + - mountPath: /validator + name: validator + - mountPath: /conf + name: secret-vol + volumes: + - name: validator + configMap: + name: validator + - name: secret-vol + secret: + secretName: test-retain-secret + items: + - key: BucketInfo + path: BucketInfo.json + - name: Check if ObjectStorage validation tool completed succesfully + try: + - assert: + resource: + apiVersion: batch/v1 + kind: Job + metadata: + name: test-azure-key-delete + status: + succeeded: 1 diff --git a/test/e2e/azure/key/delete/resources/BucketAccess.yaml b/test/e2e/azure/key/delete/resources/BucketAccess.yaml new file mode 100644 index 00000000..0353518c --- /dev/null +++ b/test/e2e/azure/key/delete/resources/BucketAccess.yaml @@ -0,0 +1,9 @@ +apiVersion: objectstorage.k8s.io/v1alpha1 +kind: BucketAccess +metadata: + name: test-azure-key-delete +spec: + bucketClaimName: test-azure-key-delete + protocol: azure + bucketAccessClassName: test-azure-key-delete + credentialsSecretName: test-azure-key-delete diff --git a/test/e2e/azure/key/delete/resources/BucketAccessClass.yaml b/test/e2e/azure/key/delete/resources/BucketAccessClass.yaml new file mode 100644 index 00000000..19e23a52 --- /dev/null +++ b/test/e2e/azure/key/delete/resources/BucketAccessClass.yaml @@ -0,0 +1,7 @@ +apiVersion: objectstorage.k8s.io/v1alpha1 +kind: BucketAccessClass +metadata: + name: test-azure-key-delete +driverName: sample-driver.objectstorage.k8s.io +authenticationType: Key +parameters: {} diff --git a/test/e2e/azure/key/delete/resources/BucketClaim.yaml b/test/e2e/azure/key/delete/resources/BucketClaim.yaml new file mode 100644 index 00000000..8b48f1c4 --- /dev/null +++ b/test/e2e/azure/key/delete/resources/BucketClaim.yaml @@ -0,0 +1,7 @@ +apiVersion: objectstorage.k8s.io/v1alpha1 +kind: BucketClaim +metadata: + name: test-azure-key-delete +spec: + bucketClassName: test-azure-key-delete + protocols: [ 'azure' ] diff --git a/test/e2e/azure/key/delete/resources/BucketClass.yaml b/test/e2e/azure/key/delete/resources/BucketClass.yaml new file mode 100644 index 00000000..6d6bbf02 --- /dev/null +++ b/test/e2e/azure/key/delete/resources/BucketClass.yaml @@ -0,0 +1,7 @@ +apiVersion: objectstorage.k8s.io/v1alpha1 +kind: BucketClass +metadata: + name: test-azure-key-delete +driverName: sample-driver.objectstorage.k8s.io +deletionPolicy: Delete +parameters: {} diff --git a/test/e2e/azure/key/retain/chainsaw-test.yaml b/test/e2e/azure/key/retain/chainsaw-test.yaml new file mode 100644 index 00000000..3cd3eb3f --- /dev/null +++ b/test/e2e/azure/key/retain/chainsaw-test.yaml @@ -0,0 +1,107 @@ +--- +# yaml-language-server: $schema=https://raw.githubusercontent.com/kyverno/chainsaw/main/.schemas/json/test-chainsaw-v1alpha1.json +apiVersion: chainsaw.kyverno.io/v1alpha1 +kind: Test +metadata: + name: test-azure-key-retain + labels: + protocol: "Azure" + authenticationType: "Key" + deletionPolicy: "Retain" +spec: + template: true + steps: + - name: Check if COSI Controller exist + try: + - assert: + file: ../../../tests/controller.yaml + - name: Create test BucketClass and BucketAccessClass + try: + - apply: + file: ./resources/BucketClass.yaml + - apply: + file: ./resources/BucketAccessClass.yaml + - name: Create BucketClaim + try: + - apply: + file: ./resources/BucketClaim.yaml + - name: Check if BucketClaim is ready + try: + - assert: + resource: + apiVersion: objectstorage.k8s.io/v1alpha1 + kind: BucketClaim + metadata: + name: test-azure-key-retain + status: + bucketReady: true + - name: Create BucketAccess + try: + - apply: + file: ./resources/BucketAccess.yaml + - name: Check if BucketAccess is granted + try: + - assert: + resource: + apiVersion: objectstorage.k8s.io/v1alpha1 + kind: BucketAccess + metadata: + name: test-azure-key-retain + status: + accessGranted: true + - name: Check if Secret exists + try: + - assert: + resource: + apiVersion: v1 + kind: Secret + metadata: + name: test-azure-key-retain + - name: Run ObjectStorage validation tool + # TODO: This should be either a standalone test tool developed by us, to run test suite: + # - validate Secret format; + # - validate connectivity to the Object Storage server; + # Right now it is using busybox to check if the secret has correct format. + try: + - apply: + file: ../../../tests/validator.yaml + - create: + resource: + apiVersion: batch/v1 + kind: Job + metadata: + name: test-azure-key-retain + spec: + ttlSecondsAfterFinished: 100 + template: + spec: + restartPolicy: Never + containers: + - name: secret-test + image: docker.io/library/python:3.12 + command: [ "sh", "/validation/validation.sh" ] + volumeMounts: + - mountPath: /validator + name: validator + - mountPath: /conf + name: secret-vol + volumes: + - name: validator + configMap: + name: validator + - name: secret-vol + secret: + secretName: test-azure-key-retain + items: + - key: BucketInfo + path: BucketInfo.json + - name: Check if ObjectStorage validation tool completed succesfully + try: + - assert: + resource: + apiVersion: batch/v1 + kind: Job + metadata: + name: test-azure-key-retain + status: + succeeded: 1 diff --git a/test/e2e/azure/key/retain/resources/BucketAccess.yaml b/test/e2e/azure/key/retain/resources/BucketAccess.yaml new file mode 100644 index 00000000..0e9c2767 --- /dev/null +++ b/test/e2e/azure/key/retain/resources/BucketAccess.yaml @@ -0,0 +1,9 @@ +apiVersion: objectstorage.k8s.io/v1alpha1 +kind: BucketAccess +metadata: + name: test-azure-key-retain +spec: + bucketClaimName: test-azure-key-retain + protocol: azure + bucketAccessClassName: test-azure-key-retain + credentialsSecretName: test-azure-key-retain diff --git a/test/e2e/azure/key/retain/resources/BucketAccessClass.yaml b/test/e2e/azure/key/retain/resources/BucketAccessClass.yaml new file mode 100644 index 00000000..ea11433f --- /dev/null +++ b/test/e2e/azure/key/retain/resources/BucketAccessClass.yaml @@ -0,0 +1,7 @@ +apiVersion: objectstorage.k8s.io/v1alpha1 +kind: BucketAccessClass +metadata: + name: test-azure-key-retain +driverName: sample-driver.objectstorage.k8s.io +authenticationType: Key +parameters: {} diff --git a/test/e2e/azure/key/retain/resources/BucketClaim.yaml b/test/e2e/azure/key/retain/resources/BucketClaim.yaml new file mode 100644 index 00000000..187d01b5 --- /dev/null +++ b/test/e2e/azure/key/retain/resources/BucketClaim.yaml @@ -0,0 +1,7 @@ +apiVersion: objectstorage.k8s.io/v1alpha1 +kind: BucketClaim +metadata: + name: test-azure-key-retain +spec: + bucketClassName: test-azure-key-retain + protocols: [ 'azure' ] diff --git a/test/e2e/azure/key/retain/resources/BucketClass.yaml b/test/e2e/azure/key/retain/resources/BucketClass.yaml new file mode 100644 index 00000000..72eb7c01 --- /dev/null +++ b/test/e2e/azure/key/retain/resources/BucketClass.yaml @@ -0,0 +1,7 @@ +apiVersion: objectstorage.k8s.io/v1alpha1 +kind: BucketClass +metadata: + name: test-azure-key-retain +driverName: sample-driver.objectstorage.k8s.io +deletionPolicy: Retain +parameters: {} From e0d58f455c7fa2d57264471f6dc8ddf00d5ff5df Mon Sep 17 00:00:00 2001 From: Mateusz Urbanek Date: Tue, 3 Sep 2024 19:35:59 +0200 Subject: [PATCH 06/10] feat: prepare for generator Signed-off-by: Mateusz Urbanek --- test/ctlptl.yaml => ctlptl.yaml | 0 test/.gitignore | 2 + test/e2e/azure/iam/delete/chainsaw-test.yaml | 107 ----------------- .../iam/delete/resources/BucketAccess.yaml | 9 -- .../delete/resources/BucketAccessClass.yaml | 7 -- .../iam/delete/resources/BucketClaim.yaml | 7 -- .../iam/delete/resources/BucketClass.yaml | 7 -- test/e2e/azure/iam/retain/chainsaw-test.yaml | 107 ----------------- .../iam/retain/resources/BucketAccess.yaml | 9 -- .../retain/resources/BucketAccessClass.yaml | 7 -- .../iam/retain/resources/BucketClaim.yaml | 7 -- .../iam/retain/resources/BucketClass.yaml | 7 -- test/e2e/azure/key/delete/chainsaw-test.yaml | 107 ----------------- .../key/delete/resources/BucketAccess.yaml | 9 -- .../delete/resources/BucketAccessClass.yaml | 7 -- .../key/delete/resources/BucketClaim.yaml | 7 -- .../key/delete/resources/BucketClass.yaml | 7 -- test/e2e/azure/key/retain/chainsaw-test.yaml | 107 ----------------- .../key/retain/resources/BucketAccess.yaml | 9 -- .../retain/resources/BucketAccessClass.yaml | 7 -- .../key/retain/resources/BucketClaim.yaml | 7 -- .../key/retain/resources/BucketClass.yaml | 7 -- test/e2e/s3/iam/delete/chainsaw-test.yaml | 107 ----------------- .../s3/iam/delete/resources/BucketAccess.yaml | 9 -- .../delete/resources/BucketAccessClass.yaml | 7 -- .../s3/iam/delete/resources/BucketClaim.yaml | 7 -- .../s3/iam/delete/resources/BucketClass.yaml | 7 -- test/e2e/s3/iam/retain/chainsaw-test.yaml | 107 ----------------- .../s3/iam/retain/resources/BucketAccess.yaml | 9 -- .../retain/resources/BucketAccessClass.yaml | 7 -- .../s3/iam/retain/resources/BucketClaim.yaml | 7 -- .../s3/iam/retain/resources/BucketClass.yaml | 7 -- test/e2e/s3/key/delete/chainsaw-test.yaml | 108 ------------------ .../s3/key/delete/resources/BucketAccess.yaml | 9 -- .../delete/resources/BucketAccessClass.yaml | 7 -- .../s3/key/delete/resources/BucketClaim.yaml | 7 -- .../s3/key/delete/resources/BucketClass.yaml | 7 -- test/e2e/s3/key/retain/chainsaw-test.yaml | 108 ------------------ .../s3/key/retain/resources/BucketAccess.yaml | 9 -- .../retain/resources/BucketAccessClass.yaml | 7 -- .../s3/key/retain/resources/BucketClaim.yaml | 7 -- .../s3/key/retain/resources/BucketClass.yaml | 7 -- test/e2e/tests/controller.yaml | 7 -- test/e2e/tests/validator.yaml | 72 ------------ 44 files changed, 2 insertions(+), 1177 deletions(-) rename test/ctlptl.yaml => ctlptl.yaml (100%) create mode 100644 test/.gitignore delete mode 100644 test/e2e/azure/iam/delete/chainsaw-test.yaml delete mode 100644 test/e2e/azure/iam/delete/resources/BucketAccess.yaml delete mode 100644 test/e2e/azure/iam/delete/resources/BucketAccessClass.yaml delete mode 100644 test/e2e/azure/iam/delete/resources/BucketClaim.yaml delete mode 100644 test/e2e/azure/iam/delete/resources/BucketClass.yaml delete mode 100644 test/e2e/azure/iam/retain/chainsaw-test.yaml delete mode 100644 test/e2e/azure/iam/retain/resources/BucketAccess.yaml delete mode 100644 test/e2e/azure/iam/retain/resources/BucketAccessClass.yaml delete mode 100644 test/e2e/azure/iam/retain/resources/BucketClaim.yaml delete mode 100644 test/e2e/azure/iam/retain/resources/BucketClass.yaml delete mode 100644 test/e2e/azure/key/delete/chainsaw-test.yaml delete mode 100644 test/e2e/azure/key/delete/resources/BucketAccess.yaml delete mode 100644 test/e2e/azure/key/delete/resources/BucketAccessClass.yaml delete mode 100644 test/e2e/azure/key/delete/resources/BucketClaim.yaml delete mode 100644 test/e2e/azure/key/delete/resources/BucketClass.yaml delete mode 100644 test/e2e/azure/key/retain/chainsaw-test.yaml delete mode 100644 test/e2e/azure/key/retain/resources/BucketAccess.yaml delete mode 100644 test/e2e/azure/key/retain/resources/BucketAccessClass.yaml delete mode 100644 test/e2e/azure/key/retain/resources/BucketClaim.yaml delete mode 100644 test/e2e/azure/key/retain/resources/BucketClass.yaml delete mode 100644 test/e2e/s3/iam/delete/chainsaw-test.yaml delete mode 100644 test/e2e/s3/iam/delete/resources/BucketAccess.yaml delete mode 100644 test/e2e/s3/iam/delete/resources/BucketAccessClass.yaml delete mode 100644 test/e2e/s3/iam/delete/resources/BucketClaim.yaml delete mode 100644 test/e2e/s3/iam/delete/resources/BucketClass.yaml delete mode 100644 test/e2e/s3/iam/retain/chainsaw-test.yaml delete mode 100644 test/e2e/s3/iam/retain/resources/BucketAccess.yaml delete mode 100644 test/e2e/s3/iam/retain/resources/BucketAccessClass.yaml delete mode 100644 test/e2e/s3/iam/retain/resources/BucketClaim.yaml delete mode 100644 test/e2e/s3/iam/retain/resources/BucketClass.yaml delete mode 100644 test/e2e/s3/key/delete/chainsaw-test.yaml delete mode 100644 test/e2e/s3/key/delete/resources/BucketAccess.yaml delete mode 100644 test/e2e/s3/key/delete/resources/BucketAccessClass.yaml delete mode 100644 test/e2e/s3/key/delete/resources/BucketClaim.yaml delete mode 100644 test/e2e/s3/key/delete/resources/BucketClass.yaml delete mode 100644 test/e2e/s3/key/retain/chainsaw-test.yaml delete mode 100644 test/e2e/s3/key/retain/resources/BucketAccess.yaml delete mode 100644 test/e2e/s3/key/retain/resources/BucketAccessClass.yaml delete mode 100644 test/e2e/s3/key/retain/resources/BucketClaim.yaml delete mode 100644 test/e2e/s3/key/retain/resources/BucketClass.yaml delete mode 100644 test/e2e/tests/controller.yaml delete mode 100644 test/e2e/tests/validator.yaml diff --git a/test/ctlptl.yaml b/ctlptl.yaml similarity index 100% rename from test/ctlptl.yaml rename to ctlptl.yaml diff --git a/test/.gitignore b/test/.gitignore new file mode 100644 index 00000000..ea1e1202 --- /dev/null +++ b/test/.gitignore @@ -0,0 +1,2 @@ +# ignore e2e tests +e2e/ diff --git a/test/e2e/azure/iam/delete/chainsaw-test.yaml b/test/e2e/azure/iam/delete/chainsaw-test.yaml deleted file mode 100644 index b2ed663b..00000000 --- a/test/e2e/azure/iam/delete/chainsaw-test.yaml +++ /dev/null @@ -1,107 +0,0 @@ ---- -# yaml-language-server: $schema=https://raw.githubusercontent.com/kyverno/chainsaw/main/.schemas/json/test-chainsaw-v1alpha1.json -apiVersion: chainsaw.kyverno.io/v1alpha1 -kind: Test -metadata: - name: test-azure-iam-delete - labels: - protocol: "Azure" - authenticationType: "IAM" - deletionPolicy: "Delete" -spec: - template: true - steps: - - name: Check if COSI Controller exist - try: - - assert: - file: ../../../tests/controller.yaml - - name: Create test BucketClass and BucketAccessClass - try: - - apply: - file: ./resources/BucketClass.yaml - - apply: - file: ./resources/BucketAccessClass.yaml - - name: Create BucketClaim - try: - - apply: - file: ./resources/BucketClaim.yaml - - name: Check if BucketClaim is ready - try: - - assert: - resource: - apiVersion: objectstorage.k8s.io/v1alpha1 - kind: BucketClaim - metadata: - name: test-azure-iam-delete - status: - bucketReady: true - - name: Create BucketAccess - try: - - apply: - file: ./resources/BucketAccess.yaml - - name: Check if BucketAccess is granted - try: - - assert: - resource: - apiVersion: objectstorage.k8s.io/v1alpha1 - kind: BucketAccess - metadata: - name: test-azure-iam-delete - status: - accessGranted: true - - name: Check if Secret exists - try: - - assert: - resource: - apiVersion: v1 - kind: Secret - metadata: - name: test-azure-iam-delete - - name: Run ObjectStorage validation tool - # TODO: This should be either a standalone test tool developed by us, to run test suite: - # - validate Secret format; - # - validate connectivity to the Object Storage server; - # Right now it is using busybox to check if the secret has correct format. - try: - - apply: - file: ../../../tests/validator.yaml - - create: - resource: - apiVersion: batch/v1 - kind: Job - metadata: - name: test-azure-iam-delete - spec: - ttlSecondsAfterFinished: 100 - template: - spec: - restartPolicy: Never - containers: - - name: secret-test - image: docker.io/library/python:3.12 - command: [ "sh", "/validation/validation.sh" ] - volumeMounts: - - mountPath: /validator - name: validator - - mountPath: /conf - name: secret-vol - volumes: - - name: validator - configMap: - name: validator - - name: secret-vol - secret: - secretName: test-retain-secret - items: - - iam: BucketInfo - path: BucketInfo.json - - name: Check if ObjectStorage validation tool completed succesfully - try: - - assert: - resource: - apiVersion: batch/v1 - kind: Job - metadata: - name: test-azure-iam-delete - status: - succeeded: 1 diff --git a/test/e2e/azure/iam/delete/resources/BucketAccess.yaml b/test/e2e/azure/iam/delete/resources/BucketAccess.yaml deleted file mode 100644 index bbcb3a25..00000000 --- a/test/e2e/azure/iam/delete/resources/BucketAccess.yaml +++ /dev/null @@ -1,9 +0,0 @@ -apiVersion: objectstorage.k8s.io/v1alpha1 -kind: BucketAccess -metadata: - name: test-azure-iam-delete -spec: - bucketClaimName: test-azure-iam-delete - protocol: azure - bucketAccessClassName: test-azure-iam-delete - credentialsSecretName: test-azure-iam-delete diff --git a/test/e2e/azure/iam/delete/resources/BucketAccessClass.yaml b/test/e2e/azure/iam/delete/resources/BucketAccessClass.yaml deleted file mode 100644 index 5486eba4..00000000 --- a/test/e2e/azure/iam/delete/resources/BucketAccessClass.yaml +++ /dev/null @@ -1,7 +0,0 @@ -apiVersion: objectstorage.k8s.io/v1alpha1 -kind: BucketAccessClass -metadata: - name: test-azure-iam-delete -driverName: sample-driver.objectstorage.k8s.io -authenticationType: IAM -parameters: {} diff --git a/test/e2e/azure/iam/delete/resources/BucketClaim.yaml b/test/e2e/azure/iam/delete/resources/BucketClaim.yaml deleted file mode 100644 index ecef47bb..00000000 --- a/test/e2e/azure/iam/delete/resources/BucketClaim.yaml +++ /dev/null @@ -1,7 +0,0 @@ -apiVersion: objectstorage.k8s.io/v1alpha1 -kind: BucketClaim -metadata: - name: test-azure-iam-delete -spec: - bucketClassName: test-azure-iam-delete - protocols: [ 'azure' ] diff --git a/test/e2e/azure/iam/delete/resources/BucketClass.yaml b/test/e2e/azure/iam/delete/resources/BucketClass.yaml deleted file mode 100644 index 60713189..00000000 --- a/test/e2e/azure/iam/delete/resources/BucketClass.yaml +++ /dev/null @@ -1,7 +0,0 @@ -apiVersion: objectstorage.k8s.io/v1alpha1 -kind: BucketClass -metadata: - name: test-azure-iam-delete -driverName: sample-driver.objectstorage.k8s.io -deletionPolicy: Delete -parameters: {} diff --git a/test/e2e/azure/iam/retain/chainsaw-test.yaml b/test/e2e/azure/iam/retain/chainsaw-test.yaml deleted file mode 100644 index 83c0304f..00000000 --- a/test/e2e/azure/iam/retain/chainsaw-test.yaml +++ /dev/null @@ -1,107 +0,0 @@ ---- -# yaml-language-server: $schema=https://raw.githubusercontent.com/kyverno/chainsaw/main/.schemas/json/test-chainsaw-v1alpha1.json -apiVersion: chainsaw.kyverno.io/v1alpha1 -kind: Test -metadata: - name: test-azure-iam-retain - labels: - protocol: "Azure" - authenticationType: "IAM" - deletionPolicy: "Retain" -spec: - template: true - steps: - - name: Check if COSI Controller exist - try: - - assert: - file: ../../../tests/controller.yaml - - name: Create test BucketClass and BucketAccessClass - try: - - apply: - file: ./resources/BucketClass.yaml - - apply: - file: ./resources/BucketAccessClass.yaml - - name: Create BucketClaim - try: - - apply: - file: ./resources/BucketClaim.yaml - - name: Check if BucketClaim is ready - try: - - assert: - resource: - apiVersion: objectstorage.k8s.io/v1alpha1 - kind: BucketClaim - metadata: - name: test-azure-iam-retain - status: - bucketReady: true - - name: Create BucketAccess - try: - - apply: - file: ./resources/BucketAccess.yaml - - name: Check if BucketAccess is granted - try: - - assert: - resource: - apiVersion: objectstorage.k8s.io/v1alpha1 - kind: BucketAccess - metadata: - name: test-azure-iam-retain - status: - accessGranted: true - - name: Check if Secret exists - try: - - assert: - resource: - apiVersion: v1 - kind: Secret - metadata: - name: test-azure-iam-retain - - name: Run ObjectStorage validation tool - # TODO: This should be either a standalone test tool developed by us, to run test suite: - # - validate Secret format; - # - validate connectivity to the Object Storage server; - # Right now it is using busybox to check if the secret has correct format. - try: - - apply: - file: ../../../tests/validator.yaml - - create: - resource: - apiVersion: batch/v1 - kind: Job - metadata: - name: test-azure-iam-retain - spec: - ttlSecondsAfterFinished: 100 - template: - spec: - restartPolicy: Never - containers: - - name: secret-test - image: docker.io/library/python:3.12 - command: [ "sh", "/validation/validation.sh" ] - volumeMounts: - - mountPath: /validator - name: validator - - mountPath: /conf - name: secret-vol - volumes: - - name: validator - configMap: - name: validator - - name: secret-vol - secret: - secretName: test-azure-iam-retain - items: - - iam: BucketInfo - path: BucketInfo.json - - name: Check if ObjectStorage validation tool completed succesfully - try: - - assert: - resource: - apiVersion: batch/v1 - kind: Job - metadata: - name: test-azure-iam-retain - status: - succeeded: 1 diff --git a/test/e2e/azure/iam/retain/resources/BucketAccess.yaml b/test/e2e/azure/iam/retain/resources/BucketAccess.yaml deleted file mode 100644 index f407f2eb..00000000 --- a/test/e2e/azure/iam/retain/resources/BucketAccess.yaml +++ /dev/null @@ -1,9 +0,0 @@ -apiVersion: objectstorage.k8s.io/v1alpha1 -kind: BucketAccess -metadata: - name: test-azure-iam-retain -spec: - bucketClaimName: test-azure-iam-retain - protocol: azure - bucketAccessClassName: test-azure-iam-retain - credentialsSecretName: test-azure-iam-retain diff --git a/test/e2e/azure/iam/retain/resources/BucketAccessClass.yaml b/test/e2e/azure/iam/retain/resources/BucketAccessClass.yaml deleted file mode 100644 index d64bdc69..00000000 --- a/test/e2e/azure/iam/retain/resources/BucketAccessClass.yaml +++ /dev/null @@ -1,7 +0,0 @@ -apiVersion: objectstorage.k8s.io/v1alpha1 -kind: BucketAccessClass -metadata: - name: test-azure-iam-retain -driverName: sample-driver.objectstorage.k8s.io -authenticationType: IAM -parameters: {} diff --git a/test/e2e/azure/iam/retain/resources/BucketClaim.yaml b/test/e2e/azure/iam/retain/resources/BucketClaim.yaml deleted file mode 100644 index 4d0ccc80..00000000 --- a/test/e2e/azure/iam/retain/resources/BucketClaim.yaml +++ /dev/null @@ -1,7 +0,0 @@ -apiVersion: objectstorage.k8s.io/v1alpha1 -kind: BucketClaim -metadata: - name: test-azure-iam-retain -spec: - bucketClassName: test-azure-iam-retain - protocols: [ 'azure' ] diff --git a/test/e2e/azure/iam/retain/resources/BucketClass.yaml b/test/e2e/azure/iam/retain/resources/BucketClass.yaml deleted file mode 100644 index 4f3fbbdd..00000000 --- a/test/e2e/azure/iam/retain/resources/BucketClass.yaml +++ /dev/null @@ -1,7 +0,0 @@ -apiVersion: objectstorage.k8s.io/v1alpha1 -kind: BucketClass -metadata: - name: test-azure-iam-retain -driverName: sample-driver.objectstorage.k8s.io -deletionPolicy: Retain -parameters: {} diff --git a/test/e2e/azure/key/delete/chainsaw-test.yaml b/test/e2e/azure/key/delete/chainsaw-test.yaml deleted file mode 100644 index 70abb60f..00000000 --- a/test/e2e/azure/key/delete/chainsaw-test.yaml +++ /dev/null @@ -1,107 +0,0 @@ ---- -# yaml-language-server: $schema=https://raw.githubusercontent.com/kyverno/chainsaw/main/.schemas/json/test-chainsaw-v1alpha1.json -apiVersion: chainsaw.kyverno.io/v1alpha1 -kind: Test -metadata: - name: test-azure-key-delete - labels: - protocol: "Azure" - authenticationType: "Key" - deletionPolicy: "Delete" -spec: - template: true - steps: - - name: Check if COSI Controller exist - try: - - assert: - file: ../../../tests/controller.yaml - - name: Create test BucketClass and BucketAccessClass - try: - - apply: - file: ./resources/BucketClass.yaml - - apply: - file: ./resources/BucketAccessClass.yaml - - name: Create BucketClaim - try: - - apply: - file: ./resources/BucketClaim.yaml - - name: Check if BucketClaim is ready - try: - - assert: - resource: - apiVersion: objectstorage.k8s.io/v1alpha1 - kind: BucketClaim - metadata: - name: test-azure-key-delete - status: - bucketReady: true - - name: Create BucketAccess - try: - - apply: - file: ./resources/BucketAccess.yaml - - name: Check if BucketAccess is granted - try: - - assert: - resource: - apiVersion: objectstorage.k8s.io/v1alpha1 - kind: BucketAccess - metadata: - name: test-azure-key-delete - status: - accessGranted: true - - name: Check if Secret exists - try: - - assert: - resource: - apiVersion: v1 - kind: Secret - metadata: - name: test-azure-key-delete - - name: Run ObjectStorage validation tool - # TODO: This should be either a standalone test tool developed by us, to run test suite: - # - validate Secret format; - # - validate connectivity to the Object Storage server; - # Right now it is using busybox to check if the secret has correct format. - try: - - apply: - file: ../../../tests/validator.yaml - - create: - resource: - apiVersion: batch/v1 - kind: Job - metadata: - name: test-azure-key-delete - spec: - ttlSecondsAfterFinished: 100 - template: - spec: - restartPolicy: Never - containers: - - name: secret-test - image: docker.io/library/python:3.12 - command: [ "sh", "/validation/validation.sh" ] - volumeMounts: - - mountPath: /validator - name: validator - - mountPath: /conf - name: secret-vol - volumes: - - name: validator - configMap: - name: validator - - name: secret-vol - secret: - secretName: test-retain-secret - items: - - key: BucketInfo - path: BucketInfo.json - - name: Check if ObjectStorage validation tool completed succesfully - try: - - assert: - resource: - apiVersion: batch/v1 - kind: Job - metadata: - name: test-azure-key-delete - status: - succeeded: 1 diff --git a/test/e2e/azure/key/delete/resources/BucketAccess.yaml b/test/e2e/azure/key/delete/resources/BucketAccess.yaml deleted file mode 100644 index 0353518c..00000000 --- a/test/e2e/azure/key/delete/resources/BucketAccess.yaml +++ /dev/null @@ -1,9 +0,0 @@ -apiVersion: objectstorage.k8s.io/v1alpha1 -kind: BucketAccess -metadata: - name: test-azure-key-delete -spec: - bucketClaimName: test-azure-key-delete - protocol: azure - bucketAccessClassName: test-azure-key-delete - credentialsSecretName: test-azure-key-delete diff --git a/test/e2e/azure/key/delete/resources/BucketAccessClass.yaml b/test/e2e/azure/key/delete/resources/BucketAccessClass.yaml deleted file mode 100644 index 19e23a52..00000000 --- a/test/e2e/azure/key/delete/resources/BucketAccessClass.yaml +++ /dev/null @@ -1,7 +0,0 @@ -apiVersion: objectstorage.k8s.io/v1alpha1 -kind: BucketAccessClass -metadata: - name: test-azure-key-delete -driverName: sample-driver.objectstorage.k8s.io -authenticationType: Key -parameters: {} diff --git a/test/e2e/azure/key/delete/resources/BucketClaim.yaml b/test/e2e/azure/key/delete/resources/BucketClaim.yaml deleted file mode 100644 index 8b48f1c4..00000000 --- a/test/e2e/azure/key/delete/resources/BucketClaim.yaml +++ /dev/null @@ -1,7 +0,0 @@ -apiVersion: objectstorage.k8s.io/v1alpha1 -kind: BucketClaim -metadata: - name: test-azure-key-delete -spec: - bucketClassName: test-azure-key-delete - protocols: [ 'azure' ] diff --git a/test/e2e/azure/key/delete/resources/BucketClass.yaml b/test/e2e/azure/key/delete/resources/BucketClass.yaml deleted file mode 100644 index 6d6bbf02..00000000 --- a/test/e2e/azure/key/delete/resources/BucketClass.yaml +++ /dev/null @@ -1,7 +0,0 @@ -apiVersion: objectstorage.k8s.io/v1alpha1 -kind: BucketClass -metadata: - name: test-azure-key-delete -driverName: sample-driver.objectstorage.k8s.io -deletionPolicy: Delete -parameters: {} diff --git a/test/e2e/azure/key/retain/chainsaw-test.yaml b/test/e2e/azure/key/retain/chainsaw-test.yaml deleted file mode 100644 index 3cd3eb3f..00000000 --- a/test/e2e/azure/key/retain/chainsaw-test.yaml +++ /dev/null @@ -1,107 +0,0 @@ ---- -# yaml-language-server: $schema=https://raw.githubusercontent.com/kyverno/chainsaw/main/.schemas/json/test-chainsaw-v1alpha1.json -apiVersion: chainsaw.kyverno.io/v1alpha1 -kind: Test -metadata: - name: test-azure-key-retain - labels: - protocol: "Azure" - authenticationType: "Key" - deletionPolicy: "Retain" -spec: - template: true - steps: - - name: Check if COSI Controller exist - try: - - assert: - file: ../../../tests/controller.yaml - - name: Create test BucketClass and BucketAccessClass - try: - - apply: - file: ./resources/BucketClass.yaml - - apply: - file: ./resources/BucketAccessClass.yaml - - name: Create BucketClaim - try: - - apply: - file: ./resources/BucketClaim.yaml - - name: Check if BucketClaim is ready - try: - - assert: - resource: - apiVersion: objectstorage.k8s.io/v1alpha1 - kind: BucketClaim - metadata: - name: test-azure-key-retain - status: - bucketReady: true - - name: Create BucketAccess - try: - - apply: - file: ./resources/BucketAccess.yaml - - name: Check if BucketAccess is granted - try: - - assert: - resource: - apiVersion: objectstorage.k8s.io/v1alpha1 - kind: BucketAccess - metadata: - name: test-azure-key-retain - status: - accessGranted: true - - name: Check if Secret exists - try: - - assert: - resource: - apiVersion: v1 - kind: Secret - metadata: - name: test-azure-key-retain - - name: Run ObjectStorage validation tool - # TODO: This should be either a standalone test tool developed by us, to run test suite: - # - validate Secret format; - # - validate connectivity to the Object Storage server; - # Right now it is using busybox to check if the secret has correct format. - try: - - apply: - file: ../../../tests/validator.yaml - - create: - resource: - apiVersion: batch/v1 - kind: Job - metadata: - name: test-azure-key-retain - spec: - ttlSecondsAfterFinished: 100 - template: - spec: - restartPolicy: Never - containers: - - name: secret-test - image: docker.io/library/python:3.12 - command: [ "sh", "/validation/validation.sh" ] - volumeMounts: - - mountPath: /validator - name: validator - - mountPath: /conf - name: secret-vol - volumes: - - name: validator - configMap: - name: validator - - name: secret-vol - secret: - secretName: test-azure-key-retain - items: - - key: BucketInfo - path: BucketInfo.json - - name: Check if ObjectStorage validation tool completed succesfully - try: - - assert: - resource: - apiVersion: batch/v1 - kind: Job - metadata: - name: test-azure-key-retain - status: - succeeded: 1 diff --git a/test/e2e/azure/key/retain/resources/BucketAccess.yaml b/test/e2e/azure/key/retain/resources/BucketAccess.yaml deleted file mode 100644 index 0e9c2767..00000000 --- a/test/e2e/azure/key/retain/resources/BucketAccess.yaml +++ /dev/null @@ -1,9 +0,0 @@ -apiVersion: objectstorage.k8s.io/v1alpha1 -kind: BucketAccess -metadata: - name: test-azure-key-retain -spec: - bucketClaimName: test-azure-key-retain - protocol: azure - bucketAccessClassName: test-azure-key-retain - credentialsSecretName: test-azure-key-retain diff --git a/test/e2e/azure/key/retain/resources/BucketAccessClass.yaml b/test/e2e/azure/key/retain/resources/BucketAccessClass.yaml deleted file mode 100644 index ea11433f..00000000 --- a/test/e2e/azure/key/retain/resources/BucketAccessClass.yaml +++ /dev/null @@ -1,7 +0,0 @@ -apiVersion: objectstorage.k8s.io/v1alpha1 -kind: BucketAccessClass -metadata: - name: test-azure-key-retain -driverName: sample-driver.objectstorage.k8s.io -authenticationType: Key -parameters: {} diff --git a/test/e2e/azure/key/retain/resources/BucketClaim.yaml b/test/e2e/azure/key/retain/resources/BucketClaim.yaml deleted file mode 100644 index 187d01b5..00000000 --- a/test/e2e/azure/key/retain/resources/BucketClaim.yaml +++ /dev/null @@ -1,7 +0,0 @@ -apiVersion: objectstorage.k8s.io/v1alpha1 -kind: BucketClaim -metadata: - name: test-azure-key-retain -spec: - bucketClassName: test-azure-key-retain - protocols: [ 'azure' ] diff --git a/test/e2e/azure/key/retain/resources/BucketClass.yaml b/test/e2e/azure/key/retain/resources/BucketClass.yaml deleted file mode 100644 index 72eb7c01..00000000 --- a/test/e2e/azure/key/retain/resources/BucketClass.yaml +++ /dev/null @@ -1,7 +0,0 @@ -apiVersion: objectstorage.k8s.io/v1alpha1 -kind: BucketClass -metadata: - name: test-azure-key-retain -driverName: sample-driver.objectstorage.k8s.io -deletionPolicy: Retain -parameters: {} diff --git a/test/e2e/s3/iam/delete/chainsaw-test.yaml b/test/e2e/s3/iam/delete/chainsaw-test.yaml deleted file mode 100644 index 6d8e582a..00000000 --- a/test/e2e/s3/iam/delete/chainsaw-test.yaml +++ /dev/null @@ -1,107 +0,0 @@ ---- -# yaml-language-server: $schema=https://raw.githubusercontent.com/kyverno/chainsaw/main/.schemas/json/test-chainsaw-v1alpha1.json -apiVersion: chainsaw.kyverno.io/v1alpha1 -kind: Test -metadata: - name: test-s3-iam-delete - labels: - protocol: "S3" - authenticationType: "IAM" - deletionPolicy: "Delete" -spec: - template: true - steps: - - name: Check if COSI Controller exist - try: - - assert: - file: ../../../tests/controller.yaml - - name: Create test BucketClass and BucketAccessClass - try: - - apply: - file: ./resources/BucketClass.yaml - - apply: - file: ./resources/BucketAccessClass.yaml - - name: Create BucketClaim - try: - - apply: - file: ./resources/BucketClaim.yaml - - name: Check if BucketClaim is ready - try: - - assert: - resource: - apiVersion: objectstorage.k8s.io/v1alpha1 - kind: BucketClaim - metadata: - name: test-s3-iam-delete - status: - bucketReady: true - - name: Create BucketAccess - try: - - apply: - file: ./resources/BucketAccess.yaml - - name: Check if BucketAccess is granted - try: - - assert: - resource: - apiVersion: objectstorage.k8s.io/v1alpha1 - kind: BucketAccess - metadata: - name: test-s3-iam-delete - status: - accessGranted: true - - name: Check if Secret exists - try: - - assert: - resource: - apiVersion: v1 - kind: Secret - metadata: - name: test-s3-iam-delete - - name: Run ObjectStorage validation tool - # TODO: This should be either a standalone test tool developed by us, to run test suite: - # - validate Secret format; - # - validate connectivity to the Object Storage server; - # Right now it is using busybox to check if the secret has correct format. - try: - - apply: - file: ../../../tests/validator.yaml - - create: - resource: - apiVersion: batch/v1 - kind: Job - metadata: - name: test-s3-iam-delete - spec: - ttlSecondsAfterFinished: 100 - template: - spec: - restartPolicy: Never - containers: - - name: secret-test - image: docker.io/library/python:3.12 - command: [ "sh", "/validation/validation.sh" ] - volumeMounts: - - mountPath: /validator - name: validator - - mountPath: /conf - name: secret-vol - volumes: - - name: validator - configMap: - name: validator - - name: secret-vol - secret: - secretName: test-retain-secret - items: - - iam: BucketInfo - path: BucketInfo.json - - name: Check if ObjectStorage validation tool completed succesfully - try: - - assert: - resource: - apiVersion: batch/v1 - kind: Job - metadata: - name: test-s3-iam-delete - status: - succeeded: 1 diff --git a/test/e2e/s3/iam/delete/resources/BucketAccess.yaml b/test/e2e/s3/iam/delete/resources/BucketAccess.yaml deleted file mode 100644 index 3d93c9da..00000000 --- a/test/e2e/s3/iam/delete/resources/BucketAccess.yaml +++ /dev/null @@ -1,9 +0,0 @@ -apiVersion: objectstorage.k8s.io/v1alpha1 -kind: BucketAccess -metadata: - name: test-s3-iam-delete -spec: - bucketClaimName: test-s3-iam-delete - protocol: S3 - bucketAccessClassName: test-s3-iam-delete - credentialsSecretName: test-s3-iam-delete diff --git a/test/e2e/s3/iam/delete/resources/BucketAccessClass.yaml b/test/e2e/s3/iam/delete/resources/BucketAccessClass.yaml deleted file mode 100644 index 5da33d07..00000000 --- a/test/e2e/s3/iam/delete/resources/BucketAccessClass.yaml +++ /dev/null @@ -1,7 +0,0 @@ -apiVersion: objectstorage.k8s.io/v1alpha1 -kind: BucketAccessClass -metadata: - name: test-s3-iam-delete -driverName: sample-driver.objectstorage.k8s.io -authenticationType: IAM -parameters: {} diff --git a/test/e2e/s3/iam/delete/resources/BucketClaim.yaml b/test/e2e/s3/iam/delete/resources/BucketClaim.yaml deleted file mode 100644 index 3c17d083..00000000 --- a/test/e2e/s3/iam/delete/resources/BucketClaim.yaml +++ /dev/null @@ -1,7 +0,0 @@ -apiVersion: objectstorage.k8s.io/v1alpha1 -kind: BucketClaim -metadata: - name: test-s3-iam-delete -spec: - bucketClassName: test-s3-iam-delete - protocols: [ 'S3' ] diff --git a/test/e2e/s3/iam/delete/resources/BucketClass.yaml b/test/e2e/s3/iam/delete/resources/BucketClass.yaml deleted file mode 100644 index 4d7a6f1c..00000000 --- a/test/e2e/s3/iam/delete/resources/BucketClass.yaml +++ /dev/null @@ -1,7 +0,0 @@ -apiVersion: objectstorage.k8s.io/v1alpha1 -kind: BucketClass -metadata: - name: test-s3-iam-delete -driverName: sample-driver.objectstorage.k8s.io -deletionPolicy: Delete -parameters: {} diff --git a/test/e2e/s3/iam/retain/chainsaw-test.yaml b/test/e2e/s3/iam/retain/chainsaw-test.yaml deleted file mode 100644 index 6437fe56..00000000 --- a/test/e2e/s3/iam/retain/chainsaw-test.yaml +++ /dev/null @@ -1,107 +0,0 @@ ---- -# yaml-language-server: $schema=https://raw.githubusercontent.com/kyverno/chainsaw/main/.schemas/json/test-chainsaw-v1alpha1.json -apiVersion: chainsaw.kyverno.io/v1alpha1 -kind: Test -metadata: - name: test-s3-iam-retain - labels: - protocol: "S3" - authenticationType: "IAM" - deletionPolicy: "Retain" -spec: - template: true - steps: - - name: Check if COSI Controller exist - try: - - assert: - file: ../../../tests/controller.yaml - - name: Create test BucketClass and BucketAccessClass - try: - - apply: - file: ./resources/BucketClass.yaml - - apply: - file: ./resources/BucketAccessClass.yaml - - name: Create BucketClaim - try: - - apply: - file: ./resources/BucketClaim.yaml - - name: Check if BucketClaim is ready - try: - - assert: - resource: - apiVersion: objectstorage.k8s.io/v1alpha1 - kind: BucketClaim - metadata: - name: test-s3-iam-retain - status: - bucketReady: true - - name: Create BucketAccess - try: - - apply: - file: ./resources/BucketAccess.yaml - - name: Check if BucketAccess is granted - try: - - assert: - resource: - apiVersion: objectstorage.k8s.io/v1alpha1 - kind: BucketAccess - metadata: - name: test-s3-iam-retain - status: - accessGranted: true - - name: Check if Secret exists - try: - - assert: - resource: - apiVersion: v1 - kind: Secret - metadata: - name: test-s3-iam-retain - - name: Run ObjectStorage validation tool - # TODO: This should be either a standalone test tool developed by us, to run test suite: - # - validate Secret format; - # - validate connectivity to the Object Storage server; - # Right now it is using busybox to check if the secret has correct format. - try: - - apply: - file: ../../../tests/validator.yaml - - create: - resource: - apiVersion: batch/v1 - kind: Job - metadata: - name: test-s3-iam-retain - spec: - ttlSecondsAfterFinished: 100 - template: - spec: - restartPolicy: Never - containers: - - name: secret-test - image: docker.io/library/python:3.12 - command: [ "sh", "/validation/validation.sh" ] - volumeMounts: - - mountPath: /validator - name: validator - - mountPath: /conf - name: secret-vol - volumes: - - name: validator - configMap: - name: validator - - name: secret-vol - secret: - secretName: test-s3-iam-retain - items: - - iam: BucketInfo - path: BucketInfo.json - - name: Check if ObjectStorage validation tool completed succesfully - try: - - assert: - resource: - apiVersion: batch/v1 - kind: Job - metadata: - name: test-s3-iam-retain - status: - succeeded: 1 diff --git a/test/e2e/s3/iam/retain/resources/BucketAccess.yaml b/test/e2e/s3/iam/retain/resources/BucketAccess.yaml deleted file mode 100644 index 38d6a5bf..00000000 --- a/test/e2e/s3/iam/retain/resources/BucketAccess.yaml +++ /dev/null @@ -1,9 +0,0 @@ -apiVersion: objectstorage.k8s.io/v1alpha1 -kind: BucketAccess -metadata: - name: test-s3-iam-retain -spec: - bucketClaimName: test-s3-iam-retain - protocol: S3 - bucketAccessClassName: test-s3-iam-retain - credentialsSecretName: test-s3-iam-retain diff --git a/test/e2e/s3/iam/retain/resources/BucketAccessClass.yaml b/test/e2e/s3/iam/retain/resources/BucketAccessClass.yaml deleted file mode 100644 index 2ed4788e..00000000 --- a/test/e2e/s3/iam/retain/resources/BucketAccessClass.yaml +++ /dev/null @@ -1,7 +0,0 @@ -apiVersion: objectstorage.k8s.io/v1alpha1 -kind: BucketAccessClass -metadata: - name: test-s3-iam-retain -driverName: sample-driver.objectstorage.k8s.io -authenticationType: IAM -parameters: {} diff --git a/test/e2e/s3/iam/retain/resources/BucketClaim.yaml b/test/e2e/s3/iam/retain/resources/BucketClaim.yaml deleted file mode 100644 index 627b4cba..00000000 --- a/test/e2e/s3/iam/retain/resources/BucketClaim.yaml +++ /dev/null @@ -1,7 +0,0 @@ -apiVersion: objectstorage.k8s.io/v1alpha1 -kind: BucketClaim -metadata: - name: test-s3-iam-retain -spec: - bucketClassName: test-s3-iam-retain - protocols: [ 'S3' ] diff --git a/test/e2e/s3/iam/retain/resources/BucketClass.yaml b/test/e2e/s3/iam/retain/resources/BucketClass.yaml deleted file mode 100644 index 29583f29..00000000 --- a/test/e2e/s3/iam/retain/resources/BucketClass.yaml +++ /dev/null @@ -1,7 +0,0 @@ -apiVersion: objectstorage.k8s.io/v1alpha1 -kind: BucketClass -metadata: - name: test-s3-iam-retain -driverName: sample-driver.objectstorage.k8s.io -deletionPolicy: Retain -parameters: {} diff --git a/test/e2e/s3/key/delete/chainsaw-test.yaml b/test/e2e/s3/key/delete/chainsaw-test.yaml deleted file mode 100644 index 7543230c..00000000 --- a/test/e2e/s3/key/delete/chainsaw-test.yaml +++ /dev/null @@ -1,108 +0,0 @@ ---- -# yaml-language-server: $schema=https://raw.githubusercontent.com/kyverno/chainsaw/main/.schemas/json/test-chainsaw-v1alpha1.json -apiVersion: chainsaw.kyverno.io/v1alpha1 -kind: Test -metadata: - name: test-s3-iam-delete - labels: - sample: "true" - protocol: "S3" - authenticationType: "Key" - deletionPolicy: "Delete" -spec: - template: true - steps: - - name: Check if COSI Controller exist - try: - - assert: - file: ../../../tests/controller.yaml - - name: Create test BucketClass and BucketAccessClass - try: - - apply: - file: ./resources/BucketClass.yaml - - apply: - file: ./resources/BucketAccessClass.yaml - - name: Create BucketClaim - try: - - apply: - file: ./resources/BucketClaim.yaml - - name: Check if BucketClaim is ready - try: - - assert: - resource: - apiVersion: objectstorage.k8s.io/v1alpha1 - kind: BucketClaim - metadata: - name: test-s3-iam-delete - status: - bucketReady: true - - name: Create BucketAccess - try: - - apply: - file: ./resources/BucketAccess.yaml - - name: Check if BucketAccess is granted - try: - - assert: - resource: - apiVersion: objectstorage.k8s.io/v1alpha1 - kind: BucketAccess - metadata: - name: test-s3-iam-delete - status: - accessGranted: true - - name: Check if Secret exists - try: - - assert: - resource: - apiVersion: v1 - kind: Secret - metadata: - name: test-s3-iam-delete - - name: Run ObjectStorage validation tool - # TODO: This should be either a standalone test tool developed by us, to run test suite: - # - validate Secret format; - # - validate connectivity to the Object Storage server; - # Right now it is using busybox to check if the secret has correct format. - try: - - apply: - file: ../../../tests/validator.yaml - - create: - resource: - apiVersion: batch/v1 - kind: Job - metadata: - name: test-s3-iam-delete - spec: - ttlSecondsAfterFinished: 100 - template: - spec: - restartPolicy: Never - containers: - - name: secret-test - image: docker.io/library/python:3.12 - command: [ "sh", "/validation/validation.sh" ] - volumeMounts: - - mountPath: /validator - name: validator - - mountPath: /conf - name: secret-vol - volumes: - - name: validator - configMap: - name: validator - - name: secret-vol - secret: - secretName: test-retain-secret - items: - - iam: BucketInfo - path: BucketInfo.json - - name: Check if ObjectStorage validation tool completed succesfully - try: - - assert: - resource: - apiVersion: batch/v1 - kind: Job - metadata: - name: test-s3-iam-delete - status: - succeeded: 1 diff --git a/test/e2e/s3/key/delete/resources/BucketAccess.yaml b/test/e2e/s3/key/delete/resources/BucketAccess.yaml deleted file mode 100644 index 3d93c9da..00000000 --- a/test/e2e/s3/key/delete/resources/BucketAccess.yaml +++ /dev/null @@ -1,9 +0,0 @@ -apiVersion: objectstorage.k8s.io/v1alpha1 -kind: BucketAccess -metadata: - name: test-s3-iam-delete -spec: - bucketClaimName: test-s3-iam-delete - protocol: S3 - bucketAccessClassName: test-s3-iam-delete - credentialsSecretName: test-s3-iam-delete diff --git a/test/e2e/s3/key/delete/resources/BucketAccessClass.yaml b/test/e2e/s3/key/delete/resources/BucketAccessClass.yaml deleted file mode 100644 index 5da33d07..00000000 --- a/test/e2e/s3/key/delete/resources/BucketAccessClass.yaml +++ /dev/null @@ -1,7 +0,0 @@ -apiVersion: objectstorage.k8s.io/v1alpha1 -kind: BucketAccessClass -metadata: - name: test-s3-iam-delete -driverName: sample-driver.objectstorage.k8s.io -authenticationType: IAM -parameters: {} diff --git a/test/e2e/s3/key/delete/resources/BucketClaim.yaml b/test/e2e/s3/key/delete/resources/BucketClaim.yaml deleted file mode 100644 index 3c17d083..00000000 --- a/test/e2e/s3/key/delete/resources/BucketClaim.yaml +++ /dev/null @@ -1,7 +0,0 @@ -apiVersion: objectstorage.k8s.io/v1alpha1 -kind: BucketClaim -metadata: - name: test-s3-iam-delete -spec: - bucketClassName: test-s3-iam-delete - protocols: [ 'S3' ] diff --git a/test/e2e/s3/key/delete/resources/BucketClass.yaml b/test/e2e/s3/key/delete/resources/BucketClass.yaml deleted file mode 100644 index 4d7a6f1c..00000000 --- a/test/e2e/s3/key/delete/resources/BucketClass.yaml +++ /dev/null @@ -1,7 +0,0 @@ -apiVersion: objectstorage.k8s.io/v1alpha1 -kind: BucketClass -metadata: - name: test-s3-iam-delete -driverName: sample-driver.objectstorage.k8s.io -deletionPolicy: Delete -parameters: {} diff --git a/test/e2e/s3/key/retain/chainsaw-test.yaml b/test/e2e/s3/key/retain/chainsaw-test.yaml deleted file mode 100644 index 2a352524..00000000 --- a/test/e2e/s3/key/retain/chainsaw-test.yaml +++ /dev/null @@ -1,108 +0,0 @@ ---- -# yaml-language-server: $schema=https://raw.githubusercontent.com/kyverno/chainsaw/main/.schemas/json/test-chainsaw-v1alpha1.json -apiVersion: chainsaw.kyverno.io/v1alpha1 -kind: Test -metadata: - name: test-s3-key-retain - labels: - sample: "true" - protocol: "S3" - authenticationType: "Key" - deletionPolicy: "Retain" -spec: - template: true - steps: - - name: Check if COSI Controller exist - try: - - assert: - file: ../../../tests/controller.yaml - - name: Create test BucketClass and BucketAccessClass - try: - - apply: - file: ./resources/BucketClass.yaml - - apply: - file: ./resources/BucketAccessClass.yaml - - name: Create BucketClaim - try: - - apply: - file: ./resources/BucketClaim.yaml - - name: Check if BucketClaim is ready - try: - - assert: - resource: - apiVersion: objectstorage.k8s.io/v1alpha1 - kind: BucketClaim - metadata: - name: test-s3-key-retain - status: - bucketReady: true - - name: Create BucketAccess - try: - - apply: - file: ./resources/BucketAccess.yaml - - name: Check if BucketAccess is granted - try: - - assert: - resource: - apiVersion: objectstorage.k8s.io/v1alpha1 - kind: BucketAccess - metadata: - name: test-s3-key-retain - status: - accessGranted: true - - name: Check if Secret exists - try: - - assert: - resource: - apiVersion: v1 - kind: Secret - metadata: - name: test-s3-key-retain - - name: Run ObjectStorage validation tool - # TODO: This should be either a standalone test tool developed by us, to run test suite: - # - validate Secret format; - # - validate connectivity to the Object Storage server; - # Right now it is using busybox to check if the secret has correct format. - try: - - apply: - file: ../../../tests/validator.yaml - - create: - resource: - apiVersion: batch/v1 - kind: Job - metadata: - name: test-s3-key-retain - spec: - ttlSecondsAfterFinished: 100 - template: - spec: - restartPolicy: Never - containers: - - name: secret-test - image: docker.io/library/python:3.12 - command: [ "sh", "/validation/validation.sh" ] - volumeMounts: - - mountPath: /validator - name: validator - - mountPath: /conf - name: secret-vol - volumes: - - name: validator - configMap: - name: validator - - name: secret-vol - secret: - secretName: test-s3-key-retain - items: - - iam: BucketInfo - path: BucketInfo.json - - name: Check if ObjectStorage validation tool completed succesfully - try: - - assert: - resource: - apiVersion: batch/v1 - kind: Job - metadata: - name: test-s3-key-retain - status: - succeeded: 1 diff --git a/test/e2e/s3/key/retain/resources/BucketAccess.yaml b/test/e2e/s3/key/retain/resources/BucketAccess.yaml deleted file mode 100644 index f0f989c6..00000000 --- a/test/e2e/s3/key/retain/resources/BucketAccess.yaml +++ /dev/null @@ -1,9 +0,0 @@ -apiVersion: objectstorage.k8s.io/v1alpha1 -kind: BucketAccess -metadata: - name: test-s3-key-retain -spec: - bucketClaimName: test-s3-key-retain - protocol: S3 - bucketAccessClassName: test-s3-key-retain - credentialsSecretName: test-s3-key-retain diff --git a/test/e2e/s3/key/retain/resources/BucketAccessClass.yaml b/test/e2e/s3/key/retain/resources/BucketAccessClass.yaml deleted file mode 100644 index 583abb02..00000000 --- a/test/e2e/s3/key/retain/resources/BucketAccessClass.yaml +++ /dev/null @@ -1,7 +0,0 @@ -apiVersion: objectstorage.k8s.io/v1alpha1 -kind: BucketAccessClass -metadata: - name: test-s3-key-retain -driverName: sample-driver.objectstorage.k8s.io -authenticationType: IAM -parameters: {} diff --git a/test/e2e/s3/key/retain/resources/BucketClaim.yaml b/test/e2e/s3/key/retain/resources/BucketClaim.yaml deleted file mode 100644 index 6838604c..00000000 --- a/test/e2e/s3/key/retain/resources/BucketClaim.yaml +++ /dev/null @@ -1,7 +0,0 @@ -apiVersion: objectstorage.k8s.io/v1alpha1 -kind: BucketClaim -metadata: - name: test-s3-key-retain -spec: - bucketClassName: test-s3-key-retain - protocols: [ 'S3' ] diff --git a/test/e2e/s3/key/retain/resources/BucketClass.yaml b/test/e2e/s3/key/retain/resources/BucketClass.yaml deleted file mode 100644 index 5f3da09e..00000000 --- a/test/e2e/s3/key/retain/resources/BucketClass.yaml +++ /dev/null @@ -1,7 +0,0 @@ -apiVersion: objectstorage.k8s.io/v1alpha1 -kind: BucketClass -metadata: - name: test-s3-key-retain -driverName: sample-driver.objectstorage.k8s.io -deletionPolicy: Retain -parameters: {} diff --git a/test/e2e/tests/controller.yaml b/test/e2e/tests/controller.yaml deleted file mode 100644 index 26102720..00000000 --- a/test/e2e/tests/controller.yaml +++ /dev/null @@ -1,7 +0,0 @@ -apiVersion: apps/v1 -kind: Deployment -metadata: - name: objectstorage-controller - namespace: default -status: - availableReplicas: 1 diff --git a/test/e2e/tests/validator.yaml b/test/e2e/tests/validator.yaml deleted file mode 100644 index 93b73be6..00000000 --- a/test/e2e/tests/validator.yaml +++ /dev/null @@ -1,72 +0,0 @@ -apiVersion: v1 -kind: ConfigMap -metadata: - name: validator -data: - schema.json: | - { - "$schema": "http://json-schema.org/draft-07/schema#", - "type": "object", - "properties": { - "spec": { - "type": "object", - "properties": { - "bucketName": { - "type": "string" - }, - "authenticationType": { - "type": "string", - "enum": ["IAM", "Key"] - }, - "protocols": { - "type": "array", - "items": { - "type": "string", - "enum": ["S3", "Azure", "GCP"] - }, - "minItems": 1 - }, - "secretS3": { - "type": "object", - "properties": { - "endpoint": { - "type": "string" - }, - "region": { - "type": "string" - }, - "accessKeyID": { - "type": "string" - }, - "accessSecretKey": { - "type": "string" - } - }, - "required": ["endpoint", "region", "accessKeyID", "accessSecretKey"] - }, - "secretAzure": { - "type": "object", - "properties": { - "accessToken": { - "type": "string" - }, - "expiryTimeStamp": { - "type": "string" - } - }, - "required": ["accessToken", "expiryTimeStamp"] - } - }, - "required": ["bucketName", "authenticationType", "protocols"], - "oneOf": [ - { "required": ["secretS3"] }, - { "required": ["secretAzure"] } - ] - } - }, - "required": ["spec"] - } - validator.sh: | - #!/usr/bin/env sh - pip install check-jsonschema - check-jsonschema --schema /validator/schema.json /conf/BucketInfo.json From acc05c2f32c75fe412ea064e0c864e6c0a7812be Mon Sep 17 00:00:00 2001 From: Mateusz Urbanek Date: Tue, 3 Sep 2024 19:36:22 +0200 Subject: [PATCH 07/10] feat: add test generator Signed-off-by: Mateusz Urbanek --- test/generator/config-sample.yaml | 30 ++ test/generator/config.yaml | 10 + test/generator/config/config.go | 97 +++++ test/generator/generator/generator.go | 351 ++++++++++++++++++ .../generator/template/BucketAccess.gotpl | 15 + .../template/BucketAccessClass.gotpl | 11 + .../generator/template/BucketClaim.gotpl | 8 + .../generator/template/BucketClass.gotpl | 11 + .../generator/template/chainsaw-test.gotpl | 186 ++++++++++ test/generator/go.mod | 28 ++ test/generator/go.sum | 260 +++++++++++++ test/generator/main.go | 111 ++++++ 12 files changed, 1118 insertions(+) create mode 100644 test/generator/config-sample.yaml create mode 100644 test/generator/config.yaml create mode 100644 test/generator/config/config.go create mode 100644 test/generator/generator/generator.go create mode 100644 test/generator/generator/template/BucketAccess.gotpl create mode 100644 test/generator/generator/template/BucketAccessClass.gotpl create mode 100644 test/generator/generator/template/BucketClaim.gotpl create mode 100644 test/generator/generator/template/BucketClass.gotpl create mode 100644 test/generator/generator/template/chainsaw-test.gotpl create mode 100644 test/generator/go.mod create mode 100644 test/generator/go.sum create mode 100644 test/generator/main.go diff --git a/test/generator/config-sample.yaml b/test/generator/config-sample.yaml new file mode 100644 index 00000000..bda978b1 --- /dev/null +++ b/test/generator/config-sample.yaml @@ -0,0 +1,30 @@ +templates: {} + # chainsaw-test.yaml: "/path/to/non-default/template.gotpl" + # BucketAccess.yaml: "/path/to/non-default/template.gotpl" + # BucketAccessClass.yaml: "/path/to/non-default/template.gotpl" + # BucketClaim.yaml: "/path/to/non-default/template.gotpl" + # BucketClass.yaml: "/path/to/non-default/template.gotpl" + +driver: sample-driver.objectstorage.k8s.io + +deletionPolicy: +- Retain +- Delete + +authenticationType: +- IAM +- Key + +protocol: +- S3 +- Azure + +bucketClassParams: +- foo: bar + baz: cux +- baz: cux + +bucketAccessClassParams: +- foo: bar + baz: cux +- baz: cux diff --git a/test/generator/config.yaml b/test/generator/config.yaml new file mode 100644 index 00000000..1d4b1a6d --- /dev/null +++ b/test/generator/config.yaml @@ -0,0 +1,10 @@ +templates: {} +driver: sample-driver.objectstorage.k8s.io +deletionPolicy: +- Delete +authenticationType: +- Key +protocol: +- S3 +bucketClassParams: [] +bucketAccessClassParams: [] diff --git a/test/generator/config/config.go b/test/generator/config/config.go new file mode 100644 index 00000000..a2a4d64e --- /dev/null +++ b/test/generator/config/config.go @@ -0,0 +1,97 @@ +/* +Copyright 2024 The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package config + +import ( + "bytes" + "io" + "os" + + "sigs.k8s.io/container-object-storage-interface-api/apis/objectstorage/v1alpha1" + "sigs.k8s.io/yaml" +) + +// Load reads the YAML configuration from the provided file path and unmarshals it into a Config struct. +// It returns a pointer to the Config struct and any error encountered during the process. +func Load(path string) (*Config, error) { + f, err := os.Open(path) + if err != nil { + return nil, err + } + defer f.Close() + + buf := new(bytes.Buffer) + + _, err = io.Copy(buf, f) + if err != nil { + return nil, err + } + + cfg := &Config{} + + err = yaml.Unmarshal(buf.Bytes(), cfg) + if err != nil { + return nil, err + } + + return cfg, nil +} + +// Config represents the configuration for generating tests. +// It includes various fields like driver details, deletion policies, authentication types, protocols, +// and parameters for BucketClass and BucketAccessClass. +type Config struct { + // Templates contains paths to the YAML templates for various resources. + Templates Templates `json:"templates"` + + // Driver is the name of the driver used in the test configuration. + Driver string `json:"driver"` + + // DeletionPolicy is a list of deletion policies to be applied in the tests. + DeletionPolicy []v1alpha1.DeletionPolicy `json:"deletionPolicy"` + + // AuthenticationType is a list of authentication types to be used in the tests. + AuthenticationType []v1alpha1.AuthenticationType `json:"authenticationType"` + + // Protocol is a list of protocols to be used in the tests. + Protocol []v1alpha1.Protocol `json:"protocol"` + + // BucketClassParams is a list of parameters for configuring BucketClass resources. + BucketClassParams []map[string]string `json:"bucketClassParams"` + + // BucketAccessClassParams is a list of parameters for configuring BucketAccessClass resources. + BucketAccessClassParams []map[string]string `json:"bucketAccessClassParams"` +} + +// Templates represents the file paths to the templates used for generating various Kubernetes resources. +// These templates are referenced in the test configurations. +type Templates struct { + // ChainsawTest is the path to the Chainsaw test YAML template. + ChainsawTest string `json:"chainsaw-test.yaml"` + + // BucketAccess is the path to the BucketAccess YAML template. + BucketAccess string `json:"BucketAccess.yaml"` + + // BucketAccessClass is the path to the BucketAccessClass YAML template. + BucketAccessClass string `json:"BucketAccessClass.yaml"` + + // BucketClaim is the path to the BucketClaim YAML template. + BucketClaim string `json:"BucketClaim.yaml"` + + // BucketClass is the path to the BucketClass YAML template. + BucketClass string `json:"BucketClass.yaml"` +} diff --git a/test/generator/generator/generator.go b/test/generator/generator/generator.go new file mode 100644 index 00000000..b33c2d01 --- /dev/null +++ b/test/generator/generator/generator.go @@ -0,0 +1,351 @@ +/* +Copyright 2024 The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package generator + +import ( + "bytes" + "fmt" + "io" + "os" + "strings" + "text/template" + + // embedding Chainsaw test templates + _ "embed" + + "k8s.io/klog/v2" + "sigs.k8s.io/container-object-storage-interface-api/apis/objectstorage/v1alpha1" + "sigs.k8s.io/container-object-storage-interface-api/test/generator/config" +) + +var ( + // chainsawTestSpec is the embedded template for the Chainsaw test specification. + //go:embed template/chainsaw-test.gotpl + chainsawTestSpec string + + // bucketClassTpl is the embedded template for the BucketClass resource. + //go:embed template/BucketClass.gotpl + bucketClassTpl string + + // bucketAccessClassTpl is the embedded template for the BucketAccessClass resource. + //go:embed template/BucketAccessClass.gotpl + bucketAccessClassTpl string + + // bucketClaimTpl is the embedded template for the BucketClaim resource. + //go:embed template/BucketClaim.gotpl + bucketClaimTpl string + + // bucketAccessTpl is the embedded template for the BucketAccess resource. + //go:embed template/BucketAccess.gotpl + bucketAccessTpl string +) + +// Test represents a test case that includes a name and associated resources. +type Test struct { + Name string + Resources Resources + ChainsawTestSpec []byte +} + +// Resources contains the byte representations of various Kubernetes resources used in a test. +type Resources struct { + BucketClass []byte + BucketAccessClass []byte + BucketClaim []byte + BucketAccess []byte +} + +const ( + Name = "name" + Driver = "driver" + Proto = "protocol" + Auth = "authenticationType" + Policy = "deletionPolicy" + BcParams = "bucketClassParams" + BacParams = "bucketAccessClassParams" +) + +// matrix represents a test matrix, which is a collection of test data variations. +type matrix map[string]map[string]any + +// newMatrix creates a new matrix with a given driver. +func newMatrix(driver string) matrix { + return matrix{ + "test": map[string]any{ + Driver: driver, + Name: "test", + }, + } +} + +// addProtocol adds protocol variations to the matrix. +func (src matrix) addProtocol(protocols []v1alpha1.Protocol) matrix { + override := matrix{} + + if len(protocols) == 0 { + return src + } + + for _, p := range protocols { + for name, data := range src { + name = fmt.Sprintf( + "%s-%s", + name, + strings.ToLower(string(p)), + ) + + data[Proto] = string(p) + data[Name] = name + + override[name] = data + } + } + + return override +} + +// addAuth adds authentication type variations to the matrix. +func (src matrix) addAuth(auths []v1alpha1.AuthenticationType) matrix { + override := matrix{} + + if len(auths) == 0 { + return src + } + + for _, at := range auths { + for name, data := range src { + name := fmt.Sprintf( + "%s-%s", + name, + strings.ToLower(string(at)), + ) + + data[Auth] = string(at) + data[Name] = name + + override[name] = data + } + } + + return override +} + +// addDeletionPolicy adds deletion policy variations to the matrix. +func (src matrix) addDeletionPolicy(policies []v1alpha1.DeletionPolicy) matrix { + override := matrix{} + + if len(policies) == 0 { + return src + } + + for _, dp := range policies { + for name, data := range src { + name = fmt.Sprintf( + "%s-%s", + name, + strings.ToLower(string(dp)), + ) + + data[Policy] = string(dp) + data[Name] = name + + override[name] = data + } + } + + return override +} + +// addBCParams adds BucketClass parameters to the matrix. +func (src matrix) addBCParams(params []map[string]string) matrix { + override := matrix{} + + if len(params) == 0 { + return src + } + + for bcp, params := range params { + for name, data := range src { + data := copy(data) + sbcp := fmt.Sprintf("bcp%d", bcp) + name := fmt.Sprintf( + "%s-%s", + name, + sbcp, + ) + + data[BcParams] = copy(params) + data[Name] = name + + override[name] = data + } + } + + return override +} + +// addBACParams adds BucketAccessClass parameters to the matrix. +func (src matrix) addBACParams(params []map[string]string) matrix { + override := matrix{} + + if len(params) == 0 { + return src + } + + for bacp, params := range params { + for name, data := range src { + data := copy(data) + sbacp := fmt.Sprintf("bacp%d", bacp) + name := fmt.Sprintf( + "%s-%s", + name, + sbacp, + ) + newParams := copy(params) + + data[BacParams] = newParams + data[Name] = name + + override[name] = data + } + } + + return override +} + +// toTests converts the matrix into a slice of Test objects using the provided templates. +func (src matrix) toTests(tpls config.Templates) ([]Test, error) { + tests := []Test{} + + for name, data := range src { + chainsawTest, err := renderTemplate( + loadTemplateOrDefault(tpls.ChainsawTest, chainsawTestSpec), + data, + ) + if err != nil { + return nil, err + } + + bucketClass, err := renderTemplate( + loadTemplateOrDefault(tpls.ChainsawTest, bucketClassTpl), + data, + ) + if err != nil { + return nil, err + } + + bucketAccessClass, err := renderTemplate( + loadTemplateOrDefault(tpls.ChainsawTest, bucketAccessClassTpl), + data, + ) + if err != nil { + return nil, err + } + + bucketAccess, err := renderTemplate( + loadTemplateOrDefault(tpls.ChainsawTest, bucketAccessTpl), + data, + ) + if err != nil { + return nil, err + } + + bucketClaim, err := renderTemplate( + loadTemplateOrDefault(tpls.ChainsawTest, bucketClaimTpl), + data, + ) + if err != nil { + return nil, err + } + + tests = append(tests, Test{ + Name: name, + ChainsawTestSpec: chainsawTest, + Resources: Resources{ + BucketClass: bucketClass, + BucketAccessClass: bucketAccessClass, + BucketAccess: bucketAccess, + BucketClaim: bucketClaim, + }, + }) + } + + return tests, nil +} + +// Matrix generates a slice of tests based on the provided configuration. +func Matrix(cfg *config.Config) ([]Test, error) { + return newMatrix(cfg.Driver). + addAuth(cfg.AuthenticationType). + addBACParams(cfg.BucketAccessClassParams). + addBCParams(cfg.BucketClassParams). + addDeletionPolicy(cfg.DeletionPolicy). + addProtocol(cfg.Protocol). + toTests(cfg.Templates) +} + +// copy copies all key-value pairs from the src map to a new map. +func copy[T comparable, U any](src map[T]U) map[T]U { + dst := make(map[T]U) + + // Iterate over the source map + for key, value := range src { + // Copy each key-value pair to the destination map + dst[key] = value + } + + return dst +} + +// renderTemplate renders a template with the provided data and returns the result as a byte slice. +func renderTemplate(text string, data map[string]any) ([]byte, error) { + buf := new(bytes.Buffer) + + tpl, err := template.New("").Parse(text) + if err != nil { + return nil, err + } + + if err := tpl.Execute(buf, data); err != nil { + return nil, err + } + + return buf.Bytes(), nil +} + +// loadTemplateOrDefault loads a template from a file if a path is provided. +// If the path is empty or an error occurs, it returns the default template text. +func loadTemplateOrDefault(path string, text string) string { + if path == "" { + return text + } + + f, err := os.Open(path) + if err != nil { + klog.V(0).ErrorS(err, "Unable to open file", "file", path) + return text + } + defer f.Close() + + buf := new(bytes.Buffer) + if _, err := io.Copy(buf, f); err != nil { + klog.V(0).ErrorS(err, "Unable to read file contents", "file", path) + return text + } + + return buf.String() +} diff --git a/test/generator/generator/template/BucketAccess.gotpl b/test/generator/generator/template/BucketAccess.gotpl new file mode 100644 index 00000000..fe0b7b25 --- /dev/null +++ b/test/generator/generator/template/BucketAccess.gotpl @@ -0,0 +1,15 @@ +--- +apiVersion: objectstorage.k8s.io/v1alpha1 +kind: BucketAccess +metadata: + name: {{ index . "name" }} +spec: + bucketClaimName: {{ index . "name" }} + protocol: {{ index . "protocol" }} + bucketAccessClassName: {{ index . "name" }} +{{- $auth := index . "authenticationType" }} +{{- if eq $auth "Key" }} + credentialsSecretName: {{ index . "name" }} +{{- else }} + serviceAccountName: {{ index . "name" }} +{{- end }} diff --git a/test/generator/generator/template/BucketAccessClass.gotpl b/test/generator/generator/template/BucketAccessClass.gotpl new file mode 100644 index 00000000..170cfd74 --- /dev/null +++ b/test/generator/generator/template/BucketAccessClass.gotpl @@ -0,0 +1,11 @@ +--- +apiVersion: objectstorage.k8s.io/v1alpha1 +kind: BucketAccessClass +metadata: + name: {{ index . "name" }} +driverName: {{ index . "driver" }} +authenticationType: {{ index . "authenticationType" }} +parameters: +{{- range $key, $value := index . "bucketAccessClassParams" }} + {{ $key }}: {{ $value }} +{{- end }} diff --git a/test/generator/generator/template/BucketClaim.gotpl b/test/generator/generator/template/BucketClaim.gotpl new file mode 100644 index 00000000..9091bce3 --- /dev/null +++ b/test/generator/generator/template/BucketClaim.gotpl @@ -0,0 +1,8 @@ +--- +apiVersion: objectstorage.k8s.io/v1alpha1 +kind: BucketClaim +metadata: + name: {{ index . "name" }} +spec: + bucketClassName: {{ index . "name" }} + protocols: [ '{{ index . "protocol" }}' ] diff --git a/test/generator/generator/template/BucketClass.gotpl b/test/generator/generator/template/BucketClass.gotpl new file mode 100644 index 00000000..387d03eb --- /dev/null +++ b/test/generator/generator/template/BucketClass.gotpl @@ -0,0 +1,11 @@ +--- +apiVersion: objectstorage.k8s.io/v1alpha1 +kind: BucketClass +metadata: + name: {{ index . "name" }} +driverName: {{ index . "driver" }} +deletionPolicy: {{ index . "deletionPolicy" }} +parameters: +{{- range $key, $value := index . "bucketClassParams" }} + {{ $key }}: {{ $value }} +{{- end }} diff --git a/test/generator/generator/template/chainsaw-test.gotpl b/test/generator/generator/template/chainsaw-test.gotpl new file mode 100644 index 00000000..1ac734a1 --- /dev/null +++ b/test/generator/generator/template/chainsaw-test.gotpl @@ -0,0 +1,186 @@ +--- +# yaml-language-server: $schema=https://raw.githubusercontent.com/kyverno/chainsaw/main/.schemas/json/test-chainsaw-v1alpha1.json +apiVersion: chainsaw.kyverno.io/v1alpha1 +kind: Test +metadata: + name: {{ index . "name" }} + labels: + protocol: {{ index . "protocol" }} + authenticationType: {{ index . "authenticationType" }} + deletionPolicy: {{ index . "deletionPolicy" }} +spec: + template: true + steps: + - name: Check if COSI Controller exist + try: + - assert: + resource: + apiVersion: apps/v1 + kind: Deployment + metadata: + name: objectstorage-controller + namespace: default + status: + availableReplicas: 1 + - name: Create test BucketClass and BucketAccessClass + try: + - apply: + file: ./resources/BucketClass.yaml + - apply: + file: ./resources/BucketAccessClass.yaml + - name: Create BucketClaim + try: + - apply: + file: ./resources/BucketClaim.yaml + - name: Check if BucketClaim is ready + try: + - assert: + resource: + apiVersion: objectstorage.k8s.io/v1alpha1 + kind: BucketClaim + metadata: + name: {{ index . "name" }} + status: + bucketReady: true + - name: Create BucketAccess + try: + - apply: + file: ./resources/BucketAccess.yaml + - name: Check if BucketAccess is granted + try: + - assert: + resource: + apiVersion: objectstorage.k8s.io/v1alpha1 + kind: BucketAccess + metadata: + name: {{ index . "name" }} + status: + accessGranted: true + - name: Check if Secret exists + try: + - assert: + resource: + apiVersion: v1 + kind: Secret + metadata: + name: {{ index . "name" }} + - name: Run ObjectStorage validation tool + # TODO: This should be either a standalone test tool developed by us, to run test suite: + # - validate Secret format; + # - validate connectivity to the Object Storage server; + # Right now it is using busybox to check if the secret has correct format. + try: + - apply: + resource: + apiVersion: v1 + kind: ConfigMap + metadata: + name: validation + data: + schema.json: | + { + "$schema": "http://json-schema.org/draft-07/schema#", + "type": "object", + "properties": { + "spec": { + "type": "object", + "properties": { + "bucketName": { + "type": "string" + }, + "authenticationType": { + "type": "string", + "enum": ["IAM", "Key"] + }, + "protocols": { + "type": "array", + "items": { + "type": "string", + "enum": ["S3", "Azure", "GCP"] + }, + "minItems": 1 + }, + "secretS3": { + "type": "object", + "properties": { + "endpoint": { + "type": "string" + }, + "region": { + "type": "string" + }, + "accessKeyID": { + "type": "string" + }, + "accessSecretKey": { + "type": "string" + } + }, + "required": ["endpoint", "region", "accessKeyID", "accessSecretKey"] + }, + "secretAzure": { + "type": "object", + "properties": { + "accessToken": { + "type": "string" + }, + "expiryTimeStamp": { + "type": "string" + } + }, + "required": ["accessToken", "expiryTimeStamp"] + } + }, + "required": ["bucketName", "authenticationType", "protocols"], + "oneOf": [ + { "required": ["secretS3"] }, + { "required": ["secretAzure"] } + ] + } + }, + "required": ["spec"] + } + validator.sh: | + #!/usr/bin/env sh + pip install check-jsonschema + check-jsonschema --schema /validator/schema.json /conf/BucketInfo.json + - create: + resource: + apiVersion: batch/v1 + kind: Job + metadata: + name: {{ index . "name" }} + spec: + ttlSecondsAfterFinished: 100 + template: + spec: + restartPolicy: Never + containers: + - name: secret-test + image: docker.io/library/python:alpine # "latest" style tag, to prevent manual updates + command: [ "sh", "/validation/validation.sh" ] + volumeMounts: + - mountPath: /validation + name: validation + - mountPath: /conf + name: secret-vol + volumes: + - name: validation + configMap: + name: validation + - name: secret-vol + secret: + secretName: {{ index . "name" }} + items: + - iam: BucketInfo + path: BucketInfo.json + - name: Check if ObjectStorage validation tool completed succesfully + try: + - assert: + resource: + apiVersion: batch/v1 + kind: Job + metadata: + name: {{ index . "name" }} + status: + succeeded: 1 diff --git a/test/generator/go.mod b/test/generator/go.mod new file mode 100644 index 00000000..149711c3 --- /dev/null +++ b/test/generator/go.mod @@ -0,0 +1,28 @@ +module sigs.k8s.io/container-object-storage-interface-api/test/generator + +go 1.22.5 + +require ( + k8s.io/klog/v2 v2.70.1 + sigs.k8s.io/container-object-storage-interface-api v0.1.0 + sigs.k8s.io/yaml v1.4.0 +) + +require ( + github.com/go-logr/logr v1.2.0 // indirect + github.com/gogo/protobuf v1.3.2 // indirect + github.com/google/gofuzz v1.1.0 // indirect + github.com/json-iterator/go v1.1.12 // indirect + github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect + github.com/modern-go/reflect2 v1.0.2 // indirect + golang.org/x/net v0.0.0-20220520000938-2e3eb7b945c2 // indirect + golang.org/x/text v0.3.7 // indirect + gopkg.in/inf.v0 v0.9.1 // indirect + gopkg.in/yaml.v2 v2.4.0 // indirect + k8s.io/api v0.24.2 // indirect + k8s.io/apimachinery v0.24.2 // indirect + k8s.io/utils v0.0.0-20220210201930-3a6ce19ff2f9 // indirect + sigs.k8s.io/controller-runtime v0.12.3 // indirect + sigs.k8s.io/json v0.0.0-20211208200746-9f7c6b3444d2 // indirect + sigs.k8s.io/structured-merge-diff/v4 v4.2.1 // indirect +) diff --git a/test/generator/go.sum b/test/generator/go.sum new file mode 100644 index 00000000..7f406cf1 --- /dev/null +++ b/test/generator/go.sum @@ -0,0 +1,260 @@ +cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= +github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= +github.com/NYTimes/gziphandler v0.0.0-20170623195520-56545f4a5d46/go.mod h1:3wb06e3pkSAbeQ52E9H9iFoQsEEwGN64994WTCIhntQ= +github.com/PuerkitoBio/purell v1.1.1/go.mod h1:c11w/QuzBsJSee3cPx9rAFu61PvFxuPbtSwDGJws/X0= +github.com/PuerkitoBio/urlesc v0.0.0-20170810143723-de5bf2ad4578/go.mod h1:uGdkoq3SwY9Y+13GIhn11/XLaGBb4BfwItxLd5jeuXE= +github.com/armon/go-socks5 v0.0.0-20160902184237-e75332964ef5/go.mod h1:wHh0iHkYZB8zMSxRWpUBQtwG5a7fFgvEO+odwuTv2gs= +github.com/asaskevich/govalidator v0.0.0-20190424111038-f61b66f89f4a/go.mod h1:lB+ZfQJz7igIIfQNfa7Ml4HSf2uFQQRzpGGRXenZAgY= +github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= +github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= +github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= +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/docopt/docopt-go v0.0.0-20180111231733-ee0de3bc6815/go.mod h1:WwZ+bS3ebgob9U8Nd0kOddGdZWjyMGR8Wziv+TBNwSE= +github.com/elazarl/goproxy v0.0.0-20180725130230-947c36da3153/go.mod h1:/Zj4wYkgs4iZTTu3o/KG3Itv/qCCa8VVMlb3i9OVuzc= +github.com/emicklei/go-restful v0.0.0-20170410110728-ff4f55a20633/go.mod h1:otzb+WCGbkyDHkqmQmT5YD2WR4BBwUdeQoFo8l/7tVs= +github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= +github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= +github.com/evanphx/json-patch v4.12.0+incompatible/go.mod h1:50XU6AFN0ol/bzJsmQLiYLvXMP4fmwYFNcr97nuDLSk= +github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= +github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ= +github.com/fsnotify/fsnotify v1.5.4 h1:jRbGcIw6P2Meqdwuo0H1p6JVLbL5DHKAKlYndzMwVZI= +github.com/fsnotify/fsnotify v1.5.4/go.mod h1:OVB6XrOHzAwXMpEM7uPOzcehqUV2UqJxmVXmkdnm1bU= +github.com/getkin/kin-openapi v0.76.0/go.mod h1:660oXbgy5JFMKreazJaQTw7o+X00qeSyhcnluiMv+Xg= +github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= +github.com/go-logr/logr v0.1.0/go.mod h1:ixOQHD9gLJUVQQ2ZOR7zLEifBX6tGkNJF4QyIY7sIas= +github.com/go-logr/logr v0.2.0/go.mod h1:z6/tIYblkpsD+a4lm/fGIIU9mZ+XfAiaFtq7xTgseGU= +github.com/go-logr/logr v1.2.0 h1:QK40JKJyMdUDz+h+xvCsru/bJhvG0UxvePV0ufL/AcE= +github.com/go-logr/logr v1.2.0/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= +github.com/go-openapi/jsonpointer v0.19.3/go.mod h1:Pl9vOtqEWErmShwVjC8pYs9cog34VGT37dQOVbmoatg= +github.com/go-openapi/jsonpointer v0.19.5/go.mod h1:Pl9vOtqEWErmShwVjC8pYs9cog34VGT37dQOVbmoatg= +github.com/go-openapi/jsonreference v0.19.3/go.mod h1:rjx6GuL8TTa9VaixXglHmQmIL98+wF9xc8zWvFonSJ8= +github.com/go-openapi/swag v0.19.5/go.mod h1:POnQmlKehdgb5mhVOsnJFsivZCEZ/vjK9gh66Z9tfKk= +github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q= +github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= +github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= +github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= +github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= +github.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= +github.com/golang/protobuf v1.4.0-rc.1/go.mod h1:ceaxUfeHdC40wWswd/P6IGgMaK3YpKi5j83Wpe3EHw8= +github.com/golang/protobuf v1.4.0-rc.1.0.20200221234624-67d41d38c208/go.mod h1:xKAWHe0F5eneWXFV3EuXVDTCmh+JuBKY0li0aMyXATA= +github.com/golang/protobuf v1.4.0-rc.2/go.mod h1:LlEzMj4AhA7rCAGe4KMBDvJI+AwstrUpVNzEA03Pprs= +github.com/golang/protobuf v1.4.0-rc.4.0.20200313231945-b860323f09d0/go.mod h1:WU3c8KckQ9AFe+yFwt9sWVRKCVIyN9cPHBJSNnbL67w= +github.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvqG2KuDX0= +github.com/golang/protobuf v1.4.1/go.mod h1:U8fpvMrcmy5pZrNK1lt4xCsGvpyWQ/VVv6QDs8UjoX8= +github.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= +github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk= +github.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= +github.com/google/gnostic v0.5.7-v3refs/go.mod h1:73MKFl6jIHelAJNaBGFzt3SPtZULs9dYrGFt8OiIsHQ= +github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M= +github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= +github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= +github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.9 h1:O2Tfq5qg4qc4AmwVlvv0oLiVAGB7enBSJ2x2DqQFi38= +github.com/google/go-cmp v0.5.9/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= +github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= +github.com/google/gofuzz v1.1.0 h1:Hsa8mG0dQ46ij8Sl2AYJDUv1oA9/d6Vk+3LG99Oe02g= +github.com/google/gofuzz v1.1.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= +github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/gorilla/mux v1.8.0/go.mod h1:DVbg23sWSpFRCP0SfiEN6jmj59UnW/n46BH5rLB71So= +github.com/gorilla/websocket v1.4.2/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= +github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU= +github.com/json-iterator/go v1.1.6/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU= +github.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnrnM= +github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo= +github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8= +github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= +github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= +github.com/kr/pretty v0.2.0/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= +github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= +github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= +github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= +github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= +github.com/mailru/easyjson v0.0.0-20190614124828-94de47d64c63/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= +github.com/mailru/easyjson v0.0.0-20190626092158-b2ccc519800e/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= +github.com/mitchellh/mapstructure v1.1.2/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= +github.com/moby/spdystream v0.2.0/go.mod h1:f7i0iNDQJ059oMTcWxx8MA/zKFIuD/lY+0GqbN2Wy8c= +github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= +github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w8PVh93nsPXa1VrQ6jlwL5oN8l14QlcNfg= +github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= +github.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= +github.com/modern-go/reflect2 v1.0.2 h1:xBagoLtFs94CBntxluKeaWgTMpvLxC4ur3nMaC9Gz0M= +github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk= +github.com/munnerz/goautoneg v0.0.0-20120707110453-a547fc61f48d/go.mod h1:+n7T8mK8HuQTcFwEeznm/DIxMOiR9yIdICNftLE1DvQ= +github.com/mxk/go-flowrate v0.0.0-20140419014527-cca7078d478f/go.mod h1:ZdcZmHo+o7JKHSa8/e818NopupXU1YMK5fe1lsApnBw= +github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e h1:fD57ERR4JtEqsWbfPhv4DMiApHyliiK5xCTNVSPiaAs= +github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e/go.mod h1:zD1mROLANZcx1PVRCS0qkT7pwLkGfwJo4zjcN/Tysno= +github.com/nxadm/tail v1.4.4/go.mod h1:kenIhsEOeOJmVchQTgglprH7qJGnHDVpk1VPCcaMI8A= +github.com/nxadm/tail v1.4.8 h1:nPr65rt6Y5JFSKQO7qToXr7pePgD6Gwiw05lkbyAQTE= +github.com/nxadm/tail v1.4.8/go.mod h1:+ncqLTQzXmGhMZNUePPaPqPvBxHAIsmXswZKocGu+AU= +github.com/onsi/ginkgo v0.0.0-20170829012221-11459a886d9c/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= +github.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= +github.com/onsi/ginkgo v1.12.1/go.mod h1:zj2OWP4+oCPe1qIXoGWkgMRwljMUYCdkwsT2108oapk= +github.com/onsi/ginkgo v1.14.0/go.mod h1:iSB4RoI2tjJc9BBv4NKIKWKya62Rps+oPG/Lv9klQyY= +github.com/onsi/ginkgo v1.16.5 h1:8xi0RTUf59SOSfEtZMvwTvXYMzG4gV23XVHOZiXNtnE= +github.com/onsi/ginkgo v1.16.5/go.mod h1:+E8gABHa3K6zRBolWtd+ROzc/U5bkGt0FwiG042wbpU= +github.com/onsi/gomega v0.0.0-20170829124025-dcabb60a477c/go.mod h1:C1qb7wdrVGGVU+Z6iS04AVkA3Q65CEZX59MT0QO5uiA= +github.com/onsi/gomega v1.7.1/go.mod h1:XdKZgCCFLUoM/7CFJVPcG8C1xQ1AJ0vpAezJrB7JYyY= +github.com/onsi/gomega v1.10.1/go.mod h1:iN09h71vgCQne3DLsj+A5owkum+a2tYe+TOCB1ybHNo= +github.com/onsi/gomega v1.18.1 h1:M1GfJqGRrBrrGGsbxzV5dqM2U2ApXefZCQpkukxYRLE= +github.com/onsi/gomega v1.18.1/go.mod h1:0q+aL8jAiMXy9hbwj2mr5GziHiwhAIQpFmmtT5hitRs= +github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= +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/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= +github.com/spf13/afero v1.2.2/go.mod h1:9ZxEEn6pIJ8Rxe320qSDBk6AsU0r9pR7Q4OcevTdifk= +github.com/spf13/pflag v1.0.5 h1:iy+VFUOCP1a+8yFto/drg2CJ5u0yRoB7fZw3DKv/JXA= +github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= +github.com/stoewer/go-strcase v1.2.0/go.mod h1:IBiWB2sKIp3wVVQ3Y035++gc+knqhUQag1KpM8ahLw8= +github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= +github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= +github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA= +github.com/stretchr/testify v1.7.0 h1:nwc3DEeHmmLAfoZucVR881uASk0Mfjw8xYJ99tb5CcY= +github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= +github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= +github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= +github.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= +golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= +golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= +golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= +golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= +golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU= +golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= +golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20190827160401-ba9fcec4b297/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200520004742-59133d7f0dd7/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= +golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= +golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM= +golang.org/x/net v0.0.0-20220127200216-cd36cc0744dd/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= +golang.org/x/net v0.0.0-20220520000938-2e3eb7b945c2 h1:NWy5+hlRbC7HK+PmcXVUmW1IMyFce7to56IUvhUFm7Y= +golang.org/x/net v0.0.0-20220520000938-2e3eb7b945c2/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= +golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= +golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190904154756-749cb33beabd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191005200804-aed5e4c7ecf9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191120155948-bd437916bb0e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200519105757-fe76b779f299/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20211216021012-1d35b9e2eb4e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220209214540-3681064d5158/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a h1:dGzPydgVsqGcTRVwiLJ1jVbufYwmzD3LfVPLKsKg+0k= +golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= +golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= +golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= +golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= +golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= +golang.org/x/text v0.3.7 h1:olpwvP2KacW1ZWvsR7uQhoyTYvKAupfQrRGBFM352Gk= +golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= +golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY= +golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= +golang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= +golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20200505023115-26f46d2f7ef8/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= +golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= +golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= +golang.org/x/tools v0.1.5/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= +golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM= +google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= +google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= +google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= +google.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo= +google.golang.org/genproto v0.0.0-20201019141844-1ed22bb0c154/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= +google.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= +google.golang.org/grpc v1.27.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= +google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8= +google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0= +google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM= +google.golang.org/protobuf v1.20.1-0.20200309200217-e05f789c0967/go.mod h1:A+miEFZTKqfCUM6K7xSMQL9OKL/b6hQv+e19PK+JZNE= +google.golang.org/protobuf v1.21.0/go.mod h1:47Nbq4nVaFHyn7ilMalzfO3qCViNmqZ2kzikPIcrTAo= +google.golang.org/protobuf v1.22.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= +google.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= +google.golang.org/protobuf v1.23.1-0.20200526195155-81db48ad09cc/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= +google.golang.org/protobuf v1.24.0/go.mod h1:r/3tXBNzIEhYS9I1OUVjXDlt8tc493IdKGjtUeSXeh4= +google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw= +google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= +google.golang.org/protobuf v1.27.1/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= +gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/check.v1 v1.0.0-20200227125254-8fa46927fb4f h1:BLraFXnmrev5lT+xlilqcH8XK9/i0At2xKjWk4p6zsU= +gopkg.in/check.v1 v1.0.0-20200227125254-8fa46927fb4f/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys= +gopkg.in/inf.v0 v0.9.1 h1:73M5CoZyi3ZLMOyDlQh031Cx6N9NDJ2Vvfl76EDAgDc= +gopkg.in/inf.v0 v0.9.1/go.mod h1:cWUDdTG/fYaXco+Dcufb5Vnc6Gp2YChqWtbxRZE0mXw= +gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7 h1:uRGJdciOHaEIrze2W8Q3AKkepLTh2hOroT7a+7czfdQ= +gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7/go.mod h1:dt/ZhP58zS4L8KSrWDmTeBkI65Dw0HsyUHuEVlX15mw= +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.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.3.0/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY= +gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ= +gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +gopkg.in/yaml.v3 v3.0.0-20200615113413-eeeca48fe776/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +gopkg.in/yaml.v3 v3.0.0 h1:hjy8E9ON/egN1tAYqKb61G10WtihqetD4sz2H+8nIeA= +gopkg.in/yaml.v3 v3.0.0/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= +honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= +k8s.io/api v0.24.2 h1:g518dPU/L7VRLxWfcadQn2OnsiGWVOadTLpdnqgY2OI= +k8s.io/api v0.24.2/go.mod h1:AHqbSkTm6YrQ0ObxjO3Pmp/ubFF/KuM7jU+3khoBsOg= +k8s.io/apimachinery v0.24.2 h1:5QlH9SL2C8KMcrNJPor+LbXVTaZRReml7svPEh4OKDM= +k8s.io/apimachinery v0.24.2/go.mod h1:82Bi4sCzVBdpYjyI4jY6aHX+YCUchUIrZrXKedjd2UM= +k8s.io/gengo v0.0.0-20210813121822-485abfe95c7c/go.mod h1:FiNAH4ZV3gBg2Kwh89tzAEV2be7d5xI0vBa/VySYy3E= +k8s.io/klog/v2 v2.0.0/go.mod h1:PBfzABfn139FHAV07az/IF9Wp1bkk3vpT2XSJ76fSDE= +k8s.io/klog/v2 v2.2.0/go.mod h1:Od+F08eJP+W3HUb4pSrPpgp9DGU4GzlpG/TmITuYh/Y= +k8s.io/klog/v2 v2.60.1/go.mod h1:y1WjHnz7Dj687irZUWR/WLkLc5N1YHtjLdmgWjndZn0= +k8s.io/klog/v2 v2.70.1 h1:7aaoSdahviPmR+XkS7FyxlkkXs6tHISSG03RxleQAVQ= +k8s.io/klog/v2 v2.70.1/go.mod h1:y1WjHnz7Dj687irZUWR/WLkLc5N1YHtjLdmgWjndZn0= +k8s.io/kube-openapi v0.0.0-20220328201542-3ee0da9b0b42/go.mod h1:Z/45zLw8lUo4wdiUkI+v/ImEGAvu3WatcZl3lPMR4Rk= +k8s.io/utils v0.0.0-20210802155522-efc7438f0176/go.mod h1:jPW/WVKK9YHAvNhRxK0md/EJ228hCsBRufyofKtW8HA= +k8s.io/utils v0.0.0-20220210201930-3a6ce19ff2f9 h1:HNSDgDCrr/6Ly3WEGKZftiE7IY19Vz2GdbOCyI4qqhc= +k8s.io/utils v0.0.0-20220210201930-3a6ce19ff2f9/go.mod h1:jPW/WVKK9YHAvNhRxK0md/EJ228hCsBRufyofKtW8HA= +sigs.k8s.io/container-object-storage-interface-api v0.1.0 h1:8tB6JFQhbQIC1hwGQ+q4+tmSSNfjKemb7bFI6C0CK/4= +sigs.k8s.io/container-object-storage-interface-api v0.1.0/go.mod h1:YiB+i/UGkzqgODDhRG3u7jkbWkQcoUeLEJ7hwOT/2Qk= +sigs.k8s.io/controller-runtime v0.12.3 h1:FCM8xeY/FI8hoAfh/V4XbbYMY20gElh9yh+A98usMio= +sigs.k8s.io/controller-runtime v0.12.3/go.mod h1:qKsk4WE6zW2Hfj0G4v10EnNB2jMG1C+NTb8h+DwCoU0= +sigs.k8s.io/json v0.0.0-20211208200746-9f7c6b3444d2 h1:kDi4JBNAsJWfz1aEXhO8Jg87JJaPNLh5tIzYHgStQ9Y= +sigs.k8s.io/json v0.0.0-20211208200746-9f7c6b3444d2/go.mod h1:B+TnT182UBxE84DiCz4CVE26eOSDAeYCpfDnC2kdKMY= +sigs.k8s.io/structured-merge-diff/v4 v4.0.2/go.mod h1:bJZC9H9iH24zzfZ/41RGcq60oK1F7G282QMXDPYydCw= +sigs.k8s.io/structured-merge-diff/v4 v4.2.1 h1:bKCqE9GvQ5tiVHn5rfn1r+yao3aLQEaLzkkmAkf+A6Y= +sigs.k8s.io/structured-merge-diff/v4 v4.2.1/go.mod h1:j/nl6xW8vLS49O8YvXW1ocPhZawJtm+Yrr7PPRQ0Vg4= +sigs.k8s.io/yaml v1.2.0/go.mod h1:yfXDCHCao9+ENCvLSE62v9VSji2MKu5jeNfTrofGhJc= +sigs.k8s.io/yaml v1.4.0 h1:Mk1wCc2gy/F0THH0TAp1QYyJNzRm2KCLy3o5ASXVI5E= +sigs.k8s.io/yaml v1.4.0/go.mod h1:Ejl7/uTz7PSA4eKMyQCUTnhZYNmLIl+5c2lQPGR2BPY= diff --git a/test/generator/main.go b/test/generator/main.go new file mode 100644 index 00000000..6298ac54 --- /dev/null +++ b/test/generator/main.go @@ -0,0 +1,111 @@ +/* +Copyright 2024 The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package main + +import ( + "context" + "flag" + "log" + "os" + "path" + + "k8s.io/klog/v2" + "sigs.k8s.io/container-object-storage-interface-api/test/generator/config" + "sigs.k8s.io/container-object-storage-interface-api/test/generator/generator" +) + +func main() { + var ( + rootPath string + configPath string + ) + flag.StringVar(&rootPath, "root", ".", "Root path where the tests will be written") + flag.StringVar(&configPath, "config", "config.yaml", "Path to configuration file") + klog.InitFlags(nil) + flag.Parse() + + if err := run( + context.Background(), + rootPath, + configPath, + ); err != nil { + log.Fatalf("Generator failed: %s", err) + } +} + +func run(_ context.Context, rootPath, configPath string) error { + cfg, err := config.Load(configPath) + if err != nil { + return err + } + + tests, err := generator.Matrix(cfg) + if err != nil { + return err + } + + for _, test := range tests { + if err := os.MkdirAll( + path.Join(rootPath, "e2e", test.Name, "resources"), + 0o755, + ); err != nil { + return err + } + + if err := os.WriteFile( + path.Join(rootPath, "e2e", test.Name, "chainsaw-test.yaml"), + test.ChainsawTestSpec, + 0o644, + ); err != nil { + return err + } + + if err := os.WriteFile( + path.Join(rootPath, "e2e", test.Name, "resources", "BucketAccess.yaml"), + test.Resources.BucketAccess, + 0o644, + ); err != nil { + return err + } + + if err := os.WriteFile( + path.Join(rootPath, "e2e", test.Name, "resources", "BucketAccessClass.yaml"), + test.Resources.BucketAccessClass, + 0o644, + ); err != nil { + return err + } + + if err := os.WriteFile( + path.Join(rootPath, "e2e", test.Name, "resources", "BucketClaim.yaml"), + test.Resources.BucketClaim, + 0o644, + ); err != nil { + return err + } + + if err := os.WriteFile( + path.Join(rootPath, "e2e", test.Name, "resources", "BucketClass.yaml"), + test.Resources.BucketClass, + 0o644, + ); err != nil { + return err + } + } + + return nil +} From bad84328cc2d79b1cadcfc7c0ff49c06f8616861 Mon Sep 17 00:00:00 2001 From: Mateusz Urbanek Date: Thu, 5 Sep 2024 18:34:06 +0200 Subject: [PATCH 08/10] chore: prepare for values file Signed-off-by: Mateusz Urbanek --- test/.gitignore | 2 - test/generator/config-sample.yaml | 30 -- test/generator/config.yaml | 10 - test/generator/config/config.go | 97 ----- test/generator/generator/generator.go | 351 ------------------ .../generator/template/BucketAccess.gotpl | 15 - .../template/BucketAccessClass.gotpl | 11 - .../generator/template/BucketClaim.gotpl | 8 - .../generator/template/BucketClass.gotpl | 11 - .../generator/template/chainsaw-test.gotpl | 186 ---------- test/generator/go.mod | 28 -- test/generator/go.sum | 260 ------------- test/generator/main.go | 111 ------ 13 files changed, 1120 deletions(-) delete mode 100644 test/.gitignore delete mode 100644 test/generator/config-sample.yaml delete mode 100644 test/generator/config.yaml delete mode 100644 test/generator/config/config.go delete mode 100644 test/generator/generator/generator.go delete mode 100644 test/generator/generator/template/BucketAccess.gotpl delete mode 100644 test/generator/generator/template/BucketAccessClass.gotpl delete mode 100644 test/generator/generator/template/BucketClaim.gotpl delete mode 100644 test/generator/generator/template/BucketClass.gotpl delete mode 100644 test/generator/generator/template/chainsaw-test.gotpl delete mode 100644 test/generator/go.mod delete mode 100644 test/generator/go.sum delete mode 100644 test/generator/main.go diff --git a/test/.gitignore b/test/.gitignore deleted file mode 100644 index ea1e1202..00000000 --- a/test/.gitignore +++ /dev/null @@ -1,2 +0,0 @@ -# ignore e2e tests -e2e/ diff --git a/test/generator/config-sample.yaml b/test/generator/config-sample.yaml deleted file mode 100644 index bda978b1..00000000 --- a/test/generator/config-sample.yaml +++ /dev/null @@ -1,30 +0,0 @@ -templates: {} - # chainsaw-test.yaml: "/path/to/non-default/template.gotpl" - # BucketAccess.yaml: "/path/to/non-default/template.gotpl" - # BucketAccessClass.yaml: "/path/to/non-default/template.gotpl" - # BucketClaim.yaml: "/path/to/non-default/template.gotpl" - # BucketClass.yaml: "/path/to/non-default/template.gotpl" - -driver: sample-driver.objectstorage.k8s.io - -deletionPolicy: -- Retain -- Delete - -authenticationType: -- IAM -- Key - -protocol: -- S3 -- Azure - -bucketClassParams: -- foo: bar - baz: cux -- baz: cux - -bucketAccessClassParams: -- foo: bar - baz: cux -- baz: cux diff --git a/test/generator/config.yaml b/test/generator/config.yaml deleted file mode 100644 index 1d4b1a6d..00000000 --- a/test/generator/config.yaml +++ /dev/null @@ -1,10 +0,0 @@ -templates: {} -driver: sample-driver.objectstorage.k8s.io -deletionPolicy: -- Delete -authenticationType: -- Key -protocol: -- S3 -bucketClassParams: [] -bucketAccessClassParams: [] diff --git a/test/generator/config/config.go b/test/generator/config/config.go deleted file mode 100644 index a2a4d64e..00000000 --- a/test/generator/config/config.go +++ /dev/null @@ -1,97 +0,0 @@ -/* -Copyright 2024 The Kubernetes Authors. - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -*/ - -package config - -import ( - "bytes" - "io" - "os" - - "sigs.k8s.io/container-object-storage-interface-api/apis/objectstorage/v1alpha1" - "sigs.k8s.io/yaml" -) - -// Load reads the YAML configuration from the provided file path and unmarshals it into a Config struct. -// It returns a pointer to the Config struct and any error encountered during the process. -func Load(path string) (*Config, error) { - f, err := os.Open(path) - if err != nil { - return nil, err - } - defer f.Close() - - buf := new(bytes.Buffer) - - _, err = io.Copy(buf, f) - if err != nil { - return nil, err - } - - cfg := &Config{} - - err = yaml.Unmarshal(buf.Bytes(), cfg) - if err != nil { - return nil, err - } - - return cfg, nil -} - -// Config represents the configuration for generating tests. -// It includes various fields like driver details, deletion policies, authentication types, protocols, -// and parameters for BucketClass and BucketAccessClass. -type Config struct { - // Templates contains paths to the YAML templates for various resources. - Templates Templates `json:"templates"` - - // Driver is the name of the driver used in the test configuration. - Driver string `json:"driver"` - - // DeletionPolicy is a list of deletion policies to be applied in the tests. - DeletionPolicy []v1alpha1.DeletionPolicy `json:"deletionPolicy"` - - // AuthenticationType is a list of authentication types to be used in the tests. - AuthenticationType []v1alpha1.AuthenticationType `json:"authenticationType"` - - // Protocol is a list of protocols to be used in the tests. - Protocol []v1alpha1.Protocol `json:"protocol"` - - // BucketClassParams is a list of parameters for configuring BucketClass resources. - BucketClassParams []map[string]string `json:"bucketClassParams"` - - // BucketAccessClassParams is a list of parameters for configuring BucketAccessClass resources. - BucketAccessClassParams []map[string]string `json:"bucketAccessClassParams"` -} - -// Templates represents the file paths to the templates used for generating various Kubernetes resources. -// These templates are referenced in the test configurations. -type Templates struct { - // ChainsawTest is the path to the Chainsaw test YAML template. - ChainsawTest string `json:"chainsaw-test.yaml"` - - // BucketAccess is the path to the BucketAccess YAML template. - BucketAccess string `json:"BucketAccess.yaml"` - - // BucketAccessClass is the path to the BucketAccessClass YAML template. - BucketAccessClass string `json:"BucketAccessClass.yaml"` - - // BucketClaim is the path to the BucketClaim YAML template. - BucketClaim string `json:"BucketClaim.yaml"` - - // BucketClass is the path to the BucketClass YAML template. - BucketClass string `json:"BucketClass.yaml"` -} diff --git a/test/generator/generator/generator.go b/test/generator/generator/generator.go deleted file mode 100644 index b33c2d01..00000000 --- a/test/generator/generator/generator.go +++ /dev/null @@ -1,351 +0,0 @@ -/* -Copyright 2024 The Kubernetes Authors. - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -*/ - -package generator - -import ( - "bytes" - "fmt" - "io" - "os" - "strings" - "text/template" - - // embedding Chainsaw test templates - _ "embed" - - "k8s.io/klog/v2" - "sigs.k8s.io/container-object-storage-interface-api/apis/objectstorage/v1alpha1" - "sigs.k8s.io/container-object-storage-interface-api/test/generator/config" -) - -var ( - // chainsawTestSpec is the embedded template for the Chainsaw test specification. - //go:embed template/chainsaw-test.gotpl - chainsawTestSpec string - - // bucketClassTpl is the embedded template for the BucketClass resource. - //go:embed template/BucketClass.gotpl - bucketClassTpl string - - // bucketAccessClassTpl is the embedded template for the BucketAccessClass resource. - //go:embed template/BucketAccessClass.gotpl - bucketAccessClassTpl string - - // bucketClaimTpl is the embedded template for the BucketClaim resource. - //go:embed template/BucketClaim.gotpl - bucketClaimTpl string - - // bucketAccessTpl is the embedded template for the BucketAccess resource. - //go:embed template/BucketAccess.gotpl - bucketAccessTpl string -) - -// Test represents a test case that includes a name and associated resources. -type Test struct { - Name string - Resources Resources - ChainsawTestSpec []byte -} - -// Resources contains the byte representations of various Kubernetes resources used in a test. -type Resources struct { - BucketClass []byte - BucketAccessClass []byte - BucketClaim []byte - BucketAccess []byte -} - -const ( - Name = "name" - Driver = "driver" - Proto = "protocol" - Auth = "authenticationType" - Policy = "deletionPolicy" - BcParams = "bucketClassParams" - BacParams = "bucketAccessClassParams" -) - -// matrix represents a test matrix, which is a collection of test data variations. -type matrix map[string]map[string]any - -// newMatrix creates a new matrix with a given driver. -func newMatrix(driver string) matrix { - return matrix{ - "test": map[string]any{ - Driver: driver, - Name: "test", - }, - } -} - -// addProtocol adds protocol variations to the matrix. -func (src matrix) addProtocol(protocols []v1alpha1.Protocol) matrix { - override := matrix{} - - if len(protocols) == 0 { - return src - } - - for _, p := range protocols { - for name, data := range src { - name = fmt.Sprintf( - "%s-%s", - name, - strings.ToLower(string(p)), - ) - - data[Proto] = string(p) - data[Name] = name - - override[name] = data - } - } - - return override -} - -// addAuth adds authentication type variations to the matrix. -func (src matrix) addAuth(auths []v1alpha1.AuthenticationType) matrix { - override := matrix{} - - if len(auths) == 0 { - return src - } - - for _, at := range auths { - for name, data := range src { - name := fmt.Sprintf( - "%s-%s", - name, - strings.ToLower(string(at)), - ) - - data[Auth] = string(at) - data[Name] = name - - override[name] = data - } - } - - return override -} - -// addDeletionPolicy adds deletion policy variations to the matrix. -func (src matrix) addDeletionPolicy(policies []v1alpha1.DeletionPolicy) matrix { - override := matrix{} - - if len(policies) == 0 { - return src - } - - for _, dp := range policies { - for name, data := range src { - name = fmt.Sprintf( - "%s-%s", - name, - strings.ToLower(string(dp)), - ) - - data[Policy] = string(dp) - data[Name] = name - - override[name] = data - } - } - - return override -} - -// addBCParams adds BucketClass parameters to the matrix. -func (src matrix) addBCParams(params []map[string]string) matrix { - override := matrix{} - - if len(params) == 0 { - return src - } - - for bcp, params := range params { - for name, data := range src { - data := copy(data) - sbcp := fmt.Sprintf("bcp%d", bcp) - name := fmt.Sprintf( - "%s-%s", - name, - sbcp, - ) - - data[BcParams] = copy(params) - data[Name] = name - - override[name] = data - } - } - - return override -} - -// addBACParams adds BucketAccessClass parameters to the matrix. -func (src matrix) addBACParams(params []map[string]string) matrix { - override := matrix{} - - if len(params) == 0 { - return src - } - - for bacp, params := range params { - for name, data := range src { - data := copy(data) - sbacp := fmt.Sprintf("bacp%d", bacp) - name := fmt.Sprintf( - "%s-%s", - name, - sbacp, - ) - newParams := copy(params) - - data[BacParams] = newParams - data[Name] = name - - override[name] = data - } - } - - return override -} - -// toTests converts the matrix into a slice of Test objects using the provided templates. -func (src matrix) toTests(tpls config.Templates) ([]Test, error) { - tests := []Test{} - - for name, data := range src { - chainsawTest, err := renderTemplate( - loadTemplateOrDefault(tpls.ChainsawTest, chainsawTestSpec), - data, - ) - if err != nil { - return nil, err - } - - bucketClass, err := renderTemplate( - loadTemplateOrDefault(tpls.ChainsawTest, bucketClassTpl), - data, - ) - if err != nil { - return nil, err - } - - bucketAccessClass, err := renderTemplate( - loadTemplateOrDefault(tpls.ChainsawTest, bucketAccessClassTpl), - data, - ) - if err != nil { - return nil, err - } - - bucketAccess, err := renderTemplate( - loadTemplateOrDefault(tpls.ChainsawTest, bucketAccessTpl), - data, - ) - if err != nil { - return nil, err - } - - bucketClaim, err := renderTemplate( - loadTemplateOrDefault(tpls.ChainsawTest, bucketClaimTpl), - data, - ) - if err != nil { - return nil, err - } - - tests = append(tests, Test{ - Name: name, - ChainsawTestSpec: chainsawTest, - Resources: Resources{ - BucketClass: bucketClass, - BucketAccessClass: bucketAccessClass, - BucketAccess: bucketAccess, - BucketClaim: bucketClaim, - }, - }) - } - - return tests, nil -} - -// Matrix generates a slice of tests based on the provided configuration. -func Matrix(cfg *config.Config) ([]Test, error) { - return newMatrix(cfg.Driver). - addAuth(cfg.AuthenticationType). - addBACParams(cfg.BucketAccessClassParams). - addBCParams(cfg.BucketClassParams). - addDeletionPolicy(cfg.DeletionPolicy). - addProtocol(cfg.Protocol). - toTests(cfg.Templates) -} - -// copy copies all key-value pairs from the src map to a new map. -func copy[T comparable, U any](src map[T]U) map[T]U { - dst := make(map[T]U) - - // Iterate over the source map - for key, value := range src { - // Copy each key-value pair to the destination map - dst[key] = value - } - - return dst -} - -// renderTemplate renders a template with the provided data and returns the result as a byte slice. -func renderTemplate(text string, data map[string]any) ([]byte, error) { - buf := new(bytes.Buffer) - - tpl, err := template.New("").Parse(text) - if err != nil { - return nil, err - } - - if err := tpl.Execute(buf, data); err != nil { - return nil, err - } - - return buf.Bytes(), nil -} - -// loadTemplateOrDefault loads a template from a file if a path is provided. -// If the path is empty or an error occurs, it returns the default template text. -func loadTemplateOrDefault(path string, text string) string { - if path == "" { - return text - } - - f, err := os.Open(path) - if err != nil { - klog.V(0).ErrorS(err, "Unable to open file", "file", path) - return text - } - defer f.Close() - - buf := new(bytes.Buffer) - if _, err := io.Copy(buf, f); err != nil { - klog.V(0).ErrorS(err, "Unable to read file contents", "file", path) - return text - } - - return buf.String() -} diff --git a/test/generator/generator/template/BucketAccess.gotpl b/test/generator/generator/template/BucketAccess.gotpl deleted file mode 100644 index fe0b7b25..00000000 --- a/test/generator/generator/template/BucketAccess.gotpl +++ /dev/null @@ -1,15 +0,0 @@ ---- -apiVersion: objectstorage.k8s.io/v1alpha1 -kind: BucketAccess -metadata: - name: {{ index . "name" }} -spec: - bucketClaimName: {{ index . "name" }} - protocol: {{ index . "protocol" }} - bucketAccessClassName: {{ index . "name" }} -{{- $auth := index . "authenticationType" }} -{{- if eq $auth "Key" }} - credentialsSecretName: {{ index . "name" }} -{{- else }} - serviceAccountName: {{ index . "name" }} -{{- end }} diff --git a/test/generator/generator/template/BucketAccessClass.gotpl b/test/generator/generator/template/BucketAccessClass.gotpl deleted file mode 100644 index 170cfd74..00000000 --- a/test/generator/generator/template/BucketAccessClass.gotpl +++ /dev/null @@ -1,11 +0,0 @@ ---- -apiVersion: objectstorage.k8s.io/v1alpha1 -kind: BucketAccessClass -metadata: - name: {{ index . "name" }} -driverName: {{ index . "driver" }} -authenticationType: {{ index . "authenticationType" }} -parameters: -{{- range $key, $value := index . "bucketAccessClassParams" }} - {{ $key }}: {{ $value }} -{{- end }} diff --git a/test/generator/generator/template/BucketClaim.gotpl b/test/generator/generator/template/BucketClaim.gotpl deleted file mode 100644 index 9091bce3..00000000 --- a/test/generator/generator/template/BucketClaim.gotpl +++ /dev/null @@ -1,8 +0,0 @@ ---- -apiVersion: objectstorage.k8s.io/v1alpha1 -kind: BucketClaim -metadata: - name: {{ index . "name" }} -spec: - bucketClassName: {{ index . "name" }} - protocols: [ '{{ index . "protocol" }}' ] diff --git a/test/generator/generator/template/BucketClass.gotpl b/test/generator/generator/template/BucketClass.gotpl deleted file mode 100644 index 387d03eb..00000000 --- a/test/generator/generator/template/BucketClass.gotpl +++ /dev/null @@ -1,11 +0,0 @@ ---- -apiVersion: objectstorage.k8s.io/v1alpha1 -kind: BucketClass -metadata: - name: {{ index . "name" }} -driverName: {{ index . "driver" }} -deletionPolicy: {{ index . "deletionPolicy" }} -parameters: -{{- range $key, $value := index . "bucketClassParams" }} - {{ $key }}: {{ $value }} -{{- end }} diff --git a/test/generator/generator/template/chainsaw-test.gotpl b/test/generator/generator/template/chainsaw-test.gotpl deleted file mode 100644 index 1ac734a1..00000000 --- a/test/generator/generator/template/chainsaw-test.gotpl +++ /dev/null @@ -1,186 +0,0 @@ ---- -# yaml-language-server: $schema=https://raw.githubusercontent.com/kyverno/chainsaw/main/.schemas/json/test-chainsaw-v1alpha1.json -apiVersion: chainsaw.kyverno.io/v1alpha1 -kind: Test -metadata: - name: {{ index . "name" }} - labels: - protocol: {{ index . "protocol" }} - authenticationType: {{ index . "authenticationType" }} - deletionPolicy: {{ index . "deletionPolicy" }} -spec: - template: true - steps: - - name: Check if COSI Controller exist - try: - - assert: - resource: - apiVersion: apps/v1 - kind: Deployment - metadata: - name: objectstorage-controller - namespace: default - status: - availableReplicas: 1 - - name: Create test BucketClass and BucketAccessClass - try: - - apply: - file: ./resources/BucketClass.yaml - - apply: - file: ./resources/BucketAccessClass.yaml - - name: Create BucketClaim - try: - - apply: - file: ./resources/BucketClaim.yaml - - name: Check if BucketClaim is ready - try: - - assert: - resource: - apiVersion: objectstorage.k8s.io/v1alpha1 - kind: BucketClaim - metadata: - name: {{ index . "name" }} - status: - bucketReady: true - - name: Create BucketAccess - try: - - apply: - file: ./resources/BucketAccess.yaml - - name: Check if BucketAccess is granted - try: - - assert: - resource: - apiVersion: objectstorage.k8s.io/v1alpha1 - kind: BucketAccess - metadata: - name: {{ index . "name" }} - status: - accessGranted: true - - name: Check if Secret exists - try: - - assert: - resource: - apiVersion: v1 - kind: Secret - metadata: - name: {{ index . "name" }} - - name: Run ObjectStorage validation tool - # TODO: This should be either a standalone test tool developed by us, to run test suite: - # - validate Secret format; - # - validate connectivity to the Object Storage server; - # Right now it is using busybox to check if the secret has correct format. - try: - - apply: - resource: - apiVersion: v1 - kind: ConfigMap - metadata: - name: validation - data: - schema.json: | - { - "$schema": "http://json-schema.org/draft-07/schema#", - "type": "object", - "properties": { - "spec": { - "type": "object", - "properties": { - "bucketName": { - "type": "string" - }, - "authenticationType": { - "type": "string", - "enum": ["IAM", "Key"] - }, - "protocols": { - "type": "array", - "items": { - "type": "string", - "enum": ["S3", "Azure", "GCP"] - }, - "minItems": 1 - }, - "secretS3": { - "type": "object", - "properties": { - "endpoint": { - "type": "string" - }, - "region": { - "type": "string" - }, - "accessKeyID": { - "type": "string" - }, - "accessSecretKey": { - "type": "string" - } - }, - "required": ["endpoint", "region", "accessKeyID", "accessSecretKey"] - }, - "secretAzure": { - "type": "object", - "properties": { - "accessToken": { - "type": "string" - }, - "expiryTimeStamp": { - "type": "string" - } - }, - "required": ["accessToken", "expiryTimeStamp"] - } - }, - "required": ["bucketName", "authenticationType", "protocols"], - "oneOf": [ - { "required": ["secretS3"] }, - { "required": ["secretAzure"] } - ] - } - }, - "required": ["spec"] - } - validator.sh: | - #!/usr/bin/env sh - pip install check-jsonschema - check-jsonschema --schema /validator/schema.json /conf/BucketInfo.json - - create: - resource: - apiVersion: batch/v1 - kind: Job - metadata: - name: {{ index . "name" }} - spec: - ttlSecondsAfterFinished: 100 - template: - spec: - restartPolicy: Never - containers: - - name: secret-test - image: docker.io/library/python:alpine # "latest" style tag, to prevent manual updates - command: [ "sh", "/validation/validation.sh" ] - volumeMounts: - - mountPath: /validation - name: validation - - mountPath: /conf - name: secret-vol - volumes: - - name: validation - configMap: - name: validation - - name: secret-vol - secret: - secretName: {{ index . "name" }} - items: - - iam: BucketInfo - path: BucketInfo.json - - name: Check if ObjectStorage validation tool completed succesfully - try: - - assert: - resource: - apiVersion: batch/v1 - kind: Job - metadata: - name: {{ index . "name" }} - status: - succeeded: 1 diff --git a/test/generator/go.mod b/test/generator/go.mod deleted file mode 100644 index 149711c3..00000000 --- a/test/generator/go.mod +++ /dev/null @@ -1,28 +0,0 @@ -module sigs.k8s.io/container-object-storage-interface-api/test/generator - -go 1.22.5 - -require ( - k8s.io/klog/v2 v2.70.1 - sigs.k8s.io/container-object-storage-interface-api v0.1.0 - sigs.k8s.io/yaml v1.4.0 -) - -require ( - github.com/go-logr/logr v1.2.0 // indirect - github.com/gogo/protobuf v1.3.2 // indirect - github.com/google/gofuzz v1.1.0 // indirect - github.com/json-iterator/go v1.1.12 // indirect - github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect - github.com/modern-go/reflect2 v1.0.2 // indirect - golang.org/x/net v0.0.0-20220520000938-2e3eb7b945c2 // indirect - golang.org/x/text v0.3.7 // indirect - gopkg.in/inf.v0 v0.9.1 // indirect - gopkg.in/yaml.v2 v2.4.0 // indirect - k8s.io/api v0.24.2 // indirect - k8s.io/apimachinery v0.24.2 // indirect - k8s.io/utils v0.0.0-20220210201930-3a6ce19ff2f9 // indirect - sigs.k8s.io/controller-runtime v0.12.3 // indirect - sigs.k8s.io/json v0.0.0-20211208200746-9f7c6b3444d2 // indirect - sigs.k8s.io/structured-merge-diff/v4 v4.2.1 // indirect -) diff --git a/test/generator/go.sum b/test/generator/go.sum deleted file mode 100644 index 7f406cf1..00000000 --- a/test/generator/go.sum +++ /dev/null @@ -1,260 +0,0 @@ -cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= -github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= -github.com/NYTimes/gziphandler v0.0.0-20170623195520-56545f4a5d46/go.mod h1:3wb06e3pkSAbeQ52E9H9iFoQsEEwGN64994WTCIhntQ= -github.com/PuerkitoBio/purell v1.1.1/go.mod h1:c11w/QuzBsJSee3cPx9rAFu61PvFxuPbtSwDGJws/X0= -github.com/PuerkitoBio/urlesc v0.0.0-20170810143723-de5bf2ad4578/go.mod h1:uGdkoq3SwY9Y+13GIhn11/XLaGBb4BfwItxLd5jeuXE= -github.com/armon/go-socks5 v0.0.0-20160902184237-e75332964ef5/go.mod h1:wHh0iHkYZB8zMSxRWpUBQtwG5a7fFgvEO+odwuTv2gs= -github.com/asaskevich/govalidator v0.0.0-20190424111038-f61b66f89f4a/go.mod h1:lB+ZfQJz7igIIfQNfa7Ml4HSf2uFQQRzpGGRXenZAgY= -github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= -github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= -github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= -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/docopt/docopt-go v0.0.0-20180111231733-ee0de3bc6815/go.mod h1:WwZ+bS3ebgob9U8Nd0kOddGdZWjyMGR8Wziv+TBNwSE= -github.com/elazarl/goproxy v0.0.0-20180725130230-947c36da3153/go.mod h1:/Zj4wYkgs4iZTTu3o/KG3Itv/qCCa8VVMlb3i9OVuzc= -github.com/emicklei/go-restful v0.0.0-20170410110728-ff4f55a20633/go.mod h1:otzb+WCGbkyDHkqmQmT5YD2WR4BBwUdeQoFo8l/7tVs= -github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= -github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= -github.com/evanphx/json-patch v4.12.0+incompatible/go.mod h1:50XU6AFN0ol/bzJsmQLiYLvXMP4fmwYFNcr97nuDLSk= -github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= -github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ= -github.com/fsnotify/fsnotify v1.5.4 h1:jRbGcIw6P2Meqdwuo0H1p6JVLbL5DHKAKlYndzMwVZI= -github.com/fsnotify/fsnotify v1.5.4/go.mod h1:OVB6XrOHzAwXMpEM7uPOzcehqUV2UqJxmVXmkdnm1bU= -github.com/getkin/kin-openapi v0.76.0/go.mod h1:660oXbgy5JFMKreazJaQTw7o+X00qeSyhcnluiMv+Xg= -github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= -github.com/go-logr/logr v0.1.0/go.mod h1:ixOQHD9gLJUVQQ2ZOR7zLEifBX6tGkNJF4QyIY7sIas= -github.com/go-logr/logr v0.2.0/go.mod h1:z6/tIYblkpsD+a4lm/fGIIU9mZ+XfAiaFtq7xTgseGU= -github.com/go-logr/logr v1.2.0 h1:QK40JKJyMdUDz+h+xvCsru/bJhvG0UxvePV0ufL/AcE= -github.com/go-logr/logr v1.2.0/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= -github.com/go-openapi/jsonpointer v0.19.3/go.mod h1:Pl9vOtqEWErmShwVjC8pYs9cog34VGT37dQOVbmoatg= -github.com/go-openapi/jsonpointer v0.19.5/go.mod h1:Pl9vOtqEWErmShwVjC8pYs9cog34VGT37dQOVbmoatg= -github.com/go-openapi/jsonreference v0.19.3/go.mod h1:rjx6GuL8TTa9VaixXglHmQmIL98+wF9xc8zWvFonSJ8= -github.com/go-openapi/swag v0.19.5/go.mod h1:POnQmlKehdgb5mhVOsnJFsivZCEZ/vjK9gh66Z9tfKk= -github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q= -github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= -github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= -github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= -github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= -github.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= -github.com/golang/protobuf v1.4.0-rc.1/go.mod h1:ceaxUfeHdC40wWswd/P6IGgMaK3YpKi5j83Wpe3EHw8= -github.com/golang/protobuf v1.4.0-rc.1.0.20200221234624-67d41d38c208/go.mod h1:xKAWHe0F5eneWXFV3EuXVDTCmh+JuBKY0li0aMyXATA= -github.com/golang/protobuf v1.4.0-rc.2/go.mod h1:LlEzMj4AhA7rCAGe4KMBDvJI+AwstrUpVNzEA03Pprs= -github.com/golang/protobuf v1.4.0-rc.4.0.20200313231945-b860323f09d0/go.mod h1:WU3c8KckQ9AFe+yFwt9sWVRKCVIyN9cPHBJSNnbL67w= -github.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvqG2KuDX0= -github.com/golang/protobuf v1.4.1/go.mod h1:U8fpvMrcmy5pZrNK1lt4xCsGvpyWQ/VVv6QDs8UjoX8= -github.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= -github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk= -github.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= -github.com/google/gnostic v0.5.7-v3refs/go.mod h1:73MKFl6jIHelAJNaBGFzt3SPtZULs9dYrGFt8OiIsHQ= -github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M= -github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= -github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= -github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.9 h1:O2Tfq5qg4qc4AmwVlvv0oLiVAGB7enBSJ2x2DqQFi38= -github.com/google/go-cmp v0.5.9/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= -github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= -github.com/google/gofuzz v1.1.0 h1:Hsa8mG0dQ46ij8Sl2AYJDUv1oA9/d6Vk+3LG99Oe02g= -github.com/google/gofuzz v1.1.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= -github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/gorilla/mux v1.8.0/go.mod h1:DVbg23sWSpFRCP0SfiEN6jmj59UnW/n46BH5rLB71So= -github.com/gorilla/websocket v1.4.2/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= -github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU= -github.com/json-iterator/go v1.1.6/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU= -github.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnrnM= -github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo= -github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8= -github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= -github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= -github.com/kr/pretty v0.2.0/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= -github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= -github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= -github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= -github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= -github.com/mailru/easyjson v0.0.0-20190614124828-94de47d64c63/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= -github.com/mailru/easyjson v0.0.0-20190626092158-b2ccc519800e/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= -github.com/mitchellh/mapstructure v1.1.2/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= -github.com/moby/spdystream v0.2.0/go.mod h1:f7i0iNDQJ059oMTcWxx8MA/zKFIuD/lY+0GqbN2Wy8c= -github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= -github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w8PVh93nsPXa1VrQ6jlwL5oN8l14QlcNfg= -github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= -github.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= -github.com/modern-go/reflect2 v1.0.2 h1:xBagoLtFs94CBntxluKeaWgTMpvLxC4ur3nMaC9Gz0M= -github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk= -github.com/munnerz/goautoneg v0.0.0-20120707110453-a547fc61f48d/go.mod h1:+n7T8mK8HuQTcFwEeznm/DIxMOiR9yIdICNftLE1DvQ= -github.com/mxk/go-flowrate v0.0.0-20140419014527-cca7078d478f/go.mod h1:ZdcZmHo+o7JKHSa8/e818NopupXU1YMK5fe1lsApnBw= -github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e h1:fD57ERR4JtEqsWbfPhv4DMiApHyliiK5xCTNVSPiaAs= -github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e/go.mod h1:zD1mROLANZcx1PVRCS0qkT7pwLkGfwJo4zjcN/Tysno= -github.com/nxadm/tail v1.4.4/go.mod h1:kenIhsEOeOJmVchQTgglprH7qJGnHDVpk1VPCcaMI8A= -github.com/nxadm/tail v1.4.8 h1:nPr65rt6Y5JFSKQO7qToXr7pePgD6Gwiw05lkbyAQTE= -github.com/nxadm/tail v1.4.8/go.mod h1:+ncqLTQzXmGhMZNUePPaPqPvBxHAIsmXswZKocGu+AU= -github.com/onsi/ginkgo v0.0.0-20170829012221-11459a886d9c/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= -github.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= -github.com/onsi/ginkgo v1.12.1/go.mod h1:zj2OWP4+oCPe1qIXoGWkgMRwljMUYCdkwsT2108oapk= -github.com/onsi/ginkgo v1.14.0/go.mod h1:iSB4RoI2tjJc9BBv4NKIKWKya62Rps+oPG/Lv9klQyY= -github.com/onsi/ginkgo v1.16.5 h1:8xi0RTUf59SOSfEtZMvwTvXYMzG4gV23XVHOZiXNtnE= -github.com/onsi/ginkgo v1.16.5/go.mod h1:+E8gABHa3K6zRBolWtd+ROzc/U5bkGt0FwiG042wbpU= -github.com/onsi/gomega v0.0.0-20170829124025-dcabb60a477c/go.mod h1:C1qb7wdrVGGVU+Z6iS04AVkA3Q65CEZX59MT0QO5uiA= -github.com/onsi/gomega v1.7.1/go.mod h1:XdKZgCCFLUoM/7CFJVPcG8C1xQ1AJ0vpAezJrB7JYyY= -github.com/onsi/gomega v1.10.1/go.mod h1:iN09h71vgCQne3DLsj+A5owkum+a2tYe+TOCB1ybHNo= -github.com/onsi/gomega v1.18.1 h1:M1GfJqGRrBrrGGsbxzV5dqM2U2ApXefZCQpkukxYRLE= -github.com/onsi/gomega v1.18.1/go.mod h1:0q+aL8jAiMXy9hbwj2mr5GziHiwhAIQpFmmtT5hitRs= -github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= -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/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= -github.com/spf13/afero v1.2.2/go.mod h1:9ZxEEn6pIJ8Rxe320qSDBk6AsU0r9pR7Q4OcevTdifk= -github.com/spf13/pflag v1.0.5 h1:iy+VFUOCP1a+8yFto/drg2CJ5u0yRoB7fZw3DKv/JXA= -github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= -github.com/stoewer/go-strcase v1.2.0/go.mod h1:IBiWB2sKIp3wVVQ3Y035++gc+knqhUQag1KpM8ahLw8= -github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= -github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= -github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA= -github.com/stretchr/testify v1.7.0 h1:nwc3DEeHmmLAfoZucVR881uASk0Mfjw8xYJ99tb5CcY= -github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= -github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= -github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= -github.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= -golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= -golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= -golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= -golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= -golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU= -golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= -golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= -golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= -golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20190827160401-ba9fcec4b297/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20200520004742-59133d7f0dd7/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= -golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= -golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM= -golang.org/x/net v0.0.0-20220127200216-cd36cc0744dd/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= -golang.org/x/net v0.0.0-20220520000938-2e3eb7b945c2 h1:NWy5+hlRbC7HK+PmcXVUmW1IMyFce7to56IUvhUFm7Y= -golang.org/x/net v0.0.0-20220520000938-2e3eb7b945c2/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= -golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= -golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190904154756-749cb33beabd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191005200804-aed5e4c7ecf9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191120155948-bd437916bb0e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200519105757-fe76b779f299/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20211216021012-1d35b9e2eb4e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220209214540-3681064d5158/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a h1:dGzPydgVsqGcTRVwiLJ1jVbufYwmzD3LfVPLKsKg+0k= -golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= -golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= -golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= -golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= -golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= -golang.org/x/text v0.3.7 h1:olpwvP2KacW1ZWvsR7uQhoyTYvKAupfQrRGBFM352Gk= -golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= -golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY= -golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= -golang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= -golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20200505023115-26f46d2f7ef8/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= -golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= -golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/tools v0.1.5/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= -golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM= -google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= -google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= -google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= -google.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo= -google.golang.org/genproto v0.0.0-20201019141844-1ed22bb0c154/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= -google.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= -google.golang.org/grpc v1.27.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= -google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8= -google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0= -google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM= -google.golang.org/protobuf v1.20.1-0.20200309200217-e05f789c0967/go.mod h1:A+miEFZTKqfCUM6K7xSMQL9OKL/b6hQv+e19PK+JZNE= -google.golang.org/protobuf v1.21.0/go.mod h1:47Nbq4nVaFHyn7ilMalzfO3qCViNmqZ2kzikPIcrTAo= -google.golang.org/protobuf v1.22.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= -google.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= -google.golang.org/protobuf v1.23.1-0.20200526195155-81db48ad09cc/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= -google.golang.org/protobuf v1.24.0/go.mod h1:r/3tXBNzIEhYS9I1OUVjXDlt8tc493IdKGjtUeSXeh4= -google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw= -google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= -google.golang.org/protobuf v1.27.1/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= -gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/check.v1 v1.0.0-20200227125254-8fa46927fb4f h1:BLraFXnmrev5lT+xlilqcH8XK9/i0At2xKjWk4p6zsU= -gopkg.in/check.v1 v1.0.0-20200227125254-8fa46927fb4f/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys= -gopkg.in/inf.v0 v0.9.1 h1:73M5CoZyi3ZLMOyDlQh031Cx6N9NDJ2Vvfl76EDAgDc= -gopkg.in/inf.v0 v0.9.1/go.mod h1:cWUDdTG/fYaXco+Dcufb5Vnc6Gp2YChqWtbxRZE0mXw= -gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7 h1:uRGJdciOHaEIrze2W8Q3AKkepLTh2hOroT7a+7czfdQ= -gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7/go.mod h1:dt/ZhP58zS4L8KSrWDmTeBkI65Dw0HsyUHuEVlX15mw= -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.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.3.0/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY= -gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ= -gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= -gopkg.in/yaml.v3 v3.0.0-20200615113413-eeeca48fe776/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= -gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= -gopkg.in/yaml.v3 v3.0.0 h1:hjy8E9ON/egN1tAYqKb61G10WtihqetD4sz2H+8nIeA= -gopkg.in/yaml.v3 v3.0.0/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= -honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= -honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= -k8s.io/api v0.24.2 h1:g518dPU/L7VRLxWfcadQn2OnsiGWVOadTLpdnqgY2OI= -k8s.io/api v0.24.2/go.mod h1:AHqbSkTm6YrQ0ObxjO3Pmp/ubFF/KuM7jU+3khoBsOg= -k8s.io/apimachinery v0.24.2 h1:5QlH9SL2C8KMcrNJPor+LbXVTaZRReml7svPEh4OKDM= -k8s.io/apimachinery v0.24.2/go.mod h1:82Bi4sCzVBdpYjyI4jY6aHX+YCUchUIrZrXKedjd2UM= -k8s.io/gengo v0.0.0-20210813121822-485abfe95c7c/go.mod h1:FiNAH4ZV3gBg2Kwh89tzAEV2be7d5xI0vBa/VySYy3E= -k8s.io/klog/v2 v2.0.0/go.mod h1:PBfzABfn139FHAV07az/IF9Wp1bkk3vpT2XSJ76fSDE= -k8s.io/klog/v2 v2.2.0/go.mod h1:Od+F08eJP+W3HUb4pSrPpgp9DGU4GzlpG/TmITuYh/Y= -k8s.io/klog/v2 v2.60.1/go.mod h1:y1WjHnz7Dj687irZUWR/WLkLc5N1YHtjLdmgWjndZn0= -k8s.io/klog/v2 v2.70.1 h1:7aaoSdahviPmR+XkS7FyxlkkXs6tHISSG03RxleQAVQ= -k8s.io/klog/v2 v2.70.1/go.mod h1:y1WjHnz7Dj687irZUWR/WLkLc5N1YHtjLdmgWjndZn0= -k8s.io/kube-openapi v0.0.0-20220328201542-3ee0da9b0b42/go.mod h1:Z/45zLw8lUo4wdiUkI+v/ImEGAvu3WatcZl3lPMR4Rk= -k8s.io/utils v0.0.0-20210802155522-efc7438f0176/go.mod h1:jPW/WVKK9YHAvNhRxK0md/EJ228hCsBRufyofKtW8HA= -k8s.io/utils v0.0.0-20220210201930-3a6ce19ff2f9 h1:HNSDgDCrr/6Ly3WEGKZftiE7IY19Vz2GdbOCyI4qqhc= -k8s.io/utils v0.0.0-20220210201930-3a6ce19ff2f9/go.mod h1:jPW/WVKK9YHAvNhRxK0md/EJ228hCsBRufyofKtW8HA= -sigs.k8s.io/container-object-storage-interface-api v0.1.0 h1:8tB6JFQhbQIC1hwGQ+q4+tmSSNfjKemb7bFI6C0CK/4= -sigs.k8s.io/container-object-storage-interface-api v0.1.0/go.mod h1:YiB+i/UGkzqgODDhRG3u7jkbWkQcoUeLEJ7hwOT/2Qk= -sigs.k8s.io/controller-runtime v0.12.3 h1:FCM8xeY/FI8hoAfh/V4XbbYMY20gElh9yh+A98usMio= -sigs.k8s.io/controller-runtime v0.12.3/go.mod h1:qKsk4WE6zW2Hfj0G4v10EnNB2jMG1C+NTb8h+DwCoU0= -sigs.k8s.io/json v0.0.0-20211208200746-9f7c6b3444d2 h1:kDi4JBNAsJWfz1aEXhO8Jg87JJaPNLh5tIzYHgStQ9Y= -sigs.k8s.io/json v0.0.0-20211208200746-9f7c6b3444d2/go.mod h1:B+TnT182UBxE84DiCz4CVE26eOSDAeYCpfDnC2kdKMY= -sigs.k8s.io/structured-merge-diff/v4 v4.0.2/go.mod h1:bJZC9H9iH24zzfZ/41RGcq60oK1F7G282QMXDPYydCw= -sigs.k8s.io/structured-merge-diff/v4 v4.2.1 h1:bKCqE9GvQ5tiVHn5rfn1r+yao3aLQEaLzkkmAkf+A6Y= -sigs.k8s.io/structured-merge-diff/v4 v4.2.1/go.mod h1:j/nl6xW8vLS49O8YvXW1ocPhZawJtm+Yrr7PPRQ0Vg4= -sigs.k8s.io/yaml v1.2.0/go.mod h1:yfXDCHCao9+ENCvLSE62v9VSji2MKu5jeNfTrofGhJc= -sigs.k8s.io/yaml v1.4.0 h1:Mk1wCc2gy/F0THH0TAp1QYyJNzRm2KCLy3o5ASXVI5E= -sigs.k8s.io/yaml v1.4.0/go.mod h1:Ejl7/uTz7PSA4eKMyQCUTnhZYNmLIl+5c2lQPGR2BPY= diff --git a/test/generator/main.go b/test/generator/main.go deleted file mode 100644 index 6298ac54..00000000 --- a/test/generator/main.go +++ /dev/null @@ -1,111 +0,0 @@ -/* -Copyright 2024 The Kubernetes Authors. - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -*/ - -package main - -import ( - "context" - "flag" - "log" - "os" - "path" - - "k8s.io/klog/v2" - "sigs.k8s.io/container-object-storage-interface-api/test/generator/config" - "sigs.k8s.io/container-object-storage-interface-api/test/generator/generator" -) - -func main() { - var ( - rootPath string - configPath string - ) - flag.StringVar(&rootPath, "root", ".", "Root path where the tests will be written") - flag.StringVar(&configPath, "config", "config.yaml", "Path to configuration file") - klog.InitFlags(nil) - flag.Parse() - - if err := run( - context.Background(), - rootPath, - configPath, - ); err != nil { - log.Fatalf("Generator failed: %s", err) - } -} - -func run(_ context.Context, rootPath, configPath string) error { - cfg, err := config.Load(configPath) - if err != nil { - return err - } - - tests, err := generator.Matrix(cfg) - if err != nil { - return err - } - - for _, test := range tests { - if err := os.MkdirAll( - path.Join(rootPath, "e2e", test.Name, "resources"), - 0o755, - ); err != nil { - return err - } - - if err := os.WriteFile( - path.Join(rootPath, "e2e", test.Name, "chainsaw-test.yaml"), - test.ChainsawTestSpec, - 0o644, - ); err != nil { - return err - } - - if err := os.WriteFile( - path.Join(rootPath, "e2e", test.Name, "resources", "BucketAccess.yaml"), - test.Resources.BucketAccess, - 0o644, - ); err != nil { - return err - } - - if err := os.WriteFile( - path.Join(rootPath, "e2e", test.Name, "resources", "BucketAccessClass.yaml"), - test.Resources.BucketAccessClass, - 0o644, - ); err != nil { - return err - } - - if err := os.WriteFile( - path.Join(rootPath, "e2e", test.Name, "resources", "BucketClaim.yaml"), - test.Resources.BucketClaim, - 0o644, - ); err != nil { - return err - } - - if err := os.WriteFile( - path.Join(rootPath, "e2e", test.Name, "resources", "BucketClass.yaml"), - test.Resources.BucketClass, - 0o644, - ); err != nil { - return err - } - } - - return nil -} From 77e688e69777e99ab56c8172079015573ed6e5bb Mon Sep 17 00:00:00 2001 From: Mateusz Urbanek Date: Thu, 5 Sep 2024 18:34:30 +0200 Subject: [PATCH 09/10] refactor: values bindings and functions instead of templating Signed-off-by: Mateusz Urbanek --- test/e2e/chainsaw-test.yaml | 265 ++++++++++++++++++++++++++++++++++++ test/e2e/values.yaml | 11 ++ 2 files changed, 276 insertions(+) create mode 100644 test/e2e/chainsaw-test.yaml create mode 100644 test/e2e/values.yaml diff --git a/test/e2e/chainsaw-test.yaml b/test/e2e/chainsaw-test.yaml new file mode 100644 index 00000000..da41cfbd --- /dev/null +++ b/test/e2e/chainsaw-test.yaml @@ -0,0 +1,265 @@ +--- +# yaml-language-server: $schema=https://raw.githubusercontent.com/kyverno/chainsaw/main/.schemas/json/test-chainsaw-v1alpha1.json +apiVersion: chainsaw.kyverno.io/v1alpha1 +kind: Test +metadata: + name: generic-test +spec: + template: true + bindings: + - name: driverName + value: ($values.driverName) + - name: deletionPolicy + value: ($values.deletionPolicy) + - name: bucketClassParams + value: ($values.bucketClassParams) + - name: bucketAccessClassParams + value: ($values.bucketAccessClassParams) + - name: authenticationType + value: ($values.authenticationType) + - name: bucketClaimProtocols + value: ($values.bucketClaimProtocols) + - name: bucketAccessProtocol + value: ($values.bucketAccessProtocol) + steps: + - name: Check if COSI Controller exist + try: + - assert: + resource: + apiVersion: apps/v1 + kind: Deployment + metadata: + name: objectstorage-controller + namespace: default + status: + availableReplicas: 1 + - name: Create test BucketClass and BucketAccessClass + try: + - apply: + resource: + apiVersion: objectstorage.k8s.io/v1alpha1 + kind: BucketClass + metadata: + name: ($namespace) + driverName: ($driverName) + deletionPolicy: ($deletionPolicy) + parameters: ($bucketClassParams) + - apply: + resource: + apiVersion: objectstorage.k8s.io/v1alpha1 + kind: BucketAccessClass + metadata: + name: ($namespace) + driverName: ($driverName) + authenticationType: ($authenticationType) + parameters: ($bucketAccessClassParams) + - name: Create BucketClaim + try: + - apply: + resource: + apiVersion: objectstorage.k8s.io/v1alpha1 + kind: BucketClaim + metadata: + name: ($namespace) + spec: + bucketClassName: ($namespace) + protocols: ($bucketClaimProtocols) + - name: Check if BucketClaim is ready + try: + - assert: + resource: + apiVersion: objectstorage.k8s.io/v1alpha1 + kind: BucketClaim + metadata: + name: ($namespace) + status: + bucketReady: true + - name: Create BucketAccess + try: + - apply: + resource: + apiVersion: objectstorage.k8s.io/v1alpha1 + kind: BucketAccess + metadata: + name: ($namespace) + spec: + bucketClaimName: ($namespace) + protocol: ($bucketAccessProtocol) + bucketAccessClassName: ($namespace) + credentialsSecretName: ($namespace) + serviceAccountName: ($namespace) + - name: Check if BucketAccess is granted + try: + - assert: + resource: + apiVersion: objectstorage.k8s.io/v1alpha1 + kind: BucketAccess + metadata: + name: ($namespace) + status: + accessGranted: true + - name: Check if Secret exists + try: + - assert: + resource: + apiVersion: v1 + kind: Secret + metadata: + name: ($namespace) + - name: Run ObjectStorage validation tool + # TODO: This should be either a standalone test tool developed by us, to run test suite: + # - validate Secret format; + # - validate connectivity to the Object Storage server; + # Right now it is using busybox to check if the secret has correct format. + try: + - apply: + resource: + apiVersion: v1 + kind: ConfigMap + metadata: + name: validation + data: + schema.json: | + { + "$schema": "http://json-schema.org/draft-07/schema#", + "type": "object", + "properties": { + "spec": { + "type": "object", + "properties": { + "bucketName": { + "type": "string" + }, + "authenticationType": { + "type": "string", + "enum": [ + "IAM", + "Key" + ] + }, + "protocols": { + "type": "array", + "items": { + "type": "string", + "enum": [ + "S3", + "Azure", + "GCP" + ] + }, + "minItems": 1 + }, + "secretS3": { + "oneOf": [ + { + "type": "null" + }, + { + "type": "object" + } + ], + "properties": { + "endpoint": { + "type": "string" + }, + "region": { + "type": "string" + }, + "accessKeyID": { + "type": "string" + }, + "accessSecretKey": { + "type": "string" + } + }, + "required": [ + "endpoint", + "region", + "accessKeyID", + "accessSecretKey" + ] + }, + "secretAzure": { + "oneOf": [ + { + "type": "null" + }, + { + "type": "object" + } + ], + "properties": { + "accessToken": { + "type": "string" + }, + "expiryTimeStamp": { + "type": "string" + } + }, + "required": [ + "accessToken", + "expiryTimeStamp" + ] + } + }, + "required": [ + "bucketName", + "authenticationType", + "protocols", + "secretAzure", + "secretS3" + ] + } + }, + "required": [ + "spec" + ] + } + validator.sh: | + #!/usr/bin/env sh + set -e + pip install check-jsonschema + check-jsonschema --schemafile /validation/schema.json /conf/BucketInfo.json + - create: + resource: + apiVersion: batch/v1 + kind: Job + metadata: + name: ($namespace) + spec: + ttlSecondsAfterFinished: 100 + template: + spec: + restartPolicy: Never + containers: + - name: secret-test + image: docker.io/library/python:3.12 + command: [ "sh", "/validation/validator.sh" ] + env: + - name: PIP_ROOT_USER_ACTION + value: ignore + volumeMounts: + - mountPath: /validation + name: validation + - mountPath: /conf + name: secret-vol + volumes: + - name: validation + configMap: + name: validation + - name: secret-vol + secret: + secretName: ($namespace) + items: + - key: BucketInfo + path: BucketInfo.json + - name: Check if ObjectStorage validation tool completed succesfully + try: + - assert: + resource: + apiVersion: batch/v1 + kind: Job + metadata: + name: ($namespace) + status: + succeeded: 1 diff --git a/test/e2e/values.yaml b/test/e2e/values.yaml new file mode 100644 index 00000000..80e0353e --- /dev/null +++ b/test/e2e/values.yaml @@ -0,0 +1,11 @@ +driverName: sample-driver.objectstorage.k8s.io +deletionPolicy: "Delete" # "Retain" +bucketClassParams: + foo: bar + baz: cux +bucketAccessClassParams: + foo: bar + baz: cux +authenticationType: "Key" # "IAM" +bucketClaimProtocols: ["S3", "Azure"] +bucketAccessProtocol: "S3" From 5118025a3a8644b3613943ca9fd873da002b790b Mon Sep 17 00:00:00 2001 From: Mateusz Urbanek Date: Thu, 26 Sep 2024 12:18:11 +0200 Subject: [PATCH 10/10] fix: add readme to tests Signed-off-by: Mateusz Urbanek --- test/e2e/README.md | 56 ++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 56 insertions(+) create mode 100644 test/e2e/README.md diff --git a/test/e2e/README.md b/test/e2e/README.md new file mode 100644 index 00000000..3bfb8333 --- /dev/null +++ b/test/e2e/README.md @@ -0,0 +1,56 @@ +# End-to-end tests + +## Kyverno Chainsaw + +Chainsaw provides a declarative approach to test Kubernetes operators and controllers. + +While Chainsaw is designed for testing operators and controllers, it can declaratively test any Kubernetes objects. + +Chainsaw is an open-source tool that was initially developed for defining and running Kyverno end-to-end tests. + +## Configuration + +To configure Chainsaw for testing, you need to define parameters for the specific Kubernetes resources and controllers being tested. Below are example configurations. + +**Sample Configuration** + +```yaml +driverName: sample-driver.objectstorage.k8s.io +deletionPolicy: "Delete" # Options: "Delete" or "Retain" +bucketClassParams: + foo: bar + baz: cux +bucketAccessClassParams: + foo: bar + baz: cux +authenticationType: "Key" # Options: "Key" or "IAM" +bucketClaimProtocols: ["S3", "Azure"] # Supported protocols for bucket claims +bucketAccessProtocol: "S3" # Protocol for bucket access +``` + +**Example for Linode COSI Driver** + +```yaml +driverName: objectstorage.cosi.linode.com +deletionPolicy: "Delete" # Options: "Delete" or "Retain" +bucketClassParams: + cosi.linode.com/v1/region: us-east # Specify the region for Linode object storage + cosi.linode.com/v1/acl: private # Define the access control list (ACL) settings + cosi.linode.com/v1/cors: disabled # Enable or disable Cross-Origin Resource Sharing (CORS) +bucketAccessClassParams: + cosi.linode.com/v1/permissions: read_write # Define access permissions +authenticationType: "Key" # Options: "Key" or "IAM" +bucketClaimProtocols: ["S3"] # Supported protocol for bucket claims +bucketAccessProtocol: "S3" # Protocol for bucket access +``` + +### Running tests + +To run the Chainsaw end-to-end tests, you can use the following command: + +```sh +chainsaw test --values /path/to/values.yaml +``` + +This command will run the tests using the values defined in the provided YAML configuration file. +Ensure the file is properly configured to suit the Kubernetes objects and controllers you are testing.