Skip to content

Commit 925514b

Browse files
authored
Merge pull request #24 from d-honeybadger/shared-terraform
configure shared terraform providers
2 parents 93b7f8c + a2de4a9 commit 925514b

File tree

3 files changed

+25
-15
lines changed

3 files changed

+25
-15
lines changed

cluster/images/provider-linode/Dockerfile

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,7 @@ ENV TERRAFORM_VERSION ${TERRAFORM_VERSION}
4242
ENV TERRAFORM_PROVIDER_SOURCE ${TERRAFORM_PROVIDER_SOURCE}
4343
ENV TERRAFORM_PROVIDER_VERSION ${TERRAFORM_PROVIDER_VERSION}
4444
ENV TERRAFORM_NATIVE_PROVIDER_PATH ${PLUGIN_DIR}/${TERRAFORM_NATIVE_PROVIDER_BINARY}
45+
ENV TERRAFORM_NATIVE_PROVIDER_PATH ${PLUGIN_DIR}/${TERRAFORM_PROVIDER_DOWNLOAD_NAME}_v${TERRAFORM_PROVIDER_VERSION}_x5
4546

4647
USER ${USER_ID}
4748
EXPOSE 8080

cmd/provider/main.go

Lines changed: 22 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -34,15 +34,17 @@ import (
3434

3535
func main() {
3636
var (
37-
app = kingpin.New(filepath.Base(os.Args[0]), "Terraform based Crossplane provider for Linode").DefaultEnvars()
38-
debug = app.Flag("debug", "Run with debug logging.").Short('d').Bool()
39-
syncInterval = app.Flag("sync", "Sync interval controls how often all resources will be double checked for drift.").Short('s').Default("1h").Duration()
40-
pollInterval = app.Flag("poll", "Poll interval controls how often an individual resource should be checked for drift.").Default("10m").Duration()
41-
leaderElection = app.Flag("leader-election", "Use leader election for the controller manager.").Short('l').Default("false").OverrideDefaultFromEnvar("LEADER_ELECTION").Bool()
42-
terraformVersion = app.Flag("terraform-version", "Terraform version.").Required().Envar("TERRAFORM_VERSION").String()
43-
providerSource = app.Flag("terraform-provider-source", "Terraform provider source.").Required().Envar("TERRAFORM_PROVIDER_SOURCE").String()
44-
providerVersion = app.Flag("terraform-provider-version", "Terraform provider version.").Required().Envar("TERRAFORM_PROVIDER_VERSION").String()
45-
maxReconcileRate = app.Flag("max-reconcile-rate", "The global maximum rate per second at which resources may checked for drift from the desired state.").Default("10").Int()
37+
app = kingpin.New(filepath.Base(os.Args[0]), "Terraform based Crossplane provider for Linode").DefaultEnvars()
38+
debug = app.Flag("debug", "Run with debug logging.").Short('d').Bool()
39+
syncInterval = app.Flag("sync", "Sync interval controls how often all resources will be double checked for drift.").Short('s').Default("1h").Duration()
40+
pollInterval = app.Flag("poll", "Poll interval controls how often an individual resource should be checked for drift.").Default("10m").Duration()
41+
leaderElection = app.Flag("leader-election", "Use leader election for the controller manager.").Short('l').Default("false").OverrideDefaultFromEnvar("LEADER_ELECTION").Bool()
42+
terraformVersion = app.Flag("terraform-version", "Terraform version.").Required().Envar("TERRAFORM_VERSION").String()
43+
providerSource = app.Flag("terraform-provider-source", "Terraform provider source.").Required().Envar("TERRAFORM_PROVIDER_SOURCE").String()
44+
providerVersion = app.Flag("terraform-provider-version", "Terraform provider version.").Required().Envar("TERRAFORM_PROVIDER_VERSION").String()
45+
nativeProviderPath = app.Flag("terraform-native-provider-path", "Terraform native provider path for shared execution.").Default("").Envar("TERRAFORM_NATIVE_PROVIDER_PATH").String()
46+
nativeProviderTTL = app.Flag("provider-ttl", "TTL for the native plugin processes before they are replaced. Changing the default may increase memory consumption.").Default("100").Int()
47+
maxReconcileRate = app.Flag("max-reconcile-rate", "The global maximum rate per second at which resources may checked for drift from the desired state.").Default("10").Int()
4648

4749
namespace = app.Flag("namespace", "Namespace used to set as default scope in default secret store config.").Default("crossplane-system").Envar("POD_NAMESPACE").String()
4850
enableExternalSecretStores = app.Flag("enable-external-secret-stores", "Enable support for ExternalSecretStores.").Default("false").Envar("ENABLE_EXTERNAL_SECRET_STORES").Bool()
@@ -74,18 +76,24 @@ func main() {
7476
})
7577
kingpin.FatalIfError(err, "Cannot create controller manager")
7678
kingpin.FatalIfError(apis.AddToScheme(mgr.GetScheme()), "Cannot add Linode APIs to scheme")
79+
80+
// no-op scheduler will preserve the (old) behavior of forking a Terraform plugin process per invocation
81+
var scheduler terraform.ProviderScheduler = terraform.NewNoOpProviderScheduler()
82+
// but if the Terraform provider plugin path is configured, shared gRPC server(s) will be used
83+
if len(*nativeProviderPath) != 0 {
84+
scheduler = terraform.NewSharedProviderScheduler(log, *nativeProviderTTL, terraform.WithNativeProviderPath(*nativeProviderPath), terraform.WithNativeProviderName("registry.terraform.io/"+*providerSource))
85+
}
86+
7787
o := tjcontroller.Options{
7888
Options: xpcontroller.Options{
7989
Logger: log,
8090
GlobalRateLimiter: ratelimiter.NewGlobal(*maxReconcileRate),
8191
PollInterval: *pollInterval,
8292
MaxConcurrentReconciles: *maxReconcileRate,
8393
},
84-
Provider: config.GetProvider(),
85-
// use the following WorkspaceStoreOption to enable the shared gRPC mode
86-
// terraform.WithProviderRunner(terraform.NewSharedProvider(log, os.Getenv("TERRAFORM_NATIVE_PROVIDER_PATH"), terraform.WithNativeProviderArgs("-debuggable")))
87-
WorkspaceStore: terraform.NewWorkspaceStore(log),
88-
SetupFn: clients.TerraformSetupBuilder(*terraformVersion, *providerSource, *providerVersion),
94+
Provider: config.GetProvider(),
95+
WorkspaceStore: terraform.NewWorkspaceStore(log, terraform.WithDisableInit(len(*nativeProviderPath) != 0), terraform.WithProcessReportInterval(*pollInterval)),
96+
SetupFn: clients.TerraformSetupBuilder(*terraformVersion, *providerSource, *providerVersion, scheduler),
8997
}
9098

9199
if *enableExternalSecretStores {

internal/clients/linode.go

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -35,14 +35,15 @@ const (
3535

3636
// TerraformSetupBuilder builds Terraform a terraform.SetupFn function which
3737
// returns Terraform provider setup configuration
38-
func TerraformSetupBuilder(version, providerSource, providerVersion string) terraform.SetupFn {
38+
func TerraformSetupBuilder(version, providerSource, providerVersion string, scheduler terraform.ProviderScheduler) terraform.SetupFn {
3939
return func(ctx context.Context, client client.Client, mg resource.Managed) (terraform.Setup, error) {
4040
ps := terraform.Setup{
4141
Version: version,
4242
Requirement: terraform.ProviderRequirement{
4343
Source: providerSource,
4444
Version: providerVersion,
4545
},
46+
Scheduler: scheduler,
4647
}
4748

4849
configRef := mg.GetProviderConfigReference()

0 commit comments

Comments
 (0)