-
Notifications
You must be signed in to change notification settings - Fork 520
ESO-101: Revisits and restructures external-secrets-operator APIs for GA #1835
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
base: master
Are you sure you want to change the base?
Conversation
@bharath-b-rh: This pull request references ESO-101 which is a valid jira issue. Warning: The referenced jira issue has an invalid target version for the target branch this PR targets: expected the story to target the "4.20.0" version, but no target version was set. In response to this:
Instructions for interacting with me using PR comments are available here. If you have questions or suggestions related to my behavior, please file an issue against the openshift-eng/jira-lifecycle-plugin repository. |
enhancements/external-secrets-operator/external-secrets-operator.md
Outdated
Show resolved
Hide resolved
enhancements/external-secrets-operator/external-secrets-operator.md
Outdated
Show resolved
Hide resolved
// lastTransitionTime is the last time the condition transitioned from one status to another. | ||
// +kubebuilder:validation:Type=string | ||
// +kubebuilder:validation:Format=date-time | ||
LastTransitionTime metav1.Time `json:"lastTransitionTime,omitempty"` |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Is the timestamp better to be with in the ControllerStatus (or actually within the "Condition") to ensure that user knows which controller status was last modified, and when.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Yeah, but I feel, it indicating the last time status was updated irrespective of the condition it changed would be helpful. WDYT?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
OK, so here we would assume the user would look at the overall status on the "ExternalSecretsManager" through the ConditionStatus, and if need be, can go to "ExternalSecretsConfig" (the only controller as of now), to check the metav1.Condition
In future, if there is one more controller, the user checks the status on ExternalSecretsManager, but cannot distinguish which of the controllers status changed last right away.
However, it can be checked on individual Controllers' CR.
i am OK with either approach, as the information exists on controller's CR.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Yeah, also the status contains the ObservedGeneration, and we can capture time present in Controller CR, here too.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
last time status was updated irrespective of the condition it changed
For a SRE, to identify which controller updated recently, the first-level information would rely on the ControllerStatus which should contain the time. It'd be of a great value while understanding the controller status information.
status contains the ObservedGeneration
The observedGeneration is best to debug where a controller was able to process the CR updates (spec changes) and the status of that specfic CR reflects the recent information. This is quite an interesting solution that enables better debugging.
It is better to elaborate the usecases that can give better insights on why the changes are being proposed.
enhancements/external-secrets-operator/external-secrets-operator.md
Outdated
Show resolved
Hide resolved
enhancements/external-secrets-operator/external-secrets-operator.md
Outdated
Show resolved
Hide resolved
enhancements/external-secrets-operator/external-secrets-operator.md
Outdated
Show resolved
Hide resolved
8f0e7cc
to
5820c6b
Compare
/lgtm |
@bharath-b-rh: This pull request references ESO-101 which is a valid jira issue. Warning: The referenced jira issue has an invalid target version for the target branch this PR targets: expected the story to target the "4.21.0" version, but no target version was set. In response to this:
Instructions for interacting with me using PR comments are available here. If you have questions or suggestions related to my behavior, please file an issue against the openshift-eng/jira-lifecycle-plugin repository. |
@CodeRabbit review |
Signed-off-by: Bharath B <[email protected]>
5820c6b
to
3f959d2
Compare
type ProxyConfig struct { | ||
// httpProxy is the URL of the proxy for HTTP requests. | ||
// +kubebuilder:validation:MinLength:=0 | ||
// +kubebuilder:validation:MaxLength:=2048 | ||
// +kubebuilder:validation:Optional | ||
HTTPProxy string `json:"httpProxy,omitempty"` | ||
|
||
// httpsProxy is the URL of the proxy for HTTPS requests. | ||
// +kubebuilder:validation:MinLength:=0 | ||
// +kubebuilder:validation:MaxLength:=2048 | ||
// +kubebuilder:validation:Optional | ||
HTTPSProxy string `json:"httpsProxy,omitempty"` | ||
|
||
// noProxy is a comma-separated list of hostnames and/or CIDRs and/or IPs for which the proxy should not be used. | ||
// +kubebuilder:validation:MinLength:=0 | ||
// +kubebuilder:validation:MaxLength:=4096 | ||
// +kubebuilder:validation:Optional | ||
NoProxy string `json:"noProxy,omitempty"` | ||
} |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I feel 2048
for http_proxy
, https_proxy
and 4096
for noProxy
are too high, we can allow 512
and 2048
respectively.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Will external-secrets have outgoing traffic to any of the services other than apiserver, and the bitwarden provider within the cluster?
This is where the NoProxy will come in to play right?
If we have analysis on that, maybe we can reduce the size.
But i wonder why the Max value is not specified on the cluster level settings
i feel even if we specify Max limits, its better to be on the higher side.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Yeah, that's correct. We also have Vault, CyberArk Conjur, 1Password ... providers which all provide kubernetes native solution.
But i wonder why the Max value is not specified on the cluster level settings
The ask All strings should set a minimum and maximum length
is being suggested from recently, and I think hence cluster proxy might have not set it.
// enabled indicates whether the feature is active. | ||
// +kubebuilder:validation:Enum:="true";"false" | ||
// +kubebuilder:validation:Required | ||
Enabled string `json:"enabled,omitempty"` |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Both Name, and Enabled are required. But only Enabled has omitempty marshalling. Why is that so?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I have missed it, let me update it.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
suggestion incorporated.
enhancements/external-secrets-operator/external-secrets-operator.md
Outdated
Show resolved
Hide resolved
// +patchStrategy=merge | ||
// +listType=map | ||
// +listMapKey=name | ||
ControllerStatuses []ControllerStatus `json:"controllerStatuses,omitempty"` |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
When all of the status is already on the ExternalSecretsConfig CR, why do we want to duplicate a part of it here?
Would like to understand the specific use case or ask behind this status mirroring.
The purpose of this CR is:
externalsecretsmanager.operator.openshift.io is another CR object, which is made available for configuring global options and to enable optional or TechPreview features.
So the main use case is for the individual controllers (as of now, ExternalSecretsConfig) to watch this CR and update the common config.
So, i am wondering do we even need a controller specifically for this (externalsecretsmanager) CR?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Currently operator just has one operand, the externalsecretsmanager
itself was introduced for extensibility when new operands are introduced to act as a centralized config and provide a overview of the operands being managed. And for the same reason a subset of condition fields from each operand CR is listed here.
ExternalSecretsImage string `json:"externalSecretsImage,omitempty"` | ||
|
||
// BitwardenSDKServerImage is the name of the image and the tag used for deploying bitwarden-sdk-server. | ||
BitwardenSDKServerImage string `json:"bitwardenSDKServerImage,omitempty"` |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Are we going to store the actual image by reading the deployment, or are we updating the environment variable?
If we are updating the environment variable, i think we should document it because its not a typical status as the user would expect. (For example, there can be confusion if for some reason the actual image is updated out side of operator's controller, but the ExternalSecretsImage consistently shows the ENV_VAR as the image. As opposed to showing the actual image in deployment while the operator reconciles it)
We have documented this But i think we can word it better to be explicit that its not really a status.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Status indicates which image is used for the particular deployment. This will be available as ENV var in the operator, and the same will be used to update the respective component's deployment spec. Should the ENV var be updated, the status will also be updated with the new image name.
} | ||
|
||
// ObjectReference is a reference to an object with a given name, kind and group. | ||
type ObjectReference struct { |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
What's the motivation to not use the type certmanagerv1.ObjectReference and recreate it here?
To specify the MaxLengths or?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Yeah, that and for the CEL validations, which is now set on IssuerRef
field.
// ref: https://kubernetes.io/docs/concepts/scheduling-eviction/taint-and-toleration/ | ||
// +listType=atomic | ||
// +kubebuilder:validation:MinItems:=0 | ||
// +kubebuilder:validation:MaxItems:=10 |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
i am not sure as how many taints production clusters may have.
@TrilokGeer any idea if 10 will be sufficient?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
The number is quite tricky to derive, for example, worst-case, considering the k8s list https://kubernetes.io/docs/concepts/scheduling-eviction/taint-and-toleration/ and the openshift list (3), it hits the maximum of 10. Please note, there is consideration whether a taint can be considered for toleration as it is an approximation. Any update to this value would require a new z release.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Post a bit of search of differnt type of special hardware nodes available in the kubernetes ecosystem, and comparative analysis of managed providers, 50 seems to be better deterministic value. There is still a catch related to size, where etcd will fail the request if the size exceeds 1.5MB.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
suggestion incorporated.
type ProxyConfig struct { | ||
// httpProxy is the URL of the proxy for HTTP requests. | ||
// +kubebuilder:validation:MinLength:=0 | ||
// +kubebuilder:validation:MaxLength:=2048 | ||
// +kubebuilder:validation:Optional | ||
HTTPProxy string `json:"httpProxy,omitempty"` | ||
|
||
// httpsProxy is the URL of the proxy for HTTPS requests. | ||
// +kubebuilder:validation:MinLength:=0 | ||
// +kubebuilder:validation:MaxLength:=2048 | ||
// +kubebuilder:validation:Optional | ||
HTTPSProxy string `json:"httpsProxy,omitempty"` | ||
|
||
// noProxy is a comma-separated list of hostnames and/or CIDRs and/or IPs for which the proxy should not be used. | ||
// +kubebuilder:validation:MinLength:=0 | ||
// +kubebuilder:validation:MaxLength:=4096 | ||
// +kubebuilder:validation:Optional | ||
NoProxy string `json:"noProxy,omitempty"` | ||
} |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Will external-secrets have outgoing traffic to any of the services other than apiserver, and the bitwarden provider within the cluster?
This is where the NoProxy will come in to play right?
If we have analysis on that, maybe we can reduce the size.
But i wonder why the Max value is not specified on the cluster level settings
i feel even if we specify Max limits, its better to be on the higher side.
- Enabling the `bitwarden secret manager` plugin is optional, and user can enable or disable it in `externalsecretsconfigs.operator.openshift.io`. | ||
Currently, when the feature is disabled, the following resources created for the plugin are not removed, requiring manual cleanup. | ||
- Certificates | ||
- Deployment | ||
- Service | ||
- ServiceAccount | ||
|
||
Cleanup will not cause any functionality degradation for services dependent on the secrets fetched from `bitwarden secret manager`, unless | ||
the secret value has been modified. The applications dependent on the fetched secrets can continue to consume it. The Kubernetes Secret | ||
resources containing the fetched values, or custom resources like SecretStore and ExternalSecrets, will not be deleted; users must | ||
manually clean those up. |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
i think we should prevent the cleanup of bitwarden resources or even better, its disabling in the ExternalSecretsConfig CR as long as there are SecretStore/ClusterSecretStore referring to the provider.
Or, there maybe chances of unexpected outages due to rotated secrets.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I think, it's good to delete the bitwarden resources if a user doesn't want to use the plugin and also from security standpoint where they want to restrict bitwarden usage. And when we have NetworkPolicy in place, and if they disallow bitwarden endpoint, having these bitwarden resources is of no use too. So if the user is disabling the bitwarden plugin, I think it's implicit oen should also cleanup the SecretStore and ExternalSecret using the plugin. We can document this. Please let me know WDYT
// +kubebuilder:validation:Optional | ||
Labels map[string]string `json:"labels,omitempty"` | ||
|
||
CommonConfigs `json:",inline,omitempty"` |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
what is the significance of the CommonConfigs when compared to the existing implementation? Is the intent to reduce code duplication?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Yeah, it's for reducing the code duplication.
type Feature struct { | ||
Name string `json:"name"` | ||
Enabled bool `json:"enabled"` | ||
// name of the optional feature. |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Can you please elaborate on the user stories that actually requires this change?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
We don't have any optional features currently, but this was added as place holder in TP proposal, when we introduce any new features.
// lastTransitionTime is the last time the condition transitioned from one status to another. | ||
// +kubebuilder:validation:Type=string | ||
// +kubebuilder:validation:Format=date-time | ||
LastTransitionTime metav1.Time `json:"lastTransitionTime,omitempty"` |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
last time status was updated irrespective of the condition it changed
For a SRE, to identify which controller updated recently, the first-level information would rely on the ControllerStatus which should contain the time. It'd be of a great value while understanding the controller status information.
status contains the ObservedGeneration
The observedGeneration is best to debug where a controller was able to process the CR updates (spec changes) and the status of that specfic CR reflects the recent information. This is quite an interesting solution that enables better debugging.
It is better to elaborate the usecases that can give better insights on why the changes are being proposed.
// +kubebuilder:validation:Optional | ||
// +mapType=atomic | ||
NodeSelector map[string]string `json:"nodeSelector,omitempty"` | ||
CommonConfigs `json:",inline,omitempty"` |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
nit: is it possible to rename the CommonConfigs
to a better categorization of config like Deployment
?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
If the concern is on the UX, CommonConfigs
will not be available as a field in CRD, it will be an inline expansion. Please let me know if it needs to be renamed.
// reference is not provided and CertManagerConfig is configured. The key names in secret for certificate | ||
// must be `tls.crt`, for private key must be `tls.key` and for CA certificate key name must be `ca.crt`. | ||
// +kubebuilder:validation:Optional | ||
SecretRef *SecretReference `json:"secretRef,omitempty"` |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
What'd be the behaviour if the secretReference is updated as a day2 operation? or is day2 operation allowed on this configuration?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Yeah, secret is required for the bitwarden plugin, which can be enabled day-2 and the secret too. And this secrets will be used in volumemount when deployment object is created for bitwarden.
Enabled string `json:"enabled,omitempty"` | ||
// +kubebuilder:default:="false" | ||
// +kubebuilder:validation:Required | ||
Enabled string `json:"enabled"` |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Can it be implied that the presence of the configuration enables this rather than an explicit enabled flag?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Yeah, but this could be also used to explicitly disable a feature which is enabled by default.
// ref: https://kubernetes.io/docs/concepts/scheduling-eviction/taint-and-toleration/ | ||
// +listType=atomic | ||
// +kubebuilder:validation:MinItems:=0 | ||
// +kubebuilder:validation:MaxItems:=10 |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
The number is quite tricky to derive, for example, worst-case, considering the k8s list https://kubernetes.io/docs/concepts/scheduling-eviction/taint-and-toleration/ and the openshift list (3), it hits the maximum of 10. Please note, there is consideration whether a taint can be considered for toleration as it is an approximation. Any update to this value would require a new z release.
// ref: https://kubernetes.io/docs/concepts/scheduling-eviction/taint-and-toleration/ | ||
// +listType=atomic | ||
// +kubebuilder:validation:MinItems:=0 | ||
// +kubebuilder:validation:MaxItems:=10 |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Post a bit of search of differnt type of special hardware nodes available in the kubernetes ecosystem, and comparative analysis of managed providers, 50 seems to be better deterministic value. There is still a catch related to size, where etcd will fail the request if the size exceeds 1.5MB.
/lgtm |
dd7ec12
to
f3ea8eb
Compare
/label tide/merge-method-squash |
`external-secrets` in `externalsecretsconfigs.operator.openshift.io`, or they can set common configurations for all operands managed by | ||
the operator in `externalsecretsmanager.operator.openshift.io`. | ||
|
||
For proxying HTTPS connections, CA certificates are required for validating the HTTPS proxy server. Operator will create a `ConfigMap` in |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
What should be the name of the ConfigMaps?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Any meaningful can be used like openshift-trusted-ca-bundle
, it's a implementation choice.
the operator in `externalsecretsmanager.operator.openshift.io`. | ||
|
||
For proxying HTTPS connections, CA certificates are required for validating the HTTPS proxy server. Operator will create a `ConfigMap` in | ||
its own and in operand's namespace with a label `config.openshift.io/inject-trusted-cabundle="true"` to leverage OpensShift offered |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
nit: Operator won't create the configmap in it's own namespace, rather OLM will do that.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Operator will create the configmap is the proposal at this line. And later it's indicated, OLM bundle can be used.
I will update this to remove operator creating ConfigMap for its own use.
trust bundle which will be made available in operator and operand pods through a volume mount. The CA certificate trust bundle must be made | ||
available at `/etc/pki/tls/certs` as [suggested](https://cs.opensource.google/go/go/+/refs/tags/go1.24.4:src/crypto/x509/root_linux.go;l=22) in golang. | ||
|
||
The `ConfigMap` and the `VolumeMount` configurations for the operator can be part of the OLM bundle manifests and for operand, operator |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
-
The OLM and the Operator will always create a blank configmap with the injection label and mount it in the containers, even when the proxy is not enabled, right?
-
Do OLM and Cluster Network Operator conflict while updating the same configmap?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Yes, as stated in the previous comment response.
trust bundle which will be made available in operator and operand pods through a volume mount. The CA certificate trust bundle must be made | ||
available at `/etc/pki/tls/certs` as [suggested](https://cs.opensource.google/go/go/+/refs/tags/go1.24.4:src/crypto/x509/root_linux.go;l=22) in golang. | ||
|
||
The `ConfigMap` and the `VolumeMount` configurations for the operator can be part of the OLM bundle manifests and for operand, operator |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Wondring if the Operator needs the VolumeMount (proxy settings) on its own? Or It just has to propagate the proxy settings and CA certificate down to its operand?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
It's good to have feature, where the trusted CA bundle can be used for verifying the metrics client too.
available at `/etc/pki/tls/certs` as [suggested](https://cs.opensource.google/go/go/+/refs/tags/go1.24.4:src/crypto/x509/root_linux.go;l=22) in golang. | ||
|
||
The `ConfigMap` and the `VolumeMount` configurations for the operator can be part of the OLM bundle manifests and for operand, operator | ||
must create and watch the `ConfigMap` in operand's namespace. |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I think the operator might not need to watch the ConfigMap
because the Volume will be updated as and when the ConfigMap updates. Moreover, the Operator should not reconcile the ConfigMap data; it should just create it (if not present in the operand namespace)
https://kubernetes.io/docs/concepts/storage/volumes/#configmap
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Operator should watch for the ConfigMap existence, not the content, because content is updated by the CNO, functionality of trusted-ca feature.
// httpProxy is the URL of the proxy for HTTP requests. | ||
// This field can have a maximum of 2048 characters. | ||
// +kubebuilder:validation:MinLength:=0 | ||
// +kubebuilder:validation:MaxLength:=2048 |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Just adding a note here that there is no length restriction in Clusterwide proxy config: https://github.com/openshift/api/blob/04f99ea228f5158f149fa2b99b53f3ac0f6274c6/config/v1/types_proxy.go#L37-L49
As discussed over on-call review, bitwarden sdk deployment can adopt a different structure as |
Signed-off-by: Bharath B <[email protected]>
Signed-off-by: Bharath B <[email protected]>
6e199f9
to
721b12b
Compare
/lgtm cc: @TrilokGeer Thanks for the in-call review yesterday. Summarizing the changes for your feedback. Discussed:
New:
We will consider the resource cleanup separately in a later EP. |
@bharath-b-rh: all tests passed! Full PR test history. Your PR dashboard. Instructions for interacting with me using PR comments are available here. If you have questions or suggestions related to my behavior, please file an issue against the kubernetes-sigs/prow repository. I understand the commands that are listed here. |
/approve |
[APPROVALNOTIFIER] This PR is NOT APPROVED This pull-request has been approved by: mytreya-rh The full list of commands accepted by this bot can be found here.
Needs approval from an approver in each of these files:
Approvers can indicate their approval by writing |
PR has following changes:
externalsecrets.operator.openshift.io
toexternalsecretsconfigs.operator.openshift.io
based on the user feedback. This improves the UX by removing the confusions with the upstream APIexternalsecrets.external-secrets.io
which has the same name.