fix: update code in compliance with golangci-lint revive (#17087)

Signed-off-by: Shengwen Yu <yshengwen@vmware.com>
This commit is contained in:
Shengwen YU 2022-07-01 14:52:47 +08:00 committed by GitHub
parent 94bf1c0ebd
commit 315d8a8993
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
28 changed files with 160 additions and 157 deletions

View File

@ -25,7 +25,7 @@ linters:
- ineffassign - ineffassign
# - nakedret # - nakedret
# - nolintlint # - nolintlint
# - revive - revive
- whitespace - whitespace
- bodyclose - bodyclose
- deadcode - deadcode

View File

@ -51,7 +51,7 @@ type controller struct {
} }
func (c *controller) Start(ctx context.Context, async bool, trigger string) error { func (c *controller) Start(ctx context.Context, async bool, trigger string) error {
execId, err := c.execMgr.Create(ctx, VendorTypeSystemArtifactCleanup, 0, trigger) execID, err := c.execMgr.Create(ctx, VendorTypeSystemArtifactCleanup, 0, trigger)
if err != nil { if err != nil {
return err return err
} }
@ -61,7 +61,7 @@ func (c *controller) Start(ctx context.Context, async bool, trigger string) erro
jobParams := job.Parameters{} jobParams := job.Parameters{}
if !async { if !async {
err := c.createCleanupTask(ctx, jobParams, execId) err := c.createCleanupTask(ctx, jobParams, execID)
if err != nil { if err != nil {
log.Errorf("failed to create system artifact clean-up task: %v", err) log.Errorf("failed to create system artifact clean-up task: %v", err)
return err return err
@ -72,14 +72,14 @@ func (c *controller) Start(ctx context.Context, async bool, trigger string) erro
} }
go func(ctx context.Context) { go func(ctx context.Context) {
err := retry.Retry(func() error { err := retry.Retry(func() error {
_, err := c.execMgr.Get(ctx, execId) _, err := c.execMgr.Get(ctx, execID)
return err return err
}) })
if err != nil { if err != nil {
log.Errorf("failed to get the execution %d for the export data cleanup job", execId) log.Errorf("failed to get the execution %d for the export data cleanup job", execID)
return return
} }
err = c.createCleanupTask(ctx, jobParams, execId) err = c.createCleanupTask(ctx, jobParams, execID)
if err != nil { if err != nil {
logger.Errorf("Encountered error in scan data artifact cleanup : %v", err) logger.Errorf("Encountered error in scan data artifact cleanup : %v", err)
return return
@ -89,7 +89,7 @@ func (c *controller) Start(ctx context.Context, async bool, trigger string) erro
return nil return nil
} }
func (c *controller) createCleanupTask(ctx context.Context, jobParams job.Parameters, execId int64) error { func (c *controller) createCleanupTask(ctx context.Context, jobParams job.Parameters, execID int64) error {
j := &task.Job{ j := &task.Job{
Name: job.SystemArtifactCleanup, Name: job.SystemArtifactCleanup,
Metadata: &job.Metadata{ Metadata: &job.Metadata{
@ -98,11 +98,11 @@ func (c *controller) createCleanupTask(ctx context.Context, jobParams job.Parame
Parameters: jobParams, Parameters: jobParams,
} }
_, err := c.taskMgr.Create(ctx, execId, j) _, err := c.taskMgr.Create(ctx, execID, j)
if err != nil { if err != nil {
logger.Errorf("Unable to create a scan data export job in clean-up mode : %v", err) logger.Errorf("Unable to create a scan data export job in clean-up mode : %v", err)
c.markError(ctx, execId, err) c.markError(ctx, execID, err)
return err return err
} }
return nil return nil
@ -132,12 +132,12 @@ func scheduleSystemArtifactCleanJob(ctx context.Context) {
logger.Debugf(" Export data cleanup job already scheduled with ID : %v.", schedule.ID) logger.Debugf(" Export data cleanup job already scheduled with ID : %v.", schedule.ID)
return return
} }
scheduleId, err := sched.Schedule(ctx, VendorTypeSystemArtifactCleanup, 0, cronTypeDaily, cronSpec, SystemArtifactCleanupCallback, nil, nil) scheduleID, err := sched.Schedule(ctx, VendorTypeSystemArtifactCleanup, 0, cronTypeDaily, cronSpec, SystemArtifactCleanupCallback, nil, nil)
if err != nil { if err != nil {
log.Errorf("Encountered error when scheduling scan data export cleanup job : %v", err) log.Errorf("Encountered error when scheduling scan data export cleanup job : %v", err)
return return
} }
log.Infof("Scheduled scan data export cleanup job with ID : %v", scheduleId) log.Infof("Scheduled scan data export cleanup job with ID : %v", scheduleID)
} }
func getSystemArtifactCleanupSchedule(ctx context.Context) (*scheduler.Schedule, error) { func getSystemArtifactCleanupSchedule(ctx context.Context) (*scheduler.Schedule, error) {

View File

@ -53,6 +53,8 @@ import (
"github.com/goharbor/harbor/src/lib/retry" "github.com/goharbor/harbor/src/lib/retry"
tracelib "github.com/goharbor/harbor/src/lib/trace" tracelib "github.com/goharbor/harbor/src/lib/trace"
"github.com/goharbor/harbor/src/migration" "github.com/goharbor/harbor/src/migration"
_ "github.com/goharbor/harbor/src/pkg/accessory/model/base"
_ "github.com/goharbor/harbor/src/pkg/accessory/model/cosign"
"github.com/goharbor/harbor/src/pkg/audit" "github.com/goharbor/harbor/src/pkg/audit"
dbCfg "github.com/goharbor/harbor/src/pkg/config/db" dbCfg "github.com/goharbor/harbor/src/pkg/config/db"
_ "github.com/goharbor/harbor/src/pkg/config/inmemory" _ "github.com/goharbor/harbor/src/pkg/config/inmemory"

View File

@ -35,8 +35,8 @@ const (
var harborpder = &Provider{} var harborpder = &Provider{}
// SessionStore redis session store // Store redis session store
type SessionStore struct { type Store struct {
c cache.Cache c cache.Cache
sid string sid string
lock sync.RWMutex lock sync.RWMutex
@ -45,7 +45,7 @@ type SessionStore struct {
} }
// Set value in redis session // Set value in redis session
func (rs *SessionStore) Set(key, value interface{}) error { func (rs *Store) Set(key, value interface{}) error {
rs.lock.Lock() rs.lock.Lock()
defer rs.lock.Unlock() defer rs.lock.Unlock()
rs.values[key] = value rs.values[key] = value
@ -53,7 +53,7 @@ func (rs *SessionStore) Set(key, value interface{}) error {
} }
// Get value in redis session // Get value in redis session
func (rs *SessionStore) Get(key interface{}) interface{} { func (rs *Store) Get(key interface{}) interface{} {
rs.lock.RLock() rs.lock.RLock()
defer rs.lock.RUnlock() defer rs.lock.RUnlock()
if v, ok := rs.values[key]; ok { if v, ok := rs.values[key]; ok {
@ -63,7 +63,7 @@ func (rs *SessionStore) Get(key interface{}) interface{} {
} }
// Delete value in redis session // Delete value in redis session
func (rs *SessionStore) Delete(key interface{}) error { func (rs *Store) Delete(key interface{}) error {
rs.lock.Lock() rs.lock.Lock()
defer rs.lock.Unlock() defer rs.lock.Unlock()
delete(rs.values, key) delete(rs.values, key)
@ -71,7 +71,7 @@ func (rs *SessionStore) Delete(key interface{}) error {
} }
// Flush clear all values in redis session // Flush clear all values in redis session
func (rs *SessionStore) Flush() error { func (rs *Store) Flush() error {
rs.lock.Lock() rs.lock.Lock()
defer rs.lock.Unlock() defer rs.lock.Unlock()
rs.values = make(map[interface{}]interface{}) rs.values = make(map[interface{}]interface{})
@ -79,12 +79,12 @@ func (rs *SessionStore) Flush() error {
} }
// SessionID get redis session id // SessionID get redis session id
func (rs *SessionStore) SessionID() string { func (rs *Store) SessionID() string {
return rs.sid return rs.sid
} }
// SessionRelease save session values to redis // SessionRelease save session values to redis
func (rs *SessionStore) SessionRelease(w http.ResponseWriter) { func (rs *Store) SessionRelease(w http.ResponseWriter) {
b, err := session.EncodeGob(rs.values) b, err := session.EncodeGob(rs.values)
if err != nil { if err != nil {
return return
@ -123,7 +123,7 @@ func (rp *Provider) SessionRead(sid string) (session.Store, error) {
return nil, err return nil, err
} }
rs := &SessionStore{c: rp.c, sid: sid, values: kv, maxlifetime: rp.maxlifetime} rs := &Store{c: rp.c, sid: sid, values: kv, maxlifetime: rp.maxlifetime}
return rs, nil return rs, nil
} }

View File

@ -37,7 +37,7 @@ import (
var ( var (
regCtlInit = registryctl.Init regCtlInit = registryctl.Init
stopErr = errors.New("stopped") errGcStop = errors.New("stopped")
) )
const ( const (
@ -154,7 +154,7 @@ func (gc *GarbageCollector) Run(ctx job.Context, params job.Parameters) error {
// mark // mark
if err := gc.mark(ctx); err != nil { if err := gc.mark(ctx); err != nil {
if err == stopErr { if err == errGcStop {
gc.logger.Info("received the stop signal, quit GC job.") gc.logger.Info("received the stop signal, quit GC job.")
return nil return nil
} }
@ -165,7 +165,7 @@ func (gc *GarbageCollector) Run(ctx job.Context, params job.Parameters) error {
// sweep // sweep
if !gc.dryRun { if !gc.dryRun {
if err := gc.sweep(ctx); err != nil { if err := gc.sweep(ctx); err != nil {
if err == stopErr { if err == errGcStop {
// we may already delete several artifacts before receiving the stop signal, so try to clean up the cache // we may already delete several artifacts before receiving the stop signal, so try to clean up the cache
gc.logger.Info("received the stop signal, quit GC job after cleaning up the cache.") gc.logger.Info("received the stop signal, quit GC job after cleaning up the cache.")
return gc.cleanCache() return gc.cleanCache()
@ -222,7 +222,7 @@ func (gc *GarbageCollector) mark(ctx job.Context) error {
for _, blob := range blobs { for _, blob := range blobs {
if !gc.dryRun { if !gc.dryRun {
if gc.shouldStop(ctx) { if gc.shouldStop(ctx) {
return stopErr return errGcStop
} }
blob.Status = blobModels.StatusDelete blob.Status = blobModels.StatusDelete
count, err := gc.blobMgr.UpdateBlobStatus(ctx.SystemContext(), blob) count, err := gc.blobMgr.UpdateBlobStatus(ctx.SystemContext(), blob)
@ -260,7 +260,7 @@ func (gc *GarbageCollector) sweep(ctx job.Context) error {
total := len(gc.deleteSet) total := len(gc.deleteSet)
for i, blob := range gc.deleteSet { for i, blob := range gc.deleteSet {
if gc.shouldStop(ctx) { if gc.shouldStop(ctx) {
return stopErr return errGcStop
} }
idx := i + 1 idx := i + 1
// set the status firstly, if the blob is updated by any HEAD/PUT request, it should be fail and skip. // set the status firstly, if the blob is updated by any HEAD/PUT request, it should be fail and skip.
@ -469,7 +469,7 @@ func (gc *GarbageCollector) deletedArt(ctx job.Context) (map[string][]model.Arti
allTrashedArts = append(allTrashedArts, simulateDeletion) allTrashedArts = append(allTrashedArts, simulateDeletion)
} else { } else {
if gc.shouldStop(ctx) { if gc.shouldStop(ctx) {
return nil, stopErr return nil, errGcStop
} }
if err := gc.artCtl.Delete(ctx.SystemContext(), untagged.ID); err != nil { if err := gc.artCtl.Delete(ctx.SystemContext(), untagged.ID); err != nil {
// the failure ones can be GCed by the next execution // the failure ones can be GCed by the next execution
@ -519,7 +519,7 @@ func (gc *GarbageCollector) markOrSweepUntaggedBlobs(ctx job.Context) ([]*blobMo
var orphanBlobs []*blobModels.Blob var orphanBlobs []*blobModels.Blob
for result := range project.ListAll(ctx.SystemContext(), 50, nil, project.Metadata(false)) { for result := range project.ListAll(ctx.SystemContext(), 50, nil, project.Metadata(false)) {
if gc.shouldStop(ctx) { if gc.shouldStop(ctx) {
return nil, stopErr return nil, errGcStop
} }
if result.Error != nil { if result.Error != nil {
gc.logger.Errorf("remove untagged blobs for all projects got error: %v", result.Error) gc.logger.Errorf("remove untagged blobs for all projects got error: %v", result.Error)
@ -536,7 +536,7 @@ func (gc *GarbageCollector) markOrSweepUntaggedBlobs(ctx job.Context) ([]*blobMo
for { for {
if gc.shouldStop(ctx) { if gc.shouldStop(ctx) {
gc.logger.Info("received the stop signal, quit GC job.") gc.logger.Info("received the stop signal, quit GC job.")
return nil, stopErr return nil, errGcStop
} }
blobRG := q.Range{ blobRG := q.Range{
Min: lastBlobID, Min: lastBlobID,

View File

@ -207,7 +207,7 @@ func (suite *gcTestSuite) TestStop() {
deleteUntagged: true, deleteUntagged: true,
} }
suite.Equal(stopErr, gc.mark(ctx)) suite.Equal(errGcStop, gc.mark(ctx))
} }
func (suite *gcTestSuite) TestRun() { func (suite *gcTestSuite) TestRun() {

View File

@ -47,7 +47,7 @@ var (
SecretStore *secret.Store SecretStore *secret.Store
keyProvider encrypt.KeyProvider keyProvider encrypt.KeyProvider
// Use backgroundCtx to access system scope config // Use backgroundCtx to access system scope config
backgroundCtx context.Context = context.Background() backgroundCtx = context.Background()
) )
// It contains all system settings // It contains all system settings

View File

@ -21,9 +21,6 @@ import (
"github.com/goharbor/harbor/src/lib/q" "github.com/goharbor/harbor/src/lib/q"
"github.com/goharbor/harbor/src/pkg/accessory/dao" "github.com/goharbor/harbor/src/pkg/accessory/dao"
"github.com/goharbor/harbor/src/pkg/accessory/model" "github.com/goharbor/harbor/src/pkg/accessory/model"
_ "github.com/goharbor/harbor/src/pkg/accessory/model/base"
_ "github.com/goharbor/harbor/src/pkg/accessory/model/cosign"
) )
var ( var (

View File

@ -18,6 +18,8 @@ import (
"github.com/goharbor/harbor/src/lib/q" "github.com/goharbor/harbor/src/lib/q"
"github.com/goharbor/harbor/src/pkg/accessory/dao" "github.com/goharbor/harbor/src/pkg/accessory/dao"
"github.com/goharbor/harbor/src/pkg/accessory/model" "github.com/goharbor/harbor/src/pkg/accessory/model"
_ "github.com/goharbor/harbor/src/pkg/accessory/model/base"
_ "github.com/goharbor/harbor/src/pkg/accessory/model/cosign"
"github.com/goharbor/harbor/src/testing/mock" "github.com/goharbor/harbor/src/testing/mock"
testingdao "github.com/goharbor/harbor/src/testing/pkg/accessory/dao" testingdao "github.com/goharbor/harbor/src/testing/pkg/accessory/dao"
"github.com/stretchr/testify/suite" "github.com/stretchr/testify/suite"

View File

@ -28,18 +28,18 @@ import (
"github.com/goharbor/harbor/src/pkg/cached" "github.com/goharbor/harbor/src/pkg/cached"
) )
var _ CachedManager = &manager{} var _ CachedManager = &Manager{}
// CachedManager is the interface combines raw resource manager and cached manager for better extension. // CachedManager is the interface combines raw resource Manager and cached Manager for better extension.
type CachedManager interface { type CachedManager interface {
// Manager is the raw resource manager. // Manager is the raw resource Manager.
artifact.Manager artifact.Manager
// Manager is the common interface for resource cache. // Manager is the common interface for resource cache.
cached.Manager cached.Manager
} }
// manager is the cached manager implemented by redis. // Manager is the cached Manager implemented by redis.
type manager struct { type Manager struct {
// delegator delegates the raw crud to DAO. // delegator delegates the raw crud to DAO.
delegator artifact.Manager delegator artifact.Manager
// client returns the redis cache client. // client returns the redis cache client.
@ -50,9 +50,9 @@ type manager struct {
lifetime time.Duration lifetime time.Duration
} }
// NewManager returns the redis cache manager. // NewManager returns the redis cache Manager.
func NewManager(m artifact.Manager) *manager { func NewManager(m artifact.Manager) *Manager {
return &manager{ return &Manager{
delegator: m, delegator: m,
client: func() libcache.Cache { return libcache.Default() }, client: func() libcache.Cache { return libcache.Default() },
keyBuilder: cached.NewObjectKey(cached.ResourceTypeArtifact), keyBuilder: cached.NewObjectKey(cached.ResourceTypeArtifact),
@ -60,27 +60,27 @@ func NewManager(m artifact.Manager) *manager {
} }
} }
func (m *manager) Count(ctx context.Context, query *q.Query) (int64, error) { func (m *Manager) Count(ctx context.Context, query *q.Query) (int64, error) {
return m.delegator.Count(ctx, query) return m.delegator.Count(ctx, query)
} }
func (m *manager) List(ctx context.Context, query *q.Query) ([]*artifact.Artifact, error) { func (m *Manager) List(ctx context.Context, query *q.Query) ([]*artifact.Artifact, error) {
return m.delegator.List(ctx, query) return m.delegator.List(ctx, query)
} }
func (m *manager) Create(ctx context.Context, artifact *artifact.Artifact) (int64, error) { func (m *Manager) Create(ctx context.Context, artifact *artifact.Artifact) (int64, error) {
return m.delegator.Create(ctx, artifact) return m.delegator.Create(ctx, artifact)
} }
func (m *manager) ListReferences(ctx context.Context, query *q.Query) ([]*artifact.Reference, error) { func (m *Manager) ListReferences(ctx context.Context, query *q.Query) ([]*artifact.Reference, error) {
return m.delegator.ListReferences(ctx, query) return m.delegator.ListReferences(ctx, query)
} }
func (m *manager) DeleteReference(ctx context.Context, id int64) error { func (m *Manager) DeleteReference(ctx context.Context, id int64) error {
return m.delegator.DeleteReference(ctx, id) return m.delegator.DeleteReference(ctx, id)
} }
func (m *manager) Get(ctx context.Context, id int64) (*artifact.Artifact, error) { func (m *Manager) Get(ctx context.Context, id int64) (*artifact.Artifact, error) {
key, err := m.keyBuilder.Format("id", id) key, err := m.keyBuilder.Format("id", id)
if err != nil { if err != nil {
return nil, err return nil, err
@ -106,7 +106,7 @@ func (m *manager) Get(ctx context.Context, id int64) (*artifact.Artifact, error)
return art, nil return art, nil
} }
func (m *manager) GetByDigest(ctx context.Context, repository, digest string) (*artifact.Artifact, error) { func (m *Manager) GetByDigest(ctx context.Context, repository, digest string) (*artifact.Artifact, error) {
key, err := m.keyBuilder.Format("digest", digest) key, err := m.keyBuilder.Format("digest", digest)
if err != nil { if err != nil {
return nil, err return nil, err
@ -130,7 +130,7 @@ func (m *manager) GetByDigest(ctx context.Context, repository, digest string) (*
return art, nil return art, nil
} }
func (m *manager) Delete(ctx context.Context, id int64) error { func (m *Manager) Delete(ctx context.Context, id int64) error {
art, err := m.Get(ctx, id) art, err := m.Get(ctx, id)
if err != nil { if err != nil {
return err return err
@ -144,7 +144,7 @@ func (m *manager) Delete(ctx context.Context, id int64) error {
return nil return nil
} }
func (m *manager) Update(ctx context.Context, artifact *artifact.Artifact, props ...string) error { func (m *Manager) Update(ctx context.Context, artifact *artifact.Artifact, props ...string) error {
// pass on update operation // pass on update operation
if err := m.delegator.Update(ctx, artifact, props...); err != nil { if err := m.delegator.Update(ctx, artifact, props...); err != nil {
return err return err
@ -154,7 +154,7 @@ func (m *manager) Update(ctx context.Context, artifact *artifact.Artifact, props
return nil return nil
} }
func (m *manager) UpdatePullTime(ctx context.Context, id int64, pullTime time.Time) error { func (m *Manager) UpdatePullTime(ctx context.Context, id int64, pullTime time.Time) error {
art, err := m.Get(ctx, id) art, err := m.Get(ctx, id)
if err != nil { if err != nil {
return err return err
@ -169,7 +169,7 @@ func (m *manager) UpdatePullTime(ctx context.Context, id int64, pullTime time.Ti
} }
// cleanUp cleans up data in cache. // cleanUp cleans up data in cache.
func (m *manager) cleanUp(ctx context.Context, art *artifact.Artifact) { func (m *Manager) cleanUp(ctx context.Context, art *artifact.Artifact) {
// clean index by id // clean index by id
idIdx, err := m.keyBuilder.Format("id", art.ID) idIdx, err := m.keyBuilder.Format("id", art.ID)
if err != nil { if err != nil {
@ -193,7 +193,7 @@ func (m *manager) cleanUp(ctx context.Context, art *artifact.Artifact) {
} }
// refreshCache refreshes cache. // refreshCache refreshes cache.
func (m *manager) refreshCache(ctx context.Context, art *artifact.Artifact) { func (m *Manager) refreshCache(ctx context.Context, art *artifact.Artifact) {
// refreshCache used for UpdatePullTime, because we have a background goroutine to // refreshCache used for UpdatePullTime, because we have a background goroutine to
// update per artifact pull_time in period time, in that case, we don't want to lose // update per artifact pull_time in period time, in that case, we don't want to lose
// cache every fixed interval, so prefer to use refreshCache instead of cleanUp. // cache every fixed interval, so prefer to use refreshCache instead of cleanUp.
@ -217,11 +217,11 @@ func (m *manager) refreshCache(ctx context.Context, art *artifact.Artifact) {
} }
} }
func (m *manager) ResourceType(ctx context.Context) string { func (m *Manager) ResourceType(ctx context.Context) string {
return cached.ResourceTypeArtifact return cached.ResourceTypeArtifact
} }
func (m *manager) CountCache(ctx context.Context) (int64, error) { func (m *Manager) CountCache(ctx context.Context) (int64, error) {
// prefix is resource type // prefix is resource type
keys, err := m.client().Keys(ctx, m.ResourceType(ctx)) keys, err := m.client().Keys(ctx, m.ResourceType(ctx))
if err != nil { if err != nil {
@ -231,11 +231,11 @@ func (m *manager) CountCache(ctx context.Context) (int64, error) {
return int64(len(keys)), nil return int64(len(keys)), nil
} }
func (m *manager) DeleteCache(ctx context.Context, key string) error { func (m *Manager) DeleteCache(ctx context.Context, key string) error {
return m.client().Delete(ctx, key) return m.client().Delete(ctx, key)
} }
func (m *manager) FlushAll(ctx context.Context) error { func (m *Manager) FlushAll(ctx context.Context) error {
// prefix is resource type // prefix is resource type
keys, err := m.client().Keys(ctx, m.ResourceType(ctx)) keys, err := m.client().Keys(ctx, m.ResourceType(ctx))
if err != nil { if err != nil {

View File

@ -42,7 +42,7 @@ func (m *managerTestSuite) SetupTest() {
m.cachedManager = NewManager( m.cachedManager = NewManager(
m.artMgr, m.artMgr,
) )
m.cachedManager.(*manager).client = func() cache.Cache { return m.cache } m.cachedManager.(*Manager).client = func() cache.Cache { return m.cache }
m.ctx = context.TODO() m.ctx = context.TODO()
} }

View File

@ -25,9 +25,9 @@ import (
"github.com/goharbor/harbor/src/pkg/cached" "github.com/goharbor/harbor/src/pkg/cached"
) )
var _ CachedManager = &manager{} var _ CachedManager = &Manager{}
// ManifestManager is the manager for manifest. // ManifestManager is the Manager for manifest.
type ManifestManager interface { type ManifestManager interface {
// Save manifest to cache. // Save manifest to cache.
Save(ctx context.Context, digest string, manifest []byte) error Save(ctx context.Context, digest string, manifest []byte) error
@ -37,16 +37,16 @@ type ManifestManager interface {
Delete(ctx context.Context, digest string) error Delete(ctx context.Context, digest string) error
} }
// CachedManager is the interface combines raw resource manager and cached manager for better extension. // CachedManager is the interface combines raw resource Manager and cached Manager for better extension.
type CachedManager interface { type CachedManager interface {
// ManifestManager is the manager for manifest. // ManifestManager is the Manager for manifest.
ManifestManager ManifestManager
// Manager is the common interface for resource cache. // Manager is the common interface for resource cache.
cached.Manager cached.Manager
} }
// manager is the cached manager implemented by redis. // Manager is the cached Manager implemented by redis.
type manager struct { type Manager struct {
// client returns the redis cache client. // client returns the redis cache client.
client func() libcache.Cache client func() libcache.Cache
// keyBuilder builds cache object key. // keyBuilder builds cache object key.
@ -55,16 +55,16 @@ type manager struct {
lifetime time.Duration lifetime time.Duration
} }
// NewManager returns the redis cache manager. // NewManager returns the redis cache Manager.
func NewManager() *manager { func NewManager() *Manager {
return &manager{ return &Manager{
client: func() libcache.Cache { return libcache.Default() }, client: func() libcache.Cache { return libcache.Default() },
keyBuilder: cached.NewObjectKey(cached.ResourceTypeManifest), keyBuilder: cached.NewObjectKey(cached.ResourceTypeManifest),
lifetime: time.Duration(config.CacheExpireHours()) * time.Hour, lifetime: time.Duration(config.CacheExpireHours()) * time.Hour,
} }
} }
func (m *manager) Save(ctx context.Context, digest string, manifest []byte) error { func (m *Manager) Save(ctx context.Context, digest string, manifest []byte) error {
key, err := m.keyBuilder.Format("digest", digest) key, err := m.keyBuilder.Format("digest", digest)
if err != nil { if err != nil {
return err return err
@ -73,7 +73,7 @@ func (m *manager) Save(ctx context.Context, digest string, manifest []byte) erro
return m.client().Save(ctx, key, manifest, m.lifetime) return m.client().Save(ctx, key, manifest, m.lifetime)
} }
func (m *manager) Get(ctx context.Context, digest string) ([]byte, error) { func (m *Manager) Get(ctx context.Context, digest string) ([]byte, error) {
key, err := m.keyBuilder.Format("digest", digest) key, err := m.keyBuilder.Format("digest", digest)
if err != nil { if err != nil {
return nil, err return nil, err
@ -87,7 +87,7 @@ func (m *manager) Get(ctx context.Context, digest string) ([]byte, error) {
return nil, err return nil, err
} }
func (m *manager) Delete(ctx context.Context, digest string) error { func (m *Manager) Delete(ctx context.Context, digest string) error {
key, err := m.keyBuilder.Format("digest", digest) key, err := m.keyBuilder.Format("digest", digest)
if err != nil { if err != nil {
return err return err
@ -96,11 +96,11 @@ func (m *manager) Delete(ctx context.Context, digest string) error {
return retry.Retry(func() error { return m.client().Delete(ctx, key) }) return retry.Retry(func() error { return m.client().Delete(ctx, key) })
} }
func (m *manager) ResourceType(ctx context.Context) string { func (m *Manager) ResourceType(ctx context.Context) string {
return cached.ResourceTypeManifest return cached.ResourceTypeManifest
} }
func (m *manager) CountCache(ctx context.Context) (int64, error) { func (m *Manager) CountCache(ctx context.Context) (int64, error) {
// prefix is resource type // prefix is resource type
keys, err := m.client().Keys(ctx, m.ResourceType(ctx)) keys, err := m.client().Keys(ctx, m.ResourceType(ctx))
if err != nil { if err != nil {
@ -110,11 +110,11 @@ func (m *manager) CountCache(ctx context.Context) (int64, error) {
return int64(len(keys)), nil return int64(len(keys)), nil
} }
func (m *manager) DeleteCache(ctx context.Context, key string) error { func (m *Manager) DeleteCache(ctx context.Context, key string) error {
return m.client().Delete(ctx, key) return m.client().Delete(ctx, key)
} }
func (m *manager) FlushAll(ctx context.Context) error { func (m *Manager) FlushAll(ctx context.Context) error {
// prefix is resource type // prefix is resource type
keys, err := m.client().Keys(ctx, m.ResourceType(ctx)) keys, err := m.client().Keys(ctx, m.ResourceType(ctx))
if err != nil { if err != nil {

View File

@ -38,7 +38,7 @@ type managerTestSuite struct {
func (m *managerTestSuite) SetupTest() { func (m *managerTestSuite) SetupTest() {
m.cache = &testcache.Cache{} m.cache = &testcache.Cache{}
m.cachedManager = NewManager() m.cachedManager = NewManager()
m.cachedManager.(*manager).client = func() cache.Cache { return m.cache } m.cachedManager.(*Manager).client = func() cache.Cache { return m.cache }
m.ctx = context.TODO() m.ctx = context.TODO()
m.digest = "sha256:52f431d980baa76878329b68ddb69cb124c25efa6e206d8b0bd797a828f0528e" m.digest = "sha256:52f431d980baa76878329b68ddb69cb124c25efa6e206d8b0bd797a828f0528e"

View File

@ -30,18 +30,18 @@ import (
"github.com/goharbor/harbor/src/pkg/project/models" "github.com/goharbor/harbor/src/pkg/project/models"
) )
var _ CachedManager = &manager{} var _ CachedManager = &Manager{}
// CachedManager is the interface combines raw resource manager and cached manager for better extension. // CachedManager is the interface combines raw resource Manager and cached Manager for better extension.
type CachedManager interface { type CachedManager interface {
// Manager is the raw resource manager. // Manager is the raw resource Manager.
project.Manager project.Manager
// Manager is the common interface for resource cache. // Manager is the common interface for resource cache.
cached.Manager cached.Manager
} }
// manager is the cached manager implemented by redis. // Manager is the cached Manager implemented by redis.
type manager struct { type Manager struct {
// delegator delegates the raw crud to DAO. // delegator delegates the raw crud to DAO.
delegator project.Manager delegator project.Manager
// client returns the redis cache client. // client returns the redis cache client.
@ -52,9 +52,9 @@ type manager struct {
lifetime time.Duration lifetime time.Duration
} }
// NewManager returns the redis cache manager. // NewManager returns the redis cache Manager.
func NewManager(m project.Manager) *manager { func NewManager(m project.Manager) *Manager {
return &manager{ return &Manager{
delegator: m, delegator: m,
client: func() libcache.Cache { return libcache.Default() }, client: func() libcache.Cache { return libcache.Default() },
keyBuilder: cached.NewObjectKey(cached.ResourceTypeProject), keyBuilder: cached.NewObjectKey(cached.ResourceTypeProject),
@ -62,23 +62,23 @@ func NewManager(m project.Manager) *manager {
} }
} }
func (m *manager) Create(ctx context.Context, project *models.Project) (int64, error) { func (m *Manager) Create(ctx context.Context, project *models.Project) (int64, error) {
return m.delegator.Create(ctx, project) return m.delegator.Create(ctx, project)
} }
func (m *manager) Count(ctx context.Context, query *q.Query) (total int64, err error) { func (m *Manager) Count(ctx context.Context, query *q.Query) (total int64, err error) {
return m.delegator.Count(ctx, query) return m.delegator.Count(ctx, query)
} }
func (m *manager) List(ctx context.Context, query *q.Query) ([]*models.Project, error) { func (m *Manager) List(ctx context.Context, query *q.Query) ([]*models.Project, error) {
return m.delegator.List(ctx, query) return m.delegator.List(ctx, query)
} }
func (m *manager) ListRoles(ctx context.Context, projectID int64, userID int, groupIDs ...int) ([]int, error) { func (m *Manager) ListRoles(ctx context.Context, projectID int64, userID int, groupIDs ...int) ([]int, error) {
return m.delegator.ListRoles(ctx, projectID, userID, groupIDs...) return m.delegator.ListRoles(ctx, projectID, userID, groupIDs...)
} }
func (m *manager) Delete(ctx context.Context, id int64) error { func (m *Manager) Delete(ctx context.Context, id int64) error {
p, err := m.Get(ctx, id) p, err := m.Get(ctx, id)
if err != nil { if err != nil {
return err return err
@ -93,7 +93,7 @@ func (m *manager) Delete(ctx context.Context, id int64) error {
return nil return nil
} }
func (m *manager) Get(ctx context.Context, idOrName interface{}) (*models.Project, error) { func (m *Manager) Get(ctx context.Context, idOrName interface{}) (*models.Project, error) {
var ( var (
key string key string
err error err error
@ -139,7 +139,7 @@ func (m *manager) Get(ctx context.Context, idOrName interface{}) (*models.Projec
} }
// cleanUp cleans up data in cache. // cleanUp cleans up data in cache.
func (m *manager) cleanUp(ctx context.Context, p *models.Project) { func (m *Manager) cleanUp(ctx context.Context, p *models.Project) {
// clean index by id // clean index by id
idIdx, err := m.keyBuilder.Format("id", p.ProjectID) idIdx, err := m.keyBuilder.Format("id", p.ProjectID)
if err != nil { if err != nil {
@ -162,11 +162,11 @@ func (m *manager) cleanUp(ctx context.Context, p *models.Project) {
} }
} }
func (m *manager) ResourceType(ctx context.Context) string { func (m *Manager) ResourceType(ctx context.Context) string {
return cached.ResourceTypeProject return cached.ResourceTypeProject
} }
func (m *manager) CountCache(ctx context.Context) (int64, error) { func (m *Manager) CountCache(ctx context.Context) (int64, error) {
// prefix is resource type // prefix is resource type
keys, err := m.client().Keys(ctx, m.ResourceType(ctx)) keys, err := m.client().Keys(ctx, m.ResourceType(ctx))
if err != nil { if err != nil {
@ -176,11 +176,11 @@ func (m *manager) CountCache(ctx context.Context) (int64, error) {
return int64(len(keys)), nil return int64(len(keys)), nil
} }
func (m *manager) DeleteCache(ctx context.Context, key string) error { func (m *Manager) DeleteCache(ctx context.Context, key string) error {
return m.client().Delete(ctx, key) return m.client().Delete(ctx, key)
} }
func (m *manager) FlushAll(ctx context.Context) error { func (m *Manager) FlushAll(ctx context.Context) error {
// prefix is resource type // prefix is resource type
keys, err := m.client().Keys(ctx, m.ResourceType(ctx)) keys, err := m.client().Keys(ctx, m.ResourceType(ctx))
if err != nil { if err != nil {

View File

@ -43,7 +43,7 @@ func (m *managerTestSuite) SetupTest() {
m.cachedManager = NewManager( m.cachedManager = NewManager(
m.projectMgr, m.projectMgr,
) )
m.cachedManager.(*manager).client = func() cache.Cache { return m.cache } m.cachedManager.(*Manager).client = func() cache.Cache { return m.cache }
m.ctx = context.TODO() m.ctx = context.TODO()
} }

View File

@ -29,18 +29,18 @@ import (
"github.com/goharbor/harbor/src/pkg/project/metadata/models" "github.com/goharbor/harbor/src/pkg/project/metadata/models"
) )
var _ CachedManager = &manager{} var _ CachedManager = &Manager{}
// CachedManager is the interface combines raw resource manager and cached manager for better extension. // CachedManager is the interface combines raw resource Manager and cached Manager for better extension.
type CachedManager interface { type CachedManager interface {
// Manager is the raw resource manager. // Manager is the raw resource Manager.
metadata.Manager metadata.Manager
// Manager is the common interface for resource cache. // Manager is the common interface for resource cache.
cached.Manager cached.Manager
} }
// manager is the cached manager implemented by redis. // Manager is the cached Manager implemented by redis.
type manager struct { type Manager struct {
// delegator delegates the raw crud to DAO. // delegator delegates the raw crud to DAO.
delegator metadata.Manager delegator metadata.Manager
// client returns the redis cache client. // client returns the redis cache client.
@ -51,9 +51,9 @@ type manager struct {
lifetime time.Duration lifetime time.Duration
} }
// NewManager returns the redis cache manager. // NewManager returns the redis cache Manager.
func NewManager(m metadata.Manager) *manager { func NewManager(m metadata.Manager) *Manager {
return &manager{ return &Manager{
delegator: m, delegator: m,
client: func() libcache.Cache { return libcache.Default() }, client: func() libcache.Cache { return libcache.Default() },
keyBuilder: cached.NewObjectKey(cached.ResourceTypeProjectMeta), keyBuilder: cached.NewObjectKey(cached.ResourceTypeProjectMeta),
@ -61,15 +61,15 @@ func NewManager(m metadata.Manager) *manager {
} }
} }
func (m *manager) Add(ctx context.Context, projectID int64, meta map[string]string) error { func (m *Manager) Add(ctx context.Context, projectID int64, meta map[string]string) error {
return m.delegator.Add(ctx, projectID, meta) return m.delegator.Add(ctx, projectID, meta)
} }
func (m *manager) List(ctx context.Context, name string, value string) ([]*models.ProjectMetadata, error) { func (m *Manager) List(ctx context.Context, name string, value string) ([]*models.ProjectMetadata, error) {
return m.delegator.List(ctx, name, value) return m.delegator.List(ctx, name, value)
} }
func (m *manager) Get(ctx context.Context, projectID int64, meta ...string) (map[string]string, error) { func (m *Manager) Get(ctx context.Context, projectID int64, meta ...string) (map[string]string, error) {
key, err := m.keyBuilder.Format("projectID", projectID, "meta", strings.Join(meta, ",")) key, err := m.keyBuilder.Format("projectID", projectID, "meta", strings.Join(meta, ","))
if err != nil { if err != nil {
return nil, err return nil, err
@ -95,7 +95,7 @@ func (m *manager) Get(ctx context.Context, projectID int64, meta ...string) (map
return result, nil return result, nil
} }
func (m *manager) Delete(ctx context.Context, projectID int64, meta ...string) error { func (m *Manager) Delete(ctx context.Context, projectID int64, meta ...string) error {
// pass on delete operation // pass on delete operation
if err := m.delegator.Delete(ctx, projectID, meta...); err != nil { if err := m.delegator.Delete(ctx, projectID, meta...); err != nil {
return err return err
@ -105,7 +105,7 @@ func (m *manager) Delete(ctx context.Context, projectID int64, meta ...string) e
return nil return nil
} }
func (m *manager) Update(ctx context.Context, projectID int64, meta map[string]string) error { func (m *Manager) Update(ctx context.Context, projectID int64, meta map[string]string) error {
if err := m.delegator.Update(ctx, projectID, meta); err != nil { if err := m.delegator.Update(ctx, projectID, meta); err != nil {
return err return err
} }
@ -130,7 +130,7 @@ func (m *manager) Update(ctx context.Context, projectID int64, meta map[string]s
} }
// cleanUp cleans up data in cache. // cleanUp cleans up data in cache.
func (m *manager) cleanUp(ctx context.Context, projectID int64, meta ...string) { func (m *Manager) cleanUp(ctx context.Context, projectID int64, meta ...string) {
key, err := m.keyBuilder.Format("projectID", projectID, "meta", strings.Join(meta, ",")) key, err := m.keyBuilder.Format("projectID", projectID, "meta", strings.Join(meta, ","))
if err != nil { if err != nil {
log.Errorf("format project metadata key error: %v", err) log.Errorf("format project metadata key error: %v", err)
@ -142,11 +142,11 @@ func (m *manager) cleanUp(ctx context.Context, projectID int64, meta ...string)
} }
} }
func (m *manager) ResourceType(ctx context.Context) string { func (m *Manager) ResourceType(ctx context.Context) string {
return cached.ResourceTypeProjectMeta return cached.ResourceTypeProjectMeta
} }
func (m *manager) CountCache(ctx context.Context) (int64, error) { func (m *Manager) CountCache(ctx context.Context) (int64, error) {
// prefix is resource type // prefix is resource type
keys, err := m.client().Keys(ctx, m.ResourceType(ctx)) keys, err := m.client().Keys(ctx, m.ResourceType(ctx))
if err != nil { if err != nil {
@ -156,11 +156,11 @@ func (m *manager) CountCache(ctx context.Context) (int64, error) {
return int64(len(keys)), nil return int64(len(keys)), nil
} }
func (m *manager) DeleteCache(ctx context.Context, key string) error { func (m *Manager) DeleteCache(ctx context.Context, key string) error {
return m.client().Delete(ctx, key) return m.client().Delete(ctx, key)
} }
func (m *manager) FlushAll(ctx context.Context) error { func (m *Manager) FlushAll(ctx context.Context) error {
// prefix is resource type // prefix is resource type
keys, err := m.client().Keys(ctx, m.ResourceType(ctx)) keys, err := m.client().Keys(ctx, m.ResourceType(ctx))
if err != nil { if err != nil {

View File

@ -42,7 +42,7 @@ func (m *managerTestSuite) SetupTest() {
m.cachedManager = NewManager( m.cachedManager = NewManager(
m.projectMetaMgr, m.projectMetaMgr,
) )
m.cachedManager.(*manager).client = func() cache.Cache { return m.cache } m.cachedManager.(*Manager).client = func() cache.Cache { return m.cache }
m.ctx = context.TODO() m.ctx = context.TODO()
} }

View File

@ -29,18 +29,18 @@ import (
"github.com/goharbor/harbor/src/pkg/repository/model" "github.com/goharbor/harbor/src/pkg/repository/model"
) )
var _ CachedManager = &manager{} var _ CachedManager = &Manager{}
// CachedManager is the interface combines raw resource manager and cached manager for better extension. // CachedManager is the interface combines raw resource Manager and cached Manager for better extension.
type CachedManager interface { type CachedManager interface {
// Manager is the raw resource manager. // Manager is the raw resource Manager.
repository.Manager repository.Manager
// Manager is the common interface for resource cache. // Manager is the common interface for resource cache.
cached.Manager cached.Manager
} }
// manager is the cached manager implemented by redis. // Manager is the cached Manager implemented by redis.
type manager struct { type Manager struct {
// delegator delegates the raw crud to DAO. // delegator delegates the raw crud to DAO.
delegator repository.Manager delegator repository.Manager
// client returns the redis cache client. // client returns the redis cache client.
@ -51,9 +51,9 @@ type manager struct {
lifetime time.Duration lifetime time.Duration
} }
// NewManager returns the redis cache manager. // NewManager returns the redis cache Manager.
func NewManager(m repository.Manager) *manager { func NewManager(m repository.Manager) *Manager {
return &manager{ return &Manager{
delegator: m, delegator: m,
client: func() libcache.Cache { return libcache.Default() }, client: func() libcache.Cache { return libcache.Default() },
keyBuilder: cached.NewObjectKey(cached.ResourceTypeRepository), keyBuilder: cached.NewObjectKey(cached.ResourceTypeRepository),
@ -61,23 +61,23 @@ func NewManager(m repository.Manager) *manager {
} }
} }
func (m *manager) Count(ctx context.Context, query *q.Query) (int64, error) { func (m *Manager) Count(ctx context.Context, query *q.Query) (int64, error) {
return m.delegator.Count(ctx, query) return m.delegator.Count(ctx, query)
} }
func (m *manager) List(ctx context.Context, query *q.Query) ([]*model.RepoRecord, error) { func (m *Manager) List(ctx context.Context, query *q.Query) ([]*model.RepoRecord, error) {
return m.delegator.List(ctx, query) return m.delegator.List(ctx, query)
} }
func (m *manager) Create(ctx context.Context, repo *model.RepoRecord) (int64, error) { func (m *Manager) Create(ctx context.Context, repo *model.RepoRecord) (int64, error) {
return m.delegator.Create(ctx, repo) return m.delegator.Create(ctx, repo)
} }
func (m *manager) NonEmptyRepos(ctx context.Context) ([]*model.RepoRecord, error) { func (m *Manager) NonEmptyRepos(ctx context.Context) ([]*model.RepoRecord, error) {
return m.delegator.NonEmptyRepos(ctx) return m.delegator.NonEmptyRepos(ctx)
} }
func (m *manager) Get(ctx context.Context, id int64) (*model.RepoRecord, error) { func (m *Manager) Get(ctx context.Context, id int64) (*model.RepoRecord, error) {
key, err := m.keyBuilder.Format("id", id) key, err := m.keyBuilder.Format("id", id)
if err != nil { if err != nil {
return nil, err return nil, err
@ -103,7 +103,7 @@ func (m *manager) Get(ctx context.Context, id int64) (*model.RepoRecord, error)
return repo, nil return repo, nil
} }
func (m *manager) GetByName(ctx context.Context, name string) (*model.RepoRecord, error) { func (m *Manager) GetByName(ctx context.Context, name string) (*model.RepoRecord, error) {
key, err := m.keyBuilder.Format("name", name) key, err := m.keyBuilder.Format("name", name)
if err != nil { if err != nil {
return nil, err return nil, err
@ -127,7 +127,7 @@ func (m *manager) GetByName(ctx context.Context, name string) (*model.RepoRecord
return repo, nil return repo, nil
} }
func (m *manager) Delete(ctx context.Context, id int64) error { func (m *Manager) Delete(ctx context.Context, id int64) error {
repo, err := m.Get(ctx, id) repo, err := m.Get(ctx, id)
if err != nil { if err != nil {
return err return err
@ -141,7 +141,7 @@ func (m *manager) Delete(ctx context.Context, id int64) error {
return nil return nil
} }
func (m *manager) Update(ctx context.Context, repo *model.RepoRecord, props ...string) error { func (m *Manager) Update(ctx context.Context, repo *model.RepoRecord, props ...string) error {
// pass on update operation // pass on update operation
if err := m.delegator.Update(ctx, repo, props...); err != nil { if err := m.delegator.Update(ctx, repo, props...); err != nil {
return err return err
@ -151,7 +151,7 @@ func (m *manager) Update(ctx context.Context, repo *model.RepoRecord, props ...s
return nil return nil
} }
func (m *manager) AddPullCount(ctx context.Context, id int64, count uint64) error { func (m *Manager) AddPullCount(ctx context.Context, id int64, count uint64) error {
repo, err := m.Get(ctx, id) repo, err := m.Get(ctx, id)
if err != nil { if err != nil {
return err return err
@ -166,7 +166,7 @@ func (m *manager) AddPullCount(ctx context.Context, id int64, count uint64) erro
} }
// cleanUp cleans up data in cache. // cleanUp cleans up data in cache.
func (m *manager) cleanUp(ctx context.Context, repo *model.RepoRecord) { func (m *Manager) cleanUp(ctx context.Context, repo *model.RepoRecord) {
// clean index by id // clean index by id
idIdx, err := m.keyBuilder.Format("id", repo.RepositoryID) idIdx, err := m.keyBuilder.Format("id", repo.RepositoryID)
if err != nil { if err != nil {
@ -190,7 +190,7 @@ func (m *manager) cleanUp(ctx context.Context, repo *model.RepoRecord) {
} }
// refreshCache refreshes cache. // refreshCache refreshes cache.
func (m *manager) refreshCache(ctx context.Context, repo *model.RepoRecord) { func (m *Manager) refreshCache(ctx context.Context, repo *model.RepoRecord) {
// refreshCache used for AddPullCount, because we have a background goroutine to // refreshCache used for AddPullCount, because we have a background goroutine to
// update per repo's pull_count in period time, in that case, we don't want to lose // update per repo's pull_count in period time, in that case, we don't want to lose
// cache every fixed interval, so prefer to use refreshCache instead of cleanUp. // cache every fixed interval, so prefer to use refreshCache instead of cleanUp.
@ -214,11 +214,11 @@ func (m *manager) refreshCache(ctx context.Context, repo *model.RepoRecord) {
} }
} }
func (m *manager) ResourceType(ctx context.Context) string { func (m *Manager) ResourceType(ctx context.Context) string {
return cached.ResourceTypeRepository return cached.ResourceTypeRepository
} }
func (m *manager) CountCache(ctx context.Context) (int64, error) { func (m *Manager) CountCache(ctx context.Context) (int64, error) {
// prefix is resource type // prefix is resource type
keys, err := m.client().Keys(ctx, m.ResourceType(ctx)) keys, err := m.client().Keys(ctx, m.ResourceType(ctx))
if err != nil { if err != nil {
@ -228,11 +228,11 @@ func (m *manager) CountCache(ctx context.Context) (int64, error) {
return int64(len(keys)), nil return int64(len(keys)), nil
} }
func (m *manager) DeleteCache(ctx context.Context, key string) error { func (m *Manager) DeleteCache(ctx context.Context, key string) error {
return m.client().Delete(ctx, key) return m.client().Delete(ctx, key)
} }
func (m *manager) FlushAll(ctx context.Context) error { func (m *Manager) FlushAll(ctx context.Context) error {
// prefix is resource type // prefix is resource type
keys, err := m.client().Keys(ctx, m.ResourceType(ctx)) keys, err := m.client().Keys(ctx, m.ResourceType(ctx))
if err != nil { if err != nil {

View File

@ -41,7 +41,7 @@ func (m *managerTestSuite) SetupTest() {
m.cachedManager = NewManager( m.cachedManager = NewManager(
m.repoMgr, m.repoMgr,
) )
m.cachedManager.(*manager).client = func() cache.Cache { return m.cache } m.cachedManager.(*Manager).client = func() cache.Cache { return m.cache }
m.ctx = context.TODO() m.ctx = context.TODO()
} }

View File

@ -180,10 +180,10 @@ func (c *CfgManager) ValidateCfg(ctx context.Context, cfgs map[string]interface{
for key, value := range cfgs { for key, value := range cfgs {
item, exist := metadata.Instance().GetByName(key) item, exist := metadata.Instance().GetByName(key)
if !exist { if !exist {
return errors.New(fmt.Sprintf("invalid config, item not defined in metadatalist, %v", key)) return fmt.Errorf("invalid config, item not defined in metadatalist, %v", key)
} }
if item.Scope == metadata.SystemScope { if item.Scope == metadata.SystemScope {
return errors.New(fmt.Sprintf("system config items cannot be updated, item: %v", key)) return fmt.Errorf("system config items cannot be updated, item: %v", key)
} }
strVal := utils.GetStrValueOfAnyType(value) strVal := utils.GetStrValueOfAnyType(value)
_, err := metadata.NewCfgValue(key, strVal) _, err := metadata.NewCfgValue(key, strVal)

View File

@ -114,11 +114,11 @@ func (c *Client) ListProjects(name string) ([]*Project, error) {
} }
// ListProjectsWithQuery lists projects with query // ListProjectsWithQuery lists projects with query
func (c *Client) ListProjectsWithQuery(q string, with_detail bool) ([]*Project, error) { func (c *Client) ListProjectsWithQuery(q string, withDetail bool) ([]*Project, error) {
projects := []*Project{} projects := []*Project{}
// if old version does not support query, it will fallback to normal // if old version does not support query, it will fallback to normal
// list(list all). // list(list all).
url := fmt.Sprintf("%s/projects?q=%s&with_detail=%t", c.BasePath(), url.QueryEscape(q), with_detail) url := fmt.Sprintf("%s/projects?q=%s&with_detail=%t", c.BasePath(), url.QueryEscape(q), withDetail)
if err := c.C.GetAndIteratePagination(url, &projects); err != nil { if err := c.C.GetAndIteratePagination(url, &projects); err != nil {
return nil, err return nil, err
} }

View File

@ -24,7 +24,7 @@ import (
) )
var ( var (
errInvalidTcrEndpoint error = errors.New("[tencent-tcr.newAdapter] Invalid TCR instance endpoint") errInvalidTcrEndpoint = errors.New("[tencent-tcr.newAdapter] Invalid TCR instance endpoint")
) )
func init() { func init() {

View File

@ -90,7 +90,7 @@ func NewManager() Manager {
} }
func (mgr *systemArtifactManager) Create(ctx context.Context, artifactRecord *model.SystemArtifact, reader io.Reader) (int64, error) { func (mgr *systemArtifactManager) Create(ctx context.Context, artifactRecord *model.SystemArtifact, reader io.Reader) (int64, error) {
var artifactId int64 var artifactID int64
// the entire create operation is executed within a transaction to ensure that any failures // the entire create operation is executed within a transaction to ensure that any failures
// during the blob creation or tracking record creation result in a rollback of the transaction // during the blob creation or tracking record creation result in a rollback of the transaction
@ -105,11 +105,11 @@ func (mgr *systemArtifactManager) Create(ctx context.Context, artifactRecord *mo
if err != nil { if err != nil {
return err return err
} }
artifactId = id artifactID = id
return nil return nil
})(ctx) })(ctx)
return artifactId, createError return artifactID, createError
} }
func (mgr *systemArtifactManager) Read(ctx context.Context, vendor string, repository string, digest string) (io.ReadCloser, error) { func (mgr *systemArtifactManager) Read(ctx context.Context, vendor string, repository string, digest string) (io.ReadCloser, error) {
@ -242,7 +242,7 @@ func (mgr *systemArtifactManager) cleanup(ctx context.Context, criteria Selector
return totalRecordsDeleted, totalReclaimedSize, err return totalRecordsDeleted, totalReclaimedSize, err
} }
totalReclaimedSize += record.Size totalReclaimedSize += record.Size
totalRecordsDeleted += 1 totalRecordsDeleted++
} }
return totalRecordsDeleted, totalReclaimedSize, nil return totalRecordsDeleted, totalReclaimedSize, nil
} }

View File

@ -351,7 +351,7 @@ func (e *executionDAO) querySetter(ctx context.Context, query *q.Query) (orm.Que
args = append(args, item) args = append(args, item)
} }
args = append(args, value) args = append(args, value)
inClause, err := orm.CreateInClause(ctx, buildInClauseSqlForExtraAttrs(keys), args...) inClause, err := orm.CreateInClause(ctx, buildInClauseSQLForExtraAttrs(keys), args...)
if err != nil { if err != nil {
return nil, err return nil, err
} }
@ -362,7 +362,7 @@ func (e *executionDAO) querySetter(ctx context.Context, query *q.Query) (orm.Que
} }
// Param keys is strings.Split() after trim "extra_attrs."/"ExtraAttrs." prefix // Param keys is strings.Split() after trim "extra_attrs."/"ExtraAttrs." prefix
func buildInClauseSqlForExtraAttrs(keys []string) string { func buildInClauseSQLForExtraAttrs(keys []string) string {
switch len(keys) { switch len(keys) {
case 0: case 0:
// won't fall into this case, as the if condition on "keyPrefix == key" // won't fall into this case, as the if condition on "keyPrefix == key"

View File

@ -330,7 +330,7 @@ func TestExecutionDAOSuite(t *testing.T) {
suite.Run(t, &executionDAOTestSuite{}) suite.Run(t, &executionDAOTestSuite{})
} }
func Test_buildInClauseSqlForExtraAttrs(t *testing.T) { func Test_buildInClauseSQLForExtraAttrs(t *testing.T) {
type args struct { type args struct {
keys []string keys []string
} }
@ -346,8 +346,8 @@ func Test_buildInClauseSqlForExtraAttrs(t *testing.T) {
} }
for _, tt := range tests { for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) { t.Run(tt.name, func(t *testing.T) {
if got := buildInClauseSqlForExtraAttrs(tt.args.keys); got != tt.want { if got := buildInClauseSQLForExtraAttrs(tt.args.keys); got != tt.want {
t.Errorf("buildInClauseSqlForExtraAttrs() = %v, want %v", got, tt.want) t.Errorf("buildInClauseSQLForExtraAttrs() = %v, want %v", got, tt.want)
} }
}) })
} }

View File

@ -29,7 +29,7 @@ var (
mediaTypeCosignLayer = "application/vnd.dev.cosign.simplesigning.v1+json" mediaTypeCosignLayer = "application/vnd.dev.cosign.simplesigning.v1+json"
) )
// CosignSignatureMiddleware middleware to record the linkeage of artifact and its accessory // SignatureMiddleware middleware to record the linkeage of artifact and its accessory
/* PUT /v2/library/hello-world/manifests/sha256-1b26826f602946860c279fce658f31050cff2c596583af237d971f4629b57792.sig /* PUT /v2/library/hello-world/manifests/sha256-1b26826f602946860c279fce658f31050cff2c596583af237d971f4629b57792.sig
{ {
"schemaVersion":2, "schemaVersion":2,
@ -50,7 +50,7 @@ var (
] ]
} }
*/ */
func CosignSignatureMiddleware() func(http.Handler) http.Handler { func SignatureMiddleware() func(http.Handler) http.Handler {
return middleware.AfterResponse(func(w http.ResponseWriter, r *http.Request, statusCode int) error { return middleware.AfterResponse(func(w http.ResponseWriter, r *http.Request, statusCode int) error {
if statusCode != http.StatusCreated { if statusCode != http.StatusCreated {
return nil return nil

View File

@ -15,6 +15,8 @@ import (
"github.com/goharbor/harbor/src/pkg/accessory" "github.com/goharbor/harbor/src/pkg/accessory"
"github.com/goharbor/harbor/src/pkg/accessory/model" "github.com/goharbor/harbor/src/pkg/accessory/model"
accessorymodel "github.com/goharbor/harbor/src/pkg/accessory/model" accessorymodel "github.com/goharbor/harbor/src/pkg/accessory/model"
_ "github.com/goharbor/harbor/src/pkg/accessory/model/base"
_ "github.com/goharbor/harbor/src/pkg/accessory/model/cosign"
"github.com/goharbor/harbor/src/pkg/artifact" "github.com/goharbor/harbor/src/pkg/artifact"
"github.com/goharbor/harbor/src/pkg/distribution" "github.com/goharbor/harbor/src/pkg/distribution"
htesting "github.com/goharbor/harbor/src/testing" htesting "github.com/goharbor/harbor/src/testing"
@ -137,7 +139,7 @@ func (suite *MiddlewareTestSuite) TestCosignSignature() {
res := httptest.NewRecorder() res := httptest.NewRecorder()
next := suite.NextHandler(http.StatusCreated, map[string]string{"Docker-Content-Digest": descriptor.Digest.String()}) next := suite.NextHandler(http.StatusCreated, map[string]string{"Docker-Content-Digest": descriptor.Digest.String()})
CosignSignatureMiddleware()(next).ServeHTTP(res, req) SignatureMiddleware()(next).ServeHTTP(res, req)
suite.Equal(http.StatusCreated, res.Code) suite.Equal(http.StatusCreated, res.Code)
accs, err := accessory.Mgr.List(suite.Context(), &q.Query{ accs, err := accessory.Mgr.List(suite.Context(), &q.Query{
@ -166,7 +168,7 @@ func (suite *MiddlewareTestSuite) TestCosignSignatureDup() {
res := httptest.NewRecorder() res := httptest.NewRecorder()
next := suite.NextHandler(http.StatusCreated, map[string]string{"Docker-Content-Digest": descriptor.Digest.String()}) next := suite.NextHandler(http.StatusCreated, map[string]string{"Docker-Content-Digest": descriptor.Digest.String()})
CosignSignatureMiddleware()(next).ServeHTTP(res, req) SignatureMiddleware()(next).ServeHTTP(res, req)
suite.Equal(http.StatusCreated, res.Code) suite.Equal(http.StatusCreated, res.Code)
accs, err := accessory.Mgr.List(suite.Context(), &q.Query{ accs, err := accessory.Mgr.List(suite.Context(), &q.Query{

View File

@ -79,7 +79,7 @@ func RegisterRoutes() {
Middleware(repoproxy.DisableBlobAndManifestUploadMiddleware()). Middleware(repoproxy.DisableBlobAndManifestUploadMiddleware()).
Middleware(immutable.Middleware()). Middleware(immutable.Middleware()).
Middleware(quota.PutManifestMiddleware()). Middleware(quota.PutManifestMiddleware()).
Middleware(cosign.CosignSignatureMiddleware()). Middleware(cosign.SignatureMiddleware()).
Middleware(blob.PutManifestMiddleware()). Middleware(blob.PutManifestMiddleware()).
HandlerFunc(putManifest) HandlerFunc(putManifest)
// blob head // blob head