mirror of https://github.com/hashicorp/consul
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
|
||
|
}
|