Skip to content

Commit

Permalink
Ecloud loadbalancer changes (#108)
Browse files Browse the repository at this point in the history
* add vips

* update to reflect API changes
  • Loading branch information
0x4c6565 authored Feb 23, 2022
1 parent a8461cd commit 6828b93
Show file tree
Hide file tree
Showing 11 changed files with 273 additions and 401 deletions.
16 changes: 8 additions & 8 deletions pkg/service/ecloud/error.go
Original file line number Diff line number Diff line change
Expand Up @@ -398,20 +398,20 @@ func (e *LoadBalancerNotFoundError) Error() string {
return fmt.Sprintf("Load balancer not found with ID [%s]", e.ID)
}

// LoadBalancerNetworkNotFoundError indicates a load balancer network was not found
type LoadBalancerNetworkNotFoundError struct {
// LoadBalancerNetworkNotFoundError indicates a load balancer spec was not found
type LoadBalancerSpecNotFoundError struct {
ID string
}

func (e *LoadBalancerNetworkNotFoundError) Error() string {
return fmt.Sprintf("Load balancer network not found with ID [%s]", e.ID)
func (e *LoadBalancerSpecNotFoundError) Error() string {
return fmt.Sprintf("Load balancer spec not found with ID [%s]", e.ID)
}

// LoadBalancerNetworkNotFoundError indicates a load balancer spec was not found
type LoadBalancerSpecNotFoundError struct {
// VIPNotFoundError indicates a load balancer VIP was not found
type VIPNotFoundError struct {
ID string
}

func (e *LoadBalancerSpecNotFoundError) Error() string {
return fmt.Sprintf("Load balancer spec not found with ID [%s]", e.ID)
func (e *VIPNotFoundError) Error() string {
return fmt.Sprintf("Load balancer VIP not found with ID [%s]", e.ID)
}
28 changes: 15 additions & 13 deletions pkg/service/ecloud/model.go
Original file line number Diff line number Diff line change
Expand Up @@ -1085,23 +1085,11 @@ type LoadBalancer struct {
Sync ResourceSync `json:"sync"`
ConfigID int `json:"config_id"`
Nodes int `json:"nodes"`
NetworkID string `json:"network_id"`
CreatedAt connection.DateTime `json:"created_at"`
UpdatedAt connection.DateTime `json:"updated_at"`
}

// LoadBalancerNetwork represents an eCloud loadbalancer network
// +genie:model_response
// +genie:model_paginated
type LoadBalancerNetwork struct {
ID string `json:"id"`
Name string `json:"name"`
LoadBalancerID string `json:"load_balancer_id"`
NetworkID string `json:"network_id"`
Sync ResourceSync `json:"sync"`
CreatedAt connection.DateTime `json:"created_at"`
UpdatedAt connection.DateTime `json:"updated_at"`
}

// LoadBalancerSpec represents an eCloud loadbalancer specification
// +genie:model_response
// +genie:model_paginated
Expand All @@ -1112,3 +1100,17 @@ type LoadBalancerSpec struct {
CreatedAt connection.DateTime `json:"created_at"`
UpdatedAt connection.DateTime `json:"updated_at"`
}

// VIP represents an eCloud load balancer VIP
// +genie:model_response
// +genie:model_paginated
type VIP struct {
ID string `json:"id"`
Name string `json:"name"`
LoadBalancerID string `json:"load_balancer_id"`
IPAddressID string `json:"ip_address_id"`
ConfigID int `json:"config_id"`
Sync ResourceSync `json:"sync"`
CreatedAt connection.DateTime `json:"created_at"`
UpdatedAt connection.DateTime `json:"updated_at"`
}
24 changes: 12 additions & 12 deletions pkg/service/ecloud/model_paginated_generated.go
Original file line number Diff line number Diff line change
Expand Up @@ -674,29 +674,29 @@ func NewPaginatedLoadBalancer(getFunc connection.PaginatedGetFunc, parameters co
}
}

// PaginatedLoadBalancerNetwork represents a paginated collection of LoadBalancerNetwork
type PaginatedLoadBalancerNetwork struct {
// PaginatedLoadBalancerSpec represents a paginated collection of LoadBalancerSpec
type PaginatedLoadBalancerSpec struct {
*connection.PaginatedBase
Items []LoadBalancerNetwork
Items []LoadBalancerSpec
}

// NewPaginatedLoadBalancerNetwork returns a pointer to an initialized PaginatedLoadBalancerNetwork struct
func NewPaginatedLoadBalancerNetwork(getFunc connection.PaginatedGetFunc, parameters connection.APIRequestParameters, pagination connection.APIResponseMetadataPagination, items []LoadBalancerNetwork) *PaginatedLoadBalancerNetwork {
return &PaginatedLoadBalancerNetwork{
// NewPaginatedLoadBalancerSpec returns a pointer to an initialized PaginatedLoadBalancerSpec struct
func NewPaginatedLoadBalancerSpec(getFunc connection.PaginatedGetFunc, parameters connection.APIRequestParameters, pagination connection.APIResponseMetadataPagination, items []LoadBalancerSpec) *PaginatedLoadBalancerSpec {
return &PaginatedLoadBalancerSpec{
Items: items,
PaginatedBase: connection.NewPaginatedBase(parameters, pagination, getFunc),
}
}

// PaginatedLoadBalancerSpec represents a paginated collection of LoadBalancerSpec
type PaginatedLoadBalancerSpec struct {
// PaginatedVIP represents a paginated collection of VIP
type PaginatedVIP struct {
*connection.PaginatedBase
Items []LoadBalancerSpec
Items []VIP
}

// NewPaginatedLoadBalancerSpec returns a pointer to an initialized PaginatedLoadBalancerSpec struct
func NewPaginatedLoadBalancerSpec(getFunc connection.PaginatedGetFunc, parameters connection.APIRequestParameters, pagination connection.APIResponseMetadataPagination, items []LoadBalancerSpec) *PaginatedLoadBalancerSpec {
return &PaginatedLoadBalancerSpec{
// NewPaginatedVIP returns a pointer to an initialized PaginatedVIP struct
func NewPaginatedVIP(getFunc connection.PaginatedGetFunc, parameters connection.APIRequestParameters, pagination connection.APIResponseMetadataPagination, items []VIP) *PaginatedVIP {
return &PaginatedVIP{
Items: items,
PaginatedBase: connection.NewPaginatedBase(parameters, pagination, getFunc),
}
Expand Down
24 changes: 12 additions & 12 deletions pkg/service/ecloud/model_response_generated.go
Original file line number Diff line number Diff line change
Expand Up @@ -626,18 +626,6 @@ type GetLoadBalancerResponseBody struct {
Data LoadBalancer `json:"data"`
}

// GetLoadBalancerNetworkSliceResponseBody represents an API response body containing []LoadBalancerNetwork data
type GetLoadBalancerNetworkSliceResponseBody struct {
connection.APIResponseBody
Data []LoadBalancerNetwork `json:"data"`
}

// GetLoadBalancerNetworkResponseBody represents an API response body containing LoadBalancerNetwork data
type GetLoadBalancerNetworkResponseBody struct {
connection.APIResponseBody
Data LoadBalancerNetwork `json:"data"`
}

// GetLoadBalancerSpecSliceResponseBody represents an API response body containing []LoadBalancerSpec data
type GetLoadBalancerSpecSliceResponseBody struct {
connection.APIResponseBody
Expand All @@ -649,3 +637,15 @@ type GetLoadBalancerSpecResponseBody struct {
connection.APIResponseBody
Data LoadBalancerSpec `json:"data"`
}

// GetVIPSliceResponseBody represents an API response body containing []VIP data
type GetVIPSliceResponseBody struct {
connection.APIResponseBody
Data []VIP `json:"data"`
}

// GetVIPResponseBody represents an API response body containing VIP data
type GetVIPResponseBody struct {
connection.APIResponseBody
Data VIP `json:"data"`
}
24 changes: 12 additions & 12 deletions pkg/service/ecloud/request.go
Original file line number Diff line number Diff line change
Expand Up @@ -536,26 +536,26 @@ type PatchVolumeGroupRequest struct {

// CreateLoadBalancerRequest represents a request to create a load balancer
type CreateLoadBalancerRequest struct {
Name string `json:"name,omitempty"`
AvailabilityZoneID string `json:"availability_zone_id"`
VPCID string `json:"vpc_id"`
LoadBalancerSpecID string `json:"load_balancer_spec_id"`
NetworkIDs []string `json:"network_ids,omitempty"`
Name string `json:"name,omitempty"`
AvailabilityZoneID string `json:"availability_zone_id"`
VPCID string `json:"vpc_id"`
LoadBalancerSpecID string `json:"load_balancer_spec_id"`
NetworkID string `json:"network_id"`
}

// CreateLoadBalancerRequest represents a request to patch a load balancer
type PatchLoadBalancerRequest struct {
Name string `json:"name,omitempty"`
}

// CreateLoadBalancerNetworkRequest represents a request to create a load balancer network
type CreateLoadBalancerNetworkRequest struct {
Name string `json:"name,omitempty"`
LoadBalancerID string `json:"load_balancer_id"`
NetworkID string `json:"network_id"`
// CreateVIPRequest represents a request to create a load balancer VIP
type CreateVIPRequest struct {
Name string `json:"name,omitempty"`
LoadBalancerID string `json:"load_balancer_id"`
AllocateFloatingIP bool `json:"allocate_floating_ip"`
}

// PatchLoadBalancerNetworkRequest represents a request to patch a load balancer network
type PatchLoadBalancerNetworkRequest struct {
// PatchVIPRequest represents a request to patch a load balancer VIP
type PatchVIPRequest struct {
Name string `json:"name,omitempty"`
}
18 changes: 8 additions & 10 deletions pkg/service/ecloud/service.go
Original file line number Diff line number Diff line change
Expand Up @@ -393,21 +393,19 @@ type ECloudService interface {
CreateLoadBalancer(req CreateLoadBalancerRequest) (TaskReference, error)
PatchLoadBalancer(loadbalancerID string, req PatchLoadBalancerRequest) (TaskReference, error)
DeleteLoadBalancer(loadbalancerID string) (string, error)
GetLoadBalancerLoadBalancerNetworks(loadbalancerID string, parameters connection.APIRequestParameters) ([]LoadBalancerNetwork, error)
GetLoadBalancerLoadBalancerNetworksPaginated(loadbalancerID string, parameters connection.APIRequestParameters) (*PaginatedLoadBalancerNetwork, error)

// Load Balancer Network
GetLoadBalancerNetworks(parameters connection.APIRequestParameters) ([]LoadBalancerNetwork, error)
GetLoadBalancerNetworksPaginated(parameters connection.APIRequestParameters) (*PaginatedLoadBalancerNetwork, error)
GetLoadBalancerNetwork(lbNetworkID string) (LoadBalancerNetwork, error)
CreateLoadBalancerNetwork(req CreateLoadBalancerNetworkRequest) (TaskReference, error)
PatchLoadBalancerNetwork(lbNetworkID string, req PatchLoadBalancerNetworkRequest) (TaskReference, error)
DeleteLoadBalancerNetwork(lbNetworkID string) (string, error)

// Load Balancer Spec
GetLoadBalancerSpecs(parameters connection.APIRequestParameters) ([]LoadBalancerSpec, error)
GetLoadBalancerSpecsPaginated(parameters connection.APIRequestParameters) (*PaginatedLoadBalancerSpec, error)
GetLoadBalancerSpec(lbSpecID string) (LoadBalancerSpec, error)

// VIP
GetVIPs(parameters connection.APIRequestParameters) ([]VIP, error)
GetVIPsPaginated(parameters connection.APIRequestParameters) (*PaginatedVIP, error)
GetVIP(vipID string) (VIP, error)
CreateVIP(req CreateVIPRequest) (TaskReference, error)
PatchVIP(vipID string, patch PatchVIPRequest) (TaskReference, error)
DeleteVIP(vipID string) (string, error)
}

// Service implements ECloudService for managing
Expand Down
45 changes: 0 additions & 45 deletions pkg/service/ecloud/service_loadbalancer.go
Original file line number Diff line number Diff line change
Expand Up @@ -142,48 +142,3 @@ func (s *Service) deleteLoadBalancerResponseBody(loadbalancerID string) (*GetTas
return nil
})
}

// GetLoadBalancerLoadBalancerNetworks retrieves a list of lb networks
func (s *Service) GetLoadBalancerLoadBalancerNetworks(loadbalancerID string, parameters connection.APIRequestParameters) ([]LoadBalancerNetwork, error) {
var lbs []LoadBalancerNetwork

getFunc := func(p connection.APIRequestParameters) (connection.Paginated, error) {
return s.GetLoadBalancerLoadBalancerNetworksPaginated(loadbalancerID, p)
}

responseFunc := func(response connection.Paginated) {
lbs = append(lbs, response.(*PaginatedLoadBalancerNetwork).Items...)
}

return lbs, connection.InvokeRequestAll(getFunc, responseFunc, parameters)
}

// GetLoadBalancerLoadBalancerNetworksPaginated retrieves a paginated list of lb networks
func (s *Service) GetLoadBalancerLoadBalancerNetworksPaginated(loadbalancerID string, parameters connection.APIRequestParameters) (*PaginatedLoadBalancerNetwork, error) {
body, err := s.getLoadBalancerLoadBalancerNetworksPaginatedResponseBody(loadbalancerID, parameters)

return NewPaginatedLoadBalancerNetwork(func(p connection.APIRequestParameters) (connection.Paginated, error) {
return s.GetLoadBalancerLoadBalancerNetworksPaginated(loadbalancerID, p)
}, parameters, body.Metadata.Pagination, body.Data), err
}

func (s *Service) getLoadBalancerLoadBalancerNetworksPaginatedResponseBody(loadbalancerID string, parameters connection.APIRequestParameters) (*GetLoadBalancerNetworkSliceResponseBody, error) {
body := &GetLoadBalancerNetworkSliceResponseBody{}

if loadbalancerID == "" {
return body, fmt.Errorf("invalid load balancer id")
}

response, err := s.connection.Get(fmt.Sprintf("/ecloud/v2/load-balancers/%s/networks", loadbalancerID), parameters)
if err != nil {
return body, err
}

return body, response.HandleResponse(body, func(resp *connection.APIResponse) error {
if response.StatusCode == 404 {
return &LoadBalancerNotFoundError{ID: loadbalancerID}
}

return nil
})
}
83 changes: 0 additions & 83 deletions pkg/service/ecloud/service_loadbalancer_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -355,86 +355,3 @@ func TestDeleteLoadBalancer(t *testing.T) {
assert.IsType(t, &LoadBalancerNotFoundError{}, err)
})
}

func TestGetLoadBalancerLoadBalancerNetworks(t *testing.T) {
t.Run("Single", func(t *testing.T) {
mockCtrl := gomock.NewController(t)
defer mockCtrl.Finish()

c := mocks.NewMockConnection(mockCtrl)

s := Service{
connection: c,
}

c.EXPECT().Get("/ecloud/v2/load-balancers/lb-abcdef12/networks", gomock.Any()).Return(&connection.APIResponse{
Response: &http.Response{
Body: ioutil.NopCloser(bytes.NewReader([]byte("{\"data\":[{\"id\":\"lbn-abcdef12\"}],\"meta\":{\"pagination\":{\"total_pages\":1}}}"))),
StatusCode: 200,
},
}, nil).Times(1)

networks, err := s.GetLoadBalancerLoadBalancerNetworks("lb-abcdef12", connection.APIRequestParameters{})

assert.Nil(t, err)
assert.Len(t, networks, 1)
assert.Equal(t, "lbn-abcdef12", networks[0].ID)
})

t.Run("ConnectionError_ReturnsError", func(t *testing.T) {
mockCtrl := gomock.NewController(t)
defer mockCtrl.Finish()

c := mocks.NewMockConnection(mockCtrl)

s := Service{
connection: c,
}

c.EXPECT().Get("/ecloud/v2/load-balancers/lb-abcdef12/networks", gomock.Any()).Return(&connection.APIResponse{}, errors.New("test error 1"))

_, err := s.GetLoadBalancerLoadBalancerNetworks("lb-abcdef12", connection.APIRequestParameters{})

assert.NotNil(t, err)
assert.Equal(t, "test error 1", err.Error())
})

t.Run("InvalidLoadBalancerID_ReturnsError", func(t *testing.T) {
mockCtrl := gomock.NewController(t)
defer mockCtrl.Finish()

c := mocks.NewMockConnection(mockCtrl)

s := Service{
connection: c,
}

_, err := s.GetLoadBalancerLoadBalancerNetworks("", connection.APIRequestParameters{})

assert.NotNil(t, err)
assert.Equal(t, "invalid load balancer id", err.Error())
})

t.Run("404_ReturnsLoadBalancerNotFoundError", func(t *testing.T) {
mockCtrl := gomock.NewController(t)
defer mockCtrl.Finish()

c := mocks.NewMockConnection(mockCtrl)

s := Service{
connection: c,
}

c.EXPECT().Get("/ecloud/v2/load-balancers/lb-abcdef12/networks", gomock.Any()).Return(&connection.APIResponse{
Response: &http.Response{
Body: ioutil.NopCloser(bytes.NewReader([]byte(""))),
StatusCode: 404,
},
}, nil).Times(1)

_, err := s.GetLoadBalancerLoadBalancerNetworks("lb-abcdef12", connection.APIRequestParameters{})

assert.NotNil(t, err)
assert.IsType(t, &LoadBalancerNotFoundError{}, err)
})
}
Loading

0 comments on commit 6828b93

Please sign in to comment.