alicloud/resource_alicloud_nas_file_system.go (842 lines of code) (raw):

package alicloud import ( "encoding/json" "fmt" "log" "strconv" "time" "github.com/PaesslerAG/jsonpath" "github.com/aliyun/terraform-provider-alicloud/alicloud/connectivity" "github.com/hashicorp/terraform-plugin-sdk/helper/resource" "github.com/hashicorp/terraform-plugin-sdk/helper/schema" ) func resourceAliCloudNasFileSystem() *schema.Resource { return &schema.Resource{ Create: resourceAliCloudNasFileSystemCreate, Read: resourceAliCloudNasFileSystemRead, Update: resourceAliCloudNasFileSystemUpdate, Delete: resourceAliCloudNasFileSystemDelete, Importer: &schema.ResourceImporter{ State: schema.ImportStatePassthrough, }, Timeouts: &schema.ResourceTimeout{ Create: schema.DefaultTimeout(10 * time.Minute), Update: schema.DefaultTimeout(10 * time.Minute), Delete: schema.DefaultTimeout(20 * time.Minute), }, Schema: map[string]*schema.Schema{ "capacity": { Type: schema.TypeInt, Optional: true, Computed: true, }, "create_time": { Type: schema.TypeString, Computed: true, }, "description": { Type: schema.TypeString, Optional: true, }, "encrypt_type": { Type: schema.TypeInt, Optional: true, Computed: true, ForceNew: true, ValidateFunc: IntInSlice([]int{0, 1, 2}), }, "file_system_type": { Type: schema.TypeString, Optional: true, Computed: true, ForceNew: true, ValidateFunc: StringInSlice([]string{"standard", "extreme", "cpfs"}, false), }, "keytab": { Type: schema.TypeString, Optional: true, }, "keytab_md5": { Type: schema.TypeString, Optional: true, }, "kms_key_id": { Type: schema.TypeString, Optional: true, Computed: true, ForceNew: true, }, "nfs_acl": { Type: schema.TypeList, Optional: true, Computed: true, MaxItems: 1, Elem: &schema.Resource{ Schema: map[string]*schema.Schema{ "enabled": { Type: schema.TypeBool, Optional: true, Computed: true, }, }, }, }, "options": { Type: schema.TypeList, Optional: true, Computed: true, MaxItems: 1, Elem: &schema.Resource{ Schema: map[string]*schema.Schema{ "enable_oplock": { Type: schema.TypeBool, Optional: true, Computed: true, }, }, }, }, "protocol_type": { Type: schema.TypeString, Required: true, ForceNew: true, ValidateFunc: StringInSlice([]string{"NFS", "SMB", "cpfs"}, false), }, "recycle_bin": { Type: schema.TypeList, Optional: true, Computed: true, MaxItems: 1, Elem: &schema.Resource{ Schema: map[string]*schema.Schema{ "status": { Type: schema.TypeString, Optional: true, Computed: true, ValidateFunc: StringInSlice([]string{"Enable", "Disable"}, false), }, "reserved_days": { Type: schema.TypeInt, Optional: true, Computed: true, ValidateFunc: IntBetween(0, 180), DiffSuppressFunc: func(k, old, new string, d *schema.ResourceData) bool { if v, ok := d.GetOk("recycle_bin.0.status"); ok && v.(string) == "Enable" { return false } return true }, }, "size": { Type: schema.TypeInt, Computed: true, }, "secondary_size": { Type: schema.TypeInt, Computed: true, }, "enable_time": { Type: schema.TypeString, Computed: true, }, }, }, }, "region_id": { Type: schema.TypeString, Computed: true, }, "resource_group_id": { Type: schema.TypeString, Optional: true, Computed: true, }, "smb_acl": { Type: schema.TypeList, Optional: true, Computed: true, MaxItems: 1, Elem: &schema.Resource{ Schema: map[string]*schema.Schema{ "home_dir_path": { Type: schema.TypeString, Optional: true, }, "enable_anonymous_access": { Type: schema.TypeBool, Optional: true, Computed: true, }, "super_admin_sid": { Type: schema.TypeString, Optional: true, }, "enabled": { Type: schema.TypeBool, Optional: true, Computed: true, }, "reject_unencrypted_access": { Type: schema.TypeBool, Optional: true, }, "encrypt_data": { Type: schema.TypeBool, Optional: true, }, }, }, }, "snapshot_id": { Type: schema.TypeString, Optional: true, }, "status": { Type: schema.TypeString, Computed: true, }, "storage_type": { Type: schema.TypeString, Required: true, ForceNew: true, ValidateFunc: StringInSlice([]string{"Performance", "Capacity", "standard", "advance", "advance_100", "advance_200", "Premium"}, false), }, "tags": tagsSchema(), "vswitch_id": { Type: schema.TypeString, Optional: true, ForceNew: true, }, "vpc_id": { Type: schema.TypeString, Optional: true, ForceNew: true, }, "zone_id": { Type: schema.TypeString, Optional: true, Computed: true, ForceNew: true, }, }, } } func resourceAliCloudNasFileSystemCreate(d *schema.ResourceData, meta interface{}) error { client := meta.(*connectivity.AliyunClient) action := "CreateFileSystem" var request map[string]interface{} var response map[string]interface{} query := make(map[string]interface{}) var err error request = make(map[string]interface{}) request["ClientToken"] = buildClientToken(action) if v, ok := d.GetOk("resource_group_id"); ok { request["ResourceGroupId"] = v } if v, ok := d.GetOk("description"); ok { request["Description"] = v } request["StorageType"] = d.Get("storage_type") if v, ok := d.GetOk("vswitch_id"); ok { request["VSwitchId"] = v } if v, ok := d.GetOk("snapshot_id"); ok { request["SnapshotId"] = v } if v, ok := d.GetOkExists("capacity"); ok { request["Capacity"] = v } if v, ok := d.GetOk("file_system_type"); ok { request["FileSystemType"] = v } if v, ok := d.GetOk("vpc_id"); ok { request["VpcId"] = v } if v, ok := d.GetOkExists("encrypt_type"); ok { request["EncryptType"] = v } request["DryRun"] = "false" request["ProtocolType"] = d.Get("protocol_type") if v, ok := d.GetOk("zone_id"); ok { request["ZoneId"] = v } if v, ok := d.GetOk("kms_key_id"); ok { request["KmsKeyId"] = v } wait := incrementalWait(3*time.Second, 5*time.Second) err = resource.Retry(d.Timeout(schema.TimeoutCreate), func() *resource.RetryError { response, err = client.RpcPost("NAS", "2017-06-26", action, query, request, true) if err != nil { if NeedRetry(err) || IsExpectedErrors(err, []string{"User.InDebt"}) { wait() return resource.RetryableError(err) } return resource.NonRetryableError(err) } return nil }) addDebug(action, response, request) if err != nil { return WrapErrorf(err, DefaultErrorMsg, "alicloud_nas_file_system", action, AlibabaCloudSdkGoERROR) } d.SetId(fmt.Sprint(response["FileSystemId"])) nasServiceV2 := NasServiceV2{client} stateConf := BuildStateConf([]string{}, []string{"Running"}, d.Timeout(schema.TimeoutCreate), 5*time.Second, nasServiceV2.NasFileSystemStateRefreshFunc(d.Id(), "Status", []string{})) if _, err := stateConf.WaitForState(); err != nil { return WrapErrorf(err, IdMsg, d.Id()) } return resourceAliCloudNasFileSystemUpdate(d, meta) } func resourceAliCloudNasFileSystemRead(d *schema.ResourceData, meta interface{}) error { client := meta.(*connectivity.AliyunClient) nasServiceV2 := NasServiceV2{client} objectRaw, err := nasServiceV2.DescribeNasFileSystem(d.Id()) if err != nil { if !d.IsNewResource() && NotFoundError(err) { log.Printf("[DEBUG] Resource alicloud_nas_file_system DescribeNasFileSystem Failed!!! %s", err) d.SetId("") return nil } return WrapError(err) } d.Set("capacity", objectRaw["Capacity"]) d.Set("create_time", objectRaw["CreateTime"]) d.Set("description", objectRaw["Description"]) d.Set("encrypt_type", objectRaw["EncryptType"]) d.Set("file_system_type", objectRaw["FileSystemType"]) d.Set("kms_key_id", objectRaw["KMSKeyId"]) d.Set("protocol_type", objectRaw["ProtocolType"]) d.Set("region_id", objectRaw["RegionId"]) d.Set("resource_group_id", objectRaw["ResourceGroupId"]) d.Set("status", objectRaw["Status"]) d.Set("storage_type", objectRaw["StorageType"]) d.Set("vswitch_id", objectRaw["QuorumVswId"]) d.Set("vpc_id", objectRaw["VpcId"]) d.Set("zone_id", objectRaw["ZoneId"]) optionsMaps := make([]map[string]interface{}, 0) optionsMap := make(map[string]interface{}) optionsRaw := make(map[string]interface{}) if objectRaw["Options"] != nil { optionsRaw = objectRaw["Options"].(map[string]interface{}) } if len(optionsRaw) > 0 { optionsMap["enable_oplock"] = optionsRaw["EnableOplock"] optionsMaps = append(optionsMaps, optionsMap) } if err := d.Set("options", optionsMaps); err != nil { return err } checkValue00 := d.Get("file_system_type") checkValue01 := d.Get("protocol_type") if (checkValue00 == "standard") && (checkValue01 == "SMB") { objectRaw, err = nasServiceV2.DescribeFileSystemDescribeSmbAcl(d.Id()) if err != nil && !NotFoundError(err) { return WrapError(err) } smbAclMaps := make([]map[string]interface{}, 0) smbAclMap := make(map[string]interface{}) smbAclMap["enable_anonymous_access"] = objectRaw["EnableAnonymousAccess"] smbAclMap["enabled"] = objectRaw["Enabled"] smbAclMap["encrypt_data"] = objectRaw["EncryptData"] smbAclMap["home_dir_path"] = objectRaw["HomeDirPath"] smbAclMap["reject_unencrypted_access"] = objectRaw["RejectUnencryptedAccess"] smbAclMap["super_admin_sid"] = objectRaw["SuperAdminSid"] smbAclMaps = append(smbAclMaps, smbAclMap) if err := d.Set("smb_acl", smbAclMaps); err != nil { return err } } checkValue00 = d.Get("file_system_type") if checkValue00 == "standard" { objectRaw, err = nasServiceV2.DescribeFileSystemGetRecycleBinAttribute(d.Id()) if err != nil && !NotFoundError(err) { return WrapError(err) } recycleBinMaps := make([]map[string]interface{}, 0) recycleBinMap := make(map[string]interface{}) recycleBinMap["enable_time"] = objectRaw["EnableTime"] recycleBinMap["reserved_days"] = objectRaw["ReservedDays"] recycleBinMap["secondary_size"] = objectRaw["SecondarySize"] recycleBinMap["size"] = objectRaw["Size"] recycleBinMap["status"] = objectRaw["Status"] recycleBinMaps = append(recycleBinMaps, recycleBinMap) if err := d.Set("recycle_bin", recycleBinMaps); err != nil { return err } } objectRaw, err = nasServiceV2.DescribeFileSystemListTagResources(d.Id()) if err != nil && !NotFoundError(err) { return WrapError(err) } tagsMaps, _ := jsonpath.Get("$.TagResources.TagResource", objectRaw) d.Set("tags", tagsToMap(tagsMaps)) checkValue00 = d.Get("file_system_type") checkValue01 = d.Get("protocol_type") if (checkValue00 == "standard") && (checkValue01 == "NFS") { objectRaw, err = nasServiceV2.DescribeFileSystemDescribeNfsAcl(d.Id()) if err != nil && !NotFoundError(err) { return WrapError(err) } nfsAclMaps := make([]map[string]interface{}, 0) nfsAclMap := make(map[string]interface{}) nfsAclMap["enabled"] = objectRaw["Enabled"] nfsAclMaps = append(nfsAclMaps, nfsAclMap) if err := d.Set("nfs_acl", nfsAclMaps); err != nil { return err } } return nil } 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) } func resourceAliCloudNasFileSystemDelete(d *schema.ResourceData, meta interface{}) error { client := meta.(*connectivity.AliyunClient) action := "DeleteFileSystem" var request map[string]interface{} var response map[string]interface{} query := make(map[string]interface{}) var err error request = make(map[string]interface{}) request["FileSystemId"] = d.Id() wait := incrementalWait(3*time.Second, 5*time.Second) err = resource.Retry(d.Timeout(schema.TimeoutDelete), 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 { if IsExpectedErrors(err, []string{"InvalidFileSystem.NotFound"}) || NotFoundError(err) { return nil } return WrapErrorf(err, DefaultErrorMsg, d.Id(), action, AlibabaCloudSdkGoERROR) } nasServiceV2 := NasServiceV2{client} stateConf := BuildStateConf([]string{}, []string{""}, d.Timeout(schema.TimeoutDelete), 5*time.Second, nasServiceV2.DescribeAsyncNasFileSystemStateRefreshFunc(d, response, "$.FileSystems", []string{})) if jobDetail, err := stateConf.WaitForState(); err != nil { return WrapErrorf(err, IdMsg, d.Id(), jobDetail) } return nil }