/
resource_vrack.go
142 lines (118 loc) · 3.5 KB
/
resource_vrack.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
package ovh
import (
"fmt"
"log"
"net/url"
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema"
"github.com/ovh/terraform-provider-ovh/ovh/helpers"
)
func resourceVrack() *schema.Resource {
return &schema.Resource{
Create: resourceVrackCreate,
Update: resourceVrackUpdate,
Read: resourceVrackRead,
Delete: resourceVrackDelete,
Importer: &schema.ResourceImporter{
State: func(d *schema.ResourceData, meta interface{}) ([]*schema.ResourceData, error) {
return []*schema.ResourceData{d}, nil
},
},
Schema: resourceVrackSchema(),
}
}
func resourceVrackSchema() map[string]*schema.Schema {
schema := map[string]*schema.Schema{
"description": {
Type: schema.TypeString,
Description: "yourvrackdescription",
Optional: true,
Computed: true,
},
"name": {
Type: schema.TypeString,
Description: "yourvrackname",
Optional: true,
Computed: true,
},
// computed
"urn": {
Type: schema.TypeString,
Computed: true,
},
"service_name": {
Type: schema.TypeString,
Description: "The internal name of your vrack",
Computed: true,
},
}
for k, v := range genericOrderSchema(false) {
schema[k] = v
}
return schema
}
func resourceVrackCreate(d *schema.ResourceData, meta interface{}) error {
// Order vRack and wait for it to be delivered
if err := orderCreateFromResource(d, meta, "vrack"); err != nil {
return fmt.Errorf("could not order vrack: %q", err)
}
// Retrieve serviceName from order ID
_, details, err := orderReadInResource(d, meta)
if err != nil {
return fmt.Errorf("could not read vrack order: %q", err)
}
serviceName := details[0].Domain
d.SetId(serviceName)
d.Set("service_name", serviceName)
return resourceVrackUpdate(d, meta)
}
func resourceVrackUpdate(d *schema.ResourceData, meta interface{}) error {
config := meta.(*Config)
serviceName := d.Id()
log.Printf("[DEBUG] Will update vrack: %s", serviceName)
opts := (&VrackUpdateOpts{}).FromResource(d)
endpoint := fmt.Sprintf("/vrack/%s", url.PathEscape(serviceName))
if err := config.OVHClient.Put(endpoint, opts, nil); err != nil {
return fmt.Errorf("calling Put %s: %q", endpoint, err)
}
return resourceVrackRead(d, meta)
}
func resourceVrackRead(d *schema.ResourceData, meta interface{}) error {
config := meta.(*Config)
serviceName := d.Id()
d.Set("service_name", serviceName)
log.Printf("[DEBUG] Will read vrack: %s", serviceName)
r := &Vrack{}
endpoint := fmt.Sprintf("/vrack/%s", url.PathEscape(serviceName))
if err := config.OVHClient.Get(endpoint, &r); err != nil {
return helpers.CheckDeleted(d, err, endpoint)
}
// Set resource attributes
for k, v := range r.ToMap() {
d.Set(k, v)
}
// Retrieve order information
serviceObj, err := serviceFromServiceName(config.OVHClient, "vrack", serviceName)
if err != nil {
return fmt.Errorf("failed to retrieve vrack details: %w", err)
}
d.Set("plan", serviceObj.ToSDKv2PlanValue())
// Retrieve subsidiary information
var me MeResponse
if err := config.OVHClient.Get("/me", &me); err != nil {
return fmt.Errorf("error retrieving account information: %w", err)
}
d.Set("ovh_subsidiary", me.OvhSubsidiary)
return nil
}
func resourceVrackDelete(d *schema.ResourceData, meta interface{}) error {
id := d.Id()
serviceName := d.Get("service_name").(string)
log.Printf(
`[WARN] The API doesn't provide any delete mechanism for VRACK.
The vrack %s (order %s) will be forgotten without being effectively deleted.`,
serviceName,
id,
)
d.SetId("")
return nil
}