github.com/chnsz/golangsdk@v0.0.0-20240506093406-85a3fbfa605b/openstack/dds/v3/instances/requests.go (about)

     1  package instances
     2  
     3  import (
     4  	"net/http"
     5  
     6  	"github.com/chnsz/golangsdk"
     7  	"github.com/chnsz/golangsdk/pagination"
     8  )
     9  
    10  type CreateOpts struct {
    11  	Name                string          `json:"name"  required:"true"`
    12  	DataStore           DataStore       `json:"datastore" required:"true"`
    13  	Region              string          `json:"region" required:"true"`
    14  	AvailabilityZone    string          `json:"availability_zone" required:"true"`
    15  	VpcId               string          `json:"vpc_id" required:"true"`
    16  	SubnetId            string          `json:"subnet_id" required:"true"`
    17  	SecurityGroupId     string          `json:"security_group_id" required:"true"`
    18  	Password            string          `json:"password,omitempty"`
    19  	Port                string          `json:"port,omitempty"`
    20  	DiskEncryptionId    string          `json:"disk_encryption_id,omitempty"`
    21  	Ssl                 string          `json:"ssl_option,omitempty"`
    22  	Mode                string          `json:"mode" required:"true"`
    23  	Configuration       []Configuration `json:"configurations,omitempty"`
    24  	Flavor              []Flavor        `json:"flavor" required:"true"`
    25  	BackupStrategy      BackupStrategy  `json:"backup_strategy,omitempty"`
    26  	EnterpriseProjectID string          `json:"enterprise_project_id,omitempty"`
    27  	ChargeInfo          *ChargeInfo     `json:"charge_info,omitempty"`
    28  }
    29  
    30  type DataStore struct {
    31  	Type          string `json:"type" required:"true"`
    32  	Version       string `json:"version" required:"true"`
    33  	StorageEngine string `json:"storage_engine" required:"true"`
    34  }
    35  
    36  type Configuration struct {
    37  	Type string `json:"type" required:"true"`
    38  	Id   string `json:"configuration_id" required:"true"`
    39  }
    40  
    41  type Flavor struct {
    42  	Type     string `json:"type" required:"true"`
    43  	Num      int    `json:"num" required:"true"`
    44  	Storage  string `json:"storage,omitempty"`
    45  	Size     int    `json:"size,omitempty"`
    46  	SpecCode string `json:"spec_code" required:"true"`
    47  }
    48  
    49  type BackupStrategy struct {
    50  	StartTime string `json:"start_time" required:"true"`
    51  	KeepDays  *int   `json:"keep_days,omitempty"`
    52  	Period    string `json:"period,omitempty"`
    53  }
    54  
    55  type BackupPolicyOpts struct {
    56  	BackupPolicy BackupStrategy `json:"backup_policy" required:"true"`
    57  }
    58  
    59  type ChargeInfo struct {
    60  	ChargeMode  string `json:"charge_mode" required:"true"`
    61  	PeriodType  string `json:"period_type,omitempty"`
    62  	PeriodNum   int    `json:"period_num,omitempty"`
    63  	IsAutoRenew bool   `json:"is_auto_renew,omitempty"`
    64  	IsAutoPay   bool   `json:"is_auto_pay,omitempty"`
    65  }
    66  
    67  type CreateInstanceBuilder interface {
    68  	ToInstancesCreateMap() (map[string]interface{}, error)
    69  }
    70  
    71  func (opts CreateOpts) ToInstancesCreateMap() (map[string]interface{}, error) {
    72  	b, err := golangsdk.BuildRequestBody(opts, "")
    73  	if err != nil {
    74  		return nil, err
    75  	}
    76  	return b, nil
    77  }
    78  
    79  func Create(client *golangsdk.ServiceClient, opts CreateInstanceBuilder) (r CreateResult) {
    80  	b, err := opts.ToInstancesCreateMap()
    81  	if err != nil {
    82  		r.Err = err
    83  		return
    84  	}
    85  
    86  	_, r.Err = client.Post(createURL(client), b, &r.Body, &golangsdk.RequestOpts{
    87  		OkCodes: []int{202},
    88  	})
    89  	return
    90  }
    91  
    92  type DeleteInstance struct {
    93  	InstanceId string `json:"instance_id" required:"true"`
    94  }
    95  
    96  type DeleteInstanceBuilder interface {
    97  	ToInstancesDeleteMap() (map[string]interface{}, error)
    98  }
    99  
   100  func (opts DeleteInstance) ToInstancesDeleteMap() (map[string]interface{}, error) {
   101  	b, err := golangsdk.BuildRequestBody(&opts, "")
   102  	if err != nil {
   103  		return nil, err
   104  	}
   105  	return b, nil
   106  }
   107  
   108  func Delete(client *golangsdk.ServiceClient, instanceId string) (r DeleteInstanceResult) {
   109  
   110  	url := deleteURL(client, instanceId)
   111  
   112  	_, r.Err = client.Delete(url, &golangsdk.RequestOpts{JSONResponse: &r.Body, MoreHeaders: map[string]string{"Content-Type": "application/json"}})
   113  	return
   114  }
   115  
   116  type ListInstanceOpts struct {
   117  	Id            string `q:"id"`
   118  	Name          string `q:"name"`
   119  	Mode          string `q:"mode"`
   120  	DataStoreType string `q:"datastore_type"`
   121  	VpcId         string `q:"vpc_id"`
   122  	SubnetId      string `q:"subnet_id"`
   123  	Offset        int    `q:"offset"`
   124  	Limit         int    `q:"limit"`
   125  }
   126  
   127  type ListInstanceBuilder interface {
   128  	ToInstanceListDetailQuery() (string, error)
   129  }
   130  
   131  func (opts ListInstanceOpts) ToInstanceListDetailQuery() (string, error) {
   132  	q, err := golangsdk.BuildQueryString(opts)
   133  	if err != nil {
   134  		return "", err
   135  	}
   136  	return q.String(), err
   137  }
   138  
   139  func List(client *golangsdk.ServiceClient, opts ListInstanceBuilder) pagination.Pager {
   140  	url := listURL(client)
   141  	if opts != nil {
   142  		query, err := opts.ToInstanceListDetailQuery()
   143  
   144  		if err != nil {
   145  			return pagination.Pager{Err: err}
   146  		}
   147  		url += query
   148  	}
   149  
   150  	pageList := pagination.NewPager(client, url, func(r pagination.PageResult) pagination.Page {
   151  		return InstancePage{pagination.SinglePageBase(r)}
   152  	})
   153  
   154  	return pageList
   155  }
   156  
   157  // UpdateOpt defines the basic information for update APIs
   158  // URI: <Method> base_url/<Action>
   159  // Request body: {<Param>: <Value>}
   160  // the supported value for Method including: "post" and "put"
   161  type UpdateOpt struct {
   162  	Param  string
   163  	Value  interface{}
   164  	Action string
   165  	Method string
   166  }
   167  
   168  type UpdateVolumeOpts struct {
   169  	Volume    VolumeOpts `json:"volume" required:"true"`
   170  	IsAutoPay bool       `json:"is_auto_pay,omitempty"`
   171  }
   172  
   173  type VolumeOpts struct {
   174  	GroupID string `json:"group_id,omitempty"`
   175  	Size    *int   `json:"size,omitempty"`
   176  }
   177  
   178  type UpdateNodeNumOpts struct {
   179  	Type      string      `json:"type" required:"true"`
   180  	SpecCode  string      `json:"spec_code" required:"true"`
   181  	Num       int         `json:"num" required:"true"`
   182  	Volume    *VolumeOpts `json:"volume,omitempty"`
   183  	IsAutoPay bool        `json:"is_auto_pay,omitempty"`
   184  }
   185  
   186  type SpecOpts struct {
   187  	TargetType     string `json:"target_type,omitempty"`
   188  	TargetID       string `json:"target_id" required:"true"`
   189  	TargetSpecCode string `json:"target_spec_code" required:"true"`
   190  }
   191  
   192  type UpdateSpecOpts struct {
   193  	Resize    SpecOpts `json:"resize" required:"true"`
   194  	IsAutoPay bool     `json:"is_auto_pay,omitempty"`
   195  }
   196  
   197  func Update(client *golangsdk.ServiceClient, instanceId string, opts []UpdateOpt) (r UpdateInstanceResult) {
   198  	for _, optRaw := range opts {
   199  		url := modifyURL(client, instanceId, optRaw.Action)
   200  		var body interface{}
   201  		if optRaw.Param != "" {
   202  			body = map[string]interface{}{
   203  				optRaw.Param: optRaw.Value,
   204  			}
   205  		} else {
   206  			body = optRaw.Value
   207  		}
   208  
   209  		var httpMethod func(string, interface{}, interface{}, *golangsdk.RequestOpts) (*http.Response, error)
   210  		if optRaw.Method == "post" {
   211  			httpMethod = client.Post
   212  		} else {
   213  			httpMethod = client.Put
   214  		}
   215  
   216  		_, r.Err = httpMethod(url, body, &r.Body, &golangsdk.RequestOpts{
   217  			OkCodes: []int{200, 202},
   218  		})
   219  
   220  		if r.Err != nil {
   221  			break
   222  		}
   223  	}
   224  	return
   225  }
   226  
   227  var requestOpts golangsdk.RequestOpts = golangsdk.RequestOpts{
   228  	MoreHeaders: map[string]string{"Content-Type": "application/json", "X-Language": "en-us"},
   229  }
   230  
   231  // PortOpts is the structure required by the UpdatePort method to modify the database access port.
   232  type PortOpts struct {
   233  	Port int `json:"port"`
   234  }
   235  
   236  type EnabledOpts struct {
   237  	Enabled *bool `json:"enabled" required:"true"`
   238  }
   239  
   240  // UpdatePort is a method to update the database access port using given parameters.
   241  func UpdatePort(c *golangsdk.ServiceClient, instanceId string, port int) (*PortUpdateResp, error) {
   242  	opts := PortOpts{
   243  		Port: port,
   244  	}
   245  	b, err := golangsdk.BuildRequestBody(opts, "")
   246  	if err != nil {
   247  		return nil, err
   248  	}
   249  
   250  	var r PortUpdateResp
   251  	_, err = c.Post(portModifiedURL(c, instanceId), b, &r, &golangsdk.RequestOpts{
   252  		MoreHeaders: requestOpts.MoreHeaders,
   253  	})
   254  	return &r, err
   255  }
   256  
   257  // UpdateSecondsLevelMonitoring is a method to update seconds level monitoring.
   258  func UpdateSecondsLevelMonitoring(c *golangsdk.ServiceClient, instanceId string, enabled bool) (*EnabledOpts, error) {
   259  	opts := EnabledOpts{
   260  		Enabled: &enabled,
   261  	}
   262  	b, err := golangsdk.BuildRequestBody(opts, "")
   263  	if err != nil {
   264  		return nil, err
   265  	}
   266  
   267  	var r EnabledOpts
   268  	_, err = c.Put(secondsLevelMonitoringURL(c, instanceId), b, &r, &golangsdk.RequestOpts{
   269  		MoreHeaders: requestOpts.MoreHeaders,
   270  		OkCodes: []int{
   271  			204,
   272  		},
   273  	})
   274  	return &r, err
   275  }
   276  
   277  // GetSecondsLevelMonitoring is a method to get seconds level monitoring.
   278  func GetSecondsLevelMonitoring(c *golangsdk.ServiceClient, instanceId string) (*EnabledOpts, error) {
   279  	var r EnabledOpts
   280  	_, err := c.Get(secondsLevelMonitoringURL(c, instanceId), &r, &golangsdk.RequestOpts{
   281  		MoreHeaders: requestOpts.MoreHeaders,
   282  	})
   283  	return &r, err
   284  }
   285  
   286  // GetReplicaSetName is a method to get the replica set name.
   287  func GetReplicaSetName(c *golangsdk.ServiceClient, instanceId string) (*ReplicaSetNameOpts, error) {
   288  	var r ReplicaSetNameOpts
   289  	_, err := c.Get(replicaSetNameURL(c, instanceId), &r, &golangsdk.RequestOpts{
   290  		MoreHeaders: requestOpts.MoreHeaders,
   291  	})
   292  	return &r, err
   293  }
   294  
   295  // CreateBackupPolicy is a method to create the backup policy.
   296  func CreateBackupPolicy(c *golangsdk.ServiceClient, instanceId string, backPolicy BackupStrategy) (*BackupPolicyResp, error) {
   297  	opts := BackupPolicyOpts{
   298  		BackupPolicy: backPolicy,
   299  	}
   300  	b, err := golangsdk.BuildRequestBody(opts, "")
   301  	if err != nil {
   302  		return nil, err
   303  	}
   304  
   305  	var r BackupPolicyResp
   306  	_, err = c.Put(backupPolicyURL(c, instanceId), b, &r, &golangsdk.RequestOpts{
   307  		MoreHeaders: requestOpts.MoreHeaders,
   308  	})
   309  	return &r, err
   310  }
   311  
   312  // GetBackupPolicy is a method to get the backup policy.
   313  func GetBackupPolicy(c *golangsdk.ServiceClient, instanceId string) (*BackupPolicyResp, error) {
   314  	var r BackupPolicyResp
   315  	_, err := c.Get(backupPolicyURL(c, instanceId), &r, &golangsdk.RequestOpts{
   316  		MoreHeaders: requestOpts.MoreHeaders,
   317  	})
   318  	return &r, err
   319  }
   320  
   321  type ReplicaSetNameOpts struct {
   322  	Name string `json:"name" required:"true"`
   323  }
   324  
   325  type RestartOpts struct {
   326  	TargetType string `json:"target_type,omitempty"`
   327  	TargetId   string `json:"target_id" required:"true"`
   328  }
   329  
   330  type AvailabilityZoneOpts struct {
   331  	TargetAzs string `json:"target_azs" required:"true"`
   332  }
   333  
   334  type RemarkOpts struct {
   335  	Remark string `json:"remark"`
   336  }
   337  
   338  // UpdateReplicaSetName is a method to update the replica set name.
   339  func UpdateReplicaSetName(c *golangsdk.ServiceClient, instanceId string, opts ReplicaSetNameOpts) (*CommonResp, error) {
   340  	b, err := golangsdk.BuildRequestBody(opts, "")
   341  	if err != nil {
   342  		return nil, err
   343  	}
   344  
   345  	var r CommonResp
   346  	_, err = c.Put(replicaSetNameURL(c, instanceId), b, &r, &golangsdk.RequestOpts{
   347  		MoreHeaders: requestOpts.MoreHeaders,
   348  	})
   349  	return &r, err
   350  }
   351  
   352  // UpdateAvailabilityZone is a method to update the AvailabilityZone.
   353  func UpdateAvailabilityZone(c *golangsdk.ServiceClient, instanceId string, opts AvailabilityZoneOpts) (*AvailabilityZoneResp, error) {
   354  	b, err := golangsdk.BuildRequestBody(opts, "")
   355  	if err != nil {
   356  		return nil, err
   357  	}
   358  
   359  	var r AvailabilityZoneResp
   360  	_, err = c.Post(availabilityZoneURL(c, instanceId), b, &r, &golangsdk.RequestOpts{
   361  		MoreHeaders: requestOpts.MoreHeaders,
   362  	})
   363  	return &r, err
   364  }
   365  
   366  // UpdateRemark is a method to update the description.
   367  func UpdateRemark(c *golangsdk.ServiceClient, instanceId string, opts RemarkOpts) error {
   368  	b, err := golangsdk.BuildRequestBody(opts, "")
   369  	if err != nil {
   370  		return err
   371  	}
   372  
   373  	_, err = c.Put(remarkURL(c, instanceId), b, nil, &golangsdk.RequestOpts{
   374  		MoreHeaders: requestOpts.MoreHeaders,
   375  	})
   376  	return err
   377  }
   378  
   379  // UpdateSlowLogStatus is a method to update the slow log status.
   380  func UpdateSlowLogStatus(c *golangsdk.ServiceClient, instanceId string, slowLogStatus string) error {
   381  	_, err := c.Put(slowLogStatusURL(c, instanceId, slowLogStatus), nil, nil, &golangsdk.RequestOpts{
   382  		MoreHeaders: requestOpts.MoreHeaders,
   383  	})
   384  	return err
   385  }
   386  
   387  // GetSlowLogStatus is a method to get the slow log status.
   388  func GetSlowLogStatus(c *golangsdk.ServiceClient, instanceId string) (*SlowLogStatusResp, error) {
   389  	var r SlowLogStatusResp
   390  	_, err := c.Get(slowLogStatusURL(c, instanceId, "status"), &r, &golangsdk.RequestOpts{
   391  		MoreHeaders: requestOpts.MoreHeaders,
   392  	})
   393  	return &r, err
   394  }
   395  
   396  func RestartInstance(c *golangsdk.ServiceClient, instanceId string, opts RestartOpts) (*CommonResp, error) {
   397  	b, err := golangsdk.BuildRequestBody(opts, "")
   398  	if err != nil {
   399  		return nil, err
   400  	}
   401  
   402  	var r CommonResp
   403  	_, err = c.Post(restartURL(c, instanceId), b, &r, &golangsdk.RequestOpts{
   404  		MoreHeaders: requestOpts.MoreHeaders,
   405  	})
   406  	return &r, err
   407  }