|
@@ -36,11 +36,15 @@ import (
|
|
|
|
|
|
|
|
type vaultProvider struct {
|
|
type vaultProvider struct {
|
|
|
url string
|
|
url string
|
|
|
|
|
+ mtlsUrl string
|
|
|
client *vault.Client
|
|
client *vault.Client
|
|
|
framework *framework.Framework
|
|
framework *framework.Framework
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
+type StoreCustomizer = func(provider *vaultProvider, secret *v1.Secret, secretStore *metav1.ObjectMeta, secretStoreSpec *esv1beta1.SecretStoreSpec, isClusterStore bool)
|
|
|
|
|
+
|
|
|
const (
|
|
const (
|
|
|
|
|
+ clientTlsCertName = "vault-client-tls"
|
|
|
certAuthProviderName = "cert-auth-provider"
|
|
certAuthProviderName = "cert-auth-provider"
|
|
|
appRoleAuthProviderName = "app-role-provider"
|
|
appRoleAuthProviderName = "app-role-provider"
|
|
|
kvv1ProviderName = "kv-v1-provider"
|
|
kvv1ProviderName = "kv-v1-provider"
|
|
@@ -53,7 +57,9 @@ const (
|
|
|
)
|
|
)
|
|
|
|
|
|
|
|
var (
|
|
var (
|
|
|
- secretStorePath = "secret"
|
|
|
|
|
|
|
+ secretStorePath = "secret"
|
|
|
|
|
+ mtlsSuffix = "-mtls"
|
|
|
|
|
+ invalidMtlSuffix = "-invalid-mtls"
|
|
|
)
|
|
)
|
|
|
|
|
|
|
|
func newVaultProvider(f *framework.Framework) *vaultProvider {
|
|
func newVaultProvider(f *framework.Framework) *vaultProvider {
|
|
@@ -61,6 +67,7 @@ func newVaultProvider(f *framework.Framework) *vaultProvider {
|
|
|
framework: f,
|
|
framework: f,
|
|
|
}
|
|
}
|
|
|
BeforeEach(prov.BeforeEach)
|
|
BeforeEach(prov.BeforeEach)
|
|
|
|
|
+ AfterEach(prov.AfterEach)
|
|
|
return prov
|
|
return prov
|
|
|
}
|
|
}
|
|
|
|
|
|
|
@@ -93,7 +100,33 @@ func (s *vaultProvider) BeforeEach() {
|
|
|
s.framework.Install(v)
|
|
s.framework.Install(v)
|
|
|
s.client = v.VaultClient
|
|
s.client = v.VaultClient
|
|
|
s.url = v.VaultURL
|
|
s.url = v.VaultURL
|
|
|
|
|
+ s.mtlsUrl = v.VaultMtlsURL
|
|
|
|
|
+
|
|
|
|
|
+ mtlsCustomizer := func(provider *vaultProvider, secret *v1.Secret, secretStore *metav1.ObjectMeta, secretStoreSpec *esv1beta1.SecretStoreSpec, isClusterStore bool) {
|
|
|
|
|
+ secret.Name = secret.Name + mtlsSuffix
|
|
|
|
|
+ secretStore.Name = secretStore.Name + mtlsSuffix
|
|
|
|
|
+ secretStoreSpec.Provider.Vault.Server = provider.mtlsUrl
|
|
|
|
|
+ secretStoreSpec.Provider.Vault.ClientTLS = esv1beta1.VaultClientTLS{
|
|
|
|
|
+ CertSecretRef: &esmeta.SecretKeySelector{
|
|
|
|
|
+ Name: clientTlsCertName,
|
|
|
|
|
+ },
|
|
|
|
|
+ KeySecretRef: &esmeta.SecretKeySelector{
|
|
|
|
|
+ Name: clientTlsCertName,
|
|
|
|
|
+ },
|
|
|
|
|
+ }
|
|
|
|
|
+ if isClusterStore {
|
|
|
|
|
+ secretStoreSpec.Provider.Vault.ClientTLS.CertSecretRef.Namespace = &provider.framework.Namespace.Name
|
|
|
|
|
+ secretStoreSpec.Provider.Vault.ClientTLS.KeySecretRef.Namespace = &provider.framework.Namespace.Name
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
|
|
|
|
|
+ invalidMtlsCustomizer := func(provider *vaultProvider, secret *v1.Secret, secretStore *metav1.ObjectMeta, secretStoreSpec *esv1beta1.SecretStoreSpec, isClusterStore bool) {
|
|
|
|
|
+ secret.Name = secret.Name + invalidMtlSuffix
|
|
|
|
|
+ secretStore.Name = secretStore.Name + invalidMtlSuffix
|
|
|
|
|
+ secretStoreSpec.Provider.Vault.Server = provider.mtlsUrl
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ s.CreateClientTlsCert(v, ns)
|
|
|
s.CreateCertStore(v, ns)
|
|
s.CreateCertStore(v, ns)
|
|
|
s.CreateTokenStore(v, ns)
|
|
s.CreateTokenStore(v, ns)
|
|
|
s.CreateAppRoleStore(v, ns)
|
|
s.CreateAppRoleStore(v, ns)
|
|
@@ -102,6 +135,14 @@ func (s *vaultProvider) BeforeEach() {
|
|
|
s.CreateJWTK8sStore(v, ns)
|
|
s.CreateJWTK8sStore(v, ns)
|
|
|
s.CreateKubernetesAuthStore(v, ns)
|
|
s.CreateKubernetesAuthStore(v, ns)
|
|
|
s.CreateReferentTokenStore(v, ns)
|
|
s.CreateReferentTokenStore(v, ns)
|
|
|
|
|
+ s.CreateTokenStore(v, ns, mtlsCustomizer)
|
|
|
|
|
+ s.CreateReferentTokenStore(v, ns, mtlsCustomizer)
|
|
|
|
|
+ s.CreateTokenStore(v, ns, invalidMtlsCustomizer)
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+func (s *vaultProvider) AfterEach() {
|
|
|
|
|
+ s.DeleteClusterSecretStore(referentSecretStoreName(s.framework))
|
|
|
|
|
+ s.DeleteClusterSecretStore(referentSecretStoreName(s.framework) + mtlsSuffix)
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
func makeStore(name, ns string, v *addon.Vault) *esv1beta1.SecretStore {
|
|
func makeStore(name, ns string, v *addon.Vault) *esv1beta1.SecretStore {
|
|
@@ -131,6 +172,24 @@ func makeClusterStore(name, ns string, v *addon.Vault) *esv1beta1.ClusterSecretS
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
+func (s *vaultProvider) CreateClientTlsCert(v *addon.Vault, ns string) {
|
|
|
|
|
+ By("creating a secret containing the Vault TLS client certificate")
|
|
|
|
|
+ clientCert := v.ClientCert
|
|
|
|
|
+ clientKey := v.ClientKey
|
|
|
|
|
+ vaultClientCert := &v1.Secret{
|
|
|
|
|
+ ObjectMeta: metav1.ObjectMeta{
|
|
|
|
|
+ Name: clientTlsCertName,
|
|
|
|
|
+ Namespace: ns,
|
|
|
|
|
+ },
|
|
|
|
|
+ Data: map[string][]byte{
|
|
|
|
|
+ "tls.crt": clientCert,
|
|
|
|
|
+ "tls.key": clientKey,
|
|
|
|
|
+ },
|
|
|
|
|
+ }
|
|
|
|
|
+ err := s.framework.CRClient.Create(context.Background(), vaultClientCert)
|
|
|
|
|
+ Expect(err).ToNot(HaveOccurred())
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
func (s *vaultProvider) CreateCertStore(v *addon.Vault, ns string) {
|
|
func (s *vaultProvider) CreateCertStore(v *addon.Vault, ns string) {
|
|
|
By("creating a vault secret")
|
|
By("creating a vault secret")
|
|
|
clientCert := v.ClientCert
|
|
clientCert := v.ClientCert
|
|
@@ -167,7 +226,7 @@ func (s *vaultProvider) CreateCertStore(v *addon.Vault, ns string) {
|
|
|
Expect(err).ToNot(HaveOccurred())
|
|
Expect(err).ToNot(HaveOccurred())
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
-func (s vaultProvider) CreateTokenStore(v *addon.Vault, ns string) {
|
|
|
|
|
|
|
+func (s vaultProvider) CreateTokenStore(v *addon.Vault, ns string, customizers ...StoreCustomizer) {
|
|
|
vaultCreds := &v1.Secret{
|
|
vaultCreds := &v1.Secret{
|
|
|
ObjectMeta: metav1.ObjectMeta{
|
|
ObjectMeta: metav1.ObjectMeta{
|
|
|
Name: "token-provider",
|
|
Name: "token-provider",
|
|
@@ -177,15 +236,20 @@ func (s vaultProvider) CreateTokenStore(v *addon.Vault, ns string) {
|
|
|
"token": []byte(v.RootToken),
|
|
"token": []byte(v.RootToken),
|
|
|
},
|
|
},
|
|
|
}
|
|
}
|
|
|
- err := s.framework.CRClient.Create(context.Background(), vaultCreds)
|
|
|
|
|
- Expect(err).ToNot(HaveOccurred())
|
|
|
|
|
secretStore := makeStore(s.framework.Namespace.Name, ns, v)
|
|
secretStore := makeStore(s.framework.Namespace.Name, ns, v)
|
|
|
secretStore.Spec.Provider.Vault.Auth = esv1beta1.VaultAuth{
|
|
secretStore.Spec.Provider.Vault.Auth = esv1beta1.VaultAuth{
|
|
|
TokenSecretRef: &esmeta.SecretKeySelector{
|
|
TokenSecretRef: &esmeta.SecretKeySelector{
|
|
|
- Name: "token-provider",
|
|
|
|
|
|
|
+ Name: vaultCreds.Name,
|
|
|
Key: "token",
|
|
Key: "token",
|
|
|
},
|
|
},
|
|
|
}
|
|
}
|
|
|
|
|
+ for _, customizer := range customizers {
|
|
|
|
|
+ customizer(&s, vaultCreds, &secretStore.ObjectMeta, &secretStore.Spec, false)
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ secretStore.Spec.Provider.Vault.Auth.TokenSecretRef.Name = vaultCreds.Name
|
|
|
|
|
+ err := s.framework.CRClient.Create(context.Background(), vaultCreds)
|
|
|
|
|
+ Expect(err).ToNot(HaveOccurred())
|
|
|
err = s.framework.CRClient.Create(context.Background(), secretStore)
|
|
err = s.framework.CRClient.Create(context.Background(), secretStore)
|
|
|
Expect(err).ToNot(HaveOccurred())
|
|
Expect(err).ToNot(HaveOccurred())
|
|
|
}
|
|
}
|
|
@@ -193,7 +257,7 @@ func (s vaultProvider) CreateTokenStore(v *addon.Vault, ns string) {
|
|
|
// CreateReferentTokenStore creates a secret in the ExternalSecrets
|
|
// CreateReferentTokenStore creates a secret in the ExternalSecrets
|
|
|
// namespace and creates a ClusterSecretStore with an empty namespace
|
|
// namespace and creates a ClusterSecretStore with an empty namespace
|
|
|
// that can be used to test the referent namespace feature.
|
|
// that can be used to test the referent namespace feature.
|
|
|
-func (s vaultProvider) CreateReferentTokenStore(v *addon.Vault, ns string) {
|
|
|
|
|
|
|
+func (s vaultProvider) CreateReferentTokenStore(v *addon.Vault, ns string, customizers ...StoreCustomizer) {
|
|
|
referentSecret := &v1.Secret{
|
|
referentSecret := &v1.Secret{
|
|
|
ObjectMeta: metav1.ObjectMeta{
|
|
ObjectMeta: metav1.ObjectMeta{
|
|
|
Name: referentSecretName,
|
|
Name: referentSecretName,
|
|
@@ -203,20 +267,33 @@ func (s vaultProvider) CreateReferentTokenStore(v *addon.Vault, ns string) {
|
|
|
referentKey: []byte(v.RootToken),
|
|
referentKey: []byte(v.RootToken),
|
|
|
},
|
|
},
|
|
|
}
|
|
}
|
|
|
- _, err := s.framework.KubeClientSet.CoreV1().Secrets(s.framework.Namespace.Name).Create(context.Background(), referentSecret, metav1.CreateOptions{})
|
|
|
|
|
- Expect(err).ToNot(HaveOccurred())
|
|
|
|
|
-
|
|
|
|
|
secretStore := makeClusterStore(referentSecretStoreName(s.framework), ns, v)
|
|
secretStore := makeClusterStore(referentSecretStoreName(s.framework), ns, v)
|
|
|
secretStore.Spec.Provider.Vault.Auth = esv1beta1.VaultAuth{
|
|
secretStore.Spec.Provider.Vault.Auth = esv1beta1.VaultAuth{
|
|
|
TokenSecretRef: &esmeta.SecretKeySelector{
|
|
TokenSecretRef: &esmeta.SecretKeySelector{
|
|
|
- Name: referentSecretName,
|
|
|
|
|
|
|
+ Name: referentSecret.Name,
|
|
|
Key: referentKey,
|
|
Key: referentKey,
|
|
|
},
|
|
},
|
|
|
}
|
|
}
|
|
|
|
|
+ for _, customizer := range customizers {
|
|
|
|
|
+ customizer(&s, referentSecret, &secretStore.ObjectMeta, &secretStore.Spec, true)
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ secretStore.Spec.Provider.Vault.Auth.TokenSecretRef.Name = referentSecret.Name
|
|
|
|
|
+ _, err := s.framework.KubeClientSet.CoreV1().Secrets(s.framework.Namespace.Name).Create(context.Background(), referentSecret, metav1.CreateOptions{})
|
|
|
|
|
+ Expect(err).ToNot(HaveOccurred())
|
|
|
err = s.framework.CRClient.Create(context.Background(), secretStore)
|
|
err = s.framework.CRClient.Create(context.Background(), secretStore)
|
|
|
Expect(err).ToNot(HaveOccurred())
|
|
Expect(err).ToNot(HaveOccurred())
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
+func (s *vaultProvider) DeleteClusterSecretStore(name string) {
|
|
|
|
|
+ err := s.framework.CRClient.Delete(context.Background(), &esv1beta1.ClusterSecretStore{
|
|
|
|
|
+ ObjectMeta: metav1.ObjectMeta{
|
|
|
|
|
+ Name: name,
|
|
|
|
|
+ },
|
|
|
|
|
+ })
|
|
|
|
|
+ Expect(err).ToNot(HaveOccurred())
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
func (s vaultProvider) CreateAppRoleStore(v *addon.Vault, ns string) {
|
|
func (s vaultProvider) CreateAppRoleStore(v *addon.Vault, ns string) {
|
|
|
By("creating a vault secret")
|
|
By("creating a vault secret")
|
|
|
vaultCreds := &v1.Secret{
|
|
vaultCreds := &v1.Secret{
|