@@ -2,118 +2,128 @@ package e2e
22
33import (
44 "context"
5- "fmt "
5+ "embed "
66 . "github.com/onsi/ginkgo/v2"
77 . "github.com/onsi/gomega"
88 utils "github.com/openshift/external-secrets-operator/test/utils"
9- corev1 "k8s.io/api/core/v1"
109 metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
11- "os"
10+ "k8s.io/apimachinery/pkg/runtime/schema"
11+ "k8s.io/client-go/dynamic"
12+ "k8s.io/client-go/kubernetes"
1213 "testing"
1314 "time"
1415)
1516
17+ //go:embed testdata/*
18+ var testassets embed.FS
19+
1620const (
17- namespace = "external-secrets-operator"
21+ operatorNamespace = "external-secrets-operator"
22+ operandNamespace = "external-secrets"
1823 secretStoreFile = "testdata/aws_secret_store.yaml"
1924 externalSecretFile = "testdata/aws_external_secret.yaml"
25+ pushSecretFile = "testdata/push_secret.yaml"
26+ externalSecrets = "testdata/external_secret.yaml"
2027)
2128
22- var _ = Describe ("External Secrets Operator" , Ordered , func () {
23-
29+ var _ = Describe ("External Secrets Operator End-to-End " , Ordered , func () {
30+ ctx := context . TODO ()
2431 var (
25- ctx = context .TODO ()
26- loader utils.DynamicResourceLoader
32+ clientset * kubernetes.Clientset
33+ dynamicClient * dynamic.DynamicClient
34+ loader utils.DynamicResourceLoader
2735 )
2836
2937 BeforeAll (func () {
38+ var err error
3039 loader = utils .NewDynamicResourceLoader (ctx , & testing.T {})
3140
32- // Create ExternalSecret resource
33- loader .CreateFromFile (loadFromFile , "testdata/external_secret.yaml" , namespace )
41+ clientset , err = kubernetes .NewForConfig (cfg )
42+ Expect (err ).Should (BeNil ())
43+
44+ dynamicClient , err = dynamic .NewForConfig (cfg )
45+ Expect (err ).Should (BeNil ())
46+
47+ By ("Waiting for external-secrets-operator controller-manager pod to be ready" )
48+ Expect (utils .VerifyPodsReadyByPrefix (ctx , clientset , operatorNamespace , []string {
49+ "external-secrets-operator-controller-manager-" ,
50+ })).To (Succeed ())
51+
52+ By ("Creating the ExternalSecrets Operator CR" )
53+ loader .CreateFromFile (testassets .ReadFile , externalSecrets , operatorNamespace )
3454 })
3555
3656 AfterAll (func () {
37- loader .DeleteFromFile (loadFromFile , "testdata/external_secret.yaml" , namespace )
57+ By ("Deleting the ExternalSecrets Operator CR" )
58+ loader .DeleteFromFile (testassets .ReadFile , externalSecrets , operatorNamespace )
59+
60+ err := utils .DeleteAWSSecret ("test/e2e" , "eu-north-1" )
61+ Expect (err ).NotTo (HaveOccurred (), "failed to delete AWS secret test/e2e" )
3862 })
3963
40- Context ("Operator" , func () {
41- It ("should have controller pod running" , func () {
42- verifyControllerPod := func () error {
43- pods , err := loader .KubeClient .CoreV1 ().Pods (namespace ).List (ctx , metav1.ListOptions {
44- LabelSelector : "control-plane=controller-manager" ,
45- })
46- ExpectWithOffset (2 , err ).NotTo (HaveOccurred ())
47-
48- var runningPods []corev1.Pod
49- for _ , pod := range pods .Items {
50- if pod .DeletionTimestamp == nil && pod .Status .Phase == corev1 .PodRunning {
51- runningPods = append (runningPods , pod )
52- }
53- }
54-
55- if len (runningPods ) != 1 {
56- return fmt .Errorf ("expected 1 running controller pod, got %d" , len (runningPods ))
57- }
58-
59- ExpectWithOffset (2 , runningPods [0 ].Name ).To (ContainSubstring ("controller-manager" ))
60- fmt .Println (runningPods [0 ].Name )
61- return nil
62- }
63-
64- EventuallyWithOffset (1 , verifyControllerPod , time .Minute , time .Second ).Should (Succeed ())
65- })
64+ BeforeEach (func () {
65+ By ("Verifying ESO pods are running and ready" )
66+ Expect (utils .VerifyPodsReadyByPrefix (ctx , clientset , operandNamespace , []string {
67+ "external-secrets-" ,
68+ "external-secrets-cert-controller-" ,
69+ "external-secrets-webhook-" ,
70+ })).To (Succeed ())
6671 })
6772
68- Context ("AWS SecretStore" , func () {
69- BeforeEach (func () {
70- loader .CreateFromFile (loadFromFile , secretStoreFile , namespace )
71- loader .CreateFromFile (loadFromFile , externalSecretFile , namespace )
72-
73- })
74-
75- AfterEach (func () {
76- // Clean up SecretStore
77- loader .DeleteFromFile (loadFromFile , secretStoreFile , namespace )
78- // Clean up ExternalStore
79- loader .DeleteFromFile (loadFromFile , externalSecretFile , namespace )
80-
81- })
82-
83- It ("should synchronize secrets from AWS Secrets Manager" , func () {
84- By ("verifying the synchronization of the secret" )
85- Eventually (func () error {
86- k8sSecret , err := loader .KubeClient .CoreV1 ().Secrets (namespace ).Get (ctx , "aws-secret" , metav1.GetOptions {})
87-
88- secretsList , err := loader .KubeClient .CoreV1 ().Secrets ("kube-system" ).List (ctx , metav1.ListOptions {})
89- Expect (err ).NotTo (HaveOccurred ())
90-
91- fmt .Println ("Secrets in kube-system:" )
92- for _ , s := range secretsList .Items {
93- fmt .Println ("-" , s .Name )
94- }
95- if err != nil {
96- return fmt .Errorf ("failed to get secret: %v" , err )
97- }
98-
99- if string (k8sSecret .Data ["aws_secret_access_key" ]) == "" {
100- return fmt .Errorf ("secret data is empty" )
101- }
102-
103- decodedValue , err := os .ReadFile ("testdata/expected_value.yaml" )
104- if err != nil {
105- return fmt .Errorf ("failed to read expected secret value: %v" , err )
106- }
107-
108- if string (k8sSecret .Data ["aws_secret_access_key" ]) != string (decodedValue ) {
109- return fmt .Errorf ("secret value does not match expected" )
110- }
111- return nil
112- }, time .Minute , time .Second ).Should (Succeed ())
113- })
73+ It ("should create secrets from SecretStore and ExternalSecret" , func () {
74+ By ("Creating SecretStore" )
75+ loader .CreateFromFile (testassets .ReadFile , secretStoreFile , operandNamespace )
76+ defer loader .DeleteFromFile (testassets .ReadFile , secretStoreFile , operandNamespace )
77+
78+ By ("Waiting for SecretStore to become Ready" )
79+ Expect (utils .WaitForESOResourceReady (ctx , dynamicClient ,
80+ schema.GroupVersionResource {
81+ Group : "external-secrets.io" ,
82+ Version : "v1beta1" ,
83+ Resource : "clustersecretstores" ,
84+ },
85+ "" , "aws-secret-store" , time .Minute ,
86+ )).To (Succeed ())
87+
88+ By ("Creating PushSecret" )
89+ loader .CreateFromFile (testassets .ReadFile , pushSecretFile , operandNamespace )
90+ defer loader .DeleteFromFile (testassets .ReadFile , pushSecretFile , operandNamespace )
91+
92+ By ("Waiting for PushSecret to become Ready" )
93+ Expect (utils .WaitForESOResourceReady (ctx , dynamicClient ,
94+ schema.GroupVersionResource {
95+ Group : "external-secrets.io" ,
96+ Version : "v1alpha1" ,
97+ Resource : "pushsecrets" ,
98+ },
99+ operandNamespace , "aws-push-secret" , time .Minute ,
100+ )).To (Succeed ())
101+
102+ By ("Creating ExternalSecret" )
103+ loader .CreateFromFile (testassets .ReadFile , externalSecretFile , operandNamespace )
104+ defer loader .DeleteFromFile (testassets .ReadFile , externalSecretFile , operandNamespace )
105+
106+ By ("Waiting for ExternalSecret to become Ready" )
107+ Expect (utils .WaitForESOResourceReady (ctx , dynamicClient ,
108+ schema.GroupVersionResource {
109+ Group : "external-secrets.io" ,
110+ Version : "v1beta1" ,
111+ Resource : "externalsecrets" ,
112+ },
113+ operandNamespace , "aws-external-secret" , time .Minute ,
114+ )).To (Succeed ())
115+
116+ By ("Waiting for target secret to be created with expected data" )
117+ Eventually (func (g Gomega ) {
118+ secret , err := loader .KubeClient .CoreV1 ().Secrets (operandNamespace ).Get (ctx , "aws-secret" , metav1.GetOptions {})
119+ g .Expect (err ).NotTo (HaveOccurred (), "should get aws-secret from namespace %s" , operandNamespace )
120+
121+ val , ok := secret .Data ["aws_secret_access_key" ]
122+ g .Expect (ok ).To (BeTrue (), "aws_secret_access_key should be present in secret %s" , secret .Name )
123+
124+ expectedValue := []byte ("hqTTSYkFYgkw3OfQ9lFvQgtsReb1g1a+Po5Y/HNU" )
125+ g .Expect (val ).To (Equal (expectedValue ), "aws_secret_access_key does not match expected value" )
126+ }, time .Minute , 5 * time .Second ).Should (Succeed ())
127+
114128 })
115129})
116-
117- func loadFromFile (name string ) ([]byte , error ) {
118- return os .ReadFile (name )
119- }
0 commit comments