Skip to content

Commit 54a6e9e

Browse files
committed
Adding resources cloudstack_network_service_provider_state and cloudstack_vlan_ip_range
1 parent 2d58a60 commit 54a6e9e

7 files changed

+945
-43
lines changed

cloudstack/provider.go

Lines changed: 43 additions & 43 deletions
Original file line numberDiff line numberDiff line change
@@ -91,49 +91,49 @@ func New() *schema.Provider {
9191
},
9292

9393
ResourcesMap: map[string]*schema.Resource{
94-
"cloudstack_affinity_group": resourceCloudStackAffinityGroup(),
95-
"cloudstack_attach_volume": resourceCloudStackAttachVolume(),
96-
"cloudstack_autoscale_vm_profile": resourceCloudStackAutoScaleVMProfile(),
97-
"cloudstack_cluster": resourceCloudStackCluster(),
98-
"cloudstack_disk": resourceCloudStackDisk(),
99-
"cloudstack_egress_firewall": resourceCloudStackEgressFirewall(),
100-
"cloudstack_firewall": resourceCloudStackFirewall(),
101-
"cloudstack_host": resourceCloudStackHost(),
102-
"cloudstack_instance": resourceCloudStackInstance(),
103-
"cloudstack_ipaddress": resourceCloudStackIPAddress(),
104-
"cloudstack_kubernetes_cluster": resourceCloudStackKubernetesCluster(),
105-
"cloudstack_kubernetes_version": resourceCloudStackKubernetesVersion(),
106-
"cloudstack_loadbalancer_rule": resourceCloudStackLoadBalancerRule(),
107-
"cloudstack_network": resourceCloudStackNetwork(),
108-
"cloudstack_network_acl": resourceCloudStackNetworkACL(),
109-
"cloudstack_network_acl_rule": resourceCloudStackNetworkACLRule(),
110-
"cloudstack_nic": resourceCloudStackNIC(),
111-
"cloudstack_physical_network": resourceCloudStackPhysicalNetwork(),
112-
"cloudstack_pod": resourceCloudStackPod(),
113-
"cloudstack_port_forward": resourceCloudStackPortForward(),
114-
"cloudstack_private_gateway": resourceCloudStackPrivateGateway(),
115-
"cloudstack_secondary_ipaddress": resourceCloudStackSecondaryIPAddress(),
116-
"cloudstack_secondary_storage": resourceCloudStackSecondaryStorage(),
117-
"cloudstack_security_group": resourceCloudStackSecurityGroup(),
118-
"cloudstack_security_group_rule": resourceCloudStackSecurityGroupRule(),
119-
"cloudstack_ssh_keypair": resourceCloudStackSSHKeyPair(),
120-
"cloudstack_static_nat": resourceCloudStackStaticNAT(),
121-
"cloudstack_static_route": resourceCloudStackStaticRoute(),
122-
"cloudstack_storage_pool": resourceCloudStackStoragePool(),
123-
"cloudstack_template": resourceCloudStackTemplate(),
124-
"cloudstack_traffic_type": resourceCloudStackTrafficType(),
125-
"cloudstack_vpc": resourceCloudStackVPC(),
126-
"cloudstack_vpn_connection": resourceCloudStackVPNConnection(),
127-
"cloudstack_vpn_customer_gateway": resourceCloudStackVPNCustomerGateway(),
128-
"cloudstack_vpn_gateway": resourceCloudStackVPNGateway(),
129-
"cloudstack_network_offering": resourceCloudStackNetworkOffering(),
130-
"cloudstack_disk_offering": resourceCloudStackDiskOffering(),
131-
"cloudstack_volume": resourceCloudStackVolume(),
132-
"cloudstack_zone": resourceCloudStackZone(),
133-
"cloudstack_service_offering": resourceCloudStackServiceOffering(),
134-
"cloudstack_account": resourceCloudStackAccount(),
135-
"cloudstack_user": resourceCloudStackUser(),
136-
"cloudstack_domain": resourceCloudStackDomain(),
94+
"cloudstack_affinity_group": resourceCloudStackAffinityGroup(),
95+
"cloudstack_autoscale_vm_profile": resourceCloudStackAutoScaleVMProfile(),
96+
"cloudstack_cluster": resourceCloudStackCluster(),
97+
"cloudstack_disk": resourceCloudStackDisk(),
98+
"cloudstack_egress_firewall": resourceCloudStackEgressFirewall(),
99+
"cloudstack_firewall": resourceCloudStackFirewall(),
100+
"cloudstack_instance": resourceCloudStackInstance(),
101+
"cloudstack_ipaddress": resourceCloudStackIPAddress(),
102+
"cloudstack_kubernetes_cluster": resourceCloudStackKubernetesCluster(),
103+
"cloudstack_kubernetes_version": resourceCloudStackKubernetesVersion(),
104+
"cloudstack_loadbalancer_rule": resourceCloudStackLoadBalancerRule(),
105+
"cloudstack_network": resourceCloudStackNetwork(),
106+
"cloudstack_network_acl": resourceCloudStackNetworkACL(),
107+
"cloudstack_network_acl_rule": resourceCloudStackNetworkACLRule(),
108+
"cloudstack_network_service_provider_state": resourceCloudStackNetworkServiceProviderState(),
109+
"cloudstack_nic": resourceCloudStackNIC(),
110+
"cloudstack_physical_network": resourceCloudStackPhysicalNetwork(),
111+
"cloudstack_pod": resourceCloudStackPod(),
112+
"cloudstack_port_forward": resourceCloudStackPortForward(),
113+
"cloudstack_private_gateway": resourceCloudStackPrivateGateway(),
114+
"cloudstack_secondary_ipaddress": resourceCloudStackSecondaryIPAddress(),
115+
"cloudstack_secondary_storage": resourceCloudStackSecondaryStorage(),
116+
"cloudstack_security_group": resourceCloudStackSecurityGroup(),
117+
"cloudstack_security_group_rule": resourceCloudStackSecurityGroupRule(),
118+
"cloudstack_ssh_keypair": resourceCloudStackSSHKeyPair(),
119+
"cloudstack_static_nat": resourceCloudStackStaticNAT(),
120+
"cloudstack_static_route": resourceCloudStackStaticRoute(),
121+
"cloudstack_storage_pool": resourceCloudStackStoragePool(),
122+
"cloudstack_template": resourceCloudStackTemplate(),
123+
"cloudstack_traffic_type": resourceCloudStackTrafficType(),
124+
"cloudstack_vpc": resourceCloudStackVPC(),
125+
"cloudstack_vpn_connection": resourceCloudStackVPNConnection(),
126+
"cloudstack_vpn_customer_gateway": resourceCloudStackVPNCustomerGateway(),
127+
"cloudstack_vpn_gateway": resourceCloudStackVPNGateway(),
128+
"cloudstack_network_offering": resourceCloudStackNetworkOffering(),
129+
"cloudstack_disk_offering": resourceCloudStackDiskOffering(),
130+
"cloudstack_vlan_ip_range": resourceCloudstackVlanIpRange(),
131+
"cloudstack_volume": resourceCloudStackVolume(),
132+
"cloudstack_zone": resourceCloudStackZone(),
133+
"cloudstack_service_offering": resourceCloudStackServiceOffering(),
134+
"cloudstack_account": resourceCloudStackAccount(),
135+
"cloudstack_user": resourceCloudStackUser(),
136+
"cloudstack_domain": resourceCloudStackDomain(),
137137
},
138138

139139
ConfigureFunc: providerConfigure,
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+
}

0 commit comments

Comments
 (0)