From df9c2bdc46185ba8f41ae25363819336074938f5 Mon Sep 17 00:00:00 2001 From: qinshaoxuan Date: Tue, 17 Mar 2020 14:30:39 +0800 Subject: [PATCH] Fix bug when scanner is unhealthy The function GetRegistrationByProject should not return err when Ping return err. The return value 'registration' has 'Health' field which shows the scanner health status. Resolves: #11051 See also: #9788, #9807 Signed-off-by: qinshaoxuan --- src/controller/scanner/base_controller.go | 2 +- .../scanner/base_controller_test.go | 30 +++++++++++++++++-- 2 files changed, 29 insertions(+), 3 deletions(-) diff --git a/src/controller/scanner/base_controller.go b/src/controller/scanner/base_controller.go index 1c2f87bfb..720def461 100644 --- a/src/controller/scanner/base_controller.go +++ b/src/controller/scanner/base_controller.go @@ -242,7 +242,7 @@ func (bc *basicController) GetRegistrationByProject(projectID int64, options ... } } - return registration, err + return registration, nil } // Ping ... diff --git a/src/controller/scanner/base_controller_test.go b/src/controller/scanner/base_controller_test.go index 4720abcd5..2ec4b3542 100644 --- a/src/controller/scanner/base_controller_test.go +++ b/src/controller/scanner/base_controller_test.go @@ -15,6 +15,7 @@ package scanner import ( + "fmt" "testing" "github.com/goharbor/harbor/src/common/models" @@ -46,8 +47,8 @@ func TestController(t *testing.T) { suite.Run(t, new(ControllerTestSuite)) } -// SetupSuite prepares env for the controller test suite -func (suite *ControllerTestSuite) SetupSuite() { +// SetupTest prepares env for the controller test suite +func (suite *ControllerTestSuite) SetupTest() { suite.mMgr = &scannertesting.Manager{} suite.mMeta = new(MockProMetaManager) @@ -227,6 +228,31 @@ func (suite *ControllerTestSuite) TestGetRegistrationByProject() { assert.Equal(suite.T(), "forUT", r.Name) } +// TestGetRegistrationByProjectWhenPingError tests GetRegistrationByProject +func (suite *ControllerTestSuite) TestGetRegistrationByProjectWhenPingError() { + m := make(map[string]string, 1) + m[proScannerMetaKey] = "uuid" + + // Configured at project level + var pid int64 = 1 + suite.sample.UUID = "uuid" + + suite.mMeta.On("Get", pid, []string{proScannerMetaKey}).Return(m, nil) + suite.mMgr.On("Get", "uuid").Return(suite.sample, nil) + + // Ping error + mc := &v1testing.Client{} + mc.On("GetMetadata").Return(nil, fmt.Errorf("getMetadata error")) + + mcp := &v1testing.ClientPool{} + mocktesting.OnAnything(mcp, "Get").Return(mc, nil) + suite.c.clientPool = mcp + + r, err := suite.c.GetRegistrationByProject(pid) + require.NoError(suite.T(), err) + assert.Equal(suite.T(), "unhealthy", r.Health) +} + // TestPing ... func (suite *ControllerTestSuite) TestPing() { meta, err := suite.c.Ping(suite.sample)