firewall_group.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  // FirewallGroupService is the interface to interact with the firewall group endpoints on the Vultr API
  12  // Link : https://www.vultr.com/api/#tag/firewall
  13  type FirewallGroupService interface { //nolint:dupl
  14  	Create(ctx context.Context, fwGroupReq *FirewallGroupReq) (*FirewallGroup, *http.Response, error)
  15  	Get(ctx context.Context, groupID string) (*FirewallGroup, *http.Response, error)
  16  	Update(ctx context.Context, fwGroupID string, fwGroupReq *FirewallGroupReq) error
  17  	Delete(ctx context.Context, fwGroupID string) error
  18  	List(ctx context.Context, options *ListOptions) ([]FirewallGroup, *Meta, *http.Response, error)
  19  }
  20  
  21  // FireWallGroupServiceHandler handles interaction with the firewall group methods for the Vultr API
  22  type FireWallGroupServiceHandler struct {
  23  	client *Client
  24  }
  25  
  26  // FirewallGroup represents a Vultr firewall group
  27  type FirewallGroup struct {
  28  	ID            string `json:"id"`
  29  	Description   string `json:"description"`
  30  	DateCreated   string `json:"date_created"`
  31  	DateModified  string `json:"date_modified"`
  32  	InstanceCount int    `json:"instance_count"`
  33  	RuleCount     int    `json:"rule_count"`
  34  	MaxRuleCount  int    `json:"max_rule_count"`
  35  }
  36  
  37  // FirewallGroupReq struct is used to create and update a Firewall Group.
  38  type FirewallGroupReq struct {
  39  	Description string `json:"description"`
  40  }
  41  
  42  type firewallGroupsBase struct {
  43  	FirewallGroups []FirewallGroup `json:"firewall_groups"`
  44  	Meta           *Meta           `json:"meta"`
  45  }
  46  
  47  type firewallGroupBase struct {
  48  	FirewallGroup *FirewallGroup `json:"firewall_group"`
  49  }
  50  
  51  // Create will create a new firewall group on your Vultr account
  52  func (f *FireWallGroupServiceHandler) Create(ctx context.Context, fwGroupReq *FirewallGroupReq) (*FirewallGroup, *http.Response, error) {
  53  	uri := "/v2/firewalls"
  54  
  55  	req, err := f.client.NewRequest(ctx, http.MethodPost, uri, fwGroupReq)
  56  	if err != nil {
  57  		return nil, nil, err
  58  	}
  59  
  60  	firewall := new(firewallGroupBase)
  61  	resp, err := f.client.DoWithContext(ctx, req, firewall)
  62  	if err != nil {
  63  		return nil, resp, err
  64  	}
  65  
  66  	return firewall.FirewallGroup, resp, nil
  67  }
  68  
  69  // Get will return a firewall group based on provided groupID from your Vultr account
  70  func (f *FireWallGroupServiceHandler) Get(ctx context.Context, fwGroupID string) (*FirewallGroup, *http.Response, error) {
  71  	uri := fmt.Sprintf("/v2/firewalls/%s", fwGroupID)
  72  
  73  	req, err := f.client.NewRequest(ctx, http.MethodGet, uri, nil)
  74  	if err != nil {
  75  		return nil, nil, err
  76  	}
  77  
  78  	firewall := new(firewallGroupBase)
  79  	resp, err := f.client.DoWithContext(ctx, req, firewall)
  80  	if err != nil {
  81  		return nil, resp, err
  82  	}
  83  
  84  	return firewall.FirewallGroup, resp, nil
  85  }
  86  
  87  // Update will change the description of a firewall group
  88  func (f *FireWallGroupServiceHandler) Update(ctx context.Context, fwGroupID string, fwGroupReq *FirewallGroupReq) error {
  89  	uri := fmt.Sprintf("/v2/firewalls/%s", fwGroupID)
  90  
  91  	req, err := f.client.NewRequest(ctx, http.MethodPut, uri, fwGroupReq)
  92  	if err != nil {
  93  		return err
  94  	}
  95  
  96  	_, err = f.client.DoWithContext(ctx, req, nil)
  97  	return err
  98  }
  99  
 100  // Delete will delete a firewall group from your Vultr account
 101  func (f *FireWallGroupServiceHandler) Delete(ctx context.Context, fwGroupID string) error {
 102  	uri := fmt.Sprintf("/v2/firewalls/%s", fwGroupID)
 103  
 104  	req, err := f.client.NewRequest(ctx, http.MethodDelete, uri, nil)
 105  	if err != nil {
 106  		return err
 107  	}
 108  	_, err = f.client.DoWithContext(ctx, req, nil)
 109  	return err
 110  }
 111  
 112  // List will return a list of  all firewall groups on your Vultr account
 113  func (f *FireWallGroupServiceHandler) List(ctx context.Context, options *ListOptions) ([]FirewallGroup, *Meta, *http.Response, error) { //nolint:dupl,lll
 114  	uri := "/v2/firewalls"
 115  
 116  	req, err := f.client.NewRequest(ctx, http.MethodGet, uri, nil)
 117  	if err != nil {
 118  		return nil, nil, nil, err
 119  	}
 120  
 121  	newValues, err := query.Values(options)
 122  	if err != nil {
 123  		return nil, nil, nil, err
 124  	}
 125  
 126  	req.URL.RawQuery = newValues.Encode()
 127  
 128  	firewalls := new(firewallGroupsBase)
 129  	resp, err := f.client.DoWithContext(ctx, req, firewalls)
 130  	if err != nil {
 131  		return nil, nil, resp, err
 132  	}
 133  
 134  	return firewalls.FirewallGroups, firewalls.Meta, resp, nil
 135  }
 136