mirror of
https://github.com/goharbor/harbor.git
synced 2024-11-27 12:46:03 +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