reserved_ip.go raw
1 package govultr
2
3 import (
4 "context"
5 "fmt"
6 "net/http"
7
8 "github.com/google/go-querystring/query"
9 )
10
11 const ripPath = "/v2/reserved-ips"
12
13 // ReservedIPService is the interface to interact with the reserved IP endpoints on the Vultr API
14 // Link : https://www.vultr.com/api/#tag/reserved-ip
15 type ReservedIPService interface {
16 Create(ctx context.Context, ripCreate *ReservedIPReq) (*ReservedIP, *http.Response, error)
17 Update(ctx context.Context, id string, ripUpdate *ReservedIPUpdateReq) (*ReservedIP, *http.Response, error)
18 Get(ctx context.Context, id string) (*ReservedIP, *http.Response, error)
19 Delete(ctx context.Context, id string) error
20 List(ctx context.Context, options *ListOptions) ([]ReservedIP, *Meta, *http.Response, error)
21
22 Convert(ctx context.Context, ripConvert *ReservedIPConvertReq) (*ReservedIP, *http.Response, error)
23 Attach(ctx context.Context, id, instance string) error
24 Detach(ctx context.Context, id string) error
25 }
26
27 // ReservedIPServiceHandler handles interaction with the reserved IP methods for the Vultr API
28 type ReservedIPServiceHandler struct {
29 client *Client
30 }
31
32 // ReservedIP represents an reserved IP on Vultr
33 type ReservedIP struct {
34 ID string `json:"id"`
35 Region string `json:"region"`
36 IPType string `json:"ip_type"`
37 Subnet string `json:"subnet"`
38 SubnetSize int `json:"subnet_size"`
39 Label string `json:"label"`
40 InstanceID string `json:"instance_id"`
41 }
42
43 // ReservedIPReq represents the parameters for creating a new Reserved IP on Vultr
44 type ReservedIPReq struct {
45 Region string `json:"region,omitempty"`
46 IPType string `json:"ip_type,omitempty"`
47 IPAddress string `json:"ip_address,omitempty"`
48 Label string `json:"label,omitempty"`
49 InstanceID string `json:"instance_id,omitempty"`
50 }
51
52 // ReservedIPUpdateReq represents the parameters for updating a Reserved IP on Vultr
53 type ReservedIPUpdateReq struct {
54 Label *string `json:"label"`
55 }
56
57 type reservedIPsBase struct {
58 ReservedIPs []ReservedIP `json:"reserved_ips"`
59 Meta *Meta `json:"meta"`
60 }
61
62 type reservedIPBase struct {
63 ReservedIP *ReservedIP `json:"reserved_ip"`
64 }
65
66 // ReservedIPConvertReq is the struct used for create and update calls.
67 type ReservedIPConvertReq struct {
68 IPAddress string `json:"ip_address,omitempty"`
69 Label string `json:"label,omitempty"`
70 }
71
72 // Create adds the specified reserved IP to your Vultr account
73 func (r *ReservedIPServiceHandler) Create(ctx context.Context, ripCreate *ReservedIPReq) (*ReservedIP, *http.Response, error) {
74 req, err := r.client.NewRequest(ctx, http.MethodPost, ripPath, ripCreate)
75 if err != nil {
76 return nil, nil, err
77 }
78
79 rip := new(reservedIPBase)
80 resp, err := r.client.DoWithContext(ctx, req, rip)
81 if err != nil {
82 return nil, resp, err
83 }
84
85 return rip.ReservedIP, resp, nil
86 }
87
88 // Update updates label on the Reserved IP
89 func (r *ReservedIPServiceHandler) Update(ctx context.Context, id string, ripUpdate *ReservedIPUpdateReq) (*ReservedIP, *http.Response, error) { //nolint:lll
90 uri := fmt.Sprintf("%s/%s", ripPath, id)
91 req, err := r.client.NewRequest(ctx, http.MethodPatch, uri, ripUpdate)
92 if err != nil {
93 return nil, nil, err
94 }
95
96 rip := new(reservedIPBase)
97 resp, err := r.client.DoWithContext(ctx, req, rip)
98 if err != nil {
99 return nil, resp, err
100 }
101
102 return rip.ReservedIP, resp, nil
103 }
104
105 // Get gets the reserved IP associated with provided ID
106 func (r *ReservedIPServiceHandler) Get(ctx context.Context, id string) (*ReservedIP, *http.Response, error) {
107 uri := fmt.Sprintf("%s/%s", ripPath, id)
108 req, err := r.client.NewRequest(ctx, http.MethodGet, uri, nil)
109 if err != nil {
110 return nil, nil, err
111 }
112
113 rip := new(reservedIPBase)
114 resp, err := r.client.DoWithContext(ctx, req, rip)
115 if err != nil {
116 return nil, resp, err
117 }
118
119 return rip.ReservedIP, resp, nil
120 }
121
122 // Delete removes the specified reserved IP from your Vultr account
123 func (r *ReservedIPServiceHandler) Delete(ctx context.Context, id string) error {
124 uri := fmt.Sprintf("%s/%s", ripPath, id)
125 req, err := r.client.NewRequest(ctx, http.MethodDelete, uri, nil)
126 if err != nil {
127 return err
128 }
129
130 _, err = r.client.DoWithContext(ctx, req, nil)
131 return err
132 }
133
134 // List lists all the reserved IPs associated with your Vultr account
135 func (r *ReservedIPServiceHandler) List(ctx context.Context, options *ListOptions) ([]ReservedIP, *Meta, *http.Response, error) { //nolint:dupl,lll
136 req, err := r.client.NewRequest(ctx, http.MethodGet, ripPath, nil)
137 if err != nil {
138 return nil, nil, nil, err
139 }
140
141 newValues, err := query.Values(options)
142 if err != nil {
143 return nil, nil, nil, err
144 }
145
146 req.URL.RawQuery = newValues.Encode()
147
148 ips := new(reservedIPsBase)
149 resp, err := r.client.DoWithContext(ctx, req, ips)
150 if err != nil {
151 return nil, nil, resp, err
152 }
153
154 return ips.ReservedIPs, ips.Meta, resp, nil
155 }
156
157 // Convert an existing IP on a subscription to a reserved IP.
158 func (r *ReservedIPServiceHandler) Convert(ctx context.Context, ripConvert *ReservedIPConvertReq) (*ReservedIP, *http.Response, error) {
159 uri := fmt.Sprintf("%s/convert", ripPath)
160 req, err := r.client.NewRequest(ctx, http.MethodPost, uri, ripConvert)
161
162 if err != nil {
163 return nil, nil, err
164 }
165
166 rip := new(reservedIPBase)
167 resp, err := r.client.DoWithContext(ctx, req, rip)
168 if err != nil {
169 return nil, resp, err
170 }
171
172 return rip.ReservedIP, resp, nil
173 }
174
175 // Attach a reserved IP to an existing subscription
176 func (r *ReservedIPServiceHandler) Attach(ctx context.Context, id, instance string) error {
177 uri := fmt.Sprintf("%s/%s/attach", ripPath, id)
178 reqBody := RequestBody{"instance_id": instance}
179 req, err := r.client.NewRequest(ctx, http.MethodPost, uri, reqBody)
180 if err != nil {
181 return err
182 }
183 _, err = r.client.DoWithContext(ctx, req, nil)
184 return err
185 }
186
187 // Detach a reserved IP from an existing subscription.
188 func (r *ReservedIPServiceHandler) Detach(ctx context.Context, id string) error {
189 uri := fmt.Sprintf("%s/%s/detach", ripPath, id)
190 req, err := r.client.NewRequest(ctx, http.MethodPost, uri, nil)
191 if err != nil {
192 return err
193 }
194 _, err = r.client.DoWithContext(ctx, req, nil)
195 return err
196 }
197