This is an automated email from the ASF dual-hosted git repository. sudo87 pushed a commit to branch fix/instance-datasource-project-filter in repository https://gitbox.apache.org/repos/asf/cloudstack-terraform-provider.git
commit 1ee3e8d4ce1ec757c3c1dc25c7a020bb30d66eda Author: Manoj Kumar <[email protected]> AuthorDate: Mon Aug 17 12:34:21 2026 +0530 Fix cloudstack_instance data source ignoring project scope Instances created inside a project were never returned by ListVirtualMachines because the data source never passed a projectid, so filters had nothing to match and failed with a misleading regex error. Added a project argument and wired it into the list call, same as the VPC data source already does. Fixes #266 --- cloudstack/data_source_cloudstack_instance.go | 13 +++++ cloudstack/data_source_cloudstack_instance_test.go | 56 +++++++++++++++++++++- website/docs/d/instance.html.markdown | 2 + 3 files changed, 70 insertions(+), 1 deletion(-) diff --git a/cloudstack/data_source_cloudstack_instance.go b/cloudstack/data_source_cloudstack_instance.go index 5c909c8..a601722 100644 --- a/cloudstack/data_source_cloudstack_instance.go +++ b/cloudstack/data_source_cloudstack_instance.go @@ -48,6 +48,12 @@ func dataSourceCloudstackInstance() *schema.Resource { Computed: true, }, + "project": { + Type: schema.TypeString, + Computed: true, + Optional: true, + }, + "display_name": { Type: schema.TypeString, Computed: true, @@ -98,6 +104,12 @@ func dataSourceCloudstackInstanceRead(d *schema.ResourceData, meta interface{}) cs := meta.(*cloudstack.CloudStackClient) p := cs.VirtualMachine.NewListVirtualMachinesParams() + + // If there is a project supplied, we retrieve and set the project id + if err := setProjectid(p, cs, d); err != nil { + return err + } + csInstances, err := cs.VirtualMachine.ListVirtualMachines(p) if err != nil { @@ -148,6 +160,7 @@ func instanceDescriptionAttributes(d *schema.ResourceData, instance *cloudstack. d.SetId(instance.Id) d.Set("instance_id", instance.Id) d.Set("account", instance.Account) + d.Set("project", instance.Project) d.Set("created", instance.Created) d.Set("display_name", instance.Displayname) d.Set("state", instance.State) diff --git a/cloudstack/data_source_cloudstack_instance_test.go b/cloudstack/data_source_cloudstack_instance_test.go index 04ec4bf..2e8f165 100644 --- a/cloudstack/data_source_cloudstack_instance_test.go +++ b/cloudstack/data_source_cloudstack_instance_test.go @@ -54,7 +54,7 @@ const testAccInstanceDataSourceConfig_basic = ` } data "cloudstack_instance" "my_instance_test" { filter { - name = "display_name" + name = "display_name" value = "server-a" } depends_on = [ @@ -62,3 +62,57 @@ const testAccInstanceDataSourceConfig_basic = ` ] } ` + +// regression test for https://github.com/apache/cloudstack-terraform-provider/issues/266 : +// instances deployed inside a project were never returned by the data source because +// ListVirtualMachines was called without a projectid, so the filter had nothing to match. +func TestAccInstanceDataSource_project(t *testing.T) { + resourceName := "cloudstack_instance.my_project_instance" + datasourceName := "data.cloudstack_instance.my_project_instance_test" + + resource.Test(t, resource.TestCase{ + PreCheck: func() { testAccPreCheck(t) }, + Providers: testAccProviders, + Steps: []resource.TestStep{ + { + Config: testAccInstanceDataSourceConfig_project, + Check: resource.ComposeTestCheckFunc( + resource.TestCheckResourceAttrPair(datasourceName, "display_name", resourceName, "display_name"), + resource.TestCheckResourceAttr(datasourceName, "project", "terraform"), + ), + }, + }, + }) +} + +const testAccInstanceDataSourceConfig_project = ` + resource "cloudstack_network" "my_project_network" { + name = "terraform-datasource-network" + display_text = "terraform-datasource-network" + cidr = "10.1.2.0/24" + network_offering = "DefaultIsolatedNetworkOfferingWithSourceNatService" + project = "terraform" + zone = "Sandbox-simulator" + } + + resource "cloudstack_instance" "my_project_instance" { + name = "server-b" + service_offering = "Small Instance" + template = "CentOS 5.6 (64-bit) no GUI (Simulator)" + network_id = cloudstack_network.my_project_network.id + zone = cloudstack_network.my_project_network.zone + project = "terraform" + expunge = true + } + + data "cloudstack_instance" "my_project_instance_test" { + project = "terraform" + filter { + name = "display_name" + value = "server-b" + } + depends_on = [ + cloudstack_instance.my_project_instance + ] + } +` diff --git a/website/docs/d/instance.html.markdown b/website/docs/d/instance.html.markdown index 5ebc567..c96f9e2 100644 --- a/website/docs/d/instance.html.markdown +++ b/website/docs/d/instance.html.markdown @@ -28,6 +28,7 @@ data "cloudstack_instance" "my_instance" { ### Argument Reference * `filter` - (Required) One or more name/value pairs to filter off of. You can apply filters on any exported attributes. +* `project` - (Optional) The name or ID of the project the instance is deployed in. Required to find instances that belong to a project. ## Attributes Reference @@ -35,6 +36,7 @@ The following attributes are exported: * `instance_id` - The ID of the virtual machine. * `account` - The account associated with the virtual machine. +* `project` - The project the virtual machine is associated with. * `display_name` - The user generated name. The name of the virtual machine is returned if no displayname exists. * `state` - The state of the virtual machine. * `host_id` - The ID of the host for the virtual machine.
