Skip to content

Commit

Permalink
support setting unlimited storagelimit for projects (#80)
Browse files Browse the repository at this point in the history
* wip: support unlimited storage quota size

* add unit tests
  • Loading branch information
elenz97 authored Feb 8, 2021
1 parent 152b2eb commit 7b692f5
Show file tree
Hide file tree
Showing 5 changed files with 123 additions and 62 deletions.
4 changes: 2 additions & 2 deletions apiv2/client.go
Original file line number Diff line number Diff line change
Expand Up @@ -103,7 +103,7 @@ func (c *RESTClient) UpdateUserPassword(ctx context.Context, id int64, password
// Project Client

// NewProject wraps the NewProject method of the project sub-package.
func (c *RESTClient) NewProject(ctx context.Context, name string, storageLimit int) (*modelv2.Project, error) {
func (c *RESTClient) NewProject(ctx context.Context, name string, storageLimit *int64) (*modelv2.Project, error) {
return c.project.NewProject(ctx, name, storageLimit)
}

Expand All @@ -128,7 +128,7 @@ func (c *RESTClient) ListProjects(ctx context.Context, nameFilter string) ([]*mo
}

// UpdateProject wraps the UpdateProject method of the registry sub-package.
func (c *RESTClient) UpdateProject(ctx context.Context, p *modelv2.Project, storageLimit int) error {
func (c *RESTClient) UpdateProject(ctx context.Context, p *modelv2.Project, storageLimit *int64) error {
return c.project.UpdateProject(ctx, p, storageLimit)
}

Expand Down
15 changes: 6 additions & 9 deletions apiv2/project/project.go
Original file line number Diff line number Diff line change
Expand Up @@ -48,12 +48,12 @@ func NewClient(legacyClient *client.Harbor, v2Client *v2client.Harbor, authInfo
}

type Client interface {
NewProject(ctx context.Context, name string, storageLimit int) (*modelv2.Project, error)
NewProject(ctx context.Context, name string, storageLimit *int64) (*modelv2.Project, error)
DeleteProject(ctx context.Context, p *modelv2.Project) error
GetProjectByName(ctx context.Context, name string) (*modelv2.Project, error)
GetProjectByID(ctx context.Context, projectID int64) (*modelv2.Project, error)
ListProjects(ctx context.Context, nameFilter string) ([]*modelv2.Project, error)
UpdateProject(ctx context.Context, p *modelv2.Project, storageLimit int) error
UpdateProject(ctx context.Context, p *modelv2.Project, storageLimit *int64) error

AddProjectMember(ctx context.Context, p *modelv2.Project, u *model.User, roleID int) error
ListProjectMembers(ctx context.Context, p *modelv2.Project) ([]*model.ProjectMemberEntity, error)
Expand All @@ -74,12 +74,11 @@ type MetadataKey string
// if the project could not be created.
// CountLimit limits the number of repositories for this project.
// StorageLimit limits the allocatable space for this project.
func (c *RESTClient) NewProject(ctx context.Context, name string, storageLimit int) (*modelv2.Project, error) {
var sPtr = int64(storageLimit) * 1024 * 1024
func (c *RESTClient) NewProject(ctx context.Context, name string, storageLimit *int64) (*modelv2.Project, error) {

pReq := &modelv2.ProjectReq{
ProjectName: name,
StorageLimit: &sPtr,
StorageLimit: storageLimit,
}

_, err := c.V2Client.Project.CreateProject(
Expand Down Expand Up @@ -202,7 +201,7 @@ func (c *RESTClient) ListProjects(ctx context.Context, nameFilter string) ([]*mo

// UpdateProject updates a project with the specified data.
// Returns an error if name/ID pair of p does not match a stored project.
func (c *RESTClient) UpdateProject(ctx context.Context, p *modelv2.Project, storageLimit int) error {
func (c *RESTClient) UpdateProject(ctx context.Context, p *modelv2.Project, storageLimit *int64) error {
project, err := c.GetProjectByName(ctx, p.Name)
if err != nil {
return err
Expand All @@ -212,13 +211,11 @@ func (c *RESTClient) UpdateProject(ctx context.Context, p *modelv2.Project, stor
return &ErrProjectMismatch{}
}

var sPtr = int64(storageLimit) * 1024 * 1024

pReq := &modelv2.ProjectReq{
CveAllowlist: p.CveAllowlist,
Metadata: p.Metadata,
ProjectName: p.Name,
StorageLimit: &sPtr,
StorageLimit: storageLimit,
}

_, err = c.V2Client.Project.UpdateProject(&projectapi.UpdateProjectParams{
Expand Down
52 changes: 34 additions & 18 deletions apiv2/project/project_integration_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -21,10 +21,12 @@ import (
)

var (
u, _ = url.Parse(integrationtest.Host)
legacySwaggerClient = client.New(runtimeclient.New(u.Host, u.Path, []string{u.Scheme}), strfmt.Default)
v2SwaggerClient = v2client.New(runtimeclient.New(u.Host, u.Path, []string{u.Scheme}), strfmt.Default)
authInfo = runtimeclient.BasicAuth(integrationtest.User, integrationtest.Password)
u, _ = url.Parse(integrationtest.Host)
legacySwaggerClient = client.New(runtimeclient.New(u.Host, u.Path, []string{u.Scheme}), strfmt.Default)
v2SwaggerClient = v2client.New(runtimeclient.New(u.Host, u.Path, []string{u.Scheme}), strfmt.Default)
authInfo = runtimeclient.BasicAuth(integrationtest.User, integrationtest.Password)
storageLimitPositive int64 = 1
storageLimitNegative int64 = -1
)

func TestAPIProjectNew(t *testing.T) {
Expand All @@ -33,7 +35,21 @@ func TestAPIProjectNew(t *testing.T) {
ctx := context.Background()
c := NewClient(legacySwaggerClient, v2SwaggerClient, authInfo)

p, err := c.NewProject(ctx, name, 3)
p, err := c.NewProject(ctx, name, &storageLimitPositive)
defer c.DeleteProject(ctx, p)

require.NoError(t, err)
assert.Equal(t, name, p.Name)
assert.False(t, p.Deleted)
}

func TestAPIProjectNew_UnlimitedStorage(t *testing.T) {
name := "test-project"

ctx := context.Background()
c := NewClient(legacySwaggerClient, v2SwaggerClient, authInfo)

p, err := c.NewProject(ctx, name, &storageLimitNegative)
defer c.DeleteProject(ctx, p)

require.NoError(t, err)
Expand All @@ -47,7 +63,7 @@ func TestAPIProjectGet(t *testing.T) {
ctx := context.Background()
c := NewClient(legacySwaggerClient, v2SwaggerClient, authInfo)

p, err := c.NewProject(ctx, name, 3)
p, err := c.NewProject(ctx, name, &storageLimitPositive)
require.NoError(t, err)
defer c.DeleteProject(ctx, p)

Expand All @@ -61,7 +77,7 @@ func TestAPIProjectDelete(t *testing.T) {
ctx := context.Background()
c := NewClient(legacySwaggerClient, v2SwaggerClient, authInfo)

p, err := c.NewProject(ctx, name, 3)
p, err := c.NewProject(ctx, name, &storageLimitPositive)
require.NoError(t, err)

err = c.DeleteProject(ctx, p)
Expand All @@ -80,7 +96,7 @@ func TestAPIProjectList(t *testing.T) {

for i := 0; i < 10; i++ {
name := fmt.Sprintf("%s-%d", namePrefix, i)
p, err := c.NewProject(ctx, name, 3)
p, err := c.NewProject(ctx, name, &storageLimitPositive)
require.NoError(t, err)
defer func() {
err := c.DeleteProject(ctx, p)
Expand All @@ -103,7 +119,7 @@ func TestAPIProjectUpdate(t *testing.T) {
ctx := context.Background()
c := NewClient(legacySwaggerClient, v2SwaggerClient, authInfo)

p, err := c.NewProject(ctx, name, 3)
p, err := c.NewProject(ctx, name, &storageLimitPositive)
require.NoError(t, err)
defer c.DeleteProject(ctx, p)

Expand All @@ -113,7 +129,7 @@ func TestAPIProjectUpdate(t *testing.T) {

mPtr := "true"
p.Metadata.AutoScan = &mPtr
err = c.UpdateProject(ctx, p, 2)
err = c.UpdateProject(ctx, p, &storageLimitPositive)
require.NoError(t, err)
p2, err := c.GetProjectByName(ctx, name)
require.NoError(t, err)
Expand All @@ -132,7 +148,7 @@ func TestAPIProjectUserMemberAdd(t *testing.T) {
ctx := context.Background()
c := NewClient(legacySwaggerClient, v2SwaggerClient, authInfo)

p, err := c.NewProject(ctx, projectName, 3)
p, err := c.NewProject(ctx, projectName, &storageLimitPositive)
defer c.DeleteProject(ctx, p)
require.NoError(t, err)

Expand All @@ -158,7 +174,7 @@ func TestAPIProjectMemberList(t *testing.T) {
ctx := context.Background()
c := NewClient(legacySwaggerClient, v2SwaggerClient, authInfo)

p, err := c.NewProject(ctx, projectName, 3)
p, err := c.NewProject(ctx, projectName, &storageLimitPositive)
defer c.DeleteProject(ctx, p)
require.NoError(t, err)

Expand Down Expand Up @@ -193,7 +209,7 @@ func TestAPIProjectUserMemberUpdate(t *testing.T) {
ctx := context.Background()
c := NewClient(legacySwaggerClient, v2SwaggerClient, authInfo)

p, err := c.NewProject(ctx, projectName, 3)
p, err := c.NewProject(ctx, projectName, &storageLimitPositive)
defer c.DeleteProject(ctx, p)
require.NoError(t, err)

Expand Down Expand Up @@ -236,7 +252,7 @@ func TestAPIProjectUserMemberDelete(t *testing.T) {
ctx := context.Background()
c := NewClient(legacySwaggerClient, v2SwaggerClient, authInfo)

p, err := c.NewProject(ctx, projectName, 3)
p, err := c.NewProject(ctx, projectName, &storageLimitPositive)
defer c.DeleteProject(ctx, p)
require.NoError(t, err)

Expand Down Expand Up @@ -272,7 +288,7 @@ func TestAPIProjectMetadataAdd(t *testing.T) {
ctx := context.Background()
c := NewClient(legacySwaggerClient, v2SwaggerClient, authInfo)

p, err := c.NewProject(ctx, projectName, 3)
p, err := c.NewProject(ctx, projectName, &storageLimitPositive)
defer c.DeleteProject(ctx, p)
require.NoError(t, err)

Expand All @@ -295,7 +311,7 @@ func TestAPIProjectMetadataGet(t *testing.T) {
ctx := context.Background()
c := NewClient(legacySwaggerClient, v2SwaggerClient, authInfo)

p, err := c.NewProject(ctx, projectName, 3)
p, err := c.NewProject(ctx, projectName, &storageLimitPositive)
defer c.DeleteProject(ctx, p)
require.NoError(t, err)

Expand All @@ -311,7 +327,7 @@ func TestAPIProjectMetadataGetInvalidKey(t *testing.T) {
ctx := context.Background()
c := NewClient(legacySwaggerClient, v2SwaggerClient, authInfo)

p, err := c.NewProject(ctx, projectName, 3)
p, err := c.NewProject(ctx, projectName, &storageLimitPositive)
defer c.DeleteProject(ctx, p)
require.NoError(t, err)

Expand All @@ -331,7 +347,7 @@ func TestAPIProjectMetadataList(t *testing.T) {
ctx := context.Background()
c := NewClient(legacySwaggerClient, v2SwaggerClient, authInfo)

p, err := c.NewProject(ctx, projectName, 3)
p, err := c.NewProject(ctx, projectName, &storageLimitPositive)
defer c.DeleteProject(ctx, p)
require.NoError(t, err)

Expand Down
Loading

0 comments on commit 7b692f5

Please sign in to comment.