open-nomad/vendor/github.com/nicolai86/scaleway-sdk/ip.go
Seth Hoenig 435c0d9fc8 deps: Switch to Go modules for dependency management
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.
2020-06-02 14:30:36 -05:00

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
}