reserved_ip.go raw

   1  package govultr
   2  
   3  import (
   4  	"context"
   5  	"fmt"
   6  	"net/http"
   7  
   8  	"github.com/google/go-querystring/query"
   9  )
  10  
  11  const ripPath = "/v2/reserved-ips"
  12  
  13  // ReservedIPService is the interface to interact with the reserved IP endpoints on the Vultr API
  14  // Link : https://www.vultr.com/api/#tag/reserved-ip
  15  type ReservedIPService interface {
  16  	Create(ctx context.Context, ripCreate *ReservedIPReq) (*ReservedIP, *http.Response, error)
  17  	Update(ctx context.Context, id string, ripUpdate *ReservedIPUpdateReq) (*ReservedIP, *http.Response, error)
  18  	Get(ctx context.Context, id string) (*ReservedIP, *http.Response, error)
  19  	Delete(ctx context.Context, id string) error
  20  	List(ctx context.Context, options *ListOptions) ([]ReservedIP, *Meta, *http.Response, error)
  21  
  22  	Convert(ctx context.Context, ripConvert *ReservedIPConvertReq) (*ReservedIP, *http.Response, error)
  23  	Attach(ctx context.Context, id, instance string) error
  24  	Detach(ctx context.Context, id string) error
  25  }
  26  
  27  // ReservedIPServiceHandler handles interaction with the reserved IP methods for the Vultr API
  28  type ReservedIPServiceHandler struct {
  29  	client *Client
  30  }
  31  
  32  // ReservedIP represents an reserved IP on Vultr
  33  type ReservedIP struct {
  34  	ID         string `json:"id"`
  35  	Region     string `json:"region"`
  36  	IPType     string `json:"ip_type"`
  37  	Subnet     string `json:"subnet"`
  38  	SubnetSize int    `json:"subnet_size"`
  39  	Label      string `json:"label"`
  40  	InstanceID string `json:"instance_id"`
  41  }
  42  
  43  // ReservedIPReq represents the parameters for creating a new Reserved IP on Vultr
  44  type ReservedIPReq struct {
  45  	Region     string `json:"region,omitempty"`
  46  	IPType     string `json:"ip_type,omitempty"`
  47  	IPAddress  string `json:"ip_address,omitempty"`
  48  	Label      string `json:"label,omitempty"`
  49  	InstanceID string `json:"instance_id,omitempty"`
  50  }
  51  
  52  // ReservedIPUpdateReq represents the parameters for updating a Reserved IP on Vultr
  53  type ReservedIPUpdateReq struct {
  54  	Label *string `json:"label"`
  55  }
  56  
  57  type reservedIPsBase struct {
  58  	ReservedIPs []ReservedIP `json:"reserved_ips"`
  59  	Meta        *Meta        `json:"meta"`
  60  }
  61  
  62  type reservedIPBase struct {
  63  	ReservedIP *ReservedIP `json:"reserved_ip"`
  64  }
  65  
  66  // ReservedIPConvertReq is the struct used for create and update calls.
  67  type ReservedIPConvertReq struct {
  68  	IPAddress string `json:"ip_address,omitempty"`
  69  	Label     string `json:"label,omitempty"`
  70  }
  71  
  72  // Create adds the specified reserved IP to your Vultr account
  73  func (r *ReservedIPServiceHandler) Create(ctx context.Context, ripCreate *ReservedIPReq) (*ReservedIP, *http.Response, error) {
  74  	req, err := r.client.NewRequest(ctx, http.MethodPost, ripPath, ripCreate)
  75  	if err != nil {
  76  		return nil, nil, err
  77  	}
  78  
  79  	rip := new(reservedIPBase)
  80  	resp, err := r.client.DoWithContext(ctx, req, rip)
  81  	if err != nil {
  82  		return nil, resp, err
  83  	}
  84  
  85  	return rip.ReservedIP, resp, nil
  86  }
  87  
  88  // Update updates label on the Reserved IP
  89  func (r *ReservedIPServiceHandler) Update(ctx context.Context, id string, ripUpdate *ReservedIPUpdateReq) (*ReservedIP, *http.Response, error) { //nolint:lll
  90  	uri := fmt.Sprintf("%s/%s", ripPath, id)
  91  	req, err := r.client.NewRequest(ctx, http.MethodPatch, uri, ripUpdate)
  92  	if err != nil {
  93  		return nil, nil, err
  94  	}
  95  
  96  	rip := new(reservedIPBase)
  97  	resp, err := r.client.DoWithContext(ctx, req, rip)
  98  	if err != nil {
  99  		return nil, resp, err
 100  	}
 101  
 102  	return rip.ReservedIP, resp, nil
 103  }
 104  
 105  // Get gets the reserved IP associated with provided ID
 106  func (r *ReservedIPServiceHandler) Get(ctx context.Context, id string) (*ReservedIP, *http.Response, error) {
 107  	uri := fmt.Sprintf("%s/%s", ripPath, id)
 108  	req, err := r.client.NewRequest(ctx, http.MethodGet, uri, nil)
 109  	if err != nil {
 110  		return nil, nil, err
 111  	}
 112  
 113  	rip := new(reservedIPBase)
 114  	resp, err := r.client.DoWithContext(ctx, req, rip)
 115  	if err != nil {
 116  		return nil, resp, err
 117  	}
 118  
 119  	return rip.ReservedIP, resp, nil
 120  }
 121  
 122  // Delete removes the specified reserved IP from your Vultr account
 123  func (r *ReservedIPServiceHandler) Delete(ctx context.Context, id string) error {
 124  	uri := fmt.Sprintf("%s/%s", ripPath, id)
 125  	req, err := r.client.NewRequest(ctx, http.MethodDelete, uri, nil)
 126  	if err != nil {
 127  		return err
 128  	}
 129  
 130  	_, err = r.client.DoWithContext(ctx, req, nil)
 131  	return err
 132  }
 133  
 134  // List lists all the reserved IPs associated with your Vultr account
 135  func (r *ReservedIPServiceHandler) List(ctx context.Context, options *ListOptions) ([]ReservedIP, *Meta, *http.Response, error) { //nolint:dupl,lll
 136  	req, err := r.client.NewRequest(ctx, http.MethodGet, ripPath, nil)
 137  	if err != nil {
 138  		return nil, nil, nil, err
 139  	}
 140  
 141  	newValues, err := query.Values(options)
 142  	if err != nil {
 143  		return nil, nil, nil, err
 144  	}
 145  
 146  	req.URL.RawQuery = newValues.Encode()
 147  
 148  	ips := new(reservedIPsBase)
 149  	resp, err := r.client.DoWithContext(ctx, req, ips)
 150  	if err != nil {
 151  		return nil, nil, resp, err
 152  	}
 153  
 154  	return ips.ReservedIPs, ips.Meta, resp, nil
 155  }
 156  
 157  // Convert an existing IP on a subscription to a reserved IP.
 158  func (r *ReservedIPServiceHandler) Convert(ctx context.Context, ripConvert *ReservedIPConvertReq) (*ReservedIP, *http.Response, error) {
 159  	uri := fmt.Sprintf("%s/convert", ripPath)
 160  	req, err := r.client.NewRequest(ctx, http.MethodPost, uri, ripConvert)
 161  
 162  	if err != nil {
 163  		return nil, nil, err
 164  	}
 165  
 166  	rip := new(reservedIPBase)
 167  	resp, err := r.client.DoWithContext(ctx, req, rip)
 168  	if err != nil {
 169  		return nil, resp, err
 170  	}
 171  
 172  	return rip.ReservedIP, resp, nil
 173  }
 174  
 175  // Attach a reserved IP to an existing subscription
 176  func (r *ReservedIPServiceHandler) Attach(ctx context.Context, id, instance string) error {
 177  	uri := fmt.Sprintf("%s/%s/attach", ripPath, id)
 178  	reqBody := RequestBody{"instance_id": instance}
 179  	req, err := r.client.NewRequest(ctx, http.MethodPost, uri, reqBody)
 180  	if err != nil {
 181  		return err
 182  	}
 183  	_, err = r.client.DoWithContext(ctx, req, nil)
 184  	return err
 185  }
 186  
 187  // Detach a reserved IP from an existing subscription.
 188  func (r *ReservedIPServiceHandler) Detach(ctx context.Context, id string) error {
 189  	uri := fmt.Sprintf("%s/%s/detach", ripPath, id)
 190  	req, err := r.client.NewRequest(ctx, http.MethodPost, uri, nil)
 191  	if err != nil {
 192  		return err
 193  	}
 194  	_, err = r.client.DoWithContext(ctx, req, nil)
 195  	return err
 196  }
 197