Skip to content

Commit fa32d78

Browse files
authored
Add Tiers improvements for Bucket Lifecycle management (#3380)
1 parent 56f22a4 commit fa32d78

15 files changed

+811
-104
lines changed

api/admin_client_mock.go

Lines changed: 8 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -66,11 +66,12 @@ var (
6666
deleteSiteReplicationInfoMock func(ctx context.Context, removeReq madmin.SRRemoveReq) (*madmin.ReplicateRemoveStatus, error)
6767
getSiteReplicationStatus func(ctx context.Context, params madmin.SRStatusOptions) (*madmin.SRStatusInfo, error)
6868

69-
minioListTiersMock func(ctx context.Context) ([]*madmin.TierConfig, error)
70-
minioTierStatsMock func(ctx context.Context) ([]madmin.TierInfo, error)
71-
minioAddTiersMock func(ctx context.Context, tier *madmin.TierConfig) error
72-
minioRemoveTierMock func(ctx context.Context, tierName string) error
73-
minioEditTiersMock func(ctx context.Context, tierName string, creds madmin.TierCreds) error
69+
minioListTiersMock func(ctx context.Context) ([]*madmin.TierConfig, error)
70+
minioTierStatsMock func(ctx context.Context) ([]madmin.TierInfo, error)
71+
minioAddTiersMock func(ctx context.Context, tier *madmin.TierConfig) error
72+
minioRemoveTierMock func(ctx context.Context, tierName string) error
73+
minioEditTiersMock func(ctx context.Context, tierName string, creds madmin.TierCreds) error
74+
minioVerifyTierStatusMock func(ctx context.Context, tierName string) error
7475

7576
minioServiceTraceMock func(ctx context.Context, threshold int64, s3, internal, storage, os, errTrace bool) <-chan madmin.ServiceTraceInfo
7677

@@ -121,8 +122,8 @@ func (ac AdminClientMock) speedtest(_ context.Context, _ madmin.SpeedtestOpts) (
121122
return nil, nil
122123
}
123124

124-
func (ac AdminClientMock) verifyTierStatus(_ context.Context, _ string) error {
125-
return nil
125+
func (ac AdminClientMock) verifyTierStatus(ctx context.Context, tier string) error {
126+
return minioVerifyTierStatusMock(ctx, tier)
126127
}
127128

128129
// mock function helpConfigKV()

api/admin_tiers.go

Lines changed: 75 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@ import (
2424
"github.com/dustin/go-humanize"
2525
"github.com/go-openapi/runtime/middleware"
2626
"github.com/minio/console/api/operations"
27+
"github.com/minio/console/api/operations/tiering"
2728
tieringApi "github.com/minio/console/api/operations/tiering"
2829
"github.com/minio/console/models"
2930
"github.com/minio/madmin-go/v3"
@@ -38,6 +39,13 @@ func registerAdminTiersHandlers(api *operations.ConsoleAPI) {
3839
}
3940
return tieringApi.NewTiersListOK().WithPayload(tierList)
4041
})
42+
api.TieringTiersListNamesHandler = tiering.TiersListNamesHandlerFunc(func(params tiering.TiersListNamesParams, session *models.Principal) middleware.Responder {
43+
tierList, err := getTiersNameResponse(session, params)
44+
if err != nil {
45+
return tieringApi.NewTiersListDefault(err.Code).WithPayload(err.APIError)
46+
}
47+
return tieringApi.NewTiersListNamesOK().WithPayload(tierList)
48+
})
4149
// add a new tiers
4250
api.TieringAddTierHandler = tieringApi.AddTierHandlerFunc(func(params tieringApi.AddTierParams, session *models.Principal) middleware.Responder {
4351
err := getAddTierResponse(session, params)
@@ -72,33 +80,36 @@ func registerAdminTiersHandlers(api *operations.ConsoleAPI) {
7280
})
7381
}
7482

75-
// getNotificationEndpoints invokes admin info and returns a list of notification endpoints
83+
// getTiers returns a list of tiers with their stats
7684
func getTiers(ctx context.Context, client MinioAdmin) (*models.TierListResponse, error) {
7785
tiers, err := client.listTiers(ctx)
7886
if err != nil {
7987
return nil, err
8088
}
81-
tiersInfo, err := client.tierStats(ctx)
89+
90+
tierStatsInfo, err := client.tierStats(ctx)
8291
if err != nil {
8392
return nil, err
8493
}
94+
tiersStatsMap := make(map[string]madmin.TierStats, len(tierStatsInfo))
95+
for _, stat := range tierStatsInfo {
96+
tiersStatsMap[stat.Name] = stat.Stats
97+
}
98+
8599
var tiersList []*models.Tier
86100
for _, tierData := range tiers {
87-
88101
// Default Tier Stats
89-
stats := madmin.TierStats{
102+
tierStats := madmin.TierStats{
90103
NumObjects: 0,
91104
NumVersions: 0,
92105
TotalSize: 0,
93106
}
94-
95-
// We look for the correct tier stats & set the values.
96-
for _, stat := range tiersInfo {
97-
if stat.Name == tierData.Name {
98-
stats = stat.Stats
99-
break
100-
}
107+
if stats, ok := tiersStatsMap[tierData.Name]; ok {
108+
tierStats = stats
101109
}
110+
111+
status := client.verifyTierStatus(ctx, tierData.Name) == nil
112+
102113
switch tierData.Type {
103114
case madmin.S3:
104115
tiersList = append(tiersList, &models.Tier{
@@ -112,11 +123,11 @@ func getTiers(ctx context.Context, client MinioAdmin) (*models.TierListResponse,
112123
Region: tierData.S3.Region,
113124
Secretkey: tierData.S3.SecretKey,
114125
Storageclass: tierData.S3.StorageClass,
115-
Usage: humanize.IBytes(stats.TotalSize),
116-
Objects: strconv.Itoa(stats.NumObjects),
117-
Versions: strconv.Itoa(stats.NumVersions),
126+
Usage: humanize.IBytes(tierStats.TotalSize),
127+
Objects: strconv.Itoa(tierStats.NumObjects),
128+
Versions: strconv.Itoa(tierStats.NumVersions),
118129
},
119-
Status: client.verifyTierStatus(ctx, tierData.Name) == nil,
130+
Status: status,
120131
})
121132
case madmin.MinIO:
122133
tiersList = append(tiersList, &models.Tier{
@@ -129,11 +140,11 @@ func getTiers(ctx context.Context, client MinioAdmin) (*models.TierListResponse,
129140
Prefix: tierData.MinIO.Prefix,
130141
Region: tierData.MinIO.Region,
131142
Secretkey: tierData.MinIO.SecretKey,
132-
Usage: humanize.IBytes(stats.TotalSize),
133-
Objects: strconv.Itoa(stats.NumObjects),
134-
Versions: strconv.Itoa(stats.NumVersions),
143+
Usage: humanize.IBytes(tierStats.TotalSize),
144+
Objects: strconv.Itoa(tierStats.NumObjects),
145+
Versions: strconv.Itoa(tierStats.NumVersions),
135146
},
136-
Status: client.verifyTierStatus(ctx, tierData.Name) == nil,
147+
Status: status,
137148
})
138149
case madmin.GCS:
139150
tiersList = append(tiersList, &models.Tier{
@@ -145,11 +156,11 @@ func getTiers(ctx context.Context, client MinioAdmin) (*models.TierListResponse,
145156
Name: tierData.Name,
146157
Prefix: tierData.GCS.Prefix,
147158
Region: tierData.GCS.Region,
148-
Usage: humanize.IBytes(stats.TotalSize),
149-
Objects: strconv.Itoa(stats.NumObjects),
150-
Versions: strconv.Itoa(stats.NumVersions),
159+
Usage: humanize.IBytes(tierStats.TotalSize),
160+
Objects: strconv.Itoa(tierStats.NumObjects),
161+
Versions: strconv.Itoa(tierStats.NumVersions),
151162
},
152-
Status: client.verifyTierStatus(ctx, tierData.Name) == nil,
163+
Status: status,
153164
})
154165
case madmin.Azure:
155166
tiersList = append(tiersList, &models.Tier{
@@ -162,16 +173,16 @@ func getTiers(ctx context.Context, client MinioAdmin) (*models.TierListResponse,
162173
Name: tierData.Name,
163174
Prefix: tierData.Azure.Prefix,
164175
Region: tierData.Azure.Region,
165-
Usage: humanize.IBytes(stats.TotalSize),
166-
Objects: strconv.Itoa(stats.NumObjects),
167-
Versions: strconv.Itoa(stats.NumVersions),
176+
Usage: humanize.IBytes(tierStats.TotalSize),
177+
Objects: strconv.Itoa(tierStats.NumObjects),
178+
Versions: strconv.Itoa(tierStats.NumVersions),
168179
},
169-
Status: client.verifyTierStatus(ctx, tierData.Name) == nil,
180+
Status: status,
170181
})
171182
case madmin.Unsupported:
172183
tiersList = append(tiersList, &models.Tier{
173184
Type: models.TierTypeUnsupported,
174-
Status: client.verifyTierStatus(ctx, tierData.Name) == nil,
185+
Status: status,
175186
})
176187
}
177188
}
@@ -200,6 +211,42 @@ func getTiersResponse(session *models.Principal, params tieringApi.TiersListPara
200211
return tiersResp, nil
201212
}
202213

214+
// getTiersNameResponse returns a response with a list of tiers' names
215+
func getTiersNameResponse(session *models.Principal, params tieringApi.TiersListNamesParams) (*models.TiersNameListResponse, *CodedAPIError) {
216+
ctx, cancel := context.WithCancel(params.HTTPRequest.Context())
217+
defer cancel()
218+
mAdmin, err := NewMinioAdminClient(params.HTTPRequest.Context(), session)
219+
if err != nil {
220+
return nil, ErrorWithContext(ctx, err)
221+
}
222+
// create a minioClient interface implementation
223+
// defining the client to be used
224+
adminClient := AdminClient{Client: mAdmin}
225+
// serialize output
226+
tiersResp, err := getTiersName(ctx, adminClient)
227+
if err != nil {
228+
return nil, ErrorWithContext(ctx, err)
229+
}
230+
return tiersResp, nil
231+
}
232+
233+
// getTiersName fetches listTiers and returns a list of the tiers' names
234+
func getTiersName(ctx context.Context, client MinioAdmin) (*models.TiersNameListResponse, error) {
235+
tiers, err := client.listTiers(ctx)
236+
if err != nil {
237+
return nil, err
238+
}
239+
240+
tiersNameList := make([]string, len(tiers))
241+
for i, tierData := range tiers {
242+
tiersNameList[i] = tierData.Name
243+
}
244+
245+
return &models.TiersNameListResponse{
246+
Items: tiersNameList,
247+
}, nil
248+
}
249+
203250
func addTier(ctx context.Context, client MinioAdmin, params *tieringApi.AddTierParams) error {
204251
var cfg *madmin.TierConfig
205252
var err error

0 commit comments

Comments
 (0)