Skip to content

Commit

Permalink
Merge pull request #17 from Edge-Center/fix/CLOUDDEV-310-client-fix
Browse files Browse the repository at this point in the history
fix(CLOUDDEV-310): fixed security group
  • Loading branch information
anaxaim authored Dec 4, 2023
2 parents c6f87b0 + dafdb7d commit 12495d6
Show file tree
Hide file tree
Showing 24 changed files with 636 additions and 107 deletions.
3 changes: 1 addition & 2 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,4 +1,3 @@
# !!! v2 Beta, not production ready !!!
EdgeCenter cloud API client
====================================

Command line client to EdgeCenter cloud API.
26 changes: 25 additions & 1 deletion edgecloud.go
Original file line number Diff line number Diff line change
Expand Up @@ -318,6 +318,24 @@ func SetAPIKey(apiKey string) ClientOpt {
}
}

// SetRegion is a client option for setting the Region.
func SetRegion(region int) ClientOpt {
return func(c *Client) error {
c.Region = region

return nil
}
}

// SetProject is a client option for setting the Project.
func SetProject(project int) ClientOpt {
return func(c *Client) error {
c.Project = project

return nil
}
}

// SetUserAgent is a client option for setting the user agent.
func SetUserAgent(ua string) ClientOpt {
return func(c *Client) error {
Expand Down Expand Up @@ -353,7 +371,13 @@ func WithRetryAndBackoffs(retryConfig RetryConfig) ClientOpt {
// BaseURL of the Client. Relative URLS should always be specified without a preceding slash. If specified, the
// value pointed to by body is JSON encoded and included in as the request body.
func (c *Client) NewRequest(_ context.Context, method, urlStr string, body interface{}) (*http.Request, error) {
u, err := c.BaseURL.Parse(urlStr)
// check urlStr is valid path
if _, err := url.Parse(urlStr); err != nil {
return nil, err
}

urlPath := path.Join(c.BaseURL.Path, urlStr)
u, err := c.BaseURL.Parse(urlPath)
if err != nil {
return nil, err
}
Expand Down
37 changes: 32 additions & 5 deletions edgecloud_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -23,13 +23,16 @@ var (
)

const (
projectID = 27520
regionID = 8
clientID = 88888
testResourceID = "f0d19cec-5c3f-4853-886e-304915960ff6"
taskID = "f0d19cec-5c3f-4853-886e-304915960ff6"
projectID = 27520
regionID = 8
clientID = 88888
testResourceID = "f0d19cec-5c3f-4853-886e-304915960ff6"
taskID = "f0d19cec-5c3f-4853-886e-304915960ff6"
testResourceIDNotValidUUID = "123"
)

var NotCorrectUUID = fmt.Sprintf("should be the correct UUID. current value is: %s", testResourceIDNotValidUUID)

func setup() {
mux = http.NewServeMux()
server = httptest.NewServer(mux)
Expand Down Expand Up @@ -261,6 +264,30 @@ func TestCustomBaseURL(t *testing.T) {
}
}

func TestSetProject(t *testing.T) {
c, err := New(nil, SetProject(projectID))
if err != nil {
t.Fatalf("New() unexpected error: %v", err)
}

expected := projectID
if got := c.Project; got != expected {
t.Errorf("New() Project = %d; expected %d", got, expected)
}
}

func TestSetRegion(t *testing.T) {
c, err := New(nil, SetRegion(regionID))
if err != nil {
t.Fatalf("New() unexpected error: %v", err)
}

expected := regionID
if got := c.Region; got != expected {
t.Errorf("New() Region = %d; expected %d", got, expected)
}
}

func TestCustomBaseURL_badURL(t *testing.T) {
baseURL := ":"
_, err := New(nil, SetBaseURL(baseURL))
Expand Down
46 changes: 23 additions & 23 deletions floatingips.go
Original file line number Diff line number Diff line change
Expand Up @@ -33,8 +33,8 @@ type FloatingIPsService interface {

type FloatingIPMetadata interface {
MetadataList(context.Context, string) ([]MetadataDetailed, *Response, error)
MetadataCreate(context.Context, string, *MetadataCreateRequest) (*Response, error)
MetadataUpdate(context.Context, string, *MetadataCreateRequest) (*Response, error)
MetadataCreate(context.Context, string, *Metadata) (*Response, error)
MetadataUpdate(context.Context, string, *Metadata) (*Response, error)
MetadataDeleteItem(context.Context, string, *MetadataItemOptions) (*Response, error)
MetadataGetItem(context.Context, string, *MetadataItemOptions) (*MetadataDetailed, *Response, error)
}
Expand All @@ -48,25 +48,25 @@ var _ FloatingIPsService = &FloatingipsServiceOp{}

// FloatingIP represents an EdgecenterCloud FloatingIP.
type FloatingIP struct {
ID string `json:"id"`
CreatedAt string `json:"created_at"`
UpdatedAt string `json:"updated_at"`
Status string `json:"status"`
FixedIPAddress net.IP `json:"fixed_ip_address,omitempty"`
FloatingIPAddress string `json:"floating_ip_address,omitempty"`
DNSDomain string `json:"dns_domain"`
DNSName string `json:"dns_name"`
RouterID string `json:"router_id"`
SubnetID string `json:"subnet_id"`
CreatorTaskID string `json:"creator_task_id"`
Metadata []Metadata `json:"metadata,omitempty"`
TaskID string `json:"task_id"`
PortID string `json:"port_id,omitempty"`
ProjectID int `json:"project_id"`
RegionID int `json:"region_id"`
Region string `json:"region"`
Instance Instance `json:"instance,omitempty"`
Loadbalancer Loadbalancer `json:"loadbalancer,omitempty"`
ID string `json:"id"`
CreatedAt string `json:"created_at"`
UpdatedAt string `json:"updated_at"`
Status string `json:"status"`
FixedIPAddress net.IP `json:"fixed_ip_address,omitempty"`
FloatingIPAddress string `json:"floating_ip_address,omitempty"`
DNSDomain string `json:"dns_domain"`
DNSName string `json:"dns_name"`
RouterID string `json:"router_id"`
SubnetID string `json:"subnet_id"`
CreatorTaskID string `json:"creator_task_id"`
Metadata []MetadataDetailed `json:"metadata,omitempty"`
TaskID string `json:"task_id"`
PortID string `json:"port_id,omitempty"`
ProjectID int `json:"project_id"`
RegionID int `json:"region_id"`
Region string `json:"region"`
Instance Instance `json:"instance,omitempty"`
Loadbalancer Loadbalancer `json:"loadbalancer,omitempty"`
}

type FloatingIPSource string
Expand Down Expand Up @@ -293,7 +293,7 @@ func (s *FloatingipsServiceOp) MetadataList(ctx context.Context, fipID string) (
}

// MetadataCreate or update floating IP metadata.
func (s *FloatingipsServiceOp) MetadataCreate(ctx context.Context, fipID string, reqBody *MetadataCreateRequest) (*Response, error) {
func (s *FloatingipsServiceOp) MetadataCreate(ctx context.Context, fipID string, reqBody *Metadata) (*Response, error) {
if resp, err := isValidUUID(fipID, "fipID"); err != nil {
return resp, err
}
Expand All @@ -306,7 +306,7 @@ func (s *FloatingipsServiceOp) MetadataCreate(ctx context.Context, fipID string,
}

// MetadataUpdate floating IP metadata.
func (s *FloatingipsServiceOp) MetadataUpdate(ctx context.Context, fipID string, reqBody *MetadataCreateRequest) (*Response, error) {
func (s *FloatingipsServiceOp) MetadataUpdate(ctx context.Context, fipID string, reqBody *Metadata) (*Response, error) {
if resp, err := isValidUUID(fipID, "fipID"); err != nil {
return resp, err
}
Expand Down
109 changes: 107 additions & 2 deletions floatingips_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -206,7 +206,7 @@ func TestFloatingips_MetadataCreate(t *testing.T) {
setup()
defer teardown()

request := &MetadataCreateRequest{Metadata: map[string]interface{}{"key": "value"}}
request := &Metadata{"key": "value"}
URL := path.Join(floatingipsBasePathV1, strconv.Itoa(projectID), strconv.Itoa(regionID), testResourceID, metadataPath)

mux.HandleFunc(URL, func(w http.ResponseWriter, r *http.Request) {
Expand All @@ -222,7 +222,7 @@ func TestFloatingips_MetadataUpdate(t *testing.T) {
setup()
defer teardown()

request := &MetadataCreateRequest{Metadata: map[string]interface{}{"key": "value"}}
request := &Metadata{"key": "value"}
URL := path.Join(floatingipsBasePathV1, strconv.Itoa(projectID), strconv.Itoa(regionID), testResourceID, metadataPath)

mux.HandleFunc(URL, func(w http.ResponseWriter, r *http.Request) {
Expand Down Expand Up @@ -274,3 +274,108 @@ func TestFloatingips_MetadataGetItem(t *testing.T) {
require.Equal(t, resp.StatusCode, 200)
require.Equal(t, respActual, expectedResp)
}

func TestFloatingips_isValidUUID_Error(t *testing.T) {
setup()
defer teardown()

tests := []struct {
name string
testFunc func() (*FloatingIP, *Response, error)
}{
{
name: "Get",
testFunc: func() (*FloatingIP, *Response, error) {
return client.Floatingips.Get(ctx, testResourceIDNotValidUUID)
},
},
{
name: "Assign",
testFunc: func() (*FloatingIP, *Response, error) {
return client.Floatingips.Assign(ctx, testResourceIDNotValidUUID, nil)
},
},
{
name: "UnAssign",
testFunc: func() (*FloatingIP, *Response, error) {
return client.Floatingips.UnAssign(ctx, testResourceIDNotValidUUID)
},
},
}

for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
respActual, resp, err := tt.testFunc()
require.Nil(t, respActual)
require.Equal(t, 400, resp.StatusCode)
require.EqualError(t, err, NewArgError("fipID", NotCorrectUUID).Error())
})
}
}

func TestFloatingips_Delete_isValidUUID_Error(t *testing.T) {
setup()
defer teardown()

respActual, resp, err := client.Floatingips.Delete(ctx, testResourceIDNotValidUUID)
require.Nil(t, respActual)
require.Equal(t, 400, resp.StatusCode)
require.EqualError(t, err, NewArgError("fipID", NotCorrectUUID).Error())
}

func TestFloatingips_Metadata_isValidUUID_Error(t *testing.T) {
setup()
defer teardown()

tests := []struct {
name string
testFunc func() (*Response, error)
}{
{
name: "MetadataCreate",
testFunc: func() (*Response, error) {
return client.Floatingips.MetadataCreate(ctx, testResourceIDNotValidUUID, nil)
},
},
{
name: "MetadataUpdate",
testFunc: func() (*Response, error) {
return client.Floatingips.MetadataUpdate(ctx, testResourceIDNotValidUUID, nil)
},
},
{
name: "MetadataDeleteItem",
testFunc: func() (*Response, error) {
return client.Floatingips.MetadataDeleteItem(ctx, testResourceIDNotValidUUID, nil)
},
},
}

for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
resp, err := tt.testFunc()
require.Equal(t, 400, resp.StatusCode)
require.EqualError(t, err, NewArgError("fipID", NotCorrectUUID).Error())
})
}
}

func TestFloatingips_MetadataList_isValidUUID_Error(t *testing.T) {
setup()
defer teardown()

respActual, resp, err := client.Floatingips.MetadataList(ctx, testResourceIDNotValidUUID)
require.Nil(t, respActual)
require.Equal(t, 400, resp.StatusCode)
require.EqualError(t, err, NewArgError("fipID", NotCorrectUUID).Error())
}

func TestFloatingips_MetadataGetItem_isValidUUID_Error(t *testing.T) {
setup()
defer teardown()

respActual, resp, err := client.Floatingips.MetadataGetItem(ctx, testResourceIDNotValidUUID, nil)
require.Nil(t, respActual)
require.Equal(t, 400, resp.StatusCode)
require.EqualError(t, err, NewArgError("fipID", NotCorrectUUID).Error())
}
8 changes: 4 additions & 4 deletions images.go
Original file line number Diff line number Diff line change
Expand Up @@ -39,8 +39,8 @@ type ImagesProject interface {

type ImagesMetadata interface {
MetadataList(context.Context, string) ([]MetadataDetailed, *Response, error)
MetadataCreate(context.Context, string, *MetadataCreateRequest) (*Response, error)
MetadataUpdate(context.Context, string, *MetadataCreateRequest) (*Response, error)
MetadataCreate(context.Context, string, *Metadata) (*Response, error)
MetadataUpdate(context.Context, string, *Metadata) (*Response, error)
MetadataDeleteItem(context.Context, string, *MetadataItemOptions) (*Response, error)
MetadataGetItem(context.Context, string, *MetadataItemOptions) (*MetadataDetailed, *Response, error)
}
Expand Down Expand Up @@ -400,7 +400,7 @@ func (s *ImagesServiceOp) MetadataList(ctx context.Context, imageID string) ([]M
}

// MetadataCreate or update security group metadata.
func (s *ImagesServiceOp) MetadataCreate(ctx context.Context, imageID string, reqBody *MetadataCreateRequest) (*Response, error) {
func (s *ImagesServiceOp) MetadataCreate(ctx context.Context, imageID string, reqBody *Metadata) (*Response, error) {
if resp, err := isValidUUID(imageID, "imageID"); err != nil {
return resp, err
}
Expand All @@ -413,7 +413,7 @@ func (s *ImagesServiceOp) MetadataCreate(ctx context.Context, imageID string, re
}

// MetadataUpdate security group metadata.
func (s *ImagesServiceOp) MetadataUpdate(ctx context.Context, imageID string, reqBody *MetadataCreateRequest) (*Response, error) {
func (s *ImagesServiceOp) MetadataUpdate(ctx context.Context, imageID string, reqBody *Metadata) (*Response, error) {
if resp, err := isValidUUID(imageID, "imageID"); err != nil {
return resp, err
}
Expand Down
4 changes: 2 additions & 2 deletions images_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -261,7 +261,7 @@ func TestImages_MetadataCreate(t *testing.T) {
setup()
defer teardown()

request := &MetadataCreateRequest{Metadata: map[string]interface{}{"key": "value"}}
request := &Metadata{"key": "value"}
URL := path.Join(imagesBasePathV1, strconv.Itoa(projectID), strconv.Itoa(regionID), testResourceID, metadataPath)

mux.HandleFunc(URL, func(w http.ResponseWriter, r *http.Request) {
Expand All @@ -277,7 +277,7 @@ func TestImages_MetadataUpdate(t *testing.T) {
setup()
defer teardown()

request := &MetadataCreateRequest{Metadata: map[string]interface{}{"key": "value"}}
request := &Metadata{"key": "value"}
URL := path.Join(imagesBasePathV1, strconv.Itoa(projectID), strconv.Itoa(regionID), testResourceID, metadataPath)

mux.HandleFunc(URL, func(w http.ResponseWriter, r *http.Request) {
Expand Down
8 changes: 4 additions & 4 deletions instances.go
Original file line number Diff line number Diff line change
Expand Up @@ -87,8 +87,8 @@ type InstanceSecurityGroup interface {
type InstanceMetadata interface {
MetadataGet(context.Context, string) (*MetadataDetailed, *Response, error)
MetadataList(context.Context, string) ([]MetadataDetailed, *Response, error)
MetadataCreate(context.Context, string, *MetadataCreateRequest) (*Response, error)
MetadataUpdate(context.Context, string, *MetadataCreateRequest) (*Response, error)
MetadataCreate(context.Context, string, *Metadata) (*Response, error)
MetadataUpdate(context.Context, string, *Metadata) (*Response, error)
MetadataDeleteItem(context.Context, string, *MetadataItemOptions) (*Response, error)
MetadataGetItem(context.Context, string, *MetadataItemOptions) (*MetadataDetailed, *Response, error)
}
Expand Down Expand Up @@ -506,7 +506,7 @@ func (s *InstancesServiceOp) MetadataList(ctx context.Context, instanceID string
}

// MetadataUpdate load balancer metadata.
func (s *InstancesServiceOp) MetadataUpdate(ctx context.Context, instanceID string, reqBody *MetadataCreateRequest) (*Response, error) {
func (s *InstancesServiceOp) MetadataUpdate(ctx context.Context, instanceID string, reqBody *Metadata) (*Response, error) {
if resp, err := isValidUUID(instanceID, "instanceID"); err != nil {
return resp, err
}
Expand Down Expand Up @@ -545,7 +545,7 @@ func (s *InstancesServiceOp) MetadataGetItem(ctx context.Context, instanceID str
}

// MetadataCreate instance metadata (tags).
func (s *InstancesServiceOp) MetadataCreate(ctx context.Context, instanceID string, metadata *MetadataCreateRequest) (*Response, error) {
func (s *InstancesServiceOp) MetadataCreate(ctx context.Context, instanceID string, metadata *Metadata) (*Response, error) {
if resp, err := isValidUUID(instanceID, "instanceID"); err != nil {
return resp, err
}
Expand Down
4 changes: 2 additions & 2 deletions instances_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -201,7 +201,7 @@ func TestInstances_MetadataUpdate(t *testing.T) {
setup()
defer teardown()

request := &MetadataCreateRequest{Metadata: map[string]interface{}{"key": "value"}}
request := &Metadata{"key": "value"}
URL := path.Join(instancesBasePathV1, strconv.Itoa(projectID), strconv.Itoa(regionID), testResourceID, metadataPath)

mux.HandleFunc(URL, func(w http.ResponseWriter, r *http.Request) {
Expand Down Expand Up @@ -258,7 +258,7 @@ func TestInstances_MetadataCreate(t *testing.T) {
setup()
defer teardown()

request := &MetadataCreateRequest{Metadata: map[string]interface{}{"key": "value"}}
request := &Metadata{"key": "value"}
URL := path.Join(instancesBasePathV1, strconv.Itoa(projectID), strconv.Itoa(regionID), testResourceID, metadataPath)

mux.HandleFunc(URL, func(w http.ResponseWriter, r *http.Request) {
Expand Down
Loading

0 comments on commit 12495d6

Please sign in to comment.