435c0d9fc8
This PR switches the Nomad repository from using govendor to Go modules for managing dependencies. Aspects of the Nomad workflow remain pretty much the same. The usual Makefile targets should continue to work as they always did. The API submodule simply defers to the parent Nomad version on the repository, keeping the semantics of API versioning that currently exists.
107 lines
3 KiB
Go
107 lines
3 KiB
Go
package linodego
|
|
|
|
import (
|
|
"context"
|
|
"encoding/json"
|
|
"fmt"
|
|
)
|
|
|
|
// InstanceIPAddressResponse contains the IPv4 and IPv6 details for an Instance
|
|
type InstanceIPAddressResponse struct {
|
|
IPv4 *InstanceIPv4Response `json:"ipv4"`
|
|
IPv6 *InstanceIPv6Response `json:"ipv6"`
|
|
}
|
|
|
|
// InstanceIPv4Response contains the details of all IPv4 addresses associated with an Instance
|
|
type InstanceIPv4Response struct {
|
|
Public []*InstanceIP `json:"public"`
|
|
Private []*InstanceIP `json:"private"`
|
|
Shared []*InstanceIP `json:"shared"`
|
|
}
|
|
|
|
// InstanceIP represents an Instance IP with additional DNS and networking details
|
|
type InstanceIP struct {
|
|
Address string `json:"address"`
|
|
Gateway string `json:"gateway"`
|
|
SubnetMask string `json:"subnet_mask"`
|
|
Prefix int `json:"prefix"`
|
|
Type string `json:"type"`
|
|
Public bool `json:"public"`
|
|
RDNS string `json:"rdns"`
|
|
LinodeID int `json:"linode_id"`
|
|
Region string `json:"region"`
|
|
}
|
|
|
|
// InstanceIPv6Response contains the IPv6 addresses and ranges for an Instance
|
|
type InstanceIPv6Response struct {
|
|
LinkLocal *InstanceIP `json:"link_local"`
|
|
SLAAC *InstanceIP `json:"slaac"`
|
|
Global []*IPv6Range `json:"global"`
|
|
}
|
|
|
|
// IPv6Range represents a range of IPv6 addresses routed to a single Linode in a given Region
|
|
type IPv6Range struct {
|
|
Range string `json:"range"`
|
|
Region string `json:"region"`
|
|
}
|
|
|
|
// GetInstanceIPAddresses gets the IPAddresses for a Linode instance
|
|
func (c *Client) GetInstanceIPAddresses(ctx context.Context, linodeID int) (*InstanceIPAddressResponse, error) {
|
|
e, err := c.InstanceIPs.endpointWithID(linodeID)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
r, err := coupleAPIErrors(c.R(ctx).SetResult(&InstanceIPAddressResponse{}).Get(e))
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
return r.Result().(*InstanceIPAddressResponse), nil
|
|
}
|
|
|
|
// GetInstanceIPAddress gets the IPAddress for a Linode instance matching a supplied IP address
|
|
func (c *Client) GetInstanceIPAddress(ctx context.Context, linodeID int, ipaddress string) (*InstanceIP, error) {
|
|
e, err := c.InstanceIPs.endpointWithID(linodeID)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
e = fmt.Sprintf("%s/%s", e, ipaddress)
|
|
r, err := coupleAPIErrors(c.R(ctx).SetResult(&InstanceIP{}).Get(e))
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
return r.Result().(*InstanceIP), nil
|
|
}
|
|
|
|
// AddInstanceIPAddress adds a public or private IP to a Linode instance
|
|
func (c *Client) AddInstanceIPAddress(ctx context.Context, linodeID int, public bool) (*InstanceIP, error) {
|
|
var body string
|
|
e, err := c.InstanceIPs.endpointWithID(linodeID)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
req := c.R(ctx).SetResult(&InstanceIP{})
|
|
|
|
instanceipRequest := struct {
|
|
Type string `json:"type"`
|
|
Public bool `json:"public"`
|
|
}{"ipv4", public}
|
|
|
|
if bodyData, err := json.Marshal(instanceipRequest); err == nil {
|
|
body = string(bodyData)
|
|
} else {
|
|
return nil, NewError(err)
|
|
}
|
|
|
|
r, err := coupleAPIErrors(req.
|
|
SetHeader("Content-Type", "application/json").
|
|
SetBody(body).
|
|
Post(e))
|
|
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
return r.Result().(*InstanceIP), nil
|
|
}
|