|
|
@@ -34,8 +34,6 @@ import (
|
|
|
esmeta "github.com/external-secrets/external-secrets/apis/meta/v1"
|
|
|
)
|
|
|
|
|
|
-const providerSecretName = "provider-secret"
|
|
|
-
|
|
|
type azureProvider struct {
|
|
|
clientID string
|
|
|
clientSecret string
|
|
|
@@ -70,6 +68,7 @@ func newazureProvider(f *framework.Framework, clientID, clientSecret, tenantID,
|
|
|
})
|
|
|
prov.CreateSecretStoreWithWI()
|
|
|
prov.CreateSecretStore()
|
|
|
+ prov.CreateReferentSecretStore()
|
|
|
})
|
|
|
|
|
|
return prov
|
|
|
@@ -92,7 +91,7 @@ func (s *azureProvider) CreateSecret(key string, val framework.SecretEntry) {
|
|
|
Value: &val.Value,
|
|
|
SecretAttributes: &keyvault.SecretAttributes{
|
|
|
RecoveryLevel: keyvault.Purgeable,
|
|
|
- Enabled: utilpointer.BoolPtr(true),
|
|
|
+ Enabled: utilpointer.Bool(true),
|
|
|
},
|
|
|
})
|
|
|
Expect(err).ToNot(HaveOccurred())
|
|
|
@@ -115,7 +114,7 @@ func (s *azureProvider) CreateKey(key string) *keyvault.JSONWebKey {
|
|
|
Kty: keyvault.RSA,
|
|
|
KeyAttributes: &keyvault.KeyAttributes{
|
|
|
RecoveryLevel: keyvault.Purgeable,
|
|
|
- Enabled: utilpointer.BoolPtr(true),
|
|
|
+ Enabled: utilpointer.Bool(true),
|
|
|
},
|
|
|
},
|
|
|
)
|
|
|
@@ -144,12 +143,12 @@ func (s *azureProvider) CreateCertificate(key string) {
|
|
|
},
|
|
|
Attributes: &keyvault.CertificateAttributes{
|
|
|
RecoveryLevel: keyvault.Purgeable,
|
|
|
- Enabled: utilpointer.BoolPtr(true),
|
|
|
+ Enabled: utilpointer.Bool(true),
|
|
|
},
|
|
|
},
|
|
|
CertificateAttributes: &keyvault.CertificateAttributes{
|
|
|
RecoveryLevel: keyvault.Purgeable,
|
|
|
- Enabled: utilpointer.BoolPtr(true),
|
|
|
+ Enabled: utilpointer.Bool(true),
|
|
|
},
|
|
|
},
|
|
|
)
|
|
|
@@ -183,15 +182,52 @@ func (s *azureProvider) DeleteCertificate(key string) {
|
|
|
Expect(err).ToNot(HaveOccurred())
|
|
|
}
|
|
|
|
|
|
+const (
|
|
|
+ staticSecretName = "provider-secret"
|
|
|
+ referentSecretName = "referent-secret"
|
|
|
+ workloadIdentityServiceAccountNme = "external-secrets-operator"
|
|
|
+ credentialKeyClientID = "client-id"
|
|
|
+ credentialKeyClientSecret = "client-secret"
|
|
|
+)
|
|
|
+
|
|
|
+func newProviderWithStaticCredentials(tenantID, vaultURL, secretName string) *esv1beta1.AzureKVProvider {
|
|
|
+ return &esv1beta1.AzureKVProvider{
|
|
|
+ TenantID: &tenantID,
|
|
|
+ VaultURL: &vaultURL,
|
|
|
+ AuthSecretRef: &esv1beta1.AzureKVAuth{
|
|
|
+ ClientID: &esmeta.SecretKeySelector{
|
|
|
+ Name: staticSecretName,
|
|
|
+ Key: credentialKeyClientID,
|
|
|
+ },
|
|
|
+ ClientSecret: &esmeta.SecretKeySelector{
|
|
|
+ Name: staticSecretName,
|
|
|
+ Key: credentialKeyClientSecret,
|
|
|
+ },
|
|
|
+ },
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+func newProviderWithServiceAccount(tenantID, vaultURL string, authType esv1beta1.AzureAuthType, serviceAccountName string, serviceAccountNamespace *string) *esv1beta1.AzureKVProvider {
|
|
|
+ return &esv1beta1.AzureKVProvider{
|
|
|
+ TenantID: &tenantID,
|
|
|
+ VaultURL: &vaultURL,
|
|
|
+ AuthType: &authType,
|
|
|
+ ServiceAccountRef: &esmeta.ServiceAccountSelector{
|
|
|
+ Name: serviceAccountName,
|
|
|
+ Namespace: serviceAccountNamespace,
|
|
|
+ },
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
func (s *azureProvider) CreateSecretStore() {
|
|
|
azureCreds := &v1.Secret{
|
|
|
ObjectMeta: metav1.ObjectMeta{
|
|
|
- Name: providerSecretName,
|
|
|
+ Name: staticSecretName,
|
|
|
Namespace: s.framework.Namespace.Name,
|
|
|
},
|
|
|
StringData: map[string]string{
|
|
|
- "client-id": s.clientID,
|
|
|
- "client-secret": s.clientSecret,
|
|
|
+ credentialKeyClientID: s.clientID,
|
|
|
+ credentialKeyClientSecret: s.clientSecret,
|
|
|
},
|
|
|
}
|
|
|
err := s.framework.CRClient.Create(context.Background(), azureCreds)
|
|
|
@@ -203,20 +239,7 @@ func (s *azureProvider) CreateSecretStore() {
|
|
|
},
|
|
|
Spec: esv1beta1.SecretStoreSpec{
|
|
|
Provider: &esv1beta1.SecretStoreProvider{
|
|
|
- AzureKV: &esv1beta1.AzureKVProvider{
|
|
|
- TenantID: &s.tenantID,
|
|
|
- VaultURL: &s.vaultURL,
|
|
|
- AuthSecretRef: &esv1beta1.AzureKVAuth{
|
|
|
- ClientID: &esmeta.SecretKeySelector{
|
|
|
- Name: providerSecretName,
|
|
|
- Key: "client-id",
|
|
|
- },
|
|
|
- ClientSecret: &esmeta.SecretKeySelector{
|
|
|
- Name: providerSecretName,
|
|
|
- Key: "client-secret",
|
|
|
- },
|
|
|
- },
|
|
|
- },
|
|
|
+ AzureKV: newProviderWithStaticCredentials(s.tenantID, s.vaultURL, staticSecretName),
|
|
|
},
|
|
|
},
|
|
|
}
|
|
|
@@ -224,6 +247,38 @@ func (s *azureProvider) CreateSecretStore() {
|
|
|
Expect(err).ToNot(HaveOccurred())
|
|
|
}
|
|
|
|
|
|
+func (s *azureProvider) CreateReferentSecretStore() {
|
|
|
+ azureCreds := &v1.Secret{
|
|
|
+ ObjectMeta: metav1.ObjectMeta{
|
|
|
+ Name: referentSecretName,
|
|
|
+ Namespace: s.framework.Namespace.Name,
|
|
|
+ },
|
|
|
+ StringData: map[string]string{
|
|
|
+ credentialKeyClientID: s.clientID,
|
|
|
+ credentialKeyClientSecret: s.clientSecret,
|
|
|
+ },
|
|
|
+ }
|
|
|
+ err := s.framework.CRClient.Create(context.Background(), azureCreds)
|
|
|
+ Expect(err).ToNot(HaveOccurred())
|
|
|
+ secretStore := &esv1beta1.ClusterSecretStore{
|
|
|
+ ObjectMeta: metav1.ObjectMeta{
|
|
|
+ Name: referentAuthName(s.framework),
|
|
|
+ Namespace: s.framework.Namespace.Name,
|
|
|
+ },
|
|
|
+ Spec: esv1beta1.SecretStoreSpec{
|
|
|
+ Provider: &esv1beta1.SecretStoreProvider{
|
|
|
+ AzureKV: newProviderWithStaticCredentials(s.tenantID, s.vaultURL, referentSecretName),
|
|
|
+ },
|
|
|
+ },
|
|
|
+ }
|
|
|
+ err = s.framework.CRClient.Create(context.Background(), secretStore)
|
|
|
+ Expect(err).ToNot(HaveOccurred())
|
|
|
+}
|
|
|
+
|
|
|
+func referentAuthName(f *framework.Framework) string {
|
|
|
+ return "referent-auth-" + f.Namespace.Name
|
|
|
+}
|
|
|
+
|
|
|
func (s *azureProvider) CreateSecretStoreWithWI() {
|
|
|
authType := esv1beta1.AzureWorkloadIdentity
|
|
|
namespace := "external-secrets-operator"
|
|
|
@@ -233,15 +288,23 @@ func (s *azureProvider) CreateSecretStoreWithWI() {
|
|
|
},
|
|
|
Spec: esv1beta1.SecretStoreSpec{
|
|
|
Provider: &esv1beta1.SecretStoreProvider{
|
|
|
- AzureKV: &esv1beta1.AzureKVProvider{
|
|
|
- TenantID: &s.tenantID,
|
|
|
- VaultURL: &s.vaultURL,
|
|
|
- AuthType: &authType,
|
|
|
- ServiceAccountRef: &esmeta.ServiceAccountSelector{
|
|
|
- Name: "external-secrets-operator",
|
|
|
- Namespace: &namespace,
|
|
|
- },
|
|
|
- },
|
|
|
+ AzureKV: newProviderWithServiceAccount(s.tenantID, s.vaultURL, authType, workloadIdentityServiceAccountNme, &namespace),
|
|
|
+ },
|
|
|
+ },
|
|
|
+ }
|
|
|
+ err := s.framework.CRClient.Create(context.Background(), ClusterSecretStore)
|
|
|
+ Expect(err).ToNot(HaveOccurred())
|
|
|
+}
|
|
|
+
|
|
|
+func (s *azureProvider) CreateReferentSecretStoreWithWI() {
|
|
|
+ authType := esv1beta1.AzureWorkloadIdentity
|
|
|
+ ClusterSecretStore := &esv1beta1.ClusterSecretStore{
|
|
|
+ ObjectMeta: metav1.ObjectMeta{
|
|
|
+ Name: referentAuthName(s.framework),
|
|
|
+ },
|
|
|
+ Spec: esv1beta1.SecretStoreSpec{
|
|
|
+ Provider: &esv1beta1.SecretStoreProvider{
|
|
|
+ AzureKV: newProviderWithServiceAccount(s.tenantID, s.vaultURL, authType, workloadIdentityServiceAccountNme, nil),
|
|
|
},
|
|
|
},
|
|
|
}
|