Skip to content

Commit e96263f

Browse files
Pearl1594ianc769
authored andcommitted
Add support for additional optional parameters for creating network offerings (apache#205)
1 parent 854ee22 commit e96263f

File tree

4 files changed

+557
-16
lines changed

4 files changed

+557
-16
lines changed

cloudstack/data_source_cloudstack_network_offering.go

Lines changed: 108 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -54,6 +54,64 @@ func dataSourceCloudstackNetworkOffering() *schema.Resource {
5454
Type: schema.TypeString,
5555
Computed: true,
5656
},
57+
"network_rate": {
58+
Type: schema.TypeInt,
59+
Computed: true,
60+
},
61+
"network_mode": {
62+
Type: schema.TypeString,
63+
Computed: true,
64+
},
65+
"conserve_mode": {
66+
Type: schema.TypeBool,
67+
Computed: true,
68+
},
69+
"enable": {
70+
Type: schema.TypeBool,
71+
Computed: true,
72+
},
73+
"for_vpc": {
74+
Type: schema.TypeBool,
75+
Computed: true,
76+
},
77+
"for_nsx": {
78+
Type: schema.TypeBool,
79+
Computed: true,
80+
},
81+
"specify_vlan": {
82+
Type: schema.TypeBool,
83+
Computed: true,
84+
},
85+
"specify_ip_ranges": {
86+
Type: schema.TypeBool,
87+
Computed: true,
88+
},
89+
"specify_as_number": {
90+
Type: schema.TypeBool,
91+
Computed: true,
92+
},
93+
"internet_protocol": {
94+
Type: schema.TypeString,
95+
Computed: true,
96+
},
97+
"routing_mode": {
98+
Type: schema.TypeString,
99+
Computed: true,
100+
},
101+
"max_connections": {
102+
Type: schema.TypeInt,
103+
Computed: true,
104+
},
105+
"supported_services": {
106+
Type: schema.TypeSet,
107+
Computed: true,
108+
Elem: &schema.Schema{Type: schema.TypeString},
109+
},
110+
"service_provider_list": {
111+
Type: schema.TypeMap,
112+
Computed: true,
113+
Elem: &schema.Schema{Type: schema.TypeString},
114+
},
57115
},
58116
}
59117
}
@@ -91,7 +149,12 @@ func datasourceCloudStackNetworkOfferingRead(d *schema.ResourceData, meta interf
91149
}
92150
log.Printf("[DEBUG] Selected network offerings: %s\n", networkOffering.Displaytext)
93151

94-
return networkOfferingDescriptionAttributes(d, networkOffering)
152+
fullNetworkOffering, _, err := cs.NetworkOffering.GetNetworkOfferingByName(networkOffering.Name)
153+
if err != nil {
154+
return fmt.Errorf("Error retrieving full network offering details: %s", err)
155+
}
156+
157+
return networkOfferingDescriptionAttributes(d, fullNetworkOffering)
95158
}
96159

97160
func networkOfferingDescriptionAttributes(d *schema.ResourceData, networkOffering *cloudstack.NetworkOffering) error {
@@ -100,6 +163,50 @@ func networkOfferingDescriptionAttributes(d *schema.ResourceData, networkOfferin
100163
d.Set("display_text", networkOffering.Displaytext)
101164
d.Set("guest_ip_type", networkOffering.Guestiptype)
102165
d.Set("traffic_type", networkOffering.Traffictype)
166+
d.Set("network_rate", networkOffering.Networkrate)
167+
168+
// Only set if CloudStack supports these fields (4.20.0+)
169+
if networkOffering.Networkmode != "" {
170+
d.Set("network_mode", networkOffering.Networkmode)
171+
}
172+
173+
d.Set("conserve_mode", networkOffering.Conservemode)
174+
d.Set("enable", networkOffering.State == "Enabled")
175+
d.Set("for_vpc", networkOffering.Forvpc)
176+
d.Set("for_nsx", networkOffering.Fornsx)
177+
d.Set("specify_vlan", networkOffering.Specifyvlan)
178+
d.Set("specify_ip_ranges", networkOffering.Specifyipranges)
179+
d.Set("specify_as_number", networkOffering.Specifyasnumber)
180+
d.Set("internet_protocol", networkOffering.Internetprotocol)
181+
182+
// Only set if CloudStack supports this field (4.20.0+)
183+
if networkOffering.Routingmode != "" {
184+
d.Set("routing_mode", networkOffering.Routingmode)
185+
}
186+
187+
if networkOffering.Maxconnections > 0 {
188+
d.Set("max_connections", networkOffering.Maxconnections)
189+
}
190+
191+
// Set supported services
192+
if len(networkOffering.Service) > 0 {
193+
services := make([]string, len(networkOffering.Service))
194+
for i, service := range networkOffering.Service {
195+
services[i] = service.Name
196+
}
197+
d.Set("supported_services", services)
198+
}
199+
200+
// Set service provider list
201+
if len(networkOffering.Service) > 0 {
202+
serviceProviders := make(map[string]string)
203+
for _, service := range networkOffering.Service {
204+
if len(service.Provider) > 0 {
205+
serviceProviders[service.Name] = service.Provider[0].Name
206+
}
207+
}
208+
d.Set("service_provider_list", serviceProviders)
209+
}
103210

104211
return nil
105212
}

cloudstack/data_source_cloudstack_network_offering_test.go

Lines changed: 175 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,83 @@ func TestAccNetworkOfferingDataSource_basic(t *testing.T) {
3737
Config: testNetworkOfferingDataSourceConfig_basic,
3838
Check: resource.ComposeTestCheckFunc(
3939
resource.TestCheckResourceAttrPair(datasourceName, "name", resourceName, "name"),
40+
resource.TestCheckResourceAttrPair(datasourceName, "display_text", resourceName, "display_text"),
41+
resource.TestCheckResourceAttrPair(datasourceName, "guest_ip_type", resourceName, "guest_ip_type"),
42+
resource.TestCheckResourceAttrPair(datasourceName, "traffic_type", resourceName, "traffic_type"),
43+
),
44+
},
45+
},
46+
})
47+
}
48+
49+
func TestAccNetworkOfferingDataSource_withAdditionalParams(t *testing.T) {
50+
resourceName := "cloudstack_network_offering.net-off-resource"
51+
datasourceName := "data.cloudstack_network_offering.net-off-data-source"
52+
53+
resource.Test(t, resource.TestCase{
54+
PreCheck: func() { testAccPreCheck(t) },
55+
Providers: testAccProviders,
56+
Steps: []resource.TestStep{
57+
{
58+
Config: testNetworkOfferingDataSourceConfig_withAdditionalParams,
59+
Check: resource.ComposeTestCheckFunc(
60+
resource.TestCheckResourceAttrPair(datasourceName, "name", resourceName, "name"),
61+
resource.TestCheckResourceAttrPair(datasourceName, "display_text", resourceName, "display_text"),
62+
resource.TestCheckResourceAttrPair(datasourceName, "guest_ip_type", resourceName, "guest_ip_type"),
63+
resource.TestCheckResourceAttrPair(datasourceName, "traffic_type", resourceName, "traffic_type"),
64+
resource.TestCheckResourceAttrPair(datasourceName, "network_rate", resourceName, "network_rate"),
65+
resource.TestCheckResourceAttrPair(datasourceName, "conserve_mode", resourceName, "conserve_mode"),
66+
resource.TestCheckResourceAttrPair(datasourceName, "for_vpc", resourceName, "for_vpc"),
67+
resource.TestCheckResourceAttrPair(datasourceName, "specify_vlan", resourceName, "specify_vlan"),
68+
resource.TestCheckResourceAttrPair(datasourceName, "enable", resourceName, "enable"),
69+
),
70+
},
71+
},
72+
})
73+
}
74+
75+
func TestAccNetworkOfferingDataSource_withServices(t *testing.T) {
76+
resourceName := "cloudstack_network_offering.net-off-resource"
77+
datasourceName := "data.cloudstack_network_offering.net-off-data-source"
78+
79+
resource.Test(t, resource.TestCase{
80+
PreCheck: func() { testAccPreCheck(t) },
81+
Providers: testAccProviders,
82+
Steps: []resource.TestStep{
83+
{
84+
Config: testNetworkOfferingDataSourceConfig_withServices,
85+
Check: resource.ComposeTestCheckFunc(
86+
resource.TestCheckResourceAttrPair(datasourceName, "name", resourceName, "name"),
87+
resource.TestCheckResourceAttrPair(datasourceName, "supported_services.#", resourceName, "supported_services.#"),
88+
resource.TestCheckResourceAttrPair(datasourceName, "service_provider_list.%", resourceName, "service_provider_list.%"),
89+
resource.TestCheckResourceAttrPair(datasourceName, "service_provider_list.Dhcp", resourceName, "service_provider_list.Dhcp"),
90+
resource.TestCheckResourceAttrPair(datasourceName, "service_provider_list.Dns", resourceName, "service_provider_list.Dns"),
91+
resource.TestCheckResourceAttrPair(datasourceName, "enable", resourceName, "enable"),
92+
resource.TestCheckResourceAttrPair(datasourceName, "max_connections", resourceName, "max_connections"),
93+
),
94+
},
95+
},
96+
})
97+
}
98+
99+
func TestAccNetworkOfferingDataSource_allOptionalParams(t *testing.T) {
100+
resourceName := "cloudstack_network_offering.net-off-resource"
101+
datasourceName := "data.cloudstack_network_offering.net-off-data-source"
102+
103+
resource.Test(t, resource.TestCase{
104+
PreCheck: func() { testAccPreCheck(t) },
105+
Providers: testAccProviders,
106+
Steps: []resource.TestStep{
107+
{
108+
Config: testNetworkOfferingDataSourceConfig_allOptionalParams,
109+
Check: resource.ComposeTestCheckFunc(
110+
resource.TestCheckResourceAttrPair(datasourceName, "name", resourceName, "name"),
111+
resource.TestCheckResourceAttrPair(datasourceName, "display_text", resourceName, "display_text"),
112+
resource.TestCheckResourceAttrPair(datasourceName, "for_nsx", resourceName, "for_nsx"),
113+
resource.TestCheckResourceAttrPair(datasourceName, "specify_as_number", resourceName, "specify_as_number"),
114+
resource.TestCheckResourceAttrPair(datasourceName, "internet_protocol", resourceName, "internet_protocol"),
115+
resource.TestCheckResourceAttr(datasourceName, "enable", "true"),
116+
resource.TestCheckResourceAttr(datasourceName, "for_nsx", "false"),
40117
),
41118
},
42119
},
@@ -62,3 +139,101 @@ resource "cloudstack_network_offering" "net-off-resource"{
62139
]
63140
}
64141
`
142+
143+
const testNetworkOfferingDataSourceConfig_withAdditionalParams = `
144+
resource "cloudstack_network_offering" "net-off-resource"{
145+
name = "TestNetworkDisplayAdvanced01"
146+
display_text = "TestNetworkDisplayAdvanced01"
147+
guest_ip_type = "Isolated"
148+
traffic_type = "Guest"
149+
network_rate = 100
150+
conserve_mode = true
151+
enable = true
152+
for_vpc = false
153+
specify_vlan = true
154+
supported_services = ["Dhcp", "Dns", "Firewall", "Lb", "SourceNat"]
155+
service_provider_list = {
156+
Dhcp = "VirtualRouter"
157+
Dns = "VirtualRouter"
158+
Firewall = "VirtualRouter"
159+
Lb = "VirtualRouter"
160+
SourceNat = "VirtualRouter"
161+
}
162+
}
163+
164+
data "cloudstack_network_offering" "net-off-data-source"{
165+
filter{
166+
name = "name"
167+
value = "TestNetworkDisplayAdvanced01"
168+
}
169+
depends_on = [
170+
cloudstack_network_offering.net-off-resource
171+
]
172+
}
173+
`
174+
175+
const testNetworkOfferingDataSourceConfig_withServices = `
176+
resource "cloudstack_network_offering" "net-off-resource"{
177+
name = "TestNetworkServices01"
178+
display_text = "TestNetworkServices01"
179+
guest_ip_type = "Isolated"
180+
traffic_type = "Guest"
181+
enable = true
182+
supported_services = ["Dhcp", "Dns", "Firewall", "Lb", "SourceNat", "StaticNat", "PortForwarding"]
183+
service_provider_list = {
184+
Dhcp = "VirtualRouter"
185+
Dns = "VirtualRouter"
186+
Firewall = "VirtualRouter"
187+
Lb = "VirtualRouter"
188+
SourceNat = "VirtualRouter"
189+
StaticNat = "VirtualRouter"
190+
PortForwarding = "VirtualRouter"
191+
}
192+
}
193+
194+
data "cloudstack_network_offering" "net-off-data-source"{
195+
filter{
196+
name = "name"
197+
value = "TestNetworkServices01"
198+
}
199+
depends_on = [
200+
cloudstack_network_offering.net-off-resource
201+
]
202+
}
203+
`
204+
205+
const testNetworkOfferingDataSourceConfig_allOptionalParams = `
206+
resource "cloudstack_network_offering" "net-off-resource"{
207+
name = "TestNetworkDisplayAll01"
208+
display_text = "TestNetworkDisplayAll01"
209+
guest_ip_type = "Isolated"
210+
traffic_type = "Guest"
211+
network_rate = 200
212+
conserve_mode = true
213+
enable = true
214+
for_vpc = false
215+
for_nsx = false
216+
specify_vlan = true
217+
specify_as_number = false
218+
internet_protocol = "IPv4"
219+
max_connections = 1000
220+
supported_services = ["Dhcp", "Dns", "Firewall", "Lb", "SourceNat"]
221+
service_provider_list = {
222+
Dhcp = "VirtualRouter"
223+
Dns = "VirtualRouter"
224+
Firewall = "VirtualRouter"
225+
Lb = "VirtualRouter"
226+
SourceNat = "VirtualRouter"
227+
}
228+
}
229+
230+
data "cloudstack_network_offering" "net-off-data-source"{
231+
filter{
232+
name = "name"
233+
value = "TestNetworkDisplayAll01"
234+
}
235+
depends_on = [
236+
cloudstack_network_offering.net-off-resource
237+
]
238+
}
239+
`

0 commit comments

Comments
 (0)