Skip to content

Commit 9da2c3d

Browse files
author
Arthur Amstutz
committed
feat: Add resource ovh_cloud_project_region_storage
1 parent 6dacc87 commit 9da2c3d

5 files changed

+4966
-0
lines changed

ovh/provider_new.go

+1
Original file line numberDiff line numberDiff line change
@@ -222,6 +222,7 @@ func (p *OvhProvider) Resources(_ context.Context) []func() resource.Resource {
222222
NewCloudProjectAlertingResource,
223223
NewCloudProjectGatewayInterfaceResource,
224224
NewCloudProjectRegionNetworkResource,
225+
NewCloudProjectRegionStorageResource,
225226
NewCloudProjectVolumeResource,
226227
NewDbaasLogsTokenResource,
227228
NewDedicatedServerResource,
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,167 @@
1+
package ovh
2+
3+
import (
4+
"context"
5+
"fmt"
6+
"net/url"
7+
"strings"
8+
9+
"github.com/hashicorp/terraform-plugin-framework/path"
10+
"github.com/hashicorp/terraform-plugin-framework/resource"
11+
)
12+
13+
var _ resource.ResourceWithConfigure = (*cloudProjectRegionStorageResource)(nil)
14+
15+
func NewCloudProjectRegionStorageResource() resource.Resource {
16+
return &cloudProjectRegionStorageResource{}
17+
}
18+
19+
type cloudProjectRegionStorageResource struct {
20+
config *Config
21+
}
22+
23+
func (r *cloudProjectRegionStorageResource) Metadata(ctx context.Context, req resource.MetadataRequest, resp *resource.MetadataResponse) {
24+
resp.TypeName = req.ProviderTypeName + "_cloud_project_region_storage"
25+
}
26+
27+
func (d *cloudProjectRegionStorageResource) Configure(_ context.Context, req resource.ConfigureRequest, resp *resource.ConfigureResponse) {
28+
if req.ProviderData == nil {
29+
return
30+
}
31+
32+
config, ok := req.ProviderData.(*Config)
33+
if !ok {
34+
resp.Diagnostics.AddError(
35+
"Unexpected Resource Configure Type",
36+
fmt.Sprintf("Expected *Config, got: %T. Please report this issue to the provider developers.", req.ProviderData),
37+
)
38+
return
39+
}
40+
41+
d.config = config
42+
}
43+
44+
func (d *cloudProjectRegionStorageResource) Schema(ctx context.Context, req resource.SchemaRequest, resp *resource.SchemaResponse) {
45+
resp.Schema = CloudProjectRegionStorageResourceSchema(ctx)
46+
}
47+
48+
func (r *cloudProjectRegionStorageResource) ImportState(ctx context.Context, req resource.ImportStateRequest, resp *resource.ImportStateResponse) {
49+
splits := strings.Split(req.ID, "/")
50+
if len(splits) != 3 {
51+
resp.Diagnostics.AddError("Given ID is malformed", "ID must be formatted like the following: <service_name>/<region_name>/<storage_name>")
52+
return
53+
}
54+
55+
resp.Diagnostics.Append(resp.State.SetAttribute(ctx, path.Root("service_name"), splits[0])...)
56+
resp.Diagnostics.Append(resp.State.SetAttribute(ctx, path.Root("region_name"), splits[1])...)
57+
resp.Diagnostics.Append(resp.State.SetAttribute(ctx, path.Root("name"), splits[2])...)
58+
}
59+
60+
func (r *cloudProjectRegionStorageResource) Create(ctx context.Context, req resource.CreateRequest, resp *resource.CreateResponse) {
61+
var data, responseData CloudProjectRegionStorageModel
62+
63+
// Read Terraform plan data into the model
64+
resp.Diagnostics.Append(req.Plan.Get(ctx, &data)...)
65+
if resp.Diagnostics.HasError() {
66+
return
67+
}
68+
69+
endpoint := "/cloud/project/" + url.PathEscape(data.ServiceName.ValueString()) + "/region/" + url.PathEscape(data.RegionName.ValueString()) + "/storage"
70+
if err := r.config.OVHClient.Post(endpoint, data.ToCreate(), &responseData); err != nil {
71+
resp.Diagnostics.AddError(
72+
fmt.Sprintf("Error calling Post %s", endpoint),
73+
err.Error(),
74+
)
75+
return
76+
}
77+
78+
responseData.MergeWith(&data)
79+
80+
// Save data into Terraform state
81+
resp.Diagnostics.Append(resp.State.Set(ctx, &responseData)...)
82+
}
83+
84+
func (r *cloudProjectRegionStorageResource) Read(ctx context.Context, req resource.ReadRequest, resp *resource.ReadResponse) {
85+
var data, responseData CloudProjectRegionStorageModel
86+
87+
// Read Terraform prior state data into the model
88+
resp.Diagnostics.Append(req.State.Get(ctx, &data)...)
89+
if resp.Diagnostics.HasError() {
90+
return
91+
}
92+
93+
endpoint := "/cloud/project/" + url.PathEscape(data.ServiceName.ValueString()) + "/region/" + url.PathEscape(data.RegionName.ValueString()) + "/storage/" + url.PathEscape(data.Name.ValueString())
94+
if err := r.config.OVHClient.Get(endpoint, &responseData); err != nil {
95+
resp.Diagnostics.AddError(
96+
fmt.Sprintf("Error calling Get %s", endpoint),
97+
err.Error(),
98+
)
99+
return
100+
}
101+
102+
data.MergeWith(&responseData)
103+
104+
// Save updated data into Terraform state
105+
resp.Diagnostics.Append(resp.State.Set(ctx, &data)...)
106+
}
107+
108+
func (r *cloudProjectRegionStorageResource) Update(ctx context.Context, req resource.UpdateRequest, resp *resource.UpdateResponse) {
109+
var data, planData, responseData CloudProjectRegionStorageModel
110+
111+
// Read Terraform plan data into the model
112+
resp.Diagnostics.Append(req.Plan.Get(ctx, &planData)...)
113+
if resp.Diagnostics.HasError() {
114+
return
115+
}
116+
117+
// Read Terraform prior state data into the model
118+
resp.Diagnostics.Append(req.State.Get(ctx, &data)...)
119+
if resp.Diagnostics.HasError() {
120+
return
121+
}
122+
123+
// Update resource
124+
endpoint := "/cloud/project/" + url.PathEscape(data.ServiceName.ValueString()) + "/region/" + url.PathEscape(data.RegionName.ValueString()) + "/storage/" + url.PathEscape(data.Name.ValueString())
125+
if err := r.config.OVHClient.Put(endpoint, planData.ToUpdate(), nil); err != nil {
126+
resp.Diagnostics.AddError(
127+
fmt.Sprintf("Error calling Put %s", endpoint),
128+
err.Error(),
129+
)
130+
return
131+
}
132+
133+
// Read updated resource
134+
endpoint = "/cloud/project/" + url.PathEscape(data.ServiceName.ValueString()) + "/region/" + url.PathEscape(data.RegionName.ValueString()) + "/storage/" + url.PathEscape(data.Name.ValueString())
135+
if err := r.config.OVHClient.Get(endpoint, &responseData); err != nil {
136+
resp.Diagnostics.AddError(
137+
fmt.Sprintf("Error calling Get %s", endpoint),
138+
err.Error(),
139+
)
140+
return
141+
}
142+
143+
responseData.MergeWith(&planData)
144+
145+
// Save updated data into Terraform state
146+
resp.Diagnostics.Append(resp.State.Set(ctx, &responseData)...)
147+
}
148+
149+
func (r *cloudProjectRegionStorageResource) Delete(ctx context.Context, req resource.DeleteRequest, resp *resource.DeleteResponse) {
150+
var data CloudProjectRegionStorageModel
151+
152+
// Read Terraform prior state data into the model
153+
resp.Diagnostics.Append(req.State.Get(ctx, &data)...)
154+
155+
if resp.Diagnostics.HasError() {
156+
return
157+
}
158+
159+
// Delete API call logic
160+
endpoint := "/cloud/project/" + url.PathEscape(data.ServiceName.ValueString()) + "/region/" + url.PathEscape(data.RegionName.ValueString()) + "/storage/" + url.PathEscape(data.Name.ValueString())
161+
if err := r.config.OVHClient.Delete(endpoint, nil); err != nil {
162+
resp.Diagnostics.AddError(
163+
fmt.Sprintf("Error calling Delete %s", endpoint),
164+
err.Error(),
165+
)
166+
}
167+
}

0 commit comments

Comments
 (0)