Skip to content
This repository was archived by the owner on Aug 31, 2021. It is now read-only.
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 6 additions & 0 deletions openstack/client.go
Original file line number Diff line number Diff line change
Expand Up @@ -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
}
130 changes: 130 additions & 0 deletions openstack/dds/v3/instances/requests.go
Original file line number Diff line number Diff line change
@@ -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
}
125 changes: 125 additions & 0 deletions openstack/dds/v3/instances/results.go
Original file line number Diff line number Diff line change
@@ -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
}
15 changes: 15 additions & 0 deletions openstack/dds/v3/instances/urls.go
Original file line number Diff line number Diff line change
@@ -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")
}