Browse Source

feat(vault): add GCP Workload Identity authentication support (#5356)

* feat(vault): add GCP Workload Identity authentication support

- Add GCP Workload Identity auth method for Vault provider
- Update CRDs to support new authentication configuration
- Add comprehensive tests for GCP auth implementation
- Update dependencies for GCP authentication libraries

Signed-off-by: Samuel Molling <samuelmolling@fireflies.ai>
Signed-off-by: Samuel Molling <samuelmolling@gmail.com>
(cherry picked from commit c415097a3755b4e15091a1ab9ecd8d30b182da46)
Signed-off-by: Samuel Molling <samuelmolling@gmail.com>

* docs(api): enhance VaultGcpAuth documentation and add GCP authentication fields

- Updated the API specification to include the new VaultGcpAuth authentication method.
- Added optional fields for GCP authentication, including `path`, `role`, `projectID`, `location`, `secretRef`, `workloadIdentity`, and `serviceAccountRef`.
- Updated references to include VaultGcpAuth in related sections.

Signed-off-by: [Samuel Molling] <samuelmolling@gmail.com>
Signed-off-by: Samuel Molling <samuelmolling@gmail.com>
(cherry picked from commit 77f933d3aab62777fb3955cc2cef687a89b255f0)
Signed-off-by: Samuel Molling <samuelmolling@gmail.com>

* feat(vault): implement GCP authentication methods and add unit tests

- Introduced a new test file for GCP authentication methods, covering various scenarios for setting environment variables and GCP authentication setup.
- Enhanced the `setupGCPAuth` function to prioritize authentication methods: SecretRef, Workload Identity, ServiceAccountRef, and Default ADC.
- Added helper functions for handling service account key authentication and workload identity setup.
- Improved error handling and logging for environment variable management.

Signed-off-by: [Samuel Molling] <samuelmolling@gmail.com>
Signed-off-by: Samuel Molling <samuelmolling@gmail.com>
(cherry picked from commit 9737cfc0f5937f210d6555271605b3c2b6138ba2)
Signed-off-by: Samuel Molling <samuelmolling@gmail.com>

* refactor(vault): enhance GCP authentication tests with method selection scenarios

- Renamed the test function to `TestGCPAuthMethodSelection` for clarity.
- Introduced a table-driven test structure to cover multiple GCP authentication methods: SecretRef, Workload Identity, and Default ADC.
- Each test case now includes setup logic, expected outcomes, and descriptive logging for better test traceability.
- Improved error handling to ensure tests accurately reflect expected behavior in various scenarios.

Signed-off-by: [Samuel Molling] <samuelmolling@gmail.com>
Signed-off-by: Samuel Molling <samuelmolling@gmail.com>
(cherry picked from commit 56b3c5f72b951896840ff2d1e27e55a1e1e36cc2)
Signed-off-by: Samuel Molling <samuelmolling@gmail.com>

* refactor(vault): rename Gcp to GCP in Vault authentication types

- Renamed the `Gcp` authentication struct and related fields to `GCP` for consistency with naming conventions.
- Updated all references across the codebase, including deep copy functions and tests.
- Improved clarity in GCP authentication test cases by reflecting the new naming.

Signed-off-by: Samuel Molling <samuelmolling@gmail.com>
(cherry picked from commit 5e3e1cbb6d917acf44c66ab441a05bbc69d31052)
Signed-off-by: Samuel Molling <samuelmolling@gmail.com>

* fix(vault): improve GCP authentication handling and documentation

- Added missing periods to comments for consistency and clarity in `secretstore_vault_types.go`.
- Enhanced error handling in `setupDefaultGCPAuth` to validate Application Default Credentials (ADC) availability.
- Updated test cases in `auth_gcp_test.go` to reflect expected behavior when ADC is not configured, ensuring meaningful error messages are provided.
- Clarified comments in `auth_gcp.go` regarding the priority order of GCP authentication methods.

Signed-off-by: Samuel Molling <samuelmolling@gmail.com>
(cherry picked from commit 90bd9f80b4c08ed9c54f5b4ff5762cf5a09b0f24)
Signed-off-by: Samuel Molling <samuelmolling@gmail.com>

* feat: add GCP authentication support to HashiCorp Vault

- Updated go.mod to include the GCP authentication package for Vault.
- Updated go.sum to reflect the new dependency.
- Minor documentation fixes in YAML files to ensure proper punctuation in descriptions.

Signed-off-by: [Samuel Molling] <samuelmolling@gmail.com>
Signed-off-by: Samuel Molling <samuelmolling@gmail.com>
(cherry picked from commit 29ce7b2831a0f0f76303b9122535682a0d162ee7)
Signed-off-by: Samuel Molling <samuelmolling@gmail.com>

* test: enhance GCP auth tests to handle ADC availability

  - Updated test cases for GCP authentication to log outcomes based on ADC availability in the environment.
  - Clarified comments to indicate that both success and ADC-related failures are acceptable for certain test scenarios.

Signed-off-by: Samuel Molling <samuelmolling@gmail.com>
(cherry picked from commit f3585adcae358ae550a303a06f7e2c7aa8cf20a4)
Signed-off-by: Samuel Molling <samuelmolling@gmail.com>

* test: refine GCP auth tests for ADC scenarios

- Enhanced test cases to clarify expected outcomes based on ADC availability in the environment.
- Updated comments and log messages to reflect the handling of both success and failure scenarios for ADC configuration.

Signed-off-by: Samuel Molling <samuelmolling@gmail.com>
(cherry picked from commit 186f15dd67399f576d117327f662ded0c73a8c9a)
Signed-off-by: Samuel Molling <samuelmolling@gmail.com>

* fix: restore GCP authentication types after merge

Re-added VaultGCPAuth field and type definition that was lost
during merge conflict resolution with upstream/main.

- Added GCP field to VaultAuth struct
- Added VaultGCPAuth type definition with all authentication methods
- Regenerated CRDs and deepcopy code

Signed-off-by: Samuel Molling <samuelmolling@gmail.com>

* style: apply gofmt formatting fixes

Applied automatic formatting fixes from gofmt to align code with
project style standards.

Signed-off-by: Samuel Molling <samuelmolling@gmail.com>

* docs: update API documentation for VaultGCPAuth

Update generated API documentation to reflect the VaultGCPAuth struct
naming (GCP in uppercase) and related documentation changes.

Signed-off-by: Samuel Molling <samuelmolling@gmail.com>

* chore: update test snapshots for Vault GCP auth

Update test snapshots to include the new VaultGCPAuth configuration
with GCP Workload Identity support.

Signed-off-by: Samuel Molling <samuelmolling@gmail.com>

* feat(vault): add GCP Workload Identity authentication support

- Add GCP Workload Identity auth method for Vault provider
- Update CRDs to support new authentication configuration
- Add comprehensive tests for GCP auth implementation
- Update dependencies for GCP authentication libraries

Signed-off-by: Samuel Molling <samuelmolling@fireflies.ai>
Signed-off-by: Samuel Molling <samuelmolling@gmail.com>
(cherry picked from commit c415097a3755b4e15091a1ab9ecd8d30b182da46)
Signed-off-by: Samuel Molling <samuelmolling@gmail.com>

* docs(api): enhance VaultGcpAuth documentation and add GCP authentication fields

- Updated the API specification to include the new VaultGcpAuth authentication method.
- Added optional fields for GCP authentication, including `path`, `role`, `projectID`, `location`, `secretRef`, `workloadIdentity`, and `serviceAccountRef`.
- Updated references to include VaultGcpAuth in related sections.

Signed-off-by: [Samuel Molling] <samuelmolling@gmail.com>
Signed-off-by: Samuel Molling <samuelmolling@gmail.com>
(cherry picked from commit 77f933d3aab62777fb3955cc2cef687a89b255f0)
Signed-off-by: Samuel Molling <samuelmolling@gmail.com>

* feat(vault): implement GCP authentication methods and add unit tests

- Introduced a new test file for GCP authentication methods, covering various scenarios for setting environment variables and GCP authentication setup.
- Enhanced the `setupGCPAuth` function to prioritize authentication methods: SecretRef, Workload Identity, ServiceAccountRef, and Default ADC.
- Added helper functions for handling service account key authentication and workload identity setup.
- Improved error handling and logging for environment variable management.

Signed-off-by: [Samuel Molling] <samuelmolling@gmail.com>
Signed-off-by: Samuel Molling <samuelmolling@gmail.com>
(cherry picked from commit 9737cfc0f5937f210d6555271605b3c2b6138ba2)
Signed-off-by: Samuel Molling <samuelmolling@gmail.com>

* refactor(vault): enhance GCP authentication tests with method selection scenarios

- Renamed the test function to `TestGCPAuthMethodSelection` for clarity.
- Introduced a table-driven test structure to cover multiple GCP authentication methods: SecretRef, Workload Identity, and Default ADC.
- Each test case now includes setup logic, expected outcomes, and descriptive logging for better test traceability.
- Improved error handling to ensure tests accurately reflect expected behavior in various scenarios.

Signed-off-by: [Samuel Molling] <samuelmolling@gmail.com>
Signed-off-by: Samuel Molling <samuelmolling@gmail.com>
(cherry picked from commit 56b3c5f72b951896840ff2d1e27e55a1e1e36cc2)
Signed-off-by: Samuel Molling <samuelmolling@gmail.com>

* refactor(vault): rename Gcp to GCP in Vault authentication types

- Renamed the `Gcp` authentication struct and related fields to `GCP` for consistency with naming conventions.
- Updated all references across the codebase, including deep copy functions and tests.
- Improved clarity in GCP authentication test cases by reflecting the new naming.

Signed-off-by: Samuel Molling <samuelmolling@gmail.com>
(cherry picked from commit 5e3e1cbb6d917acf44c66ab441a05bbc69d31052)
Signed-off-by: Samuel Molling <samuelmolling@gmail.com>

* fix(vault): improve GCP authentication handling and documentation

- Added missing periods to comments for consistency and clarity in `secretstore_vault_types.go`.
- Enhanced error handling in `setupDefaultGCPAuth` to validate Application Default Credentials (ADC) availability.
- Updated test cases in `auth_gcp_test.go` to reflect expected behavior when ADC is not configured, ensuring meaningful error messages are provided.
- Clarified comments in `auth_gcp.go` regarding the priority order of GCP authentication methods.

Signed-off-by: Samuel Molling <samuelmolling@gmail.com>
(cherry picked from commit 90bd9f80b4c08ed9c54f5b4ff5762cf5a09b0f24)
Signed-off-by: Samuel Molling <samuelmolling@gmail.com>

* feat: add GCP authentication support to HashiCorp Vault

- Updated go.mod to include the GCP authentication package for Vault.
- Updated go.sum to reflect the new dependency.
- Minor documentation fixes in YAML files to ensure proper punctuation in descriptions.

Signed-off-by: [Samuel Molling] <samuelmolling@gmail.com>
Signed-off-by: Samuel Molling <samuelmolling@gmail.com>
(cherry picked from commit 29ce7b2831a0f0f76303b9122535682a0d162ee7)
Signed-off-by: Samuel Molling <samuelmolling@gmail.com>

* test: enhance GCP auth tests to handle ADC availability

  - Updated test cases for GCP authentication to log outcomes based on ADC availability in the environment.
  - Clarified comments to indicate that both success and ADC-related failures are acceptable for certain test scenarios.

Signed-off-by: Samuel Molling <samuelmolling@gmail.com>
(cherry picked from commit f3585adcae358ae550a303a06f7e2c7aa8cf20a4)
Signed-off-by: Samuel Molling <samuelmolling@gmail.com>

* test: refine GCP auth tests for ADC scenarios

- Enhanced test cases to clarify expected outcomes based on ADC availability in the environment.
- Updated comments and log messages to reflect the handling of both success and failure scenarios for ADC configuration.

Signed-off-by: Samuel Molling <samuelmolling@gmail.com>
(cherry picked from commit 186f15dd67399f576d117327f662ded0c73a8c9a)
Signed-off-by: Samuel Molling <samuelmolling@gmail.com>

* fix: restore GCP authentication types after merge

Re-added VaultGCPAuth field and type definition that was lost
during merge conflict resolution with upstream/main.

- Added GCP field to VaultAuth struct
- Added VaultGCPAuth type definition with all authentication methods
- Regenerated CRDs and deepcopy code

Signed-off-by: Samuel Molling <samuelmolling@gmail.com>

* style: apply gofmt formatting fixes

Applied automatic formatting fixes from gofmt to align code with
project style standards.

Signed-off-by: Samuel Molling <samuelmolling@gmail.com>

* docs: update API documentation for VaultGCPAuth

Update generated API documentation to reflect the VaultGCPAuth struct
naming (GCP in uppercase) and related documentation changes.

Signed-off-by: Samuel Molling <samuelmolling@gmail.com>

* chore: update test snapshots for Vault GCP auth

Update test snapshots to include the new VaultGCPAuth configuration
with GCP Workload Identity support.

Signed-off-by: Samuel Molling <samuelmolling@gmail.com>

* fix: correct error handling in GCP auth token method

Signed-off-by: Samuel Molling <samuelmolling@gmail.com>

---------

Signed-off-by: Samuel Molling <samuelmolling@fireflies.ai>
Signed-off-by: Samuel Molling <samuelmolling@gmail.com>
Signed-off-by: [Samuel Molling] <samuelmolling@gmail.com>
Co-authored-by: Gergely Brautigam <skarlso777@gmail.com>
SamuelMolling 4 months ago
parent
commit
a3df4e0c26

+ 43 - 3
apis/externalsecrets/v1/secretstore_vault_types.go

@@ -29,8 +29,7 @@ const (
 	VaultKVStoreV2 VaultKVStoreVersion = "v2"
 )
 
-// VaultProvider configures a store to sync secrets using a HashiCorp Vault
-// KV backend.
+// VaultProvider configures a store to sync secrets using a Hashicorp Vault KV backend.
 type VaultProvider struct {
 	// Auth configures how secret-manager authenticates with the Vault server.
 	Auth *VaultAuth `json:"auth,omitempty"`
@@ -119,7 +118,7 @@ type VaultClientTLS struct {
 }
 
 // VaultAuth is the configuration used to authenticate with a Vault server.
-// Only one of `tokenSecretRef`, `appRole`,  `kubernetes`, `ldap`, `userPass`, `jwt` or `cert`
+// Only one of `tokenSecretRef`, `appRole`,  `kubernetes`, `ldap`, `userPass`, `jwt`, `cert`, `iam` or `gcp`
 // can be specified. A namespace to authenticate against can optionally be specified.
 type VaultAuth struct {
 	// Name of the vault namespace to authenticate to. This can be different than the namespace your secret is in.
@@ -167,6 +166,11 @@ type VaultAuth struct {
 	// UserPass authenticates with Vault by passing username/password pair
 	// +optional
 	UserPass *VaultUserPassAuth `json:"userPass,omitempty"`
+
+	// Gcp authenticates with Vault using Google Cloud Platform authentication method
+	// GCP authentication method
+	// +optional
+	GCP *VaultGCPAuth `json:"gcp,omitempty"`
 }
 
 // VaultAppRole authenticates with Vault using the App Role auth mechanism,
@@ -391,6 +395,42 @@ type VaultUserPassAuth struct {
 	SecretRef esmeta.SecretKeySelector `json:"secretRef,omitempty"`
 }
 
+// VaultGCPAuth authenticates with Vault using Google Cloud Platform authentication method.
+// Refer: https://developer.hashicorp.com/vault/docs/auth/gcp
+//
+// When ServiceAccountRef, SecretRef and WorkloadIdentity are not specified, the provider will use the controller pod's
+// identity to authenticate with GCP. This supports both GKE Workload Identity and service account keys.
+type VaultGCPAuth struct {
+	// Path where the GCP auth method is enabled in Vault, e.g: "gcp"
+	// +kubebuilder:default=gcp
+	// +optional
+	Path string `json:"path,omitempty"`
+
+	// Vault Role. In Vault, a role describes an identity with a set of permissions, groups, or policies you want to attach to a user of the secrets engine.
+	//+required
+	Role string `json:"role"`
+
+	// Project ID of the Google Cloud Platform project
+	// +optional
+	ProjectID string `json:"projectID,omitempty"`
+
+	// Location optionally defines a location/region for the secret
+	// +optional
+	Location string `json:"location,omitempty"`
+
+	// Specify credentials in a Secret object
+	// +optional
+	SecretRef *GCPSMAuthSecretRef `json:"secretRef,omitempty"`
+
+	// Specify a service account with Workload Identity
+	// +optional
+	WorkloadIdentity *GCPWorkloadIdentity `json:"workloadIdentity,omitempty"`
+
+	// ServiceAccountRef to a service account for impersonation
+	// +optional
+	ServiceAccountRef *esmeta.ServiceAccountSelector `json:"serviceAccountRef,omitempty"`
+}
+
 // VaultCheckAndSet defines the Check-And-Set (CAS) settings for Vault KV v2 PushSecret operations.
 type VaultCheckAndSet struct {
 	// Required when true, all write operations must include a check-and-set parameter.

+ 35 - 0
apis/externalsecrets/v1/zz_generated.deepcopy.go

@@ -3829,6 +3829,11 @@ func (in *VaultAuth) DeepCopyInto(out *VaultAuth) {
 		*out = new(VaultUserPassAuth)
 		(*in).DeepCopyInto(*out)
 	}
+	if in.GCP != nil {
+		in, out := &in.GCP, &out.GCP
+		*out = new(VaultGCPAuth)
+		(*in).DeepCopyInto(*out)
+	}
 }
 
 // DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new VaultAuth.
@@ -3966,6 +3971,36 @@ func (in *VaultClientTLS) DeepCopy() *VaultClientTLS {
 }
 
 // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
+func (in *VaultGCPAuth) DeepCopyInto(out *VaultGCPAuth) {
+	*out = *in
+	if in.SecretRef != nil {
+		in, out := &in.SecretRef, &out.SecretRef
+		*out = new(GCPSMAuthSecretRef)
+		(*in).DeepCopyInto(*out)
+	}
+	if in.WorkloadIdentity != nil {
+		in, out := &in.WorkloadIdentity, &out.WorkloadIdentity
+		*out = new(GCPWorkloadIdentity)
+		(*in).DeepCopyInto(*out)
+	}
+	if in.ServiceAccountRef != nil {
+		in, out := &in.ServiceAccountRef, &out.ServiceAccountRef
+		*out = new(apismetav1.ServiceAccountSelector)
+		(*in).DeepCopyInto(*out)
+	}
+}
+
+// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new VaultGCPAuth.
+func (in *VaultGCPAuth) DeepCopy() *VaultGCPAuth {
+	if in == nil {
+		return nil
+	}
+	out := new(VaultGCPAuth)
+	in.DeepCopyInto(out)
+	return out
+}
+
+// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
 func (in *VaultIamAuth) DeepCopyInto(out *VaultIamAuth) {
 	*out = *in
 	if in.SecretRef != nil {

+ 140 - 0
config/crds/bases/external-secrets.io_clustersecretstores.yaml

@@ -4524,6 +4524,146 @@ spec:
                                     type: string
                                 type: object
                             type: object
+                          gcp:
+                            description: |-
+                              Gcp authenticates with Vault using Google Cloud Platform authentication method
+                              GCP authentication method
+                            properties:
+                              location:
+                                description: Location optionally defines a location/region
+                                  for the secret
+                                type: string
+                              path:
+                                default: gcp
+                                description: 'Path where the GCP auth method is enabled
+                                  in Vault, e.g: "gcp"'
+                                type: string
+                              projectID:
+                                description: Project ID of the Google Cloud Platform
+                                  project
+                                type: string
+                              role:
+                                description: Vault Role. In Vault, a role describes
+                                  an identity with a set of permissions, groups, or
+                                  policies you want to attach to a user of the secrets
+                                  engine.
+                                type: string
+                              secretRef:
+                                description: Specify credentials in a Secret object
+                                properties:
+                                  secretAccessKeySecretRef:
+                                    description: The SecretAccessKey is used for authentication
+                                    properties:
+                                      key:
+                                        description: |-
+                                          A key in the referenced Secret.
+                                          Some instances of this field may be defaulted, in others it may be required.
+                                        maxLength: 253
+                                        minLength: 1
+                                        pattern: ^[-._a-zA-Z0-9]+$
+                                        type: string
+                                      name:
+                                        description: The name of the Secret resource
+                                          being referred to.
+                                        maxLength: 253
+                                        minLength: 1
+                                        pattern: ^[a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*$
+                                        type: string
+                                      namespace:
+                                        description: |-
+                                          The namespace of the Secret resource being referred to.
+                                          Ignored if referent is not cluster-scoped, otherwise defaults to the namespace of the referent.
+                                        maxLength: 63
+                                        minLength: 1
+                                        pattern: ^[a-z0-9]([-a-z0-9]*[a-z0-9])?$
+                                        type: string
+                                    type: object
+                                type: object
+                              serviceAccountRef:
+                                description: ServiceAccountRef to a service account
+                                  for impersonation
+                                properties:
+                                  audiences:
+                                    description: |-
+                                      Audience specifies the `aud` claim for the service account token
+                                      If the service account uses a well-known annotation for e.g. IRSA or GCP Workload Identity
+                                      then this audiences will be appended to the list
+                                    items:
+                                      type: string
+                                    type: array
+                                  name:
+                                    description: The name of the ServiceAccount resource
+                                      being referred to.
+                                    maxLength: 253
+                                    minLength: 1
+                                    pattern: ^[a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*$
+                                    type: string
+                                  namespace:
+                                    description: |-
+                                      Namespace of the resource being referred to.
+                                      Ignored if referent is not cluster-scoped, otherwise defaults to the namespace of the referent.
+                                    maxLength: 63
+                                    minLength: 1
+                                    pattern: ^[a-z0-9]([-a-z0-9]*[a-z0-9])?$
+                                    type: string
+                                required:
+                                - name
+                                type: object
+                              workloadIdentity:
+                                description: Specify a service account with Workload
+                                  Identity
+                                properties:
+                                  clusterLocation:
+                                    description: |-
+                                      ClusterLocation is the location of the cluster
+                                      If not specified, it fetches information from the metadata server
+                                    type: string
+                                  clusterName:
+                                    description: |-
+                                      ClusterName is the name of the cluster
+                                      If not specified, it fetches information from the metadata server
+                                    type: string
+                                  clusterProjectID:
+                                    description: |-
+                                      ClusterProjectID is the project ID of the cluster
+                                      If not specified, it fetches information from the metadata server
+                                    type: string
+                                  serviceAccountRef:
+                                    description: ServiceAccountSelector is a reference
+                                      to a ServiceAccount resource.
+                                    properties:
+                                      audiences:
+                                        description: |-
+                                          Audience specifies the `aud` claim for the service account token
+                                          If the service account uses a well-known annotation for e.g. IRSA or GCP Workload Identity
+                                          then this audiences will be appended to the list
+                                        items:
+                                          type: string
+                                        type: array
+                                      name:
+                                        description: The name of the ServiceAccount
+                                          resource being referred to.
+                                        maxLength: 253
+                                        minLength: 1
+                                        pattern: ^[a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*$
+                                        type: string
+                                      namespace:
+                                        description: |-
+                                          Namespace of the resource being referred to.
+                                          Ignored if referent is not cluster-scoped, otherwise defaults to the namespace of the referent.
+                                        maxLength: 63
+                                        minLength: 1
+                                        pattern: ^[a-z0-9]([-a-z0-9]*[a-z0-9])?$
+                                        type: string
+                                    required:
+                                    - name
+                                    type: object
+                                required:
+                                - serviceAccountRef
+                                type: object
+                            required:
+                            - role
+                            type: object
                           iam:
                             description: |-
                               Iam authenticates with vault by passing a special AWS request signed with AWS IAM credentials

+ 140 - 0
config/crds/bases/external-secrets.io_secretstores.yaml

@@ -4524,6 +4524,146 @@ spec:
                                     type: string
                                 type: object
                             type: object
+                          gcp:
+                            description: |-
+                              Gcp authenticates with Vault using Google Cloud Platform authentication method
+                              GCP authentication method
+                            properties:
+                              location:
+                                description: Location optionally defines a location/region
+                                  for the secret
+                                type: string
+                              path:
+                                default: gcp
+                                description: 'Path where the GCP auth method is enabled
+                                  in Vault, e.g: "gcp"'
+                                type: string
+                              projectID:
+                                description: Project ID of the Google Cloud Platform
+                                  project
+                                type: string
+                              role:
+                                description: Vault Role. In Vault, a role describes
+                                  an identity with a set of permissions, groups, or
+                                  policies you want to attach to a user of the secrets
+                                  engine.
+                                type: string
+                              secretRef:
+                                description: Specify credentials in a Secret object
+                                properties:
+                                  secretAccessKeySecretRef:
+                                    description: The SecretAccessKey is used for authentication
+                                    properties:
+                                      key:
+                                        description: |-
+                                          A key in the referenced Secret.
+                                          Some instances of this field may be defaulted, in others it may be required.
+                                        maxLength: 253
+                                        minLength: 1
+                                        pattern: ^[-._a-zA-Z0-9]+$
+                                        type: string
+                                      name:
+                                        description: The name of the Secret resource
+                                          being referred to.
+                                        maxLength: 253
+                                        minLength: 1
+                                        pattern: ^[a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*$
+                                        type: string
+                                      namespace:
+                                        description: |-
+                                          The namespace of the Secret resource being referred to.
+                                          Ignored if referent is not cluster-scoped, otherwise defaults to the namespace of the referent.
+                                        maxLength: 63
+                                        minLength: 1
+                                        pattern: ^[a-z0-9]([-a-z0-9]*[a-z0-9])?$
+                                        type: string
+                                    type: object
+                                type: object
+                              serviceAccountRef:
+                                description: ServiceAccountRef to a service account
+                                  for impersonation
+                                properties:
+                                  audiences:
+                                    description: |-
+                                      Audience specifies the `aud` claim for the service account token
+                                      If the service account uses a well-known annotation for e.g. IRSA or GCP Workload Identity
+                                      then this audiences will be appended to the list
+                                    items:
+                                      type: string
+                                    type: array
+                                  name:
+                                    description: The name of the ServiceAccount resource
+                                      being referred to.
+                                    maxLength: 253
+                                    minLength: 1
+                                    pattern: ^[a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*$
+                                    type: string
+                                  namespace:
+                                    description: |-
+                                      Namespace of the resource being referred to.
+                                      Ignored if referent is not cluster-scoped, otherwise defaults to the namespace of the referent.
+                                    maxLength: 63
+                                    minLength: 1
+                                    pattern: ^[a-z0-9]([-a-z0-9]*[a-z0-9])?$
+                                    type: string
+                                required:
+                                - name
+                                type: object
+                              workloadIdentity:
+                                description: Specify a service account with Workload
+                                  Identity
+                                properties:
+                                  clusterLocation:
+                                    description: |-
+                                      ClusterLocation is the location of the cluster
+                                      If not specified, it fetches information from the metadata server
+                                    type: string
+                                  clusterName:
+                                    description: |-
+                                      ClusterName is the name of the cluster
+                                      If not specified, it fetches information from the metadata server
+                                    type: string
+                                  clusterProjectID:
+                                    description: |-
+                                      ClusterProjectID is the project ID of the cluster
+                                      If not specified, it fetches information from the metadata server
+                                    type: string
+                                  serviceAccountRef:
+                                    description: ServiceAccountSelector is a reference
+                                      to a ServiceAccount resource.
+                                    properties:
+                                      audiences:
+                                        description: |-
+                                          Audience specifies the `aud` claim for the service account token
+                                          If the service account uses a well-known annotation for e.g. IRSA or GCP Workload Identity
+                                          then this audiences will be appended to the list
+                                        items:
+                                          type: string
+                                        type: array
+                                      name:
+                                        description: The name of the ServiceAccount
+                                          resource being referred to.
+                                        maxLength: 253
+                                        minLength: 1
+                                        pattern: ^[a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*$
+                                        type: string
+                                      namespace:
+                                        description: |-
+                                          Namespace of the resource being referred to.
+                                          Ignored if referent is not cluster-scoped, otherwise defaults to the namespace of the referent.
+                                        maxLength: 63
+                                        minLength: 1
+                                        pattern: ^[a-z0-9]([-a-z0-9]*[a-z0-9])?$
+                                        type: string
+                                    required:
+                                    - name
+                                    type: object
+                                required:
+                                - serviceAccountRef
+                                type: object
+                            required:
+                            - role
+                            type: object
                           iam:
                             description: |-
                               Iam authenticates with vault by passing a special AWS request signed with AWS IAM credentials

+ 141 - 0
config/crds/bases/generators.external-secrets.io_clustergenerators.yaml

@@ -1335,6 +1335,147 @@ spec:
                                         type: string
                                     type: object
                                 type: object
+                              gcp:
+                                description: |-
+                                  Gcp authenticates with Vault using Google Cloud Platform authentication method
+                                  GCP authentication method
+                                properties:
+                                  location:
+                                    description: Location optionally defines a location/region
+                                      for the secret
+                                    type: string
+                                  path:
+                                    default: gcp
+                                    description: 'Path where the GCP auth method is
+                                      enabled in Vault, e.g: "gcp"'
+                                    type: string
+                                  projectID:
+                                    description: Project ID of the Google Cloud Platform
+                                      project
+                                    type: string
+                                  role:
+                                    description: Vault Role. In Vault, a role describes
+                                      an identity with a set of permissions, groups,
+                                      or policies you want to attach to a user of
+                                      the secrets engine.
+                                    type: string
+                                  secretRef:
+                                    description: Specify credentials in a Secret object
+                                    properties:
+                                      secretAccessKeySecretRef:
+                                        description: The SecretAccessKey is used for
+                                          authentication
+                                        properties:
+                                          key:
+                                            description: |-
+                                              A key in the referenced Secret.
+                                              Some instances of this field may be defaulted, in others it may be required.
+                                            maxLength: 253
+                                            minLength: 1
+                                            pattern: ^[-._a-zA-Z0-9]+$
+                                            type: string
+                                          name:
+                                            description: The name of the Secret resource
+                                              being referred to.
+                                            maxLength: 253
+                                            minLength: 1
+                                            pattern: ^[a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*$
+                                            type: string
+                                          namespace:
+                                            description: |-
+                                              The namespace of the Secret resource being referred to.
+                                              Ignored if referent is not cluster-scoped, otherwise defaults to the namespace of the referent.
+                                            maxLength: 63
+                                            minLength: 1
+                                            pattern: ^[a-z0-9]([-a-z0-9]*[a-z0-9])?$
+                                            type: string
+                                        type: object
+                                    type: object
+                                  serviceAccountRef:
+                                    description: ServiceAccountRef to a service account
+                                      for impersonation
+                                    properties:
+                                      audiences:
+                                        description: |-
+                                          Audience specifies the `aud` claim for the service account token
+                                          If the service account uses a well-known annotation for e.g. IRSA or GCP Workload Identity
+                                          then this audiences will be appended to the list
+                                        items:
+                                          type: string
+                                        type: array
+                                      name:
+                                        description: The name of the ServiceAccount
+                                          resource being referred to.
+                                        maxLength: 253
+                                        minLength: 1
+                                        pattern: ^[a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*$
+                                        type: string
+                                      namespace:
+                                        description: |-
+                                          Namespace of the resource being referred to.
+                                          Ignored if referent is not cluster-scoped, otherwise defaults to the namespace of the referent.
+                                        maxLength: 63
+                                        minLength: 1
+                                        pattern: ^[a-z0-9]([-a-z0-9]*[a-z0-9])?$
+                                        type: string
+                                    required:
+                                    - name
+                                    type: object
+                                  workloadIdentity:
+                                    description: Specify a service account with Workload
+                                      Identity
+                                    properties:
+                                      clusterLocation:
+                                        description: |-
+                                          ClusterLocation is the location of the cluster
+                                          If not specified, it fetches information from the metadata server
+                                        type: string
+                                      clusterName:
+                                        description: |-
+                                          ClusterName is the name of the cluster
+                                          If not specified, it fetches information from the metadata server
+                                        type: string
+                                      clusterProjectID:
+                                        description: |-
+                                          ClusterProjectID is the project ID of the cluster
+                                          If not specified, it fetches information from the metadata server
+                                        type: string
+                                      serviceAccountRef:
+                                        description: ServiceAccountSelector is a reference
+                                          to a ServiceAccount resource.
+                                        properties:
+                                          audiences:
+                                            description: |-
+                                              Audience specifies the `aud` claim for the service account token
+                                              If the service account uses a well-known annotation for e.g. IRSA or GCP Workload Identity
+                                              then this audiences will be appended to the list
+                                            items:
+                                              type: string
+                                            type: array
+                                          name:
+                                            description: The name of the ServiceAccount
+                                              resource being referred to.
+                                            maxLength: 253
+                                            minLength: 1
+                                            pattern: ^[a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*$
+                                            type: string
+                                          namespace:
+                                            description: |-
+                                              Namespace of the resource being referred to.
+                                              Ignored if referent is not cluster-scoped, otherwise defaults to the namespace of the referent.
+                                            maxLength: 63
+                                            minLength: 1
+                                            pattern: ^[a-z0-9]([-a-z0-9]*[a-z0-9])?$
+                                            type: string
+                                        required:
+                                        - name
+                                        type: object
+                                    required:
+                                    - serviceAccountRef
+                                    type: object
+                                required:
+                                - role
+                                type: object
                               iam:
                                 description: |-
                                   Iam authenticates with vault by passing a special AWS request signed with AWS IAM credentials

+ 137 - 0
config/crds/bases/generators.external-secrets.io_vaultdynamicsecrets.yaml

@@ -222,6 +222,143 @@ spec:
                                 type: string
                             type: object
                         type: object
+                      gcp:
+                        description: |-
+                          Gcp authenticates with Vault using Google Cloud Platform authentication method
+                          GCP authentication method
+                        properties:
+                          location:
+                            description: Location optionally defines a location/region
+                              for the secret
+                            type: string
+                          path:
+                            default: gcp
+                            description: 'Path where the GCP auth method is enabled
+                              in Vault, e.g: "gcp"'
+                            type: string
+                          projectID:
+                            description: Project ID of the Google Cloud Platform project
+                            type: string
+                          role:
+                            description: Vault Role. In Vault, a role describes an
+                              identity with a set of permissions, groups, or policies
+                              you want to attach to a user of the secrets engine.
+                            type: string
+                          secretRef:
+                            description: Specify credentials in a Secret object
+                            properties:
+                              secretAccessKeySecretRef:
+                                description: The SecretAccessKey is used for authentication
+                                properties:
+                                  key:
+                                    description: |-
+                                      A key in the referenced Secret.
+                                      Some instances of this field may be defaulted, in others it may be required.
+                                    maxLength: 253
+                                    minLength: 1
+                                    pattern: ^[-._a-zA-Z0-9]+$
+                                    type: string
+                                  name:
+                                    description: The name of the Secret resource being
+                                      referred to.
+                                    maxLength: 253
+                                    minLength: 1
+                                    pattern: ^[a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*$
+                                    type: string
+                                  namespace:
+                                    description: |-
+                                      The namespace of the Secret resource being referred to.
+                                      Ignored if referent is not cluster-scoped, otherwise defaults to the namespace of the referent.
+                                    maxLength: 63
+                                    minLength: 1
+                                    pattern: ^[a-z0-9]([-a-z0-9]*[a-z0-9])?$
+                                    type: string
+                                type: object
+                            type: object
+                          serviceAccountRef:
+                            description: ServiceAccountRef to a service account for
+                              impersonation
+                            properties:
+                              audiences:
+                                description: |-
+                                  Audience specifies the `aud` claim for the service account token
+                                  If the service account uses a well-known annotation for e.g. IRSA or GCP Workload Identity
+                                  then this audiences will be appended to the list
+                                items:
+                                  type: string
+                                type: array
+                              name:
+                                description: The name of the ServiceAccount resource
+                                  being referred to.
+                                maxLength: 253
+                                minLength: 1
+                                pattern: ^[a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*$
+                                type: string
+                              namespace:
+                                description: |-
+                                  Namespace of the resource being referred to.
+                                  Ignored if referent is not cluster-scoped, otherwise defaults to the namespace of the referent.
+                                maxLength: 63
+                                minLength: 1
+                                pattern: ^[a-z0-9]([-a-z0-9]*[a-z0-9])?$
+                                type: string
+                            required:
+                            - name
+                            type: object
+                          workloadIdentity:
+                            description: Specify a service account with Workload Identity
+                            properties:
+                              clusterLocation:
+                                description: |-
+                                  ClusterLocation is the location of the cluster
+                                  If not specified, it fetches information from the metadata server
+                                type: string
+                              clusterName:
+                                description: |-
+                                  ClusterName is the name of the cluster
+                                  If not specified, it fetches information from the metadata server
+                                type: string
+                              clusterProjectID:
+                                description: |-
+                                  ClusterProjectID is the project ID of the cluster
+                                  If not specified, it fetches information from the metadata server
+                                type: string
+                              serviceAccountRef:
+                                description: ServiceAccountSelector is a reference
+                                  to a ServiceAccount resource.
+                                properties:
+                                  audiences:
+                                    description: |-
+                                      Audience specifies the `aud` claim for the service account token
+                                      If the service account uses a well-known annotation for e.g. IRSA or GCP Workload Identity
+                                      then this audiences will be appended to the list
+                                    items:
+                                      type: string
+                                    type: array
+                                  name:
+                                    description: The name of the ServiceAccount resource
+                                      being referred to.
+                                    maxLength: 253
+                                    minLength: 1
+                                    pattern: ^[a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*$
+                                    type: string
+                                  namespace:
+                                    description: |-
+                                      Namespace of the resource being referred to.
+                                      Ignored if referent is not cluster-scoped, otherwise defaults to the namespace of the referent.
+                                    maxLength: 63
+                                    minLength: 1
+                                    pattern: ^[a-z0-9]([-a-z0-9]*[a-z0-9])?$
+                                    type: string
+                                required:
+                                - name
+                                type: object
+                            required:
+                            - serviceAccountRef
+                            type: object
+                        required:
+                        - role
+                        type: object
                       iam:
                         description: |-
                           Iam authenticates with vault by passing a special AWS request signed with AWS IAM credentials

+ 512 - 0
deploy/crds/bundle.yaml

@@ -6305,6 +6305,134 @@ spec:
                                       type: string
                                   type: object
                               type: object
+                            gcp:
+                              description: |-
+                                Gcp authenticates with Vault using Google Cloud Platform authentication method
+                                GCP authentication method
+                              properties:
+                                location:
+                                  description: Location optionally defines a location/region for the secret
+                                  type: string
+                                path:
+                                  default: gcp
+                                  description: 'Path where the GCP auth method is enabled in Vault, e.g: "gcp"'
+                                  type: string
+                                projectID:
+                                  description: Project ID of the Google Cloud Platform project
+                                  type: string
+                                role:
+                                  description: Vault Role. In Vault, a role describes an identity with a set of permissions, groups, or policies you want to attach to a user of the secrets engine.
+                                  type: string
+                                secretRef:
+                                  description: Specify credentials in a Secret object
+                                  properties:
+                                    secretAccessKeySecretRef:
+                                      description: The SecretAccessKey is used for authentication
+                                      properties:
+                                        key:
+                                          description: |-
+                                            A key in the referenced Secret.
+                                            Some instances of this field may be defaulted, in others it may be required.
+                                          maxLength: 253
+                                          minLength: 1
+                                          pattern: ^[-._a-zA-Z0-9]+$
+                                          type: string
+                                        name:
+                                          description: The name of the Secret resource being referred to.
+                                          maxLength: 253
+                                          minLength: 1
+                                          pattern: ^[a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*$
+                                          type: string
+                                        namespace:
+                                          description: |-
+                                            The namespace of the Secret resource being referred to.
+                                            Ignored if referent is not cluster-scoped, otherwise defaults to the namespace of the referent.
+                                          maxLength: 63
+                                          minLength: 1
+                                          pattern: ^[a-z0-9]([-a-z0-9]*[a-z0-9])?$
+                                          type: string
+                                      type: object
+                                  type: object
+                                serviceAccountRef:
+                                  description: ServiceAccountRef to a service account for impersonation
+                                  properties:
+                                    audiences:
+                                      description: |-
+                                        Audience specifies the `aud` claim for the service account token
+                                        If the service account uses a well-known annotation for e.g. IRSA or GCP Workload Identity
+                                        then this audiences will be appended to the list
+                                      items:
+                                        type: string
+                                      type: array
+                                    name:
+                                      description: The name of the ServiceAccount resource being referred to.
+                                      maxLength: 253
+                                      minLength: 1
+                                      pattern: ^[a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*$
+                                      type: string
+                                    namespace:
+                                      description: |-
+                                        Namespace of the resource being referred to.
+                                        Ignored if referent is not cluster-scoped, otherwise defaults to the namespace of the referent.
+                                      maxLength: 63
+                                      minLength: 1
+                                      pattern: ^[a-z0-9]([-a-z0-9]*[a-z0-9])?$
+                                      type: string
+                                  required:
+                                    - name
+                                  type: object
+                                workloadIdentity:
+                                  description: Specify a service account with Workload Identity
+                                  properties:
+                                    clusterLocation:
+                                      description: |-
+                                        ClusterLocation is the location of the cluster
+                                        If not specified, it fetches information from the metadata server
+                                      type: string
+                                    clusterName:
+                                      description: |-
+                                        ClusterName is the name of the cluster
+                                        If not specified, it fetches information from the metadata server
+                                      type: string
+                                    clusterProjectID:
+                                      description: |-
+                                        ClusterProjectID is the project ID of the cluster
+                                        If not specified, it fetches information from the metadata server
+                                      type: string
+                                    serviceAccountRef:
+                                      description: ServiceAccountSelector is a reference to a ServiceAccount resource.
+                                      properties:
+                                        audiences:
+                                          description: |-
+                                            Audience specifies the `aud` claim for the service account token
+                                            If the service account uses a well-known annotation for e.g. IRSA or GCP Workload Identity
+                                            then this audiences will be appended to the list
+                                          items:
+                                            type: string
+                                          type: array
+                                        name:
+                                          description: The name of the ServiceAccount resource being referred to.
+                                          maxLength: 253
+                                          minLength: 1
+                                          pattern: ^[a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*$
+                                          type: string
+                                        namespace:
+                                          description: |-
+                                            Namespace of the resource being referred to.
+                                            Ignored if referent is not cluster-scoped, otherwise defaults to the namespace of the referent.
+                                          maxLength: 63
+                                          minLength: 1
+                                          pattern: ^[a-z0-9]([-a-z0-9]*[a-z0-9])?$
+                                          type: string
+                                      required:
+                                        - name
+                                      type: object
+                                  required:
+                                    - serviceAccountRef
+                                  type: object
+                              required:
+                                - role
+                              type: object
                             iam:
                               description: |-
                                 Iam authenticates with vault by passing a special AWS request signed with AWS IAM credentials
@@ -17661,6 +17789,134 @@ spec:
                                       type: string
                                   type: object
                               type: object
+                            gcp:
+                              description: |-
+                                Gcp authenticates with Vault using Google Cloud Platform authentication method
+                                GCP authentication method
+                              properties:
+                                location:
+                                  description: Location optionally defines a location/region for the secret
+                                  type: string
+                                path:
+                                  default: gcp
+                                  description: 'Path where the GCP auth method is enabled in Vault, e.g: "gcp"'
+                                  type: string
+                                projectID:
+                                  description: Project ID of the Google Cloud Platform project
+                                  type: string
+                                role:
+                                  description: Vault Role. In Vault, a role describes an identity with a set of permissions, groups, or policies you want to attach to a user of the secrets engine.
+                                  type: string
+                                secretRef:
+                                  description: Specify credentials in a Secret object
+                                  properties:
+                                    secretAccessKeySecretRef:
+                                      description: The SecretAccessKey is used for authentication
+                                      properties:
+                                        key:
+                                          description: |-
+                                            A key in the referenced Secret.
+                                            Some instances of this field may be defaulted, in others it may be required.
+                                          maxLength: 253
+                                          minLength: 1
+                                          pattern: ^[-._a-zA-Z0-9]+$
+                                          type: string
+                                        name:
+                                          description: The name of the Secret resource being referred to.
+                                          maxLength: 253
+                                          minLength: 1
+                                          pattern: ^[a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*$
+                                          type: string
+                                        namespace:
+                                          description: |-
+                                            The namespace of the Secret resource being referred to.
+                                            Ignored if referent is not cluster-scoped, otherwise defaults to the namespace of the referent.
+                                          maxLength: 63
+                                          minLength: 1
+                                          pattern: ^[a-z0-9]([-a-z0-9]*[a-z0-9])?$
+                                          type: string
+                                      type: object
+                                  type: object
+                                serviceAccountRef:
+                                  description: ServiceAccountRef to a service account for impersonation
+                                  properties:
+                                    audiences:
+                                      description: |-
+                                        Audience specifies the `aud` claim for the service account token
+                                        If the service account uses a well-known annotation for e.g. IRSA or GCP Workload Identity
+                                        then this audiences will be appended to the list
+                                      items:
+                                        type: string
+                                      type: array
+                                    name:
+                                      description: The name of the ServiceAccount resource being referred to.
+                                      maxLength: 253
+                                      minLength: 1
+                                      pattern: ^[a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*$
+                                      type: string
+                                    namespace:
+                                      description: |-
+                                        Namespace of the resource being referred to.
+                                        Ignored if referent is not cluster-scoped, otherwise defaults to the namespace of the referent.
+                                      maxLength: 63
+                                      minLength: 1
+                                      pattern: ^[a-z0-9]([-a-z0-9]*[a-z0-9])?$
+                                      type: string
+                                  required:
+                                    - name
+                                  type: object
+                                workloadIdentity:
+                                  description: Specify a service account with Workload Identity
+                                  properties:
+                                    clusterLocation:
+                                      description: |-
+                                        ClusterLocation is the location of the cluster
+                                        If not specified, it fetches information from the metadata server
+                                      type: string
+                                    clusterName:
+                                      description: |-
+                                        ClusterName is the name of the cluster
+                                        If not specified, it fetches information from the metadata server
+                                      type: string
+                                    clusterProjectID:
+                                      description: |-
+                                        ClusterProjectID is the project ID of the cluster
+                                        If not specified, it fetches information from the metadata server
+                                      type: string
+                                    serviceAccountRef:
+                                      description: ServiceAccountSelector is a reference to a ServiceAccount resource.
+                                      properties:
+                                        audiences:
+                                          description: |-
+                                            Audience specifies the `aud` claim for the service account token
+                                            If the service account uses a well-known annotation for e.g. IRSA or GCP Workload Identity
+                                            then this audiences will be appended to the list
+                                          items:
+                                            type: string
+                                          type: array
+                                        name:
+                                          description: The name of the ServiceAccount resource being referred to.
+                                          maxLength: 253
+                                          minLength: 1
+                                          pattern: ^[a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*$
+                                          type: string
+                                        namespace:
+                                          description: |-
+                                            Namespace of the resource being referred to.
+                                            Ignored if referent is not cluster-scoped, otherwise defaults to the namespace of the referent.
+                                          maxLength: 63
+                                          minLength: 1
+                                          pattern: ^[a-z0-9]([-a-z0-9]*[a-z0-9])?$
+                                          type: string
+                                      required:
+                                        - name
+                                      type: object
+                                  required:
+                                    - serviceAccountRef
+                                  type: object
+                              required:
+                                - role
+                              type: object
                             iam:
                               description: |-
                                 Iam authenticates with vault by passing a special AWS request signed with AWS IAM credentials
@@ -24542,6 +24798,134 @@ spec:
                                           type: string
                                       type: object
                                   type: object
+                                gcp:
+                                  description: |-
+                                    Gcp authenticates with Vault using Google Cloud Platform authentication method
+                                    GCP authentication method
+                                  properties:
+                                    location:
+                                      description: Location optionally defines a location/region for the secret
+                                      type: string
+                                    path:
+                                      default: gcp
+                                      description: 'Path where the GCP auth method is enabled in Vault, e.g: "gcp"'
+                                      type: string
+                                    projectID:
+                                      description: Project ID of the Google Cloud Platform project
+                                      type: string
+                                    role:
+                                      description: Vault Role. In Vault, a role describes an identity with a set of permissions, groups, or policies you want to attach to a user of the secrets engine.
+                                      type: string
+                                    secretRef:
+                                      description: Specify credentials in a Secret object
+                                      properties:
+                                        secretAccessKeySecretRef:
+                                          description: The SecretAccessKey is used for authentication
+                                          properties:
+                                            key:
+                                              description: |-
+                                                A key in the referenced Secret.
+                                                Some instances of this field may be defaulted, in others it may be required.
+                                              maxLength: 253
+                                              minLength: 1
+                                              pattern: ^[-._a-zA-Z0-9]+$
+                                              type: string
+                                            name:
+                                              description: The name of the Secret resource being referred to.
+                                              maxLength: 253
+                                              minLength: 1
+                                              pattern: ^[a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*$
+                                              type: string
+                                            namespace:
+                                              description: |-
+                                                The namespace of the Secret resource being referred to.
+                                                Ignored if referent is not cluster-scoped, otherwise defaults to the namespace of the referent.
+                                              maxLength: 63
+                                              minLength: 1
+                                              pattern: ^[a-z0-9]([-a-z0-9]*[a-z0-9])?$
+                                              type: string
+                                          type: object
+                                      type: object
+                                    serviceAccountRef:
+                                      description: ServiceAccountRef to a service account for impersonation
+                                      properties:
+                                        audiences:
+                                          description: |-
+                                            Audience specifies the `aud` claim for the service account token
+                                            If the service account uses a well-known annotation for e.g. IRSA or GCP Workload Identity
+                                            then this audiences will be appended to the list
+                                          items:
+                                            type: string
+                                          type: array
+                                        name:
+                                          description: The name of the ServiceAccount resource being referred to.
+                                          maxLength: 253
+                                          minLength: 1
+                                          pattern: ^[a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*$
+                                          type: string
+                                        namespace:
+                                          description: |-
+                                            Namespace of the resource being referred to.
+                                            Ignored if referent is not cluster-scoped, otherwise defaults to the namespace of the referent.
+                                          maxLength: 63
+                                          minLength: 1
+                                          pattern: ^[a-z0-9]([-a-z0-9]*[a-z0-9])?$
+                                          type: string
+                                      required:
+                                        - name
+                                      type: object
+                                    workloadIdentity:
+                                      description: Specify a service account with Workload Identity
+                                      properties:
+                                        clusterLocation:
+                                          description: |-
+                                            ClusterLocation is the location of the cluster
+                                            If not specified, it fetches information from the metadata server
+                                          type: string
+                                        clusterName:
+                                          description: |-
+                                            ClusterName is the name of the cluster
+                                            If not specified, it fetches information from the metadata server
+                                          type: string
+                                        clusterProjectID:
+                                          description: |-
+                                            ClusterProjectID is the project ID of the cluster
+                                            If not specified, it fetches information from the metadata server
+                                          type: string
+                                        serviceAccountRef:
+                                          description: ServiceAccountSelector is a reference to a ServiceAccount resource.
+                                          properties:
+                                            audiences:
+                                              description: |-
+                                                Audience specifies the `aud` claim for the service account token
+                                                If the service account uses a well-known annotation for e.g. IRSA or GCP Workload Identity
+                                                then this audiences will be appended to the list
+                                              items:
+                                                type: string
+                                              type: array
+                                            name:
+                                              description: The name of the ServiceAccount resource being referred to.
+                                              maxLength: 253
+                                              minLength: 1
+                                              pattern: ^[a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*$
+                                              type: string
+                                            namespace:
+                                              description: |-
+                                                Namespace of the resource being referred to.
+                                                Ignored if referent is not cluster-scoped, otherwise defaults to the namespace of the referent.
+                                              maxLength: 63
+                                              minLength: 1
+                                              pattern: ^[a-z0-9]([-a-z0-9]*[a-z0-9])?$
+                                              type: string
+                                          required:
+                                            - name
+                                          type: object
+                                      required:
+                                        - serviceAccountRef
+                                      type: object
+                                  required:
+                                    - role
+                                  type: object
                                 iam:
                                   description: |-
                                     Iam authenticates with vault by passing a special AWS request signed with AWS IAM credentials
@@ -27091,6 +27475,134 @@ spec:
                                   type: string
                               type: object
                           type: object
+                        gcp:
+                          description: |-
+                            Gcp authenticates with Vault using Google Cloud Platform authentication method
+                            GCP authentication method
+                          properties:
+                            location:
+                              description: Location optionally defines a location/region for the secret
+                              type: string
+                            path:
+                              default: gcp
+                              description: 'Path where the GCP auth method is enabled in Vault, e.g: "gcp"'
+                              type: string
+                            projectID:
+                              description: Project ID of the Google Cloud Platform project
+                              type: string
+                            role:
+                              description: Vault Role. In Vault, a role describes an identity with a set of permissions, groups, or policies you want to attach to a user of the secrets engine.
+                              type: string
+                            secretRef:
+                              description: Specify credentials in a Secret object
+                              properties:
+                                secretAccessKeySecretRef:
+                                  description: The SecretAccessKey is used for authentication
+                                  properties:
+                                    key:
+                                      description: |-
+                                        A key in the referenced Secret.
+                                        Some instances of this field may be defaulted, in others it may be required.
+                                      maxLength: 253
+                                      minLength: 1
+                                      pattern: ^[-._a-zA-Z0-9]+$
+                                      type: string
+                                    name:
+                                      description: The name of the Secret resource being referred to.
+                                      maxLength: 253
+                                      minLength: 1
+                                      pattern: ^[a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*$
+                                      type: string
+                                    namespace:
+                                      description: |-
+                                        The namespace of the Secret resource being referred to.
+                                        Ignored if referent is not cluster-scoped, otherwise defaults to the namespace of the referent.
+                                      maxLength: 63
+                                      minLength: 1
+                                      pattern: ^[a-z0-9]([-a-z0-9]*[a-z0-9])?$
+                                      type: string
+                                  type: object
+                              type: object
+                            serviceAccountRef:
+                              description: ServiceAccountRef to a service account for impersonation
+                              properties:
+                                audiences:
+                                  description: |-
+                                    Audience specifies the `aud` claim for the service account token
+                                    If the service account uses a well-known annotation for e.g. IRSA or GCP Workload Identity
+                                    then this audiences will be appended to the list
+                                  items:
+                                    type: string
+                                  type: array
+                                name:
+                                  description: The name of the ServiceAccount resource being referred to.
+                                  maxLength: 253
+                                  minLength: 1
+                                  pattern: ^[a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*$
+                                  type: string
+                                namespace:
+                                  description: |-
+                                    Namespace of the resource being referred to.
+                                    Ignored if referent is not cluster-scoped, otherwise defaults to the namespace of the referent.
+                                  maxLength: 63
+                                  minLength: 1
+                                  pattern: ^[a-z0-9]([-a-z0-9]*[a-z0-9])?$
+                                  type: string
+                              required:
+                                - name
+                              type: object
+                            workloadIdentity:
+                              description: Specify a service account with Workload Identity
+                              properties:
+                                clusterLocation:
+                                  description: |-
+                                    ClusterLocation is the location of the cluster
+                                    If not specified, it fetches information from the metadata server
+                                  type: string
+                                clusterName:
+                                  description: |-
+                                    ClusterName is the name of the cluster
+                                    If not specified, it fetches information from the metadata server
+                                  type: string
+                                clusterProjectID:
+                                  description: |-
+                                    ClusterProjectID is the project ID of the cluster
+                                    If not specified, it fetches information from the metadata server
+                                  type: string
+                                serviceAccountRef:
+                                  description: ServiceAccountSelector is a reference to a ServiceAccount resource.
+                                  properties:
+                                    audiences:
+                                      description: |-
+                                        Audience specifies the `aud` claim for the service account token
+                                        If the service account uses a well-known annotation for e.g. IRSA or GCP Workload Identity
+                                        then this audiences will be appended to the list
+                                      items:
+                                        type: string
+                                      type: array
+                                    name:
+                                      description: The name of the ServiceAccount resource being referred to.
+                                      maxLength: 253
+                                      minLength: 1
+                                      pattern: ^[a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*$
+                                      type: string
+                                    namespace:
+                                      description: |-
+                                        Namespace of the resource being referred to.
+                                        Ignored if referent is not cluster-scoped, otherwise defaults to the namespace of the referent.
+                                      maxLength: 63
+                                      minLength: 1
+                                      pattern: ^[a-z0-9]([-a-z0-9]*[a-z0-9])?$
+                                      type: string
+                                  required:
+                                    - name
+                                  type: object
+                              required:
+                                - serviceAccountRef
+                              type: object
+                          required:
+                            - role
+                          type: object
                         iam:
                           description: |-
                             Iam authenticates with vault by passing a special AWS request signed with AWS IAM credentials

+ 132 - 5
docs/api/spec.md

@@ -5272,7 +5272,8 @@ GCPWorkloadIdentityFederation
 </h3>
 <p>
 (<em>Appears on:</em>
-<a href="#external-secrets.io/v1.GCPSMAuth">GCPSMAuth</a>)
+<a href="#external-secrets.io/v1.GCPSMAuth">GCPSMAuth</a>, 
+<a href="#external-secrets.io/v1.VaultGCPAuth">VaultGCPAuth</a>)
 </p>
 <p>
 <p>GCPSMAuthSecretRef contains the secret references for GCP Secret Manager authentication.</p>
@@ -5378,7 +5379,8 @@ Possible values are:
 </h3>
 <p>
 (<em>Appears on:</em>
-<a href="#external-secrets.io/v1.GCPSMAuth">GCPSMAuth</a>)
+<a href="#external-secrets.io/v1.GCPSMAuth">GCPSMAuth</a>, 
+<a href="#external-secrets.io/v1.VaultGCPAuth">VaultGCPAuth</a>)
 </p>
 <p>
 <p>GCPWorkloadIdentity defines configuration for workload identity authentication to GCP.</p>
@@ -10353,7 +10355,7 @@ resource is used as the app role secret.</p>
 </p>
 <p>
 <p>VaultAuth is the configuration used to authenticate with a Vault server.
-Only one of <code>tokenSecretRef</code>, <code>appRole</code>,  <code>kubernetes</code>, <code>ldap</code>, <code>userPass</code>, <code>jwt</code> or <code>cert</code>
+Only one of <code>tokenSecretRef</code>, <code>appRole</code>,  <code>kubernetes</code>, <code>ldap</code>, <code>userPass</code>, <code>jwt</code>, <code>cert</code>, <code>iam</code> or <code>gcp</code>
 can be specified. A namespace to authenticate against can optionally be specified.</p>
 </p>
 <table>
@@ -10498,6 +10500,21 @@ VaultUserPassAuth
 <p>UserPass authenticates with Vault by passing username/password pair</p>
 </td>
 </tr>
+<tr>
+<td>
+<code>gcp</code></br>
+<em>
+<a href="#external-secrets.io/v1.VaultGCPAuth">
+VaultGCPAuth
+</a>
+</em>
+</td>
+<td>
+<em>(Optional)</em>
+<p>Gcp authenticates with Vault using Google Cloud Platform authentication method
+GCP authentication method</p>
+</td>
+</tr>
 </tbody>
 </table>
 <h3 id="external-secrets.io/v1.VaultAwsAuth">VaultAwsAuth
@@ -10788,6 +10805,117 @@ If no key for the Secret is specified, external-secret will default to &lsquo;tl
 </tr>
 </tbody>
 </table>
+<h3 id="external-secrets.io/v1.VaultGCPAuth">VaultGCPAuth
+</h3>
+<p>
+(<em>Appears on:</em>
+<a href="#external-secrets.io/v1.VaultAuth">VaultAuth</a>)
+</p>
+<p>
+<p>VaultGCPAuth authenticates with Vault using Google Cloud Platform authentication method.
+Refer: <a href="https://developer.hashicorp.com/vault/docs/auth/gcp">https://developer.hashicorp.com/vault/docs/auth/gcp</a></p>
+<p>When ServiceAccountRef, SecretRef and WorkloadIdentity are not specified, the provider will use the controller pod&rsquo;s
+identity to authenticate with GCP. This supports both GKE Workload Identity and service account keys.</p>
+</p>
+<table>
+<thead>
+<tr>
+<th>Field</th>
+<th>Description</th>
+</tr>
+</thead>
+<tbody>
+<tr>
+<td>
+<code>path</code></br>
+<em>
+string
+</em>
+</td>
+<td>
+<em>(Optional)</em>
+<p>Path where the GCP auth method is enabled in Vault, e.g: &ldquo;gcp&rdquo;</p>
+</td>
+</tr>
+<tr>
+<td>
+<code>role</code></br>
+<em>
+string
+</em>
+</td>
+<td>
+<p>Vault Role. In Vault, a role describes an identity with a set of permissions, groups, or policies you want to attach to a user of the secrets engine.</p>
+</td>
+</tr>
+<tr>
+<td>
+<code>projectID</code></br>
+<em>
+string
+</em>
+</td>
+<td>
+<em>(Optional)</em>
+<p>Project ID of the Google Cloud Platform project</p>
+</td>
+</tr>
+<tr>
+<td>
+<code>location</code></br>
+<em>
+string
+</em>
+</td>
+<td>
+<em>(Optional)</em>
+<p>Location optionally defines a location/region for the secret</p>
+</td>
+</tr>
+<tr>
+<td>
+<code>secretRef</code></br>
+<em>
+<a href="#external-secrets.io/v1.GCPSMAuthSecretRef">
+GCPSMAuthSecretRef
+</a>
+</em>
+</td>
+<td>
+<em>(Optional)</em>
+<p>Specify credentials in a Secret object</p>
+</td>
+</tr>
+<tr>
+<td>
+<code>workloadIdentity</code></br>
+<em>
+<a href="#external-secrets.io/v1.GCPWorkloadIdentity">
+GCPWorkloadIdentity
+</a>
+</em>
+</td>
+<td>
+<em>(Optional)</em>
+<p>Specify a service account with Workload Identity</p>
+</td>
+</tr>
+<tr>
+<td>
+<code>serviceAccountRef</code></br>
+<em>
+<a href="https://pkg.go.dev/github.com/external-secrets/external-secrets/apis/meta/v1#ServiceAccountSelector">
+External Secrets meta/v1.ServiceAccountSelector
+</a>
+</em>
+</td>
+<td>
+<em>(Optional)</em>
+<p>ServiceAccountRef to a service account for impersonation</p>
+</td>
+</tr>
+</tbody>
+</table>
 <h3 id="external-secrets.io/v1.VaultIamAuth">VaultIamAuth
 </h3>
 <p>
@@ -11214,8 +11342,7 @@ method</p>
 <a href="#external-secrets.io/v1.SecretStoreProvider">SecretStoreProvider</a>)
 </p>
 <p>
-<p>VaultProvider configures a store to sync secrets using a HashiCorp Vault
-KV backend.</p>
+<p>VaultProvider configures a store to sync secrets using a Hashicorp Vault KV backend.</p>
 </p>
 <table>
 <thead>

+ 25 - 0
generators/v1/vault/go.mod

@@ -17,6 +17,11 @@ require (
 )
 
 require (
+	cloud.google.com/go/auth v0.17.0 // indirect
+	cloud.google.com/go/auth/oauth2adapt v0.2.8 // indirect
+	cloud.google.com/go/compute/metadata v0.9.0 // indirect
+	cloud.google.com/go/iam v1.5.3 // indirect
+	cloud.google.com/go/secretmanager v1.16.0 // indirect
 	dario.cat/mergo v1.0.2 // indirect
 	github.com/Masterminds/goutils v1.1.1 // indirect
 	github.com/Masterminds/semver/v3 v3.4.0 // indirect
@@ -44,11 +49,14 @@ require (
 	github.com/emicklei/go-restful/v3 v3.13.0 // indirect
 	github.com/evanphx/json-patch/v5 v5.9.11 // indirect
 	github.com/external-secrets/external-secrets/providers/v1/aws v0.0.0-20251103072335-a9b233b6936f // indirect
+	github.com/external-secrets/external-secrets/providers/v1/gcp v0.0.0-20251104073127-4d2c8fd13e10 // indirect
 	github.com/fatih/color v1.18.0 // indirect
+	github.com/felixge/httpsnoop v1.0.4 // indirect
 	github.com/fsnotify/fsnotify v1.9.0 // indirect
 	github.com/fxamacker/cbor/v2 v2.9.0 // indirect
 	github.com/go-jose/go-jose/v4 v4.1.3 // indirect
 	github.com/go-logr/logr v1.4.3 // indirect
+	github.com/go-logr/stdr v1.2.2 // indirect
 	github.com/go-openapi/jsonpointer v0.22.1 // indirect
 	github.com/go-openapi/jsonreference v0.21.2 // indirect
 	github.com/go-openapi/swag v0.25.1 // indirect
@@ -68,7 +76,10 @@ require (
 	github.com/golang-jwt/jwt/v5 v5.3.0 // indirect
 	github.com/google/btree v1.1.3 // indirect
 	github.com/google/gnostic-models v0.7.0 // indirect
+	github.com/google/s2a-go v0.1.9 // indirect
 	github.com/google/uuid v1.6.0 // indirect
+	github.com/googleapis/enterprise-certificate-proxy v0.3.6 // indirect
+	github.com/googleapis/gax-go/v2 v2.15.0 // indirect
 	github.com/hashicorp/errwrap v1.1.0 // indirect
 	github.com/hashicorp/go-cleanhttp v0.5.2 // indirect
 	github.com/hashicorp/go-hclog v1.6.3 // indirect
@@ -84,6 +95,7 @@ require (
 	github.com/hashicorp/hcl v1.0.1-vault-7 // indirect
 	github.com/hashicorp/vault/api/auth/approle v0.11.0 // indirect
 	github.com/hashicorp/vault/api/auth/aws v0.11.0 // indirect
+	github.com/hashicorp/vault/api/auth/gcp v0.11.0 // indirect
 	github.com/hashicorp/vault/api/auth/kubernetes v0.10.0 // indirect
 	github.com/hashicorp/vault/api/auth/ldap v0.11.0 // indirect
 	github.com/hashicorp/vault/api/auth/userpass v0.11.0 // indirect
@@ -119,7 +131,14 @@ require (
 	github.com/tidwall/gjson v1.18.0 // indirect
 	github.com/tidwall/match v1.2.0 // indirect
 	github.com/tidwall/pretty v1.2.1 // indirect
+	github.com/tidwall/sjson v1.2.5 // indirect
 	github.com/x448/float16 v0.8.4 // indirect
+	go.opentelemetry.io/auto/sdk v1.1.0 // indirect
+	go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.61.0 // indirect
+	go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.61.0 // indirect
+	go.opentelemetry.io/otel v1.37.0 // indirect
+	go.opentelemetry.io/otel/metric v1.37.0 // indirect
+	go.opentelemetry.io/otel/trace v1.37.0 // indirect
 	go.yaml.in/yaml/v2 v2.4.3 // indirect
 	go.yaml.in/yaml/v3 v3.0.4 // indirect
 	golang.org/x/crypto v0.43.0 // indirect
@@ -131,9 +150,15 @@ require (
 	golang.org/x/text v0.30.0 // indirect
 	golang.org/x/time v0.14.0 // indirect
 	gomodules.xyz/jsonpatch/v2 v2.5.0 // indirect
+	google.golang.org/api v0.253.0 // indirect
+	google.golang.org/genproto v0.0.0-20251022142026-3a174f9686a8 // indirect
+	google.golang.org/genproto/googleapis/api v0.0.0-20251014184007-4626949a642f // indirect
+	google.golang.org/genproto/googleapis/rpc v0.0.0-20251014184007-4626949a642f // indirect
+	google.golang.org/grpc v1.76.0 // indirect
 	google.golang.org/protobuf v1.36.10 // indirect
 	gopkg.in/evanphx/json-patch.v4 v4.13.0 // indirect
 	gopkg.in/inf.v0 v0.9.1 // indirect
+	grpc.go4.org v0.0.0-20170609214715-11d0a25b4919 // indirect
 	k8s.io/klog/v2 v2.130.1 // indirect
 	k8s.io/kube-openapi v0.0.0-20250910181357-589584f1c912 // indirect
 	k8s.io/utils v0.0.0-20251002143259-bc988d571ff4 // indirect

+ 71 - 0
generators/v1/vault/go.sum

@@ -1,3 +1,15 @@
+cloud.google.com/go v0.121.6 h1:waZiuajrI28iAf40cWgycWNgaXPO06dupuS+sgibK6c=
+cloud.google.com/go v0.121.6/go.mod h1:coChdst4Ea5vUpiALcYKXEpR1S9ZgXbhEzzMcMR66vI=
+cloud.google.com/go/auth v0.17.0 h1:74yCm7hCj2rUyyAocqnFzsAYXgJhrG26XCFimrc/Kz4=
+cloud.google.com/go/auth v0.17.0/go.mod h1:6wv/t5/6rOPAX4fJiRjKkJCvswLwdet7G8+UGXt7nCQ=
+cloud.google.com/go/auth/oauth2adapt v0.2.8 h1:keo8NaayQZ6wimpNSmW5OPc283g65QNIiLpZnkHRbnc=
+cloud.google.com/go/auth/oauth2adapt v0.2.8/go.mod h1:XQ9y31RkqZCcwJWNSx2Xvric3RrU88hAYYbjDWYDL+c=
+cloud.google.com/go/compute/metadata v0.9.0 h1:pDUj4QMoPejqq20dK0Pg2N4yG9zIkYGdBtwLoEkH9Zs=
+cloud.google.com/go/compute/metadata v0.9.0/go.mod h1:E0bWwX5wTnLPedCKqk3pJmVgCBSM6qQI1yTBdEb3C10=
+cloud.google.com/go/iam v1.5.3 h1:+vMINPiDF2ognBJ97ABAYYwRgsaqxPbQDlMnbHMjolc=
+cloud.google.com/go/iam v1.5.3/go.mod h1:MR3v9oLkZCTlaqljW6Eb2d3HGDGK5/bDv93jhfISFvU=
+cloud.google.com/go/secretmanager v1.16.0 h1:19QT7ZsLJ8FSP1k+4esQvuCD7npMJml6hYzilxVyT+k=
+cloud.google.com/go/secretmanager v1.16.0/go.mod h1://C/e4I8D26SDTz1f3TQcddhcmiC3rMEl0S1Cakvs3Q=
 dario.cat/mergo v1.0.2 h1:85+piFYR1tMbRrLcDwR18y4UKJ3aH1Tbzi24VRW1TK8=
 dario.cat/mergo v1.0.2/go.mod h1:E/hbnu0NxMFBjpMIE34DRGLWqDy0g5FuKDhCb31ngxA=
 github.com/Masterminds/goutils v1.1.1 h1:5nUrii3FMTL5diU80unEVvNevw1nH4+ZV4DSLVJLSYI=
@@ -43,6 +55,8 @@ github.com/cenkalti/backoff/v4 v4.3.0 h1:MyRJ/UdXutAwSAT+s3wNd7MfTIcy71VQueUuFK3
 github.com/cenkalti/backoff/v4 v4.3.0/go.mod h1:Y3VNntkOUPxTVeUxJ/G5vcM//AlwfmyYozVcomhLiZE=
 github.com/cespare/xxhash/v2 v2.3.0 h1:UL815xU9SqsFlibzuggzjXhog7bL6oX9BbNZnL2UFvs=
 github.com/cespare/xxhash/v2 v2.3.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs=
+github.com/cncf/xds/go v0.0.0-20250501225837-2ac532fd4443 h1:aQ3y1lwWyqYPiWZThqv1aFbZMiM9vblcSArJRf2Irls=
+github.com/cncf/xds/go v0.0.0-20250501225837-2ac532fd4443/go.mod h1:W+zGtBO5Y1IgJhy4+A9GOqVhqLpfZi+vwmdNXUehLA8=
 github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E=
 github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
 github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=
@@ -51,13 +65,22 @@ github.com/decred/dcrd/dcrec/secp256k1/v4 v4.4.0 h1:NMZiJj8QnKe1LgsbDayM4UoHwbvw
 github.com/decred/dcrd/dcrec/secp256k1/v4 v4.4.0/go.mod h1:ZXNYxsqcloTdSy/rNShjYzMhyjf0LaoftYK0p+A3h40=
 github.com/emicklei/go-restful/v3 v3.13.0 h1:C4Bl2xDndpU6nJ4bc1jXd+uTmYPVUwkD6bFY/oTyCes=
 github.com/emicklei/go-restful/v3 v3.13.0/go.mod h1:6n3XBCmQQb25CM2LCACGz8ukIrRry+4bhvbpWn3mrbc=
+github.com/envoyproxy/go-control-plane v0.13.4 h1:zEqyPVyku6IvWCFwux4x9RxkLOMUL+1vC9xUFv5l2/M=
+github.com/envoyproxy/go-control-plane/envoy v1.32.4 h1:jb83lalDRZSpPWW2Z7Mck/8kXZ5CQAFYVjQcdVIr83A=
+github.com/envoyproxy/go-control-plane/envoy v1.32.4/go.mod h1:Gzjc5k8JcJswLjAx1Zm+wSYE20UrLtt7JZMWiWQXQEw=
+github.com/envoyproxy/protoc-gen-validate v1.2.1 h1:DEo3O99U8j4hBFwbJfrz9VtgcDfUKS7KJ7spH3d86P8=
+github.com/envoyproxy/protoc-gen-validate v1.2.1/go.mod h1:d/C80l/jxXLdfEIhX1W2TmLfsJ31lvEjwamM4DxlWXU=
 github.com/evanphx/json-patch v0.5.2 h1:xVCHIVMUu1wtM/VkR9jVZ45N3FhZfYMMYGorLCR8P3k=
 github.com/evanphx/json-patch v0.5.2/go.mod h1:ZWS5hhDbVDyob71nXKNL0+PWn6ToqBHMikGIFbs31qQ=
 github.com/evanphx/json-patch/v5 v5.9.11 h1:/8HVnzMq13/3x9TPvjG08wUGqBTmZBsCWzjTM0wiaDU=
 github.com/evanphx/json-patch/v5 v5.9.11/go.mod h1:3j+LviiESTElxA4p3EMKAB9HXj3/XEtnUf6OZxqIQTM=
+github.com/external-secrets/external-secrets/providers/v1/gcp v0.0.0-20251104073127-4d2c8fd13e10 h1:tPYE3zcBAepYacYbhzTgZyQ/yxbXdzQqCmMsH7D54xk=
+github.com/external-secrets/external-secrets/providers/v1/gcp v0.0.0-20251104073127-4d2c8fd13e10/go.mod h1:iwajJm1aNMXI1bgCs/W5S846IfZ6lUcPiYXSyRWEDbI=
 github.com/fatih/color v1.13.0/go.mod h1:kLAiJbzzSOZDVNGyDpeOxJ47H46qBXwg5ILebYFFOfk=
 github.com/fatih/color v1.18.0 h1:S8gINlzdQ840/4pfAwic/ZE0djQEH3wM94VfqLTZcOM=
 github.com/fatih/color v1.18.0/go.mod h1:4FelSpRwEGDpQ12mAdzqdOukCy4u8WUtOY6lkT/6HfU=
+github.com/felixge/httpsnoop v1.0.4 h1:NFTV2Zj1bL4mc9sqWACXbQFVBBg2W3GPvqp8/ESS2Wg=
+github.com/felixge/httpsnoop v1.0.4/go.mod h1:m8KPJKqk1gH5J9DgRY2ASl2lWCfGKXixSwevea8zH2U=
 github.com/frankban/quicktest v1.14.6 h1:7Xjx+VpznH+oBnejlPUj8oUpdxnVs4f8XU8WnHkI4W8=
 github.com/frankban/quicktest v1.14.6/go.mod h1:4ptaffx2x8+WTWXmUCuVU6aPUX1/Mz7zb5vbUoiM6w0=
 github.com/fsnotify/fsnotify v1.9.0 h1:2Ml+OJNzbYCTzsxtv8vKSFD9PbJjmhYF14k/jKC7S9k=
@@ -66,8 +89,11 @@ github.com/fxamacker/cbor/v2 v2.9.0 h1:NpKPmjDBgUfBms6tr6JZkTHtfFGcMKsw3eGcmD/sa
 github.com/fxamacker/cbor/v2 v2.9.0/go.mod h1:vM4b+DJCtHn+zz7h3FFp/hDAI9WNWCsZj23V5ytsSxQ=
 github.com/go-jose/go-jose/v4 v4.1.3 h1:CVLmWDhDVRa6Mi/IgCgaopNosCaHz7zrMeF9MlZRkrs=
 github.com/go-jose/go-jose/v4 v4.1.3/go.mod h1:x4oUasVrzR7071A4TnHLGSPpNOm2a21K9Kf04k1rs08=
+github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A=
 github.com/go-logr/logr v1.4.3 h1:CjnDlHq8ikf6E492q6eKboGOC0T8CDaOvkHCIg8idEI=
 github.com/go-logr/logr v1.4.3/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY=
+github.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag=
+github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE=
 github.com/go-logr/zapr v1.3.0 h1:XGdV8XW8zdwFiwOA2Dryh1gj2KRQyOOoNmBy4EplIcQ=
 github.com/go-logr/zapr v1.3.0/go.mod h1:YKepepNBd1u/oyhd/yQmtjVXmm9uML4IXUgMOwR8/Gg=
 github.com/go-openapi/jsonpointer v0.22.1 h1:sHYI1He3b9NqJ4wXLoJDKmUmHkWy/L7rtEo92JUxBNk=
@@ -113,6 +139,8 @@ github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q=
 github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q=
 github.com/golang-jwt/jwt/v5 v5.3.0 h1:pv4AsKCKKZuqlgs5sUmn4x8UlGa0kEVt/puTpKx9vvo=
 github.com/golang-jwt/jwt/v5 v5.3.0/go.mod h1:fxCRLWMO43lRc8nhHWY6LGqRcf+1gQWArsqaEUEa5bE=
+github.com/golang/protobuf v1.5.4 h1:i7eJL8qZTpSEXOPTxNKhASYpMn+8e5Q6AdndVa1dWek=
+github.com/golang/protobuf v1.5.4/go.mod h1:lnTiLA8Wa4RWRcIUkrtSVa5nRhsEGBg48fD6rSs7xps=
 github.com/google/btree v1.1.3 h1:CVpQJjYgC4VbzxeGVHfvZrv1ctoYCAI8vbl07Fcxlyg=
 github.com/google/btree v1.1.3/go.mod h1:qOPhT0dTNdNzV6Z/lhRX0YXUafgPLFUh+gZMl761Gm4=
 github.com/google/gnostic-models v0.7.0 h1:qwTtogB15McXDaNqTZdzPJRHvaVJlAl+HVQnLmJEJxo=
@@ -124,8 +152,14 @@ github.com/google/gofuzz v1.2.0 h1:xRy4A+RhZaiKjJ1bPfwQ8sedCA+YS2YcCHW6ec7JMi0=
 github.com/google/gofuzz v1.2.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg=
 github.com/google/pprof v0.0.0-20241029153458-d1b30febd7db h1:097atOisP2aRj7vFgYQBbFN4U4JNXUNYpxael3UzMyo=
 github.com/google/pprof v0.0.0-20241029153458-d1b30febd7db/go.mod h1:vavhavw2zAxS5dIdcRluK6cSGGPlZynqzFM8NdvU144=
+github.com/google/s2a-go v0.1.9 h1:LGD7gtMgezd8a/Xak7mEWL0PjoTQFvpRudN895yqKW0=
+github.com/google/s2a-go v0.1.9/go.mod h1:YA0Ei2ZQL3acow2O62kdp9UlnvMmU7kA6Eutn0dXayM=
 github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0=
 github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
+github.com/googleapis/enterprise-certificate-proxy v0.3.6 h1:GW/XbdyBFQ8Qe+YAmFU9uHLo7OnF5tL52HFAgMmyrf4=
+github.com/googleapis/enterprise-certificate-proxy v0.3.6/go.mod h1:MkHOF77EYAE7qfSuSS9PU6g4Nt4e11cnsDUowfwewLA=
+github.com/googleapis/gax-go/v2 v2.15.0 h1:SyjDc1mGgZU5LncH8gimWo9lW1DtIfPibOG81vgd/bo=
+github.com/googleapis/gax-go/v2 v2.15.0/go.mod h1:zVVkkxAQHa1RQpg9z2AUCMnKhi0Qld9rcmyfL1OZhoc=
 github.com/hashicorp/errwrap v1.0.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4=
 github.com/hashicorp/errwrap v1.1.0 h1:OxrOeh75EUXMY8TBjag2fzXGZ40LB6IKw45YeGUDY2I=
 github.com/hashicorp/errwrap v1.1.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4=
@@ -160,6 +194,8 @@ github.com/hashicorp/vault/api/auth/approle v0.11.0 h1:ViUvgqoSTqHkMi1L1Rr/LnQ+P
 github.com/hashicorp/vault/api/auth/approle v0.11.0/go.mod h1:v8ZqBRw+GP264ikIw2sEBKF0VT72MEhLWnZqWt3xEG8=
 github.com/hashicorp/vault/api/auth/aws v0.11.0 h1:lWdUxrzvPotg6idNr62al4w97BgI9xTDdzMCTViNH2s=
 github.com/hashicorp/vault/api/auth/aws v0.11.0/go.mod h1:PWqdH/xqaudapmnnGP9ip2xbxT/kRW2qEgpqiQff6Gc=
+github.com/hashicorp/vault/api/auth/gcp v0.11.0 h1:BSK+2Ji2OGSzM4pRVY7boa+2qPW8uiWZAYOrrt0XcJM=
+github.com/hashicorp/vault/api/auth/gcp v0.11.0/go.mod h1:EbW5XSmkdUiWsSAYV33TbDR2zVi8QTo29LAfPByFhag=
 github.com/hashicorp/vault/api/auth/kubernetes v0.10.0 h1:5rqWmUFxnu3S7XYq9dafURwBgabYDFzo2Wv+AMopPHs=
 github.com/hashicorp/vault/api/auth/kubernetes v0.10.0/go.mod h1:cZZmhF6xboMDmDbMY52oj2DKW6gS0cQ9g0pJ5XIXQ5U=
 github.com/hashicorp/vault/api/auth/ldap v0.11.0 h1:jd6gJXeFR4jyDbAh6R4RoW1uq6kmTt7M/vjW41jXczA=
@@ -233,6 +269,8 @@ github.com/oracle/oci-go-sdk/v65 v65.102.1 h1:zLNLz5dVzZxOf5DK/f3WGZUjwrQ9m27fd4
 github.com/oracle/oci-go-sdk/v65 v65.102.1/go.mod h1:oB8jFGVc/7/zJ+DbleE8MzGHjhs2ioCz5stRTdZdIcY=
 github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4=
 github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
+github.com/planetscale/vtprotobuf v0.6.1-0.20240319094008-0393e58bdf10 h1:GFCKgmp0tecUJ0sJuv4pzYCqS9+RGSn52M3FUwPs+uo=
+github.com/planetscale/vtprotobuf v0.6.1-0.20240319094008-0393e58bdf10/go.mod h1:t/avpk3KcrXxUnYOhZhMXJlSEyie6gQbtLq5NM3loB8=
 github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
 github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
 github.com/prometheus/client_golang v1.23.2 h1:Je96obch5RDVy3FDMndoUsjAhG5Edi49h0RJWRi/o0o=
@@ -272,6 +310,7 @@ github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO
 github.com/stretchr/testify v1.8.2/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4=
 github.com/stretchr/testify v1.11.1 h1:7s2iGBzp5EwR7/aIZr8ao5+dra3wiQyKjjFuvgVKu7U=
 github.com/stretchr/testify v1.11.1/go.mod h1:wZwfW3scLgRK+23gO65QZefKpKQRnfz6sD981Nm4B6U=
+github.com/tidwall/gjson v1.14.2/go.mod h1:/wbyibRr2FHMks5tjHJ5F8dMZh3AcwJEMf5vlfC0lxk=
 github.com/tidwall/gjson v1.18.0 h1:FIDeeyB800efLX89e5a8Y0BNH+LOngJyGrIWxG2FKQY=
 github.com/tidwall/gjson v1.18.0/go.mod h1:/wbyibRr2FHMks5tjHJ5F8dMZh3AcwJEMf5vlfC0lxk=
 github.com/tidwall/match v1.1.1/go.mod h1:eRSPERbgtNPcGhD8UCthc6PmLEQXEWd3PRB5JTxsfmM=
@@ -280,12 +319,30 @@ github.com/tidwall/match v1.2.0/go.mod h1:eRSPERbgtNPcGhD8UCthc6PmLEQXEWd3PRB5JT
 github.com/tidwall/pretty v1.2.0/go.mod h1:ITEVvHYasfjBbM0u2Pg8T2nJnzm8xPwvNhhsoaGGjNU=
 github.com/tidwall/pretty v1.2.1 h1:qjsOFOWWQl+N3RsoF5/ssm1pHmJJwhjlSbZ51I6wMl4=
 github.com/tidwall/pretty v1.2.1/go.mod h1:ITEVvHYasfjBbM0u2Pg8T2nJnzm8xPwvNhhsoaGGjNU=
+github.com/tidwall/sjson v1.2.5 h1:kLy8mja+1c9jlljvWTlSazM7cKDRfJuR/bOJhcY5NcY=
+github.com/tidwall/sjson v1.2.5/go.mod h1:Fvgq9kS/6ociJEDnK0Fk1cpYF4FIW6ZF7LAe+6jwd28=
 github.com/x448/float16 v0.8.4 h1:qLwI1I70+NjRFUR3zs1JPUCgaCXSh3SW62uAKT1mSBM=
 github.com/x448/float16 v0.8.4/go.mod h1:14CWIYCyZA/cWjXOioeEpHeN/83MdbZDRQHoFcYsOfg=
 github.com/youmark/pkcs8 v0.0.0-20240726163527-a2c0da244d78 h1:ilQV1hzziu+LLM3zUTJ0trRztfwgjqKnBWNtSRkbmwM=
 github.com/youmark/pkcs8 v0.0.0-20240726163527-a2c0da244d78/go.mod h1:aL8wCCfTfSfmXjznFBSZNN13rSJjlIOI1fUNAtF7rmI=
 github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
 github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
+go.opentelemetry.io/auto/sdk v1.1.0 h1:cH53jehLUN6UFLY71z+NDOiNJqDdPRaXzTel0sJySYA=
+go.opentelemetry.io/auto/sdk v1.1.0/go.mod h1:3wSPjt5PWp2RhlCcmmOial7AvC4DQqZb7a7wCow3W8A=
+go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.61.0 h1:q4XOmH/0opmeuJtPsbFNivyl7bCt7yRBbeEm2sC/XtQ=
+go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.61.0/go.mod h1:snMWehoOh2wsEwnvvwtDyFCxVeDAODenXHtn5vzrKjo=
+go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.61.0 h1:F7Jx+6hwnZ41NSFTO5q4LYDtJRXBf2PD0rNBkeB/lus=
+go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.61.0/go.mod h1:UHB22Z8QsdRDrnAtX4PntOl36ajSxcdUMt1sF7Y6E7Q=
+go.opentelemetry.io/otel v1.37.0 h1:9zhNfelUvx0KBfu/gb+ZgeAfAgtWrfHJZcAqFC228wQ=
+go.opentelemetry.io/otel v1.37.0/go.mod h1:ehE/umFRLnuLa/vSccNq9oS1ErUlkkK71gMcN34UG8I=
+go.opentelemetry.io/otel/metric v1.37.0 h1:mvwbQS5m0tbmqML4NqK+e3aDiO02vsf/WgbsdpcPoZE=
+go.opentelemetry.io/otel/metric v1.37.0/go.mod h1:04wGrZurHYKOc+RKeye86GwKiTb9FKm1WHtO+4EVr2E=
+go.opentelemetry.io/otel/sdk v1.37.0 h1:ItB0QUqnjesGRvNcmAcU0LyvkVyGJ2xftD29bWdDvKI=
+go.opentelemetry.io/otel/sdk v1.37.0/go.mod h1:VredYzxUvuo2q3WRcDnKDjbdvmO0sCzOvVAiY+yUkAg=
+go.opentelemetry.io/otel/sdk/metric v1.37.0 h1:90lI228XrB9jCMuSdA0673aubgRobVZFhbjxHHspCPc=
+go.opentelemetry.io/otel/sdk/metric v1.37.0/go.mod h1:cNen4ZWfiD37l5NhS+Keb5RXVWZWpRE+9WyVCpbo5ps=
+go.opentelemetry.io/otel/trace v1.37.0 h1:HLdcFNbRQBE2imdSEgm/kwqmQj1Or1l/7bW6mxVK7z4=
+go.opentelemetry.io/otel/trace v1.37.0/go.mod h1:TlgrlQ+PtQO5XFerSPUYG0JSgGyryXewPGyayAWSBS0=
 go.uber.org/automaxprocs v1.6.0 h1:O3y2/QNTOdbF+e/dpXNNW7Rx2hZ4sTIPyybbxyNqTUs=
 go.uber.org/automaxprocs v1.6.0/go.mod h1:ifeIMSnPZuznNm6jmdzmU3/bfk01Fe2fotchwEFJ8r8=
 go.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto=
@@ -350,6 +407,18 @@ golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8T
 golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
 gomodules.xyz/jsonpatch/v2 v2.5.0 h1:JELs8RLM12qJGXU4u/TO3V25KW8GreMKl9pdkk14RM0=
 gomodules.xyz/jsonpatch/v2 v2.5.0/go.mod h1:AH3dM2RI6uoBZxn3LVrfvJ3E0/9dG4cSrbuBJT4moAY=
+gonum.org/v1/gonum v0.16.0 h1:5+ul4Swaf3ESvrOnidPp4GZbzf0mxVQpDCYUQE7OJfk=
+gonum.org/v1/gonum v0.16.0/go.mod h1:fef3am4MQ93R2HHpKnLk4/Tbh/s0+wqD5nfa6Pnwy4E=
+google.golang.org/api v0.253.0 h1:apU86Eq9Q2eQco3NsUYFpVTfy7DwemojL7LmbAj7g/I=
+google.golang.org/api v0.253.0/go.mod h1:PX09ad0r/4du83vZVAaGg7OaeyGnaUmT/CYPNvtLCbw=
+google.golang.org/genproto v0.0.0-20251022142026-3a174f9686a8 h1:a12a2/BiVRxRWIqBbfqoSK6tgq8cyUgMnEI81QlPge0=
+google.golang.org/genproto v0.0.0-20251022142026-3a174f9686a8/go.mod h1:1Ic78BnpzY8OaTCmzxJDP4qC9INZPbGZl+54RKjtyeI=
+google.golang.org/genproto/googleapis/api v0.0.0-20251014184007-4626949a642f h1:OiFuztEyBivVKDvguQJYWq1yDcfAHIID/FVrPR4oiI0=
+google.golang.org/genproto/googleapis/api v0.0.0-20251014184007-4626949a642f/go.mod h1:kprOiu9Tr0JYyD6DORrc4Hfyk3RFXqkQ3ctHEum3ZbM=
+google.golang.org/genproto/googleapis/rpc v0.0.0-20251014184007-4626949a642f h1:1FTH6cpXFsENbPR5Bu8NQddPSaUUE6NA2XdZdDSAJK4=
+google.golang.org/genproto/googleapis/rpc v0.0.0-20251014184007-4626949a642f/go.mod h1:7i2o+ce6H/6BluujYR+kqX3GKH+dChPTQU19wjRPiGk=
+google.golang.org/grpc v1.76.0 h1:UnVkv1+uMLYXoIz6o7chp59WfQUYA2ex/BXQ9rHZu7A=
+google.golang.org/grpc v1.76.0/go.mod h1:Ju12QI8M6iQJtbcsV+awF5a4hfJMLi4X0JLo94ULZ6c=
 google.golang.org/protobuf v1.36.10 h1:AYd7cD/uASjIL6Q9LiTjz8JLcrh/88q5UObnmY3aOOE=
 google.golang.org/protobuf v1.36.10/go.mod h1:HTf+CrKn2C3g5S8VImy6tdcUvCska2kB7j23XfzDpco=
 gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
@@ -368,6 +437,8 @@ gopkg.in/yaml.v2 v2.3.0/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
 gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
 gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=
 gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
+grpc.go4.org v0.0.0-20170609214715-11d0a25b4919 h1:tmXTu+dfa+d9Evp8NpJdgOy6+rt8/x4yG7qPBrtNfLY=
+grpc.go4.org v0.0.0-20170609214715-11d0a25b4919/go.mod h1:77eQGdRu53HpSqPFJFmuJdjuHRquDANNeA4x7B8WQ9o=
 k8s.io/api v0.34.1 h1:jC+153630BMdlFukegoEL8E/yT7aLyQkIVuwhmwDgJM=
 k8s.io/api v0.34.1/go.mod h1:SB80FxFtXn5/gwzCoN6QCtPD7Vbu5w2n1S0J5gFfTYk=
 k8s.io/apiextensions-apiserver v0.34.1 h1:NNPBva8FNAPt1iSVwIE0FsdrVriRXMsaWFMqJbII2CI=

+ 49 - 48
go.mod

@@ -118,58 +118,58 @@ require github.com/1Password/connect-sdk-go v1.5.3 // indirect
 
 require (
 	github.com/external-secrets/external-secrets/apis v0.0.0
-	github.com/external-secrets/external-secrets/generators/v1/acr v0.0.0-20251103072335-a9b233b6936f
-	github.com/external-secrets/external-secrets/generators/v1/cloudsmith v0.0.0-20251103072335-a9b233b6936f
-	github.com/external-secrets/external-secrets/generators/v1/ecr v0.0.0-20251103072335-a9b233b6936f
-	github.com/external-secrets/external-secrets/generators/v1/fake v0.0.0-20251103072335-a9b233b6936f
-	github.com/external-secrets/external-secrets/generators/v1/gcr v0.0.0-20251103072335-a9b233b6936f
-	github.com/external-secrets/external-secrets/generators/v1/github v0.0.0-20251103072335-a9b233b6936f
-	github.com/external-secrets/external-secrets/generators/v1/grafana v0.0.0-20251103072335-a9b233b6936f
-	github.com/external-secrets/external-secrets/generators/v1/mfa v0.0.0-20251103072335-a9b233b6936f
-	github.com/external-secrets/external-secrets/generators/v1/password v0.0.0-20251103072335-a9b233b6936f
-	github.com/external-secrets/external-secrets/generators/v1/quay v0.0.0-20251103072335-a9b233b6936f
-	github.com/external-secrets/external-secrets/generators/v1/sshkey v0.0.0-20251103072335-a9b233b6936f
-	github.com/external-secrets/external-secrets/generators/v1/sts v0.0.0-20251103072335-a9b233b6936f
-	github.com/external-secrets/external-secrets/generators/v1/uuid v0.0.0-20251103072335-a9b233b6936f
-	github.com/external-secrets/external-secrets/generators/v1/vault v0.0.0-20251103072335-a9b233b6936f
-	github.com/external-secrets/external-secrets/generators/v1/webhook v0.0.0-20251103072335-a9b233b6936f
-	github.com/external-secrets/external-secrets/providers/v1/akeyless v0.0.0-20251103072335-a9b233b6936f
-	github.com/external-secrets/external-secrets/providers/v1/alibaba v0.0.0-20251103072335-a9b233b6936f
+	github.com/external-secrets/external-secrets/generators/v1/acr v0.0.0-00010101000000-000000000000
+	github.com/external-secrets/external-secrets/generators/v1/cloudsmith v0.0.0-00010101000000-000000000000
+	github.com/external-secrets/external-secrets/generators/v1/ecr v0.0.0-00010101000000-000000000000
+	github.com/external-secrets/external-secrets/generators/v1/fake v0.0.0-00010101000000-000000000000
+	github.com/external-secrets/external-secrets/generators/v1/gcr v0.0.0-00010101000000-000000000000
+	github.com/external-secrets/external-secrets/generators/v1/github v0.0.0-00010101000000-000000000000
+	github.com/external-secrets/external-secrets/generators/v1/grafana v0.0.0-00010101000000-000000000000
+	github.com/external-secrets/external-secrets/generators/v1/mfa v0.0.0-00010101000000-000000000000
+	github.com/external-secrets/external-secrets/generators/v1/password v0.0.0-00010101000000-000000000000
+	github.com/external-secrets/external-secrets/generators/v1/quay v0.0.0-00010101000000-000000000000
+	github.com/external-secrets/external-secrets/generators/v1/sshkey v0.0.0-00010101000000-000000000000
+	github.com/external-secrets/external-secrets/generators/v1/sts v0.0.0-00010101000000-000000000000
+	github.com/external-secrets/external-secrets/generators/v1/uuid v0.0.0-00010101000000-000000000000
+	github.com/external-secrets/external-secrets/generators/v1/vault v0.0.0-00010101000000-000000000000
+	github.com/external-secrets/external-secrets/generators/v1/webhook v0.0.0-00010101000000-000000000000
+	github.com/external-secrets/external-secrets/providers/v1/akeyless v0.0.0-00010101000000-000000000000
+	github.com/external-secrets/external-secrets/providers/v1/alibaba v0.0.0-00010101000000-000000000000
 	github.com/external-secrets/external-secrets/providers/v1/aws v0.0.0-20251103072335-a9b233b6936f
 	github.com/external-secrets/external-secrets/providers/v1/azure v0.0.0-20251103072335-a9b233b6936f
-	github.com/external-secrets/external-secrets/providers/v1/beyondtrust v0.0.0-20251103072335-a9b233b6936f
-	github.com/external-secrets/external-secrets/providers/v1/bitwarden v0.0.0-20251103072335-a9b233b6936f
-	github.com/external-secrets/external-secrets/providers/v1/chef v0.0.0-20251103072335-a9b233b6936f
-	github.com/external-secrets/external-secrets/providers/v1/cloudru v0.0.0-20251103072335-a9b233b6936f
-	github.com/external-secrets/external-secrets/providers/v1/conjur v0.0.0-20251103072335-a9b233b6936f
-	github.com/external-secrets/external-secrets/providers/v1/delinea v0.0.0-20251103072335-a9b233b6936f
-	github.com/external-secrets/external-secrets/providers/v1/device42 v0.0.0-20251103072335-a9b233b6936f
-	github.com/external-secrets/external-secrets/providers/v1/doppler v0.0.0-20251103072335-a9b233b6936f
-	github.com/external-secrets/external-secrets/providers/v1/fake v0.0.0-20251103072335-a9b233b6936f
-	github.com/external-secrets/external-secrets/providers/v1/fortanix v0.0.0-20251103072335-a9b233b6936f
-	github.com/external-secrets/external-secrets/providers/v1/gcp v0.0.0-20251103072335-a9b233b6936f
-	github.com/external-secrets/external-secrets/providers/v1/github v0.0.0-20251103072335-a9b233b6936f
-	github.com/external-secrets/external-secrets/providers/v1/gitlab v0.0.0-20251103072335-a9b233b6936f
-	github.com/external-secrets/external-secrets/providers/v1/ibm v0.0.0-20251103072335-a9b233b6936f
-	github.com/external-secrets/external-secrets/providers/v1/infisical v0.0.0-20251103072335-a9b233b6936f
-	github.com/external-secrets/external-secrets/providers/v1/keepersecurity v0.0.0-20251103072335-a9b233b6936f
-	github.com/external-secrets/external-secrets/providers/v1/kubernetes v0.0.0-20251103072335-a9b233b6936f
-	github.com/external-secrets/external-secrets/providers/v1/ngrok v0.0.0-20251103072335-a9b233b6936f
-	github.com/external-secrets/external-secrets/providers/v1/onboardbase v0.0.0-20251103072335-a9b233b6936f
-	github.com/external-secrets/external-secrets/providers/v1/onepassword v0.0.0-20251103072335-a9b233b6936f
-	github.com/external-secrets/external-secrets/providers/v1/onepasswordsdk v0.0.0-20251103072335-a9b233b6936f
-	github.com/external-secrets/external-secrets/providers/v1/oracle v0.0.0-20251103072335-a9b233b6936f
-	github.com/external-secrets/external-secrets/providers/v1/passbolt v0.0.0-20251103080423-08fa383f42e5
-	github.com/external-secrets/external-secrets/providers/v1/passworddepot v0.0.0-20251103080423-08fa383f42e5
-	github.com/external-secrets/external-secrets/providers/v1/previder v0.0.0-20251103080423-08fa383f42e5
-	github.com/external-secrets/external-secrets/providers/v1/pulumi v0.0.0-20251103080423-08fa383f42e5
-	github.com/external-secrets/external-secrets/providers/v1/scaleway v0.0.0-20251103080423-08fa383f42e5
-	github.com/external-secrets/external-secrets/providers/v1/secretserver v0.0.0-20251103080423-08fa383f42e5
-	github.com/external-secrets/external-secrets/providers/v1/senhasegura v0.0.0-20251103080423-08fa383f42e5
+	github.com/external-secrets/external-secrets/providers/v1/beyondtrust v0.0.0-00010101000000-000000000000
+	github.com/external-secrets/external-secrets/providers/v1/bitwarden v0.0.0-00010101000000-000000000000
+	github.com/external-secrets/external-secrets/providers/v1/chef v0.0.0-00010101000000-000000000000
+	github.com/external-secrets/external-secrets/providers/v1/cloudru v0.0.0-00010101000000-000000000000
+	github.com/external-secrets/external-secrets/providers/v1/conjur v0.0.0-00010101000000-000000000000
+	github.com/external-secrets/external-secrets/providers/v1/delinea v0.0.0-00010101000000-000000000000
+	github.com/external-secrets/external-secrets/providers/v1/device42 v0.0.0-00010101000000-000000000000
+	github.com/external-secrets/external-secrets/providers/v1/doppler v0.0.0-00010101000000-000000000000
+	github.com/external-secrets/external-secrets/providers/v1/fake v0.0.0-00010101000000-000000000000
+	github.com/external-secrets/external-secrets/providers/v1/fortanix v0.0.0-00010101000000-000000000000
+	github.com/external-secrets/external-secrets/providers/v1/gcp v0.0.0-20251104073127-4d2c8fd13e10
+	github.com/external-secrets/external-secrets/providers/v1/github v0.0.0-00010101000000-000000000000
+	github.com/external-secrets/external-secrets/providers/v1/gitlab v0.0.0-00010101000000-000000000000
+	github.com/external-secrets/external-secrets/providers/v1/ibm v0.0.0-00010101000000-000000000000
+	github.com/external-secrets/external-secrets/providers/v1/infisical v0.0.0-00010101000000-000000000000
+	github.com/external-secrets/external-secrets/providers/v1/keepersecurity v0.0.0-00010101000000-000000000000
+	github.com/external-secrets/external-secrets/providers/v1/kubernetes v0.0.0-00010101000000-000000000000
+	github.com/external-secrets/external-secrets/providers/v1/ngrok v0.0.0-00010101000000-000000000000
+	github.com/external-secrets/external-secrets/providers/v1/onboardbase v0.0.0-00010101000000-000000000000
+	github.com/external-secrets/external-secrets/providers/v1/onepassword v0.0.0-00010101000000-000000000000
+	github.com/external-secrets/external-secrets/providers/v1/onepasswordsdk v0.0.0-00010101000000-000000000000
+	github.com/external-secrets/external-secrets/providers/v1/oracle v0.0.0-00010101000000-000000000000
+	github.com/external-secrets/external-secrets/providers/v1/passbolt v0.0.0-00010101000000-000000000000
+	github.com/external-secrets/external-secrets/providers/v1/passworddepot v0.0.0-00010101000000-000000000000
+	github.com/external-secrets/external-secrets/providers/v1/previder v0.0.0-00010101000000-000000000000
+	github.com/external-secrets/external-secrets/providers/v1/pulumi v0.0.0-00010101000000-000000000000
+	github.com/external-secrets/external-secrets/providers/v1/scaleway v0.0.0-00010101000000-000000000000
+	github.com/external-secrets/external-secrets/providers/v1/secretserver v0.0.0-00010101000000-000000000000
+	github.com/external-secrets/external-secrets/providers/v1/senhasegura v0.0.0-00010101000000-000000000000
 	github.com/external-secrets/external-secrets/providers/v1/vault v0.0.0-20251103080423-08fa383f42e5
-	github.com/external-secrets/external-secrets/providers/v1/volcengine v0.0.0-20251103080423-08fa383f42e5
+	github.com/external-secrets/external-secrets/providers/v1/volcengine v0.0.0-00010101000000-000000000000
 	github.com/external-secrets/external-secrets/providers/v1/webhook v0.0.0-20251103080423-08fa383f42e5
-	github.com/external-secrets/external-secrets/providers/v1/yandex v0.0.0-20251103080423-08fa383f42e5
+	github.com/external-secrets/external-secrets/providers/v1/yandex v0.0.0-00010101000000-000000000000
 	github.com/external-secrets/external-secrets/runtime v0.0.0
 	github.com/maxbrunsfeld/counterfeiter/v6 v6.12.0
 	sigs.k8s.io/yaml v1.6.0
@@ -311,6 +311,7 @@ require (
 	github.com/hashicorp/golang-lru/v2 v2.0.7 // indirect
 	github.com/hashicorp/hcl/v2 v2.24.0 // indirect
 	github.com/hashicorp/vault/api/auth/aws v0.11.0 // indirect
+	github.com/hashicorp/vault/api/auth/gcp v0.11.0 // indirect
 	github.com/hashicorp/vault/api/auth/userpass v0.11.0 // indirect
 	github.com/ianlancetaylor/demangle v0.0.0-20250628045327-2d64ad6b7ec5 // indirect
 	github.com/infisical/go-sdk v0.5.100 // indirect

+ 2 - 0
go.sum

@@ -772,6 +772,8 @@ github.com/hashicorp/vault/api/auth/approle v0.11.0 h1:ViUvgqoSTqHkMi1L1Rr/LnQ+P
 github.com/hashicorp/vault/api/auth/approle v0.11.0/go.mod h1:v8ZqBRw+GP264ikIw2sEBKF0VT72MEhLWnZqWt3xEG8=
 github.com/hashicorp/vault/api/auth/aws v0.11.0 h1:lWdUxrzvPotg6idNr62al4w97BgI9xTDdzMCTViNH2s=
 github.com/hashicorp/vault/api/auth/aws v0.11.0/go.mod h1:PWqdH/xqaudapmnnGP9ip2xbxT/kRW2qEgpqiQff6Gc=
+github.com/hashicorp/vault/api/auth/gcp v0.11.0 h1:BSK+2Ji2OGSzM4pRVY7boa+2qPW8uiWZAYOrrt0XcJM=
+github.com/hashicorp/vault/api/auth/gcp v0.11.0/go.mod h1:EbW5XSmkdUiWsSAYV33TbDR2zVi8QTo29LAfPByFhag=
 github.com/hashicorp/vault/api/auth/kubernetes v0.10.0 h1:5rqWmUFxnu3S7XYq9dafURwBgabYDFzo2Wv+AMopPHs=
 github.com/hashicorp/vault/api/auth/kubernetes v0.10.0/go.mod h1:cZZmhF6xboMDmDbMY52oj2DKW6gS0cQ9g0pJ5XIXQ5U=
 github.com/hashicorp/vault/api/auth/ldap v0.11.0 h1:jd6gJXeFR4jyDbAh6R4RoW1uq6kmTt7M/vjW41jXczA=

+ 6 - 0
providers/v1/vault/auth.go

@@ -114,6 +114,12 @@ func (c *client) setAuth(ctx context.Context, cfg *vault.Config) error {
 		return err
 	}
 
+	tokenExists, err = setGcpAuthToken(ctx, c)
+	if tokenExists {
+		c.log.V(1).Info("Retrieved new token using GCP auth")
+		return err
+	}
+
 	return errors.New(errAuthFormat)
 }
 

+ 208 - 0
providers/v1/vault/auth_gcp.go

@@ -0,0 +1,208 @@
+/*
+Copyright © 2025 ESO Maintainer Team
+
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+    https://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+*/
+
+package vault
+
+import (
+	"context"
+	"errors"
+	"fmt"
+	"os"
+
+	authgcp "github.com/hashicorp/vault/api/auth/gcp"
+	"golang.org/x/oauth2/google"
+
+	esv1 "github.com/external-secrets/external-secrets/apis/externalsecrets/v1"
+	gcpsm "github.com/external-secrets/external-secrets/providers/v1/gcp/secretmanager"
+	"github.com/external-secrets/external-secrets/runtime/constants"
+	"github.com/external-secrets/external-secrets/runtime/metrics"
+)
+
+const (
+	defaultGCPAuthMountPath   = "gcp"
+	googleOAuthAccessTokenKey = "GOOGLE_OAUTH_ACCESS_TOKEN"
+)
+
+func setGcpAuthToken(ctx context.Context, v *client) (bool, error) {
+	gcpAuth := v.store.Auth.GCP
+	if gcpAuth == nil {
+		return false, nil
+	}
+
+	// Only proceed with actual authentication if the auth client is available
+	if v.auth == nil {
+		return true, errors.New("vault auth client not initialized")
+	}
+
+	err := v.requestTokenWithGcpAuth(ctx, gcpAuth)
+	if err != nil {
+		return true, err
+	}
+	return true, nil
+}
+
+func (c *client) requestTokenWithGcpAuth(ctx context.Context, gcpAuth *esv1.VaultGCPAuth) error {
+	authMountPath := c.getGCPAuthMountPathOrDefault(gcpAuth.Path)
+	role := gcpAuth.Role
+
+	// Set up GCP authentication using workload identity or service account key
+	err := c.setupGCPAuth(ctx, gcpAuth)
+	if err != nil {
+		return fmt.Errorf("failed to set up GCP authentication: %w", err)
+	}
+
+	// Determine which GCP auth method to use based on available authentication
+	var gcpAuthClient *authgcp.GCPAuth
+	if gcpAuth.SecretRef != nil || gcpAuth.WorkloadIdentity != nil {
+		// Use IAM auth method when we have explicit credentials (service account key or workload identity)
+		gcpAuthClient, err = authgcp.NewGCPAuth(role,
+			authgcp.WithMountPath(authMountPath),
+			authgcp.WithIAMAuth(""), // Service account email will be determined automatically from credentials
+		)
+	} else {
+		// Use GCE auth method for GCE instances (includes ServiceAccountRef and default ADC scenarios)
+		gcpAuthClient, err = authgcp.NewGCPAuth(role,
+			authgcp.WithMountPath(authMountPath),
+			authgcp.WithGCEAuth(),
+		)
+	}
+
+	if err != nil {
+		return err
+	}
+
+	// Authenticate with Vault using GCP auth
+	_, err = c.auth.Login(ctx, gcpAuthClient)
+	metrics.ObserveAPICall(constants.ProviderHCVault, constants.CallHCVaultLogin, err)
+	if err != nil {
+		return err
+	}
+
+	return nil
+}
+
+func (c *client) setupGCPAuth(ctx context.Context, gcpAuth *esv1.VaultGCPAuth) error {
+	// Priority order for GCP authentication methods:
+	// 1. SecretRef: Service account key from Kubernetes secret (uses IAM auth method)
+	// 2. WorkloadIdentity: GKE Workload Identity (uses IAM auth method)
+	// 3. ServiceAccountRef: Pod's service account (uses GCE auth method)
+	// 4. Default ADC: Application Default Credentials (uses GCE auth method)
+
+	// First priority: Service account key from secret
+	if gcpAuth.SecretRef != nil {
+		return c.setupServiceAccountKeyAuth(ctx, gcpAuth)
+	}
+
+	// Second priority: Workload identity
+	if gcpAuth.WorkloadIdentity != nil {
+		return c.setupWorkloadIdentityAuth(ctx, gcpAuth)
+	}
+
+	// Third priority: Service account reference (for token creation)
+	if gcpAuth.ServiceAccountRef != nil {
+		return c.setupServiceAccountRefAuth(ctx, gcpAuth)
+	}
+
+	// Last resort: Default GCP authentication (ADC)
+	return c.setupDefaultGCPAuth()
+}
+
+func (c *client) setupServiceAccountKeyAuth(ctx context.Context, gcpAuth *esv1.VaultGCPAuth) error {
+	tokenSource, err := gcpsm.NewTokenSource(ctx, esv1.GCPSMAuth{
+		SecretRef: gcpAuth.SecretRef,
+	}, gcpAuth.ProjectID, c.storeKind, c.kube, c.namespace)
+	if err != nil {
+		return fmt.Errorf("failed to create token source from secret: %w", err)
+	}
+
+	token, err := tokenSource.Token()
+	if err != nil {
+		return fmt.Errorf("failed to retrieve token from secret: %w", err)
+	}
+
+	c.log.V(1).Info("Setting up GCP authentication using service account credentials from secret")
+	return c.setGCPEnvironment(token.AccessToken)
+}
+
+func (c *client) setupWorkloadIdentityAuth(ctx context.Context, gcpAuth *esv1.VaultGCPAuth) error {
+	tokenSource, err := gcpsm.NewTokenSource(ctx, esv1.GCPSMAuth{
+		WorkloadIdentity: gcpAuth.WorkloadIdentity,
+	}, gcpAuth.ProjectID, c.storeKind, c.kube, c.namespace)
+	if err != nil {
+		return fmt.Errorf("failed to create token source from workload identity: %w", err)
+	}
+
+	token, err := tokenSource.Token()
+	if err != nil {
+		return fmt.Errorf("failed to retrieve token from workload identity: %w", err)
+	}
+
+	c.log.V(1).Info("Setting up GCP authentication using workload identity")
+	return c.setGCPEnvironment(token.AccessToken)
+}
+
+func (c *client) setupServiceAccountRefAuth(_ context.Context, _ *esv1.VaultGCPAuth) error {
+	// When ServiceAccountRef is specified, we use the Kubernetes service account
+	// The GCE auth method will automatically use the service account attached to the pod
+	// This leverages GKE Workload Identity or service account key mounted in the pod
+	c.log.V(1).Info("Setting up GCP authentication using service account reference with GCE auth method")
+
+	// No explicit token setup needed - GCE auth method will use the pod's service account
+	// This works with both Workload Identity and traditional service account keys
+	return nil
+}
+
+func (c *client) setupDefaultGCPAuth() error {
+	c.log.V(1).Info("Setting up default GCP authentication (ADC)")
+
+	// Validate that ADC is available before proceeding
+	ctx := context.Background()
+	creds, err := google.FindDefaultCredentials(ctx)
+	if err != nil {
+		return fmt.Errorf("Application Default Credentials (ADC) not available: %w", err)
+	}
+
+	c.log.V(1).Info("ADC validation successful", "project_id", creds.ProjectID)
+
+	// No explicit token setup needed - the Vault GCP auth method will use ADC automatically
+	return nil
+}
+
+func (c *client) setGCPEnvironment(accessToken string) error {
+	// The Vault GCP auth method will use this environment variable if set
+	if err := c.setEnvVar(googleOAuthAccessTokenKey, accessToken); err != nil {
+		return fmt.Errorf("failed to set GCP environment variable: %w", err)
+	}
+	return nil
+}
+
+func (c *client) setEnvVar(key, value string) error {
+	if value == "" {
+		return fmt.Errorf("empty value for environment variable %s", key)
+	}
+	if err := os.Setenv(key, value); err != nil {
+		return fmt.Errorf("failed to set environment variable %s: %w", key, err)
+	}
+	c.log.V(1).Info("Set environment variable for GCP authentication", "key", key)
+	return nil
+}
+
+func (c *client) getGCPAuthMountPathOrDefault(path string) string {
+	if path != "" {
+		return path
+	}
+	return defaultGCPAuthMountPath
+}

+ 364 - 0
providers/v1/vault/auth_gcp_test.go

@@ -0,0 +1,364 @@
+/*
+Copyright © 2025 ESO Maintainer Team
+
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+    https://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+*/
+
+package vault
+
+import (
+	"context"
+	"os"
+	"testing"
+
+	esv1 "github.com/external-secrets/external-secrets/apis/externalsecrets/v1"
+	esmeta "github.com/external-secrets/external-secrets/apis/meta/v1"
+	"github.com/go-logr/logr"
+	corev1 "k8s.io/api/core/v1"
+	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
+	clientfake "sigs.k8s.io/controller-runtime/pkg/client/fake"
+)
+
+func TestSetEnvVar(t *testing.T) {
+	c := &client{
+		log: logr.Discard(),
+	}
+
+	tests := []struct {
+		name      string
+		key       string
+		value     string
+		wantError bool
+	}{
+		{
+			name:      "valid environment variable",
+			key:       "TEST_VAR",
+			value:     "test_value",
+			wantError: false,
+		},
+		{
+			name:      "empty value should error",
+			key:       "TEST_VAR",
+			value:     "",
+			wantError: true,
+		},
+	}
+
+	for _, tt := range tests {
+		t.Run(tt.name, func(t *testing.T) {
+			// Clean up environment variable after test
+			defer func() {
+				if tt.key != "" {
+					os.Unsetenv(tt.key)
+				}
+			}()
+
+			err := c.setEnvVar(tt.key, tt.value)
+
+			if tt.wantError && err == nil {
+				t.Errorf("setEnvVar() expected error, got nil")
+			}
+			if !tt.wantError && err != nil {
+				t.Errorf("setEnvVar() unexpected error: %v", err)
+			}
+
+			// If successful, verify the environment variable was actually set
+			if !tt.wantError && err == nil {
+				actualValue := os.Getenv(tt.key)
+				if actualValue != tt.value {
+					t.Errorf("setEnvVar() environment variable not set correctly, got %v, want %v", actualValue, tt.value)
+				}
+			}
+		})
+	}
+}
+
+func TestSetGCPEnvironment(t *testing.T) {
+	c := &client{
+		log: logr.Discard(),
+	}
+
+	tests := []struct {
+		name        string
+		accessToken string
+		wantError   bool
+	}{
+		{
+			name:        "valid access token",
+			accessToken: "ya29.test-token",
+			wantError:   false,
+		},
+		{
+			name:        "empty access token",
+			accessToken: "",
+			wantError:   true,
+		},
+	}
+
+	for _, tt := range tests {
+		t.Run(tt.name, func(t *testing.T) {
+			// Clean up environment variable after test
+			defer os.Unsetenv(googleOAuthAccessTokenKey)
+
+			err := c.setGCPEnvironment(tt.accessToken)
+
+			if tt.wantError && err == nil {
+				t.Errorf("setGCPEnvironment() expected error, got nil")
+			}
+			if !tt.wantError && err != nil {
+				t.Errorf("setGCPEnvironment() unexpected error: %v", err)
+			}
+
+			// If successful, verify the GOOGLE_OAUTH_ACCESS_TOKEN was set
+			if !tt.wantError && err == nil {
+				actualValue := os.Getenv(googleOAuthAccessTokenKey)
+				if actualValue != tt.accessToken {
+					t.Errorf("setGCPEnvironment() %s not set correctly, got %v, want %v", googleOAuthAccessTokenKey, actualValue, tt.accessToken)
+				}
+			}
+		})
+	}
+}
+
+func TestSetupDefaultGCPAuth(t *testing.T) {
+	c := &client{
+		log: logr.Discard(),
+	}
+
+	err := c.setupDefaultGCPAuth()
+	// In test environments, ADC might not be available, so we expect this to potentially fail.
+	// This is expected behavior - the function should fail gracefully if ADC is not configured.
+	// The test verifies that the function behaves correctly in both scenarios:
+	// 1. ADC available: function succeeds
+	// 2. ADC unavailable: function fails with meaningful error message
+	if err != nil {
+		t.Logf("setupDefaultGCPAuth() failed as expected in test environment without ADC: %v", err)
+		// Verify the error message indicates ADC unavailability
+		if err.Error() == "" {
+			t.Errorf("setupDefaultGCPAuth() should provide meaningful error message when ADC is unavailable")
+		}
+	} else {
+		t.Logf("setupDefaultGCPAuth() succeeded - ADC is configured and available in test environment")
+	}
+}
+
+func TestSetupGCPAuthPriority(t *testing.T) {
+	c := &client{
+		log:       logr.Discard(),
+		kube:      clientfake.NewClientBuilder().Build(),
+		namespace: "default",
+		storeKind: "SecretStore",
+	}
+
+	tests := []struct {
+		name        string
+		gcpAuth     *esv1.VaultGCPAuth
+		expectError bool
+		description string
+	}{
+		{
+			name: "SecretRef has priority",
+			gcpAuth: &esv1.VaultGCPAuth{
+				Role:      "test-role",
+				ProjectID: "test-project",
+				SecretRef: &esv1.GCPSMAuthSecretRef{
+					SecretAccessKey: esmeta.SecretKeySelector{
+						Name: "gcp-secret",
+						Key:  "credentials.json",
+					},
+				},
+				WorkloadIdentity: &esv1.GCPWorkloadIdentity{
+					ServiceAccountRef: esmeta.ServiceAccountSelector{
+						Name: "test-sa",
+					},
+				},
+			},
+			expectError: true, // Will fail because secret doesn't exist in fake client
+			description: "SecretRef should be tried first",
+		},
+		{
+			name: "WorkloadIdentity second priority",
+			gcpAuth: &esv1.VaultGCPAuth{
+				Role:      "test-role",
+				ProjectID: "test-project",
+				WorkloadIdentity: &esv1.GCPWorkloadIdentity{
+					ServiceAccountRef: esmeta.ServiceAccountSelector{
+						Name: "test-sa",
+					},
+				},
+				ServiceAccountRef: &esmeta.ServiceAccountSelector{
+					Name: "test-sa",
+				},
+			},
+			expectError: true, // Will fail because workload identity setup will fail
+			description: "WorkloadIdentity should be tried when SecretRef is nil",
+		},
+		{
+			name: "ServiceAccountRef third priority",
+			gcpAuth: &esv1.VaultGCPAuth{
+				Role: "test-role",
+				ServiceAccountRef: &esmeta.ServiceAccountSelector{
+					Name: "test-sa",
+				},
+			},
+			expectError: false, // Should fall back to default auth
+			description: "ServiceAccountRef should fall back to default auth",
+		},
+		{
+			name: "Default auth last resort",
+			gcpAuth: &esv1.VaultGCPAuth{
+				Role: "test-role",
+			},
+			expectError: false, // Test handles both ADC available and unavailable scenarios
+			description: "Should attempt default ADC when no other auth method is specified",
+		},
+	}
+
+	for _, tt := range tests {
+		t.Run(tt.name, func(t *testing.T) {
+			err := c.setupGCPAuth(context.Background(), tt.gcpAuth)
+
+			// For default auth test, ADC availability depends on the test environment.
+			// We accept both success (ADC configured) and failure (ADC not available)
+			// as valid outcomes, since this test should pass in any environment.
+			if tt.name == "Default auth last resort" {
+				if err != nil {
+					t.Logf("setupGCPAuth() with default ADC: %v (expected behavior in environments without ADC configured)", err)
+				} else {
+					t.Logf("setupGCPAuth() with default ADC succeeded (ADC is properly configured in this environment)")
+				}
+				return
+			}
+
+			if tt.expectError && err == nil {
+				t.Errorf("setupGCPAuth() expected error for %s, got nil", tt.description)
+			}
+			if !tt.expectError && err != nil {
+				t.Errorf("setupGCPAuth() unexpected error for %s: %v", tt.description, err)
+			}
+		})
+	}
+}
+
+func TestGCPAuthMethodSelection(t *testing.T) {
+	tests := []struct {
+		name        string
+		setupClient func() *client
+		gcpAuth     *esv1.VaultGCPAuth
+		expectError bool
+		description string
+	}{
+		{
+			name: "SecretRef method selected",
+			setupClient: func() *client {
+				// Create a secret with invalid credentials to trigger expected error
+				secret := &corev1.Secret{
+					ObjectMeta: metav1.ObjectMeta{
+						Name:      "gcp-secret",
+						Namespace: "default",
+					},
+					Data: map[string][]byte{
+						"credentials.json": []byte(`{"type": "service_account", "project_id": "test"}`),
+					},
+				}
+				kube := clientfake.NewClientBuilder().WithObjects(secret).Build()
+				return &client{
+					log:       logr.Discard(),
+					kube:      kube,
+					namespace: "default",
+					storeKind: "SecretStore",
+				}
+			},
+			gcpAuth: &esv1.VaultGCPAuth{
+				Role:      "test-role",
+				ProjectID: "test-project",
+				SecretRef: &esv1.GCPSMAuthSecretRef{
+					SecretAccessKey: esmeta.SecretKeySelector{
+						Name: "gcp-secret",
+						Key:  "credentials.json",
+					},
+				},
+			},
+			expectError: true, // Expected to fail in test environment
+			description: "Should attempt to use SecretRef method",
+		},
+		{
+			name: "WorkloadIdentity method selected",
+			setupClient: func() *client {
+				return &client{
+					log:       logr.Discard(),
+					kube:      clientfake.NewClientBuilder().Build(),
+					namespace: "default",
+					storeKind: "SecretStore",
+				}
+			},
+			gcpAuth: &esv1.VaultGCPAuth{
+				Role:      "test-role",
+				ProjectID: "test-project",
+				WorkloadIdentity: &esv1.GCPWorkloadIdentity{
+					ServiceAccountRef: esmeta.ServiceAccountSelector{
+						Name: "test-sa",
+					},
+				},
+			},
+			expectError: true, // Expected to fail in test environment
+			description: "Should attempt to use WorkloadIdentity method",
+		},
+		{
+			name: "Default ADC method selected",
+			setupClient: func() *client {
+				return &client{
+					log:       logr.Discard(),
+					kube:      clientfake.NewClientBuilder().Build(),
+					namespace: "default",
+					storeKind: "SecretStore",
+				}
+			},
+			gcpAuth: &esv1.VaultGCPAuth{
+				Role: "test-role",
+			},
+			expectError: false, // Test handles both ADC available and unavailable scenarios
+			description: "Should attempt to use default ADC method when no explicit auth is configured",
+		},
+	}
+
+	for _, tt := range tests {
+		t.Run(tt.name, func(t *testing.T) {
+			c := tt.setupClient()
+			err := c.setupGCPAuth(context.Background(), tt.gcpAuth)
+
+			// For default ADC test, availability depends on the test environment.
+			// We accept both success (ADC configured) and failure (ADC not available)
+			// as valid outcomes to ensure tests pass in all environments.
+			if tt.name == "Default ADC method selected" {
+				if err != nil {
+					t.Logf("%s: %v (expected behavior in environments without ADC configured)", tt.description, err)
+				} else {
+					t.Logf("%s: succeeded (ADC is properly configured in this environment)", tt.description)
+				}
+				t.Logf("%s: test completed successfully", tt.description)
+				return
+			}
+
+			if tt.expectError && err == nil {
+				t.Errorf("%s: expected error but got none", tt.description)
+			}
+			if !tt.expectError && err != nil {
+				t.Errorf("%s: unexpected error: %v", tt.description, err)
+			}
+
+			// All tests should at least not panic and follow the correct code path
+			t.Logf("%s: test completed successfully", tt.description)
+		})
+	}
+}

+ 85 - 0
providers/v1/vault/auth_test.go

@@ -279,3 +279,88 @@ func TestCheckTokenTtl(t *testing.T) {
 		})
 	}
 }
+
+// Test GCP authentication detection logic.
+func TestGCPAuthDetection(t *testing.T) {
+	tests := []struct {
+		name            string
+		gcpAuth         *esv1.VaultGCPAuth
+		expectedHasAuth bool
+		expectError     bool
+	}{
+		{
+			name: "GCP auth configured",
+			gcpAuth: &esv1.VaultGCPAuth{
+				Role: "test-role",
+				Path: "gcp",
+			},
+			expectedHasAuth: true,
+			expectError:     true, // Will error because auth client is not initialized in test
+		},
+		{
+			name:            "No GCP auth configured",
+			gcpAuth:         nil,
+			expectedHasAuth: false,
+			expectError:     false,
+		},
+	}
+
+	for _, tt := range tests {
+		t.Run(tt.name, func(t *testing.T) {
+			// Create a mock client
+			c := &client{
+				store: &esv1.VaultProvider{
+					Auth: &esv1.VaultAuth{
+						GCP: tt.gcpAuth,
+					},
+				},
+				// auth: nil (not initialized for test)
+			}
+
+			// Test detection logic
+			hasAuth, err := setGcpAuthToken(context.Background(), c)
+
+			if hasAuth != tt.expectedHasAuth {
+				t.Errorf("setGcpAuthToken() returned hasAuth = %v, want %v", hasAuth, tt.expectedHasAuth)
+			}
+
+			if tt.expectError && err == nil {
+				t.Errorf("setGcpAuthToken() expected error, got nil")
+			}
+
+			if !tt.expectError && err != nil {
+				t.Errorf("setGcpAuthToken() unexpected error: %v", err)
+			}
+		})
+	}
+}
+
+func TestGCPAuthMountPathDefault(t *testing.T) {
+	c := &client{}
+
+	tests := []struct {
+		name     string
+		path     string
+		expected string
+	}{
+		{
+			name:     "default path when empty",
+			path:     "",
+			expected: "gcp",
+		},
+		{
+			name:     "custom path",
+			path:     "custom-gcp",
+			expected: "custom-gcp",
+		},
+	}
+
+	for _, tt := range tests {
+		t.Run(tt.name, func(t *testing.T) {
+			result := c.getGCPAuthMountPathOrDefault(tt.path)
+			if result != tt.expected {
+				t.Errorf("getGCPAuthMountPathOrDefault() = %v, want %v", result, tt.expected)
+			}
+		})
+	}
+}

+ 26 - 1
providers/v1/vault/go.mod

@@ -10,6 +10,7 @@ require (
 	github.com/aws/smithy-go v1.23.1
 	github.com/external-secrets/external-secrets/apis v0.0.0
 	github.com/external-secrets/external-secrets/providers/v1/aws v0.0.0-20251103072335-a9b233b6936f
+	github.com/external-secrets/external-secrets/providers/v1/gcp v0.0.0-20251104073127-4d2c8fd13e10
 	github.com/external-secrets/external-secrets/runtime v0.0.0
 	github.com/go-logr/logr v1.4.3
 	github.com/golang-jwt/jwt/v5 v5.3.0
@@ -17,12 +18,14 @@ require (
 	github.com/hashicorp/vault/api v1.22.0
 	github.com/hashicorp/vault/api/auth/approle v0.11.0
 	github.com/hashicorp/vault/api/auth/aws v0.11.0
+	github.com/hashicorp/vault/api/auth/gcp v0.11.0
 	github.com/hashicorp/vault/api/auth/kubernetes v0.10.0
 	github.com/hashicorp/vault/api/auth/ldap v0.11.0
 	github.com/hashicorp/vault/api/auth/userpass v0.11.0
 	github.com/spf13/pflag v1.0.10
 	github.com/stretchr/testify v1.11.1
 	github.com/tidwall/gjson v1.18.0
+	golang.org/x/oauth2 v0.32.0
 	k8s.io/api v0.34.1
 	k8s.io/apimachinery v0.34.1
 	k8s.io/client-go v0.34.1
@@ -31,6 +34,11 @@ require (
 )
 
 require (
+	cloud.google.com/go/auth v0.17.0 // indirect
+	cloud.google.com/go/auth/oauth2adapt v0.2.8 // indirect
+	cloud.google.com/go/compute/metadata v0.9.0 // indirect
+	cloud.google.com/go/iam v1.5.3 // indirect
+	cloud.google.com/go/secretmanager v1.16.0 // indirect
 	dario.cat/mergo v1.0.2 // indirect
 	github.com/Masterminds/goutils v1.1.1 // indirect
 	github.com/Masterminds/semver/v3 v3.4.0 // indirect
@@ -53,9 +61,11 @@ require (
 	github.com/emicklei/go-restful/v3 v3.13.0 // indirect
 	github.com/evanphx/json-patch/v5 v5.9.11 // indirect
 	github.com/fatih/color v1.18.0 // indirect
+	github.com/felixge/httpsnoop v1.0.4 // indirect
 	github.com/fsnotify/fsnotify v1.9.0 // indirect
 	github.com/fxamacker/cbor/v2 v2.9.0 // indirect
 	github.com/go-jose/go-jose/v4 v4.1.3 // indirect
+	github.com/go-logr/stdr v1.2.2 // indirect
 	github.com/go-openapi/jsonpointer v0.22.1 // indirect
 	github.com/go-openapi/jsonreference v0.21.2 // indirect
 	github.com/go-openapi/swag v0.25.1 // indirect
@@ -74,7 +84,10 @@ require (
 	github.com/gogo/protobuf v1.3.2 // indirect
 	github.com/google/btree v1.1.3 // indirect
 	github.com/google/gnostic-models v0.7.0 // indirect
+	github.com/google/s2a-go v0.1.9 // indirect
 	github.com/google/uuid v1.6.0 // indirect
+	github.com/googleapis/enterprise-certificate-proxy v0.3.6 // indirect
+	github.com/googleapis/gax-go/v2 v2.15.0 // indirect
 	github.com/hashicorp/errwrap v1.1.0 // indirect
 	github.com/hashicorp/go-cleanhttp v0.5.2 // indirect
 	github.com/hashicorp/go-hclog v1.6.3 // indirect
@@ -118,23 +131,35 @@ require (
 	github.com/spf13/cast v1.10.0 // indirect
 	github.com/tidwall/match v1.2.0 // indirect
 	github.com/tidwall/pretty v1.2.1 // indirect
+	github.com/tidwall/sjson v1.2.5 // indirect
 	github.com/x448/float16 v0.8.4 // indirect
+	go.opentelemetry.io/auto/sdk v1.1.0 // indirect
+	go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.61.0 // indirect
+	go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.61.0 // indirect
+	go.opentelemetry.io/otel v1.37.0 // indirect
+	go.opentelemetry.io/otel/metric v1.37.0 // indirect
+	go.opentelemetry.io/otel/trace v1.37.0 // indirect
 	go.uber.org/automaxprocs v1.6.0 // indirect
 	go.yaml.in/yaml/v2 v2.4.3 // indirect
 	go.yaml.in/yaml/v3 v3.0.4 // indirect
 	golang.org/x/crypto v0.43.0 // indirect
 	golang.org/x/net v0.46.0 // indirect
-	golang.org/x/oauth2 v0.32.0 // indirect
 	golang.org/x/sync v0.17.0 // indirect
 	golang.org/x/sys v0.37.0 // indirect
 	golang.org/x/term v0.36.0 // indirect
 	golang.org/x/text v0.30.0 // indirect
 	golang.org/x/time v0.14.0 // indirect
 	gomodules.xyz/jsonpatch/v2 v2.5.0 // indirect
+	google.golang.org/api v0.253.0 // indirect
+	google.golang.org/genproto v0.0.0-20251022142026-3a174f9686a8 // indirect
+	google.golang.org/genproto/googleapis/api v0.0.0-20251014184007-4626949a642f // indirect
+	google.golang.org/genproto/googleapis/rpc v0.0.0-20251014184007-4626949a642f // indirect
+	google.golang.org/grpc v1.76.0 // indirect
 	google.golang.org/protobuf v1.36.10 // indirect
 	gopkg.in/evanphx/json-patch.v4 v4.13.0 // indirect
 	gopkg.in/inf.v0 v0.9.1 // indirect
 	gopkg.in/yaml.v3 v3.0.1 // indirect
+	grpc.go4.org v0.0.0-20170609214715-11d0a25b4919 // indirect
 	k8s.io/apiextensions-apiserver v0.34.1 // indirect
 	k8s.io/klog/v2 v2.130.1 // indirect
 	k8s.io/kube-openapi v0.0.0-20250910181357-589584f1c912 // indirect

+ 71 - 0
providers/v1/vault/go.sum

@@ -1,3 +1,15 @@
+cloud.google.com/go v0.121.6 h1:waZiuajrI28iAf40cWgycWNgaXPO06dupuS+sgibK6c=
+cloud.google.com/go v0.121.6/go.mod h1:coChdst4Ea5vUpiALcYKXEpR1S9ZgXbhEzzMcMR66vI=
+cloud.google.com/go/auth v0.17.0 h1:74yCm7hCj2rUyyAocqnFzsAYXgJhrG26XCFimrc/Kz4=
+cloud.google.com/go/auth v0.17.0/go.mod h1:6wv/t5/6rOPAX4fJiRjKkJCvswLwdet7G8+UGXt7nCQ=
+cloud.google.com/go/auth/oauth2adapt v0.2.8 h1:keo8NaayQZ6wimpNSmW5OPc283g65QNIiLpZnkHRbnc=
+cloud.google.com/go/auth/oauth2adapt v0.2.8/go.mod h1:XQ9y31RkqZCcwJWNSx2Xvric3RrU88hAYYbjDWYDL+c=
+cloud.google.com/go/compute/metadata v0.9.0 h1:pDUj4QMoPejqq20dK0Pg2N4yG9zIkYGdBtwLoEkH9Zs=
+cloud.google.com/go/compute/metadata v0.9.0/go.mod h1:E0bWwX5wTnLPedCKqk3pJmVgCBSM6qQI1yTBdEb3C10=
+cloud.google.com/go/iam v1.5.3 h1:+vMINPiDF2ognBJ97ABAYYwRgsaqxPbQDlMnbHMjolc=
+cloud.google.com/go/iam v1.5.3/go.mod h1:MR3v9oLkZCTlaqljW6Eb2d3HGDGK5/bDv93jhfISFvU=
+cloud.google.com/go/secretmanager v1.16.0 h1:19QT7ZsLJ8FSP1k+4esQvuCD7npMJml6hYzilxVyT+k=
+cloud.google.com/go/secretmanager v1.16.0/go.mod h1://C/e4I8D26SDTz1f3TQcddhcmiC3rMEl0S1Cakvs3Q=
 dario.cat/mergo v1.0.2 h1:85+piFYR1tMbRrLcDwR18y4UKJ3aH1Tbzi24VRW1TK8=
 dario.cat/mergo v1.0.2/go.mod h1:E/hbnu0NxMFBjpMIE34DRGLWqDy0g5FuKDhCb31ngxA=
 github.com/Masterminds/goutils v1.1.1 h1:5nUrii3FMTL5diU80unEVvNevw1nH4+ZV4DSLVJLSYI=
@@ -43,6 +55,8 @@ github.com/cenkalti/backoff/v4 v4.3.0 h1:MyRJ/UdXutAwSAT+s3wNd7MfTIcy71VQueUuFK3
 github.com/cenkalti/backoff/v4 v4.3.0/go.mod h1:Y3VNntkOUPxTVeUxJ/G5vcM//AlwfmyYozVcomhLiZE=
 github.com/cespare/xxhash/v2 v2.3.0 h1:UL815xU9SqsFlibzuggzjXhog7bL6oX9BbNZnL2UFvs=
 github.com/cespare/xxhash/v2 v2.3.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs=
+github.com/cncf/xds/go v0.0.0-20250501225837-2ac532fd4443 h1:aQ3y1lwWyqYPiWZThqv1aFbZMiM9vblcSArJRf2Irls=
+github.com/cncf/xds/go v0.0.0-20250501225837-2ac532fd4443/go.mod h1:W+zGtBO5Y1IgJhy4+A9GOqVhqLpfZi+vwmdNXUehLA8=
 github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E=
 github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
 github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=
@@ -51,13 +65,22 @@ github.com/decred/dcrd/dcrec/secp256k1/v4 v4.4.0 h1:NMZiJj8QnKe1LgsbDayM4UoHwbvw
 github.com/decred/dcrd/dcrec/secp256k1/v4 v4.4.0/go.mod h1:ZXNYxsqcloTdSy/rNShjYzMhyjf0LaoftYK0p+A3h40=
 github.com/emicklei/go-restful/v3 v3.13.0 h1:C4Bl2xDndpU6nJ4bc1jXd+uTmYPVUwkD6bFY/oTyCes=
 github.com/emicklei/go-restful/v3 v3.13.0/go.mod h1:6n3XBCmQQb25CM2LCACGz8ukIrRry+4bhvbpWn3mrbc=
+github.com/envoyproxy/go-control-plane v0.13.4 h1:zEqyPVyku6IvWCFwux4x9RxkLOMUL+1vC9xUFv5l2/M=
+github.com/envoyproxy/go-control-plane/envoy v1.32.4 h1:jb83lalDRZSpPWW2Z7Mck/8kXZ5CQAFYVjQcdVIr83A=
+github.com/envoyproxy/go-control-plane/envoy v1.32.4/go.mod h1:Gzjc5k8JcJswLjAx1Zm+wSYE20UrLtt7JZMWiWQXQEw=
+github.com/envoyproxy/protoc-gen-validate v1.2.1 h1:DEo3O99U8j4hBFwbJfrz9VtgcDfUKS7KJ7spH3d86P8=
+github.com/envoyproxy/protoc-gen-validate v1.2.1/go.mod h1:d/C80l/jxXLdfEIhX1W2TmLfsJ31lvEjwamM4DxlWXU=
 github.com/evanphx/json-patch v0.5.2 h1:xVCHIVMUu1wtM/VkR9jVZ45N3FhZfYMMYGorLCR8P3k=
 github.com/evanphx/json-patch v0.5.2/go.mod h1:ZWS5hhDbVDyob71nXKNL0+PWn6ToqBHMikGIFbs31qQ=
 github.com/evanphx/json-patch/v5 v5.9.11 h1:/8HVnzMq13/3x9TPvjG08wUGqBTmZBsCWzjTM0wiaDU=
 github.com/evanphx/json-patch/v5 v5.9.11/go.mod h1:3j+LviiESTElxA4p3EMKAB9HXj3/XEtnUf6OZxqIQTM=
+github.com/external-secrets/external-secrets/providers/v1/gcp v0.0.0-20251104073127-4d2c8fd13e10 h1:tPYE3zcBAepYacYbhzTgZyQ/yxbXdzQqCmMsH7D54xk=
+github.com/external-secrets/external-secrets/providers/v1/gcp v0.0.0-20251104073127-4d2c8fd13e10/go.mod h1:iwajJm1aNMXI1bgCs/W5S846IfZ6lUcPiYXSyRWEDbI=
 github.com/fatih/color v1.13.0/go.mod h1:kLAiJbzzSOZDVNGyDpeOxJ47H46qBXwg5ILebYFFOfk=
 github.com/fatih/color v1.18.0 h1:S8gINlzdQ840/4pfAwic/ZE0djQEH3wM94VfqLTZcOM=
 github.com/fatih/color v1.18.0/go.mod h1:4FelSpRwEGDpQ12mAdzqdOukCy4u8WUtOY6lkT/6HfU=
+github.com/felixge/httpsnoop v1.0.4 h1:NFTV2Zj1bL4mc9sqWACXbQFVBBg2W3GPvqp8/ESS2Wg=
+github.com/felixge/httpsnoop v1.0.4/go.mod h1:m8KPJKqk1gH5J9DgRY2ASl2lWCfGKXixSwevea8zH2U=
 github.com/frankban/quicktest v1.14.6 h1:7Xjx+VpznH+oBnejlPUj8oUpdxnVs4f8XU8WnHkI4W8=
 github.com/frankban/quicktest v1.14.6/go.mod h1:4ptaffx2x8+WTWXmUCuVU6aPUX1/Mz7zb5vbUoiM6w0=
 github.com/fsnotify/fsnotify v1.9.0 h1:2Ml+OJNzbYCTzsxtv8vKSFD9PbJjmhYF14k/jKC7S9k=
@@ -66,8 +89,11 @@ github.com/fxamacker/cbor/v2 v2.9.0 h1:NpKPmjDBgUfBms6tr6JZkTHtfFGcMKsw3eGcmD/sa
 github.com/fxamacker/cbor/v2 v2.9.0/go.mod h1:vM4b+DJCtHn+zz7h3FFp/hDAI9WNWCsZj23V5ytsSxQ=
 github.com/go-jose/go-jose/v4 v4.1.3 h1:CVLmWDhDVRa6Mi/IgCgaopNosCaHz7zrMeF9MlZRkrs=
 github.com/go-jose/go-jose/v4 v4.1.3/go.mod h1:x4oUasVrzR7071A4TnHLGSPpNOm2a21K9Kf04k1rs08=
+github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A=
 github.com/go-logr/logr v1.4.3 h1:CjnDlHq8ikf6E492q6eKboGOC0T8CDaOvkHCIg8idEI=
 github.com/go-logr/logr v1.4.3/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY=
+github.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag=
+github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE=
 github.com/go-logr/zapr v1.3.0 h1:XGdV8XW8zdwFiwOA2Dryh1gj2KRQyOOoNmBy4EplIcQ=
 github.com/go-logr/zapr v1.3.0/go.mod h1:YKepepNBd1u/oyhd/yQmtjVXmm9uML4IXUgMOwR8/Gg=
 github.com/go-openapi/jsonpointer v0.22.1 h1:sHYI1He3b9NqJ4wXLoJDKmUmHkWy/L7rtEo92JUxBNk=
@@ -113,6 +139,8 @@ github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q=
 github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q=
 github.com/golang-jwt/jwt/v5 v5.3.0 h1:pv4AsKCKKZuqlgs5sUmn4x8UlGa0kEVt/puTpKx9vvo=
 github.com/golang-jwt/jwt/v5 v5.3.0/go.mod h1:fxCRLWMO43lRc8nhHWY6LGqRcf+1gQWArsqaEUEa5bE=
+github.com/golang/protobuf v1.5.4 h1:i7eJL8qZTpSEXOPTxNKhASYpMn+8e5Q6AdndVa1dWek=
+github.com/golang/protobuf v1.5.4/go.mod h1:lnTiLA8Wa4RWRcIUkrtSVa5nRhsEGBg48fD6rSs7xps=
 github.com/google/btree v1.1.3 h1:CVpQJjYgC4VbzxeGVHfvZrv1ctoYCAI8vbl07Fcxlyg=
 github.com/google/btree v1.1.3/go.mod h1:qOPhT0dTNdNzV6Z/lhRX0YXUafgPLFUh+gZMl761Gm4=
 github.com/google/gnostic-models v0.7.0 h1:qwTtogB15McXDaNqTZdzPJRHvaVJlAl+HVQnLmJEJxo=
@@ -124,8 +152,14 @@ github.com/google/gofuzz v1.2.0 h1:xRy4A+RhZaiKjJ1bPfwQ8sedCA+YS2YcCHW6ec7JMi0=
 github.com/google/gofuzz v1.2.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg=
 github.com/google/pprof v0.0.0-20241029153458-d1b30febd7db h1:097atOisP2aRj7vFgYQBbFN4U4JNXUNYpxael3UzMyo=
 github.com/google/pprof v0.0.0-20241029153458-d1b30febd7db/go.mod h1:vavhavw2zAxS5dIdcRluK6cSGGPlZynqzFM8NdvU144=
+github.com/google/s2a-go v0.1.9 h1:LGD7gtMgezd8a/Xak7mEWL0PjoTQFvpRudN895yqKW0=
+github.com/google/s2a-go v0.1.9/go.mod h1:YA0Ei2ZQL3acow2O62kdp9UlnvMmU7kA6Eutn0dXayM=
 github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0=
 github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
+github.com/googleapis/enterprise-certificate-proxy v0.3.6 h1:GW/XbdyBFQ8Qe+YAmFU9uHLo7OnF5tL52HFAgMmyrf4=
+github.com/googleapis/enterprise-certificate-proxy v0.3.6/go.mod h1:MkHOF77EYAE7qfSuSS9PU6g4Nt4e11cnsDUowfwewLA=
+github.com/googleapis/gax-go/v2 v2.15.0 h1:SyjDc1mGgZU5LncH8gimWo9lW1DtIfPibOG81vgd/bo=
+github.com/googleapis/gax-go/v2 v2.15.0/go.mod h1:zVVkkxAQHa1RQpg9z2AUCMnKhi0Qld9rcmyfL1OZhoc=
 github.com/hashicorp/errwrap v1.0.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4=
 github.com/hashicorp/errwrap v1.1.0 h1:OxrOeh75EUXMY8TBjag2fzXGZ40LB6IKw45YeGUDY2I=
 github.com/hashicorp/errwrap v1.1.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4=
@@ -160,6 +194,8 @@ github.com/hashicorp/vault/api/auth/approle v0.11.0 h1:ViUvgqoSTqHkMi1L1Rr/LnQ+P
 github.com/hashicorp/vault/api/auth/approle v0.11.0/go.mod h1:v8ZqBRw+GP264ikIw2sEBKF0VT72MEhLWnZqWt3xEG8=
 github.com/hashicorp/vault/api/auth/aws v0.11.0 h1:lWdUxrzvPotg6idNr62al4w97BgI9xTDdzMCTViNH2s=
 github.com/hashicorp/vault/api/auth/aws v0.11.0/go.mod h1:PWqdH/xqaudapmnnGP9ip2xbxT/kRW2qEgpqiQff6Gc=
+github.com/hashicorp/vault/api/auth/gcp v0.11.0 h1:BSK+2Ji2OGSzM4pRVY7boa+2qPW8uiWZAYOrrt0XcJM=
+github.com/hashicorp/vault/api/auth/gcp v0.11.0/go.mod h1:EbW5XSmkdUiWsSAYV33TbDR2zVi8QTo29LAfPByFhag=
 github.com/hashicorp/vault/api/auth/kubernetes v0.10.0 h1:5rqWmUFxnu3S7XYq9dafURwBgabYDFzo2Wv+AMopPHs=
 github.com/hashicorp/vault/api/auth/kubernetes v0.10.0/go.mod h1:cZZmhF6xboMDmDbMY52oj2DKW6gS0cQ9g0pJ5XIXQ5U=
 github.com/hashicorp/vault/api/auth/ldap v0.11.0 h1:jd6gJXeFR4jyDbAh6R4RoW1uq6kmTt7M/vjW41jXczA=
@@ -233,6 +269,8 @@ github.com/oracle/oci-go-sdk/v65 v65.102.1 h1:zLNLz5dVzZxOf5DK/f3WGZUjwrQ9m27fd4
 github.com/oracle/oci-go-sdk/v65 v65.102.1/go.mod h1:oB8jFGVc/7/zJ+DbleE8MzGHjhs2ioCz5stRTdZdIcY=
 github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4=
 github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
+github.com/planetscale/vtprotobuf v0.6.1-0.20240319094008-0393e58bdf10 h1:GFCKgmp0tecUJ0sJuv4pzYCqS9+RGSn52M3FUwPs+uo=
+github.com/planetscale/vtprotobuf v0.6.1-0.20240319094008-0393e58bdf10/go.mod h1:t/avpk3KcrXxUnYOhZhMXJlSEyie6gQbtLq5NM3loB8=
 github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
 github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
 github.com/prometheus/client_golang v1.23.2 h1:Je96obch5RDVy3FDMndoUsjAhG5Edi49h0RJWRi/o0o=
@@ -272,6 +310,7 @@ github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO
 github.com/stretchr/testify v1.8.2/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4=
 github.com/stretchr/testify v1.11.1 h1:7s2iGBzp5EwR7/aIZr8ao5+dra3wiQyKjjFuvgVKu7U=
 github.com/stretchr/testify v1.11.1/go.mod h1:wZwfW3scLgRK+23gO65QZefKpKQRnfz6sD981Nm4B6U=
+github.com/tidwall/gjson v1.14.2/go.mod h1:/wbyibRr2FHMks5tjHJ5F8dMZh3AcwJEMf5vlfC0lxk=
 github.com/tidwall/gjson v1.18.0 h1:FIDeeyB800efLX89e5a8Y0BNH+LOngJyGrIWxG2FKQY=
 github.com/tidwall/gjson v1.18.0/go.mod h1:/wbyibRr2FHMks5tjHJ5F8dMZh3AcwJEMf5vlfC0lxk=
 github.com/tidwall/match v1.1.1/go.mod h1:eRSPERbgtNPcGhD8UCthc6PmLEQXEWd3PRB5JTxsfmM=
@@ -280,12 +319,30 @@ github.com/tidwall/match v1.2.0/go.mod h1:eRSPERbgtNPcGhD8UCthc6PmLEQXEWd3PRB5JT
 github.com/tidwall/pretty v1.2.0/go.mod h1:ITEVvHYasfjBbM0u2Pg8T2nJnzm8xPwvNhhsoaGGjNU=
 github.com/tidwall/pretty v1.2.1 h1:qjsOFOWWQl+N3RsoF5/ssm1pHmJJwhjlSbZ51I6wMl4=
 github.com/tidwall/pretty v1.2.1/go.mod h1:ITEVvHYasfjBbM0u2Pg8T2nJnzm8xPwvNhhsoaGGjNU=
+github.com/tidwall/sjson v1.2.5 h1:kLy8mja+1c9jlljvWTlSazM7cKDRfJuR/bOJhcY5NcY=
+github.com/tidwall/sjson v1.2.5/go.mod h1:Fvgq9kS/6ociJEDnK0Fk1cpYF4FIW6ZF7LAe+6jwd28=
 github.com/x448/float16 v0.8.4 h1:qLwI1I70+NjRFUR3zs1JPUCgaCXSh3SW62uAKT1mSBM=
 github.com/x448/float16 v0.8.4/go.mod h1:14CWIYCyZA/cWjXOioeEpHeN/83MdbZDRQHoFcYsOfg=
 github.com/youmark/pkcs8 v0.0.0-20240726163527-a2c0da244d78 h1:ilQV1hzziu+LLM3zUTJ0trRztfwgjqKnBWNtSRkbmwM=
 github.com/youmark/pkcs8 v0.0.0-20240726163527-a2c0da244d78/go.mod h1:aL8wCCfTfSfmXjznFBSZNN13rSJjlIOI1fUNAtF7rmI=
 github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
 github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
+go.opentelemetry.io/auto/sdk v1.1.0 h1:cH53jehLUN6UFLY71z+NDOiNJqDdPRaXzTel0sJySYA=
+go.opentelemetry.io/auto/sdk v1.1.0/go.mod h1:3wSPjt5PWp2RhlCcmmOial7AvC4DQqZb7a7wCow3W8A=
+go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.61.0 h1:q4XOmH/0opmeuJtPsbFNivyl7bCt7yRBbeEm2sC/XtQ=
+go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.61.0/go.mod h1:snMWehoOh2wsEwnvvwtDyFCxVeDAODenXHtn5vzrKjo=
+go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.61.0 h1:F7Jx+6hwnZ41NSFTO5q4LYDtJRXBf2PD0rNBkeB/lus=
+go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.61.0/go.mod h1:UHB22Z8QsdRDrnAtX4PntOl36ajSxcdUMt1sF7Y6E7Q=
+go.opentelemetry.io/otel v1.37.0 h1:9zhNfelUvx0KBfu/gb+ZgeAfAgtWrfHJZcAqFC228wQ=
+go.opentelemetry.io/otel v1.37.0/go.mod h1:ehE/umFRLnuLa/vSccNq9oS1ErUlkkK71gMcN34UG8I=
+go.opentelemetry.io/otel/metric v1.37.0 h1:mvwbQS5m0tbmqML4NqK+e3aDiO02vsf/WgbsdpcPoZE=
+go.opentelemetry.io/otel/metric v1.37.0/go.mod h1:04wGrZurHYKOc+RKeye86GwKiTb9FKm1WHtO+4EVr2E=
+go.opentelemetry.io/otel/sdk v1.37.0 h1:ItB0QUqnjesGRvNcmAcU0LyvkVyGJ2xftD29bWdDvKI=
+go.opentelemetry.io/otel/sdk v1.37.0/go.mod h1:VredYzxUvuo2q3WRcDnKDjbdvmO0sCzOvVAiY+yUkAg=
+go.opentelemetry.io/otel/sdk/metric v1.37.0 h1:90lI228XrB9jCMuSdA0673aubgRobVZFhbjxHHspCPc=
+go.opentelemetry.io/otel/sdk/metric v1.37.0/go.mod h1:cNen4ZWfiD37l5NhS+Keb5RXVWZWpRE+9WyVCpbo5ps=
+go.opentelemetry.io/otel/trace v1.37.0 h1:HLdcFNbRQBE2imdSEgm/kwqmQj1Or1l/7bW6mxVK7z4=
+go.opentelemetry.io/otel/trace v1.37.0/go.mod h1:TlgrlQ+PtQO5XFerSPUYG0JSgGyryXewPGyayAWSBS0=
 go.uber.org/automaxprocs v1.6.0 h1:O3y2/QNTOdbF+e/dpXNNW7Rx2hZ4sTIPyybbxyNqTUs=
 go.uber.org/automaxprocs v1.6.0/go.mod h1:ifeIMSnPZuznNm6jmdzmU3/bfk01Fe2fotchwEFJ8r8=
 go.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto=
@@ -350,6 +407,18 @@ golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8T
 golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
 gomodules.xyz/jsonpatch/v2 v2.5.0 h1:JELs8RLM12qJGXU4u/TO3V25KW8GreMKl9pdkk14RM0=
 gomodules.xyz/jsonpatch/v2 v2.5.0/go.mod h1:AH3dM2RI6uoBZxn3LVrfvJ3E0/9dG4cSrbuBJT4moAY=
+gonum.org/v1/gonum v0.16.0 h1:5+ul4Swaf3ESvrOnidPp4GZbzf0mxVQpDCYUQE7OJfk=
+gonum.org/v1/gonum v0.16.0/go.mod h1:fef3am4MQ93R2HHpKnLk4/Tbh/s0+wqD5nfa6Pnwy4E=
+google.golang.org/api v0.253.0 h1:apU86Eq9Q2eQco3NsUYFpVTfy7DwemojL7LmbAj7g/I=
+google.golang.org/api v0.253.0/go.mod h1:PX09ad0r/4du83vZVAaGg7OaeyGnaUmT/CYPNvtLCbw=
+google.golang.org/genproto v0.0.0-20251022142026-3a174f9686a8 h1:a12a2/BiVRxRWIqBbfqoSK6tgq8cyUgMnEI81QlPge0=
+google.golang.org/genproto v0.0.0-20251022142026-3a174f9686a8/go.mod h1:1Ic78BnpzY8OaTCmzxJDP4qC9INZPbGZl+54RKjtyeI=
+google.golang.org/genproto/googleapis/api v0.0.0-20251014184007-4626949a642f h1:OiFuztEyBivVKDvguQJYWq1yDcfAHIID/FVrPR4oiI0=
+google.golang.org/genproto/googleapis/api v0.0.0-20251014184007-4626949a642f/go.mod h1:kprOiu9Tr0JYyD6DORrc4Hfyk3RFXqkQ3ctHEum3ZbM=
+google.golang.org/genproto/googleapis/rpc v0.0.0-20251014184007-4626949a642f h1:1FTH6cpXFsENbPR5Bu8NQddPSaUUE6NA2XdZdDSAJK4=
+google.golang.org/genproto/googleapis/rpc v0.0.0-20251014184007-4626949a642f/go.mod h1:7i2o+ce6H/6BluujYR+kqX3GKH+dChPTQU19wjRPiGk=
+google.golang.org/grpc v1.76.0 h1:UnVkv1+uMLYXoIz6o7chp59WfQUYA2ex/BXQ9rHZu7A=
+google.golang.org/grpc v1.76.0/go.mod h1:Ju12QI8M6iQJtbcsV+awF5a4hfJMLi4X0JLo94ULZ6c=
 google.golang.org/protobuf v1.36.10 h1:AYd7cD/uASjIL6Q9LiTjz8JLcrh/88q5UObnmY3aOOE=
 google.golang.org/protobuf v1.36.10/go.mod h1:HTf+CrKn2C3g5S8VImy6tdcUvCska2kB7j23XfzDpco=
 gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
@@ -368,6 +437,8 @@ gopkg.in/yaml.v2 v2.3.0/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
 gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
 gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=
 gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
+grpc.go4.org v0.0.0-20170609214715-11d0a25b4919 h1:tmXTu+dfa+d9Evp8NpJdgOy6+rt8/x4yG7qPBrtNfLY=
+grpc.go4.org v0.0.0-20170609214715-11d0a25b4919/go.mod h1:77eQGdRu53HpSqPFJFmuJdjuHRquDANNeA4x7B8WQ9o=
 k8s.io/api v0.34.1 h1:jC+153630BMdlFukegoEL8E/yT7aLyQkIVuwhmwDgJM=
 k8s.io/api v0.34.1/go.mod h1:SB80FxFtXn5/gwzCoN6QCtPD7Vbu5w2n1S0J5gFfTYk=
 k8s.io/apiextensions-apiserver v0.34.1 h1:NNPBva8FNAPt1iSVwIE0FsdrVriRXMsaWFMqJbII2CI=

+ 22 - 0
tests/__snapshot__/clustergenerator-v1alpha1.yaml

@@ -202,6 +202,28 @@ spec:
               key: string
               name: string
               namespace: string
+          gcp:
+            location: string
+            path: "gcp"
+            projectID: string
+            role: string
+            secretRef:
+              secretAccessKeySecretRef:
+                key: string
+                name: string
+                namespace: string
+            serviceAccountRef:
+              audiences: [] # minItems 0 of type string
+              name: string
+              namespace: string
+            workloadIdentity:
+              clusterLocation: string
+              clusterName: string
+              clusterProjectID: string
+              serviceAccountRef:
+                audiences: [] # minItems 0 of type string
+                name: string
+                namespace: string
           iam:
             externalID: string
             jwt:

+ 22 - 0
tests/__snapshot__/clustersecretstore-v1.yaml

@@ -686,6 +686,28 @@ spec:
             key: string
             name: string
             namespace: string
+        gcp:
+          location: string
+          path: "gcp"
+          projectID: string
+          role: string
+          secretRef:
+            secretAccessKeySecretRef:
+              key: string
+              name: string
+              namespace: string
+          serviceAccountRef:
+            audiences: [] # minItems 0 of type string
+            name: string
+            namespace: string
+          workloadIdentity:
+            clusterLocation: string
+            clusterName: string
+            clusterProjectID: string
+            serviceAccountRef:
+              audiences: [] # minItems 0 of type string
+              name: string
+              namespace: string
         iam:
           externalID: string
           jwt:

+ 22 - 0
tests/__snapshot__/secretstore-v1.yaml

@@ -686,6 +686,28 @@ spec:
             key: string
             name: string
             namespace: string
+        gcp:
+          location: string
+          path: "gcp"
+          projectID: string
+          role: string
+          secretRef:
+            secretAccessKeySecretRef:
+              key: string
+              name: string
+              namespace: string
+          serviceAccountRef:
+            audiences: [] # minItems 0 of type string
+            name: string
+            namespace: string
+          workloadIdentity:
+            clusterLocation: string
+            clusterName: string
+            clusterProjectID: string
+            serviceAccountRef:
+              audiences: [] # minItems 0 of type string
+              name: string
+              namespace: string
         iam:
           externalID: string
           jwt:

+ 22 - 0
tests/__snapshot__/vaultdynamicsecret-v1alpha1.yaml

@@ -30,6 +30,28 @@ spec:
           key: string
           name: string
           namespace: string
+      gcp:
+        location: string
+        path: "gcp"
+        projectID: string
+        role: string
+        secretRef:
+          secretAccessKeySecretRef:
+            key: string
+            name: string
+            namespace: string
+        serviceAccountRef:
+          audiences: [] # minItems 0 of type string
+          name: string
+          namespace: string
+        workloadIdentity:
+          clusterLocation: string
+          clusterName: string
+          clusterProjectID: string
+          serviceAccountRef:
+            audiences: [] # minItems 0 of type string
+            name: string
+            namespace: string
       iam:
         externalID: string
         jwt: