forked from TrueCloudLab/lego
120 lines
2.8 KiB
Go
120 lines
2.8 KiB
Go
package govultr
|
|
|
|
import (
|
|
"context"
|
|
"net"
|
|
"net/http"
|
|
"net/url"
|
|
"strconv"
|
|
)
|
|
|
|
// NetworkService is the interface to interact with the network endpoints on the Vultr API
|
|
// Link: https://www.vultr.com/api/#network
|
|
type NetworkService interface {
|
|
Create(ctx context.Context, regionID, description, cidrBlock string) (*Network, error)
|
|
Delete(ctx context.Context, networkID string) error
|
|
List(ctx context.Context) ([]Network, error)
|
|
}
|
|
|
|
// NetworkServiceHandler handles interaction with the network methods for the Vultr API
|
|
type NetworkServiceHandler struct {
|
|
client *Client
|
|
}
|
|
|
|
// Network represents a Vultr private network
|
|
type Network struct {
|
|
NetworkID string `json:"NETWORKID"`
|
|
RegionID string `json:"DCID"`
|
|
Description string `json:"description"`
|
|
V4Subnet string `json:"v4_subnet"`
|
|
V4SubnetMask int `json:"v4_subnet_mask"`
|
|
DateCreated string `json:"date_created"`
|
|
}
|
|
|
|
// Create a new private network. A private network can only be used at the location for which it was created.
|
|
func (n *NetworkServiceHandler) Create(ctx context.Context, regionID, description, cidrBlock string) (*Network, error) {
|
|
|
|
uri := "/v1/network/create"
|
|
|
|
values := url.Values{
|
|
"DCID": {regionID},
|
|
}
|
|
|
|
// Optional
|
|
if cidrBlock != "" {
|
|
_, ipNet, err := net.ParseCIDR(cidrBlock)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
if v4Subnet := ipNet.IP.To4(); v4Subnet != nil {
|
|
values.Add("v4_subnet", v4Subnet.String())
|
|
}
|
|
mask, _ := ipNet.Mask.Size()
|
|
values.Add("v4_subnet_mask", strconv.Itoa(mask))
|
|
}
|
|
|
|
if description != "" {
|
|
values.Add("description", description)
|
|
}
|
|
|
|
req, err := n.client.NewRequest(ctx, http.MethodPost, uri, values)
|
|
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
network := new(Network)
|
|
err = n.client.DoWithContext(ctx, req, network)
|
|
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
return network, nil
|
|
}
|
|
|
|
// Delete a private network. Before deleting, a network must be disabled from all instances. See https://www.vultr.com/api/#server_private_network_disable
|
|
func (n *NetworkServiceHandler) Delete(ctx context.Context, networkID string) error {
|
|
uri := "/v1/network/destroy"
|
|
|
|
values := url.Values{
|
|
"NETWORKID": {networkID},
|
|
}
|
|
|
|
req, err := n.client.NewRequest(ctx, http.MethodPost, uri, values)
|
|
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
err = n.client.DoWithContext(ctx, req, nil)
|
|
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
return nil
|
|
}
|
|
|
|
// List lists all private networks on the current account
|
|
func (n *NetworkServiceHandler) List(ctx context.Context) ([]Network, error) {
|
|
uri := "/v1/network/list"
|
|
|
|
req, err := n.client.NewRequest(ctx, http.MethodGet, uri, nil)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
var networkMap map[string]Network
|
|
err = n.client.DoWithContext(ctx, req, &networkMap)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
var networks []Network
|
|
for _, network := range networkMap {
|
|
networks = append(networks, network)
|
|
}
|
|
|
|
return networks, nil
|
|
}
|