Compare commits

..

669 Commits

Author SHA1 Message Date
2d63290f4b Merge pull request #302 from andrewhsu/v9
[17.09] bump version to 17.09.1-ce-rc1
2017-11-30 15:11:11 -08:00
bef07a1ce4 Merge pull request #301 from andrewhsu/c9
[17.09] update changelog for 17.09.1-ce-rc1
2017-11-30 15:10:54 -08:00
5f5660fc44 update changelog for 17.09.1-ce-rc1
Signed-off-by: Andrew Hsu <andrewhsu@docker.com>
Signed-off-by: jose-bigio <jose.bigio@docker.com>
2017-11-30 15:06:01 -08:00
d69695aaf1 Merge pull request #312 from thaJeztah/17.09-backport-fix-version-on-failure
[17.09] Set APIVersion on the client, even when Ping fails
2017-11-30 14:03:51 -08:00
3f7bf4e845 Merge pull request #330 from thaJeztah/17.09-backport-cli-version
[17.09] Fix version comparison when negotiating the the API version
2017-11-30 13:58:42 -08:00
0ca354c767 Merge pull request #319 from thaJeztah/17.09-backport-dm-dos-prevention-remove-mountpoint
[17.09] backport dm dos prevention remove mountpoint
2017-11-30 12:48:38 -08:00
b3f86e3d0f Merge pull request #326 from kolyshkin/backport-353516-17.09
[17.09] Fix honoring tmpfs-size for user /dev/shm mount
2017-11-30 12:47:02 -08:00
c24589548f Merge pull request #331 from thaJeztah/17.09-backport-fix-net-not-found
[17.09] Restore error type in FindNetwork
2017-11-30 12:44:32 -08:00
6b4f347ab9 Merge pull request #317 from thaJeztah/17.09-backport-for_linux_126_dont_abort
[17.09] Don't abort when setting may_detach_mounts
2017-11-29 19:31:10 -08:00
c3be82eb0a Restore error type in FindNetwork
The error type libnetwork.ErrNoSuchNetwork is used in the controller
to retry the network creation as a managed network though the manager.
The change of the type was breaking the logic causing the network to
not being created anymore so that no new container on that network
was able to be launched
Added unit test

Signed-off-by: Flavio Crisciani <flavio.crisciani@docker.com>
(cherry picked from commit 51cea0a53c2fd36832277402e9faac81bfb4abd4)
Signed-off-by: Sebastiaan van Stijn <github@gone.nl>
2017-11-29 16:48:04 -08:00
bea7b88e4b Override github.com/docker/docker in vendor.conf
Signed-off-by: Sebastiaan van Stijn <github@gone.nl>
2017-11-29 15:54:49 -08:00
7da03c8e7c Fix version comparison when negotiating the the API version
Signed-off-by: Yu-Ju Hong <yjhong@google.com>
Signed-off-by: Sebastiaan van Stijn <github@gone.nl>
2017-11-29 15:53:01 -08:00
93c8cd4a54 Fix version comparison when negotiating the the API version
Signed-off-by: Yu-Ju Hong <yjhong@google.com>
(cherry picked from commit 4b6ec10b07c14e7fff1cc51156b6d954147f826f)
Signed-off-by: Sebastiaan van Stijn <github@gone.nl>
2017-11-29 15:46:50 -08:00
bb351b1f19 Merge pull request #315 from thaJeztah/17.09-backport-dont-warn-for-comment-only-lines
[17.09] Warn on empty continuation lines only, not for comments
2017-11-29 14:23:56 -08:00
de00d5a407 Merge pull request #314 from thaJeztah/17.09-backport-fix_chroot_mount_race
[17.09] Use rslave instead of rprivate in chrootarchive
2017-11-29 14:16:17 -08:00
d102cb2dd5 Merge pull request #251 from tonistiigi/fix-config-leak
[17.09] builder: fix config leakage on shared parent stage
2017-11-29 14:06:50 -08:00
e68f903cfc Merge pull request #318 from thaJeztah/17.09-backport-rlock-fix
[17.09] cluster: avoid recursive readlock on swarm info
2017-11-29 14:05:13 -08:00
ff664c00db Merge pull request #327 from johnstep/windows-manifest-lists
[17.09] Backport version fix for Windows manifest lists
2017-11-29 14:00:08 -08:00
c4124d0875 Merge pull request #328 from andrewhsu/ln
[17.09] bump vndr of libnetwork to 690b4c0
2017-11-29 13:58:13 -08:00
e5b5086d0b Merge pull request #313 from thaJeztah/17.09-backport-protect-health-monitor-channel
[17.09] container: protect health monitor channel
2017-11-29 10:45:11 -08:00
61ee5a0623 Merge pull request #329 from andrewhsu/flake
[17.09] Avoid failing the test if container is already stopped
2017-11-29 10:06:22 -08:00
87f5f1d49c Avoid failing the test if container is already stopped
Signed-off-by: Simon Ferquel <simon.ferquel@docker.com>
(cherry picked from commit adf75503dba2e782139173c011999eacd0c3d7e2)
Signed-off-by: Andrew Hsu <andrewhsu@docker.com>
2017-11-28 23:09:04 -08:00
79757e0860 Merge pull request #320 from tonistiigi/clean-exec-fifos
[17.09] libcontainerd: fix leaking container/exec state
2017-11-28 17:28:24 -08:00
56e2353034 Merge pull request #323 from jose-bigio/17.09_vendoring
[17.09] update swarmkit to b40ffde
2017-11-28 17:22:10 -08:00
9cef9a54e6 Merge pull request #300 from docker/backport_CVE2
[17.09] vendor: update to github.com/vbatts/tar-split@v0.10.2
2017-11-28 17:10:37 -08:00
3fbf1fbd82 bump vndr of libnetwork to 690b4c0
Signed-off-by: Andrew Hsu <andrewhsu@docker.com>
2017-11-28 15:06:32 -08:00
ceb3b42a7f update swarmkit to b40ffde
Signed-off-by: jose-bigio <jose.bigio@docker.com>
2017-11-28 13:55:40 -08:00
9083769a6e Stop filtering Windows manifest lists by version
Signed-off-by: John Stephens <johnstep@docker.com>
(cherry picked from commit 8ed8f4a71d7e1a936fa077b4348b7375c81746a6)

Conflicts:
	components/engine/distribution/pull_v2_windows.go

Signed-off-by: John Stephens <johnstep@docker.com>
2017-11-20 13:18:50 -08:00
21e53b4643 Add support for Windows version filtering on pull
Update logic to choose manifest from manifest list to check
for os version on Windows. Separate the logic for windows
and unix to keep unix logic the same.

Signed-off-by: Derek McGowan <derek@mcgstyle.net>
(cherry picked from commit 38aef56e1fcb8ea318df98c89cf002267b88a136)
Signed-off-by: John Stephens <johnstep@docker.com>
2017-11-20 13:00:09 -08:00
3406769872 integration: test case for #35271
This test case is checking that the built-in default size for /dev/shm
(which is used for `--ipcmode` being `private` or `shareable`)
is not overriding the size of user-defined tmpfs mount for /dev/shm.

In other words, this is a regression test case for issue #35271,
https://github.com/moby/moby/issues/35271

Signed-off-by: Kir Kolyshkin <kolyshkin@gmail.com>
(cherry picked from commit 2e0a98b605fa278ee1f348c68fe7e07aed57b834)
Signed-off-by: Kir Kolyshkin <kolyshkin@gmail.com>
2017-11-17 19:23:34 -08:00
15e5af3a07 Fix user mount /dev/shm size
Commit 7120976d74195 ("Implement none, private, and shareable ipc
modes") introduces a bug: if a user-specified mount for /dev/shm
is provided, its size is overriden by value of ShmSize.

A reproducer is simple:

 docker run --rm
	--mount type=tmpfs,dst=/dev/shm,tmpfs-size=100K \
	alpine df /dev/shm

This commit is an attempt to fix the bug, as well as optimize things
a but and make the code easier to read.

https://github.com/moby/moby/issues/35271

Signed-off-by: Kir Kolyshkin <kolyshkin@gmail.com>
(cherry picked from commit 31d30a985d99a0eef92116a22159727f5c332784)
2017-11-17 19:23:22 -08:00
f1bf9f2c5b integration-cli: add TestExecStateCleanup test
Signed-off-by: Tonis Tiigi <tonistiigi@gmail.com>
2017-11-17 12:20:43 -08:00
e02f35c1fc libcontainerd: remove fifos on docker exec failed
if docker exec failed to start, the fifo for exec will
left on system.
```
[root@centos-220 bcc8bc6a080eb859ecd193dc32ea4e1cd0080b070afb2a0259b3ed004aae155e]# docker exec -ti bcc8bc6a080e bash
rpc error: code = 2 desc = oci runtime error: exec failed: container_linux.go:247: starting container process caused "exec: \"bash\": executable file not found in $PATH"

[root@centos-220 bcc8bc6a080eb859ecd193dc32ea4e1cd0080b070afb2a0259b3ed004aae155e]# ls -l
total 4
prwx------. 1 root root    0 Apr 10 11:29 46889b0713827f708949af4f6b30315181e1d96e75ce179c949935ab02db2bd1-stdin
prwx------. 1 root root    0 Apr 10 11:29 46889b0713827f708949af4f6b30315181e1d96e75ce179c949935ab02db2bd1-stdout
prwx------. 1 root root    0 Apr  6 13:15 4dfc9806a2aef53f72a5d2854ff235714b5f064d10e29b5e59ff67d48a924462-stdin
prwx------. 1 root root    0 Apr  6 13:15 4dfc9806a2aef53f72a5d2854ff235714b5f064d10e29b5e59ff67d48a924462-stdout
prwx------. 1 root root    0 Apr  6 13:15 cc3af6845394cc60007b49242acd990b28988ef4ddaaa217a26caba1075ab343-stdin
prwx------. 1 root root    0 Apr  6 13:15 cc3af6845394cc60007b49242acd990b28988ef4ddaaa217a26caba1075ab343-stdout
-rw-r--r--. 1 root root 3353 Apr  6 13:12 config.json
prwx------. 1 root root    0 Apr  6 13:14 d35e637104991052261e3afeba96a86b3cc6392dae6bd2226812407c0b92a20c-stdin
prwx------. 1 root root    0 Apr  6 13:14 d35e637104991052261e3afeba96a86b3cc6392dae6bd2226812407c0b92a20c-stdout
prwx------. 1 root root    0 Apr  6 13:12 init-stdin
prwx------. 1 root root    0 Apr  6 13:12 init-stdout
```

Signed-off-by: Lei Jitang <leijitang@huawei.com>
(cherry picked from commit 997ec06298081bf616177bf6fb102dc737b321ce)
Signed-off-by: Tonis Tiigi <tonistiigi@gmail.com>
2017-11-17 12:15:41 -08:00
b91a1041f6 devmapper: add a test for mount leak workaround
In order to avoid reverting our fix for mount leakage in devicemapper,
add a test which checks that devicemapper's Get() and Put() cycle can
survive having a command running in an rprivate mount propagation setup
in-between. While this is quite rudimentary, it should be sufficient.

We have to skip this test for pre-3.18 kernels.

Signed-off-by: Aleksa Sarai <asarai@suse.de>
(cherry picked from commit 1af8ea681fba1935c60c11edbbe19b894c9b286f)
Signed-off-by: Sebastiaan van Stijn <github@gone.nl>
2017-11-17 17:36:34 +01:00
b01ad4a8b6 devicemapper: remove container rootfs mountPath after umount
libdm currently has a fairly substantial DoS bug that makes certain
operations fail on a libdm device if the device has active references
through mountpoints. This is a significant problem with the advent of
mount namespaces and MS_PRIVATE, and can cause certain --volume mounts
to cause libdm to no longer be able to remove containers:

  % docker run -d --name testA busybox top
  % docker run -d --name testB -v /var/lib/docker:/docker busybox top
  % docker rm -f testA
  [fails on libdm with dm_task_run errors.]

This also solves the problem of unprivileged users being able to DoS
docker by using unprivileged mount namespaces to preseve mounts that
Docker has dropped.

Signed-off-by: Aleksa Sarai <asarai@suse.de>
(cherry picked from commit 92e45b81e0a8b68d9567a2068247460a1ba59600)
Signed-off-by: Sebastiaan van Stijn <github@gone.nl>
2017-11-17 17:36:28 +01:00
e70eb02632 cluster: avoid recursive readlock on swarm info
Signed-off-by: Tonis Tiigi <tonistiigi@gmail.com>
(cherry picked from commit ee1be71e9dc52db8a7ac951ba96f18a5c894806a)
Signed-off-by: Sebastiaan van Stijn <github@gone.nl>
2017-11-17 17:33:20 +01:00
66cbbe22db Don't abort when setting may_detach_mounts
83c2152de503012195bd26069fd8fbd2dea4b32f sets the kernel param for
fs.may_detach_mounts, but this is not neccessary for the daemon to
operate. Instead of erroring out (and thus aborting startup) just log
the error.

Signed-off-by: Brian Goff <cpuguy83@gmail.com>
(cherry picked from commit c6a2044497e0e1ff61350859c8572a2c31c17ced)
Signed-off-by: Sebastiaan van Stijn <github@gone.nl>
2017-11-17 17:19:25 +01:00
338e914b20 Warn on empty continuation lines only, not for comments
Commit 8d1ae76dcbbb73d8e20c6a14a7d3fe2410b95f55 added
deprecation warnings for empty continuation lines,
but also treated comment-only lines as empty.

This patch distinguishes empty continuation lines
from comment-only lines, and only outputs warnings
for the former.

Signed-off-by: Sebastiaan van Stijn <github@gone.nl>
(cherry picked from commit 2fd736ac10c1c46d1001373d887cb99b3d8ee824)
Signed-off-by: Sebastiaan van Stijn <github@gone.nl>
2017-11-17 17:10:39 +01:00
6c6a1827cf Use rslave instead of rprivate in chrootarchive
With `rprivate` there exists a race where a reference to a mount has
propagated to the new namespace, when `rprivate` is set the parent
namespace is not able to remove the mount due to that reference.
With `rslave` unmounts will propagate correctly into the namespace and
prevent the sort of transient errors that are possible with `rprivate`.

This is a similar fix to 117c92745b

Signed-off-by: Brian Goff <cpuguy83@gmail.com>
(cherry picked from commit 5ede64d63fec0b9d4cf921b6f8fb946e65287538)
Signed-off-by: Sebastiaan van Stijn <github@gone.nl>
2017-11-17 17:00:09 +01:00
030334d397 container: protect health monitor channel
While this code was likely called from a single thread before, we have
now seen panics, indicating that it could be called in parallel. This
change adds a mutex to protect opening and closing of the channel. There
may be another root cause associated with this panic, such as something
that led to the calling of this in parallel, as this code is old and we
had seen this condition until recently.

This fix is by no means a permanent fix. Typically, bugs like this
indicate misplaced channel ownership. In idiomatic uses, the channel
should have a particular "owner" that coordinates sending and closure.
In this case, the owner of the channel is unclear, so it gets opened
lazily. Synchronizing this access is a decent solution, but a refactor
may yield better results.

Signed-off-by: Stephen J Day <stephen.day@docker.com>
(cherry picked from commit 5b55747a523671fa6e626848060460a48d058451)
Signed-off-by: Sebastiaan van Stijn <github@gone.nl>
2017-11-17 16:48:45 +01:00
b02a5e5084 Set APIVersion on the client, even when Ping fails
Refactor to support testing
Also add tests

Signed-off-by: Daniel Nephin <dnephin@docker.com>
(cherry picked from commit e828efa4ab)
Signed-off-by: Sebastiaan van Stijn <github@gone.nl>
2017-11-17 16:37:11 +01:00
8916204beb Merge pull request #291 from thaJeztah/17.09-backport-mask-scsi
[17.09] Add /proc/scsi to masked paths
2017-11-16 17:05:45 -08:00
a5694003b0 Merge pull request #303 from seemethere/fix_s390x_ppc64le_tests_1709
[17.09] fix p/z HubPullSuite tests
2017-11-10 09:33:06 -08:00
f9cf09436b [integration-cli] fix p/z HubPullSuite tests
This test tries to pull all the tags in the busybox repo and looks to see
if there were more than two images pulled. This was failing on
p/z due to the recent change to manifest lists, where one of the busybox
tags didn't have a p/z manifest in it's manifest list.

This error seems fine to me, so I changed the test to see if pull fails,
it fails with the "manifest not found" error.

Also switched from busybox -> alpine, because it has significantly less tags,
and the images are close in size.

Signed-off-by: Christopher Jones <tophj@linux.vnet.ibm.com>
(cherry picked from commit 5739ba1b918402b8eda748ac2f5dd7ce00f2e69f)
Signed-off-by: Eli Uriegas <eli.uriegas@docker.com>
2017-11-09 19:19:46 +00:00
3fdbcd1680 bump version to 17.09.1-ce-rc1
Signed-off-by: Andrew Hsu <andrewhsu@docker.com>
2017-11-07 16:24:18 -08:00
c480a40b85 image: add import test for CVE-2017-14992
To ensure that we don't revert CVE-2017-14992, add a test that is quite
similar to that upstream tar-split test (create an empty archive with
lots of junk and make sure the daemon doesn't crash).

Signed-off-by: Aleksa Sarai <asarai@suse.de>
(cherry picked from commit 0a13f827a10d3bf61744d9b3f7165c5885a39c5d)
Signed-off-by: Victor Vieux <victorvieux@gmail.com>
2017-11-07 14:28:02 -08:00
40bd542277 internal: testutil: add DevZero helper
This helper acts like /dev/zero (outputs \x00 indefinitely) in an
OS-independent fashion. This ensures we don't need to special-case
around Windows in tests that want to open /dev/zero.

Signed-off-by: Aleksa Sarai <asarai@suse.de>
(cherry picked from commit 2f8d3e1c33f77187c68893803018756d43daff15)
Signed-off-by: Victor Vieux <victorvieux@gmail.com>
2017-11-07 14:27:58 -08:00
341aec8bb0 vendor: update to github.com/vbatts/tar-split@v0.10.2
Update to the latest version of tar-split, which includes a change to
fix a memory exhaustion issue where a malformed image could cause the
Docker daemon to crash.

  * tar: asm: store padding in chunks to avoid memory exhaustion

Fixes: CVE-2017-14992
Signed-off-by: Aleksa Sarai <asarai@suse.de>
(cherry picked from commit e0ff7cccc3cac73da41ec9ef007b0e4e97c55d01)
Signed-off-by: Victor Vieux <victorvieux@gmail.com>
2017-11-07 14:27:54 -08:00
51ab500b6c Add /proc/scsi to masked paths
This is writeable, and can be used to remove devices. Containers do
not need to know about scsi devices.

Signed-off-by: Justin Cormack <justin.cormack@docker.com>
(cherry picked from commit a21ecdf3c8a343a7c94e4c4d01b178c87ca7aaa1)
Signed-off-by: Sebastiaan van Stijn <github@gone.nl>
2017-11-06 14:00:32 +01:00
afdb6d44a8 Merge pull request #253 from andrewhsu/v
[17.09] bump version 17.09.0-ce
2017-09-26 15:24:58 -07:00
3b0f381088 Merge pull request #252 from andrewhsu/cl
[17.09] update changelog for 17.09.0-ce release
2017-09-26 15:24:36 -07:00
09d58a6cc0 update changelog for 17.09.0-ce release
Signed-off-by: Andrew Hsu <andrewhsu@docker.com>
2017-09-26 15:21:58 -07:00
8056485bad bump version 17.09.0-ce
Signed-off-by: Andrew Hsu <andrewhsu@docker.com>
2017-09-22 09:13:41 -07:00
81cc2b36fa builder: fix config leakage on shared parent stage
Signed-off-by: Tonis Tiigi <tonistiigi@gmail.com>
2017-09-21 13:22:44 -07:00
2357fb28b5 Merge pull request #243 from andrewhsu/rc3
[17.09] bump version to 17.09.0-ce-rc3
2017-09-20 18:12:40 -07:00
9661f00ed4 Merge pull request #244 from andrewhsu/cl
[17.09] update changelog for 17.09.0-ce-rc3
2017-09-20 18:12:19 -07:00
db97c3db91 Merge pull request #249 from andrewhsu/hcsshim
[17.09] vndr Microsoft/hcsshim to v0.6.5
2017-09-20 17:47:21 -07:00
fe19ba678a Merge pull request #239 from thaJeztah/17.09-fix-relabel-config-files
[17.09] Relabel config files.
2017-09-20 17:36:02 -07:00
d86b81fcce Merge pull request #247 from thaJeztah/17.09-may_detach_mount
[17.09] back port Automatically set `may_detach_mounts=1` on startup
2017-09-20 17:24:41 -07:00
0a7586971f Merge pull request #245 from thaJeztah/17.09-close_overlay2_pipe
[17.09] back port Close pipe if mountFrom failed.
2017-09-20 17:20:25 -07:00
5fd57722d1 Merge pull request #233 from thaJeztah/backport-fixed-raw-splunk-logger
[17.09] Fixed `raw` mode splunk logger
2017-09-20 17:18:18 -07:00
4856a9ec15 Merge pull request #242 from vieux/bump_swarmkit_vendor
[17.09] vndr docker/swarmkit to dcd1f2d for snapshot size fix
2017-09-20 17:13:43 -07:00
6a80ba3b8a Merge pull request #241 from thaJeztah/17.09-fix_selinux_with_mount_api
[17.09] Set selinux label on local volumes from mounts API
2017-09-20 17:09:11 -07:00
508a2630a3 Merge pull request #236 from thaJeztah/17.09-fix-secrets-and-configs-idempotence
[17.09] sort secrets and configs to ensure idempotence
2017-09-20 17:08:07 -07:00
1ae6ae93c4 Merge pull request #231 from thaJeztah/backport-remove-cors-headers-flag
[17.09] Backport remove cors headers flag
2017-09-20 17:07:44 -07:00
ccdf90d524 Merge pull request #237 from thaJeztah/17.09-more-yaml-information
[17.09] Add more information to the generated YAML for documentation
2017-09-20 16:33:29 -07:00
79ca5680b8 Merge pull request #232 from thaJeztah/backport-fix-system-df
[17.09] Fix variable shadowing causing LayersSize to be reported as 0
2017-09-20 13:56:23 -07:00
1f4bf6c347 vndr Microsoft/hcsshim to v0.6.5
Signed-off-by: Andrew Hsu <andrewhsu@docker.com>
2017-09-20 13:16:35 -07:00
0f16d9b90a Automatically set may_detach_mounts=1 on startup
This is kernel config available in RHEL7.4 based kernels that enables
mountpoint removal where the mountpoint exists in other namespaces.
In particular this is important for making this pattern work:

```
umount -l /some/path
rm -r /some/path
```

Where `/some/path` exists in another mount namespace.
Setting this value will prevent `device or resource busy` errors when
attempting to the removal of `/some/path` in the example.

This setting is the default, and non-configurable, on upstream kernels
since 3.15.

Signed-off-by: Brian Goff <cpuguy83@gmail.com>
(cherry picked from commit 83c2152de503012195bd26069fd8fbd2dea4b32f)
Signed-off-by: Sebastiaan van Stijn <github@gone.nl>
2017-09-20 20:35:33 +02:00
a825d7bfdf Close pipe if mountFrom failed.
Signed-off-by: Shukui Yang <yangshukui@huawei.com>
(cherry picked from commit 9f38923901352459bb621d0b3587a6517e67eeb3)
Signed-off-by: Sebastiaan van Stijn <github@gone.nl>
2017-09-20 19:32:44 +02:00
af4a1fc87e update changelog for 17.09.0-ce-rc3
Signed-off-by: Andrew Hsu <andrewhsu@docker.com>
2017-09-19 20:34:25 -07:00
a7f4500a2c bump version to 17.09.0-ce-rc3
Signed-off-by: Andrew Hsu <andrewhsu@docker.com>
2017-09-19 20:31:48 -07:00
5fb8e37ec7 bump swarmkit to dcd1f2d56afc08827d060fdb8ad222b00b1b6000
Signed-off-by: Victor Vieux <victorvieux@gmail.com>
2017-09-19 16:53:46 -07:00
da6e49e1f7 Set selinux label on local volumes from mounts API
When using a volume via the `Binds` API, a shared selinux label is
automatically set.
The `Mounts` API is not setting this, which makes volumes specified via
the mounts API useless when selinux is enabled.

This fix adopts the same selinux label for volumes on the mounts API as on
binds.
Note in the case of both the `Binds` API and the `Mounts` API, the
selinux label is only applied when the volume driver is the `local`
driver.

Signed-off-by: Brian Goff <cpuguy83@gmail.com>
(cherry picked from commit 5bbf5cc671ec8007bf8e0416799fff01d6a79b7e)
Signed-off-by: Sebastiaan van Stijn <github@gone.nl>
2017-09-19 21:57:56 +02:00
fc12f83f79 Some cleanup of mount create API test
Signed-off-by: Daniel Nephin <dnephin@docker.com>
(cherry picked from commit 58b96aced87b33c4175fa5d3422289f763ab599d)
Signed-off-by: Sebastiaan van Stijn <github@gone.nl>
2017-09-19 21:57:46 +02:00
3d9fc736e9 Relabel config files.
Without relabel these files, SELinux-enabled containers will show
"permission denied" errors for configuration files mounted with
`docker server create ... --config ... ...`.

Signed-off-by: Wenxuan Zhao <viz@linux.com>
(cherry picked from commit 472c03a8c364090afb88258b3dd9748183c29d05)
Signed-off-by: Sebastiaan van Stijn <github@gone.nl>
2017-09-19 17:53:50 +02:00
390c0782bc Add more information about commands to generated YAML docs
This patch adds aditional information about commands to the YAML files
that are generated for the reference documentation.

The following fields are added for each command:

Property          | Type      | Description
------------------|-----------|---------------------------------------------------------------------------------------
deprecated        | Boolean   | Indicates if the command is marked deprecated
min_api_version   | String    | The API version required to use this command (e.g. "1.23")
experimental      | Boolean   | Indicates if the command requires the daemon to run with experimental features enabled

For example (taken from the experimental `docker checkpoint create` command):

    command: docker checkpoint create
    short: Create a checkpoint from a running container
    long: Create a checkpoint from a running container
    usage: docker checkpoint create [OPTIONS] CONTAINER CHECKPOINT
    pname: docker checkpoint
    plink: docker_checkpoint.yaml
    options:
    - option: checkpoint-dir
      value_type: string
      description: Use a custom checkpoint storage directory
      deprecated: false
      experimental: false
    - option: leave-running
      value_type: bool
      default_value: "false"
      description: Leave the container running after checkpoint
      deprecated: false
      experimental: false
    deprecated: false
    min_api_version: "1.25"
    experimental: true

Signed-off-by: Sebastiaan van Stijn <github@gone.nl>

(cherry picked from commit 1f48e75c5c)

Signed-off-by: Sebastiaan van Stijn <github@gone.nl>

Signed-off-by: Sebastiaan van Stijn <github@gone.nl>
2017-09-19 14:17:58 +02:00
f238e40c68 Add more information about command flags to generated YAML docs
This patch adds aditional information about command flags to the YAML files
that are generated for the reference documentation.

The following fields are added for each flag:

Property          | Type      | Description
------------------|-----------|---------------------------------------------------------------------------------------
value_type        | String    | The "type" of value to be passed to this flag (e.g., `uint64`, `list`)
deprecated        | Boolean   | Indicates if the flag is marked deprecated
min_api_version   | String    | The API version required to use this flag (e.g. "1.23")
experimental      | Boolean   | Indicates if the flag requires the daemon to run with experimental features enabled

For example (taken from the `docker image build` command):

    - option: security-opt
      value_type: stringSlice
      default_value: '[]'
      description: Security options
      deprecated: false
      experimental: false
    - option: shm-size
      value_type: bytes
      default_value: "0"
      description: Size of /dev/shm
      deprecated: false
      experimental: false
    - option: squash
      value_type: bool
      default_value: "false"
      description: Squash newly built layers into a single new layer
      deprecated: false
      min_api_version: "1.25"
      experimental: true

Signed-off-by: Sebastiaan van Stijn <github@gone.nl>

(cherry picked from commit a8ba6f93d9)

Signed-off-by: Sebastiaan van Stijn <github@gone.nl>

Signed-off-by: Sebastiaan van Stijn <github@gone.nl>
2017-09-19 14:17:51 +02:00
2a4728f860 sort secrets and configs to ensure idempotence
`docker stack deploy` keeps restarting services it doesn't need to (no changes)
because the entries' order gets randomized at some previous (de)serialization.
Maybe it would be worth looking into this at a higher level and ensure
all (de)serialization happens in an ordered collection.

This quick fix sorts secrets and configs (in place, mutably) which ensures the
same order for each run.

Based on
https://github.com/moby/moby/pull/30506

Fixes
https://github.com/moby/moby/issues/34746

Signed-off-by: Peter Nagy <xificurC@gmail.com>
(cherry picked from commit 27e8bdf32b)
Signed-off-by: Sebastiaan van Stijn <github@gone.nl>
2017-09-19 11:21:42 +02:00
1ad05ae326 Fixed raw mode splunk logger
Splunk HEC does not accept log events with an empty string or a
whitespace-only string.

Signed-off-by: Florian Noeding <florian@noeding.com>
(cherry picked from commit 5f6d6a5093a4db799f9c1a6bb82eed1eea13ec0c)
Signed-off-by: Sebastiaan van Stijn <github@gone.nl>
2017-09-19 11:00:53 +02:00
393d90ba3d Fix variable shadowing causing LayersSize to be reported as 0
Signed-off-by: Cezar Sa Espinola <cezarsa@gmail.com>
(cherry picked from commit 313bc1e339fa4292d9ef5bc74acc82436eab7e1e)
Signed-off-by: Sebastiaan van Stijn <github@gone.nl>
2017-09-19 10:16:52 +02:00
2a3140fcb7 Update deprecated.md for "api-enable-cors"
Signed-off-by: Sebastiaan van Stijn <github@gone.nl>
(cherry picked from commit 7c69bf1d24)
Signed-off-by: Sebastiaan van Stijn <github@gone.nl>
2017-09-18 21:50:51 +02:00
66a5055240 Remove deprecated --enable-api-cors flag
The `--enable-api-cors` flag was deprecated in f3dd2db4ff7de1399a49af928cd3eae4fccf8764,
and marked for removal in docker 17.09 through 85f92ef3590b386ea17e3948262725a2d3ce4db5.

This patch removes the deprecated flag.

Signed-off-by: Sebastiaan van Stijn <github@gone.nl>
(cherry picked from commit 7d4eab554379524c2421a7ecd3319d1d087d1de2)
Signed-off-by: Sebastiaan van Stijn <github@gone.nl>
2017-09-18 21:50:42 +02:00
363a3e75cd Merge pull request #229 from andrewhsu/static
[17.09] backport fix to get static builds going
2017-09-13 17:57:50 -07:00
22cec742b1 Fix fetching LVM2 sources
Version 2.02.173 has disappeared, let's revert back to latest stable
one.

https://github.com/moby/moby/issues/34843

Signed-off-by: Kir Kolyshkin <kolyshkin@gmail.com>
(cherry picked from commit a436d8a634392f9e82b6930a560d56900d887ce7)
Signed-off-by: Andrew Hsu <andrewhsu@docker.com>
2017-09-13 17:05:37 -07:00
17db25d098 Merge pull request #227 from andrewhsu/rc2
[17.09] bump version to 17.09.0-ce-rc2
2017-09-13 14:05:25 -07:00
3e2dc53d19 Merge pull request #228 from andrewhsu/cl
[17.09] update changelog for 17.09.0-ce-rc2
2017-09-13 14:05:05 -07:00
efac66c62b Merge pull request #221 from vieux/updatecli
[17.09] cli updated vendoring
2017-09-13 14:00:13 -07:00
9e5777a749 LCOW: Spot fix for multi-os image pulling
Signed-off-by: John Howard <jhoward@microsoft.com>
(cherry picked from commit b291f5a31728f7ff6386bb37f15e7c0885d3b2a7)
Signed-off-by: Andrew Hsu <andrewhsu@docker.com>
2017-09-13 12:38:48 -07:00
c6e21043d8 Use a local copy of ParseLogDetails
It's being removed from client/

Signed-off-by: Daniel Nephin <dnephin@docker.com>
(cherry picked from commit a747389bf4)
Signed-off-by: Victor Vieux <victorvieux@gmail.com>
2017-09-13 10:46:14 -07:00
7034626ac6 vndr github.com/docker/docker to 84144a8 to fix stuff
Signed-off-by: Andrew Hsu <andrewhsu@docker.com>
(cherry picked from commit 850b46e67c)
Signed-off-by: Victor Vieux <victorvieux@gmail.com>
2017-09-12 17:53:14 -07:00
1fa0e54ee7 remove unused vndr github.com/docker/libtrust
Signed-off-by: Andrew Hsu <andrewhsu@docker.com>
(cherry picked from commit 536da4a07a)
Signed-off-by: Victor Vieux <victorvieux@gmail.com>
2017-09-12 16:02:43 -07:00
5f31b291fb vndr golang.org/x/sys to 07c1829
To satisfy requirements of the vndr of docker/docker

Signed-off-by: Andrew Hsu <andrewhsu@docker.com>
(cherry picked from commit 50696bbf72)
Signed-off-by: Victor Vieux <victorvieux@gmail.com>
2017-09-12 16:02:36 -07:00
172695debf vndr docker/docker to ea220e7 to bring in fix for arm
Primarily to bring in fix for "Clear Architecture field in platform
constraint for arm architectures".

Signed-off-by: Andrew Hsu <andrewhsu@docker.com>
(cherry picked from commit ef027b6d72)
Signed-off-by: Victor Vieux <victorvieux@gmail.com>
2017-09-12 16:02:29 -07:00
49f307c88f Revert "Add skip for known failure"
This reverts commit b33e8d49d4.

Signed-off-by: Victor Vieux <victorvieux@gmail.com>
2017-09-12 15:52:22 -07:00
e6067b8038 Remove unused depdendencies from vendor
Signed-off-by: Daniel Nephin <dnephin@docker.com>
(cherry picked from commit 724f03bb23)
Signed-off-by: Victor Vieux <victorvieux@gmail.com>
2017-09-08 16:03:45 -07:00
49c9ca25c0 updated vendoring
Signed-off-by: Simon Ferquel <simon.ferquel@docker.com>
(cherry picked from commit a0113c3a44)
Signed-off-by: Victor Vieux <victorvieux@gmail.com>
2017-09-08 16:03:45 -07:00
21154792a5 Merge pull request #225 from seemethere/fix_metalinter_conversion_errors
[17.09] Fix metalinter conversion errors
2017-09-08 16:00:36 -07:00
be7f90619c Merge pull request #226 from seemethere/fix_test_run_environment
[17.09] Fix test run environment
2017-09-07 21:39:12 -07:00
4231d771bb update changelog for 17.09.0-ce-rc2
Signed-off-by: Andrew Hsu <andrewhsu@docker.com>
2017-09-07 13:34:31 -07:00
b4a675c535 bump version to 17.09.0-ce-rc2
Signed-off-by: Andrew Hsu <andrewhsu@docker.com>
2017-09-07 13:12:13 -07:00
dff328c8a6 Fix a bad assumption
If the empty variable happens to be sorted to the end of the list then TrimSpace()
would remove it. Instead only strip the single trailing newline.

Signed-off-by: Daniel Nephin <dnephin@docker.com>
(cherry picked from commit fff605c3b3557acf6bf793813d695fba59d7fa21)
Signed-off-by: Eli Uriegas <eli.uriegas@docker.com>
2017-09-07 11:40:46 -07:00
2b763fa480 overlay gd: fix build for 32-bit ARM
This commit reverts a hunk of commit 2f5f0af3f ("Add unconvert linter")
and adds a hint for unconvert linter to ignore excessive conversion as
it is required on 32-bit platforms (e.g. armhf).

The exact error on armhf is this:

	19:06:45 ---> Making bundle: dynbinary (in bundles/17.06.0-dev/dynbinary)
	19:06:48 Building: bundles/17.06.0-dev/dynbinary-daemon/dockerd-17.06.0-dev
	19:10:58 # github.com/docker/docker/daemon/graphdriver/overlay
	19:10:58 daemon/graphdriver/overlay/copy.go:161: cannot use stat.Atim.Sec (type int32) as type int64 in argument to time.Unix
	19:10:58 daemon/graphdriver/overlay/copy.go:161: cannot use stat.Atim.Nsec (type int32) as type int64 in argument to time.Unix
	19:10:58 daemon/graphdriver/overlay/copy.go:162: cannot use stat.Mtim.Sec (type int32) as type int64 in argument to time.Unix
	19:10:58 daemon/graphdriver/overlay/copy.go:162: cannot use stat.Mtim.Nsec (type int32) as type int64 in argument to time.Unix

Signed-off-by: Kir Kolyshkin <kolyshkin@gmail.com>
(cherry picked from commit 0120303d8ea4a1d9f8920ac4dba80521072e8536)
Signed-off-by: Eli Uriegas <eli.uriegas@docker.com>
2017-09-06 16:07:27 -07:00
8227e4e739 Fix 'make all' for other platforms
Since commit d7e2c4ce7 ("Use gometalinter for linting") command
"make all" fails on all the non-default platforms (i.e. ARMs, PPC, and
s390) in this way:

	# make all
	...
	Congratulations!  All commits are properly signed with the DCO!
	/go/src/github.com/docker/docker/hack/validate/gometalinter: line 6: gometalinter: command not found
	Makefile:105: recipe for target 'all' failed
	make: *** [all] Error 127

Make sure gometalinter is installed for those platforms

Signed-off-by: Kir Kolyshkin <kolyshkin@gmail.com>
(cherry picked from commit 0c0047e67f8ee73f73465ac60ccebbd16260ab46)
Signed-off-by: Eli Uriegas <eli.uriegas@docker.com>
2017-09-06 16:07:27 -07:00
a0a9bbd3f2 re-enable some conversion for darwin-amd64 platform
Signed-off-by: Simon Ferquel <simon.ferquel@docker.com>
(cherry picked from commit 7c9e64a2e1891bf1020d9312a18741c734fa1cd6)
Signed-off-by: Eli Uriegas <eli.uriegas@docker.com>
2017-09-06 16:06:15 -07:00
ae21824df8 Merge pull request #223 from seemethere/bump_17090rc1
[17.09] bump version to 17.09.0-ce-rc1
2017-09-06 15:22:01 -07:00
ec4c78a39b Merge pull request #214 from vieux/17.09-changelog
[17.09] add 17.09 changelog
2017-09-06 15:21:47 -07:00
aa56783035 Merge pull request #224 from seemethere/fix_integration_tests_1709
[17.09] Changes error check form NotNil to IsNil
2017-09-06 15:18:32 -07:00
b33e8d49d4 Add skip for known failure
Signed-off-by: Eli Uriegas <eli.uriegas@docker.com>
2017-09-06 13:41:55 -07:00
5d1587e61e Changes error check form NotNil to IsNil
rmi -f always returns a 0 exit code so these tests needed to be changed
accordingly.

Signed-off-by: Eli Uriegas <eli.uriegas@docker.com>
2017-09-06 11:30:29 -07:00
8574cd6b8a bump version to 17.09.0-ce-rc1
Signed-off-by: Eli Uriegas <eli.uriegas@docker.com>
2017-09-05 17:06:13 -07:00
54ddbdea25 Merge pull request #222 from vieux/fix_inspect
[17.09] Fix integration suite and propagate failures
2017-09-05 16:49:27 -07:00
efd69761fc Fix integration suite and propagate failures
Failures from the integration suite were not propagating to the outter shell
for some reason. Handle the failure with an if exit 1.

Signed-off-by: Daniel Nephin <dnephin@docker.com>
(cherry picked from commit 96707bc600747257e82917ca079fa5006d636b2c)
Signed-off-by: Victor Vieux <victorvieux@gmail.com>
2017-09-05 14:58:05 -07:00
c973c430a9 Merge pull request #220 from vieux/fix_nano_tests
[17.09] backport: force inspect test format
2017-09-05 14:43:58 -07:00
e3e65f6470 force inspect test format
Signed-off-by: Victor Vieux <victorvieux@gmail.com>
(cherry picked from commit 8e6567cb837e1c885de5146517557c7a5d8a5f17)
Signed-off-by: Victor Vieux <victorvieux@gmail.com>
2017-09-05 13:37:34 -07:00
f6c2d4d077 Merge component 'engine' from git@github.com:moby/moby master 2017-09-01 17:28:12 -07:00
adef76604d Merge component 'cli' from git@github.com:docker/cli master 2017-09-01 16:25:12 -07:00
5a2228df09 Merge component 'packaging' from git@github.com:docker/docker-ce-packaging master 2017-09-01 16:10:15 -07:00
0376ee94b9 Merge pull request #49 from seemethere/remove_rpm_changelog
Remove RPM changelog
Upstream-commit: cc3be7f52531077a29c2da0deef5f25a8631f3a1
Component: packaging
2017-09-01 16:03:38 -07:00
80e330e43c Merge pull request #34706 from dnephin/fix-ci-master
Fix lint errors on master
Upstream-commit: 9b4a616e4b3819ef062780b5fd854616be2c22bb
Component: engine
2017-09-01 15:45:32 -07:00
cc688b2215 Remove RPM changelog
We haven't been updating it, seems like a waste to just track releases
through it.

Signed-off-by: Eli Uriegas <eli.uriegas@docker.com>
Upstream-commit: 895abef8259363895fda4587f5a157f588608234
Component: packaging
2017-09-01 15:25:26 -07:00
7ded486a94 Merge pull request #34700 from tklauser/pkg-term-winsize
pkg/term: use IoctlGetWinsize/IoctlSetWinsize from golang.org/x/sys/unix
Upstream-commit: a127269803b9053713cd51d20f4ae00dae19b6d1
Component: engine
2017-09-01 15:58:25 -04:00
7ecd17f5d0 Fix lint errors.
Signed-off-by: Daniel Nephin <dnephin@docker.com>
Upstream-commit: d0dbf8e397afe0365be59f98e5f52bb4d8d3f4e5
Component: engine
2017-09-01 15:12:22 -04:00
ec509204fd Merge pull request #34689 from chchliang/envunitest
add an exception case
Upstream-commit: a301f96df6f951027a0c795e9d72ef657b51c2f9
Component: engine
2017-09-01 10:53:42 -07:00
f7ec4a69b3 add 17.09 changelog
Signed-off-by: Victor Vieux <victorvieux@gmail.com>
2017-09-01 10:32:17 -07:00
8ef302a435 Merge pull request #34625 from dnephin/more-linters
Add interfacer and unconvert linters
Upstream-commit: cb952bf00695b3429476f59c5534a9c604c6f010
Component: engine
2017-09-01 08:46:08 -07:00
d0e9f9bfe2 Merge pull request #34695 from dnephin/fix-rename-integration-test
Remove assertions that were testing CLI behaviour
Upstream-commit: a337aaab08babcd7b5d70d91ad0c3c7ad16a649d
Component: engine
2017-09-01 10:18:43 -04:00
2be7b6733b pkg/term: use IoctlGetWinsize/IoctlSetWinsize from golang.org/x/sys/unix
Use unix.IoctlGetWinsize and unix.IoctlSetWinsize instead of manually
reimplementing them.

Signed-off-by: Tobias Klauser <tklauser@distanz.ch>
Upstream-commit: 32dfc0cb64992aa5e208273658b6e404268c63f4
Component: engine
2017-09-01 14:43:09 +02:00
4e9d201c36 add an exception case and map changge to struct with expect error
Signed-off-by: chchliang <chen.chuanliang@zte.com.cn>

add an exception case and map changge to struct with expect error

Signed-off-by: chchliang <chen.chuanliang@zte.com.cn>
Upstream-commit: 76e9f0d6d45d7464c34223c25337128530b1a0c6
Component: engine
2017-09-01 15:49:56 +08:00
f119dacce1 Merge pull request #485 from seemethere/re_add_test_target
Re-adds test target to the Makefile
Upstream-commit: d861a1c3dd
Component: cli
2017-08-31 17:50:14 -07:00
dfa6a23587 Merge component 'packaging' from git@github.com:docker/docker-ce-packaging master 2017-08-31 17:11:47 -07:00
b508d80e8c Merge pull request #47 from andrewhsu/libudev-dev
added libudev-dev pkg as build requirement
Upstream-commit: 88b7df7cde5e989d9622d009f4e7373ccbcfe828
Component: packaging
2017-08-31 17:10:18 -07:00
0c9cb73cd5 Merge pull request #46 from andrewhsu/rm-wheezy-arm
remove debian-wheezy armv7l dockerfile build env
Upstream-commit: fb9319c2ab914af7033486cb50926401cc97056c
Component: packaging
2017-08-31 16:32:43 -07:00
c57dae8fc6 remove debian-wheezy armv7l dockerfile build env
Because we don't ship it.

Signed-off-by: Andrew Hsu <andrewhsu@docker.com>
Upstream-commit: cbcf1f67165278fc789d3c68b2965a05dbf823c9
Component: packaging
2017-08-31 16:26:00 -07:00
827348367b added libudev-dev pkg as build requirement
For jessie and wheezy flavors of distros. Some dep seems to have changed
from before.

Signed-off-by: Andrew Hsu <andrewhsu@docker.com>
Upstream-commit: be93a43e60b60befd6d6688e0cb8e23bc27c0724
Component: packaging
2017-08-31 16:24:25 -07:00
6742eeff7c Remove assertions that were testing CLI behaviour.
These tests will be moved to docker/cli

Signed-off-by: Daniel Nephin <dnephin@docker.com>
Upstream-commit: 6590ee0dfba45d7eb4ee12f72621b90294925f20
Component: engine
2017-08-31 18:19:17 -04:00
d48b9a840a Merge pull request #489 from dnephin/fix-container-run
Fix crash in container run after pulling an image
Upstream-commit: d817967647
Component: cli
2017-08-31 18:11:26 -04:00
5ed8076112 Merge pull request #484 from ripcurld0/ps_exit_1
When nothing found in stack exit with exit code 1
Upstream-commit: 5a9bf7f359
Component: cli
2017-08-31 17:13:00 -04:00
264557313d Fix crash in containe run after pulling an image.
Signed-off-by: Daniel Nephin <dnephin@docker.com>
Upstream-commit: a0d8d80250
Component: cli
2017-08-31 17:08:02 -04:00
fdee4e99e9 Re-adds test target to the Makefile
The test target existed before, this is to provide a legacy interface to
allow easy testing for downstream Docker CE.

Without this we would need separate Makefiles/Jenkinsfiles for releases
past 17.07. Later on this target could also be used to test both unit
tests and integration tests at the same time.

Signed-off-by: Eli Uriegas <eli.uriegas@docker.com>
Upstream-commit: d53c8de06b
Component: cli
2017-08-31 10:32:00 -07:00
c7214e3099 Merge pull request #34656 from dnephin/move-testenv-to-internal
Move integration-cli/environment to an internal package
Upstream-commit: 184cea5ff710abde25547749e5608b24a255ba09
Component: engine
2017-08-31 08:52:24 -07:00
59d4d30f28 Merge pull request #45 from andrewhsu/rm-f24
remove fedora-24 packaging scripts because it is EOL
Upstream-commit: d88b3626fe6e6eeebac17f6d83d5378490ee997e
Component: packaging
2017-08-30 20:23:22 -07:00
84f9eef358 remove fedora-24 build scripts because it is EOL
Signed-off-by: Andrew Hsu <andrewhsu@docker.com>
Upstream-commit: a84d468adb9c44c12c90e9358b54a5f089ee302f
Component: packaging
2017-08-30 20:07:33 -07:00
08880363bd Merge pull request #29 from thaJeztah/remove-redundant-contrib
remove desktop-integration contrib from .deb
Upstream-commit: 50c7ac954e520fc9270cc765d3c11afb5b261154
Component: packaging
2017-08-30 19:47:50 -07:00
8c93ab2869 Merge component 'packaging' from git@github.com:docker/docker-ce-packaging master 2017-08-30 19:20:19 -07:00
d637802b2c Merge pull request #43 from seemethere/add_ppc64le
Adds ppc64le builds for ubuntu zesty
Upstream-commit: 093ae20dd0124fbcc7756f8452e5c7006743498c
Component: packaging
2017-08-30 17:28:57 -07:00
e7ed69be1f Merge pull request #213 from andrewhsu/v
update version to 17.09.0-dev
2017-08-30 17:21:53 -07:00
cace4119ad Merge pull request #212 from andrewhsu/cl
update changelog for upcoming 17.09.0 release
2017-08-30 17:21:42 -07:00
f7460e2cd7 update version to 17.09.0-dev
Signed-off-by: Andrew Hsu <andrewhsu@docker.com>
2017-08-30 17:09:30 -07:00
bc78d44351 update changelog for upcoming 17.09.0 release
Signed-off-by: Andrew Hsu <andrewhsu@docker.com>
2017-08-30 16:55:01 -07:00
9dabee631f Merge component 'engine' from git@github.com:moby/moby master 2017-08-30 16:44:42 -07:00
5a06fdc713 Merge component 'cli' from git@github.com:docker/cli master 2017-08-30 15:35:48 -07:00
ac255fc662 Merge component 'packaging' from git@github.com:docker/docker-ce-packaging master 2017-08-30 15:29:29 -07:00
384ceb07e9 When nothing found in stack exit with exit code 1
To keep on a consistent behaviour such as in docker-service-ps
if docker-stack-ps didn't find a given stack, the command line
should exit with exit code 1.

Signed-off-by: Boaz Shuster <ripcurld.github@gmail.com>
Upstream-commit: 79f9af2475
Component: cli
2017-08-30 23:25:36 +03:00
117658f23d Adds ppc64le builds for ubuntu zesty
Signed-off-by: Eli Uriegas <eli.uriegas@docker.com>
Upstream-commit: 2eeeff85dcef8bd684425a56dda5ae83b3f5fc58
Component: packaging
2017-08-30 13:07:10 -07:00
cd6cac51ad Merge pull request #32 from tophj-ibm/add-ppc64le-support-xenial
[ppc64le] add deb support for ubuntu-xenial
Upstream-commit: 53b3255dbeea0288fc3c8c02e4ad3cab56d2521e
Component: packaging
2017-08-30 13:05:52 -07:00
8bf4dec055 Merge pull request #475 from AliyunContainerService/start_period
Support start_period for healthcheck in Docker Compose
Upstream-commit: e636a5388c
Component: cli
2017-08-30 14:11:43 -04:00
98aa729835 Merge pull request #34554 from dnephin/use-release-version-of-docker-cli
Pin docker-cli version to the 17.06-ce release version
Upstream-commit: e23965d620e1655f44d47edd8b5e08c2c384fd03
Component: engine
2017-08-30 13:43:39 -04:00
9f71faec7e Refactor test environment
split all non-cli portions into a new internal/test/environment package

Set a test environment on packages instead of creating new ones.

Signed-off-by: Daniel Nephin <dnephin@docker.com>
Upstream-commit: f85ef42ea538911c82821ab6cc0166d492e9a379
Component: engine
2017-08-30 13:13:18 -04:00
511c42a159 Update fixtures/load to use the APIClient
Signed-off-by: Daniel Nephin <dnephin@docker.com>
Upstream-commit: 61e7d0595d0838671570fbaef21f35a4a41faed7
Component: engine
2017-08-30 13:11:06 -04:00
8be8bd8ae1 Merge pull request #477 from dnephin/some-tests-for-container-command
A few tests for container command
Upstream-commit: 8ea02f6f08
Component: cli
2017-08-30 09:38:38 -07:00
73cf62aaae Change the type of interval, timeout and start_period of healthcheck from string to * time.Duration
Signed-off-by: Li Yi <denverdino@gmail.com>
Upstream-commit: e02fcfd34e
Component: cli
2017-08-30 23:39:12 +08:00
17038054a4 Merge pull request #34667 from dnephin/add-container-config-decode-tests
Add container config decode tests
Upstream-commit: e95585f7b0c1ad93dee0fb5cbd8a5c387053f140
Component: engine
2017-08-30 07:25:27 -07:00
de66c38335 Merge pull request #34668 from dnephin/fix-registry-dependencies
Fix bad import graph from opts/opts.go
Upstream-commit: d85e83960b4aa77e8cf59dd1eabac1884359575f
Component: engine
2017-08-29 19:55:23 -04:00
2dd395d190 Merge pull request #34669 from dnephin/cleanup-registry-client-2
Remove command line flag install from registry package
Upstream-commit: 73a5e7b5c75023263e90b830944a45f0723df6a1
Component: engine
2017-08-29 16:54:08 -07:00
44d38eb2ce Merge pull request #482 from dnephin/add-ulimit-to-unsupported
Add ulimits to unsupported compose fields
Upstream-commit: 65202d669a
Component: cli
2017-08-29 19:26:36 -04:00
811eac4392 Reduce complexity in cli/command/container
Add tests for exec and cleanup existing tests.

Signed-off-by: Daniel Nephin <dnephin@docker.com>
Upstream-commit: e7f90b6b38
Component: cli
2017-08-29 19:25:50 -04:00
853b31143d Add ulimits to unsupported compose fields.
Signed-off-by: Daniel Nephin <dnephin@docker.com>
Upstream-commit: bdc8cf364e
Component: cli
2017-08-29 17:05:16 -04:00
f77a5de38d Remove command line flag install from registry package.
Settings flags is the responsibility of the application (cmd/) not a library

Signed-off-by: Daniel Nephin <dnephin@docker.com>
Upstream-commit: 73ec0ff86b06925e63016c0948be3a49cf8915b4
Component: engine
2017-08-29 15:55:09 -04:00
931cac7408 Fix bad import graph from opts/opts.go
Signed-off-by: Daniel Nephin <dnephin@docker.com>
Upstream-commit: b68221c37ee597950364788204546f9c9d0e46a1
Component: engine
2017-08-29 15:32:43 -04:00
897f142771 Add decodeContainerConfig test removed from docker/cli
Signed-off-by: Daniel Nephin <dnephin@docker.com>
Upstream-commit: 06ecc04167622077bf96ab8f8a14fe93a90179a7
Component: engine
2017-08-29 15:14:50 -04:00
79507cd3e5 Add gotestyourself/skip
Signed-off-by: Daniel Nephin <dnephin@docker.com>
Upstream-commit: 385727588ed68dafb7d18906d7b15260b52778e8
Component: engine
2017-08-29 14:35:12 -04:00
a174528496 Merge pull request #480 from dnephin/remove-unnecessary-deps
Remove 5k lines of unnecessary dependencies
Upstream-commit: e6006219ab
Component: cli
2017-08-29 10:37:43 -07:00
4ac950c1d0 Remove unused vendor.
Signed-off-by: Daniel Nephin <dnephin@docker.com>
Upstream-commit: 8edd2dd3df
Component: cli
2017-08-29 13:22:17 -04:00
ee93512169 Remove test for code not in this repo.
Signed-off-by: Daniel Nephin <dnephin@docker.com>
Upstream-commit: dae1b7112c
Component: cli
2017-08-29 13:19:28 -04:00
b55202146c Merge pull request #476 from dnephin/small-cleanup-to-two-formatters
Reduce complexity of image formatter
Upstream-commit: 6780c29d6e
Component: cli
2017-08-29 12:04:43 -04:00
55ca4eff51 Merge pull request #33684 from dnephin/update-service-ps-tests
Update service ps to be an API test
Upstream-commit: 15b8d0420b57776028875dbf89fc6d9dbb0666e2
Component: engine
2017-08-29 09:44:20 +02:00
a4cd4da158 Support start_period for healthcheck in Docker Compose
Signed-off-by: Li Yi <denverdino@gmail.com>
Upstream-commit: 0abdad615f
Component: cli
2017-08-29 11:19:29 +08:00
5fa8a99c76 Merge pull request #34653 from tonistiigi/fix-readbody-test
integration-cli: fix testutil refactor merge conflict
Upstream-commit: 765e543a385bef1174bc73e98b59af1c81b29b45
Component: engine
2017-08-28 15:37:55 -07:00
250005dc95 Merge pull request #207 from vieux/contrib
improve CONTRIBUTING.md
2017-08-28 15:12:46 -07:00
f0c0f969b6 integration-cli: fix testutil refactor merge conflict
Signed-off-by: Tonis Tiigi <tonistiigi@gmail.com>
Upstream-commit: ba6f9e4cc9687dd1ccd1ab304b363ed578c6d908
Component: engine
2017-08-28 10:19:54 -07:00
ef16add9bb Merge pull request #34263 from estesp/chown-flag-add-copy
Add --chown flag to ADD/COPY commands
Upstream-commit: a1183dda578f531ef65766611f9e16a0636e3a17
Component: engine
2017-08-28 09:50:44 -07:00
83dbde2057 Reduce complexity of two formatters
Signed-off-by: Daniel Nephin <dnephin@docker.com>
Upstream-commit: d318c4112b
Component: cli
2017-08-28 12:49:07 -04:00
7ae4b76cda Merge pull request #471 from cyli/surface-autolock
Include whether the managers in the swarm are autolocked as part of `docker info`
Upstream-commit: 7e52344cd2
Component: cli
2017-08-28 17:46:09 +02:00
ae8028a8f8 Merge pull request #34331 from twistlock/plugable_secrets_backend
[WIP] update swarmkit dependecies to support plugable secrets
Upstream-commit: 964ba0eaa83ac44e614c7ca68fbe2d92c5435a8c
Component: engine
2017-08-28 10:31:27 -04:00
36da978ca7 Merge pull request #34468 from Microsoft/jjh/lcowisolation
LCOW: Force Hyper-V Isolation
Upstream-commit: a63a2e84d8613cd6a666cafcd3d521fc0df46706
Component: engine
2017-08-27 13:35:55 -07:00
4a60bb27ab Merge pull request #34615 from dnephin/remove-pkg-testutil-assert
Move ErrorContains to an internal package
Upstream-commit: 6ed5db6243243c8b7ee3ff165f21bda4465124e5
Component: engine
2017-08-26 19:09:27 -07:00
6143a4613a Include whether the managers in the swarm are autolocked as part of docker info.
Signed-off-by: Ying Li <ying.li@docker.com>
Upstream-commit: 3428b78e96
Component: cli
2017-08-25 16:33:46 -07:00
1057cf80e4 Replace service ps cli tests with service inspect API test.
Signed-off-by: Daniel Nephin <dnephin@docker.com>
Upstream-commit: 6cd6d8646a90fa2013416bc8f11bd78d72c4180d
Component: engine
2017-08-25 17:27:41 -04:00
402a69d8fb Cleanup daemon.LoadBusybox() to use the API instead of client
Signed-off-by: Daniel Nephin <dnephin@docker.com>
Upstream-commit: 98a4613017df2b7de045d93e25a376fd00baeb0c
Component: engine
2017-08-25 17:24:25 -04:00
29f6815811 Add gotestyourself to vendor.
Signed-off-by: Daniel Nephin <dnephin@docker.com>
Upstream-commit: 381a1c0a5ac99b6d7ab33a29150878b9a8008e95
Component: engine
2017-08-25 17:24:25 -04:00
67a4f5a5d6 Merge pull request #34613 from dnephin/remove-pkg-testutil-cmd
Remove pkg testutil cmd
Upstream-commit: a5631c75e1349f6d71c53dbabee7f166f770d2b2
Component: engine
2017-08-25 15:09:52 -04:00
de5380dba8 Merge pull request #454 from mstanleyjones/resource-updating-windows
docker update does not work on Windows containers
Upstream-commit: 21b5bbe411
Component: cli
2017-08-25 19:57:12 +02:00
2d72ab2282 docker update does not work on Windows containers
Signed-off-by: Misty Stanley-Jones <misty@docker.com>
Upstream-commit: 047d3c23a7
Component: cli
2017-08-25 10:35:28 -07:00
a1941ae3c8 Merge pull request #34352 from ChenMin46/fix_rename_shared_namespace
Use ID rather than Name to identify a container when sharing namespace
Upstream-commit: 70214f95b25a63234ecdd59a253b09faf4c68fcd
Component: engine
2017-08-25 09:39:58 -07:00
0458d1b8d1 Merge pull request #452 from dnephin/compose-allow-x-fields
Allow extension fields in the v3.4 version of the compose format
Upstream-commit: d83752cdf2
Component: cli
2017-08-25 12:37:47 -04:00
9e09dbbb1a Merge pull request #469 from dnephin/add-testing-doc
Add testing guidelines document
Upstream-commit: cfb228b963
Component: cli
2017-08-25 12:35:16 -04:00
61202c02f5 Merge pull request #34590 from shouze/add-support-of-ChownOpts-to-TarWithOptions
archive: add ChownOpts support to TarWithOptions
Upstream-commit: 475c9926db9228e94b222eaf6e9fe30f0b02582a
Component: engine
2017-08-25 18:21:31 +02:00
687fe21a97 Remove pkg/testutil/cmd
Signed-off-by: Daniel Nephin <dnephin@docker.com>
Upstream-commit: c2c127fa5a23599d698a71ead103b2f676fdf5c4
Component: engine
2017-08-25 12:07:31 -04:00
e8bff97a66 Update tests to use icmd
Signed-off-by: Daniel Nephin <dnephin@docker.com>
Upstream-commit: 92427b3a8146e048c4b85e5ece1530da97d8472d
Component: engine
2017-08-25 12:07:30 -04:00
be2aa448d0 Add gotestyourself to vendor
Signed-off-by: Daniel Nephin <dnephin@docker.com>
Upstream-commit: 0a7ff351b76f369b1cb1bc741e54b0d9018e7410
Component: engine
2017-08-25 12:06:25 -04:00
9cb0439501 Move ErrorContains to an internal package.
Signed-off-by: Daniel Nephin <dnephin@docker.com>
Upstream-commit: e62b2d410cda6ac9166ac8d052fd3fb99a9460bf
Component: engine
2017-08-25 12:04:58 -04:00
8ae7aa2322 Merge pull request #34583 from tklauser/win-event-functions
Use windows event functions from golang.org/x/sys/windows
Upstream-commit: 2cea2f5469871c16564c900c5b27cee102ebff0b
Component: engine
2017-08-25 07:43:03 -07:00
3b7e9c65c0 Merge pull request #367 from kolyshkin/ipcmode
Introduce/document new IPC modes
Upstream-commit: 8ebc03a71f
Component: cli
2017-08-25 09:48:00 +02:00
939356770a Merge pull request #468 from rubensfig/34373-docker-doc
Added docker documentation for Expose
Upstream-commit: 1086e84718
Component: cli
2017-08-25 09:07:16 +02:00
9f8c4fc433 Merge pull request #34614 from dnephin/remove-pkg-testutil-tempfile
Remove pkg testutil tempfile
Upstream-commit: ff6fbe224f8b490b05f8489e5ae3219126d8017b
Component: engine
2017-08-24 15:24:15 -07:00
51ed00caab Merge pull request #34627 from estesp/no-userns-plugin-upgrade-test
Turn off plugin upgrade test when userns on
Upstream-commit: 0f957d2c09af7216d839f267c14db86d9194b5d0
Component: engine
2017-08-24 15:04:44 -07:00
2ca5291236 Merge pull request #34356 from mlaventure/update-containerd
Update containerd to 06b9cb35161009dcb7123345749fef02f7cea8e0
Upstream-commit: 285bc997311b75263bfac9e8ff7c4d60cdeca0bc
Component: engine
2017-08-24 14:25:44 -07:00
ffac489c66 Merge pull request #34626 from kolyshkin/ipcmode-samehost
docker_api_ipcmode_test: add SameHostDaemon req
Upstream-commit: acd2995143023805f890677eef05849211410c4d
Component: engine
2017-08-24 13:01:26 -07:00
01392057b0 Add unconvert linter
Signed-off-by: Daniel Nephin <dnephin@docker.com>
Upstream-commit: 2f5f0af3fdb7e9ee607a0e178dbe2af6e10cccf4
Component: engine
2017-08-24 15:08:31 -04:00
157456237a Add interfacer linter
Signed-off-by: Daniel Nephin <dnephin@docker.com>
Upstream-commit: 709bf8b7bcc67f3ea3a7a39e29af8ae16a38b06f
Component: engine
2017-08-24 15:08:26 -04:00
3104a37598 Add TESTING document.
Signed-off-by: Daniel Nephin <dnephin@docker.com>
Upstream-commit: ffed6f5ff9
Component: cli
2017-08-24 14:45:50 -04:00
7776562662 Use ID rather than Name to identify a container when sharing namespace
Fix: https://github.com/moby/moby/issues/34307

Signed-off-by: Chen Min <chenmin46@huawei.com>
Upstream-commit: b6e5ea8e5757fa89e03ed3e76f1d85c068b3522d
Component: engine
2017-08-25 01:55:50 +08:00
4d6d2b530e Turn off plugin upgrade test when userns on
Until volume plugins can be made aware of the remapped root,
interactions with volumes created by plugin will not work as the file
ownership denies permissions to the userns remapped range.

Docker-DCO-1.1-Signed-off-by: Phil Estes <estesp@linux.vnet.ibm.com>
Upstream-commit: b1ced2af03c5a8009c314bde80b5f2516e0522fd
Component: engine
2017-08-24 10:52:11 -07:00
863e01391b [ppc64le] add deb support for ubuntu-xenial
Adds ubuntu-xenial as a make deb target for ppc64le

Signed-off-by: Christopher Jones <tophj@linux.vnet.ibm.com>
Upstream-commit: e2a3a2f2f157e1a84346c0aad2b87ef2b2a7f0f3
Component: packaging
2017-08-24 13:24:05 -04:00
c2a60a890d Merge pull request #34451 from Microsoft/jjh/bootvhdx
LCOW: Additional flags for VHD boot
Upstream-commit: e5cdaf1bd9c5d7984e491cb346ae1453dbb79f50
Component: engine
2017-08-24 08:38:19 -07:00
80c42a7f96 Merge pull request #33534 from sbko/31410-replace-deprecated-sockrequest
Stop using deprecated SockRequest
Upstream-commit: eb52bb22a4f3b9632545f10c0a3af436aced817d
Component: engine
2017-08-24 11:30:13 -04:00
42d094ea01 docker_api_ipcmode_test: add SameHostDaemon req
This is needed for tests that do some checks and/or create files
on the host system. Inspired by commit d9f3548a9.

Signed-off-by: Kir Kolyshkin <kolyshkin@gmail.com>
Upstream-commit: 8a9878081f8e14a54067f249bc98ae66f0b61ba3
Component: engine
2017-08-24 17:02:21 +03:00
364ecfbfa8 Merge pull request #34611 from estesp/no-hostmode-userns
Host-mode IPC sharing not possible in a userns
Upstream-commit: ff167a285a79339eaeb1772c9ce7a22d33ad0136
Component: engine
2017-08-23 19:52:03 -07:00
7313d24a20 Merge pull request #445 from dnephin/add-end-to-end-suite
Add end to end suite
Upstream-commit: 6c3d93bbb6
Component: cli
2017-08-23 16:16:09 -07:00
1d2c919b02 Added docker documentation for Expose
Signed-off-by: Rubens Figueiredo <r.figueiredo.52@gmail.com>
Upstream-commit: dd95731a21
Component: cli
2017-08-23 16:12:46 -07:00
5d498bba11 Build the docker cli for unreleased platforms
Signed-off-by: Daniel Nephin <dnephin@docker.com>
Upstream-commit: 5ba5e6fff438029195c0df1303481c1e260bc6ec
Component: engine
2017-08-23 17:50:02 -04:00
aacb33bdaf Remove pkg/testutil tempfile and golden
Signed-off-by: Daniel Nephin <dnephin@docker.com>
Upstream-commit: 468154a841b599dd3a7acaf6162e2a73cf44d1f6
Component: engine
2017-08-23 17:26:27 -04:00
b03ce80e95 Update tests to use gotestyourself/fs
Signed-off-by: Daniel Nephin <dnephin@docker.com>
Upstream-commit: 60672382c7eb1f65e063c4bf07b0880559cea91b
Component: engine
2017-08-23 17:25:00 -04:00
332ff8ee6f Add gotestyourself to vendor.
Signed-off-by: Daniel Nephin <dnephin@docker.com>
Upstream-commit: 47962ee32ff785eb179de4a706e557b66e8b1841
Component: engine
2017-08-23 17:13:27 -04:00
e48013ec36 Stop using deprecated SockRequest
Signed-off-by: Stanislav Bondarenko <stanislav.bondarenko@gmail.com>
Upstream-commit: 0fd5a654280ef509a6512f84981f28d559869b90
Component: engine
2017-08-23 17:10:04 -04:00
6fd05602dd improve CONTRIBUTING.md
Signed-off-by: Victor Vieux <victorvieux@gmail.com>
2017-08-23 11:59:10 -07:00
35a83e1585 archive: add ChownOpts support to TarWithOptions
Signed-off-by: Sébastien HOUZÉ <cto@verylastroom.com>
Upstream-commit: 8a34c67a7eca7b8193f1c02fb6641abd719dce01
Component: engine
2017-08-23 20:52:29 +02:00
b9dc5995dc Merge pull request #34597 from cpuguy83/34587_address_nits
Add more detailed logging to aufs init
Upstream-commit: cdf870bd0b5fa678b10ef2708cca7ad776b4913c
Component: engine
2017-08-23 10:48:40 -07:00
95903f50f1 Host-mode IPC sharing not possible in a userns
This test is the API version of a docker_cli_run_test that was already
disabled from userns, but when ported to API didn't retain the same test
requirements. Specifically, a user namespaced process will not have
access to the host namespace's IPC devices and is already documented as
such in the user namespace restrictions docs.

Docker-DCO-1.1-Signed-off-by: Phil Estes <estesp@linux.vnet.ibm.com>
Upstream-commit: d9f3548a936991594095c12b7271ce3387f4025c
Component: engine
2017-08-23 10:37:47 -07:00
eec82cc7b5 Merge pull request #34600 from dnephin/remove-pkg-testutil
Remove pkg/testutil/utils.go
Upstream-commit: 59e1565565071da160a0ad3781335e4f974f93f8
Component: engine
2017-08-23 09:38:20 -07:00
d63b05f093 Merge pull request #466 from albers/completion-remove-stack-ps--all
Remove bash completion for `stack ps --all|-a`
Upstream-commit: f5a192bcc4
Component: cli
2017-08-23 09:57:29 -04:00
881ab6b17f Remove bash completion for stack ps --all|-a
This option was removed in https://github.com/moby/moby/pull/28885.
Bash completion was only updated for `service ps`, though.

See https://github.com/moby/moby/pull/29716 for the corresponding docs
change.

Signed-off-by: Harald Albers <github@albersweb.de>
Upstream-commit: 328f4fbf06
Component: cli
2017-08-23 13:34:23 +02:00
c8bdd05225 Merge pull request #34602 from stevvooe/normalize-normalise
*: normalize the use of normalize
Upstream-commit: 88c0317e23449d6ff730a1073f240586cbdfd4ba
Component: engine
2017-08-23 09:13:08 +02:00
e0c85257a0 Merge pull request #34568 from Microsoft/jjh/singletagstore
Move to a single tag-store
Upstream-commit: 3d22daeb835a74ef886ce28c35f6c391cd6d24ad
Component: engine
2017-08-22 17:50:36 -07:00
e11d0e6967 Merge pull request #440 from ripcurld0/search_format
Add --format to docker-search
Upstream-commit: 05308fcec7
Component: cli
2017-08-22 19:10:53 -04:00
19e250d57c Merge pull request #456 from dnephin/add-tests-for-client
Add unit tests for initializing the client
Upstream-commit: 5e1d0289f4
Component: cli
2017-08-22 16:08:36 -07:00
93c266f248 Add --format to docker-search
Signed-off-by: Jeremy Chambers <jeremy@thehipbot.com>
Signed-off-by: Boaz Shuster <ripcurld.github@gmail.com>
Upstream-commit: 88cc47ad5c
Component: cli
2017-08-23 01:37:54 +03:00
b680839840 *: normalize the use of normalize
Signed-off-by: Stephen J Day <stephen.day@docker.com>
Upstream-commit: ae8dbeaeedce3a9f247f2d58df7459f9d79bde5d
Component: engine
2017-08-22 15:25:31 -07:00
f5c5b5cc38 Remove RunCommandPipelineWithOutput
Signed-off-by: Daniel Nephin <dnephin@docker.com>
Upstream-commit: e885af2a6b6b9f88a8b419d225b1425ec3d9416e
Component: engine
2017-08-22 17:15:26 -04:00
e13afe9c59 Remove RandomTmpDirPath
Signed-off-by: Daniel Nephin <dnephin@docker.com>
Upstream-commit: 9db68f4dea6379b7e85ee5c6f2be080a6fcbe4ca
Component: engine
2017-08-22 17:15:26 -04:00
3177188cce Remove testutil.ParseCgroupPaths
Signed-off-by: Daniel Nephin <dnephin@docker.com>
Upstream-commit: e8bd67181533222c192cca19a4279c85db48875e
Component: engine
2017-08-22 17:15:26 -04:00
931aa8f0e2 Remove ConsumeWithSpeed
Signed-off-by: Daniel Nephin <dnephin@docker.com>
Upstream-commit: 1455086c4b922f09777aa49ec26a98c463be6a49
Component: engine
2017-08-22 17:15:26 -04:00
56e5cffbc1 Remove testutil.ReadBody
Signed-off-by: Daniel Nephin <dnephin@docker.com>
Upstream-commit: 4f304e72a2e4451b043ab1a73a6c44894333c5c7
Component: engine
2017-08-22 17:15:26 -04:00
5e635809d5 Remove ChannelBuffer
Signed-off-by: Daniel Nephin <dnephin@docker.com>
Upstream-commit: 6a0105b452e604866320aad7e2ad291beb7925b9
Component: engine
2017-08-22 17:15:26 -04:00
594cd7054e Remove ListTar
Signed-off-by: Daniel Nephin <dnephin@docker.com>
Upstream-commit: 6ffbe3f6a893a97f534d535538a646d4b79fed03
Component: engine
2017-08-22 17:15:26 -04:00
524d0fa645 Remove testutil.CompareDirectoryEntries and IsKilled
Signed-off-by: Daniel Nephin <dnephin@docker.com>
Upstream-commit: 6151d55ee7301d2b3800d701a9ce4969848e4d6b
Component: engine
2017-08-22 17:15:26 -04:00
b087533ab3 Remove testutil.ConvertSliceOfStringsToMap
Signed-off-by: Daniel Nephin <dnephin@docker.com>
Upstream-commit: d30e51495a7b748d0d5e73e1b8c7edf5c584c4ef
Component: engine
2017-08-22 17:15:26 -04:00
7daf459b1c Remove unused helpers.
Signed-off-by: Daniel Nephin <dnephin@docker.com>
Upstream-commit: a0c9089971b6c3cdc9ac1233f3c5e27a0a723214
Component: engine
2017-08-22 17:15:26 -04:00
561acebc80 Merge pull request #34570 from simonvik/doublealarm
Remove double defined alarm in seccomp list.
Upstream-commit: f291c959ef6294757db92be5e2add774ceda60cc
Component: engine
2017-08-22 12:50:21 -07:00
5380c10ac4 Pin docker-cli version to the 17.06-ce release version
Signed-off-by: Daniel Nephin <dnephin@docker.com>
Upstream-commit: cef786f787dcfd87a50c7d0b7183724ab1242ed8
Component: engine
2017-08-22 14:29:16 -04:00
80226e2163 Add more detailed logging to aufs init
Addresses some comments on 276b44608b04f08bdf46ce7c816b1f744bf24b7d

Signed-off-by: Brian Goff <cpuguy83@gmail.com>
Upstream-commit: 0a98025d4b2910c2089325b87d28c32d05803e13
Component: engine
2017-08-22 14:19:03 -04:00
e12074fbb5 Merge pull request #34587 from cpuguy83/aufs_rm_errors
Fix error removing diff path
Upstream-commit: bbcdc7df34eeb01c2f5741235f26f90749e67a05
Component: engine
2017-08-22 11:02:30 -07:00
b8932dcdf4 Merge pull request #463 from dnephin/remove-pkg-testutil
Remove docker/docker/pkg/testutil
Upstream-commit: 79ecfa876b
Component: cli
2017-08-22 13:53:03 -04:00
f14f410ab3 Rebase --chown function for ADD/COPY
Rebases and completes initial PR for (prior: --user) --chown flag for
ADD/COPY commands in Dockerfile.

Docker-DCO-1.1-Signed-off-by: Phil Estes <estesp@linux.vnet.ibm.com>
Upstream-commit: 19a29f6fcf8354732cface3c656c3a3070230dcb
Component: engine
2017-08-22 13:39:25 -04:00
7a59959943 Merge pull request #347 from Wolphin-project/stdin
support --compose-file - as stdin
Upstream-commit: 0d17ea2577
Component: cli
2017-08-22 13:37:22 -04:00
7b15e791ed Fix error removing diff path
In d42dbdd3d48d0134f8bba7ead92a7067791dffab the code was re-arranged to
better report errors, and ignore non-errors.
In doing so we removed a deferred remove of the AUFS diff path, but did
not replace it with a non-deferred one.

This fixes the issue and makes the code a bit more readable.

Signed-off-by: Brian Goff <cpuguy83@gmail.com>
Upstream-commit: 276b44608b04f08bdf46ce7c816b1f744bf24b7d
Component: engine
2017-08-22 12:51:58 -04:00
cd24988c20 support --compose-file - as stdin
Signed-off-by: Marco Mariani <marco.mariani@alterway.fr>
Upstream-commit: 3a0b967c05
Component: cli
2017-08-22 17:55:59 +02:00
f71ceb67bc Allow extension fields in the v3.4 version of the compose format.
Signed-off-by: Daniel Nephin <dnephin@docker.com>
Upstream-commit: 2a1857e899
Component: cli
2017-08-22 10:42:49 -04:00
ba672661c5 Merge pull request #439 from ripcurld0/fix_image_ls_digest
Show images digests when "{{.Digest}}" is in format
Upstream-commit: 317b735573
Component: cli
2017-08-22 16:17:43 +02:00
01f2e768d7 Use new internal testutil.ErrorContains()
Signed-off-by: Daniel Nephin <dnephin@docker.com>
Upstream-commit: 846a31aa50
Component: cli
2017-08-22 10:14:25 -04:00
b141cbce57 Move internal/test package out of cli.
Signed-off-by: Daniel Nephin <dnephin@docker.com>
Upstream-commit: b3f843afe2
Component: cli
2017-08-22 10:14:25 -04:00
0b20e1c511 Show images digests when "{{.Digest}}" is in format
This patch fixes the following bug:

Running "docker image ls --digests" will add images digests
to the image table. However, when using "format" to display
images digests all of them are "<none>".

Signed-off-by: Boaz Shuster <ripcurld.github@gmail.com>
Upstream-commit: 83112f6343
Component: cli
2017-08-22 16:55:10 +03:00
c49d8409df Merge pull request #34594 from tizhou86/master
Fix typo in docs/api/version-history.md
Upstream-commit: 76a7f05795df38cc5a720fa52d37f4a2bc23b015
Component: engine
2017-08-22 06:19:46 -07:00
243671339d Merge pull request #386 from thaJeztah/fix-image-resolve-detection
Fix image resolve detection
Upstream-commit: 8da1daeefa
Component: cli
2017-08-22 15:05:39 +02:00
fb9a7edb75 Merge pull request #31727 from sascha-andres/31726-le-lion-only
Log payload only [logentries]
Upstream-commit: b3b630655dfe8bcaa35af9ece296189660ed22ae
Component: engine
2017-08-22 14:59:28 +02:00
8fc04bd8d4 Merge pull request #34588 from dnephin/more-linters
Add deadcode and goimports linters
Upstream-commit: 6540d5581473c292ade46ee1b620172441943f4b
Component: engine
2017-08-22 05:12:50 -07:00
7cc406aa10 Merge pull request #34572 from krizalys/hyphenless-bind-mount
Dropped hyphen in bind mount where appropriate
Upstream-commit: 28362f11d73b5b72ff9d7eba27cf9f817ec86ef8
Component: engine
2017-08-22 05:11:46 -07:00
d06d19b543 Fixed typo in docs/api/version-history.md
Signed-off-by: Ti Zhou <tizhou1986@gmail.com>
Upstream-commit: a35bfd0b43b132754c9a06d69802d69bddfd829f
Component: engine
2017-08-22 16:47:08 +08:00
08c57e48ed Update Windows and LCOW to use v1.0.0 runtime-spec
Signed-off-by: Darren Stahl <darst@microsoft.com>
Signed-off-by: Kenfe-Mickael Laventure <mickael.laventure@gmail.com>
Upstream-commit: 7c29103ad9b4e02ecc6cdde01da9c3675a377fc4
Component: engine
2017-08-21 15:19:31 -07:00
94c685a721 Add deadcode linter
Signed-off-by: Daniel Nephin <dnephin@docker.com>
Upstream-commit: 62c1f0ef41e6cd88a8846da1c11976a320ca8b41
Component: engine
2017-08-21 18:18:50 -04:00
6b3b192846 Add goimports to linters.
Signed-off-by: Daniel Nephin <dnephin@docker.com>
Upstream-commit: 372670b5074b077927314cdf46af30f8752e7db0
Component: engine
2017-08-21 18:15:08 -04:00
5305a1cd9e Update containerd to 06b9cb35161009dcb7123345749fef02f7cea8e0
This also update:
 - runc to 3f2f8b84a77f73d38244dd690525642a72156c64
 - runtime-specs to v1.0.0

Signed-off-by: Kenfe-Mickael Laventure <mickael.laventure@gmail.com>
Upstream-commit: 45d85c99139bbd16004bbedb7d5bac6a60264538
Component: engine
2017-08-21 12:04:07 -07:00
34feb17aa0 Merge pull request #460 from krizalys/hyphenless-bind-mount
Dropped hyphen in bind mount where appropriate
Upstream-commit: fa986e8039
Component: cli
2017-08-21 20:29:27 +02:00
4d8217810d Merge pull request #461 from jphuynh/zsh-service-rollback
Add zsh completion for `service rollback`
Upstream-commit: 387cbcebb7
Component: cli
2017-08-21 13:29:01 -04:00
622dcc2576 Merge pull request #462 from albers/completion-service-rollback
Add bash completion for `service rollback`
Upstream-commit: 77faf03727
Component: cli
2017-08-21 10:25:03 -04:00
9724d4044a Add bash completion for service rollback
Signed-off-by: Harald Albers <github@albersweb.de>
Upstream-commit: d1ed800860
Component: cli
2017-08-21 14:50:46 +02:00
4f846a2e15 Use event functions from golang.org/x/sys/windows
Use CreateEvent, OpenEvent (which both map to the respective *EventW
function) and PulseEvent from golang.org/x/sys instead of local copies.

Signed-off-by: Tobias Klauser <tklauser@distanz.ch>
Upstream-commit: e942513ac46656c3f54cd103e990e2b7bd5c2b14
Component: engine
2017-08-21 12:58:09 +02:00
3bf60d04de vendor: re-vendor golang.org/x/sys
Update golang.org/x/sys to 07c182904dbd53199946ba614a412c61d3c548f5 in
order to get the newly added Windows event functions which will be used
in successive commits.

Signed-off-by: Tobias Klauser <tklauser@distanz.ch>
Upstream-commit: df58f40a47ea4ee462eb88d3e695bec93c99a6bb
Component: engine
2017-08-21 12:48:05 +02:00
53a6b2ff69 Add zsh completion for service rollback
Signed-off-by: Jean-Pierre Huynh <jean-pierre.huynh@ounet.fr>
Upstream-commit: 8929c49c3a
Component: cli
2017-08-20 20:37:27 +01:00
1c65c425a3 Merge pull request #34560 from dnephin/remove-some-cli-tests
Remove a couple cli tests, which are now unit tests in docker/cli
Upstream-commit: 361a473121f2cd4e688a3bb71fbeff00aaf674d7
Component: engine
2017-08-19 14:31:05 -07:00
0f9c6d96f0 Merge pull request #34551 from dnephin/use-gometalinter
Use gometalinter for linting
Upstream-commit: 4c8cde597daf3d96f74d3b6c4ff3a23e51f8abd3
Component: engine
2017-08-19 09:40:47 -07:00
3c66acc139 Dropped hyphen in bind mount where appropriate
Signed-off-by: Christophe Vidal <kriss@krizalys.com>
Upstream-commit: dffa5d6df2e51556edfbcebc4695fdbc0bcc1a90
Component: engine
2017-08-19 21:25:07 +07:00
31162a9a25 Dropped hyphen in bind mount where appropriate
Signed-off-by: Christophe Vidal <kriss@krizalys.com>
Upstream-commit: 037029414d
Component: cli
2017-08-19 21:14:48 +07:00
43172bf261 Merge pull request #205 from redpanda/rollback
Add 'docker service rollback' subcommand
Upstream-commit: 3c7ede6a68
Component: cli
2017-08-19 15:56:14 +02:00
bffaf97a87 Remove double defined alarm
Signed-off-by: Simon Vikstrom <pullreq@devsn.se>
Upstream-commit: d7bf5e3b4db05b64d969127f6465f47cf4fe97d0
Component: engine
2017-08-19 09:55:03 +02:00
3153600b5a Move to a single tag-store
Signed-off-by: John Howard <jhoward@microsoft.com>
Upstream-commit: 7b9a8f460bfa55dacca74f2ed0164323811e1196
Component: engine
2017-08-18 17:09:27 -07:00
b47e1bb237 Merge pull request #34539 from fcrisciani/ln-vendoring
Libnetwork vendoring
Upstream-commit: 0e0b8530210729bd7cd7fa87bf583e0c83652651
Component: engine
2017-08-18 14:11:58 -07:00
a82f513c02 Merge pull request #34552 from dnephin/add-integration-validation
Add validation for integration-cli deprecation
Upstream-commit: 2ad59cd901eb651665665bff9c2916ab50d5d4b0
Component: engine
2017-08-18 14:09:21 -07:00
3fa5ba0a1e plugable secret backend - update vendor.conf
Updating swarmkit dependencies.

Add more parameters for the secret driver API.

Signed-off-by: Liron Levin <liron@twistlock.com>
Upstream-commit: 3b8d36d0646137c4315cfa12df0dcd49b584d22a
Component: engine
2017-08-18 21:52:26 +03:00
39c495c1d1 Remove config tests, which are now unit tests in docker/cli
Signed-off-by: Daniel Nephin <dnephin@docker.com>
Upstream-commit: c467a112050d595ca0b48122cd4ce81fcf6cefde
Component: engine
2017-08-18 14:24:52 -04:00
3995851d84 Add a validation for integration-cli deprecation.
Signed-off-by: Daniel Nephin <dnephin@docker.com>
Upstream-commit: 89c0c5feb28c01dfc4e026b98107ca07c8d6c956
Component: engine
2017-08-18 14:24:32 -04:00
de626e10fb Fix golint errors.
Signed-off-by: Daniel Nephin <dnephin@docker.com>
Upstream-commit: 9b47b7b1519c5f2138e2933fb1fc459eb00895c0
Component: engine
2017-08-18 14:23:44 -04:00
63a6b47bce Use gometalinter for linting
Signed-off-by: Daniel Nephin <dnephin@docker.com>
Upstream-commit: d7e2c4ce773b3a54f47e84a5a1ef22eb72c978b5
Component: engine
2017-08-18 14:23:43 -04:00
2e782847eb Add unit tests for initializing the client.
Signed-off-by: Daniel Nephin <dnephin@docker.com>
Upstream-commit: 930f97dd09
Component: cli
2017-08-18 12:49:23 -04:00
3f532263bf Merge pull request #455 from shin-/prevent_invalid_resources
Update schemas to prevent invalid properties in deploy.resources
Upstream-commit: a8a3ffa8ef
Component: cli
2017-08-18 11:42:39 -04:00
8cb69b8ef5 Merge pull request #34405 from Microsoft/jjh/lcowworkdir
LCOW: WORKDIR correct handling
Upstream-commit: 30eb4d8cdc422b023d5f11f29a82ecb73554183b
Component: engine
2017-08-17 21:16:36 -05:00
8de8152c0b Merge pull request #34548 from dnephin/remove-some-cli-tests
Remove a couple cli-only tests from integration-cli
Upstream-commit: 098a7b3d53ae8267ec95e2935316b0e62b483b02
Component: engine
2017-08-18 10:03:45 +09:00
6092fc343f Update schemas to prevent invalid properties in deploy.resources
Signed-off-by: Joffrey F <joffrey@docker.com>
Upstream-commit: 1667073908
Component: cli
2017-08-17 15:58:51 -07:00
0acc3ead17 LCOW: WORKDIR correct handling
Signed-off-by: John Howard <jhoward@microsoft.com>
Upstream-commit: 9fa449064cc499871d49f02b96a7e69c071ce50c
Component: engine
2017-08-17 15:29:17 -07:00
04e18204b0 Merge pull request #449 from dnephin/use-gotestyourself
Remove dependency on (most of) docker/docker/pkg/testutil
Upstream-commit: e57842edb8
Component: cli
2017-08-17 12:37:18 -07:00
dd8d1a11c6 Merge pull request #34407 from dnephin/add-TESTING-doc
[Proposal] Document testing guidelines
Upstream-commit: 867a5999cefccefb3e0fb79ffa22f01dd7c1a5e1
Component: engine
2017-08-17 12:33:43 -07:00
a6a08902d2 Merge pull request #448 from thaJeztah/fix-typo
Fix typo and minor Markdown edits
Upstream-commit: 070d0811e3
Component: cli
2017-08-17 19:59:55 +02:00
379cbb4ffb Merge pull request #34547 from dnephin/add-myself-to-CODEOWNERS
Add myself to CODEOWNERS for integration suite
Upstream-commit: 81cd5e441ad87ae85d5f721f2dfa8c6d8c9141d7
Component: engine
2017-08-17 13:26:33 -04:00
c1824669c3 Add myself to CODEOWNERS for integration suite.
Signed-off-by: Daniel Nephin <dnephin@docker.com>
Upstream-commit: 9b094fc4a3845c1f1c8aed9730421aab096dadc1
Component: engine
2017-08-17 13:03:47 -04:00
dc46befdc9 Remove cli-only tests from integration-cli
Signed-off-by: Daniel Nephin <dnephin@docker.com>
Upstream-commit: 98d8c96885593f8f085bf9607b7d817e23d7164c
Component: engine
2017-08-17 12:32:49 -04:00
7048b7f056 Fix typo and minor Markdown edits
Signed-off-by: Sebastiaan van Stijn <github@gone.nl>
Upstream-commit: 9544b70cb3
Component: cli
2017-08-17 02:29:24 +02:00
ef0d9067ae Merge pull request #447 from thaJeztah/fix-liquid-warning
Fix "liquid" warning on logging plugins page
Upstream-commit: 799de1dae2
Component: cli
2017-08-17 02:27:34 +02:00
0d15a1c160 Fix "liquid" warning on logging plugins page
Noticed this warning in the documentation CI:

    Liquid Warning: Liquid syntax error (line 210): Expected end_of_string but found id in "{{ log stream }}" in engine/extend/plugins_logging.md

Signed-off-by: Sebastiaan van Stijn <github@gone.nl>
Upstream-commit: d30987f85f
Component: cli
2017-08-17 00:56:54 +02:00
e7d8c55034 Merge pull request #446 from krizalys/fix-grammar
Fixed grammar
Upstream-commit: 3e831e4472
Component: cli
2017-08-16 23:20:31 +02:00
cded911aad Add 'docker service rollback' subcommand
Signed-off-by: Jimmy Leger <jimmy.leger@gmail.com>

Implement runRollback to not use runUpdate

Signed-off-by: Jimmy Leger <jimmy.leger@gmail.com>

Add version tag and add flag quiet to suppress progress output

Signed-off-by: Jimmy Leger <jimmy.leger@gmail.com>

Removed flags from warnDetachDefault

Signed-off-by: Jimmy Leger <jimmy.leger@gmail.com>

Used command.Cli interface

Signed-off-by: Jimmy Leger <jimmy.leger@gmail.com>

Add detach flag on rollback command

Signed-off-by: Jimmy Leger <jimmy.leger@gmail.com>

Create a fakeClient for service commands

Signed-off-by: Jimmy Leger <jimmy.leger@gmail.com>

Added unit test for rollback command

Signed-off-by: Jimmy Leger <jimmy.leger@gmail.com>

Used command.Cli interface instead of *command.DockerCli in service commands

Signed-off-by: Jimmy Leger <jimmy.leger@gmail.com>

Revert "Removed flags from warnDetachDefault"

This reverts commit 3e4f601c8a82cc2599a755dc693409bbc47917fc.

Signed-off-by: Jimmy Leger <jimmy.leger@gmail.com>

Fixed test.NewFakeCli instanciation

Signed-off-by: Jimmy Leger <jimmy.leger@gmail.com>

Removed unused receiver

Signed-off-by: Jimmy Leger <jimmy.leger@gmail.com>

Replaced cli by dockerCli

Signed-off-by: Jimmy Leger <jimmy.leger@gmail.com>

Revert "Removed unused receiver"

This reverts commit 604ef7c13df3d019949ca81d992db501114dafce.

Signed-off-by: Jimmy Leger <jimmy.leger@gmail.com>

Fixed last typo

Signed-off-by: Jimmy Leger <jimmy.leger@gmail.com>
Upstream-commit: 11d471d660
Component: cli
2017-08-16 22:18:36 +02:00
5478a26336 Merge pull request #34528 from adshmh/client-should-return-image-not-found-for-404-status
client to return imageNotFound error if API returns 404 status code
Upstream-commit: db73f3daee21a28edbf6991d24a4653adc85f1a2
Component: engine
2017-08-16 13:18:00 -07:00
55bd0229fa Replace pkg/testutil/tempfile with gotestyourself/fs
Signed-off-by: Daniel Nephin <dnephin@docker.com>
Upstream-commit: 15837afa77
Component: cli
2017-08-16 14:23:28 -04:00
34fe016d0d Update volume command tests to use the new golden
Signed-off-by: Daniel Nephin <dnephin@docker.com>
Upstream-commit: 505a0fe45f
Component: cli
2017-08-16 14:23:28 -04:00
a5b8c46809 Update swarm command tests to use the new golden
Signed-off-by: Daniel Nephin <dnephin@docker.com>
Upstream-commit: 3d68aa8416
Component: cli
2017-08-16 14:23:28 -04:00
38bd6cfe47 Update stack and task command tests to new golden
Signed-off-by: Daniel Nephin <dnephin@docker.com>
Upstream-commit: 1dd742eac8
Component: cli
2017-08-16 14:23:28 -04:00
2c6a1a2476 Update service and secret command tests to new golden
Signed-off-by: Daniel Nephin <dnephin@docker.com>
Upstream-commit: 4c62d7288f
Component: cli
2017-08-16 14:23:28 -04:00
79c79c9b8f Update node command tests to the new golden
Also remove some superfluous tests that are now covered by a strict golden.Assert

Signed-off-by: Daniel Nephin <dnephin@docker.com>
Upstream-commit: 0e2bf7420a
Component: cli
2017-08-16 14:23:15 -04:00
c06d7f05e3 Update image command tests to use the new golden
Signed-off-by: Daniel Nephin <dnephin@docker.com>
Upstream-commit: 75f7bfedf8
Component: cli
2017-08-16 14:20:36 -04:00
5a6dec9ec1 Update config and checkpoint commands to use gotestyourself/golden
Signed-off-by: Daniel Nephin <dnephin@docker.com>
Upstream-commit: f9007ad7db
Component: cli
2017-08-16 14:19:00 -04:00
1c8e4b07c7 Merge pull request #34536 from thaJeztah/fix-makefile-warning
Fix make test-unit printing deprecation warning
Upstream-commit: 8bee1e9a3ba0884cf1bb0d7fa069fb3c5722af51
Component: engine
2017-08-16 11:16:04 -07:00
3b7026d84c Add gotestyourself dependency.
Signed-off-by: Daniel Nephin <dnephin@docker.com>
Upstream-commit: 882992c6fc
Component: cli
2017-08-16 14:08:08 -04:00
457a3de5d9 Updated & reformulated kinds of mounts section
Signed-off-by: Christophe Vidal <kriss@krizalys.com>
Upstream-commit: 9c4b9c6f63
Component: cli
2017-08-17 00:51:35 +07:00
2170bca7b5 Libnetwork vendoring
- lock OS thread in overlay driver operation

Signed-off-by: Flavio Crisciani <flavio.crisciani@docker.com>
Upstream-commit: 85706876471400716f2b37ca0a0bbd75128fc412
Component: engine
2017-08-16 09:48:12 -07:00
9156c95e0a Merge pull request #34188 from cpuguy83/32144_api_error_handling
Remove string checking in API error handling
Upstream-commit: 2afb3efaa63537cc152437af3cd7a6743fcb3d8d
Component: engine
2017-08-16 08:53:15 -07:00
847cb8e0df Add a Jenkinsfile
Signed-off-by: Daniel Nephin <dnephin@docker.com>
Upstream-commit: 63d76065bb
Component: cli
2017-08-16 10:46:43 -04:00
66fb82e7e8 Add first e2e test
Signed-off-by: Daniel Nephin <dnephin@docker.com>
Upstream-commit: b5cb5ee446
Component: cli
2017-08-16 10:46:40 -04:00
581aa22bc8 Add scripts for setting up e2e test environment.
Signed-off-by: Daniel Nephin <dnephin@docker.com>
Upstream-commit: 26418a12fb
Component: cli
2017-08-16 10:35:56 -04:00
53ea16fce8 Add gotestyourself dependency.
Signed-off-by: Daniel Nephin <dnephin@docker.com>
Upstream-commit: 85f7ed8cfa
Component: cli
2017-08-16 10:35:56 -04:00
3d5737e04c Fix make test-unit printing deprecation warning
Commit 1fb615599a83f41b449529df24f7e833c727e0ed moved the unit tests out
of `hack/make.sh`, however the Makefile still used the old path, resulting
in a warning being printed when the unit tests were run:

    ---> Making bundle: test-unit (in bundles/17.06.0-dev/test-unit)
    DEPRECATED: use hack/test/unit instead of hack/make.sh test-unit

This patch updates the Makefile to use the new command.

Signed-off-by: Sebastiaan van Stijn <github@gone.nl>
Upstream-commit: c500bb562f6dfd1ae4a77f3a66175089ff8f74e8
Component: engine
2017-08-16 16:02:04 +02:00
8a95291c98 Merge pull request #34485 from thaJeztah/swagger-updates
Various fixes and improvements to the API docs / Swagger specs
Upstream-commit: 3d843e81d0cabe8d341f24f63d71548bc0ffd376
Component: engine
2017-08-16 14:29:06 +02:00
095929f4ed Merge pull request #444 from dnephin/faster-validate-ci
Don't sleep in CI
Upstream-commit: 17adcbdada
Component: cli
2017-08-16 13:45:44 +02:00
ee29bacf1d Create definition for SystemInfo response
The `/info` endpoint was badly documented, missing various
fields and incorrectly describing others.

This patch defines a type for the endpoint, based on the
API types in the source.

Also removing the response example in favor of
per-field examples, as this prevents an incorrectly
formatted response from masking omissions in the
actual type.

Signed-off-by: Sebastiaan van Stijn <github@gone.nl>
Upstream-commit: 18b23067be82054a6384fc5934ecbb0276d1862b
Component: engine
2017-08-16 11:11:29 +02:00
81aceb39fb Remove redundant example for Node
All example values are now documented per field,
so are automatically used to generate responses.

Signed-off-by: Sebastiaan van Stijn <github@gone.nl>
Upstream-commit: 2720cefbb2eaac9f440cd7c1807b4222b18ee0c4
Component: engine
2017-08-16 11:11:19 +02:00
031f55b2f7 Add definition for Swarm inspect response
Also remove inline response examples

Signed-off-by: Sebastiaan van Stijn <github@gone.nl>
Upstream-commit: 5b017ef45d68748b8f4065db137aa55e1ff0e8ab
Component: engine
2017-08-16 11:11:14 +02:00
3a37403bb9 Extract NodeDescription to a separate definition
Signed-off-by: Sebastiaan van Stijn <github@gone.nl>
Upstream-commit: 33e2c994015cbc8f7e86bc1b764e17a7470a17ac
Component: engine
2017-08-16 11:11:09 +02:00
54e785932e Extract EngineDescription to a separate definition
Signed-off-by: Sebastiaan van Stijn <github@gone.nl>
Upstream-commit: 7cb4a97ae195bce55b0a2e54e08b3cd1b4b190af
Component: engine
2017-08-16 11:11:04 +02:00
4645cfda21 Extract Platform to a separate definition
Signed-off-by: Sebastiaan van Stijn <github@gone.nl>
Upstream-commit: a2de2681a65d034ffb231b15b630b5a053608331
Component: engine
2017-08-16 11:10:58 +02:00
d0c8aa84bd Add missing definition for Node.ManagerStatus
The `Node.ManagerStatus`  property was only present in
the example, but not in the definition.

This patch adds definitions for `ManagerStatus`
and `Reachability`, similar to what is used in the
code;
f02a5b50c4/api/types/swarm/node.go (L84-L101)

Signed-off-by: Sebastiaan van Stijn <github@gone.nl>
Upstream-commit: 3f1ad79faf3bfecc19722eb6541bb415024dafe4
Component: engine
2017-08-16 11:10:53 +02:00
9fee66bce7 Add missing definition for Node.Status
The `Node.Status`  property was only present in
the example, but not in the definition.

This patch adds definitions for `NodeStatus`
and `NodeState`, similar to what is used in the
code;

- f02a5b50c4/api/types/swarm/node.go (L77-L82)
- f02a5b50c4/api/types/swarm/node.go (L103-L115)

Signed-off-by: Sebastiaan van Stijn <github@gone.nl>
Upstream-commit: 26b247e706e613af5214e4a89de375128f3368dd
Component: engine
2017-08-16 11:10:47 +02:00
6526a15536 Fix TLSInfo in Node specification
- `TLSInfo` is part of `Node.Description`, but was documented as a
  direct child of `Node`
- `Node.TLSInfo` incorrectly was using the `SwarmSpec` type,
  instead of `TLSInfo`

Signed-off-by: Sebastiaan van Stijn <github@gone.nl>
Upstream-commit: b2de157a41bbd18ca4317792614e8630d73a7102
Component: engine
2017-08-16 11:10:42 +02:00
d3b3ce345c Update incorrect types in Swagger
- `ObjectVersion.Index` is an `uint64` 0fd90c4d5d/api/types/swarm/common.go (L5-L15)
- `ClusterInfo` is nullable in the `/info` output (see ff4f700f74/api/types/swarm/swarm.go (L203))
- `CAConfig.ForceRotate` was missing a type, therefore treated as an `object` in Swagger: ff4f700f74/api/types/swarm/swarm.go (L121)
- `Raft.SnapshotInterval`, `Raft.KeepOldSnapshots`, and `Raft.LogEntriesForSlowFollowers` are an `uint64` not an `int64`
- Various fields in `swarm.Info` are nullable; added `x-nullable`

Signed-off-by: Sebastiaan van Stijn <github@gone.nl>
Upstream-commit: 93e324e2a7b8131414382b6fb38b69f0d09bc30c
Component: engine
2017-08-16 11:10:32 +02:00
da62e48708 Update / add extra description fields to Swagger
Signed-off-by: Sebastiaan van Stijn <github@gone.nl>
Upstream-commit: 934378bee3846b1f0b790d3ee185d161900cb953
Component: engine
2017-08-16 11:10:27 +02:00
d01174e4e5 Add extra example values to definitions
Signed-off-by: Sebastiaan van Stijn <github@gone.nl>
Upstream-commit: fa05a53426da6183199a97071e3d60a6d41a39be
Component: engine
2017-08-16 11:10:22 +02:00
8a9c9ec9a9 Reformat definitions - add some whitespace
Signed-off-by: Sebastiaan van Stijn <github@gone.nl>
Upstream-commit: f720f9cc33e1be12b767f5066511266d87a7673b
Component: engine
2017-08-16 11:10:14 +02:00
12bfda3c10 Merge pull request #34478 from thaJeztah/fix-swagger-todos
Update NetworkConfig definition in Swagger
Upstream-commit: 1454015ce96510fb677ab85bf26610f559a0c613
Component: engine
2017-08-16 11:07:25 +02:00
e89e83b8bc client should return imageNotFound error when API returns 404 status code
Signed-off-by: Arash Deshmeh <adeshmeh@ca.ibm.com>
Upstream-commit: 33d82b78d03f7db4ef743951c6a004ba4fe64637
Component: engine
2017-08-15 17:16:02 -04:00
8ae99115c1 Merge pull request #443 from dnephin/ignore-codecov-upload-fail
Ignore codecov upload failures in CI
Upstream-commit: 35c60bbd9b
Component: cli
2017-08-15 13:05:43 -07:00
30f1b651e2 Remove string checking in API error handling
Use strongly typed errors to set HTTP status codes.
Error interfaces are defined in the api/errors package and errors
returned from controllers are checked against these interfaces.

Errors can be wraeped in a pkg/errors.Causer, as long as somewhere in the
line of causes one of the interfaces is implemented. The special error
interfaces take precedence over Causer, meaning if both Causer and one
of the new error interfaces are implemented, the Causer is not
traversed.

Signed-off-by: Brian Goff <cpuguy83@gmail.com>
Upstream-commit: ebcb7d6b406fe50ea9a237c73004d75884184c33
Component: engine
2017-08-15 16:01:11 -04:00
b4e14f104b Set DISABLE_WARN_OUTSIDE_CONTAINER in the Dockerfile so that we don't spend 10s sleeping in CI
also add time to validate check

Signed-off-by: Daniel Nephin <dnephin@docker.com>
Upstream-commit: 058733969c
Component: cli
2017-08-15 14:34:43 -04:00
750260f43f Ignore codecov upload failures in CI.
Signed-off-by: Daniel Nephin <dnephin@docker.com>
Upstream-commit: 4e09dba068
Component: cli
2017-08-15 14:34:43 -04:00
850fb084cc Merge pull request #430 from dnephin/add-build-target-to-compose
Add network and target to build in v3.4
Upstream-commit: 04659b8802
Component: cli
2017-08-15 19:20:49 +02:00
e3f190dc00 Ignore codecov upload failures in CI.
Signed-off-by: Daniel Nephin <dnephin@docker.com>
Upstream-commit: 6a7dc459dd
Component: cli
2017-08-15 13:17:20 -04:00
13f12ea9ac Merge pull request #34508 from Microsoft/jjh/mergestorageopt
Merge global storage options on create
Upstream-commit: cd902848e913aead3e8242eca8a6ed6c67e589e1
Component: engine
2017-08-15 18:13:13 +02:00
e80c7b1a0c Merge pull request #34504 from fcrisciani/ln-vendoring
Libnetwork vendoring
Upstream-commit: 036314622de7cfc62b5f9a88c849faf17c9bc1d3
Component: engine
2017-08-15 08:06:26 -07:00
7eea9c9616 Merge pull request #34109 from yummypeng/rm-link-when-rm-container
Bugfix: Remove links when remove container
Upstream-commit: b6498340b2baa6596553b2b56b43990a365a7b6a
Component: engine
2017-08-15 09:43:00 -04:00
9522e0432e Merge pull request #33450 from naveed-jamil-tenpearls/pkg/signal/trap
Add test coverage to signal/trap.go
Upstream-commit: 479cc38bb94178d48609def34dfb0eae87a9a815
Component: engine
2017-08-15 00:53:37 -07:00
f6b9be5da8 Update NetworkConfig definition in Swagger
This patch updates the definition of `NetworkConfig` to match the code, and
renames to the definition to `NetworkSettings` (also to match the type in
the code).

Add definitions for:

- `Address`
- `PortMap`
- `PortBinding`
- `EndpointIPAMConfig`

Signed-off-by: Sebastiaan van Stijn <github@gone.nl>
Upstream-commit: b98ceb7121c5513c73d69081737ad824384c5391
Component: engine
2017-08-15 09:39:41 +02:00
fe13f30f0f Merge global storage options on create
Signed-off-by: John Howard <jhoward@microsoft.com>
Upstream-commit: 932ae425e8a8aac86f70c249f3a0304101e83614
Component: engine
2017-08-14 15:47:54 -07:00
a71e5a5cde Merge pull request #34487 from tonistiigi/host-suffix-fix
Fix requests for docker host ending with slash
Upstream-commit: f148337da9afef5ecc06d1719d19a770079929ef
Component: engine
2017-08-14 13:29:02 -07:00
a3ff59d2d3 Merge pull request #354 from dnephin/warn-outside-container
Add a warning when make is run outside of a container
Upstream-commit: 703a7cca2b
Component: cli
2017-08-14 14:10:12 -04:00
1ebf5edb0d Merge component 'engine' from git@github.com:moby/moby master 2017-08-14 16:37:05 +00:00
4233bbe278 Libnetwork vendoring
Signed-off-by: Flavio Crisciani <flavio.crisciani@docker.com>
Upstream-commit: 167564a798365d9924260e721954b7ca43322726
Component: engine
2017-08-14 09:31:23 -07:00
9685380dbb Merge pull request #34492 from AkihiroSuda/fix-integration-cli-on-swarm
Fix `make build-integration-cli-on-swarm`
Upstream-commit: 07227a1227e1cdecdd89060d98bf67d0f49503e6
Component: engine
2017-08-14 12:20:18 -04:00
1cf9480827 Merge component 'cli' from git@github.com:docker/cli master 2017-08-14 16:17:02 +00:00
750199d765 Merge component 'packaging' from git@github.com:docker/docker-ce-packaging master 2017-08-14 16:15:08 +00:00
13c5fe42cf Merge pull request #34419 from keloyang/config.v2.json
security: Chmod config.v2.json to 0600
Upstream-commit: e4c19aa529342e0c8947288cbf9a8cbbf025100a
Component: engine
2017-08-14 08:39:58 -07:00
fbf74e8b6c Merge pull request #34486 from kolyshkin/dm-misc
Misc fixes for devmapper
Upstream-commit: af3a9e33145add7994b3e8ea246fa5e5118a45bd
Component: engine
2017-08-14 17:20:40 +02:00
133a5fd166 Merge pull request #436 from thaJeztah/improve-singular-plural-message
Singularize / pluralize "argument(s)" in error message
Upstream-commit: 3b8cf20a0c
Component: cli
2017-08-14 11:06:25 -04:00
2d6cf733e9 Merge pull request #438 from ripcurld0/history_fix
Print timestamp when --human=true
Upstream-commit: 898f1e2997
Component: cli
2017-08-14 16:02:04 +02:00
2b769b8b71 Merge pull request #34362 from kolyshkin/update-libdevmapper
Dockerfile*: bump devmapper library version
Upstream-commit: 31d8d2253ebb77ef7b341606cbdf0e76835e64db
Component: engine
2017-08-14 09:56:43 -04:00
99367ff683 Merge pull request #34087 from kolyshkin/ipcmode
Implement private and shareable ipc modes
Upstream-commit: bb6fc72cd2bd0f194940c7710d8ed8cf3fb99d21
Component: engine
2017-08-14 15:52:21 +02:00
ded67f686e devmapper autosetup: add check for thin_check
I was able to successfully use device mapper autoconfig feature
(commit 5ef07d79c) but it stopped working after a reboot.

Investigation shown that the dm device was not activated because of
a missing binary, that is not used during initial setup, but every
following time. Here's an error shown when trying to manually activate
the device:

> kir@kd:~/go/src/github.com/docker/docker$ sudo lvchange -a y /dev/docker/thinpool
> /usr/sbin/thin_check: execvp failed: No such file or directory
> Check of pool docker/thinpool failed (status:2). Manual repair required!

Surely, there is no solution to this other than to have a package that
provides the thin_check binary installed beforehand. Due to the fact
the issue revealed itself way later than DM setup was performed, it was
somewhat harder to investigate.

With this in mind, let's check for binary presense before setting up DM,
refusing to proceed if the binary is not there, saving a user from later
frustration.

While at it, eliminate repeated binary checking code. The downside is
that the binary lookup is happening more than once now -- I think the
clarity of code overweights this minor de-optimization.

Signed-off-by: Kir Kolyshkin <kolyshkin@gmail.com>
Upstream-commit: 58a453f3f06c1daf34544da8aa16bb95e8e18010
Component: engine
2017-08-14 13:25:28 +03:00
e79a815f73 Merge pull request #432 from lukahartwig/docs-add-docker-events-examples
Added docker events example with until option to documentation
Upstream-commit: b8d325efd5
Component: cli
2017-08-14 10:57:46 +02:00
5f265aadb9 Merge pull request #349 from jphuynh/shellcheck-scripts
Add scripts folder to shellcheck
Upstream-commit: 53d8886f9c
Component: cli
2017-08-14 10:26:45 +02:00
26d7f26c3b Merge pull request #434 from bryfry/patch-1
Documentation: Make the example match the documentation table
Upstream-commit: 7ceb25f895
Component: cli
2017-08-14 10:25:20 +02:00
c5b1acac69 Merge pull request #390 from thaJeztah/add-test-for-github-special-case
Add test for github.com special handling
Upstream-commit: aaf6939679
Component: cli
2017-08-14 10:24:13 +02:00
1a431d82d1 Test cases for new ipc modes
These test cases cover various arguments for docker create/run --ipc
option, as well as daemon's --default-ipc-mode cli option and
configuration file parameter.

For the description of container IPC modes, see previous commit.

To run these:

	TESTFLAGS='-check.f IpcMode' make test-integration-cli

[v2: simplify TestDaemonEvents(), add default-ipc-mode presense check]
[v3: add TestDaemonIpcModeVSRestart]
[v4: ipcmode test now uses client lib instead of CLI (except for exec)]
[v5: nitpicks in comments]
[v6: add test case for "none"; fix a typo; simplify TestDaemonEvents() more]

Signed-off-by: Kir Kolyshkin <kolyshkin@gmail.com>
Upstream-commit: 9a60e1cc874402d10eb7e45f62cce25bf5c41d30
Component: engine
2017-08-14 11:00:26 +03:00
eca24fb7b0 Implement none, private, and shareable ipc modes
Since the commit d88fe447df0e8 ("Add support for sharing /dev/shm/ and
/dev/mqueue between containers") container's /dev/shm is mounted on the
host first, then bind-mounted inside the container. This is done that
way in order to be able to share this container's IPC namespace
(and the /dev/shm mount point) with another container.

Unfortunately, this functionality breaks container checkpoint/restore
(even if IPC is not shared). Since /dev/shm is an external mount, its
contents is not saved by `criu checkpoint`, and so upon restore any
application that tries to access data under /dev/shm is severily
disappointed (which usually results in a fatal crash).

This commit solves the issue by introducing new IPC modes for containers
(in addition to 'host' and 'container:ID'). The new modes are:

 - 'shareable':	enables sharing this container's IPC with others
		(this used to be the implicit default);

 - 'private':	disables sharing this container's IPC.

In 'private' mode, container's /dev/shm is truly mounted inside the
container, without any bind-mounting from the host, which solves the
issue.

While at it, let's also implement 'none' mode. The motivation, as
eloquently put by Justin Cormack, is:

> I wondered a while back about having a none shm mode, as currently it is
> not possible to have a totally unwriteable container as there is always
> a /dev/shm writeable mount. It is a bit of a niche case (and clearly
> should never be allowed to be daemon default) but it would be trivial to
> add now so maybe we should...

...so here's yet yet another mode:

 - 'none':	no /dev/shm mount inside the container (though it still
		has its own private IPC namespace).

Now, to ultimately solve the abovementioned checkpoint/restore issue, we'd
need to make 'private' the default mode, but unfortunately it breaks the
backward compatibility. So, let's make the default container IPC mode
per-daemon configurable (with the built-in default set to 'shareable'
for now). The default can be changed either via a daemon CLI option
(--default-shm-mode) or a daemon.json configuration file parameter
of the same name.

Note one can only set either 'shareable' or 'private' IPC modes as a
daemon default (i.e. in this context 'host', 'container', or 'none'
do not make much sense).

Some other changes this patch introduces are:

1. A mount for /dev/shm is added to default OCI Linux spec.

2. IpcMode.Valid() is simplified to remove duplicated code that parsed
   'container:ID' form. Note the old version used to check that ID does
   not contain a semicolon -- this is no longer the case (tests are
   modified accordingly). The motivation is we should either do a
   proper check for container ID validity, or don't check it at all
   (since it is checked in other places anyway). I chose the latter.

3. IpcMode.Container() is modified to not return container ID if the
   mode value does not start with "container:", unifying the check to
   be the same as in IpcMode.IsContainer().

3. IPC mode unit tests (runconfig/hostconfig_test.go) are modified
   to add checks for newly added values.

[v2: addressed review at https://github.com/moby/moby/pull/34087#pullrequestreview-51345997]
[v3: addressed review at https://github.com/moby/moby/pull/34087#pullrequestreview-53902833]
[v4: addressed the case of upgrading from older daemon, in this case
     container.HostConfig.IpcMode is unset and this is valid]
[v5: document old and new IpcMode values in api/swagger.yaml]
[v6: add the 'none' mode, changelog entry to docs/api/version-history.md]

Signed-off-by: Kir Kolyshkin <kolyshkin@gmail.com>
Upstream-commit: 7120976d74195a60334c688a061270a4d95f9aeb
Component: engine
2017-08-14 10:50:39 +03:00
94157b8e90 devmapper: refer to dockerd man page
...not the docker one.

Signed-off-by: Kir Kolyshkin <kolyshkin@gmail.com>
Upstream-commit: 8b7bd58869725dce2f0fcfd582d23dc5e0cfcf8e
Component: engine
2017-08-14 10:09:58 +03:00
d92c40217f devmapper autoconfig: add mkdir
I tried using dm.directlvm_device but it ended up with the following
error:

> Error starting daemon: error initializing graphdriver: error
> writing docker thinp autoextend profile: open
> /etc/lvm/profile/docker-thinpool.profile: no such file or directory

The reason is /etc/lvm/profile directory does not exist. I think it is
better to try creating it beforehand.

Signed-off-by: Kir Kolyshkin <kolyshkin@gmail.com>
Upstream-commit: 6ca20ec771ab7c0ebf64c20021ca795746cf3ccb
Component: engine
2017-08-14 10:09:34 +03:00
44e937f3a9 Print timestamp when --human=true
* Setting "--human=true" changes "CreatedSince" format

* "CreatedAt" now displays the creation timestamp as
  specified in the documents

Signed-off-by: Boaz Shuster <ripcurld.github@gmail.com>
Upstream-commit: 5e7f0f67a8
Component: cli
2017-08-12 23:12:47 +03:00
7e214d1c8f Singularize / pluralize "argument(s)" in error message
The validation functions to test for the number of passed arguments did not
pluralize `argument(s)`, and used `argument(s)` in all cases.

This patch adds a simple `pluralize()` helper to improve this.

Before this change, `argument(s)` was used in all cases:

    $ docker container ls foobar
    "docker container ls" accepts no argument(s).

    $ docker network create one two
    "docker network create" requires exactly 1 argument(s).

    $ docker network connect
    "docker network connect" requires exactly 2 argument(s).

    $ docker volume create one two
    "docker volume create" requires at most 1 argument(s).

After this change, `argument(s)` is properly singularized or plurarized:

    $ docker container ls foobar
    "docker container ls" accepts no arguments.

    $ docker network create one two
    "docker network create" requires exactly 1 argument.

    $ docker network connect
    "docker network connect" requires exactly 2 arguments.

    $ docker volume create one two
    "docker volume create" requires at most 1 argument.

Test cases were updated accordingly.

Signed-off-by: Sebastiaan van Stijn <github@gone.nl>
Upstream-commit: b9a7f35e02
Component: cli
2017-08-12 18:25:38 +02:00
bb626a427e Fix make build-integration-cli-on-swarm
Signed-off-by: Akihiro Suda <suda.akihiro@lab.ntt.co.jp>
Upstream-commit: 2fddf9f6efc155c880dfa689bd7df3a5a31ba459
Component: engine
2017-08-12 06:53:25 +00:00
c66aa086ca Make the example match the documentation
the missing `driver` made my bridge not have the correct MTU when i copied from the example and not the doc table.  Brings them into alignment.

Signed-off-by: bryfry <bryon@fryer.io>
Upstream-commit: 6118658f73
Component: cli
2017-08-11 21:47:34 -04:00
417e5624cd Fix requests for docker host ending with slash
Signed-off-by: Tonis Tiigi <tonistiigi@gmail.com>
Upstream-commit: 823e88d4c4298c38130b9a387a45c47cf957a931
Component: engine
2017-08-11 10:47:02 -07:00
0f9d35cd6f Merge pull request #34000 from dnephin/test-integration-api
Introduce `test-integration` target
Upstream-commit: f34e4d295d5c17a78c33beb14b65e5d001c16968
Component: engine
2017-08-11 10:39:27 -07:00
2e5f24be1e Use container.HostConfig.ShmSize directly
It was noted[1] that container's HostConfig.ShmSize, if not set, should be
initialized to daemon default value during container creation.

In fact, it is already done in daemon.adaptContainerSettings, so we can use
value from container.HostConfig directly.

[1] https://github.com/moby/moby/pull/34087#discussion_r128656429

Signed-off-by: Kir Kolyshkin <kolyshkin@gmail.com>
Upstream-commit: 0fb1fb1ce0177cf31dd96e9fdb4a5f55155a5966
Component: engine
2017-08-11 03:29:27 -07:00
5963ab8f5e Merge pull request #34378 from fcrisciani/ln-vendoring
Vendoring libnetwork
Upstream-commit: aaee3ca6c1129f62eaa64a76a3f770ae09d04d09
Component: engine
2017-08-10 17:07:14 -07:00
c020b02684 Merge pull request #34452 from Microsoft/jjh/gowiniov0.4.5
Revendor Microsoft/go-winio @ v0.4.5
Upstream-commit: 45248ae668cd8ab02cf597ab9e9f72564a262f6c
Component: engine
2017-08-10 17:05:36 -07:00
a87bcbcfcf Added docker events example with until option to documentation
Signed-off-by: Luka Hartwig <mail@lukahartwig.de>
Upstream-commit: f959ac7fba
Component: cli
2017-08-11 01:29:48 +02:00
14f2519dda Merge pull request #34470 from thaJeztah/fix-solaris-config
Fix solaris reference to config
Upstream-commit: 2638729c7a57332737e2096d68bed5e1940053d4
Component: engine
2017-08-10 09:41:50 -07:00
848a1fd437 Vendoring libnetwork
Signed-off-by: Flavio Crisciani <flavio.crisciani@docker.com>
Upstream-commit: 709a433ec827b034b798e748d4393f7c9f3b3bc0
Component: engine
2017-08-10 08:51:30 -07:00
c75716b8e7 Merge pull request #33722 from TomSweeneyRedHat/tsweeney/privmessage
Add clarification to --privileged error message
Upstream-commit: 7ccd8bda77fb075b2c5d849f55445d0b4144acc9
Component: engine
2017-08-09 16:08:10 -07:00
479e9126c5 Merge pull request #34430 from AkihiroSuda/promote-overlay2
graphdriver: promote overlay2 over aufs
Upstream-commit: 2e38c07814fbb99364838df2cd1092744f6bd1e1
Component: engine
2017-08-09 21:41:36 +02:00
592e32b2a4 Fix solaris reference to config
Commit db63f9370e26d725357c703cbaf9ab63cc7b6d0a
extracted  daemon configuration to its own
package, but did not update the Solaris stubs.

This updates the Solaris daemon.

Signed-off-by: Sebastiaan van Stijn <github@gone.nl>
Upstream-commit: 335033e25fae0173217e70d4b8dfc5df682ea913
Component: engine
2017-08-09 20:58:31 +02:00
028f9b05af Merge pull request #34445 from pmoust/f-seccomp-quotacl
seccomp: whitelist quotactl with CAP_SYS_ADMIN
Upstream-commit: bbb401de87b21659399909b15707cf2816be0f78
Component: engine
2017-08-09 11:53:13 -07:00
7ab662f5a9 LCOW: Force to be Hyper-V Isolation
Signed-off-by: John Howard <jhoward@microsoft.com>
Upstream-commit: 0ba50819ba83c37c39b5c8ae924a888a7722ac6a
Component: engine
2017-08-09 09:26:51 -07:00
840bc1dc6a seccomp: whitelist quotactl with CAP_SYS_ADMIN
The quotactl syscall is being whitelisted in default seccomp profile,
gated by CAP_SYS_ADMIN.

Signed-off-by: Panagiotis Moustafellos <pmoust@elastic.co>
Upstream-commit: cf6e1c5dfd07f5048606bb7b21464c658e252322
Component: engine
2017-08-09 18:52:15 +03:00
7b76095dc9 Merge pull request #34455 from vieux/hide_swarm_plugins_exp
hide swarm plugins behind experimental flag
Upstream-commit: ab29a85103f2b251094cd0423d84de13cdb930ab
Component: engine
2017-08-09 17:52:14 +02:00
94b4666b88 Revendor Microsoft/go-winio @ v0.4.5
Signed-off-by: John Howard <jhoward@microsoft.com>
Upstream-commit: 779469d9c98b83d54bc45f808de76c2088ffe8c7
Component: engine
2017-08-09 08:31:43 -07:00
48f5d911ea Fix exclude list in make.ps1
Signed-off-by: Daniel Nephin <dnephin@docker.com>
Upstream-commit: e593b72cc9d8a2fd9c7cd98b82ed468dfe3577e2
Component: engine
2017-08-09 11:03:20 -04:00
b63db0a43c move api test client setup to a package.
Signed-off-by: Daniel Nephin <dnephin@docker.com>
Upstream-commit: c66c0447efe9c7e7afdcf75b950897c67894256b
Component: engine
2017-08-09 11:02:57 -04:00
e443662141 Protect images in the integration/ suite
Signed-off-by: Daniel Nephin <dnephin@docker.com>
Upstream-commit: 5fa134b9061d0b794e9e5b887a8ea4ee15fecb61
Component: engine
2017-08-09 11:02:57 -04:00
b4b904d49b Cleanup test output, and binaries.
Signed-off-by: Daniel Nephin <dnephin@docker.com>
Upstream-commit: 4308e881cc00141a1dd187120d1c4e2106148282
Component: engine
2017-08-09 11:02:57 -04:00
b327efdd99 Add integration suite
Signed-off-by: Daniel Nephin <dnephin@docker.com>
Upstream-commit: de46fb736d0e3e41b0f5646b43e0963bcf839baa
Component: engine
2017-08-09 11:02:57 -04:00
9a9d90f97d Remove test-integration-cli and references to it.
Signed-off-by: Daniel Nephin <dnephin@docker.com>
Upstream-commit: bc82b139955c4a0edb20b070926469cceea0fbbb
Component: engine
2017-08-09 11:02:57 -04:00
43db8c0c15 Introduce test-integration target (and deprecate/freeze test-integration-cli)
This adds a new package `integration` where `engine` integration tests
should live. Those integration tests should not depends on any `cli`
components (except from the `dockerd` daemon for now — to actually
start a daemon).

Signed-off-by: Vincent Demeester <vincent@sbr.pm>
Upstream-commit: 6b025a8b665f7b976bb2560488ba07f55dbf0fb6
Component: engine
2017-08-09 11:02:57 -04:00
148a571829 Add network and target to build in v3.4
Signed-off-by: Daniel Nephin <dnephin@docker.com>
Upstream-commit: eef256943b
Component: cli
2017-08-09 10:50:32 -04:00
6079e4e9e5 Merge pull request #34276 from keloyang/testcase-docker-cp-hardlink
Add unit  test  for RebaseArchiveEntries
Upstream-commit: 187cd25517e348230a0b5064392dc9f00efb13ae
Component: engine
2017-08-09 07:29:09 -07:00
5a28415680 Merge pull request #34449 from Microsoft/jjh/hcsshim0.6.3
Revendor Microsoft/hcsshim @V0.6.3
Upstream-commit: 5c49240c94783a3ecb3881890725136d8d743dea
Component: engine
2017-08-09 07:21:49 -07:00
a0733e5702 Merge pull request #34448 from Microsoft/jjh/donotblockexport
LCOW: Don't block export
Upstream-commit: ac87bb3f85d41b21f425c3a4266ab3b567dc9718
Component: engine
2017-08-09 14:17:25 +01:00
58438575bb Merge pull request #34450 from Microsoft/jjh/opengcsclient
Vendor change jhowardmsft/opengcs to Microsoft/opengcs
Upstream-commit: 31582d00ab7adc3532df92f34a84ad28aa278b0f
Component: engine
2017-08-09 14:16:31 +01:00
a58a34bfed Add test coverage to signal/trap.go
Signed-off-by: Naveed Jamil <naveed.jamil@tenpearls.com>
Upstream-commit: bc756061a3be0faf443c4cf82eacdbc1cfffb2f9
Component: engine
2017-08-09 15:13:38 +05:00
9fb953b99c use testify to check error for test unit test of archive package
Signed-off-by: yangshukui <yangshukui@huawei.com>
Upstream-commit: 1f1e8e9c0e1fa4c3d9b016e6746f7ba2755e888f
Component: engine
2017-08-09 10:27:01 +08:00
de9b157e25 hide swarm plugins behind experimental flag
Signed-off-by: Victor Vieux <victorvieux@gmail.com>
Upstream-commit: 493002021094d72d405e1cd5bfa10b8080f67920
Component: engine
2017-08-08 18:33:25 -07:00
7de15bd230 Merge pull request #34441 from vdemeester/move-pkg-templates-away
Move pkg/templates away
Upstream-commit: c7911389e646104180063f069280a8b6cbc47211
Component: engine
2017-08-08 17:54:17 -07:00
df85fb5a80 Vendor Microsoft/opengcs @ v0.3.2
Signed-off-by: John Howard <jhoward@microsoft.com>
Upstream-commit: 5463c582172e04132ecf48fad00cc90c8e233386
Component: engine
2017-08-08 15:43:43 -07:00
b9168879f3 jhoward/opengcs --> Microsoft/opengcs
Signed-off-by: John Howard <jhoward@microsoft.com>
Upstream-commit: ee0587a45d94443271c695a0d407514fd36f7fa4
Component: engine
2017-08-08 14:43:43 -07:00
06000850f0 LCOW: Additional flags for VHD boot
Signed-off-by: John Howard <jhoward@microsoft.com>
Upstream-commit: 71328a7af580050448ba269663e04ff3f67aea72
Component: engine
2017-08-08 14:40:33 -07:00
d433044d76 Revendor Microsoft/hcsshim @V0.6.3
Signed-off-by: John Howard <jhoward@microsoft.com>
Upstream-commit: 3e71acf0fc485cccc9feda57ea53a69377179321
Component: engine
2017-08-08 14:08:03 -07:00
0c001aeeff LCOW: Don't block export
Signed-off-by: John Howard <jhoward@microsoft.com>
Upstream-commit: 5459ef0ecf429ed0293e975abee11bdbbc2a2f14
Component: engine
2017-08-08 12:54:06 -07:00
7d3a435b2f Merge pull request #34442 from vdemeester/move-pkg-listeners-away
Move pkg/listeners away
Upstream-commit: cbbc28341ccc3a4597f1d1ce1259d3fbe1b29a6d
Component: engine
2017-08-08 12:04:18 -07:00
b8d6be0b5a Merge pull request #428 from albers/completion-stack-deploy
Improve bash completion for `stack deploy`
Upstream-commit: 4b61f560b5
Component: cli
2017-08-08 18:19:06 +02:00
6ed8995fb3 Move pkg/templates away
- Remove unused function and variables from the package
- Remove usage of it from `profiles/apparmor` where it wasn't required
- Move the package to `daemon/logger/templates` where it's only used

Signed-off-by: Vincent Demeester <vincent@sbr.pm>
Upstream-commit: 9ef3b535974612b137abae062b7a8a0f7e969871
Component: engine
2017-08-08 18:16:41 +02:00
1b1bfe0449 Move pkg/listeners away
It is only used in `daemon` and should really live there.

Signed-off-by: Vincent Demeester <vincent@sbr.pm>
Upstream-commit: c204fce2ee926417d1dc7d10c043a81b93d2a72b
Component: engine
2017-08-08 18:14:04 +02:00
8ce8f74288 Improve bash completion for stack deploy
This adds completion of stack names, which is very useful when updating
existing stacks.

Signed-off-by: Harald Albers <github@albersweb.de>
Upstream-commit: d2d4dbf5af
Component: cli
2017-08-08 17:56:14 +02:00
763e45c80b Merge pull request #427 from vdemeester/import-templates-from-docker-pkg
Import templates from docker pkg
Upstream-commit: f3c325f390
Component: cli
2017-08-08 11:55:58 -04:00
e6ade3ec40 Re-run vndr on docker/docker to remove pkg/templates
Signed-off-by: Vincent Demeester <vincent@sbr.pm>
Upstream-commit: 680c827075
Component: cli
2017-08-08 17:26:30 +02:00
d19b8b0269 Import docker/docker/pkg/templates to cli
This package will be deprecated/removed from `docker/docker/pkg` and
is mainly used for the cli format options. Let's import it and
maintain here.

Signed-off-by: Vincent Demeester <vincent@sbr.pm>
Upstream-commit: a6800f95fa
Component: cli
2017-08-08 17:26:24 +02:00
67eefe8cfd Merge pull request #34408 from rcjsuen/ignore-case
Update tmLanguage file to not be case sensitive
Upstream-commit: 526fc401458bc516d803201802fe336f368f4b86
Component: engine
2017-08-08 16:13:50 +02:00
308b435aad graphdriver: promote overlay2 over aufs
Signed-off-by: Akihiro Suda <suda.akihiro@lab.ntt.co.jp>
Upstream-commit: fd6ffc2337aedf1019582851fe0cf4f6f33f113a
Component: engine
2017-08-08 10:17:37 +00:00
8dfd81edb2 Merge pull request #33852 from jstarks/win_named_pipes
Windows: named pipe mounts
Upstream-commit: 202cf001dd7e6ca6c171aa52f454cc7b10f865bf
Component: engine
2017-08-07 16:54:05 -07:00
bee0cb9a32 Merge pull request #413 from albers/completion-build--target
Add bash completion for `docker build --target`
Upstream-commit: 227e042ff0
Component: cli
2017-08-07 12:41:03 -07:00
fae0c281b6 Windows: Add named pipe mount support
Current insider builds of Windows have support for mounting individual
named pipe servers from the host to the guest. This allows, for example,
exposing the docker engine's named pipe to a container.

This change allows the user to request such a mount via the normal bind
mount syntax in the CLI:

  docker run -v \\.\pipe\docker_engine:\\.\pipe\docker_engine <args>

Signed-off-by: John Starks <jostarks@microsoft.com>
Upstream-commit: 54354db850664783918a1fc9d208bcfcf47c28e2
Component: engine
2017-08-07 11:34:36 -07:00
38b8a5078a Merge pull request #34386 from tklauser/pkg-term-makeraw-fix
pkg/term: set termios VMIN and VTIME in MakeRaw on Linux
Upstream-commit: 6f1907898f59300921b358b21da1e49a5184d088
Component: engine
2017-08-07 16:34:40 +02:00
f593e24117 Merge pull request #34398 from Microsoft/jjh/libcontainerd
LCOW: Remove hard-coding
Upstream-commit: 537f8c1e8df8e4f4f7754e92866ba308e232f918
Component: engine
2017-08-07 16:31:44 +02:00
fd8ca099c7 Merge pull request #419 from thaJeztah/easier-testing-in-container
Add "build" dir to PATH in dev-container
Upstream-commit: e0f1e4d5d7
Component: cli
2017-08-07 16:25:19 +02:00
d65ac7e37d Merge pull request #378 from riyazdf/contributing-doc
Add Contribution guidelines doc
Upstream-commit: 056739abfe
Component: cli
2017-08-07 13:27:31 +02:00
aac72d07e3 Merge pull request #423 from albers/docs-fix-invalid-plugins
Fix invalid plugin references in docs
Upstream-commit: eb4672c149
Component: cli
2017-08-07 12:53:44 +02:00
a485f769f0 chmod config.v2.json to 0600
Signed-off-by: yangshukui <yangshukui@huawei.com>
Upstream-commit: ae52cea3ab46e1e728606349fb6baa9a8203f3ed
Component: engine
2017-08-07 18:10:08 +08:00
48c6aae018 Fix invalid plugin references in docs
The plugins `tiborvass/sample-volume-plugins` and `tiborvass/no-remove`
do not exist.

Signed-off-by: Harald Albers <github@albersweb.de>
Upstream-commit: 2dca576a4c
Component: cli
2017-08-07 11:15:39 +02:00
f2e64d9bb8 Add unit test for RebaseArchiveEntries
Signed-off-by: yangshukui <yangshukui@huawei.com>
Upstream-commit: 82eb9002e928f06ff694c618887bbc7d61f4b8e0
Component: engine
2017-08-07 16:40:54 +08:00
2d71d40a39 Introduce/document new IPC modes
This builds (and depends) on https://github.com/moby/moby/pull/34087

Version 2:
 - remove --ipc argument validation (it is now done by daemon)
 - add/document 'none' value
 - docs/reference/run.md: add a table with better modes description
 - dockerd(8) typesetting fixes

Version 3:
 - remove ipc mode tests from cli/command/container/opts_test.go

Signed-off-by: Kir Kolyshkin <kolyshkin@gmail.com>
Upstream-commit: 9285db6752
Component: cli
2017-08-05 17:49:53 -07:00
9c9a27667d Update tmLanguage file to not be case sensitive
While convention states that Dockerfile instructions should be
written in uppercase, the engine allows them to be mixed case or in
lowercase. The tmLanguage file should tolerate this and provide
highlighting support even if instructions are not written in
uppercase.

Signed-off-by: Remy Suen <remy.suen@gmail.com>
Upstream-commit: abd39744c6f3ed854500e423f5fabf952165161f
Component: engine
2017-08-05 19:45:54 +09:00
18cbafdfc4 Merge pull request #34396 from Microsoft/jjh/movescratch
LCOW: Move toolsScratchPath to /tmp
Upstream-commit: d4f6db83c21cfc6af54fffb1f13e8acb7199f96a
Component: engine
2017-08-05 11:37:15 +01:00
eb3232efc3 Merge pull request #34399 from Microsoft/jjh/hcsshim0.6.2
Revendor Microsoft/hcsshim @ v0.6.2
Upstream-commit: 80f2c054ca192ed47d9d6e8573e5fff2d75df330
Component: engine
2017-08-05 11:35:11 +01:00
9282435e75 Log payload only [logentries]
If you want to use the advanced query in logentries
logging in json is very useful. If you do not need
the advanced information with
--log-opt line-only=true just logs the payload

Signed-off-by: Sascha Andres <sascha.andres@outlook.com>
Upstream-commit: 6362843e67f21274c3ee5a719d3a6393c5612699
Component: engine
2017-08-05 09:54:21 +02:00
0d587285b1 Add "build" dir to PATH in dev-container
This makes running the client easier inside
the container; allowing to use just `docker`
instead of `build/docker`.

Signed-off-by: Sebastiaan van Stijn <github@gone.nl>
Upstream-commit: 7a0b49df23
Component: cli
2017-08-05 03:24:21 +02:00
0e92654148 Add testing.md
Signed-off-by: Daniel Nephin <dnephin@docker.com>
Upstream-commit: 4db2ea02cf451d2343cf15daad5ad06a74865ef0
Component: engine
2017-08-04 17:36:18 -04:00
65cd1af516 Merge pull request #34371 from Microsoft/jjh/logrustimestamp
logrus use full timestamp
Upstream-commit: cb9128677f29a1e4d7ff2a74efc9cc7bcdf0169b
Component: engine
2017-08-04 07:25:59 -07:00
0858223c3e Merge pull request #34395 from aboch/npe
Fix api server null pointer def on inspect/ls null ipam-driver networks
Upstream-commit: 7e59fbe50eaa5fd952f7a05aa827e2dc738c3794
Component: engine
2017-08-04 02:07:46 +02:00
265dd86bef Merge pull request #34383 from wrfly/patch-1
fix client.Transport verify
Upstream-commit: 7843e40ad5df83671615a61c904930a701896f52
Component: engine
2017-08-03 16:47:41 -07:00
c9e85143b7 Revendor Microsoft/hcsshim @ v0.6.2
Signed-off-by: John Howard <jhoward@microsoft.com>
Upstream-commit: 809fed5fa6c54befe45b90b25c961e2f84674419
Component: engine
2017-08-03 16:29:25 -07:00
cb0fd7f7e8 LCOW: Remove hard-coding
Signed-off-by: John Howard <jhoward@microsoft.com>
Upstream-commit: ffdef6255e9c81d5778864cac4726794d7c1be0d
Component: engine
2017-08-03 16:10:25 -07:00
6183428a5c Merge pull request #34170 from Microsoft/jjh/sandbox
LCOW: Dynamic sandbox management
Upstream-commit: a3ffc42b13063e59dbf7d52a56f8806ac71160eb
Component: engine
2017-08-03 16:07:40 -07:00
3b5cce5785 LCOW: Move toolsScratchPath to /tmp
Signed-off-by: John Howard <jhoward@microsoft.com>
Upstream-commit: 993f4072874ee5cdce93ec9b6525e1fa3ebda4c8
Component: engine
2017-08-03 15:48:53 -07:00
39189fe164 Fix api server null pointer def on inspect/ls null ipam-driver networks
- When a network is created with the null ipam driver, docker api server
  thread will deference a nil pointer on `docker network ls` and on
  `docker network inspect <nw>`. This because buildIpamResource()
  assumes a gateway address is always present, which is not correct.

Signed-off-by: Alessandro Boch <aboch@tetrationanalytics.com>
Upstream-commit: beebfc0cf6240c8af511eb4d7e29314c8de6ddf2
Component: engine
2017-08-03 13:35:58 -07:00
6611cd0751 Merge pull request #415 from jlhawn/client_dial_enable_tcp_keepalive
Enable TCP Keep-Alive in Docker client
Upstream-commit: f7b78dc137
Component: cli
2017-08-03 19:42:57 +02:00
814542744c Preserve resolved image-digest if QueryRegistry == false
When re-deploying a stack without re-resolving the image digest,
the service's ContainerSpec was updated with the image-reference
as specified in the stack/compose file.

As a result, the image-digest that was resolved in a previous
deploy was overwritten, causing the service to be re-deployed.

This patch preserves the previously resolve image-digest
by copying it from the current service spec.

A unit test is also added to verify that the image information
in the service spec is not updated if QueryRegistry is disabled.

Signed-off-by: Sebastiaan van Stijn <github@gone.nl>
Upstream-commit: d0bea64185
Component: cli
2017-08-03 18:49:07 +02:00
1b5797d860 LCOW: Graphdriver dynamic sandbox management
Signed-off-by: John Howard <jhoward@microsoft.com>

This changes the graphdriver to perform dynamic sandbox management.
Previously, as a temporary 'hack', the service VM had a prebuilt
sandbox in it. With this change, management is under the control
of the client (docker) and executes a mkfs.ext4 on it. This enables
sandboxes of non-default sizes too (a TODO previously in the code).

It also addresses https://github.com/moby/moby/pull/33969#discussion_r127287887

Requires:
- go-winio: v0.4.3
- opengcs:  v0.0.12
- hcsshim:  v0.6.x
Upstream-commit: 8c279ef3ad8cd1f019789b8378d0394c80a1807f
Component: engine
2017-08-03 09:06:45 -07:00
42c8c64090 Revendor jhowardmsft/opengcs @ v0.0.12
Signed-off-by: John Howard <jhoward@microsoft.com>
Upstream-commit: 0bd1cf25175c19e7fffc70b31cd7565bc432df19
Component: engine
2017-08-03 09:06:45 -07:00
296e1bef94 Revendor microsoft/go-winio @ v0.4.4
Signed-off-by: John Howard <jhoward@microsoft.com>
Upstream-commit: 45e2dd123bd9ace93d3fa85b12fcea3a8ac642ce
Component: engine
2017-08-03 09:06:26 -07:00
bf8164c7d6 Add test for github.com special handling
Signed-off-by: Sebastiaan van Stijn <github@gone.nl>
Upstream-commit: f007d623a8
Component: cli
2017-08-03 17:53:42 +02:00
9d3d3a9756 Merge pull request #411 from mstanleyjones/add-infinit
Add Infinit plugin
Upstream-commit: 7e2b0708a4
Component: cli
2017-08-03 17:34:07 +02:00
fd944ce735 pkg/term: set termios VMIN and VTIME in MakeRaw on Linux
The BSD and Solaris versions of term.MakeRaw already set VMIN and VTIME
explicitly such that a read returns when one character is available.
cfmakeraw (which was previously used) in glibc also sets these values
explicitly, so it should be done in the Linux version of MakeRaw as well
to be consistent.

Signed-off-by: Tobias Klauser <tklauser@distanz.ch>
Upstream-commit: 8a3730d251f844a55244d42c2dae0af8904e07c1
Component: engine
2017-08-03 13:21:42 +02:00
a66a5d1d6a fix client.Transport
`client.Transport` is `http.Client.Transport` just has `RoundTripper()`. Not `http.Transport`. So we cannot convert it here.

For a mock test, I can play with this https://play.golang.org/p/gs7_QrL9-Y

Signed-off-by: wrfly <mr.wrfly@gmail.com>
Upstream-commit: e345cd12f96b3985257652b606c8463a5772944b
Component: engine
2017-08-03 17:14:26 +08:00
69cc3cbb90 Merge pull request #34346 from yuexiao-wang/remove-logrus
Remove the logrus from pkg/signal
Upstream-commit: 316b4ba9c2891b9ab4437f1c6a52df2d3d0ca47b
Component: engine
2017-08-03 13:14:05 +09:00
95188b7b7d Merge pull request #34374 from cpuguy83/make_plugindir_private
Make plugins dir private.
Upstream-commit: ee9d6006e4da84723b352d55e2b3ce268c7c75c7
Component: engine
2017-08-02 17:53:17 -07:00
37d6377fa6 Enable TCP Keep-Alive in Docker client
Some network environments may have NATs, proxies, or gateways which
kill idle connections. There are many Docker API operations which may
be idle for long periods of time (such as ContainerWait and ContainerAttach)
and may result in unexpected connection closures or hangs if TCP keepalives
are not used.

This patch updates the default HTTP transport used by the Docker client
package to enable TCP Keep-Alive with a keep-alive interval of 30 seconds.
It also sets a connect timeout of 30 seconds.

Docker-DCO-1.1-Signed-off-by: Josh Hawn <josh.hawn@docker.com> (github: jlhawn)
Upstream-commit: 2831a04cba
Component: cli
2017-08-02 14:35:03 -07:00
60257585de Make plugins dir private.
This prevents mounts in the plugins dir from leaking into other
namespaces which can prevent removal (`device or resource busy`),
particularly on older kernels.

Signed-off-by: Brian Goff <cpuguy83@gmail.com>
Upstream-commit: 0c2821d6f2de692d105e50a399daa65169697cca
Component: engine
2017-08-02 16:58:07 -04:00
8f436ab301 logrus use full timestamp
Signed-off-by: John Howard <jhoward@microsoft.com>
Upstream-commit: af64e396cadb90e5177d0601b4869ba98e17c0d7
Component: engine
2017-08-02 10:30:30 -07:00
13565d88c2 Merge pull request #334 from albers/completion--storage-opt-dm.libdm_log_level
Add bash completion for `--storage-opt dm.libdm_log_level`
Upstream-commit: 68c27d7347
Component: cli
2017-08-02 18:18:02 +02:00
9f8f247e20 Merge pull request #395 from albers/completion-service-ps-multiple
bash completion for `service ps` supports multiple services
Upstream-commit: c4d705fa7f
Component: cli
2017-08-02 18:16:02 +02:00
fe03ca4a16 Merge pull request #384 from albers/completion-redirections
Add support for redirections in bash completion for `docker save|load`
Upstream-commit: 41a9507250
Component: cli
2017-08-02 18:15:24 +02:00
89bd931ee6 Merge pull request #34360 from FengtuWang/arm64_testcase
fix TestLogsFollowGoroutinesWithStdout in arm64
Upstream-commit: f577caff19d486d8d01443507d891cb1b0891cdc
Component: engine
2017-08-02 16:56:20 +02:00
93670daa92 Add bash completion for docker build --target
`--file` and `PATH` are honored if the are specified before `--target`.
Note that according to the command's syntax, PATH should be specified
after the options.

Signed-off-by: Harald Albers <github@albersweb.de>
Upstream-commit: 647166b3bf
Component: cli
2017-08-02 16:49:01 +02:00
688ebf06fb Remove the logrus from pkg/signal
Signed-off-by: yuexiao-wang <wang.yuexiao@zte.com.cn>
Upstream-commit: cc4da8112814cdbb00dbf23370f9ed764383de1f
Component: engine
2017-08-02 18:15:25 +08:00
a8778a8f6e Merge pull request #405 from beenanner/patch-1
Fix missing missing backtick in documentation for node ls
Upstream-commit: b0cc841631
Component: cli
2017-08-02 08:58:53 +02:00
3366bf6a8a Dockerfile*: bump devmapper library version
Let's use latest lvm2 sources to compile the libdevmapper library.

Initial reason for compiling devmapper lib from sources was a need to
have the static version of the library at hand, in order to build
the static dockerd, but note that the same headers/solib are used
for dynamic build (dynbinary) as well.

The reason for this patch is to enable the deferral removal feature.
The supplied devmapper library (and headers) are too old, lacking the
needed functions, so the daemon is built with 'libdm_no_deferred_remove'
build tag (see the check in hack/make.sh). Because of this, even if the
kernel dm driver is perfectly able to support the feature, it can not
be used. For more details and background story, see [1].

Surely, one can't just change the version number. While at it:
 - improve the comments;
 - remove obsoleted URLs;
 - remove s390 and ppc configure updates that are no longer needed;
 - use pkg-config instead of hardcoding the flags (newer lib added
   some more dependencies);

 [1] https://github.com/moby/moby/issues/34298

Signed-off-by: Kir Kolyshkin <kolyshkin@gmail.com>
Upstream-commit: c4fde49a5c0198890078e4c5f7566b387884fe0f
Component: engine
2017-08-01 22:08:24 -07:00
37dd8712ef fix TestLogsFollowGoroutinesWithStdout in arm64
Test case TestLogsFollowGoroutinesWithStdout failed in
arm64 because gopkg.in/fsnotify.v1 does not support
arm64 until version v1.3.0. Update fsnotify to latest
version v1.4.2 to support arm64.

see issue https://github.com/fsnotify/fsnotify/issues/112

Signed-off-by: Fengtu Wang <wangfengtu@huawei.com>
Upstream-commit: 6e590d3b99f9f225feecaabbd035089de67ecd2a
Component: engine
2017-08-02 10:08:00 +08:00
9762198ec1 Merge pull request #34272 from dmcgowan/update-logrus
Update logrus to v1.0.1 (Sirupsen -> sirupsen)
Upstream-commit: 8af4db6f002ac907b6ef8610b237879dfcaa5b7a
Component: engine
2017-08-01 18:53:33 -07:00
2a797862f7 Fix missing missing backtick
Signed-off-by: Jonathan Lee <jonjohn1232009@gmail.com>
Upstream-commit: 9e4ad4889e
Component: cli
2017-08-01 20:45:43 -04:00
593d56a228 Add Infinit plugin
Signed-off-by: Misty Stanley-Jones <misty@docker.com>
Upstream-commit: 83e8551876
Component: cli
2017-08-01 15:50:42 -07:00
7c57a40cf0 Merge pull request #382 from albers/completion-service-scale--detach
Add bash completion for `service scale --detach`
Upstream-commit: a74e2135e4
Component: cli
2017-08-02 00:49:18 +02:00
d7c8e49652 Merge pull request #389 from jphuynh/zsh-scale-detach
Add zsh completion for `docker service scale --detach=false`
Upstream-commit: dabfec6dde
Component: cli
2017-08-02 00:48:37 +02:00
197321de78 Merge pull request #383 from albers/improve-completion-secret-create
Add file completion to bash completion for `secret create`
Upstream-commit: 2ae9276995
Component: cli
2017-08-02 00:45:24 +02:00
ef1dcf60fa Merge pull request #360 from akalipetis/compose-update-order
Add support for update order in compose deployments
Upstream-commit: 1cd402b192
Component: cli
2017-08-01 22:24:48 +02:00
1ee9153d20 Merge pull request #404 from thaJeztah/fix-port-presentation
Fix presentation of published "random" host ports
Upstream-commit: 772956b263
Component: cli
2017-08-01 21:31:46 +02:00
8bb0430472 Merge pull request #381 from albers/completion-login-fix-sort-order
Fix sort order of options in bash completion
Upstream-commit: fd6523e21f
Component: cli
2017-08-01 21:26:46 +02:00
070da803ab Fix presentation of published "random" host ports
Ports that were picked from the ephemeral port range
were presented as `*:0->80/tcp`.

This patch changes the presentation to use the
actually assigned port, instead of the port specified
in `Endpoint.Spec` (which is always empty/zero (`0`))

Before this change;

    ID                  NAME                MODE                REPLICAS            IMAGE               PORTS
    5d44i665qj66        with-random-port    replicated          1/1                 nginx:alpine        *:0->80/tcp

After this change;

    ID                  NAME                MODE                REPLICAS            IMAGE               PORTS
    5d44i665qj66        with-random-port    replicated          1/1                 nginx:alpine        *:30000->80/tcp

Signed-off-by: Sebastiaan van Stijn <github@gone.nl>
Upstream-commit: ceb18a841a
Component: cli
2017-08-01 19:21:17 +02:00
f8eacc69ac Merge pull request #33704 from ecnerwala/33701-shallow-clone
Fix shallow git clone in docker-build
Upstream-commit: f7d09a0a9bd626782e63e7295ca87690f26a1fb4
Component: engine
2017-08-01 10:17:08 -07:00
34b5250ea2 Merge pull request #34345 from kolyshkin/dm-nitpicks
graphdriver/devmapper nitpicks
Upstream-commit: a9aa95ce133fe270db93cee4e59a23ca5a4d3558
Component: engine
2017-08-01 08:13:23 -07:00
4310c5e46a Merge pull request #403 from Zebrilee/fix-issue-159
update service create and update options in commandline documentation
Upstream-commit: c6e497d15c
Component: cli
2017-08-01 14:08:29 +02:00
76e753b00b Merge pull request #34287 from thaJeztah/bump-api-version
Bump API version to 1.32
Upstream-commit: 1a0fbc4a6facd35ca93e4eded902e73d0d4b8378
Component: engine
2017-08-01 12:18:26 +02:00
0ad54be8c9 Merge pull request #34340 from Microsoft/jjh/enableapiimagessaveandload
Windows: Enable TestAPIImagesSaveAndLoad
Upstream-commit: 17859c5e9884c349ad62de0177490d3a4305fd5e
Component: engine
2017-08-01 12:00:49 +02:00
1183f66b5b Merge pull request #34202 from thaJeztah/swagger-external-secrets-store
Add API documentation for plugable secret backends
Upstream-commit: 0fd90c4d5d8ab739d6f999a36d9c4096e89c8059
Component: engine
2017-08-01 10:59:08 +02:00
b6625098a8 Merge pull request #388 from christopherobin/feature/stopsignal
Add support for stop-signal in stack command
Upstream-commit: f386d476ba
Component: cli
2017-08-01 09:53:13 +02:00
13250b8fde pkg/devicemapper: comment nitpicks
1. devmapper_wrapper_{,no_}deferred_remove.go:
Comments about LibraryDeferredRemovalSupport were very totally
misleading to me. This thing has nothing to do with either static
or dynamic linking (but with build tags). Fix the comment accordingly.

2. devmapper.go:
Reveal the source of those magic device* constants.

Signed-off-by: Kir Kolyshkin <kolyshkin@gmail.com>
Upstream-commit: adce3ca48e306a6117ce5677b8d9437551e98a26
Component: engine
2017-07-31 20:05:26 -07:00
970fea45e3 graphdriver/devmapper: clarify a message
Make sure user understands this is about the in-kernel driver
(not the dockerd driver or smth).

While at it, amend the comment as well.

Signed-off-by: Kir Kolyshkin <kolyshkin@gmail.com>
Upstream-commit: aab2450e25b397d38cdcb5e173ef1121283196c2
Component: engine
2017-07-31 20:01:02 -07:00
da919a5e5c Windows: Enable TestAPIImagesSaveAndLoad
Signed-off-by: John Howard <jhoward@microsoft.com>
Upstream-commit: 4dd9c9448c436f13b4c77453c50133014e4433b2
Component: engine
2017-07-31 18:18:49 -07:00
a179e7a813 Merge pull request #34302 from abhinandanpb/predefinednet
Changing the get network request to return swarm scope predefined net…
Upstream-commit: 3364e7da3fd9e2bc3e5d983e98413ddd7c48a89e
Component: engine
2017-07-31 17:08:04 -07:00
97a283fbdb update service create and update options in commandline documentation
Signed-off-by: zebrilee <zebrilee@gmail.com>
Upstream-commit: 5fe09164f5
Component: cli
2017-07-31 23:26:02 +02:00
ed4f0879cf Update imports for logrus version
Add forks for changes which only make logrus change without functional
change.

Signed-off-by: Derek McGowan <derek@mcgstyle.net>
Upstream-commit: 4f3616fb1c112e206b88cb7a9922bf49067a7756
Component: engine
2017-07-31 13:19:38 -07:00
d659edcaf5 Update logrus to v1.0.1
Fixes case sensitivity issue

Signed-off-by: Derek McGowan <derek@mcgstyle.net>
Upstream-commit: 1009e6a40b295187e038b67e184e9c0384d95538
Component: engine
2017-07-31 13:16:46 -07:00
27851173aa Changing the get network request to return swarm scope predefined networks
Starting 17.06 swarm service create supports service creates with predefined
networks like host and bridge. Due to the nature of the feature, swarm manager
has a swarm scope predefined networks in addition to local scoped
predefined networks on all nodes. However network inspects for swarm scoped
predefined networks was not possible. The fix adds support for network inspect
for swarm scoped predefined networks.

Signed-off-by: Abhinandan Prativadi <abhi@docker.com>
Upstream-commit: 5bfefb2d3662fa066ddf0d0e10cac93ee70f7ae8
Component: engine
2017-07-31 13:05:30 -07:00
d027c213aa Merge pull request #34304 from tiborvass/use-buildkit-session
Use buildkit session package
Upstream-commit: 1375d893e9fb2213df8dbb4d375a220e9b009025
Component: engine
2017-07-31 11:16:27 -07:00
db556c6449 Merge pull request #399 from Zebrilee/fix-issue-253
modify foo by container in order to clarify the documentation
Upstream-commit: f47d9803fd
Component: cli
2017-07-31 10:40:08 -07:00
e5e20b8245 Merge pull request #34296 from mixja/34292-awslogs-driver-repeating-last-event
Fix awslogs driver repeating last event - #34292
Upstream-commit: 63e4aa3f1b7e13a8b9f0e4922f32411ea102c348
Component: engine
2017-07-31 08:54:52 -07:00
0cd419f615 Merge pull request #34173 from tonistiigi/builder-report-2017-07-17
Add builder dev report for 2017-07-17
Upstream-commit: 337b40c155fdb17f675175c26c6c5b4304f14b56
Component: engine
2017-07-31 15:51:59 +02:00
1d81f6e49d Merge pull request #34250 from thaJeztah/update-plugin-api-docs
Update API plugin response examples
Upstream-commit: 6a7489476abc3913ebe33043e9056798a4c1fcd8
Component: engine
2017-07-31 10:51:18 +01:00
540600c393 Merge pull request #393 from thaJeztah/add-missing-is-task-filter
Docs: update filter options for docker container ps
Upstream-commit: 7ac1db2f8f
Component: cli
2017-07-31 09:51:13 +01:00
6a5e550002 Merge pull request #34308 from dlsniper/remove-unused-import
Remove unused import
Upstream-commit: 1df67a5c360c667f5987a1cbf6246657312b6422
Component: engine
2017-07-31 17:28:03 +09:00
101d1a1f66 Remove unused import
This commit removes an unused import.

Signed-off-by: Florin Patan <florinpatan@gmail.com>
Upstream-commit: 52d471684350c31578f67c6b120106aefd619381
Component: engine
2017-07-29 22:21:53 +01:00
05235298ea modify foo by container in order to clarify the documentation
Signed-off-by: zebrilee <zebrilee@gmail.com>
Upstream-commit: 2d5f9d83e7
Component: cli
2017-07-29 20:44:50 +02:00
9b125d1f9f Merge pull request #34103 from fcrisciani/control-plane-mtu
Control plane mtu
Upstream-commit: 115f5781c6aceb4e0ed1c6cbf05301c1aee0ee4a
Component: engine
2017-07-28 16:42:18 -07:00
e49d00a362 vendor github.com/moby/buildkit/session
Signed-off-by: Tibor Vass <tibor@docker.com>
Upstream-commit: 5898a364639eab476441dfd2b135beb1e5e331cd
Component: engine
2017-07-28 16:34:24 -07:00
7deeee36b6 Remove client/session package, depend on buildkit's session package
gofmt -w -r '"github.com/docker/docker/client/session" -> "github.com/moby/buildkit/session"'
gofmt -w -r '"github.com/docker/docker/client/session/filesync" -> "github.com/moby/buildkit/session/filesync"'

Signed-off-by: Tibor Vass <tibor@docker.com>
Upstream-commit: 41445a4745451b99d1c361c6c87447da790cb01b
Component: engine
2017-07-28 16:34:23 -07:00
899426a762 Merge pull request #138 from vieux/update_version1
update version
2017-07-28 14:30:22 -07:00
e492adb145 Merge pull request #34294 from AkihiroSuda/improve-it-on-swarm
integration-cli-on-swarm: print detailed error
Upstream-commit: b6d164e6c46d8115b146e4c3ac93784e9ef8b49e
Component: engine
2017-07-28 16:52:40 -04:00
c202b3f97f Allow to set the control plane MTU
Add daemon config to allow the user to specify the MTU of the control plane network.
The first user of this new parameter is actually libnetwork that can seed the
gossip with the proper MTU value allowing to pack multiple messages per UDP packet sent.
If the value is not specified or is lower than 1500 the logic will set it to the default.

Signed-off-by: Flavio Crisciani <flavio.crisciani@docker.com>
Upstream-commit: f9f25ca5e44c89d7c1ebdfa9865076eb2cde9bb2
Component: engine
2017-07-28 13:52:03 -07:00
2dcbbd9e01 Libnetwork vendoring
Signed-off-by: Flavio Crisciani <flavio.crisciani@docker.com>
Upstream-commit: 68d8198ed07acde9146a3e8e2021bd9d57250d81
Component: engine
2017-07-28 13:51:54 -07:00
7fbda78591 Support the "order" key in "update_config" for compose
Signed-off-by: Antonis Kalipetis <akalipetis@gmail.com>
Upstream-commit: 2950667f07
Component: cli
2017-07-28 22:50:55 +03:00
74a1718a1b Merge pull request #396 from kolyshkin/fix-repo-ref
Fix repo references in docs
Upstream-commit: 286216dbc3
Component: cli
2017-07-28 19:37:10 +01:00
3a677ada11 Add Contribution guidelines
Signed-off-by: Riyaz Faizullabhoy <riyaz.faizullabhoy@docker.com>
Upstream-commit: fedbc5861b
Component: cli
2017-07-28 11:33:19 -07:00
c16c5f3db8 Fix repo references in docs
Since CLI was moved to a separate repo, these references are incorrect.
Fixed with the help of sed script, verified manually.

Signed-off-by: Kir Kolyshkin <kolyshkin@gmail.com>
Upstream-commit: 6d85a4f5f8
Component: cli
2017-07-28 10:32:42 -07:00
236f3097a5 Merge pull request #387 from darrenstahlmsft/saveFastFail
Fast fail when save directory does not exist
Upstream-commit: eed14e840c
Component: cli
2017-07-28 17:46:13 +01:00
3b429c8524 Merge pull request #34176 from bmwiedemann/date
Allow to override build date
Upstream-commit: 7e4f4d15fdb004f9bc6f311704e481f43245bed3
Component: engine
2017-07-28 17:32:29 +01:00
2a26081729 bash completion for service ps supports multiple services
Signed-off-by: Harald Albers <github@albersweb.de>
Upstream-commit: 548758fe31
Component: cli
2017-07-28 15:43:34 +02:00
cf98674bff Fix awslogs driver repeating last event - #34292
Signed-off-by: Justin Menga <justin.menga@gmail.com>
Upstream-commit: 0fd5a0bab79f20f910cb7551ec34158a32e05f5a
Component: engine
2017-07-28 20:33:14 +12:00
93dcd2db6d integration-cli-on-swarm: print detailed error
Signed-off-by: Akihiro Suda <suda.akihiro@lab.ntt.co.jp>
Upstream-commit: 3fd386fed1f2678c413a07d5023146dfe1fd17ab
Component: engine
2017-07-28 05:43:52 +00:00
b022420c94 Merge pull request #34192 from swernli/fixBuilderCopy
Fixing releaseableLayer handling of layer streams and mounts.
Upstream-commit: e9cd2fef805c8182b719d489967fb4d1aa34eecd
Component: engine
2017-07-27 16:15:11 -07:00
06bc641d46 Merge pull request #306 from lipingxue/new_compose_fix.liping
Make compose file allow to specify names for non-external volume
Upstream-commit: 75249123b1
Component: cli
2017-07-28 00:35:44 +02:00
337a036e64 Change to enable volume name can be customized.
Signed-off-by: Liping Xue <lipingxue@gmail.com>
Change to enable volume name can be customized.
Signed-off-by: Liping Xue <lipingxue@gmail.com>

Change to enable volume name can be customized.

Remove unused debug info.

Address comments from Daniel and solve the lint error.
Signed-off-by: Liping Xue <lipingxue@gmail.com>

Address Daniel's comments to print warning message when name of external volume is set in loader code.
Signed-off-by: Liping Xue <lipingxue@gmail.com>

Address Daniel's comments to return error when external volume is set in loader code.
Signed-off-by: Liping Xue <lipingxue@gmail.com>

Address Daniel's comments to return error when external volume is set in loader code.
Signed-off-by: Liping Xue <lipingxue@gmail.com>

Remove the case that specifying external volume name in full-example.yml.

More fix.

Add unit test.
Signed-off-by: Liping Xue <lipingxue@gmail.com>

Address comments from Daniel, move the schema change to v3.4.
Signed-off-by: Liping Xue <lipingxue@gmail.com>

Address comments from Sebastiaan. Signed-off-by: Liping Xue <lipingxue@gmail.com>

Address comments from Misty.
Signed-off-by: Liping Xue <lipingxue@gmail.com>
Upstream-commit: 27a3080825
Component: cli
2017-07-27 15:09:05 -07:00
4bac077379 Add API documentation for plugable secret backends
Documents the API changes introduced in

0304c98d85404fe75a1b4a35d3c111931e062f41 and
08f7cf05268782a0dd8e4c41a4cc65fdf78d09f2

Signed-off-by: Sebastiaan van Stijn <github@gone.nl>
Upstream-commit: c8dad44c326d9d2131f94babbc535e7f442db290
Component: engine
2017-07-28 00:00:53 +02:00
3c0b1df0ba Fast fail when save directory does not exist
Signed-off-by: Darren Stahl <darst@microsoft.com>
Upstream-commit: 18c877d35c
Component: cli
2017-07-27 15:00:38 -07:00
ba32b46d68 Docs: update filter options for docker container ps
The `is-task` filter was only documented in the usage
section, but this section is not used in the documentation.

This patch adds the missing filter, synchronises the
man page source, and does some slight rephrasing
and reformatting of the filters.

Signed-off-by: Sebastiaan van Stijn <github@gone.nl>
Upstream-commit: 46064f33f4
Component: cli
2017-07-27 22:10:26 +02:00
1ab5b42eed Merge pull request #34274 from aaronlehmann/container-name-delete-fix
container: Fix Delete on nonexistent container
Upstream-commit: 2f8a3afcf369deefb730de9871c6f2b36b05737c
Component: engine
2017-07-27 21:59:14 +02:00
5e9b54edf2 Merge pull request #34279 from tklauser/stat-syscall-unix
Switch Stat syscalls to x/sys/unix
Upstream-commit: cc5914c908690c94f8c9a42081d1b50f74f20424
Component: engine
2017-07-27 21:28:38 +02:00
beb3caf7ab Bump API version to 1.32
Signed-off-by: Sebastiaan van Stijn <github@gone.nl>
Upstream-commit: 05121d555475b3d7cfa5b29f22dc85262cd1a1a8
Component: engine
2017-07-27 18:50:31 +02:00
3a8935f2e8 Update API plugin response examples
Signed-off-by: Sebastiaan van Stijn <github@gone.nl>
Upstream-commit: 4735c7663201ce1bf618e2aa505d7813a331be3f
Component: engine
2017-07-27 18:43:13 +02:00
833ede48bb Merge pull request #34229 from dodiadodia/patch-1
Update mkimage-yum.sh
Upstream-commit: 885cd5fbe53211190390c434acf92548b5e6f5ee
Component: engine
2017-07-27 17:37:33 +02:00
d0849f7c31 Merge pull request #34281 from thaJeztah/add-ripcurld0-curator
Add Boaz Shuster ("ripcurld0") as curator
Upstream-commit: 5e39971788a0d4dfe63fc97931694e1fd098e858
Component: engine
2017-07-27 17:32:50 +02:00
05b4b48f44 Add support for redirections in bash completion for docker save|load
Signed-off-by: Harald Albers <github@albersweb.de>
Upstream-commit: 1862ac1e63
Component: cli
2017-07-27 14:45:15 +02:00
bb26636fb0 Add file completion to bash completion for secret create
Signed-off-by: Harald Albers <github@albersweb.de>
Upstream-commit: abc793e333
Component: cli
2017-07-27 14:44:12 +02:00
eb0bdbb81b Add bash completion for service scale --detach
Signed-off-by: Harald Albers <github@albersweb.de>
Upstream-commit: 29d0f868e8
Component: cli
2017-07-27 14:43:24 +02:00
4fc5710ae5 Fix sort order of options in bash completion
See guidelines at the top of the script:

    # Note for developers:
    # Please arrange options sorted alphabetically by long name with the
    # short options immediately following their corresponding long form.
    # This order should be applied to lists, alternatives and code blocks.

Signed-off-by: Harald Albers <github@albersweb.de>
Upstream-commit: 393dc4a8c4
Component: cli
2017-07-27 14:38:27 +02:00
e06995a2f0 Add Boaz Shuster ("ripcurld0") as curator
\o/

Signed-off-by: Sebastiaan van Stijn <github@gone.nl>
Upstream-commit: b804976dd7f0fb4302c04cd3770c70c6adf33536
Component: engine
2017-07-27 13:10:21 +02:00
5c5712c42e Switch Stat syscalls to x/sys/unix
Switch some more usage of the Stat function and the Stat_t type from the
syscall package to golang.org/x/sys. Those were missing in PR #33399.

Signed-off-by: Tobias Klauser <tklauser@distanz.ch>
Upstream-commit: 01f70b028e9597ef207509e8124e120688dae185
Component: engine
2017-07-27 10:09:02 +02:00
d6c5d5bca2 Merge pull request #34275 from tiborvass/fix-hijack
Fix panic in hijack
Upstream-commit: 67e79319a03c8b04cb51513901856a3273bdc7a4
Component: engine
2017-07-27 08:59:55 +02:00
36e04981d5 Add zsh completion for docker service scale --detach=false
Signed-off-by: Jean-Pierre Huynh <jean-pierre.huynh@ounet.fr>
Upstream-commit: 04d905f6fa
Component: cli
2017-07-27 07:48:39 +01:00
5e49f90082 Add support for stop-signal in stack command
Signed-off-by: Christophe Robin <crobin@nekoo.com>
Upstream-commit: b129a70b5c
Component: cli
2017-07-27 13:18:05 +09:00
f8d59b968b Update mkimage-yum.sh
If you want to makeimage using the group "Compute Node" and so on, you must add “ ” to include the $install_groups, or it will format the text as below:
yum -c /etc/yum.conf --installroot=/tmp/makeimage.sh.zOLs8y --releasever=/ --setopt=tsflags=nodocs --setopt=group_package_types=mandatory -y groupinstall Compute Node
That's absolutely incorrect.

Change-Id: I8b6b09f215aabd6b1f76c9365ba96c68722c47fd
Signed-off-by: dodia <tangwj2@lenovo.com>
Upstream-commit: fa900bd30a0881772b8964ee4d91d791af5b13c8
Component: engine
2017-07-27 10:40:00 +08:00
252eb068fe container: Fix Delete on nonexistent container
Delete needs to release names related to a container even if that
container isn't present in the db. However, slightly overzealous error
checking causes the transaction to get rolled back. Ignore the error
from Delete on the container itself, since it may not be present.

Signed-off-by: Aaron Lehmann <aaron.lehmann@docker.com>
Upstream-commit: 1d9546fc62c559dbcbb3dbdce40318fb7c4d67a2
Component: engine
2017-07-26 16:45:54 -07:00
7b50af1510 Merge pull request #34205 from dnephin/add-codeowners
Add an initial CODEOWNERS
Upstream-commit: 8c72417b51a4998caae9f44eaf2f5a654ffcd839
Component: engine
2017-07-27 00:31:10 +02:00
1861ca6314 Merge pull request #33987 from dnephin/cleanup-more-hack
Move test-unit out of hack/make
Upstream-commit: f8c434366e9134a1e2d4c4038e0257952f74cc99
Component: engine
2017-07-27 00:29:13 +02:00
6118c4c4b5 Merge pull request #34247 from thaJeztah/fix-restartpolicy-default
Fix RestartPolicy default value
Upstream-commit: 36e4e952f8f28ff661345328bd8da0ce9f5f2f86
Component: engine
2017-07-27 00:21:48 +02:00
15b5db94ff Fixing releaseableLayer handling of layer streams and mounts.
releaseableLayer includes automatic handling for creating a read/write layer and mounting it on a call to Mount(), but then does not correspondingly unmount the layer before trying to delete it, which will fail for some graphdrivers. Commit on a releaseable layer also leaks the tarstream for the layer. To fix this, the stream close is deferred in Commit and releaseRWLayer now correctly handles unmounting the layer before trying to delete it.  In addition, the changes include better error handling in Release() to make sure that errors are returned to the caller for failures on read/write layers instead of being ignored.# Please enter the commit message for your changes. Lines starting

Signed-off-by: Stefan Wernli <swernli@ntdev.microsoft.com>
Upstream-commit: 1d457999c4540aacda68f834bdb3c6f220ce3fd5
Component: engine
2017-07-26 14:26:56 -07:00
993196bb20 Merge pull request #34249 from thaJeztah/remove-unused-constants
Remove unused constants in plugin_responses
Upstream-commit: 1ea52c481268d523e715a6d742718679d87d9f61
Component: engine
2017-07-26 16:44:51 -04:00
09f07f31c5 Add an initial CODEOWNERS
Signed-off-by: Daniel Nephin <dnephin@docker.com>
Upstream-commit: a1c19b764c95e058cbb6bcfe0b55973cca957bfc
Component: engine
2017-07-26 16:04:23 -04:00
8adcc1277a Add a warning when make is run outside of a container.
The warning can be disabled by setting the environment variable

Signed-off-by: Daniel Nephin <dnephin@docker.com>
Upstream-commit: 12a7387c8e
Component: cli
2017-07-26 15:58:15 -04:00
88060164f5 Merge pull request #319 from keloyang/bugfix-docker-cp
Bugfix docker cp
Upstream-commit: 2dac00bdca
Component: cli
2017-07-26 11:56:12 -04:00
5ff9e5001c Fix panic in hijack
Signed-off-by: Tibor Vass <tibor@docker.com>
Upstream-commit: 7a53991bd6200b875e492d9c3f8e99a9a0c11056
Component: engine
2017-07-25 22:46:41 -07:00
31c5c88ddd Merge pull request #34166 from rhatdan/master
/dev should be constrained in size just like /dev/shm
Upstream-commit: 72cda6a6c2f25854bea2d69168082684f2c9feca
Component: engine
2017-07-25 22:36:35 +02:00
dadbb17aea Fix shallow git clone in docker-build
If the HEAD request fails, use a GET request to properly test if git
server is smart-http.

Signed-off-by: Andrew He <he.andrew.mail@gmail.com>
Upstream-commit: 85afbbc2ed36945adeaf6fa09f6066a549631a6f
Component: engine
2017-07-25 13:20:59 -07:00
8f5aa8e137 Merge pull request #33440 from RenaudWasTaken/genericresource
Added support for Generic Resources
Upstream-commit: 9319a8a2dd5760b3d0eda359b8c3872f5e37aa87
Component: engine
2017-07-25 15:32:25 -04:00
16df3a505c Merge pull request #42 from seemethere/remove_telemetry_plugin_fedora_26
Removes telemetry mentions from Fedora 26
Upstream-commit: 4c678098414f0baa6bd19ad765235f2db399650b
Component: packaging
2017-07-25 11:39:36 -07:00
4128b146dc Removes telemetry mentions from Fedora 26
Signed-off-by: Eli Uriegas <eli.uriegas@docker.com>
Upstream-commit: a8c7e75bfd263b2f7445b06f749aba13aaeac789
Component: packaging
2017-07-25 11:26:40 -07:00
a2ee6302a8 Merge pull request #379 from jphuynh/completion-zsh-plugin-ls-filter
Add metric plugins to zsh completion for `plugin ls --filter capability`
Upstream-commit: 915b18bdc9
Component: cli
2017-07-25 20:02:26 +02:00
772603618a Merge pull request #41 from seemethere/revert_metrics_plugin
Revert "Added the metrics plugin to the RPM/DEB packages"
Upstream-commit: 0f409bf47a7a0e6cbd97b3768a10724ecdd11ccc
Component: packaging
2017-07-25 10:08:52 -07:00
99f6b2e854 update version
Signed-off-by: Victor Vieux <victorvieux@gmail.com>
2017-07-25 09:57:18 -07:00
4e97b12edd Merge pull request #40 from seemethere/propagate_build_deb_errors
Tell build-deb to throw up errors
Upstream-commit: d37c8c84f7e4693bc922fe1063686064b2740f5b
Component: packaging
2017-07-25 09:46:29 -07:00
66ffeac642 Remove unused constants in plugin_responses
Signed-off-by: Sebastiaan van Stijn <github@gone.nl>
Upstream-commit: 9bb57aa3fef6c1f31e9e8344e06670c3d41e4395
Component: engine
2017-07-25 17:07:04 +02:00
b0a6694bbf Fix RestartPolicy default value
Signed-off-by: Sebastiaan van Stijn <github@gone.nl>
Upstream-commit: fc48b5529dca3907ade273921a14906be796e333
Component: engine
2017-07-25 16:14:59 +02:00
77f384f48b Add metric plugins to zsh completion for plugin ls --filter capability
Signed-off-by: Jean-Pierre Huynh <jean-pierre.huynh@ounet.fr>
Upstream-commit: ff61438328
Component: cli
2017-07-25 09:24:35 +01:00
5230175f79 Revert "Added the metrics plugin to the RPM/DEB packages"
This reverts commit ceac22bf2240df483b1d3bd3a19ac681e665f910.

Signed-off-by: Eli Uriegas <eli.uriegas@docker.com>
Upstream-commit: bda73f99e455bd3f041ccc843f094186ca8b8623
Component: packaging
2017-07-24 18:16:04 -07:00
bce59ac2a5 Merge pull request #11 from StefanScherer/build-deb-raspbian
Add Raspbian deb packages
Upstream-commit: d4ca48172bb9de41072ce63298d71ef3b0aca59a
Component: packaging
2017-07-24 18:11:51 -07:00
706203d338 Merge pull request #375 from hernandanielg/doc/fix_volume_ls
fixed word network on volume_ls.md
Upstream-commit: 7cf9e752d5
Component: cli
2017-07-25 03:05:37 +02:00
57e5f69d28 Merge pull request #371 from jphuynh/completion-zsh-service-create-update-publish
Remove duplicate publish option in docker service create/update
Upstream-commit: 4c30fbcf4c
Component: cli
2017-07-25 02:54:05 +02:00
2029cf1c2d Added support for Generic Resources
Signed-off-by: Renaud Gaubert <rgaubert@nvidia.com>
Upstream-commit: 87e1464c438f4163e2694a0bf29ae5a45903449b
Component: engine
2017-07-24 17:49:56 -07:00
b58d0f8839 Tell build-deb to throw up errors
Signed-off-by: Eli Uriegas <eli.uriegas@docker.com>
Upstream-commit: 3618e4aa262f154f79c804752d69110772e636a3
Component: packaging
2017-07-24 16:30:11 -07:00
909453ab58 Merge pull request #34235 from aaronlehmann/recursive-rlock
cluster: Avoid recursive RLock
Upstream-commit: 92b3dcb601381348c12ad7f99e865991bf908eea
Component: engine
2017-07-24 15:50:22 -07:00
156191d710 Add --chown flag to Dockerfile ADD and COPY
Rebased by @estesp

Signed-off-by: Kara Alexandra <kalexandra@us.ibm.com>
Signed-off-by: Phil Estes <estesp@linux.vnet.ibm.com>
Upstream-commit: 858fad37954b198bb90aed36017b80b38ea88c1d
Component: engine
2017-07-24 16:25:04 -04:00
e2cfb7ac98 cluster: Avoid recursive RLock
GetTasks can call GetService and GetNode with the read lock held. These
methods try to aquire the read side of the same lock. According to the
sync package documentation, this is not safe:

> If a goroutine holds a RWMutex for reading, it must not expect this or
> any other goroutine to be able to also take the read lock until the
> first read lock is released. In particular, this prohibits recursive
> read locking. This is to ensure that the lock eventually becomes
> available; a blocked Lock call excludes new readers from acquiring the
> lock.

Fix GetTasks to use the lower-level getService and getNode methods
instead. Also, use lockedManagerAction to simplify GetTasks.

Signed-off-by: Aaron Lehmann <aaron.lehmann@docker.com>
Upstream-commit: bd4f66c8f1f6ad4a2f228a957f293bc157e13d9c
Component: engine
2017-07-24 10:52:44 -07:00
c394e66cf8 fixed word network on volume_ls.md
Signed-off-by: Hernan Garcia <hernandanielg@gmail.com>
Upstream-commit: f5bca7af10
Component: cli
2017-07-24 05:18:10 -05:00
5087bd5387 Merge pull request #374 from thaJeztah/bump-version
Bump version to 17.08.0-dev
Upstream-commit: 1338f11ee7
Component: cli
2017-07-24 01:03:20 +02:00
0c686df105 Add raspbian deb packages
Upstream-commit: 1c61fdcafc4f6fa0e41c267cd857d0b60d3a2dbd
Component: packaging
2017-07-22 08:20:40 +02:00
04720d7b97 Bump version to 17.08.0-dev
Signed-off-by: Sebastiaan van Stijn <github@gone.nl>
Upstream-commit: a8bcbfd9e0
Component: cli
2017-07-22 03:13:52 +02:00
51a3e0949b Merge pull request #363 from jphuynh/shellcheckReadme
Update README and add help target to make
Upstream-commit: deab50ba19
Component: cli
2017-07-22 03:06:53 +02:00
d3fa99c143 Merge pull request #311 from thaJeztah/fix-system-prune-until
Error if "until" filter is combined with "--volumes" on system prune
Upstream-commit: b175e3aacd
Component: cli
2017-07-22 03:04:58 +02:00
9f4c690d3e Merge pull request #34132 from wenjianhn/http-307
Handle https proxy's CONNECT response
Upstream-commit: 4ac4c8ef4b06ffa8ccd4fd3ae0f76e4ca820c1bc
Component: engine
2017-07-22 01:00:48 +02:00
0fbe24ad38 Merge pull request #31 from andrewhsu/f26
build fedora 26 packages
Upstream-commit: 7cf8afa936431a5779f3d9e5748a40b05bfa75e4
Component: packaging
2017-07-21 14:44:11 -07:00
255f899b23 Merge pull request #38 from seemethere/remove_ubuntu_yakkety
End Ubuntu 16.10 (Yakkety) support
Upstream-commit: 46ad13ab174800457e4081d472592ac0d1601dcf
Component: packaging
2017-07-21 14:38:15 -07:00
29f596dcad End Ubuntu 16.10 (Yakkety) support
Ubuntu 16.10 (Yakkety) reached it's "End of Life" on July 20, 2017:
http://fridge.ubuntu.com/2017/07/20/ubuntu-16-10-yakkety-yak-end-of-life-reached-on-july-20-2017/

As such we are removing support for the distribution for future versions
of Docker packages.

Signed-off-by: Eli Uriegas <eli.uriegas@docker.com>
Upstream-commit: 36cc14cd480879391eeb9f470417698618f4cdb3
Component: packaging
2017-07-21 14:33:18 -07:00
658d91b7b5 Update spec to align with new spec files
Signed-off-by: Eli Uriegas <eli.uriegas@docker.com>
Upstream-commit: feb2f647c5570753a607b71bb476028c8d1b4e55
Component: packaging
2017-07-21 14:20:39 -07:00
da96ff7f66 Update go version, add distro/suite tags
Signed-off-by: Eli Uriegas <eli.uriegas@docker.com>
Upstream-commit: 26b1bd9f3da46b907021ae66d310405057e29634
Component: packaging
2017-07-21 14:18:42 -07:00
f462cfc7cf build fedora 26 packages
Just released: https://docs.fedoraproject.org/en-US/Fedora/26/html/Release_Notes/

Signed-off-by: Andrew Hsu <andrewhsu@docker.com>
Upstream-commit: 412824b465d8334278bb9c02f0a5ee3d294826fd
Component: packaging
2017-07-21 14:16:38 -07:00
55833ad972 Merge pull request #34174 from aaronlehmann/logattributes
Avoid using a map for log attributes
Upstream-commit: 901fe35bd3ab1d4c25872c8a92577c4f088bba74
Component: engine
2017-07-21 22:31:51 +02:00
140ada5fa0 Merge pull request #37 from seemethere/change_deb_rules_to_cd
Change make -C to a cd command for manpage generation
Upstream-commit: f608c8c590676f30bc1fe05bf65e6716d3e97a3a
Component: packaging
2017-07-21 10:57:18 -07:00
6f2ec850b4 Merge pull request #3 from rogaha/add_metrics_plugin
Added the metrics plugin to the RPM/DEB packages
Upstream-commit: ce952b6f169aedf56a968f58117587cafd20aa09
Component: packaging
2017-07-21 10:56:30 -07:00
2e0a8a6dee Change make -C to a cd command
Tried out make -C in this scenario and it did not seem to function
correctly, changed to cd.

Signed-off-by: Eli Uriegas <eli.uriegas@docker.com>
Upstream-commit: 3a548f8815d5308b197abea1e39f0a0a4939c4f2
Component: packaging
2017-07-21 10:44:34 -07:00
6ad101e8da Merge pull request #36 from seemethere/fix_manpage_generation
Have docker cli be compiled in GOPATH
Upstream-commit: 5c02e7c3f4a8e9a9297d35cc74b33364311f25f0
Component: packaging
2017-07-21 10:33:23 -07:00
e7e7faca03 Have docker cli be compiled in GOPATH
manpage generation was failing for docker cli when being run under
aarch64: https://ci.qa.aws.dckr.io/job/docker/job/release-packaging/view/change-requests/job/PR-41/5/execution/node/360/log/

The way to remedy this is to compile the cli and the manpages while in
the GOPATH so that dependencies found in the vendor folder are
discovered by the go build tools.

Signed-off-by: Eli Uriegas <eli.uriegas@docker.com>
Upstream-commit: b325a0eb0216e151be5d3e1ab9e48db07f53c6c5
Component: packaging
2017-07-21 10:31:28 -07:00
c6ce3f3302 Update README and add help target to make
Signed-off-by: Jean-Pierre Huynh <jean-pierre.huynh@ounet.fr>
Upstream-commit: 649a5864f3
Component: cli
2017-07-21 16:57:06 +01:00
66ba1076ff Merge pull request #34206 from seemethere/fix_integration_tests
Add go-autogen to integration tests
Upstream-commit: 90fbe6a7373da81b36d1427e0c2764c0b583f421
Component: engine
2017-07-21 13:52:48 +02:00
5eb81e4819 Merge pull request #33960 from cpuguy83/ignore_not_exist_err
Fix error handling with not-exist errors on remove
Upstream-commit: 67eeb0490d9beacbd6e00eb4ea20cfe692ebf333
Component: engine
2017-07-21 13:52:27 +02:00
53b038fa76 Error if "until" filter is combined with "--volumes" on system prune
The "until" filter is supported by all object types, except for
volumes.

Before this patch, the "until" filter would attempted to be used for the volume
prune endpoint, resulting in an error being returned by the daemon, and
further prune endpoints (networks, images) to be skipped.

    $ docker system prune --filter until=24h --filter label=label.foo=bar

    WARNING! This will remove:
            - all stopped containers
            - all volumes not used by at least one container
            - all networks not used by at least one container
            - all dangling images
    Are you sure you want to continue? [y/N] y
    Error response from daemon: Invalid filter 'until'

    Calling POST /v1.30/containers/prune?filters=%7B%22label%22%3A%7B%22label.foo%3D%3Dbar%22%3Atrue%7D%2C%22until%22%3A%7B%2224h%22%3Atrue%7D%7D
    Calling POST /v1.30/volumes/prune?filters=%7B%22label%22%3A%7B%22label.foo%3D%3Dbar%22%3Atrue%7D%2C%22until%22%3A%7B%2224h%22%3Atrue%7D%7D
    Handler for POST /v1.30/volumes/prune returned error: Invalid filter 'until'
    Error response from daemon: Invalid filter 'until'

With this patch, an error is produced instead, preventing "partial" prune.

    $ docker system prune --filter until=24h --filter label=foo==bar --volumes
    ERROR: The "until" filter is not supported with "--volumes"

Note that `docker volume prune` does not have this problem, and produces an
error if the `until` filter is used;

    $ docker volume prune --filter until=24h

    WARNING! This will remove all volumes not used by at least one container.
    Are you sure you want to continue? [y/N] y
    Error response from daemon: Invalid filter 'until'

Signed-off-by: Sebastiaan van Stijn <github@gone.nl>
Upstream-commit: 3c095dc546
Component: cli
2017-07-21 12:11:53 +02:00
98b6afc061 Merge pull request #369 from jphuynh/completion-zsh-get-log-options
Update __docker_get_log_options completion (zsh)
Upstream-commit: 33a25708d4
Component: cli
2017-07-21 11:25:17 +02:00
9c4647a2a3 Merge pull request #368 from jphuynh/completion-zsh-system-prune-volumes
Add zsh completion for `system prune --volumes`
Upstream-commit: 814827ef0d
Component: cli
2017-07-21 11:20:59 +02:00
4ea813dca9 Merge pull request #364 from ksouf/issue-37-add-connect-disconnect
adding connect disconnect network tests
Upstream-commit: 36b9edff7e
Component: cli
2017-07-21 11:19:23 +02:00
96839aeeb6 Merge pull request #223 from ripcurld0/docs_cp_prm
Update the cp command docs to include archive
Upstream-commit: 25ca529388
Component: cli
2017-07-21 11:14:15 +02:00
a6804951ed Merge pull request #291 from thaJeztah/bump-swarmkit
Bump swarmkit and dependencies to 79381d0840be27f8b3f5c667b348a4467d866eeb
Upstream-commit: 472ce90624
Component: cli
2017-07-21 11:07:38 +02:00
49215da962 Remove duplicate publish option in docker service create/update completion
Signed-off-by: Jean-Pierre Huynh <jean-pierre.huynh@ounet.fr>
Upstream-commit: 6c65ba6c08
Component: cli
2017-07-21 09:53:43 +01:00
cfc631fd9c Handle https proxy's CONNECT response
When using a https proxy, an extra HTTP 200 header will be generated.
So we can't rely on detecting the first http header.

$curlHeaders with https proxy:
"HTTP/1.0 200 Connection established  <-- the https proxy's response

HTTP/1.1 307 Temporary Redirect
...
"

See https://stackoverflow.com/a/34537988/889429

Fixes #34131

Signed-off-by: Jacob Wen <jian.w.wen@oracle.com>
Upstream-commit: 238d17c456c3ff0b8937b33538f6a4b36f829410
Component: engine
2017-07-21 10:13:04 +08:00
6adc7715ee Update __docker_get_log_options completion
Signed-off-by: Jean-Pierre Huynh <jean-pierre.huynh@ounet.fr>
Upstream-commit: d7ade64d29
Component: cli
2017-07-20 23:41:47 +01:00
a3b41349c5 Add zsh completion for system prune --volumes
Signed-off-by: Jean-Pierre Huynh <jean-pierre.huynh@ounet.fr>
Upstream-commit: 6b256484ae
Component: cli
2017-07-20 23:13:04 +01:00
1dd2821aa2 Merge pull request #357 from ripcurld0/nat_sort_service
Sort services names in a natural order
Upstream-commit: dfbad2bc5a
Component: cli
2017-07-20 22:56:09 +02:00
80c16c1105 Merge pull request #25 from seemethere/add_aarch64_support
Add ubuntu-xenial aarch64 Dockerfile
Upstream-commit: 9d7eb679ea5954f32eb342ff1c26e8cdf4c298cb
Component: packaging
2017-07-20 13:47:21 -07:00
264d26c86a Add ubuntu-xenial aarch64 Dockerfile
Signed-off-by: Eli Uriegas <eli.uriegas@docker.com>
Upstream-commit: 94cbc76b701b8b108f6a337b1695bd664f441bdc
Component: packaging
2017-07-20 13:30:51 -07:00
708d89bf47 Merge pull request #34204 from jpetazzo/log-docker-driver-env
Add a log message when storage driver is overriden through environment
Upstream-commit: 2b964164c23857bb9b383381af297f3feb5770fd
Component: engine
2017-07-20 21:16:06 +02:00
363d00bb4d Add go-autogen to integration tests
Integration test were failing in trial runs for docker-ce 17.07 due to
the lack of go-autogen being sourced in `hack/make.sh`. This re-adds
go-autogen to be sourced for test-integration-cli so that we can
actually run tests without the error found in:
https://github.com/moby/moby/pull/33857

Signed-off-by: Eli Uriegas <eli.uriegas@docker.com>
Upstream-commit: 3cdd471cac8193c34d8483255065c6c28a7b1645
Component: engine
2017-07-20 11:37:12 -07:00
c5cf96eb73 Merge pull request #34194 from abhinandanpb/opt
Fixing issue with driver opt not passed to drivers
Upstream-commit: 8d703b98b5c403743bf17e22395e32a7271b8d3c
Component: engine
2017-07-20 20:02:05 +02:00
69533b66d7 adding connect disconnect network tests
Signed-off-by: khaled souf <khaled.souf@gmail.com>
Upstream-commit: 7296abf39f
Component: cli
2017-07-20 18:53:03 +02:00
5973cb0a44 Merge pull request #365 from dnephin/more-codeowners
Fix shellcheck on master and other cleanup
Upstream-commit: eabdace628
Component: cli
2017-07-20 18:35:09 +02:00
ca6a533d23 Fix error handling with not-exist errors on remove
Specifically, none of the graphdrivers are supposed to return a
not-exist type of error on remove (or at least that's how they are
currently handled).

Found that AUFS still had one case where a not-exist error could escape,
when checking if the directory is mounted we call a `Statfs` on the
path.

This fixes AUFS to not return an error in this case, but also
double-checks at the daemon level on layer remove that the error is not
a `not-exist` type of error.

Signed-off-by: Brian Goff <cpuguy83@gmail.com>
Upstream-commit: d42dbdd3d48d0134f8bba7ead92a7067791dffab
Component: engine
2017-07-20 12:26:27 -04:00
384f10f42e Fix shellcheck on master
Signed-off-by: Daniel Nephin <dnephin@docker.com>
Upstream-commit: 14d2c95d4a
Component: cli
2017-07-20 12:11:27 -04:00
0d67981907 Add myself to command/stack codeowners
Cleanup a test

Signed-off-by: Daniel Nephin <dnephin@docker.com>
Upstream-commit: 60991e943b
Component: cli
2017-07-20 12:05:20 -04:00
43848053b0 Add a log message when the storage driver is overriden through the environment
Signed-off-by: Jérôme Petazzoni <jerome.petazzoni@gmail.com>
Upstream-commit: 84aefe869786f48151e76504746d576e6d377d79
Component: engine
2017-07-20 17:38:34 +02:00
f7c6b1d747 /dev should be constrained in size
There really is no reason why anyone should create content in /dev
other then device nodes.  Limiting it size to the 64 k size limit.

Signed-off-by: Daniel J Walsh <dwalsh@redhat.com>
Upstream-commit: bfdb0f3cb86244b7b17d83c6c9aef858245815b4
Component: engine
2017-07-20 08:59:56 -04:00
e02dded93f Merge pull request #281 from albers/completion-plugin-ls--filter-capability
Add metric plugins to bash completion for `plugin ls --filter capability`
Upstream-commit: 45a7e1ca87
Component: cli
2017-07-20 13:39:51 +02:00
23caa8b756 Merge pull request #280 from albers/completion-awslog-multiline
Add bash completion for awslogs multiline log driver options
Upstream-commit: ab05e0aa63
Component: cli
2017-07-20 13:39:10 +02:00
c4357dce36 Merge pull request #332 from tych0/docs-fixups-for-password-stdin
Docs fixups for password stdin
Upstream-commit: 3d76febd17
Component: cli
2017-07-20 11:31:23 +02:00
4a278a582f Merge pull request #279 from albers/completion-build--iidfile
Add bash completion for `build --iidfile`
Upstream-commit: c394cd9bb7
Component: cli
2017-07-20 09:57:05 +02:00
39842a2345 Merge pull request #284 from albers/completion-service--detach
Fix bash completion for `service create|update --detach|-d`
Upstream-commit: cc6867f456
Component: cli
2017-07-20 09:47:59 +02:00
381747626c Merge pull request #283 from albers/completion-configs
Add bash completion for `docker config` command family
Upstream-commit: a4d76989bd
Component: cli
2017-07-20 09:45:01 +02:00
0e1ec67528 Merge pull request #34186 from thaJeztah/api-update-example-data
Improve API docs for UsageData
Upstream-commit: a14f06a86520d7dc865ccea08ae40dfa674d2445
Component: engine
2017-07-20 09:38:28 +02:00
4400145f36 Merge pull request #362 from alexmavr/stack-host-bridge-nets
Skip inspect of built-in networks on stack deploy
Upstream-commit: 79b6d376ce
Component: cli
2017-07-20 07:47:27 +02:00
82bb6886df Skip inspects of built-in networks on stack deploy
Signed-off-by: Alex Mavrogiannis <alex.mavrogiannis@docker.com>
Upstream-commit: 7f53c99dfe
Component: cli
2017-07-19 19:39:44 -07:00
11022193c7 Fixing issue with driver opt not passed to drivers
Signed-off-by: Abhinandan Prativadi <abhi@docker.com>
Upstream-commit: bcb55c62024419a2f8fa7679e1e068cc43425636
Component: engine
2017-07-19 17:44:53 -07:00
0de63ac93f Add Compose format 3.4
Signed-off-by: Daniel Nephin <dnephin@docker.com>
Upstream-commit: 0adccacb38
Component: cli
2017-07-19 14:24:59 -07:00
c20d148cd4 Add scripts folder to shellcheck
Signed-off-by: Jean-Pierre Huynh <jean-pierre.huynh@ounet.fr>
Upstream-commit: 24c06c1723
Component: cli
2017-07-19 16:33:58 +01:00
c04822c682 Sort services names in a natural order
Signed-off-by: Boaz Shuster <ripcurld.github@gmail.com>
Upstream-commit: 7478e47b2d
Component: cli
2017-07-19 18:18:06 +03:00
fc4916e72f Improve API docs for UsageData
The docs did not mention when this information
was set, and what the `-1` value indicated.

Signed-off-by: Sebastiaan van Stijn <github@gone.nl>
Upstream-commit: 194f635ce7d097f550986bc3169ab59158f5aa68
Component: engine
2017-07-19 16:25:38 +02:00
336f19edea Allow to override build date
in order to make builds reproducible.
See https://reproducible-builds.org/ for why this is good
and https://reproducible-builds.org/specs/source-date-epoch/
for the definition of this variable.

Signed-off-by: Bernhard M. Wiedemann <bwiedemann@suse.de>
Upstream-commit: 760763e9957840f1983a5006f4e66d6920ec496e
Component: engine
2017-07-19 06:20:18 +02:00
b337882c5b Avoid using a map for log attributes
Having a map per log entry seemed heavier than necessary. These
attributes end up being sorted and serialized, so storing them in a map
doesn't add anything (there's no random access element). In SwarmKit,
they originate as a slice, so there's an unnecessary conversion to a map
and back.

This also fixes the sort comparator, which used to inefficiently split
the string on each comparison.

Signed-off-by: Aaron Lehmann <aaron.lehmann@docker.com>
Upstream-commit: b642b3f21f17cf50c79e464d3aedc93b2dbf0fb0
Component: engine
2017-07-18 19:01:20 -07:00
037025769f Add builder dev report for 2017-07-17
Signed-off-by: Tonis Tiigi <tonistiigi@gmail.com>
Upstream-commit: b60c5819bb4f81e5d64cb8a79e07694b2112b05f
Component: engine
2017-07-18 18:31:42 -07:00
70f1e387d9 fish completion: add --password-stdin
Signed-off-by: Tycho Andersen <tycho@docker.com>
Upstream-commit: 3b7b6b5f7f
Component: cli
2017-07-18 15:25:46 -06:00
231e3a605b zsh completion: add --password-stdin
Signed-off-by: Tycho Andersen <tycho@docker.com>
Upstream-commit: 90619e5054
Component: cli
2017-07-18 15:25:46 -06:00
3ddb21c1b1 bash completion: add --password-stdin
Signed-off-by: Tycho Andersen <tycho@docker.com>
Upstream-commit: bbfe23f9e6
Component: cli
2017-07-18 15:25:46 -06:00
9fab9786f4 docs: add --password-stdin
also add an example of usage

Signed-off-by: Tycho Andersen <tycho@docker.com>
Upstream-commit: 3e392505a8
Component: cli
2017-07-18 15:25:46 -06:00
cc4d27dd59 Added the metrics plugin to the RPM/DEB packages
- centos
 - fedora
 - ubuntu
 - debian

Signed-off-by: Roberto Gandolfo Hashioka <roberto_hashioka@hotmail.com>
Upstream-commit: ceac22bf2240df483b1d3bd3a19ac681e665f910
Component: packaging
2017-07-18 09:14:56 -07:00
534226435e Remove links when remove container
Steps to reproduce:
```
    # docker run -tid --name aaa ubuntu
    57bfd00ac5559f72eec8c1b32a01fe38427d66687940f74611e65137414f0ada
    # docker run -tid --name bbb --link aaa ubuntu
    23ad18362950f39b638206ab4d1885fd4f50cbd1d16aac9cab8e97e0c8363471
    # docker ps --no-trunc
    CONTAINER ID                                                       IMAGE
    COMMAND             CREATED             STATUS              PORTS
    NAMES
    23ad18362950f39b638206ab4d1885fd4f50cbd1d16aac9cab8e97e0c8363471
    ubuntu              "/bin/bash"         4 seconds ago       Up 3 seconds
    bbb
    57bfd00ac5559f72eec8c1b32a01fe38427d66687940f74611e65137414f0ada
    ubuntu              "/bin/bash"         14 seconds ago      Up 14
    seconds                           aaa,bbb/aaa
    # docker rm -f bbb
    bbb
    # docker ps --no-trunc
    CONTAINER ID                                                       IMAGE
    COMMAND             CREATED             STATUS              PORTS
    NAMES
    57bfd00ac5559f72eec8c1b32a01fe38427d66687940f74611e65137414f0ada
    ubuntu              "/bin/bash"         29 seconds ago      Up 28
    seconds                           aaa,bbb/aaa
    # docker rm --link bbb/aaa
    Error response from daemon: Cannot get parent /bbb for name /bbb/aaa
```

When we rm container `bbb`, we can still see `bbb/aaa` in `docker ps
--no-trunc`. And this link cannot be deleted since container `bbb` has
already been removed.

We should remove links of a container when it is deleted.

Signed-off-by: Yuanhong Peng <pengyuanhong@huawei.com>
Upstream-commit: 600ad5c1b7b736fba6b103eb99ec87efb050b9ec
Component: engine
2017-07-18 12:09:26 +08:00
189240deb3 Remove test-unit from hack/make
Also remove the test flag from pkg/term and jsut checkuid directly.
Fixed a problem with a pkg/term test that was leaving the terminal in a bad
state.

Signed-off-by: Daniel Nephin <dnephin@docker.com>
Upstream-commit: 1fb615599a83f41b449529df24f7e833c727e0ed
Component: engine
2017-07-17 11:39:33 -04:00
766e04b095 More helper hack helper functions to a more appropriate place.
Signed-off-by: Daniel Nephin <dnephin@docker.com>
Upstream-commit: ece4520bf8b3938ef4a078e6826a1682e7fe5495
Component: engine
2017-07-17 11:38:59 -04:00
b1d7c8f014 Add bash completion for --storage-opt dm.libdm_log_level
This adds bash completion for https://github.com/moby/moby/pull/33845.

Signed-off-by: Harald Albers <github@albersweb.de>
Upstream-commit: b8710ccef3
Component: cli
2017-07-14 10:23:15 +02:00
9cc50cd1cb Vendor, update moby to d58ffa0364c04d03a8f25704d7f0489ee6cd9634
Fix docker cp dir with hard link, refer to https://github.com/moby/moby/pull/3.

Signed-off-by: Shukui Yang <yangshukui@huawei.com>
Upstream-commit: a996206ced
Component: cli
2017-07-12 01:28:55 +00:00
9806677f30 Refactor alias delegation in bash completion for secret rm|remove
The completion logic should be implemented in the documented subcommands
(ls, rm) and delegated to from the aliases (list, remove).
For the rm|remove pair, this was implemented vice versa.

Signed-off-by: Harald Albers <github@albersweb.de>
Upstream-commit: d585e554d5
Component: cli
2017-07-07 12:03:51 +02:00
9bf76d9f74 Add bash completion for secret inspect --pretty
Signed-off-by: Harald Albers <github@albersweb.de>
Upstream-commit: 211bd55ae7
Component: cli
2017-07-07 12:03:51 +02:00
41ac0e363c Add bash completion for docker config command family
This adds bash completion for
- https://github.com/docker/cli/pull/45
- https://github.com/moby/moby/pull/32336

Signed-off-by: Harald Albers <github@albersweb.de>
Upstream-commit: c40952b305
Component: cli
2017-07-07 12:03:51 +02:00
66062dd9b7 bump golang.org/x/net to 7dcfb8076726a3fdd9353b6b8a1f1b6be6811bd6
Signed-off-by: Sebastiaan van Stijn <github@gone.nl>
Upstream-commit: 679ae70241
Component: cli
2017-07-03 17:40:41 -07:00
d48d41f4e2 bump gRPC to v1.3.0, add genproto, update protobuf
Signed-off-by: Sebastiaan van Stijn <github@gone.nl>
Upstream-commit: 74ec7a5b2c
Component: cli
2017-07-03 17:40:36 -07:00
9ee14880db Bump SwarmKit to 79381d0840be27f8b3f5c667b348a4467d866eeb
Signed-off-by: Sebastiaan van Stijn <github@gone.nl>
Upstream-commit: 585e099a9a
Component: cli
2017-07-03 17:40:28 -07:00
31ba47d5fe Improve bash completion for service create|update --detach
bash completion usually completes boolean options that default to `true`
with the `=false` suffix because that is the only syntax that really
changes behavior.
For this option, I implemented completion falsely.

Signed-off-by: Harald Albers <github@albersweb.de>
Upstream-commit: fc0dafbbd1
Component: cli
2017-07-03 17:40:23 +02:00
a1db9ae743 Add metric plugins to bash completion for plugin ls --filter capability
This adds bash completion for https://github.com/moby/moby/pull/32874.

Signed-off-by: Harald Albers <github@albersweb.de>
Upstream-commit: 2caf425f02
Component: cli
2017-07-03 11:40:25 +02:00
53d008d01f Add bash completion for awslogs multiline log driver options
This adds bash completion for https://github.com/moby/moby/pull/30891.

Signed-off-by: Harald Albers <github@albersweb.de>
Upstream-commit: 1d21a3dd7c
Component: cli
2017-07-03 11:04:44 +02:00
68bbc40c7a Add bash completion for build --iidfile
This adds bash completion for https://github.com/moby/moby/pull/32406.

Signed-off-by: Harald Albers <github@albersweb.de>
Upstream-commit: 1f8720717d
Component: cli
2017-07-03 10:41:13 +02:00
6b848bca45 Add clarification to --privileged error message
Signed-off-by: TomSweeneyRedHat <tsweeney@redhat.com>
Upstream-commit: 38e26f0d8d0941a34164c64b04c9646c8c89ac29
Component: engine
2017-06-25 14:02:20 -04:00
b1bd677bbe remove desktop-integration contrib from .deb
these examples are not nescessary for day-to-day
use of docker, so don't have to be included in
the packages.

Signed-off-by: Sebastiaan van Stijn <github@gone.nl>
Upstream-commit: 957c44b12e036f3c0a57e34262eca0e0263a0d39
Component: packaging
2017-06-22 02:02:36 -07:00
65ef46ebdd Update the cp command docs to include archive
Signed-off-by: Boaz Shuster <ripcurld.github@gmail.com>
Upstream-commit: e4c70d390d
Component: cli
2017-06-21 13:20:47 +03:00
1965 changed files with 106946 additions and 61399 deletions

File diff suppressed because it is too large Load Diff

View File

@ -2,6 +2,125 @@
Want to contribute on Docker CE? Awesome!
This page contains information about reporting issues as well as some tips and
guidelines useful to experienced open source contributors. Finally, make sure
you read our [community guidelines](#docker-community-guidelines) before you
start participating.
## Topics
* [Reporting Security Issues](#reporting-security-issues)
* [Reporting Issues](#reporting-other-issues)
* [Submitting Pull Requests](#submitting-pull-requests)
* [Community Guidelines](#docker-community-guidelines)
## Reporting security issues
The Docker maintainers take security seriously. If you discover a security
issue, please bring it to their attention right away!
Please **DO NOT** file a public issue, instead send your report privately to
[security@docker.com](mailto:security@docker.com).
Security reports are greatly appreciated and we will publicly thank you for it.
We also like to send gifts&mdash;if you're into Docker schwag, make sure to let
us know. We currently do not offer a paid security bounty program, but are not
ruling it out in the future.
## Reporting other issues
There are separate issue-tracking repos for the end user Docker CE
products specialized for a platform. Find your issue or file a new issue
for the platform you are using:
* https://github.com/docker/for-linux
* https://github.com/docker/for-mac
* https://github.com/docker/for-win
* https://github.com/docker/for-aws
* https://github.com/docker/for-azure
When reporting issues, always include:
* The output of `docker version`.
* The output of `docker info`.
If presented with a template when creating an issue, please follow its directions.
Also include the steps required to reproduce the problem if possible and
applicable. This information will help us review and fix your issue faster.
When sending lengthy log-files, consider posting them as a gist (https://gist.github.com).
Don't forget to remove sensitive data from your logfiles before posting (you can
replace those parts with "REDACTED").
## Submitting pull requests
Please see the corresponding `CONTRIBUTING.md` file of each component for more information:
* Changes to the `engine` should be directed upstream to https://github.com/moby/moby
* Changes to the `cli` should be directed upstream to https://github.com/docker/cli
* Changes to the `packaging` should be directed upstream to https://github.com/docker/docker-ce-packaging
## Docker community guidelines
We want to keep the Docker community awesome, growing and collaborative. We need
your help to keep it that way. To help with this we've come up with some general
guidelines for the community as a whole:
* Be nice: Be courteous, respectful and polite to fellow community members.
Regional, racial, gender, or other abuse will not be tolerated. We like
nice people way better than mean ones!
* Encourage diversity and participation: Make everyone in our community feel
welcome, regardless of their background and the extent of their
contributions, and do everything possible to encourage participation in
our community.
* Keep it legal: Basically, don't get us in trouble. Share only content that
you own, do not share private or sensitive information, and don't break
the law.
* Stay on topic: Make sure that you are posting to the correct channel and
avoid off-topic discussions. Remember when you update an issue or respond
to an email you are potentially sending to a large number of people. Please
consider this before you update. Also remember that nobody likes spam.
* Don't send email to the maintainers: There's no need to send email to the
maintainers to ask them to investigate an issue or to take a look at a
pull request. Instead of sending an email, GitHub mentions should be
used to ping maintainers to review a pull request, a proposal or an
issue.
### Guideline violations — 3 strikes method
The point of this section is not to find opportunities to punish people, but we
do need a fair way to deal with people who are making our community suck.
1. First occurrence: We'll give you a friendly, but public reminder that the
behavior is inappropriate according to our guidelines.
2. Second occurrence: We will send you a private message with a warning that
any additional violations will result in removal from the community.
3. Third occurrence: Depending on the violation, we may need to delete or ban
your account.
**Notes:**
* Obvious spammers are banned on first occurrence. If we don't do this, we'll
have spam all over the place.
* Violations are forgiven after 6 months of good behavior, and we won't hold a
grudge.
* People who commit minor infractions will get some education, rather than
hammering them in the 3 strikes process.
* The rules apply equally to everyone in the community, no matter how much
you've contributed.
* Extreme violations of a threatening, abusive, destructive or illegal nature
will be addressed immediately and are not subject to 3 strikes or forgiveness.
* Contact abuse@docker.com to report abuse or appeal violations. In the case of
appeals, we know that mistakes happen, and we'll work with you to come up with a
fair solution if there has been a misunderstanding.

View File

@ -25,6 +25,3 @@ clean: ## clean the build artifacts
-$(MAKE) -C $(CLI_DIR) clean
-$(MAKE) -C $(ENGINE_DIR) clean
-$(MAKE) -C $(PACKAGING_DIR) clean
vendor: $(CLI_DIR)/build/docker
docker run --rm -it -v $(CLI_DIR):/go/src/github.com/docker/cli -v $(ENGINE_DIR):/go/src/github.com/docker/docker docker-cli-dev sh -c 'cd /go/src/github.com/docker/docker && git init && git add . && git -c user.name=user -c user.email=email@example.com commit -m first && cd /go/src/github.com/docker/cli && vndr; rm -rf /go/src/github.com/docker/docker/.git'

View File

@ -1 +1 @@
17.07.0-ce-rc4
17.09.1-ce-rc1

View File

@ -1,6 +1,7 @@
# Github code owners
# See https://github.com/blog/2392-introducing-code-owners
cli/command/stack/** @dnephin @vdemeester
cli/compose/** @dnephin @vdemeester
contrib/completion/bash/** @albers
contrib/completion/zsh/** @sdurrheimer

View File

@ -0,0 +1,365 @@
# Contributing to Docker
Want to hack on Docker? Awesome! We have a contributor's guide that explains
[setting up a Docker development environment and the contribution
process](https://docs.docker.com/opensource/project/who-written-for/).
This page contains information about reporting issues as well as some tips and
guidelines useful to experienced open source contributors. Finally, make sure
you read our [community guidelines](#docker-community-guidelines) before you
start participating.
## Topics
* [Reporting Security Issues](#reporting-security-issues)
* [Design and Cleanup Proposals](#design-and-cleanup-proposals)
* [Reporting Issues](#reporting-other-issues)
* [Quick Contribution Tips and Guidelines](#quick-contribution-tips-and-guidelines)
* [Community Guidelines](#docker-community-guidelines)
## Reporting security issues
The Docker maintainers take security seriously. If you discover a security
issue, please bring it to their attention right away!
Please **DO NOT** file a public issue, instead send your report privately to
[security@docker.com](mailto:security@docker.com).
Security reports are greatly appreciated and we will publicly thank you for it.
We also like to send gifts&mdash;if you're into Docker schwag, make sure to let
us know. We currently do not offer a paid security bounty program, but are not
ruling it out in the future.
## Reporting other issues
A great way to contribute to the project is to send a detailed report when you
encounter an issue. We always appreciate a well-written, thorough bug report,
and will thank you for it!
Check that [our issue database](https://github.com/docker/cli/issues)
doesn't already include that problem or suggestion before submitting an issue.
If you find a match, you can use the "subscribe" button to get notified on
updates. Do *not* leave random "+1" or "I have this too" comments, as they
only clutter the discussion, and don't help resolving it. However, if you
have ways to reproduce the issue or have additional information that may help
resolving the issue, please leave a comment.
When reporting issues, always include:
* The output of `docker version`.
* The output of `docker info`.
Also include the steps required to reproduce the problem if possible and
applicable. This information will help us review and fix your issue faster.
When sending lengthy log-files, consider posting them as a gist (https://gist.github.com).
Don't forget to remove sensitive data from your logfiles before posting (you can
replace those parts with "REDACTED").
## Quick contribution tips and guidelines
This section gives the experienced contributor some tips and guidelines.
### Pull requests are always welcome
Not sure if that typo is worth a pull request? Found a bug and know how to fix
it? Do it! We will appreciate it. Any significant improvement should be
documented as [a GitHub issue](https://github.com/docker/cli/issues) before
anybody starts working on it.
We are always thrilled to receive pull requests. We do our best to process them
quickly. If your pull request is not accepted on the first try,
don't get discouraged! Our contributor's guide explains [the review process we
use for simple changes](https://docs.docker.com/opensource/workflow/make-a-contribution/).
### Talking to other Docker users and contributors
<table class="tg">
<col width="45%">
<col width="65%">
<tr>
<td>Forums</td>
<td>
A public forum for users to discuss questions and explore current design patterns and
best practices about Docker and related projects in the Docker Ecosystem. To participate,
just log in with your Docker Hub account on <a href="https://forums.docker.com" target="_blank">https://forums.docker.com</a>.
</td>
</tr>
<tr>
<td>Community Slack</td>
<td>
The Docker Community has a dedicated Slack chat to discuss features and issues. You can sign-up <a href="https://community.docker.com/registrations/groups/4316" target="_blank">with this link</a>.
</td>
</tr>
<tr>
<td>Twitter</td>
<td>
You can follow <a href="https://twitter.com/docker/" target="_blank">Docker's Twitter feed</a>
to get updates on our products. You can also tweet us questions or just
share blogs or stories.
</td>
</tr>
<tr>
<td>Stack Overflow</td>
<td>
Stack Overflow has over 17000 Docker questions listed. We regularly
monitor <a href="https://stackoverflow.com/search?tab=newest&q=docker" target="_blank">Docker questions</a>
and so do many other knowledgeable Docker users.
</td>
</tr>
</table>
### Conventions
Fork the repository and make changes on your fork in a feature branch:
- If it's a bug fix branch, name it XXXX-something where XXXX is the number of
the issue.
- If it's a feature branch, create an enhancement issue to announce
your intentions, and name it XXXX-something where XXXX is the number of the
issue.
Submit unit tests for your changes. Go has a great test framework built in; use
it! Take a look at existing tests for inspiration. [Run the full test
suite](README.md) on your branch before
submitting a pull request.
Update the documentation when creating or modifying features. Test your
documentation changes for clarity, concision, and correctness, as well as a
clean documentation build. See our contributors guide for [our style
guide](https://docs.docker.com/opensource/doc-style) and instructions on [building
the documentation](https://docs.docker.com/opensource/project/test-and-docs/#build-and-test-the-documentation).
Write clean code. Universally formatted code promotes ease of writing, reading,
and maintenance. Always run `gofmt -s -w file.go` on each changed file before
committing your changes. Most editors have plug-ins that do this automatically.
Pull request descriptions should be as clear as possible and include a reference
to all the issues that they address.
Commit messages must start with a capitalized and short summary (max. 50 chars)
written in the imperative, followed by an optional, more detailed explanatory
text which is separated from the summary by an empty line.
Code review comments may be added to your pull request. Discuss, then make the
suggested modifications and push additional commits to your feature branch. Post
a comment after pushing. New commits show up in the pull request automatically,
but the reviewers are notified only when you comment.
Pull requests must be cleanly rebased on top of master without multiple branches
mixed into the PR.
**Git tip**: If your PR no longer merges cleanly, use `rebase master` in your
feature branch to update your pull request rather than `merge master`.
Before you make a pull request, squash your commits into logical units of work
using `git rebase -i` and `git push -f`. A logical unit of work is a consistent
set of patches that should be reviewed together: for example, upgrading the
version of a vendored dependency and taking advantage of its now available new
feature constitute two separate units of work. Implementing a new function and
calling it in another file constitute a single logical unit of work. The very
high majority of submissions should have a single commit, so if in doubt: squash
down to one.
After every commit, make sure the test suite passes. Include documentation
changes in the same pull request so that a revert would remove all traces of
the feature or fix.
Include an issue reference like `Closes #XXXX` or `Fixes #XXXX` in the pull request
description that close an issue. Including references automatically closes the issue
on a merge.
Please do not add yourself to the `AUTHORS` file, as it is regenerated regularly
from the Git history.
Please see the [Coding Style](#coding-style) for further guidelines.
### Merge approval
Docker maintainers use LGTM (Looks Good To Me) in comments on the code review to
indicate acceptance.
A change requires LGTMs from an absolute majority of the maintainers of each
component affected. For example, if a change affects `docs/` and `registry/`, it
needs an absolute majority from the maintainers of `docs/` AND, separately, an
absolute majority of the maintainers of `registry/`.
For more details, see the [MAINTAINERS](MAINTAINERS) page.
### Sign your work
The sign-off is a simple line at the end of the explanation for the patch. Your
signature certifies that you wrote the patch or otherwise have the right to pass
it on as an open-source patch. The rules are pretty simple: if you can certify
the below (from [developercertificate.org](http://developercertificate.org/)):
```
Developer Certificate of Origin
Version 1.1
Copyright (C) 2004, 2006 The Linux Foundation and its contributors.
660 York Street, Suite 102,
San Francisco, CA 94110 USA
Everyone is permitted to copy and distribute verbatim copies of this
license document, but changing it is not allowed.
Developer's Certificate of Origin 1.1
By making a contribution to this project, I certify that:
(a) The contribution was created in whole or in part by me and I
have the right to submit it under the open source license
indicated in the file; or
(b) The contribution is based upon previous work that, to the best
of my knowledge, is covered under an appropriate open source
license and I have the right under that license to submit that
work with modifications, whether created in whole or in part
by me, under the same open source license (unless I am
permitted to submit under a different license), as indicated
in the file; or
(c) The contribution was provided directly to me by some other
person who certified (a), (b) or (c) and I have not modified
it.
(d) I understand and agree that this project and the contribution
are public and that a record of the contribution (including all
personal information I submit with it, including my sign-off) is
maintained indefinitely and may be redistributed consistent with
this project or the open source license(s) involved.
```
Then you just add a line to every git commit message:
Signed-off-by: Joe Smith <joe.smith@email.com>
Use your real name (sorry, no pseudonyms or anonymous contributions.)
If you set your `user.name` and `user.email` git configs, you can sign your
commit automatically with `git commit -s`.
### How can I become a maintainer?
The procedures for adding new maintainers are explained in the
global [MAINTAINERS](https://github.com/docker/opensource/blob/master/MAINTAINERS)
file in the [https://github.com/docker/opensource/](https://github.com/docker/opensource/)
repository.
Don't forget: being a maintainer is a time investment. Make sure you
will have time to make yourself available. You don't have to be a
maintainer to make a difference on the project!
## Docker community guidelines
We want to keep the Docker community awesome, growing and collaborative. We need
your help to keep it that way. To help with this we've come up with some general
guidelines for the community as a whole:
* Be nice: Be courteous, respectful and polite to fellow community members:
no regional, racial, gender, or other abuse will be tolerated. We like
nice people way better than mean ones!
* Encourage diversity and participation: Make everyone in our community feel
welcome, regardless of their background and the extent of their
contributions, and do everything possible to encourage participation in
our community.
* Keep it legal: Basically, don't get us in trouble. Share only content that
you own, do not share private or sensitive information, and don't break
the law.
* Stay on topic: Make sure that you are posting to the correct channel and
avoid off-topic discussions. Remember when you update an issue or respond
to an email you are potentially sending to a large number of people. Please
consider this before you update. Also remember that nobody likes spam.
* Don't send email to the maintainers: There's no need to send email to the
maintainers to ask them to investigate an issue or to take a look at a
pull request. Instead of sending an email, GitHub mentions should be
used to ping maintainers to review a pull request, a proposal or an
issue.
### Guideline violations — 3 strikes method
The point of this section is not to find opportunities to punish people, but we
do need a fair way to deal with people who are making our community suck.
1. First occurrence: We'll give you a friendly, but public reminder that the
behavior is inappropriate according to our guidelines.
2. Second occurrence: We will send you a private message with a warning that
any additional violations will result in removal from the community.
3. Third occurrence: Depending on the violation, we may need to delete or ban
your account.
**Notes:**
* Obvious spammers are banned on first occurrence. If we don't do this, we'll
have spam all over the place.
* Violations are forgiven after 6 months of good behavior, and we won't hold a
grudge.
* People who commit minor infractions will get some education, rather than
hammering them in the 3 strikes process.
* The rules apply equally to everyone in the community, no matter how much
you've contributed.
* Extreme violations of a threatening, abusive, destructive or illegal nature
will be addressed immediately and are not subject to 3 strikes or forgiveness.
* Contact abuse@docker.com to report abuse or appeal violations. In the case of
appeals, we know that mistakes happen, and we'll work with you to come up with a
fair solution if there has been a misunderstanding.
## Coding Style
Unless explicitly stated, we follow all coding guidelines from the Go
community. While some of these standards may seem arbitrary, they somehow seem
to result in a solid, consistent codebase.
It is possible that the code base does not currently comply with these
guidelines. We are not looking for a massive PR that fixes this, since that
goes against the spirit of the guidelines. All new contributions should make a
best effort to clean up and make the code base better than they left it.
Obviously, apply your best judgement. Remember, the goal here is to make the
code base easier for humans to navigate and understand. Always keep that in
mind when nudging others to comply.
The rules:
1. All code should be formatted with `gofmt -s`.
2. All code should pass the default levels of
[`golint`](https://github.com/golang/lint).
3. All code should follow the guidelines covered in [Effective
Go](http://golang.org/doc/effective_go.html) and [Go Code Review
Comments](https://github.com/golang/go/wiki/CodeReviewComments).
4. Comment the code. Tell us the why, the history and the context.
5. Document _all_ declarations and methods, even private ones. Declare
expectations, caveats and anything else that may be important. If a type
gets exported, having the comments already there will ensure it's ready.
6. Variable name length should be proportional to its context and no longer.
`noCommaALongVariableNameLikeThisIsNotMoreClearWhenASimpleCommentWouldDo`.
In practice, short methods will have short variable names and globals will
have longer names.
7. No underscores in package names. If you need a compound name, step back,
and re-examine why you need a compound name. If you still think you need a
compound name, lose the underscore.
8. No utils or helpers packages. If a function is not general enough to
warrant its own package, it has not been written generally enough to be a
part of a util package. Just leave it unexported and well-documented.
9. All tests should run with `go test` and outside tooling should not be
required. No, we don't need another unit testing framework. Assertion
packages are acceptable if they provide _real_ incremental value.
10. Even though we call these "rules" above, they are actually just
guidelines. Since you've read all the rules, you now know that.
If you are having trouble getting into the mood of idiomatic Go, we recommend
reading through [Effective Go](https://golang.org/doc/effective_go.html). The
[Go Blog](https://blog.golang.org) is also a great resource. Drinking the
kool-aid is a lot easier than going thirsty.

12
components/cli/Jenkinsfile vendored Normal file
View File

@ -0,0 +1,12 @@
wrappedNode(label: 'linux && x86_64', cleanWorkspace: true) {
timeout(time: 60, unit: 'MINUTES') {
stage "Git Checkout"
checkout scm
stage "Run end-to-end test suite"
sh "docker version"
sh "E2E_UNIQUE_ID=clie2e${BUILD_NUMBER} \
IMAGE_TAG=clie2e${BUILD_NUMBER} \
make -f docker.Makefile test-e2e"
}
}

View File

@ -3,64 +3,75 @@
#
all: binary
# remove build artifacts
_:=$(shell ./scripts/warn-outside-container $(MAKECMDGOALS))
.PHONY: clean
clean:
clean: ## remove build artifacts
rm -rf ./build/* cli/winresources/rsrc_* ./man/man[1-9] docs/yaml/gen
# run go test
# the "-tags daemon" part is temporary
.PHONY: test-unit
test-unit: ## run unit test
./scripts/test/unit $(shell go list ./... | grep -vE '/vendor/|/e2e/')
.PHONY: test
test:
./scripts/test/unit $(shell go list ./... | grep -v '/vendor/')
test: test-unit ## run tests
.PHONY: test-coverage
test-coverage:
./scripts/test/unit-with-coverage $(shell go list ./... | grep -v '/vendor/')
test-coverage: ## run test coverage
./scripts/test/unit-with-coverage $(shell go list ./... | grep -vE '/vendor/|/e2e/')
.PHONY: lint
lint:
lint: ## run all the lint tools
gometalinter --config gometalinter.json ./...
.PHONY: binary
binary:
binary: ## build executable for Linux
@echo "WARNING: binary creates a Linux executable. Use cross for macOS or Windows."
./scripts/build/binary
.PHONY: cross
cross:
cross: ## build executable for macOS and Windows
./scripts/build/cross
.PHONY: dynbinary
dynbinary:
dynbinary: ## build dynamically linked binary
./scripts/build/dynbinary
.PHONY: watch
watch:
watch: ## monitor file changes and run go test
./scripts/test/watch
# Check vendor matches vendor.conf
vendor: vendor.conf
vendor: vendor.conf ## check that vendor matches vendor.conf
vndr 2> /dev/null
scripts/validate/check-git-diff vendor
## generate man pages from go source and markdown
.PHONY: manpages
manpages:
manpages: ## generate man pages from go source and markdown
scripts/docs/generate-man.sh
## generate documentation YAML files consumed by docs repo
.PHONY: yamldocs
yamldocs:
yamldocs: ## generate documentation YAML files consumed by docs repo
scripts/docs/generate-yaml.sh
## Shellcheck validation
.PHONY: shellcheck
shellcheck:
shellcheck: ## run shellcheck validation
scripts/validate/shellcheck
.PHONY: help
help: ## print this help
@awk 'BEGIN {FS = ":.*?## "} /^[a-zA-Z_-]+:.*?## / {sub("\\\\n",sprintf("\n%22c"," "), $$2);printf "\033[36m%-20s\033[0m %s\n", $$1, $$2}' $(MAKEFILE_LIST)
cli/compose/schema/bindata.go: cli/compose/schema/data/*.json
go generate github.com/docker/cli/cli/compose/schema
compose-jsonschema: cli/compose/schema/bindata.go
scripts/validate/check-git-diff cli/compose/schema/bindata.go
.PHONY: ci-validate
ci-validate:
time make -B vendor
time make -B compose-jsonschema
time make manpages
time make yamldocs

View File

@ -29,6 +29,12 @@ Run all linting:
$ make -f docker.Makefile lint
```
List all the available targets:
```
$ make help
```
### In-container development environment
Start an interactive development environment:

87
components/cli/TESTING.md Normal file
View File

@ -0,0 +1,87 @@
# Testing
The following guidelines summarize the testing policy for docker/cli.
## Unit Test Suite
All code changes should have unit test coverage.
Error cases should be tested with unit tests.
Bug fixes should be covered by new unit tests or additional assertions in
existing unit tests.
### Details
The unit test suite follows the standard Go testing convention. Tests are
located in the package directory in `_test.go` files.
Unit tests should be named using the convention:
```
Test<Function Name><Test Case Name>
```
[Table tests](https://github.com/golang/go/wiki/TableDrivenTests) should be used
where appropriate, but may not be appropriate in all cases.
Assertions should be made using
[testify/assert](https://godoc.org/github.com/stretchr/testify/assert) and test
requirements should be verified using
[testify/require](https://godoc.org/github.com/stretchr/testify/require).
Fakes, and testing utilities can be found in
[internal/test](https://godoc.org/github.com/docker/cli/internal/test) and
[gotestyourself](https://godoc.org/github.com/gotestyourself/gotestyourself).
## End-to-End Test Suite
The end-to-end test suite tests a cli binary against a real API backend.
### Guidelines
Each feature (subcommand) should have a single end-to-end test for
the success case. The test should include all (or most) flags/options supported
by that feature.
In some rare cases a couple additional end-to-end tests may be written for a
sufficiently complex and critical feature (ex: `container run`, `service
create`, `service update`, and `docker build` may have ~3-5 cases each).
In some rare cases a sufficiently critical error paths may have a single
end-to-end test case.
In all other cases the behaviour should be covered by unit tests.
If a code change adds a new flag, that flag should be added to the existing
"success case" end-to-end test.
If a code change fixes a bug, that bug fix should be covered either by adding
assertions to the existing end-to-end test, or with one or more unit test.
### Details
The end-to-end test suite is located in
[./e2e](https://github.com/docker/cli/tree/master/e2e). Each directory in `e2e`
corresponds to a directory in `cli/command` and contains the tests for that
subcommand. Files in each directory should be named `<command>_test.go` where
command is the basename of the command (ex: the test for `docker stack deploy`
is found in `e2e/stack/deploy_test.go`).
Tests should be named using the convention:
```
Test<Command Basename>[<Test Case Name>]
```
where the test case name is only required when there are multiple test cases for
a single command.
End-to-end test should run the `docker` binary using
[gotestyourself/icmd](https://godoc.org/github.com/gotestyourself/gotestyourself/icmd)
and make assertions about the exit code, stdout, stderr, and local file system.
Any Docker image or registry operations should use `registry:5000/<image name>`
to communicate with the local instance of the Docker registry. To load
additional fixture images to the registry see
[scripts/test/e2e/run](https://github.com/docker/cli/blob/master/scripts/test/e2e/run).

View File

@ -1 +1 @@
17.07.0-ce-rc4
17.09.1-ce-rc1

View File

@ -71,7 +71,8 @@ jobs:
test-$CIRCLE_BUILD_NUM:/go/src/github.com/docker/cli/coverage.txt \
coverage.txt
apk add -U bash curl
curl -s https://codecov.io/bash | bash
curl -s https://codecov.io/bash | bash || \
echo 'Codecov failed to upload'
validate:
working_directory: /work
@ -89,7 +90,7 @@ jobs:
rm -f .dockerignore # include .git
docker build -f $dockerfile --tag cli-builder-with-git:$CIRCLE_BUILD_NUM .
docker run --rm cli-builder-with-git:$CIRCLE_BUILD_NUM \
make -B vendor compose-jsonschema manpages yamldocs
make ci-validate
shellcheck:
working_directory: /work
docker: [{image: 'docker:17.06-git'}]
@ -103,7 +104,7 @@ jobs:
echo "COPY . ." >> $dockerfile
docker build -f $dockerfile --tag cli-validator:$CIRCLE_BUILD_NUM .
docker run --rm cli-validator:$CIRCLE_BUILD_NUM \
make -B shellcheck
make shellcheck
workflows:
version: 2
ci:

View File

@ -5,9 +5,9 @@ import (
"strings"
"testing"
"github.com/docker/cli/cli/internal/test"
"github.com/docker/cli/internal/test"
"github.com/docker/cli/internal/test/testutil"
"github.com/docker/docker/api/types"
"github.com/docker/docker/pkg/testutil"
"github.com/pkg/errors"
"github.com/stretchr/testify/assert"
)
@ -20,11 +20,11 @@ func TestCheckpointCreateErrors(t *testing.T) {
}{
{
args: []string{"too-few-arguments"},
expectedError: "requires exactly 2 argument(s)",
expectedError: "requires exactly 2 arguments",
},
{
args: []string{"too", "many", "arguments"},
expectedError: "requires exactly 2 argument(s)",
expectedError: "requires exactly 2 arguments",
},
{
args: []string{"foo", "bar"},

View File

@ -1,14 +1,13 @@
package checkpoint
import (
"bytes"
"io/ioutil"
"testing"
"github.com/docker/cli/cli/internal/test"
"github.com/docker/cli/internal/test"
"github.com/docker/cli/internal/test/testutil"
"github.com/docker/docker/api/types"
"github.com/docker/docker/pkg/testutil"
"github.com/docker/docker/pkg/testutil/golden"
"github.com/gotestyourself/gotestyourself/golden"
"github.com/pkg/errors"
"github.com/stretchr/testify/assert"
)
@ -37,9 +36,9 @@ func TestCheckpointListErrors(t *testing.T) {
}
for _, tc := range testCases {
cli := test.NewFakeCliWithOutput(&fakeClient{
cli := test.NewFakeCli(&fakeClient{
checkpointListFunc: tc.checkpointListFunc,
}, &bytes.Buffer{})
})
cmd := newListCommand(cli)
cmd.SetArgs(tc.args)
cmd.SetOutput(ioutil.Discard)
@ -49,8 +48,7 @@ func TestCheckpointListErrors(t *testing.T) {
func TestCheckpointListWithOptions(t *testing.T) {
var containerID, checkpointDir string
buf := new(bytes.Buffer)
cli := test.NewFakeCliWithOutput(&fakeClient{
cli := test.NewFakeCli(&fakeClient{
checkpointListFunc: func(container string, options types.CheckpointListOptions) ([]types.Checkpoint, error) {
containerID = container
checkpointDir = options.CheckpointDir
@ -58,14 +56,12 @@ func TestCheckpointListWithOptions(t *testing.T) {
{Name: "checkpoint-foo"},
}, nil
},
}, buf)
})
cmd := newListCommand(cli)
cmd.SetArgs([]string{"container-foo"})
cmd.Flags().Set("checkpoint-dir", "/dir/foo")
assert.NoError(t, cmd.Execute())
assert.Equal(t, "container-foo", containerID)
assert.Equal(t, "/dir/foo", checkpointDir)
actual := buf.String()
expected := golden.Get(t, []byte(actual), "checkpoint-list-with-options.golden")
testutil.EqualNormalizedString(t, testutil.RemoveSpace, actual, string(expected))
golden.Assert(t, cli.OutBuffer().String(), "checkpoint-list-with-options.golden")
}

View File

@ -1,13 +1,12 @@
package checkpoint
import (
"bytes"
"io/ioutil"
"testing"
"github.com/docker/cli/cli/internal/test"
"github.com/docker/cli/internal/test"
"github.com/docker/cli/internal/test/testutil"
"github.com/docker/docker/api/types"
"github.com/docker/docker/pkg/testutil"
"github.com/pkg/errors"
"github.com/stretchr/testify/assert"
)
@ -20,11 +19,11 @@ func TestCheckpointRemoveErrors(t *testing.T) {
}{
{
args: []string{"too-few-arguments"},
expectedError: "requires exactly 2 argument(s)",
expectedError: "requires exactly 2 arguments",
},
{
args: []string{"too", "many", "arguments"},
expectedError: "requires exactly 2 argument(s)",
expectedError: "requires exactly 2 arguments",
},
{
args: []string{"foo", "bar"},
@ -36,9 +35,9 @@ func TestCheckpointRemoveErrors(t *testing.T) {
}
for _, tc := range testCases {
cli := test.NewFakeCliWithOutput(&fakeClient{
cli := test.NewFakeCli(&fakeClient{
checkpointDeleteFunc: tc.checkpointDeleteFunc,
}, &bytes.Buffer{})
})
cmd := newRemoveCommand(cli)
cmd.SetArgs(tc.args)
cmd.SetOutput(ioutil.Discard)
@ -48,14 +47,14 @@ func TestCheckpointRemoveErrors(t *testing.T) {
func TestCheckpointRemoveWithOptions(t *testing.T) {
var containerID, checkpointID, checkpointDir string
cli := test.NewFakeCliWithOutput(&fakeClient{
cli := test.NewFakeCli(&fakeClient{
checkpointDeleteFunc: func(container string, options types.CheckpointDeleteOptions) error {
containerID = container
checkpointID = options.CheckpointID
checkpointDir = options.CheckpointDir
return nil
},
}, &bytes.Buffer{})
})
cmd := newRemoveCommand(cli)
cmd.SetArgs([]string{"container-foo", "checkpoint-bar"})
cmd.Flags().Set("checkpoint-dir", "/dir/foo")

View File

@ -17,6 +17,7 @@ import (
"github.com/docker/docker/client"
"github.com/docker/go-connections/sockets"
"github.com/docker/go-connections/tlsconfig"
"github.com/docker/notary"
"github.com/docker/notary/passphrase"
"github.com/pkg/errors"
"github.com/spf13/cobra"
@ -111,44 +112,53 @@ func (cli *DockerCli) Initialize(opts *cliflags.ClientOptions) error {
var err error
cli.client, err = NewAPIClientFromFlags(opts.Common, cli.configFile)
if tlsconfig.IsErrEncryptedKey(err) {
var (
passwd string
giveup bool
)
passRetriever := passphrase.PromptRetrieverWithInOut(cli.In(), cli.Out(), nil)
for attempts := 0; tlsconfig.IsErrEncryptedKey(err); attempts++ {
// some code and comments borrowed from notary/trustmanager/keystore.go
passwd, giveup, err = passRetriever("private", "encrypted TLS private", false, attempts)
// Check if the passphrase retriever got an error or if it is telling us to give up
if giveup || err != nil {
return errors.Wrap(err, "private key is encrypted, but could not get passphrase")
}
opts.Common.TLSOptions.Passphrase = passwd
cli.client, err = NewAPIClientFromFlags(opts.Common, cli.configFile)
newClient := func(password string) (client.APIClient, error) {
opts.Common.TLSOptions.Passphrase = password
return NewAPIClientFromFlags(opts.Common, cli.configFile)
}
cli.client, err = getClientWithPassword(passRetriever, newClient)
}
if err != nil {
return err
}
cli.initializeFromClient()
return nil
}
func (cli *DockerCli) initializeFromClient() {
cli.defaultVersion = cli.client.ClientVersion()
if ping, err := cli.client.Ping(context.Background()); err == nil {
cli.server = ServerInfo{
HasExperimental: ping.Experimental,
OSType: ping.OSType,
}
cli.client.NegotiateAPIVersionPing(ping)
} else {
ping, err := cli.client.Ping(context.Background())
if err != nil {
// Default to true if we fail to connect to daemon
cli.server = ServerInfo{HasExperimental: true}
if ping.APIVersion != "" {
cli.client.NegotiateAPIVersionPing(ping)
}
return
}
return nil
cli.server = ServerInfo{
HasExperimental: ping.Experimental,
OSType: ping.OSType,
}
cli.client.NegotiateAPIVersionPing(ping)
}
func getClientWithPassword(passRetriever notary.PassRetriever, newClient func(password string) (client.APIClient, error)) (client.APIClient, error) {
for attempts := 0; ; attempts++ {
passwd, giveup, err := passRetriever("private", "encrypted TLS private", false, attempts)
if giveup || err != nil {
return nil, errors.Wrap(err, "private key is encrypted, but could not get passphrase")
}
apiclient, err := newClient(passwd)
if !tlsconfig.IsErrEncryptedKey(err) {
return apiclient, err
}
}
}
// ServerInfo stores details about the supported features and platform of the

View File

@ -0,0 +1,198 @@
package command
import (
"os"
"testing"
"crypto/x509"
"github.com/docker/cli/cli/config/configfile"
"github.com/docker/cli/cli/flags"
"github.com/docker/cli/internal/test/testutil"
"github.com/docker/docker/api"
"github.com/docker/docker/api/types"
"github.com/docker/docker/client"
"github.com/pkg/errors"
"github.com/stretchr/testify/assert"
"github.com/stretchr/testify/require"
"golang.org/x/net/context"
)
func TestNewAPIClientFromFlags(t *testing.T) {
host := "unix://path"
opts := &flags.CommonOptions{Hosts: []string{host}}
configFile := &configfile.ConfigFile{
HTTPHeaders: map[string]string{
"My-Header": "Custom-Value",
},
}
apiclient, err := NewAPIClientFromFlags(opts, configFile)
require.NoError(t, err)
assert.Equal(t, host, apiclient.DaemonHost())
expectedHeaders := map[string]string{
"My-Header": "Custom-Value",
"User-Agent": UserAgent(),
}
assert.Equal(t, expectedHeaders, apiclient.(*client.Client).CustomHTTPHeaders())
assert.Equal(t, api.DefaultVersion, apiclient.ClientVersion())
}
func TestNewAPIClientFromFlagsWithAPIVersionFromEnv(t *testing.T) {
customVersion := "v3.3.3"
defer patchEnvVariable(t, "DOCKER_API_VERSION", customVersion)()
opts := &flags.CommonOptions{}
configFile := &configfile.ConfigFile{}
apiclient, err := NewAPIClientFromFlags(opts, configFile)
require.NoError(t, err)
assert.Equal(t, customVersion, apiclient.ClientVersion())
}
// TODO: use gotestyourself/env.Patch
func patchEnvVariable(t *testing.T, key, value string) func() {
oldValue, ok := os.LookupEnv(key)
require.NoError(t, os.Setenv(key, value))
return func() {
if !ok {
require.NoError(t, os.Unsetenv(key))
return
}
require.NoError(t, os.Setenv(key, oldValue))
}
}
type fakeClient struct {
client.Client
pingFunc func() (types.Ping, error)
version string
negotiated bool
}
func (c *fakeClient) Ping(_ context.Context) (types.Ping, error) {
return c.pingFunc()
}
func (c *fakeClient) ClientVersion() string {
return c.version
}
func (c *fakeClient) NegotiateAPIVersionPing(types.Ping) {
c.negotiated = true
}
func TestInitializeFromClient(t *testing.T) {
defaultVersion := "v1.55"
var testcases = []struct {
doc string
pingFunc func() (types.Ping, error)
expectedServer ServerInfo
negotiated bool
}{
{
doc: "successful ping",
pingFunc: func() (types.Ping, error) {
return types.Ping{Experimental: true, OSType: "linux", APIVersion: "v1.30"}, nil
},
expectedServer: ServerInfo{HasExperimental: true, OSType: "linux"},
negotiated: true,
},
{
doc: "failed ping, no API version",
pingFunc: func() (types.Ping, error) {
return types.Ping{}, errors.New("failed")
},
expectedServer: ServerInfo{HasExperimental: true},
},
{
doc: "failed ping, with API version",
pingFunc: func() (types.Ping, error) {
return types.Ping{APIVersion: "v1.33"}, errors.New("failed")
},
expectedServer: ServerInfo{HasExperimental: true},
negotiated: true,
},
}
for _, testcase := range testcases {
t.Run(testcase.doc, func(t *testing.T) {
apiclient := &fakeClient{
pingFunc: testcase.pingFunc,
version: defaultVersion,
}
cli := &DockerCli{client: apiclient}
cli.initializeFromClient()
assert.Equal(t, defaultVersion, cli.defaultVersion)
assert.Equal(t, testcase.expectedServer, cli.server)
assert.Equal(t, testcase.negotiated, apiclient.negotiated)
})
}
}
func TestGetClientWithPassword(t *testing.T) {
expected := "password"
var testcases = []struct {
doc string
password string
retrieverErr error
retrieverGiveup bool
newClientErr error
expectedErr string
}{
{
doc: "successful connect",
password: expected,
},
{
doc: "password retriever exhausted",
retrieverGiveup: true,
retrieverErr: errors.New("failed"),
expectedErr: "private key is encrypted, but could not get passphrase",
},
{
doc: "password retriever error",
retrieverErr: errors.New("failed"),
expectedErr: "failed",
},
{
doc: "newClient error",
newClientErr: errors.New("failed to connect"),
expectedErr: "failed to connect",
},
}
for _, testcase := range testcases {
t.Run(testcase.doc, func(t *testing.T) {
passRetriever := func(_, _ string, _ bool, attempts int) (passphrase string, giveup bool, err error) {
// Always return an invalid pass first to test iteration
switch attempts {
case 0:
return "something else", false, nil
default:
return testcase.password, testcase.retrieverGiveup, testcase.retrieverErr
}
}
newClient := func(currentPassword string) (client.APIClient, error) {
if testcase.newClientErr != nil {
return nil, testcase.newClientErr
}
if currentPassword == expected {
return &client.Client{}, nil
}
return &client.Client{}, x509.IncorrectPasswordError
}
_, err := getClientWithPassword(passRetriever, newClient)
if testcase.expectedErr != "" {
testutil.ErrorContains(t, err, testcase.expectedErr)
return
}
assert.NoError(t, err)
})
}
}

View File

@ -7,11 +7,11 @@ import (
"strings"
"testing"
"github.com/docker/cli/cli/internal/test"
"github.com/docker/cli/internal/test"
"github.com/docker/cli/internal/test/testutil"
"github.com/docker/docker/api/types"
"github.com/docker/docker/api/types/swarm"
"github.com/docker/docker/pkg/testutil"
"github.com/docker/docker/pkg/testutil/golden"
"github.com/gotestyourself/gotestyourself/golden"
"github.com/pkg/errors"
"github.com/stretchr/testify/assert"
)
@ -26,10 +26,10 @@ func TestConfigCreateErrors(t *testing.T) {
}{
{
args: []string{"too_few"},
expectedError: "requires exactly 2 argument(s)",
expectedError: "requires exactly 2 arguments",
},
{args: []string{"too", "many", "arguments"},
expectedError: "requires exactly 2 argument(s)",
expectedError: "requires exactly 2 arguments",
},
{
args: []string{"name", filepath.Join("testdata", configDataFile)},
@ -71,8 +71,7 @@ func TestConfigCreateWithName(t *testing.T) {
cmd := newConfigCreateCommand(cli)
cmd.SetArgs([]string{name, filepath.Join("testdata", configDataFile)})
assert.NoError(t, cmd.Execute())
expected := golden.Get(t, actual, configDataFile)
assert.Equal(t, string(expected), string(actual))
golden.Assert(t, string(actual), configDataFile)
assert.Equal(t, "ID-"+name, strings.TrimSpace(cli.OutBuffer().String()))
}

View File

@ -1,19 +1,18 @@
package config
import (
"bytes"
"fmt"
"io/ioutil"
"testing"
"time"
"github.com/docker/cli/cli/internal/test"
"github.com/docker/cli/internal/test"
"github.com/docker/docker/api/types/swarm"
"github.com/pkg/errors"
// Import builders to get the builder function as package function
. "github.com/docker/cli/cli/internal/test/builders"
"github.com/docker/docker/pkg/testutil"
"github.com/docker/docker/pkg/testutil/golden"
. "github.com/docker/cli/internal/test/builders"
"github.com/docker/cli/internal/test/testutil"
"github.com/gotestyourself/gotestyourself/golden"
"github.com/stretchr/testify/assert"
)
@ -53,11 +52,10 @@ func TestConfigInspectErrors(t *testing.T) {
},
}
for _, tc := range testCases {
buf := new(bytes.Buffer)
cmd := newConfigInspectCommand(
test.NewFakeCliWithOutput(&fakeClient{
test.NewFakeCli(&fakeClient{
configInspectFunc: tc.configInspectFunc,
}, buf),
}),
)
cmd.SetArgs(tc.args)
for key, value := range tc.flags {
@ -95,17 +93,11 @@ func TestConfigInspectWithoutFormat(t *testing.T) {
},
}
for _, tc := range testCases {
buf := new(bytes.Buffer)
cmd := newConfigInspectCommand(
test.NewFakeCliWithOutput(&fakeClient{
configInspectFunc: tc.configInspectFunc,
}, buf),
)
cli := test.NewFakeCli(&fakeClient{configInspectFunc: tc.configInspectFunc})
cmd := newConfigInspectCommand(cli)
cmd.SetArgs(tc.args)
assert.NoError(t, cmd.Execute())
actual := buf.String()
expected := golden.Get(t, []byte(actual), fmt.Sprintf("config-inspect-without-format.%s.golden", tc.name))
testutil.EqualNormalizedString(t, testutil.RemoveSpace, actual, string(expected))
golden.Assert(t, cli.OutBuffer().String(), fmt.Sprintf("config-inspect-without-format.%s.golden", tc.name))
}
}
@ -135,18 +127,14 @@ func TestConfigInspectWithFormat(t *testing.T) {
},
}
for _, tc := range testCases {
buf := new(bytes.Buffer)
cmd := newConfigInspectCommand(
test.NewFakeCliWithOutput(&fakeClient{
configInspectFunc: tc.configInspectFunc,
}, buf),
)
cli := test.NewFakeCli(&fakeClient{
configInspectFunc: tc.configInspectFunc,
})
cmd := newConfigInspectCommand(cli)
cmd.SetArgs(tc.args)
cmd.Flags().Set("format", tc.format)
assert.NoError(t, cmd.Execute())
actual := buf.String()
expected := golden.Get(t, []byte(actual), fmt.Sprintf("config-inspect-with-format.%s.golden", tc.name))
testutil.EqualNormalizedString(t, testutil.RemoveSpace, actual, string(expected))
golden.Assert(t, cli.OutBuffer().String(), fmt.Sprintf("config-inspect-with-format.%s.golden", tc.name))
}
}
@ -172,16 +160,14 @@ func TestConfigInspectPretty(t *testing.T) {
},
}
for _, tc := range testCases {
buf := new(bytes.Buffer)
cmd := newConfigInspectCommand(
test.NewFakeCliWithOutput(&fakeClient{
configInspectFunc: tc.configInspectFunc,
}, buf))
cli := test.NewFakeCli(&fakeClient{
configInspectFunc: tc.configInspectFunc,
})
cmd := newConfigInspectCommand(cli)
cmd.SetArgs([]string{"configID"})
cmd.Flags().Set("pretty", "true")
assert.NoError(t, cmd.Execute())
actual := buf.String()
expected := golden.Get(t, []byte(actual), fmt.Sprintf("config-inspect-pretty.%s.golden", tc.name))
testutil.EqualNormalizedString(t, testutil.RemoveSpace, actual, string(expected))
golden.Assert(t, cli.OutBuffer().String(), fmt.Sprintf("config-inspect-pretty.%s.golden", tc.name))
}
}

View File

@ -6,14 +6,14 @@ import (
"time"
"github.com/docker/cli/cli/config/configfile"
"github.com/docker/cli/cli/internal/test"
"github.com/docker/cli/internal/test"
"github.com/docker/docker/api/types"
"github.com/docker/docker/api/types/swarm"
"github.com/pkg/errors"
// Import builders to get the builder function as package function
. "github.com/docker/cli/cli/internal/test/builders"
"github.com/docker/docker/pkg/testutil"
"github.com/docker/docker/pkg/testutil/golden"
. "github.com/docker/cli/internal/test/builders"
"github.com/docker/cli/internal/test/testutil"
"github.com/gotestyourself/gotestyourself/golden"
"github.com/stretchr/testify/assert"
)
@ -68,9 +68,7 @@ func TestConfigList(t *testing.T) {
cmd := newConfigListCommand(cli)
cmd.SetOutput(cli.OutBuffer())
assert.NoError(t, cmd.Execute())
actual := cli.OutBuffer().String()
expected := golden.Get(t, []byte(actual), "config-list.golden")
testutil.EqualNormalizedString(t, testutil.RemoveSpace, actual, string(expected))
golden.Assert(t, cli.OutBuffer().String(), "config-list.golden")
}
func TestConfigListWithQuietOption(t *testing.T) {
@ -87,9 +85,7 @@ func TestConfigListWithQuietOption(t *testing.T) {
cmd := newConfigListCommand(cli)
cmd.Flags().Set("quiet", "true")
assert.NoError(t, cmd.Execute())
actual := cli.OutBuffer().String()
expected := golden.Get(t, []byte(actual), "config-list-with-quiet-option.golden")
testutil.EqualNormalizedString(t, testutil.RemoveSpace, actual, string(expected))
golden.Assert(t, cli.OutBuffer().String(), "config-list-with-quiet-option.golden")
}
func TestConfigListWithConfigFormat(t *testing.T) {
@ -108,9 +104,7 @@ func TestConfigListWithConfigFormat(t *testing.T) {
})
cmd := newConfigListCommand(cli)
assert.NoError(t, cmd.Execute())
actual := cli.OutBuffer().String()
expected := golden.Get(t, []byte(actual), "config-list-with-config-format.golden")
testutil.EqualNormalizedString(t, testutil.RemoveSpace, actual, string(expected))
golden.Assert(t, cli.OutBuffer().String(), "config-list-with-config-format.golden")
}
func TestConfigListWithFormat(t *testing.T) {
@ -127,9 +121,7 @@ func TestConfigListWithFormat(t *testing.T) {
cmd := newConfigListCommand(cli)
cmd.Flags().Set("format", "{{ .Name }} {{ .Labels }}")
assert.NoError(t, cmd.Execute())
actual := cli.OutBuffer().String()
expected := golden.Get(t, []byte(actual), "config-list-with-format.golden")
testutil.EqualNormalizedString(t, testutil.RemoveSpace, actual, string(expected))
golden.Assert(t, cli.OutBuffer().String(), "config-list-with-format.golden")
}
func TestConfigListWithFilter(t *testing.T) {
@ -157,7 +149,5 @@ func TestConfigListWithFilter(t *testing.T) {
cmd.Flags().Set("filter", "name=foo")
cmd.Flags().Set("filter", "label=lbl1=Label-bar")
assert.NoError(t, cmd.Execute())
actual := cli.OutBuffer().String()
expected := golden.Get(t, []byte(actual), "config-list-with-filter.golden")
testutil.EqualNormalizedString(t, testutil.RemoveSpace, actual, string(expected))
golden.Assert(t, cli.OutBuffer().String(), "config-list-with-filter.golden")
}

View File

@ -1,13 +1,12 @@
package config
import (
"bytes"
"io/ioutil"
"strings"
"testing"
"github.com/docker/cli/cli/internal/test"
"github.com/docker/docker/pkg/testutil"
"github.com/docker/cli/internal/test"
"github.com/docker/cli/internal/test/testutil"
"github.com/pkg/errors"
"github.com/stretchr/testify/assert"
)
@ -20,7 +19,7 @@ func TestConfigRemoveErrors(t *testing.T) {
}{
{
args: []string{},
expectedError: "requires at least 1 argument(s).",
expectedError: "requires at least 1 argument.",
},
{
args: []string{"foo"},
@ -31,11 +30,10 @@ func TestConfigRemoveErrors(t *testing.T) {
},
}
for _, tc := range testCases {
buf := new(bytes.Buffer)
cmd := newConfigRemoveCommand(
test.NewFakeCliWithOutput(&fakeClient{
test.NewFakeCli(&fakeClient{
configRemoveFunc: tc.configRemoveFunc,
}, buf),
}),
)
cmd.SetArgs(tc.args)
cmd.SetOutput(ioutil.Discard)
@ -45,27 +43,25 @@ func TestConfigRemoveErrors(t *testing.T) {
func TestConfigRemoveWithName(t *testing.T) {
names := []string{"foo", "bar"}
buf := new(bytes.Buffer)
var removedConfigs []string
cli := test.NewFakeCliWithOutput(&fakeClient{
cli := test.NewFakeCli(&fakeClient{
configRemoveFunc: func(name string) error {
removedConfigs = append(removedConfigs, name)
return nil
},
}, buf)
})
cmd := newConfigRemoveCommand(cli)
cmd.SetArgs(names)
assert.NoError(t, cmd.Execute())
assert.Equal(t, names, strings.Split(strings.TrimSpace(buf.String()), "\n"))
assert.Equal(t, names, strings.Split(strings.TrimSpace(cli.OutBuffer().String()), "\n"))
assert.Equal(t, names, removedConfigs)
}
func TestConfigRemoveContinueAfterError(t *testing.T) {
names := []string{"foo", "bar"}
buf := new(bytes.Buffer)
var removedConfigs []string
cli := test.NewFakeCliWithOutput(&fakeClient{
cli := test.NewFakeCli(&fakeClient{
configRemoveFunc: func(name string) error {
removedConfigs = append(removedConfigs, name)
if name == "foo" {
@ -73,7 +69,7 @@ func TestConfigRemoveContinueAfterError(t *testing.T) {
}
return nil
},
}, buf)
})
cmd := newConfigRemoveCommand(cli)
cmd.SetArgs(names)

View File

@ -1,8 +1,8 @@
ID: configID
Name: configName
ID: configID
Name: configName
Labels:
- lbl1=value1
Created at: 0001-01-01 00:00:00+0000 utc
Updated at: 0001-01-01 00:00:00+0000 utc
- lbl1=value1
Created at: 0001-01-01 00:00:00 +0000 utc
Updated at: 0001-01-01 00:00:00 +0000 utc
Data:
payload here

View File

@ -1,7 +1,7 @@
[
{
"ID": "ID-foo",
"Version": {},
"Version": {},
"CreatedAt": "0001-01-01T00:00:00Z",
"UpdatedAt": "0001-01-01T00:00:00Z",
"Spec": {
@ -13,7 +13,7 @@
},
{
"ID": "ID-bar",
"Version": {},
"Version": {},
"CreatedAt": "0001-01-01T00:00:00Z",
"UpdatedAt": "0001-01-01T00:00:00Z",
"Spec": {

View File

@ -1,9 +1,9 @@
[
{
"ID": "ID-foo",
"Version": {},
"CreatedAt": "0001-01-01T00:00:00Z",
"UpdatedAt": "0001-01-01T00:00:00Z",
"Version": {},
"CreatedAt": "0001-01-01T00:00:00Z",
"UpdatedAt": "0001-01-01T00:00:00Z",
"Spec": {
"Name": "foo",
"Labels": null

View File

@ -1,2 +1,2 @@
foo
foo
bar label=label-bar

View File

@ -1,2 +1,2 @@
foo
foo
bar label=label-bar

View File

@ -4,13 +4,13 @@ import (
"io"
"net/http/httputil"
"github.com/Sirupsen/logrus"
"github.com/docker/cli/cli"
"github.com/docker/cli/cli/command"
"github.com/docker/docker/api/types"
"github.com/docker/docker/client"
"github.com/docker/docker/pkg/signal"
"github.com/pkg/errors"
"github.com/sirupsen/logrus"
"github.com/spf13/cobra"
"golang.org/x/net/context"
)
@ -120,18 +120,7 @@ func runAttach(dockerCli command.Cli, opts *attachOptions) error {
}
if c.Config.Tty && dockerCli.Out().IsTerminal() {
height, width := dockerCli.Out().GetTtySize()
// To handle the case where a user repeatedly attaches/detaches without resizing their
// terminal, the only way to get the shell prompt to display for attaches 2+ is to artificially
// resize it, then go back to normal. Without this, every attach after the first will
// require the user to manually resize or hit enter.
resizeTtyTo(ctx, client, opts.container, height+1, width+1, false)
// After the above resizing occurs, the call to MonitorTtySize below will handle resetting back
// to the actual size.
if err := MonitorTtySize(ctx, dockerCli, opts.container, false); err != nil {
logrus.Debugf("Error monitoring TTY size: %s", err)
}
resizeTTY(ctx, dockerCli, opts.container)
}
streamer := hijackedIOStreamer{
@ -151,14 +140,36 @@ func runAttach(dockerCli command.Cli, opts *attachOptions) error {
if errAttach != nil {
return errAttach
}
return getExitStatus(ctx, dockerCli.Client(), opts.container)
}
_, status, err := getExitCode(ctx, dockerCli, opts.container)
if err != nil {
return err
func resizeTTY(ctx context.Context, dockerCli command.Cli, containerID string) {
height, width := dockerCli.Out().GetTtySize()
// To handle the case where a user repeatedly attaches/detaches without resizing their
// terminal, the only way to get the shell prompt to display for attaches 2+ is to artificially
// resize it, then go back to normal. Without this, every attach after the first will
// require the user to manually resize or hit enter.
resizeTtyTo(ctx, dockerCli.Client(), containerID, height+1, width+1, false)
// After the above resizing occurs, the call to MonitorTtySize below will handle resetting back
// to the actual size.
if err := MonitorTtySize(ctx, dockerCli, containerID, false); err != nil {
logrus.Debugf("Error monitoring TTY size: %s", err)
}
}
func getExitStatus(ctx context.Context, apiclient client.ContainerAPIClient, containerID string) error {
container, err := apiclient.ContainerInspect(ctx, containerID)
if err != nil {
// If we can't connect, then the daemon probably died.
if !client.IsErrConnectionFailed(err) {
return err
}
return cli.StatusError{StatusCode: -1}
}
status := container.State.ExitCode
if status != 0 {
return cli.StatusError{StatusCode: status}
}
return nil
}

View File

@ -4,10 +4,13 @@ import (
"io/ioutil"
"testing"
"github.com/docker/cli/cli/internal/test"
"github.com/docker/cli/cli"
"github.com/docker/cli/internal/test"
"github.com/docker/cli/internal/test/testutil"
"github.com/docker/docker/api/types"
"github.com/docker/docker/pkg/testutil"
"github.com/pkg/errors"
"github.com/stretchr/testify/assert"
"golang.org/x/net/context"
)
func TestNewAttachCommandErrors(t *testing.T) {
@ -67,9 +70,48 @@ func TestNewAttachCommandErrors(t *testing.T) {
},
}
for _, tc := range testCases {
cmd := NewAttachCommand(test.NewFakeCli(&fakeClient{containerInspectFunc: tc.containerInspectFunc}))
cmd := NewAttachCommand(test.NewFakeCli(&fakeClient{inspectFunc: tc.containerInspectFunc}))
cmd.SetOutput(ioutil.Discard)
cmd.SetArgs(tc.args)
testutil.ErrorContains(t, cmd.Execute(), tc.expectedError)
}
}
func TestGetExitStatus(t *testing.T) {
containerID := "the exec id"
expecatedErr := errors.New("unexpected error")
testcases := []struct {
inspectError error
exitCode int
expectedError error
}{
{
inspectError: nil,
exitCode: 0,
},
{
inspectError: expecatedErr,
expectedError: expecatedErr,
},
{
exitCode: 15,
expectedError: cli.StatusError{StatusCode: 15},
},
}
for _, testcase := range testcases {
client := &fakeClient{
inspectFunc: func(id string) (types.ContainerJSON, error) {
assert.Equal(t, containerID, id)
return types.ContainerJSON{
ContainerJSONBase: &types.ContainerJSONBase{
State: &types.ContainerState{ExitCode: testcase.exitCode},
},
}, testcase.inspectError
},
}
err := getExitStatus(context.Background(), client, containerID)
assert.Equal(t, testcase.expectedError, err)
}
}

View File

@ -1,19 +1,73 @@
package container
import (
"io"
"github.com/docker/docker/api/types"
"github.com/docker/docker/api/types/container"
"github.com/docker/docker/api/types/network"
"github.com/docker/docker/client"
"golang.org/x/net/context"
)
type fakeClient struct {
client.Client
containerInspectFunc func(string) (types.ContainerJSON, error)
inspectFunc func(string) (types.ContainerJSON, error)
execInspectFunc func(execID string) (types.ContainerExecInspect, error)
execCreateFunc func(container string, config types.ExecConfig) (types.IDResponse, error)
createContainerFunc func(config *container.Config, hostConfig *container.HostConfig, networkingConfig *network.NetworkingConfig, containerName string) (container.ContainerCreateCreatedBody, error)
imageCreateFunc func(parentReference string, options types.ImageCreateOptions) (io.ReadCloser, error)
infoFunc func() (types.Info, error)
}
func (cli *fakeClient) ContainerInspect(_ context.Context, containerID string) (types.ContainerJSON, error) {
if cli.containerInspectFunc != nil {
return cli.containerInspectFunc(containerID)
func (f *fakeClient) ContainerInspect(_ context.Context, containerID string) (types.ContainerJSON, error) {
if f.inspectFunc != nil {
return f.inspectFunc(containerID)
}
return types.ContainerJSON{}, nil
}
func (f *fakeClient) ContainerExecCreate(_ context.Context, container string, config types.ExecConfig) (types.IDResponse, error) {
if f.execCreateFunc != nil {
return f.execCreateFunc(container, config)
}
return types.IDResponse{}, nil
}
func (f *fakeClient) ContainerExecInspect(_ context.Context, execID string) (types.ContainerExecInspect, error) {
if f.execInspectFunc != nil {
return f.execInspectFunc(execID)
}
return types.ContainerExecInspect{}, nil
}
func (f *fakeClient) ContainerExecStart(ctx context.Context, execID string, config types.ExecStartCheck) error {
return nil
}
func (f *fakeClient) ContainerCreate(
_ context.Context,
config *container.Config,
hostConfig *container.HostConfig,
networkingConfig *network.NetworkingConfig,
containerName string,
) (container.ContainerCreateCreatedBody, error) {
if f.createContainerFunc != nil {
return f.createContainerFunc(config, hostConfig, networkingConfig, containerName)
}
return container.ContainerCreateCreatedBody{}, nil
}
func (f *fakeClient) ImageCreate(ctx context.Context, parentReference string, options types.ImageCreateOptions) (io.ReadCloser, error) {
if f.imageCreateFunc != nil {
return f.imageCreateFunc(parentReference, options)
}
return nil, nil
}
func (f *fakeClient) Info(_ context.Context) (types.Info, error) {
if f.infoFunc != nil {
return f.infoFunc()
}
return types.Info{}, nil
}

View File

@ -113,6 +113,9 @@ type cidFile struct {
}
func (cid *cidFile) Close() error {
if cid.file == nil {
return nil
}
cid.file.Close()
if cid.written {
@ -126,6 +129,9 @@ func (cid *cidFile) Close() error {
}
func (cid *cidFile) Write(id string) error {
if cid.file == nil {
return nil
}
if _, err := cid.file.Write([]byte(id)); err != nil {
return errors.Errorf("Failed to write the container ID to the file: %s", err)
}
@ -134,6 +140,9 @@ func (cid *cidFile) Write(id string) error {
}
func newCIDFile(path string) (*cidFile, error) {
if path == "" {
return &cidFile{}, nil
}
if _, err := os.Stat(path); err == nil {
return nil, errors.Errorf("Container ID file found, make sure the other container isn't running or delete %s", path)
}
@ -153,19 +162,15 @@ func createContainer(ctx context.Context, dockerCli command.Cli, containerConfig
stderr := dockerCli.Err()
var (
containerIDFile *cidFile
trustedRef reference.Canonical
namedRef reference.Named
trustedRef reference.Canonical
namedRef reference.Named
)
cidfile := hostConfig.ContainerIDFile
if cidfile != "" {
var err error
if containerIDFile, err = newCIDFile(cidfile); err != nil {
return nil, err
}
defer containerIDFile.Close()
containerIDFile, err := newCIDFile(hostConfig.ContainerIDFile)
if err != nil {
return nil, err
}
defer containerIDFile.Close()
ref, err := reference.ParseAnyReference(config.Image)
if err != nil {
@ -193,7 +198,7 @@ func createContainer(ctx context.Context, dockerCli command.Cli, containerConfig
fmt.Fprintf(stderr, "Unable to find image '%s' locally\n", reference.FamiliarString(namedRef))
// we don't want to write to stdout anything apart from container.ID
if err = pullImage(ctx, dockerCli, config.Image, stderr); err != nil {
if err := pullImage(ctx, dockerCli, config.Image, stderr); err != nil {
return nil, err
}
if taggedRef, ok := namedRef.(reference.NamedTagged); ok && trustedRef != nil {
@ -215,10 +220,6 @@ func createContainer(ctx context.Context, dockerCli command.Cli, containerConfig
for _, warning := range response.Warnings {
fmt.Fprintf(stderr, "WARNING: %s\n", warning)
}
if containerIDFile != nil {
if err = containerIDFile.Write(response.ID); err != nil {
return nil, err
}
}
return &response, nil
err = containerIDFile.Write(response.ID)
return &response, err
}

View File

@ -0,0 +1,120 @@
package container
import (
"context"
"io"
"io/ioutil"
"os"
"strings"
"testing"
"github.com/docker/cli/internal/test"
"github.com/docker/cli/internal/test/testutil"
"github.com/docker/docker/api/types"
"github.com/docker/docker/api/types/container"
"github.com/docker/docker/api/types/network"
"github.com/gotestyourself/gotestyourself/fs"
"github.com/pkg/errors"
"github.com/stretchr/testify/assert"
"github.com/stretchr/testify/require"
)
func TestCIDFileNoOPWithNoFilename(t *testing.T) {
file, err := newCIDFile("")
require.NoError(t, err)
assert.Equal(t, &cidFile{}, file)
assert.NoError(t, file.Write("id"))
assert.NoError(t, file.Close())
}
func TestNewCIDFileWhenFileAlreadyExists(t *testing.T) {
tempfile := fs.NewFile(t, "test-cid-file")
defer tempfile.Remove()
_, err := newCIDFile(tempfile.Path())
testutil.ErrorContains(t, err, "Container ID file found")
}
func TestCIDFileCloseWithNoWrite(t *testing.T) {
tempdir := fs.NewDir(t, "test-cid-file")
defer tempdir.Remove()
path := tempdir.Join("cidfile")
file, err := newCIDFile(path)
require.NoError(t, err)
assert.Equal(t, file.path, path)
assert.NoError(t, file.Close())
_, err = os.Stat(path)
assert.True(t, os.IsNotExist(err))
}
func TestCIDFileCloseWithWrite(t *testing.T) {
tempdir := fs.NewDir(t, "test-cid-file")
defer tempdir.Remove()
path := tempdir.Join("cidfile")
file, err := newCIDFile(path)
require.NoError(t, err)
content := "id"
assert.NoError(t, file.Write(content))
actual, err := ioutil.ReadFile(path)
require.NoError(t, err)
assert.Equal(t, content, string(actual))
assert.NoError(t, file.Close())
_, err = os.Stat(path)
require.NoError(t, err)
}
func TestCreateContainerPullsImageIfMissing(t *testing.T) {
imageName := "does-not-exist-locally"
responseCounter := 0
containerID := "abcdef"
client := &fakeClient{
createContainerFunc: func(
config *container.Config,
hostConfig *container.HostConfig,
networkingConfig *network.NetworkingConfig,
containerName string,
) (container.ContainerCreateCreatedBody, error) {
defer func() { responseCounter++ }()
switch responseCounter {
case 0:
return container.ContainerCreateCreatedBody{}, fakeNotFound{}
case 1:
return container.ContainerCreateCreatedBody{ID: containerID}, nil
default:
return container.ContainerCreateCreatedBody{}, errors.New("unexpected")
}
},
imageCreateFunc: func(parentReference string, options types.ImageCreateOptions) (io.ReadCloser, error) {
return ioutil.NopCloser(strings.NewReader("")), nil
},
infoFunc: func() (types.Info, error) {
return types.Info{IndexServerAddress: "http://indexserver"}, nil
},
}
cli := test.NewFakeCli(client)
config := &containerConfig{
Config: &container.Config{
Image: imageName,
},
HostConfig: &container.HostConfig{},
}
body, err := createContainer(context.Background(), cli, config, "name")
require.NoError(t, err)
expected := container.ContainerCreateCreatedBody{ID: containerID}
assert.Equal(t, expected, *body)
stderr := cli.ErrBuffer().String()
assert.Contains(t, stderr, "Unable to find image 'does-not-exist-locally:latest' locally")
}
type fakeNotFound struct{}
func (f fakeNotFound) NotFound() bool { return true }
func (f fakeNotFound) Error() string { return "error fake not found" }

View File

@ -4,13 +4,15 @@ import (
"fmt"
"io"
"github.com/Sirupsen/logrus"
"github.com/docker/cli/cli"
"github.com/docker/cli/cli/command"
"github.com/docker/cli/cli/config/configfile"
"github.com/docker/cli/opts"
"github.com/docker/docker/api/types"
apiclient "github.com/docker/docker/client"
"github.com/docker/docker/pkg/promise"
"github.com/pkg/errors"
"github.com/sirupsen/logrus"
"github.com/spf13/cobra"
"golang.org/x/net/context"
)
@ -22,14 +24,13 @@ type execOptions struct {
detach bool
user string
privileged bool
env *opts.ListOpts
env opts.ListOpts
container string
command []string
}
func newExecOptions() *execOptions {
var values []string
return &execOptions{
env: opts.NewListOptsRef(&values, opts.ValidateEnv),
}
func newExecOptions() execOptions {
return execOptions{env: opts.NewListOpts(opts.ValidateEnv)}
}
// NewExecCommand creates a new cobra.Command for `docker exec`
@ -41,9 +42,9 @@ func NewExecCommand(dockerCli command.Cli) *cobra.Command {
Short: "Run a command in a running container",
Args: cli.RequiresMinArgs(2),
RunE: func(cmd *cobra.Command, args []string) error {
container := args[0]
execCmd := args[1:]
return runExec(dockerCli, options, container, execCmd)
options.container = args[0]
options.command = args[1:]
return runExec(dockerCli, options)
},
}
@ -56,27 +57,14 @@ func NewExecCommand(dockerCli command.Cli) *cobra.Command {
flags.BoolVarP(&options.detach, "detach", "d", false, "Detached mode: run command in the background")
flags.StringVarP(&options.user, "user", "u", "", "Username or UID (format: <name|uid>[:<group|gid>])")
flags.BoolVarP(&options.privileged, "privileged", "", false, "Give extended privileges to the command")
flags.VarP(options.env, "env", "e", "Set environment variables")
flags.VarP(&options.env, "env", "e", "Set environment variables")
flags.SetAnnotation("env", "version", []string{"1.25"})
return cmd
}
// nolint: gocyclo
func runExec(dockerCli command.Cli, options *execOptions, container string, execCmd []string) error {
execConfig, err := parseExec(options, execCmd)
// just in case the ParseExec does not exit
if container == "" || err != nil {
return cli.StatusError{StatusCode: 1}
}
if options.detachKeys != "" {
dockerCli.ConfigFile().DetachKeys = options.detachKeys
}
// Send client escape keys
execConfig.DetachKeys = dockerCli.ConfigFile().DetachKeys
func runExec(dockerCli command.Cli, options execOptions) error {
execConfig := parseExec(options, dockerCli.ConfigFile())
ctx := context.Background()
client := dockerCli.Client()
@ -84,7 +72,7 @@ func runExec(dockerCli command.Cli, options *execOptions, container string, exec
// otherwise if we error out we will leak execIDs on the server (and
// there's no easy way to clean those up). But also in order to make "not
// exist" errors take precedence we do a dummy inspect first.
if _, err := client.ContainerInspect(ctx, container); err != nil {
if _, err := client.ContainerInspect(ctx, options.container); err != nil {
return err
}
if !execConfig.Detach {
@ -93,27 +81,27 @@ func runExec(dockerCli command.Cli, options *execOptions, container string, exec
}
}
response, err := client.ContainerExecCreate(ctx, container, *execConfig)
response, err := client.ContainerExecCreate(ctx, options.container, *execConfig)
if err != nil {
return err
}
execID := response.ID
if execID == "" {
fmt.Fprintln(dockerCli.Out(), "exec ID empty")
return nil
return errors.New("exec ID empty")
}
// Temp struct for execStart so that we don't need to transfer all the execConfig.
if execConfig.Detach {
execStartCheck := types.ExecStartCheck{
Detach: execConfig.Detach,
Tty: execConfig.Tty,
}
return client.ContainerExecStart(ctx, execID, execStartCheck)
}
return interactiveExec(ctx, dockerCli, execConfig, execID)
}
func interactiveExec(ctx context.Context, dockerCli command.Cli, execConfig *types.ExecConfig, execID string) error {
// Interactive exec requested.
var (
out, stderr io.Writer
@ -135,6 +123,7 @@ func runExec(dockerCli command.Cli, options *execOptions, container string, exec
}
}
client := dockerCli.Client()
resp, err := client.ContainerExecAttach(ctx, execID, *execConfig)
if err != nil {
return err
@ -165,42 +154,35 @@ func runExec(dockerCli command.Cli, options *execOptions, container string, exec
return err
}
var status int
if _, status, err = getExecExitCode(ctx, client, execID); err != nil {
return err
}
if status != 0 {
return cli.StatusError{StatusCode: status}
}
return nil
return getExecExitStatus(ctx, client, execID)
}
// getExecExitCode perform an inspect on the exec command. It returns
// the running state and the exit code.
func getExecExitCode(ctx context.Context, client apiclient.ContainerAPIClient, execID string) (bool, int, error) {
func getExecExitStatus(ctx context.Context, client apiclient.ContainerAPIClient, execID string) error {
resp, err := client.ContainerExecInspect(ctx, execID)
if err != nil {
// If we can't connect, then the daemon probably died.
if !apiclient.IsErrConnectionFailed(err) {
return false, -1, err
return err
}
return false, -1, nil
return cli.StatusError{StatusCode: -1}
}
return resp.Running, resp.ExitCode, nil
status := resp.ExitCode
if status != 0 {
return cli.StatusError{StatusCode: status}
}
return nil
}
// parseExec parses the specified args for the specified command and generates
// an ExecConfig from it.
func parseExec(opts *execOptions, execCmd []string) (*types.ExecConfig, error) {
func parseExec(opts execOptions, configFile *configfile.ConfigFile) *types.ExecConfig {
execConfig := &types.ExecConfig{
User: opts.user,
Privileged: opts.privileged,
Tty: opts.tty,
Cmd: execCmd,
Cmd: opts.command,
Detach: opts.detach,
Env: opts.env.GetAll(),
}
// If -d is not set, attach to everything by default
@ -212,9 +194,10 @@ func parseExec(opts *execOptions, execCmd []string) (*types.ExecConfig, error) {
}
}
if opts.env != nil {
execConfig.Env = opts.env.GetAll()
if opts.detachKeys != "" {
execConfig.DetachKeys = opts.detachKeys
} else {
execConfig.DetachKeys = configFile.DetachKeys
}
return execConfig, nil
return execConfig
}

View File

@ -4,118 +4,201 @@ import (
"io/ioutil"
"testing"
"github.com/docker/cli/cli/internal/test"
"github.com/docker/cli/cli"
"github.com/docker/cli/cli/config/configfile"
"github.com/docker/cli/internal/test"
"github.com/docker/cli/internal/test/testutil"
"github.com/docker/cli/opts"
"github.com/docker/docker/api/types"
"github.com/docker/docker/pkg/testutil"
"github.com/pkg/errors"
"github.com/stretchr/testify/require"
"github.com/stretchr/testify/assert"
"golang.org/x/net/context"
)
type arguments struct {
options execOptions
execCmd []string
func withDefaultOpts(options execOptions) execOptions {
options.env = opts.NewListOpts(opts.ValidateEnv)
if len(options.command) == 0 {
options.command = []string{"command"}
}
return options
}
func TestParseExec(t *testing.T) {
valids := map[*arguments]*types.ExecConfig{
testcases := []struct {
options execOptions
configFile configfile.ConfigFile
expected types.ExecConfig
}{
{
execCmd: []string{"command"},
}: {
Cmd: []string{"command"},
AttachStdout: true,
AttachStderr: true,
expected: types.ExecConfig{
Cmd: []string{"command"},
AttachStdout: true,
AttachStderr: true,
},
options: withDefaultOpts(execOptions{}),
},
{
execCmd: []string{"command1", "command2"},
}: {
Cmd: []string{"command1", "command2"},
AttachStdout: true,
AttachStderr: true,
expected: types.ExecConfig{
Cmd: []string{"command1", "command2"},
AttachStdout: true,
AttachStderr: true,
},
options: withDefaultOpts(execOptions{
command: []string{"command1", "command2"},
}),
},
{
options: execOptions{
options: withDefaultOpts(execOptions{
interactive: true,
tty: true,
user: "uid",
}),
expected: types.ExecConfig{
User: "uid",
AttachStdin: true,
AttachStdout: true,
AttachStderr: true,
Tty: true,
Cmd: []string{"command"},
},
execCmd: []string{"command"},
}: {
User: "uid",
AttachStdin: true,
AttachStdout: true,
AttachStderr: true,
Tty: true,
Cmd: []string{"command"},
},
{
options: execOptions{
detach: true,
options: withDefaultOpts(execOptions{detach: true}),
expected: types.ExecConfig{
Detach: true,
Cmd: []string{"command"},
},
execCmd: []string{"command"},
}: {
AttachStdin: false,
AttachStdout: false,
AttachStderr: false,
Detach: true,
Cmd: []string{"command"},
},
{
options: execOptions{
options: withDefaultOpts(execOptions{
tty: true,
interactive: true,
detach: true,
}),
expected: types.ExecConfig{
Detach: true,
Tty: true,
Cmd: []string{"command"},
},
},
{
options: withDefaultOpts(execOptions{detach: true}),
configFile: configfile.ConfigFile{DetachKeys: "de"},
expected: types.ExecConfig{
Cmd: []string{"command"},
DetachKeys: "de",
Detach: true,
},
},
{
options: withDefaultOpts(execOptions{
detach: true,
detachKeys: "ab",
}),
configFile: configfile.ConfigFile{DetachKeys: "de"},
expected: types.ExecConfig{
Cmd: []string{"command"},
DetachKeys: "ab",
Detach: true,
},
execCmd: []string{"command"},
}: {
AttachStdin: false,
AttachStdout: false,
AttachStderr: false,
Detach: true,
Tty: true,
Cmd: []string{"command"},
},
}
for valid, expectedExecConfig := range valids {
execConfig, err := parseExec(&valid.options, valid.execCmd)
require.NoError(t, err)
if !compareExecConfig(expectedExecConfig, execConfig) {
t.Fatalf("Expected [%v] for %v, got [%v]", expectedExecConfig, valid, execConfig)
}
for _, testcase := range testcases {
execConfig := parseExec(testcase.options, &testcase.configFile)
assert.Equal(t, testcase.expected, *execConfig)
}
}
func compareExecConfig(config1 *types.ExecConfig, config2 *types.ExecConfig) bool {
if config1.AttachStderr != config2.AttachStderr {
return false
func TestRunExec(t *testing.T) {
var testcases = []struct {
doc string
options execOptions
client fakeClient
expectedError string
expectedOut string
expectedErr string
}{
{
doc: "successful detach",
options: withDefaultOpts(execOptions{
container: "thecontainer",
detach: true,
}),
client: fakeClient{execCreateFunc: execCreateWithID},
},
{
doc: "inspect error",
options: newExecOptions(),
client: fakeClient{
inspectFunc: func(string) (types.ContainerJSON, error) {
return types.ContainerJSON{}, errors.New("failed inspect")
},
},
expectedError: "failed inspect",
},
{
doc: "missing exec ID",
options: newExecOptions(),
expectedError: "exec ID empty",
},
}
if config1.AttachStdin != config2.AttachStdin {
return false
for _, testcase := range testcases {
t.Run(testcase.doc, func(t *testing.T) {
cli := test.NewFakeCli(&testcase.client)
err := runExec(cli, testcase.options)
if testcase.expectedError != "" {
testutil.ErrorContains(t, err, testcase.expectedError)
} else {
if !assert.NoError(t, err) {
return
}
}
assert.Equal(t, testcase.expectedOut, cli.OutBuffer().String())
assert.Equal(t, testcase.expectedErr, cli.ErrBuffer().String())
})
}
if config1.AttachStdout != config2.AttachStdout {
return false
}
func execCreateWithID(_ string, _ types.ExecConfig) (types.IDResponse, error) {
return types.IDResponse{ID: "execid"}, nil
}
func TestGetExecExitStatus(t *testing.T) {
execID := "the exec id"
expecatedErr := errors.New("unexpected error")
testcases := []struct {
inspectError error
exitCode int
expectedError error
}{
{
inspectError: nil,
exitCode: 0,
},
{
inspectError: expecatedErr,
expectedError: expecatedErr,
},
{
exitCode: 15,
expectedError: cli.StatusError{StatusCode: 15},
},
}
if config1.Detach != config2.Detach {
return false
}
if config1.Privileged != config2.Privileged {
return false
}
if config1.Tty != config2.Tty {
return false
}
if config1.User != config2.User {
return false
}
if len(config1.Cmd) != len(config2.Cmd) {
return false
}
for index, value := range config1.Cmd {
if value != config2.Cmd[index] {
return false
for _, testcase := range testcases {
client := &fakeClient{
execInspectFunc: func(id string) (types.ContainerExecInspect, error) {
assert.Equal(t, execID, id)
return types.ContainerExecInspect{ExitCode: testcase.exitCode}, testcase.inspectError
},
}
err := getExecExitStatus(context.Background(), client, execID)
assert.Equal(t, testcase.expectedError, err)
}
return true
}
func TestNewExecCommandErrors(t *testing.T) {
@ -135,7 +218,7 @@ func TestNewExecCommandErrors(t *testing.T) {
},
}
for _, tc := range testCases {
cli := test.NewFakeCli(&fakeClient{containerInspectFunc: tc.containerInspectFunc})
cli := test.NewFakeCli(&fakeClient{inspectFunc: tc.containerInspectFunc})
cmd := NewExecCommand(cli)
cmd.SetOutput(ioutil.Discard)
cmd.SetArgs(tc.args)

View File

@ -6,12 +6,12 @@ import (
"runtime"
"sync"
"github.com/Sirupsen/logrus"
"github.com/docker/cli/cli/command"
"github.com/docker/docker/api/types"
"github.com/docker/docker/pkg/ioutils"
"github.com/docker/docker/pkg/stdcopy"
"github.com/docker/docker/pkg/term"
"github.com/sirupsen/logrus"
"golang.org/x/net/context"
)

View File

@ -7,8 +7,8 @@ import (
"github.com/docker/cli/cli/command"
"github.com/docker/cli/cli/command/formatter"
"github.com/docker/cli/opts"
"github.com/docker/cli/templates"
"github.com/docker/docker/api/types"
"github.com/docker/docker/pkg/templates"
"github.com/spf13/cobra"
"golang.org/x/net/context"
)

View File

@ -11,7 +11,6 @@ import (
"strings"
"time"
"github.com/Sirupsen/logrus"
"github.com/docker/cli/cli/compose/loader"
"github.com/docker/cli/opts"
"github.com/docker/docker/api/types/container"
@ -20,6 +19,7 @@ import (
"github.com/docker/docker/pkg/signal"
"github.com/docker/go-connections/nat"
"github.com/pkg/errors"
"github.com/sirupsen/logrus"
"github.com/spf13/pflag"
)
@ -274,7 +274,7 @@ func addFlags(flags *pflag.FlagSet) *containerOptions {
// Low-level execution (cgroups, namespaces, ...)
flags.StringVar(&copts.cgroupParent, "cgroup-parent", "", "Optional parent cgroup for the container")
flags.StringVar(&copts.ipcMode, "ipc", "", "IPC namespace to use")
flags.StringVar(&copts.ipcMode, "ipc", "", "IPC mode to use")
flags.StringVar(&copts.isolation, "isolation", "", "Container isolation technology")
flags.StringVar(&copts.pidMode, "pid", "", "PID namespace to use")
flags.Var(&copts.shmSize, "shm-size", "Size of /dev/shm")
@ -421,11 +421,6 @@ func parse(flags *pflag.FlagSet, copts *containerOptions) (*containerConfig, err
return nil, err
}
ipcMode := container.IpcMode(copts.ipcMode)
if !ipcMode.Valid() {
return nil, errors.Errorf("--ipc: invalid IPC mode")
}
pidMode := container.PidMode(copts.pidMode)
if !pidMode.Valid() {
return nil, errors.Errorf("--pid: invalid PID mode")
@ -584,7 +579,7 @@ func parse(flags *pflag.FlagSet, copts *containerOptions) (*containerConfig, err
ExtraHosts: copts.extraHosts.GetAll(),
VolumesFrom: copts.volumesFrom.GetAll(),
NetworkMode: container.NetworkMode(copts.netMode),
IpcMode: ipcMode,
IpcMode: container.IpcMode(copts.ipcMode),
PidMode: pidMode,
UTSMode: utsMode,
UsernsMode: usernsMode,

View File

@ -1,8 +1,6 @@
package container
import (
"bytes"
"encoding/json"
"fmt"
"io/ioutil"
"os"
@ -11,10 +9,9 @@ import (
"testing"
"time"
"github.com/docker/cli/internal/test/testutil"
"github.com/docker/docker/api/types/container"
networktypes "github.com/docker/docker/api/types/network"
"github.com/docker/docker/pkg/testutil"
"github.com/docker/docker/runconfig"
"github.com/docker/go-connections/nat"
"github.com/pkg/errors"
"github.com/spf13/pflag"
@ -115,7 +112,7 @@ func TestParseRunWithInvalidArgs(t *testing.T) {
}
// nolint: gocyclo
func TestParseRunVolumes(t *testing.T) {
func TestParseWithVolumes(t *testing.T) {
// A single volume
arr, tryit := setupPlatformVolume([]string{`/tmp`}, []string{`c:\tmp`})
@ -135,19 +132,19 @@ func TestParseRunVolumes(t *testing.T) {
t.Fatalf("Error parsing volume flags, %s is missing from volumes. Received %v", arr[1], config.Volumes)
}
// A single bind-mount
// A single bind mount
arr, tryit = setupPlatformVolume([]string{`/hostTmp:/containerTmp`}, []string{os.Getenv("TEMP") + `:c:\containerTmp`})
if config, hostConfig := mustParse(t, tryit); hostConfig.Binds == nil || hostConfig.Binds[0] != arr[0] {
t.Fatalf("Error parsing volume flags, %q should mount-bind the path before the colon into the path after the colon. Received %v %v", arr[0], hostConfig.Binds, config.Volumes)
}
// Two bind-mounts.
// Two bind mounts.
arr, tryit = setupPlatformVolume([]string{`/hostTmp:/containerTmp`, `/hostVar:/containerVar`}, []string{os.Getenv("ProgramData") + `:c:\ContainerPD`, os.Getenv("TEMP") + `:c:\containerTmp`})
if _, hostConfig := mustParse(t, tryit); hostConfig.Binds == nil || compareRandomizedStrings(hostConfig.Binds[0], hostConfig.Binds[1], arr[0], arr[1]) != nil {
t.Fatalf("Error parsing volume flags, `%s and %s` did not mount-bind correctly. Received %v", arr[0], arr[1], hostConfig.Binds)
}
// Two bind-mounts, first read-only, second read-write.
// Two bind mounts, first read-only, second read-write.
// TODO Windows: The Windows version uses read-write as that's the only mode it supports. Can change this post TP4
arr, tryit = setupPlatformVolume(
[]string{`/hostTmp:/containerTmp:ro`, `/hostVar:/containerVar:rw`},
@ -366,23 +363,12 @@ func TestParseDevice(t *testing.T) {
}
func TestParseModes(t *testing.T) {
// ipc ko
_, _, _, err := parseRun([]string{"--ipc=container:", "img", "cmd"})
testutil.ErrorContains(t, err, "--ipc: invalid IPC mode")
// ipc ok
_, hostconfig, _, err := parseRun([]string{"--ipc=host", "img", "cmd"})
require.NoError(t, err)
if !hostconfig.IpcMode.Valid() {
t.Fatalf("Expected a valid IpcMode, got %v", hostconfig.IpcMode)
}
// pid ko
_, _, _, err = parseRun([]string{"--pid=container:", "img", "cmd"})
_, _, _, err := parseRun([]string{"--pid=container:", "img", "cmd"})
testutil.ErrorContains(t, err, "--pid: invalid PID mode")
// pid ok
_, hostconfig, _, err = parseRun([]string{"--pid=host", "img", "cmd"})
_, hostconfig, _, err := parseRun([]string{"--pid=host", "img", "cmd"})
require.NoError(t, err)
if !hostconfig.PidMode.Valid() {
t.Fatalf("Expected a valid PidMode, got %v", hostconfig.PidMode)
@ -595,161 +581,6 @@ func TestParseEntryPoint(t *testing.T) {
}
}
// This tests the cases for binds which are generated through
// DecodeContainerConfig rather than Parse()
// nolint: gocyclo
func TestDecodeContainerConfigVolumes(t *testing.T) {
// Root to root
bindsOrVols, _ := setupPlatformVolume([]string{`/:/`}, []string{os.Getenv("SystemDrive") + `\:c:\`})
if _, _, err := callDecodeContainerConfig(nil, bindsOrVols); err == nil {
t.Fatalf("binds %v should have failed", bindsOrVols)
}
if _, _, err := callDecodeContainerConfig(bindsOrVols, nil); err == nil {
t.Fatalf("volume %v should have failed", bindsOrVols)
}
// No destination path
bindsOrVols, _ = setupPlatformVolume([]string{`/tmp:`}, []string{os.Getenv("TEMP") + `\:`})
if _, _, err := callDecodeContainerConfig(nil, bindsOrVols); err == nil {
t.Fatalf("binds %v should have failed", bindsOrVols)
}
if _, _, err := callDecodeContainerConfig(bindsOrVols, nil); err == nil {
t.Fatalf("volume %v should have failed", bindsOrVols)
}
// // No destination path or mode
bindsOrVols, _ = setupPlatformVolume([]string{`/tmp::`}, []string{os.Getenv("TEMP") + `\::`})
if _, _, err := callDecodeContainerConfig(nil, bindsOrVols); err == nil {
t.Fatalf("binds %v should have failed", bindsOrVols)
}
if _, _, err := callDecodeContainerConfig(bindsOrVols, nil); err == nil {
t.Fatalf("volume %v should have failed", bindsOrVols)
}
// A whole lot of nothing
bindsOrVols = []string{`:`}
if _, _, err := callDecodeContainerConfig(nil, bindsOrVols); err == nil {
t.Fatalf("binds %v should have failed", bindsOrVols)
}
if _, _, err := callDecodeContainerConfig(bindsOrVols, nil); err == nil {
t.Fatalf("volume %v should have failed", bindsOrVols)
}
// A whole lot of nothing with no mode
bindsOrVols = []string{`::`}
if _, _, err := callDecodeContainerConfig(nil, bindsOrVols); err == nil {
t.Fatalf("binds %v should have failed", bindsOrVols)
}
if _, _, err := callDecodeContainerConfig(bindsOrVols, nil); err == nil {
t.Fatalf("volume %v should have failed", bindsOrVols)
}
// Too much including an invalid mode
wTmp := os.Getenv("TEMP")
bindsOrVols, _ = setupPlatformVolume([]string{`/tmp:/tmp:/tmp:/tmp`}, []string{wTmp + ":" + wTmp + ":" + wTmp + ":" + wTmp})
if _, _, err := callDecodeContainerConfig(nil, bindsOrVols); err == nil {
t.Fatalf("binds %v should have failed", bindsOrVols)
}
if _, _, err := callDecodeContainerConfig(bindsOrVols, nil); err == nil {
t.Fatalf("volume %v should have failed", bindsOrVols)
}
// Windows specific error tests
if runtime.GOOS == "windows" {
// Volume which does not include a drive letter
bindsOrVols = []string{`\tmp`}
if _, _, err := callDecodeContainerConfig(nil, bindsOrVols); err == nil {
t.Fatalf("binds %v should have failed", bindsOrVols)
}
if _, _, err := callDecodeContainerConfig(bindsOrVols, nil); err == nil {
t.Fatalf("volume %v should have failed", bindsOrVols)
}
// Root to C-Drive
bindsOrVols = []string{os.Getenv("SystemDrive") + `\:c:`}
if _, _, err := callDecodeContainerConfig(nil, bindsOrVols); err == nil {
t.Fatalf("binds %v should have failed", bindsOrVols)
}
if _, _, err := callDecodeContainerConfig(bindsOrVols, nil); err == nil {
t.Fatalf("volume %v should have failed", bindsOrVols)
}
// Container path that does not include a drive letter
bindsOrVols = []string{`c:\windows:\somewhere`}
if _, _, err := callDecodeContainerConfig(nil, bindsOrVols); err == nil {
t.Fatalf("binds %v should have failed", bindsOrVols)
}
if _, _, err := callDecodeContainerConfig(bindsOrVols, nil); err == nil {
t.Fatalf("volume %v should have failed", bindsOrVols)
}
}
// Linux-specific error tests
if runtime.GOOS != "windows" {
// Just root
bindsOrVols = []string{`/`}
if _, _, err := callDecodeContainerConfig(nil, bindsOrVols); err == nil {
t.Fatalf("binds %v should have failed", bindsOrVols)
}
if _, _, err := callDecodeContainerConfig(bindsOrVols, nil); err == nil {
t.Fatalf("volume %v should have failed", bindsOrVols)
}
// A single volume that looks like a bind mount passed in Volumes.
// This should be handled as a bind mount, not a volume.
vols := []string{`/foo:/bar`}
if config, hostConfig, err := callDecodeContainerConfig(vols, nil); err != nil {
t.Fatal("Volume /foo:/bar should have succeeded as a volume name")
} else if hostConfig.Binds != nil {
t.Fatalf("Error parsing volume flags, /foo:/bar should not mount-bind anything. Received %v", hostConfig.Binds)
} else if _, exists := config.Volumes[vols[0]]; !exists {
t.Fatalf("Error parsing volume flags, /foo:/bar is missing from volumes. Received %v", config.Volumes)
}
}
}
// callDecodeContainerConfig is a utility function used by TestDecodeContainerConfigVolumes
// to call DecodeContainerConfig. It effectively does what a client would
// do when calling the daemon by constructing a JSON stream of a
// ContainerConfigWrapper which is populated by the set of volume specs
// passed into it. It returns a config and a hostconfig which can be
// validated to ensure DecodeContainerConfig has manipulated the structures
// correctly.
func callDecodeContainerConfig(volumes []string, binds []string) (*container.Config, *container.HostConfig, error) {
var (
b []byte
err error
c *container.Config
h *container.HostConfig
)
w := runconfig.ContainerConfigWrapper{
Config: &container.Config{
Volumes: map[string]struct{}{},
},
HostConfig: &container.HostConfig{
NetworkMode: "none",
Binds: binds,
},
}
for _, v := range volumes {
w.Config.Volumes[v] = struct{}{}
}
if b, err = json.Marshal(w); err != nil {
return nil, nil, errors.Errorf("Error on marshal %s", err.Error())
}
c, h, _, err = runconfig.DecodeContainerConfig(bytes.NewReader(b))
if err != nil {
return nil, nil, errors.Errorf("Error parsing %s: %v", string(b), err)
}
if c == nil || h == nil {
return nil, nil, errors.Errorf("Empty config or hostconfig")
}
return c, h, err
}
func TestValidateDevice(t *testing.T) {
valid := []string{
"/home",

View File

@ -10,7 +10,6 @@ import (
"strings"
"syscall"
"github.com/Sirupsen/logrus"
"github.com/docker/cli/cli"
"github.com/docker/cli/cli/command"
"github.com/docker/cli/opts"
@ -20,6 +19,7 @@ import (
"github.com/docker/docker/pkg/signal"
"github.com/docker/docker/pkg/term"
"github.com/pkg/errors"
"github.com/sirupsen/logrus"
"github.com/spf13/cobra"
"github.com/spf13/pflag"
"golang.org/x/net/context"

View File

@ -7,11 +7,11 @@ import (
"sync"
"time"
"github.com/Sirupsen/logrus"
"github.com/docker/cli/cli/command/formatter"
"github.com/docker/docker/api/types"
"github.com/docker/docker/client"
"github.com/pkg/errors"
"github.com/sirupsen/logrus"
"golang.org/x/net/context"
)

View File

@ -7,11 +7,11 @@ import (
"runtime"
"time"
"github.com/Sirupsen/logrus"
"github.com/docker/cli/cli/command"
"github.com/docker/docker/api/types"
"github.com/docker/docker/client"
"github.com/docker/docker/pkg/signal"
"github.com/sirupsen/logrus"
"golang.org/x/net/context"
)

View File

@ -3,14 +3,13 @@ package container
import (
"strconv"
"github.com/Sirupsen/logrus"
"github.com/docker/cli/cli/command"
"github.com/docker/docker/api/types"
"github.com/docker/docker/api/types/container"
"github.com/docker/docker/api/types/events"
"github.com/docker/docker/api/types/filters"
"github.com/docker/docker/api/types/versions"
clientapi "github.com/docker/docker/client"
"github.com/sirupsen/logrus"
"golang.org/x/net/context"
)
@ -125,20 +124,6 @@ func legacyWaitExitOrRemoved(ctx context.Context, dockerCli *command.DockerCli,
return statusChan
}
// getExitCode performs an inspect on the container. It returns
// the running state and the exit code.
func getExitCode(ctx context.Context, dockerCli command.Cli, containerID string) (bool, int, error) {
c, err := dockerCli.Client().ContainerInspect(ctx, containerID)
if err != nil {
// If we can't connect, then the daemon probably died.
if !clientapi.IsErrConnectionFailed(err) {
return false, -1, err
}
return false, -1, nil
}
return c.State.Running, c.State.ExitCode, nil
}
func parallelOperation(ctx context.Context, containers []string, op func(ctx context.Context, container string) error) chan error {
if len(containers) == 0 {
return nil

View File

@ -3,8 +3,8 @@ package command
import (
"sync"
"github.com/Sirupsen/logrus"
eventtypes "github.com/docker/docker/api/types/events"
"github.com/sirupsen/logrus"
)
// EventHandler is abstract interface for user to customize

View File

@ -1,9 +1,10 @@
package formatter
import (
"reflect"
"strings"
"testing"
"github.com/stretchr/testify/assert"
)
func compareMultipleValues(t *testing.T, value, expected string) {
@ -22,7 +23,5 @@ func compareMultipleValues(t *testing.T, value, expected string) {
keyval := strings.Split(expected, "=")
expMap[keyval[0]] = keyval[1]
}
if !reflect.DeepEqual(expMap, entriesMap) {
t.Fatalf("Expected entries: %v, got: %v", expected, value)
}
assert.Equal(t, expMap, entriesMap)
}

View File

@ -7,7 +7,7 @@ import (
"text/tabwriter"
"text/template"
"github.com/docker/docker/pkg/templates"
"github.com/docker/cli/templates"
"github.com/pkg/errors"
)

View File

@ -79,10 +79,13 @@ func (c *historyContext) ID() string {
}
func (c *historyContext) CreatedAt() string {
return units.HumanDuration(time.Now().UTC().Sub(time.Unix(c.h.Created, 0)))
return time.Unix(c.h.Created, 0).Format(time.RFC3339)
}
func (c *historyContext) CreatedSince() string {
if !c.human {
return c.CreatedAt()
}
created := units.HumanDuration(time.Now().UTC().Sub(time.Unix(c.h.Created, 0)))
return created + " ago"
}

View File

@ -51,17 +51,21 @@ func TestHistoryContext_ID(t *testing.T) {
}
func TestHistoryContext_CreatedSince(t *testing.T) {
unixTime := time.Now().AddDate(0, 0, -7).Unix()
expected := "7 days ago"
var ctx historyContext
cases := []historyCase{
{
historyContext{
h: image.HistoryResponseItem{Created: unixTime},
h: image.HistoryResponseItem{Created: time.Now().AddDate(0, 0, -7).Unix()},
trunc: false,
human: true,
}, expected, ctx.CreatedSince,
}, "7 days ago", ctx.CreatedSince,
},
{
historyContext{
h: image.HistoryResponseItem{Created: time.Date(2009, time.November, 10, 23, 0, 0, 0, time.UTC).Unix()},
trunc: false,
human: false,
}, "2009-11-10T23:00:00Z", ctx.CreatedSince,
},
}

View File

@ -79,11 +79,16 @@ func ImageWrite(ctx ImageContext, images []types.ImageSummary) error {
return ctx.Write(newImageContext(), render)
}
// needDigest determines whether the image digest should be ignored or not when writing image context
func needDigest(ctx ImageContext) bool {
return ctx.Digest || ctx.Format.Contains("{{.Digest}}")
}
func imageFormat(ctx ImageContext, images []types.ImageSummary, format func(subContext subContext) error) error {
for _, image := range images {
images := []*imageContext{}
formatted := []*imageContext{}
if isDangling(image) {
images = append(images, &imageContext{
formatted = append(formatted, &imageContext{
trunc: ctx.Trunc,
i: image,
repo: "<none>",
@ -91,90 +96,9 @@ func imageFormat(ctx ImageContext, images []types.ImageSummary, format func(subC
digest: "<none>",
})
} else {
repoTags := map[string][]string{}
repoDigests := map[string][]string{}
for _, refString := range image.RepoTags {
ref, err := reference.ParseNormalizedNamed(refString)
if err != nil {
continue
}
if nt, ok := ref.(reference.NamedTagged); ok {
familiarRef := reference.FamiliarName(ref)
repoTags[familiarRef] = append(repoTags[familiarRef], nt.Tag())
}
}
for _, refString := range image.RepoDigests {
ref, err := reference.ParseNormalizedNamed(refString)
if err != nil {
continue
}
if c, ok := ref.(reference.Canonical); ok {
familiarRef := reference.FamiliarName(ref)
repoDigests[familiarRef] = append(repoDigests[familiarRef], c.Digest().String())
}
}
for repo, tags := range repoTags {
digests := repoDigests[repo]
// Do not display digests as their own row
delete(repoDigests, repo)
if !ctx.Digest {
// Ignore digest references, just show tag once
digests = nil
}
for _, tag := range tags {
if len(digests) == 0 {
images = append(images, &imageContext{
trunc: ctx.Trunc,
i: image,
repo: repo,
tag: tag,
digest: "<none>",
})
continue
}
// Display the digests for each tag
for _, dgst := range digests {
images = append(images, &imageContext{
trunc: ctx.Trunc,
i: image,
repo: repo,
tag: tag,
digest: dgst,
})
}
}
}
// Show rows for remaining digest only references
for repo, digests := range repoDigests {
// If digests are displayed, show row per digest
if ctx.Digest {
for _, dgst := range digests {
images = append(images, &imageContext{
trunc: ctx.Trunc,
i: image,
repo: repo,
tag: "<none>",
digest: dgst,
})
}
} else {
images = append(images, &imageContext{
trunc: ctx.Trunc,
i: image,
repo: repo,
tag: "<none>",
})
}
}
formatted = imageFormatTaggedAndDigest(ctx, image)
}
for _, imageCtx := range images {
for _, imageCtx := range formatted {
if err := format(imageCtx); err != nil {
return err
}
@ -183,6 +107,82 @@ func imageFormat(ctx ImageContext, images []types.ImageSummary, format func(subC
return nil
}
func imageFormatTaggedAndDigest(ctx ImageContext, image types.ImageSummary) []*imageContext {
repoTags := map[string][]string{}
repoDigests := map[string][]string{}
images := []*imageContext{}
for _, refString := range image.RepoTags {
ref, err := reference.ParseNormalizedNamed(refString)
if err != nil {
continue
}
if nt, ok := ref.(reference.NamedTagged); ok {
familiarRef := reference.FamiliarName(ref)
repoTags[familiarRef] = append(repoTags[familiarRef], nt.Tag())
}
}
for _, refString := range image.RepoDigests {
ref, err := reference.ParseNormalizedNamed(refString)
if err != nil {
continue
}
if c, ok := ref.(reference.Canonical); ok {
familiarRef := reference.FamiliarName(ref)
repoDigests[familiarRef] = append(repoDigests[familiarRef], c.Digest().String())
}
}
addImage := func(repo, tag, digest string) {
image := &imageContext{
trunc: ctx.Trunc,
i: image,
repo: repo,
tag: tag,
digest: digest,
}
images = append(images, image)
}
for repo, tags := range repoTags {
digests := repoDigests[repo]
// Do not display digests as their own row
delete(repoDigests, repo)
if !needDigest(ctx) {
// Ignore digest references, just show tag once
digests = nil
}
for _, tag := range tags {
if len(digests) == 0 {
addImage(repo, tag, "<none>")
continue
}
// Display the digests for each tag
for _, dgst := range digests {
addImage(repo, tag, dgst)
}
}
}
// Show rows for remaining digest only references
for repo, digests := range repoDigests {
// If digests are displayed, show row per digest
if ctx.Digest {
for _, dgst := range digests {
addImage(repo, "<none>", dgst)
}
} else {
addImage(repo, "<none>", "")
}
}
return images
}
type imageContext struct {
HeaderContext
trunc bool

View File

@ -55,6 +55,26 @@ func TestImageContext(t *testing.T) {
i: types.ImageSummary{},
digest: "sha256:d149ab53f8718e987c3a3024bb8aa0e2caadf6c0328f1d9d850b2a2a67f2819a",
}, "sha256:d149ab53f8718e987c3a3024bb8aa0e2caadf6c0328f1d9d850b2a2a67f2819a", ctx.Digest},
{
imageContext{
i: types.ImageSummary{Containers: 10},
}, "10", ctx.Containers,
},
{
imageContext{
i: types.ImageSummary{VirtualSize: 10000},
}, "10kB", ctx.VirtualSize,
},
{
imageContext{
i: types.ImageSummary{SharedSize: 10000},
}, "10kB", ctx.SharedSize,
},
{
imageContext{
i: types.ImageSummary{SharedSize: 5000, VirtualSize: 20000},
}, "15kB", ctx.UniqueSize,
},
}
for _, c := range cases {
@ -62,8 +82,8 @@ func TestImageContext(t *testing.T) {
v := c.call()
if strings.Contains(v, ",") {
compareMultipleValues(t, v, c.expValue)
} else if v != c.expValue {
t.Fatalf("Expected %s, was %s\n", c.expValue, v)
} else {
assert.Equal(t, c.expValue, v)
}
}
}
@ -137,6 +157,14 @@ image <none>
},
"REPOSITORY\nimage\nimage\n<none>\n",
},
{
ImageContext{
Context: Context{
Format: NewImageFormat("table {{.Digest}}", true, false),
},
},
"DIGEST\nsha256:cbbf2f9a99b47fc460d422812b6a5adff7dfee951d8fa2e4a98caa0382cfbdbf\n<none>\n<none>\n",
},
{
ImageContext{
Context: Context{

View File

@ -0,0 +1,104 @@
package formatter
import (
"strconv"
"strings"
registry "github.com/docker/docker/api/types/registry"
"github.com/docker/docker/pkg/stringutils"
)
const (
defaultSearchTableFormat = "table {{.Name}}\t{{.Description}}\t{{.StarCount}}\t{{.IsOfficial}}\t{{.IsAutomated}}"
starsHeader = "STARS"
officialHeader = "OFFICIAL"
automatedHeader = "AUTOMATED"
)
// NewSearchFormat returns a Format for rendering using a network Context
func NewSearchFormat(source string) Format {
switch source {
case "":
return defaultSearchTableFormat
case TableFormatKey:
return defaultSearchTableFormat
}
return Format(source)
}
// SearchWrite writes the context
func SearchWrite(ctx Context, results []registry.SearchResult, auto bool, stars int) error {
render := func(format func(subContext subContext) error) error {
for _, result := range results {
// --automated and -s, --stars are deprecated since Docker 1.12
if (auto && !result.IsAutomated) || (stars > result.StarCount) {
continue
}
searchCtx := &searchContext{trunc: ctx.Trunc, s: result}
if err := format(searchCtx); err != nil {
return err
}
}
return nil
}
searchCtx := searchContext{}
searchCtx.header = map[string]string{
"Name": nameHeader,
"Description": descriptionHeader,
"StarCount": starsHeader,
"IsOfficial": officialHeader,
"IsAutomated": automatedHeader,
}
return ctx.Write(&searchCtx, render)
}
type searchContext struct {
HeaderContext
trunc bool
json bool
s registry.SearchResult
}
func (c *searchContext) MarshalJSON() ([]byte, error) {
c.json = true
return marshalJSON(c)
}
func (c *searchContext) Name() string {
return c.s.Name
}
func (c *searchContext) Description() string {
desc := strings.Replace(c.s.Description, "\n", " ", -1)
desc = strings.Replace(desc, "\r", " ", -1)
if c.trunc {
desc = stringutils.Ellipsis(desc, 45)
}
return desc
}
func (c *searchContext) StarCount() string {
return strconv.Itoa(c.s.StarCount)
}
func (c *searchContext) formatBool(value bool) string {
switch {
case value && c.json:
return "true"
case value:
return "[OK]"
case c.json:
return "false"
default:
return ""
}
}
func (c *searchContext) IsOfficial() string {
return c.formatBool(c.s.IsOfficial)
}
func (c *searchContext) IsAutomated() string {
return c.formatBool(c.s.IsAutomated)
}

View File

@ -0,0 +1,284 @@
package formatter
import (
"bytes"
"encoding/json"
"strings"
"testing"
registrytypes "github.com/docker/docker/api/types/registry"
"github.com/docker/docker/pkg/stringutils"
"github.com/stretchr/testify/assert"
)
func TestSearchContext(t *testing.T) {
name := "nginx"
starCount := 5000
var ctx searchContext
cases := []struct {
searchCtx searchContext
expValue string
call func() string
}{
{searchContext{
s: registrytypes.SearchResult{Name: name},
}, name, ctx.Name},
{searchContext{
s: registrytypes.SearchResult{StarCount: starCount},
}, "5000", ctx.StarCount},
{searchContext{
s: registrytypes.SearchResult{IsOfficial: true},
}, "[OK]", ctx.IsOfficial},
{searchContext{
s: registrytypes.SearchResult{IsOfficial: false},
}, "", ctx.IsOfficial},
{searchContext{
s: registrytypes.SearchResult{IsAutomated: true},
}, "[OK]", ctx.IsAutomated},
{searchContext{
s: registrytypes.SearchResult{IsAutomated: false},
}, "", ctx.IsAutomated},
}
for _, c := range cases {
ctx = c.searchCtx
v := c.call()
if strings.Contains(v, ",") {
compareMultipleValues(t, v, c.expValue)
} else if v != c.expValue {
t.Fatalf("Expected %s, was %s\n", c.expValue, v)
}
}
}
func TestSearchContextDescription(t *testing.T) {
shortDescription := "Official build of Nginx."
longDescription := "Automated Nginx reverse proxy for docker containers"
descriptionWReturns := "Automated\nNginx reverse\rproxy\rfor docker\ncontainers"
var ctx searchContext
cases := []struct {
searchCtx searchContext
expValue string
call func() string
}{
{searchContext{
s: registrytypes.SearchResult{Description: shortDescription},
trunc: true,
}, shortDescription, ctx.Description},
{searchContext{
s: registrytypes.SearchResult{Description: shortDescription},
trunc: false,
}, shortDescription, ctx.Description},
{searchContext{
s: registrytypes.SearchResult{Description: longDescription},
trunc: false,
}, longDescription, ctx.Description},
{searchContext{
s: registrytypes.SearchResult{Description: longDescription},
trunc: true,
}, stringutils.Ellipsis(longDescription, 45), ctx.Description},
{searchContext{
s: registrytypes.SearchResult{Description: descriptionWReturns},
trunc: false,
}, longDescription, ctx.Description},
{searchContext{
s: registrytypes.SearchResult{Description: descriptionWReturns},
trunc: true,
}, stringutils.Ellipsis(longDescription, 45), ctx.Description},
}
for _, c := range cases {
ctx = c.searchCtx
v := c.call()
if strings.Contains(v, ",") {
compareMultipleValues(t, v, c.expValue)
} else if v != c.expValue {
t.Fatalf("Expected %s, was %s\n", c.expValue, v)
}
}
}
func TestSearchContextWrite(t *testing.T) {
cases := []struct {
context Context
expected string
}{
// Errors
{
Context{Format: "{{InvalidFunction}}"},
`Template parsing error: template: :1: function "InvalidFunction" not defined
`,
},
{
Context{Format: "{{nil}}"},
`Template parsing error: template: :1:2: executing "" at <nil>: nil is not a command
`,
},
// Table format
{
Context{Format: NewSearchFormat("table")},
`NAME DESCRIPTION STARS OFFICIAL AUTOMATED
result1 Official build 5000 [OK]
result2 Not official 5 [OK]
`,
},
{
Context{Format: NewSearchFormat("table {{.Name}}")},
`NAME
result1
result2
`,
},
// Custom Format
{
Context{Format: NewSearchFormat("{{.Name}}")},
`result1
result2
`,
},
// Custom Format with CreatedAt
{
Context{Format: NewSearchFormat("{{.Name}} {{.StarCount}}")},
`result1 5000
result2 5
`,
},
}
for _, testcase := range cases {
results := []registrytypes.SearchResult{
{Name: "result1", Description: "Official build", StarCount: 5000, IsOfficial: true, IsAutomated: false},
{Name: "result2", Description: "Not official", StarCount: 5, IsOfficial: false, IsAutomated: true},
}
out := bytes.NewBufferString("")
testcase.context.Output = out
err := SearchWrite(testcase.context, results, false, 0)
if err != nil {
assert.Error(t, err, testcase.expected)
} else {
assert.Equal(t, out.String(), testcase.expected)
}
}
}
func TestSearchContextWriteAutomated(t *testing.T) {
cases := []struct {
context Context
expected string
}{
// Table format
{
Context{Format: NewSearchFormat("table")},
`NAME DESCRIPTION STARS OFFICIAL AUTOMATED
result2 Not official 5 [OK]
`,
},
{
Context{Format: NewSearchFormat("table {{.Name}}")},
`NAME
result2
`,
},
}
for _, testcase := range cases {
results := []registrytypes.SearchResult{
{Name: "result1", Description: "Official build", StarCount: 5000, IsOfficial: true, IsAutomated: false},
{Name: "result2", Description: "Not official", StarCount: 5, IsOfficial: false, IsAutomated: true},
}
out := bytes.NewBufferString("")
testcase.context.Output = out
err := SearchWrite(testcase.context, results, true, 0)
if err != nil {
assert.Error(t, err, testcase.expected)
} else {
assert.Equal(t, out.String(), testcase.expected)
}
}
}
func TestSearchContextWriteStars(t *testing.T) {
cases := []struct {
context Context
expected string
}{
// Table format
{
Context{Format: NewSearchFormat("table")},
`NAME DESCRIPTION STARS OFFICIAL AUTOMATED
result1 Official build 5000 [OK]
`,
},
{
Context{Format: NewSearchFormat("table {{.Name}}")},
`NAME
result1
`,
},
}
for _, testcase := range cases {
results := []registrytypes.SearchResult{
{Name: "result1", Description: "Official build", StarCount: 5000, IsOfficial: true, IsAutomated: false},
{Name: "result2", Description: "Not official", StarCount: 5, IsOfficial: false, IsAutomated: true},
}
out := bytes.NewBufferString("")
testcase.context.Output = out
err := SearchWrite(testcase.context, results, false, 6)
if err != nil {
assert.Error(t, err, testcase.expected)
} else {
assert.Equal(t, out.String(), testcase.expected)
}
}
}
func TestSearchContextWriteJSON(t *testing.T) {
results := []registrytypes.SearchResult{
{Name: "result1", Description: "Official build", StarCount: 5000, IsOfficial: true, IsAutomated: false},
{Name: "result2", Description: "Not official", StarCount: 5, IsOfficial: false, IsAutomated: true},
}
expectedJSONs := []map[string]interface{}{
{"Name": "result1", "Description": "Official build", "StarCount": "5000", "IsOfficial": "true", "IsAutomated": "false"},
{"Name": "result2", "Description": "Not official", "StarCount": "5", "IsOfficial": "false", "IsAutomated": "true"},
}
out := bytes.NewBufferString("")
err := SearchWrite(Context{Format: "{{json .}}", Output: out}, results, false, 0)
if err != nil {
t.Fatal(err)
}
for i, line := range strings.Split(strings.TrimSpace(out.String()), "\n") {
t.Logf("Output: line %d: %s", i, line)
var m map[string]interface{}
if err := json.Unmarshal([]byte(line), &m); err != nil {
t.Fatal(err)
}
assert.Equal(t, m, expectedJSONs[i])
}
}
func TestSearchContextWriteJSONField(t *testing.T) {
results := []registrytypes.SearchResult{
{Name: "result1", Description: "Official build", StarCount: 5000, IsOfficial: true, IsAutomated: false},
{Name: "result2", Description: "Not official", StarCount: 5, IsOfficial: false, IsAutomated: true},
}
out := bytes.NewBufferString("")
err := SearchWrite(Context{Format: "{{json .Name}}", Output: out}, results, false, 0)
if err != nil {
t.Fatal(err)
}
for i, line := range strings.Split(strings.TrimSpace(out.String()), "\n") {
t.Logf("Output: line %d: %s", i, line)
var s string
if err := json.Unmarshal([]byte(line), &s); err != nil {
t.Fatal(err)
}
assert.Equal(t, s, results[i].Name)
}
}

View File

@ -504,7 +504,10 @@ func (c *serviceContext) Replicas() string {
}
func (c *serviceContext) Image() string {
image := c.service.Spec.TaskTemplate.ContainerSpec.Image
var image string
if c.service.Spec.TaskTemplate.ContainerSpec != nil {
image = c.service.Spec.TaskTemplate.ContainerSpec.Image
}
if ref, err := reference.ParseNormalizedNamed(image); err == nil {
// update image string for display, (strips any digest)
if nt, ok := ref.(reference.NamedTagged); ok {
@ -518,11 +521,11 @@ func (c *serviceContext) Image() string {
}
func (c *serviceContext) Ports() string {
if c.service.Spec.EndpointSpec == nil || c.service.Spec.EndpointSpec.Ports == nil {
if c.service.Endpoint.Ports == nil {
return ""
}
ports := []string{}
for _, pConfig := range c.service.Spec.EndpointSpec.Ports {
for _, pConfig := range c.service.Endpoint.Ports {
if pConfig.PublishMode == swarm.PortConfigPublishModeIngress {
ports = append(ports, fmt.Sprintf("*:%d->%d/%s",
pConfig.PublishedPort,

View File

@ -96,14 +96,14 @@ bar
ID: "id_baz",
Spec: swarm.ServiceSpec{
Annotations: swarm.Annotations{Name: "baz"},
EndpointSpec: &swarm.EndpointSpec{
Ports: []swarm.PortConfig{
{
PublishMode: "ingress",
PublishedPort: 80,
TargetPort: 8080,
Protocol: "tcp",
},
},
Endpoint: swarm.Endpoint{
Ports: []swarm.PortConfig{
{
PublishMode: "ingress",
PublishedPort: 80,
TargetPort: 8080,
Protocol: "tcp",
},
},
},
@ -112,14 +112,14 @@ bar
ID: "id_bar",
Spec: swarm.ServiceSpec{
Annotations: swarm.Annotations{Name: "bar"},
EndpointSpec: &swarm.EndpointSpec{
Ports: []swarm.PortConfig{
{
PublishMode: "ingress",
PublishedPort: 80,
TargetPort: 8080,
Protocol: "tcp",
},
},
Endpoint: swarm.Endpoint{
Ports: []swarm.PortConfig{
{
PublishMode: "ingress",
PublishedPort: 80,
TargetPort: 8080,
Protocol: "tcp",
},
},
},
@ -152,14 +152,14 @@ func TestServiceContextWriteJSON(t *testing.T) {
ID: "id_baz",
Spec: swarm.ServiceSpec{
Annotations: swarm.Annotations{Name: "baz"},
EndpointSpec: &swarm.EndpointSpec{
Ports: []swarm.PortConfig{
{
PublishMode: "ingress",
PublishedPort: 80,
TargetPort: 8080,
Protocol: "tcp",
},
},
Endpoint: swarm.Endpoint{
Ports: []swarm.PortConfig{
{
PublishMode: "ingress",
PublishedPort: 80,
TargetPort: 8080,
Protocol: "tcp",
},
},
},
@ -168,14 +168,14 @@ func TestServiceContextWriteJSON(t *testing.T) {
ID: "id_bar",
Spec: swarm.ServiceSpec{
Annotations: swarm.Annotations{Name: "bar"},
EndpointSpec: &swarm.EndpointSpec{
Ports: []swarm.PortConfig{
{
PublishMode: "ingress",
PublishedPort: 80,
TargetPort: 8080,
Protocol: "tcp",
},
},
Endpoint: swarm.Endpoint{
Ports: []swarm.PortConfig{
{
PublishMode: "ingress",
PublishedPort: 80,
TargetPort: 8080,
Protocol: "tcp",
},
},
},

View File

@ -5,7 +5,7 @@ import (
"github.com/docker/docker/api/types/swarm"
// Import builders to get the builder function as package function
. "github.com/docker/cli/cli/internal/test/builders"
. "github.com/docker/cli/internal/test/builders"
"github.com/pkg/errors"
"github.com/stretchr/testify/assert"
"golang.org/x/net/context"

View File

@ -12,7 +12,6 @@ import (
"regexp"
"runtime"
"github.com/Sirupsen/logrus"
"github.com/docker/cli/cli"
"github.com/docker/cli/cli/command"
"github.com/docker/cli/cli/command/image/build"
@ -28,6 +27,7 @@ import (
"github.com/docker/docker/pkg/urlutil"
units "github.com/docker/go-units"
"github.com/pkg/errors"
"github.com/sirupsen/logrus"
"github.com/spf13/cobra"
"golang.org/x/net/context"
)

View File

@ -11,8 +11,8 @@ import (
"strings"
"testing"
"github.com/docker/cli/internal/test/testutil"
"github.com/docker/docker/pkg/archive"
"github.com/docker/docker/pkg/testutil"
"github.com/stretchr/testify/assert"
"github.com/stretchr/testify/require"
)

View File

@ -17,9 +17,9 @@ import (
"github.com/docker/cli/cli/command/image/build"
cliconfig "github.com/docker/cli/cli/config"
"github.com/docker/docker/api/types/versions"
"github.com/docker/docker/client/session"
"github.com/docker/docker/client/session/filesync"
"github.com/docker/docker/pkg/progress"
"github.com/moby/buildkit/session"
"github.com/moby/buildkit/session/filesync"
"github.com/pkg/errors"
"golang.org/x/time/rate"
)

View File

@ -10,7 +10,7 @@ import (
"testing"
"github.com/docker/cli/cli/command"
"github.com/docker/cli/cli/internal/test"
"github.com/docker/cli/internal/test"
"github.com/docker/docker/api/types"
"github.com/docker/docker/pkg/archive"
"github.com/stretchr/testify/assert"
@ -68,3 +68,37 @@ func TestRunBuildDockerfileFromStdinWithCompress(t *testing.T) {
sort.Strings(actual)
assert.Equal(t, []string{dockerfileName, ".dockerignore", "foo"}, actual)
}
// TestRunBuildFromLocalGitHubDirNonExistingRepo tests that build contexts
// starting with `github.com/` are special-cased, and the build command attempts
// to clone the remote repo.
func TestRunBuildFromGitHubSpecialCase(t *testing.T) {
cmd := NewBuildCommand(test.NewFakeCli(nil))
cmd.SetArgs([]string{"github.com/docker/no-such-repository"})
cmd.SetOutput(ioutil.Discard)
err := cmd.Execute()
assert.Error(t, err)
assert.Contains(t, err.Error(), "unable to prepare context: unable to 'git clone'")
}
// TestRunBuildFromLocalGitHubDirNonExistingRepo tests that a local directory
// starting with `github.com` takes precedence over the `github.com` special
// case.
func TestRunBuildFromLocalGitHubDir(t *testing.T) {
tmpDir, err := ioutil.TempDir("", "docker-build-from-local-dir-")
require.NoError(t, err)
defer os.RemoveAll(tmpDir)
buildDir := filepath.Join(tmpDir, "github.com", "docker", "no-such-repository")
err = os.MkdirAll(buildDir, 0777)
require.NoError(t, err)
err = ioutil.WriteFile(filepath.Join(buildDir, "Dockerfile"), []byte("FROM busybox\n"), 0644)
require.NoError(t, err)
client := test.NewFakeCli(&fakeClient{})
cmd := NewBuildCommand(client)
cmd.SetArgs([]string{buildDir})
cmd.SetOutput(ioutil.Discard)
err = cmd.Execute()
require.NoError(t, err)
}

View File

@ -3,14 +3,13 @@ package image
import (
"fmt"
"io/ioutil"
"regexp"
"testing"
"time"
"github.com/docker/cli/cli/internal/test"
"github.com/docker/cli/internal/test"
"github.com/docker/cli/internal/test/testutil"
"github.com/docker/docker/api/types/image"
"github.com/docker/docker/pkg/testutil"
"github.com/docker/docker/pkg/testutil/golden"
"github.com/gotestyourself/gotestyourself/golden"
"github.com/pkg/errors"
"github.com/stretchr/testify/assert"
)
@ -25,7 +24,7 @@ func TestNewHistoryCommandErrors(t *testing.T) {
{
name: "wrong-args",
args: []string{},
expectedError: "requires exactly 1 argument(s).",
expectedError: "requires exactly 1 argument.",
},
{
name: "client-error",
@ -96,11 +95,9 @@ func TestNewHistoryCommandSuccess(t *testing.T) {
assert.NoError(t, err)
actual := cli.OutBuffer().String()
if tc.outputRegex == "" {
expected := string(golden.Get(t, []byte(actual), fmt.Sprintf("history-command-success.%s.golden", tc.name))[:])
testutil.EqualNormalizedString(t, testutil.RemoveSpace, actual, expected)
golden.Assert(t, actual, fmt.Sprintf("history-command-success.%s.golden", tc.name))
} else {
match, _ := regexp.MatchString(tc.outputRegex, actual)
assert.True(t, match)
assert.Regexp(t, tc.outputRegex, actual)
}
}
}

View File

@ -1,15 +1,14 @@
package image
import (
"bytes"
"io"
"io/ioutil"
"strings"
"testing"
"github.com/docker/cli/cli/internal/test"
"github.com/docker/cli/internal/test"
"github.com/docker/cli/internal/test/testutil"
"github.com/docker/docker/api/types"
"github.com/docker/docker/pkg/testutil"
"github.com/pkg/errors"
"github.com/stretchr/testify/assert"
)
@ -24,7 +23,7 @@ func TestNewImportCommandErrors(t *testing.T) {
{
name: "wrong-args",
args: []string{},
expectedError: "requires at least 1 argument(s).",
expectedError: "requires at least 1 argument.",
},
{
name: "import-failed",
@ -36,8 +35,7 @@ func TestNewImportCommandErrors(t *testing.T) {
},
}
for _, tc := range testCases {
buf := new(bytes.Buffer)
cmd := NewImportCommand(test.NewFakeCliWithOutput(&fakeClient{imageImportFunc: tc.imageImportFunc}, buf))
cmd := NewImportCommand(test.NewFakeCli(&fakeClient{imageImportFunc: tc.imageImportFunc}))
cmd.SetOutput(ioutil.Discard)
cmd.SetArgs(tc.args)
testutil.ErrorContains(t, cmd.Execute(), tc.expectedError)
@ -91,8 +89,7 @@ func TestNewImportCommandSuccess(t *testing.T) {
},
}
for _, tc := range testCases {
buf := new(bytes.Buffer)
cmd := NewImportCommand(test.NewFakeCliWithOutput(&fakeClient{imageImportFunc: tc.imageImportFunc}, buf))
cmd := NewImportCommand(test.NewFakeCli(&fakeClient{imageImportFunc: tc.imageImportFunc}))
cmd.SetOutput(ioutil.Discard)
cmd.SetArgs(tc.args)
assert.NoError(t, cmd.Execute())

View File

@ -1,15 +1,14 @@
package image
import (
"bytes"
"fmt"
"io/ioutil"
"testing"
"github.com/docker/cli/cli/internal/test"
"github.com/docker/cli/internal/test"
"github.com/docker/cli/internal/test/testutil"
"github.com/docker/docker/api/types"
"github.com/docker/docker/pkg/testutil"
"github.com/docker/docker/pkg/testutil/golden"
"github.com/gotestyourself/gotestyourself/golden"
"github.com/stretchr/testify/assert"
)
@ -22,12 +21,11 @@ func TestNewInspectCommandErrors(t *testing.T) {
{
name: "wrong-args",
args: []string{},
expectedError: "requires at least 1 argument(s).",
expectedError: "requires at least 1 argument.",
},
}
for _, tc := range testCases {
buf := new(bytes.Buffer)
cmd := newInspectCommand(test.NewFakeCliWithOutput(&fakeClient{}, buf))
cmd := newInspectCommand(test.NewFakeCli(&fakeClient{}))
cmd.SetOutput(ioutil.Discard)
cmd.SetArgs(tc.args)
testutil.ErrorContains(t, cmd.Execute(), tc.expectedError)
@ -78,15 +76,13 @@ func TestNewInspectCommandSuccess(t *testing.T) {
}
for _, tc := range testCases {
imageInspectInvocationCount = 0
buf := new(bytes.Buffer)
cmd := newInspectCommand(test.NewFakeCliWithOutput(&fakeClient{imageInspectFunc: tc.imageInspectFunc}, buf))
cli := test.NewFakeCli(&fakeClient{imageInspectFunc: tc.imageInspectFunc})
cmd := newInspectCommand(cli)
cmd.SetOutput(ioutil.Discard)
cmd.SetArgs(tc.args)
err := cmd.Execute()
assert.NoError(t, err)
actual := buf.String()
expected := string(golden.Get(t, []byte(actual), fmt.Sprintf("inspect-command-success.%s.golden", tc.name))[:])
testutil.EqualNormalizedString(t, testutil.RemoveSpace, actual, expected)
golden.Assert(t, cli.OutBuffer().String(), fmt.Sprintf("inspect-command-success.%s.golden", tc.name))
assert.Equal(t, imageInspectInvocationCount, tc.imageCount)
}
}

View File

@ -1,16 +1,15 @@
package image
import (
"bytes"
"fmt"
"io/ioutil"
"testing"
"github.com/docker/cli/cli/config/configfile"
"github.com/docker/cli/cli/internal/test"
"github.com/docker/cli/internal/test"
"github.com/docker/cli/internal/test/testutil"
"github.com/docker/docker/api/types"
"github.com/docker/docker/pkg/testutil"
"github.com/docker/docker/pkg/testutil/golden"
"github.com/gotestyourself/gotestyourself/golden"
"github.com/pkg/errors"
"github.com/stretchr/testify/assert"
)
@ -25,7 +24,7 @@ func TestNewImagesCommandErrors(t *testing.T) {
{
name: "wrong-args",
args: []string{"arg1", "arg2"},
expectedError: "requires at most 1 argument(s).",
expectedError: "requires at most 1 argument.",
},
{
name: "failed-list",
@ -80,17 +79,14 @@ func TestNewImagesCommandSuccess(t *testing.T) {
},
}
for _, tc := range testCases {
buf := new(bytes.Buffer)
cli := test.NewFakeCliWithOutput(&fakeClient{imageListFunc: tc.imageListFunc}, buf)
cli := test.NewFakeCli(&fakeClient{imageListFunc: tc.imageListFunc})
cli.SetConfigFile(&configfile.ConfigFile{ImagesFormat: tc.imageFormat})
cmd := NewImagesCommand(cli)
cmd.SetOutput(ioutil.Discard)
cmd.SetArgs(tc.args)
err := cmd.Execute()
assert.NoError(t, err)
actual := buf.String()
expected := string(golden.Get(t, []byte(actual), fmt.Sprintf("list-command-success.%s.golden", tc.name))[:])
testutil.EqualNormalizedString(t, testutil.RemoveSpace, actual, expected)
golden.Assert(t, cli.OutBuffer().String(), fmt.Sprintf("list-command-success.%s.golden", tc.name))
}
}

View File

@ -1,17 +1,16 @@
package image
import (
"bytes"
"fmt"
"io"
"io/ioutil"
"strings"
"testing"
"github.com/docker/cli/cli/internal/test"
"github.com/docker/cli/internal/test"
"github.com/docker/cli/internal/test/testutil"
"github.com/docker/docker/api/types"
"github.com/docker/docker/pkg/testutil"
"github.com/docker/docker/pkg/testutil/golden"
"github.com/gotestyourself/gotestyourself/golden"
"github.com/pkg/errors"
"github.com/stretchr/testify/assert"
)
@ -27,7 +26,7 @@ func TestNewLoadCommandErrors(t *testing.T) {
{
name: "wrong-args",
args: []string{"arg"},
expectedError: "accepts no argument(s).",
expectedError: "accepts no arguments.",
},
{
name: "input-to-terminal",
@ -92,14 +91,12 @@ func TestNewLoadCommandSuccess(t *testing.T) {
},
}
for _, tc := range testCases {
buf := new(bytes.Buffer)
cmd := NewLoadCommand(test.NewFakeCliWithOutput(&fakeClient{imageLoadFunc: tc.imageLoadFunc}, buf))
cli := test.NewFakeCli(&fakeClient{imageLoadFunc: tc.imageLoadFunc})
cmd := NewLoadCommand(cli)
cmd.SetOutput(ioutil.Discard)
cmd.SetArgs(tc.args)
err := cmd.Execute()
assert.NoError(t, err)
actual := buf.String()
expected := string(golden.Get(t, []byte(actual), fmt.Sprintf("load-command-success.%s.golden", tc.name))[:])
testutil.EqualNormalizedString(t, testutil.RemoveSpace, actual, expected)
golden.Assert(t, cli.OutBuffer().String(), fmt.Sprintf("load-command-success.%s.golden", tc.name))
}
}

View File

@ -1,16 +1,15 @@
package image
import (
"bytes"
"fmt"
"io/ioutil"
"testing"
"github.com/docker/cli/cli/internal/test"
"github.com/docker/cli/internal/test"
"github.com/docker/cli/internal/test/testutil"
"github.com/docker/docker/api/types"
"github.com/docker/docker/api/types/filters"
"github.com/docker/docker/pkg/testutil"
"github.com/docker/docker/pkg/testutil/golden"
"github.com/gotestyourself/gotestyourself/golden"
"github.com/pkg/errors"
"github.com/stretchr/testify/assert"
)
@ -25,7 +24,7 @@ func TestNewPruneCommandErrors(t *testing.T) {
{
name: "wrong-args",
args: []string{"something"},
expectedError: "accepts no argument(s).",
expectedError: "accepts no arguments.",
},
{
name: "prune-error",
@ -37,10 +36,9 @@ func TestNewPruneCommandErrors(t *testing.T) {
},
}
for _, tc := range testCases {
buf := new(bytes.Buffer)
cmd := NewPruneCommand(test.NewFakeCliWithOutput(&fakeClient{
cmd := NewPruneCommand(test.NewFakeCli(&fakeClient{
imagesPruneFunc: tc.imagesPruneFunc,
}, buf))
}))
cmd.SetOutput(ioutil.Discard)
cmd.SetArgs(tc.args)
testutil.ErrorContains(t, cmd.Execute(), tc.expectedError)
@ -85,16 +83,12 @@ func TestNewPruneCommandSuccess(t *testing.T) {
},
}
for _, tc := range testCases {
buf := new(bytes.Buffer)
cmd := NewPruneCommand(test.NewFakeCliWithOutput(&fakeClient{
imagesPruneFunc: tc.imagesPruneFunc,
}, buf))
cli := test.NewFakeCli(&fakeClient{imagesPruneFunc: tc.imagesPruneFunc})
cmd := NewPruneCommand(cli)
cmd.SetOutput(ioutil.Discard)
cmd.SetArgs(tc.args)
err := cmd.Execute()
assert.NoError(t, err)
actual := buf.String()
expected := string(golden.Get(t, []byte(actual), fmt.Sprintf("prune-command-success.%s.golden", tc.name))[:])
testutil.EqualNormalizedString(t, testutil.RemoveSpace, actual, expected)
golden.Assert(t, cli.OutBuffer().String(), fmt.Sprintf("prune-command-success.%s.golden", tc.name))
}
}

View File

@ -5,9 +5,9 @@ import (
"io/ioutil"
"testing"
"github.com/docker/cli/cli/internal/test"
"github.com/docker/docker/pkg/testutil"
"github.com/docker/docker/pkg/testutil/golden"
"github.com/docker/cli/internal/test"
"github.com/docker/cli/internal/test/testutil"
"github.com/gotestyourself/gotestyourself/golden"
"github.com/stretchr/testify/assert"
)
@ -19,7 +19,7 @@ func TestNewPullCommandErrors(t *testing.T) {
}{
{
name: "wrong-args",
expectedError: "requires exactly 1 argument(s).",
expectedError: "requires exactly 1 argument.",
args: []string{},
},
{
@ -68,8 +68,6 @@ func TestNewPullCommandSuccess(t *testing.T) {
cmd.SetArgs(tc.args)
err := cmd.Execute()
assert.NoError(t, err)
actual := cli.OutBuffer().String()
expected := string(golden.Get(t, []byte(actual), fmt.Sprintf("pull-command-success.%s.golden", tc.name))[:])
testutil.EqualNormalizedString(t, testutil.RemoveSpace, actual, expected)
golden.Assert(t, cli.OutBuffer().String(), fmt.Sprintf("pull-command-success.%s.golden", tc.name))
}
}

View File

@ -6,9 +6,9 @@ import (
"strings"
"testing"
"github.com/docker/cli/cli/internal/test"
"github.com/docker/cli/internal/test"
"github.com/docker/cli/internal/test/testutil"
"github.com/docker/docker/api/types"
"github.com/docker/docker/pkg/testutil"
"github.com/pkg/errors"
"github.com/stretchr/testify/assert"
)
@ -23,7 +23,7 @@ func TestNewPushCommandErrors(t *testing.T) {
{
name: "wrong-args",
args: []string{},
expectedError: "requires exactly 1 argument(s).",
expectedError: "requires exactly 1 argument.",
},
{
name: "invalid-name",

View File

@ -5,10 +5,10 @@ import (
"io/ioutil"
"testing"
"github.com/docker/cli/cli/internal/test"
"github.com/docker/cli/internal/test"
"github.com/docker/cli/internal/test/testutil"
"github.com/docker/docker/api/types"
"github.com/docker/docker/pkg/testutil"
"github.com/docker/docker/pkg/testutil/golden"
"github.com/gotestyourself/gotestyourself/golden"
"github.com/pkg/errors"
"github.com/stretchr/testify/assert"
)
@ -29,7 +29,7 @@ func TestNewRemoveCommandErrors(t *testing.T) {
}{
{
name: "wrong args",
expectedError: "requires at least 1 argument(s).",
expectedError: "requires at least 1 argument.",
},
{
name: "ImageRemove fail",
@ -96,16 +96,14 @@ func TestNewRemoveCommandSuccess(t *testing.T) {
},
}
for _, tc := range testCases {
fakeCli := test.NewFakeCli(&fakeClient{imageRemoveFunc: tc.imageRemoveFunc})
cmd := NewRemoveCommand(fakeCli)
cli := test.NewFakeCli(&fakeClient{imageRemoveFunc: tc.imageRemoveFunc})
cmd := NewRemoveCommand(cli)
cmd.SetOutput(ioutil.Discard)
cmd.SetArgs(tc.args)
assert.NoError(t, cmd.Execute())
if tc.expectedErrMsg != "" {
assert.Equal(t, tc.expectedErrMsg, fakeCli.ErrBuffer().String())
assert.Equal(t, tc.expectedErrMsg, cli.ErrBuffer().String())
}
actual := fakeCli.OutBuffer().String()
expected := string(golden.Get(t, []byte(actual), fmt.Sprintf("remove-command-success.%s.golden", tc.name))[:])
testutil.EqualNormalizedString(t, testutil.RemoveSpace, actual, expected)
golden.Assert(t, cli.OutBuffer().String(), fmt.Sprintf("remove-command-success.%s.golden", tc.name))
}
}

View File

@ -2,6 +2,8 @@ package image
import (
"io"
"os"
"path/filepath"
"github.com/docker/cli/cli"
"github.com/docker/cli/cli/command"
@ -41,6 +43,10 @@ func runSave(dockerCli command.Cli, opts saveOptions) error {
return errors.New("cowardly refusing to save to a terminal. Use the -o flag or redirect")
}
if err := validateOutputPath(opts.output); err != nil {
return errors.Wrap(err, "failed to save image")
}
responseBody, err := dockerCli.Client().ImageSave(context.Background(), opts.images)
if err != nil {
return err
@ -54,3 +60,13 @@ func runSave(dockerCli command.Cli, opts saveOptions) error {
return command.CopyToFile(opts.output, responseBody)
}
func validateOutputPath(path string) error {
dir := filepath.Dir(path)
if dir != "" && dir != "." {
if _, err := os.Stat(dir); os.IsNotExist(err) {
return errors.Errorf("unable to validate output path: directory %q does not exist", dir)
}
}
return nil
}

View File

@ -1,15 +1,14 @@
package image
import (
"bytes"
"io"
"io/ioutil"
"os"
"strings"
"testing"
"github.com/docker/cli/cli/internal/test"
"github.com/docker/docker/pkg/testutil"
"github.com/docker/cli/internal/test"
"github.com/docker/cli/internal/test/testutil"
"github.com/pkg/errors"
"github.com/stretchr/testify/assert"
"github.com/stretchr/testify/require"
@ -26,7 +25,7 @@ func TestNewSaveCommandErrors(t *testing.T) {
{
name: "wrong args",
args: []string{},
expectedError: "requires at least 1 argument(s).",
expectedError: "requires at least 1 argument.",
},
{
name: "output to terminal",
@ -43,6 +42,11 @@ func TestNewSaveCommandErrors(t *testing.T) {
return ioutil.NopCloser(strings.NewReader("")), errors.Errorf("error saving image")
},
},
{
name: "output directory does not exist",
args: []string{"-o", "fakedir/out.tar", "arg1"},
expectedError: "failed to save image: unable to validate output path: directory \"fakedir\" does not exist",
},
}
for _, tc := range testCases {
cli := test.NewFakeCli(&fakeClient{imageSaveFunc: tc.imageSaveFunc})
@ -85,11 +89,11 @@ func TestNewSaveCommandSuccess(t *testing.T) {
},
}
for _, tc := range testCases {
cmd := NewSaveCommand(test.NewFakeCliWithOutput(&fakeClient{
cmd := NewSaveCommand(test.NewFakeCli(&fakeClient{
imageSaveFunc: func(images []string) (io.ReadCloser, error) {
return ioutil.NopCloser(strings.NewReader("")), nil
},
}, new(bytes.Buffer)))
}))
cmd.SetOutput(ioutil.Discard)
cmd.SetArgs(tc.args)
assert.NoError(t, cmd.Execute())

View File

@ -4,8 +4,8 @@ import (
"io/ioutil"
"testing"
"github.com/docker/cli/cli/internal/test"
"github.com/docker/docker/pkg/testutil"
"github.com/docker/cli/internal/test"
"github.com/docker/cli/internal/test/testutil"
"github.com/stretchr/testify/assert"
)
@ -15,7 +15,7 @@ func TestCliNewTagCommandErrors(t *testing.T) {
{"image1"},
{"image1", "image2", "image3"},
}
expectedError := "\"tag\" requires exactly 2 argument(s)."
expectedError := "\"tag\" requires exactly 2 arguments."
for _, args := range testCases {
cmd := NewTagCommand(test.NewFakeCli(&fakeClient{}))
cmd.SetArgs(args)

View File

@ -8,7 +8,6 @@ import (
"path"
"sort"
"github.com/Sirupsen/logrus"
"github.com/docker/cli/cli/command"
"github.com/docker/cli/cli/trust"
"github.com/docker/distribution/reference"
@ -19,6 +18,7 @@ import (
"github.com/docker/notary/tuf/data"
"github.com/opencontainers/go-digest"
"github.com/pkg/errors"
"github.com/sirupsen/logrus"
"golang.org/x/net/context"
)

View File

@ -7,10 +7,10 @@ import (
"strings"
"text/template"
"github.com/Sirupsen/logrus"
"github.com/docker/cli/cli"
"github.com/docker/docker/pkg/templates"
"github.com/docker/cli/templates"
"github.com/pkg/errors"
"github.com/sirupsen/logrus"
)
// Inspector defines an interface to implement to process elements

View File

@ -5,7 +5,7 @@ import (
"strings"
"testing"
"github.com/docker/docker/pkg/templates"
"github.com/docker/cli/templates"
"github.com/stretchr/testify/assert"
"github.com/stretchr/testify/require"
)

View File

@ -2,13 +2,16 @@ package network
import (
"github.com/docker/docker/api/types"
"github.com/docker/docker/api/types/network"
"github.com/docker/docker/client"
"golang.org/x/net/context"
)
type fakeClient struct {
client.Client
networkCreateFunc func(ctx context.Context, name string, options types.NetworkCreate) (types.NetworkCreateResponse, error)
networkCreateFunc func(ctx context.Context, name string, options types.NetworkCreate) (types.NetworkCreateResponse, error)
networkConnectFunc func(ctx context.Context, networkID, container string, config *network.EndpointSettings) error
networkDisconnectFunc func(ctx context.Context, networkID, container string, force bool) error
}
func (c *fakeClient) NetworkCreate(ctx context.Context, name string, options types.NetworkCreate) (types.NetworkCreateResponse, error) {
@ -17,3 +20,17 @@ func (c *fakeClient) NetworkCreate(ctx context.Context, name string, options typ
}
return types.NetworkCreateResponse{}, nil
}
func (c *fakeClient) NetworkConnect(ctx context.Context, networkID, container string, config *network.EndpointSettings) error {
if c.networkConnectFunc != nil {
return c.networkConnectFunc(ctx, networkID, container, config)
}
return nil
}
func (c *fakeClient) NetworkDisconnect(ctx context.Context, networkID, container string, force bool) error {
if c.networkDisconnectFunc != nil {
return c.networkDisconnectFunc(ctx, networkID, container, force)
}
return nil
}

View File

@ -0,0 +1,70 @@
package network
import (
"io/ioutil"
"testing"
"github.com/docker/cli/internal/test"
"github.com/docker/cli/internal/test/testutil"
"github.com/docker/docker/api/types/network"
"github.com/pkg/errors"
"github.com/stretchr/testify/assert"
"golang.org/x/net/context"
)
func TestNetworkConnectErrors(t *testing.T) {
testCases := []struct {
args []string
networkConnectFunc func(ctx context.Context, networkID, container string, config *network.EndpointSettings) error
expectedError string
}{
{
expectedError: "requires exactly 2 arguments",
},
{
args: []string{"toto", "titi"},
networkConnectFunc: func(ctx context.Context, networkID, container string, config *network.EndpointSettings) error {
return errors.Errorf("error connecting network")
},
expectedError: "error connecting network",
},
}
for _, tc := range testCases {
cmd := newConnectCommand(
test.NewFakeCli(&fakeClient{
networkConnectFunc: tc.networkConnectFunc,
}),
)
cmd.SetArgs(tc.args)
cmd.SetOutput(ioutil.Discard)
testutil.ErrorContains(t, cmd.Execute(), tc.expectedError)
}
}
func TestNetworkConnectWithFlags(t *testing.T) {
expectedOpts := []network.IPAMConfig{
{
"192.168.4.0/24",
"192.168.4.0/24",
"192.168.4.1/24",
map[string]string{},
},
}
cli := test.NewFakeCli(&fakeClient{
networkConnectFunc: func(ctx context.Context, networkID, container string, config *network.EndpointSettings) error {
assert.Equal(t, expectedOpts, config.IPAMConfig, "not expected driver error")
return nil
},
})
args := []string{"banana"}
cmd := newCreateCommand(cli)
cmd.SetArgs(args)
cmd.Flags().Set("driver", "foo")
cmd.Flags().Set("ip-range", "192.168.4.0/24")
cmd.Flags().Set("gateway", "192.168.4.1/24")
cmd.Flags().Set("subnet", "192.168.4.0/24")
assert.NoError(t, cmd.Execute())
}

View File

@ -5,10 +5,10 @@ import (
"strings"
"testing"
"github.com/docker/cli/cli/internal/test"
"github.com/docker/cli/internal/test"
"github.com/docker/cli/internal/test/testutil"
"github.com/docker/docker/api/types"
"github.com/docker/docker/api/types/network"
"github.com/docker/docker/pkg/testutil"
"github.com/pkg/errors"
"github.com/stretchr/testify/assert"
"github.com/stretchr/testify/require"

View File

@ -0,0 +1,41 @@
package network
import (
"io/ioutil"
"testing"
"github.com/docker/cli/internal/test"
"github.com/docker/cli/internal/test/testutil"
"github.com/pkg/errors"
"golang.org/x/net/context"
)
func TestNetworkDisconnectErrors(t *testing.T) {
testCases := []struct {
args []string
networkDisconnectFunc func(ctx context.Context, networkID, container string, force bool) error
expectedError string
}{
{
expectedError: "requires exactly 2 arguments",
},
{
args: []string{"toto", "titi"},
networkDisconnectFunc: func(ctx context.Context, networkID, container string, force bool) error {
return errors.Errorf("error disconnecting network")
},
expectedError: "error disconnecting network",
},
}
for _, tc := range testCases {
cmd := newDisconnectCommand(
test.NewFakeCli(&fakeClient{
networkDisconnectFunc: tc.networkDisconnectFunc,
}),
)
cmd.SetArgs(tc.args)
cmd.SetOutput(ioutil.Discard)
testutil.ErrorContains(t, cmd.Execute(), tc.expectedError)
}
}

View File

@ -4,12 +4,12 @@ import (
"io/ioutil"
"testing"
"github.com/docker/cli/cli/internal/test"
"github.com/docker/cli/internal/test"
"github.com/docker/docker/api/types/swarm"
"github.com/pkg/errors"
// Import builders to get the builder function as package function
. "github.com/docker/cli/cli/internal/test/builders"
"github.com/docker/docker/pkg/testutil"
. "github.com/docker/cli/internal/test/builders"
"github.com/docker/cli/internal/test/testutil"
"github.com/stretchr/testify/assert"
)

View File

@ -1,19 +1,18 @@
package node
import (
"bytes"
"fmt"
"io/ioutil"
"testing"
"github.com/docker/cli/cli/internal/test"
"github.com/docker/cli/internal/test"
"github.com/docker/docker/api/types"
"github.com/docker/docker/api/types/swarm"
"github.com/pkg/errors"
// Import builders to get the builder function as package function
. "github.com/docker/cli/cli/internal/test/builders"
"github.com/docker/docker/pkg/testutil"
"github.com/docker/docker/pkg/testutil/golden"
. "github.com/docker/cli/internal/test/builders"
"github.com/docker/cli/internal/test/testutil"
"github.com/gotestyourself/gotestyourself/golden"
"github.com/stretchr/testify/assert"
)
@ -67,12 +66,11 @@ func TestNodeInspectErrors(t *testing.T) {
},
}
for _, tc := range testCases {
buf := new(bytes.Buffer)
cmd := newInspectCommand(
test.NewFakeCliWithOutput(&fakeClient{
test.NewFakeCli(&fakeClient{
nodeInspectFunc: tc.nodeInspectFunc,
infoFunc: tc.infoFunc,
}, buf))
}))
cmd.SetArgs(tc.args)
for key, value := range tc.flags {
cmd.Flags().Set(key, value)
@ -109,16 +107,13 @@ func TestNodeInspectPretty(t *testing.T) {
},
}
for _, tc := range testCases {
buf := new(bytes.Buffer)
cmd := newInspectCommand(
test.NewFakeCliWithOutput(&fakeClient{
nodeInspectFunc: tc.nodeInspectFunc,
}, buf))
cli := test.NewFakeCli(&fakeClient{
nodeInspectFunc: tc.nodeInspectFunc,
})
cmd := newInspectCommand(cli)
cmd.SetArgs([]string{"nodeID"})
cmd.Flags().Set("pretty", "true")
assert.NoError(t, cmd.Execute())
actual := buf.String()
expected := golden.Get(t, []byte(actual), fmt.Sprintf("node-inspect-pretty.%s.golden", tc.name))
testutil.EqualNormalizedString(t, testutil.RemoveSpace, actual, string(expected))
golden.Assert(t, cli.OutBuffer().String(), fmt.Sprintf("node-inspect-pretty.%s.golden", tc.name))
}
}

View File

@ -1,19 +1,17 @@
package node
import (
"bytes"
"io/ioutil"
"testing"
"github.com/docker/cli/cli/config/configfile"
"github.com/docker/cli/cli/internal/test"
"github.com/docker/cli/internal/test"
"github.com/docker/docker/api/types"
"github.com/docker/docker/api/types/swarm"
"github.com/docker/docker/pkg/testutil"
"github.com/docker/docker/pkg/testutil/golden"
"github.com/gotestyourself/gotestyourself/golden"
"github.com/pkg/errors"
// Import builders to get the builder function as package function
. "github.com/docker/cli/cli/internal/test/builders"
. "github.com/docker/cli/internal/test/builders"
"github.com/stretchr/testify/assert"
)
@ -58,9 +56,9 @@ func TestNodeList(t *testing.T) {
cli := test.NewFakeCli(&fakeClient{
nodeListFunc: func() ([]swarm.Node, error) {
return []swarm.Node{
*Node(NodeID("nodeID1"), Hostname("nodeHostname1"), Manager(Leader())),
*Node(NodeID("nodeID2"), Hostname("nodeHostname2"), Manager()),
*Node(NodeID("nodeID3"), Hostname("nodeHostname3")),
*Node(NodeID("nodeID1"), Hostname("node-2-foo"), Manager(Leader())),
*Node(NodeID("nodeID2"), Hostname("node-10-foo"), Manager()),
*Node(NodeID("nodeID3"), Hostname("node-1-foo")),
}, nil
},
infoFunc: func() (types.Info, error) {
@ -74,39 +72,25 @@ func TestNodeList(t *testing.T) {
cmd := newListCommand(cli)
assert.NoError(t, cmd.Execute())
out := cli.OutBuffer().String()
assert.Contains(t, out, `nodeID1 * nodeHostname1 Ready Active Leader`)
assert.Contains(t, out, `nodeID2 nodeHostname2 Ready Active Reachable`)
assert.Contains(t, out, `nodeID3 nodeHostname3 Ready Active`)
golden.Assert(t, cli.OutBuffer().String(), "node-list-sort.golden")
}
func TestNodeListQuietShouldOnlyPrintIDs(t *testing.T) {
buf := new(bytes.Buffer)
cli := test.NewFakeCliWithOutput(&fakeClient{
cli := test.NewFakeCli(&fakeClient{
nodeListFunc: func() ([]swarm.Node, error) {
return []swarm.Node{
*Node(),
*Node(NodeID("nodeID1")),
}, nil
},
}, buf)
})
cmd := newListCommand(cli)
cmd.Flags().Set("quiet", "true")
assert.NoError(t, cmd.Execute())
assert.Contains(t, buf.String(), "nodeID")
assert.Equal(t, cli.OutBuffer().String(), "nodeID1\n")
}
// Test case for #24090
func TestNodeListContainsHostname(t *testing.T) {
buf := new(bytes.Buffer)
cli := test.NewFakeCliWithOutput(&fakeClient{}, buf)
cmd := newListCommand(cli)
assert.NoError(t, cmd.Execute())
assert.Contains(t, buf.String(), "HOSTNAME")
}
func TestNodeListDefaultFormat(t *testing.T) {
buf := new(bytes.Buffer)
cli := test.NewFakeCliWithOutput(&fakeClient{
func TestNodeListDefaultFormatFromConfig(t *testing.T) {
cli := test.NewFakeCli(&fakeClient{
nodeListFunc: func() ([]swarm.Node, error) {
return []swarm.Node{
*Node(NodeID("nodeID1"), Hostname("nodeHostname1"), Manager(Leader())),
@ -121,20 +105,17 @@ func TestNodeListDefaultFormat(t *testing.T) {
},
}, nil
},
}, buf)
})
cli.SetConfigFile(&configfile.ConfigFile{
NodesFormat: "{{.ID}}: {{.Hostname}} {{.Status}}/{{.ManagerStatus}}",
})
cmd := newListCommand(cli)
assert.NoError(t, cmd.Execute())
assert.Contains(t, buf.String(), `nodeID1: nodeHostname1 Ready/Leader`)
assert.Contains(t, buf.String(), `nodeID2: nodeHostname2 Ready/Reachable`)
assert.Contains(t, buf.String(), `nodeID3: nodeHostname3 Ready`)
golden.Assert(t, cli.OutBuffer().String(), "node-list-format-from-config.golden")
}
func TestNodeListFormat(t *testing.T) {
buf := new(bytes.Buffer)
cli := test.NewFakeCliWithOutput(&fakeClient{
cli := test.NewFakeCli(&fakeClient{
nodeListFunc: func() ([]swarm.Node, error) {
return []swarm.Node{
*Node(NodeID("nodeID1"), Hostname("nodeHostname1"), Manager(Leader())),
@ -148,32 +129,12 @@ func TestNodeListFormat(t *testing.T) {
},
}, nil
},
}, buf)
})
cli.SetConfigFile(&configfile.ConfigFile{
NodesFormat: "{{.ID}}: {{.Hostname}} {{.Status}}/{{.ManagerStatus}}",
})
cmd := newListCommand(cli)
cmd.Flags().Set("format", "{{.Hostname}}: {{.ManagerStatus}}")
assert.NoError(t, cmd.Execute())
assert.Contains(t, buf.String(), `nodeHostname1: Leader`)
assert.Contains(t, buf.String(), `nodeHostname2: Reachable`)
}
func TestNodeListOrder(t *testing.T) {
cli := test.NewFakeCli(&fakeClient{
nodeListFunc: func() ([]swarm.Node, error) {
return []swarm.Node{
*Node(Hostname("node-2-foo"), Manager(Leader())),
*Node(Hostname("node-10-foo"), Manager()),
*Node(Hostname("node-1-foo")),
}, nil
},
})
cmd := newListCommand(cli)
cmd.Flags().Set("format", "{{.Hostname}}: {{.ManagerStatus}}")
assert.NoError(t, cmd.Execute())
actual := cli.OutBuffer().String()
expected := golden.Get(t, []byte(actual), "node-list-sort.golden")
testutil.EqualNormalizedString(t, testutil.RemoveSpace, actual, string(expected))
golden.Assert(t, cli.OutBuffer().String(), "node-list-format-flag.golden")
}

View File

@ -1,16 +1,15 @@
package node
import (
"bytes"
"io/ioutil"
"testing"
"github.com/docker/cli/cli/internal/test"
"github.com/docker/cli/internal/test"
"github.com/docker/docker/api/types/swarm"
"github.com/pkg/errors"
// Import builders to get the builder function as package function
. "github.com/docker/cli/cli/internal/test/builders"
"github.com/docker/docker/pkg/testutil"
. "github.com/docker/cli/internal/test/builders"
"github.com/docker/cli/internal/test/testutil"
"github.com/stretchr/testify/assert"
)
@ -40,12 +39,11 @@ func TestNodePromoteErrors(t *testing.T) {
},
}
for _, tc := range testCases {
buf := new(bytes.Buffer)
cmd := newPromoteCommand(
test.NewFakeCliWithOutput(&fakeClient{
test.NewFakeCli(&fakeClient{
nodeInspectFunc: tc.nodeInspectFunc,
nodeUpdateFunc: tc.nodeUpdateFunc,
}, buf))
}))
cmd.SetArgs(tc.args)
cmd.SetOutput(ioutil.Discard)
testutil.ErrorContains(t, cmd.Execute(), tc.expectedError)
@ -53,9 +51,8 @@ func TestNodePromoteErrors(t *testing.T) {
}
func TestNodePromoteNoChange(t *testing.T) {
buf := new(bytes.Buffer)
cmd := newPromoteCommand(
test.NewFakeCliWithOutput(&fakeClient{
test.NewFakeCli(&fakeClient{
nodeInspectFunc: func() (swarm.Node, []byte, error) {
return *Node(Manager()), []byte{}, nil
},
@ -65,15 +62,14 @@ func TestNodePromoteNoChange(t *testing.T) {
}
return nil
},
}, buf))
}))
cmd.SetArgs([]string{"nodeID"})
assert.NoError(t, cmd.Execute())
}
func TestNodePromoteMultipleNode(t *testing.T) {
buf := new(bytes.Buffer)
cmd := newPromoteCommand(
test.NewFakeCliWithOutput(&fakeClient{
test.NewFakeCli(&fakeClient{
nodeInspectFunc: func() (swarm.Node, []byte, error) {
return *Node(), []byte{}, nil
},
@ -83,7 +79,7 @@ func TestNodePromoteMultipleNode(t *testing.T) {
}
return nil
},
}, buf))
}))
cmd.SetArgs([]string{"nodeID1", "nodeID2"})
assert.NoError(t, cmd.Execute())
}

View File

@ -1,20 +1,18 @@
package node
import (
"bytes"
"fmt"
"io/ioutil"
"testing"
"time"
"github.com/docker/cli/cli/internal/test"
"github.com/docker/cli/internal/test"
"github.com/docker/docker/api/types"
"github.com/docker/docker/api/types/swarm"
"github.com/pkg/errors"
// Import builders to get the builder function as package function
. "github.com/docker/cli/cli/internal/test/builders"
"github.com/docker/docker/pkg/testutil"
"github.com/docker/docker/pkg/testutil/golden"
. "github.com/docker/cli/internal/test/builders"
"github.com/gotestyourself/gotestyourself/golden"
"github.com/stretchr/testify/assert"
)
@ -50,14 +48,13 @@ func TestNodePsErrors(t *testing.T) {
},
}
for _, tc := range testCases {
buf := new(bytes.Buffer)
cmd := newPsCommand(
test.NewFakeCliWithOutput(&fakeClient{
infoFunc: tc.infoFunc,
nodeInspectFunc: tc.nodeInspectFunc,
taskInspectFunc: tc.taskInspectFunc,
taskListFunc: tc.taskListFunc,
}, buf))
cli := test.NewFakeCli(&fakeClient{
infoFunc: tc.infoFunc,
nodeInspectFunc: tc.nodeInspectFunc,
taskInspectFunc: tc.taskInspectFunc,
taskListFunc: tc.taskListFunc,
})
cmd := newPsCommand(cli)
cmd.SetArgs(tc.args)
for key, value := range tc.flags {
cmd.Flags().Set(key, value)
@ -114,21 +111,18 @@ func TestNodePs(t *testing.T) {
},
}
for _, tc := range testCases {
buf := new(bytes.Buffer)
cmd := newPsCommand(
test.NewFakeCliWithOutput(&fakeClient{
infoFunc: tc.infoFunc,
nodeInspectFunc: tc.nodeInspectFunc,
taskInspectFunc: tc.taskInspectFunc,
taskListFunc: tc.taskListFunc,
}, buf))
cli := test.NewFakeCli(&fakeClient{
infoFunc: tc.infoFunc,
nodeInspectFunc: tc.nodeInspectFunc,
taskInspectFunc: tc.taskInspectFunc,
taskListFunc: tc.taskListFunc,
})
cmd := newPsCommand(cli)
cmd.SetArgs(tc.args)
for key, value := range tc.flags {
cmd.Flags().Set(key, value)
}
assert.NoError(t, cmd.Execute())
actual := buf.String()
expected := golden.Get(t, []byte(actual), fmt.Sprintf("node-ps.%s.golden", tc.name))
testutil.EqualNormalizedString(t, testutil.RemoveSpace, actual, string(expected))
golden.Assert(t, cli.OutBuffer().String(), fmt.Sprintf("node-ps.%s.golden", tc.name))
}
}

View File

@ -1,12 +1,11 @@
package node
import (
"bytes"
"io/ioutil"
"testing"
"github.com/docker/cli/cli/internal/test"
"github.com/docker/docker/pkg/testutil"
"github.com/docker/cli/internal/test"
"github.com/docker/cli/internal/test/testutil"
"github.com/pkg/errors"
"github.com/stretchr/testify/assert"
)
@ -29,11 +28,10 @@ func TestNodeRemoveErrors(t *testing.T) {
},
}
for _, tc := range testCases {
buf := new(bytes.Buffer)
cmd := newRemoveCommand(
test.NewFakeCliWithOutput(&fakeClient{
test.NewFakeCli(&fakeClient{
nodeRemoveFunc: tc.nodeRemoveFunc,
}, buf))
}))
cmd.SetArgs(tc.args)
cmd.SetOutput(ioutil.Discard)
testutil.ErrorContains(t, cmd.Execute(), tc.expectedError)
@ -41,8 +39,7 @@ func TestNodeRemoveErrors(t *testing.T) {
}
func TestNodeRemoveMultiple(t *testing.T) {
buf := new(bytes.Buffer)
cmd := newRemoveCommand(test.NewFakeCliWithOutput(&fakeClient{}, buf))
cmd := newRemoveCommand(test.NewFakeCli(&fakeClient{}))
cmd.SetArgs([]string{"nodeID1", "nodeID2"})
assert.NoError(t, cmd.Execute())
}

View File

@ -1,10 +1,10 @@
ID: nodeID
Name: defaultNodeName
Hostname: defaultNodeHostname
Joined at: 2009-11-10 23:00:00 +0000 utc
Hostname: defaultNodeHostname
Joined at: 2009-11-10 23:00:00 +0000 utc
Status:
State: Ready
Availability: Active
Availability: Active
Address: 127.0.0.1
Manager Status:
Address: 127.0.0.1
@ -15,11 +15,10 @@ Platform:
Architecture: x86_64
Resources:
CPUs: 0
Memory: 20 MiB
Memory: 20MiB
Plugins:
Network: bridge, overlay
Volume: local
Network: bridge, overlay
Volume: local
Engine Version: 1.13.0
Engine Labels:
- engine = label
- engine=label

View File

@ -1,10 +1,10 @@
ID: nodeID
Name: defaultNodeName
Hostname: defaultNodeHostname
Joined at: 2009-11-10 23:00:00 +0000 utc
Hostname: defaultNodeHostname
Joined at: 2009-11-10 23:00:00 +0000 utc
Status:
State: Ready
Availability: Active
Availability: Active
Address: 127.0.0.1
Manager Status:
Address: 127.0.0.1
@ -15,11 +15,10 @@ Platform:
Architecture: x86_64
Resources:
CPUs: 0
Memory: 20 MiB
Memory: 20MiB
Plugins:
Network: bridge, overlay
Volume: local
Network: bridge, overlay
Volume: local
Engine Version: 1.13.0
Engine Labels:
- engine = label
- engine=label

View File

@ -1,23 +1,22 @@
ID: nodeID
Name: defaultNodeName
Labels:
- lbl1 = value1
Hostname: defaultNodeHostname
Joined at: 2009-11-10 23:00:00 +0000 utc
- lbl1=value1
Hostname: defaultNodeHostname
Joined at: 2009-11-10 23:00:00 +0000 utc
Status:
State: Ready
Availability: Active
Availability: Active
Address: 127.0.0.1
Platform:
Operating System: linux
Architecture: x86_64
Resources:
CPUs: 0
Memory: 20 MiB
Memory: 20MiB
Plugins:
Network: bridge, overlay
Volume: local
Network: bridge, overlay
Volume: local
Engine Version: 1.13.0
Engine Labels:
- engine = label
- engine=label

View File

@ -0,0 +1,2 @@
nodeHostname1: Leader
nodeHostname2: Reachable

View File

@ -0,0 +1,3 @@
nodeID1: nodeHostname1 Ready/Leader
nodeID2: nodeHostname2 Ready/Reachable
nodeID3: nodeHostname3 Ready/

View File

@ -1,3 +1,4 @@
node-1-foo:
node-2-foo: Leader
node-10-foo: Reachable
ID HOSTNAME STATUS AVAILABILITY MANAGER STATUS
nodeID3 node-1-foo Ready Active
nodeID1 * node-2-foo Ready Active Leader
nodeID2 node-10-foo Ready Active Reachable

View File

@ -1,2 +1,2 @@
ID NAME IMAGE NODE DESIRED STATE CURRENT STATE ERROR PORTS
taskID rl02d5gwz6chzu7il5fhtb8be.1 myimage:mytag defaultNodeName Ready Ready 2 hours ago *:80->80/tcp
ID NAME IMAGE NODE DESIRED STATE CURRENT STATE ERROR PORTS
taskID rl02d5gwz6chzu7il5fhtb8be.1 myimage:mytag defaultNodeName Ready Ready 2 hours ago *:80->80/tcp

View File

@ -1,4 +1,4 @@
ID NAME IMAGE NODE DESIRED STATE CURRENT STATE ERROR PORTS
taskID1 failure.1 myimage:mytag defaultNodeName Ready Ready 2 hours ago "a task error"
taskID2 \_ failure.1 myimage:mytag defaultNodeName Ready Ready 3 hours ago "a task error"
taskID3 \_ failure.1 myimage:mytag defaultNodeName Ready Ready 4 hours ago "a task error"
ID NAME IMAGE NODE DESIRED STATE CURRENT STATE ERROR PORTS
taskID1 failure.1 myimage:mytag defaultNodeName Ready Ready 2 hours ago "a task error"
taskID2 \_ failure.1 myimage:mytag defaultNodeName Ready Ready 3 hours ago "a task error"
taskID3 \_ failure.1 myimage:mytag defaultNodeName Ready Ready 4 hours ago "a task error"

View File

@ -4,12 +4,12 @@ import (
"io/ioutil"
"testing"
"github.com/docker/cli/cli/internal/test"
"github.com/docker/cli/internal/test"
"github.com/docker/docker/api/types/swarm"
"github.com/pkg/errors"
// Import builders to get the builder function as package function
. "github.com/docker/cli/cli/internal/test/builders"
"github.com/docker/docker/pkg/testutil"
. "github.com/docker/cli/internal/test/builders"
"github.com/docker/cli/internal/test/testutil"
"github.com/stretchr/testify/assert"
)

View File

@ -4,8 +4,8 @@ import (
"io"
"os"
"github.com/Sirupsen/logrus"
"github.com/docker/docker/pkg/term"
"github.com/sirupsen/logrus"
)
// OutStream is an output stream used by the DockerCli to write normal program

View File

@ -7,13 +7,13 @@ import (
"os"
"path/filepath"
"github.com/Sirupsen/logrus"
"github.com/docker/cli/cli"
"github.com/docker/cli/cli/command"
"github.com/docker/distribution/reference"
"github.com/docker/docker/api/types"
"github.com/docker/docker/pkg/archive"
"github.com/pkg/errors"
"github.com/sirupsen/logrus"
"github.com/spf13/cobra"
"golang.org/x/net/context"
)

View File

@ -1,23 +1,21 @@
package registry
import (
"fmt"
"sort"
"strings"
"text/tabwriter"
"github.com/docker/cli/cli"
"github.com/docker/cli/cli/command"
"github.com/docker/cli/cli/command/formatter"
"github.com/docker/cli/opts"
"github.com/docker/docker/api/types"
registrytypes "github.com/docker/docker/api/types/registry"
"github.com/docker/docker/pkg/stringutils"
"github.com/docker/docker/registry"
"github.com/spf13/cobra"
"golang.org/x/net/context"
)
type searchOptions struct {
format string
term string
noTrunc bool
limit int
@ -47,6 +45,7 @@ func NewSearchCommand(dockerCli command.Cli) *cobra.Command {
flags.BoolVar(&options.noTrunc, "no-trunc", false, "Don't truncate output")
flags.VarP(&options.filter, "filter", "f", "Filter output based on conditions provided")
flags.IntVar(&options.limit, "limit", registry.DefaultSearchLimit, "Max number of search results")
flags.StringVar(&options.format, "format", "", "Pretty-print search using a Go template")
flags.BoolVar(&options.automated, "automated", false, "Only show automated builds")
flags.UintVarP(&options.stars, "stars", "s", 0, "Only displays with at least x stars")
@ -89,32 +88,12 @@ func runSearch(dockerCli command.Cli, options searchOptions) error {
results := searchResultsByStars(unorderedResults)
sort.Sort(results)
w := tabwriter.NewWriter(dockerCli.Out(), 10, 1, 3, ' ', 0)
fmt.Fprintf(w, "NAME\tDESCRIPTION\tSTARS\tOFFICIAL\tAUTOMATED\n")
for _, res := range results {
// --automated and -s, --stars are deprecated since Docker 1.12
if (options.automated && !res.IsAutomated) || (int(options.stars) > res.StarCount) {
continue
}
desc := strings.Replace(res.Description, "\n", " ", -1)
desc = strings.Replace(desc, "\r", " ", -1)
if !options.noTrunc {
desc = stringutils.Ellipsis(desc, 45)
}
fmt.Fprintf(w, "%s\t%s\t%d\t", res.Name, desc, res.StarCount)
if res.IsOfficial {
fmt.Fprint(w, "[OK]")
}
fmt.Fprint(w, "\t")
if res.IsAutomated {
fmt.Fprint(w, "[OK]")
}
fmt.Fprint(w, "\n")
searchCtx := formatter.Context{
Output: dockerCli.Out(),
Format: formatter.NewSearchFormat(options.format),
Trunc: !options.noTrunc,
}
w.Flush()
return nil
return formatter.SearchWrite(searchCtx, results, options.automated, int(options.stars))
}
// searchResultsByStars sorts search results in descending order by number of stars.

View File

@ -7,9 +7,9 @@ import (
"github.com/stretchr/testify/assert"
"golang.org/x/net/context"
// Prevents a circular import with "github.com/docker/cli/cli/internal/test"
// Prevents a circular import with "github.com/docker/cli/internal/test"
. "github.com/docker/cli/cli/command"
"github.com/docker/cli/cli/internal/test"
"github.com/docker/cli/internal/test"
"github.com/docker/docker/api/types"
"github.com/docker/docker/client"
)

View File

@ -1,18 +1,17 @@
package secret
import (
"bytes"
"io/ioutil"
"path/filepath"
"reflect"
"strings"
"testing"
"github.com/docker/cli/cli/internal/test"
"github.com/docker/cli/internal/test"
"github.com/docker/cli/internal/test/testutil"
"github.com/docker/docker/api/types"
"github.com/docker/docker/api/types/swarm"
"github.com/docker/docker/pkg/testutil"
"github.com/docker/docker/pkg/testutil/golden"
"github.com/gotestyourself/gotestyourself/golden"
"github.com/pkg/errors"
"github.com/stretchr/testify/assert"
)
@ -27,10 +26,10 @@ func TestSecretCreateErrors(t *testing.T) {
}{
{
args: []string{"too_few"},
expectedError: "requires exactly 2 argument(s)",
expectedError: "requires exactly 2 arguments",
},
{args: []string{"too", "many", "arguments"},
expectedError: "requires exactly 2 argument(s)",
expectedError: "requires exactly 2 arguments",
},
{
args: []string{"name", filepath.Join("testdata", secretDataFile)},
@ -54,9 +53,8 @@ func TestSecretCreateErrors(t *testing.T) {
func TestSecretCreateWithName(t *testing.T) {
name := "foo"
buf := new(bytes.Buffer)
var actual []byte
cli := test.NewFakeCliWithOutput(&fakeClient{
cli := test.NewFakeCli(&fakeClient{
secretCreateFunc: func(spec swarm.SecretSpec) (types.SecretCreateResponse, error) {
if spec.Name != name {
return types.SecretCreateResponse{}, errors.Errorf("expected name %q, got %q", name, spec.Name)
@ -68,14 +66,13 @@ func TestSecretCreateWithName(t *testing.T) {
ID: "ID-" + spec.Name,
}, nil
},
}, buf)
})
cmd := newSecretCreateCommand(cli)
cmd.SetArgs([]string{name, filepath.Join("testdata", secretDataFile)})
assert.NoError(t, cmd.Execute())
expected := golden.Get(t, actual, secretDataFile)
assert.Equal(t, expected, actual)
assert.Equal(t, "ID-"+name, strings.TrimSpace(buf.String()))
golden.Assert(t, string(actual), secretDataFile)
assert.Equal(t, "ID-"+name, strings.TrimSpace(cli.OutBuffer().String()))
}
func TestSecretCreateWithLabels(t *testing.T) {
@ -85,8 +82,7 @@ func TestSecretCreateWithLabels(t *testing.T) {
}
name := "foo"
buf := new(bytes.Buffer)
cli := test.NewFakeCliWithOutput(&fakeClient{
cli := test.NewFakeCli(&fakeClient{
secretCreateFunc: func(spec swarm.SecretSpec) (types.SecretCreateResponse, error) {
if spec.Name != name {
return types.SecretCreateResponse{}, errors.Errorf("expected name %q, got %q", name, spec.Name)
@ -100,12 +96,12 @@ func TestSecretCreateWithLabels(t *testing.T) {
ID: "ID-" + spec.Name,
}, nil
},
}, buf)
})
cmd := newSecretCreateCommand(cli)
cmd.SetArgs([]string{name, filepath.Join("testdata", secretDataFile)})
cmd.Flags().Set("label", "lbl1=Label-foo")
cmd.Flags().Set("label", "lbl2=Label-bar")
assert.NoError(t, cmd.Execute())
assert.Equal(t, "ID-"+name, strings.TrimSpace(buf.String()))
assert.Equal(t, "ID-"+name, strings.TrimSpace(cli.OutBuffer().String()))
}

View File

@ -1,19 +1,18 @@
package secret
import (
"bytes"
"fmt"
"io/ioutil"
"testing"
"time"
"github.com/docker/cli/cli/internal/test"
"github.com/docker/cli/internal/test"
"github.com/docker/docker/api/types/swarm"
"github.com/pkg/errors"
// Import builders to get the builder function as package function
. "github.com/docker/cli/cli/internal/test/builders"
"github.com/docker/docker/pkg/testutil"
"github.com/docker/docker/pkg/testutil/golden"
. "github.com/docker/cli/internal/test/builders"
"github.com/docker/cli/internal/test/testutil"
"github.com/gotestyourself/gotestyourself/golden"
"github.com/stretchr/testify/assert"
)
@ -53,11 +52,10 @@ func TestSecretInspectErrors(t *testing.T) {
},
}
for _, tc := range testCases {
buf := new(bytes.Buffer)
cmd := newSecretInspectCommand(
test.NewFakeCliWithOutput(&fakeClient{
test.NewFakeCli(&fakeClient{
secretInspectFunc: tc.secretInspectFunc,
}, buf),
}),
)
cmd.SetArgs(tc.args)
for key, value := range tc.flags {
@ -95,17 +93,13 @@ func TestSecretInspectWithoutFormat(t *testing.T) {
},
}
for _, tc := range testCases {
buf := new(bytes.Buffer)
cmd := newSecretInspectCommand(
test.NewFakeCliWithOutput(&fakeClient{
secretInspectFunc: tc.secretInspectFunc,
}, buf),
)
cli := test.NewFakeCli(&fakeClient{
secretInspectFunc: tc.secretInspectFunc,
})
cmd := newSecretInspectCommand(cli)
cmd.SetArgs(tc.args)
assert.NoError(t, cmd.Execute())
actual := buf.String()
expected := golden.Get(t, []byte(actual), fmt.Sprintf("secret-inspect-without-format.%s.golden", tc.name))
testutil.EqualNormalizedString(t, testutil.RemoveSpace, actual, string(expected))
golden.Assert(t, cli.OutBuffer().String(), fmt.Sprintf("secret-inspect-without-format.%s.golden", tc.name))
}
}
@ -135,18 +129,14 @@ func TestSecretInspectWithFormat(t *testing.T) {
},
}
for _, tc := range testCases {
buf := new(bytes.Buffer)
cmd := newSecretInspectCommand(
test.NewFakeCliWithOutput(&fakeClient{
secretInspectFunc: tc.secretInspectFunc,
}, buf),
)
cli := test.NewFakeCli(&fakeClient{
secretInspectFunc: tc.secretInspectFunc,
})
cmd := newSecretInspectCommand(cli)
cmd.SetArgs(tc.args)
cmd.Flags().Set("format", tc.format)
assert.NoError(t, cmd.Execute())
actual := buf.String()
expected := golden.Get(t, []byte(actual), fmt.Sprintf("secret-inspect-with-format.%s.golden", tc.name))
testutil.EqualNormalizedString(t, testutil.RemoveSpace, actual, string(expected))
golden.Assert(t, cli.OutBuffer().String(), fmt.Sprintf("secret-inspect-with-format.%s.golden", tc.name))
}
}
@ -171,16 +161,13 @@ func TestSecretInspectPretty(t *testing.T) {
},
}
for _, tc := range testCases {
buf := new(bytes.Buffer)
cmd := newSecretInspectCommand(
test.NewFakeCliWithOutput(&fakeClient{
secretInspectFunc: tc.secretInspectFunc,
}, buf))
cli := test.NewFakeCli(&fakeClient{
secretInspectFunc: tc.secretInspectFunc,
})
cmd := newSecretInspectCommand(cli)
cmd.SetArgs([]string{"secretID"})
cmd.Flags().Set("pretty", "true")
assert.NoError(t, cmd.Execute())
actual := buf.String()
expected := golden.Get(t, []byte(actual), fmt.Sprintf("secret-inspect-pretty.%s.golden", tc.name))
testutil.EqualNormalizedString(t, testutil.RemoveSpace, actual, string(expected))
golden.Assert(t, cli.OutBuffer().String(), fmt.Sprintf("secret-inspect-pretty.%s.golden", tc.name))
}
}

View File

@ -7,14 +7,14 @@ import (
"time"
"github.com/docker/cli/cli/config/configfile"
"github.com/docker/cli/cli/internal/test"
"github.com/docker/cli/internal/test"
"github.com/docker/docker/api/types"
"github.com/docker/docker/api/types/swarm"
"github.com/pkg/errors"
// Import builders to get the builder function as package function
. "github.com/docker/cli/cli/internal/test/builders"
"github.com/docker/docker/pkg/testutil"
"github.com/docker/docker/pkg/testutil/golden"
. "github.com/docker/cli/internal/test/builders"
"github.com/docker/cli/internal/test/testutil"
"github.com/gotestyourself/gotestyourself/golden"
"github.com/stretchr/testify/assert"
)
@ -36,11 +36,10 @@ func TestSecretListErrors(t *testing.T) {
},
}
for _, tc := range testCases {
buf := new(bytes.Buffer)
cmd := newSecretListCommand(
test.NewFakeCliWithOutput(&fakeClient{
test.NewFakeCli(&fakeClient{
secretListFunc: tc.secretListFunc,
}, buf),
}),
)
cmd.SetArgs(tc.args)
cmd.SetOutput(ioutil.Discard)
@ -50,7 +49,7 @@ func TestSecretListErrors(t *testing.T) {
func TestSecretList(t *testing.T) {
buf := new(bytes.Buffer)
cli := test.NewFakeCliWithOutput(&fakeClient{
cli := test.NewFakeCli(&fakeClient{
secretListFunc: func(options types.SecretListOptions) ([]swarm.Secret, error) {
return []swarm.Secret{
*Secret(SecretID("ID-foo"),
@ -67,18 +66,15 @@ func TestSecretList(t *testing.T) {
),
}, nil
},
}, buf)
})
cmd := newSecretListCommand(cli)
cmd.SetOutput(buf)
assert.NoError(t, cmd.Execute())
actual := buf.String()
expected := golden.Get(t, []byte(actual), "secret-list.golden")
testutil.EqualNormalizedString(t, testutil.RemoveSpace, actual, string(expected))
golden.Assert(t, cli.OutBuffer().String(), "secret-list.golden")
}
func TestSecretListWithQuietOption(t *testing.T) {
buf := new(bytes.Buffer)
cli := test.NewFakeCliWithOutput(&fakeClient{
cli := test.NewFakeCli(&fakeClient{
secretListFunc: func(options types.SecretListOptions) ([]swarm.Secret, error) {
return []swarm.Secret{
*Secret(SecretID("ID-foo"), SecretName("foo")),
@ -87,18 +83,15 @@ func TestSecretListWithQuietOption(t *testing.T) {
})),
}, nil
},
}, buf)
})
cmd := newSecretListCommand(cli)
cmd.Flags().Set("quiet", "true")
assert.NoError(t, cmd.Execute())
actual := buf.String()
expected := golden.Get(t, []byte(actual), "secret-list-with-quiet-option.golden")
testutil.EqualNormalizedString(t, testutil.RemoveSpace, actual, string(expected))
golden.Assert(t, cli.OutBuffer().String(), "secret-list-with-quiet-option.golden")
}
func TestSecretListWithConfigFormat(t *testing.T) {
buf := new(bytes.Buffer)
cli := test.NewFakeCliWithOutput(&fakeClient{
cli := test.NewFakeCli(&fakeClient{
secretListFunc: func(options types.SecretListOptions) ([]swarm.Secret, error) {
return []swarm.Secret{
*Secret(SecretID("ID-foo"), SecretName("foo")),
@ -107,20 +100,17 @@ func TestSecretListWithConfigFormat(t *testing.T) {
})),
}, nil
},
}, buf)
})
cli.SetConfigFile(&configfile.ConfigFile{
SecretFormat: "{{ .Name }} {{ .Labels }}",
})
cmd := newSecretListCommand(cli)
assert.NoError(t, cmd.Execute())
actual := buf.String()
expected := golden.Get(t, []byte(actual), "secret-list-with-config-format.golden")
testutil.EqualNormalizedString(t, testutil.RemoveSpace, actual, string(expected))
golden.Assert(t, cli.OutBuffer().String(), "secret-list-with-config-format.golden")
}
func TestSecretListWithFormat(t *testing.T) {
buf := new(bytes.Buffer)
cli := test.NewFakeCliWithOutput(&fakeClient{
cli := test.NewFakeCli(&fakeClient{
secretListFunc: func(options types.SecretListOptions) ([]swarm.Secret, error) {
return []swarm.Secret{
*Secret(SecretID("ID-foo"), SecretName("foo")),
@ -129,18 +119,15 @@ func TestSecretListWithFormat(t *testing.T) {
})),
}, nil
},
}, buf)
})
cmd := newSecretListCommand(cli)
cmd.Flags().Set("format", "{{ .Name }} {{ .Labels }}")
assert.NoError(t, cmd.Execute())
actual := buf.String()
expected := golden.Get(t, []byte(actual), "secret-list-with-format.golden")
testutil.EqualNormalizedString(t, testutil.RemoveSpace, actual, string(expected))
golden.Assert(t, cli.OutBuffer().String(), "secret-list-with-format.golden")
}
func TestSecretListWithFilter(t *testing.T) {
buf := new(bytes.Buffer)
cli := test.NewFakeCliWithOutput(&fakeClient{
cli := test.NewFakeCli(&fakeClient{
secretListFunc: func(options types.SecretListOptions) ([]swarm.Secret, error) {
assert.Equal(t, "foo", options.Filters.Get("name")[0], "foo")
assert.Equal(t, "lbl1=Label-bar", options.Filters.Get("label")[0])
@ -159,12 +146,10 @@ func TestSecretListWithFilter(t *testing.T) {
),
}, nil
},
}, buf)
})
cmd := newSecretListCommand(cli)
cmd.Flags().Set("filter", "name=foo")
cmd.Flags().Set("filter", "label=lbl1=Label-bar")
assert.NoError(t, cmd.Execute())
actual := buf.String()
expected := golden.Get(t, []byte(actual), "secret-list-with-filter.golden")
testutil.EqualNormalizedString(t, testutil.RemoveSpace, actual, string(expected))
golden.Assert(t, cli.OutBuffer().String(), "secret-list-with-filter.golden")
}

View File

@ -1,13 +1,12 @@
package secret
import (
"bytes"
"io/ioutil"
"strings"
"testing"
"github.com/docker/cli/cli/internal/test"
"github.com/docker/docker/pkg/testutil"
"github.com/docker/cli/internal/test"
"github.com/docker/cli/internal/test/testutil"
"github.com/pkg/errors"
"github.com/stretchr/testify/assert"
)
@ -20,7 +19,7 @@ func TestSecretRemoveErrors(t *testing.T) {
}{
{
args: []string{},
expectedError: "requires at least 1 argument(s).",
expectedError: "requires at least 1 argument.",
},
{
args: []string{"foo"},
@ -31,11 +30,10 @@ func TestSecretRemoveErrors(t *testing.T) {
},
}
for _, tc := range testCases {
buf := new(bytes.Buffer)
cmd := newSecretRemoveCommand(
test.NewFakeCliWithOutput(&fakeClient{
test.NewFakeCli(&fakeClient{
secretRemoveFunc: tc.secretRemoveFunc,
}, buf),
}),
)
cmd.SetArgs(tc.args)
cmd.SetOutput(ioutil.Discard)
@ -45,27 +43,25 @@ func TestSecretRemoveErrors(t *testing.T) {
func TestSecretRemoveWithName(t *testing.T) {
names := []string{"foo", "bar"}
buf := new(bytes.Buffer)
var removedSecrets []string
cli := test.NewFakeCliWithOutput(&fakeClient{
cli := test.NewFakeCli(&fakeClient{
secretRemoveFunc: func(name string) error {
removedSecrets = append(removedSecrets, name)
return nil
},
}, buf)
})
cmd := newSecretRemoveCommand(cli)
cmd.SetArgs(names)
assert.NoError(t, cmd.Execute())
assert.Equal(t, names, strings.Split(strings.TrimSpace(buf.String()), "\n"))
assert.Equal(t, names, strings.Split(strings.TrimSpace(cli.OutBuffer().String()), "\n"))
assert.Equal(t, names, removedSecrets)
}
func TestSecretRemoveContinueAfterError(t *testing.T) {
names := []string{"foo", "bar"}
buf := new(bytes.Buffer)
var removedSecrets []string
cli := test.NewFakeCliWithOutput(&fakeClient{
cli := test.NewFakeCli(&fakeClient{
secretRemoveFunc: func(name string) error {
removedSecrets = append(removedSecrets, name)
if name == "foo" {
@ -73,7 +69,7 @@ func TestSecretRemoveContinueAfterError(t *testing.T) {
}
return nil
},
}, buf)
})
cmd := newSecretRemoveCommand(cli)
cmd.SetOutput(ioutil.Discard)

View File

@ -1,6 +1,6 @@
ID: secretID
Name: secretName
ID: secretID
Name: secretName
Labels:
- lbl1=value1
Created at: 0001-01-01 00:00:00+0000 utc
Updated at: 0001-01-01 00:00:00+0000 utc
- lbl1=value1
Created at: 0001-01-01 00:00:00 +0000 utc
Updated at: 0001-01-01 00:00:00 +0000 utc

Some files were not shown because too many files have changed in this diff Show More