2016-07-21 21:57:49 +02:00
|
|
|
|
package packngo
|
|
|
|
|
|
|
|
|
|
import "fmt"
|
|
|
|
|
|
|
|
|
|
const ipBasePath = "/ips"
|
|
|
|
|
|
|
|
|
|
// IPService interface defines available IP methods
|
|
|
|
|
type IPService interface {
|
|
|
|
|
Assign(deviceID string, assignRequest *IPAddressAssignRequest) (*IPAddress, *Response, error)
|
|
|
|
|
Unassign(ipAddressID string) (*Response, error)
|
|
|
|
|
Get(ipAddressID string) (*IPAddress, *Response, error)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// IPAddress represents a ip address
|
|
|
|
|
type IPAddress struct {
|
|
|
|
|
ID string `json:"id"`
|
|
|
|
|
Address string `json:"address"`
|
|
|
|
|
Gateway string `json:"gateway"`
|
|
|
|
|
Network string `json:"network"`
|
|
|
|
|
AddressFamily int `json:"address_family"`
|
|
|
|
|
Netmask string `json:"netmask"`
|
|
|
|
|
Public bool `json:"public"`
|
|
|
|
|
Cidr int `json:"cidr"`
|
|
|
|
|
AssignedTo map[string]string `json:"assigned_to"`
|
2016-07-22 16:57:54 +02:00
|
|
|
|
Created string `json:"created_at,omitempty"`
|
|
|
|
|
Updated string `json:"updated_at,omitempty"`
|
2016-07-21 21:57:49 +02:00
|
|
|
|
Href string `json:"href"`
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// IPAddressAssignRequest represents the body if a ip assign request
|
|
|
|
|
type IPAddressAssignRequest struct {
|
|
|
|
|
Address string `json:"address"`
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func (i IPAddress) String() string {
|
|
|
|
|
return Stringify(i)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// IPServiceOp implements IPService
|
|
|
|
|
type IPServiceOp struct {
|
|
|
|
|
client *Client
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// Get returns IpAddress by ID
|
|
|
|
|
func (i *IPServiceOp) Get(ipAddressID string) (*IPAddress, *Response, error) {
|
|
|
|
|
path := fmt.Sprintf("%s/%s", ipBasePath, ipAddressID)
|
|
|
|
|
|
|
|
|
|
req, err := i.client.NewRequest("GET", path, nil)
|
|
|
|
|
if err != nil {
|
|
|
|
|
return nil, nil, err
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
ip := new(IPAddress)
|
|
|
|
|
resp, err := i.client.Do(req, ip)
|
|
|
|
|
if err != nil {
|
|
|
|
|
return nil, resp, err
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return ip, resp, err
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// Unassign unassigns an IP address record. This will remove the relationship between an IP
|
|
|
|
|
// and the device and will make the IP address available to be assigned to another device.
|
|
|
|
|
func (i *IPServiceOp) Unassign(ipAddressID string) (*Response, error) {
|
|
|
|
|
path := fmt.Sprintf("%s/%s", ipBasePath, ipAddressID)
|
|
|
|
|
|
|
|
|
|
req, err := i.client.NewRequest("DELETE", path, nil)
|
|
|
|
|
if err != nil {
|
|
|
|
|
return nil, err
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
resp, err := i.client.Do(req, nil)
|
|
|
|
|
return resp, err
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// Assign assigns an IP address to a device. The IP address must be in one of the IP ranges assigned to the device’s project.
|
|
|
|
|
func (i *IPServiceOp) Assign(deviceID string, assignRequest *IPAddressAssignRequest) (*IPAddress, *Response, error) {
|
|
|
|
|
path := fmt.Sprintf("%s/%s%s", deviceBasePath, deviceID, ipBasePath)
|
|
|
|
|
|
|
|
|
|
req, err := i.client.NewRequest("POST", path, assignRequest)
|
|
|
|
|
|
|
|
|
|
ip := new(IPAddress)
|
|
|
|
|
resp, err := i.client.Do(req, ip)
|
|
|
|
|
if err != nil {
|
|
|
|
|
return nil, resp, err
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return ip, resp, err
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// IP RESERVATIONS API
|
|
|
|
|
|
|
|
|
|
// IPReservationService interface defines available IPReservation methods
|
|
|
|
|
type IPReservationService interface {
|
|
|
|
|
List(projectID string) ([]IPReservation, *Response, error)
|
|
|
|
|
RequestMore(projectID string, ipReservationReq *IPReservationRequest) (*Response, error)
|
|
|
|
|
Get(ipReservationID string) (*IPReservation, *Response, error)
|
|
|
|
|
Remove(ipReservationID string) (*Response, error)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// IPReservationServiceOp implements the IPReservationService interface
|
|
|
|
|
type IPReservationServiceOp struct {
|
|
|
|
|
client *Client
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// IPReservationRequest represents the body of a reservation request
|
|
|
|
|
type IPReservationRequest struct {
|
|
|
|
|
Type string `json:"type"`
|
|
|
|
|
Quantity int `json:"quantity"`
|
|
|
|
|
Comments string `json:"comments"`
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// IPReservation represent an IP reservation for a single project
|
|
|
|
|
type IPReservation struct {
|
|
|
|
|
ID string `json:"id"`
|
|
|
|
|
Network string `json:"network"`
|
|
|
|
|
Address string `json:"address"`
|
|
|
|
|
AddressFamily int `json:"address_family"`
|
|
|
|
|
Netmask string `json:"netmask"`
|
|
|
|
|
Public bool `json:"public"`
|
|
|
|
|
Cidr int `json:"cidr"`
|
|
|
|
|
Management bool `json:"management"`
|
|
|
|
|
Manageable bool `json:"manageable"`
|
|
|
|
|
Addon bool `json:"addon"`
|
|
|
|
|
Bill bool `json:"bill"`
|
|
|
|
|
Assignments []map[string]string `json:"assignments"`
|
|
|
|
|
Href string `json:"href"`
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
type ipReservationRoot struct {
|
|
|
|
|
IPReservations []IPReservation `json:"ip_addresses"`
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// List provides a list of IP resevations for a single project.
|
|
|
|
|
func (i *IPReservationServiceOp) List(projectID string) ([]IPReservation, *Response, error) {
|
|
|
|
|
path := fmt.Sprintf("%s/%s%s", projectBasePath, projectID, ipBasePath)
|
|
|
|
|
|
|
|
|
|
req, err := i.client.NewRequest("GET", path, nil)
|
|
|
|
|
if err != nil {
|
|
|
|
|
return nil, nil, err
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
reservations := new(ipReservationRoot)
|
|
|
|
|
resp, err := i.client.Do(req, reservations)
|
|
|
|
|
if err != nil {
|
|
|
|
|
return nil, resp, err
|
|
|
|
|
}
|
|
|
|
|
return reservations.IPReservations, resp, err
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// RequestMore requests more IP space for a project in order to have additional IP addresses to assign to devices
|
|
|
|
|
func (i *IPReservationServiceOp) RequestMore(projectID string, ipReservationReq *IPReservationRequest) (*Response, error) {
|
|
|
|
|
path := fmt.Sprintf("%s/%s%s", projectBasePath, projectID, ipBasePath)
|
|
|
|
|
|
|
|
|
|
req, err := i.client.NewRequest("POST", path, &ipReservationReq)
|
|
|
|
|
if err != nil {
|
|
|
|
|
return nil, err
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
resp, err := i.client.Do(req, nil)
|
|
|
|
|
if err != nil {
|
|
|
|
|
return nil, err
|
|
|
|
|
}
|
|
|
|
|
return resp, err
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// Get returns a single IP reservation object
|
|
|
|
|
func (i *IPReservationServiceOp) Get(ipReservationID string) (*IPReservation, *Response, error) {
|
|
|
|
|
path := fmt.Sprintf("%s/%s", ipBasePath, ipReservationID)
|
|
|
|
|
|
|
|
|
|
req, err := i.client.NewRequest("GET", path, nil)
|
|
|
|
|
if err != nil {
|
|
|
|
|
return nil, nil, err
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
reservation := new(IPReservation)
|
|
|
|
|
resp, err := i.client.Do(req, reservation)
|
|
|
|
|
if err != nil {
|
|
|
|
|
return nil, nil, err
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return reservation, resp, err
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// Remove removes an IP reservation from the project.
|
|
|
|
|
func (i *IPReservationServiceOp) Remove(ipReservationID string) (*Response, error) {
|
|
|
|
|
path := fmt.Sprintf("%s/%s", ipBasePath, ipReservationID)
|
|
|
|
|
|
|
|
|
|
req, err := i.client.NewRequest("DELETE", path, nil)
|
|
|
|
|
if err != nil {
|
|
|
|
|
return nil, err
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
resp, err := i.client.Do(req, nil)
|
|
|
|
|
if err != nil {
|
|
|
|
|
return nil, err
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return resp, err
|
|
|
|
|
}
|