Skip to content

Commit 045988c

Browse files
kaovilaiCopilot
andauthored
OADP-5973, OADP-3340, OADP-6212: AWS, GCP, Azure Standardized Flow Implementation (#1712)
* AWS, GCP, Azure Standardized Flow Secret Creation Signed-off-by: Tiger Kaovilai <[email protected]> Add make targets sts-flow testing Signed-off-by: Tiger Kaovilai <[email protected]> * Add BSL-specific patching for STS secrets - Label STS-created secrets with "oadp.openshift.io/secret-type": "sts-credentials" - Implement automatic region patching for AWS STS secrets from BSL configuration - Implement automatic resource group patching for Azure STS secrets from BSL configuration - Ensure only STS-created secrets are patched by checking for specific keys: - AWS: "credentials" key with role_arn and web_identity_token_file content - Azure: "azurekey" key with AZURE_CLIENT_ID but no AZURE_CLIENT_SECRET - Add comprehensive test coverage for all patching scenarios - Update documentation to reflect dynamic configuration capabilities This enhancement allows the first BSL to automatically configure region (AWS) or resource group (Azure) in STS secrets, eliminating manual configuration needs. * Fix STS secret updates to preserve BSL patches │ The BSL controller patches AWS secrets with region information by modifying the Data field directly, but the STS flow was completely replacing StringData which caused region patches to be overridden. This change preserves existing Data when updating STS secrets by only updating specific StringData fields rather than clearing all existing data. * Add Azure workload identity support for Velero deployment and service account annotation Signed-off-by: Tiger Kaovilai <[email protected]> * Add Azure workload identity support to Velero deployment and tests Signed-off-by: Tiger Kaovilai <[email protected]> * Refactor Azure workload identity implementation in Velero: comment out label and annotation handling, update environment variable checks in tests Signed-off-by: Tiger Kaovilai <[email protected]> * fmt Signed-off-by: Tiger Kaovilai <[email protected]> * Remove Azure workload identity label handling from Velero deployment and tests Signed-off-by: Tiger Kaovilai <[email protected]> * Remove commented-out Azure workload identity annotations and clean up related tests Signed-off-by: Tiger Kaovilai <[email protected]> * Add Azure workload identity environment variable support to NodeAgent DaemonSet and corresponding tests Signed-off-by: Tiger Kaovilai <[email protected]> * Implement Azure workload identity secret management in DataProtectionApplication reconciler Signed-off-by: Tiger Kaovilai <[email protected]> * Enhance Azure workload identity secret reconciliation by adding tenant ID handling and updating related tests Signed-off-by: Tiger Kaovilai <[email protected]> * Remove unnecessary blank line in noDefaultCredentials function Signed-off-by: Tiger Kaovilai <[email protected]> * Apply suggestion from @Copilot Co-authored-by: Copilot <[email protected]> * Update pkg/bucket/client.go Co-authored-by: Copilot <[email protected]> --------- Signed-off-by: Tiger Kaovilai <[email protected]> Co-authored-by: Copilot <[email protected]>
1 parent 2a7981c commit 045988c

20 files changed

+3335
-148
lines changed

Makefile

Lines changed: 156 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -462,7 +462,162 @@ deploy-olm: undeploy-olm ## Build current branch operator image, bundle image, p
462462
undeploy-olm: login-required operator-sdk ## Uninstall current branch operator via OLM
463463
$(OC_CLI) whoami # Check if logged in
464464
$(OC_CLI) create namespace $(OADP_TEST_NAMESPACE) || true
465-
$(OPERATOR_SDK) cleanup oadp-operator --namespace $(OADP_TEST_NAMESPACE)
465+
-$(OPERATOR_SDK) cleanup oadp-operator --namespace $(OADP_TEST_NAMESPACE) || true
466+
# Also try to clean up any leftover resources
467+
-$(OC_CLI) delete subscription oadp-operator -n $(OADP_TEST_NAMESPACE) --ignore-not-found=true
468+
-$(OC_CLI) get subscription -n $(OADP_TEST_NAMESPACE) -o name | xargs -I {} $(OC_CLI) get {} -n $(OADP_TEST_NAMESPACE) -o jsonpath='{.metadata.name}{"\t"}{.spec.source}{"\n"}' | grep "oadp-operator-catalog" | cut -f1 | xargs -I {} $(OC_CLI) delete subscription {} -n $(OADP_TEST_NAMESPACE) --ignore-not-found=true
469+
-$(OC_CLI) delete csv -l operators.coreos.com/oadp-operator.$(OADP_TEST_NAMESPACE) -n $(OADP_TEST_NAMESPACE) --ignore-not-found=true
470+
-$(OC_CLI) delete catalogsource oadp-operator-catalog -n $(OADP_TEST_NAMESPACE) --ignore-not-found=true
471+
472+
# Create subscription YAML helper function
473+
# Parameters:
474+
# $(1) - Path to the subscription YAML file to create (e.g., /tmp/oadp-gcp-subscription.yaml)
475+
create-sts-subscription = \
476+
echo "apiVersion: operators.coreos.com/v1alpha1" > $(1) && \
477+
echo "kind: Subscription" >> $(1) && \
478+
echo "metadata:" >> $(1) && \
479+
echo " name: oadp-operator" >> $(1) && \
480+
echo " namespace: $(OADP_TEST_NAMESPACE)" >> $(1) && \
481+
echo "spec:" >> $(1) && \
482+
echo " channel: operator-sdk-run-bundle" >> $(1) && \
483+
echo " name: oadp-operator" >> $(1) && \
484+
echo " source: oadp-operator-catalog" >> $(1) && \
485+
echo " sourceNamespace: $(OADP_TEST_NAMESPACE)" >> $(1) && \
486+
echo " installPlanApproval: Automatic" >> $(1) && \
487+
echo " config:" >> $(1) && \
488+
echo " env:" >> $(1)
489+
490+
# Apply subscription and wait for ready helper function
491+
# Parameters:
492+
# $(1) - Path to the subscription YAML file to apply (e.g., /tmp/oadp-gcp-subscription.yaml)
493+
# $(2) - Cloud provider descriptive name for status messages (e.g., "GCP WIF", "AWS STS", "Azure Workload Identity")
494+
apply-sts-subscription = \
495+
$(OC_CLI) apply -f $(1) && \
496+
rm -f $(1) && \
497+
echo "" && \
498+
echo "Subscription created with $(2) environment variables." && \
499+
echo "Waiting for operator to be ready..." && \
500+
echo "Waiting for InstallPlan to be created..." && \
501+
timeout=60; \
502+
while [ $$timeout -gt 0 ]; do \
503+
INSTALL_PLAN=$$($(OC_CLI) get subscription oadp-operator -n $(OADP_TEST_NAMESPACE) -o jsonpath='{.status.installPlanRef.name}' 2>/dev/null); \
504+
if [ -n "$$INSTALL_PLAN" ]; then \
505+
echo "InstallPlan $$INSTALL_PLAN found"; \
506+
break; \
507+
fi; \
508+
echo -n "."; \
509+
sleep 2; \
510+
timeout=$$((timeout-2)); \
511+
done; \
512+
if [ $$timeout -le 0 ]; then \
513+
echo "Timeout waiting for InstallPlan"; \
514+
exit 1; \
515+
fi; \
516+
echo "Waiting for CSV to exist..."; \
517+
timeout=120; \
518+
while [ $$timeout -gt 0 ]; do \
519+
CSV_NAME=$$($(OC_CLI) get subscription oadp-operator -n $(OADP_TEST_NAMESPACE) -o jsonpath='{.status.currentCSV}' 2>/dev/null); \
520+
if [ -n "$$CSV_NAME" ]; then \
521+
if $(OC_CLI) get csv/$$CSV_NAME -n $(OADP_TEST_NAMESPACE) >/dev/null 2>&1; then \
522+
echo "CSV $$CSV_NAME found"; \
523+
break; \
524+
fi; \
525+
fi; \
526+
echo -n "."; \
527+
sleep 2; \
528+
timeout=$$((timeout-2)); \
529+
done; \
530+
if [ $$timeout -le 0 ]; then \
531+
echo "Timeout waiting for CSV to exist"; \
532+
exit 1; \
533+
fi; \
534+
echo "Waiting for CSV to be ready..."; \
535+
if [ -n "$$CSV_NAME" ]; then \
536+
$(OC_CLI) wait --for=jsonpath='{.status.phase}'=Succeeded csv/$$CSV_NAME -n $(OADP_TEST_NAMESPACE) --timeout=300s; \
537+
fi; \
538+
echo "Operator is ready!"; \
539+
$(OC_CLI) get subscription oadp-operator -n $(OADP_TEST_NAMESPACE); \
540+
$(OC_CLI) get csv -n $(OADP_TEST_NAMESPACE)
541+
542+
.PHONY: deploy-olm-stsflow
543+
deploy-olm-stsflow: deploy-olm ## Deploy via OLM then uninstall CSV/Subscription and provide console URL for standardized flow
544+
@echo "Uninstalling CSV and Subscription to trigger standardized flow UI..."
545+
-$(OC_CLI) get subscription -n $(OADP_TEST_NAMESPACE) -o name | xargs -I {} $(OC_CLI) get {} -n $(OADP_TEST_NAMESPACE) -o jsonpath='{.metadata.name}{"\t"}{.spec.source}{"\n"}' | grep "oadp-operator-catalog" | cut -f1 | xargs -I {} $(OC_CLI) delete subscription {} -n $(OADP_TEST_NAMESPACE) --ignore-not-found=true
546+
-$(OC_CLI) delete csv oadp-operator.v$(VERSION) -n $(OADP_TEST_NAMESPACE) --ignore-not-found=true
547+
@echo ""
548+
@echo "==========================================================================="
549+
@echo "Open the following URL in your browser to trigger the standardized flow UI:"
550+
@echo ""
551+
@CONSOLE_URL=$$($(OC_CLI) get route console -n openshift-console -o jsonpath='{.spec.host}'); \
552+
echo "https://$$CONSOLE_URL/operatorhub/ns/$(OADP_TEST_NAMESPACE)?keyword=oadp-operator&details-item=oadp-operator-oadp-operator-catalog-$(OADP_TEST_NAMESPACE)&channel=operator-sdk-run-bundle&version=$(VERSION)"
553+
@echo ""
554+
@echo "==========================================================================="
555+
556+
.PHONY: deploy-olm-stsflow-gcp
557+
deploy-olm-stsflow-gcp: deploy-olm-stsflow ## Deploy via OLM with GCP WIF standardized flow and create subscription with GCP env vars
558+
@if [ -n "$(GCP_PROJECT_NUM)" ] && [ -n "$(GCP_POOL_ID)" ] && [ -n "$(GCP_PROVIDER_ID)" ] && [ -n "$(GCP_SA_EMAIL)" ]; then \
559+
echo "Creating subscription with GCP WIF environment variables..."; \
560+
$(call create-sts-subscription,/tmp/oadp-gcp-subscription.yaml); \
561+
echo " - name: PROJECT_NUMBER" >> /tmp/oadp-gcp-subscription.yaml; \
562+
echo " value: \"$(GCP_PROJECT_NUM)\"" >> /tmp/oadp-gcp-subscription.yaml; \
563+
echo " - name: POOL_ID" >> /tmp/oadp-gcp-subscription.yaml; \
564+
echo " value: \"$(GCP_POOL_ID)\"" >> /tmp/oadp-gcp-subscription.yaml; \
565+
echo " - name: PROVIDER_ID" >> /tmp/oadp-gcp-subscription.yaml; \
566+
echo " value: \"$(GCP_PROVIDER_ID)\"" >> /tmp/oadp-gcp-subscription.yaml; \
567+
echo " - name: SERVICE_ACCOUNT_EMAIL" >> /tmp/oadp-gcp-subscription.yaml; \
568+
echo " value: \"$(GCP_SA_EMAIL)\"" >> /tmp/oadp-gcp-subscription.yaml; \
569+
$(call apply-sts-subscription,/tmp/oadp-gcp-subscription.yaml,GCP WIF); \
570+
else \
571+
echo ""; \
572+
echo "GCP WIF environment variables not set. Please set all of the following:"; \
573+
echo " GCP_PROJECT_NUM"; \
574+
echo " GCP_POOL_ID"; \
575+
echo " GCP_PROVIDER_ID"; \
576+
echo " GCP_SA_EMAIL"; \
577+
echo ""; \
578+
echo "Example:"; \
579+
echo " make deploy-olm-stsflow-gcp GCP_PROJECT_NUM=123456789 GCP_POOL_ID=my-pool GCP_PROVIDER_ID=my-provider [email protected]"; \
580+
fi
581+
582+
.PHONY: deploy-olm-stsflow-aws
583+
deploy-olm-stsflow-aws: deploy-olm-stsflow ## Deploy via OLM with AWS STS standardized flow and create subscription with AWS env vars
584+
@if [ -n "$(AWS_ROLE_ARN)" ]; then \
585+
echo "Creating subscription with AWS STS environment variables..."; \
586+
$(call create-sts-subscription,/tmp/oadp-aws-subscription.yaml); \
587+
echo " - name: ROLEARN" >> /tmp/oadp-aws-subscription.yaml; \
588+
echo " value: \"$(AWS_ROLE_ARN)\"" >> /tmp/oadp-aws-subscription.yaml; \
589+
$(call apply-sts-subscription,/tmp/oadp-aws-subscription.yaml,AWS STS); \
590+
else \
591+
echo ""; \
592+
echo "AWS STS environment variable not set. Please set:"; \
593+
echo " AWS_ROLE_ARN"; \
594+
echo ""; \
595+
echo "Example:"; \
596+
echo " make deploy-olm-stsflow-aws AWS_ROLE_ARN=arn:aws:iam::123456789012:role/my-oadp-role"; \
597+
fi
598+
599+
.PHONY: deploy-olm-stsflow-azure
600+
deploy-olm-stsflow-azure: deploy-olm-stsflow ## Deploy via OLM with Azure Workload Identity standardized flow and create subscription with Azure env vars
601+
@if [ -n "$(AZURE_CLIENT_ID)" ] && [ -n "$(AZURE_TENANT_ID)" ] && [ -n "$(AZURE_SUBSCRIPTION_ID)" ]; then \
602+
echo "Creating subscription with Azure Workload Identity environment variables..."; \
603+
$(call create-sts-subscription,/tmp/oadp-azure-subscription.yaml); \
604+
echo " - name: CLIENTID" >> /tmp/oadp-azure-subscription.yaml; \
605+
echo " value: \"$(AZURE_CLIENT_ID)\"" >> /tmp/oadp-azure-subscription.yaml; \
606+
echo " - name: TENANTID" >> /tmp/oadp-azure-subscription.yaml; \
607+
echo " value: \"$(AZURE_TENANT_ID)\"" >> /tmp/oadp-azure-subscription.yaml; \
608+
echo " - name: SUBSCRIPTIONID" >> /tmp/oadp-azure-subscription.yaml; \
609+
echo " value: \"$(AZURE_SUBSCRIPTION_ID)\"" >> /tmp/oadp-azure-subscription.yaml; \
610+
$(call apply-sts-subscription,/tmp/oadp-azure-subscription.yaml,Azure Workload Identity); \
611+
else \
612+
echo ""; \
613+
echo "Azure Workload Identity environment variables not set. Please set all of the following:"; \
614+
echo " AZURE_CLIENT_ID"; \
615+
echo " AZURE_TENANT_ID"; \
616+
echo " AZURE_SUBSCRIPTION_ID"; \
617+
echo ""; \
618+
echo "Example:"; \
619+
echo " make deploy-olm-stsflow-azure AZURE_CLIENT_ID=12345678-1234-1234-1234-123456789012 AZURE_TENANT_ID=87654321-4321-4321-4321-210987654321 AZURE_SUBSCRIPTION_ID=abcdef12-3456-7890-abcd-ef1234567890"; \
620+
fi
466621

467622
# A valid Git branch from https://github.com/openshift/oadp-operator
468623
PREVIOUS_CHANNEL ?= oadp-1.5

bundle/manifests/oadp-operator.clusterserviceversion.yaml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -279,8 +279,8 @@ metadata:
279279
features.operators.openshift.io/proxy-aware: "true"
280280
features.operators.openshift.io/tls-profiles: "false"
281281
features.operators.openshift.io/token-auth-aws: "true"
282-
features.operators.openshift.io/token-auth-azure: "false"
283-
features.operators.openshift.io/token-auth-gcp: "false"
282+
features.operators.openshift.io/token-auth-azure: "true"
283+
features.operators.openshift.io/token-auth-gcp: "true"
284284
olm.skipRange: '>=0.0.0 <99.0.0'
285285
operatorframework.io/suggested-namespace: openshift-adp
286286
operators.openshift.io/infrastructure-features: '["Disconnected"]'

cmd/main.go

Lines changed: 9 additions & 109 deletions
Original file line numberDiff line numberDiff line change
@@ -31,10 +31,8 @@ import (
3131
monitor "github.com/prometheus-operator/prometheus-operator/pkg/apis/monitoring/v1"
3232
velerov1 "github.com/vmware-tanzu/velero/pkg/apis/velero/v1"
3333
appsv1 "k8s.io/api/apps/v1"
34-
"k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1"
35-
"k8s.io/apimachinery/pkg/api/errors"
34+
apiextensionsv1 "k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1"
3635
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
37-
"k8s.io/apimachinery/pkg/apis/meta/v1/unstructured"
3836
"k8s.io/apimachinery/pkg/runtime"
3937
"k8s.io/apimachinery/pkg/types"
4038
utilruntime "k8s.io/apimachinery/pkg/util/runtime"
@@ -55,8 +53,9 @@ import (
5553

5654
oadpv1alpha1 "github.com/openshift/oadp-operator/api/v1alpha1"
5755
"github.com/openshift/oadp-operator/internal/controller"
56+
pkgclient "github.com/openshift/oadp-operator/pkg/client"
5857
//+kubebuilder:scaffold:imports
59-
"github.com/openshift/oadp-operator/pkg/common"
58+
"github.com/openshift/oadp-operator/pkg/credentials/stsflow"
6059
"github.com/openshift/oadp-operator/pkg/leaderelection"
6160
)
6261

@@ -66,8 +65,6 @@ var (
6665
)
6766

6867
const (
69-
// WebIdentityTokenPath mount present on operator CSV
70-
WebIdentityTokenPath = "/var/run/secrets/openshift/serviceaccount/token"
7168

7269
// CloudCredentials API constants
7370
CloudCredentialGroupVersion = "cloudcredential.openshift.io/v1"
@@ -113,7 +110,7 @@ func main() {
113110
ctrl.SetLogger(zap.New(zap.UseFlagOptions(&opts)))
114111

115112
kubeconf := ctrl.GetConfigOrDie()
116-
113+
pkgclient.SetKubeconf(kubeconf)
117114
// Get LeaderElection configs
118115
leConfig := leaderelection.GetLeaderElectionConfig(kubeconf, enableLeaderElection)
119116

@@ -136,31 +133,10 @@ func main() {
136133
os.Exit(1)
137134
}
138135

139-
// check if this is standardized STS workflow via OLM and CCO
140-
if common.CCOWorkflow() {
141-
setupLog.Info("AWS Role ARN specified by the user, following standardized STS workflow")
142-
// ROLEARN env var is set via operator subscription
143-
roleARN := os.Getenv("ROLEARN")
144-
setupLog.Info("getting role ARN", "role ARN =", roleARN)
145-
146-
// check if cred request API exists in the cluster before creating a cred request
147-
setupLog.Info("Checking if credentialsrequest CRD exists in the cluster")
148-
credReqCRDExists, err := DoesCRDExist(CloudCredentialGroupVersion, CloudCredentialsCRDName, kubeconf)
149-
if err != nil {
150-
setupLog.Error(err, "problem checking the existence of CredentialRequests CRD")
151-
os.Exit(1)
152-
}
153-
154-
if credReqCRDExists {
155-
// create cred request
156-
setupLog.Info(fmt.Sprintf("Creating credentials request for role: %s, and WebIdentityTokenPath: %s", roleARN, WebIdentityTokenPath))
157-
if err := CreateOrUpdateCredRequest(roleARN, WebIdentityTokenPath, watchNamespace, kubeconf); err != nil {
158-
if !errors.IsAlreadyExists(err) {
159-
setupLog.Error(err, "unable to create credRequest")
160-
os.Exit(1)
161-
}
162-
}
163-
}
136+
// Create Secret and wait for STS cred to exists
137+
if _, err := stsflow.STSStandardizedFlow(); err != nil {
138+
setupLog.Error(err, "error setting up STS Standardized Flow")
139+
os.Exit(1)
164140
}
165141

166142
// if the enable-http2 flag is false (the default), http/2 should be disabled
@@ -234,7 +210,7 @@ func main() {
234210
os.Exit(1)
235211
}
236212

237-
if err := v1.AddToScheme(mgr.GetScheme()); err != nil {
213+
if err := apiextensionsv1.AddToScheme(mgr.GetScheme()); err != nil {
238214
setupLog.Error(err, "unable to add Kubernetes API extensions to scheme")
239215
os.Exit(1)
240216
}
@@ -371,80 +347,4 @@ func DoesCRDExist(CRDGroupVersion, CRDName string, kubeconf *rest.Config) (bool,
371347
}
372348
}
373349
return discoveryResult, nil
374-
375-
}
376-
377-
// CreateCredRequest WITP : WebIdentityTokenPath
378-
func CreateOrUpdateCredRequest(roleARN string, WITP string, secretNS string, kubeconf *rest.Config) error {
379-
clientInstance, err := client.New(kubeconf, client.Options{})
380-
if err != nil {
381-
setupLog.Error(err, "unable to create client")
382-
}
383-
384-
// Extra deps were getting added and existing ones were getting upgraded when the CloudCredentials API was imported
385-
// This caused updates to go.mod and started resulting in operator build failures due to incompatibility with the existing velero deps
386-
// Hence for now going via the unstructured route
387-
credRequest := &unstructured.Unstructured{
388-
Object: map[string]interface{}{
389-
"apiVersion": "cloudcredential.openshift.io/v1",
390-
"kind": "CredentialsRequest",
391-
"metadata": map[string]interface{}{
392-
"name": "oadp-aws-credentials-request",
393-
"namespace": "openshift-cloud-credential-operator",
394-
},
395-
"spec": map[string]interface{}{
396-
"secretRef": map[string]interface{}{
397-
"name": "cloud-credentials",
398-
"namespace": secretNS,
399-
},
400-
"serviceAccountNames": []interface{}{
401-
common.OADPOperatorServiceAccount,
402-
},
403-
"providerSpec": map[string]interface{}{
404-
"apiVersion": "cloudcredential.openshift.io/v1",
405-
"kind": "AWSProviderSpec",
406-
"statementEntries": []interface{}{
407-
map[string]interface{}{
408-
"effect": "Allow",
409-
"action": []interface{}{
410-
"s3:*",
411-
},
412-
"resource": "arn:aws:s3:*:*:*",
413-
},
414-
},
415-
"stsIAMRoleARN": roleARN,
416-
},
417-
"cloudTokenPath": WITP,
418-
},
419-
},
420-
}
421-
verb := "created"
422-
if err := clientInstance.Create(context.Background(), credRequest); err != nil {
423-
if errors.IsAlreadyExists(err) {
424-
verb = "updated"
425-
setupLog.Info("CredentialsRequest already exists, updating")
426-
fromCluster := &unstructured.Unstructured{
427-
Object: map[string]interface{}{
428-
"apiVersion": "cloudcredential.openshift.io/v1",
429-
"kind": "CredentialsRequest",
430-
},
431-
}
432-
err = clientInstance.Get(context.Background(), types.NamespacedName{Name: "oadp-aws-credentials-request", Namespace: "openshift-cloud-credential-operator"}, fromCluster)
433-
if err != nil {
434-
setupLog.Error(err, "unable to get existing credentials request resource")
435-
return err
436-
}
437-
// update spec
438-
fromCluster.Object["spec"] = credRequest.Object["spec"]
439-
if err := clientInstance.Update(context.Background(), fromCluster); err != nil {
440-
setupLog.Error(err, fmt.Sprintf("unable to update credentials request resource, %v, %+v", err, fromCluster.Object))
441-
return err
442-
}
443-
} else {
444-
setupLog.Error(err, "unable to create credentials request resource")
445-
return err
446-
}
447-
}
448-
setupLog.Info("Custom resource credentialsrequest " + verb + " successfully")
449-
return nil
450350
}

config/manifests/bases/oadp-operator.clusterserviceversion.yaml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -18,8 +18,8 @@ metadata:
1818
features.operators.openshift.io/proxy-aware: "true"
1919
features.operators.openshift.io/tls-profiles: "false"
2020
features.operators.openshift.io/token-auth-aws: "true"
21-
features.operators.openshift.io/token-auth-azure: "false"
22-
features.operators.openshift.io/token-auth-gcp: "false"
21+
features.operators.openshift.io/token-auth-azure: "true"
22+
features.operators.openshift.io/token-auth-gcp: "true"
2323
olm.skipRange: '>=0.0.0 <99.0.0'
2424
operatorframework.io/suggested-namespace: openshift-adp
2525
operators.openshift.io/infrastructure-features: '["Disconnected"]'

0 commit comments

Comments
 (0)