cloudflare/cloudflared

Public

mirrored from https://github.com/cloudflare/cloudflaredAvailable

CodeCommitsIssuesPull requestsActionsInsightsSecurity
2023.10.0

Branches

Tags

  • No tags available.
0Branches0Tags
Go to file
Add file
Code

Clone

HTTPS

Download ZIP

cfapi/virtual_network.go

134lines · modecode

1package cfapi
2
3import (
4 "fmt"
5 "io"
6 "net/http"
7 "net/url"
8 "path"
9 "strconv"
10 "time"
11
12 "github.com/google/uuid"
13 "github.com/pkg/errors"
14)
15
16type NewVirtualNetwork struct {
17 Name string `json:"name"`
18 Comment string `json:"comment"`
19 IsDefault bool `json:"is_default"`
20}
21
22type VirtualNetwork struct {
23 ID uuid.UUID `json:"id"`
24 Comment string `json:"comment"`
25 Name string `json:"name"`
26 IsDefault bool `json:"is_default_network"`
27 CreatedAt time.Time `json:"created_at"`
28 DeletedAt time.Time `json:"deleted_at"`
29}
30
31type UpdateVirtualNetwork struct {
32 Name *string `json:"name,omitempty"`
33 Comment *string `json:"comment,omitempty"`
34 IsDefault *bool `json:"is_default_network,omitempty"`
35}
36
37func (virtualNetwork VirtualNetwork) TableString() string {
38 deletedColumn := "-"
39 if !virtualNetwork.DeletedAt.IsZero() {
40 deletedColumn = virtualNetwork.DeletedAt.Format(time.RFC3339)
41 }
42 return fmt.Sprintf(
43 "%s\t%s\t%s\t%s\t%s\t%s\t",
44 virtualNetwork.ID,
45 virtualNetwork.Name,
46 strconv.FormatBool(virtualNetwork.IsDefault),
47 virtualNetwork.Comment,
48 virtualNetwork.CreatedAt.Format(time.RFC3339),
49 deletedColumn,
50 )
51}
52
53func (r *RESTClient) CreateVirtualNetwork(newVnet NewVirtualNetwork) (VirtualNetwork, error) {
54 resp, err := r.sendRequest("POST", r.baseEndpoints.accountVnets, newVnet)
55 if err != nil {
56 return VirtualNetwork{}, errors.Wrap(err, "REST request failed")
57 }
58 defer resp.Body.Close()
59
60 if resp.StatusCode == http.StatusOK {
61 return parseVnet(resp.Body)
62 }
63
64 return VirtualNetwork{}, r.statusCodeToError("add virtual network", resp)
65}
66
67func (r *RESTClient) ListVirtualNetworks(filter *VnetFilter) ([]*VirtualNetwork, error) {
68 endpoint := r.baseEndpoints.accountVnets
69 endpoint.RawQuery = filter.Encode()
70 resp, err := r.sendRequest("GET", endpoint, nil)
71 if err != nil {
72 return nil, errors.Wrap(err, "REST request failed")
73 }
74 defer resp.Body.Close()
75
76 if resp.StatusCode == http.StatusOK {
77 return parseListVnets(resp.Body)
78 }
79
80 return nil, r.statusCodeToError("list virtual networks", resp)
81}
82
83func (r *RESTClient) DeleteVirtualNetwork(id uuid.UUID, force bool) error {
84 endpoint := r.baseEndpoints.accountVnets
85 endpoint.Path = path.Join(endpoint.Path, url.PathEscape(id.String()))
86
87 queryParams := url.Values{}
88 if force {
89 queryParams.Set("force", strconv.FormatBool(force))
90 }
91 endpoint.RawQuery = queryParams.Encode()
92
93 resp, err := r.sendRequest("DELETE", endpoint, nil)
94 if err != nil {
95 return errors.Wrap(err, "REST request failed")
96 }
97 defer resp.Body.Close()
98
99 if resp.StatusCode == http.StatusOK {
100 _, err := parseVnet(resp.Body)
101 return err
102 }
103
104 return r.statusCodeToError("delete virtual network", resp)
105}
106
107func (r *RESTClient) UpdateVirtualNetwork(id uuid.UUID, updates UpdateVirtualNetwork) error {
108 endpoint := r.baseEndpoints.accountVnets
109 endpoint.Path = path.Join(endpoint.Path, url.PathEscape(id.String()))
110 resp, err := r.sendRequest("PATCH", endpoint, updates)
111 if err != nil {
112 return errors.Wrap(err, "REST request failed")
113 }
114 defer resp.Body.Close()
115
116 if resp.StatusCode == http.StatusOK {
117 _, err := parseVnet(resp.Body)
118 return err
119 }
120
121 return r.statusCodeToError("update virtual network", resp)
122}
123
124func parseListVnets(body io.ReadCloser) ([]*VirtualNetwork, error) {
125 var vnets []*VirtualNetwork
126 err := parseResponse(body, &vnets)
127 return vnets, err
128}
129
130func parseVnet(body io.ReadCloser) (VirtualNetwork, error) {
131 var vnet VirtualNetwork
132 err := parseResponse(body, &vnet)
133 return vnet, err
134}
135