199 lines
5.9 KiB
Go
199 lines
5.9 KiB
Go
![]() |
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"`
|
|||
|
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
|
|||
|
}
|