Skip to content

Commit 8756e1c

Browse files
committed
Adding traffic type resource
1 parent 274e38b commit 8756e1c

File tree

3 files changed

+173
-3
lines changed

3 files changed

+173
-3
lines changed

cloudstack/provider.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -116,6 +116,7 @@ func Provider() terraform.ResourceProvider {
116116
"cloudstack_static_nat": resourceCloudStackStaticNAT(),
117117
"cloudstack_static_route": resourceCloudStackStaticRoute(),
118118
"cloudstack_template": resourceCloudStackTemplate(),
119+
"cloudstack_traffic_type": resourceCloudStackTrafficType(),
119120
"cloudstack_vpc": resourceCloudStackVPC(),
120121
"cloudstack_vpn_connection": resourceCloudStackVPNConnection(),
121122
"cloudstack_vpn_customer_gateway": resourceCloudStackVPNCustomerGateway(),

cloudstack/resource_cloudstack_traffic_type.go

Lines changed: 98 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,8 @@
2020
package cloudstack
2121

2222
import (
23+
"fmt"
24+
2325
"github.com/apache/cloudstack-go/v2/cloudstack"
2426
"github.com/hashicorp/terraform/helper/schema"
2527
)
@@ -59,8 +61,9 @@ func resourceCloudStackTrafficType() *schema.Resource {
5961
Required: true,
6062
},
6163
"traffic_type": {
62-
Type: schema.TypeString,
63-
Required: true,
64+
Type: schema.TypeString,
65+
Required: true,
66+
ValidateFunc: validateTrafficType,
6467
},
6568
"vlan": {
6669
Type: schema.TypeString,
@@ -85,19 +88,111 @@ func resourceCloudStackTrafficTypeCreate(d *schema.ResourceData, meta interface{
8588
cs := meta.(*cloudstack.CloudStackClient)
8689

8790
p := cs.Usage.NewAddTrafficTypeParams(d.Get("physical_network_id").(string), d.Get("traffic_type").(string))
88-
cs.Usage.AddTrafficType(p)
91+
if v, ok := d.GetOk("hyperv_network_label"); ok {
92+
p.SetHypervnetworklabel(v.(string))
93+
}
94+
if v, ok := d.GetOk("isolation_method"); ok {
95+
p.SetIsolationmethod(v.(string))
96+
}
97+
if v, ok := d.GetOk("kvm_network_label"); ok {
98+
p.SetKvmnetworklabel(v.(string))
99+
}
100+
if v, ok := d.GetOk("ovm3_network_label"); ok {
101+
p.SetOvm3networklabel(v.(string))
102+
}
103+
if v, ok := d.GetOk("vlan"); ok {
104+
p.SetVlan(v.(string))
105+
}
106+
if v, ok := d.GetOk("vmware_network_label"); ok {
107+
p.SetVmwarenetworklabel(v.(string))
108+
}
109+
if v, ok := d.GetOk("xen_network_label"); ok {
110+
p.SetXennetworklabel(v.(string))
111+
}
112+
113+
r, err := cs.Usage.AddTrafficType(p)
114+
if err != nil {
115+
return err
116+
}
117+
d.SetId(r.Id)
118+
d.Set("physical_network_id", d.Get("physical_network_id").(string))
119+
120+
//
121+
d.Set("hyperv_network_label", r.Hypervnetworklabel)
122+
d.Set("kvm_network_label", r.Kvmnetworklabel)
123+
d.Set("ovm3_network_label", r.Ovm3networklabel)
124+
d.Set("traffic_type", r.Traffictype)
125+
d.Set("vmware_network_label", r.Vmwarenetworklabel)
126+
d.Set("xen_network_label", r.Xennetworklabel)
89127

90128
return resourceCloudStackTrafficTypeRead(d, meta)
91129
}
92130

93131
func resourceCloudStackTrafficTypeRead(d *schema.ResourceData, meta interface{}) error {
132+
// TODO: Create cloudstack issue. While these fields are returned by the API
133+
// they are not documented in the API spec or ListApi response.
134+
94135
return nil
95136
}
96137

97138
func resourceCloudStackTrafficTypeUpdate(d *schema.ResourceData, meta interface{}) error {
139+
cs := meta.(*cloudstack.CloudStackClient)
140+
141+
p := cs.Usage.NewUpdateTrafficTypeParams(d.Id())
142+
if v, ok := d.GetOk("hyperv_network_label"); ok {
143+
p.SetHypervnetworklabel(v.(string))
144+
}
145+
if v, ok := d.GetOk("kvm_network_label"); ok {
146+
p.SetKvmnetworklabel(v.(string))
147+
}
148+
if v, ok := d.GetOk("ovm3_network_label"); ok {
149+
p.SetOvm3networklabel(v.(string))
150+
}
151+
if v, ok := d.GetOk("vmware_network_label"); ok {
152+
p.SetVmwarenetworklabel(v.(string))
153+
}
154+
if v, ok := d.GetOk("xen_network_label"); ok {
155+
p.SetXennetworklabel(v.(string))
156+
}
157+
158+
r, err := cs.Usage.UpdateTrafficType(p)
159+
if err != nil {
160+
return err
161+
}
162+
163+
//
164+
d.Set("hyperv_network_label", r.Hypervnetworklabel)
165+
d.Set("kvm_network_label", r.Kvmnetworklabel)
166+
d.Set("ovm3_network_label", r.Ovm3networklabel)
167+
d.Set("traffic_type", r.Traffictype)
168+
d.Set("vmware_network_label", r.Vmwarenetworklabel)
169+
d.Set("xen_network_label", r.Xennetworklabel)
170+
98171
return resourceCloudStackTrafficTypeRead(d, meta)
99172
}
100173

101174
func resourceCloudStackTrafficTypeDelete(d *schema.ResourceData, meta interface{}) error {
175+
cs := meta.(*cloudstack.CloudStackClient)
176+
177+
_, err := cs.Usage.DeleteTrafficType(cs.Usage.NewDeleteTrafficTypeParams(d.Id()))
178+
if err != nil {
179+
return fmt.Errorf("Error deleting traffic type: %s", err)
180+
}
181+
102182
return nil
103183
}
184+
185+
func validateTrafficType(v interface{}, _ string) (warnings []string, errors []error) {
186+
input := v.(string)
187+
188+
allowed := []string{"Public", "Guest", "Management", "Storage"}
189+
190+
for _, str := range allowed {
191+
if str == input {
192+
return
193+
}
194+
}
195+
errors = append(errors, fmt.Errorf("traffic_type identifier (%q) not found, expecting %v", input, allowed))
196+
197+
return warnings, errors
198+
}

cloudstack/resource_cloudstack_traffic_type_test.go

Lines changed: 74 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,3 +18,77 @@
1818
//
1919

2020
package cloudstack
21+
22+
import (
23+
"testing"
24+
25+
"github.com/hashicorp/terraform/helper/resource"
26+
)
27+
28+
func TestAccCloudStacktrafficType_basic(t *testing.T) {
29+
resource.Test(t, resource.TestCase{
30+
PreCheck: func() { testAccPreCheck(t) },
31+
Providers: testAccProviders,
32+
Steps: []resource.TestStep{
33+
{
34+
Config: testAccCloudStacktrafficType_basic,
35+
},
36+
{
37+
Config: testAccCloudStacktrafficType_update,
38+
Check: resource.ComposeTestCheckFunc(
39+
resource.TestCheckResourceAttr("cloudstack_traffic_type.Management", "kvm_network_label", "csmgmt2"),
40+
),
41+
},
42+
},
43+
})
44+
}
45+
46+
const testAccCloudStacktrafficType_basic = `
47+
resource "cloudstack_zone" "test" {
48+
name = "acctestTrafficType"
49+
dns1 = "8.8.8.8"
50+
dns2 = "8.8.8.8"
51+
internal_dns1 = "8.8.4.4"
52+
internal_dns2 = "8.8.4.4"
53+
network_type = "Advanced"
54+
domain = "cloudstack.apache.org"
55+
}
56+
resource "cloudstack_physical_network" "test" {
57+
broadcast_domain_range = "ZONE"
58+
isolation_methods = "VLAN"
59+
name = "acctestTrafficType"
60+
network_speed = "1G"
61+
tags = "vlan"
62+
zone_id = cloudstack_zone.test.id
63+
}
64+
resource "cloudstack_traffic_type" "Management" {
65+
physical_network_id = cloudstack_physical_network.test.id
66+
traffic_type = "Management"
67+
kvm_network_label = "csmgmt"
68+
}
69+
`
70+
71+
const testAccCloudStacktrafficType_update = `
72+
resource "cloudstack_zone" "test" {
73+
name = "acctestTrafficType"
74+
dns1 = "8.8.8.8"
75+
dns2 = "8.8.8.8"
76+
internal_dns1 = "8.8.4.4"
77+
internal_dns2 = "8.8.4.4"
78+
network_type = "Advanced"
79+
domain = "cloudstack.apache.org"
80+
}
81+
resource "cloudstack_physical_network" "test" {
82+
broadcast_domain_range = "ZONE"
83+
isolation_methods = "VLAN"
84+
name = "acctestTrafficType"
85+
network_speed = "1G"
86+
tags = "vlan"
87+
zone_id = cloudstack_zone.test.id
88+
}
89+
resource "cloudstack_traffic_type" "Management" {
90+
physical_network_id = cloudstack_physical_network.test.id
91+
traffic_type = "Management"
92+
kvm_network_label = "csmgmt2"
93+
}
94+
`

0 commit comments

Comments
 (0)