@@ -202,3 +202,197 @@ resource "cloudstack_egress_firewall" "foo" {
202202 ports = ["80", "1000-2000"]
203203 }
204204}`
205+
206+ func TestAccCloudStackEgressFirewall_allPortsTCP (t * testing.T ) {
207+ resource .Test (t , resource.TestCase {
208+ PreCheck : func () { testAccPreCheck (t ) },
209+ Providers : testAccProviders ,
210+ CheckDestroy : testAccCheckCloudStackEgressFirewallDestroy ,
211+ Steps : []resource.TestStep {
212+ {
213+ Config : testAccCloudStackEgressFirewall_allPorts ,
214+ Check : resource .ComposeTestCheckFunc (
215+ testAccCheckCloudStackEgressFirewallRulesExist ("cloudstack_egress_firewall.foo" ),
216+ resource .TestCheckResourceAttr (
217+ "cloudstack_egress_firewall.foo" , "rule.#" , "1" ),
218+ resource .TestCheckResourceAttr (
219+ "cloudstack_egress_firewall.foo" , "rule.0.cidr_list.0" , "10.1.1.10/32" ),
220+ resource .TestCheckResourceAttr (
221+ "cloudstack_egress_firewall.foo" , "rule.0.protocol" , "tcp" ),
222+ // No ports should be set when omitting the ports parameter
223+ resource .TestCheckNoResourceAttr (
224+ "cloudstack_egress_firewall.foo" , "rule.0.ports" ),
225+ ),
226+ },
227+ },
228+ })
229+ }
230+
231+ const testAccCloudStackEgressFirewall_allPorts = `
232+ resource "cloudstack_network" "foo" {
233+ name = "terraform-network-tcp"
234+ display_text = "terraform-network-tcp"
235+ cidr = "10.1.1.0/24"
236+ network_offering = "DefaultIsolatedNetworkOfferingWithSourceNatService"
237+ zone = "Sandbox-simulator"
238+ }
239+
240+ resource "cloudstack_egress_firewall" "foo" {
241+ network_id = cloudstack_network.foo.id
242+
243+ rule {
244+ cidr_list = ["10.1.1.10/32"]
245+ protocol = "tcp"
246+ # No ports specified - should create a rule for all ports
247+ }
248+ }`
249+
250+ func TestAccCloudStackEgressFirewall_allPortsUDP (t * testing.T ) {
251+ resource .Test (t , resource.TestCase {
252+ PreCheck : func () { testAccPreCheck (t ) },
253+ Providers : testAccProviders ,
254+ CheckDestroy : testAccCheckCloudStackEgressFirewallDestroy ,
255+ Steps : []resource.TestStep {
256+ {
257+ Config : testAccCloudStackEgressFirewall_allPortsUDP ,
258+ Check : resource .ComposeTestCheckFunc (
259+ testAccCheckCloudStackEgressFirewallRulesExist ("cloudstack_egress_firewall.foo" ),
260+ resource .TestCheckResourceAttr ("cloudstack_egress_firewall.foo" , "rule.#" , "1" ),
261+ resource .TestCheckResourceAttr ("cloudstack_egress_firewall.foo" , "rule.0.protocol" , "udp" ),
262+ resource .TestCheckNoResourceAttr ("cloudstack_egress_firewall.foo" , "rule.0.ports" ),
263+ ),
264+ },
265+ },
266+ })
267+ }
268+
269+ const testAccCloudStackEgressFirewall_allPortsUDP = `
270+ resource "cloudstack_network" "foo" {
271+ name = "tf-egress-udp-all"
272+ display_text = "tf-egress-udp-all"
273+ cidr = "10.8.0.0/24"
274+ network_offering = "DefaultIsolatedNetworkOfferingWithSourceNatService"
275+ zone = "Sandbox-simulator"
276+ }
277+
278+ resource "cloudstack_egress_firewall" "foo" {
279+ network_id = cloudstack_network.foo.id
280+
281+ rule {
282+ cidr_list = ["10.8.0.10/32"]
283+ protocol = "udp"
284+ # no ports => all ports
285+ }
286+ }`
287+
288+ func TestAccCloudStackEgressFirewall_allPortsCombined (t * testing.T ) {
289+ resource .Test (t , resource.TestCase {
290+ PreCheck : func () { testAccPreCheck (t ) },
291+ Providers : testAccProviders ,
292+ CheckDestroy : testAccCheckCloudStackEgressFirewallDestroy ,
293+ Steps : []resource.TestStep {
294+ {
295+ Config : testAccCloudStackEgressFirewall_allPortsCombined ,
296+ Check : resource .ComposeTestCheckFunc (
297+ testAccCheckCloudStackEgressFirewallRulesExist ("cloudstack_egress_firewall.mixed" ),
298+ resource .TestCheckResourceAttr ("cloudstack_egress_firewall.mixed" , "rule.#" , "2" ),
299+ resource .TestCheckResourceAttr ("cloudstack_egress_firewall.mixed" , "rule.0.protocol" , "tcp" ),
300+ resource .TestCheckResourceAttr ("cloudstack_egress_firewall.mixed" , "rule.0.ports.#" , "2" ),
301+ resource .TestCheckResourceAttr ("cloudstack_egress_firewall.mixed" , "rule.1.protocol" , "udp" ),
302+ resource .TestCheckNoResourceAttr ("cloudstack_egress_firewall.mixed" , "rule.1.ports" ),
303+ ),
304+ },
305+ },
306+ })
307+ }
308+
309+ const testAccCloudStackEgressFirewall_allPortsCombined = `
310+ resource "cloudstack_network" "foo" {
311+ name = "terraform-network-mixed"
312+ display_text = "terraform-network-mixed"
313+ cidr = "10.1.3.0/24"
314+ network_offering = "DefaultIsolatedNetworkOfferingWithSourceNatService"
315+ zone = "Sandbox-simulator"
316+ }
317+
318+ resource "cloudstack_egress_firewall" "mixed" {
319+ network_id = cloudstack_network.foo.id
320+
321+ rule {
322+ cidr_list = ["10.0.0.0/8"]
323+ protocol = "tcp"
324+ ports = ["80", "443"]
325+ }
326+
327+ rule {
328+ cidr_list = ["10.1.0.0/16"]
329+ protocol = "udp"
330+ # no ports => all ports
331+ }
332+ }`
333+
334+ func TestAccCloudStackEgressFirewall_portsToAllPorts (t * testing.T ) {
335+ resource .Test (t , resource.TestCase {
336+ PreCheck : func () { testAccPreCheck (t ) },
337+ Providers : testAccProviders ,
338+ CheckDestroy : testAccCheckCloudStackEgressFirewallDestroy ,
339+ Steps : []resource.TestStep {
340+ {
341+ Config : testAccCloudStackEgressFirewall_specificPorts ,
342+ Check : resource .ComposeTestCheckFunc (
343+ testAccCheckCloudStackEgressFirewallRulesExist ("cloudstack_egress_firewall.foo" ),
344+ resource .TestCheckResourceAttr ("cloudstack_egress_firewall.foo" , "rule.#" , "1" ),
345+ resource .TestCheckResourceAttr ("cloudstack_egress_firewall.foo" , "rule.0.ports.#" , "2" ),
346+ ),
347+ },
348+ {
349+ Config : testAccCloudStackEgressFirewall_allPortsTransition ,
350+ Check : resource .ComposeTestCheckFunc (
351+ testAccCheckCloudStackEgressFirewallRulesExist ("cloudstack_egress_firewall.foo" ),
352+ resource .TestCheckResourceAttr ("cloudstack_egress_firewall.foo" , "rule.#" , "1" ),
353+ resource .TestCheckNoResourceAttr ("cloudstack_egress_firewall.foo" , "rule.0.ports" ),
354+ ),
355+ },
356+ },
357+ })
358+ }
359+
360+ const testAccCloudStackEgressFirewall_specificPorts = `
361+ resource "cloudstack_network" "foo" {
362+ name = "terraform-network-transition"
363+ display_text = "terraform-network-transition"
364+ cidr = "10.1.4.0/24"
365+ network_offering = "DefaultIsolatedNetworkOfferingWithSourceNatService"
366+ zone = "Sandbox-simulator"
367+ }
368+
369+ resource "cloudstack_egress_firewall" "foo" {
370+ network_id = cloudstack_network.foo.id
371+
372+ rule {
373+ cidr_list = ["10.1.1.10/32"]
374+ protocol = "tcp"
375+ ports = ["80", "1000-2000"]
376+ }
377+ }
378+ `
379+
380+ const testAccCloudStackEgressFirewall_allPortsTransition = `
381+ resource "cloudstack_network" "foo" {
382+ name = "terraform-network-transition"
383+ display_text = "terraform-network-transition"
384+ cidr = "10.1.4.0/24"
385+ network_offering = "DefaultIsolatedNetworkOfferingWithSourceNatService"
386+ zone = "Sandbox-simulator"
387+ }
388+
389+ resource "cloudstack_egress_firewall" "foo" {
390+ network_id = cloudstack_network.foo.id
391+
392+ rule {
393+ cidr_list = ["10.1.1.10/32"]
394+ protocol = "tcp"
395+ # no ports => all ports
396+ }
397+ }
398+ `
0 commit comments