func resourceVfxtCreate()

in src/terraform/providers/terraform-provider-avere/resource_vfxt.go [707:854]


func resourceVfxtCreate(d *schema.ResourceData, m interface{}) error {
	log.Printf("[INFO] [resourceVfxtCreate")
	defer log.Printf("[INFO] resourceVfxtCreate]")

	avereVfxt, err := fillAvereVfxt(d)
	if err != nil {
		return err
	}

	if avereVfxt.RunLocal == false {
		if err := VerifySSHConnection(avereVfxt.ControllerAddress, avereVfxt.ControllerUsename, avereVfxt.SshAuthMethod, avereVfxt.SshPort); err != nil {
			return err
		}
	}

	//
	// The cluster will be created in the following order
	//  1. Cluster creation
	//  2. SetId() in Terraform to commit the cluster creation
	//  3. Timezone and DNS changes
	//  4. NTP Servers
	//  5. Global and Vserver Custom Support settings
	//  6. Users
	//  7. CIFS Settings
	//  8. Core Filers including custom settings
	//  9. Junctions
	// 10. Support Uploads if requested
	//

	if err := avereVfxt.Platform.CreateVfxt(avereVfxt); err != nil {
		return fmt.Errorf("failed to create cluster: %s\n", err)
	}

	d.Set(vfxt_management_ip, avereVfxt.ManagementIP)

	// the management ip will uniquely identify the cluster in the VNET
	d.SetId(avereVfxt.ManagementIP)

	// prepare the environment to run commands for the newly created cluster
	if err := avereVfxt.PrepareForVFXTNodeCommands(); err != nil {
		return err
	}

	// the cluster is created initially with the support name, to initially set state for
	// support uploads, the following method correctly sets the names to their correct values
	if err := avereVfxt.SetSupportName(); err != nil {
		return fmt.Errorf("ERROR: error while swapping cluster and names: %s", err)
	}

	// uncomment below for gsi testing
	/*if false {
		url := "GET_FROM_GSI_ENGINEERING"
		log.Printf("[INFO] set alternate GSI url to %s", url)
		if _, err := avereVfxt.ShellCommand(avereVfxt.getSetGSIUploadUrlCommand(url)); err != nil {
			return fmt.Errorf("Error running dbutil.py command: %v", err)
		}
	}*/

	if err := avereVfxt.CreateVServer(); err != nil {
		return fmt.Errorf("ERROR: error while creating VServer: %s", err)
	}

	if !avereVfxt.EnableNlm {
		if err := avereVfxt.SetNlm(); err != nil {
			fmt.Errorf("ERROR: error while disabling Nlm: %s", err)
		}
	}

	if avereVfxt.Timezone != DefaultTimezone || len(avereVfxt.DnsServer) > 0 || len(avereVfxt.DnsDomain) > 0 || len(avereVfxt.DnsSearch) > 0 {
		if err := avereVfxt.UpdateCluster(); err != nil {
			return err
		}
	}

	if err := updateNtpServers(d, avereVfxt); err != nil {
		return err
	}

	if err := createGlobalSettings(d, avereVfxt); err != nil {
		return err
	}

	if err := createVServerSettings(d, avereVfxt); err != nil {
		return err
	}

	if err := createUsers(d, avereVfxt); err != nil {
		return err
	}

	if err := avereVfxt.EnableCIFS(); err != nil {
		return err
	}

	if avereVfxt.EnableExtendedGroups == true {
		if err := avereVfxt.ModifyExtendedGroups(); err != nil {
			return err
		}
	}

	if err := avereVfxt.EnableLoginServices(); err != nil {
		return err
	}

	// add the new filers
	existingCoreFilers := make(map[string]*CoreFiler)
	coreFilersToAdd, coreFilersToModify, err := getCoreFilersToAddorModify(d, existingCoreFilers, existingCoreFilers)
	if err != nil {
		return err
	}
	if err := createCoreFilers(coreFilersToAdd, avereVfxt); err != nil {
		return err
	}
	if err := modifyCoreFilers(coreFilersToModify, avereVfxt); err != nil {
		return err
	}

	existingAzureStorageFilers := make(map[string]*AzureStorageFiler)
	storageFilersToAdd, storageFilersToModify, err := getAzureStorageFilersToAddorModify(d, existingAzureStorageFilers, existingAzureStorageFilers)
	if err != nil {
		return err
	}
	if err := createAzureStorageFilers(storageFilersToAdd, avereVfxt); err != nil {
		return err
	}
	if err := modifyAzureStorageFilers(storageFilersToModify, avereVfxt); err != nil {
		return err
	}

	// add the new junctions
	if err := createJunctions(d, avereVfxt); err != nil {
		return err
	}

	// update the support
	if avereVfxt.EnableSupportUploads == true {
		if err := avereVfxt.ModifySupportUploads(); err != nil {
			return err
		}
	}

	log.Printf("[INFO] vfxt: ensure healthy and stable cluster after cluster creation")
	if err := avereVfxt.BlockUntilClusterHealthy(); err != nil {
		return err
	}

	return resourceVfxtRead(d, m)
}