|
|
1 month ago | |
|---|---|---|
| .. | ||
| schema | 1 month ago | |
| templates | 1 month ago | |
| README.md | 1 month ago | |
| generate-provider-main.go | 1 month ago | |
| generate_provider_main_test.go | 1 month ago | |
| go.mod | 1 month ago | |
| go.sum | 1 month ago | |
This directory contains the code generation tooling for v2 provider main.go and Dockerfile files.
The generator reduces boilerplate and maintenance burden by centralizing the common provider startup logic (flags, gRPC server setup, health checks, graceful shutdown, etc.) while allowing provider-specific configuration through YAML files.
providers/v2/hack/
├── generate-provider-main.go # Generator tool
├── schema/
│ └── provider-config.schema.json # JSON schema for provider.yaml validation
├── templates/
│ ├── main.go.tmpl # Template for main.go
│ └── Dockerfile.tmpl # Template for Dockerfile
└── README.md # This file
From the repository root:
make generate-providers
This will:
provider.yaml files in providers/v2/main.go and Dockerfile for each providergoimportsmake verify-providers
This checks if any generated files are out of sync with their configuration.
To add a new v2 provider:
Create the provider directory structure:
providers/v2/myprovider/
├── provider.yaml # Configuration (required)
├── config.go # Spec mapper logic (required)
├── store/ # v1 store implementation
└── generator/ # v1 generator implementation (optional)
Create provider.yaml:
provider:
name: myprovider
displayName: "My Provider"
v2Package: "github.com/external-secrets/external-secrets/apis/provider/myprovider/v2alpha1"
stores:
- gvk:
group: "provider.external-secrets.io"
version: "v2alpha1"
kind: "MyProvider"
v1Provider: "github.com/external-secrets/external-secrets/providers/v1/myprovider"
v1ProviderFunc: "NewProvider"
# Optional: if provider includes generators
generators:
- gvk:
group: "generators.external-secrets.io"
version: "v1alpha1"
kind: "MyGenerator"
v1Generator: "github.com/external-secrets/external-secrets/providers/v2/myprovider/generator"
v1GeneratorFunc: "NewGenerator"
configPackage: "."
Create config.go with GetSpecMapper function:
package main
import (
"context"
"sigs.k8s.io/controller-runtime/pkg/client"
v1 "github.com/external-secrets/external-secrets/apis/externalsecrets/v1"
myproviderv2alpha1 "github.com/external-secrets/external-secrets/apis/provider/myprovider/v2alpha1"
pb "github.com/external-secrets/external-secrets/proto/provider"
)
func GetSpecMapper(kubeClient client.Client) func(*pb.ProviderReference) (*v1.SecretStoreSpec, error) {
return func(ref *pb.ProviderReference) (*v1.SecretStoreSpec, error) {
var provider myproviderv2alpha1.MyProvider
err := kubeClient.Get(context.Background(), client.ObjectKey{
Namespace: ref.Namespace,
Name: ref.Name,
}, &provider)
if err != nil {
return nil, err
}
return &v1.SecretStoreSpec{
Provider: &v1.SecretStoreProvider{
MyProvider: &provider.Spec,
},
}, nil
}
}
Generate the files:
make generate-providers
Test the provider compiles:
cd providers/v2/myprovider && go build
provider.name: Provider name (lowercase, alphanumeric with hyphens)provider.displayName: Human-readable provider nameprovider.v2Package: Go import path for v2alpha1 API (required if using stores)stores: Array of store implementationsgenerators: Array of generator implementationsconfigPackage: Relative import path for config.go (default: ".")stores:
- gvk:
group: "provider.external-secrets.io"
version: "v2alpha1"
kind: "MyKind"
v1Provider: "github.com/org/repo/providers/v1/myprovider"
v1ProviderFunc: "NewProvider"
generators:
- gvk:
group: "generators.external-secrets.io"
version: "v1alpha1"
kind: "MyGenerator"
v1Generator: "github.com/org/repo/providers/v2/myprovider/generator"
v1GeneratorFunc: "NewMyGenerator"
provider:
name: kubernetes
displayName: "Kubernetes Provider"
v2Package: "github.com/external-secrets/external-secrets/apis/provider/kubernetes/v2alpha1"
stores:
- gvk:
group: "provider.external-secrets.io"
version: "v2alpha1"
kind: "Kubernetes"
v1Provider: "github.com/external-secrets/external-secrets/providers/v1/kubernetes"
v1ProviderFunc: "NewProvider"
configPackage: "."
provider:
name: aws
displayName: "AWS Provider"
v2Package: "github.com/external-secrets/external-secrets/apis/provider/aws/v2alpha1"
stores:
- gvk:
group: "provider.external-secrets.io"
version: "v2alpha1"
kind: "SecretsManager"
v1Provider: "github.com/external-secrets/external-secrets/providers/v2/aws/store"
v1ProviderFunc: "NewProvider"
generators:
- gvk:
group: "generators.external-secrets.io"
version: "v1alpha1"
kind: "ECRAuthorizationToken"
v1Generator: "github.com/external-secrets/external-secrets/providers/v2/aws/generator"
v1GeneratorFunc: "NewECRGenerator"
- gvk:
group: "generators.external-secrets.io"
version: "v1alpha1"
kind: "STSSessionToken"
v1Generator: "github.com/external-secrets/external-secrets/providers/v2/aws/generator"
v1GeneratorFunc: "NewSTSGenerator"
configPackage: "."
If you see schema validation errors:
provider.yaml follows the schemastores or generators is definedIf generated code doesn't compile:
provider.yaml are correctGetSpecMapper function signature matches expected formatThe generator automatically handles import aliases. If you have multiple stores or generators from the same package, they will share the same import alias.
To modify the generator:
generate-provider-main.gotemplates/schema/provider-config.schema.jsonmake generate-providersmake verify-providers