refactor(internal): export internal packages (#887)

* refactor: export internal packages

* refactor(server): define Server

* refactor: fix lint issues

* test(integration): fix imports
This commit is contained in:
Teppei Fukuda
2021-03-14 17:04:01 +02:00
committed by GitHub
parent 8b3b5d0290
commit c26a3e481f
40 changed files with 104 additions and 89 deletions

View File

@@ -3,7 +3,7 @@ package main
import (
"os"
"github.com/aquasecurity/trivy/internal"
"github.com/aquasecurity/trivy/pkg/commands"
"github.com/aquasecurity/trivy/pkg/log"
)
@@ -12,7 +12,7 @@ var (
)
func main() {
app := internal.NewApp(version)
app := commands.NewApp(version)
err := app.Run(os.Args)
if err != nil {
log.Fatal(err)

View File

@@ -18,7 +18,7 @@ import (
testcontainers "github.com/testcontainers/testcontainers-go"
"github.com/urfave/cli/v2"
"github.com/aquasecurity/trivy/internal"
"github.com/aquasecurity/trivy/pkg/commands"
"github.com/aquasecurity/trivy/pkg/report"
)
@@ -484,7 +484,7 @@ func setup(t *testing.T, options setupOptions) (*cli.App, string, string) {
go func() {
// Setup CLI App
app := internal.NewApp(version)
app := commands.NewApp(version)
app.Writer = ioutil.Discard
osArgs := setupServer(addr, options.token, options.tokenHeader, cacheDir, options.cacheBackend)
@@ -497,7 +497,7 @@ func setup(t *testing.T, options setupOptions) (*cli.App, string, string) {
assert.NoError(t, err)
// Setup CLI App
app := internal.NewApp(version)
app := commands.NewApp(version)
app.Writer = ioutil.Discard
return app, addr, cacheDir

View File

@@ -10,12 +10,12 @@ import (
"strings"
"testing"
"github.com/stretchr/testify/require"
"github.com/aquasecurity/trivy/internal"
"github.com/docker/docker/api/types"
"github.com/docker/docker/client"
"github.com/stretchr/testify/assert"
"github.com/stretchr/testify/require"
"github.com/aquasecurity/trivy/pkg/commands"
)
func TestRun_WithDockerEngine(t *testing.T) {
@@ -283,7 +283,7 @@ func TestRun_WithDockerEngine(t *testing.T) {
defer os.Remove(of.Name())
// run trivy
app := internal.NewApp("dev")
app := commands.NewApp("dev")
trivyArgs := []string{"trivy"}
trivyArgs = append(trivyArgs, "--cache-dir", cacheDir)
if tc.withImageSubcommand {

View File

@@ -14,8 +14,9 @@ import (
"path/filepath"
"time"
"github.com/aquasecurity/trivy-db/pkg/db"
"github.com/spf13/afero"
"github.com/aquasecurity/trivy-db/pkg/db"
)
var update = flag.Bool("update", false, "update golden files")

View File

@@ -24,7 +24,7 @@ import (
_ "github.com/aquasecurity/fanal/analyzer"
testdocker "github.com/aquasecurity/trivy/integration/docker"
"github.com/aquasecurity/trivy/internal"
"github.com/aquasecurity/trivy/pkg/commands"
"github.com/aquasecurity/trivy/pkg/report"
)
@@ -254,7 +254,7 @@ func scan(imageRef name.Reference, baseDir, goldenFile string, opt registryOptio
defer unsetEnv()
// Setup CLI App
app := internal.NewApp("dev")
app := commands.NewApp("dev")
app.Writer = ioutil.Discard
osArgs := []string{"trivy", "--cache-dir", cacheDir, "--format", "json", "--skip-update", "--output", outputFile, imageRef.Name()}

View File

@@ -11,7 +11,7 @@ import (
"github.com/stretchr/testify/assert"
"github.com/stretchr/testify/require"
"github.com/aquasecurity/trivy/internal"
"github.com/aquasecurity/trivy/pkg/commands"
)
func TestRun_WithTar(t *testing.T) {
@@ -378,7 +378,7 @@ func TestRun_WithTar(t *testing.T) {
defer os.RemoveAll(cacheDir)
// Setup CLI App
app := internal.NewApp("dev")
app := commands.NewApp("dev")
app.Writer = ioutil.Discard
for _, c := range cases {

View File

@@ -1,4 +1,4 @@
package internal
package commands
import (
"encoding/json"
@@ -13,10 +13,10 @@ import (
"github.com/aquasecurity/trivy-db/pkg/db"
"github.com/aquasecurity/trivy-db/pkg/types"
"github.com/aquasecurity/trivy/internal/artifact"
"github.com/aquasecurity/trivy/internal/client"
"github.com/aquasecurity/trivy/internal/plugin"
"github.com/aquasecurity/trivy/internal/server"
"github.com/aquasecurity/trivy/pkg/commands/artifact"
"github.com/aquasecurity/trivy/pkg/commands/client"
"github.com/aquasecurity/trivy/pkg/commands/plugin"
"github.com/aquasecurity/trivy/pkg/commands/server"
tdb "github.com/aquasecurity/trivy/pkg/db"
"github.com/aquasecurity/trivy/pkg/utils"
"github.com/aquasecurity/trivy/pkg/vulnerability"

View File

@@ -1,4 +1,4 @@
package internal
package commands
import (
"bytes"
@@ -9,13 +9,11 @@ import (
"testing"
"time"
"github.com/spf13/afero"
"github.com/stretchr/testify/assert"
"github.com/stretchr/testify/require"
"github.com/spf13/afero"
"github.com/aquasecurity/trivy-db/pkg/db"
"github.com/stretchr/testify/assert"
)
func Test_showVersion(t *testing.T) {

View File

@@ -1,10 +1,10 @@
package config
package artifact
import (
"github.com/urfave/cli/v2"
"golang.org/x/xerrors"
"github.com/aquasecurity/trivy/internal/config"
"github.com/aquasecurity/trivy/pkg/commands/config"
)
// Config holds the artifact config
@@ -24,8 +24,8 @@ type Config struct {
autoRefresh bool
}
// New is the factory method to return config
func New(c *cli.Context) (Config, error) {
// NewConfig is the factory method to return config
func NewConfig(c *cli.Context) (Config, error) {
gc, err := config.NewGlobalConfig(c)
if err != nil {
return Config{}, xerrors.Errorf("failed to initialize global options: %w", err)

View File

@@ -1,4 +1,4 @@
package config
package artifact
import (
"flag"
@@ -12,7 +12,7 @@ import (
"go.uber.org/zap/zaptest/observer"
dbTypes "github.com/aquasecurity/trivy-db/pkg/types"
"github.com/aquasecurity/trivy/internal/config"
"github.com/aquasecurity/trivy/pkg/commands/config"
)
func TestConfig_Init(t *testing.T) {
@@ -188,7 +188,7 @@ func TestConfig_Init(t *testing.T) {
ctx := cli.NewContext(app, set, nil)
_ = set.Parse(tt.args)
c, err := New(ctx)
c, err := NewConfig(ctx)
require.NoError(t, err, err)
c.GlobalConfig.Logger = logger.Sugar()
@@ -204,6 +204,7 @@ func TestConfig_Init(t *testing.T) {
// test the error
switch {
case tt.wantErr != "":
require.NotNil(t, err)
assert.Contains(t, err.Error(), tt.wantErr, tt.name)
return
default:

View File

@@ -9,7 +9,6 @@ import (
"github.com/aquasecurity/fanal/analyzer"
"github.com/aquasecurity/fanal/cache"
"github.com/aquasecurity/trivy/internal/artifact/config"
"github.com/aquasecurity/trivy/pkg/scanner"
)
@@ -24,7 +23,7 @@ func filesystemScanner(ctx context.Context, dir string, ac cache.ArtifactCache,
// FilesystemRun runs scan on filesystem
func FilesystemRun(cliCtx *cli.Context) error {
c, err := config.New(cliCtx)
c, err := NewConfig(cliCtx)
if err != nil {
return err
}

View File

@@ -9,7 +9,6 @@ import (
"github.com/aquasecurity/fanal/analyzer"
"github.com/aquasecurity/fanal/cache"
"github.com/aquasecurity/trivy/internal/artifact/config"
"github.com/aquasecurity/trivy/pkg/scanner"
)
@@ -34,7 +33,7 @@ func dockerScanner(ctx context.Context, imageName string, ac cache.ArtifactCache
// ImageRun runs scan on docker image
func ImageRun(cliCtx *cli.Context) error {
c, err := config.New(cliCtx)
c, err := NewConfig(cliCtx)
if err != nil {
return err
}

View File

@@ -9,7 +9,6 @@ import (
"github.com/aquasecurity/fanal/analyzer"
"github.com/aquasecurity/fanal/cache"
"github.com/aquasecurity/trivy/internal/artifact/config"
"github.com/aquasecurity/trivy/pkg/scanner"
)
@@ -25,7 +24,7 @@ func repositoryScanner(ctx context.Context, dir string, ac cache.ArtifactCache,
// RepositoryRun runs scan on repository
func RepositoryRun(cliCtx *cli.Context) error {
c, err := config.New(cliCtx)
c, err := NewConfig(cliCtx)
if err != nil {
return err
}

View File

@@ -12,8 +12,7 @@ import (
"github.com/aquasecurity/fanal/analyzer"
"github.com/aquasecurity/fanal/cache"
"github.com/aquasecurity/trivy-db/pkg/db"
"github.com/aquasecurity/trivy/internal/artifact/config"
"github.com/aquasecurity/trivy/internal/operation"
"github.com/aquasecurity/trivy/pkg/commands/operation"
"github.com/aquasecurity/trivy/pkg/log"
"github.com/aquasecurity/trivy/pkg/report"
"github.com/aquasecurity/trivy/pkg/scanner"
@@ -27,14 +26,14 @@ var errSkipScan = errors.New("skip subsequent processes")
type InitializeScanner func(context.Context, string, cache.ArtifactCache, cache.LocalArtifactCache, time.Duration,
[]analyzer.Type) (scanner.Scanner, func(), error)
func run(conf config.Config, initializeScanner InitializeScanner) error {
func run(conf Config, initializeScanner InitializeScanner) error {
ctx, cancel := context.WithTimeout(context.Background(), conf.Timeout)
defer cancel()
return runWithContext(ctx, conf, initializeScanner)
}
func runWithContext(ctx context.Context, conf config.Config, initializeScanner InitializeScanner) error {
func runWithContext(ctx context.Context, conf Config, initializeScanner InitializeScanner) error {
if err := log.InitLogger(conf.Debug, conf.Quiet); err != nil {
l.Fatal(err)
}
@@ -75,7 +74,7 @@ func runWithContext(ctx context.Context, conf config.Config, initializeScanner I
return nil
}
func initCache(c config.Config) (operation.Cache, error) {
func initCache(c Config) (operation.Cache, error) {
utils.SetCacheDir(c.CacheDir)
cache, err := operation.NewCache(c.CacheBackend)
if err != nil {
@@ -100,7 +99,7 @@ func initCache(c config.Config) (operation.Cache, error) {
return cache, nil
}
func initDB(c config.Config) error {
func initDB(c Config) error {
// download the database file
noProgress := c.Quiet || c.NoProgress
if err := operation.DownloadDB(c.AppVersion, c.CacheDir, noProgress, c.Light, c.SkipUpdate); err != nil {
@@ -117,7 +116,7 @@ func initDB(c config.Config) error {
return nil
}
func scan(ctx context.Context, conf config.Config, initializeScanner InitializeScanner, cacheClient cache.Cache) (
func scan(ctx context.Context, conf Config, initializeScanner InitializeScanner, cacheClient cache.Cache) (
report.Results, error) {
target := conf.Target
if conf.Input != "" {
@@ -152,7 +151,7 @@ func scan(ctx context.Context, conf config.Config, initializeScanner InitializeS
return results, nil
}
func filter(ctx context.Context, conf config.Config, results report.Results) (report.Results, error) {
func filter(ctx context.Context, conf Config, results report.Results) (report.Results, error) {
vulnClient := initializeVulnerabilityClient()
for i := range results {
vulnClient.FillInfo(results[i].Vulnerabilities, results[i].Type)
@@ -166,7 +165,7 @@ func filter(ctx context.Context, conf config.Config, results report.Results) (re
return results, nil
}
func exit(c config.Config, results report.Results) {
func exit(c Config, results report.Results) {
if c.ExitCode != 0 {
for _, result := range results {
if len(result.Vulnerabilities) > 0 {

View File

@@ -1,4 +1,4 @@
package config
package client
import (
"net/http"
@@ -7,7 +7,7 @@ import (
"github.com/urfave/cli/v2"
"golang.org/x/xerrors"
"github.com/aquasecurity/trivy/internal/config"
"github.com/aquasecurity/trivy/pkg/commands/config"
)
// Config holds the Trivy client config
@@ -26,8 +26,8 @@ type Config struct {
CustomHeaders http.Header
}
// New is the factory method for Config
func New(c *cli.Context) (Config, error) {
// NewConfig is the factory method for Config
func NewConfig(c *cli.Context) (Config, error) {
gc, err := config.NewGlobalConfig(c)
if err != nil {
return Config{}, xerrors.Errorf("failed to initialize global options: %w", err)

View File

@@ -1,4 +1,4 @@
package config
package client
import (
"flag"
@@ -14,7 +14,7 @@ import (
"go.uber.org/zap/zaptest/observer"
dbTypes "github.com/aquasecurity/trivy-db/pkg/types"
"github.com/aquasecurity/trivy/internal/config"
"github.com/aquasecurity/trivy/pkg/commands/config"
)
func TestConfig_Init(t *testing.T) {
@@ -228,7 +228,7 @@ func TestConfig_Init(t *testing.T) {
ctx := cli.NewContext(app, set, nil)
_ = set.Parse(tt.args)
c, err := New(ctx)
c, err := NewConfig(ctx)
require.NoError(t, err, err)
c.GlobalConfig.Logger = logger.Sugar()
@@ -244,6 +244,7 @@ func TestConfig_Init(t *testing.T) {
// test the error
switch {
case tt.wantErr != "":
require.NotNil(t, err)
assert.Contains(t, err.Error(), tt.wantErr, tt.name)
return
default:

View File

@@ -8,7 +8,6 @@ import (
"golang.org/x/xerrors"
"github.com/aquasecurity/fanal/analyzer"
"github.com/aquasecurity/trivy/internal/client/config"
"github.com/aquasecurity/trivy/pkg/cache"
"github.com/aquasecurity/trivy/pkg/log"
"github.com/aquasecurity/trivy/pkg/report"
@@ -20,21 +19,21 @@ import (
// Run runs the scan
func Run(cliCtx *cli.Context) error {
c, err := config.New(cliCtx)
c, err := NewConfig(cliCtx)
if err != nil {
return err
}
return run(c)
}
func run(conf config.Config) error {
func run(conf Config) error {
ctx, cancel := context.WithTimeout(context.Background(), conf.Timeout)
defer cancel()
return runWithContext(ctx, conf)
}
func runWithContext(ctx context.Context, conf config.Config) error {
func runWithContext(ctx context.Context, conf Config) error {
if err := initialize(&conf); err != nil {
return xerrors.Errorf("initialize error: %w", err)
}
@@ -80,7 +79,7 @@ func runWithContext(ctx context.Context, conf config.Config) error {
return nil
}
func initialize(conf *config.Config) error {
func initialize(conf *Config) error {
// Initialize logger
if err := log.InitLogger(conf.Debug, conf.Quiet); err != nil {
return xerrors.Errorf("failed to initialize a logger: %w", err)
@@ -98,7 +97,7 @@ func initialize(conf *config.Config) error {
return nil
}
func initializeScanner(ctx context.Context, conf config.Config) (scanner.Scanner, func(), error) {
func initializeScanner(ctx context.Context, conf Config) (scanner.Scanner, func(), error) {
remoteCache := cache.NewRemoteCache(cache.RemoteURL(conf.RemoteAddr), conf.CustomHeaders)
// By default, apk commands are not analyzed.
@@ -127,7 +126,7 @@ func initializeScanner(ctx context.Context, conf config.Config) (scanner.Scanner
return s, cleanup, nil
}
func exit(c config.Config, results report.Results) {
func exit(c Config, results report.Results) {
if c.ExitCode != 0 {
for _, result := range results {
if len(result.Vulnerabilities) > 0 {

View File

@@ -4,7 +4,7 @@ import (
"flag"
"testing"
"github.com/aquasecurity/trivy/internal/config"
"github.com/aquasecurity/trivy/pkg/commands/config"
"github.com/stretchr/testify/assert"
"github.com/stretchr/testify/require"
"github.com/urfave/cli/v2"

View File

@@ -7,7 +7,7 @@ import (
"github.com/stretchr/testify/assert"
"github.com/urfave/cli/v2"
"github.com/aquasecurity/trivy/internal/config"
"github.com/aquasecurity/trivy/pkg/commands/config"
)
func TestNewCacheConfig(t *testing.T) {

View File

@@ -7,7 +7,7 @@ import (
"github.com/stretchr/testify/assert"
"github.com/urfave/cli/v2"
"github.com/aquasecurity/trivy/internal/config"
"github.com/aquasecurity/trivy/pkg/commands/config"
)
func TestNewDBConfig(t *testing.T) {

View File

@@ -8,7 +8,7 @@ import (
"github.com/stretchr/testify/require"
"github.com/urfave/cli/v2"
"github.com/aquasecurity/trivy/internal/config"
"github.com/aquasecurity/trivy/pkg/commands/config"
)
func TestNewGlobalConfig(t *testing.T) {

View File

@@ -6,7 +6,7 @@ import (
"github.com/urfave/cli/v2"
"golang.org/x/xerrors"
"github.com/aquasecurity/trivy/internal/config"
"github.com/aquasecurity/trivy/pkg/commands/config"
"github.com/aquasecurity/trivy/pkg/log"
"github.com/aquasecurity/trivy/pkg/plugin"
)

View File

@@ -1,9 +1,9 @@
package config
package server
import (
"github.com/urfave/cli/v2"
"github.com/aquasecurity/trivy/internal/config"
"github.com/aquasecurity/trivy/pkg/commands/config"
)
// Config holds the Trivy config
@@ -17,8 +17,8 @@ type Config struct {
TokenHeader string
}
// New is the factory method to return config
func New(c *cli.Context) Config {
// NewConfig is the factory method to return config
func NewConfig(c *cli.Context) Config {
// the error is ignored because logger is unnecessary
gc, _ := config.NewGlobalConfig(c) // nolint: errcheck
return Config{

View File

@@ -1,4 +1,4 @@
package config_test
package server_test
import (
"flag"
@@ -8,20 +8,20 @@ import (
"github.com/stretchr/testify/require"
"github.com/urfave/cli/v2"
"github.com/aquasecurity/trivy/internal/config"
c "github.com/aquasecurity/trivy/internal/server/config"
"github.com/aquasecurity/trivy/pkg/commands/config"
"github.com/aquasecurity/trivy/pkg/commands/server"
)
func TestNew(t *testing.T) {
tests := []struct {
name string
args []string
want c.Config
want server.Config
}{
{
name: "happy path",
args: []string{"-quiet", "--no-progress", "--reset", "--skip-update", "--listen", "localhost:8080"},
want: c.Config{
want: server.Config{
GlobalConfig: config.GlobalConfig{
Quiet: true,
},
@@ -49,7 +49,7 @@ func TestNew(t *testing.T) {
tt.want.GlobalConfig.Context = ctx
got := c.New(ctx)
got := server.NewConfig(ctx)
assert.Equal(t, tt.want.GlobalConfig.Quiet, got.Quiet, tt.name)
assert.Equal(t, tt.want.DBConfig, got.DBConfig, tt.name)
assert.Equal(t, tt.want.Listen, got.Listen, tt.name)
@@ -88,7 +88,7 @@ func TestConfig_Init(t *testing.T) {
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
c := &c.Config{
c := &server.Config{
DBConfig: tt.dbConfig,
}

View File

@@ -5,19 +5,18 @@ import (
"golang.org/x/xerrors"
"github.com/aquasecurity/trivy-db/pkg/db"
"github.com/aquasecurity/trivy/internal/operation"
"github.com/aquasecurity/trivy/internal/server/config"
"github.com/aquasecurity/trivy/pkg/commands/operation"
"github.com/aquasecurity/trivy/pkg/log"
"github.com/aquasecurity/trivy/pkg/rpc/server"
rpcServer "github.com/aquasecurity/trivy/pkg/rpc/server"
"github.com/aquasecurity/trivy/pkg/utils"
)
// Run runs the scan
func Run(ctx *cli.Context) error {
return run(config.New(ctx))
return run(NewConfig(ctx))
}
func run(c config.Config) (err error) {
func run(c Config) (err error) {
if err = log.InitLogger(c.Debug, c.Quiet); err != nil {
return xerrors.Errorf("failed to initialize a logger: %w", err)
}
@@ -53,5 +52,6 @@ func run(c config.Config) (err error) {
return xerrors.Errorf("error in vulnerability DB initialize: %w", err)
}
return server.ListenAndServe(c, cache)
server := rpcServer.NewServer(c.AppVersion, c.Listen, c.CacheDir, c.Token, c.TokenHeader)
return server.ListenAndServe(cache)
}

View File

@@ -14,7 +14,6 @@ import (
"github.com/aquasecurity/fanal/cache"
"github.com/aquasecurity/trivy-db/pkg/db"
"github.com/aquasecurity/trivy/internal/server/config"
dbFile "github.com/aquasecurity/trivy/pkg/db"
"github.com/aquasecurity/trivy/pkg/log"
"github.com/aquasecurity/trivy/pkg/utils"
@@ -28,26 +27,46 @@ var DBWorkerSuperSet = wire.NewSet(
newDBWorker,
)
// Server represents Trivy server
type Server struct {
appVersion string
addr string
cacheDir string
token string
tokenHeader string
}
// NewServer returns an instance of Server
func NewServer(appVersion, addr, cacheDir, token, tokenHeader string) Server {
return Server{
appVersion: appVersion,
addr: addr,
cacheDir: cacheDir,
token: token,
tokenHeader: tokenHeader,
}
}
// ListenAndServe starts Trivy server
func ListenAndServe(c config.Config, serverCache cache.Cache) error {
func (s Server) ListenAndServe(serverCache cache.Cache) error {
requestWg := &sync.WaitGroup{}
dbUpdateWg := &sync.WaitGroup{}
go func() {
worker := initializeDBWorker(c.CacheDir, true)
worker := initializeDBWorker(s.cacheDir, true)
ctx := context.Background()
for {
time.Sleep(1 * time.Hour)
if err := worker.update(ctx, c.AppVersion, c.CacheDir, dbUpdateWg, requestWg); err != nil {
if err := worker.update(ctx, s.appVersion, s.cacheDir, dbUpdateWg, requestWg); err != nil {
log.Logger.Errorf("%+v\n", err)
}
}
}()
mux := newServeMux(serverCache, dbUpdateWg, requestWg, c.Token, c.TokenHeader)
log.Logger.Infof("Listening %s...", c.Listen)
mux := newServeMux(serverCache, dbUpdateWg, requestWg, s.token, s.tokenHeader)
log.Logger.Infof("Listening %s...", s.addr)
return http.ListenAndServe(c.Listen, mux)
return http.ListenAndServe(s.addr, mux)
}
func newServeMux(serverCache cache.Cache, dbUpdateWg, requestWg *sync.WaitGroup, token, tokenHeader string) *http.ServeMux {