diff --git a/openstack/client.go b/openstack/client.go index 8d7ce6a33..93b4e8aa8 100644 --- a/openstack/client.go +++ b/openstack/client.go @@ -1005,3 +1005,9 @@ func NewCESV1(client *golangsdk.ProviderClient, eo golangsdk.EndpointOpts) (*gol sc, err := initClientOpts(client, eo, "cesv1") return sc, err } + +// NewDDSV3 creates a ServiceClient that may be used to access the DDS service. +func NewDDSV3(client *golangsdk.ProviderClient, eo golangsdk.EndpointOpts) (*golangsdk.ServiceClient, error) { + sc, err := initClientOpts(client, eo, "ddsv3") + return sc, err +} diff --git a/openstack/dds/v3/instances/requests.go b/openstack/dds/v3/instances/requests.go new file mode 100644 index 000000000..f97bac536 --- /dev/null +++ b/openstack/dds/v3/instances/requests.go @@ -0,0 +1,130 @@ +package instances + +import ( + "github.com/huaweicloud/golangsdk" + "github.com/huaweicloud/golangsdk/pagination" +) + +type CreateOpts struct { + Name string `json:"name" required:"true"` + DataStore DataStore `json:"datastore" 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"` + Password string `json:"password" required:"true"` + DiskEncryptionId string `json:"disk_encryption_id,omitempty"` + Mode string `json:"mode" required:"true"` + Flavor []Flavor `json:"flavor" required:"true"` + BackupStrategy BackupStrategy `json:"backup_strategy,omitempty"` +} + +type DataStore struct { + Type string `json:"type" required:"true"` + Version string `json:"version" required:"true"` + StorageEngine string `json:"storage_engine" required:"true"` +} + +type Flavor struct { + Type string `json:"type" required:"true"` + Num int `json:"num" required:"true"` + Storage string `json:"storage,omitempty"` + Size int `json:"size,omitempty"` + SpecCode string `json:"spec_code" required:"true"` +} + +type BackupStrategy struct { + StartTime string `json:"start_time" required:"true"` + KeepDays int `json:"keep_days,omitempty"` +} + +type CreateInstanceBuilder interface { + ToInstancesCreateMap() (map[string]interface{}, error) +} + +func (opts CreateOpts) 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 CreateInstanceBuilder) (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 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 DeleteInstanceResult) { + + url := deleteURL(client, instanceId) + + _, r.Err = client.Delete(url, &golangsdk.RequestOpts{JSONResponse: &r.Body, MoreHeaders: map[string]string{"Content-Type": "application/json"}}) + return +} + +type ListInstanceOpts struct { + Id string `q:"id"` + Name string `q:"name"` + Mode string `q:"mode"` + DataStoreType string `q:"datastore_type"` + VpcId string `q:"vpc_id"` + SubnetId string `q:"subnet_id"` + Offset int `q:"offset"` + Limit int `q:"limit"` +} + +type ListInstanceBuilder interface { + ToInstanceListDetailQuery() (string, error) +} + +func (opts ListInstanceOpts) ToInstanceListDetailQuery() (string, error) { + q, err := golangsdk.BuildQueryString(opts) + if err != nil { + return "", err + } + return q.String(), err +} + +func List(client *golangsdk.ServiceClient, opts ListInstanceBuilder) pagination.Pager { + url := listURL(client) + if opts != nil { + query, err := opts.ToInstanceListDetailQuery() + + if err != nil { + return pagination.Pager{Err: err} + } + url += query + } + + pageList := pagination.NewPager(client, url, func(r pagination.PageResult) pagination.Page { + return InstancePage{pagination.SinglePageBase(r)} + }) + + return pageList +} diff --git a/openstack/dds/v3/instances/results.go b/openstack/dds/v3/instances/results.go new file mode 100644 index 000000000..1acd874e9 --- /dev/null +++ b/openstack/dds/v3/instances/results.go @@ -0,0 +1,125 @@ +package instances + +import ( + "github.com/huaweicloud/golangsdk" + "github.com/huaweicloud/golangsdk/pagination" +) + +type commonResult struct { + golangsdk.Result +} + +type CreateResult struct { + commonResult +} + +type Instance struct { + Id string `json:"id"` + Name string `json:"name"` + DataStore DataStore `json:"datastore"` + Status string `json:"status"` + 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"` + DiskEncryptionId string `json:"disk_encryption_id"` + Mode string `json:"mode"` + Flavor []Flavor `json:"flavor"` + BackupStrategy BackupStrategy `json:"backup_strategy"` +} + +func (r CreateResult) Extract() (*Instance, error) { + var response Instance + err := r.ExtractInto(&response) + return &response, err +} + +type DeleteInstanceResult struct { + commonResult +} + +type DeleteInstanceResponse struct { + JobId string `json:"job_id"` +} + +func (r DeleteInstanceResult) Extract() (*DeleteInstanceResponse, error) { + var response DeleteInstanceResponse + err := r.ExtractInto(&response) + return &response, err +} + +type ListInstanceResult struct { + commonResult +} + +type ListInstanceResponse struct { + Instances []InstanceResponse `json:"instances"` + TotalCount int `json:"total_count"` +} + +type InstanceResponse struct { + Id string `json:"id"` + Name string `json:"name"` + Status string `json:"status"` + Port int `json:"port"` + Mode string `json:"mode"` + Region string `json:"region"` + DataStore DataStore `json:"datastore"` + Engine string `json:"engine"` + Created string `json:"created"` + Updated string `json:"updated"` + DbUserName string `json:"db_user_name"` + Ssl int `json:"ssl"` + VpcId string `json:"vpc_id"` + SubnetId string `json:"subnet_id"` + SecurityGroupId string `json:"security_group_id"` + BackupStrategy BackupStrategy `json:"backup_strategy"` + MaintenanceWindow string `json:"maintenance_window"` + Groups []Group `json:"groups"` + DiskEncryptionId string `json:"disk_encryption_id"` + TimeZone string `json:"time_zone"` +} + +type Group struct { + Type string `json:"type"` + Id string `json:"id"` + Name string `json:"name"` + Status string `json:"status"` + Volume Volume `json:"volume"` + Nodes Nodes `json:"nodes"` +} + +type Volume struct { + Size string `json:"size"` + Used string `json:"used"` +} + +type Nodes struct { + Id string `json:"id"` + Name string `json:"name"` + Status string `json:"status"` + Role string `json:"role"` + PrivateIP string `json:"private_ip"` + PublicIP string `json:"public_ip"` + SpecCode string `json:"spec_code"` + AvailabilityZone string `json:"availability_zone"` +} + +type InstancePage struct { + pagination.SinglePageBase +} + +func (r InstancePage) IsEmpty() (bool, error) { + data, err := ExtractInstances(r) + if err != nil { + return false, err + } + return len(data.Instances) == 0, err +} + +func ExtractInstances(r pagination.Page) (ListInstanceResponse, error) { + var s ListInstanceResponse + err := (r.(InstancePage)).ExtractInto(&s) + return s, err +} diff --git a/openstack/dds/v3/instances/urls.go b/openstack/dds/v3/instances/urls.go new file mode 100644 index 000000000..36465dc90 --- /dev/null +++ b/openstack/dds/v3/instances/urls.go @@ -0,0 +1,15 @@ +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") +}