1// This file was automatically generated. DO NOT EDIT.
2// If you have any remark or suggestion do not hesitate to open an issue.
3
4// Package applesilicon provides methods and message types of the applesilicon v1alpha1 API.
5package applesilicon
6
7import (
8	"bytes"
9	"encoding/json"
10	"fmt"
11	"net"
12	"net/http"
13	"net/url"
14	"strings"
15	"time"
16
17	"github.com/scaleway/scaleway-sdk-go/internal/errors"
18	"github.com/scaleway/scaleway-sdk-go/internal/marshaler"
19	"github.com/scaleway/scaleway-sdk-go/internal/parameter"
20	"github.com/scaleway/scaleway-sdk-go/namegenerator"
21	"github.com/scaleway/scaleway-sdk-go/scw"
22)
23
24// always import dependencies
25var (
26	_ fmt.Stringer
27	_ json.Unmarshaler
28	_ url.URL
29	_ net.IP
30	_ http.Header
31	_ bytes.Reader
32	_ time.Time
33	_ = strings.Join
34
35	_ scw.ScalewayRequest
36	_ marshaler.Duration
37	_ scw.File
38	_ = parameter.AddToQuery
39	_ = namegenerator.GetRandomName
40)
41
42// API: apple Mac mini M1 as a service
43//
44// Scaleway Apple silicon M1 as-a-Service is built using the latest generation of Apple Mac mini hardware (fifth generation).
45//
46// These dedicated Mac mini M1s are designed for developing, building, testing, and signing applications for Apple devices, including iPhones, iPads, Mac computers and much more.
47//
48// Get set to explore, learn and build on a dedicated Mac mini M1 with more performance and speed than you ever thought possible.
49//
50// **Apple silicon as a Service comes with a minimum allocation period of 24 hours**.
51//
52// Mac mini and macOS are trademarks of Apple Inc., registered in the U.S. and other countries and regions.
53// IOS is a trademark or registered trademark of Cisco in the U.S. and other countries and is used by Apple under license.
54// Scaleway is not affiliated with Apple Inc.
55//
56type API struct {
57	client *scw.Client
58}
59
60// NewAPI returns a API object from a Scaleway client.
61func NewAPI(client *scw.Client) *API {
62	return &API{
63		client: client,
64	}
65}
66
67type ListServersRequestOrderBy string
68
69const (
70	// ListServersRequestOrderByCreatedAtAsc is [insert doc].
71	ListServersRequestOrderByCreatedAtAsc = ListServersRequestOrderBy("created_at_asc")
72	// ListServersRequestOrderByCreatedAtDesc is [insert doc].
73	ListServersRequestOrderByCreatedAtDesc = ListServersRequestOrderBy("created_at_desc")
74)
75
76func (enum ListServersRequestOrderBy) String() string {
77	if enum == "" {
78		// return default value if empty
79		return "created_at_asc"
80	}
81	return string(enum)
82}
83
84func (enum ListServersRequestOrderBy) MarshalJSON() ([]byte, error) {
85	return []byte(fmt.Sprintf(`"%s"`, enum)), nil
86}
87
88func (enum *ListServersRequestOrderBy) UnmarshalJSON(data []byte) error {
89	tmp := ""
90
91	if err := json.Unmarshal(data, &tmp); err != nil {
92		return err
93	}
94
95	*enum = ListServersRequestOrderBy(ListServersRequestOrderBy(tmp).String())
96	return nil
97}
98
99type ServerStatus string
100
101const (
102	// ServerStatusUnknownStatus is [insert doc].
103	ServerStatusUnknownStatus = ServerStatus("unknown_status")
104	// ServerStatusStarting is [insert doc].
105	ServerStatusStarting = ServerStatus("starting")
106	// ServerStatusReady is [insert doc].
107	ServerStatusReady = ServerStatus("ready")
108	// ServerStatusError is [insert doc].
109	ServerStatusError = ServerStatus("error")
110	// ServerStatusRebooting is [insert doc].
111	ServerStatusRebooting = ServerStatus("rebooting")
112	// ServerStatusUpdating is [insert doc].
113	ServerStatusUpdating = ServerStatus("updating")
114	// ServerStatusLocking is [insert doc].
115	ServerStatusLocking = ServerStatus("locking")
116	// ServerStatusLocked is [insert doc].
117	ServerStatusLocked = ServerStatus("locked")
118	// ServerStatusUnlocking is [insert doc].
119	ServerStatusUnlocking = ServerStatus("unlocking")
120	// ServerStatusReinstalling is [insert doc].
121	ServerStatusReinstalling = ServerStatus("reinstalling")
122)
123
124func (enum ServerStatus) String() string {
125	if enum == "" {
126		// return default value if empty
127		return "unknown_status"
128	}
129	return string(enum)
130}
131
132func (enum ServerStatus) MarshalJSON() ([]byte, error) {
133	return []byte(fmt.Sprintf(`"%s"`, enum)), nil
134}
135
136func (enum *ServerStatus) UnmarshalJSON(data []byte) error {
137	tmp := ""
138
139	if err := json.Unmarshal(data, &tmp); err != nil {
140		return err
141	}
142
143	*enum = ServerStatus(ServerStatus(tmp).String())
144	return nil
145}
146
147type ServerTypeStock string
148
149const (
150	// ServerTypeStockUnknownStock is [insert doc].
151	ServerTypeStockUnknownStock = ServerTypeStock("unknown_stock")
152	// ServerTypeStockNoStock is [insert doc].
153	ServerTypeStockNoStock = ServerTypeStock("no_stock")
154	// ServerTypeStockLowStock is [insert doc].
155	ServerTypeStockLowStock = ServerTypeStock("low_stock")
156	// ServerTypeStockHighStock is [insert doc].
157	ServerTypeStockHighStock = ServerTypeStock("high_stock")
158)
159
160func (enum ServerTypeStock) String() string {
161	if enum == "" {
162		// return default value if empty
163		return "unknown_stock"
164	}
165	return string(enum)
166}
167
168func (enum ServerTypeStock) MarshalJSON() ([]byte, error) {
169	return []byte(fmt.Sprintf(`"%s"`, enum)), nil
170}
171
172func (enum *ServerTypeStock) UnmarshalJSON(data []byte) error {
173	tmp := ""
174
175	if err := json.Unmarshal(data, &tmp); err != nil {
176		return err
177	}
178
179	*enum = ServerTypeStock(ServerTypeStock(tmp).String())
180	return nil
181}
182
183// ListOSResponse: list os response
184type ListOSResponse struct {
185	// TotalCount: total number of os
186	TotalCount uint32 `json:"total_count"`
187	// Os: list of OS
188	Os []*OS `json:"os"`
189}
190
191// ListServerTypesResponse: list server types response
192type ListServerTypesResponse struct {
193	// ServerTypes: the available server types
194	ServerTypes []*ServerType `json:"server_types"`
195}
196
197// ListServersResponse: list servers response
198type ListServersResponse struct {
199	// TotalCount: the total number of servers
200	TotalCount uint32 `json:"total_count"`
201	// Servers: the paginated returned servers
202	Servers []*Server `json:"servers"`
203}
204
205// OS: os
206type OS struct {
207	// ID: the OS unique ID
208	ID string `json:"id"`
209	// Name: the OS name
210	Name string `json:"name"`
211	// Label: the OS name as it should be displayed
212	Label string `json:"label"`
213	// ImageURL: URL of the image
214	ImageURL string `json:"image_url"`
215	// CompatibleServerTypes: list of compatible server types
216	CompatibleServerTypes []string `json:"compatible_server_types"`
217}
218
219// Server: server
220type Server struct {
221	// ID: UUID of the server
222	ID string `json:"id"`
223	// Type: type of the server
224	Type string `json:"type"`
225	// Name: name of the server
226	Name string `json:"name"`
227	// ProjectID: project this server is associated with
228	ProjectID string `json:"project_id"`
229	// OrganizationID: organization this server is associated with
230	OrganizationID string `json:"organization_id"`
231	// IP: iPv4 address of the server
232	IP net.IP `json:"ip"`
233	// VncURL: URL of the VNC
234	VncURL string `json:"vnc_url"`
235	// Status: current status of the server
236	//
237	// Default value: unknown_status
238	Status ServerStatus `json:"status"`
239	// CreatedAt: the date at which the server was created
240	CreatedAt *time.Time `json:"created_at"`
241	// UpdatedAt: the date at which the server was last updated
242	UpdatedAt *time.Time `json:"updated_at"`
243	// DeletableAt: the date at which the server was last deleted
244	DeletableAt *time.Time `json:"deletable_at"`
245	// Zone: the zone of the server
246	Zone scw.Zone `json:"zone"`
247}
248
249// ServerType: server type
250type ServerType struct {
251	// CPU: CPU description
252	CPU *ServerTypeCPU `json:"cpu"`
253	// Disk: size of the local disk of the server
254	Disk *ServerTypeDisk `json:"disk"`
255	// Name: name of the type
256	Name string `json:"name"`
257	// Memory: size of memory available
258	Memory *ServerTypeMemory `json:"memory"`
259	// Stock: current stock
260	//
261	// Default value: unknown_stock
262	Stock ServerTypeStock `json:"stock"`
263	// MinimumLeaseDuration: minimum duration of the lease in seconds
264	//
265	// Minimum duration of the lease in seconds (example. 3.4s).
266	MinimumLeaseDuration *scw.Duration `json:"minimum_lease_duration"`
267}
268
269type ServerTypeCPU struct {
270	Name string `json:"name"`
271
272	CoreCount uint32 `json:"core_count"`
273}
274
275type ServerTypeDisk struct {
276	Capacity scw.Size `json:"capacity"`
277
278	Type string `json:"type"`
279}
280
281type ServerTypeMemory struct {
282	Capacity scw.Size `json:"capacity"`
283
284	Type string `json:"type"`
285}
286
287// Service API
288
289type GetServiceInfoRequest struct {
290	Zone scw.Zone `json:"-"`
291}
292
293func (s *API) GetServiceInfo(req *GetServiceInfoRequest, opts ...scw.RequestOption) (*scw.ServiceInfo, error) {
294	var err error
295
296	if req.Zone == "" {
297		defaultZone, _ := s.client.GetDefaultZone()
298		req.Zone = defaultZone
299	}
300
301	if fmt.Sprint(req.Zone) == "" {
302		return nil, errors.New("field Zone cannot be empty in request")
303	}
304
305	scwReq := &scw.ScalewayRequest{
306		Method:  "GET",
307		Path:    "/apple-silicon/v1alpha1/zones/" + fmt.Sprint(req.Zone) + "",
308		Headers: http.Header{},
309	}
310
311	var resp scw.ServiceInfo
312
313	err = s.client.Do(scwReq, &resp, opts...)
314	if err != nil {
315		return nil, err
316	}
317	return &resp, nil
318}
319
320type ListServerTypesRequest struct {
321	Zone scw.Zone `json:"-"`
322}
323
324// ListServerTypes: list server types
325//
326// List all server types technical details.
327func (s *API) ListServerTypes(req *ListServerTypesRequest, opts ...scw.RequestOption) (*ListServerTypesResponse, error) {
328	var err error
329
330	if req.Zone == "" {
331		defaultZone, _ := s.client.GetDefaultZone()
332		req.Zone = defaultZone
333	}
334
335	if fmt.Sprint(req.Zone) == "" {
336		return nil, errors.New("field Zone cannot be empty in request")
337	}
338
339	scwReq := &scw.ScalewayRequest{
340		Method:  "GET",
341		Path:    "/apple-silicon/v1alpha1/zones/" + fmt.Sprint(req.Zone) + "/server-types",
342		Headers: http.Header{},
343	}
344
345	var resp ListServerTypesResponse
346
347	err = s.client.Do(scwReq, &resp, opts...)
348	if err != nil {
349		return nil, err
350	}
351	return &resp, nil
352}
353
354type GetServerTypeRequest struct {
355	Zone scw.Zone `json:"-"`
356	// ServerType: server type identifier
357	ServerType string `json:"-"`
358}
359
360// GetServerType: get a server type
361//
362// Get a server technical details.
363func (s *API) GetServerType(req *GetServerTypeRequest, opts ...scw.RequestOption) (*ServerType, error) {
364	var err error
365
366	if req.Zone == "" {
367		defaultZone, _ := s.client.GetDefaultZone()
368		req.Zone = defaultZone
369	}
370
371	if fmt.Sprint(req.Zone) == "" {
372		return nil, errors.New("field Zone cannot be empty in request")
373	}
374
375	if fmt.Sprint(req.ServerType) == "" {
376		return nil, errors.New("field ServerType cannot be empty in request")
377	}
378
379	scwReq := &scw.ScalewayRequest{
380		Method:  "GET",
381		Path:    "/apple-silicon/v1alpha1/zones/" + fmt.Sprint(req.Zone) + "/server-type/" + fmt.Sprint(req.ServerType) + "",
382		Headers: http.Header{},
383	}
384
385	var resp ServerType
386
387	err = s.client.Do(scwReq, &resp, opts...)
388	if err != nil {
389		return nil, err
390	}
391	return &resp, nil
392}
393
394type CreateServerRequest struct {
395	Zone scw.Zone `json:"-"`
396	// Name: create a server with this given name
397	Name string `json:"name"`
398	// ProjectID: create a server in the given project ID
399	ProjectID string `json:"project_id"`
400	// Type: create a server of the given type
401	Type string `json:"type"`
402}
403
404// CreateServer: create a server
405//
406// Create a server.
407func (s *API) CreateServer(req *CreateServerRequest, opts ...scw.RequestOption) (*Server, error) {
408	var err error
409
410	if req.ProjectID == "" {
411		defaultProjectID, _ := s.client.GetDefaultProjectID()
412		req.ProjectID = defaultProjectID
413	}
414
415	if req.Zone == "" {
416		defaultZone, _ := s.client.GetDefaultZone()
417		req.Zone = defaultZone
418	}
419
420	if req.Name == "" {
421		req.Name = namegenerator.GetRandomName("as")
422	}
423
424	if fmt.Sprint(req.Zone) == "" {
425		return nil, errors.New("field Zone cannot be empty in request")
426	}
427
428	scwReq := &scw.ScalewayRequest{
429		Method:  "POST",
430		Path:    "/apple-silicon/v1alpha1/zones/" + fmt.Sprint(req.Zone) + "/servers",
431		Headers: http.Header{},
432	}
433
434	err = scwReq.SetBody(req)
435	if err != nil {
436		return nil, err
437	}
438
439	var resp Server
440
441	err = s.client.Do(scwReq, &resp, opts...)
442	if err != nil {
443		return nil, err
444	}
445	return &resp, nil
446}
447
448type ListServersRequest struct {
449	Zone scw.Zone `json:"-"`
450	// OrderBy: the sort order of the returned servers
451	//
452	// Default value: created_at_asc
453	OrderBy ListServersRequestOrderBy `json:"-"`
454	// ProjectID: list only servers of this project ID
455	ProjectID *string `json:"-"`
456	// OrganizationID: list only servers of this organization ID
457	OrganizationID *string `json:"-"`
458	// Page: a positive integer to choose the page to return
459	Page *int32 `json:"-"`
460	// PageSize: a positive integer lower or equal to 100 to select the number of items to return
461	//
462	// Default value: 50
463	PageSize *uint32 `json:"-"`
464}
465
466// ListServers: list all servers
467//
468// List all servers.
469func (s *API) ListServers(req *ListServersRequest, opts ...scw.RequestOption) (*ListServersResponse, error) {
470	var err error
471
472	if req.Zone == "" {
473		defaultZone, _ := s.client.GetDefaultZone()
474		req.Zone = defaultZone
475	}
476
477	defaultPageSize, exist := s.client.GetDefaultPageSize()
478	if (req.PageSize == nil || *req.PageSize == 0) && exist {
479		req.PageSize = &defaultPageSize
480	}
481
482	query := url.Values{}
483	parameter.AddToQuery(query, "order_by", req.OrderBy)
484	parameter.AddToQuery(query, "project_id", req.ProjectID)
485	parameter.AddToQuery(query, "organization_id", req.OrganizationID)
486	parameter.AddToQuery(query, "page", req.Page)
487	parameter.AddToQuery(query, "page_size", req.PageSize)
488
489	if fmt.Sprint(req.Zone) == "" {
490		return nil, errors.New("field Zone cannot be empty in request")
491	}
492
493	scwReq := &scw.ScalewayRequest{
494		Method:  "GET",
495		Path:    "/apple-silicon/v1alpha1/zones/" + fmt.Sprint(req.Zone) + "/servers",
496		Query:   query,
497		Headers: http.Header{},
498	}
499
500	var resp ListServersResponse
501
502	err = s.client.Do(scwReq, &resp, opts...)
503	if err != nil {
504		return nil, err
505	}
506	return &resp, nil
507}
508
509// UnsafeGetTotalCount should not be used
510// Internal usage only
511func (r *ListServersResponse) UnsafeGetTotalCount() uint32 {
512	return r.TotalCount
513}
514
515// UnsafeAppend should not be used
516// Internal usage only
517func (r *ListServersResponse) UnsafeAppend(res interface{}) (uint32, error) {
518	results, ok := res.(*ListServersResponse)
519	if !ok {
520		return 0, errors.New("%T type cannot be appended to type %T", res, r)
521	}
522
523	r.Servers = append(r.Servers, results.Servers...)
524	r.TotalCount += uint32(len(results.Servers))
525	return uint32(len(results.Servers)), nil
526}
527
528type ListOSRequest struct {
529	Zone scw.Zone `json:"-"`
530	// Page: a positive integer to choose the page to return
531	Page *int32 `json:"-"`
532	// PageSize: a positive integer lower or equal to 100 to select the number of items to return
533	//
534	// Default value: 50
535	PageSize *uint32 `json:"-"`
536	// ServerType: list of compatible server type
537	ServerType *string `json:"-"`
538	// Name: filter os by name (for eg. "11.1" will return "11.1.2" and "11.1" but not "12")
539	Name *string `json:"-"`
540}
541
542// ListOS: list all Operating System (OS)
543//
544// List all Operating System (OS).
545func (s *API) ListOS(req *ListOSRequest, opts ...scw.RequestOption) (*ListOSResponse, error) {
546	var err error
547
548	if req.Zone == "" {
549		defaultZone, _ := s.client.GetDefaultZone()
550		req.Zone = defaultZone
551	}
552
553	defaultPageSize, exist := s.client.GetDefaultPageSize()
554	if (req.PageSize == nil || *req.PageSize == 0) && exist {
555		req.PageSize = &defaultPageSize
556	}
557
558	query := url.Values{}
559	parameter.AddToQuery(query, "page", req.Page)
560	parameter.AddToQuery(query, "page_size", req.PageSize)
561	parameter.AddToQuery(query, "server_type", req.ServerType)
562	parameter.AddToQuery(query, "name", req.Name)
563
564	if fmt.Sprint(req.Zone) == "" {
565		return nil, errors.New("field Zone cannot be empty in request")
566	}
567
568	scwReq := &scw.ScalewayRequest{
569		Method:  "GET",
570		Path:    "/apple-silicon/v1alpha1/zones/" + fmt.Sprint(req.Zone) + "/os",
571		Query:   query,
572		Headers: http.Header{},
573	}
574
575	var resp ListOSResponse
576
577	err = s.client.Do(scwReq, &resp, opts...)
578	if err != nil {
579		return nil, err
580	}
581	return &resp, nil
582}
583
584// UnsafeGetTotalCount should not be used
585// Internal usage only
586func (r *ListOSResponse) UnsafeGetTotalCount() uint32 {
587	return r.TotalCount
588}
589
590// UnsafeAppend should not be used
591// Internal usage only
592func (r *ListOSResponse) UnsafeAppend(res interface{}) (uint32, error) {
593	results, ok := res.(*ListOSResponse)
594	if !ok {
595		return 0, errors.New("%T type cannot be appended to type %T", res, r)
596	}
597
598	r.Os = append(r.Os, results.Os...)
599	r.TotalCount += uint32(len(results.Os))
600	return uint32(len(results.Os)), nil
601}
602
603type GetOSRequest struct {
604	Zone scw.Zone `json:"-"`
605	// OsID: UUID of the OS you want to get
606	OsID string `json:"-"`
607}
608
609// GetOS: get an Operating System (OS)
610//
611// Get an Operating System (OS).
612func (s *API) GetOS(req *GetOSRequest, opts ...scw.RequestOption) (*OS, error) {
613	var err error
614
615	if req.Zone == "" {
616		defaultZone, _ := s.client.GetDefaultZone()
617		req.Zone = defaultZone
618	}
619
620	if fmt.Sprint(req.Zone) == "" {
621		return nil, errors.New("field Zone cannot be empty in request")
622	}
623
624	if fmt.Sprint(req.OsID) == "" {
625		return nil, errors.New("field OsID cannot be empty in request")
626	}
627
628	scwReq := &scw.ScalewayRequest{
629		Method:  "GET",
630		Path:    "/apple-silicon/v1alpha1/zones/" + fmt.Sprint(req.Zone) + "/os/" + fmt.Sprint(req.OsID) + "",
631		Headers: http.Header{},
632	}
633
634	var resp OS
635
636	err = s.client.Do(scwReq, &resp, opts...)
637	if err != nil {
638		return nil, err
639	}
640	return &resp, nil
641}
642
643type GetServerRequest struct {
644	Zone scw.Zone `json:"-"`
645	// ServerID: UUID of the server you want to get
646	ServerID string `json:"-"`
647}
648
649// GetServer: get a server
650//
651// Get a server.
652func (s *API) GetServer(req *GetServerRequest, opts ...scw.RequestOption) (*Server, error) {
653	var err error
654
655	if req.Zone == "" {
656		defaultZone, _ := s.client.GetDefaultZone()
657		req.Zone = defaultZone
658	}
659
660	if fmt.Sprint(req.Zone) == "" {
661		return nil, errors.New("field Zone cannot be empty in request")
662	}
663
664	if fmt.Sprint(req.ServerID) == "" {
665		return nil, errors.New("field ServerID cannot be empty in request")
666	}
667
668	scwReq := &scw.ScalewayRequest{
669		Method:  "GET",
670		Path:    "/apple-silicon/v1alpha1/zones/" + fmt.Sprint(req.Zone) + "/servers/" + fmt.Sprint(req.ServerID) + "",
671		Headers: http.Header{},
672	}
673
674	var resp Server
675
676	err = s.client.Do(scwReq, &resp, opts...)
677	if err != nil {
678		return nil, err
679	}
680	return &resp, nil
681}
682
683type UpdateServerRequest struct {
684	Zone scw.Zone `json:"-"`
685	// ServerID: UUID of the server you want to update
686	ServerID string `json:"-"`
687	// Name: updated name for your server
688	Name *string `json:"name"`
689}
690
691// UpdateServer: update a server
692//
693// Update a server.
694func (s *API) UpdateServer(req *UpdateServerRequest, opts ...scw.RequestOption) (*Server, error) {
695	var err error
696
697	if req.Zone == "" {
698		defaultZone, _ := s.client.GetDefaultZone()
699		req.Zone = defaultZone
700	}
701
702	if fmt.Sprint(req.Zone) == "" {
703		return nil, errors.New("field Zone cannot be empty in request")
704	}
705
706	if fmt.Sprint(req.ServerID) == "" {
707		return nil, errors.New("field ServerID cannot be empty in request")
708	}
709
710	scwReq := &scw.ScalewayRequest{
711		Method:  "PATCH",
712		Path:    "/apple-silicon/v1alpha1/zones/" + fmt.Sprint(req.Zone) + "/servers/" + fmt.Sprint(req.ServerID) + "",
713		Headers: http.Header{},
714	}
715
716	err = scwReq.SetBody(req)
717	if err != nil {
718		return nil, err
719	}
720
721	var resp Server
722
723	err = s.client.Do(scwReq, &resp, opts...)
724	if err != nil {
725		return nil, err
726	}
727	return &resp, nil
728}
729
730type DeleteServerRequest struct {
731	Zone scw.Zone `json:"-"`
732	// ServerID: UUID of the server you want to delete
733	ServerID string `json:"-"`
734}
735
736// DeleteServer: delete a server
737//
738// Delete a server.
739func (s *API) DeleteServer(req *DeleteServerRequest, opts ...scw.RequestOption) error {
740	var err error
741
742	if req.Zone == "" {
743		defaultZone, _ := s.client.GetDefaultZone()
744		req.Zone = defaultZone
745	}
746
747	if fmt.Sprint(req.Zone) == "" {
748		return errors.New("field Zone cannot be empty in request")
749	}
750
751	if fmt.Sprint(req.ServerID) == "" {
752		return errors.New("field ServerID cannot be empty in request")
753	}
754
755	scwReq := &scw.ScalewayRequest{
756		Method:  "DELETE",
757		Path:    "/apple-silicon/v1alpha1/zones/" + fmt.Sprint(req.Zone) + "/servers/" + fmt.Sprint(req.ServerID) + "",
758		Headers: http.Header{},
759	}
760
761	err = s.client.Do(scwReq, nil, opts...)
762	if err != nil {
763		return err
764	}
765	return nil
766}
767
768type RebootServerRequest struct {
769	Zone scw.Zone `json:"-"`
770	// ServerID: UUID of the server you want to reboot
771	ServerID string `json:"-"`
772}
773
774// RebootServer: reboot a server
775//
776// Reboot a server.
777func (s *API) RebootServer(req *RebootServerRequest, opts ...scw.RequestOption) (*Server, error) {
778	var err error
779
780	if req.Zone == "" {
781		defaultZone, _ := s.client.GetDefaultZone()
782		req.Zone = defaultZone
783	}
784
785	if fmt.Sprint(req.Zone) == "" {
786		return nil, errors.New("field Zone cannot be empty in request")
787	}
788
789	if fmt.Sprint(req.ServerID) == "" {
790		return nil, errors.New("field ServerID cannot be empty in request")
791	}
792
793	scwReq := &scw.ScalewayRequest{
794		Method:  "POST",
795		Path:    "/apple-silicon/v1alpha1/zones/" + fmt.Sprint(req.Zone) + "/servers/" + fmt.Sprint(req.ServerID) + "/reboot",
796		Headers: http.Header{},
797	}
798
799	err = scwReq.SetBody(req)
800	if err != nil {
801		return nil, err
802	}
803
804	var resp Server
805
806	err = s.client.Do(scwReq, &resp, opts...)
807	if err != nil {
808		return nil, err
809	}
810	return &resp, nil
811}
812
813type ReinstallServerRequest struct {
814	Zone scw.Zone `json:"-"`
815	// ServerID: UUID of the server you want to reinstall
816	ServerID string `json:"-"`
817}
818
819// ReinstallServer: reinstall a server
820//
821// Reinstall a server.
822func (s *API) ReinstallServer(req *ReinstallServerRequest, opts ...scw.RequestOption) (*Server, error) {
823	var err error
824
825	if req.Zone == "" {
826		defaultZone, _ := s.client.GetDefaultZone()
827		req.Zone = defaultZone
828	}
829
830	if fmt.Sprint(req.Zone) == "" {
831		return nil, errors.New("field Zone cannot be empty in request")
832	}
833
834	if fmt.Sprint(req.ServerID) == "" {
835		return nil, errors.New("field ServerID cannot be empty in request")
836	}
837
838	scwReq := &scw.ScalewayRequest{
839		Method:  "POST",
840		Path:    "/apple-silicon/v1alpha1/zones/" + fmt.Sprint(req.Zone) + "/servers/" + fmt.Sprint(req.ServerID) + "/reinstall",
841		Headers: http.Header{},
842	}
843
844	err = scwReq.SetBody(req)
845	if err != nil {
846		return nil, err
847	}
848
849	var resp Server
850
851	err = s.client.Do(scwReq, &resp, opts...)
852	if err != nil {
853		return nil, err
854	}
855	return &resp, nil
856}
857