I'm trying to use a ytt overlay to replace the objectName
in my secret class following this gist example replacing only part of a multi-line string, but it ends up appending a new item instead of replacing the existing one. How can I get it to work for this case?
Input Files
db_secret.yaml
kind: SecretProviderClass
metadata:
namespace: default
name: db_credentials
spec:
provider: aws
parameters:
objects: |
- objectName: TO_BE_REPLACED_BY_YTT
objectType: "secretsmanager"
jmesPath:
- path: username
objectAlias: dbusername
- path: password
objectAlias: dbpassword
overlay.yaml
#@ load("@ytt:overlay", "overlay")
#@ load("@ytt:yaml", "yaml")
#@ load("@ytt:data", "data")
#@ def updates():
- objectName: #@ data.values.db_secret_name
#@ end
#@overlay/match by=overlay.subset({"kind": "SecretProviderClass", "metadata": {"name": "db_credentials"}})
---
spec:
provider: aws
parameters:
#@overlay/replace via=lambda a,_: yaml.encode(overlay.apply(yaml.decode(a), updates()))
objects:
values-staging.yaml
db_secret_name: db-secret-staging
ytt output:
apiVersion: secrets-store.csi.x-k8s.io/v1alpha1
kind: SecretProviderClass
metadata:
namespace: default
name: db_credentials
spec:
provider: aws
parameters:
objects: |
- objectName: TO_BE_REPLACED_BY_YTT
objectType: secretsmanager
jmesPath:
- path: username
objectAlias: dbusername
- path: password
objectAlias: dbpassword
- objectName: db-secret-staging