|
|
@@ -115,37 +115,43 @@ func (c *Client) PushSecret(ctx context.Context, secret *v1.Secret, data esv1.Pu
|
|
|
if data.GetProperty() == "" && data.GetSecretKey() != "" {
|
|
|
return errors.New("requires property in RemoteRef to push secret value if secret key is defined")
|
|
|
}
|
|
|
+
|
|
|
+ targetNamespace := c.store.RemoteNamespace
|
|
|
+ pushMeta, err := metadata.ParseMetadataParameters[PushSecretMetadataSpec](data.GetMetadata())
|
|
|
+ if err != nil {
|
|
|
+ return fmt.Errorf("unable to parse metadata parameters: %w", err)
|
|
|
+ }
|
|
|
+ if pushMeta != nil && pushMeta.Spec.RemoteNamespace != "" {
|
|
|
+ if c.storeKind != esv1.ClusterSecretStoreKind {
|
|
|
+ return fmt.Errorf("remoteNamespace override is only supported with ClusterSecretStore")
|
|
|
+ }
|
|
|
+ targetNamespace = pushMeta.Spec.RemoteNamespace
|
|
|
+ }
|
|
|
+
|
|
|
+ secretClient := c.secretsClientFor(targetNamespace)
|
|
|
remoteSecret := &v1.Secret{
|
|
|
ObjectMeta: metav1.ObjectMeta{
|
|
|
- Namespace: c.store.RemoteNamespace,
|
|
|
+ Namespace: targetNamespace,
|
|
|
Name: data.GetRemoteKey(),
|
|
|
},
|
|
|
}
|
|
|
|
|
|
- return c.createOrUpdate(ctx, remoteSecret, func() error {
|
|
|
- return c.mergePushSecretData(data, remoteSecret, secret)
|
|
|
+ return c.createOrUpdate(ctx, secretClient, remoteSecret, func() error {
|
|
|
+ return c.mergePushSecretData(data, pushMeta, remoteSecret, secret)
|
|
|
})
|
|
|
}
|
|
|
|
|
|
-func (c *Client) mergePushSecretData(remoteRef esv1.PushSecretData, remoteSecret, localSecret *v1.Secret) error {
|
|
|
- // apply secret type
|
|
|
+func (c *Client) mergePushSecretData(remoteRef esv1.PushSecretData, pushMeta *metadata.PushSecretMetadata[PushSecretMetadataSpec], remoteSecret, localSecret *v1.Secret) error {
|
|
|
secretType := v1.SecretTypeOpaque
|
|
|
if localSecret.Type != "" {
|
|
|
secretType = localSecret.Type
|
|
|
}
|
|
|
remoteSecret.Type = secretType
|
|
|
|
|
|
- // merge secret data with existing secret data
|
|
|
if remoteSecret.Data == nil {
|
|
|
remoteSecret.Data = make(map[string][]byte)
|
|
|
}
|
|
|
|
|
|
- pushMeta, err := metadata.ParseMetadataParameters[PushSecretMetadataSpec](remoteRef.GetMetadata())
|
|
|
- if err != nil {
|
|
|
- return fmt.Errorf("unable to parse metadata parameters: %w", err)
|
|
|
- }
|
|
|
-
|
|
|
- // merge metadata based on the policy
|
|
|
var targetLabels, targetAnnotations map[string]string
|
|
|
sourceLabels, sourceAnnotations, err := mergeSourceMetadata(localSecret, pushMeta)
|
|
|
if err != nil {
|
|
|
@@ -157,9 +163,6 @@ func (c *Client) mergePushSecretData(remoteRef esv1.PushSecretData, remoteSecret
|
|
|
}
|
|
|
remoteSecret.ObjectMeta.Labels = targetLabels
|
|
|
remoteSecret.ObjectMeta.Annotations = targetAnnotations
|
|
|
- if pushMeta != nil && pushMeta.Spec.RemoteNamespace != "" {
|
|
|
- remoteSecret.ObjectMeta.Namespace = pushMeta.Spec.RemoteNamespace
|
|
|
- }
|
|
|
|
|
|
// case 1: push the whole secret
|
|
|
if remoteRef.GetProperty() == "" {
|
|
|
@@ -185,8 +188,8 @@ func (c *Client) mergePushSecretData(remoteRef esv1.PushSecretData, remoteSecret
|
|
|
return nil
|
|
|
}
|
|
|
|
|
|
-func (c *Client) createOrUpdate(ctx context.Context, targetSecret *v1.Secret, f func() error) error {
|
|
|
- target, err := c.userSecretClient.Get(ctx, targetSecret.Name, metav1.GetOptions{})
|
|
|
+func (c *Client) createOrUpdate(ctx context.Context, secretClient KClient, targetSecret *v1.Secret, f func() error) error {
|
|
|
+ target, err := secretClient.Get(ctx, targetSecret.Name, metav1.GetOptions{})
|
|
|
metrics.ObserveAPICall(constants.ProviderKubernetes, constants.CallKubernetesGetSecret, err)
|
|
|
if err != nil {
|
|
|
if !apierrors.IsNotFound(err) {
|
|
|
@@ -195,7 +198,7 @@ func (c *Client) createOrUpdate(ctx context.Context, targetSecret *v1.Secret, f
|
|
|
if err := f(); err != nil {
|
|
|
return err
|
|
|
}
|
|
|
- _, err := c.userSecretClient.Create(ctx, targetSecret, metav1.CreateOptions{})
|
|
|
+ _, err := secretClient.Create(ctx, targetSecret, metav1.CreateOptions{})
|
|
|
metrics.ObserveAPICall(constants.ProviderKubernetes, constants.CallKubernetesCreateSecret, err)
|
|
|
if err != nil {
|
|
|
return err
|
|
|
@@ -213,7 +216,7 @@ func (c *Client) createOrUpdate(ctx context.Context, targetSecret *v1.Secret, f
|
|
|
return nil
|
|
|
}
|
|
|
|
|
|
- _, err = c.userSecretClient.Update(ctx, targetSecret, metav1.UpdateOptions{})
|
|
|
+ _, err = secretClient.Update(ctx, targetSecret, metav1.UpdateOptions{})
|
|
|
metrics.ObserveAPICall(constants.ProviderKubernetes, constants.CallKubernetesUpdateSecret, err)
|
|
|
if err != nil {
|
|
|
return err
|