func resourceVfxtUpdate()

in src/terraform/providers/terraform-provider-avere/resource_vfxt.go [923:1120]


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

	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
		}
	}

	// return from read if the vfxt is not alive since it may be stop deallocated
	if !avereVfxt.IsAlive() {
		return fmt.Errorf("The vfxt management IP '%s' is not reachable.  Please confirm the cluster is alive and not stopped.", avereVfxt.ManagementIP)
	}

	//
	// The cluster will be updated in the following order
	//  1. Disable NLM
	//  2. Timezone and DNS changes
	//  3. NTP Servers
	//  4. Global and Vserver Custom Support settings
	//  5. Update Users
	//  6. Delete Junctions
	//  7. Update CIFs
	//  8. Update Core Filers including Core Filer custom settings
	//  9. Add Junctions
	// 10. Update Extended Groups
	// 11. Scale cluster
	// 12. Update Support Uploads
	//

	if d.HasChange(enable_nlm) {
		if err := avereVfxt.SetNlm(); err != nil {
			return err
		}
	}

	if d.HasChange(timezone) || d.HasChange(dns_server) || d.HasChange(dns_domain) || d.HasChange(dns_search) {
		if err := avereVfxt.UpdateCluster(); err != nil {
			return err
		}
	}

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

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

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

	if d.HasChange(user) {
		if err := updateUsers(d, avereVfxt); err != nil {
			return err
		}
	}

	// update the core filers
	if d.HasChange(core_filer) || d.HasChange(azure_storage_filer) {
		existingCoreFilers, existingAzureStorageFilers, err := avereVfxt.GetExistingFilers()
		if err != nil {
			return err
		}
		coreFilersToDelete, err := getCoreFilersToDelete(d, existingCoreFilers)
		if err != nil {
			return err
		}
		storageFilersToDelete, err := getAzureStorageFilersToDelete(d, existingAzureStorageFilers)
		if err != nil {
			return err
		}
		junctionsToDelete, junctionsToUpdate, err := getJunctionsToDeleteOrUpdate(d, avereVfxt, coreFilersToDelete, storageFilersToDelete)
		if err != nil {
			return err
		}
		coreFilersToAdd, coreFilersToModify, err := getCoreFilersToAddorModify(d, existingCoreFilers, coreFilersToDelete)
		if err != nil {
			return err
		}
		storageFilersToAdd, storageFilersToModify, err := getAzureStorageFilersToAddorModify(d, existingAzureStorageFilers, storageFilersToDelete)
		if err != nil {
			return err
		}

		// trigger a support bundle if there will be no more core filers
		if avereVfxt.EnableSupportUploads == true && avereVfxt.ActiveSupportUpload == true && len(coreFilersToAdd) == 0 && len(existingCoreFilers) == len(coreFilersToDelete) {
			// block on rolling trace to avoid uploading files in parallel
			if err := avereVfxt.UploadRollingTraceAndBlock(); err != nil {
				return err
			}
			if err := avereVfxt.UploadSupportBundle(); err != nil {
				return err
			}
		}

		if err := deleteJunctions(junctionsToDelete, avereVfxt); err != nil {
			return err
		}
		if err := deleteCoreFilers(coreFilersToDelete, avereVfxt); err != nil {
			return err
		}
		if err := deleteAzureStorageFilers(storageFilersToDelete, avereVfxt); err != nil {
			return err
		}

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

		if err := createCoreFilers(coreFilersToAdd, avereVfxt); err != nil {
			return err
		}
		if err := modifyCoreFilers(coreFilersToModify, avereVfxt); err != nil {
			return err
		}
		if err := createAzureStorageFilers(storageFilersToAdd, avereVfxt); err != nil {
			return err
		}
		if err := modifyAzureStorageFilers(storageFilersToModify, avereVfxt); err != nil {
			return err
		}

		// refresh all junctions, and add all missing
		if err := createJunctions(d, avereVfxt); err != nil {
			return err
		}
		if err := updateJunctions(avereVfxt, junctionsToUpdate); err != nil {
			return err
		}
	} else {
		if err := updateCifs(d, avereVfxt); err != nil {
			return err
		}
	}

	if d.HasChange(enable_extended_groups) {
		if err := avereVfxt.ModifyExtendedGroups(); err != nil {
			return err
		}
	}

	if d.HasChange(login_services_ldap_server) ||
		d.HasChange(login_services_ldap_basedn) ||
		d.HasChange(login_services_ldap_binddn) ||
		d.HasChange(login_services_ldap_bind_password) {
		if err := avereVfxt.EnableLoginServices(); err != nil {
			return err
		}
		if err := avereVfxt.DisableLoginServices(); err != nil {
			return err
		}
	}

	// scale the cluster if node changed
	if d.HasChange(vfxt_node_count) {
		if err := scaleCluster(d, avereVfxt); err != nil {
			return err
		}
	}

	if d.HasChange(enable_support_uploads) ||
		d.HasChange(support_uploads_company_name) ||
		d.HasChange(enable_rolling_trace_data) ||
		d.HasChange(rolling_trace_flag) ||
		d.HasChange(enable_secure_proactive_support) {
		if err := avereVfxt.ModifySupportUploads(); err != nil {
			return err
		}
	}

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

	return resourceVfxtRead(d, m)
}