github.com/chnsz/golangsdk@v0.0.0-20240506093406-85a3fbfa605b/openstack/bms/v1/baremetalservers/requests.go (about)

     1  package baremetalservers
     2  
     3  import (
     4  	"encoding/base64"
     5  
     6  	"github.com/chnsz/golangsdk"
     7  	"github.com/chnsz/golangsdk/openstack/common/tags"
     8  	"github.com/chnsz/golangsdk/pagination"
     9  )
    10  
    11  type CreateOpts struct {
    12  	ImageRef string `json:"imageRef" required:"true"`
    13  
    14  	FlavorRef string `json:"flavorRef" required:"true"`
    15  
    16  	Name string `json:"name" required:"true"`
    17  
    18  	MetaData MetaData `json:"metadata" required:"true"`
    19  
    20  	UserData []byte `json:"-"`
    21  
    22  	AdminPass string `json:"adminPass,omitempty"`
    23  
    24  	KeyName string `json:"key_name,omitempty"`
    25  
    26  	SecurityGroups []SecurityGroup `json:"security_groups,omitempty"`
    27  
    28  	Nics []Nic `json:"nics" required:"true"`
    29  
    30  	AvailabilityZone string `json:"availability_zone" required:"true"`
    31  
    32  	VpcId string `json:"vpcid" required:"true"`
    33  
    34  	PublicIp *PublicIp `json:"publicip,omitempty"`
    35  
    36  	Count int `json:"count,omitempty"`
    37  
    38  	RootVolume *RootVolume `json:"root_volume,omitempty"`
    39  
    40  	DataVolumes []DataVolume `json:"data_volumes,omitempty"`
    41  
    42  	ExtendParam ServerExtendParam `json:"extendparam" required:"true"`
    43  
    44  	SchedulerHints *SchedulerHints `json:"os:scheduler_hints,omitempty"`
    45  
    46  	ServerTags []tags.ResourceTag `json:"server_tags,omitempty"`
    47  }
    48  
    49  type MetaData struct {
    50  	OpSvcUserId string `json:"op_svc_userid" required:"true"`
    51  	BYOL        string `json:"BYOL,omitempty"`
    52  	AdminPass   string `json:"admin_pass,omitempty"`
    53  	AgencyName  string `json:"agency_name,omitempty"`
    54  }
    55  
    56  type SecurityGroup struct {
    57  	ID string `json:"id" required:"true"`
    58  }
    59  
    60  type Nic struct {
    61  	SubnetId  string `json:"subnet_id" required:"true"`
    62  	IpAddress string `json:"ip_address,omitempty"`
    63  }
    64  
    65  type DeleteNic struct {
    66  	ID string `json:"id" required:"true"`
    67  }
    68  
    69  type PublicIp struct {
    70  	Id  string `json:"id,omitempty"`
    71  	Eip *Eip   `json:"eip,omitempty"`
    72  }
    73  
    74  type RootVolume struct {
    75  	VolumeType  string `json:"volumetype,omitempty"`
    76  	Size        int    `json:"size,omitempty"`
    77  	ClusterID   string `json:"cluster_id,omitempty"`
    78  	ClusterType string `json:"cluster_type,omitempty"`
    79  }
    80  
    81  type DataVolume struct {
    82  	VolumeType  string `json:"volumetype" required:"true"`
    83  	Size        int    `json:"size" required:"true"`
    84  	Shareable   bool   `json:"shareable,omitempty"`
    85  	ClusterID   string `json:"cluster_id,omitempty"`
    86  	ClusterType string `json:"cluster_type,omitempty"`
    87  }
    88  
    89  type ServerExtendParam struct {
    90  	ChargingMode string `json:"chargingMode,omitempty"`
    91  
    92  	RegionID string `json:"regionID,omitempty"`
    93  
    94  	PeriodType string `json:"periodType,omitempty"`
    95  
    96  	PeriodNum int `json:"periodNum,omitempty"`
    97  
    98  	IsAutoRenew string `json:"isAutoRenew,omitempty"`
    99  
   100  	IsAutoPay string `json:"isAutoPay,omitempty"`
   101  
   102  	EnterpriseProjectId string `json:"enterprise_project_id,omitempty"`
   103  }
   104  
   105  type SchedulerHints struct {
   106  	DecBaremetal string `json:"dec_baremetal,omitempty"`
   107  }
   108  
   109  type Eip struct {
   110  	IpType      string         `json:"iptype" required:"true"`
   111  	BandWidth   BandWidth      `json:"bandwidth" required:"true"`
   112  	ExtendParam EipExtendParam `json:"extendparam" required:"true"`
   113  }
   114  
   115  type BandWidth struct {
   116  	Name       string `json:"name,omitempty"`
   117  	ShareType  string `json:"sharetype" required:"true"`
   118  	Id         string `json:"id,omitempty"`
   119  	Size       int    `json:"size" required:"true"`
   120  	ChargeMode string `json:"chargemode,omitempty"`
   121  }
   122  
   123  type EipExtendParam struct {
   124  	ChargingMode string `json:"chargingMode" required:"true"`
   125  }
   126  
   127  // CreateOptsBuilder allows extensions to add additional parameters to the
   128  // Create request.
   129  type CreateOptsBuilder interface {
   130  	ToServerCreateMap() (map[string]interface{}, error)
   131  }
   132  
   133  // ToServerCreateMap assembles a request body based on the contents of a
   134  // CreateOpts.
   135  func (opts CreateOpts) ToServerCreateMap() (map[string]interface{}, error) {
   136  	b, err := golangsdk.BuildRequestBody(opts, "")
   137  	if err != nil {
   138  		return nil, err
   139  	}
   140  
   141  	if opts.UserData != nil {
   142  		var userData string
   143  		if _, err := base64.StdEncoding.DecodeString(string(opts.UserData)); err != nil {
   144  			userData = base64.StdEncoding.EncodeToString(opts.UserData)
   145  		} else {
   146  			userData = string(opts.UserData)
   147  		}
   148  		b["user_data"] = &userData
   149  	}
   150  
   151  	return map[string]interface{}{"server": b}, nil
   152  }
   153  
   154  // CreatePrePaid requests a server to be provisioned to the user in the current tenant.
   155  func CreatePrePaid(client *golangsdk.ServiceClient, opts CreateOptsBuilder) (r OrderResult) {
   156  	reqBody, err := opts.ToServerCreateMap()
   157  	if err != nil {
   158  		r.Err = err
   159  		return
   160  	}
   161  
   162  	_, r.Err = client.Post(createURL(client), reqBody, &r.Body, &golangsdk.RequestOpts{OkCodes: []int{200}})
   163  	return
   164  }
   165  
   166  // Get retrieves a particular Server based on its unique ID.
   167  func Get(c *golangsdk.ServiceClient, id string) (r GetResult) {
   168  	_, r.Err = c.Get(getURL(c, id), &r.Body, &golangsdk.RequestOpts{
   169  		OkCodes: []int{200},
   170  	})
   171  	return
   172  }
   173  
   174  type UpdateOpts struct {
   175  	Name string `json:"name,omitempty"`
   176  }
   177  
   178  type ListOpts struct {
   179  	// Specifies the ID of the BMS flavor.
   180  	FlavorId string `q:"flavor"`
   181  	// Specifies the BMS name.
   182  	Name string `q:"name"`
   183  	// Specifies the BMS status.
   184  	// The value can be: ACTIVE, BUILD, ERROR, HARD_REBOOT, REBOOT or SHUTOFF.
   185  	Status string `q:"status"`
   186  	// Number of records to be queried.
   187  	// The valid value is range from 25 to 1000, defaults to 25.
   188  	Limit int `q:"limit"`
   189  	// Specifies the index position, which starts from the next data record specified by offset.
   190  	Offset int `q:"offset"`
   191  	// Specifies the BMS tag.
   192  	Tags string `q:"tags"`
   193  	// Specifies the reserved ID, which can be used to query BMSs created in a batch.
   194  	ReservationId string `q:"reservation_id"`
   195  	// Specifies the level for details about BMS query results.
   196  	// A higher level indicates more details about BMS query results.
   197  	// Available levels include 4, 3, 2, and 1. The default level is 4.
   198  	Detail string `q:"detail"`
   199  	// Specifies the enterprise project ID of the BMS instance.
   200  	EnterpriseProjectId string `q:"enterprise_project_id"`
   201  }
   202  
   203  // List is a method to query the list of BMS instances with **pagination**.
   204  func List(client *golangsdk.ServiceClient, opts ListOpts) ([]CloudServer, error) {
   205  	url := listURL(client)
   206  	query, err := golangsdk.BuildQueryString(opts)
   207  	if err != nil {
   208  		return nil, err
   209  	}
   210  	url += query.String()
   211  
   212  	pages, err := pagination.NewPager(client, url, func(r pagination.PageResult) pagination.Page {
   213  		p := InstanceDetailPage{pagination.OffsetPageBase{PageResult: r}}
   214  		return p
   215  	}).AllPages()
   216  	if err != nil {
   217  		return nil, err
   218  	}
   219  	return ExtractServers(pages)
   220  }
   221  
   222  type DeleteNicsOpts struct {
   223  	Nics []DeleteNic `json:"nics" required:"true"`
   224  }
   225  
   226  type AddNicsOpts struct {
   227  	Nics []Nic `json:"nics" required:"true"`
   228  }
   229  
   230  type UpdateOptsBuilder interface {
   231  	ToServerUpdateMap() (map[string]interface{}, error)
   232  }
   233  
   234  type DeleteNicsOptsBuilder interface {
   235  	ToServerDeleteNicsMap() (map[string]interface{}, error)
   236  }
   237  
   238  type AddNicsOptsBuilder interface {
   239  	ToServerAddNicsMap() (map[string]interface{}, error)
   240  }
   241  
   242  func (opts StopServerOps) ToServerStopServerMap() (map[string]interface{}, error) {
   243  	return golangsdk.BuildRequestBody(opts, "os-stop")
   244  }
   245  
   246  func (opts StartServerOps) ToServerStartServerMap() (map[string]interface{}, error) {
   247  	return golangsdk.BuildRequestBody(opts, "os-start")
   248  }
   249  
   250  func (opts RebootServerOps) ToServerRebootServerMap() (map[string]interface{}, error) {
   251  	return golangsdk.BuildRequestBody(opts, "reboot")
   252  }
   253  
   254  type StartServerOps struct {
   255  	Servers []Servers `json:"servers" required:"true"`
   256  }
   257  
   258  type StopServerOps struct {
   259  	// The value can be: HARD and SOFT. Only HARD takes effect.
   260  	Type    string    `json:"type" required:"true"`
   261  	Servers []Servers `json:"servers" required:"true"`
   262  }
   263  
   264  type RebootServerOps struct {
   265  	// The value can be: HARD and SOFT. Only HARD takes effect.
   266  	Type    string    `json:"type" required:"true"`
   267  	Servers []Servers `json:"servers" required:"true"`
   268  }
   269  
   270  type Servers struct {
   271  	ID string `json:"id" required:"true"`
   272  }
   273  
   274  type RebootServerOpsBuilder interface {
   275  	ToServerRebootServerMap() (map[string]interface{}, error)
   276  }
   277  
   278  type StartServerOpsBuilder interface {
   279  	ToServerStartServerMap() (map[string]interface{}, error)
   280  }
   281  
   282  type StopServerOpsBuilder interface {
   283  	ToServerStopServerMap() (map[string]interface{}, error)
   284  }
   285  
   286  func (opts UpdateOpts) ToServerUpdateMap() (map[string]interface{}, error) {
   287  	b, err := golangsdk.BuildRequestBody(opts, "")
   288  	if err != nil {
   289  		return nil, err
   290  	}
   291  
   292  	return map[string]interface{}{"server": b}, nil
   293  }
   294  
   295  func Update(client *golangsdk.ServiceClient, id string, ops UpdateOptsBuilder) (r UpdateResult) {
   296  	b, err := ops.ToServerUpdateMap()
   297  	if err != nil {
   298  		r.Err = err
   299  		return
   300  	}
   301  
   302  	_, r.Err = client.Put(putURL(client, id), b, nil, &golangsdk.RequestOpts{
   303  		OkCodes: []int{200},
   304  	})
   305  	return
   306  }
   307  
   308  // UpdateMetadata updates (or creates) all the metadata specified by opts for
   309  // the given server ID. This operation does not affect already-existing metadata
   310  // that is not specified by opts.
   311  func UpdateMetadata(client *golangsdk.ServiceClient, id string, opts map[string]interface{}) (r UpdateMetadataResult) {
   312  	b := map[string]interface{}{"metadata": opts}
   313  	_, r.Err = client.Post(metadataURL(client, id), b, &r.Body, nil)
   314  	return
   315  }
   316  
   317  func (opts DeleteNicsOpts) ToServerDeleteNicsMap() (map[string]interface{}, error) {
   318  	return golangsdk.BuildRequestBody(opts, "")
   319  }
   320  
   321  func (opts AddNicsOpts) ToServerAddNicsMap() (map[string]interface{}, error) {
   322  	return golangsdk.BuildRequestBody(opts, "")
   323  }
   324  
   325  func DeleteNics(client *golangsdk.ServiceClient, id string, ops DeleteNicsOptsBuilder) (r JobResult) {
   326  	reqBody, err := ops.ToServerDeleteNicsMap()
   327  	if err != nil {
   328  		r.Err = err
   329  		return
   330  	}
   331  
   332  	_, r.Err = client.Post(deleteNicsURL(client, id), reqBody, &r.Body, nil)
   333  	return
   334  }
   335  
   336  func AddNics(client *golangsdk.ServiceClient, id string, ops AddNicsOptsBuilder) (r JobResult) {
   337  	reqBody, err := ops.ToServerAddNicsMap()
   338  	if err != nil {
   339  		r.Err = err
   340  		return
   341  	}
   342  
   343  	_, r.Err = client.Post(addNicsURL(client, id), reqBody, &r.Body, nil)
   344  	return
   345  }
   346  
   347  func GetJobDetail(client *golangsdk.ServiceClient, jobID string) (r JobResult) {
   348  	_, r.Err = client.Get(jobURL(client, jobID), &r.Body, nil)
   349  	return
   350  }
   351  
   352  func RebootServer(client *golangsdk.ServiceClient, ops RebootServerOpsBuilder) (r JobResult) {
   353  	reqBody, err := ops.ToServerRebootServerMap()
   354  	if err != nil {
   355  		r.Err = err
   356  		return
   357  	}
   358  
   359  	_, r.Err = client.Post(serverStatusPostURL(client), reqBody, &r.Body, nil)
   360  	return
   361  }
   362  
   363  func StartServer(client *golangsdk.ServiceClient, ops StartServerOpsBuilder) (r JobResult) {
   364  	reqBody, err := ops.ToServerStartServerMap()
   365  	if err != nil {
   366  		r.Err = err
   367  		return
   368  	}
   369  
   370  	_, r.Err = client.Post(serverStatusPostURL(client), reqBody, &r.Body, nil)
   371  	return
   372  }
   373  
   374  func StopServer(client *golangsdk.ServiceClient, ops StopServerOpsBuilder) (r JobResult) {
   375  	reqBody, err := ops.ToServerStopServerMap()
   376  	if err != nil {
   377  		r.Err = err
   378  		return
   379  	}
   380  
   381  	_, r.Err = client.Post(serverStatusPostURL(client), reqBody, &r.Body, nil)
   382  	return
   383  }