Skip to content

Commit ec5cef4

Browse files
author
Sander van Harmelen
committed
Merge pull request hashicorp#2115 from jalemieux/master
provider/cloudstack: add project support for CloudStack Instances
2 parents eabbc31 + 1d9df96 commit ec5cef4

4 files changed

Lines changed: 101 additions & 1 deletion

File tree

builtin/providers/cloudstack/provider_test.go

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -89,3 +89,6 @@ var CLOUDSTACK_TEMPLATE_FORMAT = ""
8989
var CLOUDSTACK_TEMPLATE_URL = ""
9090
var CLOUDSTACK_TEMPLATE_OS_TYPE = ""
9191
var CLOUDSTACK_ZONE = ""
92+
var CLOUDSTACK_PROJECT_NAME = ""
93+
var CLOUDSTACK_PROJECT_ID = ""
94+

builtin/providers/cloudstack/resource_cloudstack_instance.go

Lines changed: 19 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -87,6 +87,13 @@ func resourceCloudStackInstance() *schema.Resource {
8787
Optional: true,
8888
Default: false,
8989
},
90+
91+
"project": &schema.Schema{
92+
Type: schema.TypeString,
93+
Optional: true,
94+
ForceNew: true,
95+
},
96+
9097
},
9198
}
9299
}
@@ -157,6 +164,16 @@ func resourceCloudStackInstanceCreate(d *schema.ResourceData, meta interface{})
157164
p.SetUserdata(ud)
158165
}
159166

167+
// If project contains any info, we retreive the project id
168+
if project, ok := d.GetOk("project"); ok {
169+
projectid, e := retrieveUUID(cs, "project", project.(string))
170+
if e != nil {
171+
return e.Error()
172+
}
173+
log.Printf("[DEBUG] project id %s", projectid)
174+
p.SetProjectid(projectid)
175+
}
176+
160177
// Create the new instance
161178
r, err := cs.VirtualMachine.DeployVirtualMachine(p)
162179
if err != nil {
@@ -200,7 +217,8 @@ func resourceCloudStackInstanceRead(d *schema.ResourceData, meta interface{}) er
200217
setValueOrUUID(d, "network", vm.Nic[0].Networkname, vm.Nic[0].Networkid)
201218
setValueOrUUID(d, "service_offering", vm.Serviceofferingname, vm.Serviceofferingid)
202219
setValueOrUUID(d, "template", vm.Templatename, vm.Templateid)
203-
220+
setValueOrUUID(d, "project", vm.Project, vm.Projectid)
221+
204222
return nil
205223
}
206224

builtin/providers/cloudstack/resource_cloudstack_instance_test.go

Lines changed: 77 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -99,6 +99,48 @@ func TestAccCloudStackInstance_fixedIP(t *testing.T) {
9999
})
100100
}
101101

102+
func TestAccCloudStackInstance_Projectname(t *testing.T) {
103+
var instance cloudstack.VirtualMachine
104+
105+
resource.Test(t, resource.TestCase{
106+
PreCheck: func() { testAccPreCheck(t) },
107+
Providers: testAccProviders,
108+
CheckDestroy: testAccCheckCloudStackInstanceDestroy,
109+
Steps: []resource.TestStep{
110+
resource.TestStep{
111+
Config: testAccCloudStackInstance_projectname,
112+
Check: resource.ComposeTestCheckFunc(
113+
testAccCheckCloudStackInstanceExists(
114+
"cloudstack_instance.foobar", &instance),
115+
resource.TestCheckResourceAttr(
116+
"cloudstack_instance.foobar", "project", CLOUDSTACK_PROJECT_NAME),
117+
),
118+
},
119+
},
120+
})
121+
}
122+
123+
func TestAccCloudStackInstance_Projectid(t *testing.T) {
124+
var instance cloudstack.VirtualMachine
125+
126+
resource.Test(t, resource.TestCase{
127+
PreCheck: func() { testAccPreCheck(t) },
128+
Providers: testAccProviders,
129+
CheckDestroy: testAccCheckCloudStackInstanceDestroy,
130+
Steps: []resource.TestStep{
131+
resource.TestStep{
132+
Config: testAccCloudStackInstance_projectid,
133+
Check: resource.ComposeTestCheckFunc(
134+
testAccCheckCloudStackInstanceExists(
135+
"cloudstack_instance.foobar", &instance),
136+
resource.TestCheckResourceAttr(
137+
"cloudstack_instance.foobar", "project", CLOUDSTACK_PROJECT_ID),
138+
),
139+
},
140+
},
141+
})
142+
}
143+
102144
func testAccCheckCloudStackInstanceExists(
103145
n string, instance *cloudstack.VirtualMachine) resource.TestCheckFunc {
104146
return func(s *terraform.State) error {
@@ -249,3 +291,38 @@ resource "cloudstack_instance" "foobar" {
249291
CLOUDSTACK_NETWORK_1_IPADDRESS,
250292
CLOUDSTACK_TEMPLATE,
251293
CLOUDSTACK_ZONE)
294+
295+
296+
var testAccCloudStackInstance_projectname = fmt.Sprintf(`
297+
resource "cloudstack_instance" "foobar" {
298+
name = "terraform-test"
299+
display_name = "terraform"
300+
service_offering= "%s"
301+
network = "%s"
302+
template = "%s"
303+
zone = "%s"
304+
expunge = true
305+
project = "%s"
306+
}`,
307+
CLOUDSTACK_SERVICE_OFFERING_1,
308+
CLOUDSTACK_NETWORK_1,
309+
CLOUDSTACK_TEMPLATE,
310+
CLOUDSTACK_ZONE,
311+
CLOUDSTACK_PROJECT_NAME)
312+
313+
var testAccCloudStackInstance_projectid = fmt.Sprintf(`
314+
resource "cloudstack_instance" "foobar" {
315+
name = "terraform-test"
316+
display_name = "terraform"
317+
service_offering= "%s"
318+
network = "%s"
319+
template = "%s"
320+
zone = "%s"
321+
expunge = true
322+
project = "%s"
323+
}`,
324+
CLOUDSTACK_SERVICE_OFFERING_1,
325+
CLOUDSTACK_NETWORK_1,
326+
CLOUDSTACK_TEMPLATE,
327+
CLOUDSTACK_ZONE,
328+
CLOUDSTACK_PROJECT_ID)

builtin/providers/cloudstack/resources.go

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -79,6 +79,8 @@ func retrieveUUID(cs *cloudstack.CloudStackClient, name, value string) (uuid str
7979
break
8080
}
8181
err = fmt.Errorf("Could not find UUID of OS Type: %s", value)
82+
case "project":
83+
uuid, err = cs.Project.GetProjectID(value)
8284
default:
8385
return uuid, &retrieveError{name: name, value: value,
8486
err: fmt.Errorf("Unknown request: %s", name)}

0 commit comments

Comments
 (0)