Skip to content

Commit

Permalink
Migrated nodebalancer_firewalls to object_storage_clusters to request…
Browse files Browse the repository at this point in the history
… helpers (#544)

* Migrated nodebalancer_firewalls to object_storage_clusters and reran fixtures"

* Fix

* Fix
  • Loading branch information
ezilber-akamai authored Jul 11, 2024
1 parent ea893ef commit aa85919
Show file tree
Hide file tree
Showing 18 changed files with 431 additions and 396 deletions.
30 changes: 2 additions & 28 deletions nodebalancer_firewalls.go
Original file line number Diff line number Diff line change
Expand Up @@ -2,40 +2,14 @@ package linodego

import (
"context"
"fmt"

"github.com/go-resty/resty/v2"
)

// NodeBalancerFirewallsPagedResponse represents a Linode API response for listing of Cloud Firewalls
type NodeBalancerFirewallsPagedResponse struct {
*PageOptions
Data []Firewall `json:"data"`
}

func (NodeBalancerFirewallsPagedResponse) endpoint(ids ...any) string {
id := ids[0].(int)
return fmt.Sprintf("nodebalancers/%d/firewalls", id)
}

func (resp *NodeBalancerFirewallsPagedResponse) castResult(r *resty.Request, e string) (int, int, error) {
res, err := coupleAPIErrors(r.SetResult(NodeBalancerFirewallsPagedResponse{}).Get(e))
if err != nil {
return 0, 0, err
}
castedRes := res.Result().(*NodeBalancerFirewallsPagedResponse)
resp.Data = append(resp.Data, castedRes.Data...)
return castedRes.Pages, castedRes.Results, nil
}

// ListNodeBalancerFirewalls returns a paginated list of Cloud Firewalls for nodebalancerID
func (c *Client) ListNodeBalancerFirewalls(ctx context.Context, nodebalancerID int, opts *ListOptions) ([]Firewall, error) {
response := NodeBalancerFirewallsPagedResponse{}

err := c.listHelper(ctx, &response, opts, nodebalancerID)
response, err := getPaginatedResults[Firewall](ctx, c, formatAPIPath("nodebalancers/%d/firewalls", nodebalancerID), opts)
if err != nil {
return nil, err
}

return response.Data, nil
return response, nil
}
8 changes: 3 additions & 5 deletions nodebalancer_stats.go
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,6 @@ package linodego

import (
"context"
"fmt"
)

// NodeBalancerStats represents a nodebalancer stats object
Expand All @@ -25,12 +24,11 @@ type StatsTraffic struct {

// GetNodeBalancerStats gets the template with the provided ID
func (c *Client) GetNodeBalancerStats(ctx context.Context, nodebalancerID int) (*NodeBalancerStats, error) {
e := fmt.Sprintf("nodebalancers/%d/stats", nodebalancerID)
req := c.R(ctx).SetResult(&NodeBalancerStats{})
r, err := coupleAPIErrors(req.Get(e))
e := formatAPIPath("nodebalancers/%d/stats", nodebalancerID)
response, err := doGETRequest[NodeBalancerStats](ctx, c, e)
if err != nil {
return nil, err
}

return r.Result().(*NodeBalancerStats), nil
return response, nil
}
7 changes: 3 additions & 4 deletions object_storage.go
Original file line number Diff line number Diff line change
Expand Up @@ -12,18 +12,17 @@ type ObjectStorageTransfer struct {
// CancelObjectStorage cancels and removes all object storage from the Account
func (c *Client) CancelObjectStorage(ctx context.Context) error {
e := "object-storage/cancel"
_, err := coupleAPIErrors(c.R(ctx).Post(e))
_, err := doPOSTRequest[any, any](ctx, c, e)
return err
}

// GetObjectStorageTransfer returns the amount of outbound data transferred used by the Account
func (c *Client) GetObjectStorageTransfer(ctx context.Context) (*ObjectStorageTransfer, error) {
e := "object-storage/transfer"
req := c.R(ctx).SetResult(&ObjectStorageTransfer{})
r, err := coupleAPIErrors(req.Get(e))
response, err := doGETRequest[ObjectStorageTransfer](ctx, c, e)
if err != nil {
return nil, err
}

return r.Result().(*ObjectStorageTransfer), nil
return response, nil
}
32 changes: 9 additions & 23 deletions object_storage_bucket_certs.go
Original file line number Diff line number Diff line change
Expand Up @@ -2,9 +2,6 @@ package linodego

import (
"context"
"encoding/json"
"fmt"
"net/url"
)

type ObjectStorageBucketCert struct {
Expand All @@ -18,40 +15,29 @@ type ObjectStorageBucketCertUploadOptions struct {

// UploadObjectStorageBucketCert uploads a TLS/SSL Cert to be used with an Object Storage Bucket.
func (c *Client) UploadObjectStorageBucketCert(ctx context.Context, clusterOrRegionID, bucket string, opts ObjectStorageBucketCertUploadOptions) (*ObjectStorageBucketCert, error) {
body, err := json.Marshal(opts)
e := formatAPIPath("object-storage/buckets/%s/%s/ssl", clusterOrRegionID, bucket)
response, err := doPOSTRequest[ObjectStorageBucketCert](ctx, c, e, opts)
if err != nil {
return nil, err
}

clusterOrRegionID = url.PathEscape(clusterOrRegionID)
bucket = url.PathEscape(bucket)
e := fmt.Sprintf("object-storage/buckets/%s/%s/ssl", clusterOrRegionID, bucket)
req := c.R(ctx).SetResult(&ObjectStorageBucketCert{}).SetBody(string(body))
r, err := coupleAPIErrors(req.Post(e))
if err != nil {
return nil, err
}
return r.Result().(*ObjectStorageBucketCert), nil
return response, nil
}

// GetObjectStorageBucketCert gets an ObjectStorageBucketCert
func (c *Client) GetObjectStorageBucketCert(ctx context.Context, clusterOrRegionID, bucket string) (*ObjectStorageBucketCert, error) {
clusterOrRegionID = url.PathEscape(clusterOrRegionID)
bucket = url.PathEscape(bucket)
e := fmt.Sprintf("object-storage/buckets/%s/%s/ssl", clusterOrRegionID, bucket)
req := c.R(ctx).SetResult(&ObjectStorageBucketCert{})
r, err := coupleAPIErrors(req.Get(e))
e := formatAPIPath("object-storage/buckets/%s/%s/ssl", clusterOrRegionID, bucket)
response, err := doGETRequest[ObjectStorageBucketCert](ctx, c, e)
if err != nil {
return nil, err
}
return r.Result().(*ObjectStorageBucketCert), nil

return response, nil
}

// DeleteObjectStorageBucketCert deletes an ObjectStorageBucketCert
func (c *Client) DeleteObjectStorageBucketCert(ctx context.Context, clusterOrRegionID, bucket string) error {
clusterOrRegionID = url.PathEscape(clusterOrRegionID)
bucket = url.PathEscape(bucket)
e := fmt.Sprintf("object-storage/buckets/%s/%s/ssl", clusterOrRegionID, bucket)
_, err := coupleAPIErrors(c.R(ctx).Delete(e))
e := formatAPIPath("object-storage/buckets/%s/%s/ssl", clusterOrRegionID, bucket)
err := doDELETERequest(ctx, c, e)
return err
}
91 changes: 21 additions & 70 deletions object_storage_buckets.go
Original file line number Diff line number Diff line change
Expand Up @@ -3,11 +3,8 @@ package linodego
import (
"context"
"encoding/json"
"fmt"
"net/url"
"time"

"github.com/go-resty/resty/v2"
"github.com/linode/linodego/internal/parseabletime"
)

Expand Down Expand Up @@ -90,116 +87,70 @@ const (
ACLPublicReadWrite ObjectStorageACL = "public-read-write"
)

// ObjectStorageBucketsPagedResponse represents a paginated ObjectStorageBucket API response
type ObjectStorageBucketsPagedResponse struct {
*PageOptions
Data []ObjectStorageBucket `json:"data"`
}

// endpoint gets the endpoint URL for ObjectStorageBucket
func (ObjectStorageBucketsPagedResponse) endpoint(args ...any) string {
endpoint := "object-storage/buckets"
if len(args) > 0 {
endpoint = fmt.Sprintf(endpoint+"/%s", url.PathEscape(args[0].(string)))
}
return endpoint
}

func (resp *ObjectStorageBucketsPagedResponse) castResult(r *resty.Request, e string) (int, int, error) {
res, err := coupleAPIErrors(r.SetResult(ObjectStorageBucketsPagedResponse{}).Get(e))
if err != nil {
return 0, 0, err
}
castedRes := res.Result().(*ObjectStorageBucketsPagedResponse)
resp.Data = append(resp.Data, castedRes.Data...)
return castedRes.Pages, castedRes.Results, nil
}

// ListObjectStorageBuckets lists ObjectStorageBuckets
func (c *Client) ListObjectStorageBuckets(ctx context.Context, opts *ListOptions) ([]ObjectStorageBucket, error) {
response := ObjectStorageBucketsPagedResponse{}
err := c.listHelper(ctx, &response, opts)
response, err := getPaginatedResults[ObjectStorageBucket](ctx, c, "object-storage/buckets", opts)
if err != nil {
return nil, err
}
return response.Data, nil

return response, nil
}

// ListObjectStorageBucketsInCluster lists all ObjectStorageBuckets of a cluster
func (c *Client) ListObjectStorageBucketsInCluster(ctx context.Context, opts *ListOptions, clusterOrRegionID string) ([]ObjectStorageBucket, error) {
response := ObjectStorageBucketsPagedResponse{}
err := c.listHelper(ctx, &response, opts, clusterOrRegionID)
response, err := getPaginatedResults[ObjectStorageBucket](ctx, c, formatAPIPath("object-storage/buckets/%s", clusterOrRegionID), opts)
if err != nil {
return nil, err
}
return response.Data, nil

return response, nil
}

// GetObjectStorageBucket gets the ObjectStorageBucket with the provided label
func (c *Client) GetObjectStorageBucket(ctx context.Context, clusterOrRegionID, label string) (*ObjectStorageBucket, error) {
label = url.PathEscape(label)
clusterOrRegionID = url.PathEscape(clusterOrRegionID)
e := fmt.Sprintf("object-storage/buckets/%s/%s", clusterOrRegionID, label)
req := c.R(ctx).SetResult(&ObjectStorageBucket{})
r, err := coupleAPIErrors(req.Get(e))
e := formatAPIPath("object-storage/buckets/%s/%s", clusterOrRegionID, label)
response, err := doGETRequest[ObjectStorageBucket](ctx, c, e)
if err != nil {
return nil, err
}
return r.Result().(*ObjectStorageBucket), nil

return response, nil
}

// CreateObjectStorageBucket creates an ObjectStorageBucket
func (c *Client) CreateObjectStorageBucket(ctx context.Context, opts ObjectStorageBucketCreateOptions) (*ObjectStorageBucket, error) {
body, err := json.Marshal(opts)
if err != nil {
return nil, err
}

e := "object-storage/buckets"
req := c.R(ctx).SetResult(&ObjectStorageBucket{}).SetBody(string(body))
r, err := coupleAPIErrors(req.Post(e))
response, err := doPOSTRequest[ObjectStorageBucket](ctx, c, e, opts)
if err != nil {
return nil, err
}
return r.Result().(*ObjectStorageBucket), nil

return response, nil
}

// GetObjectStorageBucketAccess gets the current access config for a bucket
func (c *Client) GetObjectStorageBucketAccess(ctx context.Context, clusterOrRegionID, label string) (*ObjectStorageBucketAccess, error) {
label = url.PathEscape(label)
clusterOrRegionID = url.PathEscape(clusterOrRegionID)
e := fmt.Sprintf("object-storage/buckets/%s/%s/access", clusterOrRegionID, label)
req := c.R(ctx).SetResult(&ObjectStorageBucketAccess{})
r, err := coupleAPIErrors(req.Get(e))
e := formatAPIPath("object-storage/buckets/%s/%s/access", clusterOrRegionID, label)
response, err := doGETRequest[ObjectStorageBucketAccess](ctx, c, e)
if err != nil {
return nil, err
}

return r.Result().(*ObjectStorageBucketAccess), nil
return response, nil
}

// UpdateObjectStorageBucketAccess updates the access configuration for an ObjectStorageBucket
func (c *Client) UpdateObjectStorageBucketAccess(ctx context.Context, clusterOrRegionID, label string, opts ObjectStorageBucketUpdateAccessOptions) error {
body, err := json.Marshal(opts)
if err != nil {
return err
}
e := formatAPIPath("object-storage/buckets/%s/%s/access", clusterOrRegionID, label)
_, err := doPOSTRequest[ObjectStorageBucketAccess](ctx, c, e, opts)

label = url.PathEscape(label)
clusterOrRegionID = url.PathEscape(clusterOrRegionID)
e := fmt.Sprintf("object-storage/buckets/%s/%s/access", clusterOrRegionID, label)
_, err = coupleAPIErrors(c.R(ctx).SetBody(string(body)).Post(e))
if err != nil {
return err
}

return nil
return err
}

// DeleteObjectStorageBucket deletes the ObjectStorageBucket with the specified label
func (c *Client) DeleteObjectStorageBucket(ctx context.Context, clusterOrRegionID, label string) error {
label = url.PathEscape(label)
e := fmt.Sprintf("object-storage/buckets/%s/%s", clusterOrRegionID, label)
_, err := coupleAPIErrors(c.R(ctx).Delete(e))
e := formatAPIPath("object-storage/buckets/%s/%s", clusterOrRegionID, label)
err := doDELETERequest(ctx, c, e)
return err
}
41 changes: 7 additions & 34 deletions object_storage_clusters.go
Original file line number Diff line number Diff line change
Expand Up @@ -2,10 +2,6 @@ package linodego

import (
"context"
"fmt"
"net/url"

"github.com/go-resty/resty/v2"
)

// ObjectStorageCluster represents a linode object storage cluster object
Expand All @@ -17,47 +13,24 @@ type ObjectStorageCluster struct {
StaticSiteDomain string `json:"static_site_domain"`
}

// ObjectStorageClustersPagedResponse represents a linode API response for listing
type ObjectStorageClustersPagedResponse struct {
*PageOptions
Data []ObjectStorageCluster `json:"data"`
}

// endpoint gets the endpoint URL for ObjectStorageCluster
func (ObjectStorageClustersPagedResponse) endpoint(_ ...any) string {
return "object-storage/clusters"
}

func (resp *ObjectStorageClustersPagedResponse) castResult(r *resty.Request, e string) (int, int, error) {
res, err := coupleAPIErrors(r.SetResult(ObjectStorageClustersPagedResponse{}).Get(e))
if err != nil {
return 0, 0, err
}
castedRes := res.Result().(*ObjectStorageClustersPagedResponse)
resp.Data = append(resp.Data, castedRes.Data...)
return castedRes.Pages, castedRes.Results, nil
}

// Deprecated: ListObjectStorageClusters uses a deprecated API endpoint.
// ListObjectStorageClusters lists ObjectStorageClusters
func (c *Client) ListObjectStorageClusters(ctx context.Context, opts *ListOptions) ([]ObjectStorageCluster, error) {
response := ObjectStorageClustersPagedResponse{}
err := c.listHelper(ctx, &response, opts)
response, err := getPaginatedResults[ObjectStorageCluster](ctx, c, "object-storage/clusters", opts)
if err != nil {
return nil, err
}
return response.Data, nil

return response, nil
}

// Deprecated: GetObjectStorageCluster uses a deprecated API endpoint.
// GetObjectStorageCluster gets the template with the provided ID
func (c *Client) GetObjectStorageCluster(ctx context.Context, clusterID string) (*ObjectStorageCluster, error) {
clusterID = url.PathEscape(clusterID)
e := fmt.Sprintf("object-storage/clusters/%s", clusterID)
req := c.R(ctx).SetResult(&ObjectStorageCluster{})
r, err := coupleAPIErrors(req.Get(e))
e := formatAPIPath("object-storage/clusters/%s", clusterID)
response, err := doGETRequest[ObjectStorageCluster](ctx, c, e)
if err != nil {
return nil, err
}
return r.Result().(*ObjectStorageCluster), nil

return response, nil
}
9 changes: 9 additions & 0 deletions paged_response_structs.go
Original file line number Diff line number Diff line change
Expand Up @@ -109,12 +109,21 @@ type NodeBalancerConfigsPagedResponse legacyPagedResponse[NodeBalancerConfig]
// Deprecated: NodeBalancerNodesPagedResponse exists for historical compatibility and should not be used.
type NodeBalancerNodesPagedResponse legacyPagedResponse[NodeBalancerNode]

// Deprecated: NodeBalancerFirewallsPagedResponse exists for historical compatibility and should not be used.
type NodeBalancerFirewallsPagedResponse legacyPagedResponse[Firewall]

// Deprecated: NotificationsPagedResponse exists for historical compatibility and should not be used.
type NotificationsPagedResponse legacyPagedResponse[Notification]

// Deprecated: OAuthClientsPagedResponse exists for historical compatibility and should not be used.
type OAuthClientsPagedResponse legacyPagedResponse[OAuthClient]

// Deprecated: ObjectStorageBucketsPagedResponse exists for historical compatibility and should not be used.
type ObjectStorageBucketsPagedResponse legacyPagedResponse[ObjectStorageBucket]

// Deprecated: ObjectStorageClustersPagedResponse exists for historical compatibility and should not be used.
type ObjectStorageClustersPagedResponse legacyPagedResponse[ObjectStorageCluster]

// Deprecated: PaymentsPagedResponse exists for historical compatibility and should not be used.
type PaymentsPagedResponse legacyPagedResponse[Payment]

Expand Down
Loading

0 comments on commit aa85919

Please sign in to comment.