mirror of
https://github.com/genuinetools/reg.git
synced 2024-06-28 10:24:17 -04:00
change to dep
Signed-off-by: Jess Frazelle <acidburn@microsoft.com>
This commit is contained in:
parent
1cff9720a0
commit
59ee462713
2
main.go
2
main.go
|
@ -10,7 +10,6 @@ import (
|
||||||
"sync"
|
"sync"
|
||||||
"text/tabwriter"
|
"text/tabwriter"
|
||||||
|
|
||||||
"github.com/Sirupsen/logrus"
|
|
||||||
"github.com/docker/distribution/manifest/schema1"
|
"github.com/docker/distribution/manifest/schema1"
|
||||||
"github.com/docker/docker/api/types"
|
"github.com/docker/docker/api/types"
|
||||||
"github.com/jessfraz/reg/clair"
|
"github.com/jessfraz/reg/clair"
|
||||||
|
@ -18,6 +17,7 @@ import (
|
||||||
"github.com/jessfraz/reg/utils"
|
"github.com/jessfraz/reg/utils"
|
||||||
"github.com/jessfraz/reg/version"
|
"github.com/jessfraz/reg/version"
|
||||||
digest "github.com/opencontainers/go-digest"
|
digest "github.com/opencontainers/go-digest"
|
||||||
|
"github.com/sirupsen/logrus"
|
||||||
"github.com/urfave/cli"
|
"github.com/urfave/cli"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
|
@ -10,10 +10,10 @@ import (
|
||||||
"strings"
|
"strings"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
"github.com/Sirupsen/logrus"
|
|
||||||
"github.com/gorilla/mux"
|
"github.com/gorilla/mux"
|
||||||
"github.com/jessfraz/reg/clair"
|
"github.com/jessfraz/reg/clair"
|
||||||
"github.com/jessfraz/reg/registry"
|
"github.com/jessfraz/reg/registry"
|
||||||
|
"github.com/sirupsen/logrus"
|
||||||
)
|
)
|
||||||
|
|
||||||
type registryController struct {
|
type registryController struct {
|
||||||
|
|
|
@ -8,12 +8,12 @@ import (
|
||||||
"strings"
|
"strings"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
"github.com/Sirupsen/logrus"
|
|
||||||
"github.com/gorilla/mux"
|
"github.com/gorilla/mux"
|
||||||
"github.com/jessfraz/reg/clair"
|
"github.com/jessfraz/reg/clair"
|
||||||
"github.com/jessfraz/reg/registry"
|
"github.com/jessfraz/reg/registry"
|
||||||
"github.com/jessfraz/reg/utils"
|
"github.com/jessfraz/reg/utils"
|
||||||
wordwrap "github.com/mitchellh/go-wordwrap"
|
wordwrap "github.com/mitchellh/go-wordwrap"
|
||||||
|
"github.com/sirupsen/logrus"
|
||||||
"github.com/urfave/cli"
|
"github.com/urfave/cli"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
|
@ -5,8 +5,8 @@ import (
|
||||||
"fmt"
|
"fmt"
|
||||||
"strings"
|
"strings"
|
||||||
|
|
||||||
|
"github.com/docker/docker-ce/components/cli/cli/config"
|
||||||
"github.com/docker/docker/api/types"
|
"github.com/docker/docker/api/types"
|
||||||
"github.com/docker/docker/cli/config"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
// GetAuthConfig returns the docker registry AuthConfig.
|
// GetAuthConfig returns the docker registry AuthConfig.
|
||||||
|
|
21
vendor/github.com/Sirupsen/logrus/LICENSE
generated
vendored
21
vendor/github.com/Sirupsen/logrus/LICENSE
generated
vendored
|
@ -1,21 +0,0 @@
|
||||||
The MIT License (MIT)
|
|
||||||
|
|
||||||
Copyright (c) 2014 Simon Eskildsen
|
|
||||||
|
|
||||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
||||||
of this software and associated documentation files (the "Software"), to deal
|
|
||||||
in the Software without restriction, including without limitation the rights
|
|
||||||
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
||||||
copies of the Software, and to permit persons to whom the Software is
|
|
||||||
furnished to do so, subject to the following conditions:
|
|
||||||
|
|
||||||
The above copyright notice and this permission notice shall be included in
|
|
||||||
all copies or substantial portions of the Software.
|
|
||||||
|
|
||||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
||||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
||||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
||||||
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
||||||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
||||||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
|
||||||
THE SOFTWARE.
|
|
64
vendor/github.com/Sirupsen/logrus/alt_exit.go
generated
vendored
64
vendor/github.com/Sirupsen/logrus/alt_exit.go
generated
vendored
|
@ -1,64 +0,0 @@
|
||||||
package logrus
|
|
||||||
|
|
||||||
// The following code was sourced and modified from the
|
|
||||||
// https://bitbucket.org/tebeka/atexit package governed by the following license:
|
|
||||||
//
|
|
||||||
// Copyright (c) 2012 Miki Tebeka <miki.tebeka@gmail.com>.
|
|
||||||
//
|
|
||||||
// Permission is hereby granted, free of charge, to any person obtaining a copy of
|
|
||||||
// this software and associated documentation files (the "Software"), to deal in
|
|
||||||
// the Software without restriction, including without limitation the rights to
|
|
||||||
// use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
|
|
||||||
// the Software, and to permit persons to whom the Software is furnished to do so,
|
|
||||||
// subject to the following conditions:
|
|
||||||
//
|
|
||||||
// The above copyright notice and this permission notice shall be included in all
|
|
||||||
// copies or substantial portions of the Software.
|
|
||||||
//
|
|
||||||
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
||||||
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
|
|
||||||
// FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
|
|
||||||
// COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
|
|
||||||
// IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
|
|
||||||
// CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
|
||||||
|
|
||||||
import (
|
|
||||||
"fmt"
|
|
||||||
"os"
|
|
||||||
)
|
|
||||||
|
|
||||||
var handlers = []func(){}
|
|
||||||
|
|
||||||
func runHandler(handler func()) {
|
|
||||||
defer func() {
|
|
||||||
if err := recover(); err != nil {
|
|
||||||
fmt.Fprintln(os.Stderr, "Error: Logrus exit handler error:", err)
|
|
||||||
}
|
|
||||||
}()
|
|
||||||
|
|
||||||
handler()
|
|
||||||
}
|
|
||||||
|
|
||||||
func runHandlers() {
|
|
||||||
for _, handler := range handlers {
|
|
||||||
runHandler(handler)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Exit runs all the Logrus atexit handlers and then terminates the program using os.Exit(code)
|
|
||||||
func Exit(code int) {
|
|
||||||
runHandlers()
|
|
||||||
os.Exit(code)
|
|
||||||
}
|
|
||||||
|
|
||||||
// RegisterExitHandler adds a Logrus Exit handler, call logrus.Exit to invoke
|
|
||||||
// all handlers. The handlers will also be invoked when any Fatal log entry is
|
|
||||||
// made.
|
|
||||||
//
|
|
||||||
// This method is useful when a caller wishes to use logrus to log a fatal
|
|
||||||
// message but also needs to gracefully shutdown. An example usecase could be
|
|
||||||
// closing database connections, or sending a alert that the application is
|
|
||||||
// closing.
|
|
||||||
func RegisterExitHandler(handler func()) {
|
|
||||||
handlers = append(handlers, handler)
|
|
||||||
}
|
|
26
vendor/github.com/Sirupsen/logrus/doc.go
generated
vendored
26
vendor/github.com/Sirupsen/logrus/doc.go
generated
vendored
|
@ -1,26 +0,0 @@
|
||||||
/*
|
|
||||||
Package logrus is a structured logger for Go, completely API compatible with the standard library logger.
|
|
||||||
|
|
||||||
|
|
||||||
The simplest way to use Logrus is simply the package-level exported logger:
|
|
||||||
|
|
||||||
package main
|
|
||||||
|
|
||||||
import (
|
|
||||||
log "github.com/Sirupsen/logrus"
|
|
||||||
)
|
|
||||||
|
|
||||||
func main() {
|
|
||||||
log.WithFields(log.Fields{
|
|
||||||
"animal": "walrus",
|
|
||||||
"number": 1,
|
|
||||||
"size": 10,
|
|
||||||
}).Info("A walrus appears")
|
|
||||||
}
|
|
||||||
|
|
||||||
Output:
|
|
||||||
time="2015-09-07T08:48:33Z" level=info msg="A walrus appears" animal=walrus number=1 size=10
|
|
||||||
|
|
||||||
For a full guide visit https://github.com/Sirupsen/logrus
|
|
||||||
*/
|
|
||||||
package logrus
|
|
275
vendor/github.com/Sirupsen/logrus/entry.go
generated
vendored
275
vendor/github.com/Sirupsen/logrus/entry.go
generated
vendored
|
@ -1,275 +0,0 @@
|
||||||
package logrus
|
|
||||||
|
|
||||||
import (
|
|
||||||
"bytes"
|
|
||||||
"fmt"
|
|
||||||
"os"
|
|
||||||
"sync"
|
|
||||||
"time"
|
|
||||||
)
|
|
||||||
|
|
||||||
var bufferPool *sync.Pool
|
|
||||||
|
|
||||||
func init() {
|
|
||||||
bufferPool = &sync.Pool{
|
|
||||||
New: func() interface{} {
|
|
||||||
return new(bytes.Buffer)
|
|
||||||
},
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Defines the key when adding errors using WithError.
|
|
||||||
var ErrorKey = "error"
|
|
||||||
|
|
||||||
// An entry is the final or intermediate Logrus logging entry. It contains all
|
|
||||||
// the fields passed with WithField{,s}. It's finally logged when Debug, Info,
|
|
||||||
// Warn, Error, Fatal or Panic is called on it. These objects can be reused and
|
|
||||||
// passed around as much as you wish to avoid field duplication.
|
|
||||||
type Entry struct {
|
|
||||||
Logger *Logger
|
|
||||||
|
|
||||||
// Contains all the fields set by the user.
|
|
||||||
Data Fields
|
|
||||||
|
|
||||||
// Time at which the log entry was created
|
|
||||||
Time time.Time
|
|
||||||
|
|
||||||
// Level the log entry was logged at: Debug, Info, Warn, Error, Fatal or Panic
|
|
||||||
Level Level
|
|
||||||
|
|
||||||
// Message passed to Debug, Info, Warn, Error, Fatal or Panic
|
|
||||||
Message string
|
|
||||||
|
|
||||||
// When formatter is called in entry.log(), an Buffer may be set to entry
|
|
||||||
Buffer *bytes.Buffer
|
|
||||||
}
|
|
||||||
|
|
||||||
func NewEntry(logger *Logger) *Entry {
|
|
||||||
return &Entry{
|
|
||||||
Logger: logger,
|
|
||||||
// Default is three fields, give a little extra room
|
|
||||||
Data: make(Fields, 5),
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Returns the string representation from the reader and ultimately the
|
|
||||||
// formatter.
|
|
||||||
func (entry *Entry) String() (string, error) {
|
|
||||||
serialized, err := entry.Logger.Formatter.Format(entry)
|
|
||||||
if err != nil {
|
|
||||||
return "", err
|
|
||||||
}
|
|
||||||
str := string(serialized)
|
|
||||||
return str, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// Add an error as single field (using the key defined in ErrorKey) to the Entry.
|
|
||||||
func (entry *Entry) WithError(err error) *Entry {
|
|
||||||
return entry.WithField(ErrorKey, err)
|
|
||||||
}
|
|
||||||
|
|
||||||
// Add a single field to the Entry.
|
|
||||||
func (entry *Entry) WithField(key string, value interface{}) *Entry {
|
|
||||||
return entry.WithFields(Fields{key: value})
|
|
||||||
}
|
|
||||||
|
|
||||||
// Add a map of fields to the Entry.
|
|
||||||
func (entry *Entry) WithFields(fields Fields) *Entry {
|
|
||||||
data := make(Fields, len(entry.Data)+len(fields))
|
|
||||||
for k, v := range entry.Data {
|
|
||||||
data[k] = v
|
|
||||||
}
|
|
||||||
for k, v := range fields {
|
|
||||||
data[k] = v
|
|
||||||
}
|
|
||||||
return &Entry{Logger: entry.Logger, Data: data}
|
|
||||||
}
|
|
||||||
|
|
||||||
// This function is not declared with a pointer value because otherwise
|
|
||||||
// race conditions will occur when using multiple goroutines
|
|
||||||
func (entry Entry) log(level Level, msg string) {
|
|
||||||
var buffer *bytes.Buffer
|
|
||||||
entry.Time = time.Now()
|
|
||||||
entry.Level = level
|
|
||||||
entry.Message = msg
|
|
||||||
|
|
||||||
if err := entry.Logger.Hooks.Fire(level, &entry); err != nil {
|
|
||||||
entry.Logger.mu.Lock()
|
|
||||||
fmt.Fprintf(os.Stderr, "Failed to fire hook: %v\n", err)
|
|
||||||
entry.Logger.mu.Unlock()
|
|
||||||
}
|
|
||||||
buffer = bufferPool.Get().(*bytes.Buffer)
|
|
||||||
buffer.Reset()
|
|
||||||
defer bufferPool.Put(buffer)
|
|
||||||
entry.Buffer = buffer
|
|
||||||
serialized, err := entry.Logger.Formatter.Format(&entry)
|
|
||||||
entry.Buffer = nil
|
|
||||||
if err != nil {
|
|
||||||
entry.Logger.mu.Lock()
|
|
||||||
fmt.Fprintf(os.Stderr, "Failed to obtain reader, %v\n", err)
|
|
||||||
entry.Logger.mu.Unlock()
|
|
||||||
} else {
|
|
||||||
entry.Logger.mu.Lock()
|
|
||||||
_, err = entry.Logger.Out.Write(serialized)
|
|
||||||
if err != nil {
|
|
||||||
fmt.Fprintf(os.Stderr, "Failed to write to log, %v\n", err)
|
|
||||||
}
|
|
||||||
entry.Logger.mu.Unlock()
|
|
||||||
}
|
|
||||||
|
|
||||||
// To avoid Entry#log() returning a value that only would make sense for
|
|
||||||
// panic() to use in Entry#Panic(), we avoid the allocation by checking
|
|
||||||
// directly here.
|
|
||||||
if level <= PanicLevel {
|
|
||||||
panic(&entry)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func (entry *Entry) Debug(args ...interface{}) {
|
|
||||||
if entry.Logger.Level >= DebugLevel {
|
|
||||||
entry.log(DebugLevel, fmt.Sprint(args...))
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func (entry *Entry) Print(args ...interface{}) {
|
|
||||||
entry.Info(args...)
|
|
||||||
}
|
|
||||||
|
|
||||||
func (entry *Entry) Info(args ...interface{}) {
|
|
||||||
if entry.Logger.Level >= InfoLevel {
|
|
||||||
entry.log(InfoLevel, fmt.Sprint(args...))
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func (entry *Entry) Warn(args ...interface{}) {
|
|
||||||
if entry.Logger.Level >= WarnLevel {
|
|
||||||
entry.log(WarnLevel, fmt.Sprint(args...))
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func (entry *Entry) Warning(args ...interface{}) {
|
|
||||||
entry.Warn(args...)
|
|
||||||
}
|
|
||||||
|
|
||||||
func (entry *Entry) Error(args ...interface{}) {
|
|
||||||
if entry.Logger.Level >= ErrorLevel {
|
|
||||||
entry.log(ErrorLevel, fmt.Sprint(args...))
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func (entry *Entry) Fatal(args ...interface{}) {
|
|
||||||
if entry.Logger.Level >= FatalLevel {
|
|
||||||
entry.log(FatalLevel, fmt.Sprint(args...))
|
|
||||||
}
|
|
||||||
Exit(1)
|
|
||||||
}
|
|
||||||
|
|
||||||
func (entry *Entry) Panic(args ...interface{}) {
|
|
||||||
if entry.Logger.Level >= PanicLevel {
|
|
||||||
entry.log(PanicLevel, fmt.Sprint(args...))
|
|
||||||
}
|
|
||||||
panic(fmt.Sprint(args...))
|
|
||||||
}
|
|
||||||
|
|
||||||
// Entry Printf family functions
|
|
||||||
|
|
||||||
func (entry *Entry) Debugf(format string, args ...interface{}) {
|
|
||||||
if entry.Logger.Level >= DebugLevel {
|
|
||||||
entry.Debug(fmt.Sprintf(format, args...))
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func (entry *Entry) Infof(format string, args ...interface{}) {
|
|
||||||
if entry.Logger.Level >= InfoLevel {
|
|
||||||
entry.Info(fmt.Sprintf(format, args...))
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func (entry *Entry) Printf(format string, args ...interface{}) {
|
|
||||||
entry.Infof(format, args...)
|
|
||||||
}
|
|
||||||
|
|
||||||
func (entry *Entry) Warnf(format string, args ...interface{}) {
|
|
||||||
if entry.Logger.Level >= WarnLevel {
|
|
||||||
entry.Warn(fmt.Sprintf(format, args...))
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func (entry *Entry) Warningf(format string, args ...interface{}) {
|
|
||||||
entry.Warnf(format, args...)
|
|
||||||
}
|
|
||||||
|
|
||||||
func (entry *Entry) Errorf(format string, args ...interface{}) {
|
|
||||||
if entry.Logger.Level >= ErrorLevel {
|
|
||||||
entry.Error(fmt.Sprintf(format, args...))
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func (entry *Entry) Fatalf(format string, args ...interface{}) {
|
|
||||||
if entry.Logger.Level >= FatalLevel {
|
|
||||||
entry.Fatal(fmt.Sprintf(format, args...))
|
|
||||||
}
|
|
||||||
Exit(1)
|
|
||||||
}
|
|
||||||
|
|
||||||
func (entry *Entry) Panicf(format string, args ...interface{}) {
|
|
||||||
if entry.Logger.Level >= PanicLevel {
|
|
||||||
entry.Panic(fmt.Sprintf(format, args...))
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Entry Println family functions
|
|
||||||
|
|
||||||
func (entry *Entry) Debugln(args ...interface{}) {
|
|
||||||
if entry.Logger.Level >= DebugLevel {
|
|
||||||
entry.Debug(entry.sprintlnn(args...))
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func (entry *Entry) Infoln(args ...interface{}) {
|
|
||||||
if entry.Logger.Level >= InfoLevel {
|
|
||||||
entry.Info(entry.sprintlnn(args...))
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func (entry *Entry) Println(args ...interface{}) {
|
|
||||||
entry.Infoln(args...)
|
|
||||||
}
|
|
||||||
|
|
||||||
func (entry *Entry) Warnln(args ...interface{}) {
|
|
||||||
if entry.Logger.Level >= WarnLevel {
|
|
||||||
entry.Warn(entry.sprintlnn(args...))
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func (entry *Entry) Warningln(args ...interface{}) {
|
|
||||||
entry.Warnln(args...)
|
|
||||||
}
|
|
||||||
|
|
||||||
func (entry *Entry) Errorln(args ...interface{}) {
|
|
||||||
if entry.Logger.Level >= ErrorLevel {
|
|
||||||
entry.Error(entry.sprintlnn(args...))
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func (entry *Entry) Fatalln(args ...interface{}) {
|
|
||||||
if entry.Logger.Level >= FatalLevel {
|
|
||||||
entry.Fatal(entry.sprintlnn(args...))
|
|
||||||
}
|
|
||||||
Exit(1)
|
|
||||||
}
|
|
||||||
|
|
||||||
func (entry *Entry) Panicln(args ...interface{}) {
|
|
||||||
if entry.Logger.Level >= PanicLevel {
|
|
||||||
entry.Panic(entry.sprintlnn(args...))
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Sprintlnn => Sprint no newline. This is to get the behavior of how
|
|
||||||
// fmt.Sprintln where spaces are always added between operands, regardless of
|
|
||||||
// their type. Instead of vendoring the Sprintln implementation to spare a
|
|
||||||
// string allocation, we do the simplest thing.
|
|
||||||
func (entry *Entry) sprintlnn(args ...interface{}) string {
|
|
||||||
msg := fmt.Sprintln(args...)
|
|
||||||
return msg[:len(msg)-1]
|
|
||||||
}
|
|
193
vendor/github.com/Sirupsen/logrus/exported.go
generated
vendored
193
vendor/github.com/Sirupsen/logrus/exported.go
generated
vendored
|
@ -1,193 +0,0 @@
|
||||||
package logrus
|
|
||||||
|
|
||||||
import (
|
|
||||||
"io"
|
|
||||||
)
|
|
||||||
|
|
||||||
var (
|
|
||||||
// std is the name of the standard logger in stdlib `log`
|
|
||||||
std = New()
|
|
||||||
)
|
|
||||||
|
|
||||||
func StandardLogger() *Logger {
|
|
||||||
return std
|
|
||||||
}
|
|
||||||
|
|
||||||
// SetOutput sets the standard logger output.
|
|
||||||
func SetOutput(out io.Writer) {
|
|
||||||
std.mu.Lock()
|
|
||||||
defer std.mu.Unlock()
|
|
||||||
std.Out = out
|
|
||||||
}
|
|
||||||
|
|
||||||
// SetFormatter sets the standard logger formatter.
|
|
||||||
func SetFormatter(formatter Formatter) {
|
|
||||||
std.mu.Lock()
|
|
||||||
defer std.mu.Unlock()
|
|
||||||
std.Formatter = formatter
|
|
||||||
}
|
|
||||||
|
|
||||||
// SetLevel sets the standard logger level.
|
|
||||||
func SetLevel(level Level) {
|
|
||||||
std.mu.Lock()
|
|
||||||
defer std.mu.Unlock()
|
|
||||||
std.Level = level
|
|
||||||
}
|
|
||||||
|
|
||||||
// GetLevel returns the standard logger level.
|
|
||||||
func GetLevel() Level {
|
|
||||||
std.mu.Lock()
|
|
||||||
defer std.mu.Unlock()
|
|
||||||
return std.Level
|
|
||||||
}
|
|
||||||
|
|
||||||
// AddHook adds a hook to the standard logger hooks.
|
|
||||||
func AddHook(hook Hook) {
|
|
||||||
std.mu.Lock()
|
|
||||||
defer std.mu.Unlock()
|
|
||||||
std.Hooks.Add(hook)
|
|
||||||
}
|
|
||||||
|
|
||||||
// WithError creates an entry from the standard logger and adds an error to it, using the value defined in ErrorKey as key.
|
|
||||||
func WithError(err error) *Entry {
|
|
||||||
return std.WithField(ErrorKey, err)
|
|
||||||
}
|
|
||||||
|
|
||||||
// WithField creates an entry from the standard logger and adds a field to
|
|
||||||
// it. If you want multiple fields, use `WithFields`.
|
|
||||||
//
|
|
||||||
// Note that it doesn't log until you call Debug, Print, Info, Warn, Fatal
|
|
||||||
// or Panic on the Entry it returns.
|
|
||||||
func WithField(key string, value interface{}) *Entry {
|
|
||||||
return std.WithField(key, value)
|
|
||||||
}
|
|
||||||
|
|
||||||
// WithFields creates an entry from the standard logger and adds multiple
|
|
||||||
// fields to it. This is simply a helper for `WithField`, invoking it
|
|
||||||
// once for each field.
|
|
||||||
//
|
|
||||||
// Note that it doesn't log until you call Debug, Print, Info, Warn, Fatal
|
|
||||||
// or Panic on the Entry it returns.
|
|
||||||
func WithFields(fields Fields) *Entry {
|
|
||||||
return std.WithFields(fields)
|
|
||||||
}
|
|
||||||
|
|
||||||
// Debug logs a message at level Debug on the standard logger.
|
|
||||||
func Debug(args ...interface{}) {
|
|
||||||
std.Debug(args...)
|
|
||||||
}
|
|
||||||
|
|
||||||
// Print logs a message at level Info on the standard logger.
|
|
||||||
func Print(args ...interface{}) {
|
|
||||||
std.Print(args...)
|
|
||||||
}
|
|
||||||
|
|
||||||
// Info logs a message at level Info on the standard logger.
|
|
||||||
func Info(args ...interface{}) {
|
|
||||||
std.Info(args...)
|
|
||||||
}
|
|
||||||
|
|
||||||
// Warn logs a message at level Warn on the standard logger.
|
|
||||||
func Warn(args ...interface{}) {
|
|
||||||
std.Warn(args...)
|
|
||||||
}
|
|
||||||
|
|
||||||
// Warning logs a message at level Warn on the standard logger.
|
|
||||||
func Warning(args ...interface{}) {
|
|
||||||
std.Warning(args...)
|
|
||||||
}
|
|
||||||
|
|
||||||
// Error logs a message at level Error on the standard logger.
|
|
||||||
func Error(args ...interface{}) {
|
|
||||||
std.Error(args...)
|
|
||||||
}
|
|
||||||
|
|
||||||
// Panic logs a message at level Panic on the standard logger.
|
|
||||||
func Panic(args ...interface{}) {
|
|
||||||
std.Panic(args...)
|
|
||||||
}
|
|
||||||
|
|
||||||
// Fatal logs a message at level Fatal on the standard logger.
|
|
||||||
func Fatal(args ...interface{}) {
|
|
||||||
std.Fatal(args...)
|
|
||||||
}
|
|
||||||
|
|
||||||
// Debugf logs a message at level Debug on the standard logger.
|
|
||||||
func Debugf(format string, args ...interface{}) {
|
|
||||||
std.Debugf(format, args...)
|
|
||||||
}
|
|
||||||
|
|
||||||
// Printf logs a message at level Info on the standard logger.
|
|
||||||
func Printf(format string, args ...interface{}) {
|
|
||||||
std.Printf(format, args...)
|
|
||||||
}
|
|
||||||
|
|
||||||
// Infof logs a message at level Info on the standard logger.
|
|
||||||
func Infof(format string, args ...interface{}) {
|
|
||||||
std.Infof(format, args...)
|
|
||||||
}
|
|
||||||
|
|
||||||
// Warnf logs a message at level Warn on the standard logger.
|
|
||||||
func Warnf(format string, args ...interface{}) {
|
|
||||||
std.Warnf(format, args...)
|
|
||||||
}
|
|
||||||
|
|
||||||
// Warningf logs a message at level Warn on the standard logger.
|
|
||||||
func Warningf(format string, args ...interface{}) {
|
|
||||||
std.Warningf(format, args...)
|
|
||||||
}
|
|
||||||
|
|
||||||
// Errorf logs a message at level Error on the standard logger.
|
|
||||||
func Errorf(format string, args ...interface{}) {
|
|
||||||
std.Errorf(format, args...)
|
|
||||||
}
|
|
||||||
|
|
||||||
// Panicf logs a message at level Panic on the standard logger.
|
|
||||||
func Panicf(format string, args ...interface{}) {
|
|
||||||
std.Panicf(format, args...)
|
|
||||||
}
|
|
||||||
|
|
||||||
// Fatalf logs a message at level Fatal on the standard logger.
|
|
||||||
func Fatalf(format string, args ...interface{}) {
|
|
||||||
std.Fatalf(format, args...)
|
|
||||||
}
|
|
||||||
|
|
||||||
// Debugln logs a message at level Debug on the standard logger.
|
|
||||||
func Debugln(args ...interface{}) {
|
|
||||||
std.Debugln(args...)
|
|
||||||
}
|
|
||||||
|
|
||||||
// Println logs a message at level Info on the standard logger.
|
|
||||||
func Println(args ...interface{}) {
|
|
||||||
std.Println(args...)
|
|
||||||
}
|
|
||||||
|
|
||||||
// Infoln logs a message at level Info on the standard logger.
|
|
||||||
func Infoln(args ...interface{}) {
|
|
||||||
std.Infoln(args...)
|
|
||||||
}
|
|
||||||
|
|
||||||
// Warnln logs a message at level Warn on the standard logger.
|
|
||||||
func Warnln(args ...interface{}) {
|
|
||||||
std.Warnln(args...)
|
|
||||||
}
|
|
||||||
|
|
||||||
// Warningln logs a message at level Warn on the standard logger.
|
|
||||||
func Warningln(args ...interface{}) {
|
|
||||||
std.Warningln(args...)
|
|
||||||
}
|
|
||||||
|
|
||||||
// Errorln logs a message at level Error on the standard logger.
|
|
||||||
func Errorln(args ...interface{}) {
|
|
||||||
std.Errorln(args...)
|
|
||||||
}
|
|
||||||
|
|
||||||
// Panicln logs a message at level Panic on the standard logger.
|
|
||||||
func Panicln(args ...interface{}) {
|
|
||||||
std.Panicln(args...)
|
|
||||||
}
|
|
||||||
|
|
||||||
// Fatalln logs a message at level Fatal on the standard logger.
|
|
||||||
func Fatalln(args ...interface{}) {
|
|
||||||
std.Fatalln(args...)
|
|
||||||
}
|
|
45
vendor/github.com/Sirupsen/logrus/formatter.go
generated
vendored
45
vendor/github.com/Sirupsen/logrus/formatter.go
generated
vendored
|
@ -1,45 +0,0 @@
|
||||||
package logrus
|
|
||||||
|
|
||||||
import "time"
|
|
||||||
|
|
||||||
const DefaultTimestampFormat = time.RFC3339
|
|
||||||
|
|
||||||
// The Formatter interface is used to implement a custom Formatter. It takes an
|
|
||||||
// `Entry`. It exposes all the fields, including the default ones:
|
|
||||||
//
|
|
||||||
// * `entry.Data["msg"]`. The message passed from Info, Warn, Error ..
|
|
||||||
// * `entry.Data["time"]`. The timestamp.
|
|
||||||
// * `entry.Data["level"]. The level the entry was logged at.
|
|
||||||
//
|
|
||||||
// Any additional fields added with `WithField` or `WithFields` are also in
|
|
||||||
// `entry.Data`. Format is expected to return an array of bytes which are then
|
|
||||||
// logged to `logger.Out`.
|
|
||||||
type Formatter interface {
|
|
||||||
Format(*Entry) ([]byte, error)
|
|
||||||
}
|
|
||||||
|
|
||||||
// This is to not silently overwrite `time`, `msg` and `level` fields when
|
|
||||||
// dumping it. If this code wasn't there doing:
|
|
||||||
//
|
|
||||||
// logrus.WithField("level", 1).Info("hello")
|
|
||||||
//
|
|
||||||
// Would just silently drop the user provided level. Instead with this code
|
|
||||||
// it'll logged as:
|
|
||||||
//
|
|
||||||
// {"level": "info", "fields.level": 1, "msg": "hello", "time": "..."}
|
|
||||||
//
|
|
||||||
// It's not exported because it's still using Data in an opinionated way. It's to
|
|
||||||
// avoid code duplication between the two default formatters.
|
|
||||||
func prefixFieldClashes(data Fields) {
|
|
||||||
if t, ok := data["time"]; ok {
|
|
||||||
data["fields.time"] = t
|
|
||||||
}
|
|
||||||
|
|
||||||
if m, ok := data["msg"]; ok {
|
|
||||||
data["fields.msg"] = m
|
|
||||||
}
|
|
||||||
|
|
||||||
if l, ok := data["level"]; ok {
|
|
||||||
data["fields.level"] = l
|
|
||||||
}
|
|
||||||
}
|
|
34
vendor/github.com/Sirupsen/logrus/hooks.go
generated
vendored
34
vendor/github.com/Sirupsen/logrus/hooks.go
generated
vendored
|
@ -1,34 +0,0 @@
|
||||||
package logrus
|
|
||||||
|
|
||||||
// A hook to be fired when logging on the logging levels returned from
|
|
||||||
// `Levels()` on your implementation of the interface. Note that this is not
|
|
||||||
// fired in a goroutine or a channel with workers, you should handle such
|
|
||||||
// functionality yourself if your call is non-blocking and you don't wish for
|
|
||||||
// the logging calls for levels returned from `Levels()` to block.
|
|
||||||
type Hook interface {
|
|
||||||
Levels() []Level
|
|
||||||
Fire(*Entry) error
|
|
||||||
}
|
|
||||||
|
|
||||||
// Internal type for storing the hooks on a logger instance.
|
|
||||||
type LevelHooks map[Level][]Hook
|
|
||||||
|
|
||||||
// Add a hook to an instance of logger. This is called with
|
|
||||||
// `log.Hooks.Add(new(MyHook))` where `MyHook` implements the `Hook` interface.
|
|
||||||
func (hooks LevelHooks) Add(hook Hook) {
|
|
||||||
for _, level := range hook.Levels() {
|
|
||||||
hooks[level] = append(hooks[level], hook)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Fire all the hooks for the passed level. Used by `entry.log` to fire
|
|
||||||
// appropriate hooks for a log entry.
|
|
||||||
func (hooks LevelHooks) Fire(level Level, entry *Entry) error {
|
|
||||||
for _, hook := range hooks[level] {
|
|
||||||
if err := hook.Fire(entry); err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return nil
|
|
||||||
}
|
|
74
vendor/github.com/Sirupsen/logrus/json_formatter.go
generated
vendored
74
vendor/github.com/Sirupsen/logrus/json_formatter.go
generated
vendored
|
@ -1,74 +0,0 @@
|
||||||
package logrus
|
|
||||||
|
|
||||||
import (
|
|
||||||
"encoding/json"
|
|
||||||
"fmt"
|
|
||||||
)
|
|
||||||
|
|
||||||
type fieldKey string
|
|
||||||
type FieldMap map[fieldKey]string
|
|
||||||
|
|
||||||
const (
|
|
||||||
FieldKeyMsg = "msg"
|
|
||||||
FieldKeyLevel = "level"
|
|
||||||
FieldKeyTime = "time"
|
|
||||||
)
|
|
||||||
|
|
||||||
func (f FieldMap) resolve(key fieldKey) string {
|
|
||||||
if k, ok := f[key]; ok {
|
|
||||||
return k
|
|
||||||
}
|
|
||||||
|
|
||||||
return string(key)
|
|
||||||
}
|
|
||||||
|
|
||||||
type JSONFormatter struct {
|
|
||||||
// TimestampFormat sets the format used for marshaling timestamps.
|
|
||||||
TimestampFormat string
|
|
||||||
|
|
||||||
// DisableTimestamp allows disabling automatic timestamps in output
|
|
||||||
DisableTimestamp bool
|
|
||||||
|
|
||||||
// FieldMap allows users to customize the names of keys for various fields.
|
|
||||||
// As an example:
|
|
||||||
// formatter := &JSONFormatter{
|
|
||||||
// FieldMap: FieldMap{
|
|
||||||
// FieldKeyTime: "@timestamp",
|
|
||||||
// FieldKeyLevel: "@level",
|
|
||||||
// FieldKeyLevel: "@message",
|
|
||||||
// },
|
|
||||||
// }
|
|
||||||
FieldMap FieldMap
|
|
||||||
}
|
|
||||||
|
|
||||||
func (f *JSONFormatter) Format(entry *Entry) ([]byte, error) {
|
|
||||||
data := make(Fields, len(entry.Data)+3)
|
|
||||||
for k, v := range entry.Data {
|
|
||||||
switch v := v.(type) {
|
|
||||||
case error:
|
|
||||||
// Otherwise errors are ignored by `encoding/json`
|
|
||||||
// https://github.com/Sirupsen/logrus/issues/137
|
|
||||||
data[k] = v.Error()
|
|
||||||
default:
|
|
||||||
data[k] = v
|
|
||||||
}
|
|
||||||
}
|
|
||||||
prefixFieldClashes(data)
|
|
||||||
|
|
||||||
timestampFormat := f.TimestampFormat
|
|
||||||
if timestampFormat == "" {
|
|
||||||
timestampFormat = DefaultTimestampFormat
|
|
||||||
}
|
|
||||||
|
|
||||||
if !f.DisableTimestamp {
|
|
||||||
data[f.FieldMap.resolve(FieldKeyTime)] = entry.Time.Format(timestampFormat)
|
|
||||||
}
|
|
||||||
data[f.FieldMap.resolve(FieldKeyMsg)] = entry.Message
|
|
||||||
data[f.FieldMap.resolve(FieldKeyLevel)] = entry.Level.String()
|
|
||||||
|
|
||||||
serialized, err := json.Marshal(data)
|
|
||||||
if err != nil {
|
|
||||||
return nil, fmt.Errorf("Failed to marshal fields to JSON, %v", err)
|
|
||||||
}
|
|
||||||
return append(serialized, '\n'), nil
|
|
||||||
}
|
|
308
vendor/github.com/Sirupsen/logrus/logger.go
generated
vendored
308
vendor/github.com/Sirupsen/logrus/logger.go
generated
vendored
|
@ -1,308 +0,0 @@
|
||||||
package logrus
|
|
||||||
|
|
||||||
import (
|
|
||||||
"io"
|
|
||||||
"os"
|
|
||||||
"sync"
|
|
||||||
)
|
|
||||||
|
|
||||||
type Logger struct {
|
|
||||||
// The logs are `io.Copy`'d to this in a mutex. It's common to set this to a
|
|
||||||
// file, or leave it default which is `os.Stderr`. You can also set this to
|
|
||||||
// something more adventorous, such as logging to Kafka.
|
|
||||||
Out io.Writer
|
|
||||||
// Hooks for the logger instance. These allow firing events based on logging
|
|
||||||
// levels and log entries. For example, to send errors to an error tracking
|
|
||||||
// service, log to StatsD or dump the core on fatal errors.
|
|
||||||
Hooks LevelHooks
|
|
||||||
// All log entries pass through the formatter before logged to Out. The
|
|
||||||
// included formatters are `TextFormatter` and `JSONFormatter` for which
|
|
||||||
// TextFormatter is the default. In development (when a TTY is attached) it
|
|
||||||
// logs with colors, but to a file it wouldn't. You can easily implement your
|
|
||||||
// own that implements the `Formatter` interface, see the `README` or included
|
|
||||||
// formatters for examples.
|
|
||||||
Formatter Formatter
|
|
||||||
// The logging level the logger should log at. This is typically (and defaults
|
|
||||||
// to) `logrus.Info`, which allows Info(), Warn(), Error() and Fatal() to be
|
|
||||||
// logged. `logrus.Debug` is useful in
|
|
||||||
Level Level
|
|
||||||
// Used to sync writing to the log. Locking is enabled by Default
|
|
||||||
mu MutexWrap
|
|
||||||
// Reusable empty entry
|
|
||||||
entryPool sync.Pool
|
|
||||||
}
|
|
||||||
|
|
||||||
type MutexWrap struct {
|
|
||||||
lock sync.Mutex
|
|
||||||
disabled bool
|
|
||||||
}
|
|
||||||
|
|
||||||
func (mw *MutexWrap) Lock() {
|
|
||||||
if !mw.disabled {
|
|
||||||
mw.lock.Lock()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func (mw *MutexWrap) Unlock() {
|
|
||||||
if !mw.disabled {
|
|
||||||
mw.lock.Unlock()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func (mw *MutexWrap) Disable() {
|
|
||||||
mw.disabled = true
|
|
||||||
}
|
|
||||||
|
|
||||||
// Creates a new logger. Configuration should be set by changing `Formatter`,
|
|
||||||
// `Out` and `Hooks` directly on the default logger instance. You can also just
|
|
||||||
// instantiate your own:
|
|
||||||
//
|
|
||||||
// var log = &Logger{
|
|
||||||
// Out: os.Stderr,
|
|
||||||
// Formatter: new(JSONFormatter),
|
|
||||||
// Hooks: make(LevelHooks),
|
|
||||||
// Level: logrus.DebugLevel,
|
|
||||||
// }
|
|
||||||
//
|
|
||||||
// It's recommended to make this a global instance called `log`.
|
|
||||||
func New() *Logger {
|
|
||||||
return &Logger{
|
|
||||||
Out: os.Stderr,
|
|
||||||
Formatter: new(TextFormatter),
|
|
||||||
Hooks: make(LevelHooks),
|
|
||||||
Level: InfoLevel,
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func (logger *Logger) newEntry() *Entry {
|
|
||||||
entry, ok := logger.entryPool.Get().(*Entry)
|
|
||||||
if ok {
|
|
||||||
return entry
|
|
||||||
}
|
|
||||||
return NewEntry(logger)
|
|
||||||
}
|
|
||||||
|
|
||||||
func (logger *Logger) releaseEntry(entry *Entry) {
|
|
||||||
logger.entryPool.Put(entry)
|
|
||||||
}
|
|
||||||
|
|
||||||
// Adds a field to the log entry, note that it doesn't log until you call
|
|
||||||
// Debug, Print, Info, Warn, Fatal or Panic. It only creates a log entry.
|
|
||||||
// If you want multiple fields, use `WithFields`.
|
|
||||||
func (logger *Logger) WithField(key string, value interface{}) *Entry {
|
|
||||||
entry := logger.newEntry()
|
|
||||||
defer logger.releaseEntry(entry)
|
|
||||||
return entry.WithField(key, value)
|
|
||||||
}
|
|
||||||
|
|
||||||
// Adds a struct of fields to the log entry. All it does is call `WithField` for
|
|
||||||
// each `Field`.
|
|
||||||
func (logger *Logger) WithFields(fields Fields) *Entry {
|
|
||||||
entry := logger.newEntry()
|
|
||||||
defer logger.releaseEntry(entry)
|
|
||||||
return entry.WithFields(fields)
|
|
||||||
}
|
|
||||||
|
|
||||||
// Add an error as single field to the log entry. All it does is call
|
|
||||||
// `WithError` for the given `error`.
|
|
||||||
func (logger *Logger) WithError(err error) *Entry {
|
|
||||||
entry := logger.newEntry()
|
|
||||||
defer logger.releaseEntry(entry)
|
|
||||||
return entry.WithError(err)
|
|
||||||
}
|
|
||||||
|
|
||||||
func (logger *Logger) Debugf(format string, args ...interface{}) {
|
|
||||||
if logger.Level >= DebugLevel {
|
|
||||||
entry := logger.newEntry()
|
|
||||||
entry.Debugf(format, args...)
|
|
||||||
logger.releaseEntry(entry)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func (logger *Logger) Infof(format string, args ...interface{}) {
|
|
||||||
if logger.Level >= InfoLevel {
|
|
||||||
entry := logger.newEntry()
|
|
||||||
entry.Infof(format, args...)
|
|
||||||
logger.releaseEntry(entry)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func (logger *Logger) Printf(format string, args ...interface{}) {
|
|
||||||
entry := logger.newEntry()
|
|
||||||
entry.Printf(format, args...)
|
|
||||||
logger.releaseEntry(entry)
|
|
||||||
}
|
|
||||||
|
|
||||||
func (logger *Logger) Warnf(format string, args ...interface{}) {
|
|
||||||
if logger.Level >= WarnLevel {
|
|
||||||
entry := logger.newEntry()
|
|
||||||
entry.Warnf(format, args...)
|
|
||||||
logger.releaseEntry(entry)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func (logger *Logger) Warningf(format string, args ...interface{}) {
|
|
||||||
if logger.Level >= WarnLevel {
|
|
||||||
entry := logger.newEntry()
|
|
||||||
entry.Warnf(format, args...)
|
|
||||||
logger.releaseEntry(entry)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func (logger *Logger) Errorf(format string, args ...interface{}) {
|
|
||||||
if logger.Level >= ErrorLevel {
|
|
||||||
entry := logger.newEntry()
|
|
||||||
entry.Errorf(format, args...)
|
|
||||||
logger.releaseEntry(entry)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func (logger *Logger) Fatalf(format string, args ...interface{}) {
|
|
||||||
if logger.Level >= FatalLevel {
|
|
||||||
entry := logger.newEntry()
|
|
||||||
entry.Fatalf(format, args...)
|
|
||||||
logger.releaseEntry(entry)
|
|
||||||
}
|
|
||||||
Exit(1)
|
|
||||||
}
|
|
||||||
|
|
||||||
func (logger *Logger) Panicf(format string, args ...interface{}) {
|
|
||||||
if logger.Level >= PanicLevel {
|
|
||||||
entry := logger.newEntry()
|
|
||||||
entry.Panicf(format, args...)
|
|
||||||
logger.releaseEntry(entry)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func (logger *Logger) Debug(args ...interface{}) {
|
|
||||||
if logger.Level >= DebugLevel {
|
|
||||||
entry := logger.newEntry()
|
|
||||||
entry.Debug(args...)
|
|
||||||
logger.releaseEntry(entry)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func (logger *Logger) Info(args ...interface{}) {
|
|
||||||
if logger.Level >= InfoLevel {
|
|
||||||
entry := logger.newEntry()
|
|
||||||
entry.Info(args...)
|
|
||||||
logger.releaseEntry(entry)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func (logger *Logger) Print(args ...interface{}) {
|
|
||||||
entry := logger.newEntry()
|
|
||||||
entry.Info(args...)
|
|
||||||
logger.releaseEntry(entry)
|
|
||||||
}
|
|
||||||
|
|
||||||
func (logger *Logger) Warn(args ...interface{}) {
|
|
||||||
if logger.Level >= WarnLevel {
|
|
||||||
entry := logger.newEntry()
|
|
||||||
entry.Warn(args...)
|
|
||||||
logger.releaseEntry(entry)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func (logger *Logger) Warning(args ...interface{}) {
|
|
||||||
if logger.Level >= WarnLevel {
|
|
||||||
entry := logger.newEntry()
|
|
||||||
entry.Warn(args...)
|
|
||||||
logger.releaseEntry(entry)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func (logger *Logger) Error(args ...interface{}) {
|
|
||||||
if logger.Level >= ErrorLevel {
|
|
||||||
entry := logger.newEntry()
|
|
||||||
entry.Error(args...)
|
|
||||||
logger.releaseEntry(entry)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func (logger *Logger) Fatal(args ...interface{}) {
|
|
||||||
if logger.Level >= FatalLevel {
|
|
||||||
entry := logger.newEntry()
|
|
||||||
entry.Fatal(args...)
|
|
||||||
logger.releaseEntry(entry)
|
|
||||||
}
|
|
||||||
Exit(1)
|
|
||||||
}
|
|
||||||
|
|
||||||
func (logger *Logger) Panic(args ...interface{}) {
|
|
||||||
if logger.Level >= PanicLevel {
|
|
||||||
entry := logger.newEntry()
|
|
||||||
entry.Panic(args...)
|
|
||||||
logger.releaseEntry(entry)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func (logger *Logger) Debugln(args ...interface{}) {
|
|
||||||
if logger.Level >= DebugLevel {
|
|
||||||
entry := logger.newEntry()
|
|
||||||
entry.Debugln(args...)
|
|
||||||
logger.releaseEntry(entry)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func (logger *Logger) Infoln(args ...interface{}) {
|
|
||||||
if logger.Level >= InfoLevel {
|
|
||||||
entry := logger.newEntry()
|
|
||||||
entry.Infoln(args...)
|
|
||||||
logger.releaseEntry(entry)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func (logger *Logger) Println(args ...interface{}) {
|
|
||||||
entry := logger.newEntry()
|
|
||||||
entry.Println(args...)
|
|
||||||
logger.releaseEntry(entry)
|
|
||||||
}
|
|
||||||
|
|
||||||
func (logger *Logger) Warnln(args ...interface{}) {
|
|
||||||
if logger.Level >= WarnLevel {
|
|
||||||
entry := logger.newEntry()
|
|
||||||
entry.Warnln(args...)
|
|
||||||
logger.releaseEntry(entry)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func (logger *Logger) Warningln(args ...interface{}) {
|
|
||||||
if logger.Level >= WarnLevel {
|
|
||||||
entry := logger.newEntry()
|
|
||||||
entry.Warnln(args...)
|
|
||||||
logger.releaseEntry(entry)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func (logger *Logger) Errorln(args ...interface{}) {
|
|
||||||
if logger.Level >= ErrorLevel {
|
|
||||||
entry := logger.newEntry()
|
|
||||||
entry.Errorln(args...)
|
|
||||||
logger.releaseEntry(entry)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func (logger *Logger) Fatalln(args ...interface{}) {
|
|
||||||
if logger.Level >= FatalLevel {
|
|
||||||
entry := logger.newEntry()
|
|
||||||
entry.Fatalln(args...)
|
|
||||||
logger.releaseEntry(entry)
|
|
||||||
}
|
|
||||||
Exit(1)
|
|
||||||
}
|
|
||||||
|
|
||||||
func (logger *Logger) Panicln(args ...interface{}) {
|
|
||||||
if logger.Level >= PanicLevel {
|
|
||||||
entry := logger.newEntry()
|
|
||||||
entry.Panicln(args...)
|
|
||||||
logger.releaseEntry(entry)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
//When file is opened with appending mode, it's safe to
|
|
||||||
//write concurrently to a file (within 4k message on Linux).
|
|
||||||
//In these cases user can choose to disable the lock.
|
|
||||||
func (logger *Logger) SetNoLock() {
|
|
||||||
logger.mu.Disable()
|
|
||||||
}
|
|
143
vendor/github.com/Sirupsen/logrus/logrus.go
generated
vendored
143
vendor/github.com/Sirupsen/logrus/logrus.go
generated
vendored
|
@ -1,143 +0,0 @@
|
||||||
package logrus
|
|
||||||
|
|
||||||
import (
|
|
||||||
"fmt"
|
|
||||||
"log"
|
|
||||||
"strings"
|
|
||||||
)
|
|
||||||
|
|
||||||
// Fields type, used to pass to `WithFields`.
|
|
||||||
type Fields map[string]interface{}
|
|
||||||
|
|
||||||
// Level type
|
|
||||||
type Level uint8
|
|
||||||
|
|
||||||
// Convert the Level to a string. E.g. PanicLevel becomes "panic".
|
|
||||||
func (level Level) String() string {
|
|
||||||
switch level {
|
|
||||||
case DebugLevel:
|
|
||||||
return "debug"
|
|
||||||
case InfoLevel:
|
|
||||||
return "info"
|
|
||||||
case WarnLevel:
|
|
||||||
return "warning"
|
|
||||||
case ErrorLevel:
|
|
||||||
return "error"
|
|
||||||
case FatalLevel:
|
|
||||||
return "fatal"
|
|
||||||
case PanicLevel:
|
|
||||||
return "panic"
|
|
||||||
}
|
|
||||||
|
|
||||||
return "unknown"
|
|
||||||
}
|
|
||||||
|
|
||||||
// ParseLevel takes a string level and returns the Logrus log level constant.
|
|
||||||
func ParseLevel(lvl string) (Level, error) {
|
|
||||||
switch strings.ToLower(lvl) {
|
|
||||||
case "panic":
|
|
||||||
return PanicLevel, nil
|
|
||||||
case "fatal":
|
|
||||||
return FatalLevel, nil
|
|
||||||
case "error":
|
|
||||||
return ErrorLevel, nil
|
|
||||||
case "warn", "warning":
|
|
||||||
return WarnLevel, nil
|
|
||||||
case "info":
|
|
||||||
return InfoLevel, nil
|
|
||||||
case "debug":
|
|
||||||
return DebugLevel, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
var l Level
|
|
||||||
return l, fmt.Errorf("not a valid logrus Level: %q", lvl)
|
|
||||||
}
|
|
||||||
|
|
||||||
// A constant exposing all logging levels
|
|
||||||
var AllLevels = []Level{
|
|
||||||
PanicLevel,
|
|
||||||
FatalLevel,
|
|
||||||
ErrorLevel,
|
|
||||||
WarnLevel,
|
|
||||||
InfoLevel,
|
|
||||||
DebugLevel,
|
|
||||||
}
|
|
||||||
|
|
||||||
// These are the different logging levels. You can set the logging level to log
|
|
||||||
// on your instance of logger, obtained with `logrus.New()`.
|
|
||||||
const (
|
|
||||||
// PanicLevel level, highest level of severity. Logs and then calls panic with the
|
|
||||||
// message passed to Debug, Info, ...
|
|
||||||
PanicLevel Level = iota
|
|
||||||
// FatalLevel level. Logs and then calls `os.Exit(1)`. It will exit even if the
|
|
||||||
// logging level is set to Panic.
|
|
||||||
FatalLevel
|
|
||||||
// ErrorLevel level. Logs. Used for errors that should definitely be noted.
|
|
||||||
// Commonly used for hooks to send errors to an error tracking service.
|
|
||||||
ErrorLevel
|
|
||||||
// WarnLevel level. Non-critical entries that deserve eyes.
|
|
||||||
WarnLevel
|
|
||||||
// InfoLevel level. General operational entries about what's going on inside the
|
|
||||||
// application.
|
|
||||||
InfoLevel
|
|
||||||
// DebugLevel level. Usually only enabled when debugging. Very verbose logging.
|
|
||||||
DebugLevel
|
|
||||||
)
|
|
||||||
|
|
||||||
// Won't compile if StdLogger can't be realized by a log.Logger
|
|
||||||
var (
|
|
||||||
_ StdLogger = &log.Logger{}
|
|
||||||
_ StdLogger = &Entry{}
|
|
||||||
_ StdLogger = &Logger{}
|
|
||||||
)
|
|
||||||
|
|
||||||
// StdLogger is what your logrus-enabled library should take, that way
|
|
||||||
// it'll accept a stdlib logger and a logrus logger. There's no standard
|
|
||||||
// interface, this is the closest we get, unfortunately.
|
|
||||||
type StdLogger interface {
|
|
||||||
Print(...interface{})
|
|
||||||
Printf(string, ...interface{})
|
|
||||||
Println(...interface{})
|
|
||||||
|
|
||||||
Fatal(...interface{})
|
|
||||||
Fatalf(string, ...interface{})
|
|
||||||
Fatalln(...interface{})
|
|
||||||
|
|
||||||
Panic(...interface{})
|
|
||||||
Panicf(string, ...interface{})
|
|
||||||
Panicln(...interface{})
|
|
||||||
}
|
|
||||||
|
|
||||||
// The FieldLogger interface generalizes the Entry and Logger types
|
|
||||||
type FieldLogger interface {
|
|
||||||
WithField(key string, value interface{}) *Entry
|
|
||||||
WithFields(fields Fields) *Entry
|
|
||||||
WithError(err error) *Entry
|
|
||||||
|
|
||||||
Debugf(format string, args ...interface{})
|
|
||||||
Infof(format string, args ...interface{})
|
|
||||||
Printf(format string, args ...interface{})
|
|
||||||
Warnf(format string, args ...interface{})
|
|
||||||
Warningf(format string, args ...interface{})
|
|
||||||
Errorf(format string, args ...interface{})
|
|
||||||
Fatalf(format string, args ...interface{})
|
|
||||||
Panicf(format string, args ...interface{})
|
|
||||||
|
|
||||||
Debug(args ...interface{})
|
|
||||||
Info(args ...interface{})
|
|
||||||
Print(args ...interface{})
|
|
||||||
Warn(args ...interface{})
|
|
||||||
Warning(args ...interface{})
|
|
||||||
Error(args ...interface{})
|
|
||||||
Fatal(args ...interface{})
|
|
||||||
Panic(args ...interface{})
|
|
||||||
|
|
||||||
Debugln(args ...interface{})
|
|
||||||
Infoln(args ...interface{})
|
|
||||||
Println(args ...interface{})
|
|
||||||
Warnln(args ...interface{})
|
|
||||||
Warningln(args ...interface{})
|
|
||||||
Errorln(args ...interface{})
|
|
||||||
Fatalln(args ...interface{})
|
|
||||||
Panicln(args ...interface{})
|
|
||||||
}
|
|
10
vendor/github.com/Sirupsen/logrus/terminal_appengine.go
generated
vendored
10
vendor/github.com/Sirupsen/logrus/terminal_appengine.go
generated
vendored
|
@ -1,10 +0,0 @@
|
||||||
// +build appengine
|
|
||||||
|
|
||||||
package logrus
|
|
||||||
|
|
||||||
import "io"
|
|
||||||
|
|
||||||
// IsTerminal returns true if stderr's file descriptor is a terminal.
|
|
||||||
func IsTerminal(f io.Writer) bool {
|
|
||||||
return true
|
|
||||||
}
|
|
10
vendor/github.com/Sirupsen/logrus/terminal_bsd.go
generated
vendored
10
vendor/github.com/Sirupsen/logrus/terminal_bsd.go
generated
vendored
|
@ -1,10 +0,0 @@
|
||||||
// +build darwin freebsd openbsd netbsd dragonfly
|
|
||||||
// +build !appengine
|
|
||||||
|
|
||||||
package logrus
|
|
||||||
|
|
||||||
import "syscall"
|
|
||||||
|
|
||||||
const ioctlReadTermios = syscall.TIOCGETA
|
|
||||||
|
|
||||||
type Termios syscall.Termios
|
|
14
vendor/github.com/Sirupsen/logrus/terminal_linux.go
generated
vendored
14
vendor/github.com/Sirupsen/logrus/terminal_linux.go
generated
vendored
|
@ -1,14 +0,0 @@
|
||||||
// Based on ssh/terminal:
|
|
||||||
// Copyright 2013 The Go Authors. All rights reserved.
|
|
||||||
// Use of this source code is governed by a BSD-style
|
|
||||||
// license that can be found in the LICENSE file.
|
|
||||||
|
|
||||||
// +build !appengine
|
|
||||||
|
|
||||||
package logrus
|
|
||||||
|
|
||||||
import "syscall"
|
|
||||||
|
|
||||||
const ioctlReadTermios = syscall.TCGETS
|
|
||||||
|
|
||||||
type Termios syscall.Termios
|
|
28
vendor/github.com/Sirupsen/logrus/terminal_notwindows.go
generated
vendored
28
vendor/github.com/Sirupsen/logrus/terminal_notwindows.go
generated
vendored
|
@ -1,28 +0,0 @@
|
||||||
// Based on ssh/terminal:
|
|
||||||
// Copyright 2011 The Go Authors. All rights reserved.
|
|
||||||
// Use of this source code is governed by a BSD-style
|
|
||||||
// license that can be found in the LICENSE file.
|
|
||||||
|
|
||||||
// +build linux darwin freebsd openbsd netbsd dragonfly
|
|
||||||
// +build !appengine
|
|
||||||
|
|
||||||
package logrus
|
|
||||||
|
|
||||||
import (
|
|
||||||
"io"
|
|
||||||
"os"
|
|
||||||
"syscall"
|
|
||||||
"unsafe"
|
|
||||||
)
|
|
||||||
|
|
||||||
// IsTerminal returns true if stderr's file descriptor is a terminal.
|
|
||||||
func IsTerminal(f io.Writer) bool {
|
|
||||||
var termios Termios
|
|
||||||
switch v := f.(type) {
|
|
||||||
case *os.File:
|
|
||||||
_, _, err := syscall.Syscall6(syscall.SYS_IOCTL, uintptr(v.Fd()), ioctlReadTermios, uintptr(unsafe.Pointer(&termios)), 0, 0, 0)
|
|
||||||
return err == 0
|
|
||||||
default:
|
|
||||||
return false
|
|
||||||
}
|
|
||||||
}
|
|
21
vendor/github.com/Sirupsen/logrus/terminal_solaris.go
generated
vendored
21
vendor/github.com/Sirupsen/logrus/terminal_solaris.go
generated
vendored
|
@ -1,21 +0,0 @@
|
||||||
// +build solaris,!appengine
|
|
||||||
|
|
||||||
package logrus
|
|
||||||
|
|
||||||
import (
|
|
||||||
"io"
|
|
||||||
"os"
|
|
||||||
|
|
||||||
"golang.org/x/sys/unix"
|
|
||||||
)
|
|
||||||
|
|
||||||
// IsTerminal returns true if the given file descriptor is a terminal.
|
|
||||||
func IsTerminal(f io.Writer) bool {
|
|
||||||
switch v := f.(type) {
|
|
||||||
case *os.File:
|
|
||||||
_, err := unix.IoctlGetTermios(int(v.Fd()), unix.TCGETA)
|
|
||||||
return err == nil
|
|
||||||
default:
|
|
||||||
return false
|
|
||||||
}
|
|
||||||
}
|
|
33
vendor/github.com/Sirupsen/logrus/terminal_windows.go
generated
vendored
33
vendor/github.com/Sirupsen/logrus/terminal_windows.go
generated
vendored
|
@ -1,33 +0,0 @@
|
||||||
// Based on ssh/terminal:
|
|
||||||
// Copyright 2011 The Go Authors. All rights reserved.
|
|
||||||
// Use of this source code is governed by a BSD-style
|
|
||||||
// license that can be found in the LICENSE file.
|
|
||||||
|
|
||||||
// +build windows,!appengine
|
|
||||||
|
|
||||||
package logrus
|
|
||||||
|
|
||||||
import (
|
|
||||||
"io"
|
|
||||||
"os"
|
|
||||||
"syscall"
|
|
||||||
"unsafe"
|
|
||||||
)
|
|
||||||
|
|
||||||
var kernel32 = syscall.NewLazyDLL("kernel32.dll")
|
|
||||||
|
|
||||||
var (
|
|
||||||
procGetConsoleMode = kernel32.NewProc("GetConsoleMode")
|
|
||||||
)
|
|
||||||
|
|
||||||
// IsTerminal returns true if stderr's file descriptor is a terminal.
|
|
||||||
func IsTerminal(f io.Writer) bool {
|
|
||||||
switch v := f.(type) {
|
|
||||||
case *os.File:
|
|
||||||
var st uint32
|
|
||||||
r, _, e := syscall.Syscall(procGetConsoleMode.Addr(), 2, uintptr(v.Fd()), uintptr(unsafe.Pointer(&st)), 0)
|
|
||||||
return r != 0 && e == 0
|
|
||||||
default:
|
|
||||||
return false
|
|
||||||
}
|
|
||||||
}
|
|
189
vendor/github.com/Sirupsen/logrus/text_formatter.go
generated
vendored
189
vendor/github.com/Sirupsen/logrus/text_formatter.go
generated
vendored
|
@ -1,189 +0,0 @@
|
||||||
package logrus
|
|
||||||
|
|
||||||
import (
|
|
||||||
"bytes"
|
|
||||||
"fmt"
|
|
||||||
"sort"
|
|
||||||
"strings"
|
|
||||||
"sync"
|
|
||||||
"time"
|
|
||||||
)
|
|
||||||
|
|
||||||
const (
|
|
||||||
nocolor = 0
|
|
||||||
red = 31
|
|
||||||
green = 32
|
|
||||||
yellow = 33
|
|
||||||
blue = 34
|
|
||||||
gray = 37
|
|
||||||
)
|
|
||||||
|
|
||||||
var (
|
|
||||||
baseTimestamp time.Time
|
|
||||||
)
|
|
||||||
|
|
||||||
func init() {
|
|
||||||
baseTimestamp = time.Now()
|
|
||||||
}
|
|
||||||
|
|
||||||
type TextFormatter struct {
|
|
||||||
// Set to true to bypass checking for a TTY before outputting colors.
|
|
||||||
ForceColors bool
|
|
||||||
|
|
||||||
// Force disabling colors.
|
|
||||||
DisableColors bool
|
|
||||||
|
|
||||||
// Disable timestamp logging. useful when output is redirected to logging
|
|
||||||
// system that already adds timestamps.
|
|
||||||
DisableTimestamp bool
|
|
||||||
|
|
||||||
// Enable logging the full timestamp when a TTY is attached instead of just
|
|
||||||
// the time passed since beginning of execution.
|
|
||||||
FullTimestamp bool
|
|
||||||
|
|
||||||
// TimestampFormat to use for display when a full timestamp is printed
|
|
||||||
TimestampFormat string
|
|
||||||
|
|
||||||
// The fields are sorted by default for a consistent output. For applications
|
|
||||||
// that log extremely frequently and don't use the JSON formatter this may not
|
|
||||||
// be desired.
|
|
||||||
DisableSorting bool
|
|
||||||
|
|
||||||
// QuoteEmptyFields will wrap empty fields in quotes if true
|
|
||||||
QuoteEmptyFields bool
|
|
||||||
|
|
||||||
// QuoteCharacter can be set to the override the default quoting character "
|
|
||||||
// with something else. For example: ', or `.
|
|
||||||
QuoteCharacter string
|
|
||||||
|
|
||||||
// Whether the logger's out is to a terminal
|
|
||||||
isTerminal bool
|
|
||||||
|
|
||||||
sync.Once
|
|
||||||
}
|
|
||||||
|
|
||||||
func (f *TextFormatter) init(entry *Entry) {
|
|
||||||
if len(f.QuoteCharacter) == 0 {
|
|
||||||
f.QuoteCharacter = "\""
|
|
||||||
}
|
|
||||||
if entry.Logger != nil {
|
|
||||||
f.isTerminal = IsTerminal(entry.Logger.Out)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func (f *TextFormatter) Format(entry *Entry) ([]byte, error) {
|
|
||||||
var b *bytes.Buffer
|
|
||||||
keys := make([]string, 0, len(entry.Data))
|
|
||||||
for k := range entry.Data {
|
|
||||||
keys = append(keys, k)
|
|
||||||
}
|
|
||||||
|
|
||||||
if !f.DisableSorting {
|
|
||||||
sort.Strings(keys)
|
|
||||||
}
|
|
||||||
if entry.Buffer != nil {
|
|
||||||
b = entry.Buffer
|
|
||||||
} else {
|
|
||||||
b = &bytes.Buffer{}
|
|
||||||
}
|
|
||||||
|
|
||||||
prefixFieldClashes(entry.Data)
|
|
||||||
|
|
||||||
f.Do(func() { f.init(entry) })
|
|
||||||
|
|
||||||
isColored := (f.ForceColors || f.isTerminal) && !f.DisableColors
|
|
||||||
|
|
||||||
timestampFormat := f.TimestampFormat
|
|
||||||
if timestampFormat == "" {
|
|
||||||
timestampFormat = DefaultTimestampFormat
|
|
||||||
}
|
|
||||||
if isColored {
|
|
||||||
f.printColored(b, entry, keys, timestampFormat)
|
|
||||||
} else {
|
|
||||||
if !f.DisableTimestamp {
|
|
||||||
f.appendKeyValue(b, "time", entry.Time.Format(timestampFormat))
|
|
||||||
}
|
|
||||||
f.appendKeyValue(b, "level", entry.Level.String())
|
|
||||||
if entry.Message != "" {
|
|
||||||
f.appendKeyValue(b, "msg", entry.Message)
|
|
||||||
}
|
|
||||||
for _, key := range keys {
|
|
||||||
f.appendKeyValue(b, key, entry.Data[key])
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
b.WriteByte('\n')
|
|
||||||
return b.Bytes(), nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func (f *TextFormatter) printColored(b *bytes.Buffer, entry *Entry, keys []string, timestampFormat string) {
|
|
||||||
var levelColor int
|
|
||||||
switch entry.Level {
|
|
||||||
case DebugLevel:
|
|
||||||
levelColor = gray
|
|
||||||
case WarnLevel:
|
|
||||||
levelColor = yellow
|
|
||||||
case ErrorLevel, FatalLevel, PanicLevel:
|
|
||||||
levelColor = red
|
|
||||||
default:
|
|
||||||
levelColor = blue
|
|
||||||
}
|
|
||||||
|
|
||||||
levelText := strings.ToUpper(entry.Level.String())[0:4]
|
|
||||||
|
|
||||||
if f.DisableTimestamp {
|
|
||||||
fmt.Fprintf(b, "\x1b[%dm%s\x1b[0m %-44s ", levelColor, levelText, entry.Message)
|
|
||||||
} else if !f.FullTimestamp {
|
|
||||||
fmt.Fprintf(b, "\x1b[%dm%s\x1b[0m[%04d] %-44s ", levelColor, levelText, int(entry.Time.Sub(baseTimestamp)/time.Second), entry.Message)
|
|
||||||
} else {
|
|
||||||
fmt.Fprintf(b, "\x1b[%dm%s\x1b[0m[%s] %-44s ", levelColor, levelText, entry.Time.Format(timestampFormat), entry.Message)
|
|
||||||
}
|
|
||||||
for _, k := range keys {
|
|
||||||
v := entry.Data[k]
|
|
||||||
fmt.Fprintf(b, " \x1b[%dm%s\x1b[0m=", levelColor, k)
|
|
||||||
f.appendValue(b, v)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func (f *TextFormatter) needsQuoting(text string) bool {
|
|
||||||
if f.QuoteEmptyFields && len(text) == 0 {
|
|
||||||
return true
|
|
||||||
}
|
|
||||||
for _, ch := range text {
|
|
||||||
if !((ch >= 'a' && ch <= 'z') ||
|
|
||||||
(ch >= 'A' && ch <= 'Z') ||
|
|
||||||
(ch >= '0' && ch <= '9') ||
|
|
||||||
ch == '-' || ch == '.') {
|
|
||||||
return true
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return false
|
|
||||||
}
|
|
||||||
|
|
||||||
func (f *TextFormatter) appendKeyValue(b *bytes.Buffer, key string, value interface{}) {
|
|
||||||
|
|
||||||
b.WriteString(key)
|
|
||||||
b.WriteByte('=')
|
|
||||||
f.appendValue(b, value)
|
|
||||||
b.WriteByte(' ')
|
|
||||||
}
|
|
||||||
|
|
||||||
func (f *TextFormatter) appendValue(b *bytes.Buffer, value interface{}) {
|
|
||||||
switch value := value.(type) {
|
|
||||||
case string:
|
|
||||||
if !f.needsQuoting(value) {
|
|
||||||
b.WriteString(value)
|
|
||||||
} else {
|
|
||||||
fmt.Fprintf(b, "%s%v%s", f.QuoteCharacter, value, f.QuoteCharacter)
|
|
||||||
}
|
|
||||||
case error:
|
|
||||||
errmsg := value.Error()
|
|
||||||
if !f.needsQuoting(errmsg) {
|
|
||||||
b.WriteString(errmsg)
|
|
||||||
} else {
|
|
||||||
fmt.Fprintf(b, "%s%v%s", f.QuoteCharacter, errmsg, f.QuoteCharacter)
|
|
||||||
}
|
|
||||||
default:
|
|
||||||
fmt.Fprint(b, value)
|
|
||||||
}
|
|
||||||
}
|
|
53
vendor/github.com/Sirupsen/logrus/writer.go
generated
vendored
53
vendor/github.com/Sirupsen/logrus/writer.go
generated
vendored
|
@ -1,53 +0,0 @@
|
||||||
package logrus
|
|
||||||
|
|
||||||
import (
|
|
||||||
"bufio"
|
|
||||||
"io"
|
|
||||||
"runtime"
|
|
||||||
)
|
|
||||||
|
|
||||||
func (logger *Logger) Writer() *io.PipeWriter {
|
|
||||||
return logger.WriterLevel(InfoLevel)
|
|
||||||
}
|
|
||||||
|
|
||||||
func (logger *Logger) WriterLevel(level Level) *io.PipeWriter {
|
|
||||||
reader, writer := io.Pipe()
|
|
||||||
|
|
||||||
var printFunc func(args ...interface{})
|
|
||||||
switch level {
|
|
||||||
case DebugLevel:
|
|
||||||
printFunc = logger.Debug
|
|
||||||
case InfoLevel:
|
|
||||||
printFunc = logger.Info
|
|
||||||
case WarnLevel:
|
|
||||||
printFunc = logger.Warn
|
|
||||||
case ErrorLevel:
|
|
||||||
printFunc = logger.Error
|
|
||||||
case FatalLevel:
|
|
||||||
printFunc = logger.Fatal
|
|
||||||
case PanicLevel:
|
|
||||||
printFunc = logger.Panic
|
|
||||||
default:
|
|
||||||
printFunc = logger.Print
|
|
||||||
}
|
|
||||||
|
|
||||||
go logger.writerScanner(reader, printFunc)
|
|
||||||
runtime.SetFinalizer(writer, writerFinalizer)
|
|
||||||
|
|
||||||
return writer
|
|
||||||
}
|
|
||||||
|
|
||||||
func (logger *Logger) writerScanner(reader *io.PipeReader, printFunc func(args ...interface{})) {
|
|
||||||
scanner := bufio.NewScanner(reader)
|
|
||||||
for scanner.Scan() {
|
|
||||||
printFunc(scanner.Text())
|
|
||||||
}
|
|
||||||
if err := scanner.Err(); err != nil {
|
|
||||||
logger.Errorf("Error while reading from Writer: %s", err)
|
|
||||||
}
|
|
||||||
reader.Close()
|
|
||||||
}
|
|
||||||
|
|
||||||
func writerFinalizer(writer *io.PipeWriter) {
|
|
||||||
writer.Close()
|
|
||||||
}
|
|
2
vendor/github.com/docker/distribution/blobs.go
generated
vendored
2
vendor/github.com/docker/distribution/blobs.go
generated
vendored
|
@ -1,13 +1,13 @@
|
||||||
package distribution
|
package distribution
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"context"
|
||||||
"errors"
|
"errors"
|
||||||
"fmt"
|
"fmt"
|
||||||
"io"
|
"io"
|
||||||
"net/http"
|
"net/http"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
"github.com/docker/distribution/context"
|
|
||||||
"github.com/docker/distribution/reference"
|
"github.com/docker/distribution/reference"
|
||||||
"github.com/opencontainers/go-digest"
|
"github.com/opencontainers/go-digest"
|
||||||
)
|
)
|
||||||
|
|
18
vendor/github.com/docker/distribution/context/context.go
generated
vendored
18
vendor/github.com/docker/distribution/context/context.go
generated
vendored
|
@ -1,21 +1,16 @@
|
||||||
package context
|
package context
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"context"
|
||||||
"sync"
|
"sync"
|
||||||
|
|
||||||
"github.com/docker/distribution/uuid"
|
"github.com/docker/distribution/uuid"
|
||||||
"golang.org/x/net/context"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
// Context is a copy of Context from the golang.org/x/net/context package.
|
|
||||||
type Context interface {
|
|
||||||
context.Context
|
|
||||||
}
|
|
||||||
|
|
||||||
// instanceContext is a context that provides only an instance id. It is
|
// instanceContext is a context that provides only an instance id. It is
|
||||||
// provided as the main background context.
|
// provided as the main background context.
|
||||||
type instanceContext struct {
|
type instanceContext struct {
|
||||||
Context
|
context.Context
|
||||||
id string // id of context, logged as "instance.id"
|
id string // id of context, logged as "instance.id"
|
||||||
once sync.Once // once protect generation of the id
|
once sync.Once // once protect generation of the id
|
||||||
}
|
}
|
||||||
|
@ -42,17 +37,10 @@ var background = &instanceContext{
|
||||||
// Background returns a non-nil, empty Context. The background context
|
// Background returns a non-nil, empty Context. The background context
|
||||||
// provides a single key, "instance.id" that is globally unique to the
|
// provides a single key, "instance.id" that is globally unique to the
|
||||||
// process.
|
// process.
|
||||||
func Background() Context {
|
func Background() context.Context {
|
||||||
return background
|
return background
|
||||||
}
|
}
|
||||||
|
|
||||||
// WithValue returns a copy of parent in which the value associated with key is
|
|
||||||
// val. Use context Values only for request-scoped data that transits processes
|
|
||||||
// and APIs, not for passing optional parameters to functions.
|
|
||||||
func WithValue(parent Context, key, val interface{}) Context {
|
|
||||||
return context.WithValue(parent, key, val)
|
|
||||||
}
|
|
||||||
|
|
||||||
// stringMapContext is a simple context implementation that checks a map for a
|
// stringMapContext is a simple context implementation that checks a map for a
|
||||||
// key, falling back to a parent if not present.
|
// key, falling back to a parent if not present.
|
||||||
type stringMapContext struct {
|
type stringMapContext struct {
|
||||||
|
|
25
vendor/github.com/docker/distribution/context/http.go
generated
vendored
25
vendor/github.com/docker/distribution/context/http.go
generated
vendored
|
@ -1,6 +1,7 @@
|
||||||
package context
|
package context
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"context"
|
||||||
"errors"
|
"errors"
|
||||||
"net"
|
"net"
|
||||||
"net/http"
|
"net/http"
|
||||||
|
@ -8,9 +9,9 @@ import (
|
||||||
"sync"
|
"sync"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
log "github.com/Sirupsen/logrus"
|
|
||||||
"github.com/docker/distribution/uuid"
|
"github.com/docker/distribution/uuid"
|
||||||
"github.com/gorilla/mux"
|
"github.com/gorilla/mux"
|
||||||
|
log "github.com/sirupsen/logrus"
|
||||||
)
|
)
|
||||||
|
|
||||||
// Common errors used with this package.
|
// Common errors used with this package.
|
||||||
|
@ -68,7 +69,7 @@ func RemoteIP(r *http.Request) string {
|
||||||
// is available at "http.request". Other common attributes are available under
|
// is available at "http.request". Other common attributes are available under
|
||||||
// the prefix "http.request.". If a request is already present on the context,
|
// the prefix "http.request.". If a request is already present on the context,
|
||||||
// this method will panic.
|
// this method will panic.
|
||||||
func WithRequest(ctx Context, r *http.Request) Context {
|
func WithRequest(ctx context.Context, r *http.Request) context.Context {
|
||||||
if ctx.Value("http.request") != nil {
|
if ctx.Value("http.request") != nil {
|
||||||
// NOTE(stevvooe): This needs to be considered a programming error. It
|
// NOTE(stevvooe): This needs to be considered a programming error. It
|
||||||
// is unlikely that we'd want to have more than one request in
|
// is unlikely that we'd want to have more than one request in
|
||||||
|
@ -87,7 +88,7 @@ func WithRequest(ctx Context, r *http.Request) Context {
|
||||||
// GetRequest returns the http request in the given context. Returns
|
// GetRequest returns the http request in the given context. Returns
|
||||||
// ErrNoRequestContext if the context does not have an http request associated
|
// ErrNoRequestContext if the context does not have an http request associated
|
||||||
// with it.
|
// with it.
|
||||||
func GetRequest(ctx Context) (*http.Request, error) {
|
func GetRequest(ctx context.Context) (*http.Request, error) {
|
||||||
if r, ok := ctx.Value("http.request").(*http.Request); r != nil && ok {
|
if r, ok := ctx.Value("http.request").(*http.Request); r != nil && ok {
|
||||||
return r, nil
|
return r, nil
|
||||||
}
|
}
|
||||||
|
@ -96,13 +97,13 @@ func GetRequest(ctx Context) (*http.Request, error) {
|
||||||
|
|
||||||
// GetRequestID attempts to resolve the current request id, if possible. An
|
// GetRequestID attempts to resolve the current request id, if possible. An
|
||||||
// error is return if it is not available on the context.
|
// error is return if it is not available on the context.
|
||||||
func GetRequestID(ctx Context) string {
|
func GetRequestID(ctx context.Context) string {
|
||||||
return GetStringValue(ctx, "http.request.id")
|
return GetStringValue(ctx, "http.request.id")
|
||||||
}
|
}
|
||||||
|
|
||||||
// WithResponseWriter returns a new context and response writer that makes
|
// WithResponseWriter returns a new context and response writer that makes
|
||||||
// interesting response statistics available within the context.
|
// interesting response statistics available within the context.
|
||||||
func WithResponseWriter(ctx Context, w http.ResponseWriter) (Context, http.ResponseWriter) {
|
func WithResponseWriter(ctx context.Context, w http.ResponseWriter) (context.Context, http.ResponseWriter) {
|
||||||
if closeNotifier, ok := w.(http.CloseNotifier); ok {
|
if closeNotifier, ok := w.(http.CloseNotifier); ok {
|
||||||
irwCN := &instrumentedResponseWriterCN{
|
irwCN := &instrumentedResponseWriterCN{
|
||||||
instrumentedResponseWriter: instrumentedResponseWriter{
|
instrumentedResponseWriter: instrumentedResponseWriter{
|
||||||
|
@ -125,7 +126,7 @@ func WithResponseWriter(ctx Context, w http.ResponseWriter) (Context, http.Respo
|
||||||
// GetResponseWriter returns the http.ResponseWriter from the provided
|
// GetResponseWriter returns the http.ResponseWriter from the provided
|
||||||
// context. If not present, ErrNoResponseWriterContext is returned. The
|
// context. If not present, ErrNoResponseWriterContext is returned. The
|
||||||
// returned instance provides instrumentation in the context.
|
// returned instance provides instrumentation in the context.
|
||||||
func GetResponseWriter(ctx Context) (http.ResponseWriter, error) {
|
func GetResponseWriter(ctx context.Context) (http.ResponseWriter, error) {
|
||||||
v := ctx.Value("http.response")
|
v := ctx.Value("http.response")
|
||||||
|
|
||||||
rw, ok := v.(http.ResponseWriter)
|
rw, ok := v.(http.ResponseWriter)
|
||||||
|
@ -145,7 +146,7 @@ var getVarsFromRequest = mux.Vars
|
||||||
// example, if looking for the variable "name", it can be accessed as
|
// example, if looking for the variable "name", it can be accessed as
|
||||||
// "vars.name". Implementations that are accessing values need not know that
|
// "vars.name". Implementations that are accessing values need not know that
|
||||||
// the underlying context is implemented with gorilla/mux vars.
|
// the underlying context is implemented with gorilla/mux vars.
|
||||||
func WithVars(ctx Context, r *http.Request) Context {
|
func WithVars(ctx context.Context, r *http.Request) context.Context {
|
||||||
return &muxVarsContext{
|
return &muxVarsContext{
|
||||||
Context: ctx,
|
Context: ctx,
|
||||||
vars: getVarsFromRequest(r),
|
vars: getVarsFromRequest(r),
|
||||||
|
@ -155,7 +156,7 @@ func WithVars(ctx Context, r *http.Request) Context {
|
||||||
// GetRequestLogger returns a logger that contains fields from the request in
|
// GetRequestLogger returns a logger that contains fields from the request in
|
||||||
// the current context. If the request is not available in the context, no
|
// the current context. If the request is not available in the context, no
|
||||||
// fields will display. Request loggers can safely be pushed onto the context.
|
// fields will display. Request loggers can safely be pushed onto the context.
|
||||||
func GetRequestLogger(ctx Context) Logger {
|
func GetRequestLogger(ctx context.Context) Logger {
|
||||||
return GetLogger(ctx,
|
return GetLogger(ctx,
|
||||||
"http.request.id",
|
"http.request.id",
|
||||||
"http.request.method",
|
"http.request.method",
|
||||||
|
@ -171,7 +172,7 @@ func GetRequestLogger(ctx Context) Logger {
|
||||||
// Because the values are read at call time, pushing a logger returned from
|
// Because the values are read at call time, pushing a logger returned from
|
||||||
// this function on the context will lead to missing or invalid data. Only
|
// this function on the context will lead to missing or invalid data. Only
|
||||||
// call this at the end of a request, after the response has been written.
|
// call this at the end of a request, after the response has been written.
|
||||||
func GetResponseLogger(ctx Context) Logger {
|
func GetResponseLogger(ctx context.Context) Logger {
|
||||||
l := getLogrusLogger(ctx,
|
l := getLogrusLogger(ctx,
|
||||||
"http.response.written",
|
"http.response.written",
|
||||||
"http.response.status",
|
"http.response.status",
|
||||||
|
@ -188,7 +189,7 @@ func GetResponseLogger(ctx Context) Logger {
|
||||||
|
|
||||||
// httpRequestContext makes information about a request available to context.
|
// httpRequestContext makes information about a request available to context.
|
||||||
type httpRequestContext struct {
|
type httpRequestContext struct {
|
||||||
Context
|
context.Context
|
||||||
|
|
||||||
startedAt time.Time
|
startedAt time.Time
|
||||||
id string
|
id string
|
||||||
|
@ -247,7 +248,7 @@ fallback:
|
||||||
}
|
}
|
||||||
|
|
||||||
type muxVarsContext struct {
|
type muxVarsContext struct {
|
||||||
Context
|
context.Context
|
||||||
vars map[string]string
|
vars map[string]string
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -282,7 +283,7 @@ type instrumentedResponseWriterCN struct {
|
||||||
// implemented by the parent ResponseWriter.
|
// implemented by the parent ResponseWriter.
|
||||||
type instrumentedResponseWriter struct {
|
type instrumentedResponseWriter struct {
|
||||||
http.ResponseWriter
|
http.ResponseWriter
|
||||||
Context
|
context.Context
|
||||||
|
|
||||||
mu sync.Mutex
|
mu sync.Mutex
|
||||||
status int
|
status int
|
||||||
|
|
23
vendor/github.com/docker/distribution/context/logger.go
generated
vendored
23
vendor/github.com/docker/distribution/context/logger.go
generated
vendored
|
@ -1,10 +1,11 @@
|
||||||
package context
|
package context
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"context"
|
||||||
"fmt"
|
"fmt"
|
||||||
|
|
||||||
"github.com/Sirupsen/logrus"
|
|
||||||
"runtime"
|
"runtime"
|
||||||
|
|
||||||
|
"github.com/sirupsen/logrus"
|
||||||
)
|
)
|
||||||
|
|
||||||
// Logger provides a leveled-logging interface.
|
// Logger provides a leveled-logging interface.
|
||||||
|
@ -38,24 +39,28 @@ type Logger interface {
|
||||||
Warn(args ...interface{})
|
Warn(args ...interface{})
|
||||||
Warnf(format string, args ...interface{})
|
Warnf(format string, args ...interface{})
|
||||||
Warnln(args ...interface{})
|
Warnln(args ...interface{})
|
||||||
|
|
||||||
|
WithError(err error) *logrus.Entry
|
||||||
}
|
}
|
||||||
|
|
||||||
|
type loggerKey struct{}
|
||||||
|
|
||||||
// WithLogger creates a new context with provided logger.
|
// WithLogger creates a new context with provided logger.
|
||||||
func WithLogger(ctx Context, logger Logger) Context {
|
func WithLogger(ctx context.Context, logger Logger) context.Context {
|
||||||
return WithValue(ctx, "logger", logger)
|
return context.WithValue(ctx, loggerKey{}, logger)
|
||||||
}
|
}
|
||||||
|
|
||||||
// GetLoggerWithField returns a logger instance with the specified field key
|
// GetLoggerWithField returns a logger instance with the specified field key
|
||||||
// and value without affecting the context. Extra specified keys will be
|
// and value without affecting the context. Extra specified keys will be
|
||||||
// resolved from the context.
|
// resolved from the context.
|
||||||
func GetLoggerWithField(ctx Context, key, value interface{}, keys ...interface{}) Logger {
|
func GetLoggerWithField(ctx context.Context, key, value interface{}, keys ...interface{}) Logger {
|
||||||
return getLogrusLogger(ctx, keys...).WithField(fmt.Sprint(key), value)
|
return getLogrusLogger(ctx, keys...).WithField(fmt.Sprint(key), value)
|
||||||
}
|
}
|
||||||
|
|
||||||
// GetLoggerWithFields returns a logger instance with the specified fields
|
// GetLoggerWithFields returns a logger instance with the specified fields
|
||||||
// without affecting the context. Extra specified keys will be resolved from
|
// without affecting the context. Extra specified keys will be resolved from
|
||||||
// the context.
|
// the context.
|
||||||
func GetLoggerWithFields(ctx Context, fields map[interface{}]interface{}, keys ...interface{}) Logger {
|
func GetLoggerWithFields(ctx context.Context, fields map[interface{}]interface{}, keys ...interface{}) Logger {
|
||||||
// must convert from interface{} -> interface{} to string -> interface{} for logrus.
|
// must convert from interface{} -> interface{} to string -> interface{} for logrus.
|
||||||
lfields := make(logrus.Fields, len(fields))
|
lfields := make(logrus.Fields, len(fields))
|
||||||
for key, value := range fields {
|
for key, value := range fields {
|
||||||
|
@ -71,7 +76,7 @@ func GetLoggerWithFields(ctx Context, fields map[interface{}]interface{}, keys .
|
||||||
// argument passed to GetLogger will be passed to fmt.Sprint when expanded as
|
// argument passed to GetLogger will be passed to fmt.Sprint when expanded as
|
||||||
// a logging key field. If context keys are integer constants, for example,
|
// a logging key field. If context keys are integer constants, for example,
|
||||||
// its recommended that a String method is implemented.
|
// its recommended that a String method is implemented.
|
||||||
func GetLogger(ctx Context, keys ...interface{}) Logger {
|
func GetLogger(ctx context.Context, keys ...interface{}) Logger {
|
||||||
return getLogrusLogger(ctx, keys...)
|
return getLogrusLogger(ctx, keys...)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -79,11 +84,11 @@ func GetLogger(ctx Context, keys ...interface{}) Logger {
|
||||||
// are provided, they will be resolved on the context and included in the
|
// are provided, they will be resolved on the context and included in the
|
||||||
// logger. Only use this function if specific logrus functionality is
|
// logger. Only use this function if specific logrus functionality is
|
||||||
// required.
|
// required.
|
||||||
func getLogrusLogger(ctx Context, keys ...interface{}) *logrus.Entry {
|
func getLogrusLogger(ctx context.Context, keys ...interface{}) *logrus.Entry {
|
||||||
var logger *logrus.Entry
|
var logger *logrus.Entry
|
||||||
|
|
||||||
// Get a logger, if it is present.
|
// Get a logger, if it is present.
|
||||||
loggerInterface := ctx.Value("logger")
|
loggerInterface := ctx.Value(loggerKey{})
|
||||||
if loggerInterface != nil {
|
if loggerInterface != nil {
|
||||||
if lgr, ok := loggerInterface.(*logrus.Entry); ok {
|
if lgr, ok := loggerInterface.(*logrus.Entry); ok {
|
||||||
logger = lgr
|
logger = lgr
|
||||||
|
|
5
vendor/github.com/docker/distribution/context/trace.go
generated
vendored
5
vendor/github.com/docker/distribution/context/trace.go
generated
vendored
|
@ -1,6 +1,7 @@
|
||||||
package context
|
package context
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"context"
|
||||||
"runtime"
|
"runtime"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
|
@ -36,7 +37,7 @@ import (
|
||||||
//
|
//
|
||||||
// Notice that the function name is automatically resolved, along with the
|
// Notice that the function name is automatically resolved, along with the
|
||||||
// package and a trace id is emitted that can be linked with parent ids.
|
// package and a trace id is emitted that can be linked with parent ids.
|
||||||
func WithTrace(ctx Context) (Context, func(format string, a ...interface{})) {
|
func WithTrace(ctx context.Context) (context.Context, func(format string, a ...interface{})) {
|
||||||
if ctx == nil {
|
if ctx == nil {
|
||||||
ctx = Background()
|
ctx = Background()
|
||||||
}
|
}
|
||||||
|
@ -69,7 +70,7 @@ func WithTrace(ctx Context) (Context, func(format string, a ...interface{})) {
|
||||||
// also provides fast lookup for the various attributes that are available on
|
// also provides fast lookup for the various attributes that are available on
|
||||||
// the trace.
|
// the trace.
|
||||||
type traced struct {
|
type traced struct {
|
||||||
Context
|
context.Context
|
||||||
id string
|
id string
|
||||||
parent string
|
parent string
|
||||||
start time.Time
|
start time.Time
|
||||||
|
|
5
vendor/github.com/docker/distribution/context/util.go
generated
vendored
5
vendor/github.com/docker/distribution/context/util.go
generated
vendored
|
@ -1,13 +1,14 @@
|
||||||
package context
|
package context
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"context"
|
||||||
"time"
|
"time"
|
||||||
)
|
)
|
||||||
|
|
||||||
// Since looks up key, which should be a time.Time, and returns the duration
|
// Since looks up key, which should be a time.Time, and returns the duration
|
||||||
// since that time. If the key is not found, the value returned will be zero.
|
// since that time. If the key is not found, the value returned will be zero.
|
||||||
// This is helpful when inferring metrics related to context execution times.
|
// This is helpful when inferring metrics related to context execution times.
|
||||||
func Since(ctx Context, key interface{}) time.Duration {
|
func Since(ctx context.Context, key interface{}) time.Duration {
|
||||||
if startedAt, ok := ctx.Value(key).(time.Time); ok {
|
if startedAt, ok := ctx.Value(key).(time.Time); ok {
|
||||||
return time.Since(startedAt)
|
return time.Since(startedAt)
|
||||||
}
|
}
|
||||||
|
@ -16,7 +17,7 @@ func Since(ctx Context, key interface{}) time.Duration {
|
||||||
|
|
||||||
// GetStringValue returns a string value from the context. The empty string
|
// GetStringValue returns a string value from the context. The empty string
|
||||||
// will be returned if not found.
|
// will be returned if not found.
|
||||||
func GetStringValue(ctx Context, key interface{}) (value string) {
|
func GetStringValue(ctx context.Context, key interface{}) (value string) {
|
||||||
if valuev, ok := ctx.Value(key).(string); ok {
|
if valuev, ok := ctx.Value(key).(string); ok {
|
||||||
value = valuev
|
value = valuev
|
||||||
}
|
}
|
||||||
|
|
16
vendor/github.com/docker/distribution/context/version.go
generated
vendored
16
vendor/github.com/docker/distribution/context/version.go
generated
vendored
|
@ -1,16 +1,22 @@
|
||||||
package context
|
package context
|
||||||
|
|
||||||
|
import "context"
|
||||||
|
|
||||||
|
type versionKey struct{}
|
||||||
|
|
||||||
|
func (versionKey) String() string { return "version" }
|
||||||
|
|
||||||
// WithVersion stores the application version in the context. The new context
|
// WithVersion stores the application version in the context. The new context
|
||||||
// gets a logger to ensure log messages are marked with the application
|
// gets a logger to ensure log messages are marked with the application
|
||||||
// version.
|
// version.
|
||||||
func WithVersion(ctx Context, version string) Context {
|
func WithVersion(ctx context.Context, version string) context.Context {
|
||||||
ctx = WithValue(ctx, "version", version)
|
ctx = context.WithValue(ctx, versionKey{}, version)
|
||||||
// push a new logger onto the stack
|
// push a new logger onto the stack
|
||||||
return WithLogger(ctx, GetLogger(ctx, "version"))
|
return WithLogger(ctx, GetLogger(ctx, versionKey{}))
|
||||||
}
|
}
|
||||||
|
|
||||||
// GetVersion returns the application version from the context. An empty
|
// GetVersion returns the application version from the context. An empty
|
||||||
// string may returned if the version was not set on the context.
|
// string may returned if the version was not set on the context.
|
||||||
func GetVersion(ctx Context) string {
|
func GetVersion(ctx context.Context) string {
|
||||||
return GetStringValue(ctx, "version")
|
return GetStringValue(ctx, versionKey{})
|
||||||
}
|
}
|
||||||
|
|
2
vendor/github.com/docker/distribution/manifest/schema1/config_builder.go
generated
vendored
2
vendor/github.com/docker/distribution/manifest/schema1/config_builder.go
generated
vendored
|
@ -1,6 +1,7 @@
|
||||||
package schema1
|
package schema1
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"context"
|
||||||
"crypto/sha512"
|
"crypto/sha512"
|
||||||
"encoding/json"
|
"encoding/json"
|
||||||
"errors"
|
"errors"
|
||||||
|
@ -8,7 +9,6 @@ import (
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
"github.com/docker/distribution"
|
"github.com/docker/distribution"
|
||||||
"github.com/docker/distribution/context"
|
|
||||||
"github.com/docker/distribution/manifest"
|
"github.com/docker/distribution/manifest"
|
||||||
"github.com/docker/distribution/reference"
|
"github.com/docker/distribution/reference"
|
||||||
"github.com/docker/libtrust"
|
"github.com/docker/libtrust"
|
||||||
|
|
4
vendor/github.com/docker/distribution/manifest/schema1/reference_builder.go
generated
vendored
4
vendor/github.com/docker/distribution/manifest/schema1/reference_builder.go
generated
vendored
|
@ -1,11 +1,11 @@
|
||||||
package schema1
|
package schema1
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"context"
|
||||||
|
"errors"
|
||||||
"fmt"
|
"fmt"
|
||||||
|
|
||||||
"errors"
|
|
||||||
"github.com/docker/distribution"
|
"github.com/docker/distribution"
|
||||||
"github.com/docker/distribution/context"
|
|
||||||
"github.com/docker/distribution/manifest"
|
"github.com/docker/distribution/manifest"
|
||||||
"github.com/docker/distribution/reference"
|
"github.com/docker/distribution/reference"
|
||||||
"github.com/docker/libtrust"
|
"github.com/docker/libtrust"
|
||||||
|
|
2
vendor/github.com/docker/distribution/manifest/schema1/verify.go
generated
vendored
2
vendor/github.com/docker/distribution/manifest/schema1/verify.go
generated
vendored
|
@ -3,8 +3,8 @@ package schema1
|
||||||
import (
|
import (
|
||||||
"crypto/x509"
|
"crypto/x509"
|
||||||
|
|
||||||
"github.com/Sirupsen/logrus"
|
|
||||||
"github.com/docker/libtrust"
|
"github.com/docker/libtrust"
|
||||||
|
"github.com/sirupsen/logrus"
|
||||||
)
|
)
|
||||||
|
|
||||||
// Verify verifies the signature of the signed manifest returning the public
|
// Verify verifies the signature of the signed manifest returning the public
|
||||||
|
|
3
vendor/github.com/docker/distribution/manifest/schema2/builder.go
generated
vendored
3
vendor/github.com/docker/distribution/manifest/schema2/builder.go
generated
vendored
|
@ -1,8 +1,9 @@
|
||||||
package schema2
|
package schema2
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"context"
|
||||||
|
|
||||||
"github.com/docker/distribution"
|
"github.com/docker/distribution"
|
||||||
"github.com/docker/distribution/context"
|
|
||||||
"github.com/opencontainers/go-digest"
|
"github.com/opencontainers/go-digest"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
2
vendor/github.com/docker/distribution/manifests.go
generated
vendored
2
vendor/github.com/docker/distribution/manifests.go
generated
vendored
|
@ -1,10 +1,10 @@
|
||||||
package distribution
|
package distribution
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"context"
|
||||||
"fmt"
|
"fmt"
|
||||||
"mime"
|
"mime"
|
||||||
|
|
||||||
"github.com/docker/distribution/context"
|
|
||||||
"github.com/opencontainers/go-digest"
|
"github.com/opencontainers/go-digest"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
2
vendor/github.com/docker/distribution/reference/reference.go
generated
vendored
2
vendor/github.com/docker/distribution/reference/reference.go
generated
vendored
|
@ -15,7 +15,7 @@
|
||||||
// tag := /[\w][\w.-]{0,127}/
|
// tag := /[\w][\w.-]{0,127}/
|
||||||
//
|
//
|
||||||
// digest := digest-algorithm ":" digest-hex
|
// digest := digest-algorithm ":" digest-hex
|
||||||
// digest-algorithm := digest-algorithm-component [ digest-algorithm-separator digest-algorithm-component ]
|
// digest-algorithm := digest-algorithm-component [ digest-algorithm-separator digest-algorithm-component ]*
|
||||||
// digest-algorithm-separator := /[+.-_]/
|
// digest-algorithm-separator := /[+.-_]/
|
||||||
// digest-algorithm-component := /[A-Za-z][A-Za-z0-9]*/
|
// digest-algorithm-component := /[A-Za-z][A-Za-z0-9]*/
|
||||||
// digest-hex := /[0-9a-fA-F]{32,}/ ; At least 128 bit digest value
|
// digest-hex := /[0-9a-fA-F]{32,}/ ; At least 128 bit digest value
|
||||||
|
|
18
vendor/github.com/docker/distribution/registry.go
generated
vendored
18
vendor/github.com/docker/distribution/registry.go
generated
vendored
|
@ -1,7 +1,8 @@
|
||||||
package distribution
|
package distribution
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"github.com/docker/distribution/context"
|
"context"
|
||||||
|
|
||||||
"github.com/docker/distribution/reference"
|
"github.com/docker/distribution/reference"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
@ -72,6 +73,21 @@ func (o WithTagOption) Apply(m ManifestService) error {
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// WithManifestMediaTypes lists the media types the client wishes
|
||||||
|
// the server to provide.
|
||||||
|
func WithManifestMediaTypes(mediaTypes []string) ManifestServiceOption {
|
||||||
|
return WithManifestMediaTypesOption{mediaTypes}
|
||||||
|
}
|
||||||
|
|
||||||
|
// WithManifestMediaTypesOption holds a list of accepted media types
|
||||||
|
type WithManifestMediaTypesOption struct{ MediaTypes []string }
|
||||||
|
|
||||||
|
// Apply conforms to the ManifestServiceOption interface
|
||||||
|
func (o WithManifestMediaTypesOption) Apply(m ManifestService) error {
|
||||||
|
// no implementation
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
// Repository is a named collection of manifests and layers.
|
// Repository is a named collection of manifests and layers.
|
||||||
type Repository interface {
|
type Repository interface {
|
||||||
// Named returns the name of the repository.
|
// Named returns the name of the repository.
|
||||||
|
|
2
vendor/github.com/docker/distribution/tags.go
generated
vendored
2
vendor/github.com/docker/distribution/tags.go
generated
vendored
|
@ -1,7 +1,7 @@
|
||||||
package distribution
|
package distribution
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"github.com/docker/distribution/context"
|
"context"
|
||||||
)
|
)
|
||||||
|
|
||||||
// TagService provides access to information about tagged objects.
|
// TagService provides access to information about tagged objects.
|
||||||
|
|
191
vendor/github.com/docker/docker/api/LICENSE
generated
vendored
191
vendor/github.com/docker/docker/api/LICENSE
generated
vendored
|
@ -1,191 +0,0 @@
|
||||||
|
|
||||||
Apache License
|
|
||||||
Version 2.0, January 2004
|
|
||||||
https://www.apache.org/licenses/
|
|
||||||
|
|
||||||
TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
|
|
||||||
|
|
||||||
1. Definitions.
|
|
||||||
|
|
||||||
"License" shall mean the terms and conditions for use, reproduction,
|
|
||||||
and distribution as defined by Sections 1 through 9 of this document.
|
|
||||||
|
|
||||||
"Licensor" shall mean the copyright owner or entity authorized by
|
|
||||||
the copyright owner that is granting the License.
|
|
||||||
|
|
||||||
"Legal Entity" shall mean the union of the acting entity and all
|
|
||||||
other entities that control, are controlled by, or are under common
|
|
||||||
control with that entity. For the purposes of this definition,
|
|
||||||
"control" means (i) the power, direct or indirect, to cause the
|
|
||||||
direction or management of such entity, whether by contract or
|
|
||||||
otherwise, or (ii) ownership of fifty percent (50%) or more of the
|
|
||||||
outstanding shares, or (iii) beneficial ownership of such entity.
|
|
||||||
|
|
||||||
"You" (or "Your") shall mean an individual or Legal Entity
|
|
||||||
exercising permissions granted by this License.
|
|
||||||
|
|
||||||
"Source" form shall mean the preferred form for making modifications,
|
|
||||||
including but not limited to software source code, documentation
|
|
||||||
source, and configuration files.
|
|
||||||
|
|
||||||
"Object" form shall mean any form resulting from mechanical
|
|
||||||
transformation or translation of a Source form, including but
|
|
||||||
not limited to compiled object code, generated documentation,
|
|
||||||
and conversions to other media types.
|
|
||||||
|
|
||||||
"Work" shall mean the work of authorship, whether in Source or
|
|
||||||
Object form, made available under the License, as indicated by a
|
|
||||||
copyright notice that is included in or attached to the work
|
|
||||||
(an example is provided in the Appendix below).
|
|
||||||
|
|
||||||
"Derivative Works" shall mean any work, whether in Source or Object
|
|
||||||
form, that is based on (or derived from) the Work and for which the
|
|
||||||
editorial revisions, annotations, elaborations, or other modifications
|
|
||||||
represent, as a whole, an original work of authorship. For the purposes
|
|
||||||
of this License, Derivative Works shall not include works that remain
|
|
||||||
separable from, or merely link (or bind by name) to the interfaces of,
|
|
||||||
the Work and Derivative Works thereof.
|
|
||||||
|
|
||||||
"Contribution" shall mean any work of authorship, including
|
|
||||||
the original version of the Work and any modifications or additions
|
|
||||||
to that Work or Derivative Works thereof, that is intentionally
|
|
||||||
submitted to Licensor for inclusion in the Work by the copyright owner
|
|
||||||
or by an individual or Legal Entity authorized to submit on behalf of
|
|
||||||
the copyright owner. For the purposes of this definition, "submitted"
|
|
||||||
means any form of electronic, verbal, or written communication sent
|
|
||||||
to the Licensor or its representatives, including but not limited to
|
|
||||||
communication on electronic mailing lists, source code control systems,
|
|
||||||
and issue tracking systems that are managed by, or on behalf of, the
|
|
||||||
Licensor for the purpose of discussing and improving the Work, but
|
|
||||||
excluding communication that is conspicuously marked or otherwise
|
|
||||||
designated in writing by the copyright owner as "Not a Contribution."
|
|
||||||
|
|
||||||
"Contributor" shall mean Licensor and any individual or Legal Entity
|
|
||||||
on behalf of whom a Contribution has been received by Licensor and
|
|
||||||
subsequently incorporated within the Work.
|
|
||||||
|
|
||||||
2. Grant of Copyright License. Subject to the terms and conditions of
|
|
||||||
this License, each Contributor hereby grants to You a perpetual,
|
|
||||||
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
|
|
||||||
copyright license to reproduce, prepare Derivative Works of,
|
|
||||||
publicly display, publicly perform, sublicense, and distribute the
|
|
||||||
Work and such Derivative Works in Source or Object form.
|
|
||||||
|
|
||||||
3. Grant of Patent License. Subject to the terms and conditions of
|
|
||||||
this License, each Contributor hereby grants to You a perpetual,
|
|
||||||
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
|
|
||||||
(except as stated in this section) patent license to make, have made,
|
|
||||||
use, offer to sell, sell, import, and otherwise transfer the Work,
|
|
||||||
where such license applies only to those patent claims licensable
|
|
||||||
by such Contributor that are necessarily infringed by their
|
|
||||||
Contribution(s) alone or by combination of their Contribution(s)
|
|
||||||
with the Work to which such Contribution(s) was submitted. If You
|
|
||||||
institute patent litigation against any entity (including a
|
|
||||||
cross-claim or counterclaim in a lawsuit) alleging that the Work
|
|
||||||
or a Contribution incorporated within the Work constitutes direct
|
|
||||||
or contributory patent infringement, then any patent licenses
|
|
||||||
granted to You under this License for that Work shall terminate
|
|
||||||
as of the date such litigation is filed.
|
|
||||||
|
|
||||||
4. Redistribution. You may reproduce and distribute copies of the
|
|
||||||
Work or Derivative Works thereof in any medium, with or without
|
|
||||||
modifications, and in Source or Object form, provided that You
|
|
||||||
meet the following conditions:
|
|
||||||
|
|
||||||
(a) You must give any other recipients of the Work or
|
|
||||||
Derivative Works a copy of this License; and
|
|
||||||
|
|
||||||
(b) You must cause any modified files to carry prominent notices
|
|
||||||
stating that You changed the files; and
|
|
||||||
|
|
||||||
(c) You must retain, in the Source form of any Derivative Works
|
|
||||||
that You distribute, all copyright, patent, trademark, and
|
|
||||||
attribution notices from the Source form of the Work,
|
|
||||||
excluding those notices that do not pertain to any part of
|
|
||||||
the Derivative Works; and
|
|
||||||
|
|
||||||
(d) If the Work includes a "NOTICE" text file as part of its
|
|
||||||
distribution, then any Derivative Works that You distribute must
|
|
||||||
include a readable copy of the attribution notices contained
|
|
||||||
within such NOTICE file, excluding those notices that do not
|
|
||||||
pertain to any part of the Derivative Works, in at least one
|
|
||||||
of the following places: within a NOTICE text file distributed
|
|
||||||
as part of the Derivative Works; within the Source form or
|
|
||||||
documentation, if provided along with the Derivative Works; or,
|
|
||||||
within a display generated by the Derivative Works, if and
|
|
||||||
wherever such third-party notices normally appear. The contents
|
|
||||||
of the NOTICE file are for informational purposes only and
|
|
||||||
do not modify the License. You may add Your own attribution
|
|
||||||
notices within Derivative Works that You distribute, alongside
|
|
||||||
or as an addendum to the NOTICE text from the Work, provided
|
|
||||||
that such additional attribution notices cannot be construed
|
|
||||||
as modifying the License.
|
|
||||||
|
|
||||||
You may add Your own copyright statement to Your modifications and
|
|
||||||
may provide additional or different license terms and conditions
|
|
||||||
for use, reproduction, or distribution of Your modifications, or
|
|
||||||
for any such Derivative Works as a whole, provided Your use,
|
|
||||||
reproduction, and distribution of the Work otherwise complies with
|
|
||||||
the conditions stated in this License.
|
|
||||||
|
|
||||||
5. Submission of Contributions. Unless You explicitly state otherwise,
|
|
||||||
any Contribution intentionally submitted for inclusion in the Work
|
|
||||||
by You to the Licensor shall be under the terms and conditions of
|
|
||||||
this License, without any additional terms or conditions.
|
|
||||||
Notwithstanding the above, nothing herein shall supersede or modify
|
|
||||||
the terms of any separate license agreement you may have executed
|
|
||||||
with Licensor regarding such Contributions.
|
|
||||||
|
|
||||||
6. Trademarks. This License does not grant permission to use the trade
|
|
||||||
names, trademarks, service marks, or product names of the Licensor,
|
|
||||||
except as required for reasonable and customary use in describing the
|
|
||||||
origin of the Work and reproducing the content of the NOTICE file.
|
|
||||||
|
|
||||||
7. Disclaimer of Warranty. Unless required by applicable law or
|
|
||||||
agreed to in writing, Licensor provides the Work (and each
|
|
||||||
Contributor provides its Contributions) on an "AS IS" BASIS,
|
|
||||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
|
|
||||||
implied, including, without limitation, any warranties or conditions
|
|
||||||
of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
|
|
||||||
PARTICULAR PURPOSE. You are solely responsible for determining the
|
|
||||||
appropriateness of using or redistributing the Work and assume any
|
|
||||||
risks associated with Your exercise of permissions under this License.
|
|
||||||
|
|
||||||
8. Limitation of Liability. In no event and under no legal theory,
|
|
||||||
whether in tort (including negligence), contract, or otherwise,
|
|
||||||
unless required by applicable law (such as deliberate and grossly
|
|
||||||
negligent acts) or agreed to in writing, shall any Contributor be
|
|
||||||
liable to You for damages, including any direct, indirect, special,
|
|
||||||
incidental, or consequential damages of any character arising as a
|
|
||||||
result of this License or out of the use or inability to use the
|
|
||||||
Work (including but not limited to damages for loss of goodwill,
|
|
||||||
work stoppage, computer failure or malfunction, or any and all
|
|
||||||
other commercial damages or losses), even if such Contributor
|
|
||||||
has been advised of the possibility of such damages.
|
|
||||||
|
|
||||||
9. Accepting Warranty or Additional Liability. While redistributing
|
|
||||||
the Work or Derivative Works thereof, You may choose to offer,
|
|
||||||
and charge a fee for, acceptance of support, warranty, indemnity,
|
|
||||||
or other liability obligations and/or rights consistent with this
|
|
||||||
License. However, in accepting such obligations, You may act only
|
|
||||||
on Your own behalf and on Your sole responsibility, not on behalf
|
|
||||||
of any other Contributor, and only if You agree to indemnify,
|
|
||||||
defend, and hold each Contributor harmless for any liability
|
|
||||||
incurred by, or claims asserted against, such Contributor by reason
|
|
||||||
of your accepting any such warranty or additional liability.
|
|
||||||
|
|
||||||
END OF TERMS AND CONDITIONS
|
|
||||||
|
|
||||||
Copyright 2013-2017 Docker, Inc.
|
|
||||||
|
|
||||||
Licensed under the Apache License, Version 2.0 (the "License");
|
|
||||||
you may not use this file except in compliance with the License.
|
|
||||||
You may obtain a copy of the License at
|
|
||||||
|
|
||||||
https://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
|
|
||||||
Unless required by applicable law or agreed to in writing, software
|
|
||||||
distributed under the License is distributed on an "AS IS" BASIS,
|
|
||||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
||||||
See the License for the specific language governing permissions and
|
|
||||||
limitations under the License.
|
|
157
vendor/github.com/docker/docker/api/common.go
generated
vendored
157
vendor/github.com/docker/docker/api/common.go
generated
vendored
|
@ -1,166 +1,11 @@
|
||||||
package api
|
package api
|
||||||
|
|
||||||
import (
|
|
||||||
"encoding/json"
|
|
||||||
"encoding/pem"
|
|
||||||
"fmt"
|
|
||||||
"mime"
|
|
||||||
"os"
|
|
||||||
"path/filepath"
|
|
||||||
"sort"
|
|
||||||
"strconv"
|
|
||||||
"strings"
|
|
||||||
|
|
||||||
"github.com/Sirupsen/logrus"
|
|
||||||
"github.com/docker/docker/api/types"
|
|
||||||
"github.com/docker/docker/pkg/ioutils"
|
|
||||||
"github.com/docker/docker/pkg/system"
|
|
||||||
"github.com/docker/libtrust"
|
|
||||||
)
|
|
||||||
|
|
||||||
// Common constants for daemon and client.
|
// Common constants for daemon and client.
|
||||||
const (
|
const (
|
||||||
// DefaultVersion of Current REST API
|
// DefaultVersion of Current REST API
|
||||||
DefaultVersion string = "1.29"
|
DefaultVersion string = "1.36"
|
||||||
|
|
||||||
// NoBaseImageSpecifier is the symbol used by the FROM
|
// NoBaseImageSpecifier is the symbol used by the FROM
|
||||||
// command to specify that no base image is to be used.
|
// command to specify that no base image is to be used.
|
||||||
NoBaseImageSpecifier string = "scratch"
|
NoBaseImageSpecifier string = "scratch"
|
||||||
)
|
)
|
||||||
|
|
||||||
// byPortInfo is a temporary type used to sort types.Port by its fields
|
|
||||||
type byPortInfo []types.Port
|
|
||||||
|
|
||||||
func (r byPortInfo) Len() int { return len(r) }
|
|
||||||
func (r byPortInfo) Swap(i, j int) { r[i], r[j] = r[j], r[i] }
|
|
||||||
func (r byPortInfo) Less(i, j int) bool {
|
|
||||||
if r[i].PrivatePort != r[j].PrivatePort {
|
|
||||||
return r[i].PrivatePort < r[j].PrivatePort
|
|
||||||
}
|
|
||||||
|
|
||||||
if r[i].IP != r[j].IP {
|
|
||||||
return r[i].IP < r[j].IP
|
|
||||||
}
|
|
||||||
|
|
||||||
if r[i].PublicPort != r[j].PublicPort {
|
|
||||||
return r[i].PublicPort < r[j].PublicPort
|
|
||||||
}
|
|
||||||
|
|
||||||
return r[i].Type < r[j].Type
|
|
||||||
}
|
|
||||||
|
|
||||||
// DisplayablePorts returns formatted string representing open ports of container
|
|
||||||
// e.g. "0.0.0.0:80->9090/tcp, 9988/tcp"
|
|
||||||
// it's used by command 'docker ps'
|
|
||||||
func DisplayablePorts(ports []types.Port) string {
|
|
||||||
type portGroup struct {
|
|
||||||
first uint16
|
|
||||||
last uint16
|
|
||||||
}
|
|
||||||
groupMap := make(map[string]*portGroup)
|
|
||||||
var result []string
|
|
||||||
var hostMappings []string
|
|
||||||
var groupMapKeys []string
|
|
||||||
sort.Sort(byPortInfo(ports))
|
|
||||||
for _, port := range ports {
|
|
||||||
current := port.PrivatePort
|
|
||||||
portKey := port.Type
|
|
||||||
if port.IP != "" {
|
|
||||||
if port.PublicPort != current {
|
|
||||||
hostMappings = append(hostMappings, fmt.Sprintf("%s:%d->%d/%s", port.IP, port.PublicPort, port.PrivatePort, port.Type))
|
|
||||||
continue
|
|
||||||
}
|
|
||||||
portKey = fmt.Sprintf("%s/%s", port.IP, port.Type)
|
|
||||||
}
|
|
||||||
group := groupMap[portKey]
|
|
||||||
|
|
||||||
if group == nil {
|
|
||||||
groupMap[portKey] = &portGroup{first: current, last: current}
|
|
||||||
// record order that groupMap keys are created
|
|
||||||
groupMapKeys = append(groupMapKeys, portKey)
|
|
||||||
continue
|
|
||||||
}
|
|
||||||
if current == (group.last + 1) {
|
|
||||||
group.last = current
|
|
||||||
continue
|
|
||||||
}
|
|
||||||
|
|
||||||
result = append(result, formGroup(portKey, group.first, group.last))
|
|
||||||
groupMap[portKey] = &portGroup{first: current, last: current}
|
|
||||||
}
|
|
||||||
for _, portKey := range groupMapKeys {
|
|
||||||
g := groupMap[portKey]
|
|
||||||
result = append(result, formGroup(portKey, g.first, g.last))
|
|
||||||
}
|
|
||||||
result = append(result, hostMappings...)
|
|
||||||
return strings.Join(result, ", ")
|
|
||||||
}
|
|
||||||
|
|
||||||
func formGroup(key string, start, last uint16) string {
|
|
||||||
parts := strings.Split(key, "/")
|
|
||||||
groupType := parts[0]
|
|
||||||
var ip string
|
|
||||||
if len(parts) > 1 {
|
|
||||||
ip = parts[0]
|
|
||||||
groupType = parts[1]
|
|
||||||
}
|
|
||||||
group := strconv.Itoa(int(start))
|
|
||||||
if start != last {
|
|
||||||
group = fmt.Sprintf("%s-%d", group, last)
|
|
||||||
}
|
|
||||||
if ip != "" {
|
|
||||||
group = fmt.Sprintf("%s:%s->%s", ip, group, group)
|
|
||||||
}
|
|
||||||
return fmt.Sprintf("%s/%s", group, groupType)
|
|
||||||
}
|
|
||||||
|
|
||||||
// MatchesContentType validates the content type against the expected one
|
|
||||||
func MatchesContentType(contentType, expectedType string) bool {
|
|
||||||
mimetype, _, err := mime.ParseMediaType(contentType)
|
|
||||||
if err != nil {
|
|
||||||
logrus.Errorf("Error parsing media type: %s error: %v", contentType, err)
|
|
||||||
}
|
|
||||||
return err == nil && mimetype == expectedType
|
|
||||||
}
|
|
||||||
|
|
||||||
// LoadOrCreateTrustKey attempts to load the libtrust key at the given path,
|
|
||||||
// otherwise generates a new one
|
|
||||||
func LoadOrCreateTrustKey(trustKeyPath string) (libtrust.PrivateKey, error) {
|
|
||||||
err := system.MkdirAll(filepath.Dir(trustKeyPath), 0700)
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
trustKey, err := libtrust.LoadKeyFile(trustKeyPath)
|
|
||||||
if err == libtrust.ErrKeyFileDoesNotExist {
|
|
||||||
trustKey, err = libtrust.GenerateECP256PrivateKey()
|
|
||||||
if err != nil {
|
|
||||||
return nil, fmt.Errorf("Error generating key: %s", err)
|
|
||||||
}
|
|
||||||
encodedKey, err := serializePrivateKey(trustKey, filepath.Ext(trustKeyPath))
|
|
||||||
if err != nil {
|
|
||||||
return nil, fmt.Errorf("Error serializing key: %s", err)
|
|
||||||
}
|
|
||||||
if err := ioutils.AtomicWriteFile(trustKeyPath, encodedKey, os.FileMode(0600)); err != nil {
|
|
||||||
return nil, fmt.Errorf("Error saving key file: %s", err)
|
|
||||||
}
|
|
||||||
} else if err != nil {
|
|
||||||
return nil, fmt.Errorf("Error loading key file %s: %s", trustKeyPath, err)
|
|
||||||
}
|
|
||||||
return trustKey, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func serializePrivateKey(key libtrust.PrivateKey, ext string) (encoded []byte, err error) {
|
|
||||||
if ext == ".json" || ext == ".jwk" {
|
|
||||||
encoded, err = json.Marshal(key)
|
|
||||||
if err != nil {
|
|
||||||
return nil, fmt.Errorf("unable to encode private key JWK: %s", err)
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
pemBlock, err := key.PEMBlock()
|
|
||||||
if err != nil {
|
|
||||||
return nil, fmt.Errorf("unable to encode private key PEM: %s", err)
|
|
||||||
}
|
|
||||||
encoded = pem.EncodeToMemory(pemBlock)
|
|
||||||
}
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
9
vendor/github.com/docker/docker/api/names.go
generated
vendored
9
vendor/github.com/docker/docker/api/names.go
generated
vendored
|
@ -1,9 +0,0 @@
|
||||||
package api
|
|
||||||
|
|
||||||
import "regexp"
|
|
||||||
|
|
||||||
// RestrictedNameChars collects the characters allowed to represent a name, normally used to validate container and volume names.
|
|
||||||
const RestrictedNameChars = `[a-zA-Z0-9][a-zA-Z0-9_.-]`
|
|
||||||
|
|
||||||
// RestrictedNamePattern is a regular expression to validate names against the collection of restricted characters.
|
|
||||||
var RestrictedNamePattern = regexp.MustCompile(`^` + RestrictedNameChars + `+$`)
|
|
40
vendor/github.com/docker/docker/api/types/client.go
generated
vendored
40
vendor/github.com/docker/docker/api/types/client.go
generated
vendored
|
@ -7,7 +7,7 @@ import (
|
||||||
|
|
||||||
"github.com/docker/docker/api/types/container"
|
"github.com/docker/docker/api/types/container"
|
||||||
"github.com/docker/docker/api/types/filters"
|
"github.com/docker/docker/api/types/filters"
|
||||||
"github.com/docker/go-units"
|
units "github.com/docker/go-units"
|
||||||
)
|
)
|
||||||
|
|
||||||
// CheckpointCreateOptions holds parameters to create a checkpoint from a container
|
// CheckpointCreateOptions holds parameters to create a checkpoint from a container
|
||||||
|
@ -74,6 +74,7 @@ type ContainerLogsOptions struct {
|
||||||
ShowStdout bool
|
ShowStdout bool
|
||||||
ShowStderr bool
|
ShowStderr bool
|
||||||
Since string
|
Since string
|
||||||
|
Until string
|
||||||
Timestamps bool
|
Timestamps bool
|
||||||
Follow bool
|
Follow bool
|
||||||
Tail string
|
Tail string
|
||||||
|
@ -97,6 +98,7 @@ type ContainerStartOptions struct {
|
||||||
// about files to copy into a container
|
// about files to copy into a container
|
||||||
type CopyToContainerOptions struct {
|
type CopyToContainerOptions struct {
|
||||||
AllowOverwriteDirWithFile bool
|
AllowOverwriteDirWithFile bool
|
||||||
|
CopyUIDGID bool
|
||||||
}
|
}
|
||||||
|
|
||||||
// EventsOptions holds parameters to filter events with.
|
// EventsOptions holds parameters to filter events with.
|
||||||
|
@ -176,6 +178,9 @@ type ImageBuildOptions struct {
|
||||||
CacheFrom []string
|
CacheFrom []string
|
||||||
SecurityOpt []string
|
SecurityOpt []string
|
||||||
ExtraHosts []string // List of extra hosts
|
ExtraHosts []string // List of extra hosts
|
||||||
|
Target string
|
||||||
|
SessionID string
|
||||||
|
Platform string
|
||||||
}
|
}
|
||||||
|
|
||||||
// ImageBuildResponse holds information
|
// ImageBuildResponse holds information
|
||||||
|
@ -188,7 +193,8 @@ type ImageBuildResponse struct {
|
||||||
|
|
||||||
// ImageCreateOptions holds information to create images.
|
// ImageCreateOptions holds information to create images.
|
||||||
type ImageCreateOptions struct {
|
type ImageCreateOptions struct {
|
||||||
RegistryAuth string // RegistryAuth is the base64 encoded credentials for the registry
|
RegistryAuth string // RegistryAuth is the base64 encoded credentials for the registry.
|
||||||
|
Platform string // Platform is the target platform of the image if it needs to be pulled from the registry.
|
||||||
}
|
}
|
||||||
|
|
||||||
// ImageImportSource holds source information for ImageImport
|
// ImageImportSource holds source information for ImageImport
|
||||||
|
@ -199,9 +205,10 @@ type ImageImportSource struct {
|
||||||
|
|
||||||
// ImageImportOptions holds information to import images from the client host.
|
// ImageImportOptions holds information to import images from the client host.
|
||||||
type ImageImportOptions struct {
|
type ImageImportOptions struct {
|
||||||
Tag string // Tag is the name to tag this image with. This attribute is deprecated.
|
Tag string // Tag is the name to tag this image with. This attribute is deprecated.
|
||||||
Message string // Message is the message to tag the image with
|
Message string // Message is the message to tag the image with
|
||||||
Changes []string // Changes are the raw changes to apply to this image
|
Changes []string // Changes are the raw changes to apply to this image
|
||||||
|
Platform string // Platform is the target platform of the image
|
||||||
}
|
}
|
||||||
|
|
||||||
// ImageListOptions holds parameters to filter the list of images with.
|
// ImageListOptions holds parameters to filter the list of images with.
|
||||||
|
@ -222,6 +229,7 @@ type ImagePullOptions struct {
|
||||||
All bool
|
All bool
|
||||||
RegistryAuth string // RegistryAuth is the base64 encoded credentials for the registry
|
RegistryAuth string // RegistryAuth is the base64 encoded credentials for the registry
|
||||||
PrivilegeFunc RequestPrivilegeFunc
|
PrivilegeFunc RequestPrivilegeFunc
|
||||||
|
Platform string
|
||||||
}
|
}
|
||||||
|
|
||||||
// RequestPrivilegeFunc is a function interface that
|
// RequestPrivilegeFunc is a function interface that
|
||||||
|
@ -274,6 +282,12 @@ type ServiceCreateOptions struct {
|
||||||
//
|
//
|
||||||
// This field follows the format of the X-Registry-Auth header.
|
// This field follows the format of the X-Registry-Auth header.
|
||||||
EncodedRegistryAuth string
|
EncodedRegistryAuth string
|
||||||
|
|
||||||
|
// QueryRegistry indicates whether the service update requires
|
||||||
|
// contacting a registry. A registry may be contacted to retrieve
|
||||||
|
// the image digest and manifest, which in turn can be used to update
|
||||||
|
// platform or other information about the service.
|
||||||
|
QueryRegistry bool
|
||||||
}
|
}
|
||||||
|
|
||||||
// ServiceCreateResponse contains the information returned to a client
|
// ServiceCreateResponse contains the information returned to a client
|
||||||
|
@ -313,14 +327,26 @@ type ServiceUpdateOptions struct {
|
||||||
// The valid values are "previous" and "none". An empty value is the
|
// The valid values are "previous" and "none". An empty value is the
|
||||||
// same as "none".
|
// same as "none".
|
||||||
Rollback string
|
Rollback string
|
||||||
|
|
||||||
|
// QueryRegistry indicates whether the service update requires
|
||||||
|
// contacting a registry. A registry may be contacted to retrieve
|
||||||
|
// the image digest and manifest, which in turn can be used to update
|
||||||
|
// platform or other information about the service.
|
||||||
|
QueryRegistry bool
|
||||||
}
|
}
|
||||||
|
|
||||||
// ServiceListOptions holds parameters to list services with.
|
// ServiceListOptions holds parameters to list services with.
|
||||||
type ServiceListOptions struct {
|
type ServiceListOptions struct {
|
||||||
Filters filters.Args
|
Filters filters.Args
|
||||||
}
|
}
|
||||||
|
|
||||||
// TaskListOptions holds parameters to list tasks with.
|
// ServiceInspectOptions holds parameters related to the "service inspect"
|
||||||
|
// operation.
|
||||||
|
type ServiceInspectOptions struct {
|
||||||
|
InsertDefaults bool
|
||||||
|
}
|
||||||
|
|
||||||
|
// TaskListOptions holds parameters to list tasks with.
|
||||||
type TaskListOptions struct {
|
type TaskListOptions struct {
|
||||||
Filters filters.Args
|
Filters filters.Args
|
||||||
}
|
}
|
||||||
|
|
1
vendor/github.com/docker/docker/api/types/configs.go
generated
vendored
1
vendor/github.com/docker/docker/api/types/configs.go
generated
vendored
|
@ -50,6 +50,7 @@ type ExecConfig struct {
|
||||||
Detach bool // Execute in detach mode
|
Detach bool // Execute in detach mode
|
||||||
DetachKeys string // Escape keys for detach
|
DetachKeys string // Escape keys for detach
|
||||||
Env []string // Environment variables
|
Env []string // Environment variables
|
||||||
|
WorkingDir string // Working directory
|
||||||
Cmd []string // Execution commands and args
|
Cmd []string // Execution commands and args
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
11
vendor/github.com/docker/docker/api/types/container/config.go
generated
vendored
11
vendor/github.com/docker/docker/api/types/container/config.go
generated
vendored
|
@ -7,6 +7,12 @@ import (
|
||||||
"github.com/docker/go-connections/nat"
|
"github.com/docker/go-connections/nat"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
// MinimumDuration puts a minimum on user configured duration.
|
||||||
|
// This is to prevent API error on time unit. For example, API may
|
||||||
|
// set 3 as healthcheck interval with intention of 3 seconds, but
|
||||||
|
// Docker interprets it as 3 nanoseconds.
|
||||||
|
const MinimumDuration = 1 * time.Millisecond
|
||||||
|
|
||||||
// HealthConfig holds configuration settings for the HEALTHCHECK feature.
|
// HealthConfig holds configuration settings for the HEALTHCHECK feature.
|
||||||
type HealthConfig struct {
|
type HealthConfig struct {
|
||||||
// Test is the test to perform to check that the container is healthy.
|
// Test is the test to perform to check that the container is healthy.
|
||||||
|
@ -19,8 +25,9 @@ type HealthConfig struct {
|
||||||
Test []string `json:",omitempty"`
|
Test []string `json:",omitempty"`
|
||||||
|
|
||||||
// Zero means to inherit. Durations are expressed as integer nanoseconds.
|
// Zero means to inherit. Durations are expressed as integer nanoseconds.
|
||||||
Interval time.Duration `json:",omitempty"` // Interval is the time to wait between checks.
|
Interval time.Duration `json:",omitempty"` // Interval is the time to wait between checks.
|
||||||
Timeout time.Duration `json:",omitempty"` // Timeout is the time to wait before considering the check to have hung.
|
Timeout time.Duration `json:",omitempty"` // Timeout is the time to wait before considering the check to have hung.
|
||||||
|
StartPeriod time.Duration `json:",omitempty"` // The start period for the container to initialize before the retries starts to count down.
|
||||||
|
|
||||||
// Retries is the number of consecutive failures needed to consider a container as unhealthy.
|
// Retries is the number of consecutive failures needed to consider a container as unhealthy.
|
||||||
// Zero means inherit.
|
// Zero means inherit.
|
||||||
|
|
12
vendor/github.com/docker/docker/api/types/container/container_wait.go
generated
vendored
12
vendor/github.com/docker/docker/api/types/container/container_wait.go
generated
vendored
|
@ -7,10 +7,22 @@ package container
|
||||||
// See hack/generate-swagger-api.sh
|
// See hack/generate-swagger-api.sh
|
||||||
// ----------------------------------------------------------------------------
|
// ----------------------------------------------------------------------------
|
||||||
|
|
||||||
|
// ContainerWaitOKBodyError container waiting error, if any
|
||||||
|
// swagger:model ContainerWaitOKBodyError
|
||||||
|
type ContainerWaitOKBodyError struct {
|
||||||
|
|
||||||
|
// Details of an error
|
||||||
|
Message string `json:"Message,omitempty"`
|
||||||
|
}
|
||||||
|
|
||||||
// ContainerWaitOKBody container wait o k body
|
// ContainerWaitOKBody container wait o k body
|
||||||
// swagger:model ContainerWaitOKBody
|
// swagger:model ContainerWaitOKBody
|
||||||
type ContainerWaitOKBody struct {
|
type ContainerWaitOKBody struct {
|
||||||
|
|
||||||
|
// error
|
||||||
|
// Required: true
|
||||||
|
Error *ContainerWaitOKBodyError `json:"Error"`
|
||||||
|
|
||||||
// Exit code of the container
|
// Exit code of the container
|
||||||
// Required: true
|
// Required: true
|
||||||
StatusCode int64 `json:"StatusCode"`
|
StatusCode int64 `json:"StatusCode"`
|
||||||
|
|
63
vendor/github.com/docker/docker/api/types/container/host_config.go
generated
vendored
63
vendor/github.com/docker/docker/api/types/container/host_config.go
generated
vendored
|
@ -20,44 +20,70 @@ func (i Isolation) IsDefault() bool {
|
||||||
return strings.ToLower(string(i)) == "default" || string(i) == ""
|
return strings.ToLower(string(i)) == "default" || string(i) == ""
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// IsHyperV indicates the use of a Hyper-V partition for isolation
|
||||||
|
func (i Isolation) IsHyperV() bool {
|
||||||
|
return strings.ToLower(string(i)) == "hyperv"
|
||||||
|
}
|
||||||
|
|
||||||
|
// IsProcess indicates the use of process isolation
|
||||||
|
func (i Isolation) IsProcess() bool {
|
||||||
|
return strings.ToLower(string(i)) == "process"
|
||||||
|
}
|
||||||
|
|
||||||
|
const (
|
||||||
|
// IsolationEmpty is unspecified (same behavior as default)
|
||||||
|
IsolationEmpty = Isolation("")
|
||||||
|
// IsolationDefault is the default isolation mode on current daemon
|
||||||
|
IsolationDefault = Isolation("default")
|
||||||
|
// IsolationProcess is process isolation mode
|
||||||
|
IsolationProcess = Isolation("process")
|
||||||
|
// IsolationHyperV is HyperV isolation mode
|
||||||
|
IsolationHyperV = Isolation("hyperv")
|
||||||
|
)
|
||||||
|
|
||||||
// IpcMode represents the container ipc stack.
|
// IpcMode represents the container ipc stack.
|
||||||
type IpcMode string
|
type IpcMode string
|
||||||
|
|
||||||
// IsPrivate indicates whether the container uses its private ipc stack.
|
// IsPrivate indicates whether the container uses its own private ipc namespace which can not be shared.
|
||||||
func (n IpcMode) IsPrivate() bool {
|
func (n IpcMode) IsPrivate() bool {
|
||||||
return !(n.IsHost() || n.IsContainer())
|
return n == "private"
|
||||||
}
|
}
|
||||||
|
|
||||||
// IsHost indicates whether the container uses the host's ipc stack.
|
// IsHost indicates whether the container shares the host's ipc namespace.
|
||||||
func (n IpcMode) IsHost() bool {
|
func (n IpcMode) IsHost() bool {
|
||||||
return n == "host"
|
return n == "host"
|
||||||
}
|
}
|
||||||
|
|
||||||
// IsContainer indicates whether the container uses a container's ipc stack.
|
// IsShareable indicates whether the container's ipc namespace can be shared with another container.
|
||||||
|
func (n IpcMode) IsShareable() bool {
|
||||||
|
return n == "shareable"
|
||||||
|
}
|
||||||
|
|
||||||
|
// IsContainer indicates whether the container uses another container's ipc namespace.
|
||||||
func (n IpcMode) IsContainer() bool {
|
func (n IpcMode) IsContainer() bool {
|
||||||
parts := strings.SplitN(string(n), ":", 2)
|
parts := strings.SplitN(string(n), ":", 2)
|
||||||
return len(parts) > 1 && parts[0] == "container"
|
return len(parts) > 1 && parts[0] == "container"
|
||||||
}
|
}
|
||||||
|
|
||||||
// Valid indicates whether the ipc stack is valid.
|
// IsNone indicates whether container IpcMode is set to "none".
|
||||||
|
func (n IpcMode) IsNone() bool {
|
||||||
|
return n == "none"
|
||||||
|
}
|
||||||
|
|
||||||
|
// IsEmpty indicates whether container IpcMode is empty
|
||||||
|
func (n IpcMode) IsEmpty() bool {
|
||||||
|
return n == ""
|
||||||
|
}
|
||||||
|
|
||||||
|
// Valid indicates whether the ipc mode is valid.
|
||||||
func (n IpcMode) Valid() bool {
|
func (n IpcMode) Valid() bool {
|
||||||
parts := strings.Split(string(n), ":")
|
return n.IsEmpty() || n.IsNone() || n.IsPrivate() || n.IsHost() || n.IsShareable() || n.IsContainer()
|
||||||
switch mode := parts[0]; mode {
|
|
||||||
case "", "host":
|
|
||||||
case "container":
|
|
||||||
if len(parts) != 2 || parts[1] == "" {
|
|
||||||
return false
|
|
||||||
}
|
|
||||||
default:
|
|
||||||
return false
|
|
||||||
}
|
|
||||||
return true
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// Container returns the name of the container ipc stack is going to be used.
|
// Container returns the name of the container ipc stack is going to be used.
|
||||||
func (n IpcMode) Container() string {
|
func (n IpcMode) Container() string {
|
||||||
parts := strings.SplitN(string(n), ":", 2)
|
parts := strings.SplitN(string(n), ":", 2)
|
||||||
if len(parts) > 1 {
|
if len(parts) > 1 && parts[0] == "container" {
|
||||||
return parts[1]
|
return parts[1]
|
||||||
}
|
}
|
||||||
return ""
|
return ""
|
||||||
|
@ -377,7 +403,4 @@ type HostConfig struct {
|
||||||
|
|
||||||
// Run a custom init inside the container, if null, use the daemon's configured settings
|
// Run a custom init inside the container, if null, use the daemon's configured settings
|
||||||
Init *bool `json:",omitempty"`
|
Init *bool `json:",omitempty"`
|
||||||
|
|
||||||
// Custom init path
|
|
||||||
InitPath string `json:",omitempty"`
|
|
||||||
}
|
}
|
||||||
|
|
14
vendor/github.com/docker/docker/api/types/container/hostconfig_windows.go
generated
vendored
14
vendor/github.com/docker/docker/api/types/container/hostconfig_windows.go
generated
vendored
|
@ -1,9 +1,5 @@
|
||||||
package container
|
package container
|
||||||
|
|
||||||
import (
|
|
||||||
"strings"
|
|
||||||
)
|
|
||||||
|
|
||||||
// IsBridge indicates whether container uses the bridge network stack
|
// IsBridge indicates whether container uses the bridge network stack
|
||||||
// in windows it is given the name NAT
|
// in windows it is given the name NAT
|
||||||
func (n NetworkMode) IsBridge() bool {
|
func (n NetworkMode) IsBridge() bool {
|
||||||
|
@ -21,16 +17,6 @@ func (n NetworkMode) IsUserDefined() bool {
|
||||||
return !n.IsDefault() && !n.IsNone() && !n.IsBridge() && !n.IsContainer()
|
return !n.IsDefault() && !n.IsNone() && !n.IsBridge() && !n.IsContainer()
|
||||||
}
|
}
|
||||||
|
|
||||||
// IsHyperV indicates the use of a Hyper-V partition for isolation
|
|
||||||
func (i Isolation) IsHyperV() bool {
|
|
||||||
return strings.ToLower(string(i)) == "hyperv"
|
|
||||||
}
|
|
||||||
|
|
||||||
// IsProcess indicates the use of process isolation
|
|
||||||
func (i Isolation) IsProcess() bool {
|
|
||||||
return strings.ToLower(string(i)) == "process"
|
|
||||||
}
|
|
||||||
|
|
||||||
// IsValid indicates if an isolation technology is valid
|
// IsValid indicates if an isolation technology is valid
|
||||||
func (i Isolation) IsValid() bool {
|
func (i Isolation) IsValid() bool {
|
||||||
return i.IsDefault() || i.IsHyperV() || i.IsProcess()
|
return i.IsDefault() || i.IsHyperV() || i.IsProcess()
|
||||||
|
|
10
vendor/github.com/docker/docker/api/types/events/events.go
generated
vendored
10
vendor/github.com/docker/docker/api/types/events/events.go
generated
vendored
|
@ -13,6 +13,14 @@ const (
|
||||||
PluginEventType = "plugin"
|
PluginEventType = "plugin"
|
||||||
// VolumeEventType is the event type that volumes generate
|
// VolumeEventType is the event type that volumes generate
|
||||||
VolumeEventType = "volume"
|
VolumeEventType = "volume"
|
||||||
|
// ServiceEventType is the event type that services generate
|
||||||
|
ServiceEventType = "service"
|
||||||
|
// NodeEventType is the event type that nodes generate
|
||||||
|
NodeEventType = "node"
|
||||||
|
// SecretEventType is the event type that secrets generate
|
||||||
|
SecretEventType = "secret"
|
||||||
|
// ConfigEventType is the event type that configs generate
|
||||||
|
ConfigEventType = "config"
|
||||||
)
|
)
|
||||||
|
|
||||||
// Actor describes something that generates events,
|
// Actor describes something that generates events,
|
||||||
|
@ -36,6 +44,8 @@ type Message struct {
|
||||||
Type string
|
Type string
|
||||||
Action string
|
Action string
|
||||||
Actor Actor
|
Actor Actor
|
||||||
|
// Engine events are local scope. Cluster events are swarm scope.
|
||||||
|
Scope string `json:"scope,omitempty"`
|
||||||
|
|
||||||
Time int64 `json:"time,omitempty"`
|
Time int64 `json:"time,omitempty"`
|
||||||
TimeNano int64 `json:"timeNano,omitempty"`
|
TimeNano int64 `json:"timeNano,omitempty"`
|
||||||
|
|
280
vendor/github.com/docker/docker/api/types/filters/parse.go
generated
vendored
280
vendor/github.com/docker/docker/api/types/filters/parse.go
generated
vendored
|
@ -1,38 +1,45 @@
|
||||||
// Package filters provides helper function to parse and handle command line
|
/*Package filters provides tools for encoding a mapping of keys to a set of
|
||||||
// filter, used for example in docker ps or docker images commands.
|
multiple values.
|
||||||
|
*/
|
||||||
package filters
|
package filters
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"encoding/json"
|
"encoding/json"
|
||||||
"errors"
|
"errors"
|
||||||
"fmt"
|
|
||||||
"regexp"
|
"regexp"
|
||||||
"strings"
|
"strings"
|
||||||
|
|
||||||
"github.com/docker/docker/api/types/versions"
|
"github.com/docker/docker/api/types/versions"
|
||||||
)
|
)
|
||||||
|
|
||||||
// Args stores filter arguments as map key:{map key: bool}.
|
// Args stores a mapping of keys to a set of multiple values.
|
||||||
// It contains an aggregation of the map of arguments (which are in the form
|
|
||||||
// of -f 'key=value') based on the key, and stores values for the same key
|
|
||||||
// in a map with string keys and boolean values.
|
|
||||||
// e.g given -f 'label=label1=1' -f 'label=label2=2' -f 'image.name=ubuntu'
|
|
||||||
// the args will be {"image.name":{"ubuntu":true},"label":{"label1=1":true,"label2=2":true}}
|
|
||||||
type Args struct {
|
type Args struct {
|
||||||
fields map[string]map[string]bool
|
fields map[string]map[string]bool
|
||||||
}
|
}
|
||||||
|
|
||||||
// NewArgs initializes a new Args struct.
|
// KeyValuePair are used to initialize a new Args
|
||||||
func NewArgs() Args {
|
type KeyValuePair struct {
|
||||||
return Args{fields: map[string]map[string]bool{}}
|
Key string
|
||||||
|
Value string
|
||||||
}
|
}
|
||||||
|
|
||||||
// ParseFlag parses the argument to the filter flag. Like
|
// Arg creates a new KeyValuePair for initializing Args
|
||||||
|
func Arg(key, value string) KeyValuePair {
|
||||||
|
return KeyValuePair{Key: key, Value: value}
|
||||||
|
}
|
||||||
|
|
||||||
|
// NewArgs returns a new Args populated with the initial args
|
||||||
|
func NewArgs(initialArgs ...KeyValuePair) Args {
|
||||||
|
args := Args{fields: map[string]map[string]bool{}}
|
||||||
|
for _, arg := range initialArgs {
|
||||||
|
args.Add(arg.Key, arg.Value)
|
||||||
|
}
|
||||||
|
return args
|
||||||
|
}
|
||||||
|
|
||||||
|
// ParseFlag parses a key=value string and adds it to an Args.
|
||||||
//
|
//
|
||||||
// `docker ps -f 'created=today' -f 'image.name=ubuntu*'`
|
// Deprecated: Use Args.Add()
|
||||||
//
|
|
||||||
// If prev map is provided, then it is appended to, and returned. By default a new
|
|
||||||
// map is created.
|
|
||||||
func ParseFlag(arg string, prev Args) (Args, error) {
|
func ParseFlag(arg string, prev Args) (Args, error) {
|
||||||
filters := prev
|
filters := prev
|
||||||
if len(arg) == 0 {
|
if len(arg) == 0 {
|
||||||
|
@ -53,74 +60,95 @@ func ParseFlag(arg string, prev Args) (Args, error) {
|
||||||
return filters, nil
|
return filters, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
// ErrBadFormat is an error returned in case of bad format for a filter.
|
// ErrBadFormat is an error returned when a filter is not in the form key=value
|
||||||
|
//
|
||||||
|
// Deprecated: this error will be removed in a future version
|
||||||
var ErrBadFormat = errors.New("bad format of filter (expected name=value)")
|
var ErrBadFormat = errors.New("bad format of filter (expected name=value)")
|
||||||
|
|
||||||
// ToParam packs the Args into a string for easy transport from client to server.
|
// ToParam encodes the Args as args JSON encoded string
|
||||||
|
//
|
||||||
|
// Deprecated: use ToJSON
|
||||||
func ToParam(a Args) (string, error) {
|
func ToParam(a Args) (string, error) {
|
||||||
// this way we don't URL encode {}, just empty space
|
return ToJSON(a)
|
||||||
|
}
|
||||||
|
|
||||||
|
// MarshalJSON returns a JSON byte representation of the Args
|
||||||
|
func (args Args) MarshalJSON() ([]byte, error) {
|
||||||
|
if len(args.fields) == 0 {
|
||||||
|
return []byte{}, nil
|
||||||
|
}
|
||||||
|
return json.Marshal(args.fields)
|
||||||
|
}
|
||||||
|
|
||||||
|
// ToJSON returns the Args as a JSON encoded string
|
||||||
|
func ToJSON(a Args) (string, error) {
|
||||||
if a.Len() == 0 {
|
if a.Len() == 0 {
|
||||||
return "", nil
|
return "", nil
|
||||||
}
|
}
|
||||||
|
buf, err := json.Marshal(a)
|
||||||
buf, err := json.Marshal(a.fields)
|
return string(buf), err
|
||||||
if err != nil {
|
|
||||||
return "", err
|
|
||||||
}
|
|
||||||
return string(buf), nil
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// ToParamWithVersion packs the Args into a string for easy transport from client to server.
|
// ToParamWithVersion encodes Args as a JSON string. If version is less than 1.22
|
||||||
// The generated string will depend on the specified version (corresponding to the API version).
|
// then the encoded format will use an older legacy format where the values are a
|
||||||
|
// list of strings, instead of a set.
|
||||||
|
//
|
||||||
|
// Deprecated: Use ToJSON
|
||||||
func ToParamWithVersion(version string, a Args) (string, error) {
|
func ToParamWithVersion(version string, a Args) (string, error) {
|
||||||
// this way we don't URL encode {}, just empty space
|
|
||||||
if a.Len() == 0 {
|
if a.Len() == 0 {
|
||||||
return "", nil
|
return "", nil
|
||||||
}
|
}
|
||||||
|
|
||||||
// for daemons older than v1.10, filter must be of the form map[string][]string
|
|
||||||
var buf []byte
|
|
||||||
var err error
|
|
||||||
if version != "" && versions.LessThan(version, "1.22") {
|
if version != "" && versions.LessThan(version, "1.22") {
|
||||||
buf, err = json.Marshal(convertArgsToSlice(a.fields))
|
buf, err := json.Marshal(convertArgsToSlice(a.fields))
|
||||||
} else {
|
return string(buf), err
|
||||||
buf, err = json.Marshal(a.fields)
|
|
||||||
}
|
}
|
||||||
if err != nil {
|
|
||||||
return "", err
|
return ToJSON(a)
|
||||||
}
|
|
||||||
return string(buf), nil
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// FromParam unpacks the filter Args.
|
// FromParam decodes a JSON encoded string into Args
|
||||||
|
//
|
||||||
|
// Deprecated: use FromJSON
|
||||||
func FromParam(p string) (Args, error) {
|
func FromParam(p string) (Args, error) {
|
||||||
if len(p) == 0 {
|
return FromJSON(p)
|
||||||
return NewArgs(), nil
|
|
||||||
}
|
|
||||||
|
|
||||||
r := strings.NewReader(p)
|
|
||||||
d := json.NewDecoder(r)
|
|
||||||
|
|
||||||
m := map[string]map[string]bool{}
|
|
||||||
if err := d.Decode(&m); err != nil {
|
|
||||||
r.Seek(0, 0)
|
|
||||||
|
|
||||||
// Allow parsing old arguments in slice format.
|
|
||||||
// Because other libraries might be sending them in this format.
|
|
||||||
deprecated := map[string][]string{}
|
|
||||||
if deprecatedErr := d.Decode(&deprecated); deprecatedErr == nil {
|
|
||||||
m = deprecatedArgs(deprecated)
|
|
||||||
} else {
|
|
||||||
return NewArgs(), err
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return Args{m}, nil
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// Get returns the list of values associates with a field.
|
// FromJSON decodes a JSON encoded string into Args
|
||||||
// It returns a slice of strings to keep backwards compatibility with old code.
|
func FromJSON(p string) (Args, error) {
|
||||||
func (filters Args) Get(field string) []string {
|
args := NewArgs()
|
||||||
values := filters.fields[field]
|
|
||||||
|
if p == "" {
|
||||||
|
return args, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
raw := []byte(p)
|
||||||
|
err := json.Unmarshal(raw, &args)
|
||||||
|
if err == nil {
|
||||||
|
return args, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// Fallback to parsing arguments in the legacy slice format
|
||||||
|
deprecated := map[string][]string{}
|
||||||
|
if legacyErr := json.Unmarshal(raw, &deprecated); legacyErr != nil {
|
||||||
|
return args, err
|
||||||
|
}
|
||||||
|
|
||||||
|
args.fields = deprecatedArgs(deprecated)
|
||||||
|
return args, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// UnmarshalJSON populates the Args from JSON encode bytes
|
||||||
|
func (args Args) UnmarshalJSON(raw []byte) error {
|
||||||
|
if len(raw) == 0 {
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
return json.Unmarshal(raw, &args.fields)
|
||||||
|
}
|
||||||
|
|
||||||
|
// Get returns the list of values associated with the key
|
||||||
|
func (args Args) Get(key string) []string {
|
||||||
|
values := args.fields[key]
|
||||||
if values == nil {
|
if values == nil {
|
||||||
return make([]string, 0)
|
return make([]string, 0)
|
||||||
}
|
}
|
||||||
|
@ -131,37 +159,34 @@ func (filters Args) Get(field string) []string {
|
||||||
return slice
|
return slice
|
||||||
}
|
}
|
||||||
|
|
||||||
// Add adds a new value to a filter field.
|
// Add a new value to the set of values
|
||||||
func (filters Args) Add(name, value string) {
|
func (args Args) Add(key, value string) {
|
||||||
if _, ok := filters.fields[name]; ok {
|
if _, ok := args.fields[key]; ok {
|
||||||
filters.fields[name][value] = true
|
args.fields[key][value] = true
|
||||||
} else {
|
} else {
|
||||||
filters.fields[name] = map[string]bool{value: true}
|
args.fields[key] = map[string]bool{value: true}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Del removes a value from a filter field.
|
// Del removes a value from the set
|
||||||
func (filters Args) Del(name, value string) {
|
func (args Args) Del(key, value string) {
|
||||||
if _, ok := filters.fields[name]; ok {
|
if _, ok := args.fields[key]; ok {
|
||||||
delete(filters.fields[name], value)
|
delete(args.fields[key], value)
|
||||||
if len(filters.fields[name]) == 0 {
|
if len(args.fields[key]) == 0 {
|
||||||
delete(filters.fields, name)
|
delete(args.fields, key)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Len returns the number of fields in the arguments.
|
// Len returns the number of keys in the mapping
|
||||||
func (filters Args) Len() int {
|
func (args Args) Len() int {
|
||||||
return len(filters.fields)
|
return len(args.fields)
|
||||||
}
|
}
|
||||||
|
|
||||||
// MatchKVList returns true if the values for the specified field matches the ones
|
// MatchKVList returns true if all the pairs in sources exist as key=value
|
||||||
// from the sources.
|
// pairs in the mapping at key, or if there are no values at key.
|
||||||
// e.g. given Args are {'label': {'label1=1','label2=1'}, 'image.name', {'ubuntu'}},
|
func (args Args) MatchKVList(key string, sources map[string]string) bool {
|
||||||
// field is 'label' and sources are {'label1': '1', 'label2': '2'}
|
fieldValues := args.fields[key]
|
||||||
// it returns true.
|
|
||||||
func (filters Args) MatchKVList(field string, sources map[string]string) bool {
|
|
||||||
fieldValues := filters.fields[field]
|
|
||||||
|
|
||||||
//do not filter if there is no filter set or cannot determine filter
|
//do not filter if there is no filter set or cannot determine filter
|
||||||
if len(fieldValues) == 0 {
|
if len(fieldValues) == 0 {
|
||||||
|
@ -172,8 +197,8 @@ func (filters Args) MatchKVList(field string, sources map[string]string) bool {
|
||||||
return false
|
return false
|
||||||
}
|
}
|
||||||
|
|
||||||
for name2match := range fieldValues {
|
for value := range fieldValues {
|
||||||
testKV := strings.SplitN(name2match, "=", 2)
|
testKV := strings.SplitN(value, "=", 2)
|
||||||
|
|
||||||
v, ok := sources[testKV[0]]
|
v, ok := sources[testKV[0]]
|
||||||
if !ok {
|
if !ok {
|
||||||
|
@ -187,16 +212,13 @@ func (filters Args) MatchKVList(field string, sources map[string]string) bool {
|
||||||
return true
|
return true
|
||||||
}
|
}
|
||||||
|
|
||||||
// Match returns true if the values for the specified field matches the source string
|
// Match returns true if any of the values at key match the source string
|
||||||
// e.g. given Args are {'label': {'label1=1','label2=1'}, 'image.name', {'ubuntu'}},
|
func (args Args) Match(field, source string) bool {
|
||||||
// field is 'image.name' and source is 'ubuntu'
|
if args.ExactMatch(field, source) {
|
||||||
// it returns true.
|
|
||||||
func (filters Args) Match(field, source string) bool {
|
|
||||||
if filters.ExactMatch(field, source) {
|
|
||||||
return true
|
return true
|
||||||
}
|
}
|
||||||
|
|
||||||
fieldValues := filters.fields[field]
|
fieldValues := args.fields[field]
|
||||||
for name2match := range fieldValues {
|
for name2match := range fieldValues {
|
||||||
match, err := regexp.MatchString(name2match, source)
|
match, err := regexp.MatchString(name2match, source)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
@ -209,9 +231,9 @@ func (filters Args) Match(field, source string) bool {
|
||||||
return false
|
return false
|
||||||
}
|
}
|
||||||
|
|
||||||
// ExactMatch returns true if the source matches exactly one of the filters.
|
// ExactMatch returns true if the source matches exactly one of the values.
|
||||||
func (filters Args) ExactMatch(field, source string) bool {
|
func (args Args) ExactMatch(key, source string) bool {
|
||||||
fieldValues, ok := filters.fields[field]
|
fieldValues, ok := args.fields[key]
|
||||||
//do not filter if there is no filter set or cannot determine filter
|
//do not filter if there is no filter set or cannot determine filter
|
||||||
if !ok || len(fieldValues) == 0 {
|
if !ok || len(fieldValues) == 0 {
|
||||||
return true
|
return true
|
||||||
|
@ -221,14 +243,15 @@ func (filters Args) ExactMatch(field, source string) bool {
|
||||||
return fieldValues[source]
|
return fieldValues[source]
|
||||||
}
|
}
|
||||||
|
|
||||||
// UniqueExactMatch returns true if there is only one filter and the source matches exactly this one.
|
// UniqueExactMatch returns true if there is only one value and the source
|
||||||
func (filters Args) UniqueExactMatch(field, source string) bool {
|
// matches exactly the value.
|
||||||
fieldValues := filters.fields[field]
|
func (args Args) UniqueExactMatch(key, source string) bool {
|
||||||
|
fieldValues := args.fields[key]
|
||||||
//do not filter if there is no filter set or cannot determine filter
|
//do not filter if there is no filter set or cannot determine filter
|
||||||
if len(fieldValues) == 0 {
|
if len(fieldValues) == 0 {
|
||||||
return true
|
return true
|
||||||
}
|
}
|
||||||
if len(filters.fields[field]) != 1 {
|
if len(args.fields[key]) != 1 {
|
||||||
return false
|
return false
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -236,14 +259,14 @@ func (filters Args) UniqueExactMatch(field, source string) bool {
|
||||||
return fieldValues[source]
|
return fieldValues[source]
|
||||||
}
|
}
|
||||||
|
|
||||||
// FuzzyMatch returns true if the source matches exactly one of the filters,
|
// FuzzyMatch returns true if the source matches exactly one value, or the
|
||||||
// or the source has one of the filters as a prefix.
|
// source has one of the values as a prefix.
|
||||||
func (filters Args) FuzzyMatch(field, source string) bool {
|
func (args Args) FuzzyMatch(key, source string) bool {
|
||||||
if filters.ExactMatch(field, source) {
|
if args.ExactMatch(key, source) {
|
||||||
return true
|
return true
|
||||||
}
|
}
|
||||||
|
|
||||||
fieldValues := filters.fields[field]
|
fieldValues := args.fields[key]
|
||||||
for prefix := range fieldValues {
|
for prefix := range fieldValues {
|
||||||
if strings.HasPrefix(source, prefix) {
|
if strings.HasPrefix(source, prefix) {
|
||||||
return true
|
return true
|
||||||
|
@ -252,30 +275,47 @@ func (filters Args) FuzzyMatch(field, source string) bool {
|
||||||
return false
|
return false
|
||||||
}
|
}
|
||||||
|
|
||||||
// Include returns true if the name of the field to filter is in the filters.
|
// Include returns true if the key exists in the mapping
|
||||||
func (filters Args) Include(field string) bool {
|
//
|
||||||
_, ok := filters.fields[field]
|
// Deprecated: use Contains
|
||||||
|
func (args Args) Include(field string) bool {
|
||||||
|
_, ok := args.fields[field]
|
||||||
return ok
|
return ok
|
||||||
}
|
}
|
||||||
|
|
||||||
// Validate ensures that all the fields in the filter are valid.
|
// Contains returns true if the key exists in the mapping
|
||||||
// It returns an error as soon as it finds an invalid field.
|
func (args Args) Contains(field string) bool {
|
||||||
func (filters Args) Validate(accepted map[string]bool) error {
|
_, ok := args.fields[field]
|
||||||
for name := range filters.fields {
|
return ok
|
||||||
|
}
|
||||||
|
|
||||||
|
type invalidFilter string
|
||||||
|
|
||||||
|
func (e invalidFilter) Error() string {
|
||||||
|
return "Invalid filter '" + string(e) + "'"
|
||||||
|
}
|
||||||
|
|
||||||
|
func (invalidFilter) InvalidParameter() {}
|
||||||
|
|
||||||
|
// Validate compared the set of accepted keys against the keys in the mapping.
|
||||||
|
// An error is returned if any mapping keys are not in the accepted set.
|
||||||
|
func (args Args) Validate(accepted map[string]bool) error {
|
||||||
|
for name := range args.fields {
|
||||||
if !accepted[name] {
|
if !accepted[name] {
|
||||||
return fmt.Errorf("Invalid filter '%s'", name)
|
return invalidFilter(name)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
// WalkValues iterates over the list of filtered values for a field.
|
// WalkValues iterates over the list of values for a key in the mapping and calls
|
||||||
// It stops the iteration if it finds an error and it returns that error.
|
// op() for each value. If op returns an error the iteration stops and the
|
||||||
func (filters Args) WalkValues(field string, op func(value string) error) error {
|
// error is returned.
|
||||||
if _, ok := filters.fields[field]; !ok {
|
func (args Args) WalkValues(field string, op func(value string) error) error {
|
||||||
|
if _, ok := args.fields[field]; !ok {
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
for v := range filters.fields[field] {
|
for v := range args.fields[field] {
|
||||||
if err := op(v); err != nil {
|
if err := op(v); err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
4
vendor/github.com/docker/docker/api/types/mount/mount.go
generated
vendored
4
vendor/github.com/docker/docker/api/types/mount/mount.go
generated
vendored
|
@ -15,6 +15,8 @@ const (
|
||||||
TypeVolume Type = "volume"
|
TypeVolume Type = "volume"
|
||||||
// TypeTmpfs is the type for mounting tmpfs
|
// TypeTmpfs is the type for mounting tmpfs
|
||||||
TypeTmpfs Type = "tmpfs"
|
TypeTmpfs Type = "tmpfs"
|
||||||
|
// TypeNamedPipe is the type for mounting Windows named pipes
|
||||||
|
TypeNamedPipe Type = "npipe"
|
||||||
)
|
)
|
||||||
|
|
||||||
// Mount represents a mount (volume).
|
// Mount represents a mount (volume).
|
||||||
|
@ -65,7 +67,7 @@ var Propagations = []Propagation{
|
||||||
type Consistency string
|
type Consistency string
|
||||||
|
|
||||||
const (
|
const (
|
||||||
// ConsistencyFull guarantees bind-mount-like consistency
|
// ConsistencyFull guarantees bind mount-like consistency
|
||||||
ConsistencyFull Consistency = "consistent"
|
ConsistencyFull Consistency = "consistent"
|
||||||
// ConsistencyCached mounts can cache read data and FS structure
|
// ConsistencyCached mounts can cache read data and FS structure
|
||||||
ConsistencyCached Consistency = "cached"
|
ConsistencyCached Consistency = "cached"
|
||||||
|
|
6
vendor/github.com/docker/docker/api/types/network/network.go
generated
vendored
6
vendor/github.com/docker/docker/api/types/network/network.go
generated
vendored
|
@ -58,6 +58,7 @@ type EndpointSettings struct {
|
||||||
GlobalIPv6Address string
|
GlobalIPv6Address string
|
||||||
GlobalIPv6PrefixLen int
|
GlobalIPv6PrefixLen int
|
||||||
MacAddress string
|
MacAddress string
|
||||||
|
DriverOpts map[string]string
|
||||||
}
|
}
|
||||||
|
|
||||||
// Task carries the information about one backend task
|
// Task carries the information about one backend task
|
||||||
|
@ -100,3 +101,8 @@ func (es *EndpointSettings) Copy() *EndpointSettings {
|
||||||
type NetworkingConfig struct {
|
type NetworkingConfig struct {
|
||||||
EndpointsConfig map[string]*EndpointSettings // Endpoint configs for each connecting network
|
EndpointsConfig map[string]*EndpointSettings // Endpoint configs for each connecting network
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// ConfigReference specifies the source which provides a network's configuration
|
||||||
|
type ConfigReference struct {
|
||||||
|
Network string
|
||||||
|
}
|
||||||
|
|
2
vendor/github.com/docker/docker/api/types/plugin.go
generated
vendored
2
vendor/github.com/docker/docker/api/types/plugin.go
generated
vendored
|
@ -11,7 +11,7 @@ type Plugin struct {
|
||||||
// Required: true
|
// Required: true
|
||||||
Config PluginConfig `json:"Config"`
|
Config PluginConfig `json:"Config"`
|
||||||
|
|
||||||
// True when the plugin is running. False when the plugin is not running, only installed.
|
// True if the plugin is running. False if the plugin is not running, only installed.
|
||||||
// Required: true
|
// Required: true
|
||||||
Enabled bool `json:"Enabled"`
|
Enabled bool `json:"Enabled"`
|
||||||
|
|
||||||
|
|
8
vendor/github.com/docker/docker/api/types/plugin_responses.go
generated
vendored
8
vendor/github.com/docker/docker/api/types/plugin_responses.go
generated
vendored
|
@ -9,14 +9,6 @@ import (
|
||||||
// PluginsListResponse contains the response for the Engine API
|
// PluginsListResponse contains the response for the Engine API
|
||||||
type PluginsListResponse []*Plugin
|
type PluginsListResponse []*Plugin
|
||||||
|
|
||||||
const (
|
|
||||||
authzDriver = "AuthzDriver"
|
|
||||||
graphDriver = "GraphDriver"
|
|
||||||
ipamDriver = "IpamDriver"
|
|
||||||
networkDriver = "NetworkDriver"
|
|
||||||
volumeDriver = "VolumeDriver"
|
|
||||||
)
|
|
||||||
|
|
||||||
// UnmarshalJSON implements json.Unmarshaler for PluginInterfaceType
|
// UnmarshalJSON implements json.Unmarshaler for PluginInterfaceType
|
||||||
func (t *PluginInterfaceType) UnmarshalJSON(p []byte) error {
|
func (t *PluginInterfaceType) UnmarshalJSON(p []byte) error {
|
||||||
versionIndex := len(p)
|
versionIndex := len(p)
|
||||||
|
|
21
vendor/github.com/docker/docker/api/types/registry/registry.go
generated
vendored
21
vendor/github.com/docker/docker/api/types/registry/registry.go
generated
vendored
|
@ -3,13 +3,17 @@ package registry
|
||||||
import (
|
import (
|
||||||
"encoding/json"
|
"encoding/json"
|
||||||
"net"
|
"net"
|
||||||
|
|
||||||
|
"github.com/opencontainers/image-spec/specs-go/v1"
|
||||||
)
|
)
|
||||||
|
|
||||||
// ServiceConfig stores daemon registry services configuration.
|
// ServiceConfig stores daemon registry services configuration.
|
||||||
type ServiceConfig struct {
|
type ServiceConfig struct {
|
||||||
InsecureRegistryCIDRs []*NetIPNet `json:"InsecureRegistryCIDRs"`
|
AllowNondistributableArtifactsCIDRs []*NetIPNet
|
||||||
IndexConfigs map[string]*IndexInfo `json:"IndexConfigs"`
|
AllowNondistributableArtifactsHostnames []string
|
||||||
Mirrors []string
|
InsecureRegistryCIDRs []*NetIPNet `json:"InsecureRegistryCIDRs"`
|
||||||
|
IndexConfigs map[string]*IndexInfo `json:"IndexConfigs"`
|
||||||
|
Mirrors []string
|
||||||
}
|
}
|
||||||
|
|
||||||
// NetIPNet is the net.IPNet type, which can be marshalled and
|
// NetIPNet is the net.IPNet type, which can be marshalled and
|
||||||
|
@ -102,3 +106,14 @@ type SearchResults struct {
|
||||||
// Results is a slice containing the actual results for the search
|
// Results is a slice containing the actual results for the search
|
||||||
Results []SearchResult `json:"results"`
|
Results []SearchResult `json:"results"`
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// DistributionInspect describes the result obtained from contacting the
|
||||||
|
// registry to retrieve image metadata
|
||||||
|
type DistributionInspect struct {
|
||||||
|
// Descriptor contains information about the manifest, including
|
||||||
|
// the content addressable digest
|
||||||
|
Descriptor v1.Descriptor
|
||||||
|
// Platforms contains the list of platforms supported by the image,
|
||||||
|
// obtained by parsing the manifest
|
||||||
|
Platforms []v1.Platform
|
||||||
|
}
|
||||||
|
|
15
vendor/github.com/docker/docker/api/types/swarm/common.go
generated
vendored
15
vendor/github.com/docker/docker/api/types/swarm/common.go
generated
vendored
|
@ -20,8 +20,21 @@ type Annotations struct {
|
||||||
Labels map[string]string `json:"Labels"`
|
Labels map[string]string `json:"Labels"`
|
||||||
}
|
}
|
||||||
|
|
||||||
// Driver represents a driver (network, logging).
|
// Driver represents a driver (network, logging, secrets backend).
|
||||||
type Driver struct {
|
type Driver struct {
|
||||||
Name string `json:",omitempty"`
|
Name string `json:",omitempty"`
|
||||||
Options map[string]string `json:",omitempty"`
|
Options map[string]string `json:",omitempty"`
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// TLSInfo represents the TLS information about what CA certificate is trusted,
|
||||||
|
// and who the issuer for a TLS certificate is
|
||||||
|
type TLSInfo struct {
|
||||||
|
// TrustRoot is the trusted CA root certificate in PEM format
|
||||||
|
TrustRoot string `json:",omitempty"`
|
||||||
|
|
||||||
|
// CertIssuer is the raw subject bytes of the issuer
|
||||||
|
CertIssuerSubject []byte `json:",omitempty"`
|
||||||
|
|
||||||
|
// CertIssuerPublicKey is the raw public key bytes of the issuer
|
||||||
|
CertIssuerPublicKey []byte `json:",omitempty"`
|
||||||
|
}
|
||||||
|
|
31
vendor/github.com/docker/docker/api/types/swarm/container.go
generated
vendored
31
vendor/github.com/docker/docker/api/types/swarm/container.go
generated
vendored
|
@ -21,6 +21,28 @@ type DNSConfig struct {
|
||||||
Options []string `json:",omitempty"`
|
Options []string `json:",omitempty"`
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// SELinuxContext contains the SELinux labels of the container.
|
||||||
|
type SELinuxContext struct {
|
||||||
|
Disable bool
|
||||||
|
|
||||||
|
User string
|
||||||
|
Role string
|
||||||
|
Type string
|
||||||
|
Level string
|
||||||
|
}
|
||||||
|
|
||||||
|
// CredentialSpec for managed service account (Windows only)
|
||||||
|
type CredentialSpec struct {
|
||||||
|
File string
|
||||||
|
Registry string
|
||||||
|
}
|
||||||
|
|
||||||
|
// Privileges defines the security options for the container.
|
||||||
|
type Privileges struct {
|
||||||
|
CredentialSpec *CredentialSpec
|
||||||
|
SELinuxContext *SELinuxContext
|
||||||
|
}
|
||||||
|
|
||||||
// ContainerSpec represents the spec of a container.
|
// ContainerSpec represents the spec of a container.
|
||||||
type ContainerSpec struct {
|
type ContainerSpec struct {
|
||||||
Image string `json:",omitempty"`
|
Image string `json:",omitempty"`
|
||||||
|
@ -32,6 +54,7 @@ type ContainerSpec struct {
|
||||||
Dir string `json:",omitempty"`
|
Dir string `json:",omitempty"`
|
||||||
User string `json:",omitempty"`
|
User string `json:",omitempty"`
|
||||||
Groups []string `json:",omitempty"`
|
Groups []string `json:",omitempty"`
|
||||||
|
Privileges *Privileges `json:",omitempty"`
|
||||||
StopSignal string `json:",omitempty"`
|
StopSignal string `json:",omitempty"`
|
||||||
TTY bool `json:",omitempty"`
|
TTY bool `json:",omitempty"`
|
||||||
OpenStdin bool `json:",omitempty"`
|
OpenStdin bool `json:",omitempty"`
|
||||||
|
@ -42,7 +65,9 @@ type ContainerSpec struct {
|
||||||
// The format of extra hosts on swarmkit is specified in:
|
// The format of extra hosts on swarmkit is specified in:
|
||||||
// http://man7.org/linux/man-pages/man5/hosts.5.html
|
// http://man7.org/linux/man-pages/man5/hosts.5.html
|
||||||
// IP_address canonical_hostname [aliases...]
|
// IP_address canonical_hostname [aliases...]
|
||||||
Hosts []string `json:",omitempty"`
|
Hosts []string `json:",omitempty"`
|
||||||
DNSConfig *DNSConfig `json:",omitempty"`
|
DNSConfig *DNSConfig `json:",omitempty"`
|
||||||
Secrets []*SecretReference `json:",omitempty"`
|
Secrets []*SecretReference `json:",omitempty"`
|
||||||
|
Configs []*ConfigReference `json:",omitempty"`
|
||||||
|
Isolation container.Isolation `json:",omitempty"`
|
||||||
}
|
}
|
||||||
|
|
23
vendor/github.com/docker/docker/api/types/swarm/network.go
generated
vendored
23
vendor/github.com/docker/docker/api/types/swarm/network.go
generated
vendored
|
@ -1,5 +1,9 @@
|
||||||
package swarm
|
package swarm
|
||||||
|
|
||||||
|
import (
|
||||||
|
"github.com/docker/docker/api/types/network"
|
||||||
|
)
|
||||||
|
|
||||||
// Endpoint represents an endpoint.
|
// Endpoint represents an endpoint.
|
||||||
type Endpoint struct {
|
type Endpoint struct {
|
||||||
Spec EndpointSpec `json:",omitempty"`
|
Spec EndpointSpec `json:",omitempty"`
|
||||||
|
@ -78,18 +82,21 @@ type Network struct {
|
||||||
// NetworkSpec represents the spec of a network.
|
// NetworkSpec represents the spec of a network.
|
||||||
type NetworkSpec struct {
|
type NetworkSpec struct {
|
||||||
Annotations
|
Annotations
|
||||||
DriverConfiguration *Driver `json:",omitempty"`
|
DriverConfiguration *Driver `json:",omitempty"`
|
||||||
IPv6Enabled bool `json:",omitempty"`
|
IPv6Enabled bool `json:",omitempty"`
|
||||||
Internal bool `json:",omitempty"`
|
Internal bool `json:",omitempty"`
|
||||||
Attachable bool `json:",omitempty"`
|
Attachable bool `json:",omitempty"`
|
||||||
Ingress bool `json:",omitempty"`
|
Ingress bool `json:",omitempty"`
|
||||||
IPAMOptions *IPAMOptions `json:",omitempty"`
|
IPAMOptions *IPAMOptions `json:",omitempty"`
|
||||||
|
ConfigFrom *network.ConfigReference `json:",omitempty"`
|
||||||
|
Scope string `json:",omitempty"`
|
||||||
}
|
}
|
||||||
|
|
||||||
// NetworkAttachmentConfig represents the configuration of a network attachment.
|
// NetworkAttachmentConfig represents the configuration of a network attachment.
|
||||||
type NetworkAttachmentConfig struct {
|
type NetworkAttachmentConfig struct {
|
||||||
Target string `json:",omitempty"`
|
Target string `json:",omitempty"`
|
||||||
Aliases []string `json:",omitempty"`
|
Aliases []string `json:",omitempty"`
|
||||||
|
DriverOpts map[string]string `json:",omitempty"`
|
||||||
}
|
}
|
||||||
|
|
||||||
// NetworkAttachment represents a network attachment.
|
// NetworkAttachment represents a network attachment.
|
||||||
|
|
1
vendor/github.com/docker/docker/api/types/swarm/node.go
generated
vendored
1
vendor/github.com/docker/docker/api/types/swarm/node.go
generated
vendored
|
@ -52,6 +52,7 @@ type NodeDescription struct {
|
||||||
Platform Platform `json:",omitempty"`
|
Platform Platform `json:",omitempty"`
|
||||||
Resources Resources `json:",omitempty"`
|
Resources Resources `json:",omitempty"`
|
||||||
Engine EngineDescription `json:",omitempty"`
|
Engine EngineDescription `json:",omitempty"`
|
||||||
|
TLSInfo TLSInfo `json:",omitempty"`
|
||||||
}
|
}
|
||||||
|
|
||||||
// Platform represents the platform (Arch/OS).
|
// Platform represents the platform (Arch/OS).
|
||||||
|
|
3
vendor/github.com/docker/docker/api/types/swarm/secret.go
generated
vendored
3
vendor/github.com/docker/docker/api/types/swarm/secret.go
generated
vendored
|
@ -12,7 +12,8 @@ type Secret struct {
|
||||||
// SecretSpec represents a secret specification from a secret in swarm
|
// SecretSpec represents a secret specification from a secret in swarm
|
||||||
type SecretSpec struct {
|
type SecretSpec struct {
|
||||||
Annotations
|
Annotations
|
||||||
Data []byte `json:",omitempty"`
|
Data []byte `json:",omitempty"`
|
||||||
|
Driver *Driver `json:",omitempty"` // name of the secrets driver used to fetch the secret's value from an external secret store
|
||||||
}
|
}
|
||||||
|
|
||||||
// SecretReferenceFileTarget is a file target in a secret reference
|
// SecretReferenceFileTarget is a file target in a secret reference
|
||||||
|
|
10
vendor/github.com/docker/docker/api/types/swarm/service.go
generated
vendored
10
vendor/github.com/docker/docker/api/types/swarm/service.go
generated
vendored
|
@ -77,6 +77,11 @@ const (
|
||||||
UpdateFailureActionContinue = "continue"
|
UpdateFailureActionContinue = "continue"
|
||||||
// UpdateFailureActionRollback ROLLBACK
|
// UpdateFailureActionRollback ROLLBACK
|
||||||
UpdateFailureActionRollback = "rollback"
|
UpdateFailureActionRollback = "rollback"
|
||||||
|
|
||||||
|
// UpdateOrderStopFirst STOP_FIRST
|
||||||
|
UpdateOrderStopFirst = "stop-first"
|
||||||
|
// UpdateOrderStartFirst START_FIRST
|
||||||
|
UpdateOrderStartFirst = "start-first"
|
||||||
)
|
)
|
||||||
|
|
||||||
// UpdateConfig represents the update configuration.
|
// UpdateConfig represents the update configuration.
|
||||||
|
@ -111,4 +116,9 @@ type UpdateConfig struct {
|
||||||
// If the failure action is PAUSE, no more tasks will be updated until
|
// If the failure action is PAUSE, no more tasks will be updated until
|
||||||
// another update is started.
|
// another update is started.
|
||||||
MaxFailureRatio float32
|
MaxFailureRatio float32
|
||||||
|
|
||||||
|
// Order indicates the order of operations when rolling out an updated
|
||||||
|
// task. Either the old task is shut down before the new task is
|
||||||
|
// started, or the new task is started before the old task is shut down.
|
||||||
|
Order string
|
||||||
}
|
}
|
||||||
|
|
22
vendor/github.com/docker/docker/api/types/swarm/swarm.go
generated
vendored
22
vendor/github.com/docker/docker/api/types/swarm/swarm.go
generated
vendored
|
@ -2,12 +2,14 @@ package swarm
|
||||||
|
|
||||||
import "time"
|
import "time"
|
||||||
|
|
||||||
// ClusterInfo represents info about the cluster for outputing in "info"
|
// ClusterInfo represents info about the cluster for outputting in "info"
|
||||||
// it contains the same information as "Swarm", but without the JoinTokens
|
// it contains the same information as "Swarm", but without the JoinTokens
|
||||||
type ClusterInfo struct {
|
type ClusterInfo struct {
|
||||||
ID string
|
ID string
|
||||||
Meta
|
Meta
|
||||||
Spec Spec
|
Spec Spec
|
||||||
|
TLSInfo TLSInfo
|
||||||
|
RootRotationInProgress bool
|
||||||
}
|
}
|
||||||
|
|
||||||
// Swarm represents a swarm.
|
// Swarm represents a swarm.
|
||||||
|
@ -107,6 +109,16 @@ type CAConfig struct {
|
||||||
// ExternalCAs is a list of CAs to which a manager node will make
|
// ExternalCAs is a list of CAs to which a manager node will make
|
||||||
// certificate signing requests for node certificates.
|
// certificate signing requests for node certificates.
|
||||||
ExternalCAs []*ExternalCA `json:",omitempty"`
|
ExternalCAs []*ExternalCA `json:",omitempty"`
|
||||||
|
|
||||||
|
// SigningCACert and SigningCAKey specify the desired signing root CA and
|
||||||
|
// root CA key for the swarm. When inspecting the cluster, the key will
|
||||||
|
// be redacted.
|
||||||
|
SigningCACert string `json:",omitempty"`
|
||||||
|
SigningCAKey string `json:",omitempty"`
|
||||||
|
|
||||||
|
// If this value changes, and there is no specified signing cert and key,
|
||||||
|
// then the swarm is forced to generate a new root certificate ane key.
|
||||||
|
ForceRotate uint64 `json:",omitempty"`
|
||||||
}
|
}
|
||||||
|
|
||||||
// ExternalCAProtocol represents type of external CA.
|
// ExternalCAProtocol represents type of external CA.
|
||||||
|
@ -126,12 +138,17 @@ type ExternalCA struct {
|
||||||
// Options is a set of additional key/value pairs whose interpretation
|
// Options is a set of additional key/value pairs whose interpretation
|
||||||
// depends on the specified CA type.
|
// depends on the specified CA type.
|
||||||
Options map[string]string `json:",omitempty"`
|
Options map[string]string `json:",omitempty"`
|
||||||
|
|
||||||
|
// CACert specifies which root CA is used by this external CA. This certificate must
|
||||||
|
// be in PEM format.
|
||||||
|
CACert string
|
||||||
}
|
}
|
||||||
|
|
||||||
// InitRequest is the request used to init a swarm.
|
// InitRequest is the request used to init a swarm.
|
||||||
type InitRequest struct {
|
type InitRequest struct {
|
||||||
ListenAddr string
|
ListenAddr string
|
||||||
AdvertiseAddr string
|
AdvertiseAddr string
|
||||||
|
DataPathAddr string
|
||||||
ForceNewCluster bool
|
ForceNewCluster bool
|
||||||
Spec Spec
|
Spec Spec
|
||||||
AutoLockManagers bool
|
AutoLockManagers bool
|
||||||
|
@ -142,6 +159,7 @@ type InitRequest struct {
|
||||||
type JoinRequest struct {
|
type JoinRequest struct {
|
||||||
ListenAddr string
|
ListenAddr string
|
||||||
AdvertiseAddr string
|
AdvertiseAddr string
|
||||||
|
DataPathAddr string
|
||||||
RemoteAddrs []string
|
RemoteAddrs []string
|
||||||
JoinToken string // accept by secret
|
JoinToken string // accept by secret
|
||||||
Availability NodeAvailability
|
Availability NodeAvailability
|
||||||
|
|
50
vendor/github.com/docker/docker/api/types/swarm/task.go
generated
vendored
50
vendor/github.com/docker/docker/api/types/swarm/task.go
generated
vendored
|
@ -1,6 +1,10 @@
|
||||||
package swarm
|
package swarm
|
||||||
|
|
||||||
import "time"
|
import (
|
||||||
|
"time"
|
||||||
|
|
||||||
|
"github.com/docker/docker/api/types/swarm/runtime"
|
||||||
|
)
|
||||||
|
|
||||||
// TaskState represents the state of a task.
|
// TaskState represents the state of a task.
|
||||||
type TaskState string
|
type TaskState string
|
||||||
|
@ -47,11 +51,16 @@ type Task struct {
|
||||||
Status TaskStatus `json:",omitempty"`
|
Status TaskStatus `json:",omitempty"`
|
||||||
DesiredState TaskState `json:",omitempty"`
|
DesiredState TaskState `json:",omitempty"`
|
||||||
NetworksAttachments []NetworkAttachment `json:",omitempty"`
|
NetworksAttachments []NetworkAttachment `json:",omitempty"`
|
||||||
|
GenericResources []GenericResource `json:",omitempty"`
|
||||||
}
|
}
|
||||||
|
|
||||||
// TaskSpec represents the spec of a task.
|
// TaskSpec represents the spec of a task.
|
||||||
type TaskSpec struct {
|
type TaskSpec struct {
|
||||||
ContainerSpec ContainerSpec `json:",omitempty"`
|
// ContainerSpec and PluginSpec are mutually exclusive.
|
||||||
|
// PluginSpec will only be used when the `Runtime` field is set to `plugin`
|
||||||
|
ContainerSpec *ContainerSpec `json:",omitempty"`
|
||||||
|
PluginSpec *runtime.PluginSpec `json:",omitempty"`
|
||||||
|
|
||||||
Resources *ResourceRequirements `json:",omitempty"`
|
Resources *ResourceRequirements `json:",omitempty"`
|
||||||
RestartPolicy *RestartPolicy `json:",omitempty"`
|
RestartPolicy *RestartPolicy `json:",omitempty"`
|
||||||
Placement *Placement `json:",omitempty"`
|
Placement *Placement `json:",omitempty"`
|
||||||
|
@ -65,12 +74,40 @@ type TaskSpec struct {
|
||||||
// ForceUpdate is a counter that triggers an update even if no relevant
|
// ForceUpdate is a counter that triggers an update even if no relevant
|
||||||
// parameters have been changed.
|
// parameters have been changed.
|
||||||
ForceUpdate uint64
|
ForceUpdate uint64
|
||||||
|
|
||||||
|
Runtime RuntimeType `json:",omitempty"`
|
||||||
}
|
}
|
||||||
|
|
||||||
// Resources represents resources (CPU/Memory).
|
// Resources represents resources (CPU/Memory).
|
||||||
type Resources struct {
|
type Resources struct {
|
||||||
NanoCPUs int64 `json:",omitempty"`
|
NanoCPUs int64 `json:",omitempty"`
|
||||||
MemoryBytes int64 `json:",omitempty"`
|
MemoryBytes int64 `json:",omitempty"`
|
||||||
|
GenericResources []GenericResource `json:",omitempty"`
|
||||||
|
}
|
||||||
|
|
||||||
|
// GenericResource represents a "user defined" resource which can
|
||||||
|
// be either an integer (e.g: SSD=3) or a string (e.g: SSD=sda1)
|
||||||
|
type GenericResource struct {
|
||||||
|
NamedResourceSpec *NamedGenericResource `json:",omitempty"`
|
||||||
|
DiscreteResourceSpec *DiscreteGenericResource `json:",omitempty"`
|
||||||
|
}
|
||||||
|
|
||||||
|
// NamedGenericResource represents a "user defined" resource which is defined
|
||||||
|
// as a string.
|
||||||
|
// "Kind" is used to describe the Kind of a resource (e.g: "GPU", "FPGA", "SSD", ...)
|
||||||
|
// Value is used to identify the resource (GPU="UUID-1", FPGA="/dev/sdb5", ...)
|
||||||
|
type NamedGenericResource struct {
|
||||||
|
Kind string `json:",omitempty"`
|
||||||
|
Value string `json:",omitempty"`
|
||||||
|
}
|
||||||
|
|
||||||
|
// DiscreteGenericResource represents a "user defined" resource which is defined
|
||||||
|
// as an integer
|
||||||
|
// "Kind" is used to describe the Kind of a resource (e.g: "GPU", "FPGA", "SSD", ...)
|
||||||
|
// Value is used to count the resource (SSD=5, HDD=3, ...)
|
||||||
|
type DiscreteGenericResource struct {
|
||||||
|
Kind string `json:",omitempty"`
|
||||||
|
Value int64 `json:",omitempty"`
|
||||||
}
|
}
|
||||||
|
|
||||||
// ResourceRequirements represents resources requirements.
|
// ResourceRequirements represents resources requirements.
|
||||||
|
@ -83,6 +120,11 @@ type ResourceRequirements struct {
|
||||||
type Placement struct {
|
type Placement struct {
|
||||||
Constraints []string `json:",omitempty"`
|
Constraints []string `json:",omitempty"`
|
||||||
Preferences []PlacementPreference `json:",omitempty"`
|
Preferences []PlacementPreference `json:",omitempty"`
|
||||||
|
|
||||||
|
// Platforms stores all the platforms that the image can run on.
|
||||||
|
// This field is used in the platform filter for scheduling. If empty,
|
||||||
|
// then the platform filter is off, meaning there are no scheduling restrictions.
|
||||||
|
Platforms []Platform `json:",omitempty"`
|
||||||
}
|
}
|
||||||
|
|
||||||
// PlacementPreference provides a way to make the scheduler aware of factors
|
// PlacementPreference provides a way to make the scheduler aware of factors
|
||||||
|
|
4
vendor/github.com/docker/docker/api/types/time/timestamp.go
generated
vendored
4
vendor/github.com/docker/docker/api/types/time/timestamp.go
generated
vendored
|
@ -29,10 +29,8 @@ func GetTimestamp(value string, reference time.Time) (string, error) {
|
||||||
}
|
}
|
||||||
|
|
||||||
var format string
|
var format string
|
||||||
var parseInLocation bool
|
|
||||||
|
|
||||||
// if the string has a Z or a + or three dashes use parse otherwise use parseinlocation
|
// if the string has a Z or a + or three dashes use parse otherwise use parseinlocation
|
||||||
parseInLocation = !(strings.ContainsAny(value, "zZ+") || strings.Count(value, "-") == 3)
|
parseInLocation := !(strings.ContainsAny(value, "zZ+") || strings.Count(value, "-") == 3)
|
||||||
|
|
||||||
if strings.Contains(value, ".") {
|
if strings.Contains(value, ".") {
|
||||||
if parseInLocation {
|
if parseInLocation {
|
||||||
|
|
69
vendor/github.com/docker/docker/api/types/types.go
generated
vendored
69
vendor/github.com/docker/docker/api/types/types.go
generated
vendored
|
@ -45,6 +45,12 @@ type ImageInspect struct {
|
||||||
VirtualSize int64
|
VirtualSize int64
|
||||||
GraphDriver GraphDriverData
|
GraphDriver GraphDriverData
|
||||||
RootFS RootFS
|
RootFS RootFS
|
||||||
|
Metadata ImageMetadata
|
||||||
|
}
|
||||||
|
|
||||||
|
// ImageMetadata contains engine-local data about the image
|
||||||
|
type ImageMetadata struct {
|
||||||
|
LastTagTime time.Time `json:",omitempty"`
|
||||||
}
|
}
|
||||||
|
|
||||||
// Container contains response of Engine API:
|
// Container contains response of Engine API:
|
||||||
|
@ -101,9 +107,21 @@ type Ping struct {
|
||||||
Experimental bool
|
Experimental bool
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// ComponentVersion describes the version information for a specific component.
|
||||||
|
type ComponentVersion struct {
|
||||||
|
Name string
|
||||||
|
Version string
|
||||||
|
Details map[string]string `json:",omitempty"`
|
||||||
|
}
|
||||||
|
|
||||||
// Version contains response of Engine API:
|
// Version contains response of Engine API:
|
||||||
// GET "/version"
|
// GET "/version"
|
||||||
type Version struct {
|
type Version struct {
|
||||||
|
Platform struct{ Name string } `json:",omitempty"`
|
||||||
|
Components []ComponentVersion `json:",omitempty"`
|
||||||
|
|
||||||
|
// The following fields are deprecated, they relate to the Engine component and are kept for backwards compatibility
|
||||||
|
|
||||||
Version string
|
Version string
|
||||||
APIVersion string `json:"ApiVersion"`
|
APIVersion string `json:"ApiVersion"`
|
||||||
MinAPIVersion string `json:"MinAPIVersion,omitempty"`
|
MinAPIVersion string `json:"MinAPIVersion,omitempty"`
|
||||||
|
@ -162,6 +180,7 @@ type Info struct {
|
||||||
RegistryConfig *registry.ServiceConfig
|
RegistryConfig *registry.ServiceConfig
|
||||||
NCPU int
|
NCPU int
|
||||||
MemTotal int64
|
MemTotal int64
|
||||||
|
GenericResources []swarm.GenericResource
|
||||||
DockerRootDir string
|
DockerRootDir string
|
||||||
HTTPProxy string `json:"HttpProxy"`
|
HTTPProxy string `json:"HttpProxy"`
|
||||||
HTTPSProxy string `json:"HttpsProxy"`
|
HTTPSProxy string `json:"HttpsProxy"`
|
||||||
|
@ -238,6 +257,8 @@ type PluginsInfo struct {
|
||||||
Network []string
|
Network []string
|
||||||
// List of Authorization plugins registered
|
// List of Authorization plugins registered
|
||||||
Authorization []string
|
Authorization []string
|
||||||
|
// List of Log plugins registered
|
||||||
|
Log []string
|
||||||
}
|
}
|
||||||
|
|
||||||
// ExecStartCheck is a temp struct used by execStart
|
// ExecStartCheck is a temp struct used by execStart
|
||||||
|
@ -275,7 +296,7 @@ type Health struct {
|
||||||
// ContainerState stores container's running state
|
// ContainerState stores container's running state
|
||||||
// it's part of ContainerJSONBase and will return by "inspect" command
|
// it's part of ContainerJSONBase and will return by "inspect" command
|
||||||
type ContainerState struct {
|
type ContainerState struct {
|
||||||
Status string
|
Status string // String representation of the container state. Can be one of "created", "running", "paused", "restarting", "removing", "exited", or "dead"
|
||||||
Running bool
|
Running bool
|
||||||
Paused bool
|
Paused bool
|
||||||
Restarting bool
|
Restarting bool
|
||||||
|
@ -318,6 +339,7 @@ type ContainerJSONBase struct {
|
||||||
Name string
|
Name string
|
||||||
RestartCount int
|
RestartCount int
|
||||||
Driver string
|
Driver string
|
||||||
|
Platform string
|
||||||
MountLabel string
|
MountLabel string
|
||||||
ProcessLabel string
|
ProcessLabel string
|
||||||
AppArmorProfile string
|
AppArmorProfile string
|
||||||
|
@ -394,13 +416,15 @@ type NetworkResource struct {
|
||||||
Name string // Name is the requested name of the network
|
Name string // Name is the requested name of the network
|
||||||
ID string `json:"Id"` // ID uniquely identifies a network on a single machine
|
ID string `json:"Id"` // ID uniquely identifies a network on a single machine
|
||||||
Created time.Time // Created is the time the network created
|
Created time.Time // Created is the time the network created
|
||||||
Scope string // Scope describes the level at which the network exists (e.g. `global` for cluster-wide or `local` for machine level)
|
Scope string // Scope describes the level at which the network exists (e.g. `swarm` for cluster-wide or `local` for machine level)
|
||||||
Driver string // Driver is the Driver name used to create the network (e.g. `bridge`, `overlay`)
|
Driver string // Driver is the Driver name used to create the network (e.g. `bridge`, `overlay`)
|
||||||
EnableIPv6 bool // EnableIPv6 represents whether to enable IPv6
|
EnableIPv6 bool // EnableIPv6 represents whether to enable IPv6
|
||||||
IPAM network.IPAM // IPAM is the network's IP Address Management
|
IPAM network.IPAM // IPAM is the network's IP Address Management
|
||||||
Internal bool // Internal represents if the network is used internal only
|
Internal bool // Internal represents if the network is used internal only
|
||||||
Attachable bool // Attachable represents if the global scope is manually attachable by regular containers from workers in swarm mode.
|
Attachable bool // Attachable represents if the global scope is manually attachable by regular containers from workers in swarm mode.
|
||||||
Ingress bool // Ingress indicates the network is providing the routing-mesh for the swarm cluster.
|
Ingress bool // Ingress indicates the network is providing the routing-mesh for the swarm cluster.
|
||||||
|
ConfigFrom network.ConfigReference // ConfigFrom specifies the source which will provide the configuration for this network.
|
||||||
|
ConfigOnly bool // ConfigOnly networks are place-holder networks for network configurations to be used by other networks. ConfigOnly networks cannot be used directly to run containers or services.
|
||||||
Containers map[string]EndpointResource // Containers contains endpoints belonging to the network
|
Containers map[string]EndpointResource // Containers contains endpoints belonging to the network
|
||||||
Options map[string]string // Options holds the network specific options to use for when creating the network
|
Options map[string]string // Options holds the network specific options to use for when creating the network
|
||||||
Labels map[string]string // Labels holds metadata specific to the network being created
|
Labels map[string]string // Labels holds metadata specific to the network being created
|
||||||
|
@ -428,11 +452,14 @@ type NetworkCreate struct {
|
||||||
// which has the same name but it is not guaranteed to catch all name collisions.
|
// which has the same name but it is not guaranteed to catch all name collisions.
|
||||||
CheckDuplicate bool
|
CheckDuplicate bool
|
||||||
Driver string
|
Driver string
|
||||||
|
Scope string
|
||||||
EnableIPv6 bool
|
EnableIPv6 bool
|
||||||
IPAM *network.IPAM
|
IPAM *network.IPAM
|
||||||
Internal bool
|
Internal bool
|
||||||
Attachable bool
|
Attachable bool
|
||||||
Ingress bool
|
Ingress bool
|
||||||
|
ConfigOnly bool
|
||||||
|
ConfigFrom *network.ConfigReference
|
||||||
Options map[string]string
|
Options map[string]string
|
||||||
Labels map[string]string
|
Labels map[string]string
|
||||||
}
|
}
|
||||||
|
@ -461,6 +488,12 @@ type NetworkDisconnect struct {
|
||||||
Force bool
|
Force bool
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// NetworkInspectOptions holds parameters to inspect network
|
||||||
|
type NetworkInspectOptions struct {
|
||||||
|
Scope string
|
||||||
|
Verbose bool
|
||||||
|
}
|
||||||
|
|
||||||
// Checkpoint represents the details of a checkpoint
|
// Checkpoint represents the details of a checkpoint
|
||||||
type Checkpoint struct {
|
type Checkpoint struct {
|
||||||
Name string // Name is the name of the checkpoint
|
Name string // Name is the name of the checkpoint
|
||||||
|
@ -475,10 +508,11 @@ type Runtime struct {
|
||||||
// DiskUsage contains response of Engine API:
|
// DiskUsage contains response of Engine API:
|
||||||
// GET "/system/df"
|
// GET "/system/df"
|
||||||
type DiskUsage struct {
|
type DiskUsage struct {
|
||||||
LayersSize int64
|
LayersSize int64
|
||||||
Images []*ImageSummary
|
Images []*ImageSummary
|
||||||
Containers []*Container
|
Containers []*Container
|
||||||
Volumes []*Volume
|
Volumes []*Volume
|
||||||
|
BuilderSize int64
|
||||||
}
|
}
|
||||||
|
|
||||||
// ContainersPruneReport contains the response for Engine API:
|
// ContainersPruneReport contains the response for Engine API:
|
||||||
|
@ -502,6 +536,12 @@ type ImagesPruneReport struct {
|
||||||
SpaceReclaimed uint64
|
SpaceReclaimed uint64
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// BuildCachePruneReport contains the response for Engine API:
|
||||||
|
// POST "/build/prune"
|
||||||
|
type BuildCachePruneReport struct {
|
||||||
|
SpaceReclaimed uint64
|
||||||
|
}
|
||||||
|
|
||||||
// NetworksPruneReport contains the response for Engine API:
|
// NetworksPruneReport contains the response for Engine API:
|
||||||
// POST "/networks/prune"
|
// POST "/networks/prune"
|
||||||
type NetworksPruneReport struct {
|
type NetworksPruneReport struct {
|
||||||
|
@ -520,6 +560,18 @@ type SecretListOptions struct {
|
||||||
Filters filters.Args
|
Filters filters.Args
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// ConfigCreateResponse contains the information returned to a client
|
||||||
|
// on the creation of a new config.
|
||||||
|
type ConfigCreateResponse struct {
|
||||||
|
// ID is the id of the created config.
|
||||||
|
ID string
|
||||||
|
}
|
||||||
|
|
||||||
|
// ConfigListOptions holds parameters to list configs
|
||||||
|
type ConfigListOptions struct {
|
||||||
|
Filters filters.Args
|
||||||
|
}
|
||||||
|
|
||||||
// PushResult contains the tag, manifest digest, and manifest size from the
|
// PushResult contains the tag, manifest digest, and manifest size from the
|
||||||
// push. It's used to signal this information to the trust code in the client
|
// push. It's used to signal this information to the trust code in the client
|
||||||
// so it can sign the manifest if necessary.
|
// so it can sign the manifest if necessary.
|
||||||
|
@ -528,3 +580,8 @@ type PushResult struct {
|
||||||
Digest string
|
Digest string
|
||||||
Size int
|
Size int
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// BuildResult contains the image id of a successful build
|
||||||
|
type BuildResult struct {
|
||||||
|
ID string
|
||||||
|
}
|
||||||
|
|
17
vendor/github.com/docker/docker/api/types/volume.go
generated
vendored
17
vendor/github.com/docker/docker/api/types/volume.go
generated
vendored
|
@ -7,6 +7,9 @@ package types
|
||||||
// swagger:model Volume
|
// swagger:model Volume
|
||||||
type Volume struct {
|
type Volume struct {
|
||||||
|
|
||||||
|
// Date/Time the volume was created.
|
||||||
|
CreatedAt string `json:"CreatedAt,omitempty"`
|
||||||
|
|
||||||
// Name of the volume driver used by the volume.
|
// Name of the volume driver used by the volume.
|
||||||
// Required: true
|
// Required: true
|
||||||
Driver string `json:"Driver"`
|
Driver string `json:"Driver"`
|
||||||
|
@ -44,15 +47,23 @@ type Volume struct {
|
||||||
UsageData *VolumeUsageData `json:"UsageData,omitempty"`
|
UsageData *VolumeUsageData `json:"UsageData,omitempty"`
|
||||||
}
|
}
|
||||||
|
|
||||||
// VolumeUsageData volume usage data
|
// VolumeUsageData Usage details about the volume. This information is used by the
|
||||||
|
// `GET /system/df` endpoint, and omitted in other endpoints.
|
||||||
|
//
|
||||||
// swagger:model VolumeUsageData
|
// swagger:model VolumeUsageData
|
||||||
type VolumeUsageData struct {
|
type VolumeUsageData struct {
|
||||||
|
|
||||||
// The number of containers referencing this volume.
|
// The number of containers referencing this volume. This field
|
||||||
|
// is set to `-1` if the reference-count is not available.
|
||||||
|
//
|
||||||
// Required: true
|
// Required: true
|
||||||
RefCount int64 `json:"RefCount"`
|
RefCount int64 `json:"RefCount"`
|
||||||
|
|
||||||
// The disk space used by the volume (local driver only)
|
// Amount of disk space used by the volume (in bytes). This information
|
||||||
|
// is only available for volumes created with the `"local"` volume
|
||||||
|
// driver. For volumes created with other volume drivers, this field
|
||||||
|
// is set to `-1` ("not available")
|
||||||
|
//
|
||||||
// Required: true
|
// Required: true
|
||||||
Size int64 `json:"Size"`
|
Size int64 `json:"Size"`
|
||||||
}
|
}
|
||||||
|
|
191
vendor/github.com/docker/docker/cli/config/LICENSE
generated
vendored
191
vendor/github.com/docker/docker/cli/config/LICENSE
generated
vendored
|
@ -1,191 +0,0 @@
|
||||||
|
|
||||||
Apache License
|
|
||||||
Version 2.0, January 2004
|
|
||||||
https://www.apache.org/licenses/
|
|
||||||
|
|
||||||
TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
|
|
||||||
|
|
||||||
1. Definitions.
|
|
||||||
|
|
||||||
"License" shall mean the terms and conditions for use, reproduction,
|
|
||||||
and distribution as defined by Sections 1 through 9 of this document.
|
|
||||||
|
|
||||||
"Licensor" shall mean the copyright owner or entity authorized by
|
|
||||||
the copyright owner that is granting the License.
|
|
||||||
|
|
||||||
"Legal Entity" shall mean the union of the acting entity and all
|
|
||||||
other entities that control, are controlled by, or are under common
|
|
||||||
control with that entity. For the purposes of this definition,
|
|
||||||
"control" means (i) the power, direct or indirect, to cause the
|
|
||||||
direction or management of such entity, whether by contract or
|
|
||||||
otherwise, or (ii) ownership of fifty percent (50%) or more of the
|
|
||||||
outstanding shares, or (iii) beneficial ownership of such entity.
|
|
||||||
|
|
||||||
"You" (or "Your") shall mean an individual or Legal Entity
|
|
||||||
exercising permissions granted by this License.
|
|
||||||
|
|
||||||
"Source" form shall mean the preferred form for making modifications,
|
|
||||||
including but not limited to software source code, documentation
|
|
||||||
source, and configuration files.
|
|
||||||
|
|
||||||
"Object" form shall mean any form resulting from mechanical
|
|
||||||
transformation or translation of a Source form, including but
|
|
||||||
not limited to compiled object code, generated documentation,
|
|
||||||
and conversions to other media types.
|
|
||||||
|
|
||||||
"Work" shall mean the work of authorship, whether in Source or
|
|
||||||
Object form, made available under the License, as indicated by a
|
|
||||||
copyright notice that is included in or attached to the work
|
|
||||||
(an example is provided in the Appendix below).
|
|
||||||
|
|
||||||
"Derivative Works" shall mean any work, whether in Source or Object
|
|
||||||
form, that is based on (or derived from) the Work and for which the
|
|
||||||
editorial revisions, annotations, elaborations, or other modifications
|
|
||||||
represent, as a whole, an original work of authorship. For the purposes
|
|
||||||
of this License, Derivative Works shall not include works that remain
|
|
||||||
separable from, or merely link (or bind by name) to the interfaces of,
|
|
||||||
the Work and Derivative Works thereof.
|
|
||||||
|
|
||||||
"Contribution" shall mean any work of authorship, including
|
|
||||||
the original version of the Work and any modifications or additions
|
|
||||||
to that Work or Derivative Works thereof, that is intentionally
|
|
||||||
submitted to Licensor for inclusion in the Work by the copyright owner
|
|
||||||
or by an individual or Legal Entity authorized to submit on behalf of
|
|
||||||
the copyright owner. For the purposes of this definition, "submitted"
|
|
||||||
means any form of electronic, verbal, or written communication sent
|
|
||||||
to the Licensor or its representatives, including but not limited to
|
|
||||||
communication on electronic mailing lists, source code control systems,
|
|
||||||
and issue tracking systems that are managed by, or on behalf of, the
|
|
||||||
Licensor for the purpose of discussing and improving the Work, but
|
|
||||||
excluding communication that is conspicuously marked or otherwise
|
|
||||||
designated in writing by the copyright owner as "Not a Contribution."
|
|
||||||
|
|
||||||
"Contributor" shall mean Licensor and any individual or Legal Entity
|
|
||||||
on behalf of whom a Contribution has been received by Licensor and
|
|
||||||
subsequently incorporated within the Work.
|
|
||||||
|
|
||||||
2. Grant of Copyright License. Subject to the terms and conditions of
|
|
||||||
this License, each Contributor hereby grants to You a perpetual,
|
|
||||||
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
|
|
||||||
copyright license to reproduce, prepare Derivative Works of,
|
|
||||||
publicly display, publicly perform, sublicense, and distribute the
|
|
||||||
Work and such Derivative Works in Source or Object form.
|
|
||||||
|
|
||||||
3. Grant of Patent License. Subject to the terms and conditions of
|
|
||||||
this License, each Contributor hereby grants to You a perpetual,
|
|
||||||
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
|
|
||||||
(except as stated in this section) patent license to make, have made,
|
|
||||||
use, offer to sell, sell, import, and otherwise transfer the Work,
|
|
||||||
where such license applies only to those patent claims licensable
|
|
||||||
by such Contributor that are necessarily infringed by their
|
|
||||||
Contribution(s) alone or by combination of their Contribution(s)
|
|
||||||
with the Work to which such Contribution(s) was submitted. If You
|
|
||||||
institute patent litigation against any entity (including a
|
|
||||||
cross-claim or counterclaim in a lawsuit) alleging that the Work
|
|
||||||
or a Contribution incorporated within the Work constitutes direct
|
|
||||||
or contributory patent infringement, then any patent licenses
|
|
||||||
granted to You under this License for that Work shall terminate
|
|
||||||
as of the date such litigation is filed.
|
|
||||||
|
|
||||||
4. Redistribution. You may reproduce and distribute copies of the
|
|
||||||
Work or Derivative Works thereof in any medium, with or without
|
|
||||||
modifications, and in Source or Object form, provided that You
|
|
||||||
meet the following conditions:
|
|
||||||
|
|
||||||
(a) You must give any other recipients of the Work or
|
|
||||||
Derivative Works a copy of this License; and
|
|
||||||
|
|
||||||
(b) You must cause any modified files to carry prominent notices
|
|
||||||
stating that You changed the files; and
|
|
||||||
|
|
||||||
(c) You must retain, in the Source form of any Derivative Works
|
|
||||||
that You distribute, all copyright, patent, trademark, and
|
|
||||||
attribution notices from the Source form of the Work,
|
|
||||||
excluding those notices that do not pertain to any part of
|
|
||||||
the Derivative Works; and
|
|
||||||
|
|
||||||
(d) If the Work includes a "NOTICE" text file as part of its
|
|
||||||
distribution, then any Derivative Works that You distribute must
|
|
||||||
include a readable copy of the attribution notices contained
|
|
||||||
within such NOTICE file, excluding those notices that do not
|
|
||||||
pertain to any part of the Derivative Works, in at least one
|
|
||||||
of the following places: within a NOTICE text file distributed
|
|
||||||
as part of the Derivative Works; within the Source form or
|
|
||||||
documentation, if provided along with the Derivative Works; or,
|
|
||||||
within a display generated by the Derivative Works, if and
|
|
||||||
wherever such third-party notices normally appear. The contents
|
|
||||||
of the NOTICE file are for informational purposes only and
|
|
||||||
do not modify the License. You may add Your own attribution
|
|
||||||
notices within Derivative Works that You distribute, alongside
|
|
||||||
or as an addendum to the NOTICE text from the Work, provided
|
|
||||||
that such additional attribution notices cannot be construed
|
|
||||||
as modifying the License.
|
|
||||||
|
|
||||||
You may add Your own copyright statement to Your modifications and
|
|
||||||
may provide additional or different license terms and conditions
|
|
||||||
for use, reproduction, or distribution of Your modifications, or
|
|
||||||
for any such Derivative Works as a whole, provided Your use,
|
|
||||||
reproduction, and distribution of the Work otherwise complies with
|
|
||||||
the conditions stated in this License.
|
|
||||||
|
|
||||||
5. Submission of Contributions. Unless You explicitly state otherwise,
|
|
||||||
any Contribution intentionally submitted for inclusion in the Work
|
|
||||||
by You to the Licensor shall be under the terms and conditions of
|
|
||||||
this License, without any additional terms or conditions.
|
|
||||||
Notwithstanding the above, nothing herein shall supersede or modify
|
|
||||||
the terms of any separate license agreement you may have executed
|
|
||||||
with Licensor regarding such Contributions.
|
|
||||||
|
|
||||||
6. Trademarks. This License does not grant permission to use the trade
|
|
||||||
names, trademarks, service marks, or product names of the Licensor,
|
|
||||||
except as required for reasonable and customary use in describing the
|
|
||||||
origin of the Work and reproducing the content of the NOTICE file.
|
|
||||||
|
|
||||||
7. Disclaimer of Warranty. Unless required by applicable law or
|
|
||||||
agreed to in writing, Licensor provides the Work (and each
|
|
||||||
Contributor provides its Contributions) on an "AS IS" BASIS,
|
|
||||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
|
|
||||||
implied, including, without limitation, any warranties or conditions
|
|
||||||
of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
|
|
||||||
PARTICULAR PURPOSE. You are solely responsible for determining the
|
|
||||||
appropriateness of using or redistributing the Work and assume any
|
|
||||||
risks associated with Your exercise of permissions under this License.
|
|
||||||
|
|
||||||
8. Limitation of Liability. In no event and under no legal theory,
|
|
||||||
whether in tort (including negligence), contract, or otherwise,
|
|
||||||
unless required by applicable law (such as deliberate and grossly
|
|
||||||
negligent acts) or agreed to in writing, shall any Contributor be
|
|
||||||
liable to You for damages, including any direct, indirect, special,
|
|
||||||
incidental, or consequential damages of any character arising as a
|
|
||||||
result of this License or out of the use or inability to use the
|
|
||||||
Work (including but not limited to damages for loss of goodwill,
|
|
||||||
work stoppage, computer failure or malfunction, or any and all
|
|
||||||
other commercial damages or losses), even if such Contributor
|
|
||||||
has been advised of the possibility of such damages.
|
|
||||||
|
|
||||||
9. Accepting Warranty or Additional Liability. While redistributing
|
|
||||||
the Work or Derivative Works thereof, You may choose to offer,
|
|
||||||
and charge a fee for, acceptance of support, warranty, indemnity,
|
|
||||||
or other liability obligations and/or rights consistent with this
|
|
||||||
License. However, in accepting such obligations, You may act only
|
|
||||||
on Your own behalf and on Your sole responsibility, not on behalf
|
|
||||||
of any other Contributor, and only if You agree to indemnify,
|
|
||||||
defend, and hold each Contributor harmless for any liability
|
|
||||||
incurred by, or claims asserted against, such Contributor by reason
|
|
||||||
of your accepting any such warranty or additional liability.
|
|
||||||
|
|
||||||
END OF TERMS AND CONDITIONS
|
|
||||||
|
|
||||||
Copyright 2013-2017 Docker, Inc.
|
|
||||||
|
|
||||||
Licensed under the Apache License, Version 2.0 (the "License");
|
|
||||||
you may not use this file except in compliance with the License.
|
|
||||||
You may obtain a copy of the License at
|
|
||||||
|
|
||||||
https://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
|
|
||||||
Unless required by applicable law or agreed to in writing, software
|
|
||||||
distributed under the License is distributed on an "AS IS" BASIS,
|
|
||||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
||||||
See the License for the specific language governing permissions and
|
|
||||||
limitations under the License.
|
|
120
vendor/github.com/docker/docker/cli/config/config.go
generated
vendored
120
vendor/github.com/docker/docker/cli/config/config.go
generated
vendored
|
@ -1,120 +0,0 @@
|
||||||
package config
|
|
||||||
|
|
||||||
import (
|
|
||||||
"fmt"
|
|
||||||
"io"
|
|
||||||
"os"
|
|
||||||
"path/filepath"
|
|
||||||
|
|
||||||
"github.com/docker/docker/api/types"
|
|
||||||
"github.com/docker/docker/cli/config/configfile"
|
|
||||||
"github.com/docker/docker/pkg/homedir"
|
|
||||||
)
|
|
||||||
|
|
||||||
const (
|
|
||||||
// ConfigFileName is the name of config file
|
|
||||||
ConfigFileName = "config.json"
|
|
||||||
configFileDir = ".docker"
|
|
||||||
oldConfigfile = ".dockercfg"
|
|
||||||
)
|
|
||||||
|
|
||||||
var (
|
|
||||||
configDir = os.Getenv("DOCKER_CONFIG")
|
|
||||||
)
|
|
||||||
|
|
||||||
func init() {
|
|
||||||
if configDir == "" {
|
|
||||||
configDir = filepath.Join(homedir.Get(), configFileDir)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Dir returns the directory the configuration file is stored in
|
|
||||||
func Dir() string {
|
|
||||||
return configDir
|
|
||||||
}
|
|
||||||
|
|
||||||
// SetDir sets the directory the configuration file is stored in
|
|
||||||
func SetDir(dir string) {
|
|
||||||
configDir = dir
|
|
||||||
}
|
|
||||||
|
|
||||||
// NewConfigFile initializes an empty configuration file for the given filename 'fn'
|
|
||||||
func NewConfigFile(fn string) *configfile.ConfigFile {
|
|
||||||
return &configfile.ConfigFile{
|
|
||||||
AuthConfigs: make(map[string]types.AuthConfig),
|
|
||||||
HTTPHeaders: make(map[string]string),
|
|
||||||
Filename: fn,
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// LegacyLoadFromReader is a convenience function that creates a ConfigFile object from
|
|
||||||
// a non-nested reader
|
|
||||||
func LegacyLoadFromReader(configData io.Reader) (*configfile.ConfigFile, error) {
|
|
||||||
configFile := configfile.ConfigFile{
|
|
||||||
AuthConfigs: make(map[string]types.AuthConfig),
|
|
||||||
}
|
|
||||||
err := configFile.LegacyLoadFromReader(configData)
|
|
||||||
return &configFile, err
|
|
||||||
}
|
|
||||||
|
|
||||||
// LoadFromReader is a convenience function that creates a ConfigFile object from
|
|
||||||
// a reader
|
|
||||||
func LoadFromReader(configData io.Reader) (*configfile.ConfigFile, error) {
|
|
||||||
configFile := configfile.ConfigFile{
|
|
||||||
AuthConfigs: make(map[string]types.AuthConfig),
|
|
||||||
}
|
|
||||||
err := configFile.LoadFromReader(configData)
|
|
||||||
return &configFile, err
|
|
||||||
}
|
|
||||||
|
|
||||||
// Load reads the configuration files in the given directory, and sets up
|
|
||||||
// the auth config information and returns values.
|
|
||||||
// FIXME: use the internal golang config parser
|
|
||||||
func Load(configDir string) (*configfile.ConfigFile, error) {
|
|
||||||
if configDir == "" {
|
|
||||||
configDir = Dir()
|
|
||||||
}
|
|
||||||
|
|
||||||
configFile := configfile.ConfigFile{
|
|
||||||
AuthConfigs: make(map[string]types.AuthConfig),
|
|
||||||
Filename: filepath.Join(configDir, ConfigFileName),
|
|
||||||
}
|
|
||||||
|
|
||||||
// Try happy path first - latest config file
|
|
||||||
if _, err := os.Stat(configFile.Filename); err == nil {
|
|
||||||
file, err := os.Open(configFile.Filename)
|
|
||||||
if err != nil {
|
|
||||||
return &configFile, fmt.Errorf("%s - %v", configFile.Filename, err)
|
|
||||||
}
|
|
||||||
defer file.Close()
|
|
||||||
err = configFile.LoadFromReader(file)
|
|
||||||
if err != nil {
|
|
||||||
err = fmt.Errorf("%s - %v", configFile.Filename, err)
|
|
||||||
}
|
|
||||||
return &configFile, err
|
|
||||||
} else if !os.IsNotExist(err) {
|
|
||||||
// if file is there but we can't stat it for any reason other
|
|
||||||
// than it doesn't exist then stop
|
|
||||||
return &configFile, fmt.Errorf("%s - %v", configFile.Filename, err)
|
|
||||||
}
|
|
||||||
|
|
||||||
// Can't find latest config file so check for the old one
|
|
||||||
confFile := filepath.Join(homedir.Get(), oldConfigfile)
|
|
||||||
if _, err := os.Stat(confFile); err != nil {
|
|
||||||
return &configFile, nil //missing file is not an error
|
|
||||||
}
|
|
||||||
file, err := os.Open(confFile)
|
|
||||||
if err != nil {
|
|
||||||
return &configFile, fmt.Errorf("%s - %v", confFile, err)
|
|
||||||
}
|
|
||||||
defer file.Close()
|
|
||||||
err = configFile.LegacyLoadFromReader(file)
|
|
||||||
if err != nil {
|
|
||||||
return &configFile, fmt.Errorf("%s - %v", confFile, err)
|
|
||||||
}
|
|
||||||
|
|
||||||
if configFile.HTTPHeaders == nil {
|
|
||||||
configFile.HTTPHeaders = map[string]string{}
|
|
||||||
}
|
|
||||||
return &configFile, nil
|
|
||||||
}
|
|
186
vendor/github.com/docker/docker/cli/config/configfile/file.go
generated
vendored
186
vendor/github.com/docker/docker/cli/config/configfile/file.go
generated
vendored
|
@ -1,186 +0,0 @@
|
||||||
package configfile
|
|
||||||
|
|
||||||
import (
|
|
||||||
"encoding/base64"
|
|
||||||
"encoding/json"
|
|
||||||
"fmt"
|
|
||||||
"io"
|
|
||||||
"io/ioutil"
|
|
||||||
"os"
|
|
||||||
"path/filepath"
|
|
||||||
"strings"
|
|
||||||
|
|
||||||
"github.com/docker/docker/api/types"
|
|
||||||
)
|
|
||||||
|
|
||||||
const (
|
|
||||||
// This constant is only used for really old config files when the
|
|
||||||
// URL wasn't saved as part of the config file and it was just
|
|
||||||
// assumed to be this value.
|
|
||||||
defaultIndexserver = "https://index.docker.io/v1/"
|
|
||||||
)
|
|
||||||
|
|
||||||
// ConfigFile ~/.docker/config.json file info
|
|
||||||
type ConfigFile struct {
|
|
||||||
AuthConfigs map[string]types.AuthConfig `json:"auths"`
|
|
||||||
HTTPHeaders map[string]string `json:"HttpHeaders,omitempty"`
|
|
||||||
PsFormat string `json:"psFormat,omitempty"`
|
|
||||||
ImagesFormat string `json:"imagesFormat,omitempty"`
|
|
||||||
NetworksFormat string `json:"networksFormat,omitempty"`
|
|
||||||
PluginsFormat string `json:"pluginsFormat,omitempty"`
|
|
||||||
VolumesFormat string `json:"volumesFormat,omitempty"`
|
|
||||||
StatsFormat string `json:"statsFormat,omitempty"`
|
|
||||||
DetachKeys string `json:"detachKeys,omitempty"`
|
|
||||||
CredentialsStore string `json:"credsStore,omitempty"`
|
|
||||||
CredentialHelpers map[string]string `json:"credHelpers,omitempty"`
|
|
||||||
Filename string `json:"-"` // Note: for internal use only
|
|
||||||
ServiceInspectFormat string `json:"serviceInspectFormat,omitempty"`
|
|
||||||
ServicesFormat string `json:"servicesFormat,omitempty"`
|
|
||||||
TasksFormat string `json:"tasksFormat,omitempty"`
|
|
||||||
}
|
|
||||||
|
|
||||||
// LegacyLoadFromReader reads the non-nested configuration data given and sets up the
|
|
||||||
// auth config information with given directory and populates the receiver object
|
|
||||||
func (configFile *ConfigFile) LegacyLoadFromReader(configData io.Reader) error {
|
|
||||||
b, err := ioutil.ReadAll(configData)
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
if err := json.Unmarshal(b, &configFile.AuthConfigs); err != nil {
|
|
||||||
arr := strings.Split(string(b), "\n")
|
|
||||||
if len(arr) < 2 {
|
|
||||||
return fmt.Errorf("The Auth config file is empty")
|
|
||||||
}
|
|
||||||
authConfig := types.AuthConfig{}
|
|
||||||
origAuth := strings.Split(arr[0], " = ")
|
|
||||||
if len(origAuth) != 2 {
|
|
||||||
return fmt.Errorf("Invalid Auth config file")
|
|
||||||
}
|
|
||||||
authConfig.Username, authConfig.Password, err = decodeAuth(origAuth[1])
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
authConfig.ServerAddress = defaultIndexserver
|
|
||||||
configFile.AuthConfigs[defaultIndexserver] = authConfig
|
|
||||||
} else {
|
|
||||||
for k, authConfig := range configFile.AuthConfigs {
|
|
||||||
authConfig.Username, authConfig.Password, err = decodeAuth(authConfig.Auth)
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
authConfig.Auth = ""
|
|
||||||
authConfig.ServerAddress = k
|
|
||||||
configFile.AuthConfigs[k] = authConfig
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// LoadFromReader reads the configuration data given and sets up the auth config
|
|
||||||
// information with given directory and populates the receiver object
|
|
||||||
func (configFile *ConfigFile) LoadFromReader(configData io.Reader) error {
|
|
||||||
if err := json.NewDecoder(configData).Decode(&configFile); err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
var err error
|
|
||||||
for addr, ac := range configFile.AuthConfigs {
|
|
||||||
ac.Username, ac.Password, err = decodeAuth(ac.Auth)
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
ac.Auth = ""
|
|
||||||
ac.ServerAddress = addr
|
|
||||||
configFile.AuthConfigs[addr] = ac
|
|
||||||
}
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// ContainsAuth returns whether there is authentication configured
|
|
||||||
// in this file or not.
|
|
||||||
func (configFile *ConfigFile) ContainsAuth() bool {
|
|
||||||
return configFile.CredentialsStore != "" ||
|
|
||||||
len(configFile.CredentialHelpers) > 0 ||
|
|
||||||
len(configFile.AuthConfigs) > 0
|
|
||||||
}
|
|
||||||
|
|
||||||
// SaveToWriter encodes and writes out all the authorization information to
|
|
||||||
// the given writer
|
|
||||||
func (configFile *ConfigFile) SaveToWriter(writer io.Writer) error {
|
|
||||||
// Encode sensitive data into a new/temp struct
|
|
||||||
tmpAuthConfigs := make(map[string]types.AuthConfig, len(configFile.AuthConfigs))
|
|
||||||
for k, authConfig := range configFile.AuthConfigs {
|
|
||||||
authCopy := authConfig
|
|
||||||
// encode and save the authstring, while blanking out the original fields
|
|
||||||
authCopy.Auth = encodeAuth(&authCopy)
|
|
||||||
authCopy.Username = ""
|
|
||||||
authCopy.Password = ""
|
|
||||||
authCopy.ServerAddress = ""
|
|
||||||
tmpAuthConfigs[k] = authCopy
|
|
||||||
}
|
|
||||||
|
|
||||||
saveAuthConfigs := configFile.AuthConfigs
|
|
||||||
configFile.AuthConfigs = tmpAuthConfigs
|
|
||||||
defer func() { configFile.AuthConfigs = saveAuthConfigs }()
|
|
||||||
|
|
||||||
data, err := json.MarshalIndent(configFile, "", "\t")
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
_, err = writer.Write(data)
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
// Save encodes and writes out all the authorization information
|
|
||||||
func (configFile *ConfigFile) Save() error {
|
|
||||||
if configFile.Filename == "" {
|
|
||||||
return fmt.Errorf("Can't save config with empty filename")
|
|
||||||
}
|
|
||||||
|
|
||||||
if err := os.MkdirAll(filepath.Dir(configFile.Filename), 0700); err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
f, err := os.OpenFile(configFile.Filename, os.O_WRONLY|os.O_CREATE|os.O_TRUNC, 0600)
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
defer f.Close()
|
|
||||||
return configFile.SaveToWriter(f)
|
|
||||||
}
|
|
||||||
|
|
||||||
// encodeAuth creates a base64 encoded string to containing authorization information
|
|
||||||
func encodeAuth(authConfig *types.AuthConfig) string {
|
|
||||||
if authConfig.Username == "" && authConfig.Password == "" {
|
|
||||||
return ""
|
|
||||||
}
|
|
||||||
|
|
||||||
authStr := authConfig.Username + ":" + authConfig.Password
|
|
||||||
msg := []byte(authStr)
|
|
||||||
encoded := make([]byte, base64.StdEncoding.EncodedLen(len(msg)))
|
|
||||||
base64.StdEncoding.Encode(encoded, msg)
|
|
||||||
return string(encoded)
|
|
||||||
}
|
|
||||||
|
|
||||||
// decodeAuth decodes a base64 encoded string and returns username and password
|
|
||||||
func decodeAuth(authStr string) (string, string, error) {
|
|
||||||
if authStr == "" {
|
|
||||||
return "", "", nil
|
|
||||||
}
|
|
||||||
|
|
||||||
decLen := base64.StdEncoding.DecodedLen(len(authStr))
|
|
||||||
decoded := make([]byte, decLen)
|
|
||||||
authByte := []byte(authStr)
|
|
||||||
n, err := base64.StdEncoding.Decode(decoded, authByte)
|
|
||||||
if err != nil {
|
|
||||||
return "", "", err
|
|
||||||
}
|
|
||||||
if n > decLen {
|
|
||||||
return "", "", fmt.Errorf("Something went wrong decoding auth config")
|
|
||||||
}
|
|
||||||
arr := strings.SplitN(string(decoded), ":", 2)
|
|
||||||
if len(arr) != 2 {
|
|
||||||
return "", "", fmt.Errorf("Invalid auth configuration file")
|
|
||||||
}
|
|
||||||
password := strings.Trim(arr[1], "\x00")
|
|
||||||
return arr[0], password, nil
|
|
||||||
}
|
|
191
vendor/github.com/docker/docker/client/LICENSE
generated
vendored
191
vendor/github.com/docker/docker/client/LICENSE
generated
vendored
|
@ -1,191 +0,0 @@
|
||||||
|
|
||||||
Apache License
|
|
||||||
Version 2.0, January 2004
|
|
||||||
https://www.apache.org/licenses/
|
|
||||||
|
|
||||||
TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
|
|
||||||
|
|
||||||
1. Definitions.
|
|
||||||
|
|
||||||
"License" shall mean the terms and conditions for use, reproduction,
|
|
||||||
and distribution as defined by Sections 1 through 9 of this document.
|
|
||||||
|
|
||||||
"Licensor" shall mean the copyright owner or entity authorized by
|
|
||||||
the copyright owner that is granting the License.
|
|
||||||
|
|
||||||
"Legal Entity" shall mean the union of the acting entity and all
|
|
||||||
other entities that control, are controlled by, or are under common
|
|
||||||
control with that entity. For the purposes of this definition,
|
|
||||||
"control" means (i) the power, direct or indirect, to cause the
|
|
||||||
direction or management of such entity, whether by contract or
|
|
||||||
otherwise, or (ii) ownership of fifty percent (50%) or more of the
|
|
||||||
outstanding shares, or (iii) beneficial ownership of such entity.
|
|
||||||
|
|
||||||
"You" (or "Your") shall mean an individual or Legal Entity
|
|
||||||
exercising permissions granted by this License.
|
|
||||||
|
|
||||||
"Source" form shall mean the preferred form for making modifications,
|
|
||||||
including but not limited to software source code, documentation
|
|
||||||
source, and configuration files.
|
|
||||||
|
|
||||||
"Object" form shall mean any form resulting from mechanical
|
|
||||||
transformation or translation of a Source form, including but
|
|
||||||
not limited to compiled object code, generated documentation,
|
|
||||||
and conversions to other media types.
|
|
||||||
|
|
||||||
"Work" shall mean the work of authorship, whether in Source or
|
|
||||||
Object form, made available under the License, as indicated by a
|
|
||||||
copyright notice that is included in or attached to the work
|
|
||||||
(an example is provided in the Appendix below).
|
|
||||||
|
|
||||||
"Derivative Works" shall mean any work, whether in Source or Object
|
|
||||||
form, that is based on (or derived from) the Work and for which the
|
|
||||||
editorial revisions, annotations, elaborations, or other modifications
|
|
||||||
represent, as a whole, an original work of authorship. For the purposes
|
|
||||||
of this License, Derivative Works shall not include works that remain
|
|
||||||
separable from, or merely link (or bind by name) to the interfaces of,
|
|
||||||
the Work and Derivative Works thereof.
|
|
||||||
|
|
||||||
"Contribution" shall mean any work of authorship, including
|
|
||||||
the original version of the Work and any modifications or additions
|
|
||||||
to that Work or Derivative Works thereof, that is intentionally
|
|
||||||
submitted to Licensor for inclusion in the Work by the copyright owner
|
|
||||||
or by an individual or Legal Entity authorized to submit on behalf of
|
|
||||||
the copyright owner. For the purposes of this definition, "submitted"
|
|
||||||
means any form of electronic, verbal, or written communication sent
|
|
||||||
to the Licensor or its representatives, including but not limited to
|
|
||||||
communication on electronic mailing lists, source code control systems,
|
|
||||||
and issue tracking systems that are managed by, or on behalf of, the
|
|
||||||
Licensor for the purpose of discussing and improving the Work, but
|
|
||||||
excluding communication that is conspicuously marked or otherwise
|
|
||||||
designated in writing by the copyright owner as "Not a Contribution."
|
|
||||||
|
|
||||||
"Contributor" shall mean Licensor and any individual or Legal Entity
|
|
||||||
on behalf of whom a Contribution has been received by Licensor and
|
|
||||||
subsequently incorporated within the Work.
|
|
||||||
|
|
||||||
2. Grant of Copyright License. Subject to the terms and conditions of
|
|
||||||
this License, each Contributor hereby grants to You a perpetual,
|
|
||||||
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
|
|
||||||
copyright license to reproduce, prepare Derivative Works of,
|
|
||||||
publicly display, publicly perform, sublicense, and distribute the
|
|
||||||
Work and such Derivative Works in Source or Object form.
|
|
||||||
|
|
||||||
3. Grant of Patent License. Subject to the terms and conditions of
|
|
||||||
this License, each Contributor hereby grants to You a perpetual,
|
|
||||||
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
|
|
||||||
(except as stated in this section) patent license to make, have made,
|
|
||||||
use, offer to sell, sell, import, and otherwise transfer the Work,
|
|
||||||
where such license applies only to those patent claims licensable
|
|
||||||
by such Contributor that are necessarily infringed by their
|
|
||||||
Contribution(s) alone or by combination of their Contribution(s)
|
|
||||||
with the Work to which such Contribution(s) was submitted. If You
|
|
||||||
institute patent litigation against any entity (including a
|
|
||||||
cross-claim or counterclaim in a lawsuit) alleging that the Work
|
|
||||||
or a Contribution incorporated within the Work constitutes direct
|
|
||||||
or contributory patent infringement, then any patent licenses
|
|
||||||
granted to You under this License for that Work shall terminate
|
|
||||||
as of the date such litigation is filed.
|
|
||||||
|
|
||||||
4. Redistribution. You may reproduce and distribute copies of the
|
|
||||||
Work or Derivative Works thereof in any medium, with or without
|
|
||||||
modifications, and in Source or Object form, provided that You
|
|
||||||
meet the following conditions:
|
|
||||||
|
|
||||||
(a) You must give any other recipients of the Work or
|
|
||||||
Derivative Works a copy of this License; and
|
|
||||||
|
|
||||||
(b) You must cause any modified files to carry prominent notices
|
|
||||||
stating that You changed the files; and
|
|
||||||
|
|
||||||
(c) You must retain, in the Source form of any Derivative Works
|
|
||||||
that You distribute, all copyright, patent, trademark, and
|
|
||||||
attribution notices from the Source form of the Work,
|
|
||||||
excluding those notices that do not pertain to any part of
|
|
||||||
the Derivative Works; and
|
|
||||||
|
|
||||||
(d) If the Work includes a "NOTICE" text file as part of its
|
|
||||||
distribution, then any Derivative Works that You distribute must
|
|
||||||
include a readable copy of the attribution notices contained
|
|
||||||
within such NOTICE file, excluding those notices that do not
|
|
||||||
pertain to any part of the Derivative Works, in at least one
|
|
||||||
of the following places: within a NOTICE text file distributed
|
|
||||||
as part of the Derivative Works; within the Source form or
|
|
||||||
documentation, if provided along with the Derivative Works; or,
|
|
||||||
within a display generated by the Derivative Works, if and
|
|
||||||
wherever such third-party notices normally appear. The contents
|
|
||||||
of the NOTICE file are for informational purposes only and
|
|
||||||
do not modify the License. You may add Your own attribution
|
|
||||||
notices within Derivative Works that You distribute, alongside
|
|
||||||
or as an addendum to the NOTICE text from the Work, provided
|
|
||||||
that such additional attribution notices cannot be construed
|
|
||||||
as modifying the License.
|
|
||||||
|
|
||||||
You may add Your own copyright statement to Your modifications and
|
|
||||||
may provide additional or different license terms and conditions
|
|
||||||
for use, reproduction, or distribution of Your modifications, or
|
|
||||||
for any such Derivative Works as a whole, provided Your use,
|
|
||||||
reproduction, and distribution of the Work otherwise complies with
|
|
||||||
the conditions stated in this License.
|
|
||||||
|
|
||||||
5. Submission of Contributions. Unless You explicitly state otherwise,
|
|
||||||
any Contribution intentionally submitted for inclusion in the Work
|
|
||||||
by You to the Licensor shall be under the terms and conditions of
|
|
||||||
this License, without any additional terms or conditions.
|
|
||||||
Notwithstanding the above, nothing herein shall supersede or modify
|
|
||||||
the terms of any separate license agreement you may have executed
|
|
||||||
with Licensor regarding such Contributions.
|
|
||||||
|
|
||||||
6. Trademarks. This License does not grant permission to use the trade
|
|
||||||
names, trademarks, service marks, or product names of the Licensor,
|
|
||||||
except as required for reasonable and customary use in describing the
|
|
||||||
origin of the Work and reproducing the content of the NOTICE file.
|
|
||||||
|
|
||||||
7. Disclaimer of Warranty. Unless required by applicable law or
|
|
||||||
agreed to in writing, Licensor provides the Work (and each
|
|
||||||
Contributor provides its Contributions) on an "AS IS" BASIS,
|
|
||||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
|
|
||||||
implied, including, without limitation, any warranties or conditions
|
|
||||||
of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
|
|
||||||
PARTICULAR PURPOSE. You are solely responsible for determining the
|
|
||||||
appropriateness of using or redistributing the Work and assume any
|
|
||||||
risks associated with Your exercise of permissions under this License.
|
|
||||||
|
|
||||||
8. Limitation of Liability. In no event and under no legal theory,
|
|
||||||
whether in tort (including negligence), contract, or otherwise,
|
|
||||||
unless required by applicable law (such as deliberate and grossly
|
|
||||||
negligent acts) or agreed to in writing, shall any Contributor be
|
|
||||||
liable to You for damages, including any direct, indirect, special,
|
|
||||||
incidental, or consequential damages of any character arising as a
|
|
||||||
result of this License or out of the use or inability to use the
|
|
||||||
Work (including but not limited to damages for loss of goodwill,
|
|
||||||
work stoppage, computer failure or malfunction, or any and all
|
|
||||||
other commercial damages or losses), even if such Contributor
|
|
||||||
has been advised of the possibility of such damages.
|
|
||||||
|
|
||||||
9. Accepting Warranty or Additional Liability. While redistributing
|
|
||||||
the Work or Derivative Works thereof, You may choose to offer,
|
|
||||||
and charge a fee for, acceptance of support, warranty, indemnity,
|
|
||||||
or other liability obligations and/or rights consistent with this
|
|
||||||
License. However, in accepting such obligations, You may act only
|
|
||||||
on Your own behalf and on Your sole responsibility, not on behalf
|
|
||||||
of any other Contributor, and only if You agree to indemnify,
|
|
||||||
defend, and hold each Contributor harmless for any liability
|
|
||||||
incurred by, or claims asserted against, such Contributor by reason
|
|
||||||
of your accepting any such warranty or additional liability.
|
|
||||||
|
|
||||||
END OF TERMS AND CONDITIONS
|
|
||||||
|
|
||||||
Copyright 2013-2017 Docker, Inc.
|
|
||||||
|
|
||||||
Licensed under the Apache License, Version 2.0 (the "License");
|
|
||||||
you may not use this file except in compliance with the License.
|
|
||||||
You may obtain a copy of the License at
|
|
||||||
|
|
||||||
https://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
|
|
||||||
Unless required by applicable law or agreed to in writing, software
|
|
||||||
distributed under the License is distributed on an "AS IS" BASIS,
|
|
||||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
||||||
See the License for the specific language governing permissions and
|
|
||||||
limitations under the License.
|
|
6
vendor/github.com/docker/docker/client/checkpoint_list.go
generated
vendored
6
vendor/github.com/docker/docker/client/checkpoint_list.go
generated
vendored
|
@ -2,7 +2,6 @@ package client
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"encoding/json"
|
"encoding/json"
|
||||||
"net/http"
|
|
||||||
"net/url"
|
"net/url"
|
||||||
|
|
||||||
"github.com/docker/docker/api/types"
|
"github.com/docker/docker/api/types"
|
||||||
|
@ -20,10 +19,7 @@ func (cli *Client) CheckpointList(ctx context.Context, container string, options
|
||||||
|
|
||||||
resp, err := cli.get(ctx, "/containers/"+container+"/checkpoints", query, nil)
|
resp, err := cli.get(ctx, "/containers/"+container+"/checkpoints", query, nil)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
if resp.statusCode == http.StatusNotFound {
|
return checkpoints, wrapResponseError(err, resp, "container", container)
|
||||||
return checkpoints, containerNotFoundError{container}
|
|
||||||
}
|
|
||||||
return checkpoints, err
|
|
||||||
}
|
}
|
||||||
|
|
||||||
err = json.NewDecoder(resp.body).Decode(&checkpoints)
|
err = json.NewDecoder(resp.body).Decode(&checkpoints)
|
||||||
|
|
141
vendor/github.com/docker/docker/client/client.go
generated
vendored
141
vendor/github.com/docker/docker/client/client.go
generated
vendored
|
@ -1,10 +1,6 @@
|
||||||
/*
|
/*
|
||||||
Package client is a Go client for the Docker Engine API.
|
Package client is a Go client for the Docker Engine API.
|
||||||
|
|
||||||
The "docker" command uses this package to communicate with the daemon. It can also
|
|
||||||
be used by your own Go applications to do anything the command-line interface does
|
|
||||||
- running containers, pulling images, managing swarms, etc.
|
|
||||||
|
|
||||||
For more information about the Engine API, see the documentation:
|
For more information about the Engine API, see the documentation:
|
||||||
https://docs.docker.com/engine/reference/api/
|
https://docs.docker.com/engine/reference/api/
|
||||||
|
|
||||||
|
@ -46,18 +42,26 @@ For example, to list running containers (the equivalent of "docker ps"):
|
||||||
package client
|
package client
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"errors"
|
||||||
"fmt"
|
"fmt"
|
||||||
"net/http"
|
"net/http"
|
||||||
"net/url"
|
"net/url"
|
||||||
"os"
|
"os"
|
||||||
|
"path"
|
||||||
"path/filepath"
|
"path/filepath"
|
||||||
"strings"
|
"strings"
|
||||||
|
|
||||||
"github.com/docker/docker/api"
|
"github.com/docker/docker/api"
|
||||||
|
"github.com/docker/docker/api/types"
|
||||||
|
"github.com/docker/docker/api/types/versions"
|
||||||
"github.com/docker/go-connections/sockets"
|
"github.com/docker/go-connections/sockets"
|
||||||
"github.com/docker/go-connections/tlsconfig"
|
"github.com/docker/go-connections/tlsconfig"
|
||||||
|
"golang.org/x/net/context"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
// ErrRedirect is the error returned by checkRedirect when the request is non-GET.
|
||||||
|
var ErrRedirect = errors.New("unexpected redirect in response")
|
||||||
|
|
||||||
// Client is the API client that performs all operations
|
// Client is the API client that performs all operations
|
||||||
// against a docker server.
|
// against a docker server.
|
||||||
type Client struct {
|
type Client struct {
|
||||||
|
@ -81,6 +85,23 @@ type Client struct {
|
||||||
manualOverride bool
|
manualOverride bool
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// CheckRedirect specifies the policy for dealing with redirect responses:
|
||||||
|
// If the request is non-GET return `ErrRedirect`. Otherwise use the last response.
|
||||||
|
//
|
||||||
|
// Go 1.8 changes behavior for HTTP redirects (specifically 301, 307, and 308) in the client .
|
||||||
|
// The Docker client (and by extension docker API client) can be made to to send a request
|
||||||
|
// like POST /containers//start where what would normally be in the name section of the URL is empty.
|
||||||
|
// This triggers an HTTP 301 from the daemon.
|
||||||
|
// In go 1.8 this 301 will be converted to a GET request, and ends up getting a 404 from the daemon.
|
||||||
|
// This behavior change manifests in the client in that before the 301 was not followed and
|
||||||
|
// the client did not generate an error, but now results in a message like Error response from daemon: page not found.
|
||||||
|
func CheckRedirect(req *http.Request, via []*http.Request) error {
|
||||||
|
if via[0].Method == http.MethodGet {
|
||||||
|
return http.ErrUseLastResponse
|
||||||
|
}
|
||||||
|
return ErrRedirect
|
||||||
|
}
|
||||||
|
|
||||||
// NewEnvClient initializes a new API client based on environment variables.
|
// NewEnvClient initializes a new API client based on environment variables.
|
||||||
// Use DOCKER_HOST to set the url to the docker server.
|
// Use DOCKER_HOST to set the url to the docker server.
|
||||||
// Use DOCKER_API_VERSION to set the version of the API to reach, leave empty for latest.
|
// Use DOCKER_API_VERSION to set the version of the API to reach, leave empty for latest.
|
||||||
|
@ -104,6 +125,7 @@ func NewEnvClient() (*Client, error) {
|
||||||
Transport: &http.Transport{
|
Transport: &http.Transport{
|
||||||
TLSClientConfig: tlsc,
|
TLSClientConfig: tlsc,
|
||||||
},
|
},
|
||||||
|
CheckRedirect: CheckRedirect,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -134,20 +156,21 @@ func NewEnvClient() (*Client, error) {
|
||||||
// highly recommended that you set a version or your client may break if the
|
// highly recommended that you set a version or your client may break if the
|
||||||
// server is upgraded.
|
// server is upgraded.
|
||||||
func NewClient(host string, version string, client *http.Client, httpHeaders map[string]string) (*Client, error) {
|
func NewClient(host string, version string, client *http.Client, httpHeaders map[string]string) (*Client, error) {
|
||||||
proto, addr, basePath, err := ParseHost(host)
|
hostURL, err := ParseHostURL(host)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
|
||||||
if client != nil {
|
if client != nil {
|
||||||
if _, ok := client.Transport.(*http.Transport); !ok {
|
if _, ok := client.Transport.(http.RoundTripper); !ok {
|
||||||
return nil, fmt.Errorf("unable to verify TLS configuration, invalid transport %v", client.Transport)
|
return nil, fmt.Errorf("unable to verify TLS configuration, invalid transport %v", client.Transport)
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
transport := new(http.Transport)
|
transport := new(http.Transport)
|
||||||
sockets.ConfigureTransport(transport, proto, addr)
|
sockets.ConfigureTransport(transport, hostURL.Scheme, hostURL.Host)
|
||||||
client = &http.Client{
|
client = &http.Client{
|
||||||
Transport: transport,
|
Transport: transport,
|
||||||
|
CheckRedirect: CheckRedirect,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -162,28 +185,24 @@ func NewClient(host string, version string, client *http.Client, httpHeaders map
|
||||||
scheme = "https"
|
scheme = "https"
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// TODO: store URL instead of proto/addr/basePath
|
||||||
return &Client{
|
return &Client{
|
||||||
scheme: scheme,
|
scheme: scheme,
|
||||||
host: host,
|
host: host,
|
||||||
proto: proto,
|
proto: hostURL.Scheme,
|
||||||
addr: addr,
|
addr: hostURL.Host,
|
||||||
basePath: basePath,
|
basePath: hostURL.Path,
|
||||||
client: client,
|
client: client,
|
||||||
version: version,
|
version: version,
|
||||||
customHTTPHeaders: httpHeaders,
|
customHTTPHeaders: httpHeaders,
|
||||||
}, nil
|
}, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
// Close ensures that transport.Client is closed
|
// Close the transport used by the client
|
||||||
// especially needed while using NewClient with *http.Client = nil
|
|
||||||
// for example
|
|
||||||
// client.NewClient("unix:///var/run/docker.sock", nil, "v1.18", map[string]string{"User-Agent": "engine-api-cli-1.0"})
|
|
||||||
func (cli *Client) Close() error {
|
func (cli *Client) Close() error {
|
||||||
|
|
||||||
if t, ok := cli.client.Transport.(*http.Transport); ok {
|
if t, ok := cli.client.Transport.(*http.Transport); ok {
|
||||||
t.CloseIdleConnections()
|
t.CloseIdleConnections()
|
||||||
}
|
}
|
||||||
|
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -193,42 +212,70 @@ func (cli *Client) getAPIPath(p string, query url.Values) string {
|
||||||
var apiPath string
|
var apiPath string
|
||||||
if cli.version != "" {
|
if cli.version != "" {
|
||||||
v := strings.TrimPrefix(cli.version, "v")
|
v := strings.TrimPrefix(cli.version, "v")
|
||||||
apiPath = fmt.Sprintf("%s/v%s%s", cli.basePath, v, p)
|
apiPath = path.Join(cli.basePath, "/v"+v, p)
|
||||||
} else {
|
} else {
|
||||||
apiPath = fmt.Sprintf("%s%s", cli.basePath, p)
|
apiPath = path.Join(cli.basePath, p)
|
||||||
}
|
}
|
||||||
|
return (&url.URL{Path: apiPath, RawQuery: query.Encode()}).String()
|
||||||
u := &url.URL{
|
|
||||||
Path: apiPath,
|
|
||||||
}
|
|
||||||
if len(query) > 0 {
|
|
||||||
u.RawQuery = query.Encode()
|
|
||||||
}
|
|
||||||
return u.String()
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// ClientVersion returns the version string associated with this
|
// ClientVersion returns the API version used by this client.
|
||||||
// instance of the Client. Note that this value can be changed
|
|
||||||
// via the DOCKER_API_VERSION env var.
|
|
||||||
// This operation doesn't acquire a mutex.
|
|
||||||
func (cli *Client) ClientVersion() string {
|
func (cli *Client) ClientVersion() string {
|
||||||
return cli.version
|
return cli.version
|
||||||
}
|
}
|
||||||
|
|
||||||
// UpdateClientVersion updates the version string associated with this
|
// NegotiateAPIVersion queries the API and updates the version to match the
|
||||||
// instance of the Client. This operation doesn't acquire a mutex.
|
// API version. Any errors are silently ignored.
|
||||||
func (cli *Client) UpdateClientVersion(v string) {
|
func (cli *Client) NegotiateAPIVersion(ctx context.Context) {
|
||||||
if !cli.manualOverride {
|
ping, _ := cli.Ping(ctx)
|
||||||
cli.version = v
|
cli.NegotiateAPIVersionPing(ping)
|
||||||
}
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// ParseHost verifies that the given host strings is valid.
|
// NegotiateAPIVersionPing updates the client version to match the Ping.APIVersion
|
||||||
|
// if the ping version is less than the default version.
|
||||||
|
func (cli *Client) NegotiateAPIVersionPing(p types.Ping) {
|
||||||
|
if cli.manualOverride {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
// try the latest version before versioning headers existed
|
||||||
|
if p.APIVersion == "" {
|
||||||
|
p.APIVersion = "1.24"
|
||||||
|
}
|
||||||
|
|
||||||
|
// if the client is not initialized with a version, start with the latest supported version
|
||||||
|
if cli.version == "" {
|
||||||
|
cli.version = api.DefaultVersion
|
||||||
|
}
|
||||||
|
|
||||||
|
// if server version is lower than the client version, downgrade
|
||||||
|
if versions.LessThan(p.APIVersion, cli.version) {
|
||||||
|
cli.version = p.APIVersion
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// DaemonHost returns the host address used by the client
|
||||||
|
func (cli *Client) DaemonHost() string {
|
||||||
|
return cli.host
|
||||||
|
}
|
||||||
|
|
||||||
|
// ParseHost parses a url string, validates the strings is a host url, and returns
|
||||||
|
// the parsed host as: protocol, address, and base path
|
||||||
|
// Deprecated: use ParseHostURL
|
||||||
func ParseHost(host string) (string, string, string, error) {
|
func ParseHost(host string) (string, string, string, error) {
|
||||||
|
hostURL, err := ParseHostURL(host)
|
||||||
|
if err != nil {
|
||||||
|
return "", "", "", err
|
||||||
|
}
|
||||||
|
return hostURL.Scheme, hostURL.Host, hostURL.Path, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// ParseHostURL parses a url string, validates the string is a host url, and
|
||||||
|
// returns the parsed URL
|
||||||
|
func ParseHostURL(host string) (*url.URL, error) {
|
||||||
protoAddrParts := strings.SplitN(host, "://", 2)
|
protoAddrParts := strings.SplitN(host, "://", 2)
|
||||||
if len(protoAddrParts) == 1 {
|
if len(protoAddrParts) == 1 {
|
||||||
return "", "", "", fmt.Errorf("unable to parse docker host `%s`", host)
|
return nil, fmt.Errorf("unable to parse docker host `%s`", host)
|
||||||
}
|
}
|
||||||
|
|
||||||
var basePath string
|
var basePath string
|
||||||
|
@ -236,16 +283,19 @@ func ParseHost(host string) (string, string, string, error) {
|
||||||
if proto == "tcp" {
|
if proto == "tcp" {
|
||||||
parsed, err := url.Parse("tcp://" + addr)
|
parsed, err := url.Parse("tcp://" + addr)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return "", "", "", err
|
return nil, err
|
||||||
}
|
}
|
||||||
addr = parsed.Host
|
addr = parsed.Host
|
||||||
basePath = parsed.Path
|
basePath = parsed.Path
|
||||||
}
|
}
|
||||||
return proto, addr, basePath, nil
|
return &url.URL{
|
||||||
|
Scheme: proto,
|
||||||
|
Host: addr,
|
||||||
|
Path: basePath,
|
||||||
|
}, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
// CustomHTTPHeaders returns the custom http headers associated with this
|
// CustomHTTPHeaders returns the custom http headers stored by the client.
|
||||||
// instance of the Client. This operation doesn't acquire a mutex.
|
|
||||||
func (cli *Client) CustomHTTPHeaders() map[string]string {
|
func (cli *Client) CustomHTTPHeaders() map[string]string {
|
||||||
m := make(map[string]string)
|
m := make(map[string]string)
|
||||||
for k, v := range cli.customHTTPHeaders {
|
for k, v := range cli.customHTTPHeaders {
|
||||||
|
@ -254,8 +304,7 @@ func (cli *Client) CustomHTTPHeaders() map[string]string {
|
||||||
return m
|
return m
|
||||||
}
|
}
|
||||||
|
|
||||||
// SetCustomHTTPHeaders updates the custom http headers associated with this
|
// SetCustomHTTPHeaders that will be set on every HTTP request made by the client.
|
||||||
// instance of the Client. This operation doesn't acquire a mutex.
|
|
||||||
func (cli *Client) SetCustomHTTPHeaders(headers map[string]string) {
|
func (cli *Client) SetCustomHTTPHeaders(headers map[string]string) {
|
||||||
cli.customHTTPHeaders = headers
|
cli.customHTTPHeaders = headers
|
||||||
}
|
}
|
||||||
|
|
2
vendor/github.com/docker/docker/client/client_unix.go
generated
vendored
2
vendor/github.com/docker/docker/client/client_unix.go
generated
vendored
|
@ -1,4 +1,4 @@
|
||||||
// +build linux freebsd solaris openbsd darwin
|
// +build linux freebsd openbsd darwin
|
||||||
|
|
||||||
package client
|
package client
|
||||||
|
|
||||||
|
|
20
vendor/github.com/docker/docker/client/container_attach.go
generated
vendored
20
vendor/github.com/docker/docker/client/container_attach.go
generated
vendored
|
@ -11,6 +11,26 @@ import (
|
||||||
// It returns a types.HijackedConnection with the hijacked connection
|
// It returns a types.HijackedConnection with the hijacked connection
|
||||||
// and the a reader to get output. It's up to the called to close
|
// and the a reader to get output. It's up to the called to close
|
||||||
// the hijacked connection by calling types.HijackedResponse.Close.
|
// the hijacked connection by calling types.HijackedResponse.Close.
|
||||||
|
//
|
||||||
|
// The stream format on the response will be in one of two formats:
|
||||||
|
//
|
||||||
|
// If the container is using a TTY, there is only a single stream (stdout), and
|
||||||
|
// data is copied directly from the container output stream, no extra
|
||||||
|
// multiplexing or headers.
|
||||||
|
//
|
||||||
|
// If the container is *not* using a TTY, streams for stdout and stderr are
|
||||||
|
// multiplexed.
|
||||||
|
// The format of the multiplexed stream is as follows:
|
||||||
|
//
|
||||||
|
// [8]byte{STREAM_TYPE, 0, 0, 0, SIZE1, SIZE2, SIZE3, SIZE4}[]byte{OUTPUT}
|
||||||
|
//
|
||||||
|
// STREAM_TYPE can be 1 for stdout and 2 for stderr
|
||||||
|
//
|
||||||
|
// SIZE1, SIZE2, SIZE3, and SIZE4 are four bytes of uint32 encoded as big endian.
|
||||||
|
// This is the size of OUTPUT.
|
||||||
|
//
|
||||||
|
// You can use github.com/docker/docker/pkg/stdcopy.StdCopy to demultiplex this
|
||||||
|
// stream.
|
||||||
func (cli *Client) ContainerAttach(ctx context.Context, container string, options types.ContainerAttachOptions) (types.HijackedResponse, error) {
|
func (cli *Client) ContainerAttach(ctx context.Context, container string, options types.ContainerAttachOptions) (types.HijackedResponse, error) {
|
||||||
query := url.Values{}
|
query := url.Values{}
|
||||||
if options.Stream {
|
if options.Stream {
|
||||||
|
|
2
vendor/github.com/docker/docker/client/container_commit.go
generated
vendored
2
vendor/github.com/docker/docker/client/container_commit.go
generated
vendored
|
@ -39,7 +39,7 @@ func (cli *Client) ContainerCommit(ctx context.Context, container string, option
|
||||||
for _, change := range options.Changes {
|
for _, change := range options.Changes {
|
||||||
query.Add("changes", change)
|
query.Add("changes", change)
|
||||||
}
|
}
|
||||||
if options.Pause != true {
|
if !options.Pause {
|
||||||
query.Set("pause", "0")
|
query.Set("pause", "0")
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
11
vendor/github.com/docker/docker/client/container_copy.go
generated
vendored
11
vendor/github.com/docker/docker/client/container_copy.go
generated
vendored
|
@ -20,7 +20,7 @@ func (cli *Client) ContainerStatPath(ctx context.Context, containerID, path stri
|
||||||
query := url.Values{}
|
query := url.Values{}
|
||||||
query.Set("path", filepath.ToSlash(path)) // Normalize the paths used in the API.
|
query.Set("path", filepath.ToSlash(path)) // Normalize the paths used in the API.
|
||||||
|
|
||||||
urlStr := fmt.Sprintf("/containers/%s/archive", containerID)
|
urlStr := "/containers/" + containerID + "/archive"
|
||||||
response, err := cli.head(ctx, urlStr, query, nil)
|
response, err := cli.head(ctx, urlStr, query, nil)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return types.ContainerPathStat{}, err
|
return types.ContainerPathStat{}, err
|
||||||
|
@ -30,6 +30,7 @@ func (cli *Client) ContainerStatPath(ctx context.Context, containerID, path stri
|
||||||
}
|
}
|
||||||
|
|
||||||
// CopyToContainer copies content into the container filesystem.
|
// CopyToContainer copies content into the container filesystem.
|
||||||
|
// Note that `content` must be a Reader for a TAR
|
||||||
func (cli *Client) CopyToContainer(ctx context.Context, container, path string, content io.Reader, options types.CopyToContainerOptions) error {
|
func (cli *Client) CopyToContainer(ctx context.Context, container, path string, content io.Reader, options types.CopyToContainerOptions) error {
|
||||||
query := url.Values{}
|
query := url.Values{}
|
||||||
query.Set("path", filepath.ToSlash(path)) // Normalize the paths used in the API.
|
query.Set("path", filepath.ToSlash(path)) // Normalize the paths used in the API.
|
||||||
|
@ -38,7 +39,11 @@ func (cli *Client) CopyToContainer(ctx context.Context, container, path string,
|
||||||
query.Set("noOverwriteDirNonDir", "true")
|
query.Set("noOverwriteDirNonDir", "true")
|
||||||
}
|
}
|
||||||
|
|
||||||
apiPath := fmt.Sprintf("/containers/%s/archive", container)
|
if options.CopyUIDGID {
|
||||||
|
query.Set("copyUIDGID", "true")
|
||||||
|
}
|
||||||
|
|
||||||
|
apiPath := "/containers/" + container + "/archive"
|
||||||
|
|
||||||
response, err := cli.putRaw(ctx, apiPath, query, content, nil)
|
response, err := cli.putRaw(ctx, apiPath, query, content, nil)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
@ -59,7 +64,7 @@ func (cli *Client) CopyFromContainer(ctx context.Context, container, srcPath str
|
||||||
query := make(url.Values, 1)
|
query := make(url.Values, 1)
|
||||||
query.Set("path", filepath.ToSlash(srcPath)) // Normalize the paths used in the API.
|
query.Set("path", filepath.ToSlash(srcPath)) // Normalize the paths used in the API.
|
||||||
|
|
||||||
apiPath := fmt.Sprintf("/containers/%s/archive", container)
|
apiPath := "/containers/" + container + "/archive"
|
||||||
response, err := cli.get(ctx, apiPath, query, nil)
|
response, err := cli.get(ctx, apiPath, query, nil)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, types.ContainerPathStat{}, err
|
return nil, types.ContainerPathStat{}, err
|
||||||
|
|
2
vendor/github.com/docker/docker/client/container_create.go
generated
vendored
2
vendor/github.com/docker/docker/client/container_create.go
generated
vendored
|
@ -45,7 +45,7 @@ func (cli *Client) ContainerCreate(ctx context.Context, config *container.Config
|
||||||
serverResp, err := cli.post(ctx, "/containers/create", query, body, nil)
|
serverResp, err := cli.post(ctx, "/containers/create", query, body, nil)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
if serverResp.statusCode == 404 && strings.Contains(err.Error(), "No such image") {
|
if serverResp.statusCode == 404 && strings.Contains(err.Error(), "No such image") {
|
||||||
return response, imageNotFoundError{config.Image}
|
return response, objectNotFoundError{object: "image", id: config.Image}
|
||||||
}
|
}
|
||||||
return response, err
|
return response, err
|
||||||
}
|
}
|
||||||
|
|
2
vendor/github.com/docker/docker/client/container_exec.go
generated
vendored
2
vendor/github.com/docker/docker/client/container_exec.go
generated
vendored
|
@ -35,7 +35,7 @@ func (cli *Client) ContainerExecStart(ctx context.Context, execID string, config
|
||||||
// It returns a types.HijackedConnection with the hijacked connection
|
// It returns a types.HijackedConnection with the hijacked connection
|
||||||
// and the a reader to get output. It's up to the called to close
|
// and the a reader to get output. It's up to the called to close
|
||||||
// the hijacked connection by calling types.HijackedResponse.Close.
|
// the hijacked connection by calling types.HijackedResponse.Close.
|
||||||
func (cli *Client) ContainerExecAttach(ctx context.Context, execID string, config types.ExecConfig) (types.HijackedResponse, error) {
|
func (cli *Client) ContainerExecAttach(ctx context.Context, execID string, config types.ExecStartCheck) (types.HijackedResponse, error) {
|
||||||
headers := map[string][]string{"Content-Type": {"application/json"}}
|
headers := map[string][]string{"Content-Type": {"application/json"}}
|
||||||
return cli.postHijacked(ctx, "/exec/"+execID+"/start", nil, config, headers)
|
return cli.postHijacked(ctx, "/exec/"+execID+"/start", nil, config, headers)
|
||||||
}
|
}
|
||||||
|
|
11
vendor/github.com/docker/docker/client/container_inspect.go
generated
vendored
11
vendor/github.com/docker/docker/client/container_inspect.go
generated
vendored
|
@ -4,7 +4,6 @@ import (
|
||||||
"bytes"
|
"bytes"
|
||||||
"encoding/json"
|
"encoding/json"
|
||||||
"io/ioutil"
|
"io/ioutil"
|
||||||
"net/http"
|
|
||||||
"net/url"
|
"net/url"
|
||||||
|
|
||||||
"github.com/docker/docker/api/types"
|
"github.com/docker/docker/api/types"
|
||||||
|
@ -15,10 +14,7 @@ import (
|
||||||
func (cli *Client) ContainerInspect(ctx context.Context, containerID string) (types.ContainerJSON, error) {
|
func (cli *Client) ContainerInspect(ctx context.Context, containerID string) (types.ContainerJSON, error) {
|
||||||
serverResp, err := cli.get(ctx, "/containers/"+containerID+"/json", nil, nil)
|
serverResp, err := cli.get(ctx, "/containers/"+containerID+"/json", nil, nil)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
if serverResp.statusCode == http.StatusNotFound {
|
return types.ContainerJSON{}, wrapResponseError(err, serverResp, "container", containerID)
|
||||||
return types.ContainerJSON{}, containerNotFoundError{containerID}
|
|
||||||
}
|
|
||||||
return types.ContainerJSON{}, err
|
|
||||||
}
|
}
|
||||||
|
|
||||||
var response types.ContainerJSON
|
var response types.ContainerJSON
|
||||||
|
@ -35,10 +31,7 @@ func (cli *Client) ContainerInspectWithRaw(ctx context.Context, containerID stri
|
||||||
}
|
}
|
||||||
serverResp, err := cli.get(ctx, "/containers/"+containerID+"/json", query, nil)
|
serverResp, err := cli.get(ctx, "/containers/"+containerID+"/json", query, nil)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
if serverResp.statusCode == http.StatusNotFound {
|
return types.ContainerJSON{}, nil, wrapResponseError(err, serverResp, "container", containerID)
|
||||||
return types.ContainerJSON{}, nil, containerNotFoundError{containerID}
|
|
||||||
}
|
|
||||||
return types.ContainerJSON{}, nil, err
|
|
||||||
}
|
}
|
||||||
defer ensureReaderClosed(serverResp)
|
defer ensureReaderClosed(serverResp)
|
||||||
|
|
||||||
|
|
28
vendor/github.com/docker/docker/client/container_logs.go
generated
vendored
28
vendor/github.com/docker/docker/client/container_logs.go
generated
vendored
|
@ -13,6 +13,26 @@ import (
|
||||||
|
|
||||||
// ContainerLogs returns the logs generated by a container in an io.ReadCloser.
|
// ContainerLogs returns the logs generated by a container in an io.ReadCloser.
|
||||||
// It's up to the caller to close the stream.
|
// It's up to the caller to close the stream.
|
||||||
|
//
|
||||||
|
// The stream format on the response will be in one of two formats:
|
||||||
|
//
|
||||||
|
// If the container is using a TTY, there is only a single stream (stdout), and
|
||||||
|
// data is copied directly from the container output stream, no extra
|
||||||
|
// multiplexing or headers.
|
||||||
|
//
|
||||||
|
// If the container is *not* using a TTY, streams for stdout and stderr are
|
||||||
|
// multiplexed.
|
||||||
|
// The format of the multiplexed stream is as follows:
|
||||||
|
//
|
||||||
|
// [8]byte{STREAM_TYPE, 0, 0, 0, SIZE1, SIZE2, SIZE3, SIZE4}[]byte{OUTPUT}
|
||||||
|
//
|
||||||
|
// STREAM_TYPE can be 1 for stdout and 2 for stderr
|
||||||
|
//
|
||||||
|
// SIZE1, SIZE2, SIZE3, and SIZE4 are four bytes of uint32 encoded as big endian.
|
||||||
|
// This is the size of OUTPUT.
|
||||||
|
//
|
||||||
|
// You can use github.com/docker/docker/pkg/stdcopy.StdCopy to demultiplex this
|
||||||
|
// stream.
|
||||||
func (cli *Client) ContainerLogs(ctx context.Context, container string, options types.ContainerLogsOptions) (io.ReadCloser, error) {
|
func (cli *Client) ContainerLogs(ctx context.Context, container string, options types.ContainerLogsOptions) (io.ReadCloser, error) {
|
||||||
query := url.Values{}
|
query := url.Values{}
|
||||||
if options.ShowStdout {
|
if options.ShowStdout {
|
||||||
|
@ -31,6 +51,14 @@ func (cli *Client) ContainerLogs(ctx context.Context, container string, options
|
||||||
query.Set("since", ts)
|
query.Set("since", ts)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if options.Until != "" {
|
||||||
|
ts, err := timetypes.GetTimestamp(options.Until, time.Now())
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
query.Set("until", ts)
|
||||||
|
}
|
||||||
|
|
||||||
if options.Timestamps {
|
if options.Timestamps {
|
||||||
query.Set("timestamps", "1")
|
query.Set("timestamps", "1")
|
||||||
}
|
}
|
||||||
|
|
2
vendor/github.com/docker/docker/client/container_remove.go
generated
vendored
2
vendor/github.com/docker/docker/client/container_remove.go
generated
vendored
|
@ -23,5 +23,5 @@ func (cli *Client) ContainerRemove(ctx context.Context, containerID string, opti
|
||||||
|
|
||||||
resp, err := cli.delete(ctx, "/containers/"+containerID, query, nil)
|
resp, err := cli.delete(ctx, "/containers/"+containerID, query, nil)
|
||||||
ensureReaderClosed(resp)
|
ensureReaderClosed(resp)
|
||||||
return err
|
return wrapResponseError(err, resp, "container", containerID)
|
||||||
}
|
}
|
||||||
|
|
82
vendor/github.com/docker/docker/client/container_wait.go
generated
vendored
82
vendor/github.com/docker/docker/client/container_wait.go
generated
vendored
|
@ -2,25 +2,83 @@ package client
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"encoding/json"
|
"encoding/json"
|
||||||
|
"net/url"
|
||||||
|
|
||||||
"golang.org/x/net/context"
|
"golang.org/x/net/context"
|
||||||
|
|
||||||
"github.com/docker/docker/api/types/container"
|
"github.com/docker/docker/api/types/container"
|
||||||
|
"github.com/docker/docker/api/types/versions"
|
||||||
)
|
)
|
||||||
|
|
||||||
// ContainerWait pauses execution until a container exits.
|
// ContainerWait waits until the specified container is in a certain state
|
||||||
// It returns the API status code as response of its readiness.
|
// indicated by the given condition, either "not-running" (default),
|
||||||
func (cli *Client) ContainerWait(ctx context.Context, containerID string) (int64, error) {
|
// "next-exit", or "removed".
|
||||||
resp, err := cli.post(ctx, "/containers/"+containerID+"/wait", nil, nil, nil)
|
//
|
||||||
|
// If this client's API version is before 1.30, condition is ignored and
|
||||||
|
// ContainerWait will return immediately with the two channels, as the server
|
||||||
|
// will wait as if the condition were "not-running".
|
||||||
|
//
|
||||||
|
// If this client's API version is at least 1.30, ContainerWait blocks until
|
||||||
|
// the request has been acknowledged by the server (with a response header),
|
||||||
|
// then returns two channels on which the caller can wait for the exit status
|
||||||
|
// of the container or an error if there was a problem either beginning the
|
||||||
|
// wait request or in getting the response. This allows the caller to
|
||||||
|
// synchronize ContainerWait with other calls, such as specifying a
|
||||||
|
// "next-exit" condition before issuing a ContainerStart request.
|
||||||
|
func (cli *Client) ContainerWait(ctx context.Context, containerID string, condition container.WaitCondition) (<-chan container.ContainerWaitOKBody, <-chan error) {
|
||||||
|
if versions.LessThan(cli.ClientVersion(), "1.30") {
|
||||||
|
return cli.legacyContainerWait(ctx, containerID)
|
||||||
|
}
|
||||||
|
|
||||||
|
resultC := make(chan container.ContainerWaitOKBody)
|
||||||
|
errC := make(chan error, 1)
|
||||||
|
|
||||||
|
query := url.Values{}
|
||||||
|
query.Set("condition", string(condition))
|
||||||
|
|
||||||
|
resp, err := cli.post(ctx, "/containers/"+containerID+"/wait", query, nil, nil)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return -1, err
|
defer ensureReaderClosed(resp)
|
||||||
}
|
errC <- err
|
||||||
defer ensureReaderClosed(resp)
|
return resultC, errC
|
||||||
|
|
||||||
var res container.ContainerWaitOKBody
|
|
||||||
if err := json.NewDecoder(resp.body).Decode(&res); err != nil {
|
|
||||||
return -1, err
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return res.StatusCode, nil
|
go func() {
|
||||||
|
defer ensureReaderClosed(resp)
|
||||||
|
var res container.ContainerWaitOKBody
|
||||||
|
if err := json.NewDecoder(resp.body).Decode(&res); err != nil {
|
||||||
|
errC <- err
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
resultC <- res
|
||||||
|
}()
|
||||||
|
|
||||||
|
return resultC, errC
|
||||||
|
}
|
||||||
|
|
||||||
|
// legacyContainerWait returns immediately and doesn't have an option to wait
|
||||||
|
// until the container is removed.
|
||||||
|
func (cli *Client) legacyContainerWait(ctx context.Context, containerID string) (<-chan container.ContainerWaitOKBody, <-chan error) {
|
||||||
|
resultC := make(chan container.ContainerWaitOKBody)
|
||||||
|
errC := make(chan error)
|
||||||
|
|
||||||
|
go func() {
|
||||||
|
resp, err := cli.post(ctx, "/containers/"+containerID+"/wait", nil, nil, nil)
|
||||||
|
if err != nil {
|
||||||
|
errC <- err
|
||||||
|
return
|
||||||
|
}
|
||||||
|
defer ensureReaderClosed(resp)
|
||||||
|
|
||||||
|
var res container.ContainerWaitOKBody
|
||||||
|
if err := json.NewDecoder(resp.body).Decode(&res); err != nil {
|
||||||
|
errC <- err
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
resultC <- res
|
||||||
|
}()
|
||||||
|
|
||||||
|
return resultC, errC
|
||||||
}
|
}
|
||||||
|
|
229
vendor/github.com/docker/docker/client/errors.go
generated
vendored
229
vendor/github.com/docker/docker/client/errors.go
generated
vendored
|
@ -3,6 +3,8 @@ package client
|
||||||
import (
|
import (
|
||||||
"fmt"
|
"fmt"
|
||||||
|
|
||||||
|
"net/http"
|
||||||
|
|
||||||
"github.com/docker/docker/api/types/versions"
|
"github.com/docker/docker/api/types/versions"
|
||||||
"github.com/pkg/errors"
|
"github.com/pkg/errors"
|
||||||
)
|
)
|
||||||
|
@ -36,95 +38,37 @@ type notFound interface {
|
||||||
NotFound() bool // Is the error a NotFound error
|
NotFound() bool // Is the error a NotFound error
|
||||||
}
|
}
|
||||||
|
|
||||||
// IsErrNotFound returns true if the error is caused with an
|
// IsErrNotFound returns true if the error is a NotFound error, which is returned
|
||||||
// object (image, container, network, volume, …) is not found in the docker host.
|
// by the API when some object is not found.
|
||||||
func IsErrNotFound(err error) bool {
|
func IsErrNotFound(err error) bool {
|
||||||
te, ok := err.(notFound)
|
te, ok := err.(notFound)
|
||||||
return ok && te.NotFound()
|
return ok && te.NotFound()
|
||||||
}
|
}
|
||||||
|
|
||||||
// imageNotFoundError implements an error returned when an image is not in the docker host.
|
type objectNotFoundError struct {
|
||||||
type imageNotFoundError struct {
|
object string
|
||||||
imageID string
|
id string
|
||||||
}
|
}
|
||||||
|
|
||||||
// NotFound indicates that this error type is of NotFound
|
func (e objectNotFoundError) NotFound() bool {
|
||||||
func (e imageNotFoundError) NotFound() bool {
|
|
||||||
return true
|
return true
|
||||||
}
|
}
|
||||||
|
|
||||||
// Error returns a string representation of an imageNotFoundError
|
func (e objectNotFoundError) Error() string {
|
||||||
func (e imageNotFoundError) Error() string {
|
return fmt.Sprintf("Error: No such %s: %s", e.object, e.id)
|
||||||
return fmt.Sprintf("Error: No such image: %s", e.imageID)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// IsErrImageNotFound returns true if the error is caused
|
func wrapResponseError(err error, resp serverResponse, object, id string) error {
|
||||||
// when an image is not found in the docker host.
|
switch {
|
||||||
func IsErrImageNotFound(err error) bool {
|
case err == nil:
|
||||||
return IsErrNotFound(err)
|
return nil
|
||||||
}
|
case resp.statusCode == http.StatusNotFound:
|
||||||
|
return objectNotFoundError{object: object, id: id}
|
||||||
// containerNotFoundError implements an error returned when a container is not in the docker host.
|
case resp.statusCode == http.StatusNotImplemented:
|
||||||
type containerNotFoundError struct {
|
return notImplementedError{message: err.Error()}
|
||||||
containerID string
|
default:
|
||||||
}
|
return err
|
||||||
|
}
|
||||||
// NotFound indicates that this error type is of NotFound
|
|
||||||
func (e containerNotFoundError) NotFound() bool {
|
|
||||||
return true
|
|
||||||
}
|
|
||||||
|
|
||||||
// Error returns a string representation of a containerNotFoundError
|
|
||||||
func (e containerNotFoundError) Error() string {
|
|
||||||
return fmt.Sprintf("Error: No such container: %s", e.containerID)
|
|
||||||
}
|
|
||||||
|
|
||||||
// IsErrContainerNotFound returns true if the error is caused
|
|
||||||
// when a container is not found in the docker host.
|
|
||||||
func IsErrContainerNotFound(err error) bool {
|
|
||||||
return IsErrNotFound(err)
|
|
||||||
}
|
|
||||||
|
|
||||||
// networkNotFoundError implements an error returned when a network is not in the docker host.
|
|
||||||
type networkNotFoundError struct {
|
|
||||||
networkID string
|
|
||||||
}
|
|
||||||
|
|
||||||
// NotFound indicates that this error type is of NotFound
|
|
||||||
func (e networkNotFoundError) NotFound() bool {
|
|
||||||
return true
|
|
||||||
}
|
|
||||||
|
|
||||||
// Error returns a string representation of a networkNotFoundError
|
|
||||||
func (e networkNotFoundError) Error() string {
|
|
||||||
return fmt.Sprintf("Error: No such network: %s", e.networkID)
|
|
||||||
}
|
|
||||||
|
|
||||||
// IsErrNetworkNotFound returns true if the error is caused
|
|
||||||
// when a network is not found in the docker host.
|
|
||||||
func IsErrNetworkNotFound(err error) bool {
|
|
||||||
return IsErrNotFound(err)
|
|
||||||
}
|
|
||||||
|
|
||||||
// volumeNotFoundError implements an error returned when a volume is not in the docker host.
|
|
||||||
type volumeNotFoundError struct {
|
|
||||||
volumeID string
|
|
||||||
}
|
|
||||||
|
|
||||||
// NotFound indicates that this error type is of NotFound
|
|
||||||
func (e volumeNotFoundError) NotFound() bool {
|
|
||||||
return true
|
|
||||||
}
|
|
||||||
|
|
||||||
// Error returns a string representation of a volumeNotFoundError
|
|
||||||
func (e volumeNotFoundError) Error() string {
|
|
||||||
return fmt.Sprintf("Error: No such volume: %s", e.volumeID)
|
|
||||||
}
|
|
||||||
|
|
||||||
// IsErrVolumeNotFound returns true if the error is caused
|
|
||||||
// when a volume is not found in the docker host.
|
|
||||||
func IsErrVolumeNotFound(err error) bool {
|
|
||||||
return IsErrNotFound(err)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// unauthorizedError represents an authorization error in a remote registry.
|
// unauthorizedError represents an authorization error in a remote registry.
|
||||||
|
@ -144,72 +88,6 @@ func IsErrUnauthorized(err error) bool {
|
||||||
return ok
|
return ok
|
||||||
}
|
}
|
||||||
|
|
||||||
// nodeNotFoundError implements an error returned when a node is not found.
|
|
||||||
type nodeNotFoundError struct {
|
|
||||||
nodeID string
|
|
||||||
}
|
|
||||||
|
|
||||||
// Error returns a string representation of a nodeNotFoundError
|
|
||||||
func (e nodeNotFoundError) Error() string {
|
|
||||||
return fmt.Sprintf("Error: No such node: %s", e.nodeID)
|
|
||||||
}
|
|
||||||
|
|
||||||
// NotFound indicates that this error type is of NotFound
|
|
||||||
func (e nodeNotFoundError) NotFound() bool {
|
|
||||||
return true
|
|
||||||
}
|
|
||||||
|
|
||||||
// IsErrNodeNotFound returns true if the error is caused
|
|
||||||
// when a node is not found.
|
|
||||||
func IsErrNodeNotFound(err error) bool {
|
|
||||||
_, ok := err.(nodeNotFoundError)
|
|
||||||
return ok
|
|
||||||
}
|
|
||||||
|
|
||||||
// serviceNotFoundError implements an error returned when a service is not found.
|
|
||||||
type serviceNotFoundError struct {
|
|
||||||
serviceID string
|
|
||||||
}
|
|
||||||
|
|
||||||
// Error returns a string representation of a serviceNotFoundError
|
|
||||||
func (e serviceNotFoundError) Error() string {
|
|
||||||
return fmt.Sprintf("Error: No such service: %s", e.serviceID)
|
|
||||||
}
|
|
||||||
|
|
||||||
// NotFound indicates that this error type is of NotFound
|
|
||||||
func (e serviceNotFoundError) NotFound() bool {
|
|
||||||
return true
|
|
||||||
}
|
|
||||||
|
|
||||||
// IsErrServiceNotFound returns true if the error is caused
|
|
||||||
// when a service is not found.
|
|
||||||
func IsErrServiceNotFound(err error) bool {
|
|
||||||
_, ok := err.(serviceNotFoundError)
|
|
||||||
return ok
|
|
||||||
}
|
|
||||||
|
|
||||||
// taskNotFoundError implements an error returned when a task is not found.
|
|
||||||
type taskNotFoundError struct {
|
|
||||||
taskID string
|
|
||||||
}
|
|
||||||
|
|
||||||
// Error returns a string representation of a taskNotFoundError
|
|
||||||
func (e taskNotFoundError) Error() string {
|
|
||||||
return fmt.Sprintf("Error: No such task: %s", e.taskID)
|
|
||||||
}
|
|
||||||
|
|
||||||
// NotFound indicates that this error type is of NotFound
|
|
||||||
func (e taskNotFoundError) NotFound() bool {
|
|
||||||
return true
|
|
||||||
}
|
|
||||||
|
|
||||||
// IsErrTaskNotFound returns true if the error is caused
|
|
||||||
// when a task is not found.
|
|
||||||
func IsErrTaskNotFound(err error) bool {
|
|
||||||
_, ok := err.(taskNotFoundError)
|
|
||||||
return ok
|
|
||||||
}
|
|
||||||
|
|
||||||
type pluginPermissionDenied struct {
|
type pluginPermissionDenied struct {
|
||||||
name string
|
name string
|
||||||
}
|
}
|
||||||
|
@ -225,54 +103,31 @@ func IsErrPluginPermissionDenied(err error) bool {
|
||||||
return ok
|
return ok
|
||||||
}
|
}
|
||||||
|
|
||||||
|
type notImplementedError struct {
|
||||||
|
message string
|
||||||
|
}
|
||||||
|
|
||||||
|
func (e notImplementedError) Error() string {
|
||||||
|
return e.message
|
||||||
|
}
|
||||||
|
|
||||||
|
func (e notImplementedError) NotImplemented() bool {
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
|
||||||
|
// IsErrNotImplemented returns true if the error is a NotImplemented error.
|
||||||
|
// This is returned by the API when a requested feature has not been
|
||||||
|
// implemented.
|
||||||
|
func IsErrNotImplemented(err error) bool {
|
||||||
|
te, ok := err.(notImplementedError)
|
||||||
|
return ok && te.NotImplemented()
|
||||||
|
}
|
||||||
|
|
||||||
// NewVersionError returns an error if the APIVersion required
|
// NewVersionError returns an error if the APIVersion required
|
||||||
// if less than the current supported version
|
// if less than the current supported version
|
||||||
func (cli *Client) NewVersionError(APIrequired, feature string) error {
|
func (cli *Client) NewVersionError(APIrequired, feature string) error {
|
||||||
if versions.LessThan(cli.version, APIrequired) {
|
if cli.version != "" && versions.LessThan(cli.version, APIrequired) {
|
||||||
return fmt.Errorf("%q requires API version %s, but the Docker daemon API version is %s", feature, APIrequired, cli.version)
|
return fmt.Errorf("%q requires API version %s, but the Docker daemon API version is %s", feature, APIrequired, cli.version)
|
||||||
}
|
}
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
// secretNotFoundError implements an error returned when a secret is not found.
|
|
||||||
type secretNotFoundError struct {
|
|
||||||
name string
|
|
||||||
}
|
|
||||||
|
|
||||||
// Error returns a string representation of a secretNotFoundError
|
|
||||||
func (e secretNotFoundError) Error() string {
|
|
||||||
return fmt.Sprintf("Error: no such secret: %s", e.name)
|
|
||||||
}
|
|
||||||
|
|
||||||
// NotFound indicates that this error type is of NotFound
|
|
||||||
func (e secretNotFoundError) NotFound() bool {
|
|
||||||
return true
|
|
||||||
}
|
|
||||||
|
|
||||||
// IsErrSecretNotFound returns true if the error is caused
|
|
||||||
// when a secret is not found.
|
|
||||||
func IsErrSecretNotFound(err error) bool {
|
|
||||||
_, ok := err.(secretNotFoundError)
|
|
||||||
return ok
|
|
||||||
}
|
|
||||||
|
|
||||||
// pluginNotFoundError implements an error returned when a plugin is not in the docker host.
|
|
||||||
type pluginNotFoundError struct {
|
|
||||||
name string
|
|
||||||
}
|
|
||||||
|
|
||||||
// NotFound indicates that this error type is of NotFound
|
|
||||||
func (e pluginNotFoundError) NotFound() bool {
|
|
||||||
return true
|
|
||||||
}
|
|
||||||
|
|
||||||
// Error returns a string representation of a pluginNotFoundError
|
|
||||||
func (e pluginNotFoundError) Error() string {
|
|
||||||
return fmt.Sprintf("Error: No such plugin: %s", e.name)
|
|
||||||
}
|
|
||||||
|
|
||||||
// IsErrPluginNotFound returns true if the error is caused
|
|
||||||
// when a plugin is not found in the docker host.
|
|
||||||
func IsErrPluginNotFound(err error) bool {
|
|
||||||
return IsErrNotFound(err)
|
|
||||||
}
|
|
||||||
|
|
92
vendor/github.com/docker/docker/client/hijack.go
generated
vendored
92
vendor/github.com/docker/docker/client/hijack.go
generated
vendored
|
@ -1,8 +1,8 @@
|
||||||
package client
|
package client
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"bufio"
|
||||||
"crypto/tls"
|
"crypto/tls"
|
||||||
"errors"
|
|
||||||
"fmt"
|
"fmt"
|
||||||
"net"
|
"net"
|
||||||
"net/http"
|
"net/http"
|
||||||
|
@ -12,8 +12,8 @@ import (
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
"github.com/docker/docker/api/types"
|
"github.com/docker/docker/api/types"
|
||||||
"github.com/docker/docker/pkg/tlsconfig"
|
|
||||||
"github.com/docker/go-connections/sockets"
|
"github.com/docker/go-connections/sockets"
|
||||||
|
"github.com/pkg/errors"
|
||||||
"golang.org/x/net/context"
|
"golang.org/x/net/context"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
@ -46,37 +46,12 @@ func (cli *Client) postHijacked(ctx context.Context, path string, query url.Valu
|
||||||
}
|
}
|
||||||
req = cli.addHeaders(req, headers)
|
req = cli.addHeaders(req, headers)
|
||||||
|
|
||||||
req.Host = cli.addr
|
conn, err := cli.setupHijackConn(req, "tcp")
|
||||||
req.Header.Set("Connection", "Upgrade")
|
|
||||||
req.Header.Set("Upgrade", "tcp")
|
|
||||||
|
|
||||||
conn, err := dial(cli.proto, cli.addr, resolveTLSConfig(cli.client.Transport))
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
if strings.Contains(err.Error(), "connection refused") {
|
|
||||||
return types.HijackedResponse{}, fmt.Errorf("Cannot connect to the Docker daemon. Is 'docker daemon' running on this host?")
|
|
||||||
}
|
|
||||||
return types.HijackedResponse{}, err
|
return types.HijackedResponse{}, err
|
||||||
}
|
}
|
||||||
|
|
||||||
// When we set up a TCP connection for hijack, there could be long periods
|
return types.HijackedResponse{Conn: conn, Reader: bufio.NewReader(conn)}, err
|
||||||
// of inactivity (a long running command with no output) that in certain
|
|
||||||
// network setups may cause ECONNTIMEOUT, leaving the client in an unknown
|
|
||||||
// state. Setting TCP KeepAlive on the socket connection will prohibit
|
|
||||||
// ECONNTIMEOUT unless the socket connection truly is broken
|
|
||||||
if tcpConn, ok := conn.(*net.TCPConn); ok {
|
|
||||||
tcpConn.SetKeepAlive(true)
|
|
||||||
tcpConn.SetKeepAlivePeriod(30 * time.Second)
|
|
||||||
}
|
|
||||||
|
|
||||||
clientconn := httputil.NewClientConn(conn, nil)
|
|
||||||
defer clientconn.Close()
|
|
||||||
|
|
||||||
// Server hijacks the connection, error 'connection closed' expected
|
|
||||||
_, err = clientconn.Do(req)
|
|
||||||
|
|
||||||
rwc, br := clientconn.Hijack()
|
|
||||||
|
|
||||||
return types.HijackedResponse{Conn: rwc, Reader: br}, err
|
|
||||||
}
|
}
|
||||||
|
|
||||||
func tlsDial(network, addr string, config *tls.Config) (net.Conn, error) {
|
func tlsDial(network, addr string, config *tls.Config) (net.Conn, error) {
|
||||||
|
@ -95,7 +70,7 @@ func tlsDialWithDialer(dialer *net.Dialer, network, addr string, config *tls.Con
|
||||||
timeout := dialer.Timeout
|
timeout := dialer.Timeout
|
||||||
|
|
||||||
if !dialer.Deadline.IsZero() {
|
if !dialer.Deadline.IsZero() {
|
||||||
deadlineTimeout := dialer.Deadline.Sub(time.Now())
|
deadlineTimeout := time.Until(dialer.Deadline)
|
||||||
if timeout == 0 || deadlineTimeout < timeout {
|
if timeout == 0 || deadlineTimeout < timeout {
|
||||||
timeout = deadlineTimeout
|
timeout = deadlineTimeout
|
||||||
}
|
}
|
||||||
|
@ -139,7 +114,7 @@ func tlsDialWithDialer(dialer *net.Dialer, network, addr string, config *tls.Con
|
||||||
// from the hostname we're connecting to.
|
// from the hostname we're connecting to.
|
||||||
if config.ServerName == "" {
|
if config.ServerName == "" {
|
||||||
// Make a copy to avoid polluting argument or default.
|
// Make a copy to avoid polluting argument or default.
|
||||||
config = tlsconfig.Clone(config)
|
config = tlsConfigClone(config)
|
||||||
config.ServerName = hostname
|
config.ServerName = hostname
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -175,3 +150,58 @@ func dial(proto, addr string, tlsConfig *tls.Config) (net.Conn, error) {
|
||||||
}
|
}
|
||||||
return net.Dial(proto, addr)
|
return net.Dial(proto, addr)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (cli *Client) setupHijackConn(req *http.Request, proto string) (net.Conn, error) {
|
||||||
|
req.Host = cli.addr
|
||||||
|
req.Header.Set("Connection", "Upgrade")
|
||||||
|
req.Header.Set("Upgrade", proto)
|
||||||
|
|
||||||
|
conn, err := dial(cli.proto, cli.addr, resolveTLSConfig(cli.client.Transport))
|
||||||
|
if err != nil {
|
||||||
|
return nil, errors.Wrap(err, "cannot connect to the Docker daemon. Is 'docker daemon' running on this host?")
|
||||||
|
}
|
||||||
|
|
||||||
|
// When we set up a TCP connection for hijack, there could be long periods
|
||||||
|
// of inactivity (a long running command with no output) that in certain
|
||||||
|
// network setups may cause ECONNTIMEOUT, leaving the client in an unknown
|
||||||
|
// state. Setting TCP KeepAlive on the socket connection will prohibit
|
||||||
|
// ECONNTIMEOUT unless the socket connection truly is broken
|
||||||
|
if tcpConn, ok := conn.(*net.TCPConn); ok {
|
||||||
|
tcpConn.SetKeepAlive(true)
|
||||||
|
tcpConn.SetKeepAlivePeriod(30 * time.Second)
|
||||||
|
}
|
||||||
|
|
||||||
|
clientconn := httputil.NewClientConn(conn, nil)
|
||||||
|
defer clientconn.Close()
|
||||||
|
|
||||||
|
// Server hijacks the connection, error 'connection closed' expected
|
||||||
|
resp, err := clientconn.Do(req)
|
||||||
|
if err != httputil.ErrPersistEOF {
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
if resp.StatusCode != http.StatusSwitchingProtocols {
|
||||||
|
resp.Body.Close()
|
||||||
|
return nil, fmt.Errorf("unable to upgrade to %s, received %d", proto, resp.StatusCode)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
c, br := clientconn.Hijack()
|
||||||
|
if br.Buffered() > 0 {
|
||||||
|
// If there is buffered content, wrap the connection
|
||||||
|
c = &hijackedConn{c, br}
|
||||||
|
} else {
|
||||||
|
br.Reset(nil)
|
||||||
|
}
|
||||||
|
|
||||||
|
return c, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
type hijackedConn struct {
|
||||||
|
net.Conn
|
||||||
|
r *bufio.Reader
|
||||||
|
}
|
||||||
|
|
||||||
|
func (c *hijackedConn) Read(b []byte) (int, error) {
|
||||||
|
return c.r.Read(b)
|
||||||
|
}
|
||||||
|
|
16
vendor/github.com/docker/docker/client/image_build.go
generated
vendored
16
vendor/github.com/docker/docker/client/image_build.go
generated
vendored
|
@ -7,6 +7,7 @@ import (
|
||||||
"net/http"
|
"net/http"
|
||||||
"net/url"
|
"net/url"
|
||||||
"strconv"
|
"strconv"
|
||||||
|
"strings"
|
||||||
|
|
||||||
"golang.org/x/net/context"
|
"golang.org/x/net/context"
|
||||||
|
|
||||||
|
@ -29,6 +30,13 @@ func (cli *Client) ImageBuild(ctx context.Context, buildContext io.Reader, optio
|
||||||
return types.ImageBuildResponse{}, err
|
return types.ImageBuildResponse{}, err
|
||||||
}
|
}
|
||||||
headers.Add("X-Registry-Config", base64.URLEncoding.EncodeToString(buf))
|
headers.Add("X-Registry-Config", base64.URLEncoding.EncodeToString(buf))
|
||||||
|
|
||||||
|
if options.Platform != "" {
|
||||||
|
if err := cli.NewVersionError("1.32", "platform"); err != nil {
|
||||||
|
return types.ImageBuildResponse{}, err
|
||||||
|
}
|
||||||
|
query.Set("platform", options.Platform)
|
||||||
|
}
|
||||||
headers.Set("Content-Type", "application/x-tar")
|
headers.Set("Content-Type", "application/x-tar")
|
||||||
|
|
||||||
serverResp, err := cli.postRaw(ctx, "/build", query, buildContext, headers)
|
serverResp, err := cli.postRaw(ctx, "/build", query, buildContext, headers)
|
||||||
|
@ -95,6 +103,7 @@ func (cli *Client) imageBuildOptionsToQuery(options types.ImageBuildOptions) (ur
|
||||||
query.Set("cgroupparent", options.CgroupParent)
|
query.Set("cgroupparent", options.CgroupParent)
|
||||||
query.Set("shmsize", strconv.FormatInt(options.ShmSize, 10))
|
query.Set("shmsize", strconv.FormatInt(options.ShmSize, 10))
|
||||||
query.Set("dockerfile", options.Dockerfile)
|
query.Set("dockerfile", options.Dockerfile)
|
||||||
|
query.Set("target", options.Target)
|
||||||
|
|
||||||
ulimitsJSON, err := json.Marshal(options.Ulimits)
|
ulimitsJSON, err := json.Marshal(options.Ulimits)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
@ -119,6 +128,11 @@ func (cli *Client) imageBuildOptionsToQuery(options types.ImageBuildOptions) (ur
|
||||||
return query, err
|
return query, err
|
||||||
}
|
}
|
||||||
query.Set("cachefrom", string(cacheFromJSON))
|
query.Set("cachefrom", string(cacheFromJSON))
|
||||||
|
if options.SessionID != "" {
|
||||||
|
query.Set("session", options.SessionID)
|
||||||
|
}
|
||||||
|
if options.Platform != "" {
|
||||||
|
query.Set("platform", strings.ToLower(options.Platform))
|
||||||
|
}
|
||||||
return query, nil
|
return query, nil
|
||||||
}
|
}
|
||||||
|
|
4
vendor/github.com/docker/docker/client/image_create.go
generated
vendored
4
vendor/github.com/docker/docker/client/image_create.go
generated
vendored
|
@ -3,6 +3,7 @@ package client
|
||||||
import (
|
import (
|
||||||
"io"
|
"io"
|
||||||
"net/url"
|
"net/url"
|
||||||
|
"strings"
|
||||||
|
|
||||||
"golang.org/x/net/context"
|
"golang.org/x/net/context"
|
||||||
|
|
||||||
|
@ -21,6 +22,9 @@ func (cli *Client) ImageCreate(ctx context.Context, parentReference string, opti
|
||||||
query := url.Values{}
|
query := url.Values{}
|
||||||
query.Set("fromImage", reference.FamiliarName(ref))
|
query.Set("fromImage", reference.FamiliarName(ref))
|
||||||
query.Set("tag", getAPITagFromNamedRef(ref))
|
query.Set("tag", getAPITagFromNamedRef(ref))
|
||||||
|
if options.Platform != "" {
|
||||||
|
query.Set("platform", strings.ToLower(options.Platform))
|
||||||
|
}
|
||||||
resp, err := cli.tryImageCreate(ctx, query, options.RegistryAuth)
|
resp, err := cli.tryImageCreate(ctx, query, options.RegistryAuth)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
|
|
4
vendor/github.com/docker/docker/client/image_import.go
generated
vendored
4
vendor/github.com/docker/docker/client/image_import.go
generated
vendored
|
@ -3,6 +3,7 @@ package client
|
||||||
import (
|
import (
|
||||||
"io"
|
"io"
|
||||||
"net/url"
|
"net/url"
|
||||||
|
"strings"
|
||||||
|
|
||||||
"golang.org/x/net/context"
|
"golang.org/x/net/context"
|
||||||
|
|
||||||
|
@ -25,6 +26,9 @@ func (cli *Client) ImageImport(ctx context.Context, source types.ImageImportSour
|
||||||
query.Set("repo", ref)
|
query.Set("repo", ref)
|
||||||
query.Set("tag", options.Tag)
|
query.Set("tag", options.Tag)
|
||||||
query.Set("message", options.Message)
|
query.Set("message", options.Message)
|
||||||
|
if options.Platform != "" {
|
||||||
|
query.Set("platform", strings.ToLower(options.Platform))
|
||||||
|
}
|
||||||
for _, change := range options.Changes {
|
for _, change := range options.Changes {
|
||||||
query.Add("changes", change)
|
query.Add("changes", change)
|
||||||
}
|
}
|
||||||
|
|
6
vendor/github.com/docker/docker/client/image_inspect.go
generated
vendored
6
vendor/github.com/docker/docker/client/image_inspect.go
generated
vendored
|
@ -4,7 +4,6 @@ import (
|
||||||
"bytes"
|
"bytes"
|
||||||
"encoding/json"
|
"encoding/json"
|
||||||
"io/ioutil"
|
"io/ioutil"
|
||||||
"net/http"
|
|
||||||
|
|
||||||
"github.com/docker/docker/api/types"
|
"github.com/docker/docker/api/types"
|
||||||
"golang.org/x/net/context"
|
"golang.org/x/net/context"
|
||||||
|
@ -14,10 +13,7 @@ import (
|
||||||
func (cli *Client) ImageInspectWithRaw(ctx context.Context, imageID string) (types.ImageInspect, []byte, error) {
|
func (cli *Client) ImageInspectWithRaw(ctx context.Context, imageID string) (types.ImageInspect, []byte, error) {
|
||||||
serverResp, err := cli.get(ctx, "/images/"+imageID+"/json", nil, nil)
|
serverResp, err := cli.get(ctx, "/images/"+imageID+"/json", nil, nil)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
if serverResp.statusCode == http.StatusNotFound {
|
return types.ImageInspect{}, nil, wrapResponseError(err, serverResp, "image", imageID)
|
||||||
return types.ImageInspect{}, nil, imageNotFoundError{imageID}
|
|
||||||
}
|
|
||||||
return types.ImageInspect{}, nil, err
|
|
||||||
}
|
}
|
||||||
defer ensureReaderClosed(serverResp)
|
defer ensureReaderClosed(serverResp)
|
||||||
|
|
||||||
|
|
4
vendor/github.com/docker/docker/client/image_pull.go
generated
vendored
4
vendor/github.com/docker/docker/client/image_pull.go
generated
vendored
|
@ -4,6 +4,7 @@ import (
|
||||||
"io"
|
"io"
|
||||||
"net/http"
|
"net/http"
|
||||||
"net/url"
|
"net/url"
|
||||||
|
"strings"
|
||||||
|
|
||||||
"golang.org/x/net/context"
|
"golang.org/x/net/context"
|
||||||
|
|
||||||
|
@ -30,6 +31,9 @@ func (cli *Client) ImagePull(ctx context.Context, refStr string, options types.I
|
||||||
if !options.All {
|
if !options.All {
|
||||||
query.Set("tag", getAPITagFromNamedRef(ref))
|
query.Set("tag", getAPITagFromNamedRef(ref))
|
||||||
}
|
}
|
||||||
|
if options.Platform != "" {
|
||||||
|
query.Set("platform", strings.ToLower(options.Platform))
|
||||||
|
}
|
||||||
|
|
||||||
resp, err := cli.tryImageCreate(ctx, query, options.RegistryAuth)
|
resp, err := cli.tryImageCreate(ctx, query, options.RegistryAuth)
|
||||||
if resp.statusCode == http.StatusUnauthorized && options.PrivilegeFunc != nil {
|
if resp.statusCode == http.StatusUnauthorized && options.PrivilegeFunc != nil {
|
||||||
|
|
4
vendor/github.com/docker/docker/client/image_remove.go
generated
vendored
4
vendor/github.com/docker/docker/client/image_remove.go
generated
vendored
|
@ -19,12 +19,12 @@ func (cli *Client) ImageRemove(ctx context.Context, imageID string, options type
|
||||||
query.Set("noprune", "1")
|
query.Set("noprune", "1")
|
||||||
}
|
}
|
||||||
|
|
||||||
|
var dels []types.ImageDeleteResponseItem
|
||||||
resp, err := cli.delete(ctx, "/images/"+imageID, query, nil)
|
resp, err := cli.delete(ctx, "/images/"+imageID, query, nil)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return dels, wrapResponseError(err, resp, "image", imageID)
|
||||||
}
|
}
|
||||||
|
|
||||||
var dels []types.ImageDeleteResponseItem
|
|
||||||
err = json.NewDecoder(resp.body).Decode(&dels)
|
err = json.NewDecoder(resp.body).Decode(&dels)
|
||||||
ensureReaderClosed(resp)
|
ensureReaderClosed(resp)
|
||||||
return dels, err
|
return dels, err
|
||||||
|
|
2
vendor/github.com/docker/docker/client/image_search.go
generated
vendored
2
vendor/github.com/docker/docker/client/image_search.go
generated
vendored
|
@ -21,7 +21,7 @@ func (cli *Client) ImageSearch(ctx context.Context, term string, options types.I
|
||||||
query.Set("limit", fmt.Sprintf("%d", options.Limit))
|
query.Set("limit", fmt.Sprintf("%d", options.Limit))
|
||||||
|
|
||||||
if options.Filters.Len() > 0 {
|
if options.Filters.Len() > 0 {
|
||||||
filterJSON, err := filters.ToParam(options.Filters)
|
filterJSON, err := filters.ToJSON(options.Filters)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return results, err
|
return results, err
|
||||||
}
|
}
|
||||||
|
|
2
vendor/github.com/docker/docker/client/image_tag.go
generated
vendored
2
vendor/github.com/docker/docker/client/image_tag.go
generated
vendored
|
@ -10,7 +10,7 @@ import (
|
||||||
|
|
||||||
// ImageTag tags an image in the docker host
|
// ImageTag tags an image in the docker host
|
||||||
func (cli *Client) ImageTag(ctx context.Context, source, target string) error {
|
func (cli *Client) ImageTag(ctx context.Context, source, target string) error {
|
||||||
if _, err := reference.ParseNormalizedNamed(source); err != nil {
|
if _, err := reference.ParseAnyReference(source); err != nil {
|
||||||
return errors.Wrapf(err, "Error parsing reference: %q is not a valid repository/tag", source)
|
return errors.Wrapf(err, "Error parsing reference: %q is not a valid repository/tag", source)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
33
vendor/github.com/docker/docker/client/interface.go
generated
vendored
33
vendor/github.com/docker/docker/client/interface.go
generated
vendored
|
@ -2,6 +2,7 @@ package client
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"io"
|
"io"
|
||||||
|
"net"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
"github.com/docker/docker/api/types"
|
"github.com/docker/docker/api/types"
|
||||||
|
@ -18,7 +19,9 @@ import (
|
||||||
|
|
||||||
// CommonAPIClient is the common methods between stable and experimental versions of APIClient.
|
// CommonAPIClient is the common methods between stable and experimental versions of APIClient.
|
||||||
type CommonAPIClient interface {
|
type CommonAPIClient interface {
|
||||||
|
ConfigAPIClient
|
||||||
ContainerAPIClient
|
ContainerAPIClient
|
||||||
|
DistributionAPIClient
|
||||||
ImageAPIClient
|
ImageAPIClient
|
||||||
NodeAPIClient
|
NodeAPIClient
|
||||||
NetworkAPIClient
|
NetworkAPIClient
|
||||||
|
@ -29,8 +32,11 @@ type CommonAPIClient interface {
|
||||||
SystemAPIClient
|
SystemAPIClient
|
||||||
VolumeAPIClient
|
VolumeAPIClient
|
||||||
ClientVersion() string
|
ClientVersion() string
|
||||||
|
DaemonHost() string
|
||||||
ServerVersion(ctx context.Context) (types.Version, error)
|
ServerVersion(ctx context.Context) (types.Version, error)
|
||||||
UpdateClientVersion(v string)
|
NegotiateAPIVersion(ctx context.Context)
|
||||||
|
NegotiateAPIVersionPing(types.Ping)
|
||||||
|
DialSession(ctx context.Context, proto string, meta map[string][]string) (net.Conn, error)
|
||||||
}
|
}
|
||||||
|
|
||||||
// ContainerAPIClient defines API client methods for the containers
|
// ContainerAPIClient defines API client methods for the containers
|
||||||
|
@ -39,7 +45,7 @@ type ContainerAPIClient interface {
|
||||||
ContainerCommit(ctx context.Context, container string, options types.ContainerCommitOptions) (types.IDResponse, error)
|
ContainerCommit(ctx context.Context, container string, options types.ContainerCommitOptions) (types.IDResponse, error)
|
||||||
ContainerCreate(ctx context.Context, config *container.Config, hostConfig *container.HostConfig, networkingConfig *network.NetworkingConfig, containerName string) (container.ContainerCreateCreatedBody, error)
|
ContainerCreate(ctx context.Context, config *container.Config, hostConfig *container.HostConfig, networkingConfig *network.NetworkingConfig, containerName string) (container.ContainerCreateCreatedBody, error)
|
||||||
ContainerDiff(ctx context.Context, container string) ([]container.ContainerChangeResponseItem, error)
|
ContainerDiff(ctx context.Context, container string) ([]container.ContainerChangeResponseItem, error)
|
||||||
ContainerExecAttach(ctx context.Context, execID string, config types.ExecConfig) (types.HijackedResponse, error)
|
ContainerExecAttach(ctx context.Context, execID string, config types.ExecStartCheck) (types.HijackedResponse, error)
|
||||||
ContainerExecCreate(ctx context.Context, container string, config types.ExecConfig) (types.IDResponse, error)
|
ContainerExecCreate(ctx context.Context, container string, config types.ExecConfig) (types.IDResponse, error)
|
||||||
ContainerExecInspect(ctx context.Context, execID string) (types.ContainerExecInspect, error)
|
ContainerExecInspect(ctx context.Context, execID string) (types.ContainerExecInspect, error)
|
||||||
ContainerExecResize(ctx context.Context, execID string, options types.ResizeOptions) error
|
ContainerExecResize(ctx context.Context, execID string, options types.ResizeOptions) error
|
||||||
|
@ -62,15 +68,21 @@ type ContainerAPIClient interface {
|
||||||
ContainerTop(ctx context.Context, container string, arguments []string) (container.ContainerTopOKBody, error)
|
ContainerTop(ctx context.Context, container string, arguments []string) (container.ContainerTopOKBody, error)
|
||||||
ContainerUnpause(ctx context.Context, container string) error
|
ContainerUnpause(ctx context.Context, container string) error
|
||||||
ContainerUpdate(ctx context.Context, container string, updateConfig container.UpdateConfig) (container.ContainerUpdateOKBody, error)
|
ContainerUpdate(ctx context.Context, container string, updateConfig container.UpdateConfig) (container.ContainerUpdateOKBody, error)
|
||||||
ContainerWait(ctx context.Context, container string) (int64, error)
|
ContainerWait(ctx context.Context, container string, condition container.WaitCondition) (<-chan container.ContainerWaitOKBody, <-chan error)
|
||||||
CopyFromContainer(ctx context.Context, container, srcPath string) (io.ReadCloser, types.ContainerPathStat, error)
|
CopyFromContainer(ctx context.Context, container, srcPath string) (io.ReadCloser, types.ContainerPathStat, error)
|
||||||
CopyToContainer(ctx context.Context, container, path string, content io.Reader, options types.CopyToContainerOptions) error
|
CopyToContainer(ctx context.Context, container, path string, content io.Reader, options types.CopyToContainerOptions) error
|
||||||
ContainersPrune(ctx context.Context, pruneFilters filters.Args) (types.ContainersPruneReport, error)
|
ContainersPrune(ctx context.Context, pruneFilters filters.Args) (types.ContainersPruneReport, error)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// DistributionAPIClient defines API client methods for the registry
|
||||||
|
type DistributionAPIClient interface {
|
||||||
|
DistributionInspect(ctx context.Context, image, encodedRegistryAuth string) (registry.DistributionInspect, error)
|
||||||
|
}
|
||||||
|
|
||||||
// ImageAPIClient defines API client methods for the images
|
// ImageAPIClient defines API client methods for the images
|
||||||
type ImageAPIClient interface {
|
type ImageAPIClient interface {
|
||||||
ImageBuild(ctx context.Context, context io.Reader, options types.ImageBuildOptions) (types.ImageBuildResponse, error)
|
ImageBuild(ctx context.Context, context io.Reader, options types.ImageBuildOptions) (types.ImageBuildResponse, error)
|
||||||
|
BuildCachePrune(ctx context.Context) (*types.BuildCachePruneReport, error)
|
||||||
ImageCreate(ctx context.Context, parentReference string, options types.ImageCreateOptions) (io.ReadCloser, error)
|
ImageCreate(ctx context.Context, parentReference string, options types.ImageCreateOptions) (io.ReadCloser, error)
|
||||||
ImageHistory(ctx context.Context, image string) ([]image.HistoryResponseItem, error)
|
ImageHistory(ctx context.Context, image string) ([]image.HistoryResponseItem, error)
|
||||||
ImageImport(ctx context.Context, source types.ImageImportSource, ref string, options types.ImageImportOptions) (io.ReadCloser, error)
|
ImageImport(ctx context.Context, source types.ImageImportSource, ref string, options types.ImageImportOptions) (io.ReadCloser, error)
|
||||||
|
@ -91,8 +103,8 @@ type NetworkAPIClient interface {
|
||||||
NetworkConnect(ctx context.Context, networkID, container string, config *network.EndpointSettings) error
|
NetworkConnect(ctx context.Context, networkID, container string, config *network.EndpointSettings) error
|
||||||
NetworkCreate(ctx context.Context, name string, options types.NetworkCreate) (types.NetworkCreateResponse, error)
|
NetworkCreate(ctx context.Context, name string, options types.NetworkCreate) (types.NetworkCreateResponse, error)
|
||||||
NetworkDisconnect(ctx context.Context, networkID, container string, force bool) error
|
NetworkDisconnect(ctx context.Context, networkID, container string, force bool) error
|
||||||
NetworkInspect(ctx context.Context, networkID string, verbose bool) (types.NetworkResource, error)
|
NetworkInspect(ctx context.Context, networkID string, options types.NetworkInspectOptions) (types.NetworkResource, error)
|
||||||
NetworkInspectWithRaw(ctx context.Context, networkID string, verbose bool) (types.NetworkResource, []byte, error)
|
NetworkInspectWithRaw(ctx context.Context, networkID string, options types.NetworkInspectOptions) (types.NetworkResource, []byte, error)
|
||||||
NetworkList(ctx context.Context, options types.NetworkListOptions) ([]types.NetworkResource, error)
|
NetworkList(ctx context.Context, options types.NetworkListOptions) ([]types.NetworkResource, error)
|
||||||
NetworkRemove(ctx context.Context, networkID string) error
|
NetworkRemove(ctx context.Context, networkID string) error
|
||||||
NetworksPrune(ctx context.Context, pruneFilter filters.Args) (types.NetworksPruneReport, error)
|
NetworksPrune(ctx context.Context, pruneFilter filters.Args) (types.NetworksPruneReport, error)
|
||||||
|
@ -123,7 +135,7 @@ type PluginAPIClient interface {
|
||||||
// ServiceAPIClient defines API client methods for the services
|
// ServiceAPIClient defines API client methods for the services
|
||||||
type ServiceAPIClient interface {
|
type ServiceAPIClient interface {
|
||||||
ServiceCreate(ctx context.Context, service swarm.ServiceSpec, options types.ServiceCreateOptions) (types.ServiceCreateResponse, error)
|
ServiceCreate(ctx context.Context, service swarm.ServiceSpec, options types.ServiceCreateOptions) (types.ServiceCreateResponse, error)
|
||||||
ServiceInspectWithRaw(ctx context.Context, serviceID string) (swarm.Service, []byte, error)
|
ServiceInspectWithRaw(ctx context.Context, serviceID string, options types.ServiceInspectOptions) (swarm.Service, []byte, error)
|
||||||
ServiceList(ctx context.Context, options types.ServiceListOptions) ([]swarm.Service, error)
|
ServiceList(ctx context.Context, options types.ServiceListOptions) ([]swarm.Service, error)
|
||||||
ServiceRemove(ctx context.Context, serviceID string) error
|
ServiceRemove(ctx context.Context, serviceID string) error
|
||||||
ServiceUpdate(ctx context.Context, serviceID string, version swarm.Version, service swarm.ServiceSpec, options types.ServiceUpdateOptions) (types.ServiceUpdateResponse, error)
|
ServiceUpdate(ctx context.Context, serviceID string, version swarm.Version, service swarm.ServiceSpec, options types.ServiceUpdateOptions) (types.ServiceUpdateResponse, error)
|
||||||
|
@ -171,3 +183,12 @@ type SecretAPIClient interface {
|
||||||
SecretInspectWithRaw(ctx context.Context, name string) (swarm.Secret, []byte, error)
|
SecretInspectWithRaw(ctx context.Context, name string) (swarm.Secret, []byte, error)
|
||||||
SecretUpdate(ctx context.Context, id string, version swarm.Version, secret swarm.SecretSpec) error
|
SecretUpdate(ctx context.Context, id string, version swarm.Version, secret swarm.SecretSpec) error
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// ConfigAPIClient defines API client methods for configs
|
||||||
|
type ConfigAPIClient interface {
|
||||||
|
ConfigList(ctx context.Context, options types.ConfigListOptions) ([]swarm.Config, error)
|
||||||
|
ConfigCreate(ctx context.Context, config swarm.ConfigSpec) (types.ConfigCreateResponse, error)
|
||||||
|
ConfigRemove(ctx context.Context, id string) error
|
||||||
|
ConfigInspectWithRaw(ctx context.Context, name string) (swarm.Config, []byte, error)
|
||||||
|
ConfigUpdate(ctx context.Context, id string, version swarm.Version, config swarm.ConfigSpec) error
|
||||||
|
}
|
||||||
|
|
17
vendor/github.com/docker/docker/client/network_inspect.go
generated
vendored
17
vendor/github.com/docker/docker/client/network_inspect.go
generated
vendored
|
@ -4,7 +4,6 @@ import (
|
||||||
"bytes"
|
"bytes"
|
||||||
"encoding/json"
|
"encoding/json"
|
||||||
"io/ioutil"
|
"io/ioutil"
|
||||||
"net/http"
|
|
||||||
"net/url"
|
"net/url"
|
||||||
|
|
||||||
"github.com/docker/docker/api/types"
|
"github.com/docker/docker/api/types"
|
||||||
|
@ -12,28 +11,28 @@ import (
|
||||||
)
|
)
|
||||||
|
|
||||||
// NetworkInspect returns the information for a specific network configured in the docker host.
|
// NetworkInspect returns the information for a specific network configured in the docker host.
|
||||||
func (cli *Client) NetworkInspect(ctx context.Context, networkID string, verbose bool) (types.NetworkResource, error) {
|
func (cli *Client) NetworkInspect(ctx context.Context, networkID string, options types.NetworkInspectOptions) (types.NetworkResource, error) {
|
||||||
networkResource, _, err := cli.NetworkInspectWithRaw(ctx, networkID, verbose)
|
networkResource, _, err := cli.NetworkInspectWithRaw(ctx, networkID, options)
|
||||||
return networkResource, err
|
return networkResource, err
|
||||||
}
|
}
|
||||||
|
|
||||||
// NetworkInspectWithRaw returns the information for a specific network configured in the docker host and its raw representation.
|
// NetworkInspectWithRaw returns the information for a specific network configured in the docker host and its raw representation.
|
||||||
func (cli *Client) NetworkInspectWithRaw(ctx context.Context, networkID string, verbose bool) (types.NetworkResource, []byte, error) {
|
func (cli *Client) NetworkInspectWithRaw(ctx context.Context, networkID string, options types.NetworkInspectOptions) (types.NetworkResource, []byte, error) {
|
||||||
var (
|
var (
|
||||||
networkResource types.NetworkResource
|
networkResource types.NetworkResource
|
||||||
resp serverResponse
|
resp serverResponse
|
||||||
err error
|
err error
|
||||||
)
|
)
|
||||||
query := url.Values{}
|
query := url.Values{}
|
||||||
if verbose {
|
if options.Verbose {
|
||||||
query.Set("verbose", "true")
|
query.Set("verbose", "true")
|
||||||
}
|
}
|
||||||
|
if options.Scope != "" {
|
||||||
|
query.Set("scope", options.Scope)
|
||||||
|
}
|
||||||
resp, err = cli.get(ctx, "/networks/"+networkID, query, nil)
|
resp, err = cli.get(ctx, "/networks/"+networkID, query, nil)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
if resp.statusCode == http.StatusNotFound {
|
return networkResource, nil, wrapResponseError(err, resp, "network", networkID)
|
||||||
return networkResource, nil, networkNotFoundError{networkID}
|
|
||||||
}
|
|
||||||
return networkResource, nil, err
|
|
||||||
}
|
}
|
||||||
defer ensureReaderClosed(resp)
|
defer ensureReaderClosed(resp)
|
||||||
|
|
||||||
|
|
2
vendor/github.com/docker/docker/client/network_remove.go
generated
vendored
2
vendor/github.com/docker/docker/client/network_remove.go
generated
vendored
|
@ -6,5 +6,5 @@ import "golang.org/x/net/context"
|
||||||
func (cli *Client) NetworkRemove(ctx context.Context, networkID string) error {
|
func (cli *Client) NetworkRemove(ctx context.Context, networkID string) error {
|
||||||
resp, err := cli.delete(ctx, "/networks/"+networkID, nil, nil)
|
resp, err := cli.delete(ctx, "/networks/"+networkID, nil, nil)
|
||||||
ensureReaderClosed(resp)
|
ensureReaderClosed(resp)
|
||||||
return err
|
return wrapResponseError(err, resp, "network", networkID)
|
||||||
}
|
}
|
||||||
|
|
6
vendor/github.com/docker/docker/client/node_inspect.go
generated
vendored
6
vendor/github.com/docker/docker/client/node_inspect.go
generated
vendored
|
@ -4,7 +4,6 @@ import (
|
||||||
"bytes"
|
"bytes"
|
||||||
"encoding/json"
|
"encoding/json"
|
||||||
"io/ioutil"
|
"io/ioutil"
|
||||||
"net/http"
|
|
||||||
|
|
||||||
"github.com/docker/docker/api/types/swarm"
|
"github.com/docker/docker/api/types/swarm"
|
||||||
"golang.org/x/net/context"
|
"golang.org/x/net/context"
|
||||||
|
@ -14,10 +13,7 @@ import (
|
||||||
func (cli *Client) NodeInspectWithRaw(ctx context.Context, nodeID string) (swarm.Node, []byte, error) {
|
func (cli *Client) NodeInspectWithRaw(ctx context.Context, nodeID string) (swarm.Node, []byte, error) {
|
||||||
serverResp, err := cli.get(ctx, "/nodes/"+nodeID, nil, nil)
|
serverResp, err := cli.get(ctx, "/nodes/"+nodeID, nil, nil)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
if serverResp.statusCode == http.StatusNotFound {
|
return swarm.Node{}, nil, wrapResponseError(err, serverResp, "node", nodeID)
|
||||||
return swarm.Node{}, nil, nodeNotFoundError{nodeID}
|
|
||||||
}
|
|
||||||
return swarm.Node{}, nil, err
|
|
||||||
}
|
}
|
||||||
defer ensureReaderClosed(serverResp)
|
defer ensureReaderClosed(serverResp)
|
||||||
|
|
||||||
|
|
2
vendor/github.com/docker/docker/client/node_list.go
generated
vendored
2
vendor/github.com/docker/docker/client/node_list.go
generated
vendored
|
@ -15,7 +15,7 @@ func (cli *Client) NodeList(ctx context.Context, options types.NodeListOptions)
|
||||||
query := url.Values{}
|
query := url.Values{}
|
||||||
|
|
||||||
if options.Filters.Len() > 0 {
|
if options.Filters.Len() > 0 {
|
||||||
filterJSON, err := filters.ToParam(options.Filters)
|
filterJSON, err := filters.ToJSON(options.Filters)
|
||||||
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
|
|
2
vendor/github.com/docker/docker/client/node_remove.go
generated
vendored
2
vendor/github.com/docker/docker/client/node_remove.go
generated
vendored
|
@ -17,5 +17,5 @@ func (cli *Client) NodeRemove(ctx context.Context, nodeID string, options types.
|
||||||
|
|
||||||
resp, err := cli.delete(ctx, "/nodes/"+nodeID, query, nil)
|
resp, err := cli.delete(ctx, "/nodes/"+nodeID, query, nil)
|
||||||
ensureReaderClosed(resp)
|
ensureReaderClosed(resp)
|
||||||
return err
|
return wrapResponseError(err, resp, "node", nodeID)
|
||||||
}
|
}
|
||||||
|
|
18
vendor/github.com/docker/docker/client/ping.go
generated
vendored
18
vendor/github.com/docker/docker/client/ping.go
generated
vendored
|
@ -1,7 +1,7 @@
|
||||||
package client
|
package client
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"fmt"
|
"path"
|
||||||
|
|
||||||
"github.com/docker/docker/api/types"
|
"github.com/docker/docker/api/types"
|
||||||
"golang.org/x/net/context"
|
"golang.org/x/net/context"
|
||||||
|
@ -10,7 +10,7 @@ import (
|
||||||
// Ping pings the server and returns the value of the "Docker-Experimental", "OS-Type" & "API-Version" headers
|
// Ping pings the server and returns the value of the "Docker-Experimental", "OS-Type" & "API-Version" headers
|
||||||
func (cli *Client) Ping(ctx context.Context) (types.Ping, error) {
|
func (cli *Client) Ping(ctx context.Context) (types.Ping, error) {
|
||||||
var ping types.Ping
|
var ping types.Ping
|
||||||
req, err := cli.buildRequest("GET", fmt.Sprintf("%s/_ping", cli.basePath), nil, nil)
|
req, err := cli.buildRequest("GET", path.Join(cli.basePath, "/_ping"), nil, nil)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return ping, err
|
return ping, err
|
||||||
}
|
}
|
||||||
|
@ -20,13 +20,13 @@ func (cli *Client) Ping(ctx context.Context) (types.Ping, error) {
|
||||||
}
|
}
|
||||||
defer ensureReaderClosed(serverResp)
|
defer ensureReaderClosed(serverResp)
|
||||||
|
|
||||||
ping.APIVersion = serverResp.header.Get("API-Version")
|
if serverResp.header != nil {
|
||||||
|
ping.APIVersion = serverResp.header.Get("API-Version")
|
||||||
|
|
||||||
if serverResp.header.Get("Docker-Experimental") == "true" {
|
if serverResp.header.Get("Docker-Experimental") == "true" {
|
||||||
ping.Experimental = true
|
ping.Experimental = true
|
||||||
|
}
|
||||||
|
ping.OSType = serverResp.header.Get("OSType")
|
||||||
}
|
}
|
||||||
|
return ping, cli.checkResponseErr(serverResp)
|
||||||
ping.OSType = serverResp.header.Get("OSType")
|
|
||||||
|
|
||||||
return ping, nil
|
|
||||||
}
|
}
|
||||||
|
|
6
vendor/github.com/docker/docker/client/plugin_inspect.go
generated
vendored
6
vendor/github.com/docker/docker/client/plugin_inspect.go
generated
vendored
|
@ -4,7 +4,6 @@ import (
|
||||||
"bytes"
|
"bytes"
|
||||||
"encoding/json"
|
"encoding/json"
|
||||||
"io/ioutil"
|
"io/ioutil"
|
||||||
"net/http"
|
|
||||||
|
|
||||||
"github.com/docker/docker/api/types"
|
"github.com/docker/docker/api/types"
|
||||||
"golang.org/x/net/context"
|
"golang.org/x/net/context"
|
||||||
|
@ -14,10 +13,7 @@ import (
|
||||||
func (cli *Client) PluginInspectWithRaw(ctx context.Context, name string) (*types.Plugin, []byte, error) {
|
func (cli *Client) PluginInspectWithRaw(ctx context.Context, name string) (*types.Plugin, []byte, error) {
|
||||||
resp, err := cli.get(ctx, "/plugins/"+name+"/json", nil, nil)
|
resp, err := cli.get(ctx, "/plugins/"+name+"/json", nil, nil)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
if resp.statusCode == http.StatusNotFound {
|
return nil, nil, wrapResponseError(err, resp, "plugin", name)
|
||||||
return nil, nil, pluginNotFoundError{name}
|
|
||||||
}
|
|
||||||
return nil, nil, err
|
|
||||||
}
|
}
|
||||||
|
|
||||||
defer ensureReaderClosed(resp)
|
defer ensureReaderClosed(resp)
|
||||||
|
|
2
vendor/github.com/docker/docker/client/plugin_list.go
generated
vendored
2
vendor/github.com/docker/docker/client/plugin_list.go
generated
vendored
|
@ -23,7 +23,7 @@ func (cli *Client) PluginList(ctx context.Context, filter filters.Args) (types.P
|
||||||
}
|
}
|
||||||
resp, err := cli.get(ctx, "/plugins", query, nil)
|
resp, err := cli.get(ctx, "/plugins", query, nil)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return plugins, err
|
return plugins, wrapResponseError(err, resp, "plugin", "")
|
||||||
}
|
}
|
||||||
|
|
||||||
err = json.NewDecoder(resp.body).Decode(&plugins)
|
err = json.NewDecoder(resp.body).Decode(&plugins)
|
||||||
|
|
2
vendor/github.com/docker/docker/client/plugin_remove.go
generated
vendored
2
vendor/github.com/docker/docker/client/plugin_remove.go
generated
vendored
|
@ -16,5 +16,5 @@ func (cli *Client) PluginRemove(ctx context.Context, name string, options types.
|
||||||
|
|
||||||
resp, err := cli.delete(ctx, "/plugins/"+name, query, nil)
|
resp, err := cli.delete(ctx, "/plugins/"+name, query, nil)
|
||||||
ensureReaderClosed(resp)
|
ensureReaderClosed(resp)
|
||||||
return err
|
return wrapResponseError(err, resp, "plugin", name)
|
||||||
}
|
}
|
||||||
|
|
Some files were not shown because too many files have changed in this diff Show more
Loading…
Reference in a new issue