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