open-consul/vendor/github.com/nicolai86/scaleway-sdk/ip.go
2019-03-26 17:50:42 -04: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
}