in cloudstack/resource_cloudstack_instance.go [372:464]
func resourceCloudStackInstanceRead(d *schema.ResourceData, meta interface{}) error {
cs := meta.(*cloudstack.CloudStackClient)
// Get the virtual machine details
vm, count, err := cs.VirtualMachine.GetVirtualMachineByID(
d.Id(),
cloudstack.WithProject(d.Get("project").(string)),
)
if err != nil {
if count == 0 {
log.Printf("[DEBUG] Instance %s does no longer exist", d.Get("name").(string))
d.SetId("")
return nil
}
return err
}
// Update the config
d.Set("name", vm.Name)
d.Set("display_name", vm.Displayname)
d.Set("group", vm.Group)
// In some rare cases (when destroying a machine fails) it can happen that
// an instance does not have any attached NIC anymore.
if len(vm.Nic) > 0 {
d.Set("network_id", vm.Nic[0].Networkid)
d.Set("ip_address", vm.Nic[0].Ipaddress)
}
// Create a new param struct.
p := cs.Volume.NewListVolumesParams()
p.SetType("ROOT")
p.SetVirtualmachineid(d.Id())
// Get the root disk of the instance.
l, err := cs.Volume.ListVolumes(p)
if err != nil {
return err
}
// If we found the root disk, then update its size.
if len(l.Volumes) != 1 {
log.Printf("[DEBUG] Failed to find root disk of instance: %s", vm.Name)
} else {
d.Set("root_disk_size", l.Volumes[0].Size>>30) // B to GiB
}
if _, ok := d.GetOk("affinity_group_ids"); ok {
groups := &schema.Set{F: schema.HashString}
for _, group := range vm.Affinitygroup {
groups.Add(group.Id)
}
d.Set("affinity_group_ids", groups)
}
if _, ok := d.GetOk("affinity_group_names"); ok {
groups := &schema.Set{F: schema.HashString}
for _, group := range vm.Affinitygroup {
groups.Add(group.Name)
}
d.Set("affinity_group_names", groups)
}
if _, ok := d.GetOk("security_group_ids"); ok {
groups := &schema.Set{F: schema.HashString}
for _, group := range vm.Securitygroup {
groups.Add(group.Id)
}
d.Set("security_group_ids", groups)
}
if _, ok := d.GetOk("security_group_names"); ok {
groups := &schema.Set{F: schema.HashString}
for _, group := range vm.Securitygroup {
groups.Add(group.Name)
}
d.Set("security_group_names", groups)
}
tags := make(map[string]interface{})
for _, tag := range vm.Tags {
tags[tag.Key] = tag.Value
}
d.Set("tags", tags)
setValueOrID(d, "service_offering", vm.Serviceofferingname, vm.Serviceofferingid)
setValueOrID(d, "template", vm.Templatename, vm.Templateid)
setValueOrID(d, "project", vm.Project, vm.Projectid)
setValueOrID(d, "zone", vm.Zonename, vm.Zoneid)
return nil
}