func resourceCloudStackHostDelete()

in cloudstack/resource_cloudstack_host.go [274:316]


func resourceCloudStackHostDelete(d *schema.ResourceData, meta interface{}) error {
	cs := meta.(*cloudstack.CloudStackClient)

	if d.Get("prevent_destroy").(bool) {
		log.Printf("[INFO] Skipping Host deletion: %s", d.Id())
		return fmt.Errorf("host %s is marked to be protected from deletion", d.Id())
	}

	log.Printf("[INFO] Removing Host: %s", d.Id())
	mm := cs.Host.NewPrepareHostForMaintenanceParams(d.Id())
	_, err := cs.Host.PrepareHostForMaintenance(mm)

	if err != nil {
		return fmt.Errorf("error preparing Host for maintenance: %s", err)
	}

	timeout := time.After(time.Duration(d.Get("destroy_timeout").(int)) * time.Second)
	tick := time.NewTicker(3 * time.Second)

	for {
		select {
		case <-timeout:
			return errors.New("timeout waiting for Host to enter Maintenance state")
		case <-tick.C:
			log.Printf("[DEBUG] Checking Host state: %s", d.Id())
			err = resourceCloudStackHostRead(d, meta)
			if err != nil {
				return fmt.Errorf("error reading Host: %s", err)
			}

			if d.Get("resource_state").(string) == "Maintenance" || d.Get("resource_state").(string) == "Disconnected" {
				log.Printf("[INFO] Deleting Host: %s", d.Id())
				h := cs.Host.NewDeleteHostParams(d.Id())
				_, err = cs.Host.DeleteHost(h)

				if err != nil {
					return fmt.Errorf("error deleting Host: %s", err)
				}
				return nil
			}
		}
	}
}