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

     1  package instances
     2  
     3  import (
     4  	"fmt"
     5  
     6  	"github.com/chnsz/golangsdk"
     7  	"github.com/chnsz/golangsdk/pagination"
     8  )
     9  
    10  type DataStoreOpt struct {
    11  	Type    string `json:"type" required:"true"`
    12  	Version string `json:"version,omitempty"`
    13  }
    14  
    15  type BackupStrategyOpt struct {
    16  	StartTime string `json:"start_time" required:"true"`
    17  	KeepDays  int    `json:"keep_days,omitempty"`
    18  }
    19  
    20  type HaOpt struct {
    21  	Mode            string `json:"mode" required:"true"`
    22  	ReplicationMode string `json:"replication_mode" required:"true"`
    23  	Consistency     string `json:"consistency,omitempty"`
    24  }
    25  
    26  type VolumeOpt struct {
    27  	Type string `json:"type" required:"true"`
    28  	Size int    `json:"size" required:"true"`
    29  }
    30  
    31  type RestorePointOpt struct {
    32  	InstanceId   string            `json:"instance_id" required:"true"`
    33  	Type         string            `json:"type" required:"true"`
    34  	BackupId     string            `json:"backup_id,omitempty"`
    35  	RestoreTime  int               `json:"restore_time,omitempty"`
    36  	DatabaseName map[string]string `json:"database_name,omitempty"`
    37  }
    38  
    39  type ChargeInfo struct {
    40  	ChargeMode  string `json:"charge_mode" required:"true"`
    41  	PeriodType  string `json:"period_type,omitempty"`
    42  	PeriodNum   int    `json:"period_num,omitempty"`
    43  	IsAutoRenew string `json:"is_auto_renew,omitempty"`
    44  	IsAutoPay   string `json:"is_auto_pay,omitempty"`
    45  }
    46  
    47  type CreateGaussDBOpts struct {
    48  	Ha             *HaOpt             `json:"ha,omitempty"`
    49  	BackupStrategy *BackupStrategyOpt `json:"backup_strategy,omitempty"`
    50  	ChargeInfo     *ChargeInfo        `json:"charge_info,omitempty"`
    51  	RestorePoint   *RestorePointOpt   `json:"restore_point,omitempty"`
    52  
    53  	AvailabilityZone    string       `json:"availability_zone" required:"true"`
    54  	DataStore           DataStoreOpt `json:"datastore" required:"true"`
    55  	Flavor              string       `json:"flavor_ref" required:"true"`
    56  	Name                string       `json:"name" required:"true"`
    57  	Password            string       `json:"password" required:"true"`
    58  	Volume              VolumeOpt    `json:"volume" required:"true"`
    59  	Region              string       `json:"region,omitempty"`
    60  	VpcId               string       `json:"vpc_id,omitempty"`
    61  	SubnetId            string       `json:"subnet_id,omitempty"`
    62  	SecurityGroupId     string       `json:"security_group_id,omitempty"`
    63  	Port                string       `json:"port,omitempty"`
    64  	DiskEncryptionId    string       `json:"disk_encryption_id,omitempty"`
    65  	TimeZone            string       `json:"time_zone,omitempty"`
    66  	ConfigurationId     string       `json:"configuration_id,omitempty"`
    67  	DsspoolId           string       `json:"dsspool_id,omitempty"`
    68  	ReplicaOfId         string       `json:"replica_of_id,omitempty"`
    69  	ShardingNum         int          `json:"sharding_num,omitempty"`
    70  	CoordinatorNum      int          `json:"coordinator_num,omitempty"`
    71  	EnterpriseProjectId string       `json:"enterprise_project_id,omitempty"`
    72  	ReplicaNum          int          `json:"replica_num,omitempty"`
    73  }
    74  
    75  type CreateGaussDBBuilder interface {
    76  	ToInstancesCreateMap() (map[string]interface{}, error)
    77  }
    78  
    79  func (opts CreateGaussDBOpts) ToInstancesCreateMap() (map[string]interface{}, error) {
    80  	b, err := golangsdk.BuildRequestBody(opts, "")
    81  	if err != nil {
    82  		return nil, err
    83  	}
    84  	return b, nil
    85  }
    86  
    87  func Create(client *golangsdk.ServiceClient, opts CreateGaussDBBuilder) (r CreateResult) {
    88  	b, err := opts.ToInstancesCreateMap()
    89  	if err != nil {
    90  		r.Err = err
    91  		return
    92  	}
    93  
    94  	_, r.Err = client.Post(createURL(client), b, &r.Body, &golangsdk.RequestOpts{
    95  		MoreHeaders: map[string]string{"Content-Type": "application/json", "X-Language": "en-us"},
    96  	})
    97  	return
    98  }
    99  
   100  type UpdateVolumeOptsBuilder interface {
   101  	ToVolumeUpdateMap() (map[string]interface{}, error)
   102  }
   103  
   104  type UpdateVolumeOpts struct {
   105  	Size int `json:"size" required:"true"`
   106  }
   107  
   108  func (opts UpdateVolumeOpts) ToVolumeUpdateMap() (map[string]interface{}, error) {
   109  	return golangsdk.BuildRequestBody(opts, "enlarge_volume")
   110  }
   111  
   112  func UpdateVolume(client *golangsdk.ServiceClient, opts UpdateVolumeOptsBuilder, id string) (r UpdateResult) {
   113  	b, err := opts.ToVolumeUpdateMap()
   114  	if err != nil {
   115  		r.Err = err
   116  		return
   117  	}
   118  
   119  	_, r.Err = client.Post(updateURL(client, id, "action"), b, &r.Body, &golangsdk.RequestOpts{
   120  		MoreHeaders: map[string]string{"Content-Type": "application/json", "X-Language": "en-us"},
   121  	})
   122  	return
   123  }
   124  
   125  type UpdateClusterOptsBuilder interface {
   126  	ToClusterUpdateMap() (map[string]interface{}, error)
   127  }
   128  
   129  type Shard struct {
   130  	Count int `json:"count" required:"true"`
   131  }
   132  
   133  type Coordinator struct {
   134  	AzCode string `json:"az_code" required:"true"`
   135  }
   136  
   137  type UpdateClusterOpts struct {
   138  	Shard        *Shard        `json:"shard,omitempty"`
   139  	Coordinators []Coordinator `json:"coordinators,omitempty"`
   140  }
   141  
   142  func (opts UpdateClusterOpts) ToClusterUpdateMap() (map[string]interface{}, error) {
   143  	return golangsdk.BuildRequestBody(opts, "expand_cluster")
   144  }
   145  
   146  func UpdateCluster(client *golangsdk.ServiceClient, opts UpdateClusterOptsBuilder, id string) (r UpdateResult) {
   147  	b, err := opts.ToClusterUpdateMap()
   148  	if err != nil {
   149  		r.Err = err
   150  		return
   151  	}
   152  
   153  	_, r.Err = client.Post(updateURL(client, id, "action"), b, &r.Body, &golangsdk.RequestOpts{
   154  		MoreHeaders: map[string]string{"Content-Type": "application/json", "X-Language": "en-us"},
   155  	})
   156  	return
   157  }
   158  
   159  // UpdateOpts is the structure that used to expand sharding number, coordinator number or volume size.
   160  type UpdateOpts struct {
   161  	// Configuration required to expand sharding number or coordinator number.
   162  	ExpandCluster *UpdateClusterOpts `json:"expand_cluster,omitempty"`
   163  	// Configuration required to expand volume size.
   164  	EnlargeVolume *UpdateVolumeOpts `json:"enlarge_volume,omitempty"`
   165  	// Whether to automatically pay from the account, defaults to false.
   166  	IsAutoPay string `json:"is_auto_pay,omitempty"`
   167  }
   168  
   169  // Update is a method to update sharding number, coordinator number and volume configuration.
   170  // Note: The sharding number and the coordinator number can be updated at the same time, but neither of them can be
   171  // updated at the same time as volume
   172  func Update(c *golangsdk.ServiceClient, instanceId string, opts UpdateOpts) (*UpdateResponse, error) {
   173  	b, err := golangsdk.BuildRequestBody(opts, "")
   174  	if err != nil {
   175  		return nil, err
   176  	}
   177  
   178  	var r UpdateResponse
   179  	_, err = c.Post(updateURL(c, instanceId, "action"), b, &r, &golangsdk.RequestOpts{
   180  		MoreHeaders: map[string]string{"Content-Type": "application/json", "X-Language": "en-us"},
   181  	})
   182  	return &r, err
   183  }
   184  
   185  func Delete(client *golangsdk.ServiceClient, instanceId string) (r DeleteResult) {
   186  	url := deleteURL(client, instanceId)
   187  
   188  	_, r.Err = client.Delete(url, &golangsdk.RequestOpts{
   189  		MoreHeaders: map[string]string{"Content-Type": "application/json", "X-Language": "en-us"},
   190  	})
   191  
   192  	return
   193  }
   194  
   195  type ListGaussDBInstanceOpts struct {
   196  	Id            string `q:"id"`
   197  	Name          string `q:"name"`
   198  	Type          string `q:"type"`
   199  	DataStoreType string `q:"datastore_type"`
   200  	VpcId         string `q:"vpc_id"`
   201  	SubnetId      string `q:"subnet_id"`
   202  	Offset        int    `q:"offset"`
   203  	Limit         int    `q:"limit"`
   204  }
   205  
   206  type ListGaussDBBuilder interface {
   207  	ToGaussDBListDetailQuery() (string, error)
   208  }
   209  
   210  func (opts ListGaussDBInstanceOpts) ToGaussDBListDetailQuery() (string, error) {
   211  	q, err := golangsdk.BuildQueryString(opts)
   212  	if err != nil {
   213  		return "", err
   214  	}
   215  	return q.String(), err
   216  }
   217  
   218  func List(client *golangsdk.ServiceClient, opts ListGaussDBBuilder) pagination.Pager {
   219  	url := listURL(client)
   220  	if opts != nil {
   221  		query, err := opts.ToGaussDBListDetailQuery()
   222  
   223  		if err != nil {
   224  			return pagination.Pager{Err: err}
   225  		}
   226  		url += query
   227  	}
   228  
   229  	pageList := pagination.NewPager(client, url, func(r pagination.PageResult) pagination.Page {
   230  		return GaussDBPage{pagination.SinglePageBase(r)}
   231  	})
   232  	// Headers supplies additional HTTP headers to populate on each paged request
   233  	pageList.Headers = map[string]string{"Content-Type": "application/json"}
   234  
   235  	return pageList
   236  }
   237  
   238  func GetInstanceByID(client *golangsdk.ServiceClient, instanceId string) (GaussDBInstance, error) {
   239  	var instance GaussDBInstance
   240  
   241  	opts := ListGaussDBInstanceOpts{
   242  		Id: instanceId,
   243  	}
   244  
   245  	pages, err := List(client, &opts).AllPages()
   246  	if err != nil {
   247  		return instance, err
   248  	}
   249  
   250  	all, err := ExtractGaussDBInstances(pages)
   251  	if err != nil {
   252  		return instance, err
   253  	}
   254  	if all.TotalCount < 1 {
   255  		return instance, golangsdk.ErrDefault404{
   256  			ErrUnexpectedResponseCode: golangsdk.ErrUnexpectedResponseCode{
   257  				Body: []byte(fmt.Sprintf("the database instance (%s) does not exist", instanceId)),
   258  			},
   259  		}
   260  	}
   261  
   262  	instance = all.Instances[0]
   263  	return instance, nil
   264  }
   265  
   266  func GetInstanceByName(client *golangsdk.ServiceClient, name string) (GaussDBInstance, error) {
   267  	var instance GaussDBInstance
   268  
   269  	opts := ListGaussDBInstanceOpts{
   270  		Name: name,
   271  	}
   272  
   273  	pages, err := List(client, &opts).AllPages()
   274  	if err != nil {
   275  		return instance, err
   276  	}
   277  
   278  	all, err := ExtractGaussDBInstances(pages)
   279  	if err != nil {
   280  		return instance, err
   281  	}
   282  	if all.TotalCount < 1 {
   283  		return instance, golangsdk.ErrDefault404{
   284  			ErrUnexpectedResponseCode: golangsdk.ErrUnexpectedResponseCode{
   285  				Body: []byte(fmt.Sprintf("the database instance (%s) does not exist", name)),
   286  			},
   287  		}
   288  	}
   289  
   290  	instance = all.Instances[0]
   291  	return instance, nil
   292  }
   293  
   294  type RenameOptsBuilder interface {
   295  	ToRenameMap() (map[string]interface{}, error)
   296  }
   297  
   298  type RenameOpts struct {
   299  	Name string `json:"name" required:"true"`
   300  }
   301  
   302  func (opts RenameOpts) ToRenameMap() (map[string]interface{}, error) {
   303  	return golangsdk.BuildRequestBody(opts, "")
   304  }
   305  
   306  func Rename(client *golangsdk.ServiceClient, opts RenameOptsBuilder, id string) (r RenameResult) {
   307  	b, err := opts.ToRenameMap()
   308  	if err != nil {
   309  		r.Err = err
   310  		return
   311  	}
   312  
   313  	_, r.Err = client.Put(updateURL(client, id, "name"), b, &r.Body, &golangsdk.RequestOpts{
   314  		MoreHeaders: map[string]string{"Content-Type": "application/json", "X-Language": "en-us"},
   315  	})
   316  	return
   317  }
   318  
   319  type RestorePasswordOptsBuilder interface {
   320  	ToRestorePasswordMap() (map[string]interface{}, error)
   321  }
   322  
   323  type RestorePasswordOpts struct {
   324  	Password string `json:"password" required:"true"`
   325  }
   326  
   327  func (opts RestorePasswordOpts) ToRestorePasswordMap() (map[string]interface{}, error) {
   328  	return golangsdk.BuildRequestBody(opts, "")
   329  }
   330  
   331  func RestorePassword(client *golangsdk.ServiceClient, opts RestorePasswordOptsBuilder, id string) (r golangsdk.Result) {
   332  	b, err := opts.ToRestorePasswordMap()
   333  	if err != nil {
   334  		r.Err = err
   335  		return
   336  	}
   337  
   338  	_, r.Err = client.Post(updateURL(client, id, "password"), b, nil, &golangsdk.RequestOpts{
   339  		MoreHeaders: map[string]string{"Content-Type": "application/json", "X-Language": "en-us"},
   340  	})
   341  	return
   342  }