2019-10-31 09:03:37 +01:00
|
|
|
// Copyright Project Harbor Authors
|
|
|
|
//
|
|
|
|
// 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 scan
|
|
|
|
|
|
|
|
import (
|
2021-03-01 05:02:40 +01:00
|
|
|
"context"
|
2020-04-15 04:25:52 +02:00
|
|
|
"testing"
|
|
|
|
|
2022-07-20 05:33:08 +02:00
|
|
|
"github.com/stretchr/testify/assert"
|
|
|
|
|
2020-04-15 16:41:45 +02:00
|
|
|
"github.com/goharbor/harbor/src/lib/errors"
|
2020-03-24 13:45:45 +01:00
|
|
|
"github.com/goharbor/harbor/src/lib/q"
|
2019-10-31 09:03:37 +01:00
|
|
|
"github.com/goharbor/harbor/src/pkg/scan/dao/scanner"
|
2021-03-01 05:02:40 +01:00
|
|
|
"github.com/goharbor/harbor/src/testing/mock"
|
|
|
|
mocks "github.com/goharbor/harbor/src/testing/pkg/scan/scanner"
|
2019-10-31 09:03:37 +01:00
|
|
|
)
|
|
|
|
|
2020-02-18 17:31:26 +01:00
|
|
|
func TestEnsureScanners(t *testing.T) {
|
2019-10-31 09:03:37 +01:00
|
|
|
|
2020-02-18 17:31:26 +01:00
|
|
|
t.Run("Should do nothing when list of wanted scanners is empty", func(t *testing.T) {
|
2021-03-01 05:02:40 +01:00
|
|
|
err := EnsureScanners(context.TODO(), []scanner.Registration{})
|
2020-02-18 17:31:26 +01:00
|
|
|
assert.NoError(t, err)
|
|
|
|
})
|
|
|
|
|
|
|
|
t.Run("Should return error when listing scanners fails", func(t *testing.T) {
|
|
|
|
mgr := &mocks.Manager{}
|
|
|
|
scannerManager = mgr
|
2019-10-31 09:03:37 +01:00
|
|
|
|
2021-03-01 05:02:40 +01:00
|
|
|
mgr.On("List", mock.Anything, &q.Query{
|
2020-02-18 17:31:26 +01:00
|
|
|
Keywords: map[string]interface{}{
|
2021-03-03 05:23:36 +01:00
|
|
|
"name__in": []string{"scanner"},
|
2020-02-18 17:31:26 +01:00
|
|
|
},
|
|
|
|
}).Return(nil, errors.New("DB error"))
|
2019-10-31 09:03:37 +01:00
|
|
|
|
2021-03-01 05:02:40 +01:00
|
|
|
err := EnsureScanners(context.TODO(), []scanner.Registration{
|
2020-04-15 04:25:52 +02:00
|
|
|
{Name: "scanner", URL: "http://scanner:8080"},
|
2020-02-18 17:31:26 +01:00
|
|
|
})
|
2019-10-31 09:03:37 +01:00
|
|
|
|
2020-02-18 17:31:26 +01:00
|
|
|
assert.EqualError(t, err, "listing scanners: DB error")
|
|
|
|
mgr.AssertExpectations(t)
|
|
|
|
})
|
2019-10-31 09:03:37 +01:00
|
|
|
|
2020-02-18 17:31:26 +01:00
|
|
|
t.Run("Should create only non-existing scanners", func(t *testing.T) {
|
|
|
|
mgr := &mocks.Manager{}
|
|
|
|
scannerManager = mgr
|
2019-10-31 09:03:37 +01:00
|
|
|
|
2021-03-01 05:02:40 +01:00
|
|
|
mgr.On("List", mock.Anything, &q.Query{
|
2020-02-18 17:31:26 +01:00
|
|
|
Keywords: map[string]interface{}{
|
2021-03-03 05:23:36 +01:00
|
|
|
"name__in": []string{
|
2020-04-15 04:25:52 +02:00
|
|
|
"trivy",
|
2020-02-18 17:31:26 +01:00
|
|
|
},
|
|
|
|
},
|
2020-11-26 10:13:37 +01:00
|
|
|
}).Return([]*scanner.Registration{}, nil)
|
2021-03-01 05:02:40 +01:00
|
|
|
mgr.On("Create", mock.Anything, &scanner.Registration{
|
2020-04-15 04:25:52 +02:00
|
|
|
Name: "trivy",
|
|
|
|
URL: "http://trivy:8080",
|
2020-02-18 17:31:26 +01:00
|
|
|
}).Return("uuid-trivy", nil)
|
|
|
|
|
2021-03-01 05:02:40 +01:00
|
|
|
err := EnsureScanners(context.TODO(), []scanner.Registration{
|
2020-04-15 04:25:52 +02:00
|
|
|
{Name: "trivy", URL: "http://trivy:8080"},
|
|
|
|
})
|
|
|
|
|
|
|
|
assert.NoError(t, err)
|
|
|
|
mgr.AssertExpectations(t)
|
|
|
|
})
|
|
|
|
|
|
|
|
t.Run("Should update scanners", func(t *testing.T) {
|
|
|
|
mgr := &mocks.Manager{}
|
|
|
|
scannerManager = mgr
|
|
|
|
|
2021-03-01 05:02:40 +01:00
|
|
|
mgr.On("List", mock.Anything, &q.Query{
|
2020-04-15 04:25:52 +02:00
|
|
|
Keywords: map[string]interface{}{
|
2021-03-03 05:23:36 +01:00
|
|
|
"name__in": []string{
|
2020-04-15 04:25:52 +02:00
|
|
|
"trivy",
|
|
|
|
},
|
|
|
|
},
|
|
|
|
}).Return([]*scanner.Registration{
|
|
|
|
{Name: "trivy", URL: "http://trivy:8080"},
|
|
|
|
}, nil)
|
2021-03-01 05:02:40 +01:00
|
|
|
mgr.On("Update", mock.Anything, &scanner.Registration{
|
2020-04-15 04:25:52 +02:00
|
|
|
Name: "trivy",
|
|
|
|
URL: "http://trivy:8443",
|
|
|
|
}).Return(nil)
|
|
|
|
|
2021-03-01 05:02:40 +01:00
|
|
|
err := EnsureScanners(context.TODO(), []scanner.Registration{
|
2020-04-15 04:25:52 +02:00
|
|
|
{Name: "trivy", URL: "http://trivy:8443"},
|
2020-02-18 17:31:26 +01:00
|
|
|
})
|
2019-10-31 09:03:37 +01:00
|
|
|
|
2020-02-18 17:31:26 +01:00
|
|
|
assert.NoError(t, err)
|
|
|
|
mgr.AssertExpectations(t)
|
|
|
|
})
|
2019-10-31 09:03:37 +01:00
|
|
|
|
2020-02-18 17:31:26 +01:00
|
|
|
}
|
2019-10-31 09:03:37 +01:00
|
|
|
|
2020-02-18 17:31:26 +01:00
|
|
|
func TestEnsureDefaultScanner(t *testing.T) {
|
2019-10-31 09:03:37 +01:00
|
|
|
|
2020-02-18 17:31:26 +01:00
|
|
|
t.Run("Should return error when getting default scanner fails", func(t *testing.T) {
|
|
|
|
mgr := &mocks.Manager{}
|
|
|
|
scannerManager = mgr
|
2019-10-31 09:03:37 +01:00
|
|
|
|
2021-03-01 05:02:40 +01:00
|
|
|
mgr.On("GetDefault", mock.Anything).Return(nil, errors.New("DB error"))
|
2019-10-31 09:03:37 +01:00
|
|
|
|
2021-03-01 05:02:40 +01:00
|
|
|
err := EnsureDefaultScanner(context.TODO(), "trivy")
|
2020-02-18 17:31:26 +01:00
|
|
|
assert.EqualError(t, err, "getting default scanner: DB error")
|
|
|
|
mgr.AssertExpectations(t)
|
|
|
|
})
|
2019-10-31 09:03:37 +01:00
|
|
|
|
2020-02-18 17:31:26 +01:00
|
|
|
t.Run("Should do nothing when the default scanner is already set", func(t *testing.T) {
|
|
|
|
mgr := &mocks.Manager{}
|
|
|
|
scannerManager = mgr
|
2019-10-31 09:03:37 +01:00
|
|
|
|
2021-03-01 05:02:40 +01:00
|
|
|
mgr.On("GetDefault", mock.Anything).Return(&scanner.Registration{
|
2020-11-26 10:13:37 +01:00
|
|
|
Name: "trivy",
|
2020-02-18 17:31:26 +01:00
|
|
|
}, nil)
|
2019-10-31 09:03:37 +01:00
|
|
|
|
2021-03-01 05:02:40 +01:00
|
|
|
err := EnsureDefaultScanner(context.TODO(), "trivy")
|
2020-02-18 17:31:26 +01:00
|
|
|
assert.NoError(t, err)
|
|
|
|
mgr.AssertExpectations(t)
|
|
|
|
})
|
2019-10-31 09:03:37 +01:00
|
|
|
|
2020-02-18 17:31:26 +01:00
|
|
|
t.Run("Should return error when listing scanners fails", func(t *testing.T) {
|
|
|
|
mgr := &mocks.Manager{}
|
|
|
|
scannerManager = mgr
|
2019-11-15 10:43:16 +01:00
|
|
|
|
2021-03-01 05:02:40 +01:00
|
|
|
mgr.On("GetDefault", mock.Anything).Return(nil, nil)
|
|
|
|
mgr.On("List", mock.Anything, &q.Query{
|
2021-03-03 05:23:36 +01:00
|
|
|
Keywords: map[string]interface{}{"name": "trivy"},
|
2020-02-18 17:31:26 +01:00
|
|
|
}).Return(nil, errors.New("DB error"))
|
2019-11-15 10:43:16 +01:00
|
|
|
|
2021-03-01 05:02:40 +01:00
|
|
|
err := EnsureDefaultScanner(context.TODO(), "trivy")
|
2020-02-18 17:31:26 +01:00
|
|
|
assert.EqualError(t, err, "listing scanners: DB error")
|
|
|
|
mgr.AssertExpectations(t)
|
|
|
|
})
|
2019-10-31 09:03:37 +01:00
|
|
|
|
2020-02-18 17:31:26 +01:00
|
|
|
t.Run("Should return error when listing scanners returns unexpected scanners count", func(t *testing.T) {
|
|
|
|
mgr := &mocks.Manager{}
|
|
|
|
scannerManager = mgr
|
2019-10-31 09:03:37 +01:00
|
|
|
|
2021-03-01 05:02:40 +01:00
|
|
|
mgr.On("GetDefault", mock.Anything).Return(nil, nil)
|
|
|
|
mgr.On("List", mock.Anything, &q.Query{
|
2021-03-03 05:23:36 +01:00
|
|
|
Keywords: map[string]interface{}{"name": "trivy"},
|
2020-02-18 17:31:26 +01:00
|
|
|
}).Return([]*scanner.Registration{
|
2020-04-15 04:25:52 +02:00
|
|
|
{Name: "trivy"},
|
|
|
|
{Name: "trivy"},
|
2020-02-18 17:31:26 +01:00
|
|
|
}, nil)
|
|
|
|
|
2021-03-01 05:02:40 +01:00
|
|
|
err := EnsureDefaultScanner(context.TODO(), "trivy")
|
2020-04-15 04:25:52 +02:00
|
|
|
assert.EqualError(t, err, "expected only one scanner with name trivy but got 2")
|
2020-02-18 17:31:26 +01:00
|
|
|
mgr.AssertExpectations(t)
|
|
|
|
})
|
2019-11-15 10:43:16 +01:00
|
|
|
|
2020-02-18 17:31:26 +01:00
|
|
|
t.Run("Should set the default scanner when it is not set", func(t *testing.T) {
|
|
|
|
mgr := &mocks.Manager{}
|
|
|
|
scannerManager = mgr
|
2019-11-15 10:43:16 +01:00
|
|
|
|
2021-03-01 05:02:40 +01:00
|
|
|
mgr.On("GetDefault", mock.Anything).Return(nil, nil)
|
|
|
|
mgr.On("List", mock.Anything, &q.Query{
|
2021-03-03 05:23:36 +01:00
|
|
|
Keywords: map[string]interface{}{"name": "trivy"},
|
2020-02-18 17:31:26 +01:00
|
|
|
}).Return([]*scanner.Registration{
|
|
|
|
{
|
2020-04-15 04:25:52 +02:00
|
|
|
Name: "trivy",
|
2020-02-18 17:31:26 +01:00
|
|
|
UUID: "trivy-uuid",
|
|
|
|
URL: "http://trivy:8080",
|
|
|
|
},
|
|
|
|
}, nil)
|
2021-03-01 05:02:40 +01:00
|
|
|
mgr.On("SetAsDefault", mock.Anything, "trivy-uuid").Return(nil)
|
2019-11-15 10:43:16 +01:00
|
|
|
|
2021-03-01 05:02:40 +01:00
|
|
|
err := EnsureDefaultScanner(context.TODO(), "trivy")
|
2020-02-18 17:31:26 +01:00
|
|
|
assert.NoError(t, err)
|
|
|
|
mgr.AssertExpectations(t)
|
|
|
|
})
|
2019-11-15 10:43:16 +01:00
|
|
|
|
2020-02-18 17:31:26 +01:00
|
|
|
t.Run("Should return error when setting the default scanner fails", func(t *testing.T) {
|
|
|
|
mgr := &mocks.Manager{}
|
|
|
|
scannerManager = mgr
|
2019-11-15 10:43:16 +01:00
|
|
|
|
2021-03-01 05:02:40 +01:00
|
|
|
mgr.On("GetDefault", mock.Anything).Return(nil, nil)
|
|
|
|
mgr.On("List", mock.Anything, &q.Query{
|
2021-03-03 05:23:36 +01:00
|
|
|
Keywords: map[string]interface{}{"name": "trivy"},
|
2020-02-18 17:31:26 +01:00
|
|
|
}).Return([]*scanner.Registration{
|
|
|
|
{
|
2020-04-15 04:25:52 +02:00
|
|
|
Name: "trivy",
|
2020-02-18 17:31:26 +01:00
|
|
|
UUID: "trivy-uuid",
|
|
|
|
URL: "http://trivy:8080",
|
2019-11-15 10:43:16 +01:00
|
|
|
},
|
2020-02-18 17:31:26 +01:00
|
|
|
}, nil)
|
2021-03-01 05:02:40 +01:00
|
|
|
mgr.On("SetAsDefault", mock.Anything, "trivy-uuid").Return(errors.New("DB error"))
|
2020-02-18 17:31:26 +01:00
|
|
|
|
2021-03-01 05:02:40 +01:00
|
|
|
err := EnsureDefaultScanner(context.TODO(), "trivy")
|
2020-04-15 04:25:52 +02:00
|
|
|
assert.EqualError(t, err, "setting trivy as default scanner: DB error")
|
2020-02-18 17:31:26 +01:00
|
|
|
mgr.AssertExpectations(t)
|
|
|
|
})
|
2019-11-15 10:43:16 +01:00
|
|
|
|
|
|
|
}
|
2020-02-18 12:46:51 +01:00
|
|
|
|
|
|
|
func TestRemoveImmutableScanners(t *testing.T) {
|
|
|
|
|
2020-04-15 04:25:52 +02:00
|
|
|
t.Run("Should do nothing when list of names is empty", func(t *testing.T) {
|
2020-02-18 12:46:51 +01:00
|
|
|
mgr := &mocks.Manager{}
|
|
|
|
scannerManager = mgr
|
|
|
|
|
2021-03-01 05:02:40 +01:00
|
|
|
err := RemoveImmutableScanners(context.TODO(), []string{})
|
2020-02-18 12:46:51 +01:00
|
|
|
assert.NoError(t, err)
|
|
|
|
mgr.AssertExpectations(t)
|
|
|
|
})
|
|
|
|
|
|
|
|
t.Run("Should return error when listing scanners fails", func(t *testing.T) {
|
|
|
|
mgr := &mocks.Manager{}
|
|
|
|
scannerManager = mgr
|
|
|
|
|
2021-03-01 05:02:40 +01:00
|
|
|
mgr.On("List", mock.Anything, &q.Query{
|
2020-02-18 12:46:51 +01:00
|
|
|
Keywords: map[string]interface{}{
|
2021-03-03 05:23:36 +01:00
|
|
|
"immutable": true,
|
|
|
|
"name__in": []string{"scanner"},
|
2020-02-18 12:46:51 +01:00
|
|
|
},
|
|
|
|
}).Return(nil, errors.New("DB error"))
|
|
|
|
|
2021-03-01 05:02:40 +01:00
|
|
|
err := RemoveImmutableScanners(context.TODO(), []string{"scanner"})
|
2020-02-18 12:46:51 +01:00
|
|
|
assert.EqualError(t, err, "listing scanners: DB error")
|
|
|
|
mgr.AssertExpectations(t)
|
|
|
|
})
|
|
|
|
|
|
|
|
t.Run("Should delete multiple scanners", func(t *testing.T) {
|
|
|
|
mgr := &mocks.Manager{}
|
|
|
|
scannerManager = mgr
|
|
|
|
|
|
|
|
registrations := []*scanner.Registration{
|
|
|
|
{
|
2020-04-15 04:25:52 +02:00
|
|
|
Name: "scanner-1",
|
2020-02-18 12:46:51 +01:00
|
|
|
UUID: "uuid-1",
|
|
|
|
URL: "http://scanner-1",
|
|
|
|
},
|
|
|
|
{
|
2020-04-15 04:25:52 +02:00
|
|
|
Name: "scanner-2",
|
2020-02-18 12:46:51 +01:00
|
|
|
UUID: "uuid-2",
|
|
|
|
URL: "http://scanner-2",
|
|
|
|
}}
|
|
|
|
|
2021-03-01 05:02:40 +01:00
|
|
|
mgr.On("List", mock.Anything, &q.Query{
|
2020-02-18 12:46:51 +01:00
|
|
|
Keywords: map[string]interface{}{
|
2021-03-03 05:23:36 +01:00
|
|
|
"immutable": true,
|
|
|
|
"name__in": []string{
|
2020-04-15 04:25:52 +02:00
|
|
|
"scanner-1",
|
|
|
|
"scanner-2",
|
2020-02-18 12:46:51 +01:00
|
|
|
},
|
|
|
|
},
|
|
|
|
}).Return(registrations, nil)
|
2021-03-01 05:02:40 +01:00
|
|
|
mgr.On("Delete", mock.Anything, "uuid-1").Return(nil)
|
|
|
|
mgr.On("Delete", mock.Anything, "uuid-2").Return(nil)
|
2020-02-18 12:46:51 +01:00
|
|
|
|
2021-03-01 05:02:40 +01:00
|
|
|
err := RemoveImmutableScanners(context.TODO(), []string{
|
2020-04-15 04:25:52 +02:00
|
|
|
"scanner-1",
|
|
|
|
"scanner-2",
|
2020-02-18 12:46:51 +01:00
|
|
|
})
|
|
|
|
assert.NoError(t, err)
|
|
|
|
mgr.AssertExpectations(t)
|
|
|
|
})
|
|
|
|
|
|
|
|
t.Run("Should return error when deleting any scanner fails", func(t *testing.T) {
|
|
|
|
mgr := &mocks.Manager{}
|
|
|
|
scannerManager = mgr
|
|
|
|
|
|
|
|
registrations := []*scanner.Registration{
|
|
|
|
{
|
2020-04-15 04:25:52 +02:00
|
|
|
Name: "scanner-1",
|
2020-02-18 12:46:51 +01:00
|
|
|
UUID: "uuid-1",
|
|
|
|
URL: "http://scanner-1",
|
|
|
|
},
|
|
|
|
{
|
2020-04-15 04:25:52 +02:00
|
|
|
Name: "scanner-2",
|
2020-02-18 12:46:51 +01:00
|
|
|
UUID: "uuid-2",
|
|
|
|
URL: "http://scanner-2",
|
|
|
|
}}
|
|
|
|
|
2021-03-01 05:02:40 +01:00
|
|
|
mgr.On("List", mock.Anything, &q.Query{
|
2020-02-18 12:46:51 +01:00
|
|
|
Keywords: map[string]interface{}{
|
2021-03-03 05:23:36 +01:00
|
|
|
"immutable": true,
|
|
|
|
"name__in": []string{
|
2020-04-15 04:25:52 +02:00
|
|
|
"scanner-1",
|
|
|
|
"scanner-2",
|
2020-02-18 12:46:51 +01:00
|
|
|
},
|
|
|
|
},
|
|
|
|
}).Return(registrations, nil)
|
2021-03-01 05:02:40 +01:00
|
|
|
mgr.On("Delete", mock.Anything, "uuid-1").Return(nil)
|
|
|
|
mgr.On("Delete", mock.Anything, "uuid-2").Return(errors.New("DB error"))
|
2020-02-18 12:46:51 +01:00
|
|
|
|
2021-03-01 05:02:40 +01:00
|
|
|
err := RemoveImmutableScanners(context.TODO(), []string{
|
2020-04-15 04:25:52 +02:00
|
|
|
"scanner-1",
|
|
|
|
"scanner-2",
|
2020-02-18 12:46:51 +01:00
|
|
|
})
|
|
|
|
assert.EqualError(t, err, "deleting scanner: uuid-2: DB error")
|
|
|
|
mgr.AssertExpectations(t)
|
|
|
|
})
|
2020-02-18 17:31:26 +01:00
|
|
|
|
2020-02-18 12:46:51 +01:00
|
|
|
}
|