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.
210 lines
4.6 KiB
Go
210 lines
4.6 KiB
Go
package api
|
|
|
|
import (
|
|
"encoding/json"
|
|
"fmt"
|
|
"net/http"
|
|
"net/url"
|
|
)
|
|
|
|
// IPV6 represents a ipv6
|
|
type IPV6 struct {
|
|
Netmask string `json:"netmask"`
|
|
Gateway string `json:"gateway"`
|
|
Address string `json:"address"`
|
|
}
|
|
|
|
// IPV4 represents the IPs fields
|
|
type IPV4 struct {
|
|
Organization string `json:"organization"`
|
|
Reverse *string `json:"reverse"`
|
|
ID string `json:"id"`
|
|
Server *struct {
|
|
Identifier string `json:"id,omitempty"`
|
|
Name string `json:"name,omitempty"`
|
|
} `json:"server"`
|
|
Address string `json:"address"`
|
|
}
|
|
|
|
// IPAddress represents a IP address
|
|
type IPAddress struct {
|
|
// Identifier is a unique identifier for the IP address
|
|
Identifier string `json:"id,omitempty"`
|
|
|
|
// IP is an IPv4 address
|
|
IP string `json:"address,omitempty"`
|
|
|
|
// Dynamic is a flag that defines an IP that change on each reboot
|
|
Dynamic *bool `json:"dynamic,omitempty"`
|
|
}
|
|
|
|
// GetIPS represents the response of a GET /ips/
|
|
type GetIPS struct {
|
|
IPS []IPV4 `json:"ips"`
|
|
}
|
|
|
|
// GetIP represents the response of a GET /ips/{id_ip}
|
|
type GetIP struct {
|
|
IP IPV4 `json:"ip"`
|
|
}
|
|
|
|
// GetIP returns a GetIP
|
|
func (s *API) GetIP(ipID string) (*IPV4, error) {
|
|
resp, err := s.GetResponsePaginate(s.computeAPI, fmt.Sprintf("ips/%s", ipID), url.Values{})
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
defer resp.Body.Close()
|
|
|
|
body, err := s.handleHTTPError([]int{http.StatusOK}, resp)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
var ip GetIP
|
|
|
|
if err = json.Unmarshal(body, &ip); err != nil {
|
|
return nil, err
|
|
}
|
|
return &ip.IP, nil
|
|
}
|
|
|
|
type UpdateIPRequest struct {
|
|
ID string
|
|
Reverse string
|
|
}
|
|
|
|
func (s *API) UpdateIP(req UpdateIPRequest) (*IPV4, error) {
|
|
var update struct {
|
|
Address string `json:"address"`
|
|
ID string `json:"id"`
|
|
Reverse *string `json:"reverse"`
|
|
Organization string `json:"organization"`
|
|
Server *string `json:"server"`
|
|
}
|
|
|
|
ip, err := s.GetIP(req.ID)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
update.Address = ip.Address
|
|
update.ID = ip.ID
|
|
update.Organization = ip.Organization
|
|
update.Server = nil
|
|
if ip.Server != nil {
|
|
update.Server = &ip.Server.Identifier
|
|
}
|
|
update.Reverse = nil
|
|
if req.Reverse != "" {
|
|
update.Reverse = &req.Reverse
|
|
}
|
|
resp, err := s.PutResponse(s.computeAPI, fmt.Sprintf("ips/%s", req.ID), update)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
body, err := s.handleHTTPError([]int{http.StatusOK}, resp)
|
|
var data GetIP
|
|
|
|
if err = json.Unmarshal(body, &data); err != nil {
|
|
return nil, err
|
|
}
|
|
return &data.IP, nil
|
|
}
|
|
|
|
// GetIPS returns a GetIPS
|
|
func (s *API) GetIPS() ([]IPV4, error) {
|
|
resp, err := s.GetResponsePaginate(s.computeAPI, "ips", url.Values{})
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
defer resp.Body.Close()
|
|
|
|
body, err := s.handleHTTPError([]int{http.StatusOK}, resp)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
var ips GetIPS
|
|
|
|
if err = json.Unmarshal(body, &ips); err != nil {
|
|
return nil, err
|
|
}
|
|
return ips.IPS, nil
|
|
}
|
|
|
|
// CreateIP returns a new IP
|
|
func (s *API) CreateIP() (*IPV4, error) {
|
|
var orga struct {
|
|
Organization string `json:"organization"`
|
|
}
|
|
orga.Organization = s.Organization
|
|
resp, err := s.PostResponse(s.computeAPI, "ips", orga)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
defer resp.Body.Close()
|
|
|
|
body, err := s.handleHTTPError([]int{http.StatusCreated}, resp)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
var ip GetIP
|
|
|
|
if err = json.Unmarshal(body, &ip); err != nil {
|
|
return nil, err
|
|
}
|
|
return &ip.IP, nil
|
|
}
|
|
|
|
// AttachIP attachs an IP to a server
|
|
func (s *API) AttachIP(ipID, serverID string) error {
|
|
var update struct {
|
|
Address string `json:"address"`
|
|
ID string `json:"id"`
|
|
Reverse *string `json:"reverse"`
|
|
Organization string `json:"organization"`
|
|
Server string `json:"server"`
|
|
}
|
|
|
|
ip, err := s.GetIP(ipID)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
update.Address = ip.Address
|
|
update.ID = ip.ID
|
|
update.Organization = ip.Organization
|
|
update.Server = serverID
|
|
resp, err := s.PutResponse(s.computeAPI, fmt.Sprintf("ips/%s", ipID), update)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
_, err = s.handleHTTPError([]int{http.StatusOK}, resp)
|
|
return err
|
|
}
|
|
|
|
// DetachIP detaches an IP from a server
|
|
func (s *API) DetachIP(ipID string) error {
|
|
ip, err := s.GetIP(ipID)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
ip.Server = nil
|
|
resp, err := s.PutResponse(s.computeAPI, fmt.Sprintf("ips/%s", ipID), ip)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
defer resp.Body.Close()
|
|
_, err = s.handleHTTPError([]int{http.StatusOK}, resp)
|
|
return err
|
|
}
|
|
|
|
// DeleteIP deletes an IP
|
|
func (s *API) DeleteIP(ipID string) error {
|
|
resp, err := s.DeleteResponse(s.computeAPI, fmt.Sprintf("ips/%s", ipID))
|
|
if err != nil {
|
|
return err
|
|
}
|
|
defer resp.Body.Close()
|
|
_, err = s.handleHTTPError([]int{http.StatusNoContent}, resp)
|
|
return err
|
|
}
|