mirror of
https://github.com/goharbor/harbor.git
synced 2024-09-13 06:28:19 +02:00
Fix bugs found in running the retention workflow
Fix bugs found in running the retention workflow Signed-off-by: Wenkai Yin <yinw@vmware.com>
This commit is contained in:
parent
3a7066346b
commit
ab792019db
@ -20,10 +20,9 @@ import (
|
|||||||
"strings"
|
"strings"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
"github.com/goharbor/harbor/src/pkg/retention/dep"
|
|
||||||
|
|
||||||
"github.com/goharbor/harbor/src/jobservice/job"
|
"github.com/goharbor/harbor/src/jobservice/job"
|
||||||
"github.com/goharbor/harbor/src/jobservice/logger"
|
"github.com/goharbor/harbor/src/jobservice/logger"
|
||||||
|
"github.com/goharbor/harbor/src/pkg/retention/dep"
|
||||||
"github.com/goharbor/harbor/src/pkg/retention/policy"
|
"github.com/goharbor/harbor/src/pkg/retention/policy"
|
||||||
"github.com/goharbor/harbor/src/pkg/retention/policy/lwp"
|
"github.com/goharbor/harbor/src/pkg/retention/policy/lwp"
|
||||||
"github.com/goharbor/harbor/src/pkg/retention/res"
|
"github.com/goharbor/harbor/src/pkg/retention/res"
|
||||||
@ -215,11 +214,17 @@ func getParamRepo(params job.Parameters) (*res.Repository, error) {
|
|||||||
return nil, errors.Errorf("missing parameter: %s", ParamRepo)
|
return nil, errors.Errorf("missing parameter: %s", ParamRepo)
|
||||||
}
|
}
|
||||||
|
|
||||||
repo, ok := v.(*res.Repository)
|
fmt.Printf("%T", v)
|
||||||
|
repoMap, ok := v.(map[string]interface{})
|
||||||
if !ok {
|
if !ok {
|
||||||
return nil, errors.Errorf("invalid parameter: %s", ParamRepo)
|
return nil, errors.Errorf("invalid parameter: %s", ParamRepo)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
repo := &res.Repository{}
|
||||||
|
if err := repo.FromMap(repoMap); err != nil {
|
||||||
|
return nil, fmt.Errorf("failed to convert map to repository: %v", err)
|
||||||
|
}
|
||||||
|
|
||||||
return repo, nil
|
return repo, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -229,10 +234,15 @@ func getParamMeta(params job.Parameters) (*lwp.Metadata, error) {
|
|||||||
return nil, errors.Errorf("missing parameter: %s", ParamMeta)
|
return nil, errors.Errorf("missing parameter: %s", ParamMeta)
|
||||||
}
|
}
|
||||||
|
|
||||||
meta, ok := v.(*lwp.Metadata)
|
metaMap, ok := v.(map[string]interface{})
|
||||||
if !ok {
|
if !ok {
|
||||||
return nil, errors.Errorf("invalid parameter: %s", ParamMeta)
|
return nil, errors.Errorf("invalid parameter: %s", ParamMeta)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
meta := &lwp.Metadata{}
|
||||||
|
if err := meta.FromMap(metaMap); err != nil {
|
||||||
|
return nil, fmt.Errorf("failed to convert map to metadata: %v", err)
|
||||||
|
}
|
||||||
|
|
||||||
return meta, nil
|
return meta, nil
|
||||||
}
|
}
|
||||||
|
@ -16,6 +16,7 @@ package retention
|
|||||||
|
|
||||||
import (
|
import (
|
||||||
"context"
|
"context"
|
||||||
|
"encoding/json"
|
||||||
"errors"
|
"errors"
|
||||||
"fmt"
|
"fmt"
|
||||||
"testing"
|
"testing"
|
||||||
@ -77,11 +78,14 @@ func (suite *JobTestSuite) TearDownSuite() {
|
|||||||
func (suite *JobTestSuite) TestRunSuccess() {
|
func (suite *JobTestSuite) TestRunSuccess() {
|
||||||
params := make(job.Parameters)
|
params := make(job.Parameters)
|
||||||
params[ParamDryRun] = false
|
params[ParamDryRun] = false
|
||||||
params[ParamRepo] = &res.Repository{
|
repository := &res.Repository{
|
||||||
Namespace: "library",
|
Namespace: "library",
|
||||||
Name: "harbor",
|
Name: "harbor",
|
||||||
Kind: res.Image,
|
Kind: res.Image,
|
||||||
}
|
}
|
||||||
|
repoMap, err := toMap(repository)
|
||||||
|
require.Nil(suite.T(), err)
|
||||||
|
params[ParamRepo] = repoMap
|
||||||
|
|
||||||
scopeSelectors := make(map[string][]*rule.Selector)
|
scopeSelectors := make(map[string][]*rule.Selector)
|
||||||
scopeSelectors["project"] = []*rule.Selector{{
|
scopeSelectors["project"] = []*rule.Selector{{
|
||||||
@ -93,7 +97,7 @@ func (suite *JobTestSuite) TestRunSuccess() {
|
|||||||
ruleParams := make(rule.Parameters)
|
ruleParams := make(rule.Parameters)
|
||||||
ruleParams[latestk.ParameterK] = 10
|
ruleParams[latestk.ParameterK] = 10
|
||||||
|
|
||||||
params[ParamMeta] = &lwp.Metadata{
|
meta := &lwp.Metadata{
|
||||||
Algorithm: policy.AlgorithmOR,
|
Algorithm: policy.AlgorithmOR,
|
||||||
Rules: []*rule.Metadata{
|
Rules: []*rule.Metadata{
|
||||||
{
|
{
|
||||||
@ -115,9 +119,12 @@ func (suite *JobTestSuite) TestRunSuccess() {
|
|||||||
},
|
},
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
|
metaMap, err := toMap(meta)
|
||||||
|
require.Nil(suite.T(), err)
|
||||||
|
params[ParamMeta] = metaMap
|
||||||
|
|
||||||
j := &Job{}
|
j := &Job{}
|
||||||
err := j.Validate(params)
|
err = j.Validate(params)
|
||||||
require.NoError(suite.T(), err)
|
require.NoError(suite.T(), err)
|
||||||
|
|
||||||
err = j.Run(&fakeJobContext{}, params)
|
err = j.Run(&fakeJobContext{}, params)
|
||||||
@ -232,3 +239,15 @@ func (c *fakeJobContext) GetLogger() logger.Interface {
|
|||||||
func (c *fakeJobContext) Tracker() job.Tracker {
|
func (c *fakeJobContext) Tracker() job.Tracker {
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func toMap(v interface{}) (map[string]interface{}, error) {
|
||||||
|
data, err := json.Marshal(v)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
m := map[string]interface{}{}
|
||||||
|
if err = json.Unmarshal(data, &m); err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
return m, nil
|
||||||
|
}
|
||||||
|
@ -205,7 +205,7 @@ func (l *launcher) Launch(ply *policy.Metadata, executionID int64, isDryRun bool
|
|||||||
Metadata: &models.JobMetadata{
|
Metadata: &models.JobMetadata{
|
||||||
JobKind: job.KindGeneric,
|
JobKind: job.KindGeneric,
|
||||||
},
|
},
|
||||||
StatusHook: fmt.Sprintf("%s/service/notifications/jobs/retention/tasks/%d", l.internalCoreURL, jobData.taskID),
|
StatusHook: fmt.Sprintf("%s/service/notifications/jobs/retention/task/%d", l.internalCoreURL, jobData.taskID),
|
||||||
}
|
}
|
||||||
j.Name = job.Retention
|
j.Name = job.Retention
|
||||||
j.Parameters = map[string]interface{}{
|
j.Parameters = map[string]interface{}{
|
||||||
|
@ -15,7 +15,11 @@
|
|||||||
// Package lwp = lightweight policy
|
// Package lwp = lightweight policy
|
||||||
package lwp
|
package lwp
|
||||||
|
|
||||||
import "github.com/goharbor/harbor/src/pkg/retention/policy/rule"
|
import (
|
||||||
|
"encoding/json"
|
||||||
|
|
||||||
|
"github.com/goharbor/harbor/src/pkg/retention/policy/rule"
|
||||||
|
)
|
||||||
|
|
||||||
// Metadata contains partial metadata of policy
|
// Metadata contains partial metadata of policy
|
||||||
// It's a lightweight version of policy.Metadata
|
// It's a lightweight version of policy.Metadata
|
||||||
@ -27,3 +31,15 @@ type Metadata struct {
|
|||||||
// Rule collection
|
// Rule collection
|
||||||
Rules []*rule.Metadata `json:"rules"`
|
Rules []*rule.Metadata `json:"rules"`
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// FromMap constructs the metadata struct from map
|
||||||
|
func (meta *Metadata) FromMap(m map[string]interface{}) error {
|
||||||
|
mdata, err := json.Marshal(&m)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
if err := json.Unmarshal(mdata, meta); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
@ -16,6 +16,7 @@ package res
|
|||||||
|
|
||||||
import (
|
import (
|
||||||
"encoding/base64"
|
"encoding/base64"
|
||||||
|
"encoding/json"
|
||||||
"fmt"
|
"fmt"
|
||||||
)
|
)
|
||||||
|
|
||||||
@ -37,6 +38,18 @@ type Repository struct {
|
|||||||
Kind string
|
Kind string
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// FromMap constructs the repository struct from map
|
||||||
|
func (r *Repository) FromMap(m map[string]interface{}) error {
|
||||||
|
mdata, err := json.Marshal(&m)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
if err := json.Unmarshal(mdata, r); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
// Candidate for retention processor to match
|
// Candidate for retention processor to match
|
||||||
type Candidate struct {
|
type Candidate struct {
|
||||||
// Namespace(project) ID
|
// Namespace(project) ID
|
||||||
|
@ -17,7 +17,6 @@ package doublestar
|
|||||||
import (
|
import (
|
||||||
"github.com/bmatcuk/doublestar"
|
"github.com/bmatcuk/doublestar"
|
||||||
"github.com/goharbor/harbor/src/pkg/retention/res"
|
"github.com/goharbor/harbor/src/pkg/retention/res"
|
||||||
"github.com/goharbor/harbor/src/pkg/retention/res/selectors"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
const (
|
const (
|
||||||
@ -101,15 +100,3 @@ func match(pattern, str string) (bool, error) {
|
|||||||
}
|
}
|
||||||
return doublestar.Match(pattern, str)
|
return doublestar.Match(pattern, str)
|
||||||
}
|
}
|
||||||
|
|
||||||
func init() {
|
|
||||||
// Register doublestar selector
|
|
||||||
selectors.Register(Kind, []string{
|
|
||||||
Matches,
|
|
||||||
Excludes,
|
|
||||||
RepoMatches,
|
|
||||||
RepoExcludes,
|
|
||||||
NSMatches,
|
|
||||||
NSExcludes,
|
|
||||||
}, New)
|
|
||||||
}
|
|
||||||
|
@ -15,11 +15,25 @@
|
|||||||
package selectors
|
package selectors
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"github.com/goharbor/harbor/src/pkg/retention/res"
|
|
||||||
"github.com/pkg/errors"
|
|
||||||
"sync"
|
"sync"
|
||||||
|
|
||||||
|
"github.com/goharbor/harbor/src/pkg/retention/res"
|
||||||
|
"github.com/goharbor/harbor/src/pkg/retention/res/selectors/doublestar"
|
||||||
|
"github.com/pkg/errors"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
func init() {
|
||||||
|
// Register doublestar selector
|
||||||
|
Register(doublestar.Kind, []string{
|
||||||
|
doublestar.Matches,
|
||||||
|
doublestar.Excludes,
|
||||||
|
doublestar.RepoMatches,
|
||||||
|
doublestar.RepoExcludes,
|
||||||
|
doublestar.NSMatches,
|
||||||
|
doublestar.NSExcludes,
|
||||||
|
}, doublestar.New)
|
||||||
|
}
|
||||||
|
|
||||||
// index for keeping the mapping between selector meta and its implementation
|
// index for keeping the mapping between selector meta and its implementation
|
||||||
var index sync.Map
|
var index sync.Map
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user