mirror of
https://github.com/kreuzwerker/terraform-provider-docker.git
synced 2026-02-03 20:29:30 -05:00
feat: Add muxing to introduce new plugin framework (#838)
Some checks failed
Acc Tests / acc-test (TestAccDockerConfig, 0.15.x) (push) Has been cancelled
Acc Tests / acc-test (TestAccDockerConfig, 1.8.x) (push) Has been cancelled
Acc Tests / acc-test (TestAccDockerNetwork, 0.15.x) (push) Has been cancelled
Acc Tests / acc-test (TestAccDockerNetwork, 1.8.x) (push) Has been cancelled
Acc Tests / acc-test (TestAccDockerPlugin, 0.15.x) (push) Has been cancelled
Acc Tests / acc-test (TestAccDockerPlugin, 1.8.x) (push) Has been cancelled
Acc Tests / acc-test (TestAccDockerSecret, 0.15.x) (push) Has been cancelled
Acc Tests / acc-test (TestAccDockerSecret, 1.8.x) (push) Has been cancelled
Acc Tests / acc-test (TestAccDockerTag, 0.15.x) (push) Has been cancelled
Acc Tests / acc-test (TestAccDockerTag, 1.8.x) (push) Has been cancelled
Acc Tests / acc-test (TestAccDockerVolume, 0.15.x) (push) Has been cancelled
Acc Tests / acc-test (TestAccDockerVolume, 1.8.x) (push) Has been cancelled
Acc Tests / acc-test (true, TestAccDockerContainer, 0.15.x) (push) Has been cancelled
Acc Tests / acc-test (true, TestAccDockerContainer, 1.8.x) (push) Has been cancelled
Acc Tests / acc-test (true, TestAccDockerImage, 0.15.x) (push) Has been cancelled
Acc Tests / acc-test (true, TestAccDockerImage, 1.8.x) (push) Has been cancelled
Acc Tests / acc-test (true, TestAccDockerRegistryImage, 0.15.x) (push) Has been cancelled
Acc Tests / acc-test (true, TestAccDockerRegistryImage, 1.8.x) (push) Has been cancelled
Acc Tests / acc-test (true, TestAccDockerService, 0.15.x) (push) Has been cancelled
Acc Tests / acc-test (true, TestAccDockerService, 1.8.x) (push) Has been cancelled
Compile Binaries / compile-fast (push) Has been cancelled
Compile Binaries / compile (push) Has been cancelled
golangci-lint / lint (push) Has been cancelled
Unit Tests / unit-test (push) Has been cancelled
Website Checks / markdown-link-check (push) Has been cancelled
Docs and Website Lint / website-generation (push) Has been cancelled
Docs and Website Lint / website-lint-spellcheck-tffmt (push) Has been cancelled
Docs and Website Lint / markdown-lint (push) Has been cancelled
Some checks failed
Acc Tests / acc-test (TestAccDockerConfig, 0.15.x) (push) Has been cancelled
Acc Tests / acc-test (TestAccDockerConfig, 1.8.x) (push) Has been cancelled
Acc Tests / acc-test (TestAccDockerNetwork, 0.15.x) (push) Has been cancelled
Acc Tests / acc-test (TestAccDockerNetwork, 1.8.x) (push) Has been cancelled
Acc Tests / acc-test (TestAccDockerPlugin, 0.15.x) (push) Has been cancelled
Acc Tests / acc-test (TestAccDockerPlugin, 1.8.x) (push) Has been cancelled
Acc Tests / acc-test (TestAccDockerSecret, 0.15.x) (push) Has been cancelled
Acc Tests / acc-test (TestAccDockerSecret, 1.8.x) (push) Has been cancelled
Acc Tests / acc-test (TestAccDockerTag, 0.15.x) (push) Has been cancelled
Acc Tests / acc-test (TestAccDockerTag, 1.8.x) (push) Has been cancelled
Acc Tests / acc-test (TestAccDockerVolume, 0.15.x) (push) Has been cancelled
Acc Tests / acc-test (TestAccDockerVolume, 1.8.x) (push) Has been cancelled
Acc Tests / acc-test (true, TestAccDockerContainer, 0.15.x) (push) Has been cancelled
Acc Tests / acc-test (true, TestAccDockerContainer, 1.8.x) (push) Has been cancelled
Acc Tests / acc-test (true, TestAccDockerImage, 0.15.x) (push) Has been cancelled
Acc Tests / acc-test (true, TestAccDockerImage, 1.8.x) (push) Has been cancelled
Acc Tests / acc-test (true, TestAccDockerRegistryImage, 0.15.x) (push) Has been cancelled
Acc Tests / acc-test (true, TestAccDockerRegistryImage, 1.8.x) (push) Has been cancelled
Acc Tests / acc-test (true, TestAccDockerService, 0.15.x) (push) Has been cancelled
Acc Tests / acc-test (true, TestAccDockerService, 1.8.x) (push) Has been cancelled
Compile Binaries / compile-fast (push) Has been cancelled
Compile Binaries / compile (push) Has been cancelled
golangci-lint / lint (push) Has been cancelled
Unit Tests / unit-test (push) Has been cancelled
Website Checks / markdown-link-check (push) Has been cancelled
Docs and Website Lint / website-generation (push) Has been cancelled
Docs and Website Lint / website-lint-spellcheck-tffmt (push) Has been cancelled
Docs and Website Lint / markdown-lint (push) Has been cancelled
* feat: Add muxing to introduce new plugin framework * feat: Match framework provider schema with sdkv2 schema for correct muxing
This commit is contained in:
parent
2890a9e77d
commit
1ddcec5725
6 changed files with 199 additions and 11 deletions
|
|
@ -4,9 +4,6 @@
|
|||
<a href="https://terraform.io">
|
||||
<img src="https://raw.githubusercontent.com/kreuzwerker/terraform-provider-docker/master/assets/terraform-logo.png" alt="Terraform logo" title="Terraform" align="right" height="100" />
|
||||
</a>
|
||||
<a href="https://kreuzwerker.de">
|
||||
<img src="https://raw.githubusercontent.com/kreuzwerker/terraform-provider-docker/master/assets/xw-logo.png" alt="Kreuzwerker logo" title="Kreuzwerker" align="right" height="100" />
|
||||
</a>
|
||||
|
||||
# Terraform Provider for Docker
|
||||
|
||||
|
|
@ -21,6 +18,7 @@
|
|||
## Documentation
|
||||
|
||||
The documentation for the provider is available on the [Terraform Registry](https://registry.terraform.io/providers/kreuzwerker/docker/latest/docs).
|
||||
You need at least Terraform `1.1.5` to use this provider.
|
||||
|
||||
Migration guides:
|
||||
* Do you want to migrate from `v3.x` to `v4.x`? Please read the [V3 - V4 migration guide](docs/v3_v4_migration.md)
|
||||
|
|
|
|||
|
|
@ -1,5 +1,9 @@
|
|||
# V3 to V4 Migration Guide
|
||||
|
||||
## General
|
||||
|
||||
Bump of minimum terraform version to `1.1.5` or newer. This is done as part of introducing the new `terraform-plugin-framework` to develop this provider.
|
||||
|
||||
|
||||
## `docker_network`
|
||||
|
||||
|
|
|
|||
4
go.mod
4
go.mod
|
|
@ -17,7 +17,10 @@ require (
|
|||
github.com/golangci/golangci-lint v1.64.8
|
||||
github.com/hashicorp/go-cty v1.5.0
|
||||
github.com/hashicorp/terraform-plugin-docs v0.24.0
|
||||
github.com/hashicorp/terraform-plugin-framework v1.17.0
|
||||
github.com/hashicorp/terraform-plugin-go v0.29.0
|
||||
github.com/hashicorp/terraform-plugin-log v0.10.0
|
||||
github.com/hashicorp/terraform-plugin-mux v0.21.0
|
||||
github.com/hashicorp/terraform-plugin-sdk/v2 v2.38.1
|
||||
github.com/katbyte/terrafmt v0.5.4
|
||||
github.com/mitchellh/go-homedir v1.1.0
|
||||
|
|
@ -175,7 +178,6 @@ require (
|
|||
github.com/hashicorp/logutils v1.0.0 // indirect
|
||||
github.com/hashicorp/terraform-exec v0.24.0 // indirect
|
||||
github.com/hashicorp/terraform-json v0.27.2 // indirect
|
||||
github.com/hashicorp/terraform-plugin-go v0.29.0 // indirect
|
||||
github.com/hashicorp/terraform-registry-address v0.4.0 // indirect
|
||||
github.com/hashicorp/terraform-svchost v0.1.1 // indirect
|
||||
github.com/hashicorp/yamux v0.1.2 // indirect
|
||||
|
|
|
|||
4
go.sum
4
go.sum
|
|
@ -408,10 +408,14 @@ github.com/hashicorp/terraform-json v0.27.2 h1:BwGuzM6iUPqf9JYM/Z4AF1OJ5VVJEEzoK
|
|||
github.com/hashicorp/terraform-json v0.27.2/go.mod h1:GzPLJ1PLdUG5xL6xn1OXWIjteQRT2CNT9o/6A9mi9hE=
|
||||
github.com/hashicorp/terraform-plugin-docs v0.24.0 h1:YNZYd+8cpYclQyXbl1EEngbld8w7/LPOm99GD5nikIU=
|
||||
github.com/hashicorp/terraform-plugin-docs v0.24.0/go.mod h1:YLg+7LEwVmRuJc0EuCw0SPLxuQXw5mW8iJ5ml/kvi+o=
|
||||
github.com/hashicorp/terraform-plugin-framework v1.17.0 h1:JdX50CFrYcYFY31gkmitAEAzLKoBgsK+iaJjDC8OexY=
|
||||
github.com/hashicorp/terraform-plugin-framework v1.17.0/go.mod h1:4OUXKdHNosX+ys6rLgVlgklfxN3WHR5VHSOABeS/BM0=
|
||||
github.com/hashicorp/terraform-plugin-go v0.29.0 h1:1nXKl/nSpaYIUBU1IG/EsDOX0vv+9JxAltQyDMpq5mU=
|
||||
github.com/hashicorp/terraform-plugin-go v0.29.0/go.mod h1:vYZbIyvxyy0FWSmDHChCqKvI40cFTDGSb3D8D70i9GM=
|
||||
github.com/hashicorp/terraform-plugin-log v0.10.0 h1:eu2kW6/QBVdN4P3Ju2WiB2W3ObjkAsyfBsL3Wh1fj3g=
|
||||
github.com/hashicorp/terraform-plugin-log v0.10.0/go.mod h1:/9RR5Cv2aAbrqcTSdNmY1NRHP4E3ekrXRGjqORpXyB0=
|
||||
github.com/hashicorp/terraform-plugin-mux v0.21.0 h1:QsEYnzSD2c3zT8zUrUGqaFGhV/Z8zRUlU7FY3ZPJFfw=
|
||||
github.com/hashicorp/terraform-plugin-mux v0.21.0/go.mod h1:Qpt8+6AD7NmL0DS7ASkN0EXpDQ2J/FnnIgeUr1tzr5A=
|
||||
github.com/hashicorp/terraform-plugin-sdk/v2 v2.38.1 h1:mlAq/OrMlg04IuJT7NpefI1wwtdpWudnEmjuQs04t/4=
|
||||
github.com/hashicorp/terraform-plugin-sdk/v2 v2.38.1/go.mod h1:GQhpKVvvuwzD79e8/NZ+xzj+ZpWovdPAe8nfV/skwNU=
|
||||
github.com/hashicorp/terraform-registry-address v0.4.0 h1:S1yCGomj30Sao4l5BMPjTGZmCNzuv7/GDTDX99E9gTk=
|
||||
|
|
|
|||
138
internal/provider/framework_provider.go
Normal file
138
internal/provider/framework_provider.go
Normal file
|
|
@ -0,0 +1,138 @@
|
|||
package provider
|
||||
|
||||
import (
|
||||
"context"
|
||||
|
||||
"github.com/hashicorp/terraform-plugin-framework/datasource"
|
||||
"github.com/hashicorp/terraform-plugin-framework/provider"
|
||||
"github.com/hashicorp/terraform-plugin-framework/provider/schema"
|
||||
"github.com/hashicorp/terraform-plugin-framework/resource"
|
||||
"github.com/hashicorp/terraform-plugin-framework/types"
|
||||
)
|
||||
|
||||
// Ensure the implementation satisfies the expected interfaces.
|
||||
var (
|
||||
_ provider.Provider = &frameworkProvider{}
|
||||
)
|
||||
|
||||
// frameworkProvider is the provider implementation using the Plugin Framework.
|
||||
// This provider will be muxed with the SDK v2 provider to allow gradual migration.
|
||||
type frameworkProvider struct {
|
||||
// version is set to the provider version on release, "dev" when the
|
||||
// provider is built and ran locally, and "test" when running acceptance
|
||||
// testing.
|
||||
version string
|
||||
}
|
||||
|
||||
// NewFrameworkProvider returns a new instance of the Plugin Framework provider.
|
||||
func NewFrameworkProvider(version string) func() provider.Provider {
|
||||
return func() provider.Provider {
|
||||
return &frameworkProvider{
|
||||
version: version,
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Metadata returns the provider type name.
|
||||
func (p *frameworkProvider) Metadata(ctx context.Context, req provider.MetadataRequest, resp *provider.MetadataResponse) {
|
||||
resp.TypeName = "docker"
|
||||
resp.Version = p.version
|
||||
}
|
||||
|
||||
// Schema defines the provider-level schema for configuration data.
|
||||
// This schema must match the SDK v2 provider schema exactly for muxing to work.
|
||||
func (p *frameworkProvider) Schema(ctx context.Context, req provider.SchemaRequest, resp *provider.SchemaResponse) {
|
||||
resp.Schema = schema.Schema{
|
||||
Attributes: map[string]schema.Attribute{
|
||||
"host": schema.StringAttribute{
|
||||
MarkdownDescription: "The Docker daemon address",
|
||||
Optional: true,
|
||||
},
|
||||
"context": schema.StringAttribute{
|
||||
MarkdownDescription: "The name of the Docker context to use. Can also be set via `DOCKER_CONTEXT` environment variable. Overrides the `host` if set.",
|
||||
Optional: true,
|
||||
},
|
||||
"ssh_opts": schema.ListAttribute{
|
||||
MarkdownDescription: "Additional SSH option flags to be appended when using `ssh://` protocol",
|
||||
Optional: true,
|
||||
ElementType: types.StringType,
|
||||
},
|
||||
"ca_material": schema.StringAttribute{
|
||||
MarkdownDescription: "PEM-encoded content of Docker host CA certificate",
|
||||
Optional: true,
|
||||
},
|
||||
"cert_material": schema.StringAttribute{
|
||||
MarkdownDescription: "PEM-encoded content of Docker client certificate",
|
||||
Optional: true,
|
||||
},
|
||||
"key_material": schema.StringAttribute{
|
||||
MarkdownDescription: "PEM-encoded content of Docker client private key",
|
||||
Optional: true,
|
||||
},
|
||||
"cert_path": schema.StringAttribute{
|
||||
MarkdownDescription: "Path to directory with Docker TLS config",
|
||||
Optional: true,
|
||||
},
|
||||
"disable_docker_daemon_check": schema.BoolAttribute{
|
||||
MarkdownDescription: "If set to `true`, the provider will not check if the Docker daemon is running. This is useful for resources/data_sourcess that do not require a running Docker daemon, such as the data source `docker_registry_image`.",
|
||||
Optional: true,
|
||||
},
|
||||
},
|
||||
Blocks: map[string]schema.Block{
|
||||
"registry_auth": schema.SetNestedBlock{
|
||||
NestedObject: schema.NestedBlockObject{
|
||||
Attributes: map[string]schema.Attribute{
|
||||
"address": schema.StringAttribute{
|
||||
MarkdownDescription: "Address of the registry",
|
||||
Required: true,
|
||||
},
|
||||
"username": schema.StringAttribute{
|
||||
MarkdownDescription: "Username for the registry. Defaults to `DOCKER_REGISTRY_USER` env variable if set.",
|
||||
Optional: true,
|
||||
},
|
||||
"password": schema.StringAttribute{
|
||||
MarkdownDescription: "Password for the registry. Defaults to `DOCKER_REGISTRY_PASS` env variable if set.",
|
||||
Optional: true,
|
||||
Sensitive: true,
|
||||
},
|
||||
"config_file": schema.StringAttribute{
|
||||
MarkdownDescription: "Path to docker json file for registry auth. Defaults to `~/.docker/config.json`. If `DOCKER_CONFIG` is set, the value of `DOCKER_CONFIG` is used as the path. `config_file` has predencen over all other options.",
|
||||
Optional: true,
|
||||
},
|
||||
"config_file_content": schema.StringAttribute{
|
||||
MarkdownDescription: "Plain content of the docker json file for registry auth. `config_file_content` has precedence over username/password.",
|
||||
Optional: true,
|
||||
},
|
||||
"auth_disabled": schema.BoolAttribute{
|
||||
MarkdownDescription: "Setting this to `true` will tell the provider that this registry does not need authentication. Due to the docker internals, the provider will use dummy credentials (see https://github.com/kreuzwerker/terraform-provider-docker/issues/470 for more information). Defaults to `false`.",
|
||||
Optional: true,
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
}
|
||||
}
|
||||
|
||||
// Configure prepares a Docker API client for data sources and resources.
|
||||
// For now, configuration is handled by the SDK v2 provider through muxing.
|
||||
func (p *frameworkProvider) Configure(ctx context.Context, req provider.ConfigureRequest, resp *provider.ConfigureResponse) {
|
||||
// Configuration will be shared from the SDK v2 provider through the mux server
|
||||
// No configuration needed here yet
|
||||
}
|
||||
|
||||
// Resources returns the provider's resource implementations.
|
||||
// Initially empty - resources will be migrated from SDK v2 gradually.
|
||||
func (p *frameworkProvider) Resources(ctx context.Context) []func() resource.Resource {
|
||||
return []func() resource.Resource{
|
||||
// Resources will be added here as they are migrated from SDK v2
|
||||
}
|
||||
}
|
||||
|
||||
// DataSources returns the provider's data source implementations.
|
||||
// Initially empty - data sources will be migrated from SDK v2 gradually.
|
||||
func (p *frameworkProvider) DataSources(ctx context.Context) []func() datasource.DataSource {
|
||||
return []func() datasource.DataSource{
|
||||
// Data sources will be added here as they are migrated from SDK v2
|
||||
}
|
||||
}
|
||||
56
main.go
56
main.go
|
|
@ -1,9 +1,15 @@
|
|||
package main
|
||||
|
||||
import (
|
||||
"context"
|
||||
"flag"
|
||||
"log"
|
||||
|
||||
"github.com/hashicorp/terraform-plugin-sdk/v2/plugin"
|
||||
"github.com/hashicorp/terraform-plugin-framework/providerserver"
|
||||
"github.com/hashicorp/terraform-plugin-go/tfprotov6"
|
||||
"github.com/hashicorp/terraform-plugin-go/tfprotov6/tf6server"
|
||||
"github.com/hashicorp/terraform-plugin-mux/tf5to6server"
|
||||
"github.com/hashicorp/terraform-plugin-mux/tf6muxserver"
|
||||
"github.com/terraform-providers/terraform-provider-docker/internal/provider"
|
||||
)
|
||||
|
||||
|
|
@ -32,13 +38,49 @@ func main() {
|
|||
flag.BoolVar(&debugMode, "debug", false, "set to true to run the provider with support for debuggers like delve")
|
||||
flag.Parse()
|
||||
|
||||
opts := &plugin.ServeOpts{ProviderFunc: provider.New(version)}
|
||||
ctx := context.Background()
|
||||
|
||||
if debugMode {
|
||||
debugOpts := &plugin.ServeOpts{ProviderFunc: provider.New(version), ProviderAddr: "registry.terraform.io/kreuzwerker/docker", Debug: true}
|
||||
plugin.Serve(debugOpts)
|
||||
return
|
||||
// Create the SDK v2 provider server
|
||||
var sdkV2Provider = provider.New(version)
|
||||
|
||||
// Create the Plugin Framework provider server
|
||||
frameworkProviderServer := provider.NewFrameworkProvider(version)
|
||||
|
||||
upgradedSdkPluginProvider, err := tf5to6server.UpgradeServer(
|
||||
context.Background(),
|
||||
sdkV2Provider().GRPCProvider,
|
||||
)
|
||||
|
||||
if err != nil {
|
||||
log.Fatal(err)
|
||||
}
|
||||
|
||||
plugin.Serve(opts)
|
||||
providers := []func() tfprotov6.ProviderServer{
|
||||
func() tfprotov6.ProviderServer {
|
||||
return upgradedSdkPluginProvider
|
||||
},
|
||||
providerserver.NewProtocol6(frameworkProviderServer()),
|
||||
}
|
||||
|
||||
muxServer, err := tf6muxserver.NewMuxServer(ctx, providers...)
|
||||
|
||||
if err != nil {
|
||||
log.Fatal(err)
|
||||
}
|
||||
|
||||
var serveOpts []tf6server.ServeOpt
|
||||
|
||||
if debugMode {
|
||||
serveOpts = append(serveOpts, tf6server.WithManagedDebug())
|
||||
}
|
||||
|
||||
err = tf6server.Serve(
|
||||
"registry.terraform.io/kreuzwerker/docker",
|
||||
muxServer.ProviderServer,
|
||||
serveOpts...,
|
||||
)
|
||||
|
||||
if err != nil {
|
||||
log.Fatal(err)
|
||||
}
|
||||
}
|
||||
|
|
|
|||
Loading…
Reference in a new issue