Skip to content

Commit 320e38c

Browse files
committed
Adds secrets for pushsecret
1 parent b6744aa commit 320e38c

File tree

9 files changed

+125
-51
lines changed

9 files changed

+125
-51
lines changed

test/e2e/e2e_suite_test.go

Lines changed: 4 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -18,20 +18,17 @@ 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"
2421
"testing"
2522

23+
"k8s.io/client-go/rest"
24+
"sigs.k8s.io/controller-runtime/pkg/client/config"
25+
2626
. "github.com/onsi/ginkgo/v2"
2727
. "github.com/onsi/gomega"
28-
"sigs.k8s.io/controller-runtime/pkg/client/config"
2928
)
3029

3130
var (
32-
cfg *rest.Config
33-
k8sClientSet *kubernetes.Clientset
34-
dynamicClient dynamic.Interface
31+
cfg *rest.Config
3532
)
3633

3734
var _ = BeforeSuite(func() {
@@ -41,12 +38,6 @@ var _ = BeforeSuite(func() {
4138

4239
cfg, err = config.GetConfig() // This works both in-cluster and out-of-cluster
4340
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")
5041
})
5142

5243
// Run e2e tests using the Ginkgo runner.

test/e2e/e2e_test.go

Lines changed: 54 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -1,37 +1,60 @@
1+
/*
2+
Copyright 2025.
3+
Licensed under the Apache License, Version 2.0 (the "License");
4+
you may not use this file except in compliance with the License.
5+
You may obtain a copy of the License at
6+
7+
http://www.apache.org/licenses/LICENSE-2.0
8+
9+
Unless required by applicable law or agreed to in writing, software
10+
distributed under the License is distributed on an "AS IS" BASIS,
11+
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12+
See the License for the specific language governing permissions and
13+
limitations under the License.
14+
*/
15+
116
package e2e
217

318
import (
419
"context"
520
"embed"
6-
. "github.com/onsi/ginkgo/v2"
7-
. "github.com/onsi/gomega"
8-
utils "github.com/openshift/external-secrets-operator/test/utils"
21+
"encoding/base64"
22+
"fmt"
23+
"testing"
24+
"time"
25+
926
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
1027
"k8s.io/apimachinery/pkg/runtime/schema"
1128
"k8s.io/client-go/dynamic"
1229
"k8s.io/client-go/kubernetes"
13-
"testing"
14-
"time"
30+
31+
. "github.com/onsi/ginkgo/v2"
32+
. "github.com/onsi/gomega"
33+
34+
"github.com/openshift/external-secrets-operator/test/utils"
1535
)
1636

1737
//go:embed testdata/*
1838
var testassets embed.FS
1939

2040
const (
21-
operatorNamespace = "external-secrets-operator"
22-
operandNamespace = "external-secrets"
23-
secretStoreFile = "testdata/aws_secret_store.yaml"
24-
externalSecretFile = "testdata/aws_external_secret.yaml"
25-
pushSecretFile = "testdata/push_secret.yaml"
26-
externalSecrets = "testdata/external_secret.yaml"
41+
operatorNamespace = "external-secrets-operator"
42+
operandNamespace = "external-secrets"
43+
secretStoreFile = "testdata/aws_secret_store.yaml"
44+
externalSecretFile = "testdata/aws_external_secret.yaml"
45+
pushSecretFile = "testdata/push_secret.yaml"
46+
externalSecrets = "testdata/external_secret.yaml"
47+
expectedSecretValueFile = "testdata/expected_value.yaml"
48+
awsSecretToPushFile = "testdata/aws_k8s_push_secret.yaml"
2749
)
2850

29-
var _ = Describe("External Secrets Operator End-to-End", Ordered, func() {
51+
var _ = Describe("External Secrets Operator End-to-End test scenarios", Ordered, func() {
3052
ctx := context.TODO()
3153
var (
3254
clientset *kubernetes.Clientset
3355
dynamicClient *dynamic.DynamicClient
3456
loader utils.DynamicResourceLoader
57+
awsSecretName string
3558
)
3659

3760
BeforeAll(func() {
@@ -44,20 +67,22 @@ var _ = Describe("External Secrets Operator End-to-End", Ordered, func() {
4467
dynamicClient, err = dynamic.NewForConfig(cfg)
4568
Expect(err).Should(BeNil())
4669

70+
awsSecretName = fmt.Sprintf("eso-e2e-secret-%s", utils.GetRandomString(5))
71+
4772
By("Waiting for external-secrets-operator controller-manager pod to be ready")
4873
Expect(utils.VerifyPodsReadyByPrefix(ctx, clientset, operatorNamespace, []string{
4974
"external-secrets-operator-controller-manager-",
5075
})).To(Succeed())
5176

52-
By("Creating the ExternalSecrets Operator CR")
77+
By("Creating the externalsecrets.openshift.operator.io/cluster CR")
5378
loader.CreateFromFile(testassets.ReadFile, externalSecrets, operatorNamespace)
5479
})
5580

5681
AfterAll(func() {
57-
By("Deleting the ExternalSecrets Operator CR")
82+
By("Deleting the externalsecrets.openshift.operator.io/cluster CR")
5883
loader.DeleteFromFile(testassets.ReadFile, externalSecrets, operatorNamespace)
5984

60-
err := utils.DeleteAWSSecret("test/e2e", "eu-north-1")
85+
err := utils.DeleteAWSSecret(awsSecretName, "ap-south-1")
6186
Expect(err).NotTo(HaveOccurred(), "failed to delete AWS secret test/e2e")
6287
})
6388

@@ -70,7 +95,15 @@ var _ = Describe("External Secrets Operator End-to-End", Ordered, func() {
7095
})).To(Succeed())
7196
})
7297

73-
It("should create secrets from SecretStore and ExternalSecret", func() {
98+
It("should create secrets mentioned in ExternalSecret using the referenced SecretStore", func() {
99+
expectedSecretValue, err := utils.ReadExpectedSecretValue(expectedSecretValueFile)
100+
Expect(err).To(Succeed())
101+
102+
By("Creating kubernetes secret to be used in PushSecret")
103+
secretsAssetFunc := utils.ReplacePatternInAsset("${SECRET_VALUE}", base64.StdEncoding.EncodeToString(expectedSecretValue))
104+
loader.CreateFromFile(secretsAssetFunc, awsSecretToPushFile, operandNamespace)
105+
defer loader.DeleteFromFile(testassets.ReadFile, awsSecretToPushFile, operandNamespace)
106+
74107
By("Creating SecretStore")
75108
loader.CreateFromFile(testassets.ReadFile, secretStoreFile, operandNamespace)
76109
defer loader.DeleteFromFile(testassets.ReadFile, secretStoreFile, operandNamespace)
@@ -86,7 +119,8 @@ var _ = Describe("External Secrets Operator End-to-End", Ordered, func() {
86119
)).To(Succeed())
87120

88121
By("Creating PushSecret")
89-
loader.CreateFromFile(testassets.ReadFile, pushSecretFile, operandNamespace)
122+
assetFunc := utils.ReplacePatternInAsset("${AWS_SECRET_KEY_NAME}", awsSecretName)
123+
loader.CreateFromFile(assetFunc, pushSecretFile, operandNamespace)
90124
defer loader.DeleteFromFile(testassets.ReadFile, pushSecretFile, operandNamespace)
91125

92126
By("Waiting for PushSecret to become Ready")
@@ -100,7 +134,7 @@ var _ = Describe("External Secrets Operator End-to-End", Ordered, func() {
100134
)).To(Succeed())
101135

102136
By("Creating ExternalSecret")
103-
loader.CreateFromFile(testassets.ReadFile, externalSecretFile, operandNamespace)
137+
loader.CreateFromFile(assetFunc, externalSecretFile, operandNamespace)
104138
defer loader.DeleteFromFile(testassets.ReadFile, externalSecretFile, operandNamespace)
105139

106140
By("Waiting for ExternalSecret to become Ready")
@@ -121,9 +155,7 @@ var _ = Describe("External Secrets Operator End-to-End", Ordered, func() {
121155
val, ok := secret.Data["aws_secret_access_key"]
122156
g.Expect(ok).To(BeTrue(), "aws_secret_access_key should be present in secret %s", secret.Name)
123157

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-
158+
g.Expect(val).To(Equal(expectedSecretValue), "aws_secret_access_key does not match expected value")
159+
}, time.Minute, 10*time.Second).Should(Succeed())
128160
})
129161
})

test/e2e/testdata/aws_external_secret.yaml

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,9 @@
11
apiVersion: external-secrets.io/v1beta1
22
kind: ExternalSecret
33
metadata:
4+
labels:
5+
app.kubernetes.io/name: cluster
6+
app.kubernetes.io/managed-by: external-secrets-operator-e2e
47
name: aws-external-secret
58
namespace: external-secrets
69
spec:
@@ -14,5 +17,5 @@ spec:
1417
data:
1518
- secretKey: aws_secret_access_key # This is the key in the Kubernetes Secret
1619
remoteRef:
17-
key: test/e2e # This is the name of the secret in AWS Secrets Manager
20+
key: "${AWS_SECRET_KEY_NAME}" # This is the name of the secret in AWS Secrets Manager
1821
property: aws_secret_access_key # This is the key inside the AWS secret JSON
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
apiVersion: v1
2+
kind: Secret
3+
metadata:
4+
labels:
5+
app.kubernetes.io/name: aws-k8s-push-secret
6+
app.kubernetes.io/managed-by: external-secrets-operator-e2e
7+
name: aws-k8s-push-secret
8+
namespace: external-secrets
9+
data:
10+
aws_secret_access_key: ${SECRET_VALUE}
11+
type: Opaque

test/e2e/testdata/aws_secret_store.yaml

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,15 @@
11
apiVersion: external-secrets.io/v1beta1
22
kind: ClusterSecretStore
33
metadata:
4+
labels:
5+
app.kubernetes.io/name: cluster
6+
app.kubernetes.io/managed-by: external-secrets-operator-e2e
47
name: aws-secret-store
58
spec:
69
provider:
710
aws:
811
service: SecretsManager
9-
region: eu-north-1
12+
region: ap-south-1
1013
auth:
1114
secretRef:
1215
accessKeyIDSecretRef:
@@ -17,4 +20,3 @@ spec:
1720
name: aws-creds
1821
key: aws_secret_access_key
1922
namespace: kube-system
20-
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
hqTTSYkFYgkw3OfQ9lFvQgtsReb1g1a+Po5Y/HNU
1+
eso-e2e-sample-value

test/e2e/testdata/external_secret.yaml

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ apiVersion: operator.openshift.io/v1alpha1
22
kind: ExternalSecrets
33
metadata:
44
labels:
5-
app.kubernetes.io/name: external-secrets-operator
6-
app.kubernetes.io/managed-by: kustomize
5+
app.kubernetes.io/name: cluster
6+
app.kubernetes.io/managed-by: external-secrets-operator-e2e
77
name: cluster
8-
spec: {}
8+
spec: {}

test/e2e/testdata/push_secret.yaml

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,9 @@
11
apiVersion: external-secrets.io/v1alpha1
22
kind: PushSecret
33
metadata:
4+
labels:
5+
app.kubernetes.io/name: cluster
6+
app.kubernetes.io/managed-by: external-secrets-operator-e2e
47
name: aws-push-secret
58
namespace: external-secrets
69
spec:
@@ -10,16 +13,14 @@ spec:
1013
kind: ClusterSecretStore
1114
selector:
1215
secret:
13-
name: aws-creds # The source Kubernetes secret
16+
name: aws-k8s-push-secret # The source Kubernetes secret
1417
data:
1518
- match:
1619
secretKey: aws_secret_access_key # The key inside the Kubernetes secret
1720
remoteRef:
18-
remoteKey: test/e2e # AWS Secrets Manager secret name
21+
remoteKey: "${AWS_SECRET_KEY_NAME}" # AWS Secrets Manager secret name
1922
property: aws_secret_access_key # Key inside the AWS secret JSON
2023
template:
2124
metadata:
2225
labels:
2326
pushed-by: eso
24-
target:
25-
creationPolicy: Owner

test/utils/conditions.go

Lines changed: 39 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -3,21 +3,26 @@ package utils
33
import (
44
"context"
55
"fmt"
6-
"k8s.io/apimachinery/pkg/apis/meta/v1/unstructured"
7-
"k8s.io/apimachinery/pkg/runtime/schema"
6+
"math/rand"
7+
"os"
88
"strings"
99
"time"
1010

11-
"github.com/aws/aws-sdk-go/aws"
12-
"github.com/aws/aws-sdk-go/aws/session"
13-
"github.com/aws/aws-sdk-go/service/secretsmanager"
1411
corev1 "k8s.io/api/core/v1"
1512
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
13+
"k8s.io/apimachinery/pkg/apis/meta/v1/unstructured"
14+
"k8s.io/apimachinery/pkg/runtime/schema"
1615
"k8s.io/apimachinery/pkg/util/wait"
1716
"k8s.io/client-go/dynamic"
1817
"k8s.io/client-go/kubernetes"
18+
19+
"github.com/aws/aws-sdk-go/aws"
20+
"github.com/aws/aws-sdk-go/aws/session"
21+
"github.com/aws/aws-sdk-go/service/secretsmanager"
1922
)
2023

24+
type AssetFunc func(string) ([]byte, error)
25+
2126
// VerifyPodsReadyByPrefix checks if all pods matching the given prefixes are Ready and ContainersReady.
2227
func VerifyPodsReadyByPrefix(ctx context.Context, clientset kubernetes.Interface, namespace string, prefixes []string) error {
2328
return wait.PollUntilContextTimeout(ctx, 5*time.Second, 2*time.Minute, true, func(ctx context.Context) (bool, error) {
@@ -123,3 +128,32 @@ func DeleteAWSSecret(secretName, region string) error {
123128
}
124129
return nil
125130
}
131+
132+
func ReadExpectedSecretValue(assetName string) ([]byte, error) {
133+
expectedSecretValue, err := os.ReadFile(assetName)
134+
return expectedSecretValue, err
135+
}
136+
137+
// GetRandomString to create random string
138+
func GetRandomString(strLen int) string {
139+
chars := "abcdefghijklmnopqrstuvwxyz0123456789"
140+
seed := rand.New(rand.NewSource(time.Now().UnixNano()))
141+
buffer := make([]byte, strLen)
142+
for index := range buffer {
143+
buffer[index] = chars[seed.Intn(len(chars))]
144+
}
145+
return string(buffer)
146+
}
147+
148+
func ReplacePatternInAsset(replacePatternString ...string) AssetFunc {
149+
return func(assetName string) ([]byte, error) {
150+
fileContent, err := os.ReadFile(assetName)
151+
if err != nil {
152+
return nil, err
153+
}
154+
155+
replacer := strings.NewReplacer(replacePatternString...)
156+
replacedFileContent := replacer.Replace(string(fileContent))
157+
return []byte(replacedFileContent), nil
158+
}
159+
}

0 commit comments

Comments
 (0)