diff --git a/components/engine/api/common.go b/components/engine/api/common.go
index beb251a989..4a0a5d5832 100644
--- a/components/engine/api/common.go
+++ b/components/engine/api/common.go
@@ -3,9 +3,9 @@ package api // import "github.com/docker/docker/api"
// Common constants for daemon and client.
const (
// DefaultVersion of Current REST API
- DefaultVersion string = "1.37"
+ DefaultVersion = "1.37"
// NoBaseImageSpecifier is the symbol used by the FROM
// command to specify that no base image is to be used.
- NoBaseImageSpecifier string = "scratch"
+ NoBaseImageSpecifier = "scratch"
)
diff --git a/components/engine/api/common_unix.go b/components/engine/api/common_unix.go
index af1a541646..504b0c90d7 100644
--- a/components/engine/api/common_unix.go
+++ b/components/engine/api/common_unix.go
@@ -3,4 +3,4 @@
package api // import "github.com/docker/docker/api"
// MinVersion represents Minimum REST API version supported
-const MinVersion string = "1.12"
+const MinVersion = "1.12"
diff --git a/components/engine/api/server/router/build/build_routes.go b/components/engine/api/server/router/build/build_routes.go
index 1261cf4777..3e3668c42b 100644
--- a/components/engine/api/server/router/build/build_routes.go
+++ b/components/engine/api/server/router/build/build_routes.go
@@ -23,7 +23,7 @@ import (
"github.com/docker/docker/pkg/progress"
"github.com/docker/docker/pkg/streamformatter"
"github.com/docker/docker/pkg/system"
- units "github.com/docker/go-units"
+ "github.com/docker/go-units"
"github.com/pkg/errors"
"github.com/sirupsen/logrus"
)
diff --git a/components/engine/api/server/server_test.go b/components/engine/api/server/server_test.go
index 3fbe1c9d13..e0fac30ab7 100644
--- a/components/engine/api/server/server_test.go
+++ b/components/engine/api/server/server_test.go
@@ -1,13 +1,12 @@
package server // import "github.com/docker/docker/api/server"
import (
+ "context"
"net/http"
"net/http/httptest"
"strings"
"testing"
- "context"
-
"github.com/docker/docker/api"
"github.com/docker/docker/api/server/httputils"
"github.com/docker/docker/api/server/middleware"
diff --git a/components/engine/api/swagger.yaml b/components/engine/api/swagger.yaml
index 2550a50b56..dcbed2a2c5 100644
--- a/components/engine/api/swagger.yaml
+++ b/components/engine/api/swagger.yaml
@@ -2449,7 +2449,15 @@ definitions:
properties:
PluginSpec:
type: "object"
- description: "Invalid when specified with `ContainerSpec`. *(Experimental release only.)*"
+ description: |
+ Plugin spec for the service. *(Experimental release only.)*
+
+
+
+ > **Note**: ContainerSpec, NetworkAttachmentSpec, and PluginSpec are
+ > mutually exclusive. PluginSpec is only used when the Runtime field
+ > is set to `plugin`. NetworkAttachmentSpec is used when the Runtime
+ > field is set to `attachment`.
properties:
Name:
description: "The name or 'alias' to use for the plugin."
@@ -2476,7 +2484,15 @@ definitions:
type: "string"
ContainerSpec:
type: "object"
- description: "Invalid when specified with `PluginSpec`."
+ description: |
+ Container spec for the service.
+
+
+
+ > **Note**: ContainerSpec, NetworkAttachmentSpec, and PluginSpec are
+ > mutually exclusive. PluginSpec is only used when the Runtime field
+ > is set to `plugin`. NetworkAttachmentSpec is used when the Runtime
+ > field is set to `attachment`.
properties:
Image:
description: "The image name to use for the container"
@@ -2688,6 +2704,22 @@ definitions:
- "default"
- "process"
- "hyperv"
+ NetworkAttachmentSpec:
+ description: |
+ Read-only spec type for non-swarm containers attached to swarm overlay
+ networks.
+
+
+
+ > **Note**: ContainerSpec, NetworkAttachmentSpec, and PluginSpec are
+ > mutually exclusive. PluginSpec is only used when the Runtime field
+ > is set to `plugin`. NetworkAttachmentSpec is used when the Runtime
+ > field is set to `attachment`.
+ type: "object"
+ properties:
+ ContainerID:
+ description: "ID of the container represented by this task"
+ type: "string"
Resources:
description: "Resource requirements which apply to each individual container created as part of the service."
type: "object"
diff --git a/components/engine/api/types/client.go b/components/engine/api/types/client.go
index 18b36d592b..3d2e057c9a 100644
--- a/components/engine/api/types/client.go
+++ b/components/engine/api/types/client.go
@@ -7,7 +7,7 @@ import (
"github.com/docker/docker/api/types/container"
"github.com/docker/docker/api/types/filters"
- units "github.com/docker/go-units"
+ "github.com/docker/go-units"
)
// CheckpointCreateOptions holds parameters to create a checkpoint from a container
diff --git a/components/engine/api/types/swarm/runtime.go b/components/engine/api/types/swarm/runtime.go
index 81b5f4cfd9..0c77403ccf 100644
--- a/components/engine/api/types/swarm/runtime.go
+++ b/components/engine/api/types/swarm/runtime.go
@@ -11,9 +11,17 @@ const (
RuntimeContainer RuntimeType = "container"
// RuntimePlugin is the plugin based runtime
RuntimePlugin RuntimeType = "plugin"
+ // RuntimeNetworkAttachment is the network attachment runtime
+ RuntimeNetworkAttachment RuntimeType = "attachment"
// RuntimeURLContainer is the proto url for the container type
RuntimeURLContainer RuntimeURL = "types.docker.com/RuntimeContainer"
// RuntimeURLPlugin is the proto url for the plugin type
RuntimeURLPlugin RuntimeURL = "types.docker.com/RuntimePlugin"
)
+
+// NetworkAttachmentSpec represents the runtime spec type for network
+// attachment tasks
+type NetworkAttachmentSpec struct {
+ ContainerID string
+}
diff --git a/components/engine/api/types/swarm/task.go b/components/engine/api/types/swarm/task.go
index 5c2bc492e4..b35605d12f 100644
--- a/components/engine/api/types/swarm/task.go
+++ b/components/engine/api/types/swarm/task.go
@@ -60,10 +60,13 @@ type Task struct {
// TaskSpec represents the spec of a task.
type TaskSpec struct {
- // ContainerSpec and PluginSpec are mutually exclusive.
- // PluginSpec will only be used when the `Runtime` field is set to `plugin`
- ContainerSpec *ContainerSpec `json:",omitempty"`
- PluginSpec *runtime.PluginSpec `json:",omitempty"`
+ // ContainerSpec, NetworkAttachmentSpec, and PluginSpec are mutually exclusive.
+ // PluginSpec is only used when the `Runtime` field is set to `plugin`
+ // NetworkAttachmentSpec is used if the `Runtime` field is set to
+ // `attachment`.
+ ContainerSpec *ContainerSpec `json:",omitempty"`
+ PluginSpec *runtime.PluginSpec `json:",omitempty"`
+ NetworkAttachmentSpec *NetworkAttachmentSpec `json:",omitempty"`
Resources *ResourceRequirements `json:",omitempty"`
RestartPolicy *RestartPolicy `json:",omitempty"`
diff --git a/components/engine/builder/builder.go b/components/engine/builder/builder.go
index 3c5edb0679..3eb0341417 100644
--- a/components/engine/builder/builder.go
+++ b/components/engine/builder/builder.go
@@ -19,7 +19,7 @@ import (
const (
// DefaultDockerfileName is the Default filename with Docker commands, read by docker build
- DefaultDockerfileName string = "Dockerfile"
+ DefaultDockerfileName = "Dockerfile"
)
// Source defines a location that can be used as a source for the ADD/COPY
diff --git a/components/engine/builder/dockerfile/buildargs.go b/components/engine/builder/dockerfile/buildargs.go
index 232f9d23f6..f9cceaa05c 100644
--- a/components/engine/builder/dockerfile/buildargs.go
+++ b/components/engine/builder/dockerfile/buildargs.go
@@ -69,7 +69,7 @@ func (b *BuildArgs) MergeReferencedArgs(other *BuildArgs) {
// WarnOnUnusedBuildArgs checks if there are any leftover build-args that were
// passed but not consumed during build. Print a warning, if there are any.
func (b *BuildArgs) WarnOnUnusedBuildArgs(out io.Writer) {
- leftoverArgs := []string{}
+ var leftoverArgs []string
for arg := range b.argsFromOptions {
_, isReferenced := b.referencedArgs[arg]
_, isBuiltin := builtinAllowedBuildArgs[arg]
diff --git a/components/engine/builder/dockerfile/builder.go b/components/engine/builder/dockerfile/builder.go
index 1455fd966e..890e7b89fd 100644
--- a/components/engine/builder/dockerfile/builder.go
+++ b/components/engine/builder/dockerfile/builder.go
@@ -387,7 +387,7 @@ func BuildFromConfig(config *container.Config, changes []string, os string) (*co
b.Stderr = ioutil.Discard
b.disableCommit = true
- commands := []instructions.Command{}
+ var commands []instructions.Command
for _, n := range dockerfile.AST.Children {
cmd, err := instructions.ParseCommand(n)
if err != nil {
diff --git a/components/engine/builder/dockerfile/instructions/commands.go b/components/engine/builder/dockerfile/instructions/commands.go
index 633a2b3fc7..96d33016b5 100644
--- a/components/engine/builder/dockerfile/instructions/commands.go
+++ b/components/engine/builder/dockerfile/instructions/commands.go
@@ -2,7 +2,6 @@ package instructions // import "github.com/docker/docker/builder/dockerfile/inst
import (
"errors"
-
"strings"
"github.com/docker/docker/api/types/container"
diff --git a/components/engine/builder/dockerfile/instructions/support_test.go b/components/engine/builder/dockerfile/instructions/support_test.go
index 5c79e383db..0332c524e8 100644
--- a/components/engine/builder/dockerfile/instructions/support_test.go
+++ b/components/engine/builder/dockerfile/instructions/support_test.go
@@ -10,7 +10,7 @@ type testCase struct {
}
func initTestCases() []testCase {
- testCases := []testCase{}
+ var testCases []testCase
testCases = append(testCases, testCase{
name: "empty args",
diff --git a/components/engine/builder/dockerfile/parser/parser.go b/components/engine/builder/dockerfile/parser/parser.go
index b065b8a4ea..f938b808b6 100644
--- a/components/engine/builder/dockerfile/parser/parser.go
+++ b/components/engine/builder/dockerfile/parser/parser.go
@@ -262,8 +262,7 @@ func Parse(rwc io.Reader) (*Result, error) {
}
if hasEmptyContinuationLine {
- warning := "[WARNING]: Empty continuation line found in:\n " + line
- warnings = append(warnings, warning)
+ warnings = append(warnings, "[WARNING]: Empty continuation line found in:\n "+line)
}
child, err := newNodeFromLine(line, d)
diff --git a/components/engine/builder/dockerfile/shell/lex_test.go b/components/engine/builder/dockerfile/shell/lex_test.go
index 7a726ad79b..f38da2026f 100644
--- a/components/engine/builder/dockerfile/shell/lex_test.go
+++ b/components/engine/builder/dockerfile/shell/lex_test.go
@@ -71,8 +71,8 @@ func TestShellParser4Words(t *testing.T) {
}
defer file.Close()
+ var envs []string
shlex := NewLex('\\')
- envs := []string{}
scanner := bufio.NewScanner(file)
lineNum := 0
for scanner.Scan() {
diff --git a/components/engine/builder/remotecontext/tarsum.go b/components/engine/builder/remotecontext/tarsum.go
index 9e8c7d6072..b809cfb78b 100644
--- a/components/engine/builder/remotecontext/tarsum.go
+++ b/components/engine/builder/remotecontext/tarsum.go
@@ -6,7 +6,7 @@ import (
"github.com/docker/docker/pkg/containerfs"
iradix "github.com/hashicorp/go-immutable-radix"
- digest "github.com/opencontainers/go-digest"
+ "github.com/opencontainers/go-digest"
"github.com/pkg/errors"
"github.com/tonistiigi/fsutil"
)
diff --git a/components/engine/cli/cobra.go b/components/engine/cli/cobra.go
index 7c4196e141..8ed1fddc06 100644
--- a/components/engine/cli/cobra.go
+++ b/components/engine/cli/cobra.go
@@ -51,7 +51,7 @@ func hasManagementSubCommands(cmd *cobra.Command) bool {
}
func operationSubCommands(cmd *cobra.Command) []*cobra.Command {
- cmds := []*cobra.Command{}
+ var cmds []*cobra.Command
for _, sub := range cmd.Commands() {
if sub.IsAvailableCommand() && !sub.HasSubCommands() {
cmds = append(cmds, sub)
@@ -69,7 +69,7 @@ func wrappedFlagUsages(cmd *cobra.Command) string {
}
func managementSubCommands(cmd *cobra.Command) []*cobra.Command {
- cmds := []*cobra.Command{}
+ var cmds []*cobra.Command
for _, sub := range cmd.Commands() {
if sub.IsAvailableCommand() && sub.HasSubCommands() {
cmds = append(cmds, sub)
diff --git a/components/engine/client/container_wait_test.go b/components/engine/client/container_wait_test.go
index e18e1376f1..11a9203ddc 100644
--- a/components/engine/client/container_wait_test.go
+++ b/components/engine/client/container_wait_test.go
@@ -2,6 +2,7 @@ package client // import "github.com/docker/docker/client"
import (
"bytes"
+ "context"
"encoding/json"
"fmt"
"io/ioutil"
@@ -11,8 +12,6 @@ import (
"testing"
"time"
- "context"
-
"github.com/docker/docker/api/types/container"
)
diff --git a/components/engine/client/errors.go b/components/engine/client/errors.go
index 05c1246276..0461af329d 100644
--- a/components/engine/client/errors.go
+++ b/components/engine/client/errors.go
@@ -2,7 +2,6 @@ package client // import "github.com/docker/docker/client"
import (
"fmt"
-
"net/http"
"github.com/docker/docker/api/types/versions"
diff --git a/components/engine/client/image_save_test.go b/components/engine/client/image_save_test.go
index f79efc654d..a40055e583 100644
--- a/components/engine/client/image_save_test.go
+++ b/components/engine/client/image_save_test.go
@@ -7,9 +7,8 @@ import (
"io/ioutil"
"net/http"
"reflect"
- "testing"
-
"strings"
+ "testing"
)
func TestImageSaveError(t *testing.T) {
diff --git a/components/engine/client/node_remove.go b/components/engine/client/node_remove.go
index c07fc0eb39..e7a7505715 100644
--- a/components/engine/client/node_remove.go
+++ b/components/engine/client/node_remove.go
@@ -1,9 +1,8 @@
package client // import "github.com/docker/docker/client"
import (
- "net/url"
-
"context"
+ "net/url"
"github.com/docker/docker/api/types"
)
diff --git a/components/engine/client/node_remove_test.go b/components/engine/client/node_remove_test.go
index d30e718db1..85f828b849 100644
--- a/components/engine/client/node_remove_test.go
+++ b/components/engine/client/node_remove_test.go
@@ -2,14 +2,13 @@ package client // import "github.com/docker/docker/client"
import (
"bytes"
+ "context"
"fmt"
"io/ioutil"
"net/http"
"strings"
"testing"
- "context"
-
"github.com/docker/docker/api/types"
)
diff --git a/components/engine/client/plugin_remove_test.go b/components/engine/client/plugin_remove_test.go
index a037ae2a13..e6c76342ee 100644
--- a/components/engine/client/plugin_remove_test.go
+++ b/components/engine/client/plugin_remove_test.go
@@ -2,14 +2,13 @@ package client // import "github.com/docker/docker/client"
import (
"bytes"
+ "context"
"fmt"
"io/ioutil"
"net/http"
"strings"
"testing"
- "context"
-
"github.com/docker/docker/api/types"
)
diff --git a/components/engine/client/request_test.go b/components/engine/client/request_test.go
index 704a122c08..e45a8651a0 100644
--- a/components/engine/client/request_test.go
+++ b/components/engine/client/request_test.go
@@ -61,7 +61,7 @@ func TestSetHostHeader(t *testing.T) {
}
return &http.Response{
StatusCode: http.StatusOK,
- Body: ioutil.NopCloser(bytes.NewReader(([]byte("")))),
+ Body: ioutil.NopCloser(bytes.NewReader([]byte(""))),
}, nil
}),
diff --git a/components/engine/client/service_create.go b/components/engine/client/service_create.go
index 8d08271689..8fadda4a90 100644
--- a/components/engine/client/service_create.go
+++ b/components/engine/client/service_create.go
@@ -9,7 +9,7 @@ import (
"github.com/docker/distribution/reference"
"github.com/docker/docker/api/types"
"github.com/docker/docker/api/types/swarm"
- digest "github.com/opencontainers/go-digest"
+ "github.com/opencontainers/go-digest"
"github.com/pkg/errors"
)
diff --git a/components/engine/cmd/dockerd/config_unix.go b/components/engine/cmd/dockerd/config_unix.go
index 37acd38be4..2dbd84b1db 100644
--- a/components/engine/cmd/dockerd/config_unix.go
+++ b/components/engine/cmd/dockerd/config_unix.go
@@ -5,7 +5,7 @@ package main
import (
"github.com/docker/docker/daemon/config"
"github.com/docker/docker/opts"
- units "github.com/docker/go-units"
+ "github.com/docker/go-units"
"github.com/spf13/pflag"
)
diff --git a/components/engine/cmd/dockerd/daemon_linux.go b/components/engine/cmd/dockerd/daemon_linux.go
index b09fed9293..cf2d65275f 100644
--- a/components/engine/cmd/dockerd/daemon_linux.go
+++ b/components/engine/cmd/dockerd/daemon_linux.go
@@ -9,5 +9,5 @@ func preNotifySystem() {
// notifySystem sends a message to the host when the server is ready to be used
func notifySystem() {
// Tell the init daemon we are accepting requests
- go systemdDaemon.SdNotify(false, "READY=1")
+ go systemdDaemon.SdNotify(false, systemdDaemon.SdNotifyReady)
}
diff --git a/components/engine/cmd/dockerd/metrics.go b/components/engine/cmd/dockerd/metrics.go
index 99d41cb3aa..20ceaf8466 100644
--- a/components/engine/cmd/dockerd/metrics.go
+++ b/components/engine/cmd/dockerd/metrics.go
@@ -4,7 +4,7 @@ import (
"net"
"net/http"
- metrics "github.com/docker/go-metrics"
+ "github.com/docker/go-metrics"
"github.com/sirupsen/logrus"
)
diff --git a/components/engine/container/view.go b/components/engine/container/view.go
index baf6fe7195..b631499412 100644
--- a/components/engine/container/view.go
+++ b/components/engine/container/view.go
@@ -340,7 +340,7 @@ func (v *memdbView) transform(container *Container) *Snapshot {
}
if len(container.Args) > 0 {
- args := []string{}
+ var args []string
for _, arg := range container.Args {
if strings.Contains(arg, " ") {
args = append(args, fmt.Sprintf("'%s'", arg))
diff --git a/components/engine/daemon/cluster/convert/container.go b/components/engine/daemon/cluster/convert/container.go
index baf02a996c..0a34fc73e4 100644
--- a/components/engine/daemon/cluster/convert/container.go
+++ b/components/engine/daemon/cluster/convert/container.go
@@ -5,7 +5,7 @@ import (
"fmt"
"strings"
- container "github.com/docker/docker/api/types/container"
+ "github.com/docker/docker/api/types/container"
mounttypes "github.com/docker/docker/api/types/mount"
types "github.com/docker/docker/api/types/swarm"
swarmapi "github.com/docker/swarmkit/api"
diff --git a/components/engine/daemon/cluster/convert/service.go b/components/engine/daemon/cluster/convert/service.go
index 7aa34fa77f..5a1609aa01 100644
--- a/components/engine/daemon/cluster/convert/service.go
+++ b/components/engine/daemon/cluster/convert/service.go
@@ -17,6 +17,8 @@ import (
var (
// ErrUnsupportedRuntime returns an error if the runtime is not supported by the daemon
ErrUnsupportedRuntime = errors.New("unsupported runtime")
+ // ErrMismatchedRuntime returns an error if the runtime does not match the provided spec
+ ErrMismatchedRuntime = errors.New("mismatched Runtime and *Spec fields")
)
// ServiceFromGRPC converts a grpc Service to a Service.
@@ -176,15 +178,18 @@ func ServiceSpecToGRPC(s types.ServiceSpec) (swarmapi.ServiceSpec, error) {
return swarmapi.ServiceSpec{}, err
}
spec.Task.Runtime = &swarmapi.TaskSpec_Container{Container: containerSpec}
+ } else {
+ // If the ContainerSpec is nil, we can't set the task runtime
+ return swarmapi.ServiceSpec{}, ErrMismatchedRuntime
}
case types.RuntimePlugin:
- if s.Mode.Replicated != nil {
- return swarmapi.ServiceSpec{}, errors.New("plugins must not use replicated mode")
- }
-
- s.Mode.Global = &types.GlobalService{} // must always be global
-
if s.TaskTemplate.PluginSpec != nil {
+ if s.Mode.Replicated != nil {
+ return swarmapi.ServiceSpec{}, errors.New("plugins must not use replicated mode")
+ }
+
+ s.Mode.Global = &types.GlobalService{} // must always be global
+
pluginSpec, err := proto.Marshal(s.TaskTemplate.PluginSpec)
if err != nil {
return swarmapi.ServiceSpec{}, err
@@ -198,7 +203,16 @@ func ServiceSpecToGRPC(s types.ServiceSpec) (swarmapi.ServiceSpec, error) {
},
},
}
+ } else {
+ return swarmapi.ServiceSpec{}, ErrMismatchedRuntime
}
+ case types.RuntimeNetworkAttachment:
+ // NOTE(dperny) I'm leaving this case here for completeness. The actual
+ // code is left out out deliberately, as we should refuse to parse a
+ // Network Attachment runtime; it will cause weird behavior all over
+ // the system if we do. Instead, fallthrough and return
+ // ErrUnsupportedRuntime if we get one.
+ fallthrough
default:
return swarmapi.ServiceSpec{}, ErrUnsupportedRuntime
}
@@ -573,6 +587,12 @@ func updateConfigToGRPC(updateConfig *types.UpdateConfig) (*swarmapi.UpdateConfi
return converted, nil
}
+func networkAttachmentSpecFromGRPC(attachment swarmapi.NetworkAttachmentSpec) *types.NetworkAttachmentSpec {
+ return &types.NetworkAttachmentSpec{
+ ContainerID: attachment.ContainerID,
+ }
+}
+
func taskSpecFromGRPC(taskSpec swarmapi.TaskSpec) (types.TaskSpec, error) {
taskNetworks := make([]types.NetworkAttachmentConfig, 0, len(taskSpec.Networks))
for _, n := range taskSpec.Networks {
@@ -607,6 +627,12 @@ func taskSpecFromGRPC(taskSpec swarmapi.TaskSpec) (types.TaskSpec, error) {
t.PluginSpec = &p
}
}
+ case *swarmapi.TaskSpec_Attachment:
+ a := taskSpec.GetAttachment()
+ if a != nil {
+ t.NetworkAttachmentSpec = networkAttachmentSpecFromGRPC(*a)
+ }
+ t.Runtime = types.RuntimeNetworkAttachment
}
return t, nil
diff --git a/components/engine/daemon/cluster/convert/service_test.go b/components/engine/daemon/cluster/convert/service_test.go
index 0794af99a6..826cf6fbef 100644
--- a/components/engine/daemon/cluster/convert/service_test.go
+++ b/components/engine/daemon/cluster/convert/service_test.go
@@ -232,3 +232,77 @@ func TestServiceConvertFromGRPCIsolation(t *testing.T) {
})
}
}
+
+func TestServiceConvertToGRPCNetworkAtachmentRuntime(t *testing.T) {
+ someid := "asfjkl"
+ s := swarmtypes.ServiceSpec{
+ TaskTemplate: swarmtypes.TaskSpec{
+ Runtime: swarmtypes.RuntimeNetworkAttachment,
+ NetworkAttachmentSpec: &swarmtypes.NetworkAttachmentSpec{
+ ContainerID: someid,
+ },
+ },
+ }
+
+ // discard the service, which will be empty
+ _, err := ServiceSpecToGRPC(s)
+ if err == nil {
+ t.Fatalf("expected error %v but got no error", ErrUnsupportedRuntime)
+ }
+ if err != ErrUnsupportedRuntime {
+ t.Fatalf("expected error %v but got error %v", ErrUnsupportedRuntime, err)
+ }
+}
+
+func TestServiceConvertToGRPCMismatchedRuntime(t *testing.T) {
+ // NOTE(dperny): an earlier version of this test was for code that also
+ // converted network attachment tasks to GRPC. that conversion code was
+ // removed, so if this loop body seems a bit complicated, that's why.
+ for i, rt := range []swarmtypes.RuntimeType{
+ swarmtypes.RuntimeContainer,
+ swarmtypes.RuntimePlugin,
+ } {
+ for j, spec := range []swarmtypes.TaskSpec{
+ {ContainerSpec: &swarmtypes.ContainerSpec{}},
+ {PluginSpec: &runtime.PluginSpec{}},
+ } {
+ // skip the cases, where the indices match, which would not error
+ if i == j {
+ continue
+ }
+ // set the task spec, then change the runtime
+ s := swarmtypes.ServiceSpec{
+ TaskTemplate: spec,
+ }
+ s.TaskTemplate.Runtime = rt
+
+ if _, err := ServiceSpecToGRPC(s); err != ErrMismatchedRuntime {
+ t.Fatalf("expected %v got %v", ErrMismatchedRuntime, err)
+ }
+ }
+ }
+}
+
+func TestTaskConvertFromGRPCNetworkAttachment(t *testing.T) {
+ containerID := "asdfjkl"
+ s := swarmapi.TaskSpec{
+ Runtime: &swarmapi.TaskSpec_Attachment{
+ Attachment: &swarmapi.NetworkAttachmentSpec{
+ ContainerID: containerID,
+ },
+ },
+ }
+ ts, err := taskSpecFromGRPC(s)
+ if err != nil {
+ t.Fatal(err)
+ }
+ if ts.NetworkAttachmentSpec == nil {
+ t.Fatal("expected task spec to have network attachment spec")
+ }
+ if ts.NetworkAttachmentSpec.ContainerID != containerID {
+ t.Fatalf("expected network attachment spec container id to be %q, was %q", containerID, ts.NetworkAttachmentSpec.ContainerID)
+ }
+ if ts.Runtime != swarmtypes.RuntimeNetworkAttachment {
+ t.Fatalf("expected Runtime to be %v", swarmtypes.RuntimeNetworkAttachment)
+ }
+}
diff --git a/components/engine/daemon/cluster/convert/task.go b/components/engine/daemon/cluster/convert/task.go
index dbe6d7414d..72e2805e1e 100644
--- a/components/engine/daemon/cluster/convert/task.go
+++ b/components/engine/daemon/cluster/convert/task.go
@@ -10,9 +10,6 @@ import (
// TaskFromGRPC converts a grpc Task to a Task.
func TaskFromGRPC(t swarmapi.Task) (types.Task, error) {
- if t.Spec.GetAttachment() != nil {
- return types.Task{}, nil
- }
containerStatus := t.Status.GetContainer()
taskSpec, err := taskSpecFromGRPC(t.Spec)
if err != nil {
diff --git a/components/engine/daemon/cluster/executor/container/container_test.go b/components/engine/daemon/cluster/executor/container/container_test.go
index 1e94171974..f9e8c8a92e 100644
--- a/components/engine/daemon/cluster/executor/container/container_test.go
+++ b/components/engine/daemon/cluster/executor/container/container_test.go
@@ -3,7 +3,7 @@ package container // import "github.com/docker/docker/daemon/cluster/executor/co
import (
"testing"
- container "github.com/docker/docker/api/types/container"
+ "github.com/docker/docker/api/types/container"
swarmapi "github.com/docker/swarmkit/api"
"github.com/gotestyourself/gotestyourself/assert"
)
diff --git a/components/engine/daemon/cluster/services.go b/components/engine/daemon/cluster/services.go
index ed438e93a0..c14037645c 100644
--- a/components/engine/daemon/cluster/services.go
+++ b/components/engine/daemon/cluster/services.go
@@ -135,6 +135,8 @@ func (c *Cluster) CreateService(s types.ServiceSpec, encodedAuth string, queryRe
resp = &apitypes.ServiceCreateResponse{}
switch serviceSpec.Task.Runtime.(type) {
+ case *swarmapi.TaskSpec_Attachment:
+ return fmt.Errorf("invalid task spec: spec type %q not supported", types.RuntimeNetworkAttachment)
// handle other runtimes here
case *swarmapi.TaskSpec_Generic:
switch serviceSpec.Task.GetGeneric().Kind {
@@ -244,6 +246,8 @@ func (c *Cluster) UpdateService(serviceIDOrName string, version uint64, spec typ
resp = &apitypes.ServiceUpdateResponse{}
switch serviceSpec.Task.Runtime.(type) {
+ case *swarmapi.TaskSpec_Attachment:
+ return fmt.Errorf("invalid task spec: spec type %q not supported", types.RuntimeNetworkAttachment)
case *swarmapi.TaskSpec_Generic:
switch serviceSpec.Task.GetGeneric().Kind {
case string(types.RuntimePlugin):
diff --git a/components/engine/daemon/config/config_unix.go b/components/engine/daemon/config/config_unix.go
index ee091b8bfe..1970928f9b 100644
--- a/components/engine/daemon/config/config_unix.go
+++ b/components/engine/daemon/config/config_unix.go
@@ -7,7 +7,7 @@ import (
containertypes "github.com/docker/docker/api/types/container"
"github.com/docker/docker/opts"
- units "github.com/docker/go-units"
+ "github.com/docker/go-units"
)
const (
diff --git a/components/engine/daemon/config/config_unix_test.go b/components/engine/daemon/config/config_unix_test.go
index 53eb428264..d9bb9476ac 100644
--- a/components/engine/daemon/config/config_unix_test.go
+++ b/components/engine/daemon/config/config_unix_test.go
@@ -6,7 +6,7 @@ import (
"testing"
"github.com/docker/docker/opts"
- units "github.com/docker/go-units"
+ "github.com/docker/go-units"
"github.com/gotestyourself/gotestyourself/assert"
is "github.com/gotestyourself/gotestyourself/assert/cmp"
"github.com/gotestyourself/gotestyourself/fs"
diff --git a/components/engine/daemon/daemon_unix.go b/components/engine/daemon/daemon_unix.go
index f6f0f166bd..e2c77610d4 100644
--- a/components/engine/daemon/daemon_unix.go
+++ b/components/engine/daemon/daemon_unix.go
@@ -43,7 +43,7 @@ import (
lntypes "github.com/docker/libnetwork/types"
"github.com/opencontainers/runc/libcontainer/cgroups"
rsystem "github.com/opencontainers/runc/libcontainer/system"
- specs "github.com/opencontainers/runtime-spec/specs-go"
+ "github.com/opencontainers/runtime-spec/specs-go"
"github.com/opencontainers/selinux/go-selinux/label"
"github.com/pkg/errors"
"github.com/sirupsen/logrus"
@@ -67,8 +67,8 @@ const (
// It's not kernel limit, we want this 4M limit to supply a reasonable functional container
linuxMinMemory = 4194304
// constants for remapped root settings
- defaultIDSpecifier string = "default"
- defaultRemappedID string = "dockremap"
+ defaultIDSpecifier = "default"
+ defaultRemappedID = "dockremap"
// constant for cgroup drivers
cgroupFsDriver = "cgroupfs"
diff --git a/components/engine/daemon/exec.go b/components/engine/daemon/exec.go
index a279f246e6..289c6bfb30 100644
--- a/components/engine/daemon/exec.go
+++ b/components/engine/daemon/exec.go
@@ -16,7 +16,7 @@ import (
"github.com/docker/docker/pkg/pools"
"github.com/docker/docker/pkg/signal"
"github.com/docker/docker/pkg/term"
- specs "github.com/opencontainers/runtime-spec/specs-go"
+ "github.com/opencontainers/runtime-spec/specs-go"
"github.com/pkg/errors"
"github.com/sirupsen/logrus"
)
diff --git a/components/engine/daemon/graphdriver/aufs/dirs.go b/components/engine/daemon/graphdriver/aufs/dirs.go
index 1ee47e40f6..e60be5e3c9 100644
--- a/components/engine/daemon/graphdriver/aufs/dirs.go
+++ b/components/engine/daemon/graphdriver/aufs/dirs.go
@@ -15,7 +15,7 @@ func loadIds(root string) ([]string, error) {
if err != nil {
return nil, err
}
- out := []string{}
+ var out []string
for _, d := range dirs {
if !d.IsDir() {
out = append(out, d.Name())
@@ -36,7 +36,7 @@ func getParentIDs(root, id string) ([]string, error) {
}
defer f.Close()
- out := []string{}
+ var out []string
s := bufio.NewScanner(f)
for s.Scan() {
diff --git a/components/engine/daemon/graphdriver/devmapper/deviceset.go b/components/engine/daemon/graphdriver/devmapper/deviceset.go
index dafe7661a2..2bfbf05a27 100644
--- a/components/engine/daemon/graphdriver/devmapper/deviceset.go
+++ b/components/engine/daemon/graphdriver/devmapper/deviceset.go
@@ -27,7 +27,7 @@ import (
"github.com/docker/docker/pkg/mount"
"github.com/docker/docker/pkg/parsers"
"github.com/docker/docker/pkg/parsers/kernel"
- units "github.com/docker/go-units"
+ "github.com/docker/go-units"
"github.com/opencontainers/selinux/go-selinux/label"
"github.com/pkg/errors"
"github.com/sirupsen/logrus"
@@ -50,8 +50,8 @@ var (
lvmSetupConfigForce bool
)
-const deviceSetMetaFile string = "deviceset-metadata"
-const transactionMetaFile string = "transaction-metadata"
+const deviceSetMetaFile = "deviceset-metadata"
+const transactionMetaFile = "transaction-metadata"
type transaction struct {
OpenTransactionID uint64 `json:"open_transaction_id"`
diff --git a/components/engine/daemon/graphdriver/devmapper/driver.go b/components/engine/daemon/graphdriver/devmapper/driver.go
index 1384a3a157..df883de31d 100644
--- a/components/engine/daemon/graphdriver/devmapper/driver.go
+++ b/components/engine/daemon/graphdriver/devmapper/driver.go
@@ -15,7 +15,7 @@ import (
"github.com/docker/docker/pkg/idtools"
"github.com/docker/docker/pkg/locker"
"github.com/docker/docker/pkg/mount"
- units "github.com/docker/go-units"
+ "github.com/docker/go-units"
"github.com/pkg/errors"
"github.com/sirupsen/logrus"
"golang.org/x/sys/unix"
diff --git a/components/engine/daemon/graphdriver/graphtest/graphtest_unix.go b/components/engine/daemon/graphdriver/graphtest/graphtest_unix.go
index 1e068535f3..5ac3979752 100644
--- a/components/engine/daemon/graphdriver/graphtest/graphtest_unix.go
+++ b/components/engine/daemon/graphdriver/graphtest/graphtest_unix.go
@@ -15,7 +15,7 @@ import (
"github.com/docker/docker/daemon/graphdriver"
"github.com/docker/docker/daemon/graphdriver/quota"
"github.com/docker/docker/pkg/stringid"
- units "github.com/docker/go-units"
+ "github.com/docker/go-units"
"github.com/gotestyourself/gotestyourself/assert"
is "github.com/gotestyourself/gotestyourself/assert/cmp"
"golang.org/x/sys/unix"
diff --git a/components/engine/daemon/graphdriver/graphtest/testutil.go b/components/engine/daemon/graphdriver/graphtest/testutil.go
index ea9952858f..258aba7002 100644
--- a/components/engine/daemon/graphdriver/graphtest/testutil.go
+++ b/components/engine/daemon/graphdriver/graphtest/testutil.go
@@ -148,7 +148,7 @@ func changeManyFiles(drv graphdriver.Driver, layer string, count int, seed int64
}
defer drv.Put(layer)
- changes := []archive.Change{}
+ var changes []archive.Change
for i := 0; i < count; i += 100 {
archiveRoot := fmt.Sprintf("/directory-%d", i)
if err := root.MkdirAll(root.Join(root.Path(), archiveRoot), 0755); err != nil {
diff --git a/components/engine/daemon/graphdriver/vfs/driver.go b/components/engine/daemon/graphdriver/vfs/driver.go
index c23c882ab2..e51cb6c250 100644
--- a/components/engine/daemon/graphdriver/vfs/driver.go
+++ b/components/engine/daemon/graphdriver/vfs/driver.go
@@ -10,7 +10,7 @@ import (
"github.com/docker/docker/pkg/containerfs"
"github.com/docker/docker/pkg/idtools"
"github.com/docker/docker/pkg/system"
- units "github.com/docker/go-units"
+ "github.com/docker/go-units"
"github.com/opencontainers/selinux/go-selinux/label"
)
diff --git a/components/engine/daemon/graphdriver/zfs/zfs.go b/components/engine/daemon/graphdriver/zfs/zfs.go
index eeceb4d3b8..1d9153e171 100644
--- a/components/engine/daemon/graphdriver/zfs/zfs.go
+++ b/components/engine/daemon/graphdriver/zfs/zfs.go
@@ -17,7 +17,7 @@ import (
"github.com/docker/docker/pkg/idtools"
"github.com/docker/docker/pkg/mount"
"github.com/docker/docker/pkg/parsers"
- zfs "github.com/mistifyio/go-zfs"
+ "github.com/mistifyio/go-zfs"
"github.com/opencontainers/selinux/go-selinux/label"
"github.com/sirupsen/logrus"
"golang.org/x/sys/unix"
diff --git a/components/engine/daemon/images/image_delete.go b/components/engine/daemon/images/image_delete.go
index 60896e487a..94d6f872dd 100644
--- a/components/engine/daemon/images/image_delete.go
+++ b/components/engine/daemon/images/image_delete.go
@@ -18,7 +18,7 @@ import (
type conflictType int
const (
- conflictDependentChild conflictType = (1 << iota)
+ conflictDependentChild conflictType = 1 << iota
conflictRunningContainer
conflictActiveReference
conflictStoppedContainer
@@ -126,7 +126,7 @@ func (i *ImageService) ImageDelete(imageRef string, force, prune bool) ([]types.
}
if !foundRepoTagRef {
// Remove canonical references from same repository
- remainingRefs := []reference.Named{}
+ var remainingRefs []reference.Named
for _, repoRef := range repoRefs {
if _, repoRefIsCanonical := repoRef.(reference.Canonical); repoRefIsCanonical && parsedRef.Name() == repoRef.Name() {
if _, err := i.removeImageRef(repoRef); err != nil {
diff --git a/components/engine/daemon/images/image_prune.go b/components/engine/daemon/images/image_prune.go
index da7f81322f..dd55347cf0 100644
--- a/components/engine/daemon/images/image_prune.go
+++ b/components/engine/daemon/images/image_prune.go
@@ -13,7 +13,7 @@ import (
"github.com/docker/docker/errdefs"
"github.com/docker/docker/image"
"github.com/docker/docker/layer"
- digest "github.com/opencontainers/go-digest"
+ "github.com/opencontainers/go-digest"
"github.com/sirupsen/logrus"
)
diff --git a/components/engine/daemon/images/locals.go b/components/engine/daemon/images/locals.go
index a57ea2da60..5ffc460a09 100644
--- a/components/engine/daemon/images/locals.go
+++ b/components/engine/daemon/images/locals.go
@@ -3,7 +3,7 @@ package images // import "github.com/docker/docker/daemon/images"
import (
"fmt"
- metrics "github.com/docker/go-metrics"
+ "github.com/docker/go-metrics"
)
type invalidFilter struct {
diff --git a/components/engine/daemon/listeners/listeners_linux.go b/components/engine/daemon/listeners/listeners_linux.go
index b0174bc6ee..c8956db258 100644
--- a/components/engine/daemon/listeners/listeners_linux.go
+++ b/components/engine/daemon/listeners/listeners_linux.go
@@ -62,9 +62,9 @@ func listenFD(addr string, tlsConfig *tls.Config) ([]net.Listener, error) {
)
// socket activation
if tlsConfig != nil {
- listeners, err = activation.TLSListeners(false, tlsConfig)
+ listeners, err = activation.TLSListeners(tlsConfig)
} else {
- listeners, err = activation.Listeners(false)
+ listeners, err = activation.Listeners()
}
if err != nil {
return nil, err
diff --git a/components/engine/daemon/logger/adapter.go b/components/engine/daemon/logger/adapter.go
index 5b9252d324..95aff9bf3b 100644
--- a/components/engine/daemon/logger/adapter.go
+++ b/components/engine/daemon/logger/adapter.go
@@ -37,7 +37,7 @@ func (a *pluginAdapter) Log(msg *Message) error {
a.buf.Line = msg.Line
a.buf.TimeNano = msg.Timestamp.UnixNano()
- a.buf.Partial = (msg.PLogMetaData != nil)
+ a.buf.Partial = msg.PLogMetaData != nil
a.buf.Source = msg.Source
err := a.enc.Encode(&a.buf)
diff --git a/components/engine/daemon/logger/awslogs/cloudwatchlogs_test.go b/components/engine/daemon/logger/awslogs/cloudwatchlogs_test.go
index 2884f01e28..b8e49055e8 100644
--- a/components/engine/daemon/logger/awslogs/cloudwatchlogs_test.go
+++ b/components/engine/daemon/logger/awslogs/cloudwatchlogs_test.go
@@ -1139,8 +1139,8 @@ func TestCollectBatchWithDuplicateTimestamps(t *testing.T) {
close(d)
go stream.collectBatch(d)
+ var expectedEvents []*cloudwatchlogs.InputLogEvent
times := maximumLogEventsPerPut
- expectedEvents := []*cloudwatchlogs.InputLogEvent{}
timestamp := time.Now()
for i := 0; i < times; i++ {
line := fmt.Sprintf("%d", i)
diff --git a/components/engine/daemon/logger/factory.go b/components/engine/daemon/logger/factory.go
index 9723f7fc0c..84b54b2794 100644
--- a/components/engine/daemon/logger/factory.go
+++ b/components/engine/daemon/logger/factory.go
@@ -7,7 +7,7 @@ import (
containertypes "github.com/docker/docker/api/types/container"
"github.com/docker/docker/pkg/plugingetter"
- units "github.com/docker/go-units"
+ "github.com/docker/go-units"
"github.com/pkg/errors"
)
diff --git a/components/engine/daemon/logger/gcplogs/gcplogging.go b/components/engine/daemon/logger/gcplogs/gcplogging.go
index 08b632b627..1699f67a2d 100644
--- a/components/engine/daemon/logger/gcplogs/gcplogging.go
+++ b/components/engine/daemon/logger/gcplogs/gcplogging.go
@@ -1,13 +1,12 @@
package gcplogs // import "github.com/docker/docker/daemon/logger/gcplogs"
import (
+ "context"
"fmt"
"sync"
"sync/atomic"
"time"
- "context"
-
"github.com/docker/docker/daemon/logger"
"cloud.google.com/go/compute/metadata"
diff --git a/components/engine/daemon/logger/jsonfilelog/jsonfilelog.go b/components/engine/daemon/logger/jsonfilelog/jsonfilelog.go
index 7d0533ec84..b806a5ad17 100644
--- a/components/engine/daemon/logger/jsonfilelog/jsonfilelog.go
+++ b/components/engine/daemon/logger/jsonfilelog/jsonfilelog.go
@@ -13,7 +13,7 @@ import (
"github.com/docker/docker/daemon/logger"
"github.com/docker/docker/daemon/logger/jsonfilelog/jsonlog"
"github.com/docker/docker/daemon/logger/loggerutils"
- units "github.com/docker/go-units"
+ "github.com/docker/go-units"
"github.com/pkg/errors"
"github.com/sirupsen/logrus"
)
diff --git a/components/engine/daemon/logger/loggerutils/multireader/multireader_test.go b/components/engine/daemon/logger/loggerutils/multireader/multireader_test.go
index 15461c40de..2fb66ab566 100644
--- a/components/engine/daemon/logger/loggerutils/multireader/multireader_test.go
+++ b/components/engine/daemon/logger/loggerutils/multireader/multireader_test.go
@@ -205,7 +205,7 @@ func TestMultiReadSeekerCurAfterSet(t *testing.T) {
}
func TestMultiReadSeekerSmallReads(t *testing.T) {
- readers := []io.ReadSeeker{}
+ var readers []io.ReadSeeker
for i := 0; i < 10; i++ {
integer := make([]byte, 4)
binary.BigEndian.PutUint32(integer, uint32(i))
diff --git a/components/engine/daemon/metrics.go b/components/engine/daemon/metrics.go
index 02a36603c9..8ee6432eaa 100644
--- a/components/engine/daemon/metrics.go
+++ b/components/engine/daemon/metrics.go
@@ -4,7 +4,7 @@ import (
"sync"
"github.com/docker/docker/pkg/plugingetter"
- metrics "github.com/docker/go-metrics"
+ "github.com/docker/go-metrics"
"github.com/pkg/errors"
"github.com/prometheus/client_golang/prometheus"
"github.com/sirupsen/logrus"
diff --git a/components/engine/daemon/metrics_unix.go b/components/engine/daemon/metrics_unix.go
index fbf561e917..9311915249 100644
--- a/components/engine/daemon/metrics_unix.go
+++ b/components/engine/daemon/metrics_unix.go
@@ -10,8 +10,8 @@ import (
"github.com/docker/docker/pkg/plugingetter"
"github.com/docker/docker/pkg/plugins"
"github.com/docker/docker/plugin"
- metrics "github.com/docker/go-metrics"
- specs "github.com/opencontainers/runtime-spec/specs-go"
+ "github.com/docker/go-metrics"
+ "github.com/opencontainers/runtime-spec/specs-go"
"github.com/pkg/errors"
"github.com/sirupsen/logrus"
"golang.org/x/sys/unix"
diff --git a/components/engine/daemon/oci_linux.go b/components/engine/daemon/oci_linux.go
index 49ba0e13c3..b675eaf406 100644
--- a/components/engine/daemon/oci_linux.go
+++ b/components/engine/daemon/oci_linux.go
@@ -23,7 +23,7 @@ import (
"github.com/opencontainers/runc/libcontainer/cgroups"
"github.com/opencontainers/runc/libcontainer/devices"
"github.com/opencontainers/runc/libcontainer/user"
- specs "github.com/opencontainers/runtime-spec/specs-go"
+ "github.com/opencontainers/runtime-spec/specs-go"
"github.com/pkg/errors"
"github.com/sirupsen/logrus"
"golang.org/x/sys/unix"
diff --git a/components/engine/daemon/reload_test.go b/components/engine/daemon/reload_test.go
index 9174bfba54..f20126452a 100644
--- a/components/engine/daemon/reload_test.go
+++ b/components/engine/daemon/reload_test.go
@@ -89,7 +89,7 @@ func TestDaemonReloadAllowNondistributableArtifacts(t *testing.T) {
t.Fatal(err)
}
- actual := []string{}
+ var actual []string
serviceConfig := daemon.RegistryService.ServiceConfig()
for _, value := range serviceConfig.AllowNondistributableArtifactsCIDRs {
actual = append(actual, value.String())
diff --git a/components/engine/daemon/update_linux.go b/components/engine/daemon/update_linux.go
index 14bd91446a..6a307eabc5 100644
--- a/components/engine/daemon/update_linux.go
+++ b/components/engine/daemon/update_linux.go
@@ -5,7 +5,7 @@ import (
"github.com/docker/docker/api/types/container"
"github.com/docker/docker/libcontainerd"
- specs "github.com/opencontainers/runtime-spec/specs-go"
+ "github.com/opencontainers/runtime-spec/specs-go"
)
func toContainerdResources(resources container.Resources) *libcontainerd.Resources {
diff --git a/components/engine/distribution/errors_test.go b/components/engine/distribution/errors_test.go
index 95c40e8a04..7105bdb4d6 100644
--- a/components/engine/distribution/errors_test.go
+++ b/components/engine/distribution/errors_test.go
@@ -48,7 +48,7 @@ func TestContinueOnError_NonMirrorEndpoint(t *testing.T) {
}
func TestContinueOnError_MirrorEndpoint(t *testing.T) {
- errs := []error{}
+ var errs []error
errs = append(errs, alwaysContinue...)
errs = append(errs, continueFromMirrorEndpoint...)
for _, err := range errs {
diff --git a/components/engine/distribution/pull_v2.go b/components/engine/distribution/pull_v2.go
index 93b9a5a6f0..60a894b1c3 100644
--- a/components/engine/distribution/pull_v2.go
+++ b/components/engine/distribution/pull_v2.go
@@ -30,7 +30,7 @@ import (
"github.com/docker/docker/pkg/system"
refstore "github.com/docker/docker/reference"
"github.com/docker/docker/registry"
- digest "github.com/opencontainers/go-digest"
+ "github.com/opencontainers/go-digest"
specs "github.com/opencontainers/image-spec/specs-go/v1"
"github.com/pkg/errors"
"github.com/sirupsen/logrus"
diff --git a/components/engine/distribution/push_v2.go b/components/engine/distribution/push_v2.go
index 5e360591f4..9dc3e7a2a6 100644
--- a/components/engine/distribution/push_v2.go
+++ b/components/engine/distribution/push_v2.go
@@ -24,7 +24,7 @@ import (
"github.com/docker/docker/pkg/progress"
"github.com/docker/docker/pkg/stringid"
"github.com/docker/docker/registry"
- digest "github.com/opencontainers/go-digest"
+ "github.com/opencontainers/go-digest"
"github.com/sirupsen/logrus"
)
diff --git a/components/engine/dockerversion/version_lib.go b/components/engine/dockerversion/version_lib.go
index 1489be0a25..0897c0728e 100644
--- a/components/engine/dockerversion/version_lib.go
+++ b/components/engine/dockerversion/version_lib.go
@@ -6,12 +6,12 @@ package dockerversion // import "github.com/docker/docker/dockerversion"
// Default build-time variable for library-import.
// This file is overridden on build with build-time informations.
const (
- GitCommit string = "library-import"
- Version string = "library-import"
- BuildTime string = "library-import"
- IAmStatic string = "library-import"
- ContainerdCommitID string = "library-import"
- RuncCommitID string = "library-import"
- InitCommitID string = "library-import"
- PlatformName string = ""
+ GitCommit = "library-import"
+ Version = "library-import"
+ BuildTime = "library-import"
+ IAmStatic = "library-import"
+ ContainerdCommitID = "library-import"
+ RuncCommitID = "library-import"
+ InitCommitID = "library-import"
+ PlatformName = ""
)
diff --git a/components/engine/docs/api/version-history.md b/components/engine/docs/api/version-history.md
index 61245e14a7..8c56a1c19f 100644
--- a/components/engine/docs/api/version-history.md
+++ b/components/engine/docs/api/version-history.md
@@ -13,6 +13,12 @@ keywords: "API, Docker, rcli, REST, documentation"
will be rejected.
-->
+## V1.38 API changes
+
+* `GET /tasks` and `GET /tasks/{id}` now return a `NetworkAttachmentSpec` field,
+ containing the `ContainerID` for non-service containers connected to "attachable"
+ swarm-scoped networks.
+
## v1.37 API changes
[Docker Engine API v1.37](https://docs.docker.com/engine/api/v1.37/) documentation
diff --git a/components/engine/hack/integration-cli-on-swarm/agent/master/set_test.go b/components/engine/hack/integration-cli-on-swarm/agent/master/set_test.go
index dfb7a0b4f8..c172562b1b 100644
--- a/components/engine/hack/integration-cli-on-swarm/agent/master/set_test.go
+++ b/components/engine/hack/integration-cli-on-swarm/agent/master/set_test.go
@@ -8,7 +8,7 @@ import (
)
func generateInput(inputLen int) []string {
- input := []string{}
+ var input []string
for i := 0; i < inputLen; i++ {
input = append(input, fmt.Sprintf("s%d", i))
}
@@ -21,7 +21,7 @@ func testChunkStrings(t *testing.T, inputLen, numChunks int) {
input := generateInput(inputLen)
result := chunkStrings(input, numChunks)
t.Logf("result has %d chunks", len(result))
- inputReconstructedFromResult := []string{}
+ var inputReconstructedFromResult []string
for i, chunk := range result {
t.Logf("chunk %d has %d elements", i, len(chunk))
inputReconstructedFromResult = append(inputReconstructedFromResult, chunk...)
diff --git a/components/engine/image/tarexport/load.go b/components/engine/image/tarexport/load.go
index 4d120068b6..c89dd08f93 100644
--- a/components/engine/image/tarexport/load.go
+++ b/components/engine/image/tarexport/load.go
@@ -23,7 +23,7 @@ import (
"github.com/docker/docker/pkg/stringid"
"github.com/docker/docker/pkg/symlink"
"github.com/docker/docker/pkg/system"
- digest "github.com/opencontainers/go-digest"
+ "github.com/opencontainers/go-digest"
"github.com/sirupsen/logrus"
)
diff --git a/components/engine/integration-cli/docker_api_build_test.go b/components/engine/integration-cli/docker_api_build_test.go
index 594185f14d..581df8d5c7 100644
--- a/components/engine/integration-cli/docker_api_build_test.go
+++ b/components/engine/integration-cli/docker_api_build_test.go
@@ -543,7 +543,7 @@ type buildLine struct {
}
func getImageIDsFromBuild(c *check.C, output []byte) []string {
- ids := []string{}
+ var ids []string
for _, line := range bytes.Split(output, []byte("\n")) {
if len(line) == 0 {
continue
diff --git a/components/engine/integration-cli/docker_api_network_test.go b/components/engine/integration-cli/docker_api_network_test.go
index c159c80a0a..9c22cb7e3a 100644
--- a/components/engine/integration-cli/docker_api_network_test.go
+++ b/components/engine/integration-cli/docker_api_network_test.go
@@ -289,7 +289,7 @@ func isNetworkAvailable(c *check.C, name string) bool {
defer resp.Body.Close()
c.Assert(resp.StatusCode, checker.Equals, http.StatusOK)
- nJSON := []types.NetworkResource{}
+ var nJSON []types.NetworkResource
err = json.NewDecoder(body).Decode(&nJSON)
c.Assert(err, checker.IsNil)
@@ -315,7 +315,7 @@ func getNetworkIDByName(c *check.C, name string) string {
c.Assert(resp.StatusCode, checker.Equals, http.StatusOK)
c.Assert(err, checker.IsNil)
- nJSON := []types.NetworkResource{}
+ var nJSON []types.NetworkResource
err = json.NewDecoder(body).Decode(&nJSON)
c.Assert(err, checker.IsNil)
var res string
diff --git a/components/engine/integration-cli/docker_cli_build_test.go b/components/engine/integration-cli/docker_cli_build_test.go
index e4edc8e642..a87e4aaaf1 100644
--- a/components/engine/integration-cli/docker_cli_build_test.go
+++ b/components/engine/integration-cli/docker_cli_build_test.go
@@ -27,7 +27,7 @@ import (
"github.com/docker/docker/pkg/archive"
"github.com/go-check/check"
"github.com/gotestyourself/gotestyourself/icmd"
- digest "github.com/opencontainers/go-digest"
+ "github.com/opencontainers/go-digest"
)
func (s *DockerSuite) TestBuildJSONEmptyRun(c *check.C) {
@@ -195,7 +195,7 @@ func (s *DockerSuite) TestBuildEnvironmentReplacementEnv(c *check.C) {
RUN [ "$foo5" = 'abc\def' ]
`))
- envResult := []string{}
+ var envResult []string
inspectFieldAndUnmarshall(c, name, "Config.Env", &envResult)
found := false
envCount := 0
@@ -4979,7 +4979,7 @@ func (s *DockerSuite) TestBuildLabelMultiple(c *check.C) {
"foo": "bar",
"123": "456",
}
- labelArgs := []string{}
+ var labelArgs []string
for k, v := range testLabels {
labelArgs = append(labelArgs, "--label", k+"="+v)
}
diff --git a/components/engine/integration-cli/docker_cli_build_unix_test.go b/components/engine/integration-cli/docker_cli_build_unix_test.go
index f2d598ef58..d6c4370064 100644
--- a/components/engine/integration-cli/docker_cli_build_unix_test.go
+++ b/components/engine/integration-cli/docker_cli_build_unix_test.go
@@ -19,7 +19,7 @@ import (
"github.com/docker/docker/integration-cli/cli"
"github.com/docker/docker/integration-cli/cli/build"
"github.com/docker/docker/internal/test/fakecontext"
- units "github.com/docker/go-units"
+ "github.com/docker/go-units"
"github.com/go-check/check"
"github.com/gotestyourself/gotestyourself/icmd"
)
diff --git a/components/engine/integration-cli/docker_cli_create_test.go b/components/engine/integration-cli/docker_cli_create_test.go
index bf7096123b..9ec400b2e1 100644
--- a/components/engine/integration-cli/docker_cli_create_test.go
+++ b/components/engine/integration-cli/docker_cli_create_test.go
@@ -26,13 +26,13 @@ func (s *DockerSuite) TestCreateArgs(c *check.C) {
out, _ = dockerCmd(c, "inspect", cleanedContainerID)
- containers := []struct {
+ var containers []struct {
ID string
Created time.Time
Path string
Args []string
Image string
- }{}
+ }
err := json.Unmarshal([]byte(out), &containers)
c.Assert(err, check.IsNil, check.Commentf("Error inspecting the container: %s", err))
@@ -87,11 +87,11 @@ func (s *DockerSuite) TestCreateHostConfig(c *check.C) {
out, _ = dockerCmd(c, "inspect", cleanedContainerID)
- containers := []struct {
+ var containers []struct {
HostConfig *struct {
PublishAllPorts bool
}
- }{}
+ }
err := json.Unmarshal([]byte(out), &containers)
c.Assert(err, check.IsNil, check.Commentf("Error inspecting the container: %s", err))
@@ -109,11 +109,11 @@ func (s *DockerSuite) TestCreateWithPortRange(c *check.C) {
out, _ = dockerCmd(c, "inspect", cleanedContainerID)
- containers := []struct {
+ var containers []struct {
HostConfig *struct {
PortBindings map[nat.Port][]nat.PortBinding
}
- }{}
+ }
err := json.Unmarshal([]byte(out), &containers)
c.Assert(err, check.IsNil, check.Commentf("Error inspecting the container: %s", err))
c.Assert(containers, checker.HasLen, 1)
@@ -138,11 +138,11 @@ func (s *DockerSuite) TestCreateWithLargePortRange(c *check.C) {
out, _ = dockerCmd(c, "inspect", cleanedContainerID)
- containers := []struct {
+ var containers []struct {
HostConfig *struct {
PortBindings map[nat.Port][]nat.PortBinding
}
- }{}
+ }
err := json.Unmarshal([]byte(out), &containers)
c.Assert(err, check.IsNil, check.Commentf("Error inspecting the container: %s", err))
diff --git a/components/engine/integration-cli/docker_cli_daemon_test.go b/components/engine/integration-cli/docker_cli_daemon_test.go
index 5015736a31..347696e8a4 100644
--- a/components/engine/integration-cli/docker_cli_daemon_test.go
+++ b/components/engine/integration-cli/docker_cli_daemon_test.go
@@ -6,6 +6,8 @@ import (
"bufio"
"bytes"
"context"
+ "crypto/tls"
+ "crypto/x509"
"encoding/json"
"fmt"
"io"
@@ -21,9 +23,6 @@ import (
"sync"
"time"
- "crypto/tls"
- "crypto/x509"
-
"github.com/cloudflare/cfssl/helpers"
"github.com/docker/docker/api"
"github.com/docker/docker/api/types"
@@ -36,7 +35,7 @@ import (
testdaemon "github.com/docker/docker/internal/test/daemon"
"github.com/docker/docker/opts"
"github.com/docker/docker/pkg/mount"
- units "github.com/docker/go-units"
+ "github.com/docker/go-units"
"github.com/docker/libnetwork/iptables"
"github.com/docker/libtrust"
"github.com/go-check/check"
@@ -1828,8 +1827,8 @@ func (s *DockerDaemonSuite) TestDaemonNoSpaceLeftOnDeviceError(c *check.C) {
func (s *DockerDaemonSuite) TestDaemonRestartContainerLinksRestart(c *check.C) {
s.d.StartWithBusybox(c)
- parent1Args := []string{}
- parent2Args := []string{}
+ var parent1Args []string
+ var parent2Args []string
wg := sync.WaitGroup{}
maxChildren := 10
chErr := make(chan error, maxChildren)
diff --git a/components/engine/integration-cli/docker_cli_exec_test.go b/components/engine/integration-cli/docker_cli_exec_test.go
index 9804b3a643..d0557c56a0 100644
--- a/components/engine/integration-cli/docker_cli_exec_test.go
+++ b/components/engine/integration-cli/docker_cli_exec_test.go
@@ -262,7 +262,7 @@ func (s *DockerSuite) TestExecCgroup(c *check.C) {
var wg sync.WaitGroup
var mu sync.Mutex
- execCgroups := []sort.StringSlice{}
+ var execCgroups []sort.StringSlice
errChan := make(chan error)
// exec a few times concurrently to get consistent failure
for i := 0; i < 5; i++ {
diff --git a/components/engine/integration-cli/docker_cli_network_unix_test.go b/components/engine/integration-cli/docker_cli_network_unix_test.go
index f3ecd62187..1087d0045d 100644
--- a/components/engine/integration-cli/docker_cli_network_unix_test.go
+++ b/components/engine/integration-cli/docker_cli_network_unix_test.go
@@ -273,7 +273,7 @@ func assertNwList(c *check.C, out string, expectNws []string) {
func getNwResource(c *check.C, name string) *types.NetworkResource {
out, _ := dockerCmd(c, "network", "inspect", name)
- nr := []types.NetworkResource{}
+ var nr []types.NetworkResource
err := json.Unmarshal([]byte(out), &nr)
c.Assert(err, check.IsNil)
return &nr[0]
@@ -426,7 +426,7 @@ func (s *DockerSuite) TestDockerNetworkDeleteMultiple(c *check.C) {
func (s *DockerSuite) TestDockerNetworkInspect(c *check.C) {
out, _ := dockerCmd(c, "network", "inspect", "host")
- networkResources := []types.NetworkResource{}
+ var networkResources []types.NetworkResource
err := json.Unmarshal([]byte(out), &networkResources)
c.Assert(err, check.IsNil)
c.Assert(networkResources, checker.HasLen, 1)
@@ -450,7 +450,7 @@ func (s *DockerSuite) TestDockerInspectMultipleNetwork(c *check.C) {
result := dockerCmdWithResult("network", "inspect", "host", "none")
result.Assert(c, icmd.Success)
- networkResources := []types.NetworkResource{}
+ var networkResources []types.NetworkResource
err := json.Unmarshal([]byte(result.Stdout()), &networkResources)
c.Assert(err, check.IsNil)
c.Assert(networkResources, checker.HasLen, 2)
@@ -466,7 +466,7 @@ func (s *DockerSuite) TestDockerInspectMultipleNetworksIncludingNonexistent(c *c
Out: "host",
})
- networkResources := []types.NetworkResource{}
+ var networkResources []types.NetworkResource
err := json.Unmarshal([]byte(result.Stdout()), &networkResources)
c.Assert(err, check.IsNil)
c.Assert(networkResources, checker.HasLen, 1)
@@ -512,7 +512,7 @@ func (s *DockerSuite) TestDockerInspectNetworkWithContainerName(c *check.C) {
}()
out, _ = dockerCmd(c, "network", "inspect", "brNetForInspect")
- networkResources := []types.NetworkResource{}
+ var networkResources []types.NetworkResource
err := json.Unmarshal([]byte(out), &networkResources)
c.Assert(err, check.IsNil)
c.Assert(networkResources, checker.HasLen, 1)
@@ -526,7 +526,7 @@ func (s *DockerSuite) TestDockerInspectNetworkWithContainerName(c *check.C) {
// check whether network inspect works properly
out, _ = dockerCmd(c, "network", "inspect", "brNetForInspect")
- newNetRes := []types.NetworkResource{}
+ var newNetRes []types.NetworkResource
err = json.Unmarshal([]byte(out), &newNetRes)
c.Assert(err, check.IsNil)
c.Assert(newNetRes, checker.HasLen, 1)
diff --git a/components/engine/integration-cli/docker_cli_ps_test.go b/components/engine/integration-cli/docker_cli_ps_test.go
index fea51dd0bd..771c9d70d5 100644
--- a/components/engine/integration-cli/docker_cli_ps_test.go
+++ b/components/engine/integration-cli/docker_cli_ps_test.go
@@ -172,7 +172,7 @@ func (s *DockerSuite) TestPsListContainersSize(c *check.C) {
idIndex := strings.Index(lines[0], "CONTAINER ID")
foundID := lines[1][idIndex : idIndex+12]
c.Assert(foundID, checker.Equals, id[:12], check.Commentf("Expected id %s, got %s", id[:12], foundID))
- expectedSize := fmt.Sprintf("%dB", (2 + baseBytes))
+ expectedSize := fmt.Sprintf("%dB", 2+baseBytes)
foundSize := lines[1][sizeIndex:]
c.Assert(foundSize, checker.Contains, expectedSize, check.Commentf("Expected size %q, got %q", expectedSize, foundSize))
}
@@ -377,7 +377,7 @@ func (s *DockerSuite) TestPsListContainersFilterAncestorImage(c *check.C) {
}
func checkPsAncestorFilterOutput(c *check.C, out string, filterName string, expectedIDs []string) {
- actualIDs := []string{}
+ var actualIDs []string
if out != "" {
actualIDs = strings.Split(out[:len(out)-1], "\n")
}
diff --git a/components/engine/integration-cli/docker_cli_pull_local_test.go b/components/engine/integration-cli/docker_cli_pull_local_test.go
index 79b9390d28..31afdfb539 100644
--- a/components/engine/integration-cli/docker_cli_pull_local_test.go
+++ b/components/engine/integration-cli/docker_cli_pull_local_test.go
@@ -27,7 +27,7 @@ import (
func testPullImageWithAliases(c *check.C) {
repoName := fmt.Sprintf("%v/dockercli/busybox", privateRegistryURL)
- repos := []string{}
+ var repos []string
for _, tag := range []string{"recent", "fresh"} {
repos = append(repos, fmt.Sprintf("%v:%v", repoName, tag))
}
@@ -63,7 +63,7 @@ func (s *DockerSchema1RegistrySuite) TestPullImageWithAliases(c *check.C) {
func testConcurrentPullWholeRepo(c *check.C) {
repoName := fmt.Sprintf("%v/dockercli/busybox", privateRegistryURL)
- repos := []string{}
+ var repos []string
for _, tag := range []string{"recent", "fresh", "todays"} {
repo := fmt.Sprintf("%v:%v", repoName, tag)
buildImageSuccessfully(c, repo, build.WithDockerfile(fmt.Sprintf(`
@@ -151,7 +151,7 @@ func (s *DockerSchema1RegistrySuite) testConcurrentFailingPull(c *check.C) {
func testConcurrentPullMultipleTags(c *check.C) {
repoName := fmt.Sprintf("%v/dockercli/busybox", privateRegistryURL)
- repos := []string{}
+ var repos []string
for _, tag := range []string{"recent", "fresh", "todays"} {
repo := fmt.Sprintf("%v:%v", repoName, tag)
buildImageSuccessfully(c, repo, build.WithDockerfile(fmt.Sprintf(`
diff --git a/components/engine/integration-cli/docker_cli_push_test.go b/components/engine/integration-cli/docker_cli_push_test.go
index 48d6be2ac1..382260a5c7 100644
--- a/components/engine/integration-cli/docker_cli_push_test.go
+++ b/components/engine/integration-cli/docker_cli_push_test.go
@@ -155,7 +155,7 @@ func (s *DockerSchema1RegistrySuite) TestPushEmptyLayer(c *check.C) {
func testConcurrentPush(c *check.C) {
repoName := fmt.Sprintf("%v/dockercli/busybox", privateRegistryURL)
- repos := []string{}
+ var repos []string
for _, tag := range []string{"push1", "push2", "push3"} {
repo := fmt.Sprintf("%v:%v", repoName, tag)
buildImageSuccessfully(c, repo, build.WithDockerfile(fmt.Sprintf(`
diff --git a/components/engine/integration-cli/docker_cli_save_load_test.go b/components/engine/integration-cli/docker_cli_save_load_test.go
index 3077c0b46d..d370b6cc5e 100644
--- a/components/engine/integration-cli/docker_cli_save_load_test.go
+++ b/components/engine/integration-cli/docker_cli_save_load_test.go
@@ -19,7 +19,7 @@ import (
"github.com/docker/docker/integration-cli/cli/build"
"github.com/go-check/check"
"github.com/gotestyourself/gotestyourself/icmd"
- digest "github.com/opencontainers/go-digest"
+ "github.com/opencontainers/go-digest"
)
// save a repo using gz compression and try to load it using stdout
@@ -100,10 +100,10 @@ func (s *DockerSuite) TestSaveCheckTimes(c *check.C) {
testRequires(c, DaemonIsLinux)
repoName := "busybox:latest"
out, _ := dockerCmd(c, "inspect", repoName)
- data := []struct {
+ var data []struct {
ID string
Created time.Time
- }{}
+ }
err := json.Unmarshal([]byte(out), &data)
c.Assert(err, checker.IsNil, check.Commentf("failed to marshal from %q: err %v", repoName, err))
c.Assert(len(data), checker.Not(checker.Equals), 0, check.Commentf("failed to marshal the data from %q", repoName))
diff --git a/components/engine/integration-cli/docker_cli_sni_test.go b/components/engine/integration-cli/docker_cli_sni_test.go
index fb896d52d5..f50b5bbf6d 100644
--- a/components/engine/integration-cli/docker_cli_sni_test.go
+++ b/components/engine/integration-cli/docker_cli_sni_test.go
@@ -16,7 +16,7 @@ import (
func (s *DockerSuite) TestClientSetsTLSServerName(c *check.C) {
c.Skip("Flakey test")
// there may be more than one hit to the server for each registry request
- serverNameReceived := []string{}
+ var serverNameReceived []string
var serverName string
virtualHostServer := httptest.NewTLSServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
diff --git a/components/engine/integration-cli/environment/environment.go b/components/engine/integration-cli/environment/environment.go
index 2d7702f14c..82cf99652b 100644
--- a/components/engine/integration-cli/environment/environment.go
+++ b/components/engine/integration-cli/environment/environment.go
@@ -2,7 +2,6 @@ package environment // import "github.com/docker/docker/integration-cli/environm
import (
"os"
-
"os/exec"
"github.com/docker/docker/internal/test/environment"
diff --git a/components/engine/integration-cli/utils_test.go b/components/engine/integration-cli/utils_test.go
index 6c18c222d2..33913c3922 100644
--- a/components/engine/integration-cli/utils_test.go
+++ b/components/engine/integration-cli/utils_test.go
@@ -119,7 +119,7 @@ type elementListOptions struct {
}
func existingElements(c *check.C, opts elementListOptions) []string {
- args := []string{}
+ var args []string
switch opts.element {
case "container":
args = append(args, "ps", "-a")
@@ -136,7 +136,7 @@ func existingElements(c *check.C, opts elementListOptions) []string {
args = append(args, "--format", opts.format)
}
out, _ := dockerCmd(c, args...)
- lines := []string{}
+ var lines []string
for _, l := range strings.Split(out, "\n") {
if l != "" {
lines = append(lines, l)
diff --git a/components/engine/integration/build/build_test.go b/components/engine/integration/build/build_test.go
index 352f7c152d..83d992d14f 100644
--- a/components/engine/integration/build/build_test.go
+++ b/components/engine/integration/build/build_test.go
@@ -443,7 +443,7 @@ type buildLine struct {
}
func getImageIDsFromBuild(output []byte) ([]string, error) {
- ids := []string{}
+ var ids []string
for _, line := range bytes.Split(output, []byte("\n")) {
if len(line) == 0 {
continue
diff --git a/components/engine/integration/config/config_test.go b/components/engine/integration/config/config_test.go
index d698445f2b..1c002423ea 100644
--- a/components/engine/integration/config/config_test.go
+++ b/components/engine/integration/config/config_test.go
@@ -46,7 +46,7 @@ func TestConfigList(t *testing.T) {
config1ID := createConfig(ctx, t, client, testName1, []byte("TESTINGDATA1"), map[string]string{"type": "production"})
names := func(entries []swarmtypes.Config) []string {
- values := []string{}
+ var values []string
for _, entry := range entries {
values = append(values, entry.Spec.Name)
}
diff --git a/components/engine/integration/container/pause_test.go b/components/engine/integration/container/pause_test.go
index 8854dd9fd9..8f856bcb3c 100644
--- a/components/engine/integration/container/pause_test.go
+++ b/components/engine/integration/container/pause_test.go
@@ -51,7 +51,7 @@ func TestPause(t *testing.T) {
}
func TestPauseFailsOnWindowsServerContainers(t *testing.T) {
- skip.If(t, (testEnv.DaemonInfo.OSType != "windows" || testEnv.DaemonInfo.Isolation != "process"))
+ skip.If(t, testEnv.DaemonInfo.OSType != "windows" || testEnv.DaemonInfo.Isolation != "process")
defer setupTest(t)()
client := request.NewAPIClient(t)
@@ -85,7 +85,7 @@ func TestPauseStopPausedContainer(t *testing.T) {
}
func getEventActions(t *testing.T, messages <-chan events.Message, errs <-chan error) []string {
- actions := []string{}
+ var actions []string
for {
select {
case err := <-errs:
diff --git a/components/engine/integration/container/ps_test.go b/components/engine/integration/container/ps_test.go
index 7ee92481e9..1080cd2f57 100644
--- a/components/engine/integration/container/ps_test.go
+++ b/components/engine/integration/container/ps_test.go
@@ -22,7 +22,7 @@ func TestPsFilter(t *testing.T) {
next := container.Create(t, ctx, client)
containerIDs := func(containers []types.Container) []string {
- entries := []string{}
+ var entries []string
for _, container := range containers {
entries = append(entries, container.ID)
}
diff --git a/components/engine/integration/network/service_test.go b/components/engine/integration/network/service_test.go
index 2ae1897c6d..9b0c027598 100644
--- a/components/engine/integration/network/service_test.go
+++ b/components/engine/integration/network/service_test.go
@@ -173,8 +173,8 @@ func TestDaemonRestartWithExistingNetworkWithDefaultPoolRange(t *testing.T) {
out1, err := cli.NetworkInspect(context.Background(), name, types.NetworkInspectOptions{})
assert.NilError(t, err)
- assert.Check(t, (out1.IPAM.Config[0].Subnet != networkip))
- assert.Check(t, (out1.IPAM.Config[0].Subnet != networkip2))
+ assert.Check(t, out1.IPAM.Config[0].Subnet != networkip)
+ assert.Check(t, out1.IPAM.Config[0].Subnet != networkip2)
delInterface(t, defaultNetworkBridge)
}
diff --git a/components/engine/integration/secret/secret_test.go b/components/engine/integration/secret/secret_test.go
index 96a02a6ec5..9c5617efc6 100644
--- a/components/engine/integration/secret/secret_test.go
+++ b/components/engine/integration/secret/secret_test.go
@@ -63,7 +63,7 @@ func TestSecretList(t *testing.T) {
secret1ID := createSecret(ctx, t, client, testName1, []byte("TESTINGDATA1"), map[string]string{"type": "production"})
names := func(entries []swarmtypes.Secret) []string {
- values := []string{}
+ var values []string
for _, entry := range entries {
values = append(values, entry.Spec.Name)
}
diff --git a/components/engine/internal/test/environment/protect.go b/components/engine/internal/test/environment/protect.go
index 59acdf418e..6d57dedb1c 100644
--- a/components/engine/internal/test/environment/protect.go
+++ b/components/engine/internal/test/environment/protect.go
@@ -77,7 +77,7 @@ func getExistingContainers(t assert.TestingT, testEnv *Execution) []string {
})
assert.NilError(t, err, "failed to list containers")
- containers := []string{}
+ var containers []string
for _, container := range containerList {
containers = append(containers, container.ID)
}
@@ -121,7 +121,7 @@ func getExistingImages(t assert.TestingT, testEnv *Execution) []string {
})
assert.NilError(t, err, "failed to list images")
- images := []string{}
+ var images []string
for _, image := range imageList {
images = append(images, tagsFromImageSummary(image)...)
}
@@ -129,7 +129,7 @@ func getExistingImages(t assert.TestingT, testEnv *Execution) []string {
}
func tagsFromImageSummary(image types.ImageSummary) []string {
- result := []string{}
+ var result []string
for _, tag := range image.RepoTags {
if tag != ":" {
result = append(result, tag)
@@ -172,7 +172,7 @@ func getExistingNetworks(t assert.TestingT, testEnv *Execution) []string {
networkList, err := client.NetworkList(context.Background(), types.NetworkListOptions{})
assert.NilError(t, err, "failed to list networks")
- networks := []string{}
+ var networks []string
for _, network := range networkList {
networks = append(networks, network.ID)
}
@@ -211,7 +211,7 @@ func getExistingPlugins(t assert.TestingT, testEnv *Execution) []string {
}
assert.NilError(t, err, "failed to list plugins")
- plugins := []string{}
+ var plugins []string
for _, plugin := range pluginList {
plugins = append(plugins, plugin.Name)
}
@@ -246,7 +246,7 @@ func getExistingVolumes(t assert.TestingT, testEnv *Execution) []string {
volumeList, err := client.VolumeList(context.Background(), filters.Args{})
assert.NilError(t, err, "failed to list volumes")
- volumes := []string{}
+ var volumes []string
for _, volume := range volumeList.Volumes {
volumes = append(volumes, volume.Name)
}
diff --git a/components/engine/libcontainerd/client_daemon_linux.go b/components/engine/libcontainerd/client_daemon_linux.go
index a2237dc9f5..b57c4d3c50 100644
--- a/components/engine/libcontainerd/client_daemon_linux.go
+++ b/components/engine/libcontainerd/client_daemon_linux.go
@@ -10,7 +10,7 @@ import (
"github.com/containerd/containerd"
"github.com/containerd/containerd/cio"
"github.com/docker/docker/pkg/idtools"
- specs "github.com/opencontainers/runtime-spec/specs-go"
+ "github.com/opencontainers/runtime-spec/specs-go"
"github.com/sirupsen/logrus"
)
diff --git a/components/engine/libcontainerd/types_linux.go b/components/engine/libcontainerd/types_linux.go
index ae7a757c65..943382b9b0 100644
--- a/components/engine/libcontainerd/types_linux.go
+++ b/components/engine/libcontainerd/types_linux.go
@@ -4,7 +4,7 @@ import (
"time"
"github.com/containerd/cgroups"
- specs "github.com/opencontainers/runtime-spec/specs-go"
+ "github.com/opencontainers/runtime-spec/specs-go"
)
// Summary is not used on linux
diff --git a/components/engine/migrate/v1/migratev1.go b/components/engine/migrate/v1/migratev1.go
index 4777c16c55..9cd759a3b8 100644
--- a/components/engine/migrate/v1/migratev1.go
+++ b/components/engine/migrate/v1/migratev1.go
@@ -1,6 +1,7 @@
package v1 // import "github.com/docker/docker/migrate/v1"
import (
+ "encoding/json"
"errors"
"fmt"
"io/ioutil"
@@ -11,8 +12,6 @@ import (
"sync"
"time"
- "encoding/json"
-
"github.com/docker/distribution/reference"
"github.com/docker/docker/distribution/metadata"
"github.com/docker/docker/image"
diff --git a/components/engine/oci/devices_linux.go b/components/engine/oci/devices_linux.go
index 7f1658e53c..46d4e1d32d 100644
--- a/components/engine/oci/devices_linux.go
+++ b/components/engine/oci/devices_linux.go
@@ -8,7 +8,7 @@ import (
"github.com/opencontainers/runc/libcontainer/configs"
"github.com/opencontainers/runc/libcontainer/devices"
- specs "github.com/opencontainers/runtime-spec/specs-go"
+ "github.com/opencontainers/runtime-spec/specs-go"
)
// Device transforms a libcontainer configs.Device to a specs.LinuxDevice object.
diff --git a/components/engine/oci/namespaces.go b/components/engine/oci/namespaces.go
index f32e489b4a..5a2d8f2087 100644
--- a/components/engine/oci/namespaces.go
+++ b/components/engine/oci/namespaces.go
@@ -1,6 +1,6 @@
package oci // import "github.com/docker/docker/oci"
-import specs "github.com/opencontainers/runtime-spec/specs-go"
+import "github.com/opencontainers/runtime-spec/specs-go"
// RemoveNamespace removes the `nsType` namespace from OCI spec `s`
func RemoveNamespace(s *specs.Spec, nsType specs.LinuxNamespaceType) {
diff --git a/components/engine/opts/address_pools.go b/components/engine/opts/address_pools.go
index 99c89bb626..9b27a62853 100644
--- a/components/engine/opts/address_pools.go
+++ b/components/engine/opts/address_pools.go
@@ -65,7 +65,7 @@ func (p *PoolsOpt) Type() string {
// String returns a string repr of this option
func (p *PoolsOpt) String() string {
- pools := []string{}
+ var pools []string
for _, pool := range p.values {
repr := fmt.Sprintf("%s %d", pool.Base, pool.Size)
pools = append(pools, repr)
diff --git a/components/engine/opts/opts.go b/components/engine/opts/opts.go
index bfdcb996b0..de8aacb806 100644
--- a/components/engine/opts/opts.go
+++ b/components/engine/opts/opts.go
@@ -7,7 +7,7 @@ import (
"regexp"
"strings"
- units "github.com/docker/go-units"
+ "github.com/docker/go-units"
)
var (
@@ -52,7 +52,7 @@ func (opts *ListOpts) Set(value string) error {
}
value = v
}
- (*opts.values) = append((*opts.values), value)
+ *opts.values = append(*opts.values, value)
return nil
}
@@ -60,7 +60,7 @@ func (opts *ListOpts) Set(value string) error {
func (opts *ListOpts) Delete(key string) {
for i, k := range *opts.values {
if k == key {
- (*opts.values) = append((*opts.values)[:i], (*opts.values)[i+1:]...)
+ *opts.values = append((*opts.values)[:i], (*opts.values)[i+1:]...)
return
}
}
@@ -78,7 +78,7 @@ func (opts *ListOpts) GetMap() map[string]struct{} {
// GetAll returns the values of slice.
func (opts *ListOpts) GetAll() []string {
- return (*opts.values)
+ return *opts.values
}
// GetAllOrEmpty returns the values of the slice
@@ -103,7 +103,7 @@ func (opts *ListOpts) Get(key string) bool {
// Len returns the amount of element in the slice.
func (opts *ListOpts) Len() int {
- return len((*opts.values))
+ return len(*opts.values)
}
// Type returns a string name for this Option type
diff --git a/components/engine/pkg/archive/changes_posix_test.go b/components/engine/pkg/archive/changes_posix_test.go
index 76ee40bb60..019a0250f3 100644
--- a/components/engine/pkg/archive/changes_posix_test.go
+++ b/components/engine/pkg/archive/changes_posix_test.go
@@ -112,7 +112,7 @@ func (th tarHeaders) Less(i, j int) bool { return th[i].Name < th[j].Name }
func walkHeaders(r io.Reader) ([]tar.Header, error) {
t := tar.NewReader(r)
- headers := []tar.Header{}
+ var headers []tar.Header
for {
hdr, err := t.Next()
if err != nil {
diff --git a/components/engine/pkg/archive/time_linux.go b/components/engine/pkg/archive/time_linux.go
index 58aefe3efb..797143ee84 100644
--- a/components/engine/pkg/archive/time_linux.go
+++ b/components/engine/pkg/archive/time_linux.go
@@ -9,7 +9,7 @@ func timeToTimespec(time time.Time) (ts syscall.Timespec) {
if time.IsZero() {
// Return UTIME_OMIT special value
ts.Sec = 0
- ts.Nsec = ((1 << 30) - 2)
+ ts.Nsec = (1 << 30) - 2
return
}
return syscall.NsecToTimespec(time.UnixNano())
diff --git a/components/engine/pkg/broadcaster/unbuffered_test.go b/components/engine/pkg/broadcaster/unbuffered_test.go
index 2d885c77c1..c510584aa3 100644
--- a/components/engine/pkg/broadcaster/unbuffered_test.go
+++ b/components/engine/pkg/broadcaster/unbuffered_test.go
@@ -4,7 +4,6 @@ import (
"bytes"
"errors"
"strings"
-
"testing"
)
diff --git a/components/engine/pkg/devicemapper/devmapper_wrapper.go b/components/engine/pkg/devicemapper/devmapper_wrapper.go
index 8e28f642da..0b88f49695 100644
--- a/components/engine/pkg/devicemapper/devmapper_wrapper.go
+++ b/components/engine/pkg/devicemapper/devmapper_wrapper.go
@@ -216,7 +216,7 @@ func dmGetNextTargetFct(task *cdmTask, next unsafe.Pointer, start, length *uint6
}
func dmUdevSetSyncSupportFct(syncWithUdev int) {
- (C.dm_udev_set_sync_support(C.int(syncWithUdev)))
+ C.dm_udev_set_sync_support(C.int(syncWithUdev))
}
func dmUdevGetSyncSupportFct() int {
diff --git a/components/engine/pkg/idtools/idtools.go b/components/engine/pkg/idtools/idtools.go
index e2b493158c..d1f173a311 100644
--- a/components/engine/pkg/idtools/idtools.go
+++ b/components/engine/pkg/idtools/idtools.go
@@ -30,8 +30,8 @@ func (e ranges) Swap(i, j int) { e[i], e[j] = e[j], e[i] }
func (e ranges) Less(i, j int) bool { return e[i].Start < e[j].Start }
const (
- subuidFileName string = "/etc/subuid"
- subgidFileName string = "/etc/subgid"
+ subuidFileName = "/etc/subuid"
+ subgidFileName = "/etc/subgid"
)
// MkdirAllAndChown creates a directory (include any along the path) and then modifies
diff --git a/components/engine/pkg/jsonmessage/jsonmessage.go b/components/engine/pkg/jsonmessage/jsonmessage.go
index 7e5c95b58b..dd95f36704 100644
--- a/components/engine/pkg/jsonmessage/jsonmessage.go
+++ b/components/engine/pkg/jsonmessage/jsonmessage.go
@@ -8,9 +8,9 @@ import (
"strings"
"time"
- gotty "github.com/Nvveen/Gotty"
+ "github.com/Nvveen/Gotty"
"github.com/docker/docker/pkg/term"
- units "github.com/docker/go-units"
+ "github.com/docker/go-units"
)
// RFC3339NanoFixed is time.RFC3339Nano with nanoseconds padded using zeros to
diff --git a/components/engine/pkg/pubsub/publisher_test.go b/components/engine/pkg/pubsub/publisher_test.go
index 37bd6ece9d..98e158248f 100644
--- a/components/engine/pkg/pubsub/publisher_test.go
+++ b/components/engine/pkg/pubsub/publisher_test.go
@@ -20,7 +20,7 @@ func TestSendToOneSub(t *testing.T) {
func TestSendToMultipleSubs(t *testing.T) {
p := NewPublisher(100*time.Millisecond, 10)
- subs := []chan interface{}{}
+ var subs []chan interface{}
subs = append(subs, p.Subscribe(), p.Subscribe(), p.Subscribe())
p.Publish("hi")
@@ -52,7 +52,7 @@ func TestEvictOneSub(t *testing.T) {
func TestClosePublisher(t *testing.T) {
p := NewPublisher(100*time.Millisecond, 10)
- subs := []chan interface{}{}
+ var subs []chan interface{}
subs = append(subs, p.Subscribe(), p.Subscribe(), p.Subscribe())
p.Close()
@@ -99,7 +99,7 @@ func newTestSubscriber(p *Publisher) *testSubscriber {
// for testing with -race
func TestPubSubRace(t *testing.T) {
p := NewPublisher(0, 1024)
- var subs [](*testSubscriber)
+ var subs []*testSubscriber
for j := 0; j < 50; j++ {
subs = append(subs, newTestSubscriber(p))
}
@@ -120,7 +120,7 @@ func BenchmarkPubSub(b *testing.B) {
for i := 0; i < b.N; i++ {
b.StopTimer()
p := NewPublisher(0, 1024)
- var subs [](*testSubscriber)
+ var subs []*testSubscriber
for j := 0; j < 50; j++ {
subs = append(subs, newTestSubscriber(p))
}
diff --git a/components/engine/pkg/signal/signal.go b/components/engine/pkg/signal/signal.go
index 6a663091a1..88ef7b5ea2 100644
--- a/components/engine/pkg/signal/signal.go
+++ b/components/engine/pkg/signal/signal.go
@@ -13,7 +13,7 @@ import (
// CatchAll catches all signals and relays them to the specified channel.
func CatchAll(sigc chan os.Signal) {
- handledSigs := []os.Signal{}
+ var handledSigs []os.Signal
for _, s := range SignalMap {
handledSigs = append(handledSigs, s)
}
diff --git a/components/engine/pkg/term/windows/windows.go b/components/engine/pkg/term/windows/windows.go
index 1f8965969c..3e5593ca6a 100644
--- a/components/engine/pkg/term/windows/windows.go
+++ b/components/engine/pkg/term/windows/windows.go
@@ -9,7 +9,7 @@ import (
"os"
"sync"
- ansiterm "github.com/Azure/go-ansiterm"
+ "github.com/Azure/go-ansiterm"
"github.com/sirupsen/logrus"
)
diff --git a/components/engine/pkg/truncindex/truncindex_test.go b/components/engine/pkg/truncindex/truncindex_test.go
index 5977ca315f..e259017982 100644
--- a/components/engine/pkg/truncindex/truncindex_test.go
+++ b/components/engine/pkg/truncindex/truncindex_test.go
@@ -10,7 +10,7 @@ import (
// Test the behavior of TruncIndex, an index for querying IDs from a non-conflicting prefix.
func TestTruncIndex(t *testing.T) {
- ids := []string{}
+ var ids []string
index := NewTruncIndex(ids)
// Get on an empty index
if _, err := index.Get("foobar"); err == nil {
diff --git a/components/engine/plugin/backend_linux.go b/components/engine/plugin/backend_linux.go
index 4a6d80d243..044e14b0cb 100644
--- a/components/engine/plugin/backend_linux.go
+++ b/components/engine/plugin/backend_linux.go
@@ -33,7 +33,7 @@ import (
"github.com/docker/docker/pkg/system"
"github.com/docker/docker/plugin/v2"
refstore "github.com/docker/docker/reference"
- digest "github.com/opencontainers/go-digest"
+ "github.com/opencontainers/go-digest"
specs "github.com/opencontainers/image-spec/specs-go/v1"
"github.com/pkg/errors"
"github.com/sirupsen/logrus"
diff --git a/components/engine/plugin/defs.go b/components/engine/plugin/defs.go
index c158bbbfe5..31f7c6bcc3 100644
--- a/components/engine/plugin/defs.go
+++ b/components/engine/plugin/defs.go
@@ -5,7 +5,7 @@ import (
"github.com/docker/docker/pkg/plugins"
"github.com/docker/docker/plugin/v2"
- specs "github.com/opencontainers/runtime-spec/specs-go"
+ "github.com/opencontainers/runtime-spec/specs-go"
)
// Store manages the plugin inventory in memory and on-disk
diff --git a/components/engine/plugin/executor/containerd/containerd_test.go b/components/engine/plugin/executor/containerd/containerd_test.go
index cd1a51bd35..d9185a05e1 100644
--- a/components/engine/plugin/executor/containerd/containerd_test.go
+++ b/components/engine/plugin/executor/containerd/containerd_test.go
@@ -10,7 +10,7 @@ import (
"github.com/docker/docker/libcontainerd"
"github.com/gotestyourself/gotestyourself/assert"
- specs "github.com/opencontainers/runtime-spec/specs-go"
+ "github.com/opencontainers/runtime-spec/specs-go"
"github.com/pkg/errors"
)
diff --git a/components/engine/plugin/manager.go b/components/engine/plugin/manager.go
index 7595e7cbcc..9c674f9545 100644
--- a/components/engine/plugin/manager.go
+++ b/components/engine/plugin/manager.go
@@ -24,7 +24,7 @@ import (
"github.com/docker/docker/plugin/v2"
"github.com/docker/docker/registry"
"github.com/opencontainers/go-digest"
- specs "github.com/opencontainers/runtime-spec/specs-go"
+ "github.com/opencontainers/runtime-spec/specs-go"
"github.com/pkg/errors"
"github.com/sirupsen/logrus"
)
diff --git a/components/engine/plugin/manager_linux_test.go b/components/engine/plugin/manager_linux_test.go
index 48048bb30f..d4199c80da 100644
--- a/components/engine/plugin/manager_linux_test.go
+++ b/components/engine/plugin/manager_linux_test.go
@@ -12,7 +12,7 @@ import (
"github.com/docker/docker/pkg/system"
"github.com/docker/docker/plugin/v2"
"github.com/gotestyourself/gotestyourself/skip"
- specs "github.com/opencontainers/runtime-spec/specs-go"
+ "github.com/opencontainers/runtime-spec/specs-go"
"github.com/pkg/errors"
)
diff --git a/components/engine/plugin/store.go b/components/engine/plugin/store.go
index 5cb994b759..8e96c11da4 100644
--- a/components/engine/plugin/store.go
+++ b/components/engine/plugin/store.go
@@ -9,7 +9,7 @@ import (
"github.com/docker/docker/pkg/plugingetter"
"github.com/docker/docker/pkg/plugins"
"github.com/docker/docker/plugin/v2"
- specs "github.com/opencontainers/runtime-spec/specs-go"
+ "github.com/opencontainers/runtime-spec/specs-go"
"github.com/pkg/errors"
"github.com/sirupsen/logrus"
)
@@ -18,13 +18,13 @@ import (
* When the time comes to remove support for V1 plugins, flipping
* this bool is all that will be needed.
*/
-const allowV1PluginsFallback bool = true
+const allowV1PluginsFallback = true
/* defaultAPIVersion is the version of the plugin API for volume, network,
IPAM and authz. This is a very stable API. When we update this API, then
pluginType should include a version. e.g. "networkdriver/2.0".
*/
-const defaultAPIVersion string = "1.0"
+const defaultAPIVersion = "1.0"
// GetV2Plugin retrieves a plugin by name, id or partial ID.
func (ps *Store) GetV2Plugin(refOrID string) (*v2.Plugin, error) {
diff --git a/components/engine/plugin/v2/plugin.go b/components/engine/plugin/v2/plugin.go
index 558e49d31b..1c451691ce 100644
--- a/components/engine/plugin/v2/plugin.go
+++ b/components/engine/plugin/v2/plugin.go
@@ -10,7 +10,7 @@ import (
"github.com/docker/docker/pkg/plugingetter"
"github.com/docker/docker/pkg/plugins"
"github.com/opencontainers/go-digest"
- specs "github.com/opencontainers/runtime-spec/specs-go"
+ "github.com/opencontainers/runtime-spec/specs-go"
)
// Plugin represents an individual plugin.
diff --git a/components/engine/plugin/v2/plugin_linux.go b/components/engine/plugin/v2/plugin_linux.go
index 4ad582cd83..58c432fcd6 100644
--- a/components/engine/plugin/v2/plugin_linux.go
+++ b/components/engine/plugin/v2/plugin_linux.go
@@ -9,7 +9,7 @@ import (
"github.com/docker/docker/api/types"
"github.com/docker/docker/oci"
"github.com/docker/docker/pkg/system"
- specs "github.com/opencontainers/runtime-spec/specs-go"
+ "github.com/opencontainers/runtime-spec/specs-go"
"github.com/pkg/errors"
)
diff --git a/components/engine/reference/store_test.go b/components/engine/reference/store_test.go
index 24c0597a3e..71f1d96e59 100644
--- a/components/engine/reference/store_test.go
+++ b/components/engine/reference/store_test.go
@@ -11,7 +11,7 @@ import (
"github.com/docker/distribution/reference"
"github.com/gotestyourself/gotestyourself/assert"
is "github.com/gotestyourself/gotestyourself/assert/cmp"
- digest "github.com/opencontainers/go-digest"
+ "github.com/opencontainers/go-digest"
)
var (
diff --git a/components/engine/registry/config_test.go b/components/engine/registry/config_test.go
index 4df9cdb948..2f9c9548ea 100644
--- a/components/engine/registry/config_test.go
+++ b/components/engine/registry/config_test.go
@@ -100,7 +100,7 @@ func TestLoadAllowNondistributableArtifacts(t *testing.T) {
t.Fatalf("expect no error, got '%s'", err)
}
- cidrStrs := []string{}
+ var cidrStrs []string
for _, c := range config.AllowNondistributableArtifactsCIDRs {
cidrStrs = append(cidrStrs, c.String())
}
diff --git a/components/engine/registry/endpoint_v1.go b/components/engine/registry/endpoint_v1.go
index 94c56dca7d..832fdb95a4 100644
--- a/components/engine/registry/endpoint_v1.go
+++ b/components/engine/registry/endpoint_v1.go
@@ -69,7 +69,7 @@ func validateEndpoint(endpoint *V1Endpoint) error {
func newV1Endpoint(address url.URL, tlsConfig *tls.Config, userAgent string, metaHeaders http.Header) *V1Endpoint {
endpoint := &V1Endpoint{
- IsSecure: (tlsConfig == nil || !tlsConfig.InsecureSkipVerify),
+ IsSecure: tlsConfig == nil || !tlsConfig.InsecureSkipVerify,
URL: new(url.URL),
}
diff --git a/components/engine/registry/registry_mock_test.go b/components/engine/registry/registry_mock_test.go
index e6a4fca0cc..bf17eb9fc7 100644
--- a/components/engine/registry/registry_mock_test.go
+++ b/components/engine/registry/registry_mock_test.go
@@ -430,7 +430,7 @@ func handlerImages(w http.ResponseWriter, r *http.Request) {
writeResponse(w, "", 204)
return
}
- images := []map[string]string{}
+ var images []map[string]string
for imageID, layer := range testLayers {
image := make(map[string]string)
image["id"] = imageID
diff --git a/components/engine/registry/registry_test.go b/components/engine/registry/registry_test.go
index 86620dfccf..ec11252394 100644
--- a/components/engine/registry/registry_test.go
+++ b/components/engine/registry/registry_test.go
@@ -543,7 +543,7 @@ func TestNewIndexInfo(t *testing.T) {
}
config := emptyServiceConfig
- noMirrors := []string{}
+ var noMirrors []string
expectedIndexInfos := map[string]*registrytypes.IndexInfo{
IndexName: {
Name: IndexName,
diff --git a/components/engine/registry/session.go b/components/engine/registry/session.go
index 1d0bae2ca7..ef14299594 100644
--- a/components/engine/registry/session.go
+++ b/components/engine/registry/session.go
@@ -3,7 +3,6 @@ package registry // import "github.com/docker/docker/registry"
import (
"bytes"
"crypto/sha256"
- "sync"
// this is required for some certificates
_ "crypto/sha512"
"encoding/hex"
@@ -16,6 +15,7 @@ import (
"net/url"
"strconv"
"strings"
+ "sync"
"github.com/docker/distribution/reference"
"github.com/docker/distribution/registry/api/errcode"
diff --git a/components/engine/vendor.conf b/components/engine/vendor.conf
index 83695a31a0..5918cba298 100644
--- a/components/engine/vendor.conf
+++ b/components/engine/vendor.conf
@@ -76,7 +76,7 @@ github.com/opencontainers/image-spec v1.0.1
github.com/seccomp/libseccomp-golang 32f571b70023028bd57d9288c20efbcb237f3ce0
# libcontainer deps (see src/github.com/opencontainers/runc/Godeps/Godeps.json)
-github.com/coreos/go-systemd v15
+github.com/coreos/go-systemd v17
github.com/godbus/dbus v4.0.0
github.com/syndtr/gocapability 2c00daeb6c3b45114c80ac44119e7b8801fdd852
github.com/golang/protobuf 7a211bcf3bce0e3f1d74f9894916e6f116ae83b4
@@ -110,7 +110,7 @@ google.golang.org/genproto d80a6e20e776b0b17a324d0ba1ab50a39c8e8944
# containerd
github.com/containerd/containerd 4ac4fd0b6a268fe6f38b2b2e32e40daa7e424fac
github.com/containerd/fifo fbfb6a11ec671efbe94ad1c12c2e98773f19e1e6
-github.com/containerd/continuity d8fb8589b0e8e85b8c8bbaa8840226d0dfeb7371
+github.com/containerd/continuity 2d3749b4da569ac97ca63dccba5eee4f5ee2beab
github.com/containerd/cgroups fe281dd265766145e943a034aa41086474ea6130
github.com/containerd/console 2748ece16665b45a47f884001d5831ec79703880
github.com/containerd/go-runc 4f6e87ae043f859a38255247b49c9abc262d002f
diff --git a/components/engine/vendor/github.com/containerd/continuity/fs/copy.go b/components/engine/vendor/github.com/containerd/continuity/fs/copy.go
index e8f452819b..2ac474b926 100644
--- a/components/engine/vendor/github.com/containerd/continuity/fs/copy.go
+++ b/components/engine/vendor/github.com/containerd/continuity/fs/copy.go
@@ -72,7 +72,7 @@ func copyDirectory(dst, src string, inodes map[uint64]string) error {
if err := os.Link(link, target); err != nil {
return errors.Wrap(err, "failed to create hard link")
}
- } else if err := copyFile(source, target); err != nil {
+ } else if err := CopyFile(target, source); err != nil {
return errors.Wrap(err, "failed to copy files")
}
case (fi.Mode() & os.ModeSymlink) == os.ModeSymlink:
@@ -103,7 +103,9 @@ func copyDirectory(dst, src string, inodes map[uint64]string) error {
return nil
}
-func copyFile(source, target string) error {
+// CopyFile copies the source file to the target.
+// The most efficient means of copying is used for the platform.
+func CopyFile(target, source string) error {
src, err := os.Open(source)
if err != nil {
return errors.Wrapf(err, "failed to open source %s", source)
diff --git a/components/engine/vendor/github.com/containerd/continuity/fs/copy_linux.go b/components/engine/vendor/github.com/containerd/continuity/fs/copy_linux.go
index cfab6756b8..b244e3185b 100644
--- a/components/engine/vendor/github.com/containerd/continuity/fs/copy_linux.go
+++ b/components/engine/vendor/github.com/containerd/continuity/fs/copy_linux.go
@@ -49,20 +49,26 @@ func copyFileContent(dst, src *os.File) error {
return errors.Wrap(err, "unable to stat source")
}
- n, err := unix.CopyFileRange(int(src.Fd()), nil, int(dst.Fd()), nil, int(st.Size()), 0)
- if err != nil {
- if err != unix.ENOSYS && err != unix.EXDEV {
- return errors.Wrap(err, "copy file range failed")
+ size := st.Size()
+ first := true
+ srcFd := int(src.Fd())
+ dstFd := int(dst.Fd())
+
+ for size > 0 {
+ n, err := unix.CopyFileRange(srcFd, nil, dstFd, nil, int(size), 0)
+ if err != nil {
+ if (err != unix.ENOSYS && err != unix.EXDEV) || !first {
+ return errors.Wrap(err, "copy file range failed")
+ }
+
+ buf := bufferPool.Get().(*[]byte)
+ _, err = io.CopyBuffer(dst, src, *buf)
+ bufferPool.Put(buf)
+ return errors.Wrap(err, "userspace copy failed")
}
- buf := bufferPool.Get().(*[]byte)
- _, err = io.CopyBuffer(dst, src, *buf)
- bufferPool.Put(buf)
- return err
- }
-
- if int64(n) != st.Size() {
- return errors.Wrapf(err, "short copy: %d of %d", int64(n), st.Size())
+ first = false
+ size -= int64(n)
}
return nil
diff --git a/components/engine/vendor/github.com/containerd/continuity/sysx/xattr_linux.go b/components/engine/vendor/github.com/containerd/continuity/sysx/xattr_linux.go
index cd18136343..311b896d9e 100644
--- a/components/engine/vendor/github.com/containerd/continuity/sysx/xattr_linux.go
+++ b/components/engine/vendor/github.com/containerd/continuity/sysx/xattr_linux.go
@@ -1,61 +1,44 @@
package sysx
-import "syscall"
-
-// These functions will be generated by generate.sh
-// $ GOOS=linux GOARCH=386 ./generate.sh xattr
-// $ GOOS=linux GOARCH=amd64 ./generate.sh xattr
-// $ GOOS=linux GOARCH=arm ./generate.sh xattr
-// $ GOOS=linux GOARCH=arm64 ./generate.sh xattr
-// $ GOOS=linux GOARCH=ppc64 ./generate.sh xattr
-// $ GOOS=linux GOARCH=ppc64le ./generate.sh xattr
-// $ GOOS=linux GOARCH=s390x ./generate.sh xattr
+import "golang.org/x/sys/unix"
// Listxattr calls syscall listxattr and reads all content
// and returns a string array
func Listxattr(path string) ([]string, error) {
- return listxattrAll(path, syscall.Listxattr)
+ return listxattrAll(path, unix.Listxattr)
}
// Removexattr calls syscall removexattr
func Removexattr(path string, attr string) (err error) {
- return syscall.Removexattr(path, attr)
+ return unix.Removexattr(path, attr)
}
// Setxattr calls syscall setxattr
func Setxattr(path string, attr string, data []byte, flags int) (err error) {
- return syscall.Setxattr(path, attr, data, flags)
+ return unix.Setxattr(path, attr, data, flags)
}
// Getxattr calls syscall getxattr
func Getxattr(path, attr string) ([]byte, error) {
- return getxattrAll(path, attr, syscall.Getxattr)
+ return getxattrAll(path, attr, unix.Getxattr)
}
-//sys llistxattr(path string, dest []byte) (sz int, err error)
-
// LListxattr lists xattrs, not following symlinks
func LListxattr(path string) ([]string, error) {
- return listxattrAll(path, llistxattr)
+ return listxattrAll(path, unix.Llistxattr)
}
-//sys lremovexattr(path string, attr string) (err error)
-
// LRemovexattr removes an xattr, not following symlinks
func LRemovexattr(path string, attr string) (err error) {
- return lremovexattr(path, attr)
+ return unix.Lremovexattr(path, attr)
}
-//sys lsetxattr(path string, attr string, data []byte, flags int) (err error)
-
// LSetxattr sets an xattr, not following symlinks
func LSetxattr(path string, attr string, data []byte, flags int) (err error) {
- return lsetxattr(path, attr, data, flags)
+ return unix.Lsetxattr(path, attr, data, flags)
}
-//sys lgetxattr(path string, attr string, dest []byte) (sz int, err error)
-
// LGetxattr gets an xattr, not following symlinks
func LGetxattr(path, attr string) ([]byte, error) {
- return getxattrAll(path, attr, lgetxattr)
+ return getxattrAll(path, attr, unix.Lgetxattr)
}
diff --git a/components/engine/vendor/github.com/containerd/continuity/sysx/xattr_linux_386.go b/components/engine/vendor/github.com/containerd/continuity/sysx/xattr_linux_386.go
deleted file mode 100644
index c3e5c8e385..0000000000
--- a/components/engine/vendor/github.com/containerd/continuity/sysx/xattr_linux_386.go
+++ /dev/null
@@ -1,111 +0,0 @@
-// mksyscall.pl -l32 xattr_linux.go
-// MACHINE GENERATED BY THE COMMAND ABOVE; DO NOT EDIT
-
-package sysx
-
-import (
- "syscall"
- "unsafe"
-)
-
-// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
-
-func llistxattr(path string, dest []byte) (sz int, err error) {
- var _p0 *byte
- _p0, err = syscall.BytePtrFromString(path)
- if err != nil {
- return
- }
- var _p1 unsafe.Pointer
- if len(dest) > 0 {
- _p1 = unsafe.Pointer(&dest[0])
- } else {
- _p1 = unsafe.Pointer(&_zero)
- }
- r0, _, e1 := syscall.Syscall(syscall.SYS_LLISTXATTR, uintptr(unsafe.Pointer(_p0)), uintptr(_p1), uintptr(len(dest)))
- use(unsafe.Pointer(_p0))
- sz = int(r0)
- if e1 != 0 {
- err = errnoErr(e1)
- }
- return
-}
-
-// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
-
-func lremovexattr(path string, attr string) (err error) {
- var _p0 *byte
- _p0, err = syscall.BytePtrFromString(path)
- if err != nil {
- return
- }
- var _p1 *byte
- _p1, err = syscall.BytePtrFromString(attr)
- if err != nil {
- return
- }
- _, _, e1 := syscall.Syscall(syscall.SYS_LREMOVEXATTR, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), 0)
- use(unsafe.Pointer(_p0))
- use(unsafe.Pointer(_p1))
- if e1 != 0 {
- err = errnoErr(e1)
- }
- return
-}
-
-// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
-
-func lsetxattr(path string, attr string, data []byte, flags int) (err error) {
- var _p0 *byte
- _p0, err = syscall.BytePtrFromString(path)
- if err != nil {
- return
- }
- var _p1 *byte
- _p1, err = syscall.BytePtrFromString(attr)
- if err != nil {
- return
- }
- var _p2 unsafe.Pointer
- if len(data) > 0 {
- _p2 = unsafe.Pointer(&data[0])
- } else {
- _p2 = unsafe.Pointer(&_zero)
- }
- _, _, e1 := syscall.Syscall6(syscall.SYS_LSETXATTR, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(_p2), uintptr(len(data)), uintptr(flags), 0)
- use(unsafe.Pointer(_p0))
- use(unsafe.Pointer(_p1))
- if e1 != 0 {
- err = errnoErr(e1)
- }
- return
-}
-
-// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
-
-func lgetxattr(path string, attr string, dest []byte) (sz int, err error) {
- var _p0 *byte
- _p0, err = syscall.BytePtrFromString(path)
- if err != nil {
- return
- }
- var _p1 *byte
- _p1, err = syscall.BytePtrFromString(attr)
- if err != nil {
- return
- }
- var _p2 unsafe.Pointer
- if len(dest) > 0 {
- _p2 = unsafe.Pointer(&dest[0])
- } else {
- _p2 = unsafe.Pointer(&_zero)
- }
- r0, _, e1 := syscall.Syscall6(syscall.SYS_LGETXATTR, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(_p2), uintptr(len(dest)), 0, 0)
- use(unsafe.Pointer(_p0))
- use(unsafe.Pointer(_p1))
- sz = int(r0)
- if e1 != 0 {
- err = errnoErr(e1)
- }
- return
-}
diff --git a/components/engine/vendor/github.com/containerd/continuity/sysx/xattr_linux_amd64.go b/components/engine/vendor/github.com/containerd/continuity/sysx/xattr_linux_amd64.go
deleted file mode 100644
index dec46faaaf..0000000000
--- a/components/engine/vendor/github.com/containerd/continuity/sysx/xattr_linux_amd64.go
+++ /dev/null
@@ -1,111 +0,0 @@
-// mksyscall.pl xattr_linux.go
-// MACHINE GENERATED BY THE COMMAND ABOVE; DO NOT EDIT
-
-package sysx
-
-import (
- "syscall"
- "unsafe"
-)
-
-// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
-
-func llistxattr(path string, dest []byte) (sz int, err error) {
- var _p0 *byte
- _p0, err = syscall.BytePtrFromString(path)
- if err != nil {
- return
- }
- var _p1 unsafe.Pointer
- if len(dest) > 0 {
- _p1 = unsafe.Pointer(&dest[0])
- } else {
- _p1 = unsafe.Pointer(&_zero)
- }
- r0, _, e1 := syscall.Syscall(syscall.SYS_LLISTXATTR, uintptr(unsafe.Pointer(_p0)), uintptr(_p1), uintptr(len(dest)))
- use(unsafe.Pointer(_p0))
- sz = int(r0)
- if e1 != 0 {
- err = errnoErr(e1)
- }
- return
-}
-
-// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
-
-func lremovexattr(path string, attr string) (err error) {
- var _p0 *byte
- _p0, err = syscall.BytePtrFromString(path)
- if err != nil {
- return
- }
- var _p1 *byte
- _p1, err = syscall.BytePtrFromString(attr)
- if err != nil {
- return
- }
- _, _, e1 := syscall.Syscall(syscall.SYS_LREMOVEXATTR, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), 0)
- use(unsafe.Pointer(_p0))
- use(unsafe.Pointer(_p1))
- if e1 != 0 {
- err = errnoErr(e1)
- }
- return
-}
-
-// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
-
-func lsetxattr(path string, attr string, data []byte, flags int) (err error) {
- var _p0 *byte
- _p0, err = syscall.BytePtrFromString(path)
- if err != nil {
- return
- }
- var _p1 *byte
- _p1, err = syscall.BytePtrFromString(attr)
- if err != nil {
- return
- }
- var _p2 unsafe.Pointer
- if len(data) > 0 {
- _p2 = unsafe.Pointer(&data[0])
- } else {
- _p2 = unsafe.Pointer(&_zero)
- }
- _, _, e1 := syscall.Syscall6(syscall.SYS_LSETXATTR, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(_p2), uintptr(len(data)), uintptr(flags), 0)
- use(unsafe.Pointer(_p0))
- use(unsafe.Pointer(_p1))
- if e1 != 0 {
- err = errnoErr(e1)
- }
- return
-}
-
-// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
-
-func lgetxattr(path string, attr string, dest []byte) (sz int, err error) {
- var _p0 *byte
- _p0, err = syscall.BytePtrFromString(path)
- if err != nil {
- return
- }
- var _p1 *byte
- _p1, err = syscall.BytePtrFromString(attr)
- if err != nil {
- return
- }
- var _p2 unsafe.Pointer
- if len(dest) > 0 {
- _p2 = unsafe.Pointer(&dest[0])
- } else {
- _p2 = unsafe.Pointer(&_zero)
- }
- r0, _, e1 := syscall.Syscall6(syscall.SYS_LGETXATTR, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(_p2), uintptr(len(dest)), 0, 0)
- use(unsafe.Pointer(_p0))
- use(unsafe.Pointer(_p1))
- sz = int(r0)
- if e1 != 0 {
- err = errnoErr(e1)
- }
- return
-}
diff --git a/components/engine/vendor/github.com/containerd/continuity/sysx/xattr_linux_arm.go b/components/engine/vendor/github.com/containerd/continuity/sysx/xattr_linux_arm.go
deleted file mode 100644
index c3e5c8e385..0000000000
--- a/components/engine/vendor/github.com/containerd/continuity/sysx/xattr_linux_arm.go
+++ /dev/null
@@ -1,111 +0,0 @@
-// mksyscall.pl -l32 xattr_linux.go
-// MACHINE GENERATED BY THE COMMAND ABOVE; DO NOT EDIT
-
-package sysx
-
-import (
- "syscall"
- "unsafe"
-)
-
-// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
-
-func llistxattr(path string, dest []byte) (sz int, err error) {
- var _p0 *byte
- _p0, err = syscall.BytePtrFromString(path)
- if err != nil {
- return
- }
- var _p1 unsafe.Pointer
- if len(dest) > 0 {
- _p1 = unsafe.Pointer(&dest[0])
- } else {
- _p1 = unsafe.Pointer(&_zero)
- }
- r0, _, e1 := syscall.Syscall(syscall.SYS_LLISTXATTR, uintptr(unsafe.Pointer(_p0)), uintptr(_p1), uintptr(len(dest)))
- use(unsafe.Pointer(_p0))
- sz = int(r0)
- if e1 != 0 {
- err = errnoErr(e1)
- }
- return
-}
-
-// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
-
-func lremovexattr(path string, attr string) (err error) {
- var _p0 *byte
- _p0, err = syscall.BytePtrFromString(path)
- if err != nil {
- return
- }
- var _p1 *byte
- _p1, err = syscall.BytePtrFromString(attr)
- if err != nil {
- return
- }
- _, _, e1 := syscall.Syscall(syscall.SYS_LREMOVEXATTR, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), 0)
- use(unsafe.Pointer(_p0))
- use(unsafe.Pointer(_p1))
- if e1 != 0 {
- err = errnoErr(e1)
- }
- return
-}
-
-// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
-
-func lsetxattr(path string, attr string, data []byte, flags int) (err error) {
- var _p0 *byte
- _p0, err = syscall.BytePtrFromString(path)
- if err != nil {
- return
- }
- var _p1 *byte
- _p1, err = syscall.BytePtrFromString(attr)
- if err != nil {
- return
- }
- var _p2 unsafe.Pointer
- if len(data) > 0 {
- _p2 = unsafe.Pointer(&data[0])
- } else {
- _p2 = unsafe.Pointer(&_zero)
- }
- _, _, e1 := syscall.Syscall6(syscall.SYS_LSETXATTR, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(_p2), uintptr(len(data)), uintptr(flags), 0)
- use(unsafe.Pointer(_p0))
- use(unsafe.Pointer(_p1))
- if e1 != 0 {
- err = errnoErr(e1)
- }
- return
-}
-
-// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
-
-func lgetxattr(path string, attr string, dest []byte) (sz int, err error) {
- var _p0 *byte
- _p0, err = syscall.BytePtrFromString(path)
- if err != nil {
- return
- }
- var _p1 *byte
- _p1, err = syscall.BytePtrFromString(attr)
- if err != nil {
- return
- }
- var _p2 unsafe.Pointer
- if len(dest) > 0 {
- _p2 = unsafe.Pointer(&dest[0])
- } else {
- _p2 = unsafe.Pointer(&_zero)
- }
- r0, _, e1 := syscall.Syscall6(syscall.SYS_LGETXATTR, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(_p2), uintptr(len(dest)), 0, 0)
- use(unsafe.Pointer(_p0))
- use(unsafe.Pointer(_p1))
- sz = int(r0)
- if e1 != 0 {
- err = errnoErr(e1)
- }
- return
-}
diff --git a/components/engine/vendor/github.com/containerd/continuity/sysx/xattr_linux_arm64.go b/components/engine/vendor/github.com/containerd/continuity/sysx/xattr_linux_arm64.go
deleted file mode 100644
index dec46faaaf..0000000000
--- a/components/engine/vendor/github.com/containerd/continuity/sysx/xattr_linux_arm64.go
+++ /dev/null
@@ -1,111 +0,0 @@
-// mksyscall.pl xattr_linux.go
-// MACHINE GENERATED BY THE COMMAND ABOVE; DO NOT EDIT
-
-package sysx
-
-import (
- "syscall"
- "unsafe"
-)
-
-// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
-
-func llistxattr(path string, dest []byte) (sz int, err error) {
- var _p0 *byte
- _p0, err = syscall.BytePtrFromString(path)
- if err != nil {
- return
- }
- var _p1 unsafe.Pointer
- if len(dest) > 0 {
- _p1 = unsafe.Pointer(&dest[0])
- } else {
- _p1 = unsafe.Pointer(&_zero)
- }
- r0, _, e1 := syscall.Syscall(syscall.SYS_LLISTXATTR, uintptr(unsafe.Pointer(_p0)), uintptr(_p1), uintptr(len(dest)))
- use(unsafe.Pointer(_p0))
- sz = int(r0)
- if e1 != 0 {
- err = errnoErr(e1)
- }
- return
-}
-
-// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
-
-func lremovexattr(path string, attr string) (err error) {
- var _p0 *byte
- _p0, err = syscall.BytePtrFromString(path)
- if err != nil {
- return
- }
- var _p1 *byte
- _p1, err = syscall.BytePtrFromString(attr)
- if err != nil {
- return
- }
- _, _, e1 := syscall.Syscall(syscall.SYS_LREMOVEXATTR, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), 0)
- use(unsafe.Pointer(_p0))
- use(unsafe.Pointer(_p1))
- if e1 != 0 {
- err = errnoErr(e1)
- }
- return
-}
-
-// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
-
-func lsetxattr(path string, attr string, data []byte, flags int) (err error) {
- var _p0 *byte
- _p0, err = syscall.BytePtrFromString(path)
- if err != nil {
- return
- }
- var _p1 *byte
- _p1, err = syscall.BytePtrFromString(attr)
- if err != nil {
- return
- }
- var _p2 unsafe.Pointer
- if len(data) > 0 {
- _p2 = unsafe.Pointer(&data[0])
- } else {
- _p2 = unsafe.Pointer(&_zero)
- }
- _, _, e1 := syscall.Syscall6(syscall.SYS_LSETXATTR, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(_p2), uintptr(len(data)), uintptr(flags), 0)
- use(unsafe.Pointer(_p0))
- use(unsafe.Pointer(_p1))
- if e1 != 0 {
- err = errnoErr(e1)
- }
- return
-}
-
-// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
-
-func lgetxattr(path string, attr string, dest []byte) (sz int, err error) {
- var _p0 *byte
- _p0, err = syscall.BytePtrFromString(path)
- if err != nil {
- return
- }
- var _p1 *byte
- _p1, err = syscall.BytePtrFromString(attr)
- if err != nil {
- return
- }
- var _p2 unsafe.Pointer
- if len(dest) > 0 {
- _p2 = unsafe.Pointer(&dest[0])
- } else {
- _p2 = unsafe.Pointer(&_zero)
- }
- r0, _, e1 := syscall.Syscall6(syscall.SYS_LGETXATTR, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(_p2), uintptr(len(dest)), 0, 0)
- use(unsafe.Pointer(_p0))
- use(unsafe.Pointer(_p1))
- sz = int(r0)
- if e1 != 0 {
- err = errnoErr(e1)
- }
- return
-}
diff --git a/components/engine/vendor/github.com/containerd/continuity/sysx/xattr_linux_ppc64.go b/components/engine/vendor/github.com/containerd/continuity/sysx/xattr_linux_ppc64.go
deleted file mode 100644
index dec46faaaf..0000000000
--- a/components/engine/vendor/github.com/containerd/continuity/sysx/xattr_linux_ppc64.go
+++ /dev/null
@@ -1,111 +0,0 @@
-// mksyscall.pl xattr_linux.go
-// MACHINE GENERATED BY THE COMMAND ABOVE; DO NOT EDIT
-
-package sysx
-
-import (
- "syscall"
- "unsafe"
-)
-
-// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
-
-func llistxattr(path string, dest []byte) (sz int, err error) {
- var _p0 *byte
- _p0, err = syscall.BytePtrFromString(path)
- if err != nil {
- return
- }
- var _p1 unsafe.Pointer
- if len(dest) > 0 {
- _p1 = unsafe.Pointer(&dest[0])
- } else {
- _p1 = unsafe.Pointer(&_zero)
- }
- r0, _, e1 := syscall.Syscall(syscall.SYS_LLISTXATTR, uintptr(unsafe.Pointer(_p0)), uintptr(_p1), uintptr(len(dest)))
- use(unsafe.Pointer(_p0))
- sz = int(r0)
- if e1 != 0 {
- err = errnoErr(e1)
- }
- return
-}
-
-// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
-
-func lremovexattr(path string, attr string) (err error) {
- var _p0 *byte
- _p0, err = syscall.BytePtrFromString(path)
- if err != nil {
- return
- }
- var _p1 *byte
- _p1, err = syscall.BytePtrFromString(attr)
- if err != nil {
- return
- }
- _, _, e1 := syscall.Syscall(syscall.SYS_LREMOVEXATTR, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), 0)
- use(unsafe.Pointer(_p0))
- use(unsafe.Pointer(_p1))
- if e1 != 0 {
- err = errnoErr(e1)
- }
- return
-}
-
-// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
-
-func lsetxattr(path string, attr string, data []byte, flags int) (err error) {
- var _p0 *byte
- _p0, err = syscall.BytePtrFromString(path)
- if err != nil {
- return
- }
- var _p1 *byte
- _p1, err = syscall.BytePtrFromString(attr)
- if err != nil {
- return
- }
- var _p2 unsafe.Pointer
- if len(data) > 0 {
- _p2 = unsafe.Pointer(&data[0])
- } else {
- _p2 = unsafe.Pointer(&_zero)
- }
- _, _, e1 := syscall.Syscall6(syscall.SYS_LSETXATTR, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(_p2), uintptr(len(data)), uintptr(flags), 0)
- use(unsafe.Pointer(_p0))
- use(unsafe.Pointer(_p1))
- if e1 != 0 {
- err = errnoErr(e1)
- }
- return
-}
-
-// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
-
-func lgetxattr(path string, attr string, dest []byte) (sz int, err error) {
- var _p0 *byte
- _p0, err = syscall.BytePtrFromString(path)
- if err != nil {
- return
- }
- var _p1 *byte
- _p1, err = syscall.BytePtrFromString(attr)
- if err != nil {
- return
- }
- var _p2 unsafe.Pointer
- if len(dest) > 0 {
- _p2 = unsafe.Pointer(&dest[0])
- } else {
- _p2 = unsafe.Pointer(&_zero)
- }
- r0, _, e1 := syscall.Syscall6(syscall.SYS_LGETXATTR, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(_p2), uintptr(len(dest)), 0, 0)
- use(unsafe.Pointer(_p0))
- use(unsafe.Pointer(_p1))
- sz = int(r0)
- if e1 != 0 {
- err = errnoErr(e1)
- }
- return
-}
diff --git a/components/engine/vendor/github.com/containerd/continuity/sysx/xattr_linux_ppc64le.go b/components/engine/vendor/github.com/containerd/continuity/sysx/xattr_linux_ppc64le.go
deleted file mode 100644
index dec46faaaf..0000000000
--- a/components/engine/vendor/github.com/containerd/continuity/sysx/xattr_linux_ppc64le.go
+++ /dev/null
@@ -1,111 +0,0 @@
-// mksyscall.pl xattr_linux.go
-// MACHINE GENERATED BY THE COMMAND ABOVE; DO NOT EDIT
-
-package sysx
-
-import (
- "syscall"
- "unsafe"
-)
-
-// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
-
-func llistxattr(path string, dest []byte) (sz int, err error) {
- var _p0 *byte
- _p0, err = syscall.BytePtrFromString(path)
- if err != nil {
- return
- }
- var _p1 unsafe.Pointer
- if len(dest) > 0 {
- _p1 = unsafe.Pointer(&dest[0])
- } else {
- _p1 = unsafe.Pointer(&_zero)
- }
- r0, _, e1 := syscall.Syscall(syscall.SYS_LLISTXATTR, uintptr(unsafe.Pointer(_p0)), uintptr(_p1), uintptr(len(dest)))
- use(unsafe.Pointer(_p0))
- sz = int(r0)
- if e1 != 0 {
- err = errnoErr(e1)
- }
- return
-}
-
-// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
-
-func lremovexattr(path string, attr string) (err error) {
- var _p0 *byte
- _p0, err = syscall.BytePtrFromString(path)
- if err != nil {
- return
- }
- var _p1 *byte
- _p1, err = syscall.BytePtrFromString(attr)
- if err != nil {
- return
- }
- _, _, e1 := syscall.Syscall(syscall.SYS_LREMOVEXATTR, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), 0)
- use(unsafe.Pointer(_p0))
- use(unsafe.Pointer(_p1))
- if e1 != 0 {
- err = errnoErr(e1)
- }
- return
-}
-
-// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
-
-func lsetxattr(path string, attr string, data []byte, flags int) (err error) {
- var _p0 *byte
- _p0, err = syscall.BytePtrFromString(path)
- if err != nil {
- return
- }
- var _p1 *byte
- _p1, err = syscall.BytePtrFromString(attr)
- if err != nil {
- return
- }
- var _p2 unsafe.Pointer
- if len(data) > 0 {
- _p2 = unsafe.Pointer(&data[0])
- } else {
- _p2 = unsafe.Pointer(&_zero)
- }
- _, _, e1 := syscall.Syscall6(syscall.SYS_LSETXATTR, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(_p2), uintptr(len(data)), uintptr(flags), 0)
- use(unsafe.Pointer(_p0))
- use(unsafe.Pointer(_p1))
- if e1 != 0 {
- err = errnoErr(e1)
- }
- return
-}
-
-// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
-
-func lgetxattr(path string, attr string, dest []byte) (sz int, err error) {
- var _p0 *byte
- _p0, err = syscall.BytePtrFromString(path)
- if err != nil {
- return
- }
- var _p1 *byte
- _p1, err = syscall.BytePtrFromString(attr)
- if err != nil {
- return
- }
- var _p2 unsafe.Pointer
- if len(dest) > 0 {
- _p2 = unsafe.Pointer(&dest[0])
- } else {
- _p2 = unsafe.Pointer(&_zero)
- }
- r0, _, e1 := syscall.Syscall6(syscall.SYS_LGETXATTR, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(_p2), uintptr(len(dest)), 0, 0)
- use(unsafe.Pointer(_p0))
- use(unsafe.Pointer(_p1))
- sz = int(r0)
- if e1 != 0 {
- err = errnoErr(e1)
- }
- return
-}
diff --git a/components/engine/vendor/github.com/containerd/continuity/sysx/xattr_linux_s390x.go b/components/engine/vendor/github.com/containerd/continuity/sysx/xattr_linux_s390x.go
deleted file mode 100644
index dec46faaaf..0000000000
--- a/components/engine/vendor/github.com/containerd/continuity/sysx/xattr_linux_s390x.go
+++ /dev/null
@@ -1,111 +0,0 @@
-// mksyscall.pl xattr_linux.go
-// MACHINE GENERATED BY THE COMMAND ABOVE; DO NOT EDIT
-
-package sysx
-
-import (
- "syscall"
- "unsafe"
-)
-
-// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
-
-func llistxattr(path string, dest []byte) (sz int, err error) {
- var _p0 *byte
- _p0, err = syscall.BytePtrFromString(path)
- if err != nil {
- return
- }
- var _p1 unsafe.Pointer
- if len(dest) > 0 {
- _p1 = unsafe.Pointer(&dest[0])
- } else {
- _p1 = unsafe.Pointer(&_zero)
- }
- r0, _, e1 := syscall.Syscall(syscall.SYS_LLISTXATTR, uintptr(unsafe.Pointer(_p0)), uintptr(_p1), uintptr(len(dest)))
- use(unsafe.Pointer(_p0))
- sz = int(r0)
- if e1 != 0 {
- err = errnoErr(e1)
- }
- return
-}
-
-// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
-
-func lremovexattr(path string, attr string) (err error) {
- var _p0 *byte
- _p0, err = syscall.BytePtrFromString(path)
- if err != nil {
- return
- }
- var _p1 *byte
- _p1, err = syscall.BytePtrFromString(attr)
- if err != nil {
- return
- }
- _, _, e1 := syscall.Syscall(syscall.SYS_LREMOVEXATTR, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), 0)
- use(unsafe.Pointer(_p0))
- use(unsafe.Pointer(_p1))
- if e1 != 0 {
- err = errnoErr(e1)
- }
- return
-}
-
-// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
-
-func lsetxattr(path string, attr string, data []byte, flags int) (err error) {
- var _p0 *byte
- _p0, err = syscall.BytePtrFromString(path)
- if err != nil {
- return
- }
- var _p1 *byte
- _p1, err = syscall.BytePtrFromString(attr)
- if err != nil {
- return
- }
- var _p2 unsafe.Pointer
- if len(data) > 0 {
- _p2 = unsafe.Pointer(&data[0])
- } else {
- _p2 = unsafe.Pointer(&_zero)
- }
- _, _, e1 := syscall.Syscall6(syscall.SYS_LSETXATTR, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(_p2), uintptr(len(data)), uintptr(flags), 0)
- use(unsafe.Pointer(_p0))
- use(unsafe.Pointer(_p1))
- if e1 != 0 {
- err = errnoErr(e1)
- }
- return
-}
-
-// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
-
-func lgetxattr(path string, attr string, dest []byte) (sz int, err error) {
- var _p0 *byte
- _p0, err = syscall.BytePtrFromString(path)
- if err != nil {
- return
- }
- var _p1 *byte
- _p1, err = syscall.BytePtrFromString(attr)
- if err != nil {
- return
- }
- var _p2 unsafe.Pointer
- if len(dest) > 0 {
- _p2 = unsafe.Pointer(&dest[0])
- } else {
- _p2 = unsafe.Pointer(&_zero)
- }
- r0, _, e1 := syscall.Syscall6(syscall.SYS_LGETXATTR, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(_p2), uintptr(len(dest)), 0, 0)
- use(unsafe.Pointer(_p0))
- use(unsafe.Pointer(_p1))
- sz = int(r0)
- if e1 != 0 {
- err = errnoErr(e1)
- }
- return
-}
diff --git a/components/engine/vendor/github.com/coreos/go-systemd/NOTICE b/components/engine/vendor/github.com/coreos/go-systemd/NOTICE
new file mode 100644
index 0000000000..23a0ada2fb
--- /dev/null
+++ b/components/engine/vendor/github.com/coreos/go-systemd/NOTICE
@@ -0,0 +1,5 @@
+CoreOS Project
+Copyright 2018 CoreOS, Inc
+
+This product includes software developed at CoreOS, Inc.
+(http://www.coreos.com/).
diff --git a/components/engine/vendor/github.com/coreos/go-systemd/README.md b/components/engine/vendor/github.com/coreos/go-systemd/README.md
index cb87a11245..cad04a8035 100644
--- a/components/engine/vendor/github.com/coreos/go-systemd/README.md
+++ b/components/engine/vendor/github.com/coreos/go-systemd/README.md
@@ -6,9 +6,11 @@
Go bindings to systemd. The project has several packages:
- `activation` - for writing and using socket activation from Go
+- `daemon` - for notifying systemd of service status changes
- `dbus` - for starting/stopping/inspecting running services and units
- `journal` - for writing to systemd's logging service, journald
- `sdjournal` - for reading from journald by wrapping its C API
+- `login1` - for integration with the systemd logind API
- `machine1` - for registering machines/containers with systemd
- `unit` - for (de)serialization and comparison of unit files
@@ -18,10 +20,9 @@ An example HTTP server using socket activation can be quickly set up by followin
https://github.com/coreos/go-systemd/tree/master/examples/activation/httpserver
-## Journal
+## systemd Service Notification
-Using the pure-Go `journal` package you can submit journal entries directly to systemd's journal, taking advantage of features like indexed key/value pairs for each log entry.
-The `sdjournal` package provides read access to the journal by wrapping around journald's native C API; consequently it requires cgo and the journal headers to be available.
+The `daemon` package is an implementation of the [sd_notify protocol](https://www.freedesktop.org/software/systemd/man/sd_notify.html#Description). It can be used to inform systemd of service start-up completion, watchdog events, and other status changes.
## D-Bus
@@ -45,6 +46,20 @@ Create `/etc/dbus-1/system-local.conf` that looks like this:
```
+## Journal
+
+### Writing to the Journal
+
+Using the pure-Go `journal` package you can submit journal entries directly to systemd's journal, taking advantage of features like indexed key/value pairs for each log entry.
+
+### Reading from the Journal
+
+The `sdjournal` package provides read access to the journal by wrapping around journald's native C API; consequently it requires cgo and the journal headers to be available.
+
+## logind
+
+The `login1` package provides functions to integrate with the [systemd logind API](http://www.freedesktop.org/wiki/Software/systemd/logind/).
+
## machined
The `machine1` package allows interaction with the [systemd machined D-Bus API](http://www.freedesktop.org/wiki/Software/systemd/machined/).
diff --git a/components/engine/vendor/github.com/coreos/go-systemd/activation/files.go b/components/engine/vendor/github.com/coreos/go-systemd/activation/files.go
index c8e85fcd58..29dd18defa 100644
--- a/components/engine/vendor/github.com/coreos/go-systemd/activation/files.go
+++ b/components/engine/vendor/github.com/coreos/go-systemd/activation/files.go
@@ -18,18 +18,26 @@ package activation
import (
"os"
"strconv"
+ "strings"
"syscall"
)
-// based on: https://gist.github.com/alberts/4640792
const (
+ // listenFdsStart corresponds to `SD_LISTEN_FDS_START`.
listenFdsStart = 3
)
+// Files returns a slice containing a `os.File` object for each
+// file descriptor passed to this process via systemd fd-passing protocol.
+//
+// The order of the file descriptors is preserved in the returned slice.
+// `unsetEnv` is typically set to `true` in order to avoid clashes in
+// fd usage and to avoid leaking environment flags to child processes.
func Files(unsetEnv bool) []*os.File {
if unsetEnv {
defer os.Unsetenv("LISTEN_PID")
defer os.Unsetenv("LISTEN_FDS")
+ defer os.Unsetenv("LISTEN_FDNAMES")
}
pid, err := strconv.Atoi(os.Getenv("LISTEN_PID"))
@@ -42,10 +50,17 @@ func Files(unsetEnv bool) []*os.File {
return nil
}
+ names := strings.Split(os.Getenv("LISTEN_FDNAMES"), ":")
+
files := make([]*os.File, 0, nfds)
for fd := listenFdsStart; fd < listenFdsStart+nfds; fd++ {
syscall.CloseOnExec(fd)
- files = append(files, os.NewFile(uintptr(fd), "LISTEN_FD_"+strconv.Itoa(fd)))
+ name := "LISTEN_FD_" + strconv.Itoa(fd)
+ offset := fd - listenFdsStart
+ if offset < len(names) && len(names[offset]) > 0 {
+ name = names[offset]
+ }
+ files = append(files, os.NewFile(uintptr(fd), name))
}
return files
diff --git a/components/engine/vendor/github.com/coreos/go-systemd/activation/listeners.go b/components/engine/vendor/github.com/coreos/go-systemd/activation/listeners.go
index fd5dfc709c..bb5cc2311e 100644
--- a/components/engine/vendor/github.com/coreos/go-systemd/activation/listeners.go
+++ b/components/engine/vendor/github.com/coreos/go-systemd/activation/listeners.go
@@ -25,13 +25,33 @@ import (
// The order of the file descriptors is preserved in the returned slice.
// Nil values are used to fill any gaps. For example if systemd were to return file descriptors
// corresponding with "udp, tcp, tcp", then the slice would contain {nil, net.Listener, net.Listener}
-func Listeners(unsetEnv bool) ([]net.Listener, error) {
- files := Files(unsetEnv)
+func Listeners() ([]net.Listener, error) {
+ files := Files(true)
listeners := make([]net.Listener, len(files))
for i, f := range files {
if pc, err := net.FileListener(f); err == nil {
listeners[i] = pc
+ f.Close()
+ }
+ }
+ return listeners, nil
+}
+
+// ListenersWithNames maps a listener name to a set of net.Listener instances.
+func ListenersWithNames() (map[string][]net.Listener, error) {
+ files := Files(true)
+ listeners := map[string][]net.Listener{}
+
+ for _, f := range files {
+ if pc, err := net.FileListener(f); err == nil {
+ current, ok := listeners[f.Name()]
+ if !ok {
+ listeners[f.Name()] = []net.Listener{pc}
+ } else {
+ listeners[f.Name()] = append(current, pc)
+ }
+ f.Close()
}
}
return listeners, nil
@@ -40,8 +60,8 @@ func Listeners(unsetEnv bool) ([]net.Listener, error) {
// TLSListeners returns a slice containing a net.listener for each matching TCP socket type
// passed to this process.
// It uses default Listeners func and forces TCP sockets handlers to use TLS based on tlsConfig.
-func TLSListeners(unsetEnv bool, tlsConfig *tls.Config) ([]net.Listener, error) {
- listeners, err := Listeners(unsetEnv)
+func TLSListeners(tlsConfig *tls.Config) ([]net.Listener, error) {
+ listeners, err := Listeners()
if listeners == nil || err != nil {
return nil, err
@@ -58,3 +78,26 @@ func TLSListeners(unsetEnv bool, tlsConfig *tls.Config) ([]net.Listener, error)
return listeners, err
}
+
+// TLSListenersWithNames maps a listener name to a net.Listener with
+// the associated TLS configuration.
+func TLSListenersWithNames(tlsConfig *tls.Config) (map[string][]net.Listener, error) {
+ listeners, err := ListenersWithNames()
+
+ if listeners == nil || err != nil {
+ return nil, err
+ }
+
+ if tlsConfig != nil && err == nil {
+ for _, ll := range listeners {
+ // Activate TLS only for TCP sockets
+ for i, l := range ll {
+ if l.Addr().Network() == "tcp" {
+ ll[i] = tls.NewListener(l, tlsConfig)
+ }
+ }
+ }
+ }
+
+ return listeners, err
+}
diff --git a/components/engine/vendor/github.com/coreos/go-systemd/activation/packetconns.go b/components/engine/vendor/github.com/coreos/go-systemd/activation/packetconns.go
index 48b2ca029d..a97206785a 100644
--- a/components/engine/vendor/github.com/coreos/go-systemd/activation/packetconns.go
+++ b/components/engine/vendor/github.com/coreos/go-systemd/activation/packetconns.go
@@ -24,13 +24,14 @@ import (
// The order of the file descriptors is preserved in the returned slice.
// Nil values are used to fill any gaps. For example if systemd were to return file descriptors
// corresponding with "udp, tcp, udp", then the slice would contain {net.PacketConn, nil, net.PacketConn}
-func PacketConns(unsetEnv bool) ([]net.PacketConn, error) {
- files := Files(unsetEnv)
+func PacketConns() ([]net.PacketConn, error) {
+ files := Files(true)
conns := make([]net.PacketConn, len(files))
for i, f := range files {
if pc, err := net.FilePacketConn(f); err == nil {
conns[i] = pc
+ f.Close()
}
}
return conns, nil
diff --git a/components/engine/vendor/github.com/coreos/go-systemd/daemon/sdnotify.go b/components/engine/vendor/github.com/coreos/go-systemd/daemon/sdnotify.go
index ba6d41d85b..ba4ae31f19 100644
--- a/components/engine/vendor/github.com/coreos/go-systemd/daemon/sdnotify.go
+++ b/components/engine/vendor/github.com/coreos/go-systemd/daemon/sdnotify.go
@@ -1,4 +1,5 @@
// Copyright 2014 Docker, Inc.
+// Copyright 2015-2018 CoreOS, Inc.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
@@ -13,7 +14,11 @@
// limitations under the License.
//
-// Code forked from Docker project
+// Package daemon provides a Go implementation of the sd_notify protocol.
+// It can be used to inform systemd of service start-up completion, watchdog
+// events, and other status changes.
+//
+// https://www.freedesktop.org/software/systemd/man/sd_notify.html#Description
package daemon
import (
@@ -21,6 +26,25 @@ import (
"os"
)
+const (
+ // SdNotifyReady tells the service manager that service startup is finished
+ // or the service finished loading its configuration.
+ SdNotifyReady = "READY=1"
+
+ // SdNotifyStopping tells the service manager that the service is beginning
+ // its shutdown.
+ SdNotifyStopping = "STOPPING=1"
+
+ // SdNotifyReloading tells the service manager that this service is
+ // reloading its configuration. Note that you must call SdNotifyReady when
+ // it completed reloading.
+ SdNotifyReloading = "RELOADING=1"
+
+ // SdNotifyWatchdog tells the service manager to update the watchdog
+ // timestamp for the service.
+ SdNotifyWatchdog = "WATCHDOG=1"
+)
+
// SdNotify sends a message to the init daemon. It is common to ignore the error.
// If `unsetEnvironment` is true, the environment variable `NOTIFY_SOCKET`
// will be unconditionally unset.
@@ -29,7 +53,7 @@ import (
// (false, nil) - notification not supported (i.e. NOTIFY_SOCKET is unset)
// (false, err) - notification supported, but failure happened (e.g. error connecting to NOTIFY_SOCKET or while sending data)
// (true, nil) - notification supported, data has been sent
-func SdNotify(unsetEnvironment bool, state string) (sent bool, err error) {
+func SdNotify(unsetEnvironment bool, state string) (bool, error) {
socketAddr := &net.UnixAddr{
Name: os.Getenv("NOTIFY_SOCKET"),
Net: "unixgram",
@@ -41,10 +65,9 @@ func SdNotify(unsetEnvironment bool, state string) (sent bool, err error) {
}
if unsetEnvironment {
- err = os.Unsetenv("NOTIFY_SOCKET")
- }
- if err != nil {
- return false, err
+ if err := os.Unsetenv("NOTIFY_SOCKET"); err != nil {
+ return false, err
+ }
}
conn, err := net.DialUnix(socketAddr.Net, nil, socketAddr)
@@ -54,9 +77,7 @@ func SdNotify(unsetEnvironment bool, state string) (sent bool, err error) {
}
defer conn.Close()
- _, err = conn.Write([]byte(state))
- // Error sending the message
- if err != nil {
+ if _, err = conn.Write([]byte(state)); err != nil {
return false, err
}
return true, nil
diff --git a/components/engine/vendor/github.com/coreos/go-systemd/daemon/watchdog.go b/components/engine/vendor/github.com/coreos/go-systemd/daemon/watchdog.go
index 35a92e6e67..7a0e0d3a51 100644
--- a/components/engine/vendor/github.com/coreos/go-systemd/daemon/watchdog.go
+++ b/components/engine/vendor/github.com/coreos/go-systemd/daemon/watchdog.go
@@ -21,10 +21,11 @@ import (
"time"
)
-// SdWatchdogEnabled return watchdog information for a service.
-// Process should send daemon.SdNotify("WATCHDOG=1") every time / 2.
-// If `unsetEnvironment` is true, the environment variables `WATCHDOG_USEC`
-// and `WATCHDOG_PID` will be unconditionally unset.
+// SdWatchdogEnabled returns watchdog information for a service.
+// Processes should call daemon.SdNotify(false, daemon.SdNotifyWatchdog) every
+// time / 2.
+// If `unsetEnvironment` is true, the environment variables `WATCHDOG_USEC` and
+// `WATCHDOG_PID` will be unconditionally unset.
//
// It returns one of the following:
// (0, nil) - watchdog isn't enabled or we aren't the watched PID.
diff --git a/components/engine/vendor/github.com/coreos/go-systemd/dbus/dbus.go b/components/engine/vendor/github.com/coreos/go-systemd/dbus/dbus.go
index c1694fb522..1d54810aff 100644
--- a/components/engine/vendor/github.com/coreos/go-systemd/dbus/dbus.go
+++ b/components/engine/vendor/github.com/coreos/go-systemd/dbus/dbus.go
@@ -16,6 +16,7 @@
package dbus
import (
+ "encoding/hex"
"fmt"
"os"
"strconv"
@@ -60,6 +61,27 @@ func PathBusEscape(path string) string {
return string(n)
}
+// pathBusUnescape is the inverse of PathBusEscape.
+func pathBusUnescape(path string) string {
+ if path == "_" {
+ return ""
+ }
+ n := []byte{}
+ for i := 0; i < len(path); i++ {
+ c := path[i]
+ if c == '_' && i+2 < len(path) {
+ res, err := hex.DecodeString(path[i+1 : i+3])
+ if err == nil {
+ n = append(n, res...)
+ }
+ i += 2
+ } else {
+ n = append(n, c)
+ }
+ }
+ return string(n)
+}
+
// Conn is a connection to systemd's dbus endpoint.
type Conn struct {
// sysconn/sysobj are only used to call dbus methods
@@ -74,13 +96,18 @@ type Conn struct {
jobs map[dbus.ObjectPath]chan<- string
sync.Mutex
}
- subscriber struct {
+ subStateSubscriber struct {
updateCh chan<- *SubStateUpdate
errCh chan<- error
sync.Mutex
ignore map[dbus.ObjectPath]int64
cleanIgnore int64
}
+ propertiesSubscriber struct {
+ updateCh chan<- *PropertiesUpdate
+ errCh chan<- error
+ sync.Mutex
+ }
}
// New establishes a connection to any available bus and authenticates.
@@ -152,7 +179,7 @@ func NewConnection(dialBus func() (*dbus.Conn, error)) (*Conn, error) {
sigobj: systemdObject(sigconn),
}
- c.subscriber.ignore = make(map[dbus.ObjectPath]int64)
+ c.subStateSubscriber.ignore = make(map[dbus.ObjectPath]int64)
c.jobListener.jobs = make(map[dbus.ObjectPath]chan<- string)
// Setup the listeners on jobs so that we can get completions
diff --git a/components/engine/vendor/github.com/coreos/go-systemd/dbus/methods.go b/components/engine/vendor/github.com/coreos/go-systemd/dbus/methods.go
index ab17f7cc75..0b4207229f 100644
--- a/components/engine/vendor/github.com/coreos/go-systemd/dbus/methods.go
+++ b/components/engine/vendor/github.com/coreos/go-systemd/dbus/methods.go
@@ -1,4 +1,4 @@
-// Copyright 2015 CoreOS, Inc.
+// Copyright 2015, 2018 CoreOS, Inc.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
@@ -16,6 +16,7 @@ package dbus
import (
"errors"
+ "fmt"
"path"
"strconv"
@@ -148,14 +149,27 @@ func (c *Conn) ResetFailedUnit(name string) error {
return c.sysobj.Call("org.freedesktop.systemd1.Manager.ResetFailedUnit", 0, name).Store()
}
-// getProperties takes the unit name and returns all of its dbus object properties, for the given dbus interface
-func (c *Conn) getProperties(unit string, dbusInterface string) (map[string]interface{}, error) {
+// SystemState returns the systemd state. Equivalent to `systemctl is-system-running`.
+func (c *Conn) SystemState() (*Property, error) {
+ var err error
+ var prop dbus.Variant
+
+ obj := c.sysconn.Object("org.freedesktop.systemd1", "/org/freedesktop/systemd1")
+ err = obj.Call("org.freedesktop.DBus.Properties.Get", 0, "org.freedesktop.systemd1.Manager", "SystemState").Store(&prop)
+ if err != nil {
+ return nil, err
+ }
+
+ return &Property{Name: "SystemState", Value: prop}, nil
+}
+
+// getProperties takes the unit path and returns all of its dbus object properties, for the given dbus interface
+func (c *Conn) getProperties(path dbus.ObjectPath, dbusInterface string) (map[string]interface{}, error) {
var err error
var props map[string]dbus.Variant
- path := unitPath(unit)
if !path.IsValid() {
- return nil, errors.New("invalid unit name: " + unit)
+ return nil, fmt.Errorf("invalid unit name: %v", path)
}
obj := c.sysconn.Object("org.freedesktop.systemd1", path)
@@ -172,9 +186,15 @@ func (c *Conn) getProperties(unit string, dbusInterface string) (map[string]inte
return out, nil
}
-// GetUnitProperties takes the unit name and returns all of its dbus object properties.
+// GetUnitProperties takes the (unescaped) unit name and returns all of its dbus object properties.
func (c *Conn) GetUnitProperties(unit string) (map[string]interface{}, error) {
- return c.getProperties(unit, "org.freedesktop.systemd1.Unit")
+ path := unitPath(unit)
+ return c.getProperties(path, "org.freedesktop.systemd1.Unit")
+}
+
+// GetUnitProperties takes the (escaped) unit path and returns all of its dbus object properties.
+func (c *Conn) GetUnitPathProperties(path dbus.ObjectPath) (map[string]interface{}, error) {
+ return c.getProperties(path, "org.freedesktop.systemd1.Unit")
}
func (c *Conn) getProperty(unit string, dbusInterface string, propertyName string) (*Property, error) {
@@ -208,7 +228,8 @@ func (c *Conn) GetServiceProperty(service string, propertyName string) (*Propert
// Valid values for unitType: Service, Socket, Target, Device, Mount, Automount, Snapshot, Timer, Swap, Path, Slice, Scope
// return "dbus.Error: Unknown interface" if the unitType is not the correct type of the unit
func (c *Conn) GetUnitTypeProperties(unit string, unitType string) (map[string]interface{}, error) {
- return c.getProperties(unit, "org.freedesktop.systemd1."+unitType)
+ path := unitPath(unit)
+ return c.getProperties(path, "org.freedesktop.systemd1."+unitType)
}
// SetUnitProperties() may be used to modify certain unit properties at runtime.
@@ -292,6 +313,7 @@ func (c *Conn) ListUnitsByPatterns(states []string, patterns []string) ([]UnitSt
// names and returns an UnitStatus array. Comparing to ListUnitsByPatterns
// method, this method returns statuses even for inactive or non-existing
// units. Input array should contain exact unit names, but not patterns.
+// Note: Requires systemd v230 or higher
func (c *Conn) ListUnitsByNames(units []string) ([]UnitStatus, error) {
return c.listUnitsInternal(c.sysobj.Call("org.freedesktop.systemd1.Manager.ListUnitsByNames", 0, units).Store)
}
@@ -563,3 +585,8 @@ func (c *Conn) Reload() error {
func unitPath(name string) dbus.ObjectPath {
return dbus.ObjectPath("/org/freedesktop/systemd1/unit/" + PathBusEscape(name))
}
+
+// unitName returns the unescaped base element of the supplied escaped path
+func unitName(dpath dbus.ObjectPath) string {
+ return pathBusUnescape(path.Base(string(dpath)))
+}
diff --git a/components/engine/vendor/github.com/coreos/go-systemd/dbus/set.go b/components/engine/vendor/github.com/coreos/go-systemd/dbus/set.go
index f92e6fbed1..17c5d48565 100644
--- a/components/engine/vendor/github.com/coreos/go-systemd/dbus/set.go
+++ b/components/engine/vendor/github.com/coreos/go-systemd/dbus/set.go
@@ -36,7 +36,7 @@ func (s *set) Length() int {
}
func (s *set) Values() (values []string) {
- for val, _ := range s.data {
+ for val := range s.data {
values = append(values, val)
}
return
diff --git a/components/engine/vendor/github.com/coreos/go-systemd/dbus/subscription.go b/components/engine/vendor/github.com/coreos/go-systemd/dbus/subscription.go
index 996451445c..70e63a6f16 100644
--- a/components/engine/vendor/github.com/coreos/go-systemd/dbus/subscription.go
+++ b/components/engine/vendor/github.com/coreos/go-systemd/dbus/subscription.go
@@ -16,6 +16,7 @@ package dbus
import (
"errors"
+ "log"
"time"
"github.com/godbus/dbus"
@@ -36,22 +37,12 @@ func (c *Conn) Subscribe() error {
c.sigconn.BusObject().Call("org.freedesktop.DBus.AddMatch", 0,
"type='signal',interface='org.freedesktop.DBus.Properties',member='PropertiesChanged'")
- err := c.sigobj.Call("org.freedesktop.systemd1.Manager.Subscribe", 0).Store()
- if err != nil {
- return err
- }
-
- return nil
+ return c.sigobj.Call("org.freedesktop.systemd1.Manager.Subscribe", 0).Store()
}
// Unsubscribe this connection from systemd dbus events.
func (c *Conn) Unsubscribe() error {
- err := c.sigobj.Call("org.freedesktop.systemd1.Manager.Unsubscribe", 0).Store()
- if err != nil {
- return err
- }
-
- return nil
+ return c.sigobj.Call("org.freedesktop.systemd1.Manager.Unsubscribe", 0).Store()
}
func (c *Conn) dispatch() {
@@ -70,7 +61,8 @@ func (c *Conn) dispatch() {
c.jobComplete(signal)
}
- if c.subscriber.updateCh == nil {
+ if c.subStateSubscriber.updateCh == nil &&
+ c.propertiesSubscriber.updateCh == nil {
continue
}
@@ -84,6 +76,12 @@ func (c *Conn) dispatch() {
case "org.freedesktop.DBus.Properties.PropertiesChanged":
if signal.Body[0].(string) == "org.freedesktop.systemd1.Unit" {
unitPath = signal.Path
+
+ if len(signal.Body) >= 2 {
+ if changed, ok := signal.Body[1].(map[string]dbus.Variant); ok {
+ c.sendPropertiesUpdate(unitPath, changed)
+ }
+ }
}
}
@@ -169,42 +167,80 @@ type SubStateUpdate struct {
// is full, it attempts to write an error to errCh; if errCh is full, the error
// passes silently.
func (c *Conn) SetSubStateSubscriber(updateCh chan<- *SubStateUpdate, errCh chan<- error) {
- c.subscriber.Lock()
- defer c.subscriber.Unlock()
- c.subscriber.updateCh = updateCh
- c.subscriber.errCh = errCh
-}
-
-func (c *Conn) sendSubStateUpdate(path dbus.ObjectPath) {
- c.subscriber.Lock()
- defer c.subscriber.Unlock()
-
- if c.shouldIgnore(path) {
+ if c == nil {
+ msg := "nil receiver"
+ select {
+ case errCh <- errors.New(msg):
+ default:
+ log.Printf("full error channel while reporting: %s\n", msg)
+ }
return
}
- info, err := c.GetUnitProperties(string(path))
- if err != nil {
- select {
- case c.subscriber.errCh <- err:
- default:
- }
+ c.subStateSubscriber.Lock()
+ defer c.subStateSubscriber.Unlock()
+ c.subStateSubscriber.updateCh = updateCh
+ c.subStateSubscriber.errCh = errCh
+}
+
+func (c *Conn) sendSubStateUpdate(unitPath dbus.ObjectPath) {
+ c.subStateSubscriber.Lock()
+ defer c.subStateSubscriber.Unlock()
+
+ if c.subStateSubscriber.updateCh == nil {
+ return
}
- name := info["Id"].(string)
- substate := info["SubState"].(string)
+ isIgnored := c.shouldIgnore(unitPath)
+ defer c.cleanIgnore()
+ if isIgnored {
+ return
+ }
+
+ info, err := c.GetUnitPathProperties(unitPath)
+ if err != nil {
+ select {
+ case c.subStateSubscriber.errCh <- err:
+ default:
+ log.Printf("full error channel while reporting: %s\n", err)
+ }
+ return
+ }
+ defer c.updateIgnore(unitPath, info)
+
+ name, ok := info["Id"].(string)
+ if !ok {
+ msg := "failed to cast info.Id"
+ select {
+ case c.subStateSubscriber.errCh <- errors.New(msg):
+ default:
+ log.Printf("full error channel while reporting: %s\n", err)
+ }
+ return
+ }
+ substate, ok := info["SubState"].(string)
+ if !ok {
+ msg := "failed to cast info.SubState"
+ select {
+ case c.subStateSubscriber.errCh <- errors.New(msg):
+ default:
+ log.Printf("full error channel while reporting: %s\n", msg)
+ }
+ return
+ }
update := &SubStateUpdate{name, substate}
select {
- case c.subscriber.updateCh <- update:
+ case c.subStateSubscriber.updateCh <- update:
default:
+ msg := "update channel is full"
select {
- case c.subscriber.errCh <- errors.New("update channel full!"):
+ case c.subStateSubscriber.errCh <- errors.New(msg):
default:
+ log.Printf("full error channel while reporting: %s\n", msg)
}
+ return
}
-
- c.updateIgnore(path, info)
}
// The ignore functions work around a wart in the systemd dbus interface.
@@ -222,29 +258,76 @@ func (c *Conn) sendSubStateUpdate(path dbus.ObjectPath) {
// the properties).
func (c *Conn) shouldIgnore(path dbus.ObjectPath) bool {
- t, ok := c.subscriber.ignore[path]
+ t, ok := c.subStateSubscriber.ignore[path]
return ok && t >= time.Now().UnixNano()
}
func (c *Conn) updateIgnore(path dbus.ObjectPath, info map[string]interface{}) {
- c.cleanIgnore()
+ loadState, ok := info["LoadState"].(string)
+ if !ok {
+ return
+ }
// unit is unloaded - it will trigger bad systemd dbus behavior
- if info["LoadState"].(string) == "not-found" {
- c.subscriber.ignore[path] = time.Now().UnixNano() + ignoreInterval
+ if loadState == "not-found" {
+ c.subStateSubscriber.ignore[path] = time.Now().UnixNano() + ignoreInterval
}
}
// without this, ignore would grow unboundedly over time
func (c *Conn) cleanIgnore() {
now := time.Now().UnixNano()
- if c.subscriber.cleanIgnore < now {
- c.subscriber.cleanIgnore = now + cleanIgnoreInterval
+ if c.subStateSubscriber.cleanIgnore < now {
+ c.subStateSubscriber.cleanIgnore = now + cleanIgnoreInterval
- for p, t := range c.subscriber.ignore {
+ for p, t := range c.subStateSubscriber.ignore {
if t < now {
- delete(c.subscriber.ignore, p)
+ delete(c.subStateSubscriber.ignore, p)
}
}
}
}
+
+// PropertiesUpdate holds a map of a unit's changed properties
+type PropertiesUpdate struct {
+ UnitName string
+ Changed map[string]dbus.Variant
+}
+
+// SetPropertiesSubscriber writes to updateCh when any unit's properties
+// change. Every property change reported by systemd will be sent; that is, no
+// transitions will be "missed" (as they might be with SetSubStateSubscriber).
+// However, state changes will only be written to the channel with non-blocking
+// writes. If updateCh is full, it attempts to write an error to errCh; if
+// errCh is full, the error passes silently.
+func (c *Conn) SetPropertiesSubscriber(updateCh chan<- *PropertiesUpdate, errCh chan<- error) {
+ c.propertiesSubscriber.Lock()
+ defer c.propertiesSubscriber.Unlock()
+ c.propertiesSubscriber.updateCh = updateCh
+ c.propertiesSubscriber.errCh = errCh
+}
+
+// we don't need to worry about shouldIgnore() here because
+// sendPropertiesUpdate doesn't call GetProperties()
+func (c *Conn) sendPropertiesUpdate(unitPath dbus.ObjectPath, changedProps map[string]dbus.Variant) {
+ c.propertiesSubscriber.Lock()
+ defer c.propertiesSubscriber.Unlock()
+
+ if c.propertiesSubscriber.updateCh == nil {
+ return
+ }
+
+ update := &PropertiesUpdate{unitName(unitPath), changedProps}
+
+ select {
+ case c.propertiesSubscriber.updateCh <- update:
+ default:
+ msg := "update channel is full"
+ select {
+ case c.propertiesSubscriber.errCh <- errors.New(msg):
+ default:
+ log.Printf("full error channel while reporting: %s\n", msg)
+ }
+ return
+ }
+}
diff --git a/components/engine/vendor/github.com/coreos/go-systemd/journal/journal.go b/components/engine/vendor/github.com/coreos/go-systemd/journal/journal.go
index 7f434990d2..ef85a3ba24 100644
--- a/components/engine/vendor/github.com/coreos/go-systemd/journal/journal.go
+++ b/components/engine/vendor/github.com/coreos/go-systemd/journal/journal.go
@@ -103,7 +103,10 @@ func Send(message string, priority Priority, vars map[string]string) error {
if !ok {
return journalError("can't send file through non-Unix connection")
}
- unixConn.WriteMsgUnix([]byte{}, rights, nil)
+ _, _, err = unixConn.WriteMsgUnix([]byte{}, rights, nil)
+ if err != nil {
+ return journalError(err.Error())
+ }
} else if err != nil {
return journalError(err.Error())
}
@@ -165,7 +168,7 @@ func tempFd() (*os.File, error) {
if err != nil {
return nil, err
}
- syscall.Unlink(file.Name())
+ err = syscall.Unlink(file.Name())
if err != nil {
return nil, err
}
diff --git a/components/engine/volume/local/local.go b/components/engine/volume/local/local.go
index b1eb2881b4..d97347423a 100644
--- a/components/engine/volume/local/local.go
+++ b/components/engine/volume/local/local.go
@@ -370,7 +370,7 @@ func getAddress(opts string) string {
optsList := strings.Split(opts, ",")
for i := 0; i < len(optsList); i++ {
if strings.HasPrefix(optsList[i], "addr=") {
- addr := (strings.SplitN(optsList[i], "=", 2)[1])
+ addr := strings.SplitN(optsList[i], "=", 2)[1]
return addr
}
}