func resourceAliCloudNasFileSystemUpdate()

in alicloud/resource_alicloud_nas_file_system.go [424:873]


func resourceAliCloudNasFileSystemUpdate(d *schema.ResourceData, meta interface{}) error {
	client := meta.(*connectivity.AliyunClient)
	var request map[string]interface{}
	var response map[string]interface{}
	var query map[string]interface{}
	update := false
	d.Partial(true)

	if d.HasChange("recycle_bin.0.status") {
		var err error

		target := d.Get("recycle_bin.0.status").(string)
		enableEnableRecycleBin := false
		checkValue01 := d.Get("file_system_type")
		if checkValue01 == "standard" {
			enableEnableRecycleBin = true
		}
		if enableEnableRecycleBin && target == "Enable" {
			action := "EnableRecycleBin"
			request = make(map[string]interface{})
			query = make(map[string]interface{})
			request["FileSystemId"] = d.Id()

			if v, ok := d.GetOkExists("recycle_bin"); ok {
				jsonPathResult, err := jsonpath.Get("$[0].reserved_days", v)
				if err == nil && jsonPathResult != "" {
					request["ReservedDays"] = jsonPathResult
				}
			}
			wait := incrementalWait(3*time.Second, 5*time.Second)
			err = resource.Retry(d.Timeout(schema.TimeoutUpdate), func() *resource.RetryError {
				response, err = client.RpcPost("NAS", "2017-06-26", action, query, request, true)
				if err != nil {
					if NeedRetry(err) {
						wait()
						return resource.RetryableError(err)
					}
					return resource.NonRetryableError(err)
				}
				return nil
			})
			addDebug(action, response, request)
			if err != nil {
				return WrapErrorf(err, DefaultErrorMsg, d.Id(), action, AlibabaCloudSdkGoERROR)
			}

		}
		enableDisableAndCleanRecycleBin := false
		checkValue01 = d.Get("file_system_type")
		if checkValue01 == "standard" {
			enableDisableAndCleanRecycleBin = true
		}
		if enableDisableAndCleanRecycleBin && target == "Disable" {
			action := "DisableAndCleanRecycleBin"
			request = make(map[string]interface{})
			query = make(map[string]interface{})
			query["FileSystemId"] = d.Id()

			wait := incrementalWait(3*time.Second, 5*time.Second)
			err = resource.Retry(d.Timeout(schema.TimeoutUpdate), func() *resource.RetryError {
				response, err = client.RpcGet("NAS", "2017-06-26", action, query, request)
				if err != nil {
					if NeedRetry(err) {
						wait()
						return resource.RetryableError(err)
					}
					return resource.NonRetryableError(err)
				}
				return nil
			})
			addDebug(action, response, request)
			if err != nil {
				return WrapErrorf(err, DefaultErrorMsg, d.Id(), action, AlibabaCloudSdkGoERROR)
			}

		}
	}
	if d.HasChange("nfs_acl.0.enabled") {
		var err error

		target := d.Get("nfs_acl.0.enabled").(bool)
		enableEnableNfsAcl := false
		checkValue00 := d.Get("file_system_type")
		checkValue02 := d.Get("protocol_type")
		if (checkValue00 == "standard") && (checkValue02 == "NFS") {
			enableEnableNfsAcl = true
		}
		if enableEnableNfsAcl && target == true {
			action := "EnableNfsAcl"
			request = make(map[string]interface{})
			query = make(map[string]interface{})
			request["FileSystemId"] = d.Id()

			wait := incrementalWait(3*time.Second, 5*time.Second)
			err = resource.Retry(d.Timeout(schema.TimeoutUpdate), func() *resource.RetryError {
				response, err = client.RpcPost("NAS", "2017-06-26", action, query, request, true)
				if err != nil {
					if NeedRetry(err) {
						wait()
						return resource.RetryableError(err)
					}
					return resource.NonRetryableError(err)
				}
				return nil
			})
			addDebug(action, response, request)
			if err != nil {
				return WrapErrorf(err, DefaultErrorMsg, d.Id(), action, AlibabaCloudSdkGoERROR)
			}

		}
		enableDisableNfsAcl := false
		checkValue00 = d.Get("file_system_type")
		checkValue02 = d.Get("protocol_type")
		if (checkValue00 == "standard") && (checkValue02 == "NFS") {
			enableDisableNfsAcl = true
		}
		if enableDisableNfsAcl && target == false {
			action := "DisableNfsAcl"
			request = make(map[string]interface{})
			query = make(map[string]interface{})
			request["FileSystemId"] = d.Id()

			wait := incrementalWait(3*time.Second, 5*time.Second)
			err = resource.Retry(d.Timeout(schema.TimeoutUpdate), func() *resource.RetryError {
				response, err = client.RpcPost("NAS", "2017-06-26", action, query, request, true)
				if err != nil {
					if NeedRetry(err) {
						wait()
						return resource.RetryableError(err)
					}
					return resource.NonRetryableError(err)
				}
				return nil
			})
			addDebug(action, response, request)
			if err != nil {
				return WrapErrorf(err, DefaultErrorMsg, d.Id(), action, AlibabaCloudSdkGoERROR)
			}

		}
	}
	if d.HasChange("smb_acl.0.enabled") {
		var err error

		target := d.Get("smb_acl.0.enabled").(bool)
		enableEnableSmbAcl := false
		checkValue00 := d.Get("file_system_type")
		checkValue01 := d.Get("protocol_type")
		if (checkValue00 == "standard") && (checkValue01 == "SMB") {
			enableEnableSmbAcl = true
		}
		if enableEnableSmbAcl && target == true {
			action := "EnableSmbAcl"
			request = make(map[string]interface{})
			query = make(map[string]interface{})
			request["FileSystemId"] = d.Id()

			request["KeytabMd5"] = d.Get("keytab_md5")
			request["Keytab"] = d.Get("keytab")
			wait := incrementalWait(3*time.Second, 5*time.Second)
			err = resource.Retry(d.Timeout(schema.TimeoutUpdate), func() *resource.RetryError {
				response, err = client.RpcPost("NAS", "2017-06-26", action, query, request, true)
				if err != nil {
					if NeedRetry(err) {
						wait()
						return resource.RetryableError(err)
					}
					return resource.NonRetryableError(err)
				}
				return nil
			})
			addDebug(action, response, request)
			if err != nil {
				return WrapErrorf(err, DefaultErrorMsg, d.Id(), action, AlibabaCloudSdkGoERROR)
			}

		}
		enableDisableSmbAcl := false
		checkValue00 = d.Get("file_system_type")
		checkValue01 = d.Get("protocol_type")
		if (checkValue00 == "standard") && (checkValue01 == "SMB") {
			enableDisableSmbAcl = true
		}
		if enableDisableSmbAcl && target == false {
			action := "DisableSmbAcl"
			request = make(map[string]interface{})
			query = make(map[string]interface{})
			request["FileSystemId"] = d.Id()

			wait := incrementalWait(3*time.Second, 5*time.Second)
			err = resource.Retry(d.Timeout(schema.TimeoutUpdate), func() *resource.RetryError {
				response, err = client.RpcPost("NAS", "2017-06-26", action, query, request, true)
				if err != nil {
					if NeedRetry(err) {
						wait()
						return resource.RetryableError(err)
					}
					return resource.NonRetryableError(err)
				}
				return nil
			})
			addDebug(action, response, request)
			if err != nil {
				return WrapErrorf(err, DefaultErrorMsg, d.Id(), action, AlibabaCloudSdkGoERROR)
			}

		}
	}

	var err error
	action := "ModifyFileSystem"
	request = make(map[string]interface{})
	query = make(map[string]interface{})
	request["FileSystemId"] = d.Id()

	if d.HasChange("options") {
		update = true
		objectDataLocalMap := make(map[string]interface{})

		if v := d.Get("options"); v != nil {
			enableOplock1, _ := jsonpath.Get("$[0].enable_oplock", v)
			if enableOplock1 != nil && (d.HasChange("options.0.enable_oplock") || enableOplock1 != "") {
				objectDataLocalMap["EnableOplock"] = enableOplock1
			}

			objectDataLocalMapJson, err := json.Marshal(objectDataLocalMap)
			if err != nil {
				return WrapError(err)
			}
			request["Options"] = string(objectDataLocalMapJson)
		}
	}

	if !d.IsNewResource() && d.HasChange("description") {
		update = true
		request["Description"] = d.Get("description")
	}

	if update {
		wait := incrementalWait(3*time.Second, 5*time.Second)
		err = resource.Retry(d.Timeout(schema.TimeoutUpdate), func() *resource.RetryError {
			response, err = client.RpcPost("NAS", "2017-06-26", action, query, request, true)
			if err != nil {
				if NeedRetry(err) {
					wait()
					return resource.RetryableError(err)
				}
				return resource.NonRetryableError(err)
			}
			return nil
		})
		addDebug(action, response, request)
		if err != nil {
			return WrapErrorf(err, DefaultErrorMsg, d.Id(), action, AlibabaCloudSdkGoERROR)
		}
	}
	update = false
	enableUpgradeFileSystem := false
	checkValue00 := d.Get("file_system_type")
	if !(checkValue00 == "standard") {
		enableUpgradeFileSystem = true
	}
	action = "UpgradeFileSystem"
	request = make(map[string]interface{})
	query = make(map[string]interface{})
	request["FileSystemId"] = d.Id()

	request["ClientToken"] = buildClientToken(action)
	if !d.IsNewResource() && d.HasChange("capacity") {
		update = true
	}
	request["Capacity"] = d.Get("capacity")
	request["DryRun"] = "false"
	if update && enableUpgradeFileSystem {
		wait := incrementalWait(3*time.Second, 5*time.Second)
		err = resource.Retry(d.Timeout(schema.TimeoutUpdate), func() *resource.RetryError {
			response, err = client.RpcPost("NAS", "2017-06-26", action, query, request, true)
			if err != nil {
				if NeedRetry(err) {
					wait()
					return resource.RetryableError(err)
				}
				return resource.NonRetryableError(err)
			}
			return nil
		})
		addDebug(action, response, request)
		if err != nil {
			return WrapErrorf(err, DefaultErrorMsg, d.Id(), action, AlibabaCloudSdkGoERROR)
		}
		nasServiceV2 := NasServiceV2{client}
		stateConf := BuildStateConf([]string{}, []string{"Running"}, d.Timeout(schema.TimeoutUpdate), 5*time.Second, nasServiceV2.NasFileSystemStateRefreshFunc(d.Id(), "Status", []string{}))
		if _, err := stateConf.WaitForState(); err != nil {
			return WrapErrorf(err, IdMsg, d.Id())
		}
	}
	update = false
	action = "ChangeResourceGroup"
	request = make(map[string]interface{})
	query = make(map[string]interface{})
	request["ResourceId"] = d.Id()
	request["RegionId"] = client.RegionId
	if _, ok := d.GetOk("resource_group_id"); ok && !d.IsNewResource() && d.HasChange("resource_group_id") {
		update = true
	}
	request["NewResourceGroupId"] = d.Get("resource_group_id")
	request["ResourceType"] = "filesystem"
	if update {
		wait := incrementalWait(3*time.Second, 5*time.Second)
		err = resource.Retry(d.Timeout(schema.TimeoutUpdate), func() *resource.RetryError {
			response, err = client.RpcPost("NAS", "2017-06-26", action, query, request, true)
			if err != nil {
				if NeedRetry(err) {
					wait()
					return resource.RetryableError(err)
				}
				return resource.NonRetryableError(err)
			}
			return nil
		})
		addDebug(action, response, request)
		if err != nil {
			return WrapErrorf(err, DefaultErrorMsg, d.Id(), action, AlibabaCloudSdkGoERROR)
		}
	}
	update = false
	enableUpdateRecycleBinAttribute := false
	checkValue00 = d.Get("recycle_bin.0.status")
	checkValue01 := d.Get("file_system_type")
	if (checkValue00 == "Enable") && (checkValue01 == "standard") {
		enableUpdateRecycleBinAttribute = true
	}
	action = "UpdateRecycleBinAttribute"
	request = make(map[string]interface{})
	query = make(map[string]interface{})
	query["FileSystemId"] = d.Id()

	if d.HasChange("recycle_bin.0.reserved_days") {
		update = true
	}
	if v, ok := d.GetOk("recycle_bin.0.reserved_days"); ok {
		query["ReservedDays"] = strconv.Itoa(v.(int))
	}

	if update && enableUpdateRecycleBinAttribute {
		wait := incrementalWait(3*time.Second, 5*time.Second)
		err = resource.Retry(d.Timeout(schema.TimeoutUpdate), func() *resource.RetryError {
			response, err = client.RpcGet("NAS", "2017-06-26", action, query, request)
			if err != nil {
				if NeedRetry(err) {
					wait()
					return resource.RetryableError(err)
				}
				return resource.NonRetryableError(err)
			}
			return nil
		})
		addDebug(action, response, request)
		if err != nil {
			return WrapErrorf(err, DefaultErrorMsg, d.Id(), action, AlibabaCloudSdkGoERROR)
		}
	}
	update = false
	enableModifySmbAcl := false
	checkValue00 = d.Get("file_system_type")
	checkValue01 = d.Get("protocol_type")
	checkValue02 := d.Get("smb_acl.0.enabled")
	if (checkValue00 == "standard") && (checkValue01 == "SMB") && (checkValue02 == true) {
		enableModifySmbAcl = true
	}
	action = "ModifySmbAcl"
	request = make(map[string]interface{})
	query = make(map[string]interface{})
	request["FileSystemId"] = d.Id()

	if d.HasChange("smb_acl.0.super_admin_sid") {
		update = true
		jsonPathResult, err := jsonpath.Get("$[0].super_admin_sid", d.Get("smb_acl"))
		if err == nil {
			request["SuperAdminSid"] = jsonPathResult
		}
	}

	if d.HasChange("smb_acl.0.home_dir_path") {
		update = true
		jsonPathResult1, err := jsonpath.Get("$[0].home_dir_path", d.Get("smb_acl"))
		if err == nil {
			request["HomeDirPath"] = jsonPathResult1
		}
	}

	if v, ok := d.GetOk("keytab_md5"); ok {
		request["KeytabMd5"] = v
	}
	if d.HasChange("smb_acl.0.enable_anonymous_access") {
		update = true
		jsonPathResult3, err := jsonpath.Get("$[0].enable_anonymous_access", d.Get("smb_acl"))
		if err == nil {
			request["EnableAnonymousAccess"] = jsonPathResult3
		}
	}

	if d.HasChange("smb_acl.0.encrypt_data") {
		update = true
		jsonPathResult4, err := jsonpath.Get("$[0].encrypt_data", d.Get("smb_acl"))
		if err == nil {
			request["EncryptData"] = jsonPathResult4
		}
	}

	if d.HasChange("smb_acl.0.reject_unencrypted_access") {
		update = true
		jsonPathResult5, err := jsonpath.Get("$[0].reject_unencrypted_access", d.Get("smb_acl"))
		if err == nil {
			request["RejectUnencryptedAccess"] = jsonPathResult5
		}
	}

	if v, ok := d.GetOk("keytab"); ok {
		request["Keytab"] = v
	}
	if update && enableModifySmbAcl {
		wait := incrementalWait(3*time.Second, 5*time.Second)
		err = resource.Retry(d.Timeout(schema.TimeoutUpdate), func() *resource.RetryError {
			response, err = client.RpcPost("NAS", "2017-06-26", action, query, request, true)
			if err != nil {
				if NeedRetry(err) {
					wait()
					return resource.RetryableError(err)
				}
				return resource.NonRetryableError(err)
			}
			return nil
		})
		addDebug(action, response, request)
		if err != nil {
			return WrapErrorf(err, DefaultErrorMsg, d.Id(), action, AlibabaCloudSdkGoERROR)
		}
	}

	if d.HasChange("tags") {
		nasServiceV2 := NasServiceV2{client}
		if err := nasServiceV2.SetResourceTags(d, "filesystem"); err != nil {
			return WrapError(err)
		}
	}
	d.Partial(false)
	return resourceAliCloudNasFileSystemRead(d, meta)
}