mirror of
https://github.com/goharbor/harbor.git
synced 2024-11-23 18:55:18 +01:00
Merge pull request #3541 from ywk253100/171102_filter_chain
Implement filter chain
This commit is contained in:
commit
ef0556d3f8
57
src/replication/source/default_filter_chain.go
Normal file
57
src/replication/source/default_filter_chain.go
Normal file
@ -0,0 +1,57 @@
|
||||
// Copyright (c) 2017 VMware, Inc. All Rights Reserved.
|
||||
//
|
||||
// Licensed under the Apache License, Version 2.0 (the "License");
|
||||
// you may not use this file except in compliance with the License.
|
||||
// You may obtain a copy of the License at
|
||||
//
|
||||
// http://www.apache.org/licenses/LICENSE-2.0
|
||||
//
|
||||
// Unless required by applicable law or agreed to in writing, software
|
||||
// distributed under the License is distributed on an "AS IS" BASIS,
|
||||
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
// See the License for the specific language governing permissions and
|
||||
// limitations under the License.
|
||||
|
||||
package source
|
||||
|
||||
import (
|
||||
"github.com/vmware/harbor/src/replication/models"
|
||||
)
|
||||
|
||||
// DefaultFilterChain provides a default implement for interface FilterChain
|
||||
type DefaultFilterChain struct {
|
||||
filters []Filter
|
||||
}
|
||||
|
||||
// NewDefaultFilterChain returns an instance of DefaultFilterChain
|
||||
func NewDefaultFilterChain(filters []Filter) *DefaultFilterChain {
|
||||
return &DefaultFilterChain{
|
||||
filters: filters,
|
||||
}
|
||||
}
|
||||
|
||||
// Build nil implement now
|
||||
func (d *DefaultFilterChain) Build(filters []Filter) error {
|
||||
return nil
|
||||
}
|
||||
|
||||
// Filters returns the filter list
|
||||
func (d *DefaultFilterChain) Filters() []Filter {
|
||||
return d.filters
|
||||
}
|
||||
|
||||
// DoFilter does the filter works for filterItems
|
||||
func (d *DefaultFilterChain) DoFilter(filterItems []models.FilterItem) []models.FilterItem {
|
||||
if len(filterItems) == 0 {
|
||||
return []models.FilterItem{}
|
||||
}
|
||||
|
||||
for _, filter := range d.filters {
|
||||
convertor := filter.GetConvertor()
|
||||
if convertor != nil {
|
||||
filterItems = convertor.Convert(filterItems)
|
||||
}
|
||||
filterItems = filter.DoFilter(filterItems)
|
||||
}
|
||||
return filterItems
|
||||
}
|
75
src/replication/source/default_filter_chain_test.go
Normal file
75
src/replication/source/default_filter_chain_test.go
Normal file
@ -0,0 +1,75 @@
|
||||
// Copyright (c) 2017 VMware, Inc. All Rights Reserved.
|
||||
//
|
||||
// Licensed under the Apache License, Version 2.0 (the "License");
|
||||
// you may not use this file except in compliance with the License.
|
||||
// You may obtain a copy of the License at
|
||||
//
|
||||
// http://www.apache.org/licenses/LICENSE-2.0
|
||||
//
|
||||
// Unless required by applicable law or agreed to in writing, software
|
||||
// distributed under the License is distributed on an "AS IS" BASIS,
|
||||
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
// See the License for the specific language governing permissions and
|
||||
// limitations under the License.
|
||||
|
||||
package source
|
||||
|
||||
import (
|
||||
"testing"
|
||||
|
||||
"github.com/stretchr/testify/assert"
|
||||
"github.com/stretchr/testify/require"
|
||||
"github.com/vmware/harbor/src/replication"
|
||||
"github.com/vmware/harbor/src/replication/models"
|
||||
)
|
||||
|
||||
func TestBuild(t *testing.T) {
|
||||
chain := NewDefaultFilterChain(nil)
|
||||
require.Nil(t, chain.Build(nil))
|
||||
}
|
||||
|
||||
func TestFilters(t *testing.T) {
|
||||
filters := []Filter{NewPatternFilter("project", "*")}
|
||||
chain := NewDefaultFilterChain(filters)
|
||||
assert.EqualValues(t, filters, chain.Filters())
|
||||
}
|
||||
|
||||
func TestDoFilter(t *testing.T) {
|
||||
projectFilter := NewPatternFilter(replication.FilterItemKindProject, "library*")
|
||||
repositoryFilter := NewPatternFilter(replication.FilterItemKindRepository,
|
||||
"library/ubuntu*", &fakeRepositoryConvertor{})
|
||||
filters := []Filter{projectFilter, repositoryFilter}
|
||||
|
||||
items := []models.FilterItem{
|
||||
models.FilterItem{
|
||||
Kind: replication.FilterItemKindProject,
|
||||
Value: "library",
|
||||
},
|
||||
models.FilterItem{
|
||||
Kind: replication.FilterItemKindProject,
|
||||
Value: "test",
|
||||
},
|
||||
}
|
||||
chain := NewDefaultFilterChain(filters)
|
||||
items = chain.DoFilter(items)
|
||||
assert.EqualValues(t, []models.FilterItem{
|
||||
models.FilterItem{
|
||||
Kind: replication.FilterItemKindRepository,
|
||||
Value: "library/ubuntu",
|
||||
},
|
||||
}, items)
|
||||
|
||||
}
|
||||
|
||||
type fakeRepositoryConvertor struct{}
|
||||
|
||||
func (f *fakeRepositoryConvertor) Convert(items []models.FilterItem) []models.FilterItem {
|
||||
result := []models.FilterItem{}
|
||||
for _, item := range items {
|
||||
result = append(result, models.FilterItem{
|
||||
Kind: replication.FilterItemKindRepository,
|
||||
Value: item.Value + "/ubuntu",
|
||||
})
|
||||
}
|
||||
return result
|
||||
}
|
Loading…
Reference in New Issue
Block a user