Add support to import resources when using projects
diff --git a/cloudstack/resource_cloudstack_affinity_group.go b/cloudstack/resource_cloudstack_affinity_group.go
index 1b6ffc6..a6af3e0 100644
--- a/cloudstack/resource_cloudstack_affinity_group.go
+++ b/cloudstack/resource_cloudstack_affinity_group.go
@@ -15,7 +15,7 @@
Read: resourceCloudStackAffinityGroupRead,
Delete: resourceCloudStackAffinityGroupDelete,
Importer: &schema.ResourceImporter{
- State: schema.ImportStatePassthrough,
+ State: importStatePassthrough,
},
Schema: map[string]*schema.Schema{
diff --git a/cloudstack/resource_cloudstack_disk.go b/cloudstack/resource_cloudstack_disk.go
index c79ed6c..42f0c45 100644
--- a/cloudstack/resource_cloudstack_disk.go
+++ b/cloudstack/resource_cloudstack_disk.go
@@ -15,7 +15,7 @@
Update: resourceCloudStackDiskUpdate,
Delete: resourceCloudStackDiskDelete,
Importer: &schema.ResourceImporter{
- State: schema.ImportStatePassthrough,
+ State: importStatePassthrough,
},
Schema: map[string]*schema.Schema{
diff --git a/cloudstack/resource_cloudstack_instance.go b/cloudstack/resource_cloudstack_instance.go
index b047964..99cb2a9 100644
--- a/cloudstack/resource_cloudstack_instance.go
+++ b/cloudstack/resource_cloudstack_instance.go
@@ -620,7 +620,7 @@
// We set start_vm to true as that matches the default and we assume that
// when you need to import an instance it means it is already running.
d.Set("start_vm", true)
- return []*schema.ResourceData{d}, nil
+ return importStatePassthrough(d, meta)
}
// getUserData returns the user data as a base64 encoded string
diff --git a/cloudstack/resource_cloudstack_instance_test.go b/cloudstack/resource_cloudstack_instance_test.go
index 395ffdd..611545d 100644
--- a/cloudstack/resource_cloudstack_instance_test.go
+++ b/cloudstack/resource_cloudstack_instance_test.go
@@ -172,6 +172,27 @@
})
}
+func TestAccCloudStackInstance_importProject(t *testing.T) {
+ resource.Test(t, resource.TestCase{
+ PreCheck: func() { testAccPreCheck(t) },
+ Providers: testAccProviders,
+ CheckDestroy: testAccCheckCloudStackInstanceDestroy,
+ Steps: []resource.TestStep{
+ {
+ Config: testAccCloudStackInstance_project,
+ },
+
+ {
+ ResourceName: "cloudstack_instance.foobar",
+ ImportState: true,
+ ImportStateIdPrefix: "terraform/",
+ ImportStateVerify: true,
+ ImportStateVerifyIgnore: []string{"expunge", "user_data"},
+ },
+ },
+ })
+}
+
func testAccCheckCloudStackInstanceExists(
n string, instance *cloudstack.VirtualMachine) resource.TestCheckFunc {
return func(s *terraform.State) error {
@@ -185,7 +206,10 @@
}
cs := testAccProvider.Meta().(*cloudstack.CloudStackClient)
- vm, _, err := cs.VirtualMachine.GetVirtualMachineByID(rs.Primary.ID)
+ vm, _, err := cs.VirtualMachine.GetVirtualMachineByID(
+ rs.Primary.ID,
+ cloudstack.WithProject(rs.Primary.Attributes["project"]),
+ )
if err != nil {
return err
diff --git a/cloudstack/resource_cloudstack_network.go b/cloudstack/resource_cloudstack_network.go
index 74d1891..b10c675 100644
--- a/cloudstack/resource_cloudstack_network.go
+++ b/cloudstack/resource_cloudstack_network.go
@@ -38,7 +38,7 @@
Update: resourceCloudStackNetworkUpdate,
Delete: resourceCloudStackNetworkDelete,
Importer: &schema.ResourceImporter{
- State: schema.ImportStatePassthrough,
+ State: importStatePassthrough,
},
Schema: map[string]*schema.Schema{
diff --git a/cloudstack/resource_cloudstack_network_acl.go b/cloudstack/resource_cloudstack_network_acl.go
index 0f3dcb1..6552a05 100644
--- a/cloudstack/resource_cloudstack_network_acl.go
+++ b/cloudstack/resource_cloudstack_network_acl.go
@@ -15,7 +15,7 @@
Read: resourceCloudStackNetworkACLRead,
Delete: resourceCloudStackNetworkACLDelete,
Importer: &schema.ResourceImporter{
- State: schema.ImportStatePassthrough,
+ State: importStatePassthrough,
},
Schema: map[string]*schema.Schema{
diff --git a/cloudstack/resource_cloudstack_network_test.go b/cloudstack/resource_cloudstack_network_test.go
index 7e5b6cf..144bfef 100644
--- a/cloudstack/resource_cloudstack_network_test.go
+++ b/cloudstack/resource_cloudstack_network_test.go
@@ -30,6 +30,27 @@
})
}
+func TestAccCloudStackNetwork_project(t *testing.T) {
+ var network cloudstack.Network
+
+ resource.Test(t, resource.TestCase{
+ PreCheck: func() { testAccPreCheck(t) },
+ Providers: testAccProviders,
+ CheckDestroy: testAccCheckCloudStackNetworkDestroy,
+ Steps: []resource.TestStep{
+ {
+ Config: testAccCloudStackNetwork_project,
+ Check: resource.ComposeTestCheckFunc(
+ testAccCheckCloudStackNetworkExists(
+ "cloudstack_network.foo", &network),
+ resource.TestCheckResourceAttr(
+ "cloudstack_network.foo", "project", "terraform"),
+ ),
+ },
+ },
+ })
+}
+
func TestAccCloudStackNetwork_vpc(t *testing.T) {
var network cloudstack.Network
@@ -98,6 +119,26 @@
})
}
+func TestAccCloudStackNetwork_importProject(t *testing.T) {
+ resource.Test(t, resource.TestCase{
+ PreCheck: func() { testAccPreCheck(t) },
+ Providers: testAccProviders,
+ CheckDestroy: testAccCheckCloudStackNetworkDestroy,
+ Steps: []resource.TestStep{
+ {
+ Config: testAccCloudStackNetwork_project,
+ },
+
+ {
+ ResourceName: "cloudstack_network.foo",
+ ImportState: true,
+ ImportStateIdPrefix: "terraform/",
+ ImportStateVerify: true,
+ },
+ },
+ })
+}
+
func testAccCheckCloudStackNetworkExists(
n string, network *cloudstack.Network) resource.TestCheckFunc {
return func(s *terraform.State) error {
@@ -111,8 +152,10 @@
}
cs := testAccProvider.Meta().(*cloudstack.CloudStackClient)
- ntwrk, _, err := cs.Network.GetNetworkByID(rs.Primary.ID)
-
+ ntwrk, _, err := cs.Network.GetNetworkByID(
+ rs.Primary.ID,
+ cloudstack.WithProject(rs.Primary.Attributes["project"]),
+ )
if err != nil {
return err
}
@@ -207,6 +250,15 @@
#}
}`
+const testAccCloudStackNetwork_project = `
+resource "cloudstack_network" "foo" {
+ name = "terraform-network"
+ cidr = "10.1.1.0/24"
+ network_offering = "DefaultIsolatedNetworkOfferingWithSourceNatService"
+ project = "terraform"
+ zone = "Sandbox-simulator"
+}`
+
const testAccCloudStackNetwork_vpc = `
resource "cloudstack_vpc" "foo" {
name = "terraform-vpc"
diff --git a/cloudstack/resource_cloudstack_security_group.go b/cloudstack/resource_cloudstack_security_group.go
index 17d39bb..37c41b7 100644
--- a/cloudstack/resource_cloudstack_security_group.go
+++ b/cloudstack/resource_cloudstack_security_group.go
@@ -15,7 +15,7 @@
Read: resourceCloudStackSecurityGroupRead,
Delete: resourceCloudStackSecurityGroupDelete,
Importer: &schema.ResourceImporter{
- State: schema.ImportStatePassthrough,
+ State: importStatePassthrough,
},
Schema: map[string]*schema.Schema{
diff --git a/cloudstack/resource_cloudstack_vpc.go b/cloudstack/resource_cloudstack_vpc.go
index 5ded926..591945b 100644
--- a/cloudstack/resource_cloudstack_vpc.go
+++ b/cloudstack/resource_cloudstack_vpc.go
@@ -16,7 +16,7 @@
Update: resourceCloudStackVPCUpdate,
Delete: resourceCloudStackVPCDelete,
Importer: &schema.ResourceImporter{
- State: schema.ImportStatePassthrough,
+ State: importStatePassthrough,
},
Schema: map[string]*schema.Schema{
diff --git a/cloudstack/resource_cloudstack_vpn_customer_gateway.go b/cloudstack/resource_cloudstack_vpn_customer_gateway.go
index 746880c..5043c9e 100644
--- a/cloudstack/resource_cloudstack_vpn_customer_gateway.go
+++ b/cloudstack/resource_cloudstack_vpn_customer_gateway.go
@@ -16,7 +16,7 @@
Update: resourceCloudStackVPNCustomerGatewayUpdate,
Delete: resourceCloudStackVPNCustomerGatewayDelete,
Importer: &schema.ResourceImporter{
- State: schema.ImportStatePassthrough,
+ State: importStatePassthrough,
},
Schema: map[string]*schema.Schema{
diff --git a/cloudstack/resources.go b/cloudstack/resources.go
index 56174de..004ea47 100644
--- a/cloudstack/resources.go
+++ b/cloudstack/resources.go
@@ -4,6 +4,7 @@
"fmt"
"log"
"regexp"
+ "strings"
"time"
"github.com/hashicorp/terraform/helper/schema"
@@ -135,3 +136,16 @@
return nil
}
+
+// importStatePassthrough is a generic importer with project support.
+func importStatePassthrough(d *schema.ResourceData, meta interface{}) ([]*schema.ResourceData, error) {
+ // Try to split the ID to extract the optional project name.
+ s := strings.SplitN(d.Id(), "/", 2)
+ if len(s) == 2 {
+ d.Set("project", s[0])
+ }
+
+ d.SetId(s[len(s)-1])
+
+ return []*schema.ResourceData{d}, nil
+}
diff --git a/website/docs/r/affinity_group.html.markdown b/website/docs/r/affinity_group.html.markdown
index 2cdcd51..a938a39 100644
--- a/website/docs/r/affinity_group.html.markdown
+++ b/website/docs/r/affinity_group.html.markdown
@@ -49,3 +49,10 @@
```shell
terraform import cloudstack_affinity_group.default 6226ea4d-9cbe-4cc9-b30c-b9532146da5b
```
+
+When importing into a project you need to prefix the import ID with the project name:
+
+```shell
+terraform import cloudstack_affinity_group.default my-project/6226ea4d-9cbe-4cc9-b30c-b9532146da5b
+```
+
diff --git a/website/docs/r/disk.html.markdown b/website/docs/r/disk.html.markdown
index 418185c..e87396b 100644
--- a/website/docs/r/disk.html.markdown
+++ b/website/docs/r/disk.html.markdown
@@ -68,3 +68,9 @@
```shell
terraform import cloudstack_disk.default 6f3ee798-d417-4e7a-92bc-95ad41cf1244
```
+
+When importing into a project you need to prefix the import ID with the project name:
+
+```shell
+terraform import cloudstack_disk.default my-project/6f3ee798-d417-4e7a-92bc-95ad41cf1244
+```
diff --git a/website/docs/r/instance.html.markdown b/website/docs/r/instance.html.markdown
index ceefe94..018b5b0 100644
--- a/website/docs/r/instance.html.markdown
+++ b/website/docs/r/instance.html.markdown
@@ -94,3 +94,9 @@
```shell
terraform import cloudstack_instance.default 5cf69677-7e4b-4bf4-b868-f0b02bb72ee0
```
+
+When importing into a project you need to prefix the import ID with the project name:
+
+```shell
+terraform import cloudstack_instance.default my-project/5cf69677-7e4b-4bf4-b868-f0b02bb72ee0
+```
diff --git a/website/docs/r/network.html.markdown b/website/docs/r/network.html.markdown
index c51c087..8b3781a 100644
--- a/website/docs/r/network.html.markdown
+++ b/website/docs/r/network.html.markdown
@@ -88,3 +88,9 @@
```shell
terraform import cloudstack_network.default 36619b20-5584-43bf-9a84-e242bacd5582
```
+
+When importing into a project you need to prefix the import ID with the project name:
+
+```shell
+terraform import cloudstack_network.default my-project/36619b20-5584-43bf-9a84-e242bacd5582
+```
diff --git a/website/docs/r/network_acl.html.markdown b/website/docs/r/network_acl.html.markdown
index 58f002a..37f2928 100644
--- a/website/docs/r/network_acl.html.markdown
+++ b/website/docs/r/network_acl.html.markdown
@@ -49,3 +49,9 @@
```shell
terraform import cloudstack_network_acl.default e8b5982a-1b50-4ea9-9920-6ea2290c7359
```
+
+When importing into a project you need to prefix the import ID with the project name:
+
+```shell
+terraform import cloudstack_network_acl.default my-project/e8b5982a-1b50-4ea9-9920-6ea2290c7359
+```
diff --git a/website/docs/r/security_group.html.markdown b/website/docs/r/security_group.html.markdown
index c43fbb0..a07d557 100644
--- a/website/docs/r/security_group.html.markdown
+++ b/website/docs/r/security_group.html.markdown
@@ -46,3 +46,9 @@
```shell
terraform import cloudstack_security_group.default e54970f1-f563-46dd-a365-2b2e9b78c54b
```
+
+When importing into a project you need to prefix the import ID with the project name:
+
+```shell
+terraform import cloudstack_security_group.default my-project/e54970f1-f563-46dd-a365-2b2e9b78c54b
+```
diff --git a/website/docs/r/vpc.html.markdown b/website/docs/r/vpc.html.markdown
index 9a79aac..526bc30 100644
--- a/website/docs/r/vpc.html.markdown
+++ b/website/docs/r/vpc.html.markdown
@@ -62,3 +62,9 @@
```shell
terraform import cloudstack_vpc.default 84b23264-917a-4712-b8bf-cd7604db43b0
```
+
+When importing into a project you need to prefix the import ID with the project name:
+
+```shell
+terraform import cloudstack_vpc.default my-project/84b23264-917a-4712-b8bf-cd7604db43b0
+```
diff --git a/website/docs/r/vpn_customer_gateway.html.markdown b/website/docs/r/vpn_customer_gateway.html.markdown
index 643f817..6678a7e 100644
--- a/website/docs/r/vpn_customer_gateway.html.markdown
+++ b/website/docs/r/vpn_customer_gateway.html.markdown
@@ -69,3 +69,9 @@
```shell
terraform import cloudstack_vpn_customer_gateway.default 741a7fca-1d05-4bb6-9290-1008300f0e5a
```
+
+When importing into a project you need to prefix the import ID with the project name:
+
+```shell
+terraform import cloudstack_vpn_customer_gateway.default my-project/741a7fca-1d05-4bb6-9290-1008300f0e5a
+```