Merge pull request #45974 from thaJeztah/24.0_backport_create-overlay-on-non-manager

[24.0 backport] libnet: Return proper error when overlay network can't be created
This commit is contained in:
Sebastiaan van Stijn 2023-07-17 09:20:55 +02:00 committed by GitHub
commit 8443a06149
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
33 changed files with 111 additions and 108 deletions

View file

@ -9896,7 +9896,9 @@ paths:
Id: "22be93d5babb089c5aab8dbc369042fad48ff791584ca2da2100db837a1c7c30"
Warning: ""
403:
description: "operation not supported for pre-defined networks"
description: |
Forbidden operation. This happens when trying to create a network named after a pre-defined network,
or when trying to create an overlay network on a daemon which is not part of a Swarm cluster.
schema:
$ref: "#/definitions/ErrorResponse"
404:

View file

@ -304,7 +304,7 @@ func newGraphDriverController(ctx context.Context, rt http.RoundTripper, opt Opt
return nil, errors.Errorf("snapshotter doesn't support differ")
}
leases, err := lm.List(ctx, "labels.\"buildkit/lease.temporary\"")
leases, err := lm.List(ctx, `labels."buildkit/lease.temporary"`)
if err != nil {
return nil, err
}

View file

@ -53,31 +53,31 @@ func TestGetFilenameForDownload(t *testing.T) {
expected string
}{
{
path: "http://www.example.com/",
path: "https://www.example.com/",
expected: "",
},
{
path: "http://www.example.com/xyz",
path: "https://www.example.com/xyz",
expected: "xyz",
},
{
path: "http://www.example.com/xyz.html",
path: "https://www.example.com/xyz.html",
expected: "xyz.html",
},
{
path: "http://www.example.com/xyz/",
path: "https://www.example.com/xyz/",
expected: "",
},
{
path: "http://www.example.com/xyz/uvw",
path: "https://www.example.com/xyz/uvw",
expected: "uvw",
},
{
path: "http://www.example.com/xyz/uvw.html",
path: "https://www.example.com/xyz/uvw.html",
expected: "uvw.html",
},
{
path: "http://www.example.com/xyz/uvw/",
path: "https://www.example.com/xyz/uvw/",
expected: "",
},
{
@ -114,23 +114,23 @@ func TestGetFilenameForDownload(t *testing.T) {
expected: "xyz.html",
},
{
disposition: "attachment; filename=\"xyz\"",
disposition: `attachment; filename="xyz"`,
expected: "xyz",
},
{
disposition: "attachment; filename=\"xyz.html\"",
disposition: `attachment; filename="xyz.html"`,
expected: "xyz.html",
},
{
disposition: "attachment; filename=\"/xyz.html\"",
disposition: `attachment; filename="/xyz.html"`,
expected: "xyz.html",
},
{
disposition: "attachment; filename=\"/xyz/uvw\"",
disposition: `attachment; filename="/xyz/uvw"`,
expected: "uvw",
},
{
disposition: "attachment; filename=\"Naïve file.txt\"",
disposition: `attachment; filename="Naïve file.txt"`,
expected: "Naïve file.txt",
},
}

View file

@ -15,8 +15,8 @@ import (
)
var pathDenyList = map[string]bool{
"c:\\": true,
"c:\\windows": true,
`c:\`: true,
`c:\windows`: true,
}
func init() {

View file

@ -14,20 +14,20 @@ func TestEnable(t *testing.T) {
}()
Enable()
if os.Getenv("DEBUG") != "1" {
t.Fatalf("expected DEBUG=1, got %s\n", os.Getenv("DEBUG"))
t.Fatalf("expected DEBUG=1, got %s", os.Getenv("DEBUG"))
}
if logrus.GetLevel() != logrus.DebugLevel {
t.Fatalf("expected log level %v, got %v\n", logrus.DebugLevel, logrus.GetLevel())
t.Fatalf("expected log level %v, got %v", logrus.DebugLevel, logrus.GetLevel())
}
}
func TestDisable(t *testing.T) {
Disable()
if os.Getenv("DEBUG") != "" {
t.Fatalf("expected DEBUG=\"\", got %s\n", os.Getenv("DEBUG"))
t.Fatalf(`expected DEBUG="", got %s`, os.Getenv("DEBUG"))
}
if logrus.GetLevel() != logrus.InfoLevel {
t.Fatalf("expected log level %v, got %v\n", logrus.InfoLevel, logrus.GetLevel())
t.Fatalf("expected log level %v, got %v", logrus.InfoLevel, logrus.GetLevel())
}
}

View file

@ -42,7 +42,7 @@ func TestImageTagInvalidSourceImageName(t *testing.T) {
}
err := client.ImageTag(context.Background(), "invalid_source_image_name_", "repo:tag")
if err == nil || err.Error() != "Error parsing reference: \"invalid_source_image_name_\" is not a valid repository/tag: invalid reference format" {
if err == nil || err.Error() != `Error parsing reference: "invalid_source_image_name_" is not a valid repository/tag: invalid reference format` {
t.Fatalf("expected Parsing Reference Error, got %v", err)
}
}

View file

@ -359,7 +359,7 @@ func (c *Cluster) errNoManager(st nodeState) error {
if st.err == errSwarmCertificatesExpired {
return errSwarmCertificatesExpired
}
return errors.WithStack(notAvailableError("This node is not a swarm manager. Use \"docker swarm init\" or \"docker swarm join\" to connect this node to swarm and try again."))
return errors.WithStack(notAvailableError(`This node is not a swarm manager. Use "docker swarm init" or "docker swarm join" to connect this node to swarm and try again.`))
}
if st.swarmNode.Manager() != nil {
return errors.WithStack(notAvailableError("This node is not a swarm manager. Manager is being prepared or has trouble connecting to the cluster."))

View file

@ -5,13 +5,13 @@ const (
errNoSwarm notAvailableError = "This node is not part of a swarm"
// errSwarmExists is returned on initialize or join request for a cluster that has already been activated
errSwarmExists notAvailableError = "This node is already part of a swarm. Use \"docker swarm leave\" to leave this swarm and join another one."
errSwarmExists notAvailableError = `This node is already part of a swarm. Use "docker swarm leave" to leave this swarm and join another one.`
// errSwarmJoinTimeoutReached is returned when cluster join could not complete before timeout was reached.
errSwarmJoinTimeoutReached notAvailableError = "Timeout was reached before node joined. The attempt to join the swarm will continue in the background. Use the \"docker info\" command to see the current swarm status of your node."
errSwarmJoinTimeoutReached notAvailableError = `Timeout was reached before node joined. The attempt to join the swarm will continue in the background. Use the "docker info" command to see the current swarm status of your node.`
// errSwarmLocked is returned if the swarm is encrypted and needs a key to unlock it.
errSwarmLocked notAvailableError = "Swarm is encrypted and needs to be unlocked before it can be used. Please use \"docker swarm unlock\" to unlock it."
errSwarmLocked notAvailableError = `Swarm is encrypted and needs to be unlocked before it can be used. Please use "docker swarm unlock" to unlock it.`
// errSwarmCertificatesExpired is returned if docker was not started for the whole validity period and they had no chance to renew automatically.
errSwarmCertificatesExpired notAvailableError = "Swarm certificates have expired. To replace them, leave the swarm and join again."

View file

@ -456,7 +456,7 @@ func (c *Cluster) ServiceLogs(ctx context.Context, selector *backend.LogSelector
} else {
t, err := strconv.Atoi(config.Tail)
if err != nil {
return nil, errors.New("tail value must be a positive integer or \"all\"")
return nil, errors.New(`tail value must be a positive integer or "all"`)
}
if t < 0 {
return nil, errors.New("negative tail values not supported")

View file

@ -701,7 +701,7 @@ func verifyPlatformContainerSettings(daemon *Daemon, hostConfig *containertypes.
if hostConfig.CgroupParent != "" && UsingSystemd(daemon.configStore) {
// CgroupParent for systemd cgroup should be named as "xxx.slice"
if len(hostConfig.CgroupParent) <= 6 || !strings.HasSuffix(hostConfig.CgroupParent, ".slice") {
return warnings, fmt.Errorf("cgroup-parent for systemd cgroup should be a valid slice named as \"xxx.slice\"")
return warnings, fmt.Errorf(`cgroup-parent for systemd cgroup should be a valid slice named as "xxx.slice"`)
}
}
if hostConfig.Runtime == "" {
@ -754,7 +754,7 @@ func verifyDaemonSettings(conf *config.Config) error {
}
if conf.CgroupParent != "" && UsingSystemd(conf) {
if len(conf.CgroupParent) <= 6 || !strings.HasSuffix(conf.CgroupParent, ".slice") {
return fmt.Errorf("cgroup-parent for systemd cgroup should be a valid slice named as \"xxx.slice\"")
return fmt.Errorf(`cgroup-parent for systemd cgroup should be a valid slice named as "xxx.slice"`)
}
}
@ -1069,7 +1069,7 @@ func initBridgeDriver(controller *libnetwork.Controller, config *config.Config)
libnetwork.NetworkOptionIpam("default", "", v4Conf, v6Conf, nil),
libnetwork.NetworkOptionDeferIPv6Alloc(deferIPv6Alloc))
if err != nil {
return fmt.Errorf("Error creating default \"bridge\" network: %v", err)
return fmt.Errorf(`error creating default "bridge" network: %v`, err)
}
return nil
}

View file

@ -148,7 +148,7 @@ func TestParseSecurityOptWithDeprecatedColon(t *testing.T) {
t.Fatalf("Unexpected parseSecurityOpt error: %v", err)
}
if opts.AppArmorProfile != "test_profile" {
t.Fatalf("Unexpected AppArmorProfile, expected: \"test_profile\", got %q", opts.AppArmorProfile)
t.Fatalf(`Unexpected AppArmorProfile, expected: "test_profile", got %q`, opts.AppArmorProfile)
}
// test seccomp

View file

@ -291,6 +291,16 @@ func (daemon *Daemon) createNetwork(create types.NetworkCreateRequest, id string
return nil, PredefinedNetworkError(create.Name)
}
c := daemon.netController
driver := create.Driver
if driver == "" {
driver = c.Config().DefaultDriver
}
if driver == "overlay" && !daemon.cluster.IsManager() && !agent {
return nil, errdefs.Forbidden(errors.New(`This node is not a swarm manager. Use "docker swarm init" or "docker swarm join" to connect this node to swarm and try again.`))
}
var warning string
nw, err := daemon.GetNetworkByName(create.Name)
if err != nil {
@ -309,12 +319,6 @@ func (daemon *Daemon) createNetwork(create types.NetworkCreateRequest, id string
warning = fmt.Sprintf("Network with name %s (id : %s) already exists", nw.Name(), nw.ID())
}
c := daemon.netController
driver := create.Driver
if driver == "" {
driver = c.Config().DefaultDriver
}
networkOptions := make(map[string]string)
for k, v := range create.Options {
networkOptions[k] = v
@ -373,10 +377,6 @@ func (daemon *Daemon) createNetwork(create types.NetworkCreateRequest, id string
n, err := c.NewNetwork(driver, create.Name, id, nwOptions...)
if err != nil {
if errors.Is(err, libnetwork.ErrDataStoreNotInitialized) {
//nolint: revive
return nil, errors.New("This node is not a swarm manager. Use \"docker swarm init\" or \"docker swarm join\" to connect this node to swarm and try again.")
}
return nil, err
}

View file

@ -29,7 +29,7 @@ func validatePSArgs(psArgs string) error {
k := group[1]
v := group[2]
if k != "pid" {
return fmt.Errorf("specifying \"%s=%s\" is not allowed", k, v)
return fmt.Errorf(`specifying "%s=%s" is not allowed`, k, v)
}
}
}

View file

@ -12,8 +12,8 @@ import (
func TestContainerTopValidatePSArgs(t *testing.T) {
tests := map[string]bool{
"ae -o uid=PID": true,
"ae -o \"uid= PID\"": true, // ascii space (0x20)
"ae -o \"uid=PID\"": false, // unicode space (U+2003, 0xe2 0x80 0x83)
`ae -o "uid= PID"`: true, // ascii space (0x20)
`ae -o "uid=PID"`: false, // unicode space (U+2003, 0xe2 0x80 0x83)
"ae o uid=PID": true,
"aeo uid=PID": true,
"ae -O uid=PID": true,

View file

@ -53,7 +53,7 @@ func (daemon *Daemon) update(name string, hostConfig *container.HostConfig) erro
if ctr.RemovalInProgress || ctr.Dead {
ctr.Unlock()
return errCannotUpdate(ctr.ID, fmt.Errorf("container is marked for removal and cannot be \"update\""))
return errCannotUpdate(ctr.ID, fmt.Errorf(`container is marked for removal and cannot be "update"`))
}
if err := ctr.UpdateContainer(hostConfig); err != nil {

View file

@ -76,7 +76,7 @@ func printCliVersion() {
cli.SetTestEnvironment(testEnv)
cmd := cli.Docker(cli.Args("version"))
if cmd.Error != nil {
fmt.Printf("WARNING: Failed to run \"docker version\": %+v\n", cmd.Error)
fmt.Printf("WARNING: Failed to run 'docker version': %+v\n", cmd.Error)
return
}

View file

@ -1158,7 +1158,7 @@ func (s *DockerAPISuite) TestContainerAPIDeleteRemoveLinks(c *testing.T) {
assert.Assert(c, waitRun(id2) == nil)
links := inspectFieldJSON(c, id2, "HostConfig.Links")
assert.Equal(c, links, "[\"/tlink1:/tlink2/tlink1\"]", "expected to have links between containers")
assert.Equal(c, links, `["/tlink1:/tlink2/tlink1"]`, "expected to have links between containers")
removeOptions := types.ContainerRemoveOptions{
RemoveLinks: true,

View file

@ -2258,7 +2258,7 @@ docker.com>"
`))
res := inspectField(c, name, "Author")
if res != "\"Docker IO <io@docker.com>\"" {
if res != `"Docker IO <io@docker.com>"` {
c.Fatalf("Parsed string did not match the escaped string. Got: %q", res)
}
}
@ -2272,7 +2272,7 @@ func (s *DockerCLIBuildSuite) TestBuildVerifyIntString(c *testing.T) {
MAINTAINER 123`))
out, _ := dockerCmd(c, "inspect", name)
if !strings.Contains(out, "\"123\"") {
if !strings.Contains(out, `"123"`) {
c.Fatalf("Output does not contain the int as a string:\n%s", out)
}
}

View file

@ -120,17 +120,17 @@ func (s *DockerCLICommitSuite) TestCommitChange(c *testing.T) {
dockerCmd(c, "run", "--name", "test", "busybox", "true")
imageID, _ := dockerCmd(c, "commit",
"--change", "EXPOSE 8080",
"--change", "ENV DEBUG true",
"--change", "ENV test 1",
"--change", "ENV PATH /foo",
"--change", "LABEL foo bar",
"--change", "CMD [\"/bin/sh\"]",
"--change", "WORKDIR /opt",
"--change", "ENTRYPOINT [\"/bin/sh\"]",
"--change", "USER testuser",
"--change", "VOLUME /var/lib/docker",
"--change", "ONBUILD /usr/local/bin/python-build --dir /app/src",
"--change", `EXPOSE 8080`,
"--change", `ENV DEBUG true`,
"--change", `ENV test 1`,
"--change", `ENV PATH /foo`,
"--change", `LABEL foo bar`,
"--change", `CMD ["/bin/sh"]`,
"--change", `WORKDIR /opt`,
"--change", `ENTRYPOINT ["/bin/sh"]`,
"--change", `USER testuser`,
"--change", `VOLUME /var/lib/docker`,
"--change", `ONBUILD /usr/local/bin/python-build --dir /app/src`,
"test", "test-commit")
imageID = strings.TrimSpace(imageID)

View file

@ -750,7 +750,7 @@ func (s *DockerCLIEventSuite) TestEventsFormatBadFunc(c *testing.T) {
result.Assert(c, icmd.Expected{
Error: "exit status 64",
ExitCode: 64,
Err: "Error parsing format: template: :1: function \"badFuncString\" not defined",
Err: `Error parsing format: template: :1: function "badFuncString" not defined`,
})
}
@ -760,6 +760,6 @@ func (s *DockerCLIEventSuite) TestEventsFormatBadField(c *testing.T) {
result.Assert(c, icmd.Expected{
Error: "exit status 64",
ExitCode: 64,
Err: "Error parsing format: template: :1:2: executing \"\" at <.badFieldString>: can't evaluate field badFieldString in type *events.Message",
Err: `Error parsing format: template: :1:2: executing "" at <.badFieldString>: can't evaluate field badFieldString in type *events.Message`,
})
}

View file

@ -415,21 +415,21 @@ func (s *DockerDaemonSuite) TestDaemonEvents(c *testing.T) {
// only check for values known (daemon ID/name) or explicitly set above,
// otherwise just check for names being present.
expectedSubstrings := []string{
" daemon reload " + info.ID + " ",
"(allow-nondistributable-artifacts=[",
" debug=true, ",
" default-ipc-mode=",
" default-runtime=",
" default-shm-size=",
" insecure-registries=[",
" labels=[\"bar=foo\"], ",
" live-restore=",
" max-concurrent-downloads=1, ",
" max-concurrent-uploads=5, ",
" name=" + info.Name,
" registry-mirrors=[",
" runtimes=",
" shutdown-timeout=10)",
` daemon reload ` + info.ID + " ",
`(allow-nondistributable-artifacts=[`,
` debug=true, `,
` default-ipc-mode=`,
` default-runtime=`,
` default-shm-size=`,
` insecure-registries=[`,
` labels=["bar=foo"], `,
` live-restore=`,
` max-concurrent-downloads=1, `,
` max-concurrent-uploads=5, `,
` name=` + info.Name,
` registry-mirrors=[`,
` runtimes=`,
` shutdown-timeout=10)`,
}
for _, s := range expectedSubstrings {

View file

@ -218,7 +218,7 @@ func (s *DockerCLILinksSuite) TestLinkShortDefinition(c *testing.T) {
assert.Assert(c, waitRun(cid2) == nil)
links := inspectFieldJSON(c, cid2, "HostConfig.Links")
assert.Equal(c, links, "[\"/shortlinkdef:/link2/shortlinkdef\"]")
assert.Equal(c, links, `["/shortlinkdef:/link2/shortlinkdef"]`)
}
func (s *DockerCLILinksSuite) TestLinksNetworkHostContainer(c *testing.T) {

View file

@ -176,7 +176,7 @@ func (s *DockerCLIPsSuite) TestPsListContainersSize(c *testing.T) {
select {
case <-wait:
case <-time.After(3 * time.Second):
c.Fatalf("Calling \"docker ps -s\" timed out!")
c.Fatalf(`Calling "docker ps -s" timed out!`)
}
result.Assert(c, icmd.Success)
lines := strings.Split(strings.Trim(result.Combined(), "\n "), "\n")
@ -634,8 +634,8 @@ func (s *DockerCLIPsSuite) TestPsShowMounts(c *testing.T) {
var bindMountSource string
var bindMountDestination string
if DaemonIsWindows() {
bindMountSource = "c:\\"
bindMountDestination = "c:\\t"
bindMountSource = `c:\`
bindMountDestination = `c:\t`
} else {
bindMountSource = "/tmp"
bindMountDestination = "/t"

View file

@ -391,7 +391,7 @@ func (s *DockerRegistryAuthHtpasswdSuite) TestPullWithExternalAuthLoginWithSchem
b, err := os.ReadFile(configPath)
assert.NilError(c, err)
assert.Assert(c, !strings.Contains(string(b), "\"auth\":"))
assert.Assert(c, !strings.Contains(string(b), `"auth":`))
dockerCmd(c, "--config", tmp, "tag", "busybox", repoName)
dockerCmd(c, "--config", tmp, "push", repoName)
@ -433,7 +433,7 @@ func (s *DockerRegistryAuthHtpasswdSuite) TestPullWithExternalAuth(c *testing.T)
b, err := os.ReadFile(configPath)
assert.NilError(c, err)
assert.Assert(c, !strings.Contains(string(b), "\"auth\":"))
assert.Assert(c, !strings.Contains(string(b), `"auth":`))
dockerCmd(c, "--config", tmp, "tag", "busybox", repoName)
dockerCmd(c, "--config", tmp, "push", repoName)

View file

@ -1673,7 +1673,7 @@ func (s *DockerCLIRunSuite) TestRunCopyVolumeUIDGID(c *testing.T) {
RUN mkdir -p /hello && touch /hello/test && chown dockerio.dockerio /hello`))
// Test that the uid and gid is copied from the image to the volume
out, _ := dockerCmd(c, "run", "--rm", "-v", "/hello", name, "sh", "-c", "ls -l / | grep hello | awk '{print $3\":\"$4}'")
out, _ := dockerCmd(c, "run", "--rm", "-v", "/hello", name, "sh", "-c", `ls -l / | grep hello | awk '{print $3":"$4}'`)
out = strings.TrimSpace(out)
if out != "dockerio:dockerio" {
c.Fatalf("Wrong /hello ownership: %s, expected dockerio:dockerio", out)
@ -2053,7 +2053,7 @@ func (s *DockerCLIRunSuite) TestRunPortInUse(c *testing.T) {
c.Fatalf("Binding on used port must fail")
}
if !strings.Contains(out, "port is already allocated") {
c.Fatalf("Out must be about \"port is already allocated\", got %s", out)
c.Fatalf(`Out must be about "port is already allocated", got %s`, out)
}
}

View file

@ -230,7 +230,7 @@ func (s *DockerSwarmSuite) TestServiceLogsTaskLogs(c *testing.T) {
assert.Assert(c, id != "")
// so, right here, we're basically inspecting by id and returning only
// the ID. if they don't match, the service doesn't exist.
result = icmd.RunCmd(d.Command("service", "inspect", "--format=\"{{.ID}}\"", id))
result = icmd.RunCmd(d.Command("service", "inspect", `--format="{{.ID}}"`, id))
result.Assert(c, icmd.Expected{Out: id})
// make sure task has been deployed.
@ -283,7 +283,7 @@ func (s *DockerSwarmSuite) TestServiceLogsTTY(c *testing.T) {
assert.Assert(c, id != "")
// so, right here, we're basically inspecting by id and returning only
// the ID. if they don't match, the service doesn't exist.
result = icmd.RunCmd(d.Command("service", "inspect", "--format=\"{{.ID}}\"", id))
result = icmd.RunCmd(d.Command("service", "inspect", `--format="{{.ID}}"`, id))
result.Assert(c, icmd.Expected{Out: id})
// make sure task has been deployed.

View file

@ -251,9 +251,10 @@ func TestTemplatedConfig(t *testing.T) {
Templating: &swarmtypes.Driver{
Name: "golang",
},
Data: []byte("SERVICE_NAME={{.Service.Name}}\n" +
"{{secret \"referencedsecrettarget\"}}\n" +
"{{config \"referencedconfigtarget\"}}\n"),
Data: []byte(`SERVICE_NAME={{.Service.Name}}
{{secret "referencedsecrettarget"}}
{{config "referencedconfigtarget"}}
`),
}
templatedConfig, err := c.ConfigCreate(ctx, configSpec)

View file

@ -24,7 +24,7 @@ func TestNoPersist(t *testing.T) {
defer ctrl.Stop()
nw, err := ctrl.NewNetwork("host", "host", "", NetworkOptionPersist(false))
if err != nil {
t.Fatalf("Error creating default \"host\" network: %v", err)
t.Fatalf(`Error creating default "host" network: %v`, err)
}
ep, err := nw.CreateEndpoint("newendpoint", []EndpointOption{}...)
if err != nil {

View file

@ -30,7 +30,7 @@ func testLocalBackend(t *testing.T, provider, url string, storeConfig *store.Con
defer ctrl.Stop()
nw, err := ctrl.NewNetwork("host", "host", "")
if err != nil {
t.Fatalf("Error creating default \"host\" network: %v", err)
t.Fatalf(`Error creating default "host" network: %v`, err)
}
ep, err := nw.CreateEndpoint("newendpoint", []EndpointOption{}...)
if err != nil {

View file

@ -71,10 +71,10 @@ func TestListOptsWithoutValidator(t *testing.T) {
t.Errorf("%d != 3", o.Len())
}
if !o.Get("bar") {
t.Error("o.Get(\"bar\") == false")
t.Error(`o.Get("bar") == false`)
}
if o.Get("baz") {
t.Error("o.Get(\"baz\") == true")
t.Error(`o.Get("baz") == true`)
}
o.Delete("foo")
if o.String() != "[bar bar]" {
@ -106,10 +106,10 @@ func TestListOptsWithValidator(t *testing.T) {
t.Errorf("%d != 1", o.Len())
}
if !o.Get("max-file=2") {
t.Error("o.Get(\"max-file=2\") == false")
t.Error(`o.Get("max-file=2") == false`)
}
if o.Get("baz") {
t.Error("o.Get(\"baz\") == true")
t.Error(`o.Get("baz") == true`)
}
o.Delete("max-file=2")
if o.String() != "" {
@ -361,7 +361,7 @@ func TestMapMapOpts(t *testing.T) {
o.Set("r1=k12=v12")
assert.Check(t, is.DeepEqual(tmpMap["r1"], map[string]string{"k11": "v11", "k12": "v12"}))
if o.Set("invalid-key={\"k\":\"v\"}") == nil {
if o.Set(`invalid-key={"k":"v"}`) == nil {
t.Error("validator is not being called")
}
}

View file

@ -459,14 +459,14 @@ func TestLookupUserAndGroup(t *testing.T) {
func TestLookupUserAndGroupThatDoesNotExist(t *testing.T) {
fakeUser := "fakeuser"
_, err := LookupUser(fakeUser)
assert.Check(t, is.Error(err, "getent unable to find entry \""+fakeUser+"\" in passwd database"))
assert.Check(t, is.Error(err, `getent unable to find entry "fakeuser" in passwd database`))
_, err = LookupUID(-1)
assert.Check(t, is.ErrorContains(err, ""))
fakeGroup := "fakegroup"
_, err = LookupGroup(fakeGroup)
assert.Check(t, is.Error(err, "getent unable to find entry \""+fakeGroup+"\" in group database"))
assert.Check(t, is.Error(err, `getent unable to find entry "fakegroup" in group database`))
_, err = LookupGID(-1)
assert.Check(t, is.ErrorContains(err, ""))

View file

@ -66,7 +66,7 @@ func TestFixedBufferString(t *testing.T) {
out := buf.String()
if out != "helloworld" {
t.Fatalf("expected output to be \"helloworld\", got %q", out)
t.Fatalf(`expected output to be "helloworld", got %q`, out)
}
// read 5 bytes
@ -76,7 +76,7 @@ func TestFixedBufferString(t *testing.T) {
// test that fixedBuffer.String() only returns the part that hasn't been read
out = buf.String()
if out != "world" {
t.Fatalf("expected output to be \"world\", got %q", out)
t.Fatalf(`expected output to be "world", got %q`, out)
}
}
@ -92,7 +92,7 @@ func TestFixedBufferWrite(t *testing.T) {
}
if string(buf.buf[:5]) != "hello" {
t.Fatalf("expected \"hello\", got %q", string(buf.buf[:5]))
t.Fatalf(`expected "hello", got %q`, string(buf.buf[:5]))
}
n, err = buf.Write(bytes.Repeat([]byte{1}, 64))
@ -121,7 +121,7 @@ func TestFixedBufferRead(t *testing.T) {
}
if string(b) != "hello" {
t.Fatalf("expected \"hello\", got %q", string(b))
t.Fatalf(`expected "hello", got %q`, string(b))
}
n, err = buf.Read(b)
@ -134,7 +134,7 @@ func TestFixedBufferRead(t *testing.T) {
}
if string(b) != " worl" {
t.Fatalf("expected \" worl\", got %s", string(b))
t.Fatalf(`expected " worl", got %s`, string(b))
}
b = b[:1]
@ -148,6 +148,6 @@ func TestFixedBufferRead(t *testing.T) {
}
if string(b) != "d" {
t.Fatalf("expected \"d\", got %s", string(b))
t.Fatalf(`expected "d", got %s`, string(b))
}
}

View file

@ -244,22 +244,22 @@ func TestDisplayJSONMessagesStream(t *testing.T) {
"",
""},
// Without progress & ID
"{ \"status\": \"status\" }": {
`{ "status": "status" }`: {
"status\n",
"status\n",
},
// Without progress, with ID
"{ \"id\": \"ID\",\"status\": \"status\" }": {
`{ "id": "ID","status": "status" }`: {
"ID: status\n",
"ID: status\n",
},
// With progress
"{ \"id\": \"ID\", \"status\": \"status\", \"progress\": \"ProgressMessage\" }": {
`{ "id": "ID", "status": "status", "progress": "ProgressMessage" }`: {
"ID: status ProgressMessage",
fmt.Sprintf("\n%c[%dAID: status ProgressMessage%c[%dB", 27, 1, 27, 1),
},
// With progressDetail
"{ \"id\": \"ID\", \"status\": \"status\", \"progressDetail\": { \"Current\": 1} }": {
`{ "id": "ID", "status": "status", "progressDetail": { "Current": 1} }`: {
"", // progressbar is disabled in non-terminal
fmt.Sprintf("\n%c[%dA%c[2K\rID: status 1B\r%c[%dB", 27, 1, 27, 27, 1),
},