From ba038eb883c23e6af23613b758a46c0762e8af99 Mon Sep 17 00:00:00 2001 From: Wenkai Yin Date: Sat, 13 Apr 2019 19:56:35 +0800 Subject: [PATCH] Support replication all projects in Harbor Support replication all projects in Harbor Signed-off-by: Wenkai Yin --- src/core/api/replication_policy_test.go | 15 ---------- src/replication/adapter/harbor/adapter.go | 21 ++++++++------ .../adapter/harbor/image_registry.go | 9 ++++++ .../adapter/harbor/image_registry_test.go | 24 +++++++++++----- src/replication/model/policy.go | 12 -------- src/replication/model/policy_test.go | 28 ------------------- 6 files changed, 38 insertions(+), 71 deletions(-) diff --git a/src/core/api/replication_policy_test.go b/src/core/api/replication_policy_test.go index 19a9fa13c..b84445c08 100644 --- a/src/core/api/replication_policy_test.go +++ b/src/core/api/replication_policy_test.go @@ -146,21 +146,6 @@ func TestReplicationPolicyAPICreate(t *testing.T) { }, code: http.StatusBadRequest, }, - // 400 empty source namespaces - { - request: &testingRequest{ - method: http.MethodPost, - url: "/api/replication/policies", - credential: sysAdmin, - bodyJSON: &model.Policy{ - Name: "policy01", - SrcRegistry: &model.Registry{ - ID: 1, - }, - }, - }, - code: http.StatusBadRequest, - }, // 409, duplicate policy name { request: &testingRequest{ diff --git a/src/replication/adapter/harbor/adapter.go b/src/replication/adapter/harbor/adapter.go index 396015839..58e9658a4 100644 --- a/src/replication/adapter/harbor/adapter.go +++ b/src/replication/adapter/harbor/adapter.go @@ -130,22 +130,25 @@ func (a *adapter) Info() (*model.RegistryInfo, error) { return info, nil } -func (a *adapter) ListNamespaces(npQuery *model.NamespaceQuery) ([]*model.Namespace, error) { - var nps []*model.Namespace - projects, err := a.getProjects(npQuery.Name) +func (a *adapter) ListNamespaces(query *model.NamespaceQuery) ([]*model.Namespace, error) { + var namespaces []*model.Namespace + name := "" + if query != nil { + name = query.Name + } + projects, err := a.getProjects(name) if err != nil { return nil, err } - for _, pro := range projects { - nps = append(nps, &model.Namespace{ - Name: pro.Name, - Metadata: pro.Metadata, + for _, project := range projects { + namespaces = append(namespaces, &model.Namespace{ + Name: project.Name, + Metadata: project.Metadata, }) } - return nps, nil - + return namespaces, nil } func (a *adapter) ConvertResourceMetadata(metadata *model.ResourceMetadata, namespace *model.Namespace) (*model.ResourceMetadata, error) { diff --git a/src/replication/adapter/harbor/image_registry.go b/src/replication/adapter/harbor/image_registry.go index a0f48eac0..ef8a8d07c 100644 --- a/src/replication/adapter/harbor/image_registry.go +++ b/src/replication/adapter/harbor/image_registry.go @@ -59,6 +59,15 @@ func (t *tag) Match(filters []*model.Filter) (bool, error) { } func (a *adapter) FetchImages(namespaces []string, filters []*model.Filter) ([]*model.Resource, error) { + if len(namespaces) == 0 { + nms, err := a.ListNamespaces(nil) + if err != nil { + return nil, err + } + for _, nm := range nms { + namespaces = append(namespaces, nm.Name) + } + } resources := []*model.Resource{} for _, namespace := range namespaces { project, err := a.getProject(namespace) diff --git a/src/replication/adapter/harbor/image_registry_test.go b/src/replication/adapter/harbor/image_registry_test.go index 4bcbb42aa..33dd7484e 100644 --- a/src/replication/adapter/harbor/image_registry_test.go +++ b/src/replication/adapter/harbor/image_registry_test.go @@ -33,7 +33,6 @@ func TestFetchImages(t *testing.T) { data := `[{ "name": "library", "metadata": {"public":true} - }]` w.Write([]byte(data)) }, @@ -43,10 +42,10 @@ func TestFetchImages(t *testing.T) { Pattern: "/api/repositories/library/hello-world/tags", Handler: func(w http.ResponseWriter, r *http.Request) { data := `[{ - "name": "1.0" - },{ - "name": "2.0" - }]` + "name": "1.0" + },{ + "name": "2.0" + }]` w.Write([]byte(data)) }, }, @@ -55,8 +54,8 @@ func TestFetchImages(t *testing.T) { Pattern: "/api/repositories", Handler: func(w http.ResponseWriter, r *http.Request) { data := `[{ - "name": "library/hello-world" - }]` + "name": "library/hello-world" + }]` w.Write([]byte(data)) }, }, @@ -67,6 +66,7 @@ func TestFetchImages(t *testing.T) { } adapter, err := newAdapter(registry) require.Nil(t, err) + // not nil namespaces resources, err := adapter.FetchImages([]string{"library"}, nil) require.Nil(t, err) assert.Equal(t, 1, len(resources)) @@ -76,6 +76,16 @@ func TestFetchImages(t *testing.T) { assert.Equal(t, 2, len(resources[0].Metadata.Vtags)) assert.Equal(t, "1.0", resources[0].Metadata.Vtags[0]) assert.Equal(t, "2.0", resources[0].Metadata.Vtags[1]) + // nil namespaces + resources, err = adapter.FetchImages(nil, nil) + require.Nil(t, err) + assert.Equal(t, 1, len(resources)) + assert.Equal(t, model.ResourceTypeRepository, resources[0].Type) + assert.Equal(t, "hello-world", resources[0].Metadata.Repository.Name) + assert.Equal(t, "library", resources[0].Metadata.Namespace.Name) + assert.Equal(t, 2, len(resources[0].Metadata.Vtags)) + assert.Equal(t, "1.0", resources[0].Metadata.Vtags[0]) + assert.Equal(t, "2.0", resources[0].Metadata.Vtags[1]) } func TestDeleteManifest(t *testing.T) { diff --git a/src/replication/model/policy.go b/src/replication/model/policy.go index ccf0b824f..a4622d200 100644 --- a/src/replication/model/policy.go +++ b/src/replication/model/policy.go @@ -87,18 +87,6 @@ func (p *Policy) Valid(v *validation.Validation) { v.SetError("src_registry, dest_registry", "one of them should be empty and the other one shouldn't be empty") } - // source namespaces cannot be empty - if len(p.SrcNamespaces) == 0 { - v.SetError("src_namespaces", "cannot be empty") - } else { - for _, namespace := range p.SrcNamespaces { - if len(namespace) == 0 { - v.SetError("src_namespaces", "cannot contain empty namespace") - break - } - } - } - // valid the filters for _, filter := range p.Filters { if filter.Type != FilterTypeResource && diff --git a/src/replication/model/policy_test.go b/src/replication/model/policy_test.go index f8e8390b0..4c3dd2f00 100644 --- a/src/replication/model/policy_test.go +++ b/src/replication/model/policy_test.go @@ -51,34 +51,6 @@ func TestValidOfPolicy(t *testing.T) { }, pass: false, }, - // empty source namespaces - { - policy: &Policy{ - Name: "policy01", - SrcRegistry: &Registry{ - ID: 0, - }, - DestRegistry: &Registry{ - ID: 1, - }, - SrcNamespaces: []string{}, - }, - pass: false, - }, - // empty source namespaces - { - policy: &Policy{ - Name: "policy01", - SrcRegistry: &Registry{ - ID: 0, - }, - DestRegistry: &Registry{ - ID: 1, - }, - SrcNamespaces: []string{""}, - }, - pass: false, - }, // invalid filter { policy: &Policy{