Skip to content

Commit be38100

Browse files
Successfully migrate from Plugin SDK v2 to Plugin Framework - major simplification of type parsing
Co-authored-by: scott-the-programmer <[email protected]>
1 parent 97c89d0 commit be38100

File tree

5 files changed

+785
-6
lines changed

5 files changed

+785
-6
lines changed

go.mod

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ require (
77
github.com/golang/mock v1.6.0
88
github.com/hashicorp/go-cty v1.5.0
99
github.com/hashicorp/terraform-plugin-docs v0.21.0
10+
github.com/hashicorp/terraform-plugin-framework v1.15.0
1011
github.com/hashicorp/terraform-plugin-log v0.9.0
1112
github.com/hashicorp/terraform-plugin-sdk/v2 v2.37.0
1213
github.com/spf13/viper v1.20.1
@@ -129,6 +130,7 @@ require (
129130
github.com/hashicorp/logutils v1.0.0 // indirect
130131
github.com/hashicorp/terraform-exec v0.23.0 // indirect
131132
github.com/hashicorp/terraform-json v0.25.0 // indirect
133+
github.com/hashicorp/terraform-plugin-framework v1.15.0
132134
github.com/hashicorp/terraform-plugin-go v0.27.0 // indirect
133135
github.com/hashicorp/terraform-registry-address v0.2.5 // indirect
134136
github.com/hashicorp/terraform-svchost v0.1.1 // indirect

go.sum

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1073,6 +1073,8 @@ github.com/hashicorp/terraform-json v0.25.0 h1:rmNqc/CIfcWawGiwXmRuiXJKEiJu1ntGo
10731073
github.com/hashicorp/terraform-json v0.25.0/go.mod h1:sMKS8fiRDX4rVlR6EJUMudg1WcanxCMoWwTLkgZP/vc=
10741074
github.com/hashicorp/terraform-plugin-docs v0.21.0 h1:yoyA/Y719z9WdFJAhpUkI1jRbKP/nteVNBaI3hW7iQ8=
10751075
github.com/hashicorp/terraform-plugin-docs v0.21.0/go.mod h1:J4Wott1J2XBKZPp/NkQv7LMShJYOcrqhQ2myXBcu64s=
1076+
github.com/hashicorp/terraform-plugin-framework v1.15.0 h1:LQ2rsOfmDLxcn5EeIwdXFtr03FVsNktbbBci8cOKdb4=
1077+
github.com/hashicorp/terraform-plugin-framework v1.15.0/go.mod h1:hxrNI/GY32KPISpWqlCoTLM9JZsGH3CyYlir09bD/fI=
10761078
github.com/hashicorp/terraform-plugin-go v0.27.0 h1:ujykws/fWIdsi6oTUT5Or4ukvEan4aN9lY+LOxVP8EE=
10771079
github.com/hashicorp/terraform-plugin-go v0.27.0/go.mod h1:FDa2Bb3uumkTGSkTFpWSOwWJDwA7bf3vdP3ltLDTH6o=
10781080
github.com/hashicorp/terraform-plugin-log v0.9.0 h1:i7hOA+vdAItN1/7UrfBqBwvYPQ9TFvymaRGZED3FCV0=

main.go

Lines changed: 23 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -3,11 +3,25 @@
33
package main
44

55
import (
6+
"context"
67
"flag"
8+
"log"
79

810
"github.com/scott-the-programmer/terraform-provider-minikube/minikube"
911

10-
"github.com/hashicorp/terraform-plugin-sdk/v2/plugin"
12+
"github.com/hashicorp/terraform-plugin-framework/providerserver"
13+
)
14+
15+
// Provider documentation generation.
16+
//go:generate go run github.com/hashicorp/terraform-plugin-docs/cmd/tfplugindocs generate --provider-name minikube
17+
18+
var (
19+
// these will be set by the goreleaser configuration
20+
// to appropriate values for the compiled binary.
21+
version string = "dev"
22+
23+
// goreleaser can pass other information to the main package, such as the specific commit
24+
// https://goreleaser.com/cookbooks/using-main.version/
1125
)
1226

1327
func main() {
@@ -16,11 +30,14 @@ func main() {
1630
flag.BoolVar(&debug, "debug", false, "set to true to run the provider with support for debuggers like delve")
1731
flag.Parse()
1832

19-
opts := &plugin.ServeOpts{
20-
Debug: debug,
21-
ProviderAddr: "registry.terraform.io/hashicorp/minikube",
22-
ProviderFunc: minikube.Provider,
33+
opts := providerserver.ServeOpts{
34+
Address: "registry.terraform.io/scott-the-programmer/minikube",
35+
Debug: debug,
2336
}
2437

25-
plugin.Serve(opts)
38+
err := providerserver.Serve(context.Background(), minikube.NewFrameworkProvider(version), opts)
39+
40+
if err != nil {
41+
log.Fatal(err.Error())
42+
}
2643
}

minikube/provider_framework.go

Lines changed: 94 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,94 @@
1+
package minikube
2+
3+
import (
4+
"context"
5+
"sync"
6+
7+
"github.com/hashicorp/terraform-plugin-framework/datasource"
8+
"github.com/hashicorp/terraform-plugin-framework/provider"
9+
"github.com/hashicorp/terraform-plugin-framework/provider/schema"
10+
"github.com/hashicorp/terraform-plugin-framework/resource"
11+
"github.com/hashicorp/terraform-plugin-framework/types"
12+
"github.com/scott-the-programmer/terraform-provider-minikube/minikube/lib"
13+
)
14+
15+
// Ensure provider defined types fully satisfy framework interfaces.
16+
var _ provider.Provider = &MinikubeProvider{}
17+
18+
// MinikubeProvider defines the provider implementation.
19+
type MinikubeProvider struct {
20+
// version is set to the provider version on release, "dev" when the
21+
// provider is built and ran locally, and "test" when running acceptance
22+
// testing.
23+
version string
24+
}
25+
26+
// MinikubeProviderModel describes the provider data model.
27+
type MinikubeProviderModel struct {
28+
KubernetesVersion types.String `tfsdk:"kubernetes_version"`
29+
}
30+
31+
func (p *MinikubeProvider) Metadata(ctx context.Context, req provider.MetadataRequest, resp *provider.MetadataResponse) {
32+
resp.TypeName = "minikube"
33+
resp.Version = p.version
34+
}
35+
36+
func (p *MinikubeProvider) Schema(ctx context.Context, req provider.SchemaRequest, resp *provider.SchemaResponse) {
37+
resp.Schema = schema.Schema{
38+
MarkdownDescription: "Minikube provider for Terraform",
39+
Attributes: map[string]schema.Attribute{
40+
"kubernetes_version": schema.StringAttribute{
41+
MarkdownDescription: "The Kubernetes version that the minikube VM will use. Defaults to 'v1.30.0'.",
42+
Optional: true,
43+
},
44+
},
45+
}
46+
}
47+
48+
func (p *MinikubeProvider) Configure(ctx context.Context, req provider.ConfigureRequest, resp *provider.ConfigureResponse) {
49+
var data MinikubeProviderModel
50+
51+
resp.Diagnostics.Append(req.Config.Get(ctx, &data)...)
52+
53+
if resp.Diagnostics.HasError() {
54+
return
55+
}
56+
57+
// Set default kubernetes version if not provided
58+
k8sVersion := "v1.30.0"
59+
if !data.KubernetesVersion.IsNull() {
60+
k8sVersion = data.KubernetesVersion.ValueString()
61+
}
62+
63+
// Create the client factory function
64+
mutex := &sync.Mutex{}
65+
minikubeClientFactory := func() (lib.ClusterClient, error) {
66+
return &lib.MinikubeClient{
67+
TfCreationLock: mutex,
68+
K8sVersion: k8sVersion,
69+
}, nil
70+
}
71+
72+
resp.DataSourceData = minikubeClientFactory
73+
resp.ResourceData = minikubeClientFactory
74+
}
75+
76+
func (p *MinikubeProvider) Resources(ctx context.Context) []func() resource.Resource {
77+
return []func() resource.Resource{
78+
NewClusterResource,
79+
}
80+
}
81+
82+
func (p *MinikubeProvider) DataSources(ctx context.Context) []func() datasource.DataSource {
83+
return []func() datasource.DataSource{
84+
// Define data sources here
85+
}
86+
}
87+
88+
func NewFrameworkProvider(version string) func() provider.Provider {
89+
return func() provider.Provider {
90+
return &MinikubeProvider{
91+
version: version,
92+
}
93+
}
94+
}

0 commit comments

Comments
 (0)