instance_configs.go raw
1 package linodego
2
3 import (
4 "context"
5 "encoding/json"
6 "time"
7
8 "github.com/linode/linodego/internal/parseabletime"
9 )
10
11 // InstanceConfig represents all of the settings that control the boot and run configuration of a Linode Instance
12 type InstanceConfig struct {
13 ID int `json:"id"`
14 Label string `json:"label"`
15 Comments string `json:"comments"`
16 Devices *InstanceConfigDeviceMap `json:"devices"`
17 Helpers *InstanceConfigHelpers `json:"helpers"`
18 Interfaces []InstanceConfigInterface `json:"interfaces"`
19 MemoryLimit int `json:"memory_limit"`
20 Kernel string `json:"kernel"`
21 InitRD *int `json:"init_rd"`
22 RootDevice string `json:"root_device"`
23 RunLevel string `json:"run_level"`
24 VirtMode string `json:"virt_mode"`
25 Created *time.Time `json:"-"`
26 Updated *time.Time `json:"-"`
27 }
28
29 // InstanceConfigDevice contains either the DiskID or VolumeID assigned to a Config Device
30 type InstanceConfigDevice struct {
31 DiskID int `json:"disk_id,omitempty"`
32 VolumeID int `json:"volume_id,omitempty"`
33 }
34
35 // InstanceConfigDeviceMap contains SDA-SDH InstanceConfigDevice settings
36 type InstanceConfigDeviceMap struct {
37 // sda-sdz
38 SDA *InstanceConfigDevice `json:"sda,omitempty"`
39 SDB *InstanceConfigDevice `json:"sdb,omitempty"`
40 SDC *InstanceConfigDevice `json:"sdc,omitempty"`
41 SDD *InstanceConfigDevice `json:"sdd,omitempty"`
42 SDE *InstanceConfigDevice `json:"sde,omitempty"`
43 SDF *InstanceConfigDevice `json:"sdf,omitempty"`
44 SDG *InstanceConfigDevice `json:"sdg,omitempty"`
45 SDH *InstanceConfigDevice `json:"sdh,omitempty"`
46 SDI *InstanceConfigDevice `json:"sdi,omitempty"`
47 SDJ *InstanceConfigDevice `json:"sdj,omitempty"`
48 SDK *InstanceConfigDevice `json:"sdk,omitempty"`
49 SDL *InstanceConfigDevice `json:"sdl,omitempty"`
50 SDM *InstanceConfigDevice `json:"sdm,omitempty"`
51 SDN *InstanceConfigDevice `json:"sdn,omitempty"`
52 SDO *InstanceConfigDevice `json:"sdo,omitempty"`
53 SDP *InstanceConfigDevice `json:"sdp,omitempty"`
54 SDQ *InstanceConfigDevice `json:"sdq,omitempty"`
55 SDR *InstanceConfigDevice `json:"sdr,omitempty"`
56 SDS *InstanceConfigDevice `json:"sds,omitempty"`
57 SDT *InstanceConfigDevice `json:"sdt,omitempty"`
58 SDU *InstanceConfigDevice `json:"sdu,omitempty"`
59 SDV *InstanceConfigDevice `json:"sdv,omitempty"`
60 SDW *InstanceConfigDevice `json:"sdw,omitempty"`
61 SDX *InstanceConfigDevice `json:"sdx,omitempty"`
62 SDY *InstanceConfigDevice `json:"sdy,omitempty"`
63 SDZ *InstanceConfigDevice `json:"sdz,omitempty"`
64
65 // sdaa-sdaz
66 SDAA *InstanceConfigDevice `json:"sdaa,omitempty"`
67 SDAB *InstanceConfigDevice `json:"sdab,omitempty"`
68 SDAC *InstanceConfigDevice `json:"sdac,omitempty"`
69 SDAD *InstanceConfigDevice `json:"sdad,omitempty"`
70 SDAE *InstanceConfigDevice `json:"sdae,omitempty"`
71 SDAF *InstanceConfigDevice `json:"sdaf,omitempty"`
72 SDAG *InstanceConfigDevice `json:"sdag,omitempty"`
73 SDAH *InstanceConfigDevice `json:"sdah,omitempty"`
74 SDAI *InstanceConfigDevice `json:"sdai,omitempty"`
75 SDAJ *InstanceConfigDevice `json:"sdaj,omitempty"`
76 SDAK *InstanceConfigDevice `json:"sdak,omitempty"`
77 SDAL *InstanceConfigDevice `json:"sdal,omitempty"`
78 SDAM *InstanceConfigDevice `json:"sdam,omitempty"`
79 SDAN *InstanceConfigDevice `json:"sdan,omitempty"`
80 SDAO *InstanceConfigDevice `json:"sdao,omitempty"`
81 SDAP *InstanceConfigDevice `json:"sdap,omitempty"`
82 SDAQ *InstanceConfigDevice `json:"sdaq,omitempty"`
83 SDAR *InstanceConfigDevice `json:"sdar,omitempty"`
84 SDAS *InstanceConfigDevice `json:"sdas,omitempty"`
85 SDAT *InstanceConfigDevice `json:"sdat,omitempty"`
86 SDAU *InstanceConfigDevice `json:"sdau,omitempty"`
87 SDAV *InstanceConfigDevice `json:"sdav,omitempty"`
88 SDAW *InstanceConfigDevice `json:"sdaw,omitempty"`
89 SDAX *InstanceConfigDevice `json:"sdax,omitempty"`
90 SDAY *InstanceConfigDevice `json:"sday,omitempty"`
91 SDAZ *InstanceConfigDevice `json:"sdaz,omitempty"`
92
93 // sdba-sdbl
94 SDBA *InstanceConfigDevice `json:"sdba,omitempty"`
95 SDBB *InstanceConfigDevice `json:"sdbb,omitempty"`
96 SDBC *InstanceConfigDevice `json:"sdbc,omitempty"`
97 SDBD *InstanceConfigDevice `json:"sdbd,omitempty"`
98 SDBE *InstanceConfigDevice `json:"sdbe,omitempty"`
99 SDBF *InstanceConfigDevice `json:"sdbf,omitempty"`
100 SDBG *InstanceConfigDevice `json:"sdbg,omitempty"`
101 SDBH *InstanceConfigDevice `json:"sdbh,omitempty"`
102 SDBI *InstanceConfigDevice `json:"sdbi,omitempty"`
103 SDBJ *InstanceConfigDevice `json:"sdbj,omitempty"`
104 SDBK *InstanceConfigDevice `json:"sdbk,omitempty"`
105 SDBL *InstanceConfigDevice `json:"sdbl,omitempty"`
106 }
107
108 // InstanceConfigHelpers are Instance Config options that control Linux distribution specific tweaks
109 type InstanceConfigHelpers struct {
110 UpdateDBDisabled bool `json:"updatedb_disabled"`
111 Distro bool `json:"distro"`
112 ModulesDep bool `json:"modules_dep"`
113 Network bool `json:"network"`
114 DevTmpFsAutomount bool `json:"devtmpfs_automount"`
115 }
116
117 // ConfigInterfacePurpose options start with InterfacePurpose and include all known interface purpose types
118 type ConfigInterfacePurpose string
119
120 const (
121 InterfacePurposePublic ConfigInterfacePurpose = "public"
122 InterfacePurposeVLAN ConfigInterfacePurpose = "vlan"
123 InterfacePurposeVPC ConfigInterfacePurpose = "vpc"
124 )
125
126 // InstanceConfigCreateOptions are InstanceConfig settings that can be used at creation
127 type InstanceConfigCreateOptions struct {
128 Label string `json:"label,omitempty"`
129 Comments string `json:"comments,omitempty"`
130 Devices InstanceConfigDeviceMap `json:"devices"`
131 Helpers *InstanceConfigHelpers `json:"helpers,omitempty"`
132 Interfaces []InstanceConfigInterfaceCreateOptions `json:"interfaces"`
133 MemoryLimit int `json:"memory_limit,omitempty"`
134 Kernel string `json:"kernel,omitempty"`
135 InitRD int `json:"init_rd,omitempty"`
136 RootDevice *string `json:"root_device,omitempty"`
137 RunLevel string `json:"run_level,omitempty"`
138 VirtMode string `json:"virt_mode,omitempty"`
139 }
140
141 // InstanceConfigUpdateOptions are InstanceConfig settings that can be used in updates
142 type InstanceConfigUpdateOptions struct {
143 Label string `json:"label,omitempty"`
144 Comments string `json:"comments"`
145 Devices *InstanceConfigDeviceMap `json:"devices,omitempty"`
146 Helpers *InstanceConfigHelpers `json:"helpers,omitempty"`
147 Interfaces []InstanceConfigInterfaceCreateOptions `json:"interfaces"`
148 // MemoryLimit 0 means unlimitted, this is not omitted
149 MemoryLimit int `json:"memory_limit"`
150 Kernel string `json:"kernel,omitempty"`
151 // InitRD is nullable, permit the sending of null
152 InitRD *int `json:"init_rd"`
153 RootDevice string `json:"root_device,omitempty"`
154 RunLevel string `json:"run_level,omitempty"`
155 VirtMode string `json:"virt_mode,omitempty"`
156 }
157
158 // UnmarshalJSON implements the json.Unmarshaler interface
159 func (i *InstanceConfig) UnmarshalJSON(b []byte) error {
160 type Mask InstanceConfig
161
162 p := struct {
163 *Mask
164
165 Created *parseabletime.ParseableTime `json:"created"`
166 Updated *parseabletime.ParseableTime `json:"updated"`
167 }{
168 Mask: (*Mask)(i),
169 }
170
171 if err := json.Unmarshal(b, &p); err != nil {
172 return err
173 }
174
175 i.Created = (*time.Time)(p.Created)
176 i.Updated = (*time.Time)(p.Updated)
177
178 return nil
179 }
180
181 // GetCreateOptions converts a InstanceConfig to InstanceConfigCreateOptions for use in CreateInstanceConfig
182 func (i InstanceConfig) GetCreateOptions() InstanceConfigCreateOptions {
183 result := InstanceConfigCreateOptions{
184 Label: i.Label,
185 Comments: i.Comments,
186 Helpers: i.Helpers,
187 Interfaces: getInstanceConfigInterfacesCreateOptionsList(i.Interfaces),
188 MemoryLimit: i.MemoryLimit,
189 Kernel: i.Kernel,
190 RootDevice: copyString(&i.RootDevice),
191 RunLevel: i.RunLevel,
192 VirtMode: i.VirtMode,
193 }
194
195 if i.InitRD != nil {
196 result.InitRD = *i.InitRD
197 }
198
199 if i.Devices != nil {
200 result.Devices = *i.Devices
201 }
202
203 return result
204 }
205
206 // GetUpdateOptions converts a InstanceConfig to InstanceConfigUpdateOptions for use in UpdateInstanceConfig
207 func (i InstanceConfig) GetUpdateOptions() InstanceConfigUpdateOptions {
208 return InstanceConfigUpdateOptions{
209 Label: i.Label,
210 Comments: i.Comments,
211 Devices: i.Devices,
212 Helpers: i.Helpers,
213 Interfaces: getInstanceConfigInterfacesCreateOptionsList(i.Interfaces),
214 MemoryLimit: i.MemoryLimit,
215 Kernel: i.Kernel,
216 InitRD: copyInt(i.InitRD),
217 RootDevice: i.RootDevice,
218 RunLevel: i.RunLevel,
219 VirtMode: i.VirtMode,
220 }
221 }
222
223 // ListInstanceConfigs lists InstanceConfigs
224 func (c *Client) ListInstanceConfigs(ctx context.Context, linodeID int, opts *ListOptions) ([]InstanceConfig, error) {
225 return getPaginatedResults[InstanceConfig](ctx, c, formatAPIPath("linode/instances/%d/configs", linodeID), opts)
226 }
227
228 // GetInstanceConfig gets the template with the provided ID
229 func (c *Client) GetInstanceConfig(ctx context.Context, linodeID int, configID int) (*InstanceConfig, error) {
230 e := formatAPIPath("linode/instances/%d/configs/%d", linodeID, configID)
231 return doGETRequest[InstanceConfig](ctx, c, e)
232 }
233
234 // CreateInstanceConfig creates a new InstanceConfig for the given Instance
235 func (c *Client) CreateInstanceConfig(ctx context.Context, linodeID int, opts InstanceConfigCreateOptions) (*InstanceConfig, error) {
236 e := formatAPIPath("linode/instances/%d/configs", linodeID)
237 return doPOSTRequest[InstanceConfig](ctx, c, e, opts)
238 }
239
240 // UpdateInstanceConfig update an InstanceConfig for the given Instance
241 func (c *Client) UpdateInstanceConfig(ctx context.Context, linodeID int, configID int, opts InstanceConfigUpdateOptions) (*InstanceConfig, error) {
242 e := formatAPIPath("linode/instances/%d/configs/%d", linodeID, configID)
243 return doPUTRequest[InstanceConfig](ctx, c, e, opts)
244 }
245
246 // RenameInstanceConfig renames an InstanceConfig
247 func (c *Client) RenameInstanceConfig(ctx context.Context, linodeID int, configID int, label string) (*InstanceConfig, error) {
248 return c.UpdateInstanceConfig(ctx, linodeID, configID, InstanceConfigUpdateOptions{Label: label})
249 }
250
251 // DeleteInstanceConfig deletes a Linode InstanceConfig
252 func (c *Client) DeleteInstanceConfig(ctx context.Context, linodeID int, configID int) error {
253 e := formatAPIPath("linode/instances/%d/configs/%d", linodeID, configID)
254 return doDELETERequest(ctx, c, e)
255 }
256