forked from softlayer/terraform-provider-softlayer
/
data_source_softlayer_vlan.go
133 lines (111 loc) · 3.43 KB
/
data_source_softlayer_vlan.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
package softlayer
import (
"errors"
"fmt"
"github.com/hashicorp/terraform/helper/schema"
"github.com/softlayer/softlayer-go/datatypes"
"github.com/softlayer/softlayer-go/filter"
"github.com/softlayer/softlayer-go/services"
"github.com/softlayer/softlayer-go/session"
)
func dataSourceSoftLayerVlan() *schema.Resource {
return &schema.Resource{
Read: dataSourceSoftLayerVlanRead,
Schema: map[string]*schema.Schema{
"id": {
Type: schema.TypeInt,
Computed: true,
},
"name": {
Type: schema.TypeString,
Optional: true,
Computed: true,
},
"number": {
Type: schema.TypeInt,
Optional: true,
Computed: true,
},
"router_hostname": {
Type: schema.TypeString,
Optional: true,
Computed: true,
},
"subnets": {
Type: schema.TypeList,
Computed: true,
Elem: &schema.Schema{Type: schema.TypeString},
},
},
}
}
func dataSourceSoftLayerVlanRead(d *schema.ResourceData, meta interface{}) error {
sess := meta.(*session.Session)
service := services.GetAccountService(sess)
name := d.Get("name").(string)
number := d.Get("number").(int)
routerHostname := d.Get("router_hostname").(string)
var vlan *datatypes.Network_Vlan
var err error
if number != 0 && routerHostname != "" {
// Got vlan number and router, get vlan, and compute name
vlan, err = getVlan(number, routerHostname, meta)
if err != nil {
return err
}
d.SetId(fmt.Sprintf("%d", *vlan.Id))
if vlan.Name != nil {
d.Set("name", *vlan.Name)
}
} else if name != "" {
// Got name, get vlan, and compute router hostname and vlan number
networkVlans, err := service.
Mask("id,vlanNumber,name,primaryRouter[hostname],primarySubnets[networkIdentifier,cidr]").
Filter(filter.Path("networkVlans.name").Eq(name).Build()).
GetNetworkVlans()
if err != nil {
return fmt.Errorf("Error obtaining VLAN id: %s", err)
} else if len(networkVlans) == 0 {
return fmt.Errorf("No VLAN was found with the name '%s'", name)
}
vlan = &networkVlans[0]
d.SetId(fmt.Sprintf("%d", *vlan.Id))
d.Set("number", *vlan.VlanNumber)
if vlan.PrimaryRouter != nil && vlan.PrimaryRouter.Hostname != nil {
d.Set("router_hostname", *vlan.PrimaryRouter.Hostname)
}
} else {
return errors.New("Missing required properties. Need a VLAN name, or the VLAN's number and router hostname.")
}
// Get subnets in cidr format for display
if len(vlan.PrimarySubnets) > 0 {
subnets := make([]string, len(vlan.PrimarySubnets))
for i, subnet := range vlan.PrimarySubnets {
subnets[i] = fmt.Sprintf("%s/%d", *subnet.NetworkIdentifier, *subnet.Cidr)
}
d.Set("subnets", subnets)
}
return nil
}
func getVlan(vlanNumber int, primaryRouterHostname string, meta interface{}) (*datatypes.Network_Vlan, error) {
service := services.GetAccountService(meta.(*session.Session))
networkVlans, err := service.
Mask("id,name,primarySubnets[networkIdentifier,cidr]").
Filter(
filter.Build(
filter.Path("networkVlans.primaryRouter.hostname").Eq(primaryRouterHostname),
filter.Path("networkVlans.vlanNumber").Eq(vlanNumber),
),
).
GetNetworkVlans()
if err != nil {
return &datatypes.Network_Vlan{}, fmt.Errorf("Error looking up Vlan: %s", err)
}
if len(networkVlans) < 1 {
return &datatypes.Network_Vlan{}, fmt.Errorf(
"Unable to locate a vlan matching the provided router hostname and vlan number: %s/%d",
primaryRouterHostname,
vlanNumber)
}
return &networkVlans[0], nil
}