Summary
cloudstack_domain (cloudstack/resource_cloudstack_domain.go) currently declares no
Importer, so pre-existing domains cannot be brought under Terraform management. Since the
domain tree is typically created long before Terraform adoption, import support is essential
for brownfield adoption and for codifying an existing CloudStack environment.
Current state
Two things block import today:
-
The resource schema declares no schema.ResourceImporter.
-
resourceCloudStackDomainRead is a stub that makes no API call:
func resourceCloudStackDomainRead(d *schema.ResourceData, meta interface{}) error {
return nil
}
Adding an importer alone would therefore import an empty state - a working Read is a
prerequisite. (The stub also means the resource never detects drift or out-of-band deletion
for domains it created, so implementing Read fixes refresh behavior as a side benefit.)
Proposed change
-
Implement resourceCloudStackDomainRead:
- call
listDomains with id=d.Id() (and listall=true),
- on
count: 0, call d.SetId("") so Terraform drops the missing resource,
- populate the schema attributes from the response (
name, network_domain,
parent_domain_id from parentdomainid, domain_id).
-
Add the importer, following the same pattern used by the other SDK-based resources in this
provider:
Importer: &schema.ResourceImporter{
StateContext: schema.ImportStatePassthroughContext,
},
The import id would be the domain UUID, consistent with the other resources.
Note that listDomains is an admin-scoped command, but that matches the resource itself -
only admins can create domains, so any credentials able to manage cloudstack_domain can
also read it.
Environment
- Provider version: latest
- CloudStack version: latest
Summary
cloudstack_domain(cloudstack/resource_cloudstack_domain.go) currently declares noImporter, so pre-existing domains cannot be brought under Terraform management. Since thedomain tree is typically created long before Terraform adoption, import support is essential
for brownfield adoption and for codifying an existing CloudStack environment.
Current state
Two things block import today:
The resource schema declares no
schema.ResourceImporter.resourceCloudStackDomainReadis a stub that makes no API call:Adding an importer alone would therefore import an empty state - a working
Readis aprerequisite. (The stub also means the resource never detects drift or out-of-band deletion
for domains it created, so implementing
Readfixes refresh behavior as a side benefit.)Proposed change
Implement
resourceCloudStackDomainRead:listDomainswithid=d.Id()(andlistall=true),count: 0, calld.SetId("")so Terraform drops the missing resource,name,network_domain,parent_domain_idfromparentdomainid,domain_id).Add the importer, following the same pattern used by the other SDK-based resources in this
provider:
The import id would be the domain UUID, consistent with the other resources.
Note that
listDomainsis an admin-scoped command, but that matches the resource itself -only admins can create domains, so any credentials able to manage
cloudstack_domaincanalso read it.
Environment