func resourceCloudStackHostCreate()

in cloudstack/resource_cloudstack_host.go [154:207]


func resourceCloudStackHostCreate(d *schema.ResourceData, meta interface{}) error {
	cs := meta.(*cloudstack.CloudStackClient)
	hypervisor := d.Get("hypervisor").(string)
	pod_id := d.Get("pod_id").(string)
	url := d.Get("url").(string)
	zone_id := d.Get("zone_id").(string)

	p := cs.Host.NewAddHostParams(hypervisor, pod_id, url, zone_id)

	if cluster_id, ok := d.GetOk("cluster_id"); ok {
		p.SetClusterid(cluster_id.(string))
	}

	if cluster_name, ok := d.GetOk("cluster_name"); ok {
		p.SetClustername(cluster_name.(string))
	}

	if host_tags, ok := d.GetOk("host_tags"); ok {
		p.SetHosttags(host_tags.([]string))
	}

	if username, ok := d.GetOk("username"); ok {
		p.SetUsername(username.(string))
	}

	if password, ok := d.GetOk("password"); ok {
		p.SetPassword(password.(string))
	}

	timeout := time.After(time.Duration(d.Get("create_timeout").(int)) * time.Second)
	tick := time.NewTicker(5 * time.Second)
	var err error
	var host *cloudstack.AddHostResponse

	for {
		select {
		case <-timeout:
			return fmt.Errorf("timeout waiting for Host to be created, with error: %s", err)
		case <-tick.C:
			log.Printf("[DEBUG] Trying to create host %s", d.Get("url").(string))
			host, err = cs.Host.AddHost(p)
			if err != nil {
				log.Printf("[ERROR] Error creating host %s: %s. Will try again...", d.Get("url").(string), err)
				continue
			}

			if host.Id != "" {
				log.Printf("[DEBUG] Host %s successfully created", url)
				d.SetId(host.Id)
				return resourceCloudStackHostRead(d, meta)
			}
		}
	}
}