Skip to content

Commit 0e8944e

Browse files
author
David LABBE
committed
feat(vrack): add resource ovh_vrack_dedicated_cloud_datacenter
1 parent 416c59a commit 0e8944e

8 files changed

+429
-0
lines changed
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
---
2+
subcategory : "vRack"
3+
---
4+
5+
# ovh_vrack_dedicated_cloud_datacenter
6+
7+
Move a Dedicated Cloud Datacenter to a vrack.
8+
9+
## Example Usage
10+
11+
```terraform
12+
resource "ovh_vrack_dedicated_cloud_datacenter" "vrack-dedicatedCloudDatacenter" {
13+
service_name = "<vRack service name>"
14+
datacenter = "<Dedicated Cloud Datacenter service name>"
15+
target_service_name = "<vRack target service name>"
16+
}
17+
```
18+
19+
## Argument Reference
20+
21+
The following arguments are supported:
22+
23+
* `service_name` - (Required) The internal name of your vrack
24+
* `datacenter` - (Required) Your Dedicated Cloud Datacenter.
25+
* `target_service_name` - (Required) The internal name of the vrack where you want to move your datacenter.
26+
27+
## Attributes Reference
28+
29+
No additional attribute is exported.
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
resource "ovh_vrack_dedicated_cloud_datacenter" "vrack-dedicatedCloudDatacenter" {
2+
service_name = "<vRack service name>"
3+
datacenter = "<Dedicated Cloud Datacenter service name>"
4+
target_service_name = "<vRack target service name>"
5+
}

ovh/provider_new.go

+1
Original file line numberDiff line numberDiff line change
@@ -260,6 +260,7 @@ func (p *OvhProvider) Resources(_ context.Context) []func() resource.Resource {
260260
NewOkmsServiceKeyJwkResource,
261261
NewVpsResource,
262262
NewVrackOvhcloudconnectResource,
263+
NewVrackDedicatedCloudDatacenterResource,
263264
}
264265
}
265266

ovh/provider_test.go

+9
Original file line numberDiff line numberDiff line change
@@ -350,6 +350,15 @@ func testAccPreCheckOCCVRack(t *testing.T) {
350350
checkEnvOrSkip(t, "OVH_VRACK_OVH_CLOUD_CONNECT")
351351
}
352352

353+
// Checks that the environment variables needed for the /vrack/{service}/dedicatedCloudDatacenter/{datacenter} acceptance tests
354+
// are set.
355+
func testAccPreCheckDedicatedCloudDatacenter(t *testing.T) {
356+
testAccPreCheckCredentials(t)
357+
checkEnvOrSkip(t, "OVH_VRACK_SERVICE_TEST")
358+
checkEnvOrSkip(t, "OVH_VRACK_DEDICATED_CLOUD_DATACENTER")
359+
checkEnvOrSkip(t, "OVH_VRACK_TARGET_SERVICE_TEST")
360+
}
361+
353362
// Checks that the environment variables needed for the /ipLoadbalacing acceptance tests
354363
// are set.
355364
func testAccPreCheckIpLoadbalancing(t *testing.T) {
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,149 @@
1+
package ovh
2+
3+
import (
4+
"context"
5+
"fmt"
6+
"net/url"
7+
8+
"github.com/hashicorp/terraform-plugin-framework/resource"
9+
"golang.org/x/exp/slices"
10+
)
11+
12+
var _ resource.ResourceWithConfigure = (*vrackDedicatedCloudDatacenterResource)(nil)
13+
14+
func NewVrackDedicatedCloudDatacenterResource() resource.Resource {
15+
return &vrackDedicatedCloudDatacenterResource{}
16+
}
17+
18+
type vrackDedicatedCloudDatacenterResource struct {
19+
config *Config
20+
}
21+
22+
func (r *vrackDedicatedCloudDatacenterResource) Metadata(ctx context.Context, req resource.MetadataRequest, resp *resource.MetadataResponse) {
23+
resp.TypeName = req.ProviderTypeName + "_vrack_dedicated_cloud_datacenter"
24+
}
25+
26+
func (d *vrackDedicatedCloudDatacenterResource) 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 *vrackDedicatedCloudDatacenterResource) Schema(ctx context.Context, req resource.SchemaRequest, resp *resource.SchemaResponse) {
44+
resp.Schema = VrackDedicatedCloudDatacenterResourceSchema(ctx)
45+
}
46+
47+
func (r *vrackDedicatedCloudDatacenterResource) Create(ctx context.Context, req resource.CreateRequest, resp *resource.CreateResponse) {
48+
var data, responseData VrackDedicatedCloudDatacenterModel
49+
var allowedVrack []string
50+
var task VrackTask
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+
currentServiceName := data.ServiceName.ValueString()
59+
if !data.Vrack.IsUnknown() && !data.Vrack.IsNull() {
60+
currentServiceName = data.Vrack.ValueString()
61+
}
62+
63+
endpoint := "/vrack/" + url.PathEscape(currentServiceName) + "/dedicatedCloudDatacenter/" + url.PathEscape(data.Datacenter.ValueString()) + "/allowedVrack"
64+
if err := r.config.OVHClient.Get(endpoint, &allowedVrack); err != nil {
65+
resp.Diagnostics.AddError(
66+
fmt.Sprintf("Error calling Get %s, 404 means either resource does not exist or the datacenter is not in the vrack", endpoint),
67+
err.Error(),
68+
)
69+
return
70+
}
71+
72+
if !slices.Contains(allowedVrack, data.TargetServiceName.ValueString()) {
73+
resp.Diagnostics.AddError(
74+
fmt.Sprintf("Error target_service_name '%s' is not an allowed vrack", data.TargetServiceName.ValueString()),
75+
fmt.Sprintf("Allowed vrack %v", allowedVrack),
76+
)
77+
return
78+
}
79+
80+
endpoint = "/vrack/" + url.PathEscape(currentServiceName) + "/dedicatedCloudDatacenter/" + url.PathEscape(data.Datacenter.ValueString()) + "/move"
81+
if err := r.config.OVHClient.Post(endpoint, data.ToCreate(), &task); err != nil {
82+
resp.Diagnostics.AddError(
83+
fmt.Sprintf("Error calling Post %s", endpoint),
84+
err.Error(),
85+
)
86+
return
87+
}
88+
89+
if err := waitForVrackTask(&task, r.config.OVHClient); err != nil {
90+
resp.Diagnostics.AddError(
91+
fmt.Sprintf("error waiting for vrack (%s) to attach dedicatedCloudDatacenter %v: %s", task.ServiceName, data.Datacenter.String(), err),
92+
err.Error(),
93+
)
94+
return
95+
}
96+
97+
endpoint = "/vrack/" + url.PathEscape(data.TargetServiceName.ValueString()) + "/dedicatedCloudDatacenter/" + url.PathEscape(data.Datacenter.ValueString())
98+
99+
if err := r.config.OVHClient.Get(endpoint, &responseData); err != nil {
100+
resp.Diagnostics.AddError(
101+
fmt.Sprintf("Error calling Get %s", endpoint),
102+
err.Error(),
103+
)
104+
return
105+
}
106+
107+
data.MergeWith(&responseData)
108+
109+
// Save updated data into Terraform state
110+
resp.Diagnostics.Append(resp.State.Set(ctx, &data)...)
111+
}
112+
113+
func (r *vrackDedicatedCloudDatacenterResource) Read(ctx context.Context, req resource.ReadRequest, resp *resource.ReadResponse) {
114+
var data, responseData VrackDedicatedCloudDatacenterModel
115+
116+
// Read Terraform prior state data into the model
117+
resp.Diagnostics.Append(req.State.Get(ctx, &data)...)
118+
if resp.Diagnostics.HasError() {
119+
return
120+
}
121+
122+
currentServiceName := data.ServiceName.ValueString()
123+
if !data.Vrack.IsUnknown() && !data.Vrack.IsNull() {
124+
currentServiceName = data.Vrack.ValueString()
125+
}
126+
127+
endpoint := "/vrack/" + url.PathEscape(currentServiceName) + "/dedicatedCloudDatacenter/" + url.PathEscape(data.Datacenter.ValueString())
128+
129+
if err := r.config.OVHClient.Get(endpoint, &responseData); err != nil {
130+
resp.Diagnostics.AddError(
131+
fmt.Sprintf("Error calling Get %s", endpoint),
132+
err.Error(),
133+
)
134+
return
135+
}
136+
137+
data.MergeWith(&responseData)
138+
139+
// Save updated data into Terraform state
140+
resp.Diagnostics.Append(resp.State.Set(ctx, &data)...)
141+
}
142+
143+
func (r *vrackDedicatedCloudDatacenterResource) Update(ctx context.Context, _ resource.UpdateRequest, resp *resource.UpdateResponse) {
144+
resp.Diagnostics.AddError("not implemented", "update func should never be called")
145+
}
146+
147+
func (r *vrackDedicatedCloudDatacenterResource) Delete(ctx context.Context, req resource.DeleteRequest, resp *resource.DeleteResponse) {
148+
return
149+
}

ovh/resource_vrack_dedicated_cloud_datacenter_gen.go

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

0 commit comments

Comments
 (0)