Skip to content

Commit

Permalink
satellite/console: send bucket names and versioning to sat UI
Browse files Browse the repository at this point in the history
This change updates the GetBucketPlacement service method to also
return versioning information, renaming it to GetBucketMetadata. It
adds a new endpoint /bucket-metadata to get bucket names with their
placement and versioning info.

Change-Id: I7c8a282652aee4ce5500ffdc795e1bbd7c3a6dfa
  • Loading branch information
wilfred-asomanii authored and Storj Robot committed Mar 15, 2024
1 parent 1f17e8f commit 8b93840
Show file tree
Hide file tree
Showing 6 changed files with 49 additions and 24 deletions.
Expand Up @@ -5,6 +5,7 @@ package console

import (
"storj.io/common/storj"
"storj.io/storj/satellite/buckets"
)

// Placement contains placement info.
Expand All @@ -13,8 +14,9 @@ type Placement struct {
Location string `json:"location"`
}

// BucketPlacement contains bucket name and placement info.
type BucketPlacement struct {
Name string `json:"name"`
Placement Placement `json:"placement"`
// BucketMetadata contains bucket name, versioning and placement info.
type BucketMetadata struct {
Name string `json:"name"`
Versioning buckets.Versioning `json:"versioning"`
Placement Placement `json:"placement"`
}
8 changes: 4 additions & 4 deletions satellite/console/consoleweb/consoleapi/buckets.go
Expand Up @@ -89,8 +89,8 @@ func (b *Buckets) AllBucketNames(w http.ResponseWriter, r *http.Request) {
}
}

// GetBucketPlacements returns all bucket names and placements for a specific project.
func (b *Buckets) GetBucketPlacements(w http.ResponseWriter, r *http.Request) {
// GetBucketMetadata returns all bucket names and metadata (placement and versioning) for a specific project.
func (b *Buckets) GetBucketMetadata(w http.ResponseWriter, r *http.Request) {
ctx := r.Context()
var err error
defer mon.Task()(&ctx)(&err)
Expand Down Expand Up @@ -118,7 +118,7 @@ func (b *Buckets) GetBucketPlacements(w http.ResponseWriter, r *http.Request) {
return
}

bucketNames, err := b.service.GetBucketPlacements(ctx, projectID)
bucketMetadata, err := b.service.GetBucketMetadata(ctx, projectID)
if err != nil {
if console.ErrUnauthorized.Has(err) {
b.serveJSONError(ctx, w, http.StatusUnauthorized, err)
Expand All @@ -129,7 +129,7 @@ func (b *Buckets) GetBucketPlacements(w http.ResponseWriter, r *http.Request) {
return
}

err = json.NewEncoder(w).Encode(bucketNames)
err = json.NewEncoder(w).Encode(bucketMetadata)
if err != nil {
b.log.Error("failed to write json all bucket names response", zap.Error(ErrBucketsAPI.Wrap(err)))
}
Expand Down
33 changes: 27 additions & 6 deletions satellite/console/consoleweb/consoleapi/buckets_test.go
Expand Up @@ -85,7 +85,7 @@ func TestAllBucketNames(t *testing.T) {
})
}

func TestBucketPlacements(t *testing.T) {
func TestBucketMetadata(t *testing.T) {
placements := make(map[int]string)
for i := 0; i < 2; i++ {
placements[i] = fmt.Sprintf("loc-%d", i)
Expand Down Expand Up @@ -138,31 +138,52 @@ func TestBucketPlacements(t *testing.T) {
_, err = sat.API.Buckets.Service.CreateBucket(ctx, bucket2)
require.NoError(t, err)

testRequest := func(endpointSuffix string) {
body, status, err := doRequestWithAuth(ctx, t, sat, user, http.MethodGet, "buckets/bucket-placements"+endpointSuffix, nil)
testRequest := func(path string, requireVersioning bool) {
body, status, err := doRequestWithAuth(ctx, t, sat, user, http.MethodGet, path, nil)
require.NoError(t, err)
require.Equal(t, http.StatusOK, status)

var output []console.BucketPlacement
var output []console.BucketMetadata

err = json.Unmarshal(body, &output)
require.NoError(t, err)

require.Len(t, output, 2)

require.Equal(t, bucket1.Name, output[0].Name)
require.Equal(t, bucket1.Placement, output[0].Placement.DefaultPlacement)
require.NotEqual(t, "", output[0].Placement.Location)
require.Equal(t, placements[0], output[0].Placement.Location)
if requireVersioning {
require.Equal(t, bucket1.Versioning, output[0].Versioning)
} else {
require.Equal(t, buckets.VersioningUnsupported, output[0].Versioning)
}

require.Equal(t, bucket2.Name, output[1].Name)
require.Equal(t, bucket2.Placement, output[1].Placement.DefaultPlacement)
require.NotEqual(t, "", output[1].Placement.Location)
require.Equal(t, placements[1], output[1].Placement.Location)
if requireVersioning {
require.Equal(t, bucket2.Versioning, output[1].Versioning)
} else {
require.Equal(t, buckets.VersioningUnsupported, output[1].Versioning)
}
}

base := "buckets/bucket-placements"
// test using Project.ID
testRequest("?projectID=" + project.ID.String())
testRequest(base+"?projectID="+project.ID.String(), false)

// test using Project.PublicID
testRequest("?publicID=" + project.PublicID.String())
testRequest(base+"?publicID="+project.PublicID.String(), false)

base = "buckets/bucket-metadata"

// test using Project.ID
testRequest(base+"?projectID="+project.ID.String(), true)

// test using Project.PublicID
testRequest(base+"?publicID="+project.PublicID.String(), true)
})
}
3 changes: 2 additions & 1 deletion satellite/console/consoleweb/server.go
Expand Up @@ -378,7 +378,8 @@ func NewServer(logger *zap.Logger, config Config, service *console.Service, oidc
bucketsRouter.Use(server.withCORS)
bucketsRouter.Use(server.withAuth)
bucketsRouter.HandleFunc("/bucket-names", bucketsController.AllBucketNames).Methods(http.MethodGet, http.MethodOptions)
bucketsRouter.HandleFunc("/bucket-placements", bucketsController.GetBucketPlacements).Methods(http.MethodGet, http.MethodOptions)
bucketsRouter.HandleFunc("/bucket-placements", bucketsController.GetBucketMetadata).Methods(http.MethodGet, http.MethodOptions)
bucketsRouter.HandleFunc("/bucket-metadata", bucketsController.GetBucketMetadata).Methods(http.MethodGet, http.MethodOptions)
bucketsRouter.HandleFunc("/usage-totals", bucketsController.GetBucketTotals).Methods(http.MethodGet, http.MethodOptions)

apiKeysController := consoleapi.NewAPIKeys(logger, service)
Expand Down
14 changes: 7 additions & 7 deletions satellite/console/service.go
Expand Up @@ -2951,12 +2951,12 @@ func (s *Service) GetAllBucketNames(ctx context.Context, projectID uuid.UUID) (_
return list, nil
}

// GetBucketPlacements retrieves all bucket names and placements of a specific project.
// GetBucketMetadata retrieves all bucket names of a specific project and related metadata, e.g. placement and versioning.
// projectID here may be Project.ID or Project.PublicID.
func (s *Service) GetBucketPlacements(ctx context.Context, projectID uuid.UUID) (_ []BucketPlacement, err error) {
func (s *Service) GetBucketMetadata(ctx context.Context, projectID uuid.UUID) (list []BucketMetadata, err error) {
defer mon.Task()(&ctx)(&err)

user, err := s.getUserAndAuditLog(ctx, "get all bucket names and placements", zap.String("projectID", projectID.String()))
user, err := s.getUserAndAuditLog(ctx, "get all bucket names and metadata", zap.String("projectID", projectID.String()))
if err != nil {
return nil, Error.Wrap(err)
}
Expand All @@ -2979,11 +2979,11 @@ func (s *Service) GetBucketPlacements(ctx context.Context, projectID uuid.UUID)
return nil, Error.Wrap(err)
}

var list []BucketPlacement
for _, bucket := range bucketsList.Items {
list = append(list, BucketPlacement{
bucket.Name,
Placement{
list = append(list, BucketMetadata{
Name: bucket.Name,
Versioning: bucket.Versioning,
Placement: Placement{
DefaultPlacement: bucket.Placement,
Location: s.placements[bucket.Placement].Name,
},
Expand Down
5 changes: 3 additions & 2 deletions satellite/console/service_test.go
Expand Up @@ -757,10 +757,10 @@ func TestService(t *testing.T) {
}
})

t.Run("GetBucketPlacements", func(t *testing.T) {
t.Run("GetBucketMetadata", func(t *testing.T) {
list, err := sat.DB.Buckets().ListBuckets(ctx, up2Proj.ID, buckets.ListOptions{Direction: buckets.DirectionForward}, macaroon.AllowedBuckets{All: true})
require.NoError(t, err)
bp, err := service.GetBucketPlacements(userCtx2, up2Proj.ID)
bp, err := service.GetBucketMetadata(userCtx2, up2Proj.ID)
require.NoError(t, err)
for _, b := range bp {
var found bool
Expand All @@ -769,6 +769,7 @@ func TestService(t *testing.T) {
found = true
require.Equal(t, item.Placement, b.Placement.DefaultPlacement)
require.Equal(t, placements[int(item.Placement)], b.Placement.Location)
require.Equal(t, item.Versioning, b.Versioning)
break
}
}
Expand Down

0 comments on commit 8b93840

Please sign in to comment.