Skip to content

Commit 27a49d8

Browse files
committed
cloudstack configuration resource
1 parent a653531 commit 27a49d8

File tree

3 files changed

+329
-0
lines changed

3 files changed

+329
-0
lines changed

cloudstack/provider.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -96,6 +96,7 @@ func Provider() *schema.Provider {
9696
"cloudstack_affinity_group": resourceCloudStackAffinityGroup(),
9797
"cloudstack_attach_volume": resourceCloudStackAttachVolume(),
9898
"cloudstack_autoscale_vm_profile": resourceCloudStackAutoScaleVMProfile(),
99+
"cloudstack_configuration": resourceCloudStackConfiguration(),
99100
"cloudstack_disk": resourceCloudStackDisk(),
100101
"cloudstack_egress_firewall": resourceCloudStackEgressFirewall(),
101102
"cloudstack_firewall": resourceCloudStackFirewall(),
Lines changed: 227 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,227 @@
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 resourceCloudStackConfiguration() *schema.Resource {
30+
return &schema.Resource{
31+
Create: resourceCloudStackConfigurationCreate,
32+
Read: resourceCloudStackConfigurationRead,
33+
Update: resourceCloudStackConfigurationUpdate,
34+
Delete: resourceCloudStackConfigurationDelete,
35+
Importer: &schema.ResourceImporter{
36+
State: importStatePassthrough,
37+
},
38+
39+
Schema: map[string]*schema.Schema{
40+
"name": {
41+
Type: schema.TypeString,
42+
Required: true,
43+
},
44+
"accountid": {
45+
Type: schema.TypeString,
46+
Optional: true,
47+
},
48+
"clusterid": {
49+
Type: schema.TypeString,
50+
Optional: true,
51+
},
52+
"domainid": {
53+
Type: schema.TypeString,
54+
Optional: true,
55+
},
56+
"imagestoreuuid": {
57+
Type: schema.TypeString,
58+
Optional: true,
59+
},
60+
"storeid": {
61+
Type: schema.TypeString,
62+
Optional: true,
63+
},
64+
"value": {
65+
Type: schema.TypeString,
66+
Optional: true,
67+
},
68+
"zoneid": {
69+
Type: schema.TypeString,
70+
Optional: true,
71+
},
72+
// computed
73+
"category": {
74+
Type: schema.TypeString,
75+
Computed: true,
76+
},
77+
"description": {
78+
Type: schema.TypeString,
79+
Computed: true,
80+
},
81+
"is_dynamic": {
82+
Type: schema.TypeString,
83+
Computed: true,
84+
},
85+
"scope": {
86+
Type: schema.TypeString,
87+
Computed: true,
88+
},
89+
},
90+
}
91+
}
92+
93+
func resourceCloudStackConfigurationRead(d *schema.ResourceData, meta interface{}) error {
94+
cs := meta.(*cloudstack.CloudStackClient)
95+
p := cs.Configuration.NewListConfigurationsParams()
96+
97+
// required
98+
p.SetName(d.Id())
99+
100+
// optional
101+
if v, ok := d.GetOk("accountid"); ok {
102+
p.SetAccountid(v.(string))
103+
}
104+
if v, ok := d.GetOk("category"); ok {
105+
p.SetCategory(v.(string))
106+
}
107+
if v, ok := d.GetOk("clusterid"); ok {
108+
p.SetClusterid(v.(string))
109+
}
110+
if v, ok := d.GetOk("domainid"); ok {
111+
p.SetDomainid(v.(string))
112+
}
113+
if v, ok := d.GetOk("imagestoreuuid"); ok {
114+
p.SetImagestoreuuid(v.(string))
115+
}
116+
if v, ok := d.GetOk("storeid"); ok {
117+
p.SetStorageid(v.(string))
118+
}
119+
if v, ok := d.GetOk("zoneid"); ok {
120+
p.SetZoneid(v.(string))
121+
}
122+
123+
cfg, err := cs.Configuration.ListConfigurations(p)
124+
if err != nil {
125+
return err
126+
}
127+
128+
found := false
129+
for _, v := range cfg.Configurations {
130+
if v.Name == d.Id() {
131+
d.Set("category", v.Category)
132+
d.Set("description", v.Description)
133+
d.Set("is_dynamic", v.Isdynamic)
134+
d.Set("name", v.Name)
135+
d.Set("value", v.Value)
136+
d.Set("scope", v.Scope)
137+
found = true
138+
}
139+
}
140+
141+
if !found {
142+
return fmt.Errorf("listConfiguration failed. no matching names found %s", d.Id())
143+
}
144+
145+
return nil
146+
147+
}
148+
149+
func resourceCloudStackConfigurationCreate(d *schema.ResourceData, meta interface{}) error {
150+
if v, ok := d.GetOk("name"); ok {
151+
d.SetId(v.(string))
152+
}
153+
154+
resourceCloudStackConfigurationUpdate(d, meta)
155+
156+
return nil
157+
158+
}
159+
160+
func resourceCloudStackConfigurationUpdate(d *schema.ResourceData, meta interface{}) error {
161+
cs := meta.(*cloudstack.CloudStackClient)
162+
p := cs.Configuration.NewUpdateConfigurationParams(d.Id())
163+
164+
// Optional
165+
if v, ok := d.GetOk("accountid"); ok {
166+
p.SetAccountid(v.(string))
167+
}
168+
if v, ok := d.GetOk("clusterid"); ok {
169+
p.SetClusterid(v.(string))
170+
}
171+
if v, ok := d.GetOk("domainid"); ok {
172+
p.SetDomainid(v.(string))
173+
}
174+
if v, ok := d.GetOk("imagestoreuuid"); ok {
175+
p.SetImagestoreuuid(v.(string))
176+
}
177+
if v, ok := d.GetOk("storeid"); ok {
178+
p.SetStorageid(v.(string))
179+
}
180+
if v, ok := d.GetOk("value"); ok {
181+
p.SetValue(v.(string))
182+
}
183+
if v, ok := d.GetOk("zoneid"); ok {
184+
p.SetZoneid(v.(string))
185+
}
186+
187+
_, err := cs.Configuration.UpdateConfiguration(p)
188+
if err != nil {
189+
return err
190+
}
191+
192+
resourceCloudStackConfigurationRead(d, meta)
193+
194+
return nil
195+
}
196+
197+
func resourceCloudStackConfigurationDelete(d *schema.ResourceData, meta interface{}) error {
198+
cs := meta.(*cloudstack.CloudStackClient)
199+
p := cs.Configuration.NewResetConfigurationParams(d.Id())
200+
201+
// Optional
202+
if v, ok := d.GetOk("accountid"); ok {
203+
p.SetAccountid(v.(string))
204+
}
205+
if v, ok := d.GetOk("clusterid"); ok {
206+
p.SetClusterid(v.(string))
207+
}
208+
if v, ok := d.GetOk("domainid"); ok {
209+
p.SetDomainid(v.(string))
210+
}
211+
if v, ok := d.GetOk("imagestoreuuid"); ok {
212+
p.SetImagestoreid(v.(string))
213+
}
214+
if v, ok := d.GetOk("storeid"); ok {
215+
p.SetStorageid(v.(string))
216+
}
217+
if v, ok := d.GetOk("zoneid"); ok {
218+
p.SetZoneid(v.(string))
219+
}
220+
221+
_, err := cs.Configuration.ResetConfiguration(p)
222+
if err != nil {
223+
return err
224+
}
225+
226+
return nil
227+
}
Lines changed: 101 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,101 @@
1+
package cloudstack
2+
3+
import (
4+
"fmt"
5+
"testing"
6+
7+
"github.com/apache/cloudstack-go/v2/cloudstack"
8+
"github.com/hashicorp/terraform/helper/resource"
9+
"github.com/hashicorp/terraform/terraform"
10+
)
11+
12+
func TestAccCloudStackConfiguration_basic(t *testing.T) {
13+
var configuration cloudstack.ListConfigurationsResponse
14+
15+
resource.Test(t, resource.TestCase{
16+
PreCheck: func() { testAccPreCheck(t) },
17+
Providers: testAccProviders,
18+
CheckDestroy: testAccCheckCloudStackConfigurationDestroy,
19+
Steps: []resource.TestStep{
20+
{
21+
Config: testAccResourceConfiguration(),
22+
Check: resource.ComposeTestCheckFunc(
23+
testAccCheckCloudStackConfigurationExists("cloudstack_configuration.test", &configuration),
24+
resource.TestCheckResourceAttr("cloudstack_configuration.test", "value", "test_host"),
25+
),
26+
},
27+
},
28+
})
29+
}
30+
31+
func TestAccCloudStackConfiguration_import(t *testing.T) {
32+
resource.Test(t, resource.TestCase{
33+
PreCheck: func() { testAccPreCheck(t) },
34+
Providers: testAccProviders,
35+
Steps: []resource.TestStep{
36+
{
37+
Config: testAccResourceConfiguration(),
38+
},
39+
40+
{
41+
ResourceName: "cloudstack_configuration.test",
42+
ImportState: true,
43+
ImportStateVerify: true,
44+
},
45+
},
46+
})
47+
}
48+
49+
func testAccCheckCloudStackConfigurationExists(n string, configuration *cloudstack.ListConfigurationsResponse) resource.TestCheckFunc {
50+
return func(s *terraform.State) error {
51+
rs, ok := s.RootModule().Resources[n]
52+
if !ok {
53+
return fmt.Errorf("Not found: %s", n)
54+
}
55+
56+
if rs.Primary.ID == "" {
57+
return fmt.Errorf("configuration ID not set")
58+
}
59+
60+
cs := testAccProvider.Meta().(*cloudstack.CloudStackClient)
61+
p := cs.Configuration.NewListConfigurationsParams()
62+
p.SetName(rs.Primary.ID)
63+
64+
cfg, err := cs.Configuration.ListConfigurations(p)
65+
if err != nil {
66+
return err
67+
}
68+
69+
*configuration = *cfg
70+
71+
return nil
72+
}
73+
}
74+
75+
func testAccCheckCloudStackConfigurationAttributes(configuration *cloudstack.ListConfigurationsResponse) resource.TestCheckFunc {
76+
return func(s *terraform.State) error {
77+
for _, v := range configuration.Configurations {
78+
if v.Name == "host" {
79+
if v.Value != "test_host" {
80+
return fmt.Errorf("Bad value: %s", v.Value)
81+
}
82+
return nil
83+
}
84+
}
85+
return fmt.Errorf("Bad name: %s", "host")
86+
}
87+
}
88+
89+
func testAccCheckCloudStackConfigurationDestroy(s *terraform.State) error {
90+
return nil
91+
92+
}
93+
94+
func testAccResourceConfiguration() string {
95+
return fmt.Sprintf(`
96+
resource "cloudstack_configuration" "test" {
97+
name = "host"
98+
value = "test_host"
99+
}
100+
`)
101+
}

0 commit comments

Comments
 (0)