Skip to content

Commit a3089a8

Browse files
poddmmp940m
authored andcommitted
Adding resources cloudstack_network_service_provider_state and cloudstack_vlan_ip_range
1 parent d28388c commit a3089a8

6 files changed

+902
-0
lines changed
Lines changed: 212 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,212 @@
1+
//
2+
// Licensed to the Apache Software Foundation (ASF) under one
3+
// or more contributor license agreements. See the NOTICE file
4+
// distributed with this work for additional information
5+
// regarding copyright ownership. The ASF licenses this file
6+
// to you under the Apache License, Version 2.0 (the
7+
// "License"); you may not use this file except in compliance
8+
// with the License. You may obtain a copy of the License at
9+
//
10+
// http://www.apache.org/licenses/LICENSE-2.0
11+
//
12+
// Unless required by applicable law or agreed to in writing,
13+
// software distributed under the License is distributed on an
14+
// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
15+
// KIND, either express or implied. See the License for the
16+
// specific language governing permissions and limitations
17+
// under the License.
18+
//
19+
20+
package cloudstack
21+
22+
import (
23+
"fmt"
24+
25+
"github.com/apache/cloudstack-go/v2/cloudstack"
26+
"github.com/hashicorp/terraform/helper/schema"
27+
)
28+
29+
func resourceCloudStackNetworkServiceProviderState() *schema.Resource {
30+
return &schema.Resource{
31+
Create: resourceCloudStackNetworkServiceProviderStateUpdate,
32+
Read: resourceCloudStackNetworkServiceProviderStateRead,
33+
Update: resourceCloudStackNetworkServiceProviderStateUpdate,
34+
Delete: resourceCloudStackNetworkServiceProviderStateDelete,
35+
Importer: &schema.ResourceImporter{
36+
State: schema.ImportStatePassthrough,
37+
},
38+
Schema: map[string]*schema.Schema{
39+
"name": {
40+
Type: schema.TypeString,
41+
Required: true,
42+
},
43+
"physical_network_id": {
44+
Type: schema.TypeString,
45+
Required: true,
46+
},
47+
"enabled": {
48+
Type: schema.TypeBool,
49+
Required: true,
50+
},
51+
},
52+
}
53+
}
54+
55+
func resourceCloudStackNetworkServiceProviderStateRead(d *schema.ResourceData, meta interface{}) error {
56+
cs := meta.(*cloudstack.CloudStackClient)
57+
58+
nsp, err := getNetworkServiceProvider(cs, d)
59+
if err != nil {
60+
return err
61+
}
62+
63+
d.SetId(nsp.Id)
64+
d.Set("enabled", nsp.State)
65+
66+
return nil
67+
}
68+
69+
func resourceCloudStackNetworkServiceProviderStateUpdate(d *schema.ResourceData, meta interface{}) error {
70+
cs := meta.(*cloudstack.CloudStackClient)
71+
72+
// Network service provider
73+
nsp, err := getNetworkServiceProvider(cs, d)
74+
if err != nil {
75+
return err
76+
}
77+
78+
switch d.Get("name") {
79+
case "VirtualRouter", "VpcVirtualRouter":
80+
err := virtualRouterElementState(cs, nsp, d.Get("enabled").(bool))
81+
if err != nil {
82+
return err
83+
}
84+
case "InternalLbVm":
85+
err := internalLbVmElementState(cs, nsp, d.Get("enabled").(bool))
86+
if err != nil {
87+
return err
88+
}
89+
case "ConfigDrive":
90+
// No elements to configure
91+
default:
92+
return fmt.Errorf("Service provider (%s) name not supported.", d.Get("name"))
93+
}
94+
95+
// Service provider state
96+
pUNSPP := cs.Network.NewUpdateNetworkServiceProviderParams(nsp.Id)
97+
if d.Get("enabled").(bool) {
98+
pUNSPP.SetState("Enabled")
99+
} else {
100+
pUNSPP.SetState("Disabled")
101+
}
102+
_, err = cs.Network.UpdateNetworkServiceProvider(pUNSPP)
103+
if err != nil {
104+
return err
105+
}
106+
107+
return resourceCloudStackNetworkServiceProviderStateRead(d, meta)
108+
}
109+
110+
func resourceCloudStackNetworkServiceProviderStateDelete(d *schema.ResourceData, meta interface{}) error {
111+
cs := meta.(*cloudstack.CloudStackClient)
112+
113+
p := cs.Network.NewUpdateNetworkServiceProviderParams(d.Id())
114+
p.SetState("Disabled")
115+
116+
_, err := cs.Network.UpdateNetworkServiceProvider(p)
117+
if err != nil {
118+
return err
119+
}
120+
121+
d.SetId("")
122+
123+
return nil
124+
}
125+
126+
func getNetworkServiceProvider(cs *cloudstack.CloudStackClient, d *schema.ResourceData) (*cloudstack.NetworkServiceProvider, error) {
127+
p := cs.Network.NewListNetworkServiceProvidersParams()
128+
if _, ok := d.GetOk("name"); ok {
129+
p.SetName(d.Get("name").(string))
130+
}
131+
if _, ok := d.GetOk("physical_network_id"); ok {
132+
p.SetPhysicalnetworkid(d.Get("physical_network_id").(string))
133+
}
134+
135+
// list network service providers
136+
r, err := cs.Network.ListNetworkServiceProviders(p)
137+
if err != nil {
138+
return nil, err
139+
}
140+
141+
for _, nsp := range r.NetworkServiceProviders {
142+
if _, ok := d.GetOk("name"); ok {
143+
if nsp.Name == d.Get("name").(string) {
144+
return nsp, nil
145+
}
146+
} else if nsp.Id == d.Id() {
147+
return nsp, nil
148+
}
149+
}
150+
151+
return nil, fmt.Errorf("Service provider element id not found.")
152+
}
153+
154+
func virtualRouterElementState(cs *cloudstack.CloudStackClient, nsp *cloudstack.NetworkServiceProvider, state bool) error {
155+
// VirtualRouterElement state
156+
p := cs.Router.NewListVirtualRouterElementsParams()
157+
p.SetNspid(nsp.Id)
158+
159+
vre, err := cs.Router.ListVirtualRouterElements(p)
160+
if err != nil {
161+
return err
162+
}
163+
164+
var vreID string
165+
for _, e := range vre.VirtualRouterElements {
166+
if nsp.Id == e.Nspid {
167+
vreID = e.Id
168+
break
169+
}
170+
return fmt.Errorf("Service provider element id (nspod) not found: %s.", nsp.Id)
171+
}
172+
173+
_, err = cs.Router.ConfigureVirtualRouterElement(cs.Router.NewConfigureVirtualRouterElementParams(state, vreID))
174+
if err != nil {
175+
return err
176+
}
177+
178+
return nil
179+
180+
}
181+
182+
func internalLbVmElementState(cs *cloudstack.CloudStackClient, nsp *cloudstack.NetworkServiceProvider, state bool) error {
183+
// InternalLoadBalancerElement state
184+
p := cs.InternalLB.NewListInternalLoadBalancerElementsParams()
185+
p.SetNspid(nsp.Id)
186+
187+
ilbe, err := cs.InternalLB.ListInternalLoadBalancerElements(p)
188+
if err != nil {
189+
return err
190+
}
191+
192+
var ilbeID string
193+
for _, e := range ilbe.InternalLoadBalancerElements {
194+
if nsp.Id == e.Nspid {
195+
ilbeID = e.Id
196+
break
197+
}
198+
return fmt.Errorf("Service provider element id (nspod) not found: %s.", nsp.Id)
199+
}
200+
201+
ilvm, err := cs.InternalLB.ConfigureInternalLoadBalancerElement(cs.InternalLB.NewConfigureInternalLoadBalancerElementParams(state, ilbeID))
202+
if err != nil {
203+
return err
204+
}
205+
206+
_, err = cs.InternalLB.ConfigureInternalLoadBalancerElement(cs.InternalLB.NewConfigureInternalLoadBalancerElementParams(state, ilvm.Id))
207+
if err != nil {
208+
return err
209+
}
210+
211+
return nil
212+
}
Lines changed: 133 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,133 @@
1+
//
2+
// Licensed to the Apache Software Foundation (ASF) under one
3+
// or more contributor license agreements. See the NOTICE file
4+
// distributed with this work for additional information
5+
// regarding copyright ownership. The ASF licenses this file
6+
// to you under the Apache License, Version 2.0 (the
7+
// "License"); you may not use this file except in compliance
8+
// with the License. You may obtain a copy of the License at
9+
//
10+
// http://www.apache.org/licenses/LICENSE-2.0
11+
//
12+
// Unless required by applicable law or agreed to in writing,
13+
// software distributed under the License is distributed on an
14+
// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
15+
// KIND, either express or implied. See the License for the
16+
// specific language governing permissions and limitations
17+
// under the License.
18+
//
19+
20+
package cloudstack
21+
22+
import (
23+
"testing"
24+
25+
"github.com/hashicorp/terraform/helper/resource"
26+
)
27+
28+
func TestAccCloudstackNetworkServiceProviderState_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: testAccCloudstackNetworkServiceProviderState_basic,
35+
Check: resource.ComposeTestCheckFunc(
36+
resource.TestCheckResourceAttr("cloudstack_network_service_provider_state.virtualrouter", "enabled", "true"),
37+
resource.TestCheckResourceAttr("cloudstack_network_service_provider_state.vpcvirtualrouter", "enabled", "true"),
38+
resource.TestCheckResourceAttr("cloudstack_network_service_provider_state.internallbvm", "enabled", "false"),
39+
resource.TestCheckResourceAttr("cloudstack_network_service_provider_state.configdrive", "enabled", "false"),
40+
),
41+
},
42+
{
43+
Config: testAccCloudstackNetworkServiceProviderState_update,
44+
Check: resource.ComposeTestCheckFunc(
45+
resource.TestCheckResourceAttr("cloudstack_network_service_provider_state.virtualrouter", "enabled", "false"),
46+
resource.TestCheckResourceAttr("cloudstack_network_service_provider_state.vpcvirtualrouter", "enabled", "false"),
47+
resource.TestCheckResourceAttr("cloudstack_network_service_provider_state.internallbvm", "enabled", "true"),
48+
resource.TestCheckResourceAttr("cloudstack_network_service_provider_state.configdrive", "enabled", "true"),
49+
),
50+
},
51+
},
52+
})
53+
}
54+
55+
const testAccCloudstackNetworkServiceProviderState_basic = `
56+
resource "cloudstack_zone" "test" {
57+
name = "acctest"
58+
dns1 = "8.8.8.8"
59+
dns2 = "8.8.8.8"
60+
internal_dns1 = "8.8.4.4"
61+
internal_dns2 = "8.8.4.4"
62+
network_type = "Advanced"
63+
domain = "cloudstack.apache.org"
64+
}
65+
resource "cloudstack_physical_network" "test" {
66+
broadcast_domain_range = "ZONE"
67+
isolation_methods = "VLAN"
68+
name = "test01"
69+
network_speed = "1G"
70+
tags = "vlan"
71+
zone_id = cloudstack_zone.test.id
72+
}
73+
resource "cloudstack_network_service_provider_state" "virtualrouter" {
74+
name = "VirtualRouter"
75+
physical_network_id = cloudstack_physical_network.test.id
76+
enabled = true
77+
}
78+
resource "cloudstack_network_service_provider_state" "vpcvirtualrouter" {
79+
name = "VpcVirtualRouter"
80+
physical_network_id = cloudstack_physical_network.test.id
81+
enabled = true
82+
}
83+
resource "cloudstack_network_service_provider_state" "internallbvm" {
84+
name = "InternalLbVm"
85+
physical_network_id = cloudstack_physical_network.test.id
86+
enabled = false
87+
}
88+
resource "cloudstack_network_service_provider_state" "configdrive" {
89+
name = "ConfigDrive"
90+
physical_network_id = cloudstack_physical_network.test.id
91+
enabled = false
92+
}
93+
`
94+
95+
const testAccCloudstackNetworkServiceProviderState_update = `
96+
resource "cloudstack_zone" "test" {
97+
name = "acctest"
98+
dns1 = "8.8.8.8"
99+
dns2 = "8.8.8.8"
100+
internal_dns1 = "8.8.4.4"
101+
internal_dns2 = "8.8.4.4"
102+
network_type = "Advanced"
103+
domain = "cloudstack.apache.org"
104+
}
105+
resource "cloudstack_physical_network" "test" {
106+
broadcast_domain_range = "ZONE"
107+
isolation_methods = "VLAN"
108+
name = "test01"
109+
network_speed = "1G"
110+
tags = "vlan"
111+
zone_id = cloudstack_zone.test.id
112+
}
113+
resource "cloudstack_network_service_provider_state" "virtualrouter" {
114+
name = "VirtualRouter"
115+
physical_network_id = cloudstack_physical_network.test.id
116+
enabled = false
117+
}
118+
resource "cloudstack_network_service_provider_state" "vpcvirtualrouter" {
119+
name = "VpcVirtualRouter"
120+
physical_network_id = cloudstack_physical_network.test.id
121+
enabled = false
122+
}
123+
resource "cloudstack_network_service_provider_state" "internallbvm" {
124+
name = "InternalLbVm"
125+
physical_network_id = cloudstack_physical_network.test.id
126+
enabled = true
127+
}
128+
resource "cloudstack_network_service_provider_state" "configdrive" {
129+
name = "ConfigDrive"
130+
physical_network_id = cloudstack_physical_network.test.id
131+
enabled = true
132+
}
133+
`

0 commit comments

Comments
 (0)