Skip to content

Commit a9f25e5

Browse files
author
Arthur Amstutz
committed
feat: Add resource ovh_dbaas_logs_token
1 parent b04221a commit a9f25e5

6 files changed

+391
-0
lines changed

ovh/provider_new.go

+1
Original file line numberDiff line numberDiff line change
@@ -188,6 +188,7 @@ func (p *OvhProvider) DataSources(_ context.Context) []func() datasource.DataSou
188188
func (p *OvhProvider) Resources(_ context.Context) []func() resource.Resource {
189189
return []func() resource.Resource{
190190
NewCloudProjectAlertingResource,
191+
NewDbaasLogsTokenResource,
191192
NewDomainZoneDnssecResource,
192193
NewIpFirewallResource,
193194
NewIpFirewallRuleResource,

ovh/resource_dbaas_logs_token.go

+153
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,153 @@
1+
package ovh
2+
3+
import (
4+
"context"
5+
"fmt"
6+
"net/url"
7+
8+
"github.com/hashicorp/terraform-plugin-framework/resource"
9+
)
10+
11+
var _ resource.ResourceWithConfigure = (*dbaasLogsTokenResource)(nil)
12+
13+
func NewDbaasLogsTokenResource() resource.Resource {
14+
return &dbaasLogsTokenResource{}
15+
}
16+
17+
type dbaasLogsTokenResource struct {
18+
config *Config
19+
}
20+
21+
func (r *dbaasLogsTokenResource) Metadata(ctx context.Context, req resource.MetadataRequest, resp *resource.MetadataResponse) {
22+
resp.TypeName = req.ProviderTypeName + "_dbaas_logs_token"
23+
}
24+
25+
func (d *dbaasLogsTokenResource) Configure(_ context.Context, req resource.ConfigureRequest, resp *resource.ConfigureResponse) {
26+
if req.ProviderData == nil {
27+
return
28+
}
29+
30+
config, ok := req.ProviderData.(*Config)
31+
if !ok {
32+
resp.Diagnostics.AddError(
33+
"Unexpected Resource Configure Type",
34+
fmt.Sprintf("Expected *Config, got: %T. Please report this issue to the provider developers.", req.ProviderData),
35+
)
36+
return
37+
}
38+
39+
d.config = config
40+
}
41+
42+
func (d *dbaasLogsTokenResource) Schema(ctx context.Context, req resource.SchemaRequest, resp *resource.SchemaResponse) {
43+
resp.Schema = DbaasLogsTokenResourceSchema(ctx)
44+
}
45+
46+
func (r *dbaasLogsTokenResource) Create(ctx context.Context, req resource.CreateRequest, resp *resource.CreateResponse) {
47+
var (
48+
data, responseData DbaasLogsTokenModel
49+
operationData DbaasLogsTokenReadModel
50+
)
51+
52+
// Read Terraform plan data into the model
53+
resp.Diagnostics.Append(req.Plan.Get(ctx, &data)...)
54+
if resp.Diagnostics.HasError() {
55+
return
56+
}
57+
58+
// Create resource
59+
endpoint := "/dbaas/logs/" + url.PathEscape(data.ServiceName.ValueString()) + "/token"
60+
if err := r.config.OVHClient.Post(endpoint, data.ToCreate(), &operationData); err != nil {
61+
resp.Diagnostics.AddError(
62+
fmt.Sprintf("Error calling Post %s", endpoint),
63+
err.Error(),
64+
)
65+
return
66+
}
67+
68+
// Wait for operation to be done
69+
op, err := waitForDbaasLogsOperation(ctx, r.config.OVHClient, data.ServiceName.ValueString(), operationData.OperationId.ValueString())
70+
if err != nil {
71+
resp.Diagnostics.AddError("error waiting for operation to be done", err.Error())
72+
return
73+
}
74+
75+
if op.TokenID == nil {
76+
resp.Diagnostics.AddError("invalid operation state", "a tokenId should be returned in operation but is missing")
77+
return
78+
}
79+
80+
// Read created resource
81+
endpoint = "/dbaas/logs/" + url.PathEscape(data.ServiceName.ValueString()) + "/token/" + url.PathEscape(*op.TokenID)
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+
responseData.MergeWith(&data)
91+
92+
// Save data into Terraform state
93+
resp.Diagnostics.Append(resp.State.Set(ctx, &responseData)...)
94+
}
95+
96+
func (r *dbaasLogsTokenResource) Read(ctx context.Context, req resource.ReadRequest, resp *resource.ReadResponse) {
97+
var (
98+
data DbaasLogsTokenModel
99+
responseData DbaasLogsTokenReadModel
100+
)
101+
102+
// Read Terraform prior state data into the model
103+
resp.Diagnostics.Append(req.State.Get(ctx, &data)...)
104+
if resp.Diagnostics.HasError() {
105+
return
106+
}
107+
108+
endpoint := "/dbaas/logs/" + url.PathEscape(data.ServiceName.ValueString()) + "/token/" + url.PathEscape(data.TokenId.ValueString())
109+
if err := r.config.OVHClient.Get(endpoint, &responseData); err != nil {
110+
resp.Diagnostics.AddError(
111+
fmt.Sprintf("Error calling Get %s", endpoint),
112+
err.Error(),
113+
)
114+
return
115+
}
116+
117+
data.MergeWith(responseData.toModel())
118+
119+
// Save updated data into Terraform state
120+
resp.Diagnostics.Append(resp.State.Set(ctx, &data)...)
121+
}
122+
123+
func (r *dbaasLogsTokenResource) Update(ctx context.Context, req resource.UpdateRequest, resp *resource.UpdateResponse) {
124+
resp.Diagnostics.AddError("not implemented", "update func should never be called")
125+
}
126+
127+
func (r *dbaasLogsTokenResource) Delete(ctx context.Context, req resource.DeleteRequest, resp *resource.DeleteResponse) {
128+
var (
129+
data DbaasLogsTokenModel
130+
operationData DbaasLogsTokenReadModel
131+
)
132+
133+
// Read Terraform prior state data into the model
134+
resp.Diagnostics.Append(req.State.Get(ctx, &data)...)
135+
136+
if resp.Diagnostics.HasError() {
137+
return
138+
}
139+
140+
// Delete API call logic
141+
endpoint := "/dbaas/logs/" + url.PathEscape(data.ServiceName.ValueString()) + "/token/" + url.PathEscape(data.TokenId.ValueString())
142+
if err := r.config.OVHClient.Delete(endpoint, &operationData); err != nil {
143+
resp.Diagnostics.AddError(
144+
fmt.Sprintf("Error calling Delete %s", endpoint),
145+
err.Error(),
146+
)
147+
}
148+
149+
// Wait for deletion to be done
150+
if _, err := waitForDbaasLogsOperation(ctx, r.config.OVHClient, data.ServiceName.ValueString(), operationData.OperationId.ValueString()); err != nil {
151+
resp.Diagnostics.AddError("error waiting for delete operation to be done", err.Error())
152+
}
153+
}

ovh/resource_dbaas_logs_token_gen.go

+165
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

ovh/resource_dbaas_logs_token_test.go

+37
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
package ovh
2+
3+
import (
4+
"fmt"
5+
"os"
6+
"testing"
7+
8+
"github.com/hashicorp/terraform-plugin-testing/helper/resource"
9+
)
10+
11+
func TestAccResourceDbaasLogsToken_basic(t *testing.T) {
12+
serviceName := os.Getenv("OVH_DBAAS_LOGS_SERVICE_TEST")
13+
14+
config := fmt.Sprintf(`
15+
resource "ovh_dbaas_logs_token" "tok" {
16+
service_name = "%s"
17+
name = "TestToken"
18+
}
19+
`, serviceName)
20+
21+
resource.Test(t, resource.TestCase{
22+
PreCheck: func() { testAccPreCheckDbaasLogs(t) },
23+
ProtoV6ProviderFactories: testAccProtoV6ProviderFactories,
24+
Steps: []resource.TestStep{
25+
{
26+
Config: config,
27+
Check: resource.ComposeTestCheckFunc(
28+
resource.TestCheckResourceAttr("ovh_dbaas_logs_token.tok", "name", "TestToken"),
29+
resource.TestCheckResourceAttr("ovh_dbaas_logs_token.tok", "service_name", serviceName),
30+
resource.TestCheckResourceAttrSet("ovh_dbaas_logs_token.tok", "value"),
31+
resource.TestCheckResourceAttrSet("ovh_dbaas_logs_token.tok", "token_id"),
32+
resource.TestCheckResourceAttrSet("ovh_dbaas_logs_token.tok", "cluster_id"),
33+
),
34+
},
35+
},
36+
})
37+
}

ovh/types_dbaas_logs.go

+1
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@ type DbaasLogsOperation struct {
3333
State string `json:"state"`
3434
StreamId *string `json:"streamId"`
3535
SubscriptionID *string `json:"subscriptionId"`
36+
TokenID *string `json:"tokenId"`
3637
UpdatedAt string `json:"updatedAt"`
3738
}
3839

0 commit comments

Comments
 (0)