From a64f82a68b56c82598f92a9734fb920e092cfe54 Mon Sep 17 00:00:00 2001 From: zhongjun2 Date: Wed, 18 Sep 2019 19:03:02 +0800 Subject: [PATCH] Add list method --- openstack/ces/v1/metrics/results.go | 8 + openstack/dcs/v1/instances/requests.go | 45 +- openstack/dcs/v1/instances/results.go | 25 ++ openstack/dcs/v1/instances/urls.go | 4 + openstack/dms/v1/instances/requests.go | 43 ++ openstack/dms/v1/instances/results.go | 25 ++ openstack/dms/v1/instances/urls.go | 4 + .../v2/extensions/natgateways/requests.go | 39 ++ .../v2/extensions/natgateways/results.go | 29 ++ openstack/rds/v3/instances/requests.go | 396 ++++++++++++++++++ openstack/rds/v3/instances/results.go | 258 ++++++++++++ openstack/rds/v3/instances/urls.go | 39 ++ 12 files changed, 914 insertions(+), 1 deletion(-) create mode 100644 openstack/rds/v3/instances/requests.go create mode 100644 openstack/rds/v3/instances/results.go create mode 100644 openstack/rds/v3/instances/urls.go diff --git a/openstack/ces/v1/metrics/results.go b/openstack/ces/v1/metrics/results.go index 97b965a2f..f0e0237d1 100644 --- a/openstack/ces/v1/metrics/results.go +++ b/openstack/ces/v1/metrics/results.go @@ -2,6 +2,7 @@ package metrics import ( "bytes" + "strconv" "github.com/huaweicloud/golangsdk" "github.com/huaweicloud/golangsdk/pagination" @@ -11,6 +12,7 @@ type Metrics struct { Metrics []Metric `json:"metrics"` MetaData MetaData `json:"meta_data"` } + type MetaData struct { Count int `json:"count"` Marker string `json:"marker"` @@ -90,6 +92,12 @@ func (r MetricsPage) NextPageURL() (string, error) { return "", nil } + limit := r.URL.Query().Get("limit") + num, _ := strconv.Atoi(limit) + if num > len(metrics.Metrics) { + return "", nil + } + metricslen := len(metrics.Metrics) - 1 var buf bytes.Buffer diff --git a/openstack/dcs/v1/instances/requests.go b/openstack/dcs/v1/instances/requests.go index 1cbee26a5..20c369fb2 100644 --- a/openstack/dcs/v1/instances/requests.go +++ b/openstack/dcs/v1/instances/requests.go @@ -2,6 +2,7 @@ package instances import ( "github.com/huaweicloud/golangsdk" + "github.com/huaweicloud/golangsdk/pagination" ) // CreateOpsBuilder is used for creating instance parameters. @@ -118,6 +119,29 @@ type PeriodicalBackupPlan struct { BackupAt []int `json:"backup_at" required:"true"` } +type ListDcsInstanceOpts struct { + Id string `q:"id"` + Name string `q:"name"` + Type string `q:"type"` + DataStoreType string `q:"datastore_type"` + VpcId string `q:"vpc_id"` + SubnetId string `q:"subnet_id"` + Offset int `q:"offset"` + Limit int `q:"limit"` +} + +type ListDcsBuilder interface { + ToDcsListDetailQuery() (string, error) +} + +func (opts ListDcsInstanceOpts) ToDcsListDetailQuery() (string, error) { + q, err := golangsdk.BuildQueryString(opts) + if err != nil { + return "", err + } + return q.String(), err +} + // ToInstanceCreateMap is used for type convert func (ops CreateOps) ToInstanceCreateMap() (map[string]interface{}, error) { return golangsdk.BuildRequestBody(ops, "") @@ -134,7 +158,6 @@ func Create(client *golangsdk.ServiceClient, ops CreateOpsBuilder) (r CreateResu _, r.Err = client.Post(createURL(client), b, &r.Body, &golangsdk.RequestOpts{ OkCodes: []int{200}, }) - return } @@ -281,3 +304,23 @@ func Extend(client *golangsdk.ServiceClient, id string, opts ExtendOptsBuilder) }) return } + +func List(client *golangsdk.ServiceClient, opts ListDcsBuilder) pagination.Pager { + url := listURL(client) + if opts != nil { + query, err := opts.ToDcsListDetailQuery() + + if err != nil { + return pagination.Pager{Err: err} + } + url += query + } + + pageDcsList := pagination.NewPager(client, url, func(r pagination.PageResult) pagination.Page { + return DcsPage{pagination.SinglePageBase(r)} + }) + + dcsheader := map[string]string{"Content-Type": "application/json"} + pageDcsList.Headers = dcsheader + return pageDcsList +} diff --git a/openstack/dcs/v1/instances/results.go b/openstack/dcs/v1/instances/results.go index 99043e900..54e55c836 100644 --- a/openstack/dcs/v1/instances/results.go +++ b/openstack/dcs/v1/instances/results.go @@ -2,6 +2,7 @@ package instances import ( "github.com/huaweicloud/golangsdk" + "github.com/huaweicloud/golangsdk/pagination" ) // InstanceCreate response @@ -26,6 +27,11 @@ type DeleteResult struct { golangsdk.ErrResult } +type ListDcsResponse struct { + Instances []Instance `json:"instances"` + TotalCount int `json:"instance_num"` +} + // Instance response type Instance struct { Name string `json:"name"` @@ -111,3 +117,22 @@ func (r UpdatePasswordResult) Extract() (*Password, error) { type ExtendResult struct { golangsdk.Result } + +type DcsPage struct { + pagination.SinglePageBase +} + +func (r DcsPage) IsEmpty() (bool, error) { + data, err := ExtractDcsInstances(r) + if err != nil { + return false, err + } + return len(data.Instances) == 0, err +} + +// ExtractCloudServers is a function that takes a ListResult and returns the services' information. +func ExtractDcsInstances(r pagination.Page) (ListDcsResponse, error) { + var s ListDcsResponse + err := (r.(DcsPage)).ExtractInto(&s) + return s, err +} diff --git a/openstack/dcs/v1/instances/urls.go b/openstack/dcs/v1/instances/urls.go index cb384cc03..4b3c4ad43 100644 --- a/openstack/dcs/v1/instances/urls.go +++ b/openstack/dcs/v1/instances/urls.go @@ -36,3 +36,7 @@ func passwordURL(client *golangsdk.ServiceClient, id string) string { func extendURL(client *golangsdk.ServiceClient, id string) string { return client.ServiceURL(resourcePath, id, extendPath) } + +func listURL(client *golangsdk.ServiceClient) string { + return client.ServiceURL(resourcePath) +} diff --git a/openstack/dms/v1/instances/requests.go b/openstack/dms/v1/instances/requests.go index 9cc78a2c5..706af10e9 100644 --- a/openstack/dms/v1/instances/requests.go +++ b/openstack/dms/v1/instances/requests.go @@ -2,6 +2,7 @@ package instances import ( "github.com/huaweicloud/golangsdk" + "github.com/huaweicloud/golangsdk/pagination" ) // CreateOpsBuilder is used for creating instance parameters. @@ -167,3 +168,45 @@ func Get(client *golangsdk.ServiceClient, id string) (r GetResult) { _, r.Err = client.Get(getURL(client, id), &r.Body, nil) return } + +type ListDmsInstanceOpts struct { + Id string `q:"id"` + Name string `q:"name"` + Engine string `q:"engine"` + Status string `q:"status"` + IncludeFailure string `q:"includeFailure"` + ExactMatchName string `q:"exactMatchName"` + EnterpriseProjectID int `q:"enterprise_project_id"` +} + +type ListDmsBuilder interface { + ToDmsListDetailQuery() (string, error) +} + +func (opts ListDmsInstanceOpts) ToDmsListDetailQuery() (string, error) { + q, err := golangsdk.BuildQueryString(opts) + if err != nil { + return "", err + } + return q.String(), err +} + +func List(client *golangsdk.ServiceClient, opts ListDmsBuilder) pagination.Pager { + url := listURL(client) + if opts != nil { + query, err := opts.ToDmsListDetailQuery() + + if err != nil { + return pagination.Pager{Err: err} + } + url += query + } + + pageDmsList := pagination.NewPager(client, url, func(r pagination.PageResult) pagination.Page { + return DmsPage{pagination.SinglePageBase(r)} + }) + + dmsheader := map[string]string{"Content-Type": "application/json"} + pageDmsList.Headers = dmsheader + return pageDmsList +} diff --git a/openstack/dms/v1/instances/results.go b/openstack/dms/v1/instances/results.go index 7e82e9fa5..92cba2a13 100644 --- a/openstack/dms/v1/instances/results.go +++ b/openstack/dms/v1/instances/results.go @@ -2,6 +2,7 @@ package instances import ( "github.com/huaweicloud/golangsdk" + "github.com/huaweicloud/golangsdk/pagination" ) // InstanceCreate response @@ -26,6 +27,11 @@ type DeleteResult struct { golangsdk.ErrResult } +type ListDmsResponse struct { + Instances []Instance `json:"instances"` + TotalCount int `json:"instance_num"` +} + // Instance response type Instance struct { Name string `json:"name"` @@ -76,3 +82,22 @@ func (r GetResult) Extract() (*Instance, error) { err := r.Result.ExtractInto(&s) return &s, err } + +type DmsPage struct { + pagination.SinglePageBase +} + +func (r DmsPage) IsEmpty() (bool, error) { + data, err := ExtractDmsInstances(r) + if err != nil { + return false, err + } + return len(data.Instances) == 0, err +} + +// ExtractCloudServers is a function that takes a ListResult and returns the services' information. +func ExtractDmsInstances(r pagination.Page) (ListDmsResponse, error) { + var s ListDmsResponse + err := (r.(DmsPage)).ExtractInto(&s) + return s, err +} diff --git a/openstack/dms/v1/instances/urls.go b/openstack/dms/v1/instances/urls.go index 9308ec2c8..106f157de 100644 --- a/openstack/dms/v1/instances/urls.go +++ b/openstack/dms/v1/instances/urls.go @@ -24,3 +24,7 @@ func updateURL(c *golangsdk.ServiceClient, id string) string { func getURL(client *golangsdk.ServiceClient, id string) string { return client.ServiceURL(resourcePath, id) } + +func listURL(client *golangsdk.ServiceClient) string { + return client.ServiceURL(resourcePath) +} diff --git a/openstack/networking/v2/extensions/natgateways/requests.go b/openstack/networking/v2/extensions/natgateways/requests.go index 003b57133..89213a650 100644 --- a/openstack/networking/v2/extensions/natgateways/requests.go +++ b/openstack/networking/v2/extensions/natgateways/requests.go @@ -2,6 +2,7 @@ package natgateways import ( "github.com/huaweicloud/golangsdk" + "github.com/huaweicloud/golangsdk/pagination" ) // CreateOptsBuilder is an interface must satisfy to be used as Create @@ -21,6 +22,20 @@ type CreateOpts struct { TenantID string `json:"tenant_id,omitempty"` } +type ListOpts struct { + Limit int `q:"limit"` + ID string `q:"id"` + Name string `q:"name"` + TenantId string `q:"tenant_id"` + Description string `q:"description"` + Spec string `q:"spec"` + RouterID string `q:"router_id"` + InternalNetworkID string `q:"internal_network_id"` + Status string `q:"status"` + AdminStateUp *bool `q:"admin_state_up"` + CreatedAt string `q:"created_at"` +} + // ToNatGatewayCreateMap allows CreateOpts to satisfy the CreateOptsBuilder // interface func (opts CreateOpts) ToNatGatewayCreateMap() (map[string]interface{}, error) { @@ -70,6 +85,15 @@ func (opts UpdateOpts) ToNatGatewayUpdateMap() (map[string]interface{}, error) { return golangsdk.BuildRequestBody(opts, "nat_gateway") } +func (opts ListOpts) ToNatGatewayListQuery() (string, error) { + q, err := golangsdk.BuildQueryString(opts) + return q.String(), err +} + +type ListOptsBuilder interface { + ToNatGatewayListQuery() (string, error) +} + //Update allows nat gateway resources to be updated. func Update(c *golangsdk.ServiceClient, id string, opts UpdateOptsBuilder) (r UpdateResult) { b, err := opts.ToNatGatewayUpdateMap() @@ -82,3 +106,18 @@ func Update(c *golangsdk.ServiceClient, id string, opts UpdateOptsBuilder) (r Up }) return } + +func List(c *golangsdk.ServiceClient, opts ListOptsBuilder) pagination.Pager { + url := rootURL(c) + if opts != nil { + query, err := opts.ToNatGatewayListQuery() + if err != nil { + return pagination.Pager{Err: err} + } + url += query + } + + return pagination.NewPager(c, url, func(r pagination.PageResult) pagination.Page { + return NatGatewayPage{pagination.LinkedPageBase{PageResult: r}} + }) +} diff --git a/openstack/networking/v2/extensions/natgateways/results.go b/openstack/networking/v2/extensions/natgateways/results.go index 5530c01a7..f21a4e022 100644 --- a/openstack/networking/v2/extensions/natgateways/results.go +++ b/openstack/networking/v2/extensions/natgateways/results.go @@ -2,6 +2,7 @@ package natgateways import ( "github.com/huaweicloud/golangsdk" + "github.com/huaweicloud/golangsdk/pagination" ) // NatGateway is a struct that represents a nat gateway @@ -54,3 +55,31 @@ func (r UpdateResult) Extract() (NatGateway, error) { type DeleteResult struct { golangsdk.ErrResult } + +type NatGatewayPage struct { + pagination.LinkedPageBase +} + +func (r NatGatewayPage) NextPageURL() (string, error) { + var s struct { + Links []golangsdk.Link `json:"nat_gateways_links"` + } + err := r.ExtractInto(&s) + if err != nil { + return "", err + } + return golangsdk.ExtractNextURL(s.Links) +} + +func (r NatGatewayPage) IsEmpty() (bool, error) { + is, err := ExtractNatGateways(r) + return len(is) == 0, err +} + +func ExtractNatGateways(r pagination.Page) ([]NatGateway, error) { + var s struct { + NatGateways []NatGateway `json:"nat_gateways"` + } + err := (r.(NatGatewayPage)).ExtractInto(&s) + return s.NatGateways, err +} diff --git a/openstack/rds/v3/instances/requests.go b/openstack/rds/v3/instances/requests.go new file mode 100644 index 000000000..c4837ad4e --- /dev/null +++ b/openstack/rds/v3/instances/requests.go @@ -0,0 +1,396 @@ +package instances + +import ( + "fmt" + + "github.com/huaweicloud/golangsdk" + "github.com/huaweicloud/golangsdk/pagination" +) + +type CreateRdsOpts struct { + Name string `json:"name" required:"true"` + Datastore *Datastore `json:"datastore" required:"true"` + Ha *Ha `json:"ha,omitempty"` + ConfigurationId string `json:"configuration_id,omitempty"` + Port string `json:"port,omitempty"` + Password string `json:"password" required:"true"` + BackupStrategy *BackupStrategy `json:"backup_strategy,omitempty"` + EnterpriseProjectId string `json:"enterprise_project_id,omitempty"` + DiskEncryptionId string `json:"disk_encryption_id,omitempty"` + FlavorRef string `json:"flavor_ref" required:"true"` + Volume *Volume `json:"volume" required:"true"` + Region string `json:"region" required:"true"` + AvailabilityZone string `json:"availability_zone" required:"true"` + VpcId string `json:"vpc_id" required:"true"` + SubnetId string `json:"subnet_id" required:"true"` + SecurityGroupId string `json:"security_group_id" required:"true"` + ChargeInfo *ChargeInfo `json:"charge_info,omitempty"` + TimeZone string `json:"time_zone,omitempty"` +} + +type CreateReplicaOpts struct { + Name string `json:"name" required:"true"` + ReplicaOfId string `json:"replica_of_id" required:"true"` + EnterpriseProjectId string `json:"enterprise_project_id,omitempty"` + DiskEncryptionId string `json:"disk_encryption_id,omitempty"` + FlavorRef string `json:"flavor_ref" required:"true"` + Volume *Volume `json:"volume" required:"true"` + Region string `json:"region,omitempty"` + AvailabilityZone string `json:"availability_zone" required:"true"` + ChargeInfo *ChargeInfo `json:"charge_info,omitempty"` +} + +type Datastore struct { + Type string `json:"type" required:"true"` + Version string `json:"version" required:"true"` +} + +type Ha struct { + Mode string `json:"mode" required:"true"` + ReplicationMode string `json:"replication_mode,omitempty"` +} + +type BackupStrategy struct { + StartTime string `json:"start_time" required:"true"` + KeepDays int `json:"keep_days,omitempty"` +} + +type Volume struct { + Type string `json:"type" required:"true"` + Size int `json:"size" required:"true"` +} + +type ChargeInfo struct { + ChargeMode string `json:"charge_mode" required:"true"` + PeriodType string `json:"period_type,omitempty"` + PeriodNum int `json:"period_num,omitempty"` + IsAutoRenew string `json:"is_auto_renew,omitempty"` + IsAutoPay string `json:"is_auto_pay,omitempty"` +} + +type CreateRdsBuilder interface { + ToInstancesCreateMap() (map[string]interface{}, error) +} + +func (opts CreateRdsOpts) ToInstancesCreateMap() (map[string]interface{}, error) { + b, err := golangsdk.BuildRequestBody(opts, "") + if err != nil { + return nil, err + } + return b, nil +} + +func Create(client *golangsdk.ServiceClient, opts CreateRdsBuilder) (r CreateResult) { + b, err := opts.ToInstancesCreateMap() + if err != nil { + r.Err = err + return + } + + _, r.Err = client.Post(createURL(client), b, &r.Body, &golangsdk.RequestOpts{ + OkCodes: []int{202}, + }) + return +} + +type CreateReplicaBuilder interface { + ToCreateReplicaMap() (map[string]interface{}, error) +} + +func (opts CreateReplicaOpts) ToCreateReplicaMap() (map[string]interface{}, error) { + b, err := golangsdk.BuildRequestBody(opts, "") + if err != nil { + return nil, err + } + return b, nil +} + +func CreateReplica(client *golangsdk.ServiceClient, opts CreateReplicaBuilder) (r CreateResult) { + b, err := opts.ToCreateReplicaMap() + if err != nil { + r.Err = err + return + } + + _, r.Err = client.Post(createURL(client), b, &r.Body, &golangsdk.RequestOpts{ + OkCodes: []int{202}, + }) + + return +} + +type DeleteInstance struct { + InstanceId string `json:"instance_id" required:"true"` +} + +type DeleteInstanceBuilder interface { + ToInstancesDeleteMap() (map[string]interface{}, error) +} + +func (opts DeleteInstance) ToInstancesDeleteMap() (map[string]interface{}, error) { + b, err := golangsdk.BuildRequestBody(&opts, "") + if err != nil { + return nil, err + } + return b, nil +} + +func Delete(client *golangsdk.ServiceClient, instanceId string) (r DeleteInstanceRdsResult) { + + url := deleteURL(client, instanceId) + + _, r.Err = client.Delete(url, &golangsdk.RequestOpts{JSONResponse: &r.Body, MoreHeaders: map[string]string{"Content-Type": "application/json"}}) + return +} + +type RestartRdsInstanceOpts struct { + Restart string `json:"restart" required:"true"` +} + +type RestartRdsInstanceBuilder interface { + ToRestartRdsInstanceMap() (map[string]interface{}, error) +} + +func (opts RestartRdsInstanceOpts) ToRestartRdsInstanceMap() (map[string]interface{}, error) { + b, err := golangsdk.BuildRequestBody(&opts, "") + if err != nil { + return nil, err + } + return b, nil +} + +func Restart(client *golangsdk.ServiceClient, opts RestartRdsInstanceBuilder, instanceId string) (r RestartRdsInstanceResult) { + b, err := opts.ToRestartRdsInstanceMap() + if err != nil { + r.Err = err + return + } + fmt.Println("restart Rds instance body = ", b) + _, r.Err = client.Post(restartURL(client, instanceId), b, &r.Body, &golangsdk.RequestOpts{ + OkCodes: []int{202}, + }) + return +} + +type ListRdsInstanceOpts struct { + Id string `q:"id"` + Name string `q:"name"` + Type string `q:"type"` + DataStoreType string `q:"datastore_type"` + VpcId string `q:"vpc_id"` + SubnetId string `q:"subnet_id"` + Offset int `q:"offset"` + Limit int `q:"limit"` +} + +type ListRdsBuilder interface { + ToRdsListDetailQuery() (string, error) +} + +func (opts ListRdsInstanceOpts) ToRdsListDetailQuery() (string, error) { + q, err := golangsdk.BuildQueryString(opts) + if err != nil { + return "", err + } + return q.String(), err +} + +func List(client *golangsdk.ServiceClient, opts ListRdsBuilder) pagination.Pager { + url := listURL(client) + if opts != nil { + query, err := opts.ToRdsListDetailQuery() + + if err != nil { + return pagination.Pager{Err: err} + } + url += query + } + + pageRdsList := pagination.NewPager(client, url, func(r pagination.PageResult) pagination.Page { + return RdsPage{pagination.SinglePageBase(r)} + }) + + rdsheader := map[string]string{"Content-Type": "application/json"} + pageRdsList.Headers = rdsheader + return pageRdsList +} + +type SingleToHaRdsOpts struct { + SingleToHa *SingleToHaRds `json:"single_to_ha" required:"true"` +} + +type SingleToHaRds struct { + AzCodeNewNode string `json:"az_code_new_node" required:"true"` + Password string `json:"password,omitempty"` +} + +type SingleToRdsHaBuilder interface { + ToSingleToRdsHaMap() (map[string]interface{}, error) +} + +func (opts SingleToHaRdsOpts) ToSingleToRdsHaMap() (map[string]interface{}, error) { + b, err := golangsdk.BuildRequestBody(&opts, "") + if err != nil { + return nil, err + } + return b, nil +} + +func SingleToHa(client *golangsdk.ServiceClient, opts SingleToRdsHaBuilder, instanceId string) (r SingleToHaRdsInstanceResult) { + b, err := opts.ToSingleToRdsHaMap() + if err != nil { + r.Err = err + return + } + _, r.Err = client.Post(singletohaURL(client, instanceId), b, &r.Body, &golangsdk.RequestOpts{ + OkCodes: []int{202}, + }) + + return +} + +type SpecCode struct { + Speccode string `json:"spec_code" required:"true"` +} + +type ResizeFlavorOpts struct { + ResizeFlavor *SpecCode `json:"resize_flavor" required:"true"` +} + +type ResizeFlavorBuilder interface { + ResizeFlavorMap() (map[string]interface{}, error) +} + +func (opts ResizeFlavorOpts) ResizeFlavorMap() (map[string]interface{}, error) { + b, err := golangsdk.BuildRequestBody(&opts, "") + if err != nil { + return nil, err + } + return b, nil +} + +func Resize(client *golangsdk.ServiceClient, opts ResizeFlavorBuilder, instanceId string) (r ResizeFlavorResult) { + b, err := opts.ResizeFlavorMap() + if err != nil { + r.Err = err + return + } + _, r.Err = client.Post(resizeURL(client, instanceId), b, &r.Body, &golangsdk.RequestOpts{ + OkCodes: []int{202}, + }) + + return +} + +type EnlargeVolumeRdsOpts struct { + EnlargeVolume *EnlargeVolumeSize `json:"enlarge_volume" required:"true"` +} + +type EnlargeVolumeSize struct { + Size int `json:"size" required:"true"` +} + +type EnlargeVolumeBuilder interface { + ToEnlargeVolumeMap() (map[string]interface{}, error) +} + +func (opts EnlargeVolumeRdsOpts) ToEnlargeVolumeMap() (map[string]interface{}, error) { + b, err := golangsdk.BuildRequestBody(&opts, "") + if err != nil { + return nil, err + } + return b, nil +} + +func EnlargeVolume(client *golangsdk.ServiceClient, opts EnlargeVolumeBuilder, instanceId string) (r EnlargeVolumeResult) { + b, err := opts.ToEnlargeVolumeMap() + if err != nil { + r.Err = err + return + } + _, r.Err = client.Post(enlargeURL(client, instanceId), b, &r.Body, &golangsdk.RequestOpts{ + OkCodes: []int{202}, + }) + + return +} + +type DbErrorlogOpts struct { + StartDate string `q:"start_date"` + EndDate string `q:"end_date"` + Offset string `q:"offset"` + Limit string `q:"limit"` + Level string `q:"level"` +} + +type DbErrorlogBuilder interface { + DbErrorlogQuery() (string, error) +} + +func (opts DbErrorlogOpts) DbErrorlogQuery() (string, error) { + q, err := golangsdk.BuildQueryString(opts) + if err != nil { + return "", err + } + return q.String(), err +} + +func ListErrorLog(client *golangsdk.ServiceClient, opts DbErrorlogBuilder, instanceID string) pagination.Pager { + url := listerrorlogURL(client, instanceID) + if opts != nil { + query, err := opts.DbErrorlogQuery() + + if err != nil { + return pagination.Pager{Err: err} + } + url += query + } + + pageRdsList := pagination.NewPager(client, url, func(r pagination.PageResult) pagination.Page { + return ErrorLogPage{pagination.SinglePageBase(r)} + }) + + rdsheader := map[string]string{"Content-Type": "application/json"} + pageRdsList.Headers = rdsheader + return pageRdsList +} + +type DbSlowLogOpts struct { + StartDate string `q:"start_date"` + EndDate string `q:"end_date"` + Offset string `q:"offset"` + Limit string `q:"limit"` + Level string `q:"level"` +} + +type DbSlowLogBuilder interface { + ToDbSlowLogListQuery() (string, error) +} + +func (opts DbSlowLogOpts) ToDbSlowLogListQuery() (string, error) { + q, err := golangsdk.BuildQueryString(opts) + if err != nil { + return "", err + } + return q.String(), err +} + +func ListSlowLog(client *golangsdk.ServiceClient, opts DbSlowLogBuilder, instanceID string) pagination.Pager { + url := listslowlogURL(client, instanceID) + if opts != nil { + query, err := opts.ToDbSlowLogListQuery() + + if err != nil { + return pagination.Pager{Err: err} + } + url += query + } + + pageRdsList := pagination.NewPager(client, url, func(r pagination.PageResult) pagination.Page { + return ErrorLogPage{pagination.SinglePageBase(r)} + }) + + rdsheader := map[string]string{"Content-Type": "application/json"} + pageRdsList.Headers = rdsheader + return pageRdsList +} diff --git a/openstack/rds/v3/instances/results.go b/openstack/rds/v3/instances/results.go new file mode 100644 index 000000000..3077fb2dd --- /dev/null +++ b/openstack/rds/v3/instances/results.go @@ -0,0 +1,258 @@ +package instances + +import ( + "github.com/huaweicloud/golangsdk" + "github.com/huaweicloud/golangsdk/pagination" +) + +type commonResult struct { + golangsdk.Result +} + +type CreateResult struct { + commonResult +} + +type RestartRdsInstanceResult struct { + commonResult +} + +type SingleToHaRdsInstanceResult struct { + commonResult +} + +type ResizeFlavorResult struct { + commonResult +} + +type Instance struct { + Id string `json:"id"` + Name string `json:"name"` + Status string `json:"status"` + Datastore Datastore `json:"datastore"` + Ha Ha `json:"ha"` + ConfigurationId string `json:"configuration_id"` + Port string `json:"port"` + BackupStrategy BackupStrategy `json:"backup_strategy"` + EnterpriseProjectId string `json:"enterprise_project_id"` + DiskEncryptionId string `json:"disk_encryption_id"` + FlavorRef string `json:"flavor_ref"` + Volume Volume `json:"volume"` + Region string `json:"region"` + AvailabilityZone string `json:"availability_zone"` + VpcId string `json:"vpc_id"` + SubnetId string `json:"subnet_id"` + SecurityGroupId string `json:"security_group_id"` + ChargeInfo ChargeInfo `json:"charge_info"` +} + +type CreateRds struct { + Instance Instance `json:"instance"` + JobId string `json:"job_id"` + OrderId string `json:"order_id"` +} + +func (r CreateResult) Extract() (*CreateRds, error) { + var response CreateRds + err := r.ExtractInto(&response) + return &response, err +} + +type DeleteInstanceRdsResult struct { + commonResult +} + +type DeleteInstanceRdsResponse struct { + JobId string `json:"job_id"` +} + +func (r DeleteInstanceRdsResult) Extract() (*DeleteInstanceRdsResponse, error) { + var response DeleteInstanceRdsResponse + err := r.ExtractInto(&response) + return &response, err +} + +type RestartRdsResponse struct { + JobId string `json:"job_id"` +} + +func (r RestartRdsInstanceResult) Extract() (*RestartRdsResponse, error) { + var response RestartRdsResponse + err := r.ExtractInto(&response) + return &response, err +} + +type SingleToHaResponse struct { + JobId string `json:"job_id"` +} + +func (r SingleToHaRdsInstanceResult) Extract() (*SingleToHaResponse, error) { + var response SingleToHaResponse + err := r.ExtractInto(&response) + return &response, err +} + +type ResizeFlavor struct { + JobId string `json:"job_id"` +} + +func (r ResizeFlavorResult) Extract() (*ResizeFlavor, error) { + var response ResizeFlavor + err := r.ExtractInto(&response) + return &response, err +} + +type EnlargeVolumeResult struct { + commonResult +} + +type EnlargeVolumeResp struct { + JobId string `json:"job_id"` +} + +func (r EnlargeVolumeResult) Extract() (*EnlargeVolumeResp, error) { + var response EnlargeVolumeResp + err := r.ExtractInto(&response) + return &response, err +} + +type ListRdsResult struct { + commonResult +} + +type ListRdsResponse struct { + Instances []RdsInstanceResponse `json:"instances"` + TotalCount int `json:"total_count"` +} + +type RdsInstanceResponse struct { + Id string `json:"id"` + Name string `json:"name"` + Status string `json:"status"` + PrivateIps []string `json:"private_ips"` + PublicIps []string `json:"public_ips"` + Port int `json:"port"` + Type string `json:"type"` + Ha Ha `json:"ha"` + Region string `json:"region"` + DataStore Datastore `json:"datastore"` + Created string `json:"created"` + Updated string `json:"updated"` + DbUserName string `json:"db_user_name"` + VpcId string `json:"vpc_id"` + SubnetId string `json:"subnet_id"` + SecurityGroupId string `json:"security_group_id"` + FlavorRef string `json:"flavor_ref"` + Volume Volume `json:"volume"` + SwitchStrategy string `json:"switch_strategy"` + BackupStrategy BackupStrategy `json:"backup_strategy"` + MaintenanceWindow string `json:"maintenance_window"` + Nodes []Nodes `json:"nodes"` + RelatedInstance []RelatedInstance `json:"related_instance"` + DiskEncryptionId string `json:"disk_encryption_id"` + EnterpriseProjectId string `json:"enterprise_project_id"` + TimeZone string `json:"time_zone"` +} + +type Nodes struct { + Id string `json:"id"` + Name string `json:"name"` + Role string `json:"role"` + Status string `json:"status"` + AvailabilityZone string `json:"availability_zone"` +} + +type RelatedInstance struct { + Id string `json:"id"` + Type string `json:"type"` +} + +type RdsPage struct { + pagination.SinglePageBase +} + +func (r RdsPage) IsEmpty() (bool, error) { + data, err := ExtractRdsInstances(r) + if err != nil { + return false, err + } + return len(data.Instances) == 0, err +} + +// ExtractCloudServers is a function that takes a ListResult and returns the services' information. +func ExtractRdsInstances(r pagination.Page) (ListRdsResponse, error) { + var s ListRdsResponse + err := (r.(RdsPage)).ExtractInto(&s) + return s, err +} + +type ErrorLogResult struct { + golangsdk.Result +} + +type ErrorLogResp struct { + ErrorLogList []Errorlog `json:"error_log_list"` + TotalRecord int `json:"total_record"` +} + +type Errorlog struct { + Time string `json:"time"` + Level string `json:"level"` + Content string `json:"content"` +} + +type ErrorLogPage struct { + pagination.SinglePageBase +} + +// IsEmpty returns true if a ListResult contains no services. +func (r ErrorLogPage) IsEmpty() (bool, error) { + data, err := ExtractErrorLog(r) + if err != nil { + return false, err + } + return len(data.ErrorLogList) == 0, err +} + +func ExtractErrorLog(r pagination.Page) (ErrorLogResp, error) { + var s ErrorLogResp + err := (r.(ErrorLogPage)).ExtractInto(&s) + return s, err +} + +type SlowLogResp struct { + Slowloglist []Slowloglist `json:"slow_log_list"` + TotalRecord int `json:"total_record"` +} + +type Slowloglist struct { + Count string `json:"count"` + Time string `json:"time"` + Locktime string `json:"lock_time"` + Rowssent string `json:"rows_sent"` + Rowsexamined string `json:"rows_examined"` + Database string `json:"database"` + Users string `json:"users"` + QuerySample string `json:"query_sample"` + Type string `json:"type"` +} + +type SlowLogPage struct { + pagination.SinglePageBase +} + +// IsEmpty returns true if a ListResult contains no services. +func (r SlowLogPage) IsEmpty() (bool, error) { + data, err := ExtractSlowLog(r) + if err != nil { + return false, err + } + return len(data.Slowloglist) == 0, err +} + +// ExtractCloudServers is a function that takes a ListResult and returns the services' information. +func ExtractSlowLog(r pagination.Page) (SlowLogResp, error) { + var s SlowLogResp + err := (r.(SlowLogPage)).ExtractInto(&s) + return s, err +} diff --git a/openstack/rds/v3/instances/urls.go b/openstack/rds/v3/instances/urls.go new file mode 100644 index 000000000..405ccf27d --- /dev/null +++ b/openstack/rds/v3/instances/urls.go @@ -0,0 +1,39 @@ +package instances + +import "github.com/huaweicloud/golangsdk" + +func createURL(c *golangsdk.ServiceClient) string { + return c.ServiceURL("instances") +} + +func deleteURL(c *golangsdk.ServiceClient, serverID string) string { + return c.ServiceURL("instances", serverID) +} + +func listURL(c *golangsdk.ServiceClient) string { + return c.ServiceURL("instances") +} + +func restartURL(c *golangsdk.ServiceClient, instancesId string) string { + return c.ServiceURL("instances", instancesId, "action") +} + +func singletohaURL(c *golangsdk.ServiceClient, instancesId string) string { + return c.ServiceURL("instances", instancesId, "action") +} + +func resizeURL(c *golangsdk.ServiceClient, instancesId string) string { + return c.ServiceURL("instances", instancesId, "action") +} + +func enlargeURL(c *golangsdk.ServiceClient, instancesId string) string { + return c.ServiceURL("instances", instancesId, "action") +} + +func listerrorlogURL(c *golangsdk.ServiceClient, instanceID string) string { + return c.ServiceURL("instances", instanceID, "errorlog") +} + +func listslowlogURL(c *golangsdk.ServiceClient, instanceID string) string { + return c.ServiceURL("instances", instanceID, "slowlog") +}