20
20
package cloudstack
21
21
22
22
import (
23
+ "fmt"
24
+
23
25
"github.com/apache/cloudstack-go/v2/cloudstack"
24
26
"github.com/hashicorp/terraform/helper/schema"
25
27
)
@@ -59,8 +61,9 @@ func resourceCloudStackTrafficType() *schema.Resource {
59
61
Required : true ,
60
62
},
61
63
"traffic_type" : {
62
- Type : schema .TypeString ,
63
- Required : true ,
64
+ Type : schema .TypeString ,
65
+ Required : true ,
66
+ ValidateFunc : validateTrafficType ,
64
67
},
65
68
"vlan" : {
66
69
Type : schema .TypeString ,
@@ -85,19 +88,111 @@ func resourceCloudStackTrafficTypeCreate(d *schema.ResourceData, meta interface{
85
88
cs := meta .(* cloudstack.CloudStackClient )
86
89
87
90
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 )
89
127
90
128
return resourceCloudStackTrafficTypeRead (d , meta )
91
129
}
92
130
93
131
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
+
94
135
return nil
95
136
}
96
137
97
138
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
+
98
171
return resourceCloudStackTrafficTypeRead (d , meta )
99
172
}
100
173
101
174
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
+
102
182
return nil
103
183
}
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
+ }
0 commit comments