diff --git a/docs/resources/sfs_turbo.md b/docs/resources/sfs_turbo.md index d76e315260a..64cca3c2b4f 100644 --- a/docs/resources/sfs_turbo.md +++ b/docs/resources/sfs_turbo.md @@ -57,6 +57,9 @@ The following arguments are supported: * `crypt_key_id` - (Optional, String, ForceNew) Specifies the ID of a KMS key to encrypt the file system. Changing this will create a new resource. +* `enterprise_project_id` - (Optional, String, ForceNew) The enterprise project id of the file system. + Changing this will create a new resource. + -> **NOTE:** SFS Turbo will create two private IP addresses and one virtual IP address under the subnet you specified. To ensure normal use, SFS Turbo will enable the inbound rules for ports *111*, *445*, *2049*, *2051*, *2052*, diff --git a/go.sum b/go.sum index 8e4d5783e9f..4de2cb31773 100644 --- a/go.sum +++ b/go.sum @@ -225,10 +225,6 @@ github.com/hashicorp/yamux v0.0.0-20180604194846-3520598351bb h1:b5rjCoWHc7eqmAS github.com/hashicorp/yamux v0.0.0-20180604194846-3520598351bb/go.mod h1:+NfK9FKeTrX5uv1uIXGdwYDTeHna2qgaIlx54MXqjAM= github.com/hashicorp/yamux v0.0.0-20181012175058-2f1d1f20f75d h1:kJCB4vdITiW1eC1vq2e6IsrXKrZit1bv/TDYFGMp4BQ= github.com/hashicorp/yamux v0.0.0-20181012175058-2f1d1f20f75d/go.mod h1:+NfK9FKeTrX5uv1uIXGdwYDTeHna2qgaIlx54MXqjAM= -github.com/huaweicloud/golangsdk v0.0.0-20210323020602-6d5ee0030244 h1:Jzq3828aWxaRquRxPqv8aG1A6B+LatrIHiD3SMlHpFM= -github.com/huaweicloud/golangsdk v0.0.0-20210323020602-6d5ee0030244/go.mod h1:fcOI5u+0f62JtJd7zkCch/Z57BNC6bhqb32TKuiF4r0= -github.com/huaweicloud/golangsdk v0.0.0-20210329082007-ee3a1fd6c542 h1:rA1o0dd7F2cR/zBe9Fyk7DjjgSv85MM6PdToMabNXq4= -github.com/huaweicloud/golangsdk v0.0.0-20210329082007-ee3a1fd6c542/go.mod h1:fcOI5u+0f62JtJd7zkCch/Z57BNC6bhqb32TKuiF4r0= github.com/huaweicloud/golangsdk v0.0.0-20210401071036-b8be64ba4002 h1:RxtuAdoAiJI9bScWcXf09sVDAEjP0w4X8zIe5e4pljU= github.com/huaweicloud/golangsdk v0.0.0-20210401071036-b8be64ba4002/go.mod h1:fcOI5u+0f62JtJd7zkCch/Z57BNC6bhqb32TKuiF4r0= github.com/ianlancetaylor/demangle v0.0.0-20181102032728-5e5cf60278f6/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= diff --git a/huaweicloud/resource_huaweicloud_sfs_turbo.go b/huaweicloud/resource_huaweicloud_sfs_turbo.go index c710983f97b..28eded87895 100644 --- a/huaweicloud/resource_huaweicloud_sfs_turbo.go +++ b/huaweicloud/resource_huaweicloud_sfs_turbo.go @@ -89,7 +89,12 @@ func ResourceSFSTurbo() *schema.Resource { Computed: true, ForceNew: true, }, - + "enterprise_project_id": { + Type: schema.TypeString, + Optional: true, + ForceNew: true, + Computed: true, + }, "status": { Type: schema.TypeString, Computed: true, @@ -118,14 +123,15 @@ func resourceSFSTurboCreate(d *schema.ResourceData, meta interface{}) error { } createOpts := shares.CreateOpts{ - Name: d.Get("name").(string), - Size: d.Get("size").(int), - ShareProto: d.Get("share_proto").(string), - ShareType: d.Get("share_type").(string), - VpcID: d.Get("vpc_id").(string), - SubnetID: d.Get("subnet_id").(string), - SecurityGroupID: d.Get("security_group_id").(string), - AvailabilityZone: d.Get("availability_zone").(string), + Name: d.Get("name").(string), + Size: d.Get("size").(int), + ShareProto: d.Get("share_proto").(string), + ShareType: d.Get("share_type").(string), + VpcID: d.Get("vpc_id").(string), + SubnetID: d.Get("subnet_id").(string), + SecurityGroupID: d.Get("security_group_id").(string), + AvailabilityZone: d.Get("availability_zone").(string), + EnterpriseProjectId: GetEnterpriseProjectID(d, config), } metaOpts := shares.Metadata{} @@ -184,6 +190,7 @@ func resourceSFSTurboRead(d *schema.ResourceData, meta interface{}) error { d.Set("available_capacity", n.AvailCapacity) d.Set("export_location", n.ExportLocation) d.Set("crypt_key_id", n.CryptKeyID) + d.Set("enterprise_project_id", n.EnterpriseProjectId) // n.Size is a string of float64, should convert it to int if fsize, err := strconv.ParseFloat(n.Size, 64); err == nil { diff --git a/huaweicloud/resource_huaweicloud_sfs_turbo_test.go b/huaweicloud/resource_huaweicloud_sfs_turbo_test.go index 6ee155aabf6..e7d3a082b46 100644 --- a/huaweicloud/resource_huaweicloud_sfs_turbo_test.go +++ b/huaweicloud/resource_huaweicloud_sfs_turbo_test.go @@ -78,6 +78,29 @@ func TestAccSFSTurbo_crypt(t *testing.T) { }) } +func TestAccSFSTurbo_withEpsId(t *testing.T) { + randSuffix := acctest.RandString(5) + turboName := fmt.Sprintf("sfs-turbo-acc-%s", randSuffix) + resourceName := "huaweicloud_sfs_turbo.sfs-turbo1" + var turbo shares.Turbo + + resource.ParallelTest(t, resource.TestCase{ + PreCheck: func() { testAccPreCheckEpsID(t) }, + Providers: testAccProviders, + CheckDestroy: testAccCheckSFSTurboDestroy, + Steps: []resource.TestStep{ + { + Config: testAccSFSTurbo_withEpsId(randSuffix), + Check: resource.ComposeTestCheckFunc( + testAccCheckSFSTurboExists(resourceName, &turbo), + resource.TestCheckResourceAttr(resourceName, "name", turboName), + resource.TestCheckResourceAttr(resourceName, "enterprise_project_id", HW_ENTERPRISE_PROJECT_ID_TEST), + ), + }, + }, + }) +} + func testAccCheckSFSTurboDestroy(s *terraform.State) error { config := testAccProvider.Meta().(*Config) sfsClient, err := config.SfsV1Client(HW_REGION_NAME) @@ -207,3 +230,21 @@ resource "huaweicloud_sfs_turbo" "sfs-turbo1" { } `, testAccNetworkPreConditions(suffix), suffix, suffix) } + +func testAccSFSTurbo_withEpsId(suffix string) string { + return fmt.Sprintf(` +%s +data "huaweicloud_availability_zones" "myaz" {} + +resource "huaweicloud_sfs_turbo" "sfs-turbo1" { + name = "sfs-turbo-acc-%s" + size = 500 + share_proto = "NFS" + vpc_id = huaweicloud_vpc_v1.test.id + subnet_id = huaweicloud_vpc_subnet_v1.test.id + security_group_id = huaweicloud_networking_secgroup_v2.secgroup.id + availability_zone = data.huaweicloud_availability_zones.myaz.names[0] + enterprise_project_id = "%s" +} +`, testAccNetworkPreConditions(suffix), suffix, HW_ENTERPRISE_PROJECT_ID_TEST) +} diff --git a/vendor/github.com/huaweicloud/golangsdk/openstack/rds/v1/datastores/requests.go b/vendor/github.com/huaweicloud/golangsdk/openstack/rds/v1/datastores/requests.go deleted file mode 100644 index 17494ff8a43..00000000000 --- a/vendor/github.com/huaweicloud/golangsdk/openstack/rds/v1/datastores/requests.go +++ /dev/null @@ -1,19 +0,0 @@ -package datastores - -import ( - "github.com/huaweicloud/golangsdk" -) - -var RequestOpts golangsdk.RequestOpts = golangsdk.RequestOpts{ - MoreHeaders: map[string]string{"Content-Type": "application/json", "X-Language": "en-us"}, -} - -//list the version informations about a specified type of database -func List(client *golangsdk.ServiceClient, dataStoreName string) (r ListResult) { - - _, r.Err = client.Get(listURL(client, dataStoreName), &r.Body, &golangsdk.RequestOpts{ - OkCodes: []int{200}, - MoreHeaders: RequestOpts.MoreHeaders, JSONBody: nil, - }) - return -} diff --git a/vendor/github.com/huaweicloud/golangsdk/openstack/rds/v1/datastores/results.go b/vendor/github.com/huaweicloud/golangsdk/openstack/rds/v1/datastores/results.go deleted file mode 100644 index 7f651887005..00000000000 --- a/vendor/github.com/huaweicloud/golangsdk/openstack/rds/v1/datastores/results.go +++ /dev/null @@ -1,24 +0,0 @@ -package datastores - -import "github.com/huaweicloud/golangsdk" - -type DataStore struct { - ID string `json:"id"` - Name string `json:"name"` - DataStore string `json:"datastore"` - Image string `json:"image"` - Packages string `json:"packages"` - Active int `json:"active"` -} - -type ListResult struct { - golangsdk.Result -} - -func (lr ListResult) Extract() ([]DataStore, error) { - var a struct { - DataStores []DataStore `json:"datastores"` - } - err := lr.Result.ExtractInto(&a) - return a.DataStores, err -} diff --git a/vendor/github.com/huaweicloud/golangsdk/openstack/rds/v1/datastores/urls.go b/vendor/github.com/huaweicloud/golangsdk/openstack/rds/v1/datastores/urls.go deleted file mode 100644 index f6ef6abc592..00000000000 --- a/vendor/github.com/huaweicloud/golangsdk/openstack/rds/v1/datastores/urls.go +++ /dev/null @@ -1,7 +0,0 @@ -package datastores - -import "github.com/huaweicloud/golangsdk" - -func listURL(c *golangsdk.ServiceClient, dataStoreName string) string { - return c.ServiceURL("datastores", dataStoreName, "versions") -} diff --git a/vendor/github.com/huaweicloud/golangsdk/openstack/rds/v1/flavors/requests.go b/vendor/github.com/huaweicloud/golangsdk/openstack/rds/v1/flavors/requests.go deleted file mode 100644 index a768400a7d1..00000000000 --- a/vendor/github.com/huaweicloud/golangsdk/openstack/rds/v1/flavors/requests.go +++ /dev/null @@ -1,19 +0,0 @@ -package flavors - -import ( - "github.com/huaweicloud/golangsdk" -) - -var RequestOpts golangsdk.RequestOpts = golangsdk.RequestOpts{ - MoreHeaders: map[string]string{"Content-Type": "application/json", "X-Language": "en-us"}, -} - -//list the flavors informations about a specified id of database -func List(client *golangsdk.ServiceClient, dataStoreID string, region string) (r ListResult) { - - _, r.Err = client.Get(listURL(client, dataStoreID, region), &r.Body, &golangsdk.RequestOpts{ - OkCodes: []int{200}, - MoreHeaders: RequestOpts.MoreHeaders, JSONBody: nil, - }) - return -} diff --git a/vendor/github.com/huaweicloud/golangsdk/openstack/rds/v1/flavors/results.go b/vendor/github.com/huaweicloud/golangsdk/openstack/rds/v1/flavors/results.go deleted file mode 100644 index 1435a61b297..00000000000 --- a/vendor/github.com/huaweicloud/golangsdk/openstack/rds/v1/flavors/results.go +++ /dev/null @@ -1,22 +0,0 @@ -package flavors - -import "github.com/huaweicloud/golangsdk" - -type Flavor struct { - ID string `json:"id"` - Name string `json:"name"` - Ram int `json:"ram"` - SpecCode string `json:"specCode"` -} - -type ListResult struct { - golangsdk.Result -} - -func (lr ListResult) Extract() ([]Flavor, error) { - var a struct { - Flavors []Flavor `json:"flavors"` - } - err := lr.Result.ExtractInto(&a) - return a.Flavors, err -} diff --git a/vendor/github.com/huaweicloud/golangsdk/openstack/rds/v1/flavors/urls.go b/vendor/github.com/huaweicloud/golangsdk/openstack/rds/v1/flavors/urls.go deleted file mode 100644 index 7dbfe807427..00000000000 --- a/vendor/github.com/huaweicloud/golangsdk/openstack/rds/v1/flavors/urls.go +++ /dev/null @@ -1,8 +0,0 @@ -package flavors - -import "github.com/huaweicloud/golangsdk" - -func listURL(c *golangsdk.ServiceClient, dataStoreID string, region string) string { - - return c.ResourceBaseURL() + "flavors?dbId=" + dataStoreID + "®ion=" + region -} diff --git a/vendor/github.com/huaweicloud/golangsdk/openstack/rds/v1/instances/requests.go b/vendor/github.com/huaweicloud/golangsdk/openstack/rds/v1/instances/requests.go deleted file mode 100644 index 34ad440dbab..00000000000 --- a/vendor/github.com/huaweicloud/golangsdk/openstack/rds/v1/instances/requests.go +++ /dev/null @@ -1,205 +0,0 @@ -package instances - -import ( - "github.com/huaweicloud/golangsdk" -) - -var RequestOpts golangsdk.RequestOpts = golangsdk.RequestOpts{ - MoreHeaders: map[string]string{"Content-Type": "application/json", "X-Language": "en-us"}, -} - -//CreateOpsBuilder is used for creating instance parameters. -//any struct providing the parameters should implement this interface -type CreateOpsBuilder interface { - ToInstanceCreateMap() (map[string]interface{}, error) -} - -type UpdateOpsBuilder interface { - ToInstanceUpdateMap() (map[string]interface{}, error) -} - -type UpdatePolicyOpsBuilder interface { - ToInstanceUpdatePolicyMap() (map[string]interface{}, error) -} - -type UpdateFlavorOpsBuilder interface { - ToInstanceFlavorUpdateMap() (map[string]interface{}, error) -} - -type UpdateOps struct { - Volume map[string]interface{} `json:"volume"` -} - -type UpdatePolicyOps struct { - StartTime string `json:"starttime"` - KeepDays int `json:"keepday"` -} - -type UpdateFlavorOps struct { - FlavorRef string `json:"flavorRef"` -} - -//CreateOps is a struct that contains all the parameters. -type CreateOps struct { - Name string `json:"name" required:"true"` - - DataStore DataStoreOps `json:"datastore,omitempty"` - - FlavorRef string `json:"flavorRef" required:"true"` - - Volume VolumeOps `json:"volume,omitempty"` - - Region string `json:"region,omitempty"` - - AvailabilityZone string `json:"availabilityZone,omitempty"` - - Vpc string `json:"vpc,omitempty"` - - Nics NicsOps `json:"nics,omitempty"` - - SecurityGroup SecurityGroupOps `json:"securityGroup,omitempty"` - - DbPort string `json:"dbPort,omitempty"` - - BackupStrategy BackupStrategyOps `json:"backupStrategy,omitempty"` - - DbRtPd string `json:"dbRtPd,omitempty"` - - Ha HaOps `json:"ha,omitempty"` - - ReplicaOf string `json:"replicaOf,omitempty"` -} - -type DataStoreOps struct { - Type string `json:"type" required:"true"` - Version string `json:"version" required:"true"` -} - -type VolumeOps struct { - Type string `json:"type" required:"true"` - Size int `json:"size" required:"true"` -} - -type NicsOps struct { - SubnetId string `json:"subnetId" required:"true"` -} - -type SecurityGroupOps struct { - Id string `json:"id" required:"true"` -} - -type BackupStrategyOps struct { - StartTime string `json:"startTime" required:"true"` - KeepDays int `json:"keepDays,omitempty"` -} - -type HaOps struct { - Enable bool `json:"enable" required:"true"` - ReplicationMode string `json:"replicationMode" required:"true"` -} - -func (ops CreateOps) ToInstanceCreateMap() (map[string]interface{}, error) { - return golangsdk.BuildRequestBody(ops, "instance") -} - -func (ops UpdateOps) ToInstanceUpdateMap() (map[string]interface{}, error) { - return golangsdk.BuildRequestBody(ops, "resize") -} - -func (ops UpdatePolicyOps) ToInstanceUpdatePolicyMap() (map[string]interface{}, error) { - return golangsdk.BuildRequestBody(ops, "policy") -} - -func (ops UpdateFlavorOps) ToInstanceFlavorUpdateMap() (map[string]interface{}, error) { - return golangsdk.BuildRequestBody(ops, "resize") -} - -//Create a instance with given parameters. -func Create(client *golangsdk.ServiceClient, ops CreateOpsBuilder) (r CreateResult) { - b, err := ops.ToInstanceCreateMap() - if err != nil { - r.Err = err - return - } - - _, r.Err = client.Post(createURL(client), b, &r.Body, &golangsdk.RequestOpts{ - OkCodes: []int{202}, - MoreHeaders: RequestOpts.MoreHeaders, JSONBody: nil, - }) - - return -} - -func UpdateVolumeSize(client *golangsdk.ServiceClient, ops UpdateOpsBuilder, id string) (r UpdateResult) { - b, err := ops.ToInstanceUpdateMap() - if err != nil { - r.Err = err - return - } - - _, r.Err = client.Post(updateURL(client, id), b, &r.Body, &golangsdk.RequestOpts{ - OkCodes: []int{202}, - MoreHeaders: RequestOpts.MoreHeaders, JSONBody: nil, - }) - return -} - -func UpdatePolicy(client *golangsdk.ServiceClient, ops UpdatePolicyOpsBuilder, id string) (r UpdateResult) { - b, err := ops.ToInstanceUpdatePolicyMap() - if err != nil { - r.Err = err - return - } - - _, r.Err = client.Put(updatePolicyURL(client, id), b, &r.Body, &golangsdk.RequestOpts{ - OkCodes: []int{200}, - MoreHeaders: RequestOpts.MoreHeaders, JSONBody: nil, - }) - return -} - -func UpdateFlavorRef(client *golangsdk.ServiceClient, ops UpdateFlavorOpsBuilder, id string) (r UpdateResult) { - b, err := ops.ToInstanceFlavorUpdateMap() - if err != nil { - r.Err = err - return - } - - _, r.Err = client.Post(updateURL(client, id), b, &r.Body, &golangsdk.RequestOpts{ - OkCodes: []int{202}, - MoreHeaders: RequestOpts.MoreHeaders, JSONBody: nil, - }) - return -} - -//delete a instance via id -func Delete(client *golangsdk.ServiceClient, id string) (r DeleteResult) { - RequestOpts.OkCodes = []int{202} - RequestOpts.JSONBody = nil - JSONBody := make(map[string]interface{}) - _, r.Err = client.Delete(deleteURL(client, id), &golangsdk.RequestOpts{ - OkCodes: []int{202}, - MoreHeaders: RequestOpts.MoreHeaders, JSONBody: JSONBody, - }) - return -} - -//get a instance with detailed information by id -func Get(client *golangsdk.ServiceClient, id string) (r GetResult) { - - _, r.Err = client.Get(getURL(client, id), &r.Body, &golangsdk.RequestOpts{ - OkCodes: []int{200}, - MoreHeaders: RequestOpts.MoreHeaders, JSONBody: nil, - }) - return -} - -//list all the instances -func List(client *golangsdk.ServiceClient) (r ListResult) { - - _, r.Err = client.Get(listURL(client), &r.Body, &golangsdk.RequestOpts{ - OkCodes: []int{200}, - MoreHeaders: RequestOpts.MoreHeaders, JSONBody: nil, - }) - return -} diff --git a/vendor/github.com/huaweicloud/golangsdk/openstack/rds/v1/instances/results.go b/vendor/github.com/huaweicloud/golangsdk/openstack/rds/v1/instances/results.go deleted file mode 100644 index 98864f38910..00000000000 --- a/vendor/github.com/huaweicloud/golangsdk/openstack/rds/v1/instances/results.go +++ /dev/null @@ -1,110 +0,0 @@ -package instances - -import "github.com/huaweicloud/golangsdk" - -type Instance struct { - ID string `json:"id"` - Status string `json:"status"` - Name string `json:"name"` - Created string `json:"created"` - HostName string `json:"hostname"` - Type string `json:"type"` - Region string `json:"region"` - Updated string `json:"updated"` - AvailabilityZone string `json:"availabilityZone"` - Vpc string `json:"vpc"` - Nics NicsInfor `json:"nics"` - SecurityGroup SecurityGroupInfor `json:"securityGroup"` - Flavor FlavorInfo `json:"flavor"` - Volume VolumeInfor `json:"volume"` - DbPort int `json:"dbPort"` - DataStore DataStoreInfo `json:"dataStoreInfo"` - ExtendParameters ExtendParamInfo `json:"extendparam"` - BackupStrategy BackupStrategyInfor `json:"backupStrategy"` - Ha HaInfor `json:"ha"` - SlaveId string `json:"slaveId"` -} - -type ExtendParamInfo struct { - Jobs []Job `json:"jobs"` -} - -type FlavorInfo struct { - Id string `json:"id"` -} - -type DataStoreInfo struct { - Type string `json:"type"` - Version string `json:"version"` -} - -type VolumeInfor struct { - Type string `json:"type"` - Size int `json:"size"` -} - -type NicsInfor struct { - SubnetId string `json:"subnetId"` -} - -type SecurityGroupInfor struct { - Id string `json:"id"` -} - -type BackupStrategyInfor struct { - StartTime string `json:"startTime"` - KeepDays int `json:"keepDays"` -} - -type HaInfor struct { - Enable bool `json:"enable"` - ReplicationMode string `json:"replicationMode"` -} - -type Job struct { - ID string `json:"id"` -} - -// Extract will get the Instance object out of the commonResult object. -func (r commonResult) Extract() (*Instance, error) { - var s Instance - err := r.ExtractInto(&s) - return &s, err -} - -func (r commonResult) ExtractInto(v interface{}) error { - return r.Result.ExtractIntoStructPtr(v, "instance") -} - -type commonResult struct { - golangsdk.Result -} - -// CreateResult contains the response body and error from a Create request. -type CreateResult struct { - commonResult -} - -type UpdateResult struct { - commonResult -} - -type DeleteResult struct { - commonResult -} - -type GetResult struct { - commonResult -} - -type ListResult struct { - golangsdk.Result -} - -func (lr ListResult) Extract() ([]Instance, error) { - var a struct { - Instances []Instance `json:"instances"` - } - err := lr.Result.ExtractInto(&a) - return a.Instances, err -} diff --git a/vendor/github.com/huaweicloud/golangsdk/openstack/rds/v1/instances/urls.go b/vendor/github.com/huaweicloud/golangsdk/openstack/rds/v1/instances/urls.go deleted file mode 100644 index a32e59ba75c..00000000000 --- a/vendor/github.com/huaweicloud/golangsdk/openstack/rds/v1/instances/urls.go +++ /dev/null @@ -1,27 +0,0 @@ -package instances - -import "github.com/huaweicloud/golangsdk" - -func createURL(c *golangsdk.ServiceClient) string { - return c.ServiceURL("instances") -} - -func deleteURL(c *golangsdk.ServiceClient, id string) string { - return c.ServiceURL("instances", id) -} - -func getURL(c *golangsdk.ServiceClient, id string) string { - return c.ServiceURL("instances", id) -} - -func listURL(c *golangsdk.ServiceClient) string { - return c.ServiceURL("instances") -} - -func updateURL(c *golangsdk.ServiceClient, id string) string { - return c.ServiceURL("instances", id, "action") -} - -func updatePolicyURL(c *golangsdk.ServiceClient, id string) string { - return c.ServiceURL("instances", id, "backups/policy") -} diff --git a/vendor/modules.txt b/vendor/modules.txt index 3b40e2306b9..12bac445975 100644 --- a/vendor/modules.txt +++ b/vendor/modules.txt @@ -407,9 +407,6 @@ github.com/huaweicloud/golangsdk/openstack/networking/v2/subnets github.com/huaweicloud/golangsdk/openstack/obs github.com/huaweicloud/golangsdk/openstack/opengauss/v3/backups github.com/huaweicloud/golangsdk/openstack/opengauss/v3/instances -github.com/huaweicloud/golangsdk/openstack/rds/v1/datastores -github.com/huaweicloud/golangsdk/openstack/rds/v1/flavors -github.com/huaweicloud/golangsdk/openstack/rds/v1/instances github.com/huaweicloud/golangsdk/openstack/rds/v3/backups github.com/huaweicloud/golangsdk/openstack/rds/v3/configurations github.com/huaweicloud/golangsdk/openstack/rds/v3/datastores