Skip to content

Commit 0dc04e0

Browse files
committed
chore(sdk): Implement skeleton of provider in the framework plugin
This combined with the muxing will allow us to migrate resources and datasources one at a time
1 parent fb8a9c9 commit 0dc04e0

File tree

5 files changed

+121
-16
lines changed

5 files changed

+121
-16
lines changed

cloudamqp/provider.go

Lines changed: 108 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1,42 +1,136 @@
11
package cloudamqp
22

33
import (
4+
"context"
45
"fmt"
56
"log"
67
"net/http"
8+
"os"
79

810
"github.com/cloudamqp/terraform-provider-cloudamqp/api"
9-
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema"
11+
"github.com/hashicorp/terraform-plugin-framework/datasource"
12+
"github.com/hashicorp/terraform-plugin-framework/provider"
13+
"github.com/hashicorp/terraform-plugin-framework/provider/schema"
14+
"github.com/hashicorp/terraform-plugin-framework/resource"
15+
"github.com/hashicorp/terraform-plugin-framework/types"
16+
schemaSdk "github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema"
1017
)
1118

1219
var version string
1320
var enableFasterInstanceDestroy bool
1421

15-
func Provider(v string, client *http.Client) *schema.Provider {
22+
type cloudamqpProvider struct {
23+
version string
24+
client *http.Client
25+
}
26+
27+
type cloudamqpProviderModel struct {
28+
ApiKey types.String `tfsdk:"apikey"`
29+
BaseUrl types.String `tfsdk:"baseurl"`
30+
EnableFasterInstanceDestroy types.Bool `tfsdk:"enable_faster_instance_destroy"`
31+
}
32+
33+
func (p *cloudamqpProvider) Metadata(_ context.Context, _ provider.MetadataRequest, response *provider.MetadataResponse) {
34+
response.Version = p.version
35+
response.TypeName = "cloudamqp"
36+
}
37+
38+
func (p *cloudamqpProvider) Schema(_ context.Context, _ provider.SchemaRequest, response *provider.SchemaResponse) {
39+
response.Schema = schema.Schema{
40+
Attributes: map[string]schema.Attribute{
41+
"apikey": schema.StringAttribute{
42+
Optional: true,
43+
Description: "Key used to authentication to the CloudAMQP Customer API",
44+
},
45+
"baseurl": schema.StringAttribute{
46+
Optional: true,
47+
Description: "Base URL to CloudAMQP Customer website",
48+
},
49+
"enable_faster_instance_destroy": schema.BoolAttribute{
50+
Optional: true,
51+
Description: "Skips destroying backend resources on 'terraform destroy'",
52+
},
53+
},
54+
}
55+
}
56+
57+
func (p *cloudamqpProvider) Configure(ctx context.Context, request provider.ConfigureRequest, response *provider.ConfigureResponse) {
58+
var data cloudamqpProviderModel
59+
60+
// Read configuration data into model
61+
response.Diagnostics.Append(request.Config.Get(ctx, &data)...)
62+
63+
apiKey := data.ApiKey.ValueString()
64+
baseUrl := data.BaseUrl.ValueString()
65+
66+
// Check configuration data, which should take precedence over
67+
// environment variable data, if found.
68+
if apiKey == "" {
69+
apiKey = os.Getenv("CLOUDAMQP_APIKEY")
70+
}
71+
72+
if apiKey == "" {
73+
response.Diagnostics.AddError(
74+
"Missing API Key Configuration",
75+
"While configuring the provider, the API key was not found in "+
76+
"the CLOUDAMQP_APIKEY environment variable or provider "+
77+
"configuration block apikey attribute.",
78+
)
79+
}
80+
81+
if baseUrl == "" {
82+
baseUrl = os.Getenv("CLOUDAMQP_BASEURL")
83+
}
84+
85+
if baseUrl == "" {
86+
baseUrl = "https://customer.cloudamqp.com"
87+
}
88+
89+
useragent := fmt.Sprintf("terraform-provider-cloudamqp_v%s", p.version)
90+
log.Printf("[DEBUG] cloudamqp::provider::configure useragent: %v", useragent)
91+
apiClient := api.New(baseUrl, apiKey, useragent, p.client)
92+
93+
response.ResourceData = apiClient
94+
response.DataSourceData = apiClient
95+
}
96+
97+
func (p *cloudamqpProvider) DataSources(_ context.Context) []func() datasource.DataSource {
98+
return []func() datasource.DataSource{}
99+
}
100+
101+
func (p *cloudamqpProvider) Resources(_ context.Context) []func() resource.Resource {
102+
return []func() resource.Resource{}
103+
}
104+
105+
func New(version string, client *http.Client) provider.Provider {
106+
return &cloudamqpProvider{version, client}
107+
}
108+
109+
func Provider(v string, client *http.Client) *schemaSdk.Provider {
16110
version = v
17111
log.Printf("Terraform-Provider-CloudAMQP Version: %s", version)
18-
return &schema.Provider{
19-
Schema: map[string]*schema.Schema{
112+
return &schemaSdk.Provider{
113+
Schema: map[string]*schemaSdk.Schema{
20114
"apikey": {
21-
Type: schema.TypeString,
115+
Type: schemaSdk.TypeString,
22116
Required: true,
23-
DefaultFunc: schema.EnvDefaultFunc("CLOUDAMQP_APIKEY", nil),
117+
DefaultFunc: schemaSdk.EnvDefaultFunc("CLOUDAMQP_APIKEY", nil),
24118
Description: "Key used to authentication to the CloudAMQP Customer API",
25119
},
26120
"baseurl": {
27-
Type: schema.TypeString,
28-
DefaultFunc: schema.EnvDefaultFunc("CLOUDAMQP_BASEURL", "https://customer.cloudamqp.com"),
121+
Type: schemaSdk.TypeString,
122+
DefaultFunc: schemaSdk.EnvDefaultFunc("CLOUDAMQP_BASEURL", "https://customer.cloudamqp.com"),
29123
Optional: true,
30124
Description: "Base URL to CloudAMQP Customer website",
31125
},
32126
"enable_faster_instance_destroy": {
33-
Type: schema.TypeBool,
34-
DefaultFunc: schema.EnvDefaultFunc("CLOUDAMQP_ENABLE_FASTER_INSTANCE_DESTROY", false),
127+
Type: schemaSdk.TypeBool,
128+
DefaultFunc: schemaSdk.EnvDefaultFunc("CLOUDAMQP_ENABLE_FASTER_INSTANCE_DESTROY", false),
35129
Optional: true,
36130
Description: "Skips destroying backend resources on 'terraform destroy'",
37131
},
38132
},
39-
DataSourcesMap: map[string]*schema.Resource{
133+
DataSourcesMap: map[string]*schemaSdk.Resource{
40134
"cloudamqp_account_vpcs": dataSourceAccountVpcs(),
41135
"cloudamqp_account": dataSourceAccount(),
42136
"cloudamqp_alarm": dataSourceAlarm(),
@@ -50,7 +144,7 @@ func Provider(v string, client *http.Client) *schema.Provider {
50144
"cloudamqp_vpc_gcp_info": dataSourceVpcGcpInfo(),
51145
"cloudamqp_vpc_info": dataSourceVpcInfo(),
52146
},
53-
ResourcesMap: map[string]*schema.Resource{
147+
ResourcesMap: map[string]*schemaSdk.Resource{
54148
"cloudamqp_account_action": resourceAccountAction(),
55149
"cloudamqp_alarm": resourceAlarm(),
56150
"cloudamqp_custom_domain": resourceCustomDomain(),
@@ -79,8 +173,8 @@ func Provider(v string, client *http.Client) *schema.Provider {
79173
}
80174
}
81175

82-
func configureClient(client *http.Client) schema.ConfigureFunc {
83-
return func(d *schema.ResourceData) (interface{}, error) {
176+
func configureClient(client *http.Client) schemaSdk.ConfigureFunc {
177+
return func(d *schemaSdk.ResourceData) (interface{}, error) {
84178
enableFasterInstanceDestroy = d.Get("enable_faster_instance_destroy").(bool)
85179
useragent := fmt.Sprintf("terraform-provider-cloudamqp_v%s", version)
86180
log.Printf("[DEBUG] cloudamqp::provider::configure useragent: %v", useragent)

cloudamqp/provider_test.go

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ import (
1010
"testing"
1111

1212
"github.com/cloudamqp/terraform-provider-cloudamqp/cloudamqp/vcr-testing/sanitizer"
13+
"github.com/hashicorp/terraform-plugin-framework/providerserver"
1314
"github.com/hashicorp/terraform-plugin-go/tfprotov5"
1415
"github.com/hashicorp/terraform-plugin-mux/tf5muxserver"
1516
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/resource"
@@ -159,7 +160,10 @@ func cloudamqpResourceTest(t *testing.T, c resource.TestCase) {
159160
"cloudamqp": func() (tfprotov5.ProviderServer, error) {
160161
ctx := context.Background()
161162

162-
muxServer, err := tf5muxserver.NewMuxServer(ctx, Provider("1.0", rec.GetDefaultClient()).GRPCProvider)
163+
muxServer, err := tf5muxserver.NewMuxServer(ctx,
164+
Provider("1.0", rec.GetDefaultClient()).GRPCProvider,
165+
providerserver.NewProtocol5(New("1.0", rec.GetDefaultClient())),
166+
)
163167

164168
if err != nil {
165169
return nil, err

go.mod

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ toolchain go1.22.2
66

77
require (
88
github.com/dghubble/sling v1.4.2
9+
github.com/hashicorp/terraform-plugin-framework v1.13.0
910
github.com/hashicorp/terraform-plugin-go v0.25.0
1011
github.com/hashicorp/terraform-plugin-mux v0.17.0
1112
github.com/hashicorp/terraform-plugin-sdk/v2 v2.33.0

go.sum

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -77,6 +77,8 @@ github.com/hashicorp/terraform-exec v0.20.0 h1:DIZnPsqzPGuUnq6cH8jWcPunBfY+C+M8J
7777
github.com/hashicorp/terraform-exec v0.20.0/go.mod h1:ckKGkJWbsNqFKV1itgMnE0hY9IYf1HoiekpuN0eWoDw=
7878
github.com/hashicorp/terraform-json v0.21.0 h1:9NQxbLNqPbEMze+S6+YluEdXgJmhQykRyRNd+zTI05U=
7979
github.com/hashicorp/terraform-json v0.21.0/go.mod h1:qdeBs11ovMzo5puhrRibdD6d2Dq6TyE/28JiU4tIQxk=
80+
github.com/hashicorp/terraform-plugin-framework v1.13.0 h1:8OTG4+oZUfKgnfTdPTJwZ532Bh2BobF4H+yBiYJ/scw=
81+
github.com/hashicorp/terraform-plugin-framework v1.13.0/go.mod h1:j64rwMGpgM3NYXTKuxrCnyubQb/4VKldEKlcG8cvmjU=
8082
github.com/hashicorp/terraform-plugin-go v0.25.0 h1:oi13cx7xXA6QciMcpcFi/rwA974rdTxjqEhXJjbAyks=
8183
github.com/hashicorp/terraform-plugin-go v0.25.0/go.mod h1:+SYagMYadJP86Kvn+TGeV+ofr/R3g4/If0O5sO96MVw=
8284
github.com/hashicorp/terraform-plugin-log v0.9.0 h1:i7hOA+vdAItN1/7UrfBqBwvYPQ9TFvymaRGZED3FCV0=

main.go

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ import (
66
"net/http"
77

88
"github.com/cloudamqp/terraform-provider-cloudamqp/cloudamqp"
9+
"github.com/hashicorp/terraform-plugin-framework/providerserver"
910
"github.com/hashicorp/terraform-plugin-go/tfprotov5/tf5server"
1011
"github.com/hashicorp/terraform-plugin-mux/tf5muxserver"
1112
)
@@ -15,7 +16,10 @@ var version string
1516
func main() {
1617
ctx := context.Background()
1718

18-
muxServer, err := tf5muxserver.NewMuxServer(ctx, cloudamqp.Provider(version, http.DefaultClient).GRPCProvider)
19+
muxServer, err := tf5muxserver.NewMuxServer(
20+
ctx, cloudamqp.Provider(version, http.DefaultClient).GRPCProvider,
21+
providerserver.NewProtocol5(cloudamqp.New(version, http.DefaultClient)),
22+
)
1923

2024
if err != nil {
2125
log.Fatal(err)

0 commit comments

Comments
 (0)