Skip to content

Commit 3bd4b84

Browse files
author
Arthur Amstutz
committed
feat: Add working order using terraform-plugin-framework and add ovh_vps resource
1 parent 10ac774 commit 3bd4b84

File tree

154 files changed

+10622
-244
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

154 files changed

+10622
-244
lines changed

go.mod

+4-4
Original file line numberDiff line numberDiff line change
@@ -4,9 +4,10 @@ require (
44
github.com/google/go-cmp v0.6.0
55
github.com/hashicorp/go-cleanhttp v0.5.2
66
github.com/hashicorp/go-version v1.6.0
7-
github.com/hashicorp/terraform-plugin-framework v1.6.1
7+
github.com/hashicorp/terraform-plugin-framework v1.7.0
88
github.com/hashicorp/terraform-plugin-framework-validators v0.12.0
9-
github.com/hashicorp/terraform-plugin-go v0.22.0
9+
github.com/hashicorp/terraform-plugin-go v0.22.1
10+
github.com/hashicorp/terraform-plugin-log v0.9.0
1011
github.com/hashicorp/terraform-plugin-mux v0.15.0
1112
github.com/hashicorp/terraform-plugin-sdk/v2 v2.33.0
1213
github.com/hashicorp/terraform-plugin-testing v1.7.0
@@ -35,7 +36,6 @@ require (
3536
github.com/hashicorp/logutils v1.0.0 // indirect
3637
github.com/hashicorp/terraform-exec v0.20.0 // indirect
3738
github.com/hashicorp/terraform-json v0.21.0 // indirect
38-
github.com/hashicorp/terraform-plugin-log v0.9.0 // indirect
3939
github.com/hashicorp/terraform-registry-address v0.2.3 // indirect
4040
github.com/hashicorp/terraform-svchost v0.1.1 // indirect
4141
github.com/hashicorp/yamux v0.1.1 // indirect
@@ -60,7 +60,7 @@ require (
6060
golang.org/x/tools v0.13.0 // indirect
6161
google.golang.org/appengine v1.6.8 // indirect
6262
google.golang.org/genproto/googleapis/rpc v0.0.0-20240123012728-ef4313101c80 // indirect
63-
google.golang.org/grpc v1.62.0 // indirect
63+
google.golang.org/grpc v1.62.1 // indirect
6464
google.golang.org/protobuf v1.33.0 // indirect
6565
gopkg.in/ini.v1 v1.67.0 // indirect
6666
)

go.sum

+6-2
Original file line numberDiff line numberDiff line change
@@ -74,14 +74,16 @@ github.com/hashicorp/terraform-exec v0.20.0 h1:DIZnPsqzPGuUnq6cH8jWcPunBfY+C+M8J
7474
github.com/hashicorp/terraform-exec v0.20.0/go.mod h1:ckKGkJWbsNqFKV1itgMnE0hY9IYf1HoiekpuN0eWoDw=
7575
github.com/hashicorp/terraform-json v0.21.0 h1:9NQxbLNqPbEMze+S6+YluEdXgJmhQykRyRNd+zTI05U=
7676
github.com/hashicorp/terraform-json v0.21.0/go.mod h1:qdeBs11ovMzo5puhrRibdD6d2Dq6TyE/28JiU4tIQxk=
77-
github.com/hashicorp/terraform-plugin-framework v1.4.2 h1:P7a7VP1GZbjc4rv921Xy5OckzhoiO3ig6SGxwelD2sI=
78-
github.com/hashicorp/terraform-plugin-framework v1.4.2/go.mod h1:GWl3InPFZi2wVQmdVnINPKys09s9mLmTZr95/ngLnbY=
7977
github.com/hashicorp/terraform-plugin-framework v1.6.1 h1:hw2XrmUu8d8jVL52ekxim2IqDc+2Kpekn21xZANARLU=
8078
github.com/hashicorp/terraform-plugin-framework v1.6.1/go.mod h1:aJI+n/hBPhz1J+77GdgNfk5svW12y7fmtxe/5L5IuwI=
79+
github.com/hashicorp/terraform-plugin-framework v1.7.0 h1:wOULbVmfONnJo9iq7/q+iBOBJul5vRovaYJIu2cY/Pw=
80+
github.com/hashicorp/terraform-plugin-framework v1.7.0/go.mod h1:jY9Id+3KbZ17OMpulgnWLSfwxNVYSoYBQFTgsx044CI=
8181
github.com/hashicorp/terraform-plugin-framework-validators v0.12.0 h1:HOjBuMbOEzl7snOdOoUfE2Jgeto6JOjLVQ39Ls2nksc=
8282
github.com/hashicorp/terraform-plugin-framework-validators v0.12.0/go.mod h1:jfHGE/gzjxYz6XoUwi/aYiiKrJDeutQNUtGQXkaHklg=
8383
github.com/hashicorp/terraform-plugin-go v0.22.0 h1:1OS1Jk5mO0f5hrziWJGXXIxBrMe2j/B8E+DVGw43Xmc=
8484
github.com/hashicorp/terraform-plugin-go v0.22.0/go.mod h1:mPULV91VKss7sik6KFEcEu7HuTogMLLO/EvWCuFkRVE=
85+
github.com/hashicorp/terraform-plugin-go v0.22.1 h1:iTS7WHNVrn7uhe3cojtvWWn83cm2Z6ryIUDTRO0EV7w=
86+
github.com/hashicorp/terraform-plugin-go v0.22.1/go.mod h1:qrjnqRghvQ6KnDbB12XeZ4FluclYwptntoWCr9QaXTI=
8587
github.com/hashicorp/terraform-plugin-log v0.9.0 h1:i7hOA+vdAItN1/7UrfBqBwvYPQ9TFvymaRGZED3FCV0=
8688
github.com/hashicorp/terraform-plugin-log v0.9.0/go.mod h1:rKL8egZQ/eXSyDqzLUuwUYLVdlYeamldAHSxjUFADow=
8789
github.com/hashicorp/terraform-plugin-mux v0.15.0 h1:+/+lDx0WUsIOpkAmdwBIoFU8UP9o2eZASoOnLsWbKME=
@@ -225,6 +227,8 @@ google.golang.org/genproto/googleapis/rpc v0.0.0-20240123012728-ef4313101c80 h1:
225227
google.golang.org/genproto/googleapis/rpc v0.0.0-20240123012728-ef4313101c80/go.mod h1:PAREbraiVEVGVdTZsVWjSbbTtSyGbAgIIvni8a8CD5s=
226228
google.golang.org/grpc v1.62.0 h1:HQKZ/fa1bXkX1oFOvSjmZEUL8wLSaZTjCcLAlmZRtdk=
227229
google.golang.org/grpc v1.62.0/go.mod h1:IWTG0VlJLCh1SkC58F7np9ka9mx/WNkjl4PGJaiq+QE=
230+
google.golang.org/grpc v1.62.1 h1:B4n+nfKzOICUXMgyrNd19h/I9oH0L1pizfk1d4zSgTk=
231+
google.golang.org/grpc v1.62.1/go.mod h1:IWTG0VlJLCh1SkC58F7np9ka9mx/WNkjl4PGJaiq+QE=
228232
google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw=
229233
google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc=
230234
google.golang.org/protobuf v1.33.0 h1:uNO2rsAINq/JlFpSdYEKIZ0uKD/R9cpdv0T+yoGwGmI=

ovh/order.go

+57-15
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,20 @@
11
package ovh
22

33
import (
4+
"errors"
45
"fmt"
56
"log"
67
"net/url"
78
"regexp"
89
"strings"
910
"time"
1011

12+
"github.com/hashicorp/terraform-plugin-framework/types/basetypes"
1113
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema"
1214
"github.com/hashicorp/terraform-plugin-testing/helper/resource"
1315
"github.com/ovh/go-ovh/ovh"
1416
"github.com/ovh/terraform-provider-ovh/ovh/helpers"
17+
"github.com/ovh/terraform-provider-ovh/ovh/types"
1518
)
1619

1720
var (
@@ -220,22 +223,22 @@ func genericOrderSchema(withOptions bool) map[string]*schema.Schema {
220223

221224
func orderCreateFromResource(d *schema.ResourceData, meta interface{}, product string) error {
222225
config := meta.(*Config)
223-
order := (&OrderCreateType{}).FromResource(d)
226+
order := (&OrderModel{}).FromResource(d)
224227

225228
err := orderCreate(order, config, product)
226229
if err != nil {
227230
return err
228231
}
229232

230-
d.SetId(order.OrderID)
233+
d.SetId(fmt.Sprint(order.Order.OrderId.ValueInt64()))
231234

232235
return nil
233236
}
234237

235-
func orderCreate(d *OrderCreateType, config *Config, product string) error {
238+
func orderCreate(d *OrderModel, config *Config, product string) error {
236239
// create Cart
237240
cartParams := &OrderCartCreateOpts{
238-
OvhSubsidiary: strings.ToUpper(d.OvhSubsidiary),
241+
OvhSubsidiary: strings.ToUpper(d.OvhSubsidiary.ValueString()),
239242
}
240243

241244
cart, err := orderCartCreate(config, cartParams, true)
@@ -245,8 +248,9 @@ func orderCreate(d *OrderCreateType, config *Config, product string) error {
245248

246249
// Create Product Item
247250
item := &OrderCartItem{}
248-
cartPlanParams := d.Plans[0]
249-
cartPlanParams.Quantity = 1
251+
cartPlanParamsList := d.Plan.Elements()
252+
cartPlanParams := cartPlanParamsList[0].(PlanValue)
253+
cartPlanParams.Quantity = types.TfInt64Value{Int64Value: basetypes.NewInt64Value(1)}
250254

251255
log.Printf("[DEBUG] Will create order item %s for cart: %s", product, cart.CartId)
252256
endpoint := fmt.Sprintf("/order/cart/%s/%s", url.PathEscape(cart.CartId), product)
@@ -255,7 +259,9 @@ func orderCreate(d *OrderCreateType, config *Config, product string) error {
255259
}
256260

257261
// apply configurations
258-
for _, cfg := range cartPlanParams.Configuration {
262+
configs := cartPlanParams.Configuration.Elements()
263+
264+
for _, cfg := range configs {
259265
log.Printf("[DEBUG] Will create order cart item configuration for cart item: %s/%d",
260266
item.CartId,
261267
item.ItemId,
@@ -270,21 +276,25 @@ func orderCreate(d *OrderCreateType, config *Config, product string) error {
270276
}
271277
}
272278

279+
planOptionValue := d.PlanOption.Elements()
280+
273281
// Create Product Options Items
274-
for _, option := range d.PlanOptions {
282+
for _, option := range planOptionValue {
283+
opt := option.(PlanOptionValue)
284+
275285
log.Printf("[DEBUG] Will create order item options %s for cart: %s", product, cart.CartId)
276286
productOptionsItem := &OrderCartItem{}
277287

278-
option.ItemId = item.ItemId
279-
option.Quantity = 1
288+
opt.ItemId = types.TfInt64Value{Int64Value: basetypes.NewInt64Value(item.ItemId)}
289+
opt.Quantity = types.TfInt64Value{Int64Value: basetypes.NewInt64Value(1)}
280290

281291
endpoint := fmt.Sprintf("/order/cart/%s/%s/options", url.PathEscape(cart.CartId), product)
282-
if err := config.OVHClient.Post(endpoint, option, productOptionsItem); err != nil {
292+
if err := config.OVHClient.Post(endpoint, opt, productOptionsItem); err != nil {
283293
return fmt.Errorf("calling Post %s with params %v:\n\t %q", endpoint, cartPlanParams, err)
284294
}
285295

286-
// apply configurations
287-
for _, cfg := range option.Configuration {
296+
optionConfigs := opt.Configuration.Elements()
297+
for _, cfg := range optionConfigs {
288298
log.Printf("[DEBUG] Will create order cart item configuration for cart item: %s/%d",
289299
item.CartId,
290300
item.ItemId,
@@ -380,7 +390,7 @@ func orderCreate(d *OrderCreateType, config *Config, product string) error {
380390
return fmt.Errorf("waiting for order (%d): %s", checkout.OrderID, err)
381391
}
382392

383-
d.OrderID = fmt.Sprint(checkout.OrderID)
393+
d.Order.OrderId = types.TfInt64Value{Int64Value: basetypes.NewInt64Value(checkout.OrderID)}
384394

385395
return nil
386396
}
@@ -422,7 +432,7 @@ func orderRead(orderId string, config *Config) (*MeOrder, []*MeOrderDetail, erro
422432
}
423433

424434
if len(details) < 1 {
425-
return nil, nil, fmt.Errorf("There is no order details for id %s. This shouldn't happen. This is a bug with the API.", orderId)
435+
return nil, nil, fmt.Errorf("there is no order details for id %s. This shouldn't happen. This is a bug with the API", orderId)
426436
}
427437

428438
return order, details, nil
@@ -522,6 +532,38 @@ func orderDetails(c *ovh.Client, orderId int64) ([]*MeOrderDetail, error) {
522532
return details, nil
523533
}
524534

535+
func serviceNameFromOrder(c *ovh.Client, orderId int64, plan string) (string, error) {
536+
detailIds := []int64{}
537+
endpoint := fmt.Sprintf("/me/order/%d/details", orderId)
538+
if err := c.Get(endpoint, &detailIds); err != nil {
539+
return "", fmt.Errorf("calling get %s:\n\t %q", endpoint, err)
540+
}
541+
542+
for _, detailId := range detailIds {
543+
detailExtension := &MeOrderDetailExtension{}
544+
log.Printf("[DEBUG] Will read order detail extension %d/%d", orderId, detailId)
545+
endpoint := fmt.Sprintf("/me/order/%d/details/%d/extension", orderId, detailId)
546+
if err := c.Get(endpoint, detailExtension); err != nil {
547+
return "", fmt.Errorf("calling get %s:\n\t %q", endpoint, err)
548+
}
549+
550+
if detailExtension.Order.Plan.Code != plan {
551+
continue
552+
}
553+
554+
detail := &MeOrderDetail{}
555+
log.Printf("[DEBUG] Will read order detail %d/%d", orderId, detailId)
556+
endpoint = fmt.Sprintf("/me/order/%d/details/%d", orderId, detailId)
557+
if err := c.Get(endpoint, detail); err != nil {
558+
return "", fmt.Errorf("calling get %s:\n\t %q", endpoint, err)
559+
}
560+
561+
return detail.Domain, nil
562+
}
563+
564+
return "", errors.New("serviceName not found")
565+
}
566+
525567
func waitForOrder(c *ovh.Client, id int64) resource.StateRefreshFunc {
526568
return func() (interface{}, string, error) {
527569
var r string

0 commit comments

Comments
 (0)