2022-04-27 01:00:20 -05:00
|
|
|
//go:build sync && scrub && metrics && search && ui_base
|
|
|
|
// +build sync,scrub,metrics,search,ui_base
|
2021-12-28 08:29:30 -05:00
|
|
|
|
|
|
|
package cli_test
|
|
|
|
|
|
|
|
import (
|
|
|
|
"fmt"
|
|
|
|
"net/http"
|
|
|
|
"os"
|
|
|
|
"testing"
|
|
|
|
|
|
|
|
. "github.com/smartystreets/goconvey/convey"
|
|
|
|
"gopkg.in/resty.v1"
|
|
|
|
"zotregistry.io/zot/pkg/cli"
|
|
|
|
. "zotregistry.io/zot/pkg/test"
|
|
|
|
)
|
|
|
|
|
|
|
|
func TestServeExtensions(t *testing.T) {
|
|
|
|
oldArgs := os.Args
|
|
|
|
|
|
|
|
defer func() { os.Args = oldArgs }()
|
|
|
|
|
|
|
|
Convey("config file with no extensions", t, func(c C) {
|
|
|
|
port := GetFreePort()
|
|
|
|
baseURL := GetBaseURL(port)
|
2022-09-02 07:56:02 -05:00
|
|
|
logFile, err := os.CreateTemp("", "zot-log*.txt")
|
2021-12-28 08:29:30 -05:00
|
|
|
So(err, ShouldBeNil)
|
|
|
|
defer os.Remove(logFile.Name()) // clean up
|
|
|
|
|
|
|
|
content := fmt.Sprintf(`{
|
|
|
|
"storage": {
|
|
|
|
"rootDirectory": "/tmp/zot"
|
|
|
|
},
|
|
|
|
"http": {
|
|
|
|
"address": "127.0.0.1",
|
|
|
|
"port": "%s"
|
|
|
|
},
|
|
|
|
"log": {
|
|
|
|
"level": "debug",
|
|
|
|
"output": "%s"
|
|
|
|
}
|
|
|
|
}`, port, logFile.Name())
|
|
|
|
|
2022-09-02 07:56:02 -05:00
|
|
|
cfgfile, err := os.CreateTemp("", "zot-test*.json")
|
2021-12-28 08:29:30 -05:00
|
|
|
So(err, ShouldBeNil)
|
|
|
|
defer os.Remove(cfgfile.Name()) // clean up
|
|
|
|
_, err = cfgfile.Write([]byte(content))
|
|
|
|
So(err, ShouldBeNil)
|
|
|
|
err = cfgfile.Close()
|
|
|
|
So(err, ShouldBeNil)
|
|
|
|
|
|
|
|
os.Args = []string{"cli_test", "serve", cfgfile.Name()}
|
|
|
|
go func() {
|
|
|
|
err = cli.NewServerRootCmd().Execute()
|
|
|
|
So(err, ShouldBeNil)
|
|
|
|
}()
|
|
|
|
|
|
|
|
WaitTillServerReady(baseURL)
|
|
|
|
data, err := os.ReadFile(logFile.Name())
|
|
|
|
So(err, ShouldBeNil)
|
|
|
|
So(string(data), ShouldContainSubstring, "\"Extensions\":null")
|
|
|
|
})
|
|
|
|
|
|
|
|
Convey("config file with empty extensions", t, func(c C) {
|
|
|
|
port := GetFreePort()
|
|
|
|
baseURL := GetBaseURL(port)
|
2022-09-02 07:56:02 -05:00
|
|
|
logFile, err := os.CreateTemp("", "zot-log*.txt")
|
2021-12-28 08:29:30 -05:00
|
|
|
So(err, ShouldBeNil)
|
|
|
|
defer os.Remove(logFile.Name()) // clean up
|
|
|
|
|
|
|
|
content := fmt.Sprintf(`{
|
|
|
|
"storage": {
|
|
|
|
"rootDirectory": "/tmp/zot"
|
|
|
|
},
|
|
|
|
"http": {
|
|
|
|
"address": "127.0.0.1",
|
|
|
|
"port": "%s"
|
|
|
|
},
|
|
|
|
"log": {
|
|
|
|
"level": "debug",
|
|
|
|
"output": "%s"
|
|
|
|
},
|
|
|
|
"extensions": {
|
|
|
|
}
|
|
|
|
}`, port, logFile.Name())
|
|
|
|
|
2022-09-02 07:56:02 -05:00
|
|
|
cfgfile, err := os.CreateTemp("", "zot-test*.json")
|
2021-12-28 08:29:30 -05:00
|
|
|
So(err, ShouldBeNil)
|
|
|
|
defer os.Remove(cfgfile.Name()) // clean up
|
|
|
|
_, err = cfgfile.Write([]byte(content))
|
|
|
|
So(err, ShouldBeNil)
|
|
|
|
err = cfgfile.Close()
|
|
|
|
So(err, ShouldBeNil)
|
|
|
|
|
|
|
|
os.Args = []string{"cli_test", "serve", cfgfile.Name()}
|
|
|
|
go func() {
|
|
|
|
err = cli.NewServerRootCmd().Execute()
|
|
|
|
So(err, ShouldBeNil)
|
|
|
|
}()
|
|
|
|
|
|
|
|
WaitTillServerReady(baseURL)
|
|
|
|
data, err := os.ReadFile(logFile.Name())
|
|
|
|
So(err, ShouldBeNil)
|
2022-06-24 08:08:47 -05:00
|
|
|
So(string(data), ShouldContainSubstring, "\"Extensions\":{\"Search\":null,\"Sync\":null,\"Metrics\":null,\"Scrub\":null,\"Lint\":null") //nolint:lll // gofumpt conflicts with lll
|
2021-12-28 08:29:30 -05:00
|
|
|
})
|
|
|
|
}
|
|
|
|
|
|
|
|
func testWithMetricsEnabled(cfgContentFormat string) {
|
|
|
|
port := GetFreePort()
|
|
|
|
baseURL := GetBaseURL(port)
|
2022-09-02 07:56:02 -05:00
|
|
|
logFile, err := os.CreateTemp("", "zot-log*.txt")
|
2021-12-28 08:29:30 -05:00
|
|
|
So(err, ShouldBeNil)
|
|
|
|
|
|
|
|
defer os.Remove(logFile.Name()) // clean up
|
|
|
|
|
|
|
|
content := fmt.Sprintf(cfgContentFormat, port, logFile.Name())
|
2022-09-02 07:56:02 -05:00
|
|
|
cfgfile, err := os.CreateTemp("", "zot-test*.json")
|
2021-12-28 08:29:30 -05:00
|
|
|
So(err, ShouldBeNil)
|
|
|
|
|
|
|
|
defer os.Remove(cfgfile.Name()) // clean up
|
|
|
|
_, err = cfgfile.Write([]byte(content))
|
|
|
|
So(err, ShouldBeNil)
|
|
|
|
err = cfgfile.Close()
|
|
|
|
So(err, ShouldBeNil)
|
|
|
|
|
|
|
|
os.Args = []string{"cli_test", "serve", cfgfile.Name()}
|
|
|
|
|
|
|
|
go func() {
|
|
|
|
err = cli.NewServerRootCmd().Execute()
|
|
|
|
So(err, ShouldBeNil)
|
|
|
|
}()
|
|
|
|
WaitTillServerReady(baseURL)
|
|
|
|
|
|
|
|
resp, err := resty.R().Get(baseURL + "/metrics")
|
|
|
|
So(err, ShouldBeNil)
|
|
|
|
So(resp, ShouldNotBeNil)
|
|
|
|
So(resp.StatusCode(), ShouldEqual, http.StatusOK)
|
|
|
|
|
|
|
|
respStr := string(resp.Body())
|
|
|
|
So(respStr, ShouldContainSubstring, "zot_info")
|
|
|
|
|
|
|
|
data, err := os.ReadFile(logFile.Name())
|
|
|
|
So(err, ShouldBeNil)
|
|
|
|
So(string(data), ShouldContainSubstring,
|
2022-06-24 08:08:47 -05:00
|
|
|
"\"Extensions\":{\"Search\":null,\"Sync\":null,\"Metrics\":{\"Enable\":true,\"Prometheus\":{\"Path\":\"/metrics\"}},\"Scrub\":null,\"Lint\":null}") //nolint:lll // gofumpt conflicts with lll
|
2021-12-28 08:29:30 -05:00
|
|
|
}
|
|
|
|
|
|
|
|
func TestServeMetricsExtension(t *testing.T) {
|
|
|
|
oldArgs := os.Args
|
|
|
|
|
|
|
|
defer func() { os.Args = oldArgs }()
|
|
|
|
|
|
|
|
Convey("no explicit enable", t, func(c C) {
|
|
|
|
content := `{
|
|
|
|
"storage": {
|
|
|
|
"rootDirectory": "/tmp/zot"
|
|
|
|
},
|
|
|
|
"http": {
|
|
|
|
"address": "127.0.0.1",
|
|
|
|
"port": "%s"
|
|
|
|
},
|
|
|
|
"log": {
|
|
|
|
"level": "debug",
|
|
|
|
"output": "%s"
|
|
|
|
},
|
|
|
|
"extensions": {
|
|
|
|
"metrics": {
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}`
|
|
|
|
testWithMetricsEnabled(content)
|
|
|
|
})
|
|
|
|
|
|
|
|
Convey("no explicit enable but with prometheus parameter", t, func(c C) {
|
|
|
|
content := `{
|
|
|
|
"storage": {
|
|
|
|
"rootDirectory": "/tmp/zot"
|
|
|
|
},
|
|
|
|
"http": {
|
|
|
|
"address": "127.0.0.1",
|
|
|
|
"port": "%s"
|
|
|
|
},
|
|
|
|
"log": {
|
|
|
|
"level": "debug",
|
|
|
|
"output": "%s"
|
|
|
|
},
|
|
|
|
"extensions": {
|
|
|
|
"metrics": {
|
|
|
|
"prometheus": {
|
|
|
|
"path": "/metrics"
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}`
|
|
|
|
testWithMetricsEnabled(content)
|
|
|
|
})
|
|
|
|
|
|
|
|
Convey("with explicit enable, but without prometheus parameter", t, func(c C) {
|
|
|
|
content := `{
|
|
|
|
"storage": {
|
|
|
|
"rootDirectory": "/tmp/zot"
|
|
|
|
},
|
|
|
|
"http": {
|
|
|
|
"address": "127.0.0.1",
|
|
|
|
"port": "%s"
|
|
|
|
},
|
|
|
|
"log": {
|
|
|
|
"level": "debug",
|
|
|
|
"output": "%s"
|
|
|
|
},
|
|
|
|
"extensions": {
|
|
|
|
"metrics": {
|
|
|
|
"enable": true
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}`
|
|
|
|
testWithMetricsEnabled(content)
|
|
|
|
})
|
|
|
|
|
|
|
|
Convey("with explicit disable", t, func(c C) {
|
|
|
|
port := GetFreePort()
|
|
|
|
baseURL := GetBaseURL(port)
|
2022-09-02 07:56:02 -05:00
|
|
|
logFile, err := os.CreateTemp("", "zot-log*.txt")
|
2021-12-28 08:29:30 -05:00
|
|
|
So(err, ShouldBeNil)
|
|
|
|
defer os.Remove(logFile.Name()) // clean up
|
|
|
|
|
|
|
|
content := fmt.Sprintf(`{
|
|
|
|
"storage": {
|
|
|
|
"rootDirectory": "/tmp/zot"
|
|
|
|
},
|
|
|
|
"http": {
|
|
|
|
"address": "127.0.0.1",
|
|
|
|
"port": "%s"
|
|
|
|
},
|
|
|
|
"log": {
|
|
|
|
"level": "debug",
|
|
|
|
"output": "%s"
|
|
|
|
},
|
|
|
|
"extensions": {
|
|
|
|
"metrics": {
|
|
|
|
"enable": false
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}`, port, logFile.Name())
|
|
|
|
|
2022-09-02 07:56:02 -05:00
|
|
|
cfgfile, err := os.CreateTemp("", "zot-test*.json")
|
2021-12-28 08:29:30 -05:00
|
|
|
So(err, ShouldBeNil)
|
|
|
|
defer os.Remove(cfgfile.Name()) // clean up
|
|
|
|
_, err = cfgfile.Write([]byte(content))
|
|
|
|
So(err, ShouldBeNil)
|
|
|
|
err = cfgfile.Close()
|
|
|
|
So(err, ShouldBeNil)
|
|
|
|
|
|
|
|
os.Args = []string{"cli_test", "serve", cfgfile.Name()}
|
|
|
|
go func() {
|
|
|
|
err = cli.NewServerRootCmd().Execute()
|
|
|
|
So(err, ShouldBeNil)
|
|
|
|
}()
|
|
|
|
WaitTillServerReady(baseURL)
|
|
|
|
|
|
|
|
resp, err := resty.R().Get(baseURL + "/metrics")
|
|
|
|
So(err, ShouldBeNil)
|
|
|
|
So(resp, ShouldNotBeNil)
|
|
|
|
So(resp.StatusCode(), ShouldEqual, http.StatusNotFound)
|
|
|
|
|
|
|
|
data, err := os.ReadFile(logFile.Name())
|
|
|
|
So(err, ShouldBeNil)
|
|
|
|
So(string(data), ShouldContainSubstring,
|
2022-06-24 08:08:47 -05:00
|
|
|
"\"Extensions\":{\"Search\":null,\"Sync\":null,\"Metrics\":{\"Enable\":false,\"Prometheus\":{\"Path\":\"/metrics\"}},\"Scrub\":null,\"Lint\":null}}") //nolint:lll // gofumpt conflicts with lll
|
2021-12-28 08:29:30 -05:00
|
|
|
})
|
|
|
|
}
|
|
|
|
|
|
|
|
func TestServeSyncExtension(t *testing.T) {
|
|
|
|
oldArgs := os.Args
|
|
|
|
|
|
|
|
defer func() { os.Args = oldArgs }()
|
|
|
|
|
|
|
|
Convey("sync implicitly enabled", t, func(c C) {
|
2022-06-30 10:43:31 -05:00
|
|
|
content := `{
|
2021-12-28 08:29:30 -05:00
|
|
|
"storage": {
|
2022-06-30 10:43:31 -05:00
|
|
|
"rootDirectory": "%s"
|
2021-12-28 08:29:30 -05:00
|
|
|
},
|
|
|
|
"http": {
|
|
|
|
"address": "127.0.0.1",
|
|
|
|
"port": "%s"
|
|
|
|
},
|
|
|
|
"log": {
|
|
|
|
"level": "debug",
|
|
|
|
"output": "%s"
|
|
|
|
},
|
|
|
|
"extensions": {
|
|
|
|
"sync": {
|
|
|
|
"registries": [{
|
|
|
|
"urls": ["http://localhost:8080"],
|
|
|
|
"tlsVerify": false,
|
|
|
|
"onDemand": true,
|
|
|
|
"maxRetries": 3,
|
|
|
|
"retryDelay": "15m",
|
|
|
|
"certDir": "",
|
|
|
|
"content":[
|
|
|
|
{
|
|
|
|
"prefix": "zot-test",
|
|
|
|
"tags": {
|
|
|
|
"regex": ".*",
|
|
|
|
"semver": true
|
|
|
|
}
|
|
|
|
}
|
|
|
|
]
|
|
|
|
}]
|
|
|
|
}
|
|
|
|
}
|
2022-06-30 10:43:31 -05:00
|
|
|
}`
|
2021-12-28 08:29:30 -05:00
|
|
|
|
2022-06-30 10:43:31 -05:00
|
|
|
data, err := runCLIWithConfig(t.TempDir(), content)
|
2021-12-28 08:29:30 -05:00
|
|
|
So(err, ShouldBeNil)
|
2022-06-30 10:43:31 -05:00
|
|
|
So(data, ShouldContainSubstring,
|
2021-12-28 08:29:30 -05:00
|
|
|
"\"Extensions\":{\"Search\":null,\"Sync\":{\"Enable\":true")
|
|
|
|
})
|
|
|
|
|
|
|
|
Convey("sync explicitly enabled", t, func(c C) {
|
2022-06-30 10:43:31 -05:00
|
|
|
content := `{
|
2021-12-28 08:29:30 -05:00
|
|
|
"storage": {
|
2022-06-30 10:43:31 -05:00
|
|
|
"rootDirectory": "%s"
|
2021-12-28 08:29:30 -05:00
|
|
|
},
|
|
|
|
"http": {
|
|
|
|
"address": "127.0.0.1",
|
|
|
|
"port": "%s"
|
|
|
|
},
|
|
|
|
"log": {
|
|
|
|
"level": "debug",
|
|
|
|
"output": "%s"
|
|
|
|
},
|
|
|
|
"extensions": {
|
|
|
|
"sync": {
|
|
|
|
"enable": true,
|
|
|
|
"registries": [{
|
|
|
|
"urls": ["http://localhost:8080"],
|
|
|
|
"tlsVerify": false,
|
|
|
|
"onDemand": true,
|
|
|
|
"maxRetries": 3,
|
|
|
|
"retryDelay": "15m",
|
|
|
|
"certDir": "",
|
|
|
|
"content":[
|
|
|
|
{
|
|
|
|
"prefix": "zot-test",
|
|
|
|
"tags": {
|
|
|
|
"regex": ".*",
|
|
|
|
"semver": true
|
|
|
|
}
|
|
|
|
}
|
|
|
|
]
|
|
|
|
}]
|
|
|
|
}
|
|
|
|
}
|
2022-06-30 10:43:31 -05:00
|
|
|
}`
|
2021-12-28 08:29:30 -05:00
|
|
|
|
2022-06-30 10:43:31 -05:00
|
|
|
data, err := runCLIWithConfig(t.TempDir(), content)
|
2021-12-28 08:29:30 -05:00
|
|
|
So(err, ShouldBeNil)
|
2022-06-30 10:43:31 -05:00
|
|
|
So(data, ShouldContainSubstring,
|
2021-12-28 08:29:30 -05:00
|
|
|
"\"Extensions\":{\"Search\":null,\"Sync\":{\"Enable\":true")
|
|
|
|
})
|
|
|
|
|
|
|
|
Convey("sync explicitly disabled", t, func(c C) {
|
2022-06-30 10:43:31 -05:00
|
|
|
content := `{
|
2021-12-28 08:29:30 -05:00
|
|
|
"storage": {
|
2022-06-30 10:43:31 -05:00
|
|
|
"rootDirectory": "%s"
|
2021-12-28 08:29:30 -05:00
|
|
|
},
|
|
|
|
"http": {
|
|
|
|
"address": "127.0.0.1",
|
|
|
|
"port": "%s"
|
|
|
|
},
|
|
|
|
"log": {
|
|
|
|
"level": "debug",
|
|
|
|
"output": "%s"
|
|
|
|
},
|
|
|
|
"extensions": {
|
|
|
|
"sync": {
|
|
|
|
"enable": false,
|
|
|
|
"registries": [{
|
|
|
|
"urls": ["http://127.0.0.1:8080"],
|
|
|
|
"tlsVerify": false,
|
|
|
|
"certDir": "",
|
|
|
|
"maxRetries": 3,
|
|
|
|
"retryDelay": "15m"
|
|
|
|
}]
|
|
|
|
}
|
|
|
|
}
|
2022-06-30 10:43:31 -05:00
|
|
|
}`
|
2021-12-28 08:29:30 -05:00
|
|
|
|
2022-06-30 10:43:31 -05:00
|
|
|
data, err := runCLIWithConfig(t.TempDir(), content)
|
2021-12-28 08:29:30 -05:00
|
|
|
So(err, ShouldBeNil)
|
2022-06-30 10:43:31 -05:00
|
|
|
So(data, ShouldContainSubstring,
|
2021-12-28 08:29:30 -05:00
|
|
|
"\"Extensions\":{\"Search\":null,\"Sync\":{\"Enable\":false")
|
|
|
|
})
|
|
|
|
}
|
|
|
|
|
2022-03-04 02:37:06 -05:00
|
|
|
func TestServeScrubExtension(t *testing.T) {
|
|
|
|
oldArgs := os.Args
|
|
|
|
|
|
|
|
defer func() { os.Args = oldArgs }()
|
|
|
|
|
|
|
|
Convey("scrub enabled by scrub interval param set", t, func(c C) {
|
2022-06-30 10:43:31 -05:00
|
|
|
content := `{
|
2022-03-04 02:37:06 -05:00
|
|
|
"storage": {
|
2022-06-30 10:43:31 -05:00
|
|
|
"rootDirectory": "%s"
|
2022-03-04 02:37:06 -05:00
|
|
|
},
|
|
|
|
"http": {
|
|
|
|
"address": "127.0.0.1",
|
|
|
|
"port": "%s"
|
|
|
|
},
|
|
|
|
"log": {
|
|
|
|
"level": "debug",
|
|
|
|
"output": "%s"
|
|
|
|
},
|
|
|
|
"extensions": {
|
|
|
|
"scrub": {
|
|
|
|
"interval": "1h"
|
|
|
|
}
|
|
|
|
}
|
2022-06-30 10:43:31 -05:00
|
|
|
}`
|
2022-03-04 02:37:06 -05:00
|
|
|
|
2022-06-30 10:43:31 -05:00
|
|
|
data, err := runCLIWithConfig(t.TempDir(), content)
|
2022-03-04 02:37:06 -05:00
|
|
|
So(err, ShouldBeNil)
|
|
|
|
// Even if in config we specified scrub interval=1h, the minimum interval is 2h
|
2022-06-30 10:43:31 -05:00
|
|
|
So(data, ShouldContainSubstring,
|
2022-06-24 08:08:47 -05:00
|
|
|
"\"Extensions\":{\"Search\":null,\"Sync\":null,\"Metrics\":null,\"Scrub\":{\"Interval\":3600000000000},\"Lint\":null") //nolint:lll // gofumpt conflicts with lll
|
2022-06-30 10:43:31 -05:00
|
|
|
So(data, ShouldContainSubstring,
|
2022-03-04 02:37:06 -05:00
|
|
|
"Scrub interval set to too-short interval < 2h, changing scrub duration to 2 hours and continuing.")
|
2022-06-30 10:43:31 -05:00
|
|
|
So(data, ShouldContainSubstring, "Starting periodic background tasks for")
|
|
|
|
So(data, ShouldContainSubstring, "Finishing periodic background tasks for")
|
2022-03-04 02:37:06 -05:00
|
|
|
})
|
|
|
|
|
|
|
|
Convey("scrub not enabled - scrub interval param not set", t, func(c C) {
|
2022-06-30 10:43:31 -05:00
|
|
|
content := `{
|
2022-03-04 02:37:06 -05:00
|
|
|
"storage": {
|
2022-06-30 10:43:31 -05:00
|
|
|
"rootDirectory": "%s"
|
2022-03-04 02:37:06 -05:00
|
|
|
},
|
|
|
|
"http": {
|
|
|
|
"address": "127.0.0.1",
|
|
|
|
"port": "%s"
|
|
|
|
},
|
|
|
|
"log": {
|
|
|
|
"level": "debug",
|
|
|
|
"output": "%s"
|
|
|
|
},
|
|
|
|
"extensions": {
|
|
|
|
"scrub": {
|
|
|
|
}
|
|
|
|
}
|
2022-06-30 10:43:31 -05:00
|
|
|
}`
|
2022-03-04 02:37:06 -05:00
|
|
|
|
2022-06-30 10:43:31 -05:00
|
|
|
data, err := runCLIWithConfig(t.TempDir(), content)
|
2022-03-04 02:37:06 -05:00
|
|
|
So(err, ShouldBeNil)
|
2022-06-30 10:43:31 -05:00
|
|
|
So(data, ShouldContainSubstring,
|
2022-06-24 08:08:47 -05:00
|
|
|
"\"Extensions\":{\"Search\":null,\"Sync\":null,\"Metrics\":null,\"Scrub\":null,\"Lint\":null}")
|
2022-06-30 10:43:31 -05:00
|
|
|
So(data, ShouldContainSubstring, "Scrub config not provided, skipping scrub")
|
|
|
|
So(data, ShouldNotContainSubstring,
|
2022-03-04 02:37:06 -05:00
|
|
|
"Scrub interval set to too-short interval < 2h, changing scrub duration to 2 hours and continuing.")
|
|
|
|
})
|
|
|
|
}
|
|
|
|
|
2022-06-24 08:08:47 -05:00
|
|
|
func TestServeLintExtension(t *testing.T) {
|
|
|
|
oldArgs := os.Args
|
|
|
|
|
|
|
|
defer func() { os.Args = oldArgs }()
|
|
|
|
|
|
|
|
Convey("lint enabled", t, func(c C) {
|
|
|
|
content := `{
|
|
|
|
"storage": {
|
|
|
|
"rootDirectory": "%s"
|
|
|
|
},
|
|
|
|
"http": {
|
|
|
|
"address": "127.0.0.1",
|
|
|
|
"port": "%s"
|
|
|
|
},
|
|
|
|
"log": {
|
|
|
|
"level": "debug",
|
|
|
|
"output": "%s"
|
|
|
|
},
|
|
|
|
"extensions": {
|
|
|
|
"lint": {
|
|
|
|
"enabled": "true",
|
|
|
|
"mandatoryAnnotations": ["annot1"]
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}`
|
|
|
|
|
|
|
|
data, err := runCLIWithConfig(t.TempDir(), content)
|
|
|
|
So(err, ShouldBeNil)
|
|
|
|
So(data, ShouldContainSubstring,
|
|
|
|
"\"Extensions\":{\"Search\":null,\"Sync\":null,\"Metrics\":null,\"Scrub\":null,\"Lint\":{\"Enabled\":true,\"MandatoryAnnotations\":") //nolint:lll // gofumpt conflicts with lll
|
|
|
|
})
|
|
|
|
|
|
|
|
Convey("lint enabled", t, func(c C) {
|
|
|
|
content := `{
|
|
|
|
"storage": {
|
|
|
|
"rootDirectory": "%s"
|
|
|
|
},
|
|
|
|
"http": {
|
|
|
|
"address": "127.0.0.1",
|
|
|
|
"port": "%s"
|
|
|
|
},
|
|
|
|
"log": {
|
|
|
|
"level": "debug",
|
|
|
|
"output": "%s"
|
|
|
|
},
|
|
|
|
"extensions": {
|
|
|
|
"lint": {
|
|
|
|
"enabled": "false"
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}`
|
|
|
|
|
|
|
|
data, err := runCLIWithConfig(t.TempDir(), content)
|
|
|
|
So(err, ShouldBeNil)
|
|
|
|
So(data, ShouldContainSubstring,
|
|
|
|
"\"Extensions\":{\"Search\":null,\"Sync\":null,\"Metrics\":null,\"Scrub\":null,\"Lint\":{\"Enabled\":false,\"MandatoryAnnotations\":null}") //nolint:lll // gofumpt conflicts with lll
|
|
|
|
})
|
|
|
|
}
|
|
|
|
|
2022-06-30 10:43:31 -05:00
|
|
|
func TestServeSearchEnabled(t *testing.T) {
|
2021-12-28 08:29:30 -05:00
|
|
|
oldArgs := os.Args
|
|
|
|
|
|
|
|
defer func() { os.Args = oldArgs }()
|
|
|
|
|
|
|
|
Convey("search implicitly enabled", t, func(c C) {
|
2022-06-30 10:43:31 -05:00
|
|
|
content := `{
|
2021-12-28 08:29:30 -05:00
|
|
|
"storage": {
|
2022-05-03 14:43:33 -05:00
|
|
|
"rootDirectory": "%s"
|
2021-12-28 08:29:30 -05:00
|
|
|
},
|
|
|
|
"http": {
|
|
|
|
"address": "127.0.0.1",
|
|
|
|
"port": "%s"
|
|
|
|
},
|
|
|
|
"log": {
|
|
|
|
"level": "debug",
|
|
|
|
"output": "%s"
|
|
|
|
},
|
|
|
|
"extensions": {
|
|
|
|
"search": {
|
|
|
|
}
|
|
|
|
}
|
2022-06-30 10:43:31 -05:00
|
|
|
}`
|
2021-12-28 08:29:30 -05:00
|
|
|
|
2022-07-14 05:03:25 -05:00
|
|
|
tempDir := t.TempDir()
|
|
|
|
data, err := runCLIWithConfig(tempDir, content)
|
|
|
|
// to avoid data race when multiple go routines write to trivy DB instance.
|
|
|
|
WaitTillTrivyDBDownloadStarted(tempDir)
|
2021-12-28 08:29:30 -05:00
|
|
|
So(err, ShouldBeNil)
|
2022-06-30 10:43:31 -05:00
|
|
|
So(data, ShouldContainSubstring,
|
2022-06-24 08:08:47 -05:00
|
|
|
"\"Extensions\":{\"Search\":{\"CVE\":{\"UpdateInterval\":86400000000000},\"Enable\":true},\"Sync\":null,\"Metrics\":null,\"Scrub\":null,\"Lint\":null}") //nolint:lll // gofumpt conflicts with lll
|
2022-06-30 10:43:31 -05:00
|
|
|
So(data, ShouldContainSubstring, "updating the CVE database")
|
2021-12-28 08:29:30 -05:00
|
|
|
})
|
2022-06-30 10:43:31 -05:00
|
|
|
}
|
2021-12-28 08:29:30 -05:00
|
|
|
|
2022-06-30 10:43:31 -05:00
|
|
|
func TestServeSearchEnabledCVE(t *testing.T) {
|
|
|
|
oldArgs := os.Args
|
2021-12-28 08:29:30 -05:00
|
|
|
|
2022-06-30 10:43:31 -05:00
|
|
|
defer func() { os.Args = oldArgs }()
|
|
|
|
|
|
|
|
Convey("search implicitly enabled with CVE param set", t, func(c C) {
|
|
|
|
content := `{
|
2021-12-28 08:29:30 -05:00
|
|
|
"storage": {
|
2022-05-03 14:43:33 -05:00
|
|
|
"rootDirectory": "%s"
|
2021-12-28 08:29:30 -05:00
|
|
|
},
|
|
|
|
"http": {
|
|
|
|
"address": "127.0.0.1",
|
|
|
|
"port": "%s"
|
|
|
|
},
|
|
|
|
"log": {
|
|
|
|
"level": "debug",
|
|
|
|
"output": "%s"
|
|
|
|
},
|
|
|
|
"extensions": {
|
|
|
|
"search": {
|
|
|
|
"cve": {
|
|
|
|
"updateInterval": "1h"
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
2022-06-30 10:43:31 -05:00
|
|
|
}`
|
2021-12-28 08:29:30 -05:00
|
|
|
|
2022-07-14 05:03:25 -05:00
|
|
|
tempDir := t.TempDir()
|
|
|
|
data, err := runCLIWithConfig(tempDir, content)
|
|
|
|
// to avoid data race when multiple go routines write to trivy DB instance.
|
|
|
|
WaitTillTrivyDBDownloadStarted(tempDir)
|
2021-12-28 08:29:30 -05:00
|
|
|
So(err, ShouldBeNil)
|
|
|
|
// Even if in config we specified updateInterval=1h, the minimum interval is 2h
|
2022-06-30 10:43:31 -05:00
|
|
|
So(data, ShouldContainSubstring,
|
2022-06-24 08:08:47 -05:00
|
|
|
"\"Extensions\":{\"Search\":{\"CVE\":{\"UpdateInterval\":3600000000000},\"Enable\":true},\"Sync\":null,\"Metrics\":null,\"Scrub\":null,\"Lint\":null}") //nolint:lll // gofumpt conflicts with lll
|
2022-06-30 10:43:31 -05:00
|
|
|
So(data, ShouldContainSubstring, "updating the CVE database")
|
|
|
|
So(data, ShouldContainSubstring,
|
2021-12-28 08:29:30 -05:00
|
|
|
"CVE update interval set to too-short interval < 2h, changing update duration to 2 hours and continuing.")
|
|
|
|
})
|
2022-06-30 10:43:31 -05:00
|
|
|
}
|
2021-12-28 08:29:30 -05:00
|
|
|
|
2022-06-30 10:43:31 -05:00
|
|
|
func TestServeSearchEnabledNoCVE(t *testing.T) {
|
|
|
|
oldArgs := os.Args
|
2021-12-28 08:29:30 -05:00
|
|
|
|
2022-06-30 10:43:31 -05:00
|
|
|
defer func() { os.Args = oldArgs }()
|
|
|
|
|
|
|
|
Convey("search explicitly enabled, but CVE parameter not set", t, func(c C) {
|
|
|
|
content := `{
|
2021-12-28 08:29:30 -05:00
|
|
|
"storage": {
|
2022-05-03 14:43:33 -05:00
|
|
|
"rootDirectory": "%s"
|
2021-12-28 08:29:30 -05:00
|
|
|
},
|
|
|
|
"http": {
|
|
|
|
"address": "127.0.0.1",
|
|
|
|
"port": "%s"
|
|
|
|
},
|
|
|
|
"log": {
|
|
|
|
"level": "debug",
|
|
|
|
"output": "%s"
|
|
|
|
},
|
|
|
|
"extensions": {
|
|
|
|
"search": {
|
|
|
|
"enable": true
|
|
|
|
}
|
|
|
|
}
|
2022-06-30 10:43:31 -05:00
|
|
|
}`
|
2021-12-28 08:29:30 -05:00
|
|
|
|
2022-07-14 05:03:25 -05:00
|
|
|
tempDir := t.TempDir()
|
|
|
|
data, err := runCLIWithConfig(tempDir, content)
|
|
|
|
// to avoid data race when multiple go routines write to trivy DB instance.
|
|
|
|
WaitTillTrivyDBDownloadStarted(tempDir)
|
2021-12-28 08:29:30 -05:00
|
|
|
So(err, ShouldBeNil)
|
2022-06-30 10:43:31 -05:00
|
|
|
So(data, ShouldContainSubstring,
|
2022-06-24 08:08:47 -05:00
|
|
|
"\"Extensions\":{\"Search\":{\"CVE\":{\"UpdateInterval\":86400000000000},\"Enable\":true},\"Sync\":null,\"Metrics\":null,\"Scrub\":null,\"Lint\":null}") //nolint:lll // gofumpt conflicts with lll
|
2022-06-30 10:43:31 -05:00
|
|
|
So(data, ShouldContainSubstring, "updating the CVE database")
|
2021-12-28 08:29:30 -05:00
|
|
|
})
|
2022-06-30 10:43:31 -05:00
|
|
|
}
|
2021-12-28 08:29:30 -05:00
|
|
|
|
2022-06-30 10:43:31 -05:00
|
|
|
func TestServeSearchDisabled(t *testing.T) {
|
|
|
|
oldArgs := os.Args
|
2021-12-28 08:29:30 -05:00
|
|
|
|
2022-06-30 10:43:31 -05:00
|
|
|
defer func() { os.Args = oldArgs }()
|
|
|
|
|
|
|
|
Convey("search explicitly disabled", t, func(c C) {
|
|
|
|
content := `{
|
2021-12-28 08:29:30 -05:00
|
|
|
"storage": {
|
2022-05-03 14:43:33 -05:00
|
|
|
"rootDirectory": "%s"
|
2021-12-28 08:29:30 -05:00
|
|
|
},
|
|
|
|
"http": {
|
|
|
|
"address": "127.0.0.1",
|
|
|
|
"port": "%s"
|
|
|
|
},
|
|
|
|
"log": {
|
|
|
|
"level": "debug",
|
|
|
|
"output": "%s"
|
|
|
|
},
|
|
|
|
"extensions": {
|
|
|
|
"search": {
|
|
|
|
"enable": false,
|
|
|
|
"cve": {
|
|
|
|
"updateInterval": "3h"
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
2022-06-30 10:43:31 -05:00
|
|
|
}`
|
2021-12-28 08:29:30 -05:00
|
|
|
|
2022-06-30 10:43:31 -05:00
|
|
|
data, err := runCLIWithConfig(t.TempDir(), content)
|
2021-12-28 08:29:30 -05:00
|
|
|
So(err, ShouldBeNil)
|
|
|
|
|
|
|
|
So(err, ShouldBeNil)
|
2022-06-30 10:43:31 -05:00
|
|
|
So(data, ShouldContainSubstring,
|
2022-06-24 08:08:47 -05:00
|
|
|
"\"Extensions\":{\"Search\":{\"CVE\":{\"UpdateInterval\":10800000000000},\"Enable\":false},\"Sync\":null,\"Metrics\":null,\"Scrub\":null,\"Lint\":null}") //nolint:lll // gofumpt conflicts with lll
|
2022-06-30 10:43:31 -05:00
|
|
|
So(data, ShouldContainSubstring, "CVE config not provided, skipping CVE update")
|
|
|
|
So(data, ShouldNotContainSubstring,
|
2021-12-28 08:29:30 -05:00
|
|
|
"CVE update interval set to too-short interval < 2h, changing update duration to 2 hours and continuing.")
|
|
|
|
})
|
|
|
|
}
|
2022-06-30 10:43:31 -05:00
|
|
|
|
|
|
|
// run cli and return output.
|
|
|
|
func runCLIWithConfig(tempDir string, config string) (string, error) {
|
|
|
|
port := GetFreePort()
|
|
|
|
baseURL := GetBaseURL(port)
|
|
|
|
|
2022-09-02 07:56:02 -05:00
|
|
|
logFile, err := os.CreateTemp(tempDir, "zot-log*.txt")
|
2022-06-30 10:43:31 -05:00
|
|
|
if err != nil {
|
|
|
|
return "", err
|
|
|
|
}
|
|
|
|
|
|
|
|
defer os.Remove(logFile.Name()) // clean up
|
|
|
|
|
2022-09-02 07:56:02 -05:00
|
|
|
cfgfile, err := os.CreateTemp(tempDir, "zot-test*.json")
|
2022-06-30 10:43:31 -05:00
|
|
|
if err != nil {
|
|
|
|
return "", err
|
|
|
|
}
|
|
|
|
|
|
|
|
config = fmt.Sprintf(config, tempDir, port, logFile.Name())
|
|
|
|
|
|
|
|
_, err = cfgfile.Write([]byte(config))
|
|
|
|
if err != nil {
|
|
|
|
return "", err
|
|
|
|
}
|
|
|
|
|
|
|
|
err = cfgfile.Close()
|
|
|
|
if err != nil {
|
|
|
|
return "", err
|
|
|
|
}
|
|
|
|
|
|
|
|
os.Args = []string{"cli_test", "serve", cfgfile.Name()}
|
|
|
|
|
|
|
|
go func() {
|
|
|
|
err = cli.NewServerRootCmd().Execute()
|
|
|
|
if err != nil {
|
|
|
|
panic(err)
|
|
|
|
}
|
|
|
|
}()
|
|
|
|
|
|
|
|
WaitTillServerReady(baseURL)
|
|
|
|
|
|
|
|
data, err := os.ReadFile(logFile.Name())
|
|
|
|
So(err, ShouldBeNil)
|
|
|
|
|
|
|
|
return string(data), nil
|
|
|
|
}
|