Merge pull request #31709 from dnephin/better-errors
Replace fmt.Errorf() with errors.Errorf() in the cli
This commit is contained in:
commit
99aaf6b923
98 changed files with 374 additions and 340 deletions
|
@ -5,6 +5,7 @@ import (
|
||||||
"strings"
|
"strings"
|
||||||
|
|
||||||
"github.com/docker/docker/pkg/term"
|
"github.com/docker/docker/pkg/term"
|
||||||
|
"github.com/pkg/errors"
|
||||||
"github.com/spf13/cobra"
|
"github.com/spf13/cobra"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
@ -51,7 +52,7 @@ var helpCommand = &cobra.Command{
|
||||||
RunE: func(c *cobra.Command, args []string) error {
|
RunE: func(c *cobra.Command, args []string) error {
|
||||||
cmd, args, e := c.Root().Find(args)
|
cmd, args, e := c.Root().Find(args)
|
||||||
if cmd == nil || e != nil || len(args) > 0 {
|
if cmd == nil || e != nil || len(args) > 0 {
|
||||||
return fmt.Errorf("unknown help topic: %v", strings.Join(args, " "))
|
return errors.Errorf("unknown help topic: %v", strings.Join(args, " "))
|
||||||
}
|
}
|
||||||
|
|
||||||
helpFunc := cmd.HelpFunc()
|
helpFunc := cmd.HelpFunc()
|
||||||
|
|
|
@ -2,8 +2,9 @@ package bundlefile
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"encoding/json"
|
"encoding/json"
|
||||||
"fmt"
|
|
||||||
"io"
|
"io"
|
||||||
|
|
||||||
|
"github.com/pkg/errors"
|
||||||
)
|
)
|
||||||
|
|
||||||
// Bundlefile stores the contents of a bundlefile
|
// Bundlefile stores the contents of a bundlefile
|
||||||
|
@ -39,12 +40,12 @@ func LoadFile(reader io.Reader) (*Bundlefile, error) {
|
||||||
if err := decoder.Decode(bundlefile); err != nil {
|
if err := decoder.Decode(bundlefile); err != nil {
|
||||||
switch jsonErr := err.(type) {
|
switch jsonErr := err.(type) {
|
||||||
case *json.SyntaxError:
|
case *json.SyntaxError:
|
||||||
return nil, fmt.Errorf(
|
return nil, errors.Errorf(
|
||||||
"JSON syntax error at byte %v: %s",
|
"JSON syntax error at byte %v: %s",
|
||||||
jsonErr.Offset,
|
jsonErr.Offset,
|
||||||
jsonErr.Error())
|
jsonErr.Error())
|
||||||
case *json.UnmarshalTypeError:
|
case *json.UnmarshalTypeError:
|
||||||
return nil, fmt.Errorf(
|
return nil, errors.Errorf(
|
||||||
"Unexpected type at byte %v. Expected %s but received %s.",
|
"Unexpected type at byte %v. Expected %s but received %s.",
|
||||||
jsonErr.Offset,
|
jsonErr.Offset,
|
||||||
jsonErr.Type,
|
jsonErr.Type,
|
||||||
|
|
|
@ -1,7 +1,6 @@
|
||||||
package command
|
package command
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"errors"
|
|
||||||
"fmt"
|
"fmt"
|
||||||
"io"
|
"io"
|
||||||
"net/http"
|
"net/http"
|
||||||
|
@ -21,6 +20,7 @@ import (
|
||||||
dopts "github.com/docker/docker/opts"
|
dopts "github.com/docker/docker/opts"
|
||||||
"github.com/docker/go-connections/sockets"
|
"github.com/docker/go-connections/sockets"
|
||||||
"github.com/docker/go-connections/tlsconfig"
|
"github.com/docker/go-connections/tlsconfig"
|
||||||
|
"github.com/pkg/errors"
|
||||||
"github.com/spf13/cobra"
|
"github.com/spf13/cobra"
|
||||||
"golang.org/x/net/context"
|
"golang.org/x/net/context"
|
||||||
)
|
)
|
||||||
|
|
|
@ -1,7 +1,6 @@
|
||||||
package container
|
package container
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"errors"
|
|
||||||
"io"
|
"io"
|
||||||
"net/http/httputil"
|
"net/http/httputil"
|
||||||
|
|
||||||
|
@ -10,6 +9,7 @@ import (
|
||||||
"github.com/docker/docker/cli"
|
"github.com/docker/docker/cli"
|
||||||
"github.com/docker/docker/cli/command"
|
"github.com/docker/docker/cli/command"
|
||||||
"github.com/docker/docker/pkg/signal"
|
"github.com/docker/docker/pkg/signal"
|
||||||
|
"github.com/pkg/errors"
|
||||||
"github.com/spf13/cobra"
|
"github.com/spf13/cobra"
|
||||||
"golang.org/x/net/context"
|
"golang.org/x/net/context"
|
||||||
)
|
)
|
||||||
|
|
|
@ -1,8 +1,6 @@
|
||||||
package container
|
package container
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"errors"
|
|
||||||
"fmt"
|
|
||||||
"io"
|
"io"
|
||||||
"os"
|
"os"
|
||||||
"path/filepath"
|
"path/filepath"
|
||||||
|
@ -13,6 +11,7 @@ import (
|
||||||
"github.com/docker/docker/cli/command"
|
"github.com/docker/docker/cli/command"
|
||||||
"github.com/docker/docker/pkg/archive"
|
"github.com/docker/docker/pkg/archive"
|
||||||
"github.com/docker/docker/pkg/system"
|
"github.com/docker/docker/pkg/system"
|
||||||
|
"github.com/pkg/errors"
|
||||||
"github.com/spf13/cobra"
|
"github.com/spf13/cobra"
|
||||||
"golang.org/x/net/context"
|
"golang.org/x/net/context"
|
||||||
)
|
)
|
||||||
|
@ -227,7 +226,7 @@ func copyToContainer(ctx context.Context, dockerCli *command.DockerCli, srcPath,
|
||||||
content = os.Stdin
|
content = os.Stdin
|
||||||
resolvedDstPath = dstInfo.Path
|
resolvedDstPath = dstInfo.Path
|
||||||
if !dstInfo.IsDir {
|
if !dstInfo.IsDir {
|
||||||
return fmt.Errorf("destination \"%s:%s\" must be a directory", dstContainer, dstPath)
|
return errors.Errorf("destination \"%s:%s\" must be a directory", dstContainer, dstPath)
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
// Prepare source copy info.
|
// Prepare source copy info.
|
||||||
|
|
|
@ -14,6 +14,7 @@ import (
|
||||||
apiclient "github.com/docker/docker/client"
|
apiclient "github.com/docker/docker/client"
|
||||||
"github.com/docker/docker/pkg/jsonmessage"
|
"github.com/docker/docker/pkg/jsonmessage"
|
||||||
"github.com/docker/docker/registry"
|
"github.com/docker/docker/registry"
|
||||||
|
"github.com/pkg/errors"
|
||||||
"github.com/spf13/cobra"
|
"github.com/spf13/cobra"
|
||||||
"github.com/spf13/pflag"
|
"github.com/spf13/pflag"
|
||||||
"golang.org/x/net/context"
|
"golang.org/x/net/context"
|
||||||
|
@ -118,7 +119,7 @@ func (cid *cidFile) Close() error {
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
if err := os.Remove(cid.path); err != nil {
|
if err := os.Remove(cid.path); err != nil {
|
||||||
return fmt.Errorf("failed to remove the CID file '%s': %s \n", cid.path, err)
|
return errors.Errorf("failed to remove the CID file '%s': %s \n", cid.path, err)
|
||||||
}
|
}
|
||||||
|
|
||||||
return nil
|
return nil
|
||||||
|
@ -126,7 +127,7 @@ func (cid *cidFile) Close() error {
|
||||||
|
|
||||||
func (cid *cidFile) Write(id string) error {
|
func (cid *cidFile) Write(id string) error {
|
||||||
if _, err := cid.file.Write([]byte(id)); err != nil {
|
if _, err := cid.file.Write([]byte(id)); err != nil {
|
||||||
return fmt.Errorf("Failed to write the container ID to the file: %s", err)
|
return errors.Errorf("Failed to write the container ID to the file: %s", err)
|
||||||
}
|
}
|
||||||
cid.written = true
|
cid.written = true
|
||||||
return nil
|
return nil
|
||||||
|
@ -134,12 +135,12 @@ func (cid *cidFile) Write(id string) error {
|
||||||
|
|
||||||
func newCIDFile(path string) (*cidFile, error) {
|
func newCIDFile(path string) (*cidFile, error) {
|
||||||
if _, err := os.Stat(path); err == nil {
|
if _, err := os.Stat(path); err == nil {
|
||||||
return nil, fmt.Errorf("Container ID file found, make sure the other container isn't running or delete %s", path)
|
return nil, errors.Errorf("Container ID file found, make sure the other container isn't running or delete %s", path)
|
||||||
}
|
}
|
||||||
|
|
||||||
f, err := os.Create(path)
|
f, err := os.Create(path)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, fmt.Errorf("Failed to create the container ID file: %s", err)
|
return nil, errors.Errorf("Failed to create the container ID file: %s", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
return &cidFile{path: path, file: f}, nil
|
return &cidFile{path: path, file: f}, nil
|
||||||
|
|
|
@ -1,12 +1,12 @@
|
||||||
package container
|
package container
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"errors"
|
|
||||||
"fmt"
|
"fmt"
|
||||||
|
|
||||||
"github.com/docker/docker/cli"
|
"github.com/docker/docker/cli"
|
||||||
"github.com/docker/docker/cli/command"
|
"github.com/docker/docker/cli/command"
|
||||||
"github.com/docker/docker/pkg/archive"
|
"github.com/docker/docker/pkg/archive"
|
||||||
|
"github.com/pkg/errors"
|
||||||
"github.com/spf13/cobra"
|
"github.com/spf13/cobra"
|
||||||
"golang.org/x/net/context"
|
"golang.org/x/net/context"
|
||||||
)
|
)
|
||||||
|
|
|
@ -1,11 +1,11 @@
|
||||||
package container
|
package container
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"errors"
|
|
||||||
"io"
|
"io"
|
||||||
|
|
||||||
"github.com/docker/docker/cli"
|
"github.com/docker/docker/cli"
|
||||||
"github.com/docker/docker/cli/command"
|
"github.com/docker/docker/cli/command"
|
||||||
|
"github.com/pkg/errors"
|
||||||
"github.com/spf13/cobra"
|
"github.com/spf13/cobra"
|
||||||
"golang.org/x/net/context"
|
"golang.org/x/net/context"
|
||||||
)
|
)
|
||||||
|
|
|
@ -1,12 +1,12 @@
|
||||||
package container
|
package container
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"errors"
|
|
||||||
"fmt"
|
"fmt"
|
||||||
"strings"
|
"strings"
|
||||||
|
|
||||||
"github.com/docker/docker/cli"
|
"github.com/docker/docker/cli"
|
||||||
"github.com/docker/docker/cli/command"
|
"github.com/docker/docker/cli/command"
|
||||||
|
"github.com/pkg/errors"
|
||||||
"github.com/spf13/cobra"
|
"github.com/spf13/cobra"
|
||||||
"golang.org/x/net/context"
|
"golang.org/x/net/context"
|
||||||
)
|
)
|
||||||
|
|
|
@ -18,6 +18,7 @@ import (
|
||||||
"github.com/docker/docker/pkg/signal"
|
"github.com/docker/docker/pkg/signal"
|
||||||
runconfigopts "github.com/docker/docker/runconfig/opts"
|
runconfigopts "github.com/docker/docker/runconfig/opts"
|
||||||
"github.com/docker/go-connections/nat"
|
"github.com/docker/go-connections/nat"
|
||||||
|
"github.com/pkg/errors"
|
||||||
"github.com/spf13/pflag"
|
"github.com/spf13/pflag"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
@ -301,7 +302,7 @@ func parse(flags *pflag.FlagSet, copts *containerOptions) (*containerConfig, err
|
||||||
// Validate the input mac address
|
// Validate the input mac address
|
||||||
if copts.macAddress != "" {
|
if copts.macAddress != "" {
|
||||||
if _, err := opts.ValidateMACAddress(copts.macAddress); err != nil {
|
if _, err := opts.ValidateMACAddress(copts.macAddress); err != nil {
|
||||||
return nil, fmt.Errorf("%s is not a valid mac address", copts.macAddress)
|
return nil, errors.Errorf("%s is not a valid mac address", copts.macAddress)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if copts.stdin {
|
if copts.stdin {
|
||||||
|
@ -317,7 +318,7 @@ func parse(flags *pflag.FlagSet, copts *containerOptions) (*containerConfig, err
|
||||||
|
|
||||||
swappiness := copts.swappiness
|
swappiness := copts.swappiness
|
||||||
if swappiness != -1 && (swappiness < 0 || swappiness > 100) {
|
if swappiness != -1 && (swappiness < 0 || swappiness > 100) {
|
||||||
return nil, fmt.Errorf("invalid value: %d. Valid memory swappiness range is 0-100", swappiness)
|
return nil, errors.Errorf("invalid value: %d. Valid memory swappiness range is 0-100", swappiness)
|
||||||
}
|
}
|
||||||
|
|
||||||
var binds []string
|
var binds []string
|
||||||
|
@ -368,7 +369,7 @@ func parse(flags *pflag.FlagSet, copts *containerOptions) (*containerConfig, err
|
||||||
// Merge in exposed ports to the map of published ports
|
// Merge in exposed ports to the map of published ports
|
||||||
for _, e := range copts.expose.GetAll() {
|
for _, e := range copts.expose.GetAll() {
|
||||||
if strings.Contains(e, ":") {
|
if strings.Contains(e, ":") {
|
||||||
return nil, fmt.Errorf("invalid port format for --expose: %s", e)
|
return nil, errors.Errorf("invalid port format for --expose: %s", e)
|
||||||
}
|
}
|
||||||
//support two formats for expose, original format <portnum>/[<proto>] or <startport-endport>/[<proto>]
|
//support two formats for expose, original format <portnum>/[<proto>] or <startport-endport>/[<proto>]
|
||||||
proto, port := nat.SplitProtoPort(e)
|
proto, port := nat.SplitProtoPort(e)
|
||||||
|
@ -376,7 +377,7 @@ func parse(flags *pflag.FlagSet, copts *containerOptions) (*containerConfig, err
|
||||||
//if expose a port, the start and end port are the same
|
//if expose a port, the start and end port are the same
|
||||||
start, end, err := nat.ParsePortRange(port)
|
start, end, err := nat.ParsePortRange(port)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, fmt.Errorf("invalid range format for --expose: %s, error: %s", e, err)
|
return nil, errors.Errorf("invalid range format for --expose: %s, error: %s", e, err)
|
||||||
}
|
}
|
||||||
for i := start; i <= end; i++ {
|
for i := start; i <= end; i++ {
|
||||||
p, err := nat.NewPort(proto, strconv.FormatUint(i, 10))
|
p, err := nat.NewPort(proto, strconv.FormatUint(i, 10))
|
||||||
|
@ -413,22 +414,22 @@ func parse(flags *pflag.FlagSet, copts *containerOptions) (*containerConfig, err
|
||||||
|
|
||||||
ipcMode := container.IpcMode(copts.ipcMode)
|
ipcMode := container.IpcMode(copts.ipcMode)
|
||||||
if !ipcMode.Valid() {
|
if !ipcMode.Valid() {
|
||||||
return nil, fmt.Errorf("--ipc: invalid IPC mode")
|
return nil, errors.Errorf("--ipc: invalid IPC mode")
|
||||||
}
|
}
|
||||||
|
|
||||||
pidMode := container.PidMode(copts.pidMode)
|
pidMode := container.PidMode(copts.pidMode)
|
||||||
if !pidMode.Valid() {
|
if !pidMode.Valid() {
|
||||||
return nil, fmt.Errorf("--pid: invalid PID mode")
|
return nil, errors.Errorf("--pid: invalid PID mode")
|
||||||
}
|
}
|
||||||
|
|
||||||
utsMode := container.UTSMode(copts.utsMode)
|
utsMode := container.UTSMode(copts.utsMode)
|
||||||
if !utsMode.Valid() {
|
if !utsMode.Valid() {
|
||||||
return nil, fmt.Errorf("--uts: invalid UTS mode")
|
return nil, errors.Errorf("--uts: invalid UTS mode")
|
||||||
}
|
}
|
||||||
|
|
||||||
usernsMode := container.UsernsMode(copts.usernsMode)
|
usernsMode := container.UsernsMode(copts.usernsMode)
|
||||||
if !usernsMode.Valid() {
|
if !usernsMode.Valid() {
|
||||||
return nil, fmt.Errorf("--userns: invalid USER mode")
|
return nil, errors.Errorf("--userns: invalid USER mode")
|
||||||
}
|
}
|
||||||
|
|
||||||
restartPolicy, err := runconfigopts.ParseRestartPolicy(copts.restartPolicy)
|
restartPolicy, err := runconfigopts.ParseRestartPolicy(copts.restartPolicy)
|
||||||
|
@ -459,7 +460,7 @@ func parse(flags *pflag.FlagSet, copts *containerOptions) (*containerConfig, err
|
||||||
copts.healthRetries != 0
|
copts.healthRetries != 0
|
||||||
if copts.noHealthcheck {
|
if copts.noHealthcheck {
|
||||||
if haveHealthSettings {
|
if haveHealthSettings {
|
||||||
return nil, fmt.Errorf("--no-healthcheck conflicts with --health-* options")
|
return nil, errors.Errorf("--no-healthcheck conflicts with --health-* options")
|
||||||
}
|
}
|
||||||
test := strslice.StrSlice{"NONE"}
|
test := strslice.StrSlice{"NONE"}
|
||||||
healthConfig = &container.HealthConfig{Test: test}
|
healthConfig = &container.HealthConfig{Test: test}
|
||||||
|
@ -470,13 +471,13 @@ func parse(flags *pflag.FlagSet, copts *containerOptions) (*containerConfig, err
|
||||||
probe = strslice.StrSlice(args)
|
probe = strslice.StrSlice(args)
|
||||||
}
|
}
|
||||||
if copts.healthInterval < 0 {
|
if copts.healthInterval < 0 {
|
||||||
return nil, fmt.Errorf("--health-interval cannot be negative")
|
return nil, errors.Errorf("--health-interval cannot be negative")
|
||||||
}
|
}
|
||||||
if copts.healthTimeout < 0 {
|
if copts.healthTimeout < 0 {
|
||||||
return nil, fmt.Errorf("--health-timeout cannot be negative")
|
return nil, errors.Errorf("--health-timeout cannot be negative")
|
||||||
}
|
}
|
||||||
if copts.healthRetries < 0 {
|
if copts.healthRetries < 0 {
|
||||||
return nil, fmt.Errorf("--health-retries cannot be negative")
|
return nil, errors.Errorf("--health-retries cannot be negative")
|
||||||
}
|
}
|
||||||
|
|
||||||
healthConfig = &container.HealthConfig{
|
healthConfig = &container.HealthConfig{
|
||||||
|
@ -591,7 +592,7 @@ func parse(flags *pflag.FlagSet, copts *containerOptions) (*containerConfig, err
|
||||||
}
|
}
|
||||||
|
|
||||||
if copts.autoRemove && !hostConfig.RestartPolicy.IsNone() {
|
if copts.autoRemove && !hostConfig.RestartPolicy.IsNone() {
|
||||||
return nil, fmt.Errorf("Conflicting options: --restart and --rm")
|
return nil, errors.Errorf("Conflicting options: --restart and --rm")
|
||||||
}
|
}
|
||||||
|
|
||||||
// only set this value if the user provided the flag, else it should default to nil
|
// only set this value if the user provided the flag, else it should default to nil
|
||||||
|
@ -653,7 +654,7 @@ func parse(flags *pflag.FlagSet, copts *containerOptions) (*containerConfig, err
|
||||||
func parseLoggingOpts(loggingDriver string, loggingOpts []string) (map[string]string, error) {
|
func parseLoggingOpts(loggingDriver string, loggingOpts []string) (map[string]string, error) {
|
||||||
loggingOptsMap := runconfigopts.ConvertKVStringsToMap(loggingOpts)
|
loggingOptsMap := runconfigopts.ConvertKVStringsToMap(loggingOpts)
|
||||||
if loggingDriver == "none" && len(loggingOpts) > 0 {
|
if loggingDriver == "none" && len(loggingOpts) > 0 {
|
||||||
return map[string]string{}, fmt.Errorf("invalid logging opts for driver %s", loggingDriver)
|
return map[string]string{}, errors.Errorf("invalid logging opts for driver %s", loggingDriver)
|
||||||
}
|
}
|
||||||
return loggingOptsMap, nil
|
return loggingOptsMap, nil
|
||||||
}
|
}
|
||||||
|
@ -666,17 +667,17 @@ func parseSecurityOpts(securityOpts []string) ([]string, error) {
|
||||||
if strings.Contains(opt, ":") {
|
if strings.Contains(opt, ":") {
|
||||||
con = strings.SplitN(opt, ":", 2)
|
con = strings.SplitN(opt, ":", 2)
|
||||||
} else {
|
} else {
|
||||||
return securityOpts, fmt.Errorf("Invalid --security-opt: %q", opt)
|
return securityOpts, errors.Errorf("Invalid --security-opt: %q", opt)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if con[0] == "seccomp" && con[1] != "unconfined" {
|
if con[0] == "seccomp" && con[1] != "unconfined" {
|
||||||
f, err := ioutil.ReadFile(con[1])
|
f, err := ioutil.ReadFile(con[1])
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return securityOpts, fmt.Errorf("opening seccomp profile (%s) failed: %v", con[1], err)
|
return securityOpts, errors.Errorf("opening seccomp profile (%s) failed: %v", con[1], err)
|
||||||
}
|
}
|
||||||
b := bytes.NewBuffer(nil)
|
b := bytes.NewBuffer(nil)
|
||||||
if err := json.Compact(b, f); err != nil {
|
if err := json.Compact(b, f); err != nil {
|
||||||
return securityOpts, fmt.Errorf("compacting json for seccomp profile (%s) failed: %v", con[1], err)
|
return securityOpts, errors.Errorf("compacting json for seccomp profile (%s) failed: %v", con[1], err)
|
||||||
}
|
}
|
||||||
securityOpts[key] = fmt.Sprintf("seccomp=%s", b.Bytes())
|
securityOpts[key] = fmt.Sprintf("seccomp=%s", b.Bytes())
|
||||||
}
|
}
|
||||||
|
@ -693,7 +694,7 @@ func parseStorageOpts(storageOpts []string) (map[string]string, error) {
|
||||||
opt := strings.SplitN(option, "=", 2)
|
opt := strings.SplitN(option, "=", 2)
|
||||||
m[opt[0]] = opt[1]
|
m[opt[0]] = opt[1]
|
||||||
} else {
|
} else {
|
||||||
return nil, fmt.Errorf("invalid storage option")
|
return nil, errors.Errorf("invalid storage option")
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return m, nil
|
return m, nil
|
||||||
|
@ -719,7 +720,7 @@ func parseDevice(device string) (container.DeviceMapping, error) {
|
||||||
case 1:
|
case 1:
|
||||||
src = arr[0]
|
src = arr[0]
|
||||||
default:
|
default:
|
||||||
return container.DeviceMapping{}, fmt.Errorf("invalid device specification: %s", device)
|
return container.DeviceMapping{}, errors.Errorf("invalid device specification: %s", device)
|
||||||
}
|
}
|
||||||
|
|
||||||
if dst == "" {
|
if dst == "" {
|
||||||
|
@ -742,7 +743,7 @@ func validateDeviceCgroupRule(val string) (string, error) {
|
||||||
return val, nil
|
return val, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
return val, fmt.Errorf("invalid device cgroup format '%s'", val)
|
return val, errors.Errorf("invalid device cgroup format '%s'", val)
|
||||||
}
|
}
|
||||||
|
|
||||||
// validDeviceMode checks if the mode for device is valid or not.
|
// validDeviceMode checks if the mode for device is valid or not.
|
||||||
|
@ -778,12 +779,12 @@ func validatePath(val string, validator func(string) bool) (string, error) {
|
||||||
var mode string
|
var mode string
|
||||||
|
|
||||||
if strings.Count(val, ":") > 2 {
|
if strings.Count(val, ":") > 2 {
|
||||||
return val, fmt.Errorf("bad format for path: %s", val)
|
return val, errors.Errorf("bad format for path: %s", val)
|
||||||
}
|
}
|
||||||
|
|
||||||
split := strings.SplitN(val, ":", 3)
|
split := strings.SplitN(val, ":", 3)
|
||||||
if split[0] == "" {
|
if split[0] == "" {
|
||||||
return val, fmt.Errorf("bad format for path: %s", val)
|
return val, errors.Errorf("bad format for path: %s", val)
|
||||||
}
|
}
|
||||||
switch len(split) {
|
switch len(split) {
|
||||||
case 1:
|
case 1:
|
||||||
|
@ -802,13 +803,13 @@ func validatePath(val string, validator func(string) bool) (string, error) {
|
||||||
containerPath = split[1]
|
containerPath = split[1]
|
||||||
mode = split[2]
|
mode = split[2]
|
||||||
if isValid := validator(split[2]); !isValid {
|
if isValid := validator(split[2]); !isValid {
|
||||||
return val, fmt.Errorf("bad mode specified: %s", mode)
|
return val, errors.Errorf("bad mode specified: %s", mode)
|
||||||
}
|
}
|
||||||
val = fmt.Sprintf("%s:%s:%s", split[0], containerPath, mode)
|
val = fmt.Sprintf("%s:%s:%s", split[0], containerPath, mode)
|
||||||
}
|
}
|
||||||
|
|
||||||
if !path.IsAbs(containerPath) {
|
if !path.IsAbs(containerPath) {
|
||||||
return val, fmt.Errorf("%s is not an absolute path", containerPath)
|
return val, errors.Errorf("%s is not an absolute path", containerPath)
|
||||||
}
|
}
|
||||||
return val, nil
|
return val, nil
|
||||||
}
|
}
|
||||||
|
@ -882,5 +883,5 @@ func validateAttach(val string) (string, error) {
|
||||||
return s, nil
|
return s, nil
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return val, fmt.Errorf("valid streams are STDIN, STDOUT and STDERR")
|
return val, errors.Errorf("valid streams are STDIN, STDOUT and STDERR")
|
||||||
}
|
}
|
||||||
|
|
|
@ -16,6 +16,7 @@ import (
|
||||||
"github.com/docker/docker/pkg/testutil/assert"
|
"github.com/docker/docker/pkg/testutil/assert"
|
||||||
"github.com/docker/docker/runconfig"
|
"github.com/docker/docker/runconfig"
|
||||||
"github.com/docker/go-connections/nat"
|
"github.com/docker/go-connections/nat"
|
||||||
|
"github.com/pkg/errors"
|
||||||
"github.com/spf13/pflag"
|
"github.com/spf13/pflag"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
@ -224,7 +225,7 @@ func compareRandomizedStrings(a, b, c, d string) error {
|
||||||
if a == d && b == c {
|
if a == d && b == c {
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
return fmt.Errorf("strings don't match")
|
return errors.Errorf("strings don't match")
|
||||||
}
|
}
|
||||||
|
|
||||||
// Simple parse with MacAddress validation
|
// Simple parse with MacAddress validation
|
||||||
|
@ -751,14 +752,14 @@ func callDecodeContainerConfig(volumes []string, binds []string) (*container.Con
|
||||||
w.Config.Volumes[v] = struct{}{}
|
w.Config.Volumes[v] = struct{}{}
|
||||||
}
|
}
|
||||||
if b, err = json.Marshal(w); err != nil {
|
if b, err = json.Marshal(w); err != nil {
|
||||||
return nil, nil, fmt.Errorf("Error on marshal %s", err.Error())
|
return nil, nil, errors.Errorf("Error on marshal %s", err.Error())
|
||||||
}
|
}
|
||||||
c, h, _, err = runconfig.DecodeContainerConfig(bytes.NewReader(b))
|
c, h, _, err = runconfig.DecodeContainerConfig(bytes.NewReader(b))
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, nil, fmt.Errorf("Error parsing %s: %v", string(b), err)
|
return nil, nil, errors.Errorf("Error parsing %s: %v", string(b), err)
|
||||||
}
|
}
|
||||||
if c == nil || h == nil {
|
if c == nil || h == nil {
|
||||||
return nil, nil, fmt.Errorf("Empty config or hostconfig")
|
return nil, nil, errors.Errorf("Empty config or hostconfig")
|
||||||
}
|
}
|
||||||
|
|
||||||
return c, h, err
|
return c, h, err
|
||||||
|
|
|
@ -1,12 +1,12 @@
|
||||||
package container
|
package container
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"errors"
|
|
||||||
"fmt"
|
"fmt"
|
||||||
"strings"
|
"strings"
|
||||||
|
|
||||||
"github.com/docker/docker/cli"
|
"github.com/docker/docker/cli"
|
||||||
"github.com/docker/docker/cli/command"
|
"github.com/docker/docker/cli/command"
|
||||||
|
"github.com/pkg/errors"
|
||||||
"github.com/spf13/cobra"
|
"github.com/spf13/cobra"
|
||||||
"golang.org/x/net/context"
|
"golang.org/x/net/context"
|
||||||
)
|
)
|
||||||
|
|
|
@ -7,6 +7,7 @@ import (
|
||||||
"github.com/docker/docker/cli"
|
"github.com/docker/docker/cli"
|
||||||
"github.com/docker/docker/cli/command"
|
"github.com/docker/docker/cli/command"
|
||||||
"github.com/docker/go-connections/nat"
|
"github.com/docker/go-connections/nat"
|
||||||
|
"github.com/pkg/errors"
|
||||||
"github.com/spf13/cobra"
|
"github.com/spf13/cobra"
|
||||||
"golang.org/x/net/context"
|
"golang.org/x/net/context"
|
||||||
)
|
)
|
||||||
|
@ -64,7 +65,7 @@ func runPort(dockerCli *command.DockerCli, opts *portOptions) error {
|
||||||
}
|
}
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
return fmt.Errorf("Error: No public port '%s' published for %s", natPort, opts.container)
|
return errors.Errorf("Error: No public port '%s' published for %s", natPort, opts.container)
|
||||||
}
|
}
|
||||||
|
|
||||||
for from, frontends := range c.NetworkSettings.Ports {
|
for from, frontends := range c.NetworkSettings.Ports {
|
||||||
|
|
|
@ -1,12 +1,12 @@
|
||||||
package container
|
package container
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"errors"
|
|
||||||
"fmt"
|
"fmt"
|
||||||
"strings"
|
"strings"
|
||||||
|
|
||||||
"github.com/docker/docker/cli"
|
"github.com/docker/docker/cli"
|
||||||
"github.com/docker/docker/cli/command"
|
"github.com/docker/docker/cli/command"
|
||||||
|
"github.com/pkg/errors"
|
||||||
"github.com/spf13/cobra"
|
"github.com/spf13/cobra"
|
||||||
"golang.org/x/net/context"
|
"golang.org/x/net/context"
|
||||||
)
|
)
|
||||||
|
@ -45,7 +45,7 @@ func runRename(dockerCli *command.DockerCli, opts *renameOptions) error {
|
||||||
|
|
||||||
if err := dockerCli.Client().ContainerRename(ctx, oldName, newName); err != nil {
|
if err := dockerCli.Client().ContainerRename(ctx, oldName, newName); err != nil {
|
||||||
fmt.Fprintln(dockerCli.Err(), err)
|
fmt.Fprintln(dockerCli.Err(), err)
|
||||||
return fmt.Errorf("Error: failed to rename container named %s", oldName)
|
return errors.Errorf("Error: failed to rename container named %s", oldName)
|
||||||
}
|
}
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,13 +1,13 @@
|
||||||
package container
|
package container
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"errors"
|
|
||||||
"fmt"
|
"fmt"
|
||||||
"strings"
|
"strings"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
"github.com/docker/docker/cli"
|
"github.com/docker/docker/cli"
|
||||||
"github.com/docker/docker/cli/command"
|
"github.com/docker/docker/cli/command"
|
||||||
|
"github.com/pkg/errors"
|
||||||
"github.com/spf13/cobra"
|
"github.com/spf13/cobra"
|
||||||
"golang.org/x/net/context"
|
"golang.org/x/net/context"
|
||||||
)
|
)
|
||||||
|
|
|
@ -1,13 +1,13 @@
|
||||||
package container
|
package container
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"errors"
|
|
||||||
"fmt"
|
"fmt"
|
||||||
"strings"
|
"strings"
|
||||||
|
|
||||||
"github.com/docker/docker/api/types"
|
"github.com/docker/docker/api/types"
|
||||||
"github.com/docker/docker/cli"
|
"github.com/docker/docker/cli"
|
||||||
"github.com/docker/docker/cli/command"
|
"github.com/docker/docker/cli/command"
|
||||||
|
"github.com/pkg/errors"
|
||||||
"github.com/spf13/cobra"
|
"github.com/spf13/cobra"
|
||||||
"golang.org/x/net/context"
|
"golang.org/x/net/context"
|
||||||
)
|
)
|
||||||
|
|
|
@ -1,7 +1,6 @@
|
||||||
package container
|
package container
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"errors"
|
|
||||||
"fmt"
|
"fmt"
|
||||||
"io"
|
"io"
|
||||||
"net/http/httputil"
|
"net/http/httputil"
|
||||||
|
@ -18,6 +17,7 @@ import (
|
||||||
"github.com/docker/docker/pkg/promise"
|
"github.com/docker/docker/pkg/promise"
|
||||||
"github.com/docker/docker/pkg/signal"
|
"github.com/docker/docker/pkg/signal"
|
||||||
"github.com/docker/libnetwork/resolvconf/dns"
|
"github.com/docker/libnetwork/resolvconf/dns"
|
||||||
|
"github.com/pkg/errors"
|
||||||
"github.com/spf13/cobra"
|
"github.com/spf13/cobra"
|
||||||
"github.com/spf13/pflag"
|
"github.com/spf13/pflag"
|
||||||
"golang.org/x/net/context"
|
"golang.org/x/net/context"
|
||||||
|
|
|
@ -1,7 +1,6 @@
|
||||||
package container
|
package container
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"errors"
|
|
||||||
"fmt"
|
"fmt"
|
||||||
"io"
|
"io"
|
||||||
"net/http/httputil"
|
"net/http/httputil"
|
||||||
|
@ -12,6 +11,7 @@ import (
|
||||||
"github.com/docker/docker/cli/command"
|
"github.com/docker/docker/cli/command"
|
||||||
"github.com/docker/docker/pkg/promise"
|
"github.com/docker/docker/pkg/promise"
|
||||||
"github.com/docker/docker/pkg/signal"
|
"github.com/docker/docker/pkg/signal"
|
||||||
|
"github.com/pkg/errors"
|
||||||
"github.com/spf13/cobra"
|
"github.com/spf13/cobra"
|
||||||
"golang.org/x/net/context"
|
"golang.org/x/net/context"
|
||||||
)
|
)
|
||||||
|
@ -173,7 +173,7 @@ func startContainersWithoutAttachments(ctx context.Context, dockerCli *command.D
|
||||||
}
|
}
|
||||||
|
|
||||||
if len(failedContainers) > 0 {
|
if len(failedContainers) > 0 {
|
||||||
return fmt.Errorf("Error: failed to start containers: %s", strings.Join(failedContainers, ", "))
|
return errors.Errorf("Error: failed to start containers: %s", strings.Join(failedContainers, ", "))
|
||||||
}
|
}
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,7 +1,6 @@
|
||||||
package container
|
package container
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"errors"
|
|
||||||
"fmt"
|
"fmt"
|
||||||
"io"
|
"io"
|
||||||
"strings"
|
"strings"
|
||||||
|
@ -14,6 +13,7 @@ import (
|
||||||
"github.com/docker/docker/cli"
|
"github.com/docker/docker/cli"
|
||||||
"github.com/docker/docker/cli/command"
|
"github.com/docker/docker/cli/command"
|
||||||
"github.com/docker/docker/cli/command/formatter"
|
"github.com/docker/docker/cli/command/formatter"
|
||||||
|
"github.com/pkg/errors"
|
||||||
"github.com/spf13/cobra"
|
"github.com/spf13/cobra"
|
||||||
"golang.org/x/net/context"
|
"golang.org/x/net/context"
|
||||||
)
|
)
|
||||||
|
|
|
@ -2,7 +2,6 @@ package container
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"encoding/json"
|
"encoding/json"
|
||||||
"errors"
|
|
||||||
"io"
|
"io"
|
||||||
"strings"
|
"strings"
|
||||||
"sync"
|
"sync"
|
||||||
|
@ -12,6 +11,7 @@ import (
|
||||||
"github.com/docker/docker/api/types"
|
"github.com/docker/docker/api/types"
|
||||||
"github.com/docker/docker/cli/command/formatter"
|
"github.com/docker/docker/cli/command/formatter"
|
||||||
"github.com/docker/docker/client"
|
"github.com/docker/docker/client"
|
||||||
|
"github.com/pkg/errors"
|
||||||
"golang.org/x/net/context"
|
"golang.org/x/net/context"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
|
@ -1,13 +1,13 @@
|
||||||
package container
|
package container
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"errors"
|
|
||||||
"fmt"
|
"fmt"
|
||||||
"strings"
|
"strings"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
"github.com/docker/docker/cli"
|
"github.com/docker/docker/cli"
|
||||||
"github.com/docker/docker/cli/command"
|
"github.com/docker/docker/cli/command"
|
||||||
|
"github.com/pkg/errors"
|
||||||
"github.com/spf13/cobra"
|
"github.com/spf13/cobra"
|
||||||
"golang.org/x/net/context"
|
"golang.org/x/net/context"
|
||||||
)
|
)
|
||||||
|
|
|
@ -1,12 +1,12 @@
|
||||||
package container
|
package container
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"errors"
|
|
||||||
"fmt"
|
"fmt"
|
||||||
"strings"
|
"strings"
|
||||||
|
|
||||||
"github.com/docker/docker/cli"
|
"github.com/docker/docker/cli"
|
||||||
"github.com/docker/docker/cli/command"
|
"github.com/docker/docker/cli/command"
|
||||||
|
"github.com/pkg/errors"
|
||||||
"github.com/spf13/cobra"
|
"github.com/spf13/cobra"
|
||||||
"golang.org/x/net/context"
|
"golang.org/x/net/context"
|
||||||
)
|
)
|
||||||
|
|
|
@ -1,7 +1,6 @@
|
||||||
package container
|
package container
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"errors"
|
|
||||||
"fmt"
|
"fmt"
|
||||||
"strings"
|
"strings"
|
||||||
|
|
||||||
|
@ -10,6 +9,7 @@ import (
|
||||||
"github.com/docker/docker/cli/command"
|
"github.com/docker/docker/cli/command"
|
||||||
"github.com/docker/docker/opts"
|
"github.com/docker/docker/opts"
|
||||||
runconfigopts "github.com/docker/docker/runconfig/opts"
|
runconfigopts "github.com/docker/docker/runconfig/opts"
|
||||||
|
"github.com/pkg/errors"
|
||||||
"github.com/spf13/cobra"
|
"github.com/spf13/cobra"
|
||||||
"golang.org/x/net/context"
|
"golang.org/x/net/context"
|
||||||
)
|
)
|
||||||
|
|
|
@ -1,12 +1,12 @@
|
||||||
package container
|
package container
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"errors"
|
|
||||||
"fmt"
|
"fmt"
|
||||||
"strings"
|
"strings"
|
||||||
|
|
||||||
"github.com/docker/docker/cli"
|
"github.com/docker/docker/cli"
|
||||||
"github.com/docker/docker/cli/command"
|
"github.com/docker/docker/cli/command"
|
||||||
|
"github.com/pkg/errors"
|
||||||
"github.com/spf13/cobra"
|
"github.com/spf13/cobra"
|
||||||
"golang.org/x/net/context"
|
"golang.org/x/net/context"
|
||||||
)
|
)
|
||||||
|
|
|
@ -2,13 +2,13 @@ package formatter
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"bytes"
|
"bytes"
|
||||||
"fmt"
|
|
||||||
"io"
|
"io"
|
||||||
"strings"
|
"strings"
|
||||||
"text/tabwriter"
|
"text/tabwriter"
|
||||||
"text/template"
|
"text/template"
|
||||||
|
|
||||||
"github.com/docker/docker/pkg/templates"
|
"github.com/docker/docker/pkg/templates"
|
||||||
|
"github.com/pkg/errors"
|
||||||
)
|
)
|
||||||
|
|
||||||
// Format keys used to specify certain kinds of output formats
|
// Format keys used to specify certain kinds of output formats
|
||||||
|
@ -64,7 +64,7 @@ func (c *Context) preFormat() {
|
||||||
func (c *Context) parseFormat() (*template.Template, error) {
|
func (c *Context) parseFormat() (*template.Template, error) {
|
||||||
tmpl, err := templates.Parse(c.finalFormat)
|
tmpl, err := templates.Parse(c.finalFormat)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return tmpl, fmt.Errorf("Template parsing error: %v\n", err)
|
return tmpl, errors.Errorf("Template parsing error: %v\n", err)
|
||||||
}
|
}
|
||||||
return tmpl, err
|
return tmpl, err
|
||||||
}
|
}
|
||||||
|
@ -85,7 +85,7 @@ func (c *Context) postFormat(tmpl *template.Template, subContext subContext) {
|
||||||
|
|
||||||
func (c *Context) contextFormat(tmpl *template.Template, subContext subContext) error {
|
func (c *Context) contextFormat(tmpl *template.Template, subContext subContext) error {
|
||||||
if err := tmpl.Execute(c.buffer, subContext); err != nil {
|
if err := tmpl.Execute(c.buffer, subContext); err != nil {
|
||||||
return fmt.Errorf("Template parsing error: %v\n", err)
|
return errors.Errorf("Template parsing error: %v\n", err)
|
||||||
}
|
}
|
||||||
if c.Format.IsTable() && c.header != nil {
|
if c.Format.IsTable() && c.header != nil {
|
||||||
c.header = subContext.FullHeader()
|
c.header = subContext.FullHeader()
|
||||||
|
|
|
@ -2,9 +2,10 @@ package formatter
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"encoding/json"
|
"encoding/json"
|
||||||
"fmt"
|
|
||||||
"reflect"
|
"reflect"
|
||||||
"unicode"
|
"unicode"
|
||||||
|
|
||||||
|
"github.com/pkg/errors"
|
||||||
)
|
)
|
||||||
|
|
||||||
func marshalJSON(x interface{}) ([]byte, error) {
|
func marshalJSON(x interface{}) ([]byte, error) {
|
||||||
|
@ -19,14 +20,14 @@ func marshalJSON(x interface{}) ([]byte, error) {
|
||||||
func marshalMap(x interface{}) (map[string]interface{}, error) {
|
func marshalMap(x interface{}) (map[string]interface{}, error) {
|
||||||
val := reflect.ValueOf(x)
|
val := reflect.ValueOf(x)
|
||||||
if val.Kind() != reflect.Ptr {
|
if val.Kind() != reflect.Ptr {
|
||||||
return nil, fmt.Errorf("expected a pointer to a struct, got %v", val.Kind())
|
return nil, errors.Errorf("expected a pointer to a struct, got %v", val.Kind())
|
||||||
}
|
}
|
||||||
if val.IsNil() {
|
if val.IsNil() {
|
||||||
return nil, fmt.Errorf("expected a pointer to a struct, got nil pointer")
|
return nil, errors.Errorf("expected a pointer to a struct, got nil pointer")
|
||||||
}
|
}
|
||||||
valElem := val.Elem()
|
valElem := val.Elem()
|
||||||
if valElem.Kind() != reflect.Struct {
|
if valElem.Kind() != reflect.Struct {
|
||||||
return nil, fmt.Errorf("expected a pointer to a struct, got a pointer to %v", valElem.Kind())
|
return nil, errors.Errorf("expected a pointer to a struct, got a pointer to %v", valElem.Kind())
|
||||||
}
|
}
|
||||||
typ := val.Type()
|
typ := val.Type()
|
||||||
m := make(map[string]interface{})
|
m := make(map[string]interface{})
|
||||||
|
@ -48,7 +49,7 @@ var unmarshallableNames = map[string]struct{}{"FullHeader": {}}
|
||||||
// It returns ("", nil, nil) for valid but non-marshallable parameter. (e.g. "unexportedFunc()")
|
// It returns ("", nil, nil) for valid but non-marshallable parameter. (e.g. "unexportedFunc()")
|
||||||
func marshalForMethod(typ reflect.Method, val reflect.Value) (string, interface{}, error) {
|
func marshalForMethod(typ reflect.Method, val reflect.Value) (string, interface{}, error) {
|
||||||
if val.Kind() != reflect.Func {
|
if val.Kind() != reflect.Func {
|
||||||
return "", nil, fmt.Errorf("expected func, got %v", val.Kind())
|
return "", nil, errors.Errorf("expected func, got %v", val.Kind())
|
||||||
}
|
}
|
||||||
name, numIn, numOut := typ.Name, val.Type().NumIn(), val.Type().NumOut()
|
name, numIn, numOut := typ.Name, val.Type().NumIn(), val.Type().NumOut()
|
||||||
_, blackListed := unmarshallableNames[name]
|
_, blackListed := unmarshallableNames[name]
|
||||||
|
|
|
@ -1,7 +1,6 @@
|
||||||
package formatter
|
package formatter
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"fmt"
|
|
||||||
"strings"
|
"strings"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
|
@ -11,6 +10,7 @@ import (
|
||||||
"github.com/docker/docker/cli/command/inspect"
|
"github.com/docker/docker/cli/command/inspect"
|
||||||
"github.com/docker/docker/pkg/stringid"
|
"github.com/docker/docker/pkg/stringid"
|
||||||
units "github.com/docker/go-units"
|
units "github.com/docker/go-units"
|
||||||
|
"github.com/pkg/errors"
|
||||||
)
|
)
|
||||||
|
|
||||||
const serviceInspectPrettyTemplate Format = `
|
const serviceInspectPrettyTemplate Format = `
|
||||||
|
@ -147,7 +147,7 @@ func ServiceInspectWrite(ctx Context, refs []string, getRef inspect.GetRefFunc)
|
||||||
}
|
}
|
||||||
service, ok := serviceI.(swarm.Service)
|
service, ok := serviceI.(swarm.Service)
|
||||||
if !ok {
|
if !ok {
|
||||||
return fmt.Errorf("got wrong object to inspect")
|
return errors.Errorf("got wrong object to inspect")
|
||||||
}
|
}
|
||||||
if err := format(&serviceInspectContext{Service: service}); err != nil {
|
if err := format(&serviceInspectContext{Service: service}); err != nil {
|
||||||
return err
|
return err
|
||||||
|
|
|
@ -1,12 +1,11 @@
|
||||||
package idresolver
|
package idresolver
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"fmt"
|
|
||||||
|
|
||||||
"golang.org/x/net/context"
|
"golang.org/x/net/context"
|
||||||
|
|
||||||
"github.com/docker/docker/api/types/swarm"
|
"github.com/docker/docker/api/types/swarm"
|
||||||
"github.com/docker/docker/client"
|
"github.com/docker/docker/client"
|
||||||
|
"github.com/pkg/errors"
|
||||||
)
|
)
|
||||||
|
|
||||||
// IDResolver provides ID to Name resolution.
|
// IDResolver provides ID to Name resolution.
|
||||||
|
@ -46,7 +45,7 @@ func (r *IDResolver) get(ctx context.Context, t interface{}, id string) (string,
|
||||||
}
|
}
|
||||||
return service.Spec.Annotations.Name, nil
|
return service.Spec.Annotations.Name, nil
|
||||||
default:
|
default:
|
||||||
return "", fmt.Errorf("unsupported type")
|
return "", errors.Errorf("unsupported type")
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -28,6 +28,7 @@ import (
|
||||||
"github.com/docker/docker/pkg/urlutil"
|
"github.com/docker/docker/pkg/urlutil"
|
||||||
runconfigopts "github.com/docker/docker/runconfig/opts"
|
runconfigopts "github.com/docker/docker/runconfig/opts"
|
||||||
units "github.com/docker/go-units"
|
units "github.com/docker/go-units"
|
||||||
|
"github.com/pkg/errors"
|
||||||
"github.com/spf13/cobra"
|
"github.com/spf13/cobra"
|
||||||
"golang.org/x/net/context"
|
"golang.org/x/net/context"
|
||||||
)
|
)
|
||||||
|
@ -166,14 +167,14 @@ func runBuild(dockerCli *command.DockerCli, options buildOptions) error {
|
||||||
case urlutil.IsURL(specifiedContext):
|
case urlutil.IsURL(specifiedContext):
|
||||||
buildCtx, relDockerfile, err = build.GetContextFromURL(progBuff, specifiedContext, options.dockerfileName)
|
buildCtx, relDockerfile, err = build.GetContextFromURL(progBuff, specifiedContext, options.dockerfileName)
|
||||||
default:
|
default:
|
||||||
return fmt.Errorf("unable to prepare context: path %q not found", specifiedContext)
|
return errors.Errorf("unable to prepare context: path %q not found", specifiedContext)
|
||||||
}
|
}
|
||||||
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
if options.quiet && urlutil.IsURL(specifiedContext) {
|
if options.quiet && urlutil.IsURL(specifiedContext) {
|
||||||
fmt.Fprintln(dockerCli.Err(), progBuff)
|
fmt.Fprintln(dockerCli.Err(), progBuff)
|
||||||
}
|
}
|
||||||
return fmt.Errorf("unable to prepare context: %s", err)
|
return errors.Errorf("unable to prepare context: %s", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
if tempDir != "" {
|
if tempDir != "" {
|
||||||
|
@ -185,7 +186,7 @@ func runBuild(dockerCli *command.DockerCli, options buildOptions) error {
|
||||||
// And canonicalize dockerfile name to a platform-independent one
|
// And canonicalize dockerfile name to a platform-independent one
|
||||||
relDockerfile, err = archive.CanonicalTarNameForPath(relDockerfile)
|
relDockerfile, err = archive.CanonicalTarNameForPath(relDockerfile)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return fmt.Errorf("cannot canonicalize dockerfile path %s: %v", relDockerfile, err)
|
return errors.Errorf("cannot canonicalize dockerfile path %s: %v", relDockerfile, err)
|
||||||
}
|
}
|
||||||
|
|
||||||
f, err := os.Open(filepath.Join(contextDir, ".dockerignore"))
|
f, err := os.Open(filepath.Join(contextDir, ".dockerignore"))
|
||||||
|
@ -203,7 +204,7 @@ func runBuild(dockerCli *command.DockerCli, options buildOptions) error {
|
||||||
}
|
}
|
||||||
|
|
||||||
if err := build.ValidateContextDirectory(contextDir, excludes); err != nil {
|
if err := build.ValidateContextDirectory(contextDir, excludes); err != nil {
|
||||||
return fmt.Errorf("Error checking context: '%s'.", err)
|
return errors.Errorf("Error checking context: '%s'.", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
// If .dockerignore mentions .dockerignore or the Dockerfile
|
// If .dockerignore mentions .dockerignore or the Dockerfile
|
||||||
|
|
|
@ -18,6 +18,7 @@ import (
|
||||||
"github.com/docker/docker/pkg/ioutils"
|
"github.com/docker/docker/pkg/ioutils"
|
||||||
"github.com/docker/docker/pkg/progress"
|
"github.com/docker/docker/pkg/progress"
|
||||||
"github.com/docker/docker/pkg/streamformatter"
|
"github.com/docker/docker/pkg/streamformatter"
|
||||||
|
"github.com/pkg/errors"
|
||||||
)
|
)
|
||||||
|
|
||||||
const (
|
const (
|
||||||
|
@ -36,7 +37,7 @@ func ValidateContextDirectory(srcPath string, excludes []string) error {
|
||||||
return filepath.Walk(contextRoot, func(filePath string, f os.FileInfo, err error) error {
|
return filepath.Walk(contextRoot, func(filePath string, f os.FileInfo, err error) error {
|
||||||
if err != nil {
|
if err != nil {
|
||||||
if os.IsPermission(err) {
|
if os.IsPermission(err) {
|
||||||
return fmt.Errorf("can't stat '%s'", filePath)
|
return errors.Errorf("can't stat '%s'", filePath)
|
||||||
}
|
}
|
||||||
if os.IsNotExist(err) {
|
if os.IsNotExist(err) {
|
||||||
return nil
|
return nil
|
||||||
|
@ -65,7 +66,7 @@ func ValidateContextDirectory(srcPath string, excludes []string) error {
|
||||||
if !f.IsDir() {
|
if !f.IsDir() {
|
||||||
currentFile, err := os.Open(filePath)
|
currentFile, err := os.Open(filePath)
|
||||||
if err != nil && os.IsPermission(err) {
|
if err != nil && os.IsPermission(err) {
|
||||||
return fmt.Errorf("no permission to read from '%s'", filePath)
|
return errors.Errorf("no permission to read from '%s'", filePath)
|
||||||
}
|
}
|
||||||
currentFile.Close()
|
currentFile.Close()
|
||||||
}
|
}
|
||||||
|
@ -81,7 +82,7 @@ func GetContextFromReader(r io.ReadCloser, dockerfileName string) (out io.ReadCl
|
||||||
|
|
||||||
magic, err := buf.Peek(archive.HeaderSize)
|
magic, err := buf.Peek(archive.HeaderSize)
|
||||||
if err != nil && err != io.EOF {
|
if err != nil && err != io.EOF {
|
||||||
return nil, "", fmt.Errorf("failed to peek context header from STDIN: %v", err)
|
return nil, "", errors.Errorf("failed to peek context header from STDIN: %v", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
if archive.IsArchive(magic) {
|
if archive.IsArchive(magic) {
|
||||||
|
@ -91,7 +92,7 @@ func GetContextFromReader(r io.ReadCloser, dockerfileName string) (out io.ReadCl
|
||||||
// Input should be read as a Dockerfile.
|
// Input should be read as a Dockerfile.
|
||||||
tmpDir, err := ioutil.TempDir("", "docker-build-context-")
|
tmpDir, err := ioutil.TempDir("", "docker-build-context-")
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, "", fmt.Errorf("unable to create temporary context directory: %v", err)
|
return nil, "", errors.Errorf("unable to create temporary context directory: %v", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
f, err := os.Create(filepath.Join(tmpDir, DefaultDockerfileName))
|
f, err := os.Create(filepath.Join(tmpDir, DefaultDockerfileName))
|
||||||
|
@ -131,10 +132,10 @@ func GetContextFromReader(r io.ReadCloser, dockerfileName string) (out io.ReadCl
|
||||||
// success.
|
// success.
|
||||||
func GetContextFromGitURL(gitURL, dockerfileName string) (absContextDir, relDockerfile string, err error) {
|
func GetContextFromGitURL(gitURL, dockerfileName string) (absContextDir, relDockerfile string, err error) {
|
||||||
if _, err := exec.LookPath("git"); err != nil {
|
if _, err := exec.LookPath("git"); err != nil {
|
||||||
return "", "", fmt.Errorf("unable to find 'git': %v", err)
|
return "", "", errors.Errorf("unable to find 'git': %v", err)
|
||||||
}
|
}
|
||||||
if absContextDir, err = gitutils.Clone(gitURL); err != nil {
|
if absContextDir, err = gitutils.Clone(gitURL); err != nil {
|
||||||
return "", "", fmt.Errorf("unable to 'git clone' to temporary context directory: %v", err)
|
return "", "", errors.Errorf("unable to 'git clone' to temporary context directory: %v", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
return getDockerfileRelPath(absContextDir, dockerfileName)
|
return getDockerfileRelPath(absContextDir, dockerfileName)
|
||||||
|
@ -147,7 +148,7 @@ func GetContextFromGitURL(gitURL, dockerfileName string) (absContextDir, relDock
|
||||||
func GetContextFromURL(out io.Writer, remoteURL, dockerfileName string) (io.ReadCloser, string, error) {
|
func GetContextFromURL(out io.Writer, remoteURL, dockerfileName string) (io.ReadCloser, string, error) {
|
||||||
response, err := httputils.Download(remoteURL)
|
response, err := httputils.Download(remoteURL)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, "", fmt.Errorf("unable to download remote context %s: %v", remoteURL, err)
|
return nil, "", errors.Errorf("unable to download remote context %s: %v", remoteURL, err)
|
||||||
}
|
}
|
||||||
progressOutput := streamformatter.NewStreamFormatter().NewProgressOutput(out, true)
|
progressOutput := streamformatter.NewStreamFormatter().NewProgressOutput(out, true)
|
||||||
|
|
||||||
|
@ -167,7 +168,7 @@ func GetContextFromLocalDir(localDir, dockerfileName string) (absContextDir, rel
|
||||||
// current directory and not the context directory.
|
// current directory and not the context directory.
|
||||||
if dockerfileName != "" {
|
if dockerfileName != "" {
|
||||||
if dockerfileName, err = filepath.Abs(dockerfileName); err != nil {
|
if dockerfileName, err = filepath.Abs(dockerfileName); err != nil {
|
||||||
return "", "", fmt.Errorf("unable to get absolute path to Dockerfile: %v", err)
|
return "", "", errors.Errorf("unable to get absolute path to Dockerfile: %v", err)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -179,7 +180,7 @@ func GetContextFromLocalDir(localDir, dockerfileName string) (absContextDir, rel
|
||||||
// the dockerfile in that context directory, and a non-nil error on success.
|
// the dockerfile in that context directory, and a non-nil error on success.
|
||||||
func getDockerfileRelPath(givenContextDir, givenDockerfile string) (absContextDir, relDockerfile string, err error) {
|
func getDockerfileRelPath(givenContextDir, givenDockerfile string) (absContextDir, relDockerfile string, err error) {
|
||||||
if absContextDir, err = filepath.Abs(givenContextDir); err != nil {
|
if absContextDir, err = filepath.Abs(givenContextDir); err != nil {
|
||||||
return "", "", fmt.Errorf("unable to get absolute context directory of given context directory %q: %v", givenContextDir, err)
|
return "", "", errors.Errorf("unable to get absolute context directory of given context directory %q: %v", givenContextDir, err)
|
||||||
}
|
}
|
||||||
|
|
||||||
// The context dir might be a symbolic link, so follow it to the actual
|
// The context dir might be a symbolic link, so follow it to the actual
|
||||||
|
@ -192,17 +193,17 @@ func getDockerfileRelPath(givenContextDir, givenDockerfile string) (absContextDi
|
||||||
if !isUNC(absContextDir) {
|
if !isUNC(absContextDir) {
|
||||||
absContextDir, err = filepath.EvalSymlinks(absContextDir)
|
absContextDir, err = filepath.EvalSymlinks(absContextDir)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return "", "", fmt.Errorf("unable to evaluate symlinks in context path: %v", err)
|
return "", "", errors.Errorf("unable to evaluate symlinks in context path: %v", err)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
stat, err := os.Lstat(absContextDir)
|
stat, err := os.Lstat(absContextDir)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return "", "", fmt.Errorf("unable to stat context directory %q: %v", absContextDir, err)
|
return "", "", errors.Errorf("unable to stat context directory %q: %v", absContextDir, err)
|
||||||
}
|
}
|
||||||
|
|
||||||
if !stat.IsDir() {
|
if !stat.IsDir() {
|
||||||
return "", "", fmt.Errorf("context must be a directory: %s", absContextDir)
|
return "", "", errors.Errorf("context must be a directory: %s", absContextDir)
|
||||||
}
|
}
|
||||||
|
|
||||||
absDockerfile := givenDockerfile
|
absDockerfile := givenDockerfile
|
||||||
|
@ -236,23 +237,23 @@ func getDockerfileRelPath(givenContextDir, givenDockerfile string) (absContextDi
|
||||||
if !isUNC(absDockerfile) {
|
if !isUNC(absDockerfile) {
|
||||||
absDockerfile, err = filepath.EvalSymlinks(absDockerfile)
|
absDockerfile, err = filepath.EvalSymlinks(absDockerfile)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return "", "", fmt.Errorf("unable to evaluate symlinks in Dockerfile path: %v", err)
|
return "", "", errors.Errorf("unable to evaluate symlinks in Dockerfile path: %v", err)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if _, err := os.Lstat(absDockerfile); err != nil {
|
if _, err := os.Lstat(absDockerfile); err != nil {
|
||||||
if os.IsNotExist(err) {
|
if os.IsNotExist(err) {
|
||||||
return "", "", fmt.Errorf("Cannot locate Dockerfile: %q", absDockerfile)
|
return "", "", errors.Errorf("Cannot locate Dockerfile: %q", absDockerfile)
|
||||||
}
|
}
|
||||||
return "", "", fmt.Errorf("unable to stat Dockerfile: %v", err)
|
return "", "", errors.Errorf("unable to stat Dockerfile: %v", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
if relDockerfile, err = filepath.Rel(absContextDir, absDockerfile); err != nil {
|
if relDockerfile, err = filepath.Rel(absContextDir, absDockerfile); err != nil {
|
||||||
return "", "", fmt.Errorf("unable to get relative Dockerfile path: %v", err)
|
return "", "", errors.Errorf("unable to get relative Dockerfile path: %v", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
if strings.HasPrefix(relDockerfile, ".."+string(filepath.Separator)) {
|
if strings.HasPrefix(relDockerfile, ".."+string(filepath.Separator)) {
|
||||||
return "", "", fmt.Errorf("The Dockerfile (%s) must be within the build context (%s)", givenDockerfile, givenContextDir)
|
return "", "", errors.Errorf("The Dockerfile (%s) must be within the build context (%s)", givenDockerfile, givenContextDir)
|
||||||
}
|
}
|
||||||
|
|
||||||
return absContextDir, relDockerfile, nil
|
return absContextDir, relDockerfile, nil
|
||||||
|
|
|
@ -1,7 +1,6 @@
|
||||||
package image
|
package image
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"fmt"
|
|
||||||
"io"
|
"io"
|
||||||
|
|
||||||
"golang.org/x/net/context"
|
"golang.org/x/net/context"
|
||||||
|
@ -10,6 +9,7 @@ import (
|
||||||
"github.com/docker/docker/cli/command"
|
"github.com/docker/docker/cli/command"
|
||||||
"github.com/docker/docker/pkg/jsonmessage"
|
"github.com/docker/docker/pkg/jsonmessage"
|
||||||
"github.com/docker/docker/pkg/system"
|
"github.com/docker/docker/pkg/system"
|
||||||
|
"github.com/pkg/errors"
|
||||||
"github.com/spf13/cobra"
|
"github.com/spf13/cobra"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
@ -56,7 +56,7 @@ func runLoad(dockerCli *command.DockerCli, opts loadOptions) error {
|
||||||
// To avoid getting stuck, verify that a tar file is given either in
|
// To avoid getting stuck, verify that a tar file is given either in
|
||||||
// the input flag or through stdin and if not display an error message and exit.
|
// the input flag or through stdin and if not display an error message and exit.
|
||||||
if opts.input == "" && dockerCli.In().IsTerminal() {
|
if opts.input == "" && dockerCli.In().IsTerminal() {
|
||||||
return fmt.Errorf("requested load from stdin, but stdin is empty")
|
return errors.Errorf("requested load from stdin, but stdin is empty")
|
||||||
}
|
}
|
||||||
|
|
||||||
if !dockerCli.Out().IsTerminal() {
|
if !dockerCli.Out().IsTerminal() {
|
||||||
|
|
|
@ -1,17 +1,16 @@
|
||||||
package image
|
package image
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"errors"
|
|
||||||
"fmt"
|
"fmt"
|
||||||
"strings"
|
"strings"
|
||||||
|
|
||||||
"golang.org/x/net/context"
|
|
||||||
|
|
||||||
"github.com/docker/distribution/reference"
|
"github.com/docker/distribution/reference"
|
||||||
"github.com/docker/docker/cli"
|
"github.com/docker/docker/cli"
|
||||||
"github.com/docker/docker/cli/command"
|
"github.com/docker/docker/cli/command"
|
||||||
"github.com/docker/docker/registry"
|
"github.com/docker/docker/registry"
|
||||||
|
"github.com/pkg/errors"
|
||||||
"github.com/spf13/cobra"
|
"github.com/spf13/cobra"
|
||||||
|
"golang.org/x/net/context"
|
||||||
)
|
)
|
||||||
|
|
||||||
type pullOptions struct {
|
type pullOptions struct {
|
||||||
|
|
|
@ -9,6 +9,7 @@ import (
|
||||||
"github.com/docker/docker/api/types"
|
"github.com/docker/docker/api/types"
|
||||||
"github.com/docker/docker/cli"
|
"github.com/docker/docker/cli"
|
||||||
"github.com/docker/docker/cli/command"
|
"github.com/docker/docker/cli/command"
|
||||||
|
"github.com/pkg/errors"
|
||||||
"github.com/spf13/cobra"
|
"github.com/spf13/cobra"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
@ -71,7 +72,7 @@ func runRemove(dockerCli *command.DockerCli, opts removeOptions, images []string
|
||||||
}
|
}
|
||||||
|
|
||||||
if len(errs) > 0 {
|
if len(errs) > 0 {
|
||||||
return fmt.Errorf("%s", strings.Join(errs, "\n"))
|
return errors.Errorf("%s", strings.Join(errs, "\n"))
|
||||||
}
|
}
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,14 +1,13 @@
|
||||||
package image
|
package image
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"errors"
|
|
||||||
"io"
|
"io"
|
||||||
|
|
||||||
"golang.org/x/net/context"
|
|
||||||
|
|
||||||
"github.com/docker/docker/cli"
|
"github.com/docker/docker/cli"
|
||||||
"github.com/docker/docker/cli/command"
|
"github.com/docker/docker/cli/command"
|
||||||
|
"github.com/pkg/errors"
|
||||||
"github.com/spf13/cobra"
|
"github.com/spf13/cobra"
|
||||||
|
"golang.org/x/net/context"
|
||||||
)
|
)
|
||||||
|
|
||||||
type saveOptions struct {
|
type saveOptions struct {
|
||||||
|
|
|
@ -3,7 +3,6 @@ package image
|
||||||
import (
|
import (
|
||||||
"encoding/hex"
|
"encoding/hex"
|
||||||
"encoding/json"
|
"encoding/json"
|
||||||
"errors"
|
|
||||||
"fmt"
|
"fmt"
|
||||||
"io"
|
"io"
|
||||||
"path"
|
"path"
|
||||||
|
@ -19,6 +18,7 @@ import (
|
||||||
"github.com/docker/notary/client"
|
"github.com/docker/notary/client"
|
||||||
"github.com/docker/notary/tuf/data"
|
"github.com/docker/notary/tuf/data"
|
||||||
"github.com/opencontainers/go-digest"
|
"github.com/opencontainers/go-digest"
|
||||||
|
"github.com/pkg/errors"
|
||||||
"golang.org/x/net/context"
|
"golang.org/x/net/context"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
@ -92,7 +92,7 @@ func PushTrustedReference(cli *command.DockerCli, repoInfo *registry.RepositoryI
|
||||||
}
|
}
|
||||||
|
|
||||||
if cnt > 1 {
|
if cnt > 1 {
|
||||||
return fmt.Errorf("internal error: only one call to handleTarget expected")
|
return errors.Errorf("internal error: only one call to handleTarget expected")
|
||||||
}
|
}
|
||||||
|
|
||||||
if target == nil {
|
if target == nil {
|
||||||
|
@ -195,7 +195,7 @@ func addTargetToAllSignableRoles(repo *client.NotaryRepository, target *client.T
|
||||||
}
|
}
|
||||||
|
|
||||||
if len(signableRoles) == 0 {
|
if len(signableRoles) == 0 {
|
||||||
return fmt.Errorf("no valid signing keys for delegation roles")
|
return errors.Errorf("no valid signing keys for delegation roles")
|
||||||
}
|
}
|
||||||
|
|
||||||
return repo.AddTarget(target, signableRoles...)
|
return repo.AddTarget(target, signableRoles...)
|
||||||
|
@ -245,7 +245,7 @@ func trustedPull(ctx context.Context, cli *command.DockerCli, repoInfo *registry
|
||||||
refs = append(refs, t)
|
refs = append(refs, t)
|
||||||
}
|
}
|
||||||
if len(refs) == 0 {
|
if len(refs) == 0 {
|
||||||
return trust.NotaryError(ref.Name(), fmt.Errorf("No trusted tags for %s", ref.Name()))
|
return trust.NotaryError(ref.Name(), errors.Errorf("No trusted tags for %s", ref.Name()))
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
t, err := notaryRepo.GetTargetByName(tagged.Tag(), trust.ReleasesRole, data.CanonicalTargetsRole)
|
t, err := notaryRepo.GetTargetByName(tagged.Tag(), trust.ReleasesRole, data.CanonicalTargetsRole)
|
||||||
|
@ -255,7 +255,7 @@ func trustedPull(ctx context.Context, cli *command.DockerCli, repoInfo *registry
|
||||||
// Only get the tag if it's in the top level targets role or the releases delegation role
|
// Only get the tag if it's in the top level targets role or the releases delegation role
|
||||||
// ignore it if it's in any other delegation roles
|
// ignore it if it's in any other delegation roles
|
||||||
if t.Role != trust.ReleasesRole && t.Role != data.CanonicalTargetsRole {
|
if t.Role != trust.ReleasesRole && t.Role != data.CanonicalTargetsRole {
|
||||||
return trust.NotaryError(ref.Name(), fmt.Errorf("No trust data for %s", tagged.Tag()))
|
return trust.NotaryError(ref.Name(), errors.Errorf("No trust data for %s", tagged.Tag()))
|
||||||
}
|
}
|
||||||
|
|
||||||
logrus.Debugf("retrieving target for %s role\n", t.Role)
|
logrus.Debugf("retrieving target for %s role\n", t.Role)
|
||||||
|
@ -347,7 +347,7 @@ func TrustedReference(ctx context.Context, cli *command.DockerCli, ref reference
|
||||||
// Only list tags in the top level targets role or the releases delegation role - ignore
|
// Only list tags in the top level targets role or the releases delegation role - ignore
|
||||||
// all other delegation roles
|
// all other delegation roles
|
||||||
if t.Role != trust.ReleasesRole && t.Role != data.CanonicalTargetsRole {
|
if t.Role != trust.ReleasesRole && t.Role != data.CanonicalTargetsRole {
|
||||||
return nil, trust.NotaryError(repoInfo.Name.Name(), fmt.Errorf("No trust data for %s", ref.Tag()))
|
return nil, trust.NotaryError(repoInfo.Name.Name(), errors.Errorf("No trust data for %s", ref.Tag()))
|
||||||
}
|
}
|
||||||
r, err := convertTarget(t.Target)
|
r, err := convertTarget(t.Target)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
|
|
@ -1,12 +1,12 @@
|
||||||
package command
|
package command
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"errors"
|
|
||||||
"io"
|
"io"
|
||||||
"os"
|
"os"
|
||||||
"runtime"
|
"runtime"
|
||||||
|
|
||||||
"github.com/docker/docker/pkg/term"
|
"github.com/docker/docker/pkg/term"
|
||||||
|
"github.com/pkg/errors"
|
||||||
)
|
)
|
||||||
|
|
||||||
// InStream is an input stream used by the DockerCli to read user input
|
// InStream is an input stream used by the DockerCli to read user input
|
||||||
|
|
|
@ -3,7 +3,6 @@ package inspect
|
||||||
import (
|
import (
|
||||||
"bytes"
|
"bytes"
|
||||||
"encoding/json"
|
"encoding/json"
|
||||||
"fmt"
|
|
||||||
"io"
|
"io"
|
||||||
"strings"
|
"strings"
|
||||||
"text/template"
|
"text/template"
|
||||||
|
@ -11,6 +10,7 @@ import (
|
||||||
"github.com/Sirupsen/logrus"
|
"github.com/Sirupsen/logrus"
|
||||||
"github.com/docker/docker/cli"
|
"github.com/docker/docker/cli"
|
||||||
"github.com/docker/docker/pkg/templates"
|
"github.com/docker/docker/pkg/templates"
|
||||||
|
"github.com/pkg/errors"
|
||||||
)
|
)
|
||||||
|
|
||||||
// Inspector defines an interface to implement to process elements
|
// Inspector defines an interface to implement to process elements
|
||||||
|
@ -44,7 +44,7 @@ func NewTemplateInspectorFromString(out io.Writer, tmplStr string) (Inspector, e
|
||||||
|
|
||||||
tmpl, err := templates.Parse(tmplStr)
|
tmpl, err := templates.Parse(tmplStr)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, fmt.Errorf("Template parsing error: %s", err)
|
return nil, errors.Errorf("Template parsing error: %s", err)
|
||||||
}
|
}
|
||||||
return NewTemplateInspector(out, tmpl), nil
|
return NewTemplateInspector(out, tmpl), nil
|
||||||
}
|
}
|
||||||
|
@ -94,7 +94,7 @@ func (i *TemplateInspector) Inspect(typedElement interface{}, rawElement []byte)
|
||||||
buffer := new(bytes.Buffer)
|
buffer := new(bytes.Buffer)
|
||||||
if err := i.tmpl.Execute(buffer, typedElement); err != nil {
|
if err := i.tmpl.Execute(buffer, typedElement); err != nil {
|
||||||
if rawElement == nil {
|
if rawElement == nil {
|
||||||
return fmt.Errorf("Template parsing error: %v", err)
|
return errors.Errorf("Template parsing error: %v", err)
|
||||||
}
|
}
|
||||||
return i.tryRawInspectFallback(rawElement)
|
return i.tryRawInspectFallback(rawElement)
|
||||||
}
|
}
|
||||||
|
@ -112,12 +112,12 @@ func (i *TemplateInspector) tryRawInspectFallback(rawElement []byte) error {
|
||||||
dec := json.NewDecoder(rdr)
|
dec := json.NewDecoder(rdr)
|
||||||
|
|
||||||
if rawErr := dec.Decode(&raw); rawErr != nil {
|
if rawErr := dec.Decode(&raw); rawErr != nil {
|
||||||
return fmt.Errorf("unable to read inspect data: %v", rawErr)
|
return errors.Errorf("unable to read inspect data: %v", rawErr)
|
||||||
}
|
}
|
||||||
|
|
||||||
tmplMissingKey := i.tmpl.Option("missingkey=error")
|
tmplMissingKey := i.tmpl.Option("missingkey=error")
|
||||||
if rawErr := tmplMissingKey.Execute(buffer, raw); rawErr != nil {
|
if rawErr := tmplMissingKey.Execute(buffer, raw); rawErr != nil {
|
||||||
return fmt.Errorf("Template parsing error: %v", rawErr)
|
return errors.Errorf("Template parsing error: %v", rawErr)
|
||||||
}
|
}
|
||||||
|
|
||||||
i.buffer.Write(buffer.Bytes())
|
i.buffer.Write(buffer.Bytes())
|
||||||
|
|
|
@ -13,6 +13,7 @@ import (
|
||||||
"github.com/docker/docker/cli/command"
|
"github.com/docker/docker/cli/command"
|
||||||
"github.com/docker/docker/opts"
|
"github.com/docker/docker/opts"
|
||||||
runconfigopts "github.com/docker/docker/runconfig/opts"
|
runconfigopts "github.com/docker/docker/runconfig/opts"
|
||||||
|
"github.com/pkg/errors"
|
||||||
"github.com/spf13/cobra"
|
"github.com/spf13/cobra"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
@ -114,7 +115,7 @@ func runCreate(dockerCli *command.DockerCli, opts createOptions) error {
|
||||||
// structured ipam data.
|
// structured ipam data.
|
||||||
func consolidateIpam(subnets, ranges, gateways []string, auxaddrs map[string]string) ([]network.IPAMConfig, error) {
|
func consolidateIpam(subnets, ranges, gateways []string, auxaddrs map[string]string) ([]network.IPAMConfig, error) {
|
||||||
if len(subnets) < len(ranges) || len(subnets) < len(gateways) {
|
if len(subnets) < len(ranges) || len(subnets) < len(gateways) {
|
||||||
return nil, fmt.Errorf("every ip-range or gateway must have a corresponding subnet")
|
return nil, errors.Errorf("every ip-range or gateway must have a corresponding subnet")
|
||||||
}
|
}
|
||||||
iData := map[string]*network.IPAMConfig{}
|
iData := map[string]*network.IPAMConfig{}
|
||||||
|
|
||||||
|
@ -130,7 +131,7 @@ func consolidateIpam(subnets, ranges, gateways []string, auxaddrs map[string]str
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
if ok1 || ok2 {
|
if ok1 || ok2 {
|
||||||
return nil, fmt.Errorf("multiple overlapping subnet configuration is not supported")
|
return nil, errors.Errorf("multiple overlapping subnet configuration is not supported")
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
iData[s] = &network.IPAMConfig{Subnet: s, AuxAddress: map[string]string{}}
|
iData[s] = &network.IPAMConfig{Subnet: s, AuxAddress: map[string]string{}}
|
||||||
|
@ -148,14 +149,14 @@ func consolidateIpam(subnets, ranges, gateways []string, auxaddrs map[string]str
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
if iData[s].IPRange != "" {
|
if iData[s].IPRange != "" {
|
||||||
return nil, fmt.Errorf("cannot configure multiple ranges (%s, %s) on the same subnet (%s)", r, iData[s].IPRange, s)
|
return nil, errors.Errorf("cannot configure multiple ranges (%s, %s) on the same subnet (%s)", r, iData[s].IPRange, s)
|
||||||
}
|
}
|
||||||
d := iData[s]
|
d := iData[s]
|
||||||
d.IPRange = r
|
d.IPRange = r
|
||||||
match = true
|
match = true
|
||||||
}
|
}
|
||||||
if !match {
|
if !match {
|
||||||
return nil, fmt.Errorf("no matching subnet for range %s", r)
|
return nil, errors.Errorf("no matching subnet for range %s", r)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -171,14 +172,14 @@ func consolidateIpam(subnets, ranges, gateways []string, auxaddrs map[string]str
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
if iData[s].Gateway != "" {
|
if iData[s].Gateway != "" {
|
||||||
return nil, fmt.Errorf("cannot configure multiple gateways (%s, %s) for the same subnet (%s)", g, iData[s].Gateway, s)
|
return nil, errors.Errorf("cannot configure multiple gateways (%s, %s) for the same subnet (%s)", g, iData[s].Gateway, s)
|
||||||
}
|
}
|
||||||
d := iData[s]
|
d := iData[s]
|
||||||
d.Gateway = g
|
d.Gateway = g
|
||||||
match = true
|
match = true
|
||||||
}
|
}
|
||||||
if !match {
|
if !match {
|
||||||
return nil, fmt.Errorf("no matching subnet for gateway %s", g)
|
return nil, errors.Errorf("no matching subnet for gateway %s", g)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -197,7 +198,7 @@ func consolidateIpam(subnets, ranges, gateways []string, auxaddrs map[string]str
|
||||||
match = true
|
match = true
|
||||||
}
|
}
|
||||||
if !match {
|
if !match {
|
||||||
return nil, fmt.Errorf("no matching subnet for aux-address %s", aa)
|
return nil, errors.Errorf("no matching subnet for aux-address %s", aa)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -215,13 +216,13 @@ func subnetMatches(subnet, data string) (bool, error) {
|
||||||
|
|
||||||
_, s, err := net.ParseCIDR(subnet)
|
_, s, err := net.ParseCIDR(subnet)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return false, fmt.Errorf("Invalid subnet %s : %v", s, err)
|
return false, errors.Errorf("Invalid subnet %s : %v", s, err)
|
||||||
}
|
}
|
||||||
|
|
||||||
if strings.Contains(data, "/") {
|
if strings.Contains(data, "/") {
|
||||||
ip, _, err = net.ParseCIDR(data)
|
ip, _, err = net.ParseCIDR(data)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return false, fmt.Errorf("Invalid cidr %s : %v", data, err)
|
return false, errors.Errorf("Invalid cidr %s : %v", data, err)
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
ip = net.ParseIP(data)
|
ip = net.ParseIP(data)
|
||||||
|
|
|
@ -2,12 +2,12 @@ package node
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"bytes"
|
"bytes"
|
||||||
"fmt"
|
|
||||||
"io/ioutil"
|
"io/ioutil"
|
||||||
"testing"
|
"testing"
|
||||||
|
|
||||||
"github.com/docker/docker/api/types/swarm"
|
"github.com/docker/docker/api/types/swarm"
|
||||||
"github.com/docker/docker/cli/internal/test"
|
"github.com/docker/docker/cli/internal/test"
|
||||||
|
"github.com/pkg/errors"
|
||||||
// Import builders to get the builder function as package function
|
// Import builders to get the builder function as package function
|
||||||
. "github.com/docker/docker/cli/internal/test/builders"
|
. "github.com/docker/docker/cli/internal/test/builders"
|
||||||
"github.com/docker/docker/pkg/testutil/assert"
|
"github.com/docker/docker/pkg/testutil/assert"
|
||||||
|
@ -26,14 +26,14 @@ func TestNodeDemoteErrors(t *testing.T) {
|
||||||
{
|
{
|
||||||
args: []string{"nodeID"},
|
args: []string{"nodeID"},
|
||||||
nodeInspectFunc: func() (swarm.Node, []byte, error) {
|
nodeInspectFunc: func() (swarm.Node, []byte, error) {
|
||||||
return swarm.Node{}, []byte{}, fmt.Errorf("error inspecting the node")
|
return swarm.Node{}, []byte{}, errors.Errorf("error inspecting the node")
|
||||||
},
|
},
|
||||||
expectedError: "error inspecting the node",
|
expectedError: "error inspecting the node",
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
args: []string{"nodeID"},
|
args: []string{"nodeID"},
|
||||||
nodeUpdateFunc: func(nodeID string, version swarm.Version, node swarm.NodeSpec) error {
|
nodeUpdateFunc: func(nodeID string, version swarm.Version, node swarm.NodeSpec) error {
|
||||||
return fmt.Errorf("error updating the node")
|
return errors.Errorf("error updating the node")
|
||||||
},
|
},
|
||||||
expectedError: "error updating the node",
|
expectedError: "error updating the node",
|
||||||
},
|
},
|
||||||
|
@ -60,7 +60,7 @@ func TestNodeDemoteNoChange(t *testing.T) {
|
||||||
},
|
},
|
||||||
nodeUpdateFunc: func(nodeID string, version swarm.Version, node swarm.NodeSpec) error {
|
nodeUpdateFunc: func(nodeID string, version swarm.Version, node swarm.NodeSpec) error {
|
||||||
if node.Role != swarm.NodeRoleWorker {
|
if node.Role != swarm.NodeRoleWorker {
|
||||||
return fmt.Errorf("expected role worker, got %s", node.Role)
|
return errors.Errorf("expected role worker, got %s", node.Role)
|
||||||
}
|
}
|
||||||
return nil
|
return nil
|
||||||
},
|
},
|
||||||
|
@ -78,7 +78,7 @@ func TestNodeDemoteMultipleNode(t *testing.T) {
|
||||||
},
|
},
|
||||||
nodeUpdateFunc: func(nodeID string, version swarm.Version, node swarm.NodeSpec) error {
|
nodeUpdateFunc: func(nodeID string, version swarm.Version, node swarm.NodeSpec) error {
|
||||||
if node.Role != swarm.NodeRoleWorker {
|
if node.Role != swarm.NodeRoleWorker {
|
||||||
return fmt.Errorf("expected role worker, got %s", node.Role)
|
return errors.Errorf("expected role worker, got %s", node.Role)
|
||||||
}
|
}
|
||||||
return nil
|
return nil
|
||||||
},
|
},
|
||||||
|
|
|
@ -9,6 +9,7 @@ import (
|
||||||
"github.com/docker/docker/api/types"
|
"github.com/docker/docker/api/types"
|
||||||
"github.com/docker/docker/api/types/swarm"
|
"github.com/docker/docker/api/types/swarm"
|
||||||
"github.com/docker/docker/cli/internal/test"
|
"github.com/docker/docker/cli/internal/test"
|
||||||
|
"github.com/pkg/errors"
|
||||||
// Import builders to get the builder function as package function
|
// Import builders to get the builder function as package function
|
||||||
. "github.com/docker/docker/cli/internal/test/builders"
|
. "github.com/docker/docker/cli/internal/test/builders"
|
||||||
"github.com/docker/docker/pkg/testutil/assert"
|
"github.com/docker/docker/pkg/testutil/assert"
|
||||||
|
@ -29,24 +30,24 @@ func TestNodeInspectErrors(t *testing.T) {
|
||||||
{
|
{
|
||||||
args: []string{"self"},
|
args: []string{"self"},
|
||||||
infoFunc: func() (types.Info, error) {
|
infoFunc: func() (types.Info, error) {
|
||||||
return types.Info{}, fmt.Errorf("error asking for node info")
|
return types.Info{}, errors.Errorf("error asking for node info")
|
||||||
},
|
},
|
||||||
expectedError: "error asking for node info",
|
expectedError: "error asking for node info",
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
args: []string{"nodeID"},
|
args: []string{"nodeID"},
|
||||||
nodeInspectFunc: func() (swarm.Node, []byte, error) {
|
nodeInspectFunc: func() (swarm.Node, []byte, error) {
|
||||||
return swarm.Node{}, []byte{}, fmt.Errorf("error inspecting the node")
|
return swarm.Node{}, []byte{}, errors.Errorf("error inspecting the node")
|
||||||
},
|
},
|
||||||
infoFunc: func() (types.Info, error) {
|
infoFunc: func() (types.Info, error) {
|
||||||
return types.Info{}, fmt.Errorf("error asking for node info")
|
return types.Info{}, errors.Errorf("error asking for node info")
|
||||||
},
|
},
|
||||||
expectedError: "error inspecting the node",
|
expectedError: "error inspecting the node",
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
args: []string{"self"},
|
args: []string{"self"},
|
||||||
nodeInspectFunc: func() (swarm.Node, []byte, error) {
|
nodeInspectFunc: func() (swarm.Node, []byte, error) {
|
||||||
return swarm.Node{}, []byte{}, fmt.Errorf("error inspecting the node")
|
return swarm.Node{}, []byte{}, errors.Errorf("error inspecting the node")
|
||||||
},
|
},
|
||||||
infoFunc: func() (types.Info, error) {
|
infoFunc: func() (types.Info, error) {
|
||||||
return types.Info{}, nil
|
return types.Info{}, nil
|
||||||
|
@ -59,7 +60,7 @@ func TestNodeInspectErrors(t *testing.T) {
|
||||||
"pretty": "true",
|
"pretty": "true",
|
||||||
},
|
},
|
||||||
infoFunc: func() (types.Info, error) {
|
infoFunc: func() (types.Info, error) {
|
||||||
return types.Info{}, fmt.Errorf("error asking for node info")
|
return types.Info{}, errors.Errorf("error asking for node info")
|
||||||
},
|
},
|
||||||
expectedError: "error asking for node info",
|
expectedError: "error asking for node info",
|
||||||
},
|
},
|
||||||
|
|
|
@ -2,13 +2,13 @@ package node
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"bytes"
|
"bytes"
|
||||||
"fmt"
|
|
||||||
"io/ioutil"
|
"io/ioutil"
|
||||||
"testing"
|
"testing"
|
||||||
|
|
||||||
"github.com/docker/docker/api/types"
|
"github.com/docker/docker/api/types"
|
||||||
"github.com/docker/docker/api/types/swarm"
|
"github.com/docker/docker/api/types/swarm"
|
||||||
"github.com/docker/docker/cli/internal/test"
|
"github.com/docker/docker/cli/internal/test"
|
||||||
|
"github.com/pkg/errors"
|
||||||
// Import builders to get the builder function as package function
|
// Import builders to get the builder function as package function
|
||||||
. "github.com/docker/docker/cli/internal/test/builders"
|
. "github.com/docker/docker/cli/internal/test/builders"
|
||||||
"github.com/docker/docker/pkg/testutil/assert"
|
"github.com/docker/docker/pkg/testutil/assert"
|
||||||
|
@ -22,7 +22,7 @@ func TestNodeListErrorOnAPIFailure(t *testing.T) {
|
||||||
}{
|
}{
|
||||||
{
|
{
|
||||||
nodeListFunc: func() ([]swarm.Node, error) {
|
nodeListFunc: func() ([]swarm.Node, error) {
|
||||||
return []swarm.Node{}, fmt.Errorf("error listing nodes")
|
return []swarm.Node{}, errors.Errorf("error listing nodes")
|
||||||
},
|
},
|
||||||
expectedError: "error listing nodes",
|
expectedError: "error listing nodes",
|
||||||
},
|
},
|
||||||
|
@ -35,7 +35,7 @@ func TestNodeListErrorOnAPIFailure(t *testing.T) {
|
||||||
}, nil
|
}, nil
|
||||||
},
|
},
|
||||||
infoFunc: func() (types.Info, error) {
|
infoFunc: func() (types.Info, error) {
|
||||||
return types.Info{}, fmt.Errorf("error asking for node info")
|
return types.Info{}, errors.Errorf("error asking for node info")
|
||||||
},
|
},
|
||||||
expectedError: "error asking for node info",
|
expectedError: "error asking for node info",
|
||||||
},
|
},
|
||||||
|
|
|
@ -2,12 +2,12 @@ package node
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"bytes"
|
"bytes"
|
||||||
"fmt"
|
|
||||||
"io/ioutil"
|
"io/ioutil"
|
||||||
"testing"
|
"testing"
|
||||||
|
|
||||||
"github.com/docker/docker/api/types/swarm"
|
"github.com/docker/docker/api/types/swarm"
|
||||||
"github.com/docker/docker/cli/internal/test"
|
"github.com/docker/docker/cli/internal/test"
|
||||||
|
"github.com/pkg/errors"
|
||||||
// Import builders to get the builder function as package function
|
// Import builders to get the builder function as package function
|
||||||
. "github.com/docker/docker/cli/internal/test/builders"
|
. "github.com/docker/docker/cli/internal/test/builders"
|
||||||
"github.com/docker/docker/pkg/testutil/assert"
|
"github.com/docker/docker/pkg/testutil/assert"
|
||||||
|
@ -26,14 +26,14 @@ func TestNodePromoteErrors(t *testing.T) {
|
||||||
{
|
{
|
||||||
args: []string{"nodeID"},
|
args: []string{"nodeID"},
|
||||||
nodeInspectFunc: func() (swarm.Node, []byte, error) {
|
nodeInspectFunc: func() (swarm.Node, []byte, error) {
|
||||||
return swarm.Node{}, []byte{}, fmt.Errorf("error inspecting the node")
|
return swarm.Node{}, []byte{}, errors.Errorf("error inspecting the node")
|
||||||
},
|
},
|
||||||
expectedError: "error inspecting the node",
|
expectedError: "error inspecting the node",
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
args: []string{"nodeID"},
|
args: []string{"nodeID"},
|
||||||
nodeUpdateFunc: func(nodeID string, version swarm.Version, node swarm.NodeSpec) error {
|
nodeUpdateFunc: func(nodeID string, version swarm.Version, node swarm.NodeSpec) error {
|
||||||
return fmt.Errorf("error updating the node")
|
return errors.Errorf("error updating the node")
|
||||||
},
|
},
|
||||||
expectedError: "error updating the node",
|
expectedError: "error updating the node",
|
||||||
},
|
},
|
||||||
|
@ -60,7 +60,7 @@ func TestNodePromoteNoChange(t *testing.T) {
|
||||||
},
|
},
|
||||||
nodeUpdateFunc: func(nodeID string, version swarm.Version, node swarm.NodeSpec) error {
|
nodeUpdateFunc: func(nodeID string, version swarm.Version, node swarm.NodeSpec) error {
|
||||||
if node.Role != swarm.NodeRoleManager {
|
if node.Role != swarm.NodeRoleManager {
|
||||||
return fmt.Errorf("expected role manager, got %s", node.Role)
|
return errors.Errorf("expected role manager, got %s", node.Role)
|
||||||
}
|
}
|
||||||
return nil
|
return nil
|
||||||
},
|
},
|
||||||
|
@ -78,7 +78,7 @@ func TestNodePromoteMultipleNode(t *testing.T) {
|
||||||
},
|
},
|
||||||
nodeUpdateFunc: func(nodeID string, version swarm.Version, node swarm.NodeSpec) error {
|
nodeUpdateFunc: func(nodeID string, version swarm.Version, node swarm.NodeSpec) error {
|
||||||
if node.Role != swarm.NodeRoleManager {
|
if node.Role != swarm.NodeRoleManager {
|
||||||
return fmt.Errorf("expected role manager, got %s", node.Role)
|
return errors.Errorf("expected role manager, got %s", node.Role)
|
||||||
}
|
}
|
||||||
return nil
|
return nil
|
||||||
},
|
},
|
||||||
|
|
|
@ -1,7 +1,6 @@
|
||||||
package node
|
package node
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"fmt"
|
|
||||||
"strings"
|
"strings"
|
||||||
|
|
||||||
"github.com/docker/docker/api/types"
|
"github.com/docker/docker/api/types"
|
||||||
|
@ -12,6 +11,7 @@ import (
|
||||||
"github.com/docker/docker/cli/command/idresolver"
|
"github.com/docker/docker/cli/command/idresolver"
|
||||||
"github.com/docker/docker/cli/command/task"
|
"github.com/docker/docker/cli/command/task"
|
||||||
"github.com/docker/docker/opts"
|
"github.com/docker/docker/opts"
|
||||||
|
"github.com/pkg/errors"
|
||||||
"github.com/spf13/cobra"
|
"github.com/spf13/cobra"
|
||||||
"golang.org/x/net/context"
|
"golang.org/x/net/context"
|
||||||
)
|
)
|
||||||
|
@ -100,7 +100,7 @@ func runPs(dockerCli command.Cli, opts psOptions) error {
|
||||||
}
|
}
|
||||||
|
|
||||||
if len(errs) > 0 {
|
if len(errs) > 0 {
|
||||||
return fmt.Errorf("%s", strings.Join(errs, "\n"))
|
return errors.Errorf("%s", strings.Join(errs, "\n"))
|
||||||
}
|
}
|
||||||
|
|
||||||
return nil
|
return nil
|
||||||
|
|
|
@ -10,6 +10,7 @@ import (
|
||||||
"github.com/docker/docker/api/types"
|
"github.com/docker/docker/api/types"
|
||||||
"github.com/docker/docker/api/types/swarm"
|
"github.com/docker/docker/api/types/swarm"
|
||||||
"github.com/docker/docker/cli/internal/test"
|
"github.com/docker/docker/cli/internal/test"
|
||||||
|
"github.com/pkg/errors"
|
||||||
// Import builders to get the builder function as package function
|
// Import builders to get the builder function as package function
|
||||||
. "github.com/docker/docker/cli/internal/test/builders"
|
. "github.com/docker/docker/cli/internal/test/builders"
|
||||||
"github.com/docker/docker/pkg/testutil/assert"
|
"github.com/docker/docker/pkg/testutil/assert"
|
||||||
|
@ -28,21 +29,21 @@ func TestNodePsErrors(t *testing.T) {
|
||||||
}{
|
}{
|
||||||
{
|
{
|
||||||
infoFunc: func() (types.Info, error) {
|
infoFunc: func() (types.Info, error) {
|
||||||
return types.Info{}, fmt.Errorf("error asking for node info")
|
return types.Info{}, errors.Errorf("error asking for node info")
|
||||||
},
|
},
|
||||||
expectedError: "error asking for node info",
|
expectedError: "error asking for node info",
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
args: []string{"nodeID"},
|
args: []string{"nodeID"},
|
||||||
nodeInspectFunc: func() (swarm.Node, []byte, error) {
|
nodeInspectFunc: func() (swarm.Node, []byte, error) {
|
||||||
return swarm.Node{}, []byte{}, fmt.Errorf("error inspecting the node")
|
return swarm.Node{}, []byte{}, errors.Errorf("error inspecting the node")
|
||||||
},
|
},
|
||||||
expectedError: "error inspecting the node",
|
expectedError: "error inspecting the node",
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
args: []string{"nodeID"},
|
args: []string{"nodeID"},
|
||||||
taskListFunc: func(options types.TaskListOptions) ([]swarm.Task, error) {
|
taskListFunc: func(options types.TaskListOptions) ([]swarm.Task, error) {
|
||||||
return []swarm.Task{}, fmt.Errorf("error returning the task list")
|
return []swarm.Task{}, errors.Errorf("error returning the task list")
|
||||||
},
|
},
|
||||||
expectedError: "error returning the task list",
|
expectedError: "error returning the task list",
|
||||||
},
|
},
|
||||||
|
|
|
@ -9,6 +9,7 @@ import (
|
||||||
"github.com/docker/docker/api/types"
|
"github.com/docker/docker/api/types"
|
||||||
"github.com/docker/docker/cli"
|
"github.com/docker/docker/cli"
|
||||||
"github.com/docker/docker/cli/command"
|
"github.com/docker/docker/cli/command"
|
||||||
|
"github.com/pkg/errors"
|
||||||
"github.com/spf13/cobra"
|
"github.com/spf13/cobra"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
@ -49,7 +50,7 @@ func runRemove(dockerCli command.Cli, args []string, opts removeOptions) error {
|
||||||
}
|
}
|
||||||
|
|
||||||
if len(errs) > 0 {
|
if len(errs) > 0 {
|
||||||
return fmt.Errorf("%s", strings.Join(errs, "\n"))
|
return errors.Errorf("%s", strings.Join(errs, "\n"))
|
||||||
}
|
}
|
||||||
|
|
||||||
return nil
|
return nil
|
||||||
|
|
|
@ -2,12 +2,12 @@ package node
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"bytes"
|
"bytes"
|
||||||
"fmt"
|
|
||||||
"io/ioutil"
|
"io/ioutil"
|
||||||
"testing"
|
"testing"
|
||||||
|
|
||||||
"github.com/docker/docker/cli/internal/test"
|
"github.com/docker/docker/cli/internal/test"
|
||||||
"github.com/docker/docker/pkg/testutil/assert"
|
"github.com/docker/docker/pkg/testutil/assert"
|
||||||
|
"github.com/pkg/errors"
|
||||||
)
|
)
|
||||||
|
|
||||||
func TestNodeRemoveErrors(t *testing.T) {
|
func TestNodeRemoveErrors(t *testing.T) {
|
||||||
|
@ -22,7 +22,7 @@ func TestNodeRemoveErrors(t *testing.T) {
|
||||||
{
|
{
|
||||||
args: []string{"nodeID"},
|
args: []string{"nodeID"},
|
||||||
nodeRemoveFunc: func() error {
|
nodeRemoveFunc: func() error {
|
||||||
return fmt.Errorf("error removing the node")
|
return errors.Errorf("error removing the node")
|
||||||
},
|
},
|
||||||
expectedError: "error removing the node",
|
expectedError: "error removing the node",
|
||||||
},
|
},
|
||||||
|
|
|
@ -1,7 +1,6 @@
|
||||||
package node
|
package node
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"errors"
|
|
||||||
"fmt"
|
"fmt"
|
||||||
|
|
||||||
"github.com/docker/docker/api/types/swarm"
|
"github.com/docker/docker/api/types/swarm"
|
||||||
|
@ -9,6 +8,7 @@ import (
|
||||||
"github.com/docker/docker/cli/command"
|
"github.com/docker/docker/cli/command"
|
||||||
"github.com/docker/docker/opts"
|
"github.com/docker/docker/opts"
|
||||||
runconfigopts "github.com/docker/docker/runconfig/opts"
|
runconfigopts "github.com/docker/docker/runconfig/opts"
|
||||||
|
"github.com/pkg/errors"
|
||||||
"github.com/spf13/cobra"
|
"github.com/spf13/cobra"
|
||||||
"github.com/spf13/pflag"
|
"github.com/spf13/pflag"
|
||||||
"golang.org/x/net/context"
|
"golang.org/x/net/context"
|
||||||
|
@ -104,7 +104,7 @@ func mergeNodeUpdate(flags *pflag.FlagSet) func(*swarm.Node) error {
|
||||||
for _, k := range keys {
|
for _, k := range keys {
|
||||||
// if a key doesn't exist, fail the command explicitly
|
// if a key doesn't exist, fail the command explicitly
|
||||||
if _, exists := spec.Annotations.Labels[k]; !exists {
|
if _, exists := spec.Annotations.Labels[k]; !exists {
|
||||||
return fmt.Errorf("key %s doesn't exist in node's labels", k)
|
return errors.Errorf("key %s doesn't exist in node's labels", k)
|
||||||
}
|
}
|
||||||
delete(spec.Annotations.Labels, k)
|
delete(spec.Annotations.Labels, k)
|
||||||
}
|
}
|
||||||
|
|
|
@ -2,12 +2,12 @@ package node
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"bytes"
|
"bytes"
|
||||||
"fmt"
|
|
||||||
"io/ioutil"
|
"io/ioutil"
|
||||||
"testing"
|
"testing"
|
||||||
|
|
||||||
"github.com/docker/docker/api/types/swarm"
|
"github.com/docker/docker/api/types/swarm"
|
||||||
"github.com/docker/docker/cli/internal/test"
|
"github.com/docker/docker/cli/internal/test"
|
||||||
|
"github.com/pkg/errors"
|
||||||
// Import builders to get the builder function as package function
|
// Import builders to get the builder function as package function
|
||||||
. "github.com/docker/docker/cli/internal/test/builders"
|
. "github.com/docker/docker/cli/internal/test/builders"
|
||||||
"github.com/docker/docker/pkg/testutil/assert"
|
"github.com/docker/docker/pkg/testutil/assert"
|
||||||
|
@ -31,14 +31,14 @@ func TestNodeUpdateErrors(t *testing.T) {
|
||||||
{
|
{
|
||||||
args: []string{"nodeID"},
|
args: []string{"nodeID"},
|
||||||
nodeInspectFunc: func() (swarm.Node, []byte, error) {
|
nodeInspectFunc: func() (swarm.Node, []byte, error) {
|
||||||
return swarm.Node{}, []byte{}, fmt.Errorf("error inspecting the node")
|
return swarm.Node{}, []byte{}, errors.Errorf("error inspecting the node")
|
||||||
},
|
},
|
||||||
expectedError: "error inspecting the node",
|
expectedError: "error inspecting the node",
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
args: []string{"nodeID"},
|
args: []string{"nodeID"},
|
||||||
nodeUpdateFunc: func(nodeID string, version swarm.Version, node swarm.NodeSpec) error {
|
nodeUpdateFunc: func(nodeID string, version swarm.Version, node swarm.NodeSpec) error {
|
||||||
return fmt.Errorf("error updating the node")
|
return errors.Errorf("error updating the node")
|
||||||
},
|
},
|
||||||
expectedError: "error updating the node",
|
expectedError: "error updating the node",
|
||||||
},
|
},
|
||||||
|
@ -88,7 +88,7 @@ func TestNodeUpdate(t *testing.T) {
|
||||||
},
|
},
|
||||||
nodeUpdateFunc: func(nodeID string, version swarm.Version, node swarm.NodeSpec) error {
|
nodeUpdateFunc: func(nodeID string, version swarm.Version, node swarm.NodeSpec) error {
|
||||||
if node.Role != swarm.NodeRoleManager {
|
if node.Role != swarm.NodeRoleManager {
|
||||||
return fmt.Errorf("expected role manager, got %s", node.Role)
|
return errors.Errorf("expected role manager, got %s", node.Role)
|
||||||
}
|
}
|
||||||
return nil
|
return nil
|
||||||
},
|
},
|
||||||
|
@ -103,7 +103,7 @@ func TestNodeUpdate(t *testing.T) {
|
||||||
},
|
},
|
||||||
nodeUpdateFunc: func(nodeID string, version swarm.Version, node swarm.NodeSpec) error {
|
nodeUpdateFunc: func(nodeID string, version swarm.Version, node swarm.NodeSpec) error {
|
||||||
if node.Availability != swarm.NodeAvailabilityDrain {
|
if node.Availability != swarm.NodeAvailabilityDrain {
|
||||||
return fmt.Errorf("expected drain availability, got %s", node.Availability)
|
return errors.Errorf("expected drain availability, got %s", node.Availability)
|
||||||
}
|
}
|
||||||
return nil
|
return nil
|
||||||
},
|
},
|
||||||
|
@ -118,7 +118,7 @@ func TestNodeUpdate(t *testing.T) {
|
||||||
},
|
},
|
||||||
nodeUpdateFunc: func(nodeID string, version swarm.Version, node swarm.NodeSpec) error {
|
nodeUpdateFunc: func(nodeID string, version swarm.Version, node swarm.NodeSpec) error {
|
||||||
if _, present := node.Annotations.Labels["lbl"]; !present {
|
if _, present := node.Annotations.Labels["lbl"]; !present {
|
||||||
return fmt.Errorf("expected 'lbl' label, got %v", node.Annotations.Labels)
|
return errors.Errorf("expected 'lbl' label, got %v", node.Annotations.Labels)
|
||||||
}
|
}
|
||||||
return nil
|
return nil
|
||||||
},
|
},
|
||||||
|
@ -133,7 +133,7 @@ func TestNodeUpdate(t *testing.T) {
|
||||||
},
|
},
|
||||||
nodeUpdateFunc: func(nodeID string, version swarm.Version, node swarm.NodeSpec) error {
|
nodeUpdateFunc: func(nodeID string, version swarm.Version, node swarm.NodeSpec) error {
|
||||||
if value, present := node.Annotations.Labels["key"]; !present || value != "value" {
|
if value, present := node.Annotations.Labels["key"]; !present || value != "value" {
|
||||||
return fmt.Errorf("expected 'key' label to be 'value', got %v", node.Annotations.Labels)
|
return errors.Errorf("expected 'key' label to be 'value', got %v", node.Annotations.Labels)
|
||||||
}
|
}
|
||||||
return nil
|
return nil
|
||||||
},
|
},
|
||||||
|
@ -150,7 +150,7 @@ func TestNodeUpdate(t *testing.T) {
|
||||||
},
|
},
|
||||||
nodeUpdateFunc: func(nodeID string, version swarm.Version, node swarm.NodeSpec) error {
|
nodeUpdateFunc: func(nodeID string, version swarm.Version, node swarm.NodeSpec) error {
|
||||||
if len(node.Annotations.Labels) > 0 {
|
if len(node.Annotations.Labels) > 0 {
|
||||||
return fmt.Errorf("expected no labels, got %v", node.Annotations.Labels)
|
return errors.Errorf("expected no labels, got %v", node.Annotations.Labels)
|
||||||
}
|
}
|
||||||
return nil
|
return nil
|
||||||
},
|
},
|
||||||
|
|
|
@ -13,6 +13,7 @@ import (
|
||||||
"github.com/docker/docker/cli"
|
"github.com/docker/docker/cli"
|
||||||
"github.com/docker/docker/cli/command"
|
"github.com/docker/docker/cli/command"
|
||||||
"github.com/docker/docker/pkg/archive"
|
"github.com/docker/docker/pkg/archive"
|
||||||
|
"github.com/pkg/errors"
|
||||||
"github.com/spf13/cobra"
|
"github.com/spf13/cobra"
|
||||||
"golang.org/x/net/context"
|
"golang.org/x/net/context"
|
||||||
)
|
)
|
||||||
|
@ -50,7 +51,7 @@ func validateContextDir(contextDir string) (string, error) {
|
||||||
}
|
}
|
||||||
|
|
||||||
if !stat.IsDir() {
|
if !stat.IsDir() {
|
||||||
return "", fmt.Errorf("context must be a directory")
|
return "", errors.Errorf("context must be a directory")
|
||||||
}
|
}
|
||||||
|
|
||||||
return absContextDir, nil
|
return absContextDir, nil
|
||||||
|
|
|
@ -6,6 +6,7 @@ import (
|
||||||
"github.com/docker/docker/api/types"
|
"github.com/docker/docker/api/types"
|
||||||
"github.com/docker/docker/cli"
|
"github.com/docker/docker/cli"
|
||||||
"github.com/docker/docker/cli/command"
|
"github.com/docker/docker/cli/command"
|
||||||
|
"github.com/pkg/errors"
|
||||||
"github.com/spf13/cobra"
|
"github.com/spf13/cobra"
|
||||||
"golang.org/x/net/context"
|
"golang.org/x/net/context"
|
||||||
)
|
)
|
||||||
|
@ -36,7 +37,7 @@ func newEnableCommand(dockerCli *command.DockerCli) *cobra.Command {
|
||||||
func runEnable(dockerCli *command.DockerCli, opts *enableOpts) error {
|
func runEnable(dockerCli *command.DockerCli, opts *enableOpts) error {
|
||||||
name := opts.name
|
name := opts.name
|
||||||
if opts.timeout < 0 {
|
if opts.timeout < 0 {
|
||||||
return fmt.Errorf("negative timeout %d is invalid", opts.timeout)
|
return errors.Errorf("negative timeout %d is invalid", opts.timeout)
|
||||||
}
|
}
|
||||||
|
|
||||||
if err := dockerCli.Client().PluginEnable(context.Background(), name, types.PluginEnableOptions{Timeout: opts.timeout}); err != nil {
|
if err := dockerCli.Client().PluginEnable(context.Background(), name, types.PluginEnableOptions{Timeout: opts.timeout}); err != nil {
|
||||||
|
|
|
@ -1,7 +1,6 @@
|
||||||
package plugin
|
package plugin
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"errors"
|
|
||||||
"fmt"
|
"fmt"
|
||||||
"strings"
|
"strings"
|
||||||
|
|
||||||
|
@ -12,6 +11,7 @@ import (
|
||||||
"github.com/docker/docker/cli/command/image"
|
"github.com/docker/docker/cli/command/image"
|
||||||
"github.com/docker/docker/pkg/jsonmessage"
|
"github.com/docker/docker/pkg/jsonmessage"
|
||||||
"github.com/docker/docker/registry"
|
"github.com/docker/docker/registry"
|
||||||
|
"github.com/pkg/errors"
|
||||||
"github.com/spf13/cobra"
|
"github.com/spf13/cobra"
|
||||||
"github.com/spf13/pflag"
|
"github.com/spf13/pflag"
|
||||||
"golang.org/x/net/context"
|
"golang.org/x/net/context"
|
||||||
|
@ -92,7 +92,7 @@ func buildPullConfig(ctx context.Context, dockerCli *command.DockerCli, opts plu
|
||||||
ref = reference.TagNameOnly(ref)
|
ref = reference.TagNameOnly(ref)
|
||||||
nt, ok := ref.(reference.NamedTagged)
|
nt, ok := ref.(reference.NamedTagged)
|
||||||
if !ok {
|
if !ok {
|
||||||
return types.PluginInstallOptions{}, fmt.Errorf("invalid name: %s", ref.String())
|
return types.PluginInstallOptions{}, errors.Errorf("invalid name: %s", ref.String())
|
||||||
}
|
}
|
||||||
|
|
||||||
ctx := context.Background()
|
ctx := context.Background()
|
||||||
|
@ -132,7 +132,7 @@ func runInstall(dockerCli *command.DockerCli, opts pluginOptions) error {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
if _, ok := aref.(reference.Canonical); ok {
|
if _, ok := aref.(reference.Canonical); ok {
|
||||||
return fmt.Errorf("invalid name: %s", opts.localName)
|
return errors.Errorf("invalid name: %s", opts.localName)
|
||||||
}
|
}
|
||||||
localName = reference.FamiliarString(reference.TagNameOnly(aref))
|
localName = reference.FamiliarString(reference.TagNameOnly(aref))
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,8 +1,6 @@
|
||||||
package plugin
|
package plugin
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"fmt"
|
|
||||||
|
|
||||||
"golang.org/x/net/context"
|
"golang.org/x/net/context"
|
||||||
|
|
||||||
"github.com/docker/distribution/reference"
|
"github.com/docker/distribution/reference"
|
||||||
|
@ -11,6 +9,7 @@ import (
|
||||||
"github.com/docker/docker/cli/command/image"
|
"github.com/docker/docker/cli/command/image"
|
||||||
"github.com/docker/docker/pkg/jsonmessage"
|
"github.com/docker/docker/pkg/jsonmessage"
|
||||||
"github.com/docker/docker/registry"
|
"github.com/docker/docker/registry"
|
||||||
|
"github.com/pkg/errors"
|
||||||
"github.com/spf13/cobra"
|
"github.com/spf13/cobra"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
@ -37,7 +36,7 @@ func runPush(dockerCli *command.DockerCli, name string) error {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
if _, ok := named.(reference.Canonical); ok {
|
if _, ok := named.(reference.Canonical); ok {
|
||||||
return fmt.Errorf("invalid name: %s", name)
|
return errors.Errorf("invalid name: %s", name)
|
||||||
}
|
}
|
||||||
|
|
||||||
named = reference.TagNameOnly(named)
|
named = reference.TagNameOnly(named)
|
||||||
|
|
|
@ -39,11 +39,11 @@ func runUpgrade(dockerCli *command.DockerCli, opts pluginOptions) error {
|
||||||
ctx := context.Background()
|
ctx := context.Background()
|
||||||
p, _, err := dockerCli.Client().PluginInspectWithRaw(ctx, opts.localName)
|
p, _, err := dockerCli.Client().PluginInspectWithRaw(ctx, opts.localName)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return fmt.Errorf("error reading plugin data: %v", err)
|
return errors.Errorf("error reading plugin data: %v", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
if p.Enabled {
|
if p.Enabled {
|
||||||
return fmt.Errorf("the plugin must be disabled before upgrading")
|
return errors.Errorf("the plugin must be disabled before upgrading")
|
||||||
}
|
}
|
||||||
|
|
||||||
opts.localName = p.Name
|
opts.localName = p.Name
|
||||||
|
|
|
@ -17,6 +17,7 @@ import (
|
||||||
registrytypes "github.com/docker/docker/api/types/registry"
|
registrytypes "github.com/docker/docker/api/types/registry"
|
||||||
"github.com/docker/docker/pkg/term"
|
"github.com/docker/docker/pkg/term"
|
||||||
"github.com/docker/docker/registry"
|
"github.com/docker/docker/registry"
|
||||||
|
"github.com/pkg/errors"
|
||||||
)
|
)
|
||||||
|
|
||||||
// ElectAuthServer returns the default registry to use (by asking the daemon)
|
// ElectAuthServer returns the default registry to use (by asking the daemon)
|
||||||
|
@ -95,7 +96,7 @@ func ConfigureAuth(cli *DockerCli, flUser, flPassword, serverAddress string, isD
|
||||||
// will hit this if you attempt docker login from mintty where stdin
|
// will hit this if you attempt docker login from mintty where stdin
|
||||||
// is a pipe, not a character based console.
|
// is a pipe, not a character based console.
|
||||||
if flPassword == "" && !cli.In().IsTerminal() {
|
if flPassword == "" && !cli.In().IsTerminal() {
|
||||||
return authconfig, fmt.Errorf("Error: Cannot perform an interactive login from a non TTY device")
|
return authconfig, errors.Errorf("Error: Cannot perform an interactive login from a non TTY device")
|
||||||
}
|
}
|
||||||
|
|
||||||
authconfig.Username = strings.TrimSpace(authconfig.Username)
|
authconfig.Username = strings.TrimSpace(authconfig.Username)
|
||||||
|
@ -113,7 +114,7 @@ func ConfigureAuth(cli *DockerCli, flUser, flPassword, serverAddress string, isD
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if flUser == "" {
|
if flUser == "" {
|
||||||
return authconfig, fmt.Errorf("Error: Non-null Username Required")
|
return authconfig, errors.Errorf("Error: Non-null Username Required")
|
||||||
}
|
}
|
||||||
if flPassword == "" {
|
if flPassword == "" {
|
||||||
oldState, err := term.SaveState(cli.In().FD())
|
oldState, err := term.SaveState(cli.In().FD())
|
||||||
|
@ -128,7 +129,7 @@ func ConfigureAuth(cli *DockerCli, flUser, flPassword, serverAddress string, isD
|
||||||
|
|
||||||
term.RestoreTerminal(cli.In().FD(), oldState)
|
term.RestoreTerminal(cli.In().FD(), oldState)
|
||||||
if flPassword == "" {
|
if flPassword == "" {
|
||||||
return authconfig, fmt.Errorf("Error: Password Required")
|
return authconfig, errors.Errorf("Error: Password Required")
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -8,6 +8,7 @@ import (
|
||||||
"github.com/docker/docker/cli"
|
"github.com/docker/docker/cli"
|
||||||
"github.com/docker/docker/cli/command"
|
"github.com/docker/docker/cli/command"
|
||||||
"github.com/docker/docker/registry"
|
"github.com/docker/docker/registry"
|
||||||
|
"github.com/pkg/errors"
|
||||||
"github.com/spf13/cobra"
|
"github.com/spf13/cobra"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
@ -76,7 +77,7 @@ func runLogin(dockerCli *command.DockerCli, opts loginOptions) error {
|
||||||
authConfig.IdentityToken = response.IdentityToken
|
authConfig.IdentityToken = response.IdentityToken
|
||||||
}
|
}
|
||||||
if err := dockerCli.CredentialsStore(serverAddress).Store(authConfig); err != nil {
|
if err := dockerCli.CredentialsStore(serverAddress).Store(authConfig); err != nil {
|
||||||
return fmt.Errorf("Error saving credentials: %v", err)
|
return errors.Errorf("Error saving credentials: %v", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
if response.Status != "" {
|
if response.Status != "" {
|
||||||
|
|
|
@ -11,6 +11,7 @@ import (
|
||||||
"github.com/docker/docker/opts"
|
"github.com/docker/docker/opts"
|
||||||
"github.com/docker/docker/pkg/system"
|
"github.com/docker/docker/pkg/system"
|
||||||
runconfigopts "github.com/docker/docker/runconfig/opts"
|
runconfigopts "github.com/docker/docker/runconfig/opts"
|
||||||
|
"github.com/pkg/errors"
|
||||||
"github.com/spf13/cobra"
|
"github.com/spf13/cobra"
|
||||||
"golang.org/x/net/context"
|
"golang.org/x/net/context"
|
||||||
)
|
)
|
||||||
|
@ -58,7 +59,7 @@ func runSecretCreate(dockerCli *command.DockerCli, options createOptions) error
|
||||||
|
|
||||||
secretData, err := ioutil.ReadAll(in)
|
secretData, err := ioutil.ReadAll(in)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return fmt.Errorf("Error reading content from %q: %v", options.file, err)
|
return errors.Errorf("Error reading content from %q: %v", options.file, err)
|
||||||
}
|
}
|
||||||
|
|
||||||
spec := swarm.SecretSpec{
|
spec := swarm.SecretSpec{
|
||||||
|
|
|
@ -6,6 +6,7 @@ import (
|
||||||
|
|
||||||
"github.com/docker/docker/cli"
|
"github.com/docker/docker/cli"
|
||||||
"github.com/docker/docker/cli/command"
|
"github.com/docker/docker/cli/command"
|
||||||
|
"github.com/pkg/errors"
|
||||||
"github.com/spf13/cobra"
|
"github.com/spf13/cobra"
|
||||||
"golang.org/x/net/context"
|
"golang.org/x/net/context"
|
||||||
)
|
)
|
||||||
|
@ -45,7 +46,7 @@ func runSecretRemove(dockerCli *command.DockerCli, opts removeOptions) error {
|
||||||
}
|
}
|
||||||
|
|
||||||
if len(errs) > 0 {
|
if len(errs) > 0 {
|
||||||
return fmt.Errorf("%s", strings.Join(errs, "\n"))
|
return errors.Errorf("%s", strings.Join(errs, "\n"))
|
||||||
}
|
}
|
||||||
|
|
||||||
return nil
|
return nil
|
||||||
|
|
|
@ -1,7 +1,6 @@
|
||||||
package service
|
package service
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"fmt"
|
|
||||||
"strings"
|
"strings"
|
||||||
|
|
||||||
"golang.org/x/net/context"
|
"golang.org/x/net/context"
|
||||||
|
@ -10,6 +9,7 @@ import (
|
||||||
"github.com/docker/docker/cli/command"
|
"github.com/docker/docker/cli/command"
|
||||||
"github.com/docker/docker/cli/command/formatter"
|
"github.com/docker/docker/cli/command/formatter"
|
||||||
apiclient "github.com/docker/docker/client"
|
apiclient "github.com/docker/docker/client"
|
||||||
|
"github.com/pkg/errors"
|
||||||
"github.com/spf13/cobra"
|
"github.com/spf13/cobra"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
@ -30,7 +30,7 @@ func newInspectCommand(dockerCli *command.DockerCli) *cobra.Command {
|
||||||
opts.refs = args
|
opts.refs = args
|
||||||
|
|
||||||
if opts.pretty && len(opts.format) > 0 {
|
if opts.pretty && len(opts.format) > 0 {
|
||||||
return fmt.Errorf("--format is incompatible with human friendly format")
|
return errors.Errorf("--format is incompatible with human friendly format")
|
||||||
}
|
}
|
||||||
return runInspect(dockerCli, opts)
|
return runInspect(dockerCli, opts)
|
||||||
},
|
},
|
||||||
|
@ -55,7 +55,7 @@ func runInspect(dockerCli *command.DockerCli, opts inspectOptions) error {
|
||||||
if err == nil || !apiclient.IsErrServiceNotFound(err) {
|
if err == nil || !apiclient.IsErrServiceNotFound(err) {
|
||||||
return service, nil, err
|
return service, nil, err
|
||||||
}
|
}
|
||||||
return nil, nil, fmt.Errorf("Error: no such service: %s", ref)
|
return nil, nil, errors.Errorf("Error: no such service: %s", ref)
|
||||||
}
|
}
|
||||||
|
|
||||||
f := opts.format
|
f := opts.format
|
||||||
|
@ -69,7 +69,7 @@ func runInspect(dockerCli *command.DockerCli, opts inspectOptions) error {
|
||||||
// check if the user is trying to apply a template to the pretty format, which
|
// check if the user is trying to apply a template to the pretty format, which
|
||||||
// is not supported
|
// is not supported
|
||||||
if strings.HasPrefix(f, "pretty") && f != "pretty" {
|
if strings.HasPrefix(f, "pretty") && f != "pretty" {
|
||||||
return fmt.Errorf("Cannot supply extra formatting options to the pretty template")
|
return errors.Errorf("Cannot supply extra formatting options to the pretty template")
|
||||||
}
|
}
|
||||||
|
|
||||||
serviceCtx := formatter.Context{
|
serviceCtx := formatter.Context{
|
||||||
|
|
|
@ -17,6 +17,7 @@ import (
|
||||||
"github.com/docker/docker/client"
|
"github.com/docker/docker/client"
|
||||||
"github.com/docker/docker/pkg/stdcopy"
|
"github.com/docker/docker/pkg/stdcopy"
|
||||||
"github.com/docker/docker/pkg/stringid"
|
"github.com/docker/docker/pkg/stringid"
|
||||||
|
"github.com/pkg/errors"
|
||||||
"github.com/spf13/cobra"
|
"github.com/spf13/cobra"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
@ -170,7 +171,7 @@ func (lw *logWriter) Write(buf []byte) (int, error) {
|
||||||
|
|
||||||
parts := bytes.SplitN(buf, []byte(" "), numParts)
|
parts := bytes.SplitN(buf, []byte(" "), numParts)
|
||||||
if len(parts) != numParts {
|
if len(parts) != numParts {
|
||||||
return 0, fmt.Errorf("invalid context in log message: %v", string(buf))
|
return 0, errors.Errorf("invalid context in log message: %v", string(buf))
|
||||||
}
|
}
|
||||||
|
|
||||||
logCtx, err := lw.parseContext(string(parts[contextIndex]))
|
logCtx, err := lw.parseContext(string(parts[contextIndex]))
|
||||||
|
@ -210,24 +211,24 @@ func (lw *logWriter) parseContext(input string) (logContext, error) {
|
||||||
for _, component := range components {
|
for _, component := range components {
|
||||||
parts := strings.SplitN(component, "=", 2)
|
parts := strings.SplitN(component, "=", 2)
|
||||||
if len(parts) != 2 {
|
if len(parts) != 2 {
|
||||||
return logContext{}, fmt.Errorf("invalid context: %s", input)
|
return logContext{}, errors.Errorf("invalid context: %s", input)
|
||||||
}
|
}
|
||||||
context[parts[0]] = parts[1]
|
context[parts[0]] = parts[1]
|
||||||
}
|
}
|
||||||
|
|
||||||
nodeID, ok := context["com.docker.swarm.node.id"]
|
nodeID, ok := context["com.docker.swarm.node.id"]
|
||||||
if !ok {
|
if !ok {
|
||||||
return logContext{}, fmt.Errorf("missing node id in context: %s", input)
|
return logContext{}, errors.Errorf("missing node id in context: %s", input)
|
||||||
}
|
}
|
||||||
|
|
||||||
serviceID, ok := context["com.docker.swarm.service.id"]
|
serviceID, ok := context["com.docker.swarm.service.id"]
|
||||||
if !ok {
|
if !ok {
|
||||||
return logContext{}, fmt.Errorf("missing service id in context: %s", input)
|
return logContext{}, errors.Errorf("missing service id in context: %s", input)
|
||||||
}
|
}
|
||||||
|
|
||||||
taskID, ok := context["com.docker.swarm.task.id"]
|
taskID, ok := context["com.docker.swarm.task.id"]
|
||||||
if !ok {
|
if !ok {
|
||||||
return logContext{}, fmt.Errorf("missing task id in context: %s", input)
|
return logContext{}, errors.Errorf("missing task id in context: %s", input)
|
||||||
}
|
}
|
||||||
|
|
||||||
return logContext{
|
return logContext{
|
||||||
|
|
|
@ -1,7 +1,6 @@
|
||||||
package service
|
package service
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"errors"
|
|
||||||
"fmt"
|
"fmt"
|
||||||
"strconv"
|
"strconv"
|
||||||
"strings"
|
"strings"
|
||||||
|
@ -11,6 +10,7 @@ import (
|
||||||
"github.com/docker/docker/api/types/swarm"
|
"github.com/docker/docker/api/types/swarm"
|
||||||
"github.com/docker/docker/opts"
|
"github.com/docker/docker/opts"
|
||||||
runconfigopts "github.com/docker/docker/runconfig/opts"
|
runconfigopts "github.com/docker/docker/runconfig/opts"
|
||||||
|
"github.com/pkg/errors"
|
||||||
"github.com/spf13/pflag"
|
"github.com/spf13/pflag"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
@ -32,7 +32,7 @@ func (d *PositiveDurationOpt) Set(s string) error {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
if *d.DurationOpt.value < 0 {
|
if *d.DurationOpt.value < 0 {
|
||||||
return fmt.Errorf("duration cannot be negative")
|
return errors.Errorf("duration cannot be negative")
|
||||||
}
|
}
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
@ -140,7 +140,7 @@ func (opts *placementPrefOpts) Set(value string) error {
|
||||||
return errors.New(`placement preference must be of the format "<strategy>=<arg>"`)
|
return errors.New(`placement preference must be of the format "<strategy>=<arg>"`)
|
||||||
}
|
}
|
||||||
if fields[0] != "spread" {
|
if fields[0] != "spread" {
|
||||||
return fmt.Errorf("unsupported placement preference %s (only spread is supported)", fields[0])
|
return errors.Errorf("unsupported placement preference %s (only spread is supported)", fields[0])
|
||||||
}
|
}
|
||||||
|
|
||||||
opts.prefs = append(opts.prefs, swarm.PlacementPreference{
|
opts.prefs = append(opts.prefs, swarm.PlacementPreference{
|
||||||
|
@ -268,7 +268,7 @@ func (opts *healthCheckOptions) toHealthConfig() (*container.HealthConfig, error
|
||||||
opts.retries != 0
|
opts.retries != 0
|
||||||
if opts.noHealthcheck {
|
if opts.noHealthcheck {
|
||||||
if haveHealthSettings {
|
if haveHealthSettings {
|
||||||
return nil, fmt.Errorf("--%s conflicts with --health-* options", flagNoHealthcheck)
|
return nil, errors.Errorf("--%s conflicts with --health-* options", flagNoHealthcheck)
|
||||||
}
|
}
|
||||||
healthConfig = &container.HealthConfig{Test: []string{"NONE"}}
|
healthConfig = &container.HealthConfig{Test: []string{"NONE"}}
|
||||||
} else if haveHealthSettings {
|
} else if haveHealthSettings {
|
||||||
|
@ -372,7 +372,7 @@ func (opts *serviceOptions) ToServiceMode() (swarm.ServiceMode, error) {
|
||||||
switch opts.mode {
|
switch opts.mode {
|
||||||
case "global":
|
case "global":
|
||||||
if opts.replicas.Value() != nil {
|
if opts.replicas.Value() != nil {
|
||||||
return serviceMode, fmt.Errorf("replicas can only be used with replicated mode")
|
return serviceMode, errors.Errorf("replicas can only be used with replicated mode")
|
||||||
}
|
}
|
||||||
|
|
||||||
serviceMode.Global = &swarm.GlobalService{}
|
serviceMode.Global = &swarm.GlobalService{}
|
||||||
|
@ -381,7 +381,7 @@ func (opts *serviceOptions) ToServiceMode() (swarm.ServiceMode, error) {
|
||||||
Replicas: opts.replicas.Value(),
|
Replicas: opts.replicas.Value(),
|
||||||
}
|
}
|
||||||
default:
|
default:
|
||||||
return serviceMode, fmt.Errorf("Unknown mode: %s, only replicated and global supported", opts.mode)
|
return serviceMode, errors.Errorf("Unknown mode: %s, only replicated and global supported", opts.mode)
|
||||||
}
|
}
|
||||||
return serviceMode, nil
|
return serviceMode, nil
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,12 +1,11 @@
|
||||||
package service
|
package service
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"fmt"
|
|
||||||
|
|
||||||
"github.com/docker/docker/api/types"
|
"github.com/docker/docker/api/types"
|
||||||
"github.com/docker/docker/api/types/filters"
|
"github.com/docker/docker/api/types/filters"
|
||||||
swarmtypes "github.com/docker/docker/api/types/swarm"
|
swarmtypes "github.com/docker/docker/api/types/swarm"
|
||||||
"github.com/docker/docker/client"
|
"github.com/docker/docker/client"
|
||||||
|
"github.com/pkg/errors"
|
||||||
"golang.org/x/net/context"
|
"golang.org/x/net/context"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
@ -18,7 +17,7 @@ func ParseSecrets(client client.SecretAPIClient, requestedSecrets []*swarmtypes.
|
||||||
|
|
||||||
for _, secret := range requestedSecrets {
|
for _, secret := range requestedSecrets {
|
||||||
if _, exists := secretRefs[secret.File.Name]; exists {
|
if _, exists := secretRefs[secret.File.Name]; exists {
|
||||||
return nil, fmt.Errorf("duplicate secret target for %s not allowed", secret.SecretName)
|
return nil, errors.Errorf("duplicate secret target for %s not allowed", secret.SecretName)
|
||||||
}
|
}
|
||||||
secretRef := new(swarmtypes.SecretReference)
|
secretRef := new(swarmtypes.SecretReference)
|
||||||
*secretRef = *secret
|
*secretRef = *secret
|
||||||
|
@ -47,7 +46,7 @@ func ParseSecrets(client client.SecretAPIClient, requestedSecrets []*swarmtypes.
|
||||||
for _, ref := range secretRefs {
|
for _, ref := range secretRefs {
|
||||||
id, ok := foundSecrets[ref.SecretName]
|
id, ok := foundSecrets[ref.SecretName]
|
||||||
if !ok {
|
if !ok {
|
||||||
return nil, fmt.Errorf("secret not found: %s", ref.SecretName)
|
return nil, errors.Errorf("secret not found: %s", ref.SecretName)
|
||||||
}
|
}
|
||||||
|
|
||||||
// set the id for the ref to properly assign in swarm
|
// set the id for the ref to properly assign in swarm
|
||||||
|
|
|
@ -1,7 +1,6 @@
|
||||||
package service
|
package service
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"fmt"
|
|
||||||
"strings"
|
"strings"
|
||||||
|
|
||||||
"golang.org/x/net/context"
|
"golang.org/x/net/context"
|
||||||
|
@ -15,6 +14,7 @@ import (
|
||||||
"github.com/docker/docker/cli/command/node"
|
"github.com/docker/docker/cli/command/node"
|
||||||
"github.com/docker/docker/cli/command/task"
|
"github.com/docker/docker/cli/command/task"
|
||||||
"github.com/docker/docker/opts"
|
"github.com/docker/docker/opts"
|
||||||
|
"github.com/pkg/errors"
|
||||||
"github.com/spf13/cobra"
|
"github.com/spf13/cobra"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
@ -89,7 +89,7 @@ func runPS(dockerCli *command.DockerCli, opts psOptions) error {
|
||||||
}
|
}
|
||||||
// If nothing has been found, return immediately.
|
// If nothing has been found, return immediately.
|
||||||
if serviceCount == 0 {
|
if serviceCount == 0 {
|
||||||
return fmt.Errorf("no such services: %s", service)
|
return errors.Errorf("no such services: %s", service)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -6,6 +6,7 @@ import (
|
||||||
|
|
||||||
"github.com/docker/docker/cli"
|
"github.com/docker/docker/cli"
|
||||||
"github.com/docker/docker/cli/command"
|
"github.com/docker/docker/cli/command"
|
||||||
|
"github.com/pkg/errors"
|
||||||
"github.com/spf13/cobra"
|
"github.com/spf13/cobra"
|
||||||
"golang.org/x/net/context"
|
"golang.org/x/net/context"
|
||||||
)
|
)
|
||||||
|
@ -41,7 +42,7 @@ func runRemove(dockerCli *command.DockerCli, sids []string) error {
|
||||||
fmt.Fprintf(dockerCli.Out(), "%s\n", sid)
|
fmt.Fprintf(dockerCli.Out(), "%s\n", sid)
|
||||||
}
|
}
|
||||||
if len(errs) > 0 {
|
if len(errs) > 0 {
|
||||||
return fmt.Errorf(strings.Join(errs, "\n"))
|
return errors.Errorf(strings.Join(errs, "\n"))
|
||||||
}
|
}
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
|
@ -10,6 +10,7 @@ import (
|
||||||
"github.com/docker/docker/api/types"
|
"github.com/docker/docker/api/types"
|
||||||
"github.com/docker/docker/cli"
|
"github.com/docker/docker/cli"
|
||||||
"github.com/docker/docker/cli/command"
|
"github.com/docker/docker/cli/command"
|
||||||
|
"github.com/pkg/errors"
|
||||||
"github.com/spf13/cobra"
|
"github.com/spf13/cobra"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
@ -30,7 +31,7 @@ func scaleArgs(cmd *cobra.Command, args []string) error {
|
||||||
}
|
}
|
||||||
for _, arg := range args {
|
for _, arg := range args {
|
||||||
if parts := strings.SplitN(arg, "=", 2); len(parts) != 2 {
|
if parts := strings.SplitN(arg, "=", 2); len(parts) != 2 {
|
||||||
return fmt.Errorf(
|
return errors.Errorf(
|
||||||
"Invalid scale specifier '%s'.\nSee '%s --help'.\n\nUsage: %s\n\n%s",
|
"Invalid scale specifier '%s'.\nSee '%s --help'.\n\nUsage: %s\n\n%s",
|
||||||
arg,
|
arg,
|
||||||
cmd.CommandPath(),
|
cmd.CommandPath(),
|
||||||
|
@ -43,7 +44,7 @@ func scaleArgs(cmd *cobra.Command, args []string) error {
|
||||||
}
|
}
|
||||||
|
|
||||||
func runScale(dockerCli *command.DockerCli, args []string) error {
|
func runScale(dockerCli *command.DockerCli, args []string) error {
|
||||||
var errors []string
|
var errs []string
|
||||||
for _, arg := range args {
|
for _, arg := range args {
|
||||||
parts := strings.SplitN(arg, "=", 2)
|
parts := strings.SplitN(arg, "=", 2)
|
||||||
serviceID, scaleStr := parts[0], parts[1]
|
serviceID, scaleStr := parts[0], parts[1]
|
||||||
|
@ -51,19 +52,19 @@ func runScale(dockerCli *command.DockerCli, args []string) error {
|
||||||
// validate input arg scale number
|
// validate input arg scale number
|
||||||
scale, err := strconv.ParseUint(scaleStr, 10, 64)
|
scale, err := strconv.ParseUint(scaleStr, 10, 64)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
errors = append(errors, fmt.Sprintf("%s: invalid replicas value %s: %v", serviceID, scaleStr, err))
|
errs = append(errs, fmt.Sprintf("%s: invalid replicas value %s: %v", serviceID, scaleStr, err))
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
|
|
||||||
if err := runServiceScale(dockerCli, serviceID, scale); err != nil {
|
if err := runServiceScale(dockerCli, serviceID, scale); err != nil {
|
||||||
errors = append(errors, fmt.Sprintf("%s: %v", serviceID, err))
|
errs = append(errs, fmt.Sprintf("%s: %v", serviceID, err))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if len(errors) == 0 {
|
if len(errs) == 0 {
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
return fmt.Errorf(strings.Join(errors, "\n"))
|
return errors.Errorf(strings.Join(errs, "\n"))
|
||||||
}
|
}
|
||||||
|
|
||||||
func runServiceScale(dockerCli *command.DockerCli, serviceID string, scale uint64) error {
|
func runServiceScale(dockerCli *command.DockerCli, serviceID string, scale uint64) error {
|
||||||
|
@ -77,7 +78,7 @@ func runServiceScale(dockerCli *command.DockerCli, serviceID string, scale uint6
|
||||||
|
|
||||||
serviceMode := &service.Spec.Mode
|
serviceMode := &service.Spec.Mode
|
||||||
if serviceMode.Replicated == nil {
|
if serviceMode.Replicated == nil {
|
||||||
return fmt.Errorf("scale can only be used with replicated mode")
|
return errors.Errorf("scale can only be used with replicated mode")
|
||||||
}
|
}
|
||||||
|
|
||||||
serviceMode.Replicated.Replicas = &scale
|
serviceMode.Replicated.Replicas = &scale
|
||||||
|
|
|
@ -2,7 +2,6 @@ package service
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"encoding/hex"
|
"encoding/hex"
|
||||||
"fmt"
|
|
||||||
|
|
||||||
"github.com/Sirupsen/logrus"
|
"github.com/Sirupsen/logrus"
|
||||||
"github.com/docker/distribution/reference"
|
"github.com/docker/distribution/reference"
|
||||||
|
@ -72,7 +71,7 @@ func trustedResolveDigest(ctx context.Context, cli *command.DockerCli, ref refer
|
||||||
// Only get the tag if it's in the top level targets role or the releases delegation role
|
// Only get the tag if it's in the top level targets role or the releases delegation role
|
||||||
// ignore it if it's in any other delegation roles
|
// ignore it if it's in any other delegation roles
|
||||||
if t.Role != trust.ReleasesRole && t.Role != data.CanonicalTargetsRole {
|
if t.Role != trust.ReleasesRole && t.Role != data.CanonicalTargetsRole {
|
||||||
return nil, trust.NotaryError(repoInfo.Name.Name(), fmt.Errorf("No trust data for %s", reference.FamiliarString(ref)))
|
return nil, trust.NotaryError(repoInfo.Name.Name(), errors.Errorf("No trust data for %s", reference.FamiliarString(ref)))
|
||||||
}
|
}
|
||||||
|
|
||||||
logrus.Debugf("retrieving target for %s role\n", t.Role)
|
logrus.Debugf("retrieving target for %s role\n", t.Role)
|
||||||
|
|
|
@ -1,7 +1,6 @@
|
||||||
package service
|
package service
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"errors"
|
|
||||||
"fmt"
|
"fmt"
|
||||||
"sort"
|
"sort"
|
||||||
"strings"
|
"strings"
|
||||||
|
@ -19,6 +18,7 @@ import (
|
||||||
runconfigopts "github.com/docker/docker/runconfig/opts"
|
runconfigopts "github.com/docker/docker/runconfig/opts"
|
||||||
"github.com/docker/go-connections/nat"
|
"github.com/docker/go-connections/nat"
|
||||||
shlex "github.com/flynn-archive/go-shlex"
|
shlex "github.com/flynn-archive/go-shlex"
|
||||||
|
"github.com/pkg/errors"
|
||||||
"github.com/spf13/cobra"
|
"github.com/spf13/cobra"
|
||||||
"github.com/spf13/pflag"
|
"github.com/spf13/pflag"
|
||||||
"golang.org/x/net/context"
|
"golang.org/x/net/context"
|
||||||
|
@ -136,7 +136,7 @@ func runUpdate(dockerCli *command.DockerCli, flags *pflag.FlagSet, serviceID str
|
||||||
clientSideRollback = true
|
clientSideRollback = true
|
||||||
spec = service.PreviousSpec
|
spec = service.PreviousSpec
|
||||||
if spec == nil {
|
if spec == nil {
|
||||||
return fmt.Errorf("service does not have a previous specification to roll back to")
|
return errors.Errorf("service does not have a previous specification to roll back to")
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
serverSideRollback = true
|
serverSideRollback = true
|
||||||
|
@ -621,7 +621,7 @@ func updateMounts(flags *pflag.FlagSet, mounts *[]mounttypes.Mount) error {
|
||||||
values := flags.Lookup(flagMountAdd).Value.(*opts.MountOpt).Value()
|
values := flags.Lookup(flagMountAdd).Value.(*opts.MountOpt).Value()
|
||||||
for _, mount := range values {
|
for _, mount := range values {
|
||||||
if _, ok := mountsByTarget[mount.Target]; ok {
|
if _, ok := mountsByTarget[mount.Target]; ok {
|
||||||
return fmt.Errorf("duplicate mount target")
|
return errors.Errorf("duplicate mount target")
|
||||||
}
|
}
|
||||||
mountsByTarget[mount.Target] = mount
|
mountsByTarget[mount.Target] = mount
|
||||||
}
|
}
|
||||||
|
@ -819,7 +819,7 @@ func updateReplicas(flags *pflag.FlagSet, serviceMode *swarm.ServiceMode) error
|
||||||
}
|
}
|
||||||
|
|
||||||
if serviceMode == nil || serviceMode.Replicated == nil {
|
if serviceMode == nil || serviceMode.Replicated == nil {
|
||||||
return fmt.Errorf("replicas can only be used with replicated mode")
|
return errors.Errorf("replicas can only be used with replicated mode")
|
||||||
}
|
}
|
||||||
serviceMode.Replicated.Replicas = flags.Lookup(flagReplicas).Value.(*Uint64Opt).Value()
|
serviceMode.Replicated.Replicas = flags.Lookup(flagReplicas).Value.(*Uint64Opt).Value()
|
||||||
return nil
|
return nil
|
||||||
|
@ -908,7 +908,7 @@ func updateHealthcheck(flags *pflag.FlagSet, containerSpec *swarm.ContainerSpec)
|
||||||
}
|
}
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
return fmt.Errorf("--%s conflicts with --health-* options", flagNoHealthcheck)
|
return errors.Errorf("--%s conflicts with --health-* options", flagNoHealthcheck)
|
||||||
}
|
}
|
||||||
if len(containerSpec.Healthcheck.Test) > 0 && containerSpec.Healthcheck.Test[0] == "NONE" {
|
if len(containerSpec.Healthcheck.Test) > 0 && containerSpec.Healthcheck.Test[0] == "NONE" {
|
||||||
containerSpec.Healthcheck.Test = nil
|
containerSpec.Healthcheck.Test = nil
|
||||||
|
|
|
@ -52,9 +52,9 @@ func runDeploy(dockerCli *command.DockerCli, opts deployOptions) error {
|
||||||
|
|
||||||
switch {
|
switch {
|
||||||
case opts.bundlefile == "" && opts.composefile == "":
|
case opts.bundlefile == "" && opts.composefile == "":
|
||||||
return fmt.Errorf("Please specify either a bundle file (with --bundle-file) or a Compose file (with --compose-file).")
|
return errors.Errorf("Please specify either a bundle file (with --bundle-file) or a Compose file (with --compose-file).")
|
||||||
case opts.bundlefile != "" && opts.composefile != "":
|
case opts.bundlefile != "" && opts.composefile != "":
|
||||||
return fmt.Errorf("You cannot specify both a bundle file and a Compose file.")
|
return errors.Errorf("You cannot specify both a bundle file and a Compose file.")
|
||||||
case opts.bundlefile != "":
|
case opts.bundlefile != "":
|
||||||
return deployBundle(ctx, dockerCli, opts)
|
return deployBundle(ctx, dockerCli, opts)
|
||||||
default:
|
default:
|
||||||
|
|
|
@ -28,7 +28,7 @@ func deployCompose(ctx context.Context, dockerCli *command.DockerCli, opts deplo
|
||||||
config, err := loader.Load(configDetails)
|
config, err := loader.Load(configDetails)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
if fpe, ok := err.(*loader.ForbiddenPropertiesError); ok {
|
if fpe, ok := err.(*loader.ForbiddenPropertiesError); ok {
|
||||||
return fmt.Errorf("Compose file contains unsupported options:\n\n%s\n",
|
return errors.Errorf("Compose file contains unsupported options:\n\n%s\n",
|
||||||
propertyWarnings(fpe.Properties))
|
propertyWarnings(fpe.Properties))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -168,12 +168,12 @@ func validateExternalNetworks(
|
||||||
network, err := client.NetworkInspect(ctx, networkName, false)
|
network, err := client.NetworkInspect(ctx, networkName, false)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
if dockerclient.IsErrNetworkNotFound(err) {
|
if dockerclient.IsErrNetworkNotFound(err) {
|
||||||
return fmt.Errorf("network %q is declared as external, but could not be found. You need to create the network before the stack is deployed (with overlay driver)", networkName)
|
return errors.Errorf("network %q is declared as external, but could not be found. You need to create the network before the stack is deployed (with overlay driver)", networkName)
|
||||||
}
|
}
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
if network.Scope != "swarm" {
|
if network.Scope != "swarm" {
|
||||||
return fmt.Errorf("network %q is declared as external, but it is not in the right scope: %q instead of %q", networkName, network.Scope, "swarm")
|
return errors.Errorf("network %q is declared as external, but it is not in the right scope: %q instead of %q", networkName, network.Scope, "swarm")
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -12,6 +12,7 @@ import (
|
||||||
"github.com/docker/docker/cli/command"
|
"github.com/docker/docker/cli/command"
|
||||||
"github.com/docker/docker/cli/compose/convert"
|
"github.com/docker/docker/cli/compose/convert"
|
||||||
"github.com/docker/docker/client"
|
"github.com/docker/docker/client"
|
||||||
|
"github.com/pkg/errors"
|
||||||
"github.com/spf13/cobra"
|
"github.com/spf13/cobra"
|
||||||
"golang.org/x/net/context"
|
"golang.org/x/net/context"
|
||||||
)
|
)
|
||||||
|
@ -100,7 +101,7 @@ func getStacks(
|
||||||
labels := service.Spec.Labels
|
labels := service.Spec.Labels
|
||||||
name, ok := labels[convert.LabelNamespace]
|
name, ok := labels[convert.LabelNamespace]
|
||||||
if !ok {
|
if !ok {
|
||||||
return nil, fmt.Errorf("cannot get label %s for service %s",
|
return nil, errors.Errorf("cannot get label %s for service %s",
|
||||||
convert.LabelNamespace, service.ID)
|
convert.LabelNamespace, service.ID)
|
||||||
}
|
}
|
||||||
ztack, ok := m[name]
|
ztack, ok := m[name]
|
||||||
|
|
|
@ -6,6 +6,7 @@ import (
|
||||||
"os"
|
"os"
|
||||||
|
|
||||||
"github.com/docker/docker/cli/command/bundlefile"
|
"github.com/docker/docker/cli/command/bundlefile"
|
||||||
|
"github.com/pkg/errors"
|
||||||
"github.com/spf13/pflag"
|
"github.com/spf13/pflag"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
@ -30,7 +31,7 @@ func loadBundlefile(stderr io.Writer, namespace string, path string) (*bundlefil
|
||||||
path = defaultPath
|
path = defaultPath
|
||||||
}
|
}
|
||||||
if _, err := os.Stat(path); err != nil {
|
if _, err := os.Stat(path); err != nil {
|
||||||
return nil, fmt.Errorf(
|
return nil, errors.Errorf(
|
||||||
"Bundle %s not found. Specify the path with --file",
|
"Bundle %s not found. Specify the path with --file",
|
||||||
path)
|
path)
|
||||||
}
|
}
|
||||||
|
@ -44,7 +45,7 @@ func loadBundlefile(stderr io.Writer, namespace string, path string) (*bundlefil
|
||||||
|
|
||||||
bundle, err := bundlefile.LoadFile(reader)
|
bundle, err := bundlefile.LoadFile(reader)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, fmt.Errorf("Error reading %s: %v\n", path, err)
|
return nil, errors.Errorf("Error reading %s: %v\n", path, err)
|
||||||
}
|
}
|
||||||
return bundle, err
|
return bundle, err
|
||||||
}
|
}
|
||||||
|
|
|
@ -7,6 +7,7 @@ import (
|
||||||
"github.com/docker/docker/api/types/swarm"
|
"github.com/docker/docker/api/types/swarm"
|
||||||
"github.com/docker/docker/cli"
|
"github.com/docker/docker/cli"
|
||||||
"github.com/docker/docker/cli/command"
|
"github.com/docker/docker/cli/command"
|
||||||
|
"github.com/pkg/errors"
|
||||||
"github.com/spf13/cobra"
|
"github.com/spf13/cobra"
|
||||||
"golang.org/x/net/context"
|
"golang.org/x/net/context"
|
||||||
)
|
)
|
||||||
|
@ -61,7 +62,7 @@ func runRemove(dockerCli *command.DockerCli, opts removeOptions) error {
|
||||||
hasError = removeNetworks(ctx, dockerCli, networks) || hasError
|
hasError = removeNetworks(ctx, dockerCli, networks) || hasError
|
||||||
|
|
||||||
if hasError {
|
if hasError {
|
||||||
return fmt.Errorf("Failed to remove some resources")
|
return errors.Errorf("Failed to remove some resources")
|
||||||
}
|
}
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
|
@ -64,7 +64,7 @@ func runInit(dockerCli command.Cli, flags *pflag.FlagSet, opts initOptions) erro
|
||||||
case swarm.NodeAvailabilityActive, swarm.NodeAvailabilityPause, swarm.NodeAvailabilityDrain:
|
case swarm.NodeAvailabilityActive, swarm.NodeAvailabilityPause, swarm.NodeAvailabilityDrain:
|
||||||
req.Availability = availability
|
req.Availability = availability
|
||||||
default:
|
default:
|
||||||
return fmt.Errorf("invalid availability %q, only active, pause and drain are supported", opts.availability)
|
return errors.Errorf("invalid availability %q, only active, pause and drain are supported", opts.availability)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -11,6 +11,7 @@ import (
|
||||||
"github.com/docker/docker/cli/internal/test"
|
"github.com/docker/docker/cli/internal/test"
|
||||||
"github.com/docker/docker/pkg/testutil/assert"
|
"github.com/docker/docker/pkg/testutil/assert"
|
||||||
"github.com/docker/docker/pkg/testutil/golden"
|
"github.com/docker/docker/pkg/testutil/golden"
|
||||||
|
"github.com/pkg/errors"
|
||||||
)
|
)
|
||||||
|
|
||||||
func TestSwarmInitErrorOnAPIFailure(t *testing.T) {
|
func TestSwarmInitErrorOnAPIFailure(t *testing.T) {
|
||||||
|
@ -26,28 +27,28 @@ func TestSwarmInitErrorOnAPIFailure(t *testing.T) {
|
||||||
{
|
{
|
||||||
name: "init-failed",
|
name: "init-failed",
|
||||||
swarmInitFunc: func() (string, error) {
|
swarmInitFunc: func() (string, error) {
|
||||||
return "", fmt.Errorf("error initializing the swarm")
|
return "", errors.Errorf("error initializing the swarm")
|
||||||
},
|
},
|
||||||
expectedError: "error initializing the swarm",
|
expectedError: "error initializing the swarm",
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
name: "init-failed-with-ip-choice",
|
name: "init-failed-with-ip-choice",
|
||||||
swarmInitFunc: func() (string, error) {
|
swarmInitFunc: func() (string, error) {
|
||||||
return "", fmt.Errorf("could not choose an IP address to advertise")
|
return "", errors.Errorf("could not choose an IP address to advertise")
|
||||||
},
|
},
|
||||||
expectedError: "could not choose an IP address to advertise - specify one with --advertise-addr",
|
expectedError: "could not choose an IP address to advertise - specify one with --advertise-addr",
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
name: "swarm-inspect-after-init-failed",
|
name: "swarm-inspect-after-init-failed",
|
||||||
swarmInspectFunc: func() (swarm.Swarm, error) {
|
swarmInspectFunc: func() (swarm.Swarm, error) {
|
||||||
return swarm.Swarm{}, fmt.Errorf("error inspecting the swarm")
|
return swarm.Swarm{}, errors.Errorf("error inspecting the swarm")
|
||||||
},
|
},
|
||||||
expectedError: "error inspecting the swarm",
|
expectedError: "error inspecting the swarm",
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
name: "node-inspect-after-init-failed",
|
name: "node-inspect-after-init-failed",
|
||||||
nodeInspectFunc: func() (swarm.Node, []byte, error) {
|
nodeInspectFunc: func() (swarm.Node, []byte, error) {
|
||||||
return swarm.Node{}, []byte{}, fmt.Errorf("error inspecting the node")
|
return swarm.Node{}, []byte{}, errors.Errorf("error inspecting the node")
|
||||||
},
|
},
|
||||||
expectedError: "error inspecting the node",
|
expectedError: "error inspecting the node",
|
||||||
},
|
},
|
||||||
|
@ -57,7 +58,7 @@ func TestSwarmInitErrorOnAPIFailure(t *testing.T) {
|
||||||
flagAutolock: "true",
|
flagAutolock: "true",
|
||||||
},
|
},
|
||||||
swarmGetUnlockKeyFunc: func() (types.SwarmUnlockKeyResponse, error) {
|
swarmGetUnlockKeyFunc: func() (types.SwarmUnlockKeyResponse, error) {
|
||||||
return types.SwarmUnlockKeyResponse{}, fmt.Errorf("error getting swarm unlock key")
|
return types.SwarmUnlockKeyResponse{}, errors.Errorf("error getting swarm unlock key")
|
||||||
},
|
},
|
||||||
expectedError: "could not fetch unlock key: error getting swarm unlock key",
|
expectedError: "could not fetch unlock key: error getting swarm unlock key",
|
||||||
},
|
},
|
||||||
|
|
|
@ -9,6 +9,7 @@ import (
|
||||||
"github.com/docker/docker/api/types/swarm"
|
"github.com/docker/docker/api/types/swarm"
|
||||||
"github.com/docker/docker/cli"
|
"github.com/docker/docker/cli"
|
||||||
"github.com/docker/docker/cli/command"
|
"github.com/docker/docker/cli/command"
|
||||||
|
"github.com/pkg/errors"
|
||||||
"github.com/spf13/cobra"
|
"github.com/spf13/cobra"
|
||||||
"github.com/spf13/pflag"
|
"github.com/spf13/pflag"
|
||||||
)
|
)
|
||||||
|
@ -61,7 +62,7 @@ func runJoin(dockerCli command.Cli, flags *pflag.FlagSet, opts joinOptions) erro
|
||||||
case swarm.NodeAvailabilityActive, swarm.NodeAvailabilityPause, swarm.NodeAvailabilityDrain:
|
case swarm.NodeAvailabilityActive, swarm.NodeAvailabilityPause, swarm.NodeAvailabilityDrain:
|
||||||
req.Availability = availability
|
req.Availability = availability
|
||||||
default:
|
default:
|
||||||
return fmt.Errorf("invalid availability %q, only active, pause and drain are supported", opts.availability)
|
return errors.Errorf("invalid availability %q, only active, pause and drain are supported", opts.availability)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -2,7 +2,6 @@ package swarm
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"bytes"
|
"bytes"
|
||||||
"fmt"
|
|
||||||
"io/ioutil"
|
"io/ioutil"
|
||||||
"strings"
|
"strings"
|
||||||
"testing"
|
"testing"
|
||||||
|
@ -11,6 +10,7 @@ import (
|
||||||
"github.com/docker/docker/api/types/swarm"
|
"github.com/docker/docker/api/types/swarm"
|
||||||
"github.com/docker/docker/cli/internal/test"
|
"github.com/docker/docker/cli/internal/test"
|
||||||
"github.com/docker/docker/pkg/testutil/assert"
|
"github.com/docker/docker/pkg/testutil/assert"
|
||||||
|
"github.com/pkg/errors"
|
||||||
)
|
)
|
||||||
|
|
||||||
func TestSwarmJoinErrors(t *testing.T) {
|
func TestSwarmJoinErrors(t *testing.T) {
|
||||||
|
@ -34,7 +34,7 @@ func TestSwarmJoinErrors(t *testing.T) {
|
||||||
name: "join-failed",
|
name: "join-failed",
|
||||||
args: []string{"remote"},
|
args: []string{"remote"},
|
||||||
swarmJoinFunc: func() error {
|
swarmJoinFunc: func() error {
|
||||||
return fmt.Errorf("error joining the swarm")
|
return errors.Errorf("error joining the swarm")
|
||||||
},
|
},
|
||||||
expectedError: "error joining the swarm",
|
expectedError: "error joining the swarm",
|
||||||
},
|
},
|
||||||
|
@ -42,7 +42,7 @@ func TestSwarmJoinErrors(t *testing.T) {
|
||||||
name: "join-failed-on-init",
|
name: "join-failed-on-init",
|
||||||
args: []string{"remote"},
|
args: []string{"remote"},
|
||||||
infoFunc: func() (types.Info, error) {
|
infoFunc: func() (types.Info, error) {
|
||||||
return types.Info{}, fmt.Errorf("error asking for node info")
|
return types.Info{}, errors.Errorf("error asking for node info")
|
||||||
},
|
},
|
||||||
expectedError: "error asking for node info",
|
expectedError: "error asking for node info",
|
||||||
},
|
},
|
||||||
|
|
|
@ -1,14 +1,13 @@
|
||||||
package swarm
|
package swarm
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"errors"
|
|
||||||
"fmt"
|
"fmt"
|
||||||
|
|
||||||
"github.com/spf13/cobra"
|
|
||||||
|
|
||||||
"github.com/docker/docker/api/types/swarm"
|
"github.com/docker/docker/api/types/swarm"
|
||||||
"github.com/docker/docker/cli"
|
"github.com/docker/docker/cli"
|
||||||
"github.com/docker/docker/cli/command"
|
"github.com/docker/docker/cli/command"
|
||||||
|
"github.com/pkg/errors"
|
||||||
|
"github.com/spf13/cobra"
|
||||||
"golang.org/x/net/context"
|
"golang.org/x/net/context"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
|
@ -9,6 +9,7 @@ import (
|
||||||
"github.com/docker/docker/api/types"
|
"github.com/docker/docker/api/types"
|
||||||
"github.com/docker/docker/api/types/swarm"
|
"github.com/docker/docker/api/types/swarm"
|
||||||
"github.com/docker/docker/cli/internal/test"
|
"github.com/docker/docker/cli/internal/test"
|
||||||
|
"github.com/pkg/errors"
|
||||||
// Import builders to get the builder function as package function
|
// Import builders to get the builder function as package function
|
||||||
. "github.com/docker/docker/cli/internal/test/builders"
|
. "github.com/docker/docker/cli/internal/test/builders"
|
||||||
"github.com/docker/docker/pkg/testutil/assert"
|
"github.com/docker/docker/pkg/testutil/assert"
|
||||||
|
@ -44,7 +45,7 @@ func TestSwarmJoinTokenErrors(t *testing.T) {
|
||||||
name: "swarm-inspect-failed",
|
name: "swarm-inspect-failed",
|
||||||
args: []string{"worker"},
|
args: []string{"worker"},
|
||||||
swarmInspectFunc: func() (swarm.Swarm, error) {
|
swarmInspectFunc: func() (swarm.Swarm, error) {
|
||||||
return swarm.Swarm{}, fmt.Errorf("error inspecting the swarm")
|
return swarm.Swarm{}, errors.Errorf("error inspecting the swarm")
|
||||||
},
|
},
|
||||||
expectedError: "error inspecting the swarm",
|
expectedError: "error inspecting the swarm",
|
||||||
},
|
},
|
||||||
|
@ -55,7 +56,7 @@ func TestSwarmJoinTokenErrors(t *testing.T) {
|
||||||
flagRotate: "true",
|
flagRotate: "true",
|
||||||
},
|
},
|
||||||
swarmInspectFunc: func() (swarm.Swarm, error) {
|
swarmInspectFunc: func() (swarm.Swarm, error) {
|
||||||
return swarm.Swarm{}, fmt.Errorf("error inspecting the swarm")
|
return swarm.Swarm{}, errors.Errorf("error inspecting the swarm")
|
||||||
},
|
},
|
||||||
expectedError: "error inspecting the swarm",
|
expectedError: "error inspecting the swarm",
|
||||||
},
|
},
|
||||||
|
@ -66,7 +67,7 @@ func TestSwarmJoinTokenErrors(t *testing.T) {
|
||||||
flagRotate: "true",
|
flagRotate: "true",
|
||||||
},
|
},
|
||||||
swarmUpdateFunc: func(swarm swarm.Spec, flags swarm.UpdateFlags) error {
|
swarmUpdateFunc: func(swarm swarm.Spec, flags swarm.UpdateFlags) error {
|
||||||
return fmt.Errorf("error updating the swarm")
|
return errors.Errorf("error updating the swarm")
|
||||||
},
|
},
|
||||||
expectedError: "error updating the swarm",
|
expectedError: "error updating the swarm",
|
||||||
},
|
},
|
||||||
|
@ -74,7 +75,7 @@ func TestSwarmJoinTokenErrors(t *testing.T) {
|
||||||
name: "node-inspect-failed",
|
name: "node-inspect-failed",
|
||||||
args: []string{"worker"},
|
args: []string{"worker"},
|
||||||
nodeInspectFunc: func() (swarm.Node, []byte, error) {
|
nodeInspectFunc: func() (swarm.Node, []byte, error) {
|
||||||
return swarm.Node{}, []byte{}, fmt.Errorf("error inspecting node")
|
return swarm.Node{}, []byte{}, errors.Errorf("error inspecting node")
|
||||||
},
|
},
|
||||||
expectedError: "error inspecting node",
|
expectedError: "error inspecting node",
|
||||||
},
|
},
|
||||||
|
@ -82,7 +83,7 @@ func TestSwarmJoinTokenErrors(t *testing.T) {
|
||||||
name: "info-failed",
|
name: "info-failed",
|
||||||
args: []string{"worker"},
|
args: []string{"worker"},
|
||||||
infoFunc: func() (types.Info, error) {
|
infoFunc: func() (types.Info, error) {
|
||||||
return types.Info{}, fmt.Errorf("error asking for node info")
|
return types.Info{}, errors.Errorf("error asking for node info")
|
||||||
},
|
},
|
||||||
expectedError: "error asking for node info",
|
expectedError: "error asking for node info",
|
||||||
},
|
},
|
||||||
|
|
|
@ -2,13 +2,13 @@ package swarm
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"bytes"
|
"bytes"
|
||||||
"fmt"
|
|
||||||
"io/ioutil"
|
"io/ioutil"
|
||||||
"strings"
|
"strings"
|
||||||
"testing"
|
"testing"
|
||||||
|
|
||||||
"github.com/docker/docker/cli/internal/test"
|
"github.com/docker/docker/cli/internal/test"
|
||||||
"github.com/docker/docker/pkg/testutil/assert"
|
"github.com/docker/docker/pkg/testutil/assert"
|
||||||
|
"github.com/pkg/errors"
|
||||||
)
|
)
|
||||||
|
|
||||||
func TestSwarmLeaveErrors(t *testing.T) {
|
func TestSwarmLeaveErrors(t *testing.T) {
|
||||||
|
@ -26,7 +26,7 @@ func TestSwarmLeaveErrors(t *testing.T) {
|
||||||
{
|
{
|
||||||
name: "leave-failed",
|
name: "leave-failed",
|
||||||
swarmLeaveFunc: func() error {
|
swarmLeaveFunc: func() error {
|
||||||
return fmt.Errorf("error leaving the swarm")
|
return errors.Errorf("error leaving the swarm")
|
||||||
},
|
},
|
||||||
expectedError: "error leaving the swarm",
|
expectedError: "error leaving the swarm",
|
||||||
},
|
},
|
||||||
|
|
|
@ -2,13 +2,13 @@ package swarm
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"encoding/csv"
|
"encoding/csv"
|
||||||
"errors"
|
|
||||||
"fmt"
|
"fmt"
|
||||||
"strings"
|
"strings"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
"github.com/docker/docker/api/types/swarm"
|
"github.com/docker/docker/api/types/swarm"
|
||||||
"github.com/docker/docker/opts"
|
"github.com/docker/docker/opts"
|
||||||
|
"github.com/pkg/errors"
|
||||||
"github.com/spf13/pflag"
|
"github.com/spf13/pflag"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
@ -139,7 +139,7 @@ func parseExternalCA(caSpec string) (*swarm.ExternalCA, error) {
|
||||||
parts := strings.SplitN(field, "=", 2)
|
parts := strings.SplitN(field, "=", 2)
|
||||||
|
|
||||||
if len(parts) != 2 {
|
if len(parts) != 2 {
|
||||||
return nil, fmt.Errorf("invalid field '%s' must be a key=value pair", field)
|
return nil, errors.Errorf("invalid field '%s' must be a key=value pair", field)
|
||||||
}
|
}
|
||||||
|
|
||||||
key, value := parts[0], parts[1]
|
key, value := parts[0], parts[1]
|
||||||
|
@ -150,7 +150,7 @@ func parseExternalCA(caSpec string) (*swarm.ExternalCA, error) {
|
||||||
if strings.ToLower(value) == string(swarm.ExternalCAProtocolCFSSL) {
|
if strings.ToLower(value) == string(swarm.ExternalCAProtocolCFSSL) {
|
||||||
externalCA.Protocol = swarm.ExternalCAProtocolCFSSL
|
externalCA.Protocol = swarm.ExternalCAProtocolCFSSL
|
||||||
} else {
|
} else {
|
||||||
return nil, fmt.Errorf("unrecognized external CA protocol %s", value)
|
return nil, errors.Errorf("unrecognized external CA protocol %s", value)
|
||||||
}
|
}
|
||||||
case "url":
|
case "url":
|
||||||
hasURL = true
|
hasURL = true
|
||||||
|
|
|
@ -2,17 +2,16 @@ package swarm
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"bufio"
|
"bufio"
|
||||||
"errors"
|
|
||||||
"fmt"
|
"fmt"
|
||||||
"io"
|
"io"
|
||||||
"strings"
|
"strings"
|
||||||
|
|
||||||
"github.com/spf13/cobra"
|
|
||||||
"golang.org/x/crypto/ssh/terminal"
|
|
||||||
|
|
||||||
"github.com/docker/docker/api/types/swarm"
|
"github.com/docker/docker/api/types/swarm"
|
||||||
"github.com/docker/docker/cli"
|
"github.com/docker/docker/cli"
|
||||||
"github.com/docker/docker/cli/command"
|
"github.com/docker/docker/cli/command"
|
||||||
|
"github.com/pkg/errors"
|
||||||
|
"github.com/spf13/cobra"
|
||||||
|
"golang.org/x/crypto/ssh/terminal"
|
||||||
"golang.org/x/net/context"
|
"golang.org/x/net/context"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
|
@ -9,6 +9,7 @@ import (
|
||||||
"github.com/docker/docker/api/types"
|
"github.com/docker/docker/api/types"
|
||||||
"github.com/docker/docker/api/types/swarm"
|
"github.com/docker/docker/api/types/swarm"
|
||||||
"github.com/docker/docker/cli/internal/test"
|
"github.com/docker/docker/cli/internal/test"
|
||||||
|
"github.com/pkg/errors"
|
||||||
// Import builders to get the builder function as package function
|
// Import builders to get the builder function as package function
|
||||||
. "github.com/docker/docker/cli/internal/test/builders"
|
. "github.com/docker/docker/cli/internal/test/builders"
|
||||||
"github.com/docker/docker/pkg/testutil/assert"
|
"github.com/docker/docker/pkg/testutil/assert"
|
||||||
|
@ -36,7 +37,7 @@ func TestSwarmUnlockKeyErrors(t *testing.T) {
|
||||||
flagRotate: "true",
|
flagRotate: "true",
|
||||||
},
|
},
|
||||||
swarmInspectFunc: func() (swarm.Swarm, error) {
|
swarmInspectFunc: func() (swarm.Swarm, error) {
|
||||||
return swarm.Swarm{}, fmt.Errorf("error inspecting the swarm")
|
return swarm.Swarm{}, errors.Errorf("error inspecting the swarm")
|
||||||
},
|
},
|
||||||
expectedError: "error inspecting the swarm",
|
expectedError: "error inspecting the swarm",
|
||||||
},
|
},
|
||||||
|
@ -59,14 +60,14 @@ func TestSwarmUnlockKeyErrors(t *testing.T) {
|
||||||
return *Swarm(Autolock()), nil
|
return *Swarm(Autolock()), nil
|
||||||
},
|
},
|
||||||
swarmUpdateFunc: func(swarm swarm.Spec, flags swarm.UpdateFlags) error {
|
swarmUpdateFunc: func(swarm swarm.Spec, flags swarm.UpdateFlags) error {
|
||||||
return fmt.Errorf("error updating the swarm")
|
return errors.Errorf("error updating the swarm")
|
||||||
},
|
},
|
||||||
expectedError: "error updating the swarm",
|
expectedError: "error updating the swarm",
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
name: "swarm-get-unlock-key-failed",
|
name: "swarm-get-unlock-key-failed",
|
||||||
swarmGetUnlockKeyFunc: func() (types.SwarmUnlockKeyResponse, error) {
|
swarmGetUnlockKeyFunc: func() (types.SwarmUnlockKeyResponse, error) {
|
||||||
return types.SwarmUnlockKeyResponse{}, fmt.Errorf("error getting unlock key")
|
return types.SwarmUnlockKeyResponse{}, errors.Errorf("error getting unlock key")
|
||||||
},
|
},
|
||||||
expectedError: "error getting unlock key",
|
expectedError: "error getting unlock key",
|
||||||
},
|
},
|
||||||
|
|
|
@ -2,7 +2,6 @@ package swarm
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"bytes"
|
"bytes"
|
||||||
"fmt"
|
|
||||||
"io/ioutil"
|
"io/ioutil"
|
||||||
"strings"
|
"strings"
|
||||||
"testing"
|
"testing"
|
||||||
|
@ -11,6 +10,7 @@ import (
|
||||||
"github.com/docker/docker/api/types/swarm"
|
"github.com/docker/docker/api/types/swarm"
|
||||||
"github.com/docker/docker/cli/internal/test"
|
"github.com/docker/docker/cli/internal/test"
|
||||||
"github.com/docker/docker/pkg/testutil/assert"
|
"github.com/docker/docker/pkg/testutil/assert"
|
||||||
|
"github.com/pkg/errors"
|
||||||
)
|
)
|
||||||
|
|
||||||
func TestSwarmUnlockErrors(t *testing.T) {
|
func TestSwarmUnlockErrors(t *testing.T) {
|
||||||
|
@ -59,7 +59,7 @@ func TestSwarmUnlockErrors(t *testing.T) {
|
||||||
}, nil
|
}, nil
|
||||||
},
|
},
|
||||||
swarmUnlockFunc: func(req swarm.UnlockRequest) error {
|
swarmUnlockFunc: func(req swarm.UnlockRequest) error {
|
||||||
return fmt.Errorf("error unlocking the swarm")
|
return errors.Errorf("error unlocking the swarm")
|
||||||
},
|
},
|
||||||
expectedError: "error unlocking the swarm",
|
expectedError: "error unlocking the swarm",
|
||||||
},
|
},
|
||||||
|
@ -90,7 +90,7 @@ func TestSwarmUnlock(t *testing.T) {
|
||||||
},
|
},
|
||||||
swarmUnlockFunc: func(req swarm.UnlockRequest) error {
|
swarmUnlockFunc: func(req swarm.UnlockRequest) error {
|
||||||
if req.UnlockKey != input {
|
if req.UnlockKey != input {
|
||||||
return fmt.Errorf("Invalid unlock key")
|
return errors.Errorf("Invalid unlock key")
|
||||||
}
|
}
|
||||||
return nil
|
return nil
|
||||||
},
|
},
|
||||||
|
|
|
@ -10,6 +10,7 @@ import (
|
||||||
"github.com/docker/docker/api/types"
|
"github.com/docker/docker/api/types"
|
||||||
"github.com/docker/docker/api/types/swarm"
|
"github.com/docker/docker/api/types/swarm"
|
||||||
"github.com/docker/docker/cli/internal/test"
|
"github.com/docker/docker/cli/internal/test"
|
||||||
|
"github.com/pkg/errors"
|
||||||
// Import builders to get the builder function as package function
|
// Import builders to get the builder function as package function
|
||||||
. "github.com/docker/docker/cli/internal/test/builders"
|
. "github.com/docker/docker/cli/internal/test/builders"
|
||||||
"github.com/docker/docker/pkg/testutil/assert"
|
"github.com/docker/docker/pkg/testutil/assert"
|
||||||
|
@ -37,7 +38,7 @@ func TestSwarmUpdateErrors(t *testing.T) {
|
||||||
flagTaskHistoryLimit: "10",
|
flagTaskHistoryLimit: "10",
|
||||||
},
|
},
|
||||||
swarmInspectFunc: func() (swarm.Swarm, error) {
|
swarmInspectFunc: func() (swarm.Swarm, error) {
|
||||||
return swarm.Swarm{}, fmt.Errorf("error inspecting the swarm")
|
return swarm.Swarm{}, errors.Errorf("error inspecting the swarm")
|
||||||
},
|
},
|
||||||
expectedError: "error inspecting the swarm",
|
expectedError: "error inspecting the swarm",
|
||||||
},
|
},
|
||||||
|
@ -47,7 +48,7 @@ func TestSwarmUpdateErrors(t *testing.T) {
|
||||||
flagTaskHistoryLimit: "10",
|
flagTaskHistoryLimit: "10",
|
||||||
},
|
},
|
||||||
swarmUpdateFunc: func(swarm swarm.Spec, flags swarm.UpdateFlags) error {
|
swarmUpdateFunc: func(swarm swarm.Spec, flags swarm.UpdateFlags) error {
|
||||||
return fmt.Errorf("error updating the swarm")
|
return errors.Errorf("error updating the swarm")
|
||||||
},
|
},
|
||||||
expectedError: "error updating the swarm",
|
expectedError: "error updating the swarm",
|
||||||
},
|
},
|
||||||
|
@ -60,7 +61,7 @@ func TestSwarmUpdateErrors(t *testing.T) {
|
||||||
return *Swarm(), nil
|
return *Swarm(), nil
|
||||||
},
|
},
|
||||||
swarmGetUnlockKeyFunc: func() (types.SwarmUnlockKeyResponse, error) {
|
swarmGetUnlockKeyFunc: func() (types.SwarmUnlockKeyResponse, error) {
|
||||||
return types.SwarmUnlockKeyResponse{}, fmt.Errorf("error getting unlock key")
|
return types.SwarmUnlockKeyResponse{}, errors.Errorf("error getting unlock key")
|
||||||
},
|
},
|
||||||
expectedError: "error getting unlock key",
|
expectedError: "error getting unlock key",
|
||||||
},
|
},
|
||||||
|
@ -108,33 +109,33 @@ func TestSwarmUpdate(t *testing.T) {
|
||||||
},
|
},
|
||||||
swarmUpdateFunc: func(swarm swarm.Spec, flags swarm.UpdateFlags) error {
|
swarmUpdateFunc: func(swarm swarm.Spec, flags swarm.UpdateFlags) error {
|
||||||
if *swarm.Orchestration.TaskHistoryRetentionLimit != 10 {
|
if *swarm.Orchestration.TaskHistoryRetentionLimit != 10 {
|
||||||
return fmt.Errorf("historyLimit not correctly set")
|
return errors.Errorf("historyLimit not correctly set")
|
||||||
}
|
}
|
||||||
heartbeatDuration, err := time.ParseDuration("10s")
|
heartbeatDuration, err := time.ParseDuration("10s")
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
if swarm.Dispatcher.HeartbeatPeriod != heartbeatDuration {
|
if swarm.Dispatcher.HeartbeatPeriod != heartbeatDuration {
|
||||||
return fmt.Errorf("heartbeatPeriodLimit not correctly set")
|
return errors.Errorf("heartbeatPeriodLimit not correctly set")
|
||||||
}
|
}
|
||||||
certExpiryDuration, err := time.ParseDuration("20s")
|
certExpiryDuration, err := time.ParseDuration("20s")
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
if swarm.CAConfig.NodeCertExpiry != certExpiryDuration {
|
if swarm.CAConfig.NodeCertExpiry != certExpiryDuration {
|
||||||
return fmt.Errorf("certExpiry not correctly set")
|
return errors.Errorf("certExpiry not correctly set")
|
||||||
}
|
}
|
||||||
if len(swarm.CAConfig.ExternalCAs) != 1 {
|
if len(swarm.CAConfig.ExternalCAs) != 1 {
|
||||||
return fmt.Errorf("externalCA not correctly set")
|
return errors.Errorf("externalCA not correctly set")
|
||||||
}
|
}
|
||||||
if *swarm.Raft.KeepOldSnapshots != 10 {
|
if *swarm.Raft.KeepOldSnapshots != 10 {
|
||||||
return fmt.Errorf("keepOldSnapshots not correctly set")
|
return errors.Errorf("keepOldSnapshots not correctly set")
|
||||||
}
|
}
|
||||||
if swarm.Raft.SnapshotInterval != 100 {
|
if swarm.Raft.SnapshotInterval != 100 {
|
||||||
return fmt.Errorf("snapshotInterval not correctly set")
|
return errors.Errorf("snapshotInterval not correctly set")
|
||||||
}
|
}
|
||||||
if !swarm.EncryptionConfig.AutoLockManagers {
|
if !swarm.EncryptionConfig.AutoLockManagers {
|
||||||
return fmt.Errorf("autolock not correctly set")
|
return errors.Errorf("autolock not correctly set")
|
||||||
}
|
}
|
||||||
return nil
|
return nil
|
||||||
},
|
},
|
||||||
|
@ -147,7 +148,7 @@ func TestSwarmUpdate(t *testing.T) {
|
||||||
},
|
},
|
||||||
swarmUpdateFunc: func(swarm swarm.Spec, flags swarm.UpdateFlags) error {
|
swarmUpdateFunc: func(swarm swarm.Spec, flags swarm.UpdateFlags) error {
|
||||||
if *swarm.Orchestration.TaskHistoryRetentionLimit != 10 {
|
if *swarm.Orchestration.TaskHistoryRetentionLimit != 10 {
|
||||||
return fmt.Errorf("historyLimit not correctly set")
|
return errors.Errorf("historyLimit not correctly set")
|
||||||
}
|
}
|
||||||
return nil
|
return nil
|
||||||
},
|
},
|
||||||
|
|
|
@ -10,6 +10,7 @@ import (
|
||||||
"github.com/docker/docker/cli/command"
|
"github.com/docker/docker/cli/command"
|
||||||
"github.com/docker/docker/cli/command/inspect"
|
"github.com/docker/docker/cli/command/inspect"
|
||||||
apiclient "github.com/docker/docker/client"
|
apiclient "github.com/docker/docker/client"
|
||||||
|
"github.com/pkg/errors"
|
||||||
"github.com/spf13/cobra"
|
"github.com/spf13/cobra"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
@ -48,7 +49,7 @@ func runInspect(dockerCli *command.DockerCli, opts inspectOptions) error {
|
||||||
case "", "container", "image", "node", "network", "service", "volume", "task", "plugin":
|
case "", "container", "image", "node", "network", "service", "volume", "task", "plugin":
|
||||||
elementSearcher = inspectAll(context.Background(), dockerCli, opts.size, opts.inspectType)
|
elementSearcher = inspectAll(context.Background(), dockerCli, opts.size, opts.inspectType)
|
||||||
default:
|
default:
|
||||||
return fmt.Errorf("%q is not a valid value for --type", opts.inspectType)
|
return errors.Errorf("%q is not a valid value for --type", opts.inspectType)
|
||||||
}
|
}
|
||||||
return inspect.Inspect(dockerCli.Out(), opts.ids, opts.format, elementSearcher)
|
return inspect.Inspect(dockerCli.Out(), opts.ids, opts.format, elementSearcher)
|
||||||
}
|
}
|
||||||
|
@ -198,6 +199,6 @@ func inspectAll(ctx context.Context, dockerCli *command.DockerCli, getSize bool,
|
||||||
}
|
}
|
||||||
return v, raw, err
|
return v, raw, err
|
||||||
}
|
}
|
||||||
return nil, nil, fmt.Errorf("Error: No such object: %s", ref)
|
return nil, nil, errors.Errorf("Error: No such object: %s", ref)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -8,6 +8,7 @@ import (
|
||||||
"github.com/docker/docker/cli/command"
|
"github.com/docker/docker/cli/command"
|
||||||
"github.com/docker/docker/opts"
|
"github.com/docker/docker/opts"
|
||||||
runconfigopts "github.com/docker/docker/runconfig/opts"
|
runconfigopts "github.com/docker/docker/runconfig/opts"
|
||||||
|
"github.com/pkg/errors"
|
||||||
"github.com/spf13/cobra"
|
"github.com/spf13/cobra"
|
||||||
"golang.org/x/net/context"
|
"golang.org/x/net/context"
|
||||||
)
|
)
|
||||||
|
@ -32,7 +33,7 @@ func newCreateCommand(dockerCli command.Cli) *cobra.Command {
|
||||||
RunE: func(cmd *cobra.Command, args []string) error {
|
RunE: func(cmd *cobra.Command, args []string) error {
|
||||||
if len(args) == 1 {
|
if len(args) == 1 {
|
||||||
if opts.name != "" {
|
if opts.name != "" {
|
||||||
return fmt.Errorf("Conflicting options: either specify --name or provide positional arg, not both\n")
|
return errors.Errorf("Conflicting options: either specify --name or provide positional arg, not both\n")
|
||||||
}
|
}
|
||||||
opts.name = args[0]
|
opts.name = args[0]
|
||||||
}
|
}
|
||||||
|
|
|
@ -2,7 +2,6 @@ package volume
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"bytes"
|
"bytes"
|
||||||
"fmt"
|
|
||||||
"io/ioutil"
|
"io/ioutil"
|
||||||
"strings"
|
"strings"
|
||||||
"testing"
|
"testing"
|
||||||
|
@ -11,6 +10,7 @@ import (
|
||||||
volumetypes "github.com/docker/docker/api/types/volume"
|
volumetypes "github.com/docker/docker/api/types/volume"
|
||||||
"github.com/docker/docker/cli/internal/test"
|
"github.com/docker/docker/cli/internal/test"
|
||||||
"github.com/docker/docker/pkg/testutil/assert"
|
"github.com/docker/docker/pkg/testutil/assert"
|
||||||
|
"github.com/pkg/errors"
|
||||||
)
|
)
|
||||||
|
|
||||||
func TestVolumeCreateErrors(t *testing.T) {
|
func TestVolumeCreateErrors(t *testing.T) {
|
||||||
|
@ -33,7 +33,7 @@ func TestVolumeCreateErrors(t *testing.T) {
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
volumeCreateFunc: func(createBody volumetypes.VolumesCreateBody) (types.Volume, error) {
|
volumeCreateFunc: func(createBody volumetypes.VolumesCreateBody) (types.Volume, error) {
|
||||||
return types.Volume{}, fmt.Errorf("error creating volume")
|
return types.Volume{}, errors.Errorf("error creating volume")
|
||||||
},
|
},
|
||||||
expectedError: "error creating volume",
|
expectedError: "error creating volume",
|
||||||
},
|
},
|
||||||
|
@ -60,7 +60,7 @@ func TestVolumeCreateWithName(t *testing.T) {
|
||||||
cli := test.NewFakeCli(&fakeClient{
|
cli := test.NewFakeCli(&fakeClient{
|
||||||
volumeCreateFunc: func(body volumetypes.VolumesCreateBody) (types.Volume, error) {
|
volumeCreateFunc: func(body volumetypes.VolumesCreateBody) (types.Volume, error) {
|
||||||
if body.Name != name {
|
if body.Name != name {
|
||||||
return types.Volume{}, fmt.Errorf("expected name %q, got %q", name, body.Name)
|
return types.Volume{}, errors.Errorf("expected name %q, got %q", name, body.Name)
|
||||||
}
|
}
|
||||||
return types.Volume{
|
return types.Volume{
|
||||||
Name: body.Name,
|
Name: body.Name,
|
||||||
|
@ -98,16 +98,16 @@ func TestVolumeCreateWithFlags(t *testing.T) {
|
||||||
cli := test.NewFakeCli(&fakeClient{
|
cli := test.NewFakeCli(&fakeClient{
|
||||||
volumeCreateFunc: func(body volumetypes.VolumesCreateBody) (types.Volume, error) {
|
volumeCreateFunc: func(body volumetypes.VolumesCreateBody) (types.Volume, error) {
|
||||||
if body.Name != "" {
|
if body.Name != "" {
|
||||||
return types.Volume{}, fmt.Errorf("expected empty name, got %q", body.Name)
|
return types.Volume{}, errors.Errorf("expected empty name, got %q", body.Name)
|
||||||
}
|
}
|
||||||
if body.Driver != expectedDriver {
|
if body.Driver != expectedDriver {
|
||||||
return types.Volume{}, fmt.Errorf("expected driver %q, got %q", expectedDriver, body.Driver)
|
return types.Volume{}, errors.Errorf("expected driver %q, got %q", expectedDriver, body.Driver)
|
||||||
}
|
}
|
||||||
if !compareMap(body.DriverOpts, expectedOpts) {
|
if !compareMap(body.DriverOpts, expectedOpts) {
|
||||||
return types.Volume{}, fmt.Errorf("expected drivers opts %v, got %v", expectedOpts, body.DriverOpts)
|
return types.Volume{}, errors.Errorf("expected drivers opts %v, got %v", expectedOpts, body.DriverOpts)
|
||||||
}
|
}
|
||||||
if !compareMap(body.Labels, expectedLabels) {
|
if !compareMap(body.Labels, expectedLabels) {
|
||||||
return types.Volume{}, fmt.Errorf("expected labels %v, got %v", expectedLabels, body.Labels)
|
return types.Volume{}, errors.Errorf("expected labels %v, got %v", expectedLabels, body.Labels)
|
||||||
}
|
}
|
||||||
return types.Volume{
|
return types.Volume{
|
||||||
Name: name,
|
Name: name,
|
||||||
|
|
|
@ -8,6 +8,7 @@ import (
|
||||||
|
|
||||||
"github.com/docker/docker/api/types"
|
"github.com/docker/docker/api/types"
|
||||||
"github.com/docker/docker/cli/internal/test"
|
"github.com/docker/docker/cli/internal/test"
|
||||||
|
"github.com/pkg/errors"
|
||||||
// Import builders to get the builder function as package function
|
// Import builders to get the builder function as package function
|
||||||
. "github.com/docker/docker/cli/internal/test/builders"
|
. "github.com/docker/docker/cli/internal/test/builders"
|
||||||
"github.com/docker/docker/pkg/testutil/assert"
|
"github.com/docker/docker/pkg/testutil/assert"
|
||||||
|
@ -27,7 +28,7 @@ func TestVolumeInspectErrors(t *testing.T) {
|
||||||
{
|
{
|
||||||
args: []string{"foo"},
|
args: []string{"foo"},
|
||||||
volumeInspectFunc: func(volumeID string) (types.Volume, error) {
|
volumeInspectFunc: func(volumeID string) (types.Volume, error) {
|
||||||
return types.Volume{}, fmt.Errorf("error while inspecting the volume")
|
return types.Volume{}, errors.Errorf("error while inspecting the volume")
|
||||||
},
|
},
|
||||||
expectedError: "error while inspecting the volume",
|
expectedError: "error while inspecting the volume",
|
||||||
},
|
},
|
||||||
|
@ -46,7 +47,7 @@ func TestVolumeInspectErrors(t *testing.T) {
|
||||||
Name: "foo",
|
Name: "foo",
|
||||||
}, nil
|
}, nil
|
||||||
}
|
}
|
||||||
return types.Volume{}, fmt.Errorf("error while inspecting the volume")
|
return types.Volume{}, errors.Errorf("error while inspecting the volume")
|
||||||
},
|
},
|
||||||
expectedError: "error while inspecting the volume",
|
expectedError: "error while inspecting the volume",
|
||||||
},
|
},
|
||||||
|
@ -78,7 +79,7 @@ func TestVolumeInspectWithoutFormat(t *testing.T) {
|
||||||
args: []string{"foo"},
|
args: []string{"foo"},
|
||||||
volumeInspectFunc: func(volumeID string) (types.Volume, error) {
|
volumeInspectFunc: func(volumeID string) (types.Volume, error) {
|
||||||
if volumeID != "foo" {
|
if volumeID != "foo" {
|
||||||
return types.Volume{}, fmt.Errorf("Invalid volumeID, expected %s, got %s", "foo", volumeID)
|
return types.Volume{}, errors.Errorf("Invalid volumeID, expected %s, got %s", "foo", volumeID)
|
||||||
}
|
}
|
||||||
return *Volume(), nil
|
return *Volume(), nil
|
||||||
},
|
},
|
||||||
|
|
|
@ -2,7 +2,6 @@ package volume
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"bytes"
|
"bytes"
|
||||||
"fmt"
|
|
||||||
"io/ioutil"
|
"io/ioutil"
|
||||||
"testing"
|
"testing"
|
||||||
|
|
||||||
|
@ -11,6 +10,7 @@ import (
|
||||||
volumetypes "github.com/docker/docker/api/types/volume"
|
volumetypes "github.com/docker/docker/api/types/volume"
|
||||||
"github.com/docker/docker/cli/config/configfile"
|
"github.com/docker/docker/cli/config/configfile"
|
||||||
"github.com/docker/docker/cli/internal/test"
|
"github.com/docker/docker/cli/internal/test"
|
||||||
|
"github.com/pkg/errors"
|
||||||
// Import builders to get the builder function as package function
|
// Import builders to get the builder function as package function
|
||||||
. "github.com/docker/docker/cli/internal/test/builders"
|
. "github.com/docker/docker/cli/internal/test/builders"
|
||||||
"github.com/docker/docker/pkg/testutil/assert"
|
"github.com/docker/docker/pkg/testutil/assert"
|
||||||
|
@ -30,7 +30,7 @@ func TestVolumeListErrors(t *testing.T) {
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
volumeListFunc: func(filter filters.Args) (volumetypes.VolumesListOKBody, error) {
|
volumeListFunc: func(filter filters.Args) (volumetypes.VolumesListOKBody, error) {
|
||||||
return volumetypes.VolumesListOKBody{}, fmt.Errorf("error listing volumes")
|
return volumetypes.VolumesListOKBody{}, errors.Errorf("error listing volumes")
|
||||||
},
|
},
|
||||||
expectedError: "error listing volumes",
|
expectedError: "error listing volumes",
|
||||||
},
|
},
|
||||||
|
|
|
@ -13,6 +13,7 @@ import (
|
||||||
"github.com/docker/docker/cli/internal/test"
|
"github.com/docker/docker/cli/internal/test"
|
||||||
"github.com/docker/docker/pkg/testutil/assert"
|
"github.com/docker/docker/pkg/testutil/assert"
|
||||||
"github.com/docker/docker/pkg/testutil/golden"
|
"github.com/docker/docker/pkg/testutil/golden"
|
||||||
|
"github.com/pkg/errors"
|
||||||
)
|
)
|
||||||
|
|
||||||
func TestVolumePruneErrors(t *testing.T) {
|
func TestVolumePruneErrors(t *testing.T) {
|
||||||
|
@ -31,7 +32,7 @@ func TestVolumePruneErrors(t *testing.T) {
|
||||||
"force": "true",
|
"force": "true",
|
||||||
},
|
},
|
||||||
volumePruneFunc: func(args filters.Args) (types.VolumesPruneReport, error) {
|
volumePruneFunc: func(args filters.Args) (types.VolumesPruneReport, error) {
|
||||||
return types.VolumesPruneReport{}, fmt.Errorf("error pruning volumes")
|
return types.VolumesPruneReport{}, errors.Errorf("error pruning volumes")
|
||||||
},
|
},
|
||||||
expectedError: "error pruning volumes",
|
expectedError: "error pruning volumes",
|
||||||
},
|
},
|
||||||
|
|
|
@ -6,6 +6,7 @@ import (
|
||||||
|
|
||||||
"github.com/docker/docker/cli"
|
"github.com/docker/docker/cli"
|
||||||
"github.com/docker/docker/cli/command"
|
"github.com/docker/docker/cli/command"
|
||||||
|
"github.com/pkg/errors"
|
||||||
"github.com/spf13/cobra"
|
"github.com/spf13/cobra"
|
||||||
"golang.org/x/net/context"
|
"golang.org/x/net/context"
|
||||||
)
|
)
|
||||||
|
@ -53,7 +54,7 @@ func runRemove(dockerCli command.Cli, opts *removeOptions) error {
|
||||||
}
|
}
|
||||||
|
|
||||||
if len(errs) > 0 {
|
if len(errs) > 0 {
|
||||||
return fmt.Errorf("%s", strings.Join(errs, "\n"))
|
return errors.Errorf("%s", strings.Join(errs, "\n"))
|
||||||
}
|
}
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
|
@ -2,12 +2,12 @@ package volume
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"bytes"
|
"bytes"
|
||||||
"fmt"
|
|
||||||
"io/ioutil"
|
"io/ioutil"
|
||||||
"testing"
|
"testing"
|
||||||
|
|
||||||
"github.com/docker/docker/cli/internal/test"
|
"github.com/docker/docker/cli/internal/test"
|
||||||
"github.com/docker/docker/pkg/testutil/assert"
|
"github.com/docker/docker/pkg/testutil/assert"
|
||||||
|
"github.com/pkg/errors"
|
||||||
)
|
)
|
||||||
|
|
||||||
func TestVolumeRemoveErrors(t *testing.T) {
|
func TestVolumeRemoveErrors(t *testing.T) {
|
||||||
|
@ -22,7 +22,7 @@ func TestVolumeRemoveErrors(t *testing.T) {
|
||||||
{
|
{
|
||||||
args: []string{"nodeID"},
|
args: []string{"nodeID"},
|
||||||
volumeRemoveFunc: func(volumeID string, force bool) error {
|
volumeRemoveFunc: func(volumeID string, force bool) error {
|
||||||
return fmt.Errorf("error removing the volume")
|
return errors.Errorf("error removing the volume")
|
||||||
},
|
},
|
||||||
expectedError: "error removing the volume",
|
expectedError: "error removing the volume",
|
||||||
},
|
},
|
||||||
|
|
|
@ -261,7 +261,7 @@ func convertHealthcheck(healthcheck *composetypes.HealthCheckConfig) (*container
|
||||||
)
|
)
|
||||||
if healthcheck.Disable {
|
if healthcheck.Disable {
|
||||||
if len(healthcheck.Test) != 0 {
|
if len(healthcheck.Test) != 0 {
|
||||||
return nil, fmt.Errorf("test and disable can't be set at the same time")
|
return nil, errors.Errorf("test and disable can't be set at the same time")
|
||||||
}
|
}
|
||||||
return &container.HealthConfig{
|
return &container.HealthConfig{
|
||||||
Test: []string{"NONE"},
|
Test: []string{"NONE"},
|
||||||
|
@ -312,7 +312,7 @@ func convertRestartPolicy(restart string, source *composetypes.RestartPolicy) (*
|
||||||
MaxAttempts: &attempts,
|
MaxAttempts: &attempts,
|
||||||
}, nil
|
}, nil
|
||||||
default:
|
default:
|
||||||
return nil, fmt.Errorf("unknown restart policy: %s", restart)
|
return nil, errors.Errorf("unknown restart policy: %s", restart)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return &swarm.RestartPolicy{
|
return &swarm.RestartPolicy{
|
||||||
|
@ -418,13 +418,13 @@ func convertDeployMode(mode string, replicas *uint64) (swarm.ServiceMode, error)
|
||||||
switch mode {
|
switch mode {
|
||||||
case "global":
|
case "global":
|
||||||
if replicas != nil {
|
if replicas != nil {
|
||||||
return serviceMode, fmt.Errorf("replicas can only be used with replicated mode")
|
return serviceMode, errors.Errorf("replicas can only be used with replicated mode")
|
||||||
}
|
}
|
||||||
serviceMode.Global = &swarm.GlobalService{}
|
serviceMode.Global = &swarm.GlobalService{}
|
||||||
case "replicated", "":
|
case "replicated", "":
|
||||||
serviceMode.Replicated = &swarm.ReplicatedService{Replicas: replicas}
|
serviceMode.Replicated = &swarm.ReplicatedService{Replicas: replicas}
|
||||||
default:
|
default:
|
||||||
return serviceMode, fmt.Errorf("Unknown mode: %s", mode)
|
return serviceMode, errors.Errorf("Unknown mode: %s", mode)
|
||||||
}
|
}
|
||||||
return serviceMode, nil
|
return serviceMode, nil
|
||||||
}
|
}
|
||||||
|
|
|
@ -19,6 +19,7 @@ import (
|
||||||
units "github.com/docker/go-units"
|
units "github.com/docker/go-units"
|
||||||
shellwords "github.com/mattn/go-shellwords"
|
shellwords "github.com/mattn/go-shellwords"
|
||||||
"github.com/mitchellh/mapstructure"
|
"github.com/mitchellh/mapstructure"
|
||||||
|
"github.com/pkg/errors"
|
||||||
yaml "gopkg.in/yaml.v2"
|
yaml "gopkg.in/yaml.v2"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
@ -35,7 +36,7 @@ func ParseYAML(source []byte) (map[string]interface{}, error) {
|
||||||
}
|
}
|
||||||
cfgMap, ok := cfg.(map[interface{}]interface{})
|
cfgMap, ok := cfg.(map[interface{}]interface{})
|
||||||
if !ok {
|
if !ok {
|
||||||
return nil, fmt.Errorf("Top-level object must be a mapping")
|
return nil, errors.Errorf("Top-level object must be a mapping")
|
||||||
}
|
}
|
||||||
converted, err := convertToStringKeysRecursive(cfgMap, "")
|
converted, err := convertToStringKeysRecursive(cfgMap, "")
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
@ -47,10 +48,10 @@ func ParseYAML(source []byte) (map[string]interface{}, error) {
|
||||||
// Load reads a ConfigDetails and returns a fully loaded configuration
|
// Load reads a ConfigDetails and returns a fully loaded configuration
|
||||||
func Load(configDetails types.ConfigDetails) (*types.Config, error) {
|
func Load(configDetails types.ConfigDetails) (*types.Config, error) {
|
||||||
if len(configDetails.ConfigFiles) < 1 {
|
if len(configDetails.ConfigFiles) < 1 {
|
||||||
return nil, fmt.Errorf("No files specified")
|
return nil, errors.Errorf("No files specified")
|
||||||
}
|
}
|
||||||
if len(configDetails.ConfigFiles) > 1 {
|
if len(configDetails.ConfigFiles) > 1 {
|
||||||
return nil, fmt.Errorf("Multiple files are not yet supported")
|
return nil, errors.Errorf("Multiple files are not yet supported")
|
||||||
}
|
}
|
||||||
|
|
||||||
configDict := getConfigDict(configDetails)
|
configDict := getConfigDict(configDetails)
|
||||||
|
@ -309,7 +310,7 @@ func formatInvalidKeyError(keyPrefix string, key interface{}) error {
|
||||||
} else {
|
} else {
|
||||||
location = fmt.Sprintf("in %s", keyPrefix)
|
location = fmt.Sprintf("in %s", keyPrefix)
|
||||||
}
|
}
|
||||||
return fmt.Errorf("Non-string key %s: %#v", location, key)
|
return errors.Errorf("Non-string key %s: %#v", location, key)
|
||||||
}
|
}
|
||||||
|
|
||||||
// LoadServices produces a ServiceConfig map from a compose file Dict
|
// LoadServices produces a ServiceConfig map from a compose file Dict
|
||||||
|
@ -414,7 +415,7 @@ func transformUlimits(data interface{}) (interface{}, error) {
|
||||||
ulimit.Hard = value["hard"].(int)
|
ulimit.Hard = value["hard"].(int)
|
||||||
return ulimit, nil
|
return ulimit, nil
|
||||||
default:
|
default:
|
||||||
return data, fmt.Errorf("invalid type %T for ulimits", value)
|
return data, errors.Errorf("invalid type %T for ulimits", value)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -435,6 +436,12 @@ func LoadNetworks(source map[string]interface{}) (map[string]types.NetworkConfig
|
||||||
return networks, nil
|
return networks, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func externalVolumeError(volume, key string) error {
|
||||||
|
return errors.Errorf(
|
||||||
|
"conflicting parameters \"external\" and %q specified for volume %q",
|
||||||
|
key, volume)
|
||||||
|
}
|
||||||
|
|
||||||
// LoadVolumes produces a VolumeConfig map from a compose file Dict
|
// LoadVolumes produces a VolumeConfig map from a compose file Dict
|
||||||
// the source Dict is not validated if directly used. Use Load() to enable validation
|
// the source Dict is not validated if directly used. Use Load() to enable validation
|
||||||
func LoadVolumes(source map[string]interface{}) (map[string]types.VolumeConfig, error) {
|
func LoadVolumes(source map[string]interface{}) (map[string]types.VolumeConfig, error) {
|
||||||
|
@ -445,15 +452,14 @@ func LoadVolumes(source map[string]interface{}) (map[string]types.VolumeConfig,
|
||||||
}
|
}
|
||||||
for name, volume := range volumes {
|
for name, volume := range volumes {
|
||||||
if volume.External.External {
|
if volume.External.External {
|
||||||
template := "conflicting parameters \"external\" and %q specified for volume %q"
|
|
||||||
if volume.Driver != "" {
|
if volume.Driver != "" {
|
||||||
return nil, fmt.Errorf(template, "driver", name)
|
return nil, externalVolumeError(name, "driver")
|
||||||
}
|
}
|
||||||
if len(volume.DriverOpts) > 0 {
|
if len(volume.DriverOpts) > 0 {
|
||||||
return nil, fmt.Errorf(template, "driver_opts", name)
|
return nil, externalVolumeError(name, "driver_opts")
|
||||||
}
|
}
|
||||||
if len(volume.Labels) > 0 {
|
if len(volume.Labels) > 0 {
|
||||||
return nil, fmt.Errorf(template, "labels", name)
|
return nil, externalVolumeError(name, "labels")
|
||||||
}
|
}
|
||||||
if volume.External.Name == "" {
|
if volume.External.Name == "" {
|
||||||
volume.External.Name = name
|
volume.External.Name = name
|
||||||
|
@ -497,7 +503,7 @@ func transformMapStringString(data interface{}) (interface{}, error) {
|
||||||
case map[string]string:
|
case map[string]string:
|
||||||
return value, nil
|
return value, nil
|
||||||
default:
|
default:
|
||||||
return data, fmt.Errorf("invalid type %T for map[string]string", value)
|
return data, errors.Errorf("invalid type %T for map[string]string", value)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -508,7 +514,7 @@ func transformExternal(data interface{}) (interface{}, error) {
|
||||||
case map[string]interface{}:
|
case map[string]interface{}:
|
||||||
return map[string]interface{}{"external": true, "name": value["name"]}, nil
|
return map[string]interface{}{"external": true, "name": value["name"]}, nil
|
||||||
default:
|
default:
|
||||||
return data, fmt.Errorf("invalid type %T for external", value)
|
return data, errors.Errorf("invalid type %T for external", value)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -536,12 +542,12 @@ func transformServicePort(data interface{}) (interface{}, error) {
|
||||||
case map[string]interface{}:
|
case map[string]interface{}:
|
||||||
ports = append(ports, value)
|
ports = append(ports, value)
|
||||||
default:
|
default:
|
||||||
return data, fmt.Errorf("invalid type %T for port", value)
|
return data, errors.Errorf("invalid type %T for port", value)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return ports, nil
|
return ports, nil
|
||||||
default:
|
default:
|
||||||
return data, fmt.Errorf("invalid type %T for port", entries)
|
return data, errors.Errorf("invalid type %T for port", entries)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -552,7 +558,7 @@ func transformServiceSecret(data interface{}) (interface{}, error) {
|
||||||
case map[string]interface{}:
|
case map[string]interface{}:
|
||||||
return data, nil
|
return data, nil
|
||||||
default:
|
default:
|
||||||
return data, fmt.Errorf("invalid type %T for secret", value)
|
return data, errors.Errorf("invalid type %T for secret", value)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -563,7 +569,7 @@ func transformServiceVolumeConfig(data interface{}) (interface{}, error) {
|
||||||
case map[string]interface{}:
|
case map[string]interface{}:
|
||||||
return data, nil
|
return data, nil
|
||||||
default:
|
default:
|
||||||
return data, fmt.Errorf("invalid type %T for service volume", value)
|
return data, errors.Errorf("invalid type %T for service volume", value)
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -595,7 +601,7 @@ func transformStringList(data interface{}) (interface{}, error) {
|
||||||
case []interface{}:
|
case []interface{}:
|
||||||
return value, nil
|
return value, nil
|
||||||
default:
|
default:
|
||||||
return data, fmt.Errorf("invalid type %T for string list", value)
|
return data, errors.Errorf("invalid type %T for string list", value)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -619,7 +625,7 @@ func transformMappingOrList(mappingOrList interface{}, sep string, allowNil bool
|
||||||
}
|
}
|
||||||
return result
|
return result
|
||||||
}
|
}
|
||||||
panic(fmt.Errorf("expected a map or a list, got %T: %#v", mappingOrList, mappingOrList))
|
panic(errors.Errorf("expected a map or a list, got %T: %#v", mappingOrList, mappingOrList))
|
||||||
}
|
}
|
||||||
|
|
||||||
func transformShellCommand(value interface{}) (interface{}, error) {
|
func transformShellCommand(value interface{}) (interface{}, error) {
|
||||||
|
@ -636,7 +642,7 @@ func transformHealthCheckTest(data interface{}) (interface{}, error) {
|
||||||
case []interface{}:
|
case []interface{}:
|
||||||
return value, nil
|
return value, nil
|
||||||
default:
|
default:
|
||||||
return value, fmt.Errorf("invalid type %T for healthcheck.test", value)
|
return value, errors.Errorf("invalid type %T for healthcheck.test", value)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -647,7 +653,7 @@ func transformSize(value interface{}) (int64, error) {
|
||||||
case string:
|
case string:
|
||||||
return units.RAMInBytes(value)
|
return units.RAMInBytes(value)
|
||||||
}
|
}
|
||||||
panic(fmt.Errorf("invalid type for size %T", value))
|
panic(errors.Errorf("invalid type for size %T", value))
|
||||||
}
|
}
|
||||||
|
|
||||||
func toServicePortConfigs(value string) ([]interface{}, error) {
|
func toServicePortConfigs(value string) ([]interface{}, error) {
|
||||||
|
|
|
@ -1,7 +1,6 @@
|
||||||
package config
|
package config
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"fmt"
|
|
||||||
"io"
|
"io"
|
||||||
"os"
|
"os"
|
||||||
"path/filepath"
|
"path/filepath"
|
||||||
|
@ -9,6 +8,7 @@ import (
|
||||||
"github.com/docker/docker/api/types"
|
"github.com/docker/docker/api/types"
|
||||||
"github.com/docker/docker/cli/config/configfile"
|
"github.com/docker/docker/cli/config/configfile"
|
||||||
"github.com/docker/docker/pkg/homedir"
|
"github.com/docker/docker/pkg/homedir"
|
||||||
|
"github.com/pkg/errors"
|
||||||
)
|
)
|
||||||
|
|
||||||
const (
|
const (
|
||||||
|
@ -84,18 +84,18 @@ func Load(configDir string) (*configfile.ConfigFile, error) {
|
||||||
if _, err := os.Stat(configFile.Filename); err == nil {
|
if _, err := os.Stat(configFile.Filename); err == nil {
|
||||||
file, err := os.Open(configFile.Filename)
|
file, err := os.Open(configFile.Filename)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return &configFile, fmt.Errorf("%s - %v", configFile.Filename, err)
|
return &configFile, errors.Errorf("%s - %v", configFile.Filename, err)
|
||||||
}
|
}
|
||||||
defer file.Close()
|
defer file.Close()
|
||||||
err = configFile.LoadFromReader(file)
|
err = configFile.LoadFromReader(file)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
err = fmt.Errorf("%s - %v", configFile.Filename, err)
|
err = errors.Errorf("%s - %v", configFile.Filename, err)
|
||||||
}
|
}
|
||||||
return &configFile, err
|
return &configFile, err
|
||||||
} else if !os.IsNotExist(err) {
|
} else if !os.IsNotExist(err) {
|
||||||
// if file is there but we can't stat it for any reason other
|
// if file is there but we can't stat it for any reason other
|
||||||
// than it doesn't exist then stop
|
// than it doesn't exist then stop
|
||||||
return &configFile, fmt.Errorf("%s - %v", configFile.Filename, err)
|
return &configFile, errors.Errorf("%s - %v", configFile.Filename, err)
|
||||||
}
|
}
|
||||||
|
|
||||||
// Can't find latest config file so check for the old one
|
// Can't find latest config file so check for the old one
|
||||||
|
@ -105,12 +105,12 @@ func Load(configDir string) (*configfile.ConfigFile, error) {
|
||||||
}
|
}
|
||||||
file, err := os.Open(confFile)
|
file, err := os.Open(confFile)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return &configFile, fmt.Errorf("%s - %v", confFile, err)
|
return &configFile, errors.Errorf("%s - %v", confFile, err)
|
||||||
}
|
}
|
||||||
defer file.Close()
|
defer file.Close()
|
||||||
err = configFile.LegacyLoadFromReader(file)
|
err = configFile.LegacyLoadFromReader(file)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return &configFile, fmt.Errorf("%s - %v", confFile, err)
|
return &configFile, errors.Errorf("%s - %v", confFile, err)
|
||||||
}
|
}
|
||||||
|
|
||||||
if configFile.HTTPHeaders == nil {
|
if configFile.HTTPHeaders == nil {
|
||||||
|
|
|
@ -3,7 +3,6 @@ package configfile
|
||||||
import (
|
import (
|
||||||
"encoding/base64"
|
"encoding/base64"
|
||||||
"encoding/json"
|
"encoding/json"
|
||||||
"fmt"
|
|
||||||
"io"
|
"io"
|
||||||
"io/ioutil"
|
"io/ioutil"
|
||||||
"os"
|
"os"
|
||||||
|
@ -11,6 +10,7 @@ import (
|
||||||
"strings"
|
"strings"
|
||||||
|
|
||||||
"github.com/docker/docker/api/types"
|
"github.com/docker/docker/api/types"
|
||||||
|
"github.com/pkg/errors"
|
||||||
)
|
)
|
||||||
|
|
||||||
const (
|
const (
|
||||||
|
@ -51,12 +51,12 @@ func (configFile *ConfigFile) LegacyLoadFromReader(configData io.Reader) error {
|
||||||
if err := json.Unmarshal(b, &configFile.AuthConfigs); err != nil {
|
if err := json.Unmarshal(b, &configFile.AuthConfigs); err != nil {
|
||||||
arr := strings.Split(string(b), "\n")
|
arr := strings.Split(string(b), "\n")
|
||||||
if len(arr) < 2 {
|
if len(arr) < 2 {
|
||||||
return fmt.Errorf("The Auth config file is empty")
|
return errors.Errorf("The Auth config file is empty")
|
||||||
}
|
}
|
||||||
authConfig := types.AuthConfig{}
|
authConfig := types.AuthConfig{}
|
||||||
origAuth := strings.Split(arr[0], " = ")
|
origAuth := strings.Split(arr[0], " = ")
|
||||||
if len(origAuth) != 2 {
|
if len(origAuth) != 2 {
|
||||||
return fmt.Errorf("Invalid Auth config file")
|
return errors.Errorf("Invalid Auth config file")
|
||||||
}
|
}
|
||||||
authConfig.Username, authConfig.Password, err = decodeAuth(origAuth[1])
|
authConfig.Username, authConfig.Password, err = decodeAuth(origAuth[1])
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
@ -135,7 +135,7 @@ func (configFile *ConfigFile) SaveToWriter(writer io.Writer) error {
|
||||||
// Save encodes and writes out all the authorization information
|
// Save encodes and writes out all the authorization information
|
||||||
func (configFile *ConfigFile) Save() error {
|
func (configFile *ConfigFile) Save() error {
|
||||||
if configFile.Filename == "" {
|
if configFile.Filename == "" {
|
||||||
return fmt.Errorf("Can't save config with empty filename")
|
return errors.Errorf("Can't save config with empty filename")
|
||||||
}
|
}
|
||||||
|
|
||||||
if err := os.MkdirAll(filepath.Dir(configFile.Filename), 0700); err != nil {
|
if err := os.MkdirAll(filepath.Dir(configFile.Filename), 0700); err != nil {
|
||||||
|
@ -176,11 +176,11 @@ func decodeAuth(authStr string) (string, string, error) {
|
||||||
return "", "", err
|
return "", "", err
|
||||||
}
|
}
|
||||||
if n > decLen {
|
if n > decLen {
|
||||||
return "", "", fmt.Errorf("Something went wrong decoding auth config")
|
return "", "", errors.Errorf("Something went wrong decoding auth config")
|
||||||
}
|
}
|
||||||
arr := strings.SplitN(string(decoded), ":", 2)
|
arr := strings.SplitN(string(decoded), ":", 2)
|
||||||
if len(arr) != 2 {
|
if len(arr) != 2 {
|
||||||
return "", "", fmt.Errorf("Invalid auth configuration file")
|
return "", "", errors.Errorf("Invalid auth configuration file")
|
||||||
}
|
}
|
||||||
password := strings.Trim(arr[1], "\x00")
|
password := strings.Trim(arr[1], "\x00")
|
||||||
return arr[0], password, nil
|
return arr[0], password, nil
|
||||||
|
|
|
@ -11,6 +11,7 @@ import (
|
||||||
"github.com/docker/docker-credential-helpers/client"
|
"github.com/docker/docker-credential-helpers/client"
|
||||||
"github.com/docker/docker-credential-helpers/credentials"
|
"github.com/docker/docker-credential-helpers/credentials"
|
||||||
"github.com/docker/docker/api/types"
|
"github.com/docker/docker/api/types"
|
||||||
|
"github.com/pkg/errors"
|
||||||
)
|
)
|
||||||
|
|
||||||
const (
|
const (
|
||||||
|
@ -20,7 +21,7 @@ const (
|
||||||
missingCredsAddress = "https://missing.docker.io/v1"
|
missingCredsAddress = "https://missing.docker.io/v1"
|
||||||
)
|
)
|
||||||
|
|
||||||
var errCommandExited = fmt.Errorf("exited 1")
|
var errCommandExited = errors.Errorf("exited 1")
|
||||||
|
|
||||||
// mockCommand simulates interactions between the docker client and a remote
|
// mockCommand simulates interactions between the docker client and a remote
|
||||||
// credentials helper.
|
// credentials helper.
|
||||||
|
|
|
@ -1,9 +1,9 @@
|
||||||
package cli
|
package cli
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"fmt"
|
|
||||||
"strings"
|
"strings"
|
||||||
|
|
||||||
|
"github.com/pkg/errors"
|
||||||
"github.com/spf13/cobra"
|
"github.com/spf13/cobra"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
@ -14,10 +14,10 @@ func NoArgs(cmd *cobra.Command, args []string) error {
|
||||||
}
|
}
|
||||||
|
|
||||||
if cmd.HasSubCommands() {
|
if cmd.HasSubCommands() {
|
||||||
return fmt.Errorf("\n" + strings.TrimRight(cmd.UsageString(), "\n"))
|
return errors.Errorf("\n" + strings.TrimRight(cmd.UsageString(), "\n"))
|
||||||
}
|
}
|
||||||
|
|
||||||
return fmt.Errorf(
|
return errors.Errorf(
|
||||||
"\"%s\" accepts no argument(s).\nSee '%s --help'.\n\nUsage: %s\n\n%s",
|
"\"%s\" accepts no argument(s).\nSee '%s --help'.\n\nUsage: %s\n\n%s",
|
||||||
cmd.CommandPath(),
|
cmd.CommandPath(),
|
||||||
cmd.CommandPath(),
|
cmd.CommandPath(),
|
||||||
|
@ -32,7 +32,7 @@ func RequiresMinArgs(min int) cobra.PositionalArgs {
|
||||||
if len(args) >= min {
|
if len(args) >= min {
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
return fmt.Errorf(
|
return errors.Errorf(
|
||||||
"\"%s\" requires at least %d argument(s).\nSee '%s --help'.\n\nUsage: %s\n\n%s",
|
"\"%s\" requires at least %d argument(s).\nSee '%s --help'.\n\nUsage: %s\n\n%s",
|
||||||
cmd.CommandPath(),
|
cmd.CommandPath(),
|
||||||
min,
|
min,
|
||||||
|
@ -49,7 +49,7 @@ func RequiresMaxArgs(max int) cobra.PositionalArgs {
|
||||||
if len(args) <= max {
|
if len(args) <= max {
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
return fmt.Errorf(
|
return errors.Errorf(
|
||||||
"\"%s\" requires at most %d argument(s).\nSee '%s --help'.\n\nUsage: %s\n\n%s",
|
"\"%s\" requires at most %d argument(s).\nSee '%s --help'.\n\nUsage: %s\n\n%s",
|
||||||
cmd.CommandPath(),
|
cmd.CommandPath(),
|
||||||
max,
|
max,
|
||||||
|
@ -66,7 +66,7 @@ func RequiresRangeArgs(min int, max int) cobra.PositionalArgs {
|
||||||
if len(args) >= min && len(args) <= max {
|
if len(args) >= min && len(args) <= max {
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
return fmt.Errorf(
|
return errors.Errorf(
|
||||||
"\"%s\" requires at least %d and at most %d argument(s).\nSee '%s --help'.\n\nUsage: %s\n\n%s",
|
"\"%s\" requires at least %d and at most %d argument(s).\nSee '%s --help'.\n\nUsage: %s\n\n%s",
|
||||||
cmd.CommandPath(),
|
cmd.CommandPath(),
|
||||||
min,
|
min,
|
||||||
|
@ -84,7 +84,7 @@ func ExactArgs(number int) cobra.PositionalArgs {
|
||||||
if len(args) == number {
|
if len(args) == number {
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
return fmt.Errorf(
|
return errors.Errorf(
|
||||||
"\"%s\" requires exactly %d argument(s).\nSee '%s --help'.\n\nUsage: %s\n\n%s",
|
"\"%s\" requires exactly %d argument(s).\nSee '%s --help'.\n\nUsage: %s\n\n%s",
|
||||||
cmd.CommandPath(),
|
cmd.CommandPath(),
|
||||||
number,
|
number,
|
||||||
|
|
|
@ -2,7 +2,6 @@ package trust
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"encoding/json"
|
"encoding/json"
|
||||||
"fmt"
|
|
||||||
"net"
|
"net"
|
||||||
"net/http"
|
"net/http"
|
||||||
"net/url"
|
"net/url"
|
||||||
|
@ -29,6 +28,7 @@ import (
|
||||||
"github.com/docker/notary/trustpinning"
|
"github.com/docker/notary/trustpinning"
|
||||||
"github.com/docker/notary/tuf/data"
|
"github.com/docker/notary/tuf/data"
|
||||||
"github.com/docker/notary/tuf/signed"
|
"github.com/docker/notary/tuf/signed"
|
||||||
|
"github.com/pkg/errors"
|
||||||
)
|
)
|
||||||
|
|
||||||
var (
|
var (
|
||||||
|
@ -57,7 +57,7 @@ func Server(index *registrytypes.IndexInfo) (string, error) {
|
||||||
if s := os.Getenv("DOCKER_CONTENT_TRUST_SERVER"); s != "" {
|
if s := os.Getenv("DOCKER_CONTENT_TRUST_SERVER"); s != "" {
|
||||||
urlObj, err := url.Parse(s)
|
urlObj, err := url.Parse(s)
|
||||||
if err != nil || urlObj.Scheme != "https" {
|
if err != nil || urlObj.Scheme != "https" {
|
||||||
return "", fmt.Errorf("valid https URL required for trust server, got %s", s)
|
return "", errors.Errorf("valid https URL required for trust server, got %s", s)
|
||||||
}
|
}
|
||||||
|
|
||||||
return s, nil
|
return s, nil
|
||||||
|
@ -205,27 +205,27 @@ func NotaryError(repoName string, err error) error {
|
||||||
switch err.(type) {
|
switch err.(type) {
|
||||||
case *json.SyntaxError:
|
case *json.SyntaxError:
|
||||||
logrus.Debugf("Notary syntax error: %s", err)
|
logrus.Debugf("Notary syntax error: %s", err)
|
||||||
return fmt.Errorf("Error: no trust data available for remote repository %s. Try running notary server and setting DOCKER_CONTENT_TRUST_SERVER to its HTTPS address?", repoName)
|
return errors.Errorf("Error: no trust data available for remote repository %s. Try running notary server and setting DOCKER_CONTENT_TRUST_SERVER to its HTTPS address?", repoName)
|
||||||
case signed.ErrExpired:
|
case signed.ErrExpired:
|
||||||
return fmt.Errorf("Error: remote repository %s out-of-date: %v", repoName, err)
|
return errors.Errorf("Error: remote repository %s out-of-date: %v", repoName, err)
|
||||||
case trustmanager.ErrKeyNotFound:
|
case trustmanager.ErrKeyNotFound:
|
||||||
return fmt.Errorf("Error: signing keys for remote repository %s not found: %v", repoName, err)
|
return errors.Errorf("Error: signing keys for remote repository %s not found: %v", repoName, err)
|
||||||
case storage.NetworkError:
|
case storage.NetworkError:
|
||||||
return fmt.Errorf("Error: error contacting notary server: %v", err)
|
return errors.Errorf("Error: error contacting notary server: %v", err)
|
||||||
case storage.ErrMetaNotFound:
|
case storage.ErrMetaNotFound:
|
||||||
return fmt.Errorf("Error: trust data missing for remote repository %s or remote repository not found: %v", repoName, err)
|
return errors.Errorf("Error: trust data missing for remote repository %s or remote repository not found: %v", repoName, err)
|
||||||
case trustpinning.ErrRootRotationFail, trustpinning.ErrValidationFail, signed.ErrInvalidKeyType:
|
case trustpinning.ErrRootRotationFail, trustpinning.ErrValidationFail, signed.ErrInvalidKeyType:
|
||||||
return fmt.Errorf("Warning: potential malicious behavior - trust data mismatch for remote repository %s: %v", repoName, err)
|
return errors.Errorf("Warning: potential malicious behavior - trust data mismatch for remote repository %s: %v", repoName, err)
|
||||||
case signed.ErrNoKeys:
|
case signed.ErrNoKeys:
|
||||||
return fmt.Errorf("Error: could not find signing keys for remote repository %s, or could not decrypt signing key: %v", repoName, err)
|
return errors.Errorf("Error: could not find signing keys for remote repository %s, or could not decrypt signing key: %v", repoName, err)
|
||||||
case signed.ErrLowVersion:
|
case signed.ErrLowVersion:
|
||||||
return fmt.Errorf("Warning: potential malicious behavior - trust data version is lower than expected for remote repository %s: %v", repoName, err)
|
return errors.Errorf("Warning: potential malicious behavior - trust data version is lower than expected for remote repository %s: %v", repoName, err)
|
||||||
case signed.ErrRoleThreshold:
|
case signed.ErrRoleThreshold:
|
||||||
return fmt.Errorf("Warning: potential malicious behavior - trust data has insufficient signatures for remote repository %s: %v", repoName, err)
|
return errors.Errorf("Warning: potential malicious behavior - trust data has insufficient signatures for remote repository %s: %v", repoName, err)
|
||||||
case client.ErrRepositoryNotExist:
|
case client.ErrRepositoryNotExist:
|
||||||
return fmt.Errorf("Error: remote trust data does not exist for %s: %v", repoName, err)
|
return errors.Errorf("Error: remote trust data does not exist for %s: %v", repoName, err)
|
||||||
case signed.ErrInsufficientSignatures:
|
case signed.ErrInsufficientSignatures:
|
||||||
return fmt.Errorf("Error: could not produce valid signature for %s. If Yubikey was used, was touch input provided?: %v", repoName, err)
|
return errors.Errorf("Error: could not produce valid signature for %s. If Yubikey was used, was touch input provided?: %v", repoName, err)
|
||||||
}
|
}
|
||||||
|
|
||||||
return err
|
return err
|
||||||
|
|
Loading…
Reference in a new issue