Skip to content

Commit b6744aa

Browse files
committed
modified code
1 parent e25fd6a commit b6744aa

File tree

496 files changed

+92162
-42211
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

496 files changed

+92162
-42211
lines changed

go.mod

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ module github.com/openshift/external-secrets-operator
33
go 1.23.6
44

55
require (
6+
github.com/aws/aws-sdk-go v1.55.7
67
github.com/cert-manager/cert-manager v1.16.4
78
github.com/elastic/crd-ref-docs v0.1.0
89
github.com/go-bindata/go-bindata v3.1.2+incompatible
@@ -11,15 +12,16 @@ require (
1112
github.com/maxbrunsfeld/counterfeiter/v6 v6.11.2
1213
github.com/onsi/ginkgo/v2 v2.22.0
1314
github.com/onsi/gomega v1.36.1
14-
github.com/openshift/build-machinery-go v0.0.0-20250414185254-3ce8e800ceda
15+
github.com/openshift/build-machinery-go v0.0.0-20250530140348-dc5b2804eeee
16+
github.com/stretchr/testify v1.10.0
1517
go.uber.org/zap v1.27.0
16-
k8s.io/api v0.32.1
18+
k8s.io/api v0.32.3
1719
k8s.io/apiextensions-apiserver v0.32.1
18-
k8s.io/apimachinery v0.32.1
20+
k8s.io/apimachinery v0.32.3
1921
k8s.io/client-go v0.32.1
2022
k8s.io/klog/v2 v2.130.1
2123
k8s.io/kubernetes v1.32.1
22-
k8s.io/utils v0.0.0-20241104100929-3ea5e8cea738
24+
k8s.io/utils v0.0.0-20241210054802-24370beab758
2325
sigs.k8s.io/controller-runtime v0.20.1
2426
sigs.k8s.io/controller-runtime/tools/setup-envtest v0.0.0-20250308055145-5fe7bb3edc86
2527
sigs.k8s.io/controller-tools v0.16.1
@@ -142,6 +144,7 @@ require (
142144
github.com/jingyugao/rowserrcheck v1.1.1 // indirect
143145
github.com/jirfag/go-printf-func-name v0.0.0-20200119135958-7558a9eaa5af // indirect
144146
github.com/jjti/go-spancheck v0.6.1 // indirect
147+
github.com/jmespath/go-jmespath v0.4.1-0.20220621161143-b0104c826a24 // indirect
145148
github.com/josharian/intern v1.0.0 // indirect
146149
github.com/json-iterator/go v1.1.12 // indirect
147150
github.com/julz/importas v0.1.0 // indirect
@@ -221,7 +224,6 @@ require (
221224
github.com/stbenjam/no-sprintf-host-port v0.1.1 // indirect
222225
github.com/stoewer/go-strcase v1.3.0 // indirect
223226
github.com/stretchr/objx v0.5.2 // indirect
224-
github.com/stretchr/testify v1.10.0 // indirect
225227
github.com/subosito/gotenv v1.4.1 // indirect
226228
github.com/t-yuki/gocover-cobertura v0.0.0-20180217150009-aaee18c8195c // indirect
227229
github.com/tdakkota/asciicheck v0.2.0 // indirect

go.sum

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -54,6 +54,8 @@ github.com/ashanbrown/forbidigo v1.6.0 h1:D3aewfM37Yb3pxHujIPSpTf6oQk9sc9WZi8ger
5454
github.com/ashanbrown/forbidigo v1.6.0/go.mod h1:Y8j9jy9ZYAEHXdu723cUlraTqbzjKF1MUyfOKL+AjcU=
5555
github.com/ashanbrown/makezero v1.1.1 h1:iCQ87C0V0vSyO+M9E/FZYbu65auqH0lnsOkf5FcB28s=
5656
github.com/ashanbrown/makezero v1.1.1/go.mod h1:i1bJLCRSCHOcOa9Y6MyF2FTfMZMFdHvxKHxgO5Z1axI=
57+
github.com/aws/aws-sdk-go v1.55.7 h1:UJrkFq7es5CShfBwlWAC8DA077vp8PyVbQd3lqLiztE=
58+
github.com/aws/aws-sdk-go v1.55.7/go.mod h1:eRwEWoyTWFMVYVQzKMNHWP5/RV4xIUGMQfXQHfHkpNU=
5759
github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM=
5860
github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw=
5961
github.com/bkielbasa/cyclop v1.2.1 h1:AeF71HZDob1P2/pRm1so9cd1alZnrpyc4q2uP2l0gJY=
@@ -284,6 +286,10 @@ github.com/jirfag/go-printf-func-name v0.0.0-20200119135958-7558a9eaa5af h1:KA9B
284286
github.com/jirfag/go-printf-func-name v0.0.0-20200119135958-7558a9eaa5af/go.mod h1:HEWGJkRDzjJY2sqdDwxccsGicWEf9BQOZsq2tV+xzM0=
285287
github.com/jjti/go-spancheck v0.6.1 h1:ZK/wE5Kyi1VX3PJpUO2oEgeoI4FWOUm7Shb2Gbv5obI=
286288
github.com/jjti/go-spancheck v0.6.1/go.mod h1:vF1QkOO159prdo6mHRxak2CpzDpHAfKiPUDP/NeRnX8=
289+
github.com/jmespath/go-jmespath v0.4.1-0.20220621161143-b0104c826a24 h1:liMMTbpW34dhU4az1GN0pTPADwNmvoRSeoZ6PItiqnY=
290+
github.com/jmespath/go-jmespath v0.4.1-0.20220621161143-b0104c826a24/go.mod h1:T8mJZnbsbmF+m6zOOFylbeCJqk5+pHWvzYPziyZiYoo=
291+
github.com/jmespath/go-jmespath/internal/testify v1.5.1 h1:shLQSRRSCCPj3f2gpwzGwWFoC7ycTf1rcQZHOlsJ6N8=
292+
github.com/jmespath/go-jmespath/internal/testify v1.5.1/go.mod h1:L3OGu8Wl2/fWfCI6z80xFu9LTZmf1ZRjMHUOPmWr69U=
287293
github.com/jonboulle/clockwork v0.4.0 h1:p4Cf1aMWXnXAUh8lVfewRBx1zaTSYKrKMF2g3ST4RZ4=
288294
github.com/jonboulle/clockwork v0.4.0/go.mod h1:xgRqUGwRcjKCO1vbZUEtSLrqKoPSsUpK7fnezOII0kc=
289295
github.com/josharian/intern v1.0.0 h1:vlS4z54oSdjm0bgjRigI+G1HpF+tI+9rE5LLzOg8HmY=
@@ -393,12 +399,8 @@ github.com/onsi/gomega v1.36.1 h1:bJDPBO7ibjxcbHMgSCoo4Yj18UWbKDlLwX1x9sybDcw=
393399
github.com/onsi/gomega v1.36.1/go.mod h1:PvZbdDc8J6XJEpDK4HCuRBm8a6Fzp9/DmhC9C7yFlog=
394400
github.com/opencontainers/go-digest v1.0.0 h1:apOUWs51W5PlhuyGyz9FCeeBIOUDA/6nW8Oi/yOhh5U=
395401
github.com/opencontainers/go-digest v1.0.0/go.mod h1:0JzlMkj0TRzQZfJkVvzbP0HBR3IKzErnv2BNG4W4MAM=
396-
github.com/openshift/api v0.0.0-20250517062239-9cbdb71c92bb h1:zsjZtFnPzE7l2VD5cDCs7PcpaRjaECByEw+JIjM0yW4=
397-
github.com/openshift/api v0.0.0-20250517062239-9cbdb71c92bb/go.mod h1:yk60tHAmHhtVpJQo3TwVYq2zpuP70iJIFDCmeKMIzPw=
398402
github.com/openshift/build-machinery-go v0.0.0-20250530140348-dc5b2804eeee h1:+Sp5GGnjHDhT/a/nQ1xdp43UscBMr7G5wxsYotyhzJ4=
399403
github.com/openshift/build-machinery-go v0.0.0-20250530140348-dc5b2804eeee/go.mod h1:8jcm8UPtg2mCAsxfqKil1xrmRMI3a+XU2TZ9fF8A7TE=
400-
github.com/openshift/client-go v0.0.0-20250603093317-900624865677 h1:OE7ZwLdTM4FmkzfHJMN+CwkyIHCNevv5jAnfkYhw4+U=
401-
github.com/openshift/client-go v0.0.0-20250603093317-900624865677/go.mod h1:If4PFiis4Sp3vf5z7PYkZJy3gA9DP1kYZR9SdTjjKoY=
402404
github.com/otiai10/copy v1.2.0/go.mod h1:rrF5dJ5F0t/EWSYODDu4j9/vEeYHMkc8jt0zJChqQWw=
403405
github.com/otiai10/copy v1.14.0 h1:dCI/t1iTdYGtkvCuBG2BgR6KZa83PTclw4U5n2wAllU=
404406
github.com/otiai10/copy v1.14.0/go.mod h1:ECfuL02W+/FkTWZWgQqXPWZgW9oeKCSQ5qVfSc4qc4w=
@@ -770,6 +772,7 @@ gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7 h1:uRGJdciOHaEIrze2W8Q3AKkep
770772
gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7/go.mod h1:dt/ZhP58zS4L8KSrWDmTeBkI65Dw0HsyUHuEVlX15mw=
771773
gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
772774
gopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
775+
gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
773776
gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY=
774777
gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ=
775778
gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=

test/e2e/e2e_suite_test.go

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,12 +18,37 @@ package e2e
1818

1919
import (
2020
"fmt"
21+
"k8s.io/client-go/dynamic"
22+
"k8s.io/client-go/kubernetes"
23+
"k8s.io/client-go/rest"
2124
"testing"
2225

2326
. "github.com/onsi/ginkgo/v2"
2427
. "github.com/onsi/gomega"
28+
"sigs.k8s.io/controller-runtime/pkg/client/config"
2529
)
2630

31+
var (
32+
cfg *rest.Config
33+
k8sClientSet *kubernetes.Clientset
34+
dynamicClient dynamic.Interface
35+
)
36+
37+
var _ = BeforeSuite(func() {
38+
var err error
39+
40+
By("Initializing Kubernetes config")
41+
42+
cfg, err = config.GetConfig() // This works both in-cluster and out-of-cluster
43+
Expect(err).NotTo(HaveOccurred(), "failed to get kubeconfig")
44+
45+
k8sClientSet, err = kubernetes.NewForConfig(cfg)
46+
Expect(err).NotTo(HaveOccurred(), "failed to create kube client")
47+
48+
dynamicClient, err = dynamic.NewForConfig(cfg)
49+
Expect(err).NotTo(HaveOccurred(), "failed to create dynamic client")
50+
})
51+
2752
// Run e2e tests using the Ginkgo runner.
2853
func TestE2E(t *testing.T) {
2954
RegisterFailHandler(Fail)

test/e2e/e2e_test.go

Lines changed: 97 additions & 87 deletions
Original file line numberDiff line numberDiff line change
@@ -2,118 +2,128 @@ package e2e
22

33
import (
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+
1620
const (
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-
}

test/e2e/testdata/aws_creds_secret.yaml

Lines changed: 0 additions & 9 deletions
This file was deleted.
Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,18 +1,18 @@
11
apiVersion: external-secrets.io/v1beta1
22
kind: ExternalSecret
33
metadata:
4-
name: aws-secret
5-
namespace: external-secrets-operator
4+
name: aws-external-secret
5+
namespace: external-secrets
66
spec:
77
refreshInterval: 1h
88
secretStoreRef:
99
name: aws-secret-store
10-
kind: SecretStore
10+
kind: ClusterSecretStore
1111
target:
1212
name: aws-secret
1313
creationPolicy: Owner
1414
data:
15-
- secretKey: aws_secret_access_key
15+
- secretKey: aws_secret_access_key # This is the key in the Kubernetes Secret
1616
remoteRef:
17-
key: aws_secret_access_key #TODO
18-
property: aws_secret_access_key
17+
key: test/e2e # This is the name of the secret in AWS Secrets Manager
18+
property: aws_secret_access_key # This is the key inside the AWS secret JSON
Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,12 @@
11
apiVersion: external-secrets.io/v1beta1
2-
kind: SecretStore
2+
kind: ClusterSecretStore
33
metadata:
44
name: aws-secret-store
5-
namespace: external-secrets-operator
65
spec:
76
provider:
87
aws:
98
service: SecretsManager
10-
region: us-east-1
9+
region: eu-north-1
1110
auth:
1211
secretRef:
1312
accessKeyIDSecretRef:
@@ -18,3 +17,4 @@ spec:
1817
name: aws-creds
1918
key: aws_secret_access_key
2019
namespace: kube-system
20+

0 commit comments

Comments
 (0)