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