Skip to content

Commit 50f834b

Browse files
committed
feat(okms): add resource for kms service keys
1 parent d8b9771 commit 50f834b

File tree

3 files changed

+460
-0
lines changed

3 files changed

+460
-0
lines changed

ovh/provider_new.go

+9
Original file line numberDiff line numberDiff line change
@@ -202,6 +202,12 @@ func (p *OvhProvider) DataSources(_ context.Context) []func() datasource.DataSou
202202
NewIpFirewallDataSource,
203203
NewIpFirewallRuleDataSource,
204204
NewIpMitigationDataSource,
205+
NewOkmsCredentialDataSource,
206+
NewOkmsCredentialsDataSource,
207+
NewOkmsResourceDataSource,
208+
NewOkmsServiceKeysDataSource,
209+
NewOkmsServiceKeyDataSource,
210+
NewOkmsServiceKeyJwkDataSource,
205211
}
206212
}
207213

@@ -216,6 +222,9 @@ func (p *OvhProvider) Resources(_ context.Context) []func() resource.Resource {
216222
NewIpFirewallRuleResource,
217223
NewIploadbalancingUdpFrontendResource,
218224
NewIpMitigationResource,
225+
NewOkmsResource,
226+
NewOkmsCredentialResource,
227+
NewOkmsServiceKeyResource,
219228
NewVpsResource,
220229
}
221230
}

ovh/resource_okms_service_key.go

+165
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,165 @@
1+
package ovh
2+
3+
import (
4+
"context"
5+
"fmt"
6+
"net/url"
7+
8+
"github.com/hashicorp/terraform-plugin-framework/resource"
9+
ovhtypes "github.com/ovh/terraform-provider-ovh/ovh/types"
10+
)
11+
12+
var _ resource.ResourceWithConfigure = (*okmsServiceKeyResource)(nil)
13+
14+
func NewOkmsServiceKeyResource() resource.Resource {
15+
return &okmsServiceKeyResource{}
16+
}
17+
18+
type okmsServiceKeyResource struct {
19+
config *Config
20+
}
21+
22+
func (r *okmsServiceKeyResource) Metadata(ctx context.Context, req resource.MetadataRequest, resp *resource.MetadataResponse) {
23+
resp.TypeName = req.ProviderTypeName + "_okms_service_key"
24+
}
25+
26+
func (d *okmsServiceKeyResource) Configure(_ context.Context, req resource.ConfigureRequest, resp *resource.ConfigureResponse) {
27+
if req.ProviderData == nil {
28+
return
29+
}
30+
31+
config, ok := req.ProviderData.(*Config)
32+
if !ok {
33+
resp.Diagnostics.AddError(
34+
"Unexpected Resource Configure Type",
35+
fmt.Sprintf("Expected *Config, got: %T. Please report this issue to the provider developers.", req.ProviderData),
36+
)
37+
return
38+
}
39+
40+
d.config = config
41+
}
42+
43+
func (d *okmsServiceKeyResource) Schema(ctx context.Context, req resource.SchemaRequest, resp *resource.SchemaResponse) {
44+
resp.Schema = OkmsServiceKeyResourceSchema(ctx)
45+
}
46+
47+
func (r *okmsServiceKeyResource) Create(ctx context.Context, req resource.CreateRequest, resp *resource.CreateResponse) {
48+
var data, responseData OkmsServiceKeyResourceModel
49+
50+
// Read Terraform plan data into the model
51+
resp.Diagnostics.Append(req.Plan.Get(ctx, &data)...)
52+
if resp.Diagnostics.HasError() {
53+
return
54+
}
55+
56+
endpoint := "/v2/okms/resource/" + url.PathEscape(data.OkmsId.ValueString()) + "/serviceKey"
57+
if err := r.config.OVHClient.Post(endpoint, data.ToCreate(), &responseData); err != nil {
58+
resp.Diagnostics.AddError(
59+
fmt.Sprintf("Error calling Post %s", endpoint),
60+
err.Error(),
61+
)
62+
return
63+
}
64+
65+
responseData.MergeWith(&data)
66+
67+
// Save data into Terraform state
68+
resp.Diagnostics.Append(resp.State.Set(ctx, &responseData)...)
69+
}
70+
71+
func (r *okmsServiceKeyResource) Read(ctx context.Context, req resource.ReadRequest, resp *resource.ReadResponse) {
72+
var data, responseData OkmsServiceKeyResourceModel
73+
74+
// Read Terraform prior state data into the model
75+
resp.Diagnostics.Append(req.State.Get(ctx, &data)...)
76+
if resp.Diagnostics.HasError() {
77+
return
78+
}
79+
80+
endpoint := "/v2/okms/resource/" + url.PathEscape(data.OkmsId.ValueString()) + "/serviceKey/" + url.PathEscape(data.Id.ValueString())
81+
82+
if err := r.config.OVHClient.Get(endpoint, &responseData); err != nil {
83+
resp.Diagnostics.AddError(
84+
fmt.Sprintf("Error calling Get %s", endpoint),
85+
err.Error(),
86+
)
87+
return
88+
}
89+
90+
data.MergeWith(&responseData)
91+
92+
// Save updated data into Terraform state
93+
resp.Diagnostics.Append(resp.State.Set(ctx, &data)...)
94+
}
95+
96+
func (r *okmsServiceKeyResource) Update(ctx context.Context, req resource.UpdateRequest, resp *resource.UpdateResponse) {
97+
var data, planData, responseData OkmsServiceKeyResourceModel
98+
99+
// Read Terraform plan data into the model
100+
resp.Diagnostics.Append(req.Plan.Get(ctx, &planData)...)
101+
if resp.Diagnostics.HasError() {
102+
return
103+
}
104+
105+
// Read Terraform prior state data into the model
106+
resp.Diagnostics.Append(req.State.Get(ctx, &data)...)
107+
if resp.Diagnostics.HasError() {
108+
return
109+
}
110+
111+
// Update resource
112+
endpoint := "/v2/okms/resource/" + url.PathEscape(data.OkmsId.ValueString()) + "/serviceKey/" + url.PathEscape(data.Id.ValueString())
113+
if err := r.config.OVHClient.Put(endpoint, planData.ToUpdate(), nil); err != nil {
114+
resp.Diagnostics.AddError(
115+
fmt.Sprintf("Error calling Put %s", endpoint),
116+
err.Error(),
117+
)
118+
return
119+
}
120+
121+
// Read updated resource
122+
if err := r.config.OVHClient.Get(endpoint, &responseData); err != nil {
123+
resp.Diagnostics.AddError(
124+
fmt.Sprintf("Error calling Get %s", endpoint),
125+
err.Error(),
126+
)
127+
return
128+
}
129+
130+
responseData.MergeWith(&planData)
131+
132+
// Save updated data into Terraform state
133+
resp.Diagnostics.Append(resp.State.Set(ctx, &responseData)...)
134+
}
135+
136+
func (r *okmsServiceKeyResource) Delete(ctx context.Context, req resource.DeleteRequest, resp *resource.DeleteResponse) {
137+
var data OkmsServiceKeyResourceModel
138+
139+
// Read Terraform prior state data into the model
140+
resp.Diagnostics.Append(req.State.Get(ctx, &data)...)
141+
142+
if resp.Diagnostics.HasError() {
143+
return
144+
}
145+
146+
data.State = ovhtypes.NewTfStringValue("DEACTIVATED")
147+
data.DeactivationReason = ovhtypes.NewTfStringValue("UNSPECIFIED")
148+
// Deactivate key first
149+
endpoint := "/v2/okms/resource/" + url.PathEscape(data.OkmsId.ValueString()) + "/serviceKey/" + url.PathEscape(data.Id.ValueString())
150+
if err := r.config.OVHClient.Put(endpoint, data.ToUpdate(), nil); err != nil {
151+
resp.Diagnostics.AddError(
152+
fmt.Sprintf("Error deactivating key %s", endpoint),
153+
err.Error(),
154+
)
155+
return
156+
}
157+
158+
// Delete API call logic
159+
if err := r.config.OVHClient.Delete(endpoint, nil); err != nil {
160+
resp.Diagnostics.AddError(
161+
fmt.Sprintf("Error calling Delete %s", endpoint),
162+
err.Error(),
163+
)
164+
}
165+
}

0 commit comments

Comments
 (0)