Skip to content
Projects
Groups
Snippets
Help
This project
Loading...
Sign in / Register
Toggle navigation
K
k3s
Project
Project
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Registry
Registry
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
Jacklull
k3s
Commits
2bf984a5
Commit
2bf984a5
authored
Aug 28, 2015
by
Andy Goldstein
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
bump(fsouza/go-dockerclient): 76fd6c6
parent
cbce3a1a
Expand all
Show whitespace changes
Inline
Side-by-side
Showing
17 changed files
with
512 additions
and
149 deletions
+512
-149
Godeps.json
Godeps/Godeps.json
+1
-1
.travis.yml
...rkspace/src/github.com/fsouza/go-dockerclient/.travis.yml
+1
-0
AUTHORS
.../_workspace/src/github.com/fsouza/go-dockerclient/AUTHORS
+4
-0
auth.go
.../_workspace/src/github.com/fsouza/go-dockerclient/auth.go
+8
-3
auth_test.go
...kspace/src/github.com/fsouza/go-dockerclient/auth_test.go
+1
-1
change.go
...workspace/src/github.com/fsouza/go-dockerclient/change.go
+1
-1
client.go
...workspace/src/github.com/fsouza/go-dockerclient/client.go
+20
-11
container.go
...kspace/src/github.com/fsouza/go-dockerclient/container.go
+0
-0
container_test.go
...e/src/github.com/fsouza/go-dockerclient/container_test.go
+1
-4
exec.go
.../_workspace/src/github.com/fsouza/go-dockerclient/exec.go
+59
-63
image.go
..._workspace/src/github.com/fsouza/go-dockerclient/image.go
+60
-51
image_test.go
...space/src/github.com/fsouza/go-dockerclient/image_test.go
+2
-0
misc.go
.../_workspace/src/github.com/fsouza/go-dockerclient/misc.go
+2
-2
server.go
...e/src/github.com/fsouza/go-dockerclient/testing/server.go
+24
-3
server_test.go
.../github.com/fsouza/go-dockerclient/testing/server_test.go
+68
-9
volume.go
...workspace/src/github.com/fsouza/go-dockerclient/volume.go
+118
-0
volume_test.go
...pace/src/github.com/fsouza/go-dockerclient/volume_test.go
+142
-0
No files found.
Godeps/Godeps.json
View file @
2bf984a5
...
@@ -224,7 +224,7 @@
...
@@ -224,7 +224,7 @@
},
},
{
{
"ImportPath"
:
"github.com/fsouza/go-dockerclient"
,
"ImportPath"
:
"github.com/fsouza/go-dockerclient"
,
"Rev"
:
"
42d06e2b125654477366c320dcea99107a86e9c2
"
"Rev"
:
"
76fd6c68cf24c48ee6a2b25def997182a29f940e
"
},
},
{
{
"ImportPath"
:
"github.com/garyburd/redigo/internal"
,
"ImportPath"
:
"github.com/garyburd/redigo/internal"
,
...
...
Godeps/_workspace/src/github.com/fsouza/go-dockerclient/.travis.yml
View file @
2bf984a5
...
@@ -3,6 +3,7 @@ sudo: false
...
@@ -3,6 +3,7 @@ sudo: false
go
:
go
:
-
1.3.1
-
1.3.1
-
1.4
-
1.4
-
1.5
-
tip
-
tip
env
:
env
:
-
GOARCH=amd64
-
GOARCH=amd64
...
...
Godeps/_workspace/src/github.com/fsouza/go-dockerclient/AUTHORS
View file @
2bf984a5
...
@@ -13,6 +13,7 @@ Brian Lalor <blalor@bravo5.org>
...
@@ -13,6 +13,7 @@ Brian Lalor <blalor@bravo5.org>
Brian Palmer <brianp@instructure.com>
Brian Palmer <brianp@instructure.com>
Burke Libbey <burke@libbey.me>
Burke Libbey <burke@libbey.me>
Carlos Diaz-Padron <cpadron@mozilla.com>
Carlos Diaz-Padron <cpadron@mozilla.com>
Cesar Wong <cewong@redhat.com>
Cezar Sa Espinola <cezar.sa@corp.globo.com>
Cezar Sa Espinola <cezar.sa@corp.globo.com>
Cheah Chu Yeow <chuyeow@gmail.com>
Cheah Chu Yeow <chuyeow@gmail.com>
cheneydeng <cheneydeng@qq.com>
cheneydeng <cheneydeng@qq.com>
...
@@ -33,6 +34,7 @@ Fabio Rehm <fgrehm@gmail.com>
...
@@ -33,6 +34,7 @@ Fabio Rehm <fgrehm@gmail.com>
Fatih Arslan <ftharsln@gmail.com>
Fatih Arslan <ftharsln@gmail.com>
Flavia Missi <flaviamissi@gmail.com>
Flavia Missi <flaviamissi@gmail.com>
Francisco Souza <f@souza.cc>
Francisco Souza <f@souza.cc>
Grégoire Delattre <gregoire.delattre@gmail.com>
Guillermo Álvarez Fernández <guillermo@cientifico.net>
Guillermo Álvarez Fernández <guillermo@cientifico.net>
He Simei <hesimei@zju.edu.cn>
He Simei <hesimei@zju.edu.cn>
Ivan Mikushin <i.mikushin@gmail.com>
Ivan Mikushin <i.mikushin@gmail.com>
...
@@ -66,12 +68,14 @@ Paul Morie <pmorie@gmail.com>
...
@@ -66,12 +68,14 @@ Paul Morie <pmorie@gmail.com>
Paul Weil <pweil@redhat.com>
Paul Weil <pweil@redhat.com>
Peter Edge <peter.edge@gmail.com>
Peter Edge <peter.edge@gmail.com>
Peter Jihoon Kim <raingrove@gmail.com>
Peter Jihoon Kim <raingrove@gmail.com>
Phil Lu <lu@stackengine.com>
Philippe Lafoucrière <philippe.lafoucriere@tech-angels.com>
Philippe Lafoucrière <philippe.lafoucriere@tech-angels.com>
Rafe Colton <rafael.colton@gmail.com>
Rafe Colton <rafael.colton@gmail.com>
Rob Miller <rob@kalistra.com>
Rob Miller <rob@kalistra.com>
Robert Williamson <williamson.robert@gmail.com>
Robert Williamson <williamson.robert@gmail.com>
Salvador Gironès <salvadorgirones@gmail.com>
Salvador Gironès <salvadorgirones@gmail.com>
Sam Rijs <srijs@airpost.net>
Sam Rijs <srijs@airpost.net>
Samuel Karp <skarp@amazon.com>
Simon Eskildsen <sirup@sirupsen.com>
Simon Eskildsen <sirup@sirupsen.com>
Simon Menke <simon.menke@gmail.com>
Simon Menke <simon.menke@gmail.com>
Skolos <skolos@gopherlab.com>
Skolos <skolos@gopherlab.com>
...
...
Godeps/_workspace/src/github.com/fsouza/go-dockerclient/auth.go
View file @
2bf984a5
...
@@ -16,7 +16,8 @@ import (
...
@@ -16,7 +16,8 @@ import (
"strings"
"strings"
)
)
var
AuthParseError
error
=
errors
.
New
(
"Failed to read authentication from dockercfg"
)
// ErrCannotParseDockercfg is the error returned by NewAuthConfigurations when the dockercfg cannot be parsed.
var
ErrCannotParseDockercfg
=
errors
.
New
(
"Failed to read authentication from dockercfg"
)
// AuthConfiguration represents authentication options to use in the PushImage
// AuthConfiguration represents authentication options to use in the PushImage
// method. It represents the authentication in the Docker index server.
// method. It represents the authentication in the Docker index server.
...
@@ -33,6 +34,10 @@ type AuthConfigurations struct {
...
@@ -33,6 +34,10 @@ type AuthConfigurations struct {
Configs
map
[
string
]
AuthConfiguration
`json:"configs"`
Configs
map
[
string
]
AuthConfiguration
`json:"configs"`
}
}
// AuthConfigurations119 is used to serialize a set of AuthConfigurations
// for Docker API >= 1.19.
type
AuthConfigurations119
map
[
string
]
AuthConfiguration
// dockerConfig represents a registry authentation configuration from the
// dockerConfig represents a registry authentation configuration from the
// .dockercfg file.
// .dockercfg file.
type
dockerConfig
struct
{
type
dockerConfig
struct
{
...
@@ -103,7 +108,7 @@ func authConfigs(confs map[string]dockerConfig) (*AuthConfigurations, error) {
...
@@ -103,7 +108,7 @@ func authConfigs(confs map[string]dockerConfig) (*AuthConfigurations, error) {
}
}
userpass
:=
strings
.
Split
(
string
(
data
),
":"
)
userpass
:=
strings
.
Split
(
string
(
data
),
":"
)
if
len
(
userpass
)
!=
2
{
if
len
(
userpass
)
!=
2
{
return
nil
,
AuthParseError
return
nil
,
ErrCannotParseDockercfg
}
}
c
.
Configs
[
reg
]
=
AuthConfiguration
{
c
.
Configs
[
reg
]
=
AuthConfiguration
{
Email
:
conf
.
Email
,
Email
:
conf
.
Email
,
...
@@ -117,7 +122,7 @@ func authConfigs(confs map[string]dockerConfig) (*AuthConfigurations, error) {
...
@@ -117,7 +122,7 @@ func authConfigs(confs map[string]dockerConfig) (*AuthConfigurations, error) {
// AuthCheck validates the given credentials. It returns nil if successful.
// AuthCheck validates the given credentials. It returns nil if successful.
//
//
// See https://goo.gl/
vPoEfJ
for more details.
// See https://goo.gl/
m2SleN
for more details.
func
(
c
*
Client
)
AuthCheck
(
conf
*
AuthConfiguration
)
error
{
func
(
c
*
Client
)
AuthCheck
(
conf
*
AuthConfiguration
)
error
{
if
conf
==
nil
{
if
conf
==
nil
{
return
fmt
.
Errorf
(
"conf is nil"
)
return
fmt
.
Errorf
(
"conf is nil"
)
...
...
Godeps/_workspace/src/github.com/fsouza/go-dockerclient/auth_test.go
View file @
2bf984a5
...
@@ -41,7 +41,7 @@ func TestAuthBadConfig(t *testing.T) {
...
@@ -41,7 +41,7 @@ func TestAuthBadConfig(t *testing.T) {
auth
:=
base64
.
StdEncoding
.
EncodeToString
([]
byte
(
"userpass"
))
auth
:=
base64
.
StdEncoding
.
EncodeToString
([]
byte
(
"userpass"
))
read
:=
strings
.
NewReader
(
fmt
.
Sprintf
(
`{"docker.io":{"auth":"%s","email":"user@example.com"}}`
,
auth
))
read
:=
strings
.
NewReader
(
fmt
.
Sprintf
(
`{"docker.io":{"auth":"%s","email":"user@example.com"}}`
,
auth
))
ac
,
err
:=
NewAuthConfigurations
(
read
)
ac
,
err
:=
NewAuthConfigurations
(
read
)
if
err
!=
AuthParseError
{
if
err
!=
ErrCannotParseDockercfg
{
t
.
Errorf
(
"Incorrect error returned %v
\n
"
,
err
)
t
.
Errorf
(
"Incorrect error returned %v
\n
"
,
err
)
}
}
if
ac
!=
nil
{
if
ac
!=
nil
{
...
...
Godeps/_workspace/src/github.com/fsouza/go-dockerclient/change.go
View file @
2bf984a5
...
@@ -23,7 +23,7 @@ const (
...
@@ -23,7 +23,7 @@ const (
// Change represents a change in a container.
// Change represents a change in a container.
//
//
// See http
://goo.gl/QkW9sH
for more details.
// See http
s://goo.gl/9GsTIF
for more details.
type
Change
struct
{
type
Change
struct
{
Path
string
Path
string
Kind
ChangeType
Kind
ChangeType
...
...
Godeps/_workspace/src/github.com/fsouza/go-dockerclient/client.go
View file @
2bf984a5
...
@@ -4,7 +4,7 @@
...
@@ -4,7 +4,7 @@
// Package docker provides a client for the Docker remote API.
// Package docker provides a client for the Docker remote API.
//
//
// See http://goo.gl/G3plxW for more details on the remote API.
// See http
s
://goo.gl/G3plxW for more details on the remote API.
package
docker
package
docker
import
(
import
(
...
@@ -45,6 +45,8 @@ var (
...
@@ -45,6 +45,8 @@ var (
ErrConnectionRefused
=
errors
.
New
(
"cannot connect to Docker endpoint"
)
ErrConnectionRefused
=
errors
.
New
(
"cannot connect to Docker endpoint"
)
apiVersion112
,
_
=
NewAPIVersion
(
"1.12"
)
apiVersion112
,
_
=
NewAPIVersion
(
"1.12"
)
apiVersion119
,
_
=
NewAPIVersion
(
"1.19"
)
)
)
// APIVersion is an internal representation of a version of the Remote API.
// APIVersion is an internal representation of a version of the Remote API.
...
@@ -326,7 +328,7 @@ func (c *Client) checkAPIVersion() error {
...
@@ -326,7 +328,7 @@ func (c *Client) checkAPIVersion() error {
// Ping pings the docker server
// Ping pings the docker server
//
//
// See http
://goo.gl/stJENm
for more details.
// See http
s://goo.gl/kQCfJj
for more details.
func
(
c
*
Client
)
Ping
()
error
{
func
(
c
*
Client
)
Ping
()
error
{
path
:=
"/_ping"
path
:=
"/_ping"
body
,
status
,
err
:=
c
.
do
(
"GET"
,
path
,
doOptions
{})
body
,
status
,
err
:=
c
.
do
(
"GET"
,
path
,
doOptions
{})
...
@@ -462,9 +464,13 @@ func (c *Client) stream(method, path string, streamOptions streamOptions) error
...
@@ -462,9 +464,13 @@ func (c *Client) stream(method, path string, streamOptions streamOptions) error
address
:=
c
.
endpointURL
.
Path
address
:=
c
.
endpointURL
.
Path
if
streamOptions
.
stdout
==
nil
{
if
streamOptions
.
stdout
==
nil
{
streamOptions
.
stdout
=
ioutil
.
Discard
streamOptions
.
stdout
=
ioutil
.
Discard
}
else
if
t
,
ok
:=
streamOptions
.
stdout
.
(
io
.
Closer
);
ok
{
defer
t
.
Close
()
}
}
if
streamOptions
.
stderr
==
nil
{
if
streamOptions
.
stderr
==
nil
{
streamOptions
.
stderr
=
ioutil
.
Discard
streamOptions
.
stderr
=
ioutil
.
Discard
}
else
if
t
,
ok
:=
streamOptions
.
stderr
.
(
io
.
Closer
);
ok
{
defer
t
.
Close
()
}
}
if
protocol
==
"unix"
{
if
protocol
==
"unix"
{
dial
,
err
:=
net
.
Dial
(
protocol
,
address
)
dial
,
err
:=
net
.
Dial
(
protocol
,
address
)
...
@@ -583,6 +589,8 @@ func (c *Client) hijack(method, path string, hijackOptions hijackOptions) error
...
@@ -583,6 +589,8 @@ func (c *Client) hijack(method, path string, hijackOptions hijackOptions) error
return
err
return
err
}
}
req
.
Header
.
Set
(
"Content-Type"
,
"plain/text"
)
req
.
Header
.
Set
(
"Content-Type"
,
"plain/text"
)
req
.
Header
.
Set
(
"Connection"
,
"Upgrade"
)
req
.
Header
.
Set
(
"Upgrade"
,
"tcp"
)
protocol
:=
c
.
endpointURL
.
Scheme
protocol
:=
c
.
endpointURL
.
Scheme
address
:=
c
.
endpointURL
.
Path
address
:=
c
.
endpointURL
.
Path
if
protocol
!=
"unix"
{
if
protocol
!=
"unix"
{
...
@@ -612,13 +620,16 @@ func (c *Client) hijack(method, path string, hijackOptions hijackOptions) error
...
@@ -612,13 +620,16 @@ func (c *Client) hijack(method, path string, hijackOptions hijackOptions) error
defer
rwc
.
Close
()
defer
rwc
.
Close
()
errChanOut
:=
make
(
chan
error
,
1
)
errChanOut
:=
make
(
chan
error
,
1
)
errChanIn
:=
make
(
chan
error
,
1
)
errChanIn
:=
make
(
chan
error
,
1
)
exit
:=
make
(
chan
bool
)
go
func
()
{
go
func
()
{
defer
close
(
exit
)
defer
func
()
{
defer
close
(
errChanOut
)
if
hijackOptions
.
in
!=
nil
{
if
closer
,
ok
:=
hijackOptions
.
in
.
(
io
.
Closer
);
ok
{
closer
.
Close
()
}
}
}()
var
err
error
var
err
error
if
hijackOptions
.
setRawTerminal
{
if
hijackOptions
.
setRawTerminal
{
// When TTY is ON, use regular copy
_
,
err
=
io
.
Copy
(
hijackOptions
.
stdout
,
br
)
_
,
err
=
io
.
Copy
(
hijackOptions
.
stdout
,
br
)
}
else
{
}
else
{
_
,
err
=
stdcopy
.
StdCopy
(
hijackOptions
.
stdout
,
hijackOptions
.
stderr
,
br
)
_
,
err
=
stdcopy
.
StdCopy
(
hijackOptions
.
stdout
,
hijackOptions
.
stderr
,
br
)
...
@@ -626,17 +637,15 @@ func (c *Client) hijack(method, path string, hijackOptions hijackOptions) error
...
@@ -626,17 +637,15 @@ func (c *Client) hijack(method, path string, hijackOptions hijackOptions) error
errChanOut
<-
err
errChanOut
<-
err
}()
}()
go
func
()
{
go
func
()
{
var
err
error
if
hijackOptions
.
in
!=
nil
{
if
hijackOptions
.
in
!=
nil
{
_
,
err
:=
io
.
Copy
(
rwc
,
hijackOptions
.
in
)
_
,
err
=
io
.
Copy
(
rwc
,
hijackOptions
.
in
)
errChanIn
<-
err
}
else
{
errChanIn
<-
nil
}
}
errChanIn
<-
err
rwc
.
(
interface
{
rwc
.
(
interface
{
CloseWrite
()
error
CloseWrite
()
error
})
.
CloseWrite
()
})
.
CloseWrite
()
}()
}()
<-
exit
errIn
:=
<-
errChanIn
errIn
:=
<-
errChanIn
errOut
:=
<-
errChanOut
errOut
:=
<-
errChanOut
if
errIn
!=
nil
{
if
errIn
!=
nil
{
...
...
Godeps/_workspace/src/github.com/fsouza/go-dockerclient/container.go
View file @
2bf984a5
This diff is collapsed.
Click to expand it.
Godeps/_workspace/src/github.com/fsouza/go-dockerclient/container_test.go
View file @
2bf984a5
...
@@ -1122,10 +1122,7 @@ func TestAttachToContainerRawTerminalFalse(t *testing.T) {
...
@@ -1122,10 +1122,7 @@ func TestAttachToContainerRawTerminalFalse(t *testing.T) {
Stream
:
true
,
Stream
:
true
,
RawTerminal
:
false
,
RawTerminal
:
false
,
}
}
err
:=
client
.
AttachToContainer
(
opts
)
client
.
AttachToContainer
(
opts
)
if
err
!=
nil
{
t
.
Fatal
(
err
)
}
expected
:=
map
[
string
][]
string
{
expected
:=
map
[
string
][]
string
{
"stdin"
:
{
"1"
},
"stdin"
:
{
"1"
},
"stdout"
:
{
"1"
},
"stdout"
:
{
"1"
},
...
...
Godeps/_workspace/src/github.com/fsouza/go-dockerclient/exec.go
View file @
2bf984a5
...
@@ -2,8 +2,6 @@
...
@@ -2,8 +2,6 @@
// Use of this source code is governed by a BSD-style
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.
// license that can be found in the LICENSE file.
// Docs can currently be found at https://github.com/docker/docker/blob/master/docs/sources/reference/api/docker_remote_api_v1.15.md#exec-create
package
docker
package
docker
import
(
import
(
...
@@ -15,9 +13,15 @@ import (
...
@@ -15,9 +13,15 @@ import (
"strconv"
"strconv"
)
)
// Exec is the type representing a `docker exec` instance and containing the
// instance ID
type
Exec
struct
{
ID
string
`json:"Id,omitempty" yaml:"Id,omitempty"`
}
// CreateExecOptions specify parameters to the CreateExecContainer function.
// CreateExecOptions specify parameters to the CreateExecContainer function.
//
//
// See http
://goo.gl/8izrzI
for more details
// See http
s://goo.gl/1KSIb7
for more details
type
CreateExecOptions
struct
{
type
CreateExecOptions
struct
{
AttachStdin
bool
`json:"AttachStdin,omitempty" yaml:"AttachStdin,omitempty"`
AttachStdin
bool
`json:"AttachStdin,omitempty" yaml:"AttachStdin,omitempty"`
AttachStdout
bool
`json:"AttachStdout,omitempty" yaml:"AttachStdout,omitempty"`
AttachStdout
bool
`json:"AttachStdout,omitempty" yaml:"AttachStdout,omitempty"`
...
@@ -28,9 +32,31 @@ type CreateExecOptions struct {
...
@@ -28,9 +32,31 @@ type CreateExecOptions struct {
User
string
`json:"User,omitempty" yaml:"User,omitempty"`
User
string
`json:"User,omitempty" yaml:"User,omitempty"`
}
}
// CreateExec sets up an exec instance in a running container `id`, returning the exec
// instance, or an error in case of failure.
//
// See https://goo.gl/1KSIb7 for more details
func
(
c
*
Client
)
CreateExec
(
opts
CreateExecOptions
)
(
*
Exec
,
error
)
{
path
:=
fmt
.
Sprintf
(
"/containers/%s/exec"
,
opts
.
Container
)
body
,
status
,
err
:=
c
.
do
(
"POST"
,
path
,
doOptions
{
data
:
opts
})
if
status
==
http
.
StatusNotFound
{
return
nil
,
&
NoSuchContainer
{
ID
:
opts
.
Container
}
}
if
err
!=
nil
{
return
nil
,
err
}
var
exec
Exec
err
=
json
.
Unmarshal
(
body
,
&
exec
)
if
err
!=
nil
{
return
nil
,
err
}
return
&
exec
,
nil
}
// StartExecOptions specify parameters to the StartExecContainer function.
// StartExecOptions specify parameters to the StartExecContainer function.
//
//
// See http
://goo.gl/JW8Lxl
for more details
// See http
s://goo.gl/iQCnto
for more details
type
StartExecOptions
struct
{
type
StartExecOptions
struct
{
Detach
bool
`json:"Detach,omitempty" yaml:"Detach,omitempty"`
Detach
bool
`json:"Detach,omitempty" yaml:"Detach,omitempty"`
...
@@ -51,67 +77,11 @@ type StartExecOptions struct {
...
@@ -51,67 +77,11 @@ type StartExecOptions struct {
Success
chan
struct
{}
`json:"-"`
Success
chan
struct
{}
`json:"-"`
}
}
// Exec is the type representing a `docker exec` instance and containing the
// instance ID
type
Exec
struct
{
ID
string
`json:"Id,omitempty" yaml:"Id,omitempty"`
}
// ExecProcessConfig is a type describing the command associated to a Exec
// instance. It's used in the ExecInspect type.
//
// See http://goo.gl/ypQULN for more details
type
ExecProcessConfig
struct
{
Privileged
bool
`json:"privileged,omitempty" yaml:"privileged,omitempty"`
User
string
`json:"user,omitempty" yaml:"user,omitempty"`
Tty
bool
`json:"tty,omitempty" yaml:"tty,omitempty"`
EntryPoint
string
`json:"entrypoint,omitempty" yaml:"entrypoint,omitempty"`
Arguments
[]
string
`json:"arguments,omitempty" yaml:"arguments,omitempty"`
}
// ExecInspect is a type with details about a exec instance, including the
// exit code if the command has finished running. It's returned by a api
// call to /exec/(id)/json
//
// See http://goo.gl/ypQULN for more details
type
ExecInspect
struct
{
ID
string
`json:"ID,omitempty" yaml:"ID,omitempty"`
Running
bool
`json:"Running,omitempty" yaml:"Running,omitempty"`
ExitCode
int
`json:"ExitCode,omitempty" yaml:"ExitCode,omitempty"`
OpenStdin
bool
`json:"OpenStdin,omitempty" yaml:"OpenStdin,omitempty"`
OpenStderr
bool
`json:"OpenStderr,omitempty" yaml:"OpenStderr,omitempty"`
OpenStdout
bool
`json:"OpenStdout,omitempty" yaml:"OpenStdout,omitempty"`
ProcessConfig
ExecProcessConfig
`json:"ProcessConfig,omitempty" yaml:"ProcessConfig,omitempty"`
Container
Container
`json:"Container,omitempty" yaml:"Container,omitempty"`
}
// CreateExec sets up an exec instance in a running container `id`, returning the exec
// instance, or an error in case of failure.
//
// See http://goo.gl/8izrzI for more details
func
(
c
*
Client
)
CreateExec
(
opts
CreateExecOptions
)
(
*
Exec
,
error
)
{
path
:=
fmt
.
Sprintf
(
"/containers/%s/exec"
,
opts
.
Container
)
body
,
status
,
err
:=
c
.
do
(
"POST"
,
path
,
doOptions
{
data
:
opts
})
if
status
==
http
.
StatusNotFound
{
return
nil
,
&
NoSuchContainer
{
ID
:
opts
.
Container
}
}
if
err
!=
nil
{
return
nil
,
err
}
var
exec
Exec
err
=
json
.
Unmarshal
(
body
,
&
exec
)
if
err
!=
nil
{
return
nil
,
err
}
return
&
exec
,
nil
}
// StartExec starts a previously set up exec instance id. If opts.Detach is
// StartExec starts a previously set up exec instance id. If opts.Detach is
// true, it returns after starting the exec command. Otherwise, it sets up an
// true, it returns after starting the exec command. Otherwise, it sets up an
// interactive session with the exec command.
// interactive session with the exec command.
//
//
// See http
://goo.gl/JW8Lxl
for more details
// See http
s://goo.gl/iQCnto
for more details
func
(
c
*
Client
)
StartExec
(
id
string
,
opts
StartExecOptions
)
error
{
func
(
c
*
Client
)
StartExec
(
id
string
,
opts
StartExecOptions
)
error
{
if
id
==
""
{
if
id
==
""
{
return
&
NoSuchExec
{
ID
:
id
}
return
&
NoSuchExec
{
ID
:
id
}
...
@@ -144,7 +114,7 @@ func (c *Client) StartExec(id string, opts StartExecOptions) error {
...
@@ -144,7 +114,7 @@ func (c *Client) StartExec(id string, opts StartExecOptions) error {
// is valid only if Tty was specified as part of creating and starting the exec
// is valid only if Tty was specified as part of creating and starting the exec
// command.
// command.
//
//
// See http
://goo.gl/YDSx1f
for more details
// See http
s://goo.gl/e1JpsA
for more details
func
(
c
*
Client
)
ResizeExecTTY
(
id
string
,
height
,
width
int
)
error
{
func
(
c
*
Client
)
ResizeExecTTY
(
id
string
,
height
,
width
int
)
error
{
params
:=
make
(
url
.
Values
)
params
:=
make
(
url
.
Values
)
params
.
Set
(
"h"
,
strconv
.
Itoa
(
height
))
params
.
Set
(
"h"
,
strconv
.
Itoa
(
height
))
...
@@ -155,9 +125,35 @@ func (c *Client) ResizeExecTTY(id string, height, width int) error {
...
@@ -155,9 +125,35 @@ func (c *Client) ResizeExecTTY(id string, height, width int) error {
return
err
return
err
}
}
// ExecProcessConfig is a type describing the command associated to a Exec
// instance. It's used in the ExecInspect type.
type
ExecProcessConfig
struct
{
Privileged
bool
`json:"privileged,omitempty" yaml:"privileged,omitempty"`
User
string
`json:"user,omitempty" yaml:"user,omitempty"`
Tty
bool
`json:"tty,omitempty" yaml:"tty,omitempty"`
EntryPoint
string
`json:"entrypoint,omitempty" yaml:"entrypoint,omitempty"`
Arguments
[]
string
`json:"arguments,omitempty" yaml:"arguments,omitempty"`
}
// ExecInspect is a type with details about a exec instance, including the
// exit code if the command has finished running. It's returned by a api
// call to /exec/(id)/json
//
// See https://goo.gl/gPtX9R for more details
type
ExecInspect
struct
{
ID
string
`json:"ID,omitempty" yaml:"ID,omitempty"`
Running
bool
`json:"Running,omitempty" yaml:"Running,omitempty"`
ExitCode
int
`json:"ExitCode,omitempty" yaml:"ExitCode,omitempty"`
OpenStdin
bool
`json:"OpenStdin,omitempty" yaml:"OpenStdin,omitempty"`
OpenStderr
bool
`json:"OpenStderr,omitempty" yaml:"OpenStderr,omitempty"`
OpenStdout
bool
`json:"OpenStdout,omitempty" yaml:"OpenStdout,omitempty"`
ProcessConfig
ExecProcessConfig
`json:"ProcessConfig,omitempty" yaml:"ProcessConfig,omitempty"`
Container
Container
`json:"Container,omitempty" yaml:"Container,omitempty"`
}
// InspectExec returns low-level information about the exec command id.
// InspectExec returns low-level information about the exec command id.
//
//
// See http
://goo.gl/ypQULN
for more details
// See http
s://goo.gl/gPtX9R
for more details
func
(
c
*
Client
)
InspectExec
(
id
string
)
(
*
ExecInspect
,
error
)
{
func
(
c
*
Client
)
InspectExec
(
id
string
)
(
*
ExecInspect
,
error
)
{
path
:=
fmt
.
Sprintf
(
"/exec/%s/json"
,
id
)
path
:=
fmt
.
Sprintf
(
"/exec/%s/json"
,
id
)
body
,
status
,
err
:=
c
.
do
(
"GET"
,
path
,
doOptions
{})
body
,
status
,
err
:=
c
.
do
(
"GET"
,
path
,
doOptions
{})
...
...
Godeps/_workspace/src/github.com/fsouza/go-dockerclient/image.go
View file @
2bf984a5
This diff is collapsed.
Click to expand it.
Godeps/_workspace/src/github.com/fsouza/go-dockerclient/image_test.go
View file @
2bf984a5
...
@@ -21,11 +21,13 @@ import (
...
@@ -21,11 +21,13 @@ import (
func
newTestClient
(
rt
*
FakeRoundTripper
)
Client
{
func
newTestClient
(
rt
*
FakeRoundTripper
)
Client
{
endpoint
:=
"http://localhost:4243"
endpoint
:=
"http://localhost:4243"
u
,
_
:=
parseEndpoint
(
"http://localhost:4243"
,
false
)
u
,
_
:=
parseEndpoint
(
"http://localhost:4243"
,
false
)
testAPIVersion
,
_
:=
NewAPIVersion
(
"1.17"
)
client
:=
Client
{
client
:=
Client
{
HTTPClient
:
&
http
.
Client
{
Transport
:
rt
},
HTTPClient
:
&
http
.
Client
{
Transport
:
rt
},
endpoint
:
endpoint
,
endpoint
:
endpoint
,
endpointURL
:
u
,
endpointURL
:
u
,
SkipServerVersionCheck
:
true
,
SkipServerVersionCheck
:
true
,
serverAPIVersion
:
testAPIVersion
,
}
}
return
client
return
client
}
}
...
...
Godeps/_workspace/src/github.com/fsouza/go-dockerclient/misc.go
View file @
2bf984a5
...
@@ -11,7 +11,7 @@ import (
...
@@ -11,7 +11,7 @@ import (
// Version returns version information about the docker server.
// Version returns version information about the docker server.
//
//
// See http
://goo.gl/BOZrF5
for more details.
// See http
s://goo.gl/ND9R8L
for more details.
func
(
c
*
Client
)
Version
()
(
*
Env
,
error
)
{
func
(
c
*
Client
)
Version
()
(
*
Env
,
error
)
{
body
,
_
,
err
:=
c
.
do
(
"GET"
,
"/version"
,
doOptions
{})
body
,
_
,
err
:=
c
.
do
(
"GET"
,
"/version"
,
doOptions
{})
if
err
!=
nil
{
if
err
!=
nil
{
...
@@ -26,7 +26,7 @@ func (c *Client) Version() (*Env, error) {
...
@@ -26,7 +26,7 @@ func (c *Client) Version() (*Env, error) {
// Info returns system-wide information about the Docker server.
// Info returns system-wide information about the Docker server.
//
//
// See http
://goo.gl/wmqZsW
for more details.
// See http
s://goo.gl/ElTHi2
for more details.
func
(
c
*
Client
)
Info
()
(
*
Env
,
error
)
{
func
(
c
*
Client
)
Info
()
(
*
Env
,
error
)
{
body
,
_
,
err
:=
c
.
do
(
"GET"
,
"/info"
,
doOptions
{})
body
,
_
,
err
:=
c
.
do
(
"GET"
,
"/info"
,
doOptions
{})
if
err
!=
nil
{
if
err
!=
nil
{
...
...
Godeps/_workspace/src/github.com/fsouza/go-dockerclient/testing/server.go
View file @
2bf984a5
...
@@ -12,6 +12,7 @@ import (
...
@@ -12,6 +12,7 @@ import (
"encoding/json"
"encoding/json"
"errors"
"errors"
"fmt"
"fmt"
"io/ioutil"
mathrand
"math/rand"
mathrand
"math/rand"
"net"
"net"
"net/http"
"net/http"
...
@@ -532,7 +533,7 @@ func (s *DockerServer) startContainer(w http.ResponseWriter, r *http.Request) {
...
@@ -532,7 +533,7 @@ func (s *DockerServer) startContainer(w http.ResponseWriter, r *http.Request) {
}
}
container
.
HostConfig
=
&
hostConfig
container
.
HostConfig
=
&
hostConfig
if
container
.
State
.
Running
{
if
container
.
State
.
Running
{
http
.
Error
(
w
,
"
Container already running"
,
http
.
StatusBadRequest
)
http
.
Error
(
w
,
"
"
,
http
.
StatusNotModified
)
return
return
}
}
container
.
State
.
Running
=
true
container
.
State
.
Running
=
true
...
@@ -610,14 +611,34 @@ func (s *DockerServer) attachContainer(w http.ResponseWriter, r *http.Request) {
...
@@ -610,14 +611,34 @@ func (s *DockerServer) attachContainer(w http.ResponseWriter, r *http.Request) {
http
.
Error
(
w
,
err
.
Error
(),
http
.
StatusInternalServerError
)
http
.
Error
(
w
,
err
.
Error
(),
http
.
StatusInternalServerError
)
return
return
}
}
wg
:=
sync
.
WaitGroup
{}
if
r
.
URL
.
Query
()
.
Get
(
"stdin"
)
==
"1"
{
wg
.
Add
(
1
)
go
func
()
{
ioutil
.
ReadAll
(
conn
)
wg
.
Done
()
}()
}
outStream
:=
stdcopy
.
NewStdWriter
(
conn
,
stdcopy
.
Stdout
)
outStream
:=
stdcopy
.
NewStdWriter
(
conn
,
stdcopy
.
Stdout
)
if
container
.
State
.
Running
{
if
container
.
State
.
Running
{
fmt
.
Fprintf
(
outStream
,
"Container
%q is running
\n
"
,
container
.
ID
)
fmt
.
Fprintf
(
outStream
,
"Container
is running
\n
"
)
}
else
{
}
else
{
fmt
.
Fprintf
(
outStream
,
"Container
%q is not running
\n
"
,
container
.
ID
)
fmt
.
Fprintf
(
outStream
,
"Container
is not running
\n
"
)
}
}
fmt
.
Fprintln
(
outStream
,
"What happened?"
)
fmt
.
Fprintln
(
outStream
,
"What happened?"
)
fmt
.
Fprintln
(
outStream
,
"Something happened"
)
fmt
.
Fprintln
(
outStream
,
"Something happened"
)
wg
.
Wait
()
if
r
.
URL
.
Query
()
.
Get
(
"stream"
)
==
"1"
{
for
{
time
.
Sleep
(
1e6
)
s
.
cMut
.
RLock
()
if
!
container
.
State
.
Running
{
s
.
cMut
.
RUnlock
()
break
}
s
.
cMut
.
RUnlock
()
}
}
conn
.
Close
()
conn
.
Close
()
}
}
...
...
Godeps/_workspace/src/github.com/fsouza/go-dockerclient/testing/server_test.go
View file @
2bf984a5
...
@@ -5,9 +5,11 @@
...
@@ -5,9 +5,11 @@
package
testing
package
testing
import
(
import
(
"bufio"
"bytes"
"bytes"
"encoding/json"
"encoding/json"
"fmt"
"fmt"
"io/ioutil"
"math/rand"
"math/rand"
"net"
"net"
"net/http"
"net/http"
...
@@ -624,8 +626,8 @@ func TestStartContainerAlreadyRunning(t *testing.T) {
...
@@ -624,8 +626,8 @@ func TestStartContainerAlreadyRunning(t *testing.T) {
path
:=
fmt
.
Sprintf
(
"/containers/%s/start"
,
server
.
containers
[
0
]
.
ID
)
path
:=
fmt
.
Sprintf
(
"/containers/%s/start"
,
server
.
containers
[
0
]
.
ID
)
request
,
_
:=
http
.
NewRequest
(
"POST"
,
path
,
bytes
.
NewBuffer
([]
byte
(
"null"
)))
request
,
_
:=
http
.
NewRequest
(
"POST"
,
path
,
bytes
.
NewBuffer
([]
byte
(
"null"
)))
server
.
ServeHTTP
(
recorder
,
request
)
server
.
ServeHTTP
(
recorder
,
request
)
if
recorder
.
Code
!=
http
.
Status
BadRequest
{
if
recorder
.
Code
!=
http
.
Status
NotModified
{
t
.
Errorf
(
"StartContainer: wrong status code. Want %d. Got %d."
,
http
.
Status
BadRequest
,
recorder
.
Code
)
t
.
Errorf
(
"StartContainer: wrong status code. Want %d. Got %d."
,
http
.
Status
NotModified
,
recorder
.
Code
)
}
}
}
}
...
@@ -845,22 +847,41 @@ func TestWaitContainerNotFound(t *testing.T) {
...
@@ -845,22 +847,41 @@ func TestWaitContainerNotFound(t *testing.T) {
}
}
}
}
type
HijackableResponseRecorder
struct
{
httptest
.
ResponseRecorder
readCh
chan
[]
byte
}
func
(
r
*
HijackableResponseRecorder
)
Hijack
()
(
net
.
Conn
,
*
bufio
.
ReadWriter
,
error
)
{
myConn
,
otherConn
:=
net
.
Pipe
()
r
.
readCh
=
make
(
chan
[]
byte
)
go
func
()
{
data
,
_
:=
ioutil
.
ReadAll
(
myConn
)
r
.
readCh
<-
data
}()
return
otherConn
,
nil
,
nil
}
func
(
r
*
HijackableResponseRecorder
)
HijackBuffer
()
string
{
return
string
(
<-
r
.
readCh
)
}
func
TestAttachContainer
(
t
*
testing
.
T
)
{
func
TestAttachContainer
(
t
*
testing
.
T
)
{
server
:=
DockerServer
{}
server
:=
DockerServer
{}
addContainers
(
&
server
,
1
)
addContainers
(
&
server
,
1
)
server
.
containers
[
0
]
.
State
.
Running
=
true
server
.
containers
[
0
]
.
State
.
Running
=
true
server
.
buildMuxer
()
server
.
buildMuxer
()
recorder
:=
httptest
.
NewRecorder
()
recorder
:=
&
HijackableResponseRecorder
{}
path
:=
fmt
.
Sprintf
(
"/containers/%s/attach?logs=1"
,
server
.
containers
[
0
]
.
ID
)
path
:=
fmt
.
Sprintf
(
"/containers/%s/attach?logs=1"
,
server
.
containers
[
0
]
.
ID
)
request
,
_
:=
http
.
NewRequest
(
"POST"
,
path
,
nil
)
request
,
_
:=
http
.
NewRequest
(
"POST"
,
path
,
nil
)
server
.
ServeHTTP
(
recorder
,
request
)
server
.
ServeHTTP
(
recorder
,
request
)
lines
:=
[]
string
{
lines
:=
[]
string
{
fmt
.
Sprintf
(
"
\x01\x00\x00\x00\x03\x00\x00\x00
Container %q is running"
,
server
.
containers
[
0
]
.
ID
)
,
"
\x01\x00\x00\x00\x00\x00\x00\x15
Container is running"
,
"What happened?"
,
"
\x01\x00\x00\x00\x00\x00\x00\x0f
What happened?"
,
"Something happened"
,
"
\x01\x00\x00\x00\x00\x00\x00\x13
Something happened"
,
}
}
expected
:=
strings
.
Join
(
lines
,
"
\n
"
)
+
"
\n
"
expected
:=
strings
.
Join
(
lines
,
"
\n
"
)
+
"
\n
"
if
body
:=
recorder
.
Body
.
String
();
body
=
=
expected
{
if
body
:=
recorder
.
HijackBuffer
();
body
!
=
expected
{
t
.
Errorf
(
"AttachContainer: wrong body. Want %q. Got %q."
,
expected
,
body
)
t
.
Errorf
(
"AttachContainer: wrong body. Want %q. Got %q."
,
expected
,
body
)
}
}
}
}
...
@@ -868,7 +889,7 @@ func TestAttachContainer(t *testing.T) {
...
@@ -868,7 +889,7 @@ func TestAttachContainer(t *testing.T) {
func
TestAttachContainerNotFound
(
t
*
testing
.
T
)
{
func
TestAttachContainerNotFound
(
t
*
testing
.
T
)
{
server
:=
DockerServer
{}
server
:=
DockerServer
{}
server
.
buildMuxer
()
server
.
buildMuxer
()
recorder
:=
httptest
.
NewRecorder
()
recorder
:=
&
HijackableResponseRecorder
{}
path
:=
"/containers/abc123/attach?logs=1"
path
:=
"/containers/abc123/attach?logs=1"
request
,
_
:=
http
.
NewRequest
(
"POST"
,
path
,
nil
)
request
,
_
:=
http
.
NewRequest
(
"POST"
,
path
,
nil
)
server
.
ServeHTTP
(
recorder
,
request
)
server
.
ServeHTTP
(
recorder
,
request
)
...
@@ -877,6 +898,44 @@ func TestAttachContainerNotFound(t *testing.T) {
...
@@ -877,6 +898,44 @@ func TestAttachContainerNotFound(t *testing.T) {
}
}
}
}
func
TestAttachContainerWithStreamBlocks
(
t
*
testing
.
T
)
{
server
:=
DockerServer
{}
addContainers
(
&
server
,
1
)
server
.
containers
[
0
]
.
State
.
Running
=
true
server
.
buildMuxer
()
path
:=
fmt
.
Sprintf
(
"/containers/%s/attach?logs=1&stdout=1&stream=1"
,
server
.
containers
[
0
]
.
ID
)
request
,
_
:=
http
.
NewRequest
(
"POST"
,
path
,
nil
)
done
:=
make
(
chan
string
)
go
func
()
{
recorder
:=
&
HijackableResponseRecorder
{}
server
.
ServeHTTP
(
recorder
,
request
)
done
<-
recorder
.
HijackBuffer
()
}()
select
{
case
<-
done
:
t
.
Fatalf
(
"attach stream returned before container is stopped"
)
case
<-
time
.
After
(
500
*
time
.
Millisecond
)
:
}
server
.
cMut
.
Lock
()
server
.
containers
[
0
]
.
State
.
Running
=
false
server
.
cMut
.
Unlock
()
var
body
string
select
{
case
body
=
<-
done
:
case
<-
time
.
After
(
5
*
time
.
Second
)
:
t
.
Fatalf
(
"timed out waiting for attach to finish"
)
}
lines
:=
[]
string
{
"
\x01\x00\x00\x00\x00\x00\x00\x15
Container is running"
,
"
\x01\x00\x00\x00\x00\x00\x00\x0f
What happened?"
,
"
\x01\x00\x00\x00\x00\x00\x00\x13
Something happened"
,
}
expected
:=
strings
.
Join
(
lines
,
"
\n
"
)
+
"
\n
"
if
body
!=
expected
{
t
.
Errorf
(
"AttachContainer: wrong body. Want %q. Got %q."
,
expected
,
body
)
}
}
func
TestRemoveContainer
(
t
*
testing
.
T
)
{
func
TestRemoveContainer
(
t
*
testing
.
T
)
{
server
:=
DockerServer
{}
server
:=
DockerServer
{}
addContainers
(
&
server
,
1
)
addContainers
(
&
server
,
1
)
...
@@ -1690,7 +1749,7 @@ func addNetworks(server *DockerServer, n int) {
...
@@ -1690,7 +1749,7 @@ func addNetworks(server *DockerServer, n int) {
ID
:
fmt
.
Sprintf
(
"%x"
,
rand
.
Int
()
%
10000
),
ID
:
fmt
.
Sprintf
(
"%x"
,
rand
.
Int
()
%
10000
),
Type
:
"bridge"
,
Type
:
"bridge"
,
Endpoints
:
[]
*
docker
.
Endpoint
{
Endpoints
:
[]
*
docker
.
Endpoint
{
&
docker
.
Endpoint
{
{
Name
:
"blah"
,
Name
:
"blah"
,
ID
:
fmt
.
Sprintf
(
"%x"
,
rand
.
Int
()
%
10000
),
ID
:
fmt
.
Sprintf
(
"%x"
,
rand
.
Int
()
%
10000
),
Network
:
netid
,
Network
:
netid
,
...
...
Godeps/_workspace/src/github.com/fsouza/go-dockerclient/volume.go
0 → 100644
View file @
2bf984a5
// Copyright 2015 go-dockerclient authors. All rights reserved.
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.
package
docker
import
(
"encoding/json"
"errors"
"net/http"
)
var
(
// ErrNoSuchVolume is the error returned when the volume does not exist.
ErrNoSuchVolume
=
errors
.
New
(
"no such volume"
)
// ErrVolumeInUse is the error returned when the volume requested to be removed is still in use.
ErrVolumeInUse
=
errors
.
New
(
"volume in use and cannot be removed"
)
)
// Volume represents a volume.
//
// See https://goo.gl/FZA4BK for more details.
type
Volume
struct
{
Name
string
`json:"Name" yaml:"Name"`
Driver
string
`json:"Driver,omitempty" yaml:"Driver,omitempty"`
Mountpoint
string
`json:"Mountpoint,omitempty" yaml:"Mountpoint,omitempty"`
}
// ListVolumesOptions specify parameters to the ListVolumes function.
//
// See https://goo.gl/FZA4BK for more details.
type
ListVolumesOptions
struct
{
Filters
map
[
string
][]
string
}
// ListVolumes returns a list of available volumes in the server.
//
// See https://goo.gl/FZA4BK for more details.
func
(
c
*
Client
)
ListVolumes
(
opts
ListVolumesOptions
)
([]
Volume
,
error
)
{
body
,
_
,
err
:=
c
.
do
(
"GET"
,
"/volumes?"
+
queryString
(
opts
),
doOptions
{})
if
err
!=
nil
{
return
nil
,
err
}
m
:=
make
(
map
[
string
]
interface
{})
if
err
:=
json
.
Unmarshal
(
body
,
&
m
);
err
!=
nil
{
return
nil
,
err
}
var
volumes
[]
Volume
volumesJSON
,
ok
:=
m
[
"Volumes"
]
if
!
ok
{
return
volumes
,
nil
}
data
,
err
:=
json
.
Marshal
(
volumesJSON
)
if
err
!=
nil
{
return
nil
,
err
}
if
err
:=
json
.
Unmarshal
(
data
,
&
volumes
);
err
!=
nil
{
return
nil
,
err
}
return
volumes
,
nil
}
// CreateVolumeOptions specify parameters to the CreateVolume function.
//
// See https://goo.gl/pBUbZ9 for more details.
type
CreateVolumeOptions
struct
{
Name
string
Driver
string
DriverOpts
map
[
string
]
string
}
// CreateVolume creates a volume on the server.
//
// See https://goo.gl/pBUbZ9 for more details.
func
(
c
*
Client
)
CreateVolume
(
opts
CreateVolumeOptions
)
(
*
Volume
,
error
)
{
body
,
_
,
err
:=
c
.
do
(
"POST"
,
"/volumes"
,
doOptions
{
data
:
opts
})
if
err
!=
nil
{
return
nil
,
err
}
var
volume
Volume
if
err
:=
json
.
Unmarshal
(
body
,
&
volume
);
err
!=
nil
{
return
nil
,
err
}
return
&
volume
,
nil
}
// InspectVolume returns a volume by its name.
//
// See https://goo.gl/0g9A6i for more details.
func
(
c
*
Client
)
InspectVolume
(
name
string
)
(
*
Volume
,
error
)
{
body
,
status
,
err
:=
c
.
do
(
"GET"
,
"/volumes/"
+
name
,
doOptions
{})
if
status
==
http
.
StatusNotFound
{
return
nil
,
ErrNoSuchVolume
}
if
err
!=
nil
{
return
nil
,
err
}
var
volume
Volume
if
err
:=
json
.
Unmarshal
(
body
,
&
volume
);
err
!=
nil
{
return
nil
,
err
}
return
&
volume
,
nil
}
// RemoveVolume removes a volume by its name.
//
// See https://goo.gl/79GNQz for more details.
func
(
c
*
Client
)
RemoveVolume
(
name
string
)
error
{
_
,
status
,
err
:=
c
.
do
(
"DELETE"
,
"/volumes/"
+
name
,
doOptions
{})
if
status
==
http
.
StatusNotFound
{
return
ErrNoSuchVolume
}
if
status
==
http
.
StatusConflict
{
return
ErrVolumeInUse
}
return
err
}
Godeps/_workspace/src/github.com/fsouza/go-dockerclient/volume_test.go
0 → 100644
View file @
2bf984a5
// Copyright 2015 go-dockerclient authors. All rights reserved.
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.
package
docker
import
(
"encoding/json"
"net/http"
"net/url"
"reflect"
"testing"
)
func
TestListVolumes
(
t
*
testing
.
T
)
{
volumesData
:=
`[
{
"Name": "tardis",
"Driver": "local",
"Mountpoint": "/var/lib/docker/volumes/tardis"
},
{
"Name": "foo",
"Driver": "bar",
"Mountpoint": "/var/lib/docker/volumes/bar"
}
]`
body
:=
`{ "Volumes": `
+
volumesData
+
` }`
var
expected
[]
Volume
if
err
:=
json
.
Unmarshal
([]
byte
(
volumesData
),
&
expected
);
err
!=
nil
{
t
.
Fatal
(
err
)
}
client
:=
newTestClient
(
&
FakeRoundTripper
{
message
:
body
,
status
:
http
.
StatusOK
})
volumes
,
err
:=
client
.
ListVolumes
(
ListVolumesOptions
{})
if
err
!=
nil
{
t
.
Error
(
err
)
}
if
!
reflect
.
DeepEqual
(
volumes
,
expected
)
{
t
.
Errorf
(
"ListVolumes: Wrong return value. Want %#v. Got %#v."
,
expected
,
volumes
)
}
}
func
TestCreateVolume
(
t
*
testing
.
T
)
{
body
:=
`{
"Name": "tardis",
"Driver": "local",
"Mountpoint": "/var/lib/docker/volumes/tardis"
}`
var
expected
Volume
if
err
:=
json
.
Unmarshal
([]
byte
(
body
),
&
expected
);
err
!=
nil
{
t
.
Fatal
(
err
)
}
fakeRT
:=
&
FakeRoundTripper
{
message
:
body
,
status
:
http
.
StatusOK
}
client
:=
newTestClient
(
fakeRT
)
volume
,
err
:=
client
.
CreateVolume
(
CreateVolumeOptions
{
Name
:
"tardis"
,
Driver
:
"local"
,
DriverOpts
:
map
[
string
]
string
{
"foo"
:
"bar"
,
},
},
)
if
err
!=
nil
{
t
.
Fatal
(
err
)
}
if
!
reflect
.
DeepEqual
(
volume
,
&
expected
)
{
t
.
Errorf
(
"CreateVolume: Wrong return value. Want %#v. Got %#v."
,
expected
,
volume
)
}
req
:=
fakeRT
.
requests
[
0
]
expectedMethod
:=
"POST"
if
req
.
Method
!=
expectedMethod
{
t
.
Errorf
(
"CreateVolume(): Wrong HTTP method. Want %s. Got %s."
,
expectedMethod
,
req
.
Method
)
}
u
,
_
:=
url
.
Parse
(
client
.
getURL
(
"/volumes"
))
if
req
.
URL
.
Path
!=
u
.
Path
{
t
.
Errorf
(
"CreateVolume(): Wrong request path. Want %q. Got %q."
,
u
.
Path
,
req
.
URL
.
Path
)
}
}
func
TestInspectVolume
(
t
*
testing
.
T
)
{
body
:=
`{
"Name": "tardis",
"Driver": "local",
"Mountpoint": "/var/lib/docker/volumes/tardis"
}`
var
expected
Volume
if
err
:=
json
.
Unmarshal
([]
byte
(
body
),
&
expected
);
err
!=
nil
{
t
.
Fatal
(
err
)
}
fakeRT
:=
&
FakeRoundTripper
{
message
:
body
,
status
:
http
.
StatusOK
}
client
:=
newTestClient
(
fakeRT
)
name
:=
"tardis"
volume
,
err
:=
client
.
InspectVolume
(
name
)
if
err
!=
nil
{
t
.
Fatal
(
err
)
}
if
!
reflect
.
DeepEqual
(
volume
,
&
expected
)
{
t
.
Errorf
(
"InspectVolume: Wrong return value. Want %#v. Got %#v."
,
expected
,
volume
)
}
req
:=
fakeRT
.
requests
[
0
]
expectedMethod
:=
"GET"
if
req
.
Method
!=
expectedMethod
{
t
.
Errorf
(
"InspectVolume(%q): Wrong HTTP method. Want %s. Got %s."
,
name
,
expectedMethod
,
req
.
Method
)
}
u
,
_
:=
url
.
Parse
(
client
.
getURL
(
"/volumes/"
+
name
))
if
req
.
URL
.
Path
!=
u
.
Path
{
t
.
Errorf
(
"CreateVolume(%q): Wrong request path. Want %q. Got %q."
,
name
,
u
.
Path
,
req
.
URL
.
Path
)
}
}
func
TestRemoveVolume
(
t
*
testing
.
T
)
{
name
:=
"test"
fakeRT
:=
&
FakeRoundTripper
{
message
:
""
,
status
:
http
.
StatusNoContent
}
client
:=
newTestClient
(
fakeRT
)
if
err
:=
client
.
RemoveVolume
(
name
);
err
!=
nil
{
t
.
Fatal
(
err
)
}
req
:=
fakeRT
.
requests
[
0
]
expectedMethod
:=
"DELETE"
if
req
.
Method
!=
expectedMethod
{
t
.
Errorf
(
"RemoveVolume(%q): Wrong HTTP method. Want %s. Got %s."
,
name
,
expectedMethod
,
req
.
Method
)
}
u
,
_
:=
url
.
Parse
(
client
.
getURL
(
"/volumes/"
+
name
))
if
req
.
URL
.
Path
!=
u
.
Path
{
t
.
Errorf
(
"RemoveVolume(%q): Wrong request path. Want %q. Got %q."
,
name
,
u
.
Path
,
req
.
URL
.
Path
)
}
}
func
TestRemoveVolumeNotFound
(
t
*
testing
.
T
)
{
client
:=
newTestClient
(
&
FakeRoundTripper
{
message
:
"no such volume"
,
status
:
http
.
StatusNotFound
})
if
err
:=
client
.
RemoveVolume
(
"test:"
);
err
!=
ErrNoSuchVolume
{
t
.
Errorf
(
"RemoveVolume: wrong error. Want %#v. Got %#v."
,
ErrNoSuchVolume
,
err
)
}
}
func
TestRemoveVolumeInUse
(
t
*
testing
.
T
)
{
client
:=
newTestClient
(
&
FakeRoundTripper
{
message
:
"volume in use and cannot be removed"
,
status
:
http
.
StatusConflict
})
if
err
:=
client
.
RemoveVolume
(
"test:"
);
err
!=
ErrVolumeInUse
{
t
.
Errorf
(
"RemoveVolume: wrong error. Want %#v. Got %#v."
,
ErrVolumeInUse
,
err
)
}
}
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment