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