instance_config_interfaces.go raw
1 package linodego
2
3 import (
4 "context"
5 )
6
7 // InstanceConfigInterface contains information about a configuration's network interface
8 type InstanceConfigInterface struct {
9 ID int `json:"id"`
10 IPAMAddress string `json:"ipam_address"`
11 Label string `json:"label"`
12 Purpose ConfigInterfacePurpose `json:"purpose"`
13 Primary bool `json:"primary"`
14 Active bool `json:"active"`
15 VPCID *int `json:"vpc_id"`
16 SubnetID *int `json:"subnet_id"`
17 IPv4 *VPCIPv4 `json:"ipv4"`
18
19 // NOTE: IPv6 interfaces may not currently be available to all users.
20 IPv6 *InstanceConfigInterfaceIPv6 `json:"ipv6"`
21
22 IPRanges []string `json:"ip_ranges"`
23 }
24
25 // InstanceConfigInterfaceIPv6 represents the IPv6 configuration of a Linode interface.
26 // NOTE: IPv6 interfaces may not currently be available to all users.
27 type InstanceConfigInterfaceIPv6 struct {
28 SLAAC []InstanceConfigInterfaceIPv6SLAAC `json:"slaac"`
29 Ranges []InstanceConfigInterfaceIPv6Range `json:"ranges"`
30 IsPublic *bool `json:"is_public"`
31 }
32
33 // InstanceConfigInterfaceIPv6SLAAC represents a single IPv6 SLAAC under
34 // a Linode interface.
35 // NOTE: IPv6 interfaces may not currently be available to all users.
36 type InstanceConfigInterfaceIPv6SLAAC struct {
37 Range string `json:"range"`
38 Address string `json:"address"`
39 }
40
41 // InstanceConfigInterfaceIPv6Range represents a single IPv6 range under a Linode interface.
42 // NOTE: IPv6 interfaces may not currently be available to all users.
43 type InstanceConfigInterfaceIPv6Range struct {
44 Range string `json:"range"`
45 }
46
47 type VPCIPv4 struct {
48 VPC string `json:"vpc,omitempty"`
49 NAT1To1 *string `json:"nat_1_1,omitempty"`
50 }
51
52 type InstanceConfigInterfaceCreateOptions struct {
53 IPAMAddress string `json:"ipam_address,omitempty"`
54 Label string `json:"label,omitempty"`
55 Purpose ConfigInterfacePurpose `json:"purpose,omitempty"`
56 Primary bool `json:"primary,omitempty"`
57 SubnetID *int `json:"subnet_id,omitempty"`
58 IPv4 *VPCIPv4 `json:"ipv4,omitempty"`
59
60 // NOTE: IPv6 interfaces may not currently be available to all users.
61 IPv6 *InstanceConfigInterfaceCreateOptionsIPv6 `json:"ipv6,omitempty"`
62
63 IPRanges []string `json:"ip_ranges,omitempty"`
64 }
65
66 // InstanceConfigInterfaceCreateOptionsIPv6 represents the IPv6 configuration of a Linode interface
67 // specified during creation.
68 // NOTE: IPv6 interfaces may not currently be available to all users.
69 type InstanceConfigInterfaceCreateOptionsIPv6 struct {
70 SLAAC []InstanceConfigInterfaceCreateOptionsIPv6SLAAC `json:"slaac,omitempty"`
71 Ranges []InstanceConfigInterfaceCreateOptionsIPv6Range `json:"ranges,omitempty"`
72 IsPublic *bool `json:"is_public,omitempty"`
73 }
74
75 // InstanceConfigInterfaceCreateOptionsIPv6SLAAC represents a single IPv6 SLAAC of a Linode interface
76 // specified during creation.
77 // NOTE: IPv6 interfaces may not currently be available to all users.
78 type InstanceConfigInterfaceCreateOptionsIPv6SLAAC struct {
79 Range string `json:"range"`
80 }
81
82 // InstanceConfigInterfaceCreateOptionsIPv6Range represents a single IPv6 ranges of a Linode interface
83 // specified during creation.
84 // NOTE: IPv6 interfaces may not currently be available to all users.
85 type InstanceConfigInterfaceCreateOptionsIPv6Range struct {
86 Range *string `json:"range,omitempty"`
87 }
88
89 type InstanceConfigInterfaceUpdateOptions struct {
90 Primary bool `json:"primary,omitempty"`
91 IPv4 *VPCIPv4 `json:"ipv4,omitempty"`
92
93 // NOTE: IPv6 interfaces may not currently be available to all users.
94 IPv6 *InstanceConfigInterfaceUpdateOptionsIPv6 `json:"ipv6,omitempty"`
95
96 IPRanges *[]string `json:"ip_ranges,omitempty"`
97 }
98
99 // InstanceConfigInterfaceUpdateOptionsIPv6 represents the IPv6 configuration of a Linode interface
100 // specified during updates.
101 // NOTE: IPv6 interfaces may not currently be available to all users.
102 type InstanceConfigInterfaceUpdateOptionsIPv6 struct {
103 SLAAC *[]InstanceConfigInterfaceUpdateOptionsIPv6SLAAC `json:"slaac,omitempty"`
104 Ranges *[]InstanceConfigInterfaceUpdateOptionsIPv6Range `json:"ranges,omitempty"`
105 IsPublic *bool `json:"is_public,omitempty"`
106 }
107
108 // InstanceConfigInterfaceUpdateOptionsIPv6SLAAC represents a single IPv6 SLAAC of a Linode interface
109 // specified during updates.
110 // NOTE: IPv6 interfaces may not currently be available to all users.
111 type InstanceConfigInterfaceUpdateOptionsIPv6SLAAC struct {
112 Range *string `json:"range,omitempty"`
113 }
114
115 // InstanceConfigInterfaceUpdateOptionsIPv6Range represents a single IPv6 ranges of a Linode interface
116 // specified during updates.
117 // NOTE: IPv6 interfaces may not currently be available to all users.
118 type InstanceConfigInterfaceUpdateOptionsIPv6Range struct {
119 Range *string `json:"range,omitempty"`
120 }
121
122 type InstanceConfigInterfacesReorderOptions struct {
123 IDs []int `json:"ids"`
124 }
125
126 func getInstanceConfigInterfacesCreateOptionsList(
127 interfaces []InstanceConfigInterface,
128 ) []InstanceConfigInterfaceCreateOptions {
129 interfaceOptsList := make([]InstanceConfigInterfaceCreateOptions, len(interfaces))
130 for index, configInterface := range interfaces {
131 interfaceOptsList[index] = configInterface.GetCreateOptions()
132 }
133
134 return interfaceOptsList
135 }
136
137 func (i InstanceConfigInterface) GetCreateOptions() InstanceConfigInterfaceCreateOptions {
138 opts := InstanceConfigInterfaceCreateOptions{
139 Label: i.Label,
140 Purpose: i.Purpose,
141 Primary: i.Primary,
142 SubnetID: i.SubnetID,
143 }
144
145 if len(i.IPRanges) > 0 {
146 opts.IPRanges = i.IPRanges
147 }
148
149 if i.IPv4 != nil {
150 opts.IPv4 = &VPCIPv4{
151 VPC: i.IPv4.VPC,
152 NAT1To1: i.IPv4.NAT1To1,
153 }
154 }
155
156 if i.IPv6 != nil {
157 ipv6 := *i.IPv6
158
159 opts.IPv6 = &InstanceConfigInterfaceCreateOptionsIPv6{
160 SLAAC: mapSlice(
161 ipv6.SLAAC,
162 func(i InstanceConfigInterfaceIPv6SLAAC) InstanceConfigInterfaceCreateOptionsIPv6SLAAC {
163 return InstanceConfigInterfaceCreateOptionsIPv6SLAAC{
164 Range: i.Range,
165 }
166 },
167 ),
168 Ranges: mapSlice(
169 ipv6.Ranges,
170 func(i InstanceConfigInterfaceIPv6Range) InstanceConfigInterfaceCreateOptionsIPv6Range {
171 return InstanceConfigInterfaceCreateOptionsIPv6Range{
172 Range: copyValue(&i.Range),
173 }
174 },
175 ),
176 IsPublic: copyValue(ipv6.IsPublic),
177 }
178 }
179
180 opts.IPAMAddress = i.IPAMAddress
181
182 return opts
183 }
184
185 func (i InstanceConfigInterface) GetUpdateOptions() InstanceConfigInterfaceUpdateOptions {
186 opts := InstanceConfigInterfaceUpdateOptions{
187 Primary: i.Primary,
188 }
189
190 if i.Purpose == InterfacePurposeVPC {
191 if i.IPv4 != nil {
192 opts.IPv4 = &VPCIPv4{
193 VPC: i.IPv4.VPC,
194 NAT1To1: i.IPv4.NAT1To1,
195 }
196 }
197
198 if i.IPv6 != nil {
199 ipv6 := *i.IPv6
200
201 newSLAAC := mapSlice(
202 ipv6.SLAAC,
203 func(i InstanceConfigInterfaceIPv6SLAAC) InstanceConfigInterfaceUpdateOptionsIPv6SLAAC {
204 return InstanceConfigInterfaceUpdateOptionsIPv6SLAAC{
205 Range: copyValue(&i.Range),
206 }
207 },
208 )
209
210 newRanges := mapSlice(
211 ipv6.Ranges,
212 func(i InstanceConfigInterfaceIPv6Range) InstanceConfigInterfaceUpdateOptionsIPv6Range {
213 return InstanceConfigInterfaceUpdateOptionsIPv6Range{
214 Range: copyValue(&i.Range),
215 }
216 },
217 )
218
219 opts.IPv6 = &InstanceConfigInterfaceUpdateOptionsIPv6{
220 SLAAC: &newSLAAC,
221 Ranges: &newRanges,
222 IsPublic: copyValue(ipv6.IsPublic),
223 }
224 }
225 }
226
227 if i.IPRanges != nil {
228 // Copy the slice to prevent accidental
229 // mutations
230 copiedIPRanges := make([]string, len(i.IPRanges))
231 copy(copiedIPRanges, i.IPRanges)
232
233 opts.IPRanges = &copiedIPRanges
234 }
235
236 return opts
237 }
238
239 func (c *Client) AppendInstanceConfigInterface(
240 ctx context.Context,
241 linodeID int,
242 configID int,
243 opts InstanceConfigInterfaceCreateOptions,
244 ) (*InstanceConfigInterface, error) {
245 e := formatAPIPath("/linode/instances/%d/configs/%d/interfaces", linodeID, configID)
246 return doPOSTRequest[InstanceConfigInterface](ctx, c, e, opts)
247 }
248
249 func (c *Client) GetInstanceConfigInterface(
250 ctx context.Context,
251 linodeID int,
252 configID int,
253 interfaceID int,
254 ) (*InstanceConfigInterface, error) {
255 e := formatAPIPath(
256 "linode/instances/%d/configs/%d/interfaces/%d",
257 linodeID,
258 configID,
259 interfaceID,
260 )
261
262 return doGETRequest[InstanceConfigInterface](ctx, c, e)
263 }
264
265 func (c *Client) ListInstanceConfigInterfaces(
266 ctx context.Context,
267 linodeID int,
268 configID int,
269 ) ([]InstanceConfigInterface, error) {
270 e := formatAPIPath(
271 "linode/instances/%d/configs/%d/interfaces",
272 linodeID,
273 configID,
274 )
275
276 response, err := doGETRequest[[]InstanceConfigInterface](ctx, c, e)
277 if err != nil {
278 return nil, err
279 }
280
281 return *response, nil
282 }
283
284 func (c *Client) UpdateInstanceConfigInterface(
285 ctx context.Context,
286 linodeID int,
287 configID int,
288 interfaceID int,
289 opts InstanceConfigInterfaceUpdateOptions,
290 ) (*InstanceConfigInterface, error) {
291 e := formatAPIPath(
292 "linode/instances/%d/configs/%d/interfaces/%d",
293 linodeID,
294 configID,
295 interfaceID,
296 )
297
298 return doPUTRequest[InstanceConfigInterface](ctx, c, e, opts)
299 }
300
301 func (c *Client) DeleteInstanceConfigInterface(
302 ctx context.Context,
303 linodeID int,
304 configID int,
305 interfaceID int,
306 ) error {
307 e := formatAPIPath(
308 "linode/instances/%d/configs/%d/interfaces/%d",
309 linodeID,
310 configID,
311 interfaceID,
312 )
313
314 return doDELETERequest(ctx, c, e)
315 }
316
317 func (c *Client) ReorderInstanceConfigInterfaces(
318 ctx context.Context,
319 linodeID int,
320 configID int,
321 opts InstanceConfigInterfacesReorderOptions,
322 ) error {
323 e := formatAPIPath(
324 "linode/instances/%d/configs/%d/interfaces/order",
325 linodeID,
326 configID,
327 )
328
329 return doPOSTRequestNoResponseBody(ctx, c, e, opts)
330 }
331