mirror of
https://github.com/goharbor/harbor.git
synced 2024-09-26 04:23:22 +02:00
fix: update code in compliance with golangci-lint revive (#17087)
Signed-off-by: Shengwen Yu <yshengwen@vmware.com>
This commit is contained in:
parent
94bf1c0ebd
commit
315d8a8993
@ -25,7 +25,7 @@ linters:
|
|||||||
- ineffassign
|
- ineffassign
|
||||||
# - nakedret
|
# - nakedret
|
||||||
# - nolintlint
|
# - nolintlint
|
||||||
# - revive
|
- revive
|
||||||
- whitespace
|
- whitespace
|
||||||
- bodyclose
|
- bodyclose
|
||||||
- deadcode
|
- deadcode
|
||||||
|
@ -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) {
|
||||||
|
@ -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"
|
||||||
|
@ -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
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -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,
|
||||||
|
@ -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() {
|
||||||
|
@ -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
|
||||||
|
@ -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 (
|
||||||
|
@ -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"
|
||||||
|
@ -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 {
|
||||||
|
@ -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()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -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 {
|
||||||
|
@ -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"
|
||||||
|
@ -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 {
|
||||||
|
@ -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()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -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 {
|
||||||
|
@ -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()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -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 {
|
||||||
|
@ -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()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -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)
|
||||||
|
@ -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
|
||||||
}
|
}
|
||||||
|
@ -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() {
|
||||||
|
@ -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
|
||||||
}
|
}
|
||||||
|
@ -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"
|
||||||
|
@ -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)
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
@ -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
|
||||||
|
@ -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{
|
||||||
|
@ -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
|
||||||
|
Loading…
Reference in New Issue
Block a user