Skip to content

Commit 0948b7a

Browse files
author
yann degat
committed
new datasources: ovh_dedicated_servers, ovh_dedicated_server
1 parent fc5f066 commit 0948b7a

10 files changed

+547
-8
lines changed
+274
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,274 @@
1+
package ovh
2+
3+
import (
4+
"fmt"
5+
"log"
6+
7+
"github.com/hashicorp/terraform-plugin-sdk/helper/schema"
8+
)
9+
10+
func dataSourceDedicatedServer() *schema.Resource {
11+
return &schema.Resource{
12+
Read: dataSourceDedicatedServerRead,
13+
Schema: map[string]*schema.Schema{
14+
"service_name": {
15+
Type: schema.TypeString,
16+
Required: true,
17+
},
18+
19+
// Computed
20+
"boot_id": {
21+
Type: schema.TypeInt,
22+
Computed: true,
23+
Description: "",
24+
},
25+
"commercial_range": {
26+
Type: schema.TypeString,
27+
Computed: true,
28+
Description: "dedicater server commercial range",
29+
},
30+
"datacenter": {
31+
Type: schema.TypeString,
32+
Computed: true,
33+
Description: "dedicated datacenter localisation (bhs1,bhs2,...)",
34+
},
35+
"ip": {
36+
Type: schema.TypeString,
37+
Computed: true,
38+
Description: "dedicated server ip (IPv4)",
39+
},
40+
"link_speed": {
41+
Type: schema.TypeInt,
42+
Computed: true,
43+
Description: "",
44+
},
45+
"monitoring": {
46+
Type: schema.TypeBool,
47+
Computed: true,
48+
Description: "Icmp monitoring state",
49+
},
50+
"name": {
51+
Type: schema.TypeString,
52+
Computed: true,
53+
Description: "dedicated server name",
54+
},
55+
"os": {
56+
Type: schema.TypeString,
57+
Computed: true,
58+
Description: "Operating system",
59+
},
60+
"professional_use": {
61+
Type: schema.TypeBool,
62+
Computed: true,
63+
Description: "Does this server have professional use option",
64+
},
65+
"rack": {
66+
Type: schema.TypeString,
67+
Computed: true,
68+
Description: "",
69+
},
70+
"rescue_mail": {
71+
Type: schema.TypeString,
72+
Computed: true,
73+
Description: "",
74+
},
75+
"reverse": {
76+
Type: schema.TypeString,
77+
Computed: true,
78+
Description: "dedicated server reverse",
79+
},
80+
"root_device": {
81+
Type: schema.TypeString,
82+
Computed: true,
83+
Description: "",
84+
},
85+
"server_id": {
86+
Type: schema.TypeInt,
87+
Computed: true,
88+
Description: "your server id",
89+
},
90+
"state": {
91+
Type: schema.TypeString,
92+
Computed: true,
93+
Description: "error, hacked, hackedBlocked, ok",
94+
},
95+
"support_level": {
96+
Type: schema.TypeString,
97+
Computed: true,
98+
Description: "Dedicated server support level (critical, fastpath, gs, pro)",
99+
},
100+
101+
"vnis": {
102+
Type: schema.TypeList,
103+
Computed: true,
104+
Elem: &schema.Resource{
105+
Schema: map[string]*schema.Schema{
106+
"enabled": {
107+
Type: schema.TypeBool,
108+
Computed: true,
109+
Description: "VirtualNetworkInterface activation state",
110+
},
111+
"mode": {
112+
Type: schema.TypeString,
113+
Computed: true,
114+
Description: "VirtualNetworkInterface mode (public,vrack,vrack_aggregation)",
115+
},
116+
"name": {
117+
Type: schema.TypeString,
118+
Computed: true,
119+
Description: "User defined VirtualNetworkInterface name",
120+
},
121+
"uuid": {
122+
Type: schema.TypeString,
123+
Computed: true,
124+
Description: "VirtualNetworkInterface unique id",
125+
},
126+
"vrack": {
127+
Type: schema.TypeString,
128+
Computed: true,
129+
Description: "vRack name",
130+
},
131+
"ncis": {
132+
Type: schema.TypeString,
133+
Elem: &schema.Schema{Type: schema.TypeString},
134+
Computed: true,
135+
Description: "NetworkInterfaceControllers bound to this VirtualNetworkInterface",
136+
},
137+
},
138+
},
139+
},
140+
"enabled_vrack_vnis": {
141+
Type: schema.TypeList,
142+
Elem: &schema.Schema{Type: schema.TypeString},
143+
Computed: true,
144+
Description: "List of enabled vrack VNI uuids",
145+
},
146+
"enabled_vrack_aggregation_vnis": {
147+
Type: schema.TypeList,
148+
Elem: &schema.Schema{Type: schema.TypeString},
149+
Computed: true,
150+
Description: "List of enabled vrack_aggregation VNI uuids",
151+
},
152+
"enabled_public_vnis": {
153+
Type: schema.TypeList,
154+
Elem: &schema.Schema{Type: schema.TypeString},
155+
Computed: true,
156+
Description: "List of enabled public VNI uuids",
157+
},
158+
},
159+
}
160+
}
161+
162+
func dataSourceDedicatedServerRead(d *schema.ResourceData, meta interface{}) error {
163+
config := meta.(*Config)
164+
serviceName := d.Get("service_name").(string)
165+
166+
ds := &DedicatedServer{}
167+
err := config.OVHClient.Get(
168+
fmt.Sprintf("/dedicated/server/%s", serviceName),
169+
&ds,
170+
)
171+
172+
if err != nil {
173+
return fmt.Errorf(
174+
"Error calling /dedicated/server/%s:\n\t %q",
175+
serviceName,
176+
err,
177+
)
178+
}
179+
180+
d.SetId(ds.Name)
181+
d.Set("boot_id", ds.BootId)
182+
d.Set("commercial_range", ds.CommercialRange)
183+
d.Set("datacenter", ds.Datacenter)
184+
d.Set("ip", ds.Ip)
185+
d.Set("link_speed", ds.LinkSpeed)
186+
d.Set("monitoring", ds.Monitoring)
187+
d.Set("os", ds.Os)
188+
d.Set("name", ds.Name)
189+
d.Set("professional_use", ds.ProfessionalUse)
190+
d.Set("rack", ds.Rack)
191+
d.Set("rescue_mail", ds.RescueMail)
192+
d.Set("reverse", ds.Reverse)
193+
d.Set("root_device", ds.RootDevice)
194+
d.Set("server_id", ds.ServerId)
195+
d.Set("state", ds.State)
196+
d.Set("support_level", ds.SupportLevel)
197+
198+
// Set VNIs attributes
199+
vnis, err := getDedicatedServerVNIs(d, meta)
200+
201+
if err != nil {
202+
return fmt.Errorf("Error reading Dedicated Server VNIs: %s", err)
203+
}
204+
205+
mapvnis := make([]map[string]interface{}, len(vnis))
206+
enabledVrackVnis := []string{}
207+
enabledVrackAggregationVnis := []string{}
208+
enabledPublicVnis := []string{}
209+
210+
for i, vni := range vnis {
211+
mapvnis[i] = vni.ToMap()
212+
213+
if vni.Enabled {
214+
switch vni.Mode {
215+
case "vrack":
216+
enabledVrackVnis = append(enabledVrackVnis, vni.Uuid)
217+
case "vrack_aggregation":
218+
enabledVrackAggregationVnis = append(enabledVrackAggregationVnis, vni.Uuid)
219+
case "public":
220+
enabledPublicVnis = append(enabledPublicVnis, vni.Uuid)
221+
default:
222+
log.Printf("[WARN] unknown VNI mode. DS {%v} VNI {%v}", ds, vni)
223+
}
224+
}
225+
}
226+
227+
d.Set("vnis", mapvnis)
228+
d.Set("enabled_vrack_vnis", enabledVrackVnis)
229+
d.Set("enabled_vrack_aggregation_vnis", enabledVrackAggregationVnis)
230+
d.Set("enabled_public_vnis", enabledPublicVnis)
231+
232+
return nil
233+
}
234+
235+
func getDedicatedServerVNIs(d *schema.ResourceData, meta interface{}) ([]*DedicatedServerVNI, error) {
236+
config := meta.(*Config)
237+
238+
log.Printf("[INFO] Getting VNIs for dedicated server: %s", d.Id())
239+
240+
serviceName := d.Get("service_name").(string)
241+
242+
// First get ids unfiltered
243+
ids := []string{}
244+
err := config.OVHClient.Get(
245+
fmt.Sprintf("/dedicated/server/%s/virtualNetworkInterface", serviceName),
246+
&ids,
247+
)
248+
249+
if err != nil {
250+
return nil, fmt.Errorf("Error retrieving VNIs for dedicated server %s: %s", d.Id(), err)
251+
}
252+
253+
if len(ids) < 1 {
254+
log.Printf("[WARN] Dedicated server %s returned no VNI. Your server might be on legacy network infrastructure.", d.Id())
255+
return nil, nil
256+
}
257+
258+
vnis := []*DedicatedServerVNI{}
259+
260+
for i := 0; i < len(ids); i++ {
261+
vni := &DedicatedServerVNI{}
262+
err := config.OVHClient.Get(
263+
fmt.Sprintf("/dedicated/server/%s/virtualNetworkInterface/%s", serviceName, ids[i]),
264+
vni,
265+
)
266+
267+
if err != nil {
268+
return nil, fmt.Errorf("Error retrieving VNI info for dedicated server %s: %s", d.Id(), err)
269+
}
270+
vnis = append(vnis, vni)
271+
}
272+
273+
return vnis, nil
274+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
package ovh
2+
3+
import (
4+
"fmt"
5+
"os"
6+
"testing"
7+
8+
"github.com/hashicorp/terraform-plugin-sdk/helper/resource"
9+
)
10+
11+
func TestAccDedicatedServerDataSource_basic(t *testing.T) {
12+
dedicated_server := os.Getenv("OVH_DEDICATED_SERVER_SERVICE_NAME")
13+
config := fmt.Sprintf(testAccDedicatedServerDatasourceConfig_Basic, dedicated_server)
14+
15+
resource.Test(t, resource.TestCase{
16+
PreCheck: func() { testAccPreCheckDedicatedServer(t) },
17+
Providers: testAccProviders,
18+
Steps: []resource.TestStep{
19+
{
20+
Config: config,
21+
Check: resource.ComposeTestCheckFunc(
22+
resource.TestCheckResourceAttr(
23+
"data.ovh_dedicated_server.server", "name", dedicated_server),
24+
resource.TestCheckResourceAttr(
25+
"data.ovh_dedicated_server.server", "service_name", dedicated_server),
26+
),
27+
},
28+
},
29+
})
30+
}
31+
32+
const testAccDedicatedServerDatasourceConfig_Basic = `
33+
data "ovh_dedicated_server" "server" {
34+
service_name = "%s"
35+
}
36+
`
+43
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
package ovh
2+
3+
import (
4+
"fmt"
5+
"sort"
6+
7+
"github.com/hashicorp/terraform-plugin-sdk/helper/hashcode"
8+
"github.com/hashicorp/terraform-plugin-sdk/helper/schema"
9+
)
10+
11+
func dataSourceDedicatedServers() *schema.Resource {
12+
return &schema.Resource{
13+
Read: dataSourceDedicatedServersRead,
14+
Schema: map[string]*schema.Schema{
15+
// Computed
16+
"result": {
17+
Type: schema.TypeList,
18+
Computed: true,
19+
Elem: &schema.Schema{
20+
Type: schema.TypeString,
21+
},
22+
},
23+
},
24+
}
25+
}
26+
27+
func dataSourceDedicatedServersRead(d *schema.ResourceData, meta interface{}) error {
28+
config := meta.(*Config)
29+
30+
ids := []string{}
31+
err := config.OVHClient.Get("/dedicated/server", &ids)
32+
33+
if err != nil {
34+
return fmt.Errorf("Error calling /dedicated/server:\n\t %q", err)
35+
}
36+
37+
// sort.Strings sorts in place, returns nothing
38+
sort.Strings(ids)
39+
40+
d.SetId(hashcode.Strings(ids))
41+
d.Set("result", ids)
42+
return nil
43+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
package ovh
2+
3+
import (
4+
"testing"
5+
6+
"github.com/hashicorp/terraform-plugin-sdk/helper/resource"
7+
)
8+
9+
func TestAccDedicatedServersDataSource_basic(t *testing.T) {
10+
resource.Test(t, resource.TestCase{
11+
PreCheck: func() { testAccPreCheckCredentials(t) },
12+
Providers: testAccProviders,
13+
Steps: []resource.TestStep{
14+
{
15+
Config: "data ovh_dedicated_servers servers {}",
16+
Check: resource.TestCheckResourceAttrSet(
17+
"data.ovh_dedicated_servers.servers",
18+
"result.#",
19+
),
20+
},
21+
},
22+
})
23+
}

ovh/provider.go

+2
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,8 @@ func Provider() terraform.ResourceProvider {
4343
DataSourcesMap: map[string]*schema.Resource{
4444
"ovh_cloud_region": dataSourcePublicCloudRegion(),
4545
"ovh_cloud_regions": dataSourcePublicCloudRegions(),
46+
"ovh_dedicated_servers": dataSourceDedicatedServers(),
47+
"ovh_dedicated_server": dataSourceDedicatedServer(),
4648
"ovh_domain_zone": dataSourceDomainZone(),
4749
"ovh_iploadbalancing": dataSourceIpLoadbalancing(),
4850
"ovh_me_paymentmean_bankaccount": dataSourceMePaymentmeanBankaccount(),

0 commit comments

Comments
 (0)