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