diff --git a/go.mod b/go.mod index b2ac668b8..ecba1ce38 100644 --- a/go.mod +++ b/go.mod @@ -8,7 +8,10 @@ require ( github.com/hashicorp/go-retryablehttp v0.6.8 github.com/hashicorp/go-uuid v1.0.3 github.com/hashicorp/terraform-plugin-framework v1.7.0 + github.com/hashicorp/terraform-plugin-framework-validators v0.12.0 + github.com/hashicorp/terraform-plugin-go v0.22.1 github.com/hashicorp/terraform-plugin-log v0.9.0 + github.com/hashicorp/terraform-plugin-mux v0.15.0 github.com/hashicorp/terraform-plugin-sdk/v2 v2.33.0 github.com/minio/minio-go/v7 v7.0.10 github.com/stretchr/testify v1.7.2 @@ -37,8 +40,6 @@ require ( github.com/hashicorp/logutils v1.0.0 // indirect github.com/hashicorp/terraform-exec v0.20.0 // indirect github.com/hashicorp/terraform-json v0.21.0 // indirect - github.com/hashicorp/terraform-plugin-go v0.22.1 // indirect - github.com/hashicorp/terraform-plugin-mux v0.15.0 // indirect github.com/hashicorp/terraform-registry-address v0.2.3 // indirect github.com/hashicorp/terraform-svchost v0.1.1 // indirect github.com/hashicorp/yamux v0.1.1 // indirect diff --git a/go.sum b/go.sum index c1923614a..c2593bce2 100644 --- a/go.sum +++ b/go.sum @@ -89,6 +89,8 @@ github.com/hashicorp/terraform-json v0.21.0 h1:9NQxbLNqPbEMze+S6+YluEdXgJmhQykRy github.com/hashicorp/terraform-json v0.21.0/go.mod h1:qdeBs11ovMzo5puhrRibdD6d2Dq6TyE/28JiU4tIQxk= github.com/hashicorp/terraform-plugin-framework v1.7.0 h1:wOULbVmfONnJo9iq7/q+iBOBJul5vRovaYJIu2cY/Pw= github.com/hashicorp/terraform-plugin-framework v1.7.0/go.mod h1:jY9Id+3KbZ17OMpulgnWLSfwxNVYSoYBQFTgsx044CI= +github.com/hashicorp/terraform-plugin-framework-validators v0.12.0 h1:HOjBuMbOEzl7snOdOoUfE2Jgeto6JOjLVQ39Ls2nksc= +github.com/hashicorp/terraform-plugin-framework-validators v0.12.0/go.mod h1:jfHGE/gzjxYz6XoUwi/aYiiKrJDeutQNUtGQXkaHklg= github.com/hashicorp/terraform-plugin-go v0.22.1 h1:iTS7WHNVrn7uhe3cojtvWWn83cm2Z6ryIUDTRO0EV7w= github.com/hashicorp/terraform-plugin-go v0.22.1/go.mod h1:qrjnqRghvQ6KnDbB12XeZ4FluclYwptntoWCr9QaXTI= github.com/hashicorp/terraform-plugin-log v0.9.0 h1:i7hOA+vdAItN1/7UrfBqBwvYPQ9TFvymaRGZED3FCV0= diff --git a/internal/service/network/network.go b/internal/service/network/network.go new file mode 100644 index 000000000..cd60e9b9b --- /dev/null +++ b/internal/service/network/network.go @@ -0,0 +1,374 @@ +package network + +import ( + "context" + "fmt" + + "github.com/UpCloudLtd/terraform-provider-upcloud/internal/utils" + validatorutil "github.com/UpCloudLtd/terraform-provider-upcloud/internal/validator" + "github.com/UpCloudLtd/upcloud-go-api/v8/upcloud" + "github.com/UpCloudLtd/upcloud-go-api/v8/upcloud/request" + "github.com/UpCloudLtd/upcloud-go-api/v8/upcloud/service" + "github.com/hashicorp/terraform-plugin-framework-validators/listvalidator" + "github.com/hashicorp/terraform-plugin-framework-validators/setvalidator" + "github.com/hashicorp/terraform-plugin-framework-validators/stringvalidator" + "github.com/hashicorp/terraform-plugin-framework/diag" + "github.com/hashicorp/terraform-plugin-framework/path" + "github.com/hashicorp/terraform-plugin-framework/resource" + "github.com/hashicorp/terraform-plugin-framework/resource/schema" + "github.com/hashicorp/terraform-plugin-framework/resource/schema/planmodifier" + "github.com/hashicorp/terraform-plugin-framework/resource/schema/stringplanmodifier" + "github.com/hashicorp/terraform-plugin-framework/schema/validator" + "github.com/hashicorp/terraform-plugin-framework/types" + "github.com/hashicorp/terraform-plugin-sdk/v2/helper/validation" +) + +var ( + _ resource.Resource = &networkResource{} + _ resource.ResourceWithConfigure = &networkResource{} + _ resource.ResourceWithImportState = &networkResource{} +) + +func NewNetworkResource() resource.Resource { + return &networkResource{} +} + +type networkResource struct { + client *service.Service +} + +func (r *networkResource) Metadata(_ context.Context, req resource.MetadataRequest, resp *resource.MetadataResponse) { + resp.TypeName = req.ProviderTypeName + "_network" +} + +// Configure adds the provider configured client to the resource. +func (r *networkResource) Configure(_ context.Context, req resource.ConfigureRequest, resp *resource.ConfigureResponse) { + if req.ProviderData == nil { + return + } + + client, ok := req.ProviderData.(*service.Service) + + if !ok { + resp.Diagnostics.AddError( + "Unexpected resource Configure type", + fmt.Sprintf("Expected *service.Service, got: %T. Please report this issue to the provider developers.", req.ProviderData), + ) + + return + } + + r.client = client +} + +type networkModel struct { + Name types.String `tfsdk:"name"` + ID types.String `tfsdk:"id"` + Type types.String `tfsdk:"type"` + Zone types.String `tfsdk:"zone"` + Router types.String `tfsdk:"router"` + IPNetwork []ipNetworkModel `tfsdk:"ip_network"` +} + +type ipNetworkModel struct { + Address types.String `tfsdk:"address"` + DHCP types.Bool `tfsdk:"dhcp"` + DHCPDefaultRoute types.Bool `tfsdk:"dhcp_default_route"` + DHCPDns types.Set `tfsdk:"dhcp_dns"` + DHCPRoutes types.Set `tfsdk:"dhcp_routes"` + Family types.String `tfsdk:"family"` + Gateway types.String `tfsdk:"gateway"` +} + +func (r *networkResource) Schema(_ context.Context, _ resource.SchemaRequest, resp *resource.SchemaResponse) { + resp.Schema = schema.Schema{ + Attributes: map[string]schema.Attribute{ + "name": schema.StringAttribute{ + MarkdownDescription: "Name of the network.", + Required: true, + }, + "id": schema.StringAttribute{ + Computed: true, + MarkdownDescription: "UUID of the network.", + PlanModifiers: []planmodifier.String{ + stringplanmodifier.UseStateForUnknown(), + }, + }, + "type": schema.StringAttribute{ + Description: "The network type", + Computed: true, + }, + "zone": schema.StringAttribute{ + Description: "The zone the network is in, e.g. `de-fra1`. You can list available zones with `upctl zone list`.", + Required: true, + PlanModifiers: []planmodifier.String{ + stringplanmodifier.RequiresReplace(), + }, + }, + "router": schema.StringAttribute{ + Description: "UUID of a router to attach to this network.", + Computed: true, + Optional: true, + }, + }, + Blocks: map[string]schema.Block{ + "ip_network": schema.ListNestedBlock{ + Description: "A list of IP subnets within the network", + NestedObject: schema.NestedBlockObject{ + Attributes: map[string]schema.Attribute{ + "address": schema.StringAttribute{ + Description: "The CIDR range of the subnet", + Required: true, + PlanModifiers: []planmodifier.String{ + stringplanmodifier.RequiresReplace(), + }, + Validators: []validator.String{ + validatorutil.NewFrameworkStringValidator(validation.IsCIDR), + }, + }, + "dhcp": schema.BoolAttribute{ + Description: "Is DHCP enabled?", + Required: true, + }, + "dhcp_default_route": schema.BoolAttribute{ + Description: "Is the gateway the DHCP default route?", + Computed: true, + Optional: true, + }, + "dhcp_dns": schema.SetAttribute{ + ElementType: types.StringType, + Description: "The DNS servers given by DHCP", + Computed: true, + Optional: true, + Validators: []validator.Set{ + setvalidator.ValueStringsAre( + stringvalidator.Any( + validatorutil.NewFrameworkStringValidator(validation.IsIPv4Address), + validatorutil.NewFrameworkStringValidator(validation.IsIPv6Address), + ), + ), + }, + }, + "dhcp_routes": schema.SetAttribute{ + ElementType: types.StringType, + Description: "The additional DHCP classless static routes given by DHCP", + Computed: true, + Optional: true, + Validators: []validator.Set{ + setvalidator.ValueStringsAre( + stringvalidator.Any( + validatorutil.NewFrameworkStringValidator(validation.IsCIDR), + ), + ), + }, + }, + "family": schema.StringAttribute{ + Description: "IP address family", + Required: true, + Validators: []validator.String{ + stringvalidator.OneOf(upcloud.IPAddressFamilyIPv4, upcloud.IPAddressFamilyIPv6), + }, + }, + "gateway": schema.StringAttribute{ + Description: "Gateway address given by DHCP", + Computed: true, + Optional: true, + }, + }, + }, + Validators: []validator.List{ + listvalidator.SizeBetween(1, 1), + }, + }, + }, + } +} + +func setValues(ctx context.Context, data *networkModel, network *upcloud.Network) diag.Diagnostics { + diags := diag.Diagnostics{} + + data.Name = types.StringValue(network.Name) + data.ID = types.StringValue(network.UUID) + data.Type = types.StringValue(network.Type) + data.Zone = types.StringValue(network.Zone) + + if network.Router == "" { + data.Router = types.StringNull() + } else { + data.Router = types.StringValue(network.Router) + } + + if len(data.IPNetwork) == 0 { + data.IPNetwork = make([]ipNetworkModel, len(network.IPNetworks)) + } + + for i, ipnet := range network.IPNetworks { + data.IPNetwork[i].Address = types.StringValue(ipnet.Address) + data.IPNetwork[i].DHCP = utils.AsBool(ipnet.DHCP) + data.IPNetwork[i].DHCPDefaultRoute = utils.AsBool(ipnet.DHCPDefaultRoute) + + dhcpdns, diags := types.SetValueFrom(ctx, types.StringType, ipnet.DHCPDns) + diags.Append(diags...) + data.IPNetwork[i].DHCPDns = dhcpdns + + dhcproutes, diags := types.SetValueFrom(ctx, types.StringType, ipnet.DHCPRoutes) + diags.Append(diags...) + data.IPNetwork[i].DHCPRoutes = dhcproutes + + data.IPNetwork[i].Family = types.StringValue(ipnet.Family) + data.IPNetwork[i].Gateway = types.StringValue(ipnet.Gateway) + } + + return diags +} + +func (r *networkResource) Create(ctx context.Context, req resource.CreateRequest, resp *resource.CreateResponse) { + var data networkModel + resp.Diagnostics.Append(req.Plan.Get(ctx, &data)...) + + if resp.Diagnostics.HasError() { + return + } + + apiReq := request.CreateNetworkRequest{ + Name: data.Name.ValueString(), + Zone: data.Zone.ValueString(), + Router: data.Router.ValueString(), + } + + for _, ipnet := range data.IPNetwork { + dhcpdns, diags := utils.SetAsSliceOfStrings(ctx, ipnet.DHCPDns) + resp.Diagnostics.Append(diags...) + + dhcproutes, diags := utils.SetAsSliceOfStrings(ctx, ipnet.DHCPRoutes) + resp.Diagnostics.Append(diags...) + + apiReq.IPNetworks = append(apiReq.IPNetworks, upcloud.IPNetwork{ + Address: ipnet.Address.ValueString(), + DHCP: utils.AsUpCloudBoolean(ipnet.DHCP), + DHCPDefaultRoute: utils.AsUpCloudBoolean(ipnet.DHCPDefaultRoute), + DHCPDns: dhcpdns, + DHCPRoutes: dhcproutes, + Family: ipnet.Family.ValueString(), + Gateway: ipnet.Gateway.ValueString(), + }) + } + + network, err := r.client.CreateNetwork(ctx, &apiReq) + if err != nil { + resp.Diagnostics.AddError( + "Unable to create network", + utils.ErrorDiagnosticDetail(err), + ) + return + } + + resp.Diagnostics.Append(setValues(ctx, &data, network)...) + resp.Diagnostics.Append(resp.State.Set(ctx, &data)...) +} + +func (r *networkResource) Read(ctx context.Context, req resource.ReadRequest, resp *resource.ReadResponse) { + var data networkModel + resp.Diagnostics.Append(req.State.Get(ctx, &data)...) + + if resp.Diagnostics.HasError() { + return + } + + network, err := r.client.GetNetworkDetails(ctx, &request.GetNetworkDetailsRequest{ + UUID: data.ID.ValueString(), + }) + if err != nil { + resp.Diagnostics.AddError( + "Unable to read network details", + utils.ErrorDiagnosticDetail(err), + ) + return + } + + resp.Diagnostics.Append(setValues(ctx, &data, network)...) + resp.Diagnostics.Append(resp.State.Set(ctx, &data)...) +} + +func (r *networkResource) Update(ctx context.Context, req resource.UpdateRequest, resp *resource.UpdateResponse) { + var data networkModel + resp.Diagnostics.Append(req.Plan.Get(ctx, &data)...) + + apiReq := request.ModifyNetworkRequest{ + UUID: data.ID.ValueString(), + Name: data.Name.ValueString(), + } + + for _, ipnet := range data.IPNetwork { + dhcpdns, diags := utils.SetAsSliceOfStrings(ctx, ipnet.DHCPDns) + resp.Diagnostics.Append(diags...) + + dhcproutes, diags := utils.SetAsSliceOfStrings(ctx, ipnet.DHCPRoutes) + resp.Diagnostics.Append(diags...) + + apiReq.IPNetworks = append(apiReq.IPNetworks, upcloud.IPNetwork{ + Address: ipnet.Address.ValueString(), + DHCP: utils.AsUpCloudBoolean(ipnet.DHCP), + DHCPDefaultRoute: utils.AsUpCloudBoolean(ipnet.DHCPDefaultRoute), + DHCPDns: dhcpdns, + DHCPRoutes: dhcproutes, + Family: ipnet.Family.ValueString(), + Gateway: ipnet.Gateway.ValueString(), + }) + } + + network, err := r.client.ModifyNetwork(ctx, &apiReq) + if err != nil { + resp.Diagnostics.AddError( + "Unable to delete network", + utils.ErrorDiagnosticDetail(err), + ) + return + } + + if network.Router != data.Router.ValueString() { + err = r.client.AttachNetworkRouter(ctx, &request.AttachNetworkRouterRequest{ + NetworkUUID: data.ID.ValueString(), + RouterUUID: data.Router.ValueString(), + }) + if err != nil { + resp.Diagnostics.AddError( + "Unable to modify networks router attachment", + utils.ErrorDiagnosticDetail(err), + ) + return + } + + network, err = r.client.GetNetworkDetails(ctx, &request.GetNetworkDetailsRequest{ + UUID: data.ID.ValueString(), + }) + if err != nil { + resp.Diagnostics.AddError( + "Unable to read network details", + utils.ErrorDiagnosticDetail(err), + ) + return + } + } + + resp.Diagnostics.Append(setValues(ctx, &data, network)...) + resp.Diagnostics.Append(resp.State.Set(ctx, &data)...) +} + +func (r *networkResource) Delete(ctx context.Context, req resource.DeleteRequest, resp *resource.DeleteResponse) { + var data networkModel + resp.Diagnostics.Append(req.State.Get(ctx, &data)...) + + if err := r.client.DeleteNetwork(ctx, &request.DeleteNetworkRequest{ + UUID: data.ID.ValueString(), + }); err != nil { + resp.Diagnostics.AddError( + "Unable to delete network", + utils.ErrorDiagnosticDetail(err), + ) + } +} + +func (r *networkResource) ImportState(ctx context.Context, req resource.ImportStateRequest, resp *resource.ImportStateResponse) { + resource.ImportStatePassthroughID(ctx, path.Root("id"), req, resp) +} diff --git a/internal/service/network/sdkv2_network.go b/internal/service/network/sdkv2_network.go deleted file mode 100644 index 0ba7517a1..000000000 --- a/internal/service/network/sdkv2_network.go +++ /dev/null @@ -1,294 +0,0 @@ -package network - -import ( - "context" - "fmt" - - "github.com/hashicorp/terraform-plugin-sdk/v2/helper/validation" - - "github.com/UpCloudLtd/terraform-provider-upcloud/internal/utils" - "github.com/UpCloudLtd/upcloud-go-api/v8/upcloud" - "github.com/UpCloudLtd/upcloud-go-api/v8/upcloud/request" - "github.com/UpCloudLtd/upcloud-go-api/v8/upcloud/service" - "github.com/hashicorp/terraform-plugin-sdk/v2/diag" - "github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema" - - "github.com/hashicorp/go-cty/cty" -) - -func SDKV2ResourceNetwork() *schema.Resource { - return &schema.Resource{ - Description: "This resource represents an SDN private network that cloud servers from the same zone can be attached to.", - ReadContext: resourceNetworkRead, - CreateContext: resourceNetworkCreate, - UpdateContext: resourceNetworkUpdate, - DeleteContext: resourceNetworkDelete, - Importer: &schema.ResourceImporter{ - StateContext: schema.ImportStatePassthroughContext, - }, - Schema: map[string]*schema.Schema{ - "ip_network": { - Type: schema.TypeList, - Required: true, - MaxItems: 1, - MinItems: 1, - Description: "A list of IP subnets within the network", - Elem: &schema.Resource{ - Schema: map[string]*schema.Schema{ - "address": { - Type: schema.TypeString, - Description: "The CIDR range of the subnet", - Required: true, - ForceNew: true, - ValidateFunc: validation.IsCIDR, - }, - "dhcp": { - Type: schema.TypeBool, - Description: "Is DHCP enabled?", - Required: true, - }, - "dhcp_default_route": { - Type: schema.TypeBool, - Description: "Is the gateway the DHCP default route?", - Computed: true, - Optional: true, - }, - "dhcp_dns": { - Type: schema.TypeSet, - Description: "The DNS servers given by DHCP", - Computed: true, - Optional: true, - Elem: &schema.Schema{ - Type: schema.TypeString, - ValidateFunc: validation.Any(validation.IsIPv4Address, validation.IsIPv6Address), - }, - }, - "dhcp_routes": { - Type: schema.TypeSet, - Description: "The additional DHCP classless static routes given by DHCP", - Computed: true, - Optional: true, - Elem: &schema.Schema{ - Type: schema.TypeString, - ValidateFunc: validation.IsCIDR, - }, - }, - "family": { - Type: schema.TypeString, - Description: "IP address family", - Required: true, - ValidateDiagFunc: func(v interface{}, _ cty.Path) diag.Diagnostics { - switch v.(string) { - case upcloud.IPAddressFamilyIPv4, upcloud.IPAddressFamilyIPv6: - return nil - default: - return diag.Diagnostics{diag.Diagnostic{ - Severity: diag.Error, - Summary: "'family' has incorrect value", - Detail: fmt.Sprintf("'family' should have value of %s or %s", - upcloud.IPAddressFamilyIPv4, - upcloud.IPAddressFamilyIPv6), - }} - } - }, - }, - "gateway": { - Type: schema.TypeString, - Description: "Gateway address given by DHCP", - Computed: true, - Optional: true, - }, - }, - }, - }, - "name": { - Type: schema.TypeString, - Description: "A valid name for the network", - Required: true, - }, - "type": { - Type: schema.TypeString, - Description: "The network type", - Computed: true, - }, - "zone": { - Type: schema.TypeString, - Description: "The zone the network is in, e.g. `de-fra1`. You can list available zones with `upctl zone list`.", - Required: true, - ForceNew: true, - }, - "router": { - Type: schema.TypeString, - Description: "The UUID of a router", - Optional: true, - }, - }, - } -} - -func resourceNetworkCreate(ctx context.Context, d *schema.ResourceData, meta interface{}) diag.Diagnostics { - client := meta.(*service.Service) - - req := request.CreateNetworkRequest{} - if v := d.Get("name"); v != nil { - req.Name = v.(string) - } - - if v := d.Get("zone"); v != nil { - req.Zone = v.(string) - } - - if v := d.Get("router"); v != nil { - req.Router = v.(string) - } - - if v, ok := d.GetOk("ip_network"); ok { - ipn := v.([]interface{})[0] - ipnConf := ipn.(map[string]interface{}) - - uipn := upcloud.IPNetwork{ - Address: ipnConf["address"].(string), - DHCP: upcloud.FromBool(ipnConf["dhcp"].(bool)), - DHCPDefaultRoute: upcloud.FromBool(ipnConf["dhcp_default_route"].(bool)), - Family: ipnConf["family"].(string), - Gateway: ipnConf["gateway"].(string), - } - - for _, dns := range ipnConf["dhcp_dns"].(*schema.Set).List() { - uipn.DHCPDns = append(uipn.DHCPDns, dns.(string)) - } - - for _, route := range ipnConf["dhcp_routes"].(*schema.Set).List() { - uipn.DHCPRoutes = append(uipn.DHCPRoutes, route.(string)) - } - - req.IPNetworks = append(req.IPNetworks, uipn) - } - - network, err := client.CreateNetwork(ctx, &req) - if err != nil { - return diag.FromErr(err) - } - - d.SetId(network.UUID) - - return resourceNetworkRead(ctx, d, meta) -} - -func resourceNetworkRead(ctx context.Context, d *schema.ResourceData, meta interface{}) diag.Diagnostics { - client := meta.(*service.Service) - - req := request.GetNetworkDetailsRequest{ - UUID: d.Id(), - } - - network, err := client.GetNetworkDetails(ctx, &req) - if err != nil { - return utils.HandleResourceError(d.Get("name").(string), d, err) - } - - _ = d.Set("name", network.Name) - _ = d.Set("type", network.Type) - _ = d.Set("zone", network.Zone) - - if network.Router != "" { - _ = d.Set("router", network.Router) - } - - if len(network.IPNetworks) > 1 { - return diag.Errorf("too many ip_networks: %d", len(network.IPNetworks)) - } - - if len(network.IPNetworks) == 1 { - ipn := map[string]interface{}{ - "address": network.IPNetworks[0].Address, - "dhcp": network.IPNetworks[0].DHCP.Bool(), - "dhcp_default_route": network.IPNetworks[0].DHCPDefaultRoute.Bool(), - "dhcp_dns": network.IPNetworks[0].DHCPDns, - "dhcp_routes": network.IPNetworks[0].DHCPRoutes, - "family": network.IPNetworks[0].Family, - "gateway": network.IPNetworks[0].Gateway, - } - - _ = d.Set("ip_network", []map[string]interface{}{ - ipn, - }) - } - - d.SetId(network.UUID) - - return nil -} - -func resourceNetworkUpdate(ctx context.Context, d *schema.ResourceData, meta interface{}) diag.Diagnostics { - client := meta.(*service.Service) - - req := request.ModifyNetworkRequest{ - UUID: d.Id(), - } - - if d.HasChange("name") { - _, v := d.GetChange("name") - req.Name = v.(string) - } - - if d.HasChange("ip_network") { - v := d.Get("ip_network") - - ipn := v.([]interface{})[0] - ipnConf := ipn.(map[string]interface{}) - - uipn := upcloud.IPNetwork{ - Address: ipnConf["address"].(string), - DHCP: upcloud.FromBool(ipnConf["dhcp"].(bool)), - DHCPDefaultRoute: upcloud.FromBool(ipnConf["dhcp_default_route"].(bool)), - Family: ipnConf["family"].(string), - Gateway: ipnConf["gateway"].(string), - } - - for _, dns := range ipnConf["dhcp_dns"].(*schema.Set).List() { - uipn.DHCPDns = append(uipn.DHCPDns, dns.(string)) - } - - for _, route := range ipnConf["dhcp_routes"].(*schema.Set).List() { - uipn.DHCPRoutes = append(uipn.DHCPRoutes, route.(string)) - } - - req.IPNetworks = []upcloud.IPNetwork{uipn} - } - - network, err := client.ModifyNetwork(ctx, &req) - if err != nil { - return diag.FromErr(err) - } - - if d.HasChange("router") { - _, v := d.GetChange("router") - if v.(string) == "" { - err = client.DetachNetworkRouter(ctx, &request.DetachNetworkRouterRequest{NetworkUUID: d.Id()}) - } else { - err = client.AttachNetworkRouter(ctx, &request.AttachNetworkRouterRequest{NetworkUUID: d.Id(), RouterUUID: v.(string)}) - } - if err != nil { - return diag.FromErr(err) - } - } - - d.SetId(network.UUID) - - return nil -} - -func resourceNetworkDelete(ctx context.Context, d *schema.ResourceData, meta interface{}) diag.Diagnostics { - client := meta.(*service.Service) - - req := request.DeleteNetworkRequest{ - UUID: d.Id(), - } - err := client.DeleteNetwork(ctx, &req) - if err != nil { - return diag.FromErr(err) - } - - return nil -} diff --git a/internal/utils/error.go b/internal/utils/error.go index 7da3c7dd1..2e1c6ab66 100644 --- a/internal/utils/error.go +++ b/internal/utils/error.go @@ -19,3 +19,11 @@ func HandleResourceError(resourceName string, d *schema.ResourceData, err error) } return diag.FromErr(err) } + +func ErrorDiagnosticDetail(err error) string { + if err == nil { + return "" + } + + return "Error: " + err.Error() +} diff --git a/internal/utils/types.go b/internal/utils/types.go new file mode 100644 index 000000000..992dd9c7c --- /dev/null +++ b/internal/utils/types.go @@ -0,0 +1,45 @@ +package utils + +import ( + "context" + + "github.com/UpCloudLtd/upcloud-go-api/v8/upcloud" + "github.com/hashicorp/terraform-plugin-framework/diag" + "github.com/hashicorp/terraform-plugin-framework/types" +) + +func AsUpCloudBoolean(b types.Bool) upcloud.Boolean { + if b.IsNull() || b.IsUnknown() { + return upcloud.Empty + } + + if b.ValueBool() { + return upcloud.True + } + + return upcloud.False +} + +func AsBool(b upcloud.Boolean) types.Bool { + if b.Empty() { + return types.BoolPointerValue(nil) + } + + return types.BoolValue(b.Bool()) +} + +func SetAsSliceOfStrings(ctx context.Context, set types.Set) ([]string, diag.Diagnostics) { + if set.IsNull() || set.IsUnknown() { + return nil, nil + } + + elements := make([]types.String, 0, len(set.Elements())) + strings := make([]string, 0, len(set.Elements())) + diags := set.ElementsAs(ctx, &elements, false) + + for _, element := range elements { + strings = append(strings, element.ValueString()) + } + + return strings, diags +} diff --git a/internal/validator/framework.go b/internal/validator/framework.go new file mode 100644 index 000000000..9a3ec2609 --- /dev/null +++ b/internal/validator/framework.go @@ -0,0 +1,41 @@ +package validator + +import ( + "context" + + "github.com/hashicorp/terraform-plugin-framework/diag" + "github.com/hashicorp/terraform-plugin-framework/schema/validator" + "github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema" +) + +type frameworkStringValidator struct { + validateFunc schema.SchemaValidateFunc //nolint:staticcheck // Network validators use the deprecated schema.SchemaValidateFunc +} + +func (v *frameworkStringValidator) Description(_ context.Context) string { + return "" +} + +func (v *frameworkStringValidator) MarkdownDescription(_ context.Context) string { + return "" +} + +func (v *frameworkStringValidator) ValidateString(_ context.Context, req validator.StringRequest, resp *validator.StringResponse) { + warnings, errors := v.validateFunc(req.ConfigValue.ValueString(), req.Path.String()) + + for _, warning := range warnings { + resp.Diagnostics = append(resp.Diagnostics, diag.NewWarningDiagnostic(warning, "")) + } + + for _, err := range errors { + resp.Diagnostics = append(resp.Diagnostics, diag.NewErrorDiagnostic(err.Error(), "")) + } +} + +var _ validator.String = &frameworkStringValidator{} + +func NewFrameworkStringValidator(validate schema.SchemaValidateFunc) validator.String { //nolint:staticcheck // Network validators use the deprecated schema.SchemaValidateFunc + return &frameworkStringValidator{ + validateFunc: validate, + } +} diff --git a/main.go b/main.go index 3553f6bcb..16b27f574 100644 --- a/main.go +++ b/main.go @@ -1,31 +1,20 @@ package main // import "github.com/UpCloudLtd/terraform-provider-upcloud" import ( - "context" "flag" "log" "github.com/UpCloudLtd/terraform-provider-upcloud/upcloud" - "github.com/hashicorp/terraform-plugin-framework/providerserver" - "github.com/hashicorp/terraform-plugin-go/tfprotov5" "github.com/hashicorp/terraform-plugin-go/tfprotov5/tf5server" - "github.com/hashicorp/terraform-plugin-mux/tf5muxserver" ) func main() { - ctx := context.Background() - var debug bool flag.BoolVar(&debug, "debug", false, "set to true to run the provider with support for debuggers like delve") flag.Parse() - providers := []func() tfprotov5.ProviderServer{ - providerserver.NewProtocol5(upcloud.New()), - upcloud.Provider().GRPCProvider, - } - - muxServer, err := tf5muxserver.NewMuxServer(ctx, providers...) + factory, err := upcloud.NewProviderServerFactory() if err != nil { log.Fatal(err) } @@ -38,7 +27,7 @@ func main() { err = tf5server.Serve( "registry.terraform.io/upcloudltd/upcloud", - muxServer.ProviderServer, + factory, serveOpts..., ) if err != nil { diff --git a/upcloud/datasource_upcloud_hosts_test.go b/upcloud/datasource_upcloud_hosts_test.go index 9500a7b2f..5479e0288 100644 --- a/upcloud/datasource_upcloud_hosts_test.go +++ b/upcloud/datasource_upcloud_hosts_test.go @@ -6,18 +6,15 @@ import ( "testing" "github.com/hashicorp/terraform-plugin-sdk/v2/helper/resource" - "github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema" "github.com/hashicorp/terraform-plugin-sdk/v2/terraform" ) func TestAccUpCloudHosts_basic(t *testing.T) { - var providers []*schema.Provider - resourceName := "data.upcloud_hosts.empty" resource.ParallelTest(t, resource.TestCase{ - PreCheck: func() { testAccPreCheck(t) }, - ProviderFactories: testAccProviderFactories(&providers), + PreCheck: func() { testAccPreCheck(t) }, + ProtoV5ProviderFactories: testAccProviderFactories, Steps: []resource.TestStep{ { Config: testAccDataSourceUpCloudHostsConfigEmpty(), diff --git a/upcloud/datasource_upcloud_ip_addresses_test.go b/upcloud/datasource_upcloud_ip_addresses_test.go index 726d3b726..f14e2b044 100644 --- a/upcloud/datasource_upcloud_ip_addresses_test.go +++ b/upcloud/datasource_upcloud_ip_addresses_test.go @@ -5,18 +5,15 @@ import ( "testing" "github.com/hashicorp/terraform-plugin-sdk/v2/helper/resource" - "github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema" "github.com/hashicorp/terraform-plugin-sdk/v2/terraform" ) func TestAccDataSourceUpCloudIPAddresses_basic(t *testing.T) { - var providers []*schema.Provider - resourceName := "data.upcloud_ip_addresses.empty" resource.ParallelTest(t, resource.TestCase{ - PreCheck: func() { testAccPreCheck(t) }, - ProviderFactories: testAccProviderFactories(&providers), + PreCheck: func() { testAccPreCheck(t) }, + ProtoV5ProviderFactories: testAccProviderFactories, Steps: []resource.TestStep{ { Config: testAccDataSourceUpCloudIPAddressesConfigEmpty(), diff --git a/upcloud/datasource_upcloud_managed_database_mysql_sessions_test.go b/upcloud/datasource_upcloud_managed_database_mysql_sessions_test.go index 52f2d4dd1..d5c4e7492 100644 --- a/upcloud/datasource_upcloud_managed_database_mysql_sessions_test.go +++ b/upcloud/datasource_upcloud_managed_database_mysql_sessions_test.go @@ -5,17 +5,15 @@ import ( "github.com/UpCloudLtd/terraform-provider-upcloud/internal/utils" "github.com/hashicorp/terraform-plugin-sdk/v2/helper/resource" - "github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema" ) func TestAccDataSourceUpcloudManagedDatabaseMySQLSessions(t *testing.T) { testDataS1 := utils.ReadTestDataFile(t, "testdata/upcloud_managed_database/data_source_mysql_sessions_s1.tf") - var providers []*schema.Provider name := "data.upcloud_managed_database_mysql_sessions.mysql_sessions" resource.ParallelTest(t, resource.TestCase{ - PreCheck: func() { testAccPreCheck(t) }, - ProviderFactories: testAccProviderFactories(&providers), + PreCheck: func() { testAccPreCheck(t) }, + ProtoV5ProviderFactories: testAccProviderFactories, Steps: []resource.TestStep{ { Config: testDataS1, diff --git a/upcloud/datasource_upcloud_managed_database_opensearch_indices_test.go b/upcloud/datasource_upcloud_managed_database_opensearch_indices_test.go index 2ff161ff1..19e82f657 100644 --- a/upcloud/datasource_upcloud_managed_database_opensearch_indices_test.go +++ b/upcloud/datasource_upcloud_managed_database_opensearch_indices_test.go @@ -6,20 +6,18 @@ import ( "github.com/UpCloudLtd/terraform-provider-upcloud/internal/utils" "github.com/hashicorp/terraform-plugin-sdk/v2/helper/resource" - "github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema" ) func TestAccDataSourceUpcloudManagedDatabaseOpenSearchIndices(t *testing.T) { testDataS1 := utils.ReadTestDataFile(t, "testdata/upcloud_managed_database/data_source_opensearch_indices_s1.tf") - var providers []*schema.Provider name := "data.upcloud_managed_database_opensearch_indices.opensearch_indices" prop := func(name string) string { return fmt.Sprintf("indices.0.%s", name) } resource.ParallelTest(t, resource.TestCase{ - PreCheck: func() { testAccPreCheck(t) }, - ProviderFactories: testAccProviderFactories(&providers), + PreCheck: func() { testAccPreCheck(t) }, + ProtoV5ProviderFactories: testAccProviderFactories, Steps: []resource.TestStep{ { Config: testDataS1, diff --git a/upcloud/datasource_upcloud_managed_database_postgresql_sessions_test.go b/upcloud/datasource_upcloud_managed_database_postgresql_sessions_test.go index af8775c23..2010f6f60 100644 --- a/upcloud/datasource_upcloud_managed_database_postgresql_sessions_test.go +++ b/upcloud/datasource_upcloud_managed_database_postgresql_sessions_test.go @@ -5,17 +5,15 @@ import ( "github.com/UpCloudLtd/terraform-provider-upcloud/internal/utils" "github.com/hashicorp/terraform-plugin-sdk/v2/helper/resource" - "github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema" ) func TestAccDataSourceUpcloudManagedDatabasePostgreSQLSessions(t *testing.T) { testDataS1 := utils.ReadTestDataFile(t, "testdata/upcloud_managed_database/data_source_postgresql_sessions_s1.tf") - var providers []*schema.Provider name := "data.upcloud_managed_database_postgresql_sessions.postgresql_sessions" resource.ParallelTest(t, resource.TestCase{ - PreCheck: func() { testAccPreCheck(t) }, - ProviderFactories: testAccProviderFactories(&providers), + PreCheck: func() { testAccPreCheck(t) }, + ProtoV5ProviderFactories: testAccProviderFactories, Steps: []resource.TestStep{ { Config: testDataS1, diff --git a/upcloud/datasource_upcloud_managed_database_redis_sessions_test.go b/upcloud/datasource_upcloud_managed_database_redis_sessions_test.go index d86156c75..60b5b9688 100644 --- a/upcloud/datasource_upcloud_managed_database_redis_sessions_test.go +++ b/upcloud/datasource_upcloud_managed_database_redis_sessions_test.go @@ -5,17 +5,15 @@ import ( "github.com/UpCloudLtd/terraform-provider-upcloud/internal/utils" "github.com/hashicorp/terraform-plugin-sdk/v2/helper/resource" - "github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema" ) func TestAccDataSourceUpcloudManagedDatabaseRedisSessions(t *testing.T) { testDataS1 := utils.ReadTestDataFile(t, "testdata/upcloud_managed_database/data_source_redis_sessions_s1.tf") - var providers []*schema.Provider name := "data.upcloud_managed_database_redis_sessions.redis_sessions" resource.ParallelTest(t, resource.TestCase{ - PreCheck: func() { testAccPreCheck(t) }, - ProviderFactories: testAccProviderFactories(&providers), + PreCheck: func() { testAccPreCheck(t) }, + ProtoV5ProviderFactories: testAccProviderFactories, Steps: []resource.TestStep{ { Config: testDataS1, diff --git a/upcloud/datasource_upcloud_managed_object_storage_policies_test.go b/upcloud/datasource_upcloud_managed_object_storage_policies_test.go index e706f7e89..0b1749f60 100644 --- a/upcloud/datasource_upcloud_managed_object_storage_policies_test.go +++ b/upcloud/datasource_upcloud_managed_object_storage_policies_test.go @@ -5,17 +5,15 @@ import ( "github.com/UpCloudLtd/terraform-provider-upcloud/internal/utils" "github.com/hashicorp/terraform-plugin-sdk/v2/helper/resource" - "github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema" ) func TestAccDataSourceUpcloudManagedObjectStoragePolicies(t *testing.T) { testDataS1 := utils.ReadTestDataFile(t, "testdata/upcloud_managed_object_storage/data_source_managed_object_storage_policies_s1.tf") - var providers []*schema.Provider name := "data.upcloud_managed_object_storage_policies.this" resource.ParallelTest(t, resource.TestCase{ - PreCheck: func() { testAccPreCheck(t) }, - ProviderFactories: testAccProviderFactories(&providers), + PreCheck: func() { testAccPreCheck(t) }, + ProtoV5ProviderFactories: testAccProviderFactories, Steps: []resource.TestStep{ { Config: testDataS1, diff --git a/upcloud/datasource_upcloud_managed_object_storage_regions_test.go b/upcloud/datasource_upcloud_managed_object_storage_regions_test.go index 728e752e6..d6d8fb36d 100644 --- a/upcloud/datasource_upcloud_managed_object_storage_regions_test.go +++ b/upcloud/datasource_upcloud_managed_object_storage_regions_test.go @@ -5,17 +5,15 @@ import ( "github.com/UpCloudLtd/terraform-provider-upcloud/internal/utils" "github.com/hashicorp/terraform-plugin-sdk/v2/helper/resource" - "github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema" ) func TestAccDataSourceUpcloudManagedObjectStorageRegions(t *testing.T) { testDataS1 := utils.ReadTestDataFile(t, "testdata/upcloud_managed_object_storage/data_source_managed_object_storage_regions_s1.tf") - var providers []*schema.Provider name := "data.upcloud_managed_object_storage_regions.this" resource.ParallelTest(t, resource.TestCase{ - PreCheck: func() { testAccPreCheck(t) }, - ProviderFactories: testAccProviderFactories(&providers), + PreCheck: func() { testAccPreCheck(t) }, + ProtoV5ProviderFactories: testAccProviderFactories, Steps: []resource.TestStep{ { Config: testDataS1, diff --git a/upcloud/datasource_upcloud_networks_test.go b/upcloud/datasource_upcloud_networks_test.go index 197c42519..b1a987768 100644 --- a/upcloud/datasource_upcloud_networks_test.go +++ b/upcloud/datasource_upcloud_networks_test.go @@ -8,18 +8,15 @@ import ( "testing" "time" - "github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema" "github.com/hashicorp/terraform-plugin-sdk/v2/terraform" "github.com/hashicorp/terraform-plugin-sdk/v2/helper/resource" ) func TestAccUpCloudNetworksNoZone(t *testing.T) { - var providers []*schema.Provider - resource.ParallelTest(t, resource.TestCase{ - PreCheck: func() { testAccPreCheck(t) }, - ProviderFactories: testAccProviderFactories(&providers), + PreCheck: func() { testAccPreCheck(t) }, + ProtoV5ProviderFactories: testAccProviderFactories, Steps: []resource.TestStep{ { Config: testAccNetworksConfig("", ""), @@ -30,11 +27,9 @@ func TestAccUpCloudNetworksNoZone(t *testing.T) { } func TestAccUpCloudNetworksWithZone(t *testing.T) { - var providers []*schema.Provider - resource.ParallelTest(t, resource.TestCase{ - PreCheck: func() { testAccPreCheck(t) }, - ProviderFactories: testAccProviderFactories(&providers), + PreCheck: func() { testAccPreCheck(t) }, + ProtoV5ProviderFactories: testAccProviderFactories, Steps: []resource.TestStep{ { Config: testAccNetworksConfig("fi-hel1", ""), @@ -45,11 +40,9 @@ func TestAccUpCloudNetworksWithZone(t *testing.T) { } func TestAccUpCloudNetworksWithFilter(t *testing.T) { - var providers []*schema.Provider - resource.ParallelTest(t, resource.TestCase{ - PreCheck: func() { testAccPreCheck(t) }, - ProviderFactories: testAccProviderFactories(&providers), + PreCheck: func() { testAccPreCheck(t) }, + ProtoV5ProviderFactories: testAccProviderFactories, Steps: []resource.TestStep{ { Config: testAccNetworksConfig("", "^Public.*"), diff --git a/upcloud/datasource_upcloud_storage_test.go b/upcloud/datasource_upcloud_storage_test.go index e14255454..58a0a4783 100644 --- a/upcloud/datasource_upcloud_storage_test.go +++ b/upcloud/datasource_upcloud_storage_test.go @@ -4,17 +4,14 @@ import ( "testing" "github.com/hashicorp/terraform-plugin-sdk/v2/helper/resource" - "github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema" ) func TestAccDataSourceUpCloudStorage(t *testing.T) { - var providers []*schema.Provider - templateResourceName := "data.upcloud_storage.ubuntu_template" resource.Test(t, resource.TestCase{ - PreCheck: func() { testAccPreCheck(t) }, - ProviderFactories: testAccProviderFactories(&providers), + PreCheck: func() { testAccPreCheck(t) }, + ProtoV5ProviderFactories: testAccProviderFactories, Steps: []resource.TestStep{ { Config: dataSourceUpCloudStorageTestTemplateConfig(), diff --git a/upcloud/datasource_upcloud_tags_test.go b/upcloud/datasource_upcloud_tags_test.go index bb51cdbc5..10d002f25 100644 --- a/upcloud/datasource_upcloud_tags_test.go +++ b/upcloud/datasource_upcloud_tags_test.go @@ -6,19 +6,16 @@ import ( "github.com/hashicorp/terraform-plugin-sdk/v2/helper/acctest" "github.com/hashicorp/terraform-plugin-sdk/v2/helper/resource" - "github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema" "github.com/hashicorp/terraform-plugin-sdk/v2/terraform" ) func TestAccDataSourceUpCloudTags_basic(t *testing.T) { - var providers []*schema.Provider - resourceName := "data.upcloud_tags.empty" tagName := fmt.Sprintf("tag-%s", acctest.RandString(10)) resource.ParallelTest(t, resource.TestCase{ - PreCheck: func() { testAccPreCheck(t) }, - ProviderFactories: testAccProviderFactories(&providers), + PreCheck: func() { testAccPreCheck(t) }, + ProtoV5ProviderFactories: testAccProviderFactories, Steps: []resource.TestStep{ { Config: testAccDataSourceUpCloudTagsConfigEmpty(tagName), diff --git a/upcloud/datasource_upcloud_zone_test.go b/upcloud/datasource_upcloud_zone_test.go index 75e6d4ed6..4ad5731f5 100644 --- a/upcloud/datasource_upcloud_zone_test.go +++ b/upcloud/datasource_upcloud_zone_test.go @@ -5,12 +5,9 @@ import ( "testing" "github.com/hashicorp/terraform-plugin-sdk/v2/helper/resource" - "github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema" ) func TestAccDataSourceUpCloudZone_basic(t *testing.T) { - var providers []*schema.Provider - resourceName := "data.upcloud_zone.my_zone" expectedZoneName := "uk-lon1" @@ -18,8 +15,8 @@ func TestAccDataSourceUpCloudZone_basic(t *testing.T) { expectedPublic := "true" resource.ParallelTest(t, resource.TestCase{ - PreCheck: func() { testAccPreCheck(t) }, - ProviderFactories: testAccProviderFactories(&providers), + PreCheck: func() { testAccPreCheck(t) }, + ProtoV5ProviderFactories: testAccProviderFactories, Steps: []resource.TestStep{ { Config: testAccDataSourceUpCloudZoneConfig(expectedZoneName), diff --git a/upcloud/datasource_upcloud_zones_test.go b/upcloud/datasource_upcloud_zones_test.go index 0542d23e1..1c32c6eda 100644 --- a/upcloud/datasource_upcloud_zones_test.go +++ b/upcloud/datasource_upcloud_zones_test.go @@ -6,7 +6,6 @@ import ( "testing" "github.com/hashicorp/terraform-plugin-sdk/v2/helper/resource" - "github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema" "github.com/hashicorp/terraform-plugin-sdk/v2/terraform" ) @@ -18,13 +17,11 @@ const ( ) func TestAccDataSourceUpCloudZones_default(t *testing.T) { - var providers []*schema.Provider - resourceName := "data.upcloud_zones.empty" resource.ParallelTest(t, resource.TestCase{ - PreCheck: func() { testAccPreCheck(t) }, - ProviderFactories: testAccProviderFactories(&providers), + PreCheck: func() { testAccPreCheck(t) }, + ProtoV5ProviderFactories: testAccProviderFactories, Steps: []resource.TestStep{ { Config: testAccDataSourceUpCloudZonesConfigEmpty(), @@ -37,14 +34,12 @@ func TestAccDataSourceUpCloudZones_default(t *testing.T) { } func TestAccDataSourceUpCloudZones_public(t *testing.T) { - var providers []*schema.Provider - filterType := publicFilter resourceName := fmt.Sprintf("data.upcloud_zones.%s", filterType) resource.ParallelTest(t, resource.TestCase{ - PreCheck: func() { testAccPreCheck(t) }, - ProviderFactories: testAccProviderFactories(&providers), + PreCheck: func() { testAccPreCheck(t) }, + ProtoV5ProviderFactories: testAccProviderFactories, Steps: []resource.TestStep{ { Config: testAccDataSourceUpCloudZonesConfigFilter(filterType), @@ -59,14 +54,12 @@ func TestAccDataSourceUpCloudZones_public(t *testing.T) { } func TestAccDataSourceUpCloudZones_private(t *testing.T) { - var providers []*schema.Provider - filterType := privateFilter resourceName := fmt.Sprintf("data.upcloud_zones.%s", filterType) resource.ParallelTest(t, resource.TestCase{ - PreCheck: func() { testAccPreCheck(t) }, - ProviderFactories: testAccProviderFactories(&providers), + PreCheck: func() { testAccPreCheck(t) }, + ProtoV5ProviderFactories: testAccProviderFactories, Steps: []resource.TestStep{ { Config: testAccDataSourceUpCloudZonesConfigFilter(filterType), @@ -80,14 +73,12 @@ func TestAccDataSourceUpCloudZones_private(t *testing.T) { } func TestAccDataSourceUpCloudZones_all(t *testing.T) { - var providers []*schema.Provider - filterType := allFilter resourceName := fmt.Sprintf("data.upcloud_zones.%s", filterType) resource.ParallelTest(t, resource.TestCase{ - PreCheck: func() { testAccPreCheck(t) }, - ProviderFactories: testAccProviderFactories(&providers), + PreCheck: func() { testAccPreCheck(t) }, + ProtoV5ProviderFactories: testAccProviderFactories, Steps: []resource.TestStep{ { Config: testAccDataSourceUpCloudZonesConfigFilter(filterType), diff --git a/upcloud/muxserver.go b/upcloud/muxserver.go new file mode 100644 index 000000000..37500d44c --- /dev/null +++ b/upcloud/muxserver.go @@ -0,0 +1,24 @@ +package upcloud + +import ( + "context" + + "github.com/hashicorp/terraform-plugin-framework/providerserver" + "github.com/hashicorp/terraform-plugin-go/tfprotov5" + "github.com/hashicorp/terraform-plugin-mux/tf5muxserver" +) + +func NewProviderServerFactory() (func() tfprotov5.ProviderServer, error) { + providers := []func() tfprotov5.ProviderServer{ + providerserver.NewProtocol5(New()), + Provider().GRPCProvider, + } + + ctx := context.Background() + muxServer, err := tf5muxserver.NewMuxServer(ctx, providers...) + if err != nil { + return nil, err + } + + return muxServer.ProviderServer, nil +} diff --git a/upcloud/provider.go b/upcloud/provider.go index e386f73f6..2b5758bd4 100644 --- a/upcloud/provider.go +++ b/upcloud/provider.go @@ -6,6 +6,7 @@ import ( "time" "github.com/UpCloudLtd/terraform-provider-upcloud/internal/config" + "github.com/UpCloudLtd/terraform-provider-upcloud/internal/service/network" retryablehttp "github.com/hashicorp/go-retryablehttp" "github.com/hashicorp/terraform-plugin-framework/datasource" "github.com/hashicorp/terraform-plugin-framework/provider" @@ -114,10 +115,15 @@ func (p *upcloudProvider) Configure(ctx context.Context, req provider.ConfigureR if err != nil { resp.Diagnostics.AddError("Authentication failed", "Failed to authenticate to UpCloud API with given credentials") } + + resp.ResourceData = service + resp.DataSourceData = service } func (p *upcloudProvider) Resources(_ context.Context) []func() resource.Resource { - return []func() resource.Resource{} + return []func() resource.Resource{ + network.NewNetworkResource, + } } func (p *upcloudProvider) DataSources(_ context.Context) []func() datasource.DataSource { diff --git a/upcloud/resource_upcloud_firewall_rules_test.go b/upcloud/resource_upcloud_firewall_rules_test.go index 973ec547c..1ad04cccb 100644 --- a/upcloud/resource_upcloud_firewall_rules_test.go +++ b/upcloud/resource_upcloud_firewall_rules_test.go @@ -8,7 +8,6 @@ import ( "github.com/UpCloudLtd/upcloud-go-api/v8/upcloud" "github.com/UpCloudLtd/upcloud-go-api/v8/upcloud/request" "github.com/UpCloudLtd/upcloud-go-api/v8/upcloud/service" - "github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema" "github.com/hashicorp/terraform-plugin-sdk/v2/terraform" "github.com/hashicorp/terraform-plugin-sdk/v2/helper/resource" @@ -17,14 +16,13 @@ import ( const firewallRulesResourceName = "upcloud_firewall_rules.my_rule" func TestUpcloudFirewallRules_basic(t *testing.T) { - var providers []*schema.Provider var firewallRules upcloud.FirewallRules resourceName := firewallRulesResourceName resource.ParallelTest(t, resource.TestCase{ - PreCheck: func() { testAccPreCheck(t) }, - ProviderFactories: testAccProviderFactories(&providers), - CheckDestroy: testAccCheckFirewallRulesDestroy, + PreCheck: func() { testAccPreCheck(t) }, + ProtoV5ProviderFactories: testAccProviderFactories, + CheckDestroy: testAccCheckFirewallRulesDestroy, Steps: []resource.TestStep{ { Config: testUpcloudFirewallRulesInstanceConfig(), @@ -66,15 +64,13 @@ func TestUpcloudFirewallRules_basic(t *testing.T) { } func TestUpcloudFirewallRules_update(t *testing.T) { - var providers []*schema.Provider - var firewallRules upcloud.FirewallRules resourceName := "upcloud_firewall_rules.my_rule" resource.ParallelTest(t, resource.TestCase{ - PreCheck: func() { testAccPreCheck(t) }, - ProviderFactories: testAccProviderFactories(&providers), - CheckDestroy: testAccCheckFirewallRulesDestroy, + PreCheck: func() { testAccPreCheck(t) }, + ProtoV5ProviderFactories: testAccProviderFactories, + CheckDestroy: testAccCheckFirewallRulesDestroy, Steps: []resource.TestStep{ { Config: testUpcloudFirewallRulesInstanceConfig(), @@ -95,15 +91,13 @@ func TestUpcloudFirewallRules_update(t *testing.T) { } func TestUpcloudFirewallRules_import(t *testing.T) { - var providers []*schema.Provider - var firewallRules upcloud.FirewallRules resourceName := firewallRulesResourceName resource.ParallelTest(t, resource.TestCase{ - PreCheck: func() { testAccPreCheck(t) }, - ProviderFactories: testAccProviderFactories(&providers), - CheckDestroy: testAccCheckFirewallRulesDestroy, + PreCheck: func() { testAccPreCheck(t) }, + ProtoV5ProviderFactories: testAccProviderFactories, + CheckDestroy: testAccCheckFirewallRulesDestroy, Steps: []resource.TestStep{ { Config: testUpcloudFirewallRulesInstanceConfig(), diff --git a/upcloud/resource_upcloud_floating_ip_address_test.go b/upcloud/resource_upcloud_floating_ip_address_test.go index f7393e5cd..dc77dc566 100644 --- a/upcloud/resource_upcloud_floating_ip_address_test.go +++ b/upcloud/resource_upcloud_floating_ip_address_test.go @@ -10,7 +10,6 @@ import ( "github.com/hashicorp/terraform-plugin-sdk/v2/terraform" "github.com/hashicorp/terraform-plugin-sdk/v2/helper/resource" - "github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema" ) const ( @@ -19,8 +18,6 @@ const ( ) func TestAccUpcloudFloatingIPAddress_basic(t *testing.T) { - var providers []*schema.Provider - resourceName := floatingIPResourceName expectedZone := zone expectedMacAddress := "" @@ -28,8 +25,8 @@ func TestAccUpcloudFloatingIPAddress_basic(t *testing.T) { expectedAccess := "public" resource.ParallelTest(t, resource.TestCase{ - PreCheck: func() { testAccPreCheck(t) }, - ProviderFactories: testAccProviderFactories(&providers), + PreCheck: func() { testAccPreCheck(t) }, + ProtoV5ProviderFactories: testAccProviderFactories, Steps: []resource.TestStep{ { Config: testUpcloudFloatingIPAddressBasicConfig(), @@ -46,16 +43,14 @@ func TestAccUpcloudFloatingIPAddress_basic(t *testing.T) { } func TestAccUpcloudFloatingIPAddress_create_with_server(t *testing.T) { - var providers []*schema.Provider - serverResourceName := "upcloud_server.my_server" expectedZone := zone expectedFamily := "IPv4" expectedAccess := "public" resource.Test(t, resource.TestCase{ - PreCheck: func() { testAccPreCheck(t) }, - ProviderFactories: testAccProviderFactories(&providers), + PreCheck: func() { testAccPreCheck(t) }, + ProtoV5ProviderFactories: testAccProviderFactories, Steps: []resource.TestStep{ { Config: testUpcloudFloatingIPAddressCreateWithServerConfig([]string{"my_server"}, 0), @@ -73,14 +68,12 @@ func TestAccUpcloudFloatingIPAddress_create_with_server(t *testing.T) { } func TestAccUpcloudFloatingIPAddress_switch_between_servers(t *testing.T) { - var providers []*schema.Provider - firstServerResourceName := "upcloud_server.my_first_server" secondServerResourceName := "upcloud_server.my_second_server" resource.Test(t, resource.TestCase{ - PreCheck: func() { testAccPreCheck(t) }, - ProviderFactories: testAccProviderFactories(&providers), + PreCheck: func() { testAccPreCheck(t) }, + ProtoV5ProviderFactories: testAccProviderFactories, Steps: []resource.TestStep{ { Config: testUpcloudFloatingIPAddressCreateWithServerConfig([]string{"my_first_server", "my_second_server"}, 0), @@ -127,13 +120,12 @@ func testAccCheckFloatingIP(floatingIPResourceName, serverResourceName string) r } func TestAccUpcloudFloatingIPAddress_import(t *testing.T) { - var providers []*schema.Provider resourceName := floatingIPResourceName resource.ParallelTest(t, resource.TestCase{ - PreCheck: func() { testAccPreCheck(t) }, - ProviderFactories: testAccProviderFactories(&providers), - CheckDestroy: testAccCheckFloatingIPAddressDestroy, + PreCheck: func() { testAccPreCheck(t) }, + ProtoV5ProviderFactories: testAccProviderFactories, + CheckDestroy: testAccCheckFloatingIPAddressDestroy, Steps: []resource.TestStep{ { Config: testUpcloudFloatingIPAddressBasicConfig(), diff --git a/upcloud/resource_upcloud_gateway_test.go b/upcloud/resource_upcloud_gateway_test.go index b67f30d6a..376b7369f 100644 --- a/upcloud/resource_upcloud_gateway_test.go +++ b/upcloud/resource_upcloud_gateway_test.go @@ -7,14 +7,12 @@ import ( "github.com/UpCloudLtd/terraform-provider-upcloud/internal/utils" "github.com/hashicorp/terraform-plugin-sdk/v2/helper/resource" - "github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema" ) func TestAccUpcloudGateway(t *testing.T) { testDataS1 := utils.ReadTestDataFile(t, "testdata/upcloud_gateway/gateway_s1.tf") testDataS2 := utils.ReadTestDataFile(t, "testdata/upcloud_gateway/gateway_s2.tf") - var providers []*schema.Provider name := "upcloud_gateway.this" conn1Name := "upcloud_gateway_connection.this" conn2Name := "upcloud_gateway_connection.this2" @@ -22,8 +20,8 @@ func TestAccUpcloudGateway(t *testing.T) { tunnel2Name := "upcloud_gateway_connection_tunnel.this2" resource.ParallelTest(t, resource.TestCase{ - PreCheck: func() { testAccPreCheck(t) }, - ProviderFactories: testAccProviderFactories(&providers), + PreCheck: func() { testAccPreCheck(t) }, + ProtoV5ProviderFactories: testAccProviderFactories, Steps: []resource.TestStep{ { Config: testDataS1, @@ -193,11 +191,9 @@ func TestAccUpcloudGateway_LabelsValidation(t *testing.T) { }) } - var providers []*schema.Provider - resource.ParallelTest(t, resource.TestCase{ - PreCheck: func() { testAccPreCheck(t) }, - ProviderFactories: testAccProviderFactories(&providers), - Steps: steps, + PreCheck: func() { testAccPreCheck(t) }, + ProtoV5ProviderFactories: testAccProviderFactories, + Steps: steps, }) } diff --git a/upcloud/resource_upcloud_kubernetes_test.go b/upcloud/resource_upcloud_kubernetes_test.go index f8f72aae7..182f5cfc4 100644 --- a/upcloud/resource_upcloud_kubernetes_test.go +++ b/upcloud/resource_upcloud_kubernetes_test.go @@ -5,21 +5,19 @@ import ( "github.com/UpCloudLtd/terraform-provider-upcloud/internal/utils" "github.com/hashicorp/terraform-plugin-sdk/v2/helper/resource" - "github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema" ) func TestAccUpcloudKubernetes(t *testing.T) { testDataS1 := utils.ReadTestDataFile(t, "testdata/upcloud_kubernetes/kubernetes_s1.tf") testDataS2 := utils.ReadTestDataFile(t, "testdata/upcloud_kubernetes/kubernetes_s2.tf") - var providers []*schema.Provider cName := "upcloud_kubernetes_cluster.main" g1Name := "upcloud_kubernetes_node_group.g1" g2Name := "upcloud_kubernetes_node_group.g2" resource.ParallelTest(t, resource.TestCase{ - PreCheck: func() { testAccPreCheck(t) }, - ProviderFactories: testAccProviderFactories(&providers), + PreCheck: func() { testAccPreCheck(t) }, + ProtoV5ProviderFactories: testAccProviderFactories, Steps: []resource.TestStep{ { Config: testDataS1, @@ -73,12 +71,11 @@ func TestAccUpcloudKubernetes_labels(t *testing.T) { testDataS2 := utils.ReadTestDataFile(t, "testdata/upcloud_kubernetes/kubernetes_labels_s2.tf") testDataS3 := utils.ReadTestDataFile(t, "testdata/upcloud_kubernetes/kubernetes_labels_s3.tf") - var providers []*schema.Provider cluster := "upcloud_kubernetes_cluster.main" resource.ParallelTest(t, resource.TestCase{ - PreCheck: func() { testAccPreCheck(t) }, - ProviderFactories: testAccProviderFactories(&providers), + PreCheck: func() { testAccPreCheck(t) }, + ProtoV5ProviderFactories: testAccProviderFactories, Steps: []resource.TestStep{ { Config: testDataS1, diff --git a/upcloud/resource_upcloud_loadbalancer_test.go b/upcloud/resource_upcloud_loadbalancer_test.go index a01190f81..186652bf2 100644 --- a/upcloud/resource_upcloud_loadbalancer_test.go +++ b/upcloud/resource_upcloud_loadbalancer_test.go @@ -6,7 +6,6 @@ import ( "github.com/UpCloudLtd/terraform-provider-upcloud/internal/utils" "github.com/hashicorp/terraform-plugin-sdk/v2/helper/resource" - "github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema" ) func TestAccUpcloudLoadBalancer(t *testing.T) { @@ -15,7 +14,6 @@ func TestAccUpcloudLoadBalancer(t *testing.T) { testDataS3 := utils.ReadTestDataFile(t, "testdata/upcloud_loadbalancer/loadbalancer_s3.tf") testDataS4 := utils.ReadTestDataFile(t, "testdata/upcloud_loadbalancer/loadbalancer_s4.tf") - var providers []*schema.Provider lbName := "upcloud_loadbalancer.lb" dnsName := "upcloud_loadbalancer_resolver.lb_dns_1" be1Name := "upcloud_loadbalancer_backend.lb_be_1" @@ -31,8 +29,8 @@ func TestAccUpcloudLoadBalancer(t *testing.T) { cbm1Name := "upcloud_loadbalancer_manual_certificate_bundle.lb_cb_m1" resource.ParallelTest(t, resource.TestCase{ - PreCheck: func() { testAccPreCheck(t) }, - ProviderFactories: testAccProviderFactories(&providers), + PreCheck: func() { testAccPreCheck(t) }, + ProtoV5ProviderFactories: testAccProviderFactories, Steps: []resource.TestStep{ { Config: testDataS1, @@ -219,11 +217,9 @@ func TestAccUpcloudLoadBalancer_HTTPRedirectValidation(t *testing.T) { testDataE3 := utils.ReadTestDataFile(t, "testdata/upcloud_loadbalancer/loadbalancer_e3.tf") testDataE4 := utils.ReadTestDataFile(t, "testdata/upcloud_loadbalancer/loadbalancer_e4.tf") - var providers []*schema.Provider - resource.ParallelTest(t, resource.TestCase{ - PreCheck: func() { testAccPreCheck(t) }, - ProviderFactories: testAccProviderFactories(&providers), + PreCheck: func() { testAccPreCheck(t) }, + ProtoV5ProviderFactories: testAccProviderFactories, Steps: []resource.TestStep{ { Config: testDataE1, diff --git a/upcloud/resource_upcloud_managed_database_mysql_test.go b/upcloud/resource_upcloud_managed_database_mysql_test.go index cb2bc17c0..b97e78857 100644 --- a/upcloud/resource_upcloud_managed_database_mysql_test.go +++ b/upcloud/resource_upcloud_managed_database_mysql_test.go @@ -6,21 +6,19 @@ import ( "github.com/UpCloudLtd/terraform-provider-upcloud/internal/utils" "github.com/hashicorp/terraform-plugin-sdk/v2/helper/resource" - "github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema" ) func TestAccUpcloudManagedDatabaseMySQLProperties(t *testing.T) { testDataS1 := utils.ReadTestDataFile(t, "testdata/upcloud_managed_database/mysql_properties_s1.tf") testDataS2 := utils.ReadTestDataFile(t, "testdata/upcloud_managed_database/mysql_properties_s2.tf") - var providers []*schema.Provider name := "upcloud_managed_database_mysql.mysql_properties" prop := func(name string) string { return fmt.Sprintf("properties.0.%s", name) } resource.ParallelTest(t, resource.TestCase{ - PreCheck: func() { testAccPreCheck(t) }, - ProviderFactories: testAccProviderFactories(&providers), + PreCheck: func() { testAccPreCheck(t) }, + ProtoV5ProviderFactories: testAccProviderFactories, Steps: []resource.TestStep{ { Config: testDataS1, diff --git a/upcloud/resource_upcloud_managed_database_opensearch_test.go b/upcloud/resource_upcloud_managed_database_opensearch_test.go index 0941bdfb8..50907ae24 100644 --- a/upcloud/resource_upcloud_managed_database_opensearch_test.go +++ b/upcloud/resource_upcloud_managed_database_opensearch_test.go @@ -6,21 +6,19 @@ import ( "github.com/UpCloudLtd/terraform-provider-upcloud/internal/utils" "github.com/hashicorp/terraform-plugin-sdk/v2/helper/resource" - "github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema" ) func TestAccUpcloudManagedDatabaseOpenSearchProperties(t *testing.T) { testDataS1 := utils.ReadTestDataFile(t, "testdata/upcloud_managed_database/opensearch_properties_s1.tf") testDataS2 := utils.ReadTestDataFile(t, "testdata/upcloud_managed_database/opensearch_properties_s2.tf") - var providers []*schema.Provider name := "upcloud_managed_database_opensearch.opensearch_properties" prop := func(name string) string { return fmt.Sprintf("properties.0.%s", name) } resource.ParallelTest(t, resource.TestCase{ - PreCheck: func() { testAccPreCheck(t) }, - ProviderFactories: testAccProviderFactories(&providers), + PreCheck: func() { testAccPreCheck(t) }, + ProtoV5ProviderFactories: testAccProviderFactories, Steps: []resource.TestStep{ { Config: testDataS1, diff --git a/upcloud/resource_upcloud_managed_database_postgresql_test.go b/upcloud/resource_upcloud_managed_database_postgresql_test.go index 0565fa644..7bd2ba58a 100644 --- a/upcloud/resource_upcloud_managed_database_postgresql_test.go +++ b/upcloud/resource_upcloud_managed_database_postgresql_test.go @@ -6,21 +6,19 @@ import ( "github.com/UpCloudLtd/terraform-provider-upcloud/internal/utils" "github.com/hashicorp/terraform-plugin-sdk/v2/helper/resource" - "github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema" ) func TestAccUpcloudManagedDatabasePostgreSQLProperties(t *testing.T) { testDataS1 := utils.ReadTestDataFile(t, "testdata/upcloud_managed_database/postgresql_properties_s1.tf") testDataS2 := utils.ReadTestDataFile(t, "testdata/upcloud_managed_database/postgresql_properties_s2.tf") - var providers []*schema.Provider name := "upcloud_managed_database_postgresql.postgresql_properties" prop := func(name string) string { return fmt.Sprintf("properties.0.%s", name) } resource.ParallelTest(t, resource.TestCase{ - PreCheck: func() { testAccPreCheck(t) }, - ProviderFactories: testAccProviderFactories(&providers), + PreCheck: func() { testAccPreCheck(t) }, + ProtoV5ProviderFactories: testAccProviderFactories, Steps: []resource.TestStep{ { Config: testDataS1, diff --git a/upcloud/resource_upcloud_managed_database_redis_test.go b/upcloud/resource_upcloud_managed_database_redis_test.go index e72ae87e0..6bb78d308 100644 --- a/upcloud/resource_upcloud_managed_database_redis_test.go +++ b/upcloud/resource_upcloud_managed_database_redis_test.go @@ -6,21 +6,19 @@ import ( "github.com/UpCloudLtd/terraform-provider-upcloud/internal/utils" "github.com/hashicorp/terraform-plugin-sdk/v2/helper/resource" - "github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema" ) func TestAccUpcloudManagedDatabaseRedisProperties(t *testing.T) { testDataS1 := utils.ReadTestDataFile(t, "testdata/upcloud_managed_database/redis_properties_s1.tf") testDataS2 := utils.ReadTestDataFile(t, "testdata/upcloud_managed_database/redis_properties_s2.tf") - var providers []*schema.Provider name := "upcloud_managed_database_redis.redis_properties" prop := func(name string) string { return fmt.Sprintf("properties.0.%s", name) } resource.ParallelTest(t, resource.TestCase{ - PreCheck: func() { testAccPreCheck(t) }, - ProviderFactories: testAccProviderFactories(&providers), + PreCheck: func() { testAccPreCheck(t) }, + ProtoV5ProviderFactories: testAccProviderFactories, Steps: []resource.TestStep{ { Config: testDataS1, diff --git a/upcloud/resource_upcloud_managed_database_test.go b/upcloud/resource_upcloud_managed_database_test.go index aac250eb1..23dcabb2e 100644 --- a/upcloud/resource_upcloud_managed_database_test.go +++ b/upcloud/resource_upcloud_managed_database_test.go @@ -7,7 +7,6 @@ import ( "github.com/UpCloudLtd/terraform-provider-upcloud/internal/utils" "github.com/UpCloudLtd/upcloud-go-api/v8/upcloud" "github.com/hashicorp/terraform-plugin-sdk/v2/helper/resource" - "github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema" ) func withPrefixDB(text string) string { @@ -18,7 +17,6 @@ func TestAccUpcloudManagedDatabase(t *testing.T) { testDataS1 := utils.ReadTestDataFile(t, "testdata/upcloud_managed_database/managed_database_s1.tf") testDataS2 := utils.ReadTestDataFile(t, "testdata/upcloud_managed_database/managed_database_s2.tf") - var providers []*schema.Provider pg1Name := "upcloud_managed_database_postgresql.pg1" pg2Name := "upcloud_managed_database_postgresql.pg2" msql1Name := "upcloud_managed_database_mysql.msql1" @@ -40,8 +38,8 @@ func TestAccUpcloudManagedDatabase(t *testing.T) { } resource.ParallelTest(t, resource.TestCase{ - PreCheck: func() { testAccPreCheck(t) }, - ProviderFactories: testAccProviderFactories(&providers), + PreCheck: func() { testAccPreCheck(t) }, + ProtoV5ProviderFactories: testAccProviderFactories, Steps: []resource.TestStep{ { Config: testDataS1, diff --git a/upcloud/resource_upcloud_managed_object_storage_test.go b/upcloud/resource_upcloud_managed_object_storage_test.go index d916500f5..288e4046f 100644 --- a/upcloud/resource_upcloud_managed_object_storage_test.go +++ b/upcloud/resource_upcloud_managed_object_storage_test.go @@ -7,20 +7,18 @@ import ( "github.com/UpCloudLtd/terraform-provider-upcloud/internal/utils" "github.com/hashicorp/terraform-plugin-sdk/v2/helper/resource" - "github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema" ) func TestAccUpcloudManagedObjectStorage(t *testing.T) { testDataS1 := utils.ReadTestDataFile(t, "testdata/upcloud_managed_object_storage/managed_object_storage_s1.tf") testDataS2 := utils.ReadTestDataFile(t, "testdata/upcloud_managed_object_storage/managed_object_storage_s2.tf") - var providers []*schema.Provider this := "upcloud_managed_object_storage.this" minimal := "upcloud_managed_object_storage.minimal" resource.ParallelTest(t, resource.TestCase{ - PreCheck: func() { testAccPreCheck(t) }, - ProviderFactories: testAccProviderFactories(&providers), + PreCheck: func() { testAccPreCheck(t) }, + ProtoV5ProviderFactories: testAccProviderFactories, Steps: []resource.TestStep{ { Config: testDataS1, @@ -82,11 +80,9 @@ func TestAccUpcloudManagedObjectStorage_LabelsValidation(t *testing.T) { }) } - var providers []*schema.Provider - resource.ParallelTest(t, resource.TestCase{ - PreCheck: func() { testAccPreCheck(t) }, - ProviderFactories: testAccProviderFactories(&providers), - Steps: steps, + PreCheck: func() { testAccPreCheck(t) }, + ProtoV5ProviderFactories: testAccProviderFactories, + Steps: steps, }) } diff --git a/upcloud/resource_upcloud_managed_object_storage_user_test.go b/upcloud/resource_upcloud_managed_object_storage_user_test.go index ae7842638..c2a594a1b 100644 --- a/upcloud/resource_upcloud_managed_object_storage_user_test.go +++ b/upcloud/resource_upcloud_managed_object_storage_user_test.go @@ -5,14 +5,12 @@ import ( "github.com/UpCloudLtd/terraform-provider-upcloud/internal/utils" "github.com/hashicorp/terraform-plugin-sdk/v2/helper/resource" - "github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema" ) func TestAccUpcloudManagedObjectStorageUser(t *testing.T) { testDataS1 := utils.ReadTestDataFile(t, "testdata/upcloud_managed_object_storage/managed_object_storage_user_s1.tf") testDataS2 := utils.ReadTestDataFile(t, "testdata/upcloud_managed_object_storage/managed_object_storage_user_s2.tf") - var providers []*schema.Provider storage := "upcloud_managed_object_storage.user" policy := "upcloud_managed_object_storage_policy.user" user := "upcloud_managed_object_storage_user.user" @@ -20,8 +18,8 @@ func TestAccUpcloudManagedObjectStorageUser(t *testing.T) { userPolicy := "upcloud_managed_object_storage_user_policy.user" resource.ParallelTest(t, resource.TestCase{ - PreCheck: func() { testAccPreCheck(t) }, - ProviderFactories: testAccProviderFactories(&providers), + PreCheck: func() { testAccPreCheck(t) }, + ProtoV5ProviderFactories: testAccProviderFactories, Steps: []resource.TestStep{ { Config: testDataS1, diff --git a/upcloud/resource_upcloud_network_test.go b/upcloud/resource_upcloud_network_test.go index 03b171d4a..b87fed13e 100644 --- a/upcloud/resource_upcloud_network_test.go +++ b/upcloud/resource_upcloud_network_test.go @@ -9,13 +9,10 @@ import ( "github.com/hashicorp/terraform-plugin-sdk/v2/helper/acctest" "github.com/hashicorp/terraform-plugin-sdk/v2/helper/resource" - "github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema" "github.com/hashicorp/terraform-plugin-sdk/v2/terraform" ) func TestAccUpCloudNetwork_basic(t *testing.T) { - var providers []*schema.Provider - netName := fmt.Sprintf("test_network_%s", acctest.RandString(5)) subnet := acctest.RandIntRange(0, 250) cidr := fmt.Sprintf("10.0.%d.0/24", subnet) @@ -34,8 +31,8 @@ func TestAccUpCloudNetwork_basic(t *testing.T) { ) resource.ParallelTest(t, resource.TestCase{ - PreCheck: func() { testAccPreCheck(t) }, - ProviderFactories: testAccProviderFactories(&providers), + PreCheck: func() { testAccPreCheck(t) }, + ProtoV5ProviderFactories: testAccProviderFactories, Steps: []resource.TestStep{ { Config: config, @@ -63,16 +60,14 @@ func TestAccUpCloudNetwork_basic(t *testing.T) { } func TestAccUpCloudNetwork_basicUpdate(t *testing.T) { - var providers []*schema.Provider - netName := fmt.Sprintf("test_network_%s", acctest.RandString(5)) subnet := acctest.RandIntRange(0, 250) cidr := fmt.Sprintf("10.0.%d.0/24", subnet) gateway := fmt.Sprintf("10.0.%d.1", subnet) resource.ParallelTest(t, resource.TestCase{ - PreCheck: func() { testAccPreCheck(t) }, - ProviderFactories: testAccProviderFactories(&providers), + PreCheck: func() { testAccPreCheck(t) }, + ProtoV5ProviderFactories: testAccProviderFactories, Steps: []resource.TestStep{ { Config: testAccNetworkConfig(netName, "fi-hel1", cidr, gateway, true, false, false, []string{"10.0.0.2"}, []string{"192.168.0.0/24"}), @@ -109,8 +104,6 @@ func TestAccUpCloudNetwork_basicUpdate(t *testing.T) { } func TestAccUpCloudNetwork_withRouter(t *testing.T) { - var providers []*schema.Provider - netName := fmt.Sprintf("test_network_%s", acctest.RandString(5)) subnet := acctest.RandIntRange(0, 250) cidr := fmt.Sprintf("10.0.%d.0/24", subnet) @@ -119,8 +112,8 @@ func TestAccUpCloudNetwork_withRouter(t *testing.T) { config := testAccNetworkConfig(netName, "fi-hel1", cidr, gateway, true, false, true, nil, nil) resource.Test(t, resource.TestCase{ - PreCheck: func() { testAccPreCheck(t) }, - ProviderFactories: testAccProviderFactories(&providers), + PreCheck: func() { testAccPreCheck(t) }, + ProtoV5ProviderFactories: testAccProviderFactories, Steps: []resource.TestStep{ { Config: config, @@ -147,16 +140,14 @@ func TestAccUpCloudNetwork_withRouter(t *testing.T) { } func TestAccUpCloudNetwork_amendWithRouter(t *testing.T) { - var providers []*schema.Provider - netName := fmt.Sprintf("test_network_%s", acctest.RandString(5)) subnet := acctest.RandIntRange(0, 250) cidr := fmt.Sprintf("10.0.%d.0/24", subnet) gateway := fmt.Sprintf("10.0.%d.1", subnet) resource.Test(t, resource.TestCase{ - PreCheck: func() { testAccPreCheck(t) }, - ProviderFactories: testAccProviderFactories(&providers), + PreCheck: func() { testAccPreCheck(t) }, + ProtoV5ProviderFactories: testAccProviderFactories, Steps: []resource.TestStep{ { Config: testAccNetworkConfig(netName, "fi-hel1", cidr, gateway, true, false, false, nil, nil), @@ -191,20 +182,18 @@ func TestAccUpCloudNetwork_amendWithRouter(t *testing.T) { } func TestAccUpCloudNetwork_FamilyValidation(t *testing.T) { - var providers []*schema.Provider - netName := fmt.Sprintf("test_network_%s", acctest.RandString(5)) subnet := acctest.RandIntRange(0, 250) cidr := fmt.Sprintf("10.0.%d.0/24", subnet) gateway := fmt.Sprintf("10.0.%d.1", subnet) resource.ParallelTest(t, resource.TestCase{ - PreCheck: func() { testAccPreCheck(t) }, - ProviderFactories: testAccProviderFactories(&providers), + PreCheck: func() { testAccPreCheck(t) }, + ProtoV5ProviderFactories: testAccProviderFactories, Steps: []resource.TestStep{ { Config: testAccNetworkConfigWithFamily(netName, "fi-hel1", cidr, gateway, "rubbish", true, false, false, nil, nil), - ExpectError: regexp.MustCompile(`'family' has incorrect value`), + ExpectError: regexp.MustCompile(`family value must be one of: \["IPv4" "IPv6"\]`), }, }, }) @@ -234,8 +223,8 @@ func testAccNetworkConfigWithFamily(name string, zone string, address string, ga address = "%s" dhcp = "%t" dhcp_default_route = "%t" - family = "%s" - gateway = "%s" + family = "%s" + gateway = "%s" `, address, diff --git a/upcloud/resource_upcloud_objectstorage_test.go b/upcloud/resource_upcloud_objectstorage_test.go index e0d33f177..268b823c1 100644 --- a/upcloud/resource_upcloud_objectstorage_test.go +++ b/upcloud/resource_upcloud_objectstorage_test.go @@ -15,7 +15,6 @@ import ( "github.com/UpCloudLtd/upcloud-go-api/v8/upcloud/service" "github.com/hashicorp/go-retryablehttp" "github.com/hashicorp/terraform-plugin-sdk/v2/helper/resource" - "github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema" "github.com/hashicorp/terraform-plugin-sdk/v2/terraform" "github.com/minio/minio-go/v7" ) @@ -89,14 +88,12 @@ func TestMain(m *testing.M) { } func TestUpCloudObjectStorage_basic(t *testing.T) { - var providers []*schema.Provider - const expectedSize = "250" resource.Test(t, resource.TestCase{ - PreCheck: func() { testAccPreCheck(t) }, - ProviderFactories: testAccProviderFactories(&providers), - CheckDestroy: verifyObjectStorageDoesNotExist(objectStorageTestExpectedName1), + PreCheck: func() { testAccPreCheck(t) }, + ProtoV5ProviderFactories: testAccProviderFactories, + CheckDestroy: verifyObjectStorageDoesNotExist(objectStorageTestExpectedName1), Steps: []resource.TestStep{ { Config: testUpCloudObjectStorageInstanceConfig( @@ -123,8 +120,6 @@ func TestUpCloudObjectStorage_basic(t *testing.T) { } func TestUpCloudObjectStorage_basic_update(t *testing.T) { - var providers []*schema.Provider - const expectedSize = "500" const expectedUpdatedSize = "1000" @@ -133,9 +128,9 @@ func TestUpCloudObjectStorage_basic_update(t *testing.T) { const expectedUpdatedSecret = "an updated secret" resource.Test(t, resource.TestCase{ - PreCheck: func() { testAccPreCheck(t) }, - ProviderFactories: testAccProviderFactories(&providers), - CheckDestroy: verifyObjectStorageDoesNotExist(objectStorageTestExpectedName2), + PreCheck: func() { testAccPreCheck(t) }, + ProtoV5ProviderFactories: testAccProviderFactories, + CheckDestroy: verifyObjectStorageDoesNotExist(objectStorageTestExpectedName2), Steps: []resource.TestStep{ { Config: testUpCloudObjectStorageInstanceConfig( @@ -175,17 +170,15 @@ func TestUpCloudObjectStorage_basic_update(t *testing.T) { } func TestUpCloudObjectStorage_default_values(t *testing.T) { - var providers []*schema.Provider - const expectedSize = "500" const expectedUpdatedSize = "1000" const expectedUpdatedKey = "an updated access key" const expectedUpdatedSecret = "an updated secret" resource.Test(t, resource.TestCase{ - PreCheck: func() { testAccPreCheck(t) }, - ProviderFactories: testAccProviderFactories(&providers), - CheckDestroy: verifyObjectStorageDoesNotExist(objectStorageTestExpectedName2), + PreCheck: func() { testAccPreCheck(t) }, + ProtoV5ProviderFactories: testAccProviderFactories, + CheckDestroy: verifyObjectStorageDoesNotExist(objectStorageTestExpectedName2), Steps: []resource.TestStep{ { Config: testUpCloudObjectStorageInstanceDefaultsConfig( @@ -216,8 +209,6 @@ func TestUpCloudObjectStorage_default_values(t *testing.T) { } func TestUpCloudObjectStorage_bucket_management(t *testing.T) { - var providers []*schema.Provider - const expectedSize = "500" const expectedBucketName1 = "bucket1" const expectedBucketName2 = "bucket2" @@ -226,9 +217,9 @@ func TestUpCloudObjectStorage_bucket_management(t *testing.T) { const expectedBucketName5 = "bucket5" resource.Test(t, resource.TestCase{ - PreCheck: func() { testAccPreCheck(t) }, - ProviderFactories: testAccProviderFactories(&providers), - CheckDestroy: verifyObjectStorageDoesNotExist(objectStorageTestExpectedName2), + PreCheck: func() { testAccPreCheck(t) }, + ProtoV5ProviderFactories: testAccProviderFactories, + CheckDestroy: verifyObjectStorageDoesNotExist(objectStorageTestExpectedName2), Steps: []resource.TestStep{ { Config: testUpCloudObjectStorageWithBucketsInstanceConfig( @@ -304,8 +295,6 @@ func TestUpCloudObjectStorage_bucket_management(t *testing.T) { // We bundle creating object storage using env vars and import because import relies on passing access and secret key as env vars func TestUpCloudObjectStorage_keys_env_vars_and_import(t *testing.T) { - var providers []*schema.Provider - name := objectStorageTestExpectedName4 zone := "pl-waw1" desc := "just some random stuff" @@ -326,8 +315,8 @@ func TestUpCloudObjectStorage_keys_env_vars_and_import(t *testing.T) { os.Setenv(accessKeyEnvVarName, accessKey) os.Setenv(secretKeyEnvVarName, secretKey) }, - ProviderFactories: testAccProviderFactories(&providers), - CheckDestroy: verifyObjectStorageDoesNotExist(name), + ProtoV5ProviderFactories: testAccProviderFactories, + CheckDestroy: verifyObjectStorageDoesNotExist(name), Steps: []resource.TestStep{ { // Pass empty strings as access and secret keys to check if those values will be taken from env vars diff --git a/upcloud/resource_upcloud_router_test.go b/upcloud/resource_upcloud_router_test.go index 571fd2731..04e079883 100644 --- a/upcloud/resource_upcloud_router_test.go +++ b/upcloud/resource_upcloud_router_test.go @@ -10,21 +10,18 @@ import ( "github.com/UpCloudLtd/upcloud-go-api/v8/upcloud/service" "github.com/hashicorp/terraform-plugin-sdk/v2/helper/acctest" "github.com/hashicorp/terraform-plugin-sdk/v2/helper/resource" - "github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema" "github.com/hashicorp/terraform-plugin-sdk/v2/terraform" ) func TestAccUpCloudRouter(t *testing.T) { - var providers []*schema.Provider - var router upcloud.Router name := fmt.Sprintf("tf-test-%s", acctest.RandString(10)) staticRoutes := []upcloud.StaticRoute{{Name: "my-example-route", Nexthop: "10.0.0.100", Route: "0.0.0.0/0"}} resource.Test(t, resource.TestCase{ - PreCheck: func() { testAccPreCheck(t) }, - ProviderFactories: testAccProviderFactories(&providers), - CheckDestroy: testAccCheckRouterDestroy, + PreCheck: func() { testAccPreCheck(t) }, + ProtoV5ProviderFactories: testAccProviderFactories, + CheckDestroy: testAccCheckRouterDestroy, Steps: []resource.TestStep{ { Config: testAccRouterConfig(name, staticRoutes), @@ -43,8 +40,6 @@ func TestAccUpCloudRouter(t *testing.T) { } func TestAccUpCloudRouter_update(t *testing.T) { - var providers []*schema.Provider - var router upcloud.Router name := fmt.Sprintf("tf-test-%s", acctest.RandString(10)) updateName := fmt.Sprintf("tf-test-update-%s", acctest.RandString(10)) @@ -53,9 +48,9 @@ func TestAccUpCloudRouter_update(t *testing.T) { updateStaticRoutes := []upcloud.StaticRoute{{Name: "my-example-route-2", Nexthop: "10.0.0.101", Route: "0.0.0.0/0"}} resource.Test(t, resource.TestCase{ - PreCheck: func() { testAccPreCheck(t) }, - ProviderFactories: testAccProviderFactories(&providers), - CheckDestroy: testAccCheckRouterDestroy, + PreCheck: func() { testAccPreCheck(t) }, + ProtoV5ProviderFactories: testAccProviderFactories, + CheckDestroy: testAccCheckRouterDestroy, Steps: []resource.TestStep{ { Config: testAccRouterConfig(name, staticRoutes), @@ -86,14 +81,12 @@ func TestAccUpCloudRouter_update(t *testing.T) { } func TestAccUpCloudRouter_import(t *testing.T) { - var providers []*schema.Provider - var router upcloud.Router name := fmt.Sprintf("tf-test-import-%s", acctest.RandString(10)) resource.Test(t, resource.TestCase{ - PreCheck: func() { testAccPreCheck(t) }, - ProviderFactories: testAccProviderFactories(&providers), - CheckDestroy: testAccCheckRouterDestroy, + PreCheck: func() { testAccPreCheck(t) }, + ProtoV5ProviderFactories: testAccProviderFactories, + CheckDestroy: testAccCheckRouterDestroy, Steps: []resource.TestStep{ { Config: testAccRouterConfig(name, nil), @@ -111,13 +104,12 @@ func TestAccUpCloudRouter_import(t *testing.T) { } func TestAccUpCloudRouter_detach(t *testing.T) { - var providers []*schema.Provider var router upcloud.Router var network upcloud.Network resource.Test(t, resource.TestCase{ - PreCheck: func() { testAccPreCheck(t) }, - ProviderFactories: testAccProviderFactories(&providers), - CheckDestroy: testAccCheckRouterNetworkDestroy, + PreCheck: func() { testAccPreCheck(t) }, + ProtoV5ProviderFactories: testAccProviderFactories, + CheckDestroy: testAccCheckRouterNetworkDestroy, Steps: []resource.TestStep{ { // first create network and router attached @@ -180,13 +172,12 @@ func TestAccUpCloudRouter_detach(t *testing.T) { } func TestAccUpCloudRouter_attachedDelete(t *testing.T) { - var providers []*schema.Provider var router upcloud.Router var network upcloud.Network resource.Test(t, resource.TestCase{ - PreCheck: func() { testAccPreCheck(t) }, - ProviderFactories: testAccProviderFactories(&providers), - CheckDestroy: testAccCheckRouterNetworkDestroy, + PreCheck: func() { testAccPreCheck(t) }, + ProtoV5ProviderFactories: testAccProviderFactories, + CheckDestroy: testAccCheckRouterNetworkDestroy, Steps: []resource.TestStep{ { // first create network and router attached diff --git a/upcloud/resource_upcloud_server_group_test.go b/upcloud/resource_upcloud_server_group_test.go index 850681f93..3f03bcbdc 100644 --- a/upcloud/resource_upcloud_server_group_test.go +++ b/upcloud/resource_upcloud_server_group_test.go @@ -7,21 +7,18 @@ import ( "github.com/UpCloudLtd/terraform-provider-upcloud/internal/utils" "github.com/hashicorp/terraform-plugin-sdk/v2/helper/resource" - "github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema" ) func TestAccUpCloudServerGroup_ServerGroupMembers(t *testing.T) { testDataStep1 := utils.ReadTestDataFile(t, "testdata/upcloud_server_group/server_group_members_s1.tf") testDataStep2 := utils.ReadTestDataFile(t, "testdata/upcloud_server_group/server_group_members_s2.tf") - var providers []*schema.Provider - group1 := "upcloud_server_group.tf_test_1" group2 := "upcloud_server_group.tf_test_2" resource.ParallelTest(t, resource.TestCase{ - PreCheck: func() { testAccPreCheck(t) }, - ProviderFactories: testAccProviderFactories(&providers), + PreCheck: func() { testAccPreCheck(t) }, + ProtoV5ProviderFactories: testAccProviderFactories, Steps: []resource.TestStep{ { Config: testDataStep1, @@ -53,13 +50,11 @@ func TestAccUpCloudServerGroup_ServerServerGroup(t *testing.T) { testDataStep1 := utils.ReadTestDataFile(t, "testdata/upcloud_server_group/server_server_group_s1.tf") testDataStep2 := utils.ReadTestDataFile(t, "testdata/upcloud_server_group/server_server_group_s2.tf") - var providers []*schema.Provider - server := func(i int) string { return fmt.Sprintf("upcloud_server.test_%d", i) } resource.ParallelTest(t, resource.TestCase{ - PreCheck: func() { testAccPreCheck(t) }, - ProviderFactories: testAccProviderFactories(&providers), + PreCheck: func() { testAccPreCheck(t) }, + ProtoV5ProviderFactories: testAccProviderFactories, Steps: []resource.TestStep{ { Config: testDataStep1, @@ -82,11 +77,9 @@ func TestAccUpCloudServerGroup_ServerServerGroup(t *testing.T) { func TestAccUpCloudServerGroup_TrackMembersValidation(t *testing.T) { testDataE := utils.ReadTestDataFile(t, "testdata/upcloud_server_group/errors.tf") - var providers []*schema.Provider - resource.ParallelTest(t, resource.TestCase{ - PreCheck: func() { testAccPreCheck(t) }, - ProviderFactories: testAccProviderFactories(&providers), + PreCheck: func() { testAccPreCheck(t) }, + ProtoV5ProviderFactories: testAccProviderFactories, Steps: []resource.TestStep{ { Config: testDataE, diff --git a/upcloud/resource_upcloud_server_network_test.go b/upcloud/resource_upcloud_server_network_test.go index b3fde6fa6..2f05eb563 100644 --- a/upcloud/resource_upcloud_server_network_test.go +++ b/upcloud/resource_upcloud_server_network_test.go @@ -6,14 +6,12 @@ import ( "github.com/UpCloudLtd/terraform-provider-upcloud/internal/utils" "github.com/hashicorp/terraform-plugin-sdk/v2/helper/resource" - "github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema" ) func TestAccUpcloudServerNetwork(t *testing.T) { testDataS1 := utils.ReadTestDataFile(t, "testdata/upcloud_server/server_s1.tf") testDataS2 := utils.ReadTestDataFile(t, "testdata/upcloud_server/server_s2.tf") - var providers []*schema.Provider server1Name := "upcloud_server.server1" verifyImportStep := func(name string) resource.TestStep { @@ -26,8 +24,8 @@ func TestAccUpcloudServerNetwork(t *testing.T) { } resource.ParallelTest(t, resource.TestCase{ - PreCheck: func() { testAccPreCheck(t) }, - ProviderFactories: testAccProviderFactories(&providers), + PreCheck: func() { testAccPreCheck(t) }, + ProtoV5ProviderFactories: testAccProviderFactories, Steps: []resource.TestStep{ { Config: testDataS1, diff --git a/upcloud/resource_upcloud_server_test.go b/upcloud/resource_upcloud_server_test.go index 74b2fbe16..93bc1b44a 100644 --- a/upcloud/resource_upcloud_server_test.go +++ b/upcloud/resource_upcloud_server_test.go @@ -7,18 +7,15 @@ import ( "strings" "testing" - "github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema" "github.com/hashicorp/terraform-plugin-sdk/v2/terraform" "github.com/hashicorp/terraform-plugin-sdk/v2/helper/resource" ) func TestUpcloudServer_customPlan(t *testing.T) { - var providers []*schema.Provider - resource.ParallelTest(t, resource.TestCase{ - PreCheck: func() { testAccPreCheck(t) }, - ProviderFactories: testAccProviderFactories(&providers), + PreCheck: func() { testAccPreCheck(t) }, + ProtoV5ProviderFactories: testAccProviderFactories, Steps: []resource.TestStep{ { Config: ` @@ -67,11 +64,9 @@ func TestUpcloudServer_customPlan(t *testing.T) { } func TestUpcloudServer_minimal(t *testing.T) { - var providers []*schema.Provider - resource.ParallelTest(t, resource.TestCase{ - PreCheck: func() { testAccPreCheck(t) }, - ProviderFactories: testAccProviderFactories(&providers), + PreCheck: func() { testAccPreCheck(t) }, + ProtoV5ProviderFactories: testAccProviderFactories, Steps: []resource.TestStep{ { Config: ` @@ -120,11 +115,9 @@ func TestUpcloudServer_minimal(t *testing.T) { } func TestUpcloudServer_basic(t *testing.T) { - var providers []*schema.Provider - resource.ParallelTest(t, resource.TestCase{ - PreCheck: func() { testAccPreCheck(t) }, - ProviderFactories: testAccProviderFactories(&providers), + PreCheck: func() { testAccPreCheck(t) }, + ProtoV5ProviderFactories: testAccProviderFactories, Steps: []resource.TestStep{ { Config: ` @@ -181,11 +174,9 @@ func TestUpcloudServer_basic(t *testing.T) { } func TestUpcloudServer_changePlan(t *testing.T) { - var providers []*schema.Provider - resource.ParallelTest(t, resource.TestCase{ - PreCheck: func() { testAccPreCheck(t) }, - ProviderFactories: testAccProviderFactories(&providers), + PreCheck: func() { testAccPreCheck(t) }, + ProtoV5ProviderFactories: testAccProviderFactories, Steps: []resource.TestStep{ { Config: testAccServerConfigWithSmallServerPlan, @@ -206,11 +197,9 @@ func TestUpcloudServer_changePlan(t *testing.T) { } func TestUpcloudServer_simpleBackup(t *testing.T) { - var providers []*schema.Provider - resource.Test(t, resource.TestCase{ - PreCheck: func() { testAccPreCheck(t) }, - ProviderFactories: testAccProviderFactories(&providers), + PreCheck: func() { testAccPreCheck(t) }, + ProtoV5ProviderFactories: testAccProviderFactories, Steps: []resource.TestStep{ { // basic setup @@ -355,11 +344,9 @@ func TestUpcloudServer_simpleBackup(t *testing.T) { } func TestUpcloudServer_simpleBackupWithStorage(t *testing.T) { - var providers []*schema.Provider - resource.ParallelTest(t, resource.TestCase{ - PreCheck: func() { testAccPreCheck(t) }, - ProviderFactories: testAccProviderFactories(&providers), + PreCheck: func() { testAccPreCheck(t) }, + ProtoV5ProviderFactories: testAccProviderFactories, Steps: []resource.TestStep{ { // basic setup @@ -572,11 +559,9 @@ func TestUpcloudServer_simpleBackupWithStorage(t *testing.T) { } func TestUpcloudServer_updateTags(t *testing.T) { - var providers []*schema.Provider - resource.ParallelTest(t, resource.TestCase{ - PreCheck: func() { testAccPreCheck(t) }, - ProviderFactories: testAccProviderFactories(&providers), + PreCheck: func() { testAccPreCheck(t) }, + ProtoV5ProviderFactories: testAccProviderFactories, Steps: []resource.TestStep{ { // Setup server with tags @@ -718,13 +703,11 @@ func TestUpcloudServer_updateTags(t *testing.T) { } func TestUpcloudServer_networkInterface(t *testing.T) { - var providers []*schema.Provider - var serverID string resource.ParallelTest(t, resource.TestCase{ - PreCheck: func() { testAccPreCheck(t) }, - ProviderFactories: testAccProviderFactories(&providers), + PreCheck: func() { testAccPreCheck(t) }, + ProtoV5ProviderFactories: testAccProviderFactories, Steps: []resource.TestStep{ { Config: testAccServerNetworkInterfaceConfig( @@ -1033,11 +1016,9 @@ func testAccServerNetworkInterfaceConfig(nis ...networkInterface) string { } func TestUpcloudServer_updatePreChecks(t *testing.T) { - var providers []*schema.Provider - resource.ParallelTest(t, resource.TestCase{ - PreCheck: func() { testAccPreCheck(t) }, - ProviderFactories: testAccProviderFactories(&providers), + PreCheck: func() { testAccPreCheck(t) }, + ProtoV5ProviderFactories: testAccProviderFactories, Steps: []resource.TestStep{ { Config: ` @@ -1083,11 +1064,9 @@ func TestUpcloudServer_updatePreChecks(t *testing.T) { } func TestUpcloudServer_createPreChecks(t *testing.T) { - var providers []*schema.Provider - resource.ParallelTest(t, resource.TestCase{ - PreCheck: func() { testAccPreCheck(t) }, - ProviderFactories: testAccProviderFactories(&providers), + PreCheck: func() { testAccPreCheck(t) }, + ProtoV5ProviderFactories: testAccProviderFactories, Steps: []resource.TestStep{ { // Test creating with invalid plan diff --git a/upcloud/resource_upcloud_storage_test.go b/upcloud/resource_upcloud_storage_test.go index 703881094..a5ad7d240 100644 --- a/upcloud/resource_upcloud_storage_test.go +++ b/upcloud/resource_upcloud_storage_test.go @@ -16,7 +16,6 @@ import ( "github.com/UpCloudLtd/upcloud-go-api/v8/upcloud/request" "github.com/UpCloudLtd/upcloud-go-api/v8/upcloud/service" "github.com/hashicorp/terraform-plugin-sdk/v2/helper/acctest" - "github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema" "github.com/hashicorp/terraform-plugin-sdk/v2/terraform" "github.com/hashicorp/terraform-plugin-sdk/v2/helper/resource" @@ -30,11 +29,9 @@ const ( ) func TestAccUpcloudStorage_basic(t *testing.T) { - var providers []*schema.Provider - resource.ParallelTest(t, resource.TestCase{ - PreCheck: func() { testAccPreCheck(t) }, - ProviderFactories: testAccProviderFactories(&providers), + PreCheck: func() { testAccPreCheck(t) }, + ProtoV5ProviderFactories: testAccProviderFactories, Steps: []resource.TestStep{ { Config: ` @@ -131,7 +128,6 @@ func TestAccUpcloudStorage_basic(t *testing.T) { } func TestAccUpCloudStorage_import(t *testing.T) { - var providers []*schema.Provider var storageDetails upcloud.StorageDetails expectedSize := "10" @@ -140,9 +136,9 @@ func TestAccUpCloudStorage_import(t *testing.T) { expectedZone := "fi-hel1" resource.ParallelTest(t, resource.TestCase{ - PreCheck: func() { testAccPreCheck(t) }, - ProviderFactories: testAccProviderFactories(&providers), - CheckDestroy: testAccCheckStorageDestroy, + PreCheck: func() { testAccPreCheck(t) }, + ProtoV5ProviderFactories: testAccProviderFactories, + CheckDestroy: testAccCheckStorageDestroy, Steps: []resource.TestStep{ { Config: testUpcloudStorageInstanceConfig(expectedSize, expectedTier, expectedTitle, expectedZone, false, false), @@ -160,13 +156,12 @@ func TestAccUpCloudStorage_import(t *testing.T) { } func TestAccUpCloudStorage_StorageImport(t *testing.T) { - var providers []*schema.Provider var storageDetails upcloud.StorageDetails resource.ParallelTest(t, resource.TestCase{ - PreCheck: func() { testAccPreCheck(t) }, - ProviderFactories: testAccProviderFactories(&providers), - CheckDestroy: testAccCheckStorageDestroy, + PreCheck: func() { testAccPreCheck(t) }, + ProtoV5ProviderFactories: testAccProviderFactories, + CheckDestroy: testAccCheckStorageDestroy, Steps: []resource.TestStep{ { Config: testUpcloudStorageInstanceConfigWithStorageImport( @@ -185,7 +180,6 @@ func TestAccUpCloudStorage_StorageImport(t *testing.T) { func TestAccUpCloudStorage_StorageImportDirect(t *testing.T) { if os.Getenv(resource.EnvTfAcc) != "" { - var providers []*schema.Provider var storageDetails upcloud.StorageDetails imagePath, sum, err := createTempImage() @@ -196,9 +190,9 @@ func TestAccUpCloudStorage_StorageImportDirect(t *testing.T) { sha256sum := hex.EncodeToString((*sum).Sum(nil)) resource.ParallelTest(t, resource.TestCase{ - PreCheck: func() { testAccPreCheck(t) }, - ProviderFactories: testAccProviderFactories(&providers), - CheckDestroy: testAccCheckStorageDestroy, + PreCheck: func() { testAccPreCheck(t) }, + ProtoV5ProviderFactories: testAccProviderFactories, + CheckDestroy: testAccCheckStorageDestroy, Steps: []resource.TestStep{ { Config: testUpcloudStorageInstanceConfigWithStorageImport( @@ -217,12 +211,10 @@ func TestAccUpCloudStorage_StorageImportDirect(t *testing.T) { } func TestAccUpCloudStorage_StorageImportValidation(t *testing.T) { - var providers []*schema.Provider - resource.ParallelTest(t, resource.TestCase{ - PreCheck: func() { testAccPreCheck(t) }, - ProviderFactories: testAccProviderFactories(&providers), - CheckDestroy: testAccCheckStorageDestroy, + PreCheck: func() { testAccPreCheck(t) }, + ProtoV5ProviderFactories: testAccProviderFactories, + CheckDestroy: testAccCheckStorageDestroy, Steps: []resource.TestStep{ { Config: testUpcloudStorageInstanceConfigWithStorageImport( @@ -235,12 +227,10 @@ func TestAccUpCloudStorage_StorageImportValidation(t *testing.T) { } func TestAccUpCloudStorage_CloneImportValidation(t *testing.T) { - var providers []*schema.Provider - resource.ParallelTest(t, resource.TestCase{ - PreCheck: func() { testAccPreCheck(t) }, - ProviderFactories: testAccProviderFactories(&providers), - CheckDestroy: testAccCheckStorageDestroy, + PreCheck: func() { testAccPreCheck(t) }, + ProtoV5ProviderFactories: testAccProviderFactories, + CheckDestroy: testAccCheckStorageDestroy, Steps: []resource.TestStep{ { Config: testUpcloudStorageInstanceConfigWithImportAndClone(), @@ -251,14 +241,13 @@ func TestAccUpCloudStorage_CloneImportValidation(t *testing.T) { } func TestAccUpCloudStorage_CloneStorage(t *testing.T) { - var providers []*schema.Provider var storageDetailsPlain upcloud.StorageDetails var storageDetailsClone upcloud.StorageDetails resource.ParallelTest(t, resource.TestCase{ - PreCheck: func() { testAccPreCheck(t) }, - ProviderFactories: testAccProviderFactories(&providers), - CheckDestroy: testAccCheckStorageDestroy, + PreCheck: func() { testAccPreCheck(t) }, + ProtoV5ProviderFactories: testAccProviderFactories, + CheckDestroy: testAccCheckStorageDestroy, Steps: []resource.TestStep{ { Config: testUpcloudStorageInstanceConfigWithClone(20), diff --git a/upcloud/resource_upcloud_tag_test.go b/upcloud/resource_upcloud_tag_test.go index cd0be96e1..3c4e46d19 100644 --- a/upcloud/resource_upcloud_tag_test.go +++ b/upcloud/resource_upcloud_tag_test.go @@ -10,20 +10,18 @@ import ( "github.com/UpCloudLtd/upcloud-go-api/v8/upcloud/service" "github.com/hashicorp/terraform-plugin-sdk/v2/helper/acctest" "github.com/hashicorp/terraform-plugin-sdk/v2/helper/resource" - "github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema" "github.com/hashicorp/terraform-plugin-sdk/v2/terraform" ) func TestAccUpcloudTag_basic(t *testing.T) { - var providers []*schema.Provider tag1 := acctest.RandString(10) tag2 := acctest.RandString(10) expectedNames := []string{tag1, tag2} resource.ParallelTest(t, resource.TestCase{ - PreCheck: func() { testAccPreCheck(t) }, - ProviderFactories: testAccProviderFactories(&providers), - CheckDestroy: testAccCheckTagDestroy, + PreCheck: func() { testAccPreCheck(t) }, + ProtoV5ProviderFactories: testAccProviderFactories, + CheckDestroy: testAccCheckTagDestroy, Steps: []resource.TestStep{ { Config: testUpcloudTagInstanceConfig(expectedNames), @@ -47,16 +45,15 @@ func TestAccUpcloudTag_basic(t *testing.T) { } func TestAccUpCloudTag_import(t *testing.T) { - var providers []*schema.Provider var tags upcloud.Tags tag1 := acctest.RandString(10) expectedNames := []string{tag1} resource.ParallelTest(t, resource.TestCase{ - PreCheck: func() { testAccPreCheck(t) }, - ProviderFactories: testAccProviderFactories(&providers), - CheckDestroy: testAccCheckTagDestroy, + PreCheck: func() { testAccPreCheck(t) }, + ProtoV5ProviderFactories: testAccProviderFactories, + CheckDestroy: testAccCheckTagDestroy, Steps: []resource.TestStep{ { Config: testUpcloudTagInstanceConfig(expectedNames), diff --git a/upcloud/sdkv2_provider.go b/upcloud/sdkv2_provider.go index deeb87409..b3ed3d2e2 100644 --- a/upcloud/sdkv2_provider.go +++ b/upcloud/sdkv2_provider.go @@ -80,7 +80,6 @@ func Provider() *schema.Provider { "upcloud_storage": storage.ResourceStorage(), "upcloud_firewall_rules": firewall.ResourceFirewallRules(), "upcloud_tag": tag.ResourceTag(), - "upcloud_network": network.SDKV2ResourceNetwork(), "upcloud_gateway": gateway.ResourceGateway(), "upcloud_gateway_connection": gateway.ResourceConnection(), "upcloud_gateway_connection_tunnel": gateway.ResourceTunnel(), diff --git a/upcloud/sdkv2_provider_test.go b/upcloud/sdkv2_provider_test.go index 32479d97b..848f3f887 100644 --- a/upcloud/sdkv2_provider_test.go +++ b/upcloud/sdkv2_provider_test.go @@ -5,36 +5,24 @@ import ( "os" "testing" + "github.com/hashicorp/terraform-plugin-go/tfprotov5" "github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema" "github.com/hashicorp/terraform-plugin-sdk/v2/terraform" ) var ( - testAccProviders map[string]*schema.Provider - testAccProviderFactories func(providers *[]*schema.Provider) map[string]func() (*schema.Provider, error) + testAccProviderFactories map[string]func() (tfprotov5.ProviderServer, error) testAccProvider *schema.Provider - testAccProviderFunc func() *schema.Provider ) func init() { testAccProvider = Provider() - testAccProviders = map[string]*schema.Provider{ - "upcloud": testAccProvider, - } + testAccProviderFactories = make(map[string]func() (tfprotov5.ProviderServer, error)) - testAccProviderFactories = func(providers *[]*schema.Provider) map[string]func() (*schema.Provider, error) { - providerNames := []string{"upcloud"} - factories := make(map[string]func() (*schema.Provider, error), len(providerNames)) - for _, name := range providerNames { - p := Provider() - factories[name] = func() (*schema.Provider, error) { //nolint:unparam - return p, nil - } - *providers = append(*providers, p) - } - return factories + testAccProviderFactories["upcloud"] = func() (tfprotov5.ProviderServer, error) { + factory, err := NewProviderServerFactory() + return factory(), err } - testAccProviderFunc = func() *schema.Provider { return testAccProvider } } func TestProvider(t *testing.T) {