1package storm
2
3import liquidweb "github.com/liquidweb/liquidweb-go"
4
5// ServerBackend is the interface for storm servers.
6type ServerBackend interface {
7	Create(ServerParams) (*Server, error)
8	List(ServerListParams) (*ServerList, error)
9	Details(string) (*Server, error)
10	Update(ServerParams) (*Server, error)
11	Destroy(string) (*ServerDeletion, error)
12	Status(string) (*ServerStatus, error)
13	Stop(string, ...bool) (*ServerStop, error)
14	Reboot(string) (*ServerReboot, error)
15	Start(string) (*ServerStart, error)
16}
17
18// ServerClient is the API client for storm servers.
19type ServerClient struct {
20	Backend liquidweb.Backend
21}
22
23// List will fetch a list of storm servers.
24func (c *ServerClient) List(params ServerListParams) (*ServerList, error) {
25	var result ServerList
26	err := c.Backend.CallIntoInterface("v1/Storm/Server/list", params, &result)
27	if err != nil {
28		return nil, err
29	}
30
31	return &result, nil
32}
33
34// Create a new storm server.
35func (c *ServerClient) Create(params ServerParams) (*Server, error) {
36	var result Server
37	err := c.Backend.CallIntoInterface("v1/Storm/Server/create", params, &result)
38	if err != nil {
39		return nil, err
40	}
41
42	return &result, nil
43}
44
45// Details fetches the details for a storm server.
46func (c *ServerClient) Details(id string) (*Server, error) {
47	var result Server
48	params := ServerParams{UniqID: id}
49
50	err := c.Backend.CallIntoInterface("v1/Storm/Server/details", params, &result)
51	if err != nil {
52		return nil, err
53	}
54
55	return &result, nil
56}
57
58// Update a storm server.
59func (c *ServerClient) Update(params ServerParams) (*Server, error) {
60	var result Server
61
62	err := c.Backend.CallIntoInterface("v1/Storm/Server/update", params, &result)
63	if err != nil {
64		return nil, err
65	}
66
67	return &result, nil
68}
69
70// Destroy a storm server.
71func (c *ServerClient) Destroy(id string) (*ServerDeletion, error) {
72	var result ServerDeletion
73	params := ServerParams{UniqID: id}
74
75	err := c.Backend.CallIntoInterface("v1/Storm/Server/destroy", params, &result)
76	if err != nil {
77		return nil, err
78	}
79
80	return &result, nil
81}
82
83// Status returns the current status of a storm server.
84func (c *ServerClient) Status(id string) (*ServerStatus, error) {
85	var result ServerStatus
86	params := ServerParams{UniqID: id}
87
88	err := c.Backend.CallIntoInterface("v1/Storm/Server/status", params, &result)
89	if err != nil {
90		return nil, err
91	}
92
93	return &result, nil
94}
95
96// Stop a storm server.
97func (c *ServerClient) Stop(uniqId string, force ...bool) (*ServerStop, error) {
98	var result ServerStop
99	args := map[string]interface{}{
100		"uniq_id": uniqId,
101	}
102
103	if len(force) > 0 {
104		args["force"] = force[0]
105	}
106	err := c.Backend.CallIntoInterface("bleed/server/shutdown", args, &result)
107	if err != nil {
108		return nil, err
109	}
110
111	return &result, nil
112}
113
114// Reboot a storm server.
115func (c *ServerClient) Reboot(uniqId string) (*ServerReboot, error) {
116	var result ServerReboot
117	args := map[string]interface{}{
118		"uniq_id": uniqId,
119	}
120
121	err := c.Backend.CallIntoInterface("bleed/storm/server/reboot", args, &result)
122	if err != nil {
123		return nil, err
124	}
125
126	return &result, nil
127}
128
129// Start a Storm Server.
130func (c *ServerClient) Start(uniqId string) (*ServerStart, error) {
131	var result ServerStart
132	args := map[string]interface{}{
133		"uniq_id": uniqId,
134	}
135
136	err := c.Backend.CallIntoInterface("bleed/server/start", args, &result)
137	if err != nil {
138		return nil, err
139	}
140
141	return &result, nil
142}
143