diff --git a/Makefile b/Makefile index 09c1a5e561efebfdf2b0ab110b4ace7ae717d295..94e23612823ae26f2ed5406ad2c0f56ae60f50f5 100644 --- a/Makefile +++ b/Makefile @@ -62,6 +62,11 @@ static: link rm -rf ${GOTMPDIR} rm -rf $(CURDIR)/src/isula-image/isula +unit-test: link + echo $(GOPATH) + echo $(CURDIR) + go test -v github.com/containers/storage/drivers/devmapper + proto: protoc --go_out=plugins=grpc:. ./isula/isula_image.proto diff --git a/patch/0001-add-image-load-time-and-append-image-names.patch b/patch/0001-add-image-load-time-and-append-image-names.patch index 0ce8be93f32c1583e5d9d19b4edd47e05843a000..0bfddb6802ddeadcdb271c9f513aa195e8a0afd1 100644 --- a/patch/0001-add-image-load-time-and-append-image-names.patch +++ b/patch/0001-add-image-load-time-and-append-image-names.patch @@ -1,7 +1,7 @@ -From 35753562ad1f8b4a7064f22ec68a5f2a65880663 Mon Sep 17 00:00:00 2001 +From 1d27834961a10ff0eeb89ab06bb7383e9926247c Mon Sep 17 00:00:00 2001 From: LiFeng Date: Tue, 2 Apr 2019 23:37:17 -0400 -Subject: [PATCH 01/39] add image load time and append image names +Subject: [PATCH 01/40] add image load time and append image names reason: 1. add image load time 2. append image names when pull image diff --git a/patch/0002-add-image-integration-check.patch b/patch/0002-add-image-integration-check.patch index 75cce3645e827299f885670405a54dd37ea2ebb7..3ea4b794f9f3e9df8e923713f1686b42affaa8c2 100644 --- a/patch/0002-add-image-integration-check.patch +++ b/patch/0002-add-image-integration-check.patch @@ -1,7 +1,7 @@ -From 6afc49fcbcaf02f6c6e4d748e82f0549cd878427 Mon Sep 17 00:00:00 2001 +From 2a60a17fd8ad776f2eb0dc632ef80c38b4c67485 Mon Sep 17 00:00:00 2001 From: LiFeng Date: Thu, 4 Apr 2019 11:03:15 -0400 -Subject: [PATCH 02/39] add image integration check +Subject: [PATCH 02/40] add image integration check Signed-off-by: LiFeng --- diff --git a/patch/0003-vendor-support-setting-rootfs-quota.patch b/patch/0003-vendor-support-setting-rootfs-quota.patch index 09c458373a21f6d6cf1d15727c02872fd14e4af4..0870bee4a9bdbf078124ad6019297682238d002a 100644 --- a/patch/0003-vendor-support-setting-rootfs-quota.patch +++ b/patch/0003-vendor-support-setting-rootfs-quota.patch @@ -1,7 +1,7 @@ -From 25a6eac24a99570772cf9a28f58a41ed82cf784b Mon Sep 17 00:00:00 2001 +From aa52522333277194c357aa59380300fca7e4e472 Mon Sep 17 00:00:00 2001 From: TanYiFeng Date: Tue, 9 Apr 2019 01:32:27 -0400 -Subject: [PATCH 03/39] vendor: support setting rootfs quota +Subject: [PATCH 03/40] vendor: support setting rootfs quota Signed-off-by: TanYiFeng --- diff --git a/patch/0004-isulad-kit-vendor-check-overlay-support-as-docker.patch b/patch/0004-isulad-kit-vendor-check-overlay-support-as-docker.patch index be7c04685b9ce6979c57b0e6a4fe559c0aa35991..9a54a08318b29aeb2f2835f54a17217df9e94e2c 100644 --- a/patch/0004-isulad-kit-vendor-check-overlay-support-as-docker.patch +++ b/patch/0004-isulad-kit-vendor-check-overlay-support-as-docker.patch @@ -1,7 +1,7 @@ -From 8ac69274e24f8d0df65c98aa7b2fbac7409b3f14 Mon Sep 17 00:00:00 2001 +From c95c6c22d0a78846ce440e4bc5530053830d2469 Mon Sep 17 00:00:00 2001 From: TanYiFeng Date: Tue, 9 Apr 2019 12:19:49 -0400 -Subject: [PATCH 04/39] isulad-kit-vendor: check overlay support as docker +Subject: [PATCH 04/40] isulad-kit-vendor: check overlay support as docker we may got failed if always detect multi lower layer mount, when writed data more than rootfs quota for arm machine diff --git a/patch/0005-isulad-kit-vendor-fix-parseSize-of-float-accurancy.patch b/patch/0005-isulad-kit-vendor-fix-parseSize-of-float-accurancy.patch index 140e41d30318b95f564587be33483a0e0ddd9249..6c002a52369c9342f0f63caf300fc737cf4d0b64 100644 --- a/patch/0005-isulad-kit-vendor-fix-parseSize-of-float-accurancy.patch +++ b/patch/0005-isulad-kit-vendor-fix-parseSize-of-float-accurancy.patch @@ -1,7 +1,7 @@ -From 36fe352fac38e4cf0cea88e72e00003697dd7ccf Mon Sep 17 00:00:00 2001 +From 2f3e15020c2cd8d5dfba4ed415a817c8ada3ee6d Mon Sep 17 00:00:00 2001 From: TanYiFeng Date: Tue, 16 Apr 2019 00:44:20 -0400 -Subject: [PATCH 05/39] isulad-kit-vendor: fix parseSize of float accurancy +Subject: [PATCH 05/40] isulad-kit-vendor: fix parseSize of float accurancy Signed-off-by: TanYiFeng --- diff --git a/patch/0006-limit-the-minimum-size-of-rootfs-quota-to-4k.patch b/patch/0006-limit-the-minimum-size-of-rootfs-quota-to-4k.patch index 0ea738be17659fb1e94b301c8453c571ae458cb2..24de794106b9065ca735d7fcfa9dd4209d3aa958 100644 --- a/patch/0006-limit-the-minimum-size-of-rootfs-quota-to-4k.patch +++ b/patch/0006-limit-the-minimum-size-of-rootfs-quota-to-4k.patch @@ -1,7 +1,7 @@ -From 0b042537f1a40a054f94faea2b480cb8a435b324 Mon Sep 17 00:00:00 2001 +From a2b92b8bd926bde5b6ba453e467b394dc5672e01 Mon Sep 17 00:00:00 2001 From: TanYiFeng Date: Tue, 16 Apr 2019 10:53:52 -0400 -Subject: [PATCH 06/39] limit the minimum size of rootfs quota to 4k +Subject: [PATCH 06/40] limit the minimum size of rootfs quota to 4k Signed-off-by: TanYiFeng --- diff --git a/patch/0007-delete-try-to-delete-metadata-before-image-data.patch b/patch/0007-delete-try-to-delete-metadata-before-image-data.patch index 27b4108ffa8c0fe5d06e6bfa42f8fbb5d594399d..f88af5208e6f86de465308be6ea80cc34a3cdb88 100644 --- a/patch/0007-delete-try-to-delete-metadata-before-image-data.patch +++ b/patch/0007-delete-try-to-delete-metadata-before-image-data.patch @@ -1,7 +1,7 @@ -From a8d2579b95b9a7f18785e337a6db31938063ec50 Mon Sep 17 00:00:00 2001 +From b170dce17614d8b5257b4dfdd8194ca669b7e575 Mon Sep 17 00:00:00 2001 From: LiFeng Date: Thu, 18 Apr 2019 05:04:18 -0400 -Subject: [PATCH 07/39] delete: try to delete metadata before image data +Subject: [PATCH 07/40] delete: try to delete metadata before image data Signed-off-by: LiFeng --- diff --git a/patch/0008-same-add-group-should-skip.patch b/patch/0008-same-add-group-should-skip.patch index 5fe843bfebc0a98f0d6de12d61dd9885cef65cd2..1ade7926ab382fd83c0b48ff9f8e2e633301997b 100644 --- a/patch/0008-same-add-group-should-skip.patch +++ b/patch/0008-same-add-group-should-skip.patch @@ -1,7 +1,7 @@ -From 981d80d7f9608a9c61b880dcdda95449c0fc5096 Mon Sep 17 00:00:00 2001 +From 62f52ffe636012ae2a4d2cb7c4247a2d18678f5b Mon Sep 17 00:00:00 2001 From: LiuHao Date: Fri, 19 Apr 2019 17:15:29 +0800 -Subject: [PATCH 08/39] same add group should skip +Subject: [PATCH 08/40] same add group should skip same add group should skip diff --git a/patch/0009-optimize-concurrent-run.patch b/patch/0009-optimize-concurrent-run.patch index a14107fedc22a657f8c4c52188b9fdf906157bf9..a697643158e19d48a1458428aeba2dbfb6e07a1d 100644 --- a/patch/0009-optimize-concurrent-run.patch +++ b/patch/0009-optimize-concurrent-run.patch @@ -1,7 +1,7 @@ -From 981acc680c25b85aa783dea99aaf349a2940fe20 Mon Sep 17 00:00:00 2001 +From f6f1762dc3140c2aca2032767bb64062712f222a Mon Sep 17 00:00:00 2001 From: LiuHao Date: Thu, 25 Apr 2019 18:00:18 +0800 -Subject: [PATCH 09/39] optimize concurrent run +Subject: [PATCH 09/40] optimize concurrent run Signed-off-by: LiuHao --- diff --git a/patch/0010-abnormal-scene-container-restart-failure.patch b/patch/0010-abnormal-scene-container-restart-failure.patch index 11fb523f01cac5735c6a2a9d2dd5746d1c142332..a21865d10f030e4db425b2a2765b244ac56cf989 100644 --- a/patch/0010-abnormal-scene-container-restart-failure.patch +++ b/patch/0010-abnormal-scene-container-restart-failure.patch @@ -1,7 +1,7 @@ -From a1dc79376c725981962f311d66933a2b79fef9a2 Mon Sep 17 00:00:00 2001 +From 2066b2df9c3e2df6997a1c82c48f7c1b6ac2d331 Mon Sep 17 00:00:00 2001 From: WuJing Date: Mon, 29 Apr 2019 16:46:09 +0800 -Subject: [PATCH 10/39] abnormal scene container restart failure +Subject: [PATCH 10/40] abnormal scene container restart failure Solve the problem that the mountpoint.json write fails due to an abnormal condition, causing the container to fail to diff --git a/patch/0011-optimize-isulad_kit-operator.patch b/patch/0011-optimize-isulad_kit-operator.patch index 19ce6419c4a77d7724f784d4cfbf1fef4ca64968..855f48c69e1ebbdbc71ff956a16a70ee21356a4c 100644 --- a/patch/0011-optimize-isulad_kit-operator.patch +++ b/patch/0011-optimize-isulad_kit-operator.patch @@ -1,7 +1,7 @@ -From 364c37cb29f26822452bf08770d690d1f9d22c42 Mon Sep 17 00:00:00 2001 +From 16e5aba363b513a2c8146057d13ce21a6bcb5166 Mon Sep 17 00:00:00 2001 From: LiuHao Date: Thu, 2 May 2019 11:25:07 +0800 -Subject: [PATCH 11/39] optimize isulad_kit operator +Subject: [PATCH 11/40] optimize isulad_kit operator get mountpoint from driver diff --git a/patch/0012-fix-compile-error.patch b/patch/0012-fix-compile-error.patch index 5f7ff92c515fd5d9cad8c91058068b6eb3c3c3e5..37c8c9696b591e6af01d0df1bfad6a7eaf2ea3b5 100644 --- a/patch/0012-fix-compile-error.patch +++ b/patch/0012-fix-compile-error.patch @@ -1,7 +1,7 @@ -From 3be4acb8cc1c1ff00b150d50c4aaebcd98b040e5 Mon Sep 17 00:00:00 2001 +From cae5f5d638eda7836cbe2dfc2a3bc9c3bb2b704c Mon Sep 17 00:00:00 2001 From: LiuHao Date: Thu, 2 May 2019 11:56:34 +0800 -Subject: [PATCH 12/39] fix compile error +Subject: [PATCH 12/40] fix compile error fix compile error diff --git a/patch/0013-rmi-try-to-remove-all-layers-info-when-rmi.patch b/patch/0013-rmi-try-to-remove-all-layers-info-when-rmi.patch index b5297896c401d828dbc3f1e0dd8f01ea7d028272..e1de45845c93f5e10fcf51260c1e6b6daefa2d7c 100644 --- a/patch/0013-rmi-try-to-remove-all-layers-info-when-rmi.patch +++ b/patch/0013-rmi-try-to-remove-all-layers-info-when-rmi.patch @@ -1,7 +1,7 @@ -From 32df7006bd864286ad1153d0c29016ff83a6fa97 Mon Sep 17 00:00:00 2001 +From 0f89c2ca5594800c340623031fc48179f2cd0b52 Mon Sep 17 00:00:00 2001 From: LiFeng Date: Tue, 7 May 2019 03:40:58 -0400 -Subject: [PATCH 13/39] rmi: try to remove all layers info when rmi +Subject: [PATCH 13/40] rmi: try to remove all layers info when rmi Signed-off-by: LiFeng --- diff --git a/patch/0014-isulad-kit-vendor-ensure-remove-container-rootfs-dir.patch b/patch/0014-isulad-kit-vendor-ensure-remove-container-rootfs-dir.patch index c750f8b98ceedeabb3cd1f75d4576da638a9195a..e17d807a67d4efb2f4555f7bf57de05aa9b5a075 100644 --- a/patch/0014-isulad-kit-vendor-ensure-remove-container-rootfs-dir.patch +++ b/patch/0014-isulad-kit-vendor-ensure-remove-container-rootfs-dir.patch @@ -1,7 +1,7 @@ -From 2c62c38cfa3c4c43c0f94909492b2d8604aa0133 Mon Sep 17 00:00:00 2001 +From c6528dc6add38f8bd1ffece0328b6f1fdc4ebc50 Mon Sep 17 00:00:00 2001 From: WuJing Date: Mon, 13 May 2019 09:31:43 +0800 -Subject: [PATCH 14/39] isulad-kit-vendor: ensure remove container rootfs dir +Subject: [PATCH 14/40] isulad-kit-vendor: ensure remove container rootfs dir when errmsg contain "File name too long" Signed-off-by: WuJing diff --git a/patch/0015-split-mountpoints.json-and-layers.json-in-save.patch b/patch/0015-split-mountpoints.json-and-layers.json-in-save.patch index aa9c28534315c5d9c8763ca854aacd71d18b5ff6..51ae0c03d215d05b954ce3ca284a0223627fedfc 100644 --- a/patch/0015-split-mountpoints.json-and-layers.json-in-save.patch +++ b/patch/0015-split-mountpoints.json-and-layers.json-in-save.patch @@ -1,7 +1,7 @@ -From 1f7af62d28f04385b3ed9a7a0cfadfd58aed0c16 Mon Sep 17 00:00:00 2001 +From ecdf8da1df0a70c0ceeb83cb6e757c1e3ca67f22 Mon Sep 17 00:00:00 2001 From: LiFeng Date: Mon, 13 May 2019 04:58:15 -0400 -Subject: [PATCH 15/39] split mountpoints.json and layers.json in save +Subject: [PATCH 15/40] split mountpoints.json and layers.json in save Signed-off-by: LiFeng --- diff --git a/patch/0016-isulad-kit-vendor-fix-bug-of-concurrent-run-with-quo.patch b/patch/0016-isulad-kit-vendor-fix-bug-of-concurrent-run-with-quo.patch index c36597dd62e90c20c8261cab01f519f52174b229..cb7e9c7470d6f97265b5e0eee500febd81bb6f36 100644 --- a/patch/0016-isulad-kit-vendor-fix-bug-of-concurrent-run-with-quo.patch +++ b/patch/0016-isulad-kit-vendor-fix-bug-of-concurrent-run-with-quo.patch @@ -1,7 +1,7 @@ -From 54a96b51ad48c5a63d7d252d93c86b73f8d6553e Mon Sep 17 00:00:00 2001 +From d2cb64d0d1268e4f7a82a5df5051d1c1865f8f06 Mon Sep 17 00:00:00 2001 From: TanYiFeng Date: Mon, 20 May 2019 10:05:08 -0400 -Subject: [PATCH 16/39] isulad-kit-vendor: fix bug of concurrent run with quota +Subject: [PATCH 16/40] isulad-kit-vendor: fix bug of concurrent run with quota reason: setProjectQuota using common mutex to avoid set the same project id for diffrent containers, this may also get the same diff --git a/patch/0017-isulad-kit-vendor-fix-compile-error.patch b/patch/0017-isulad-kit-vendor-fix-compile-error.patch index 1af45a44c7ef3e0604ccf67e3a0f2611657d76dc..9c222c3a9ffbcb06feba5bcb940b12d08038d61b 100644 --- a/patch/0017-isulad-kit-vendor-fix-compile-error.patch +++ b/patch/0017-isulad-kit-vendor-fix-compile-error.patch @@ -1,7 +1,7 @@ -From f2af7671d759fa939272bdefef179b8901b75ed0 Mon Sep 17 00:00:00 2001 +From da79952c24b97123025ec331589e521c4fc155de Mon Sep 17 00:00:00 2001 From: TanYiFeng Date: Mon, 20 May 2019 10:31:12 -0400 -Subject: [PATCH 17/39] isulad-kit-vendor: fix compile error +Subject: [PATCH 17/40] isulad-kit-vendor: fix compile error Signed-off-by: TanYiFeng --- diff --git a/patch/0018-remove-unused-code.patch b/patch/0018-remove-unused-code.patch index 82a8e04e02a72da239a405c8065864fef28fa029..c0689acc427d6686647ae8e769b5e08b7435c139 100644 --- a/patch/0018-remove-unused-code.patch +++ b/patch/0018-remove-unused-code.patch @@ -1,7 +1,7 @@ -From 0fdfacb81ca71d8c673a796f6255779d0db4c627 Mon Sep 17 00:00:00 2001 +From 2319981dc2f33b03674d35db90769267aedabc68 Mon Sep 17 00:00:00 2001 From: TanYiFeng Date: Mon, 20 May 2019 10:45:55 -0400 -Subject: [PATCH 18/39] remove unused code +Subject: [PATCH 18/40] remove unused code Signed-off-by: TanYiFeng --- diff --git a/patch/0019-optimize-mount-operator.patch b/patch/0019-optimize-mount-operator.patch index c5214a968e2036d1a5035cf5562aa4bf75ca373e..c3b1956e7946f7164c3c22584fb208dce23e1681 100644 --- a/patch/0019-optimize-mount-operator.patch +++ b/patch/0019-optimize-mount-operator.patch @@ -1,7 +1,7 @@ -From 1d54dcf0a0f60e459bb197053dc93f5fec8184e3 Mon Sep 17 00:00:00 2001 +From 50142b71adab424d8120587ec2a903824b6ef313 Mon Sep 17 00:00:00 2001 From: LiuHao Date: Sat, 25 May 2019 16:45:28 +0800 -Subject: [PATCH 19/39] optimize mount operator +Subject: [PATCH 19/40] optimize mount operator 1. split mountpoints.json to each container 2. refactor mount operator diff --git a/patch/0020-Fix-file-retention-bug.patch b/patch/0020-Fix-file-retention-bug.patch index 83cf70b30ce3de2c4984dac53d91f24a6c07dd15..4adfd005cda5c51e0977ad0c2883821858899b0b 100644 --- a/patch/0020-Fix-file-retention-bug.patch +++ b/patch/0020-Fix-file-retention-bug.patch @@ -1,7 +1,7 @@ -From fd5a56176cfd1f153c1c43772ef07deb0405092a Mon Sep 17 00:00:00 2001 +From 4816f107bab59015b5c3206a6dfe19a872c59bab Mon Sep 17 00:00:00 2001 From: WuJing Date: Mon, 10 Jun 2019 10:54:43 +0800 -Subject: [PATCH 20/39] Fix file retention bug +Subject: [PATCH 20/40] Fix file retention bug Signed-off-by: WuJing --- diff --git a/patch/0021-set-layer-MountCount-0-without-mount-point-file.patch b/patch/0021-set-layer-MountCount-0-without-mount-point-file.patch index 7d9b558e3d7e9d5030e2a8b8f4c5e025c34624c4..e9eadc5c53d0a9abb43c534aeb8481dc7a48f54c 100644 --- a/patch/0021-set-layer-MountCount-0-without-mount-point-file.patch +++ b/patch/0021-set-layer-MountCount-0-without-mount-point-file.patch @@ -1,7 +1,7 @@ -From 7fd2af2a6b891ba696b5ce510d05bb77323d7624 Mon Sep 17 00:00:00 2001 +From 4a0da2c2f2b44cb63c8e87f565f5fe886d690e4f Mon Sep 17 00:00:00 2001 From: LiFeng Date: Mon, 10 Jun 2019 09:41:44 -0400 -Subject: [PATCH 21/39] set layer MountCount = 0 without mount point file +Subject: [PATCH 21/40] set layer MountCount = 0 without mount point file Signed-off-by: LiFeng --- diff --git a/patch/0022-encrypt-auth-config-and-add-lock.patch b/patch/0022-encrypt-auth-config-and-add-lock.patch index 2b6daf598bdef1a58f4251654b3f43240fee8331..00a115903ad05dee4f067069d3ef8cc45433119b 100644 --- a/patch/0022-encrypt-auth-config-and-add-lock.patch +++ b/patch/0022-encrypt-auth-config-and-add-lock.patch @@ -1,7 +1,7 @@ -From 21c6093d78f1c2f7c2a55c1ab2a3971536986130 Mon Sep 17 00:00:00 2001 +From 45d37c43ffb258cf16a89c7b64da3e71a0d9ad5d Mon Sep 17 00:00:00 2001 From: WangFengTu Date: Tue, 18 Jun 2019 14:12:33 +0800 -Subject: [PATCH 22/39] encrypt auth config and add lock +Subject: [PATCH 22/40] encrypt auth config and add lock Signed-off-by: WangFengTu --- diff --git a/patch/0023-Change-perm-and-add-max-file-size-check.patch b/patch/0023-Change-perm-and-add-max-file-size-check.patch index 6ca48f0b5226940667f5b4b44e30c8ae31af86cb..de6dc3c5eb3501b0a4a9279039005b6018285002 100644 --- a/patch/0023-Change-perm-and-add-max-file-size-check.patch +++ b/patch/0023-Change-perm-and-add-max-file-size-check.patch @@ -1,7 +1,7 @@ -From 70d54a60c7cea88dc7888ac5603598c0d30c51c0 Mon Sep 17 00:00:00 2001 +From f69038947f736eded6df39e639dea87ec4e11fd7 Mon Sep 17 00:00:00 2001 From: WangFengTu Date: Thu, 4 Jul 2019 16:19:56 +0800 -Subject: [PATCH 23/39] Change perm and add max file size check +Subject: [PATCH 23/40] Change perm and add max file size check Signed-off-by: WangFengTu --- diff --git a/patch/0024-force-remove-dir-with-rm-rf-in-overlay.patch b/patch/0024-force-remove-dir-with-rm-rf-in-overlay.patch index d89e0d1b2a9a9acc479d3d654c6a1c8e18d3aee4..2bee63bb4c3b482527be810c28bff4c3c8cf431f 100644 --- a/patch/0024-force-remove-dir-with-rm-rf-in-overlay.patch +++ b/patch/0024-force-remove-dir-with-rm-rf-in-overlay.patch @@ -1,7 +1,7 @@ -From 398f36b4314564893da8ce5c86b6300476a8d1fc Mon Sep 17 00:00:00 2001 +From 12106a7af55aaf3af9013e5a60bb7d5fd3071234 Mon Sep 17 00:00:00 2001 From: LiFeng Date: Thu, 18 Jul 2019 06:20:49 -0400 -Subject: [PATCH 24/39] force remove dir with rm -rf in overlay +Subject: [PATCH 24/40] force remove dir with rm -rf in overlay Signed-off-by: LiFeng --- diff --git a/patch/0025-EnsureRemoveAll-make-retry-count-from-5-to-50.patch b/patch/0025-EnsureRemoveAll-make-retry-count-from-5-to-50.patch index 19aef3d2d0168dc6ba0e3ec2417356a4721c3ec4..86029a734f3676fd1cf6041068810742b4a71a2b 100644 --- a/patch/0025-EnsureRemoveAll-make-retry-count-from-5-to-50.patch +++ b/patch/0025-EnsureRemoveAll-make-retry-count-from-5-to-50.patch @@ -1,7 +1,7 @@ -From f657e54c6bd3f393ae35dce10955a53bc9c82750 Mon Sep 17 00:00:00 2001 +From 4f7a72253eb99e24af38ae02059445ae196ba259 Mon Sep 17 00:00:00 2001 From: LiFeng Date: Mon, 22 Jul 2019 03:52:09 -0400 -Subject: [PATCH 25/39] EnsureRemoveAll make retry count from 5 to 50 +Subject: [PATCH 25/40] EnsureRemoveAll make retry count from 5 to 50 Signed-off-by: LiFeng --- diff --git a/patch/0026-report-error-log-when-openDir-failed.patch b/patch/0026-report-error-log-when-openDir-failed.patch index 0a957c467bb95c17b91f5b49f1c70ec1e9fb0e85..ba5283384941ad3a9d455ae52a5c2f9ecaceab66 100644 --- a/patch/0026-report-error-log-when-openDir-failed.patch +++ b/patch/0026-report-error-log-when-openDir-failed.patch @@ -1,7 +1,7 @@ -From 41d89c54722e674b0b5f24fa0374e57c7444f7f8 Mon Sep 17 00:00:00 2001 +From 7cd18566ae17a8cfbd56d3160fa5d531d3e87c31 Mon Sep 17 00:00:00 2001 From: TanYiFeng Date: Fri, 26 Jul 2019 05:02:55 -0400 -Subject: [PATCH 26/39] report error log when openDir failed +Subject: [PATCH 26/40] report error log when openDir failed Signed-off-by: TanYiFeng --- diff --git a/patch/0027-ignore-ENOENT-if-direcotry-has-been-removed-when-fin.patch b/patch/0027-ignore-ENOENT-if-direcotry-has-been-removed-when-fin.patch index c09784c6b602f618fd73c8ea83f1d93caaac3e01..4fd29ea91c65b3926ef04be8b3ca59886b94c904 100644 --- a/patch/0027-ignore-ENOENT-if-direcotry-has-been-removed-when-fin.patch +++ b/patch/0027-ignore-ENOENT-if-direcotry-has-been-removed-when-fin.patch @@ -1,7 +1,7 @@ -From b013ca63fd429d0605b64a82b285dfe9957aad6c Mon Sep 17 00:00:00 2001 +From d81dd9ff9aa2ca20ff3be1d67987ee91cf460853 Mon Sep 17 00:00:00 2001 From: TanYiFeng Date: Fri, 9 Aug 2019 04:56:23 -0400 -Subject: [PATCH 27/39] ignore ENOENT if direcotry has been removed when find +Subject: [PATCH 27/40] ignore ENOENT if direcotry has been removed when find next project id Signed-off-by: TanYiFeng diff --git a/patch/0028-fixbug-cause-by-remove-container.json-in-run-dir.patch b/patch/0028-fixbug-cause-by-remove-container.json-in-run-dir.patch index f4ff68830b88ef338c88a86fc80c4700e84d3b90..8c487e9cfe61b45a0f8e638eeffbf2e79a8bc387 100644 --- a/patch/0028-fixbug-cause-by-remove-container.json-in-run-dir.patch +++ b/patch/0028-fixbug-cause-by-remove-container.json-in-run-dir.patch @@ -1,7 +1,7 @@ -From 13b2943797e4e1c3560624c400f902e6e56b7aa1 Mon Sep 17 00:00:00 2001 +From 6225b81f2ab4f5fb1be273146e63988648210713 Mon Sep 17 00:00:00 2001 From: LiuHao Date: Fri, 9 Aug 2019 17:07:33 +0800 -Subject: [PATCH 28/39] fixbug: cause by remove container.json in run dir +Subject: [PATCH 28/40] fixbug: cause by remove container.json in run dir Start container will load container.json in run dir. If it is not exist, start container will failed. diff --git a/patch/0029-Performace-optimization.patch b/patch/0029-Performace-optimization.patch index 24fa544eb8520109df41a70c1d36021e6cb6e3d2..e7c39995609264d4cad2a65402950044101bb91e 100644 --- a/patch/0029-Performace-optimization.patch +++ b/patch/0029-Performace-optimization.patch @@ -1,7 +1,7 @@ -From 395835817c36909d8fabd74b202321294c78fa46 Mon Sep 17 00:00:00 2001 +From 0abc2058e971b4f5da99800c56525c08b0a219e2 Mon Sep 17 00:00:00 2001 From: WangFengTu Date: Tue, 26 Nov 2019 22:06:55 -0500 -Subject: [PATCH 29/39] Performace optimization +Subject: [PATCH 29/40] Performace optimization 1.Seprate big json file to small json files. 2.Migation json files for above change. diff --git a/patch/0030-Support-load-multiple-images.patch b/patch/0030-Support-load-multiple-images.patch index 47a2720b6f3af6aed29d7cfab6e70f150e6a7662..45458f99e750e1c42415e2af52fe465c2f907544 100644 --- a/patch/0030-Support-load-multiple-images.patch +++ b/patch/0030-Support-load-multiple-images.patch @@ -1,7 +1,7 @@ -From a03fd8a35096d296de9ea0ce812169f3911ebab2 Mon Sep 17 00:00:00 2001 +From c82e00ca50f7eb64da9c35e43bcf6f747908b123 Mon Sep 17 00:00:00 2001 From: WangFengTu Date: Mon, 18 Nov 2019 21:20:52 -0500 -Subject: [PATCH 30/39] Support load multiple images +Subject: [PATCH 30/40] Support load multiple images Signed-off-by: WangFengTu --- diff --git a/patch/0031-SWR-response-406-Not-Acceptable-if-oci-image-in-firs.patch b/patch/0031-SWR-response-406-Not-Acceptable-if-oci-image-in-firs.patch index 8cb08803732660729aa92ffdcc177807445310cf..21a54903678c983155f619ea4f46c4a94b1e26b1 100644 --- a/patch/0031-SWR-response-406-Not-Acceptable-if-oci-image-in-firs.patch +++ b/patch/0031-SWR-response-406-Not-Acceptable-if-oci-image-in-firs.patch @@ -1,7 +1,7 @@ -From b03b9d3688a1bd03725b453b6d737571b1c7c117 Mon Sep 17 00:00:00 2001 +From 5bedfd409d0c6f0126c9f483b4c5204d81789e3f Mon Sep 17 00:00:00 2001 From: WangFengTu Date: Fri, 29 Nov 2019 03:21:02 -0500 -Subject: [PATCH 31/39] SWR response "406: Not Acceptable" if oci image in +Subject: [PATCH 31/40] SWR response "406: Not Acceptable" if oci image in first Signed-off-by: WangFengTu diff --git a/patch/0032-log-message-of-get-mountpoint-failed.patch b/patch/0032-log-message-of-get-mountpoint-failed.patch index f5dce9799fb4ca22de2f69f452e7fbcc2f173219..9f1d44626de8fc1d355fabdc946cb6652d216b70 100644 --- a/patch/0032-log-message-of-get-mountpoint-failed.patch +++ b/patch/0032-log-message-of-get-mountpoint-failed.patch @@ -1,7 +1,7 @@ -From 60f45659a07d3b402ceb499ca5c8fea20115e2a7 Mon Sep 17 00:00:00 2001 +From a24c6f58e66a7c4e826823dbdc2f97e83a3ddc2f Mon Sep 17 00:00:00 2001 From: LiuHao Date: Thu, 5 Dec 2019 10:13:52 +0800 -Subject: [PATCH 32/39] log message of get mountpoint failed +Subject: [PATCH 32/40] log message of get mountpoint failed Signed-off-by: LiuHao --- diff --git a/patch/0033-Save-config-to-disk-if-images-s-name-is-removed.patch b/patch/0033-Save-config-to-disk-if-images-s-name-is-removed.patch index c1f48319728244ee557e5e5ca581d3f436bffd16..83be04f6cecf77125ecef56713bb1687cba776ae 100644 --- a/patch/0033-Save-config-to-disk-if-images-s-name-is-removed.patch +++ b/patch/0033-Save-config-to-disk-if-images-s-name-is-removed.patch @@ -1,7 +1,7 @@ -From 96b5a98e3cd2d590276ac791a3a93e5ede4873a2 Mon Sep 17 00:00:00 2001 +From 882d8bb7734ff6eb15384aa8bbcb9d2ea1ecb04f Mon Sep 17 00:00:00 2001 From: WangFengTu Date: Wed, 18 Dec 2019 07:29:06 -0500 -Subject: [PATCH 33/39] Save config to disk if images's name is removed +Subject: [PATCH 33/40] Save config to disk if images's name is removed Signed-off-by: WangFengTu --- diff --git a/patch/0034-Try-to-repair-lowers-file-if-current-layer-is-reusin.patch b/patch/0034-Try-to-repair-lowers-file-if-current-layer-is-reusin.patch index 5c7ec9abd436f84337752b6e1f1e01f480b80553..034218ad72dd86f314a75b446983634b8b8d2023 100644 --- a/patch/0034-Try-to-repair-lowers-file-if-current-layer-is-reusin.patch +++ b/patch/0034-Try-to-repair-lowers-file-if-current-layer-is-reusin.patch @@ -1,7 +1,7 @@ -From 4db42fe2c8140c7e7ffc064c6bef6c40a20fb469 Mon Sep 17 00:00:00 2001 +From 3a8a647cad1c2d1ca58b48db863cbbcbfcbbb0f6 Mon Sep 17 00:00:00 2001 From: WangFengTu Date: Mon, 30 Dec 2019 10:20:56 +0800 -Subject: [PATCH 34/39] Try to repair lowers file if current layer is reusing +Subject: [PATCH 34/40] Try to repair lowers file if current layer is reusing Signed-off-by: WangFengTu --- diff --git a/patch/0035-Fix-CVE-2018-15664.patch b/patch/0035-Fix-CVE-2018-15664.patch index b1f30e4d0dea77f97bf8236602085cd5c1b79f42..657bd56900365299a69680814028812e9f425667 100644 --- a/patch/0035-Fix-CVE-2018-15664.patch +++ b/patch/0035-Fix-CVE-2018-15664.patch @@ -1,7 +1,7 @@ -From 7bc876f67bfc1a00b0b76a6ddf33c99d2b1a617a Mon Sep 17 00:00:00 2001 +From 84ea4831f86452a98bf47097ff7cbe94b8501998 Mon Sep 17 00:00:00 2001 From: Matthew Heon Date: Wed, 5 Jun 2019 15:07:44 -0400 -Subject: [PATCH 35/39] Fix CVE-2018-15664 +Subject: [PATCH 35/40] Fix CVE-2018-15664 Cherry-pick moby/moby #39292 for CVE-2018-15664 fixes diff --git a/patch/0036-Change-interface-of-AES.patch b/patch/0036-Change-interface-of-AES.patch index d754de4c7ac7a05d31e3b52b0d398228821f53b4..64e83f6c9602cb5b8a8a70190bc6ab825b4761bd 100644 --- a/patch/0036-Change-interface-of-AES.patch +++ b/patch/0036-Change-interface-of-AES.patch @@ -1,7 +1,7 @@ -From 6a40555040289a7802f0a0ba5c25ffc84e5e5fc1 Mon Sep 17 00:00:00 2001 +From fe2ccd9e62ff7ebd43ca4cff2e6090682d624f74 Mon Sep 17 00:00:00 2001 From: WangFengTu Date: Fri, 17 Jan 2020 02:50:13 -0500 -Subject: [PATCH 36/39] Change interface of AES +Subject: [PATCH 36/40] Change interface of AES Signed-off-by: WangFengTu --- diff --git a/patch/0037-Change-iSulad-kit-to-iSulad-img.patch b/patch/0037-Change-iSulad-kit-to-iSulad-img.patch index 72a09325dcd9698c3e5116eb0af9c7d77f99f6f8..3afb416e1ee7d5789449d3a0e9010ace4e5be823 100644 --- a/patch/0037-Change-iSulad-kit-to-iSulad-img.patch +++ b/patch/0037-Change-iSulad-kit-to-iSulad-img.patch @@ -1,7 +1,7 @@ -From cdfabb0c92145298c2e30337823c618d6bb2bc84 Mon Sep 17 00:00:00 2001 +From 438029ff5c717c2f18b475ff14bd1e6f21695e5a Mon Sep 17 00:00:00 2001 From: WangFengTu Date: Tue, 21 Jan 2020 04:04:44 -0500 -Subject: [PATCH 37/39] Change iSulad-kit to iSulad-img +Subject: [PATCH 37/40] Change iSulad-kit to iSulad-img Signed-off-by: WangFengTu --- diff --git a/patch/0038-Fix-some-devicemapper-bugs.patch b/patch/0038-Fix-some-devicemapper-bugs.patch index a659d2c01ab7b28b6f6045230f62e1e2b6bc43d7..8d1fd2936d594fc044b10153623956ef5e416775 100644 --- a/patch/0038-Fix-some-devicemapper-bugs.patch +++ b/patch/0038-Fix-some-devicemapper-bugs.patch @@ -1,7 +1,7 @@ -From 02b8d76615fd1d0118cdc56258b98feef25c6e34 Mon Sep 17 00:00:00 2001 +From 80af9be2a86a4b7c7d696f1ba57684efcf4f2081 Mon Sep 17 00:00:00 2001 From: WangFengTu Date: Sun, 19 Jan 2020 11:25:09 +0800 -Subject: [PATCH 38/39] Fix some devicemapper bugs +Subject: [PATCH 38/40] Fix some devicemapper bugs Signed-off-by: WangFengTu --- diff --git a/patch/0039-Fix-wrong-mount-count-and-avoid-failure-when-unmount.patch b/patch/0039-Fix-wrong-mount-count-and-avoid-failure-when-unmount.patch index 9dcefbff1137fa43a4a9aaf794c700d7db3aad63..861a7cbe22a1cba251b43f00044cc8b7620e0280 100644 --- a/patch/0039-Fix-wrong-mount-count-and-avoid-failure-when-unmount.patch +++ b/patch/0039-Fix-wrong-mount-count-and-avoid-failure-when-unmount.patch @@ -1,7 +1,7 @@ -From 5457b959c4c81c0e9836cd12b085eb5cfca44a7b Mon Sep 17 00:00:00 2001 +From 74ff1803bdee28b79245d25ec1a2f2f972c3fdaa Mon Sep 17 00:00:00 2001 From: WangFengTu Date: Thu, 20 Feb 2020 11:17:42 +0800 -Subject: [PATCH 39/39] Fix wrong mount count and avoid failure when unmounting +Subject: [PATCH 39/40] Fix wrong mount count and avoid failure when unmounting an unmounted mountpoint Add lock when unmount mountpoint to avoid wrong mount count. And check if diff --git a/patch/0040-Add-unit-test-for-devicemapper.patch b/patch/0040-Add-unit-test-for-devicemapper.patch new file mode 100644 index 0000000000000000000000000000000000000000..cc9411048a7d549650c84d96a14142ae0396802a --- /dev/null +++ b/patch/0040-Add-unit-test-for-devicemapper.patch @@ -0,0 +1,1085 @@ +From f5e658fff821614f52d1dbd5ec038e3b0dc99e4d Mon Sep 17 00:00:00 2001 +From: WangFengTu +Date: Fri, 21 Feb 2020 23:06:20 -0500 +Subject: [PATCH 40/40] Add unit-test for devicemapper + +cherry-picked devicemapper related unit-test from +https://github.com/containers/storage + +Signed-off-by: WangFengTu +--- + .../drivers/devmapper/devmapper_test.go | 155 ++++++ + .../drivers/graphtest/graphtest_unix.go | 462 ++++++++++++++++++ + .../storage/drivers/graphtest/testutil.go | 351 +++++++++++++ + .../drivers/graphtest/testutil_unix.go | 70 +++ + 4 files changed, 1038 insertions(+) + create mode 100644 vendor/github.com/containers/storage/drivers/devmapper/devmapper_test.go + create mode 100644 vendor/github.com/containers/storage/drivers/graphtest/graphtest_unix.go + create mode 100644 vendor/github.com/containers/storage/drivers/graphtest/testutil.go + create mode 100644 vendor/github.com/containers/storage/drivers/graphtest/testutil_unix.go + +diff --git a/vendor/github.com/containers/storage/drivers/devmapper/devmapper_test.go b/vendor/github.com/containers/storage/drivers/devmapper/devmapper_test.go +new file mode 100644 +index 0000000..d44a734 +--- /dev/null ++++ b/vendor/github.com/containers/storage/drivers/devmapper/devmapper_test.go +@@ -0,0 +1,155 @@ ++// +build linux,cgo ++ ++package devmapper ++ ++import ( ++ "fmt" ++ "os" ++ "syscall" ++ "testing" ++ "time" ++ ++ graphdriver "github.com/containers/storage/drivers" ++ "github.com/containers/storage/drivers/graphtest" ++) ++ ++func init() { ++ // Reduce the size of the base fs and loopback for the tests ++ defaultDataLoopbackSize = 300 * 1024 * 1024 ++ defaultMetaDataLoopbackSize = 200 * 1024 * 1024 ++ defaultBaseFsSize = 300 * 1024 * 1024 ++ defaultUdevSyncOverride = true ++ if err := initLoopbacks(); err != nil { ++ panic(err) ++ } ++} ++ ++// initLoopbacks ensures that the loopback devices are properly created within ++// the system running the device mapper tests. ++func initLoopbacks() error { ++ statT, err := getBaseLoopStats() ++ if err != nil { ++ return err ++ } ++ // create at least 8 loopback files, ya, that is a good number ++ for i := 0; i < 8; i++ { ++ loopPath := fmt.Sprintf("/dev/loop%d", i) ++ // only create new loopback files if they don't exist ++ if _, err := os.Stat(loopPath); err != nil { ++ if mkerr := syscall.Mknod(loopPath, ++ uint32(statT.Mode|syscall.S_IFBLK), int((7<<8)|(i&0xff)|((i&0xfff00)<<12))); mkerr != nil { ++ return mkerr ++ } ++ os.Chown(loopPath, int(statT.Uid), int(statT.Gid)) ++ } ++ } ++ return nil ++} ++ ++// getBaseLoopStats inspects /dev/loop0 to collect uid,gid, and mode for the ++// loop0 device on the system. If it does not exist we assume 0,0,0660 for the ++// stat data ++func getBaseLoopStats() (*syscall.Stat_t, error) { ++ loop0, err := os.Stat("/dev/loop0") ++ if err != nil { ++ if os.IsNotExist(err) { ++ return &syscall.Stat_t{ ++ Uid: 0, ++ Gid: 0, ++ Mode: 0660, ++ }, nil ++ } ++ return nil, err ++ } ++ return loop0.Sys().(*syscall.Stat_t), nil ++} ++ ++// This avoids creating a new driver for each test if all tests are run ++// Make sure to put new tests between TestDevmapperSetup and TestDevmapperTeardown ++func TestDevmapperSetup(t *testing.T) { ++ graphtest.GetDriver(t, "devicemapper", "test=1") ++} ++ ++func TestDevmapperCreateEmpty(t *testing.T) { ++ graphtest.DriverTestCreateEmpty(t, "devicemapper", "test=1") ++} ++ ++func TestDevmapperCreateBase(t *testing.T) { ++ graphtest.DriverTestCreateBase(t, "devicemapper", "test=1") ++} ++ ++func TestDevmapperCreateSnap(t *testing.T) { ++ graphtest.DriverTestCreateSnap(t, "devicemapper", "test=1") ++} ++ ++func TestDevmapperTeardown(t *testing.T) { ++ graphtest.PutDriver(t) ++} ++ ++func TestDevmapperEcho(t *testing.T) { ++ graphtest.DriverTestEcho(t, "devicemapper", "test=1") ++} ++ ++func TestDevmapperReduceLoopBackSize(t *testing.T) { ++ tenMB := int64(10 * 1024 * 1024) ++ testChangeLoopBackSize(t, -tenMB, defaultDataLoopbackSize, defaultMetaDataLoopbackSize) ++} ++ ++func TestDevmapperIncreaseLoopBackSize(t *testing.T) { ++ tenMB := int64(10 * 1024 * 1024) ++ testChangeLoopBackSize(t, tenMB, defaultDataLoopbackSize+tenMB, defaultMetaDataLoopbackSize+tenMB) ++} ++ ++func testChangeLoopBackSize(t *testing.T, delta, expectDataSize, expectMetaDataSize int64) { ++ driver := graphtest.GetDriver(t, "devicemapper", "test=1").(*graphtest.Driver).Driver.(*graphdriver.NaiveDiffDriver).ProtoDriver.(*Driver) ++ defer graphtest.PutDriver(t) ++ // make sure data or metadata loopback size are the default size ++ if s := driver.DeviceSet.Status(); s.Data.Total != uint64(defaultDataLoopbackSize) || s.Metadata.Total != uint64(defaultMetaDataLoopbackSize) { ++ t.Fatal("data or metadata loop back size is incorrect") ++ } ++ if err := driver.Cleanup(); err != nil { ++ t.Fatal(err) ++ } ++ //Reload ++ d, err := Init(driver.home, []string{fmt.Sprintf("dm.loopdatasize=%d", defaultDataLoopbackSize+delta), ++ fmt.Sprintf("dm.loopmetadatasize=%d", defaultMetaDataLoopbackSize+delta), ++ "test=1"}, nil, nil) ++ if err != nil { ++ t.Fatalf("error creating devicemapper driver: %v", err) ++ } ++ driver = d.(*graphdriver.NaiveDiffDriver).ProtoDriver.(*Driver) ++ if s := driver.DeviceSet.Status(); s.Data.Total != uint64(expectDataSize) || s.Metadata.Total != uint64(expectMetaDataSize) { ++ t.Fatal("data or metadata loop back size is incorrect") ++ } ++ if err := driver.Cleanup(); err != nil { ++ t.Fatal(err) ++ } ++} ++ ++// Make sure devices.Lock() has been release upon return from cleanupDeletedDevices() function ++func TestDevmapperLockReleasedDeviceDeletion(t *testing.T) { ++ driver := graphtest.GetDriver(t, "devicemapper", "test=1").(*graphtest.Driver).Driver.(*graphdriver.NaiveDiffDriver).ProtoDriver.(*Driver) ++ defer graphtest.PutDriver(t) ++ ++ // Call cleanupDeletedDevices() and after the call take and release ++ // DeviceSet Lock. If lock has not been released, this will hang. ++ driver.DeviceSet.cleanupDeletedDevices() ++ ++ doneChan := make(chan bool) ++ ++ go func() { ++ driver.DeviceSet.Lock() ++ defer driver.DeviceSet.Unlock() ++ doneChan <- true ++ }() ++ ++ select { ++ case <-time.After(time.Second * 5): ++ // Timer expired. That means lock was not released upon ++ // function return and we are deadlocked. Release lock ++ // here so that cleanup could succeed and fail the test. ++ driver.DeviceSet.Unlock() ++ t.Fatal("Could not acquire devices lock after call to cleanupDeletedDevices()") ++ case <-doneChan: ++ } ++} +diff --git a/vendor/github.com/containers/storage/drivers/graphtest/graphtest_unix.go b/vendor/github.com/containers/storage/drivers/graphtest/graphtest_unix.go +new file mode 100644 +index 0000000..83e026c +--- /dev/null ++++ b/vendor/github.com/containers/storage/drivers/graphtest/graphtest_unix.go +@@ -0,0 +1,462 @@ ++// +build linux freebsd solaris ++ ++package graphtest ++ ++import ( ++ "bytes" ++ "fmt" ++ "io/ioutil" ++ "math/rand" ++ "os" ++ "path" ++ "path/filepath" ++ "reflect" ++ "testing" ++ "unsafe" ++ ++ graphdriver "github.com/containers/storage/drivers" ++ "github.com/containers/storage/pkg/archive" ++ "github.com/containers/storage/pkg/stringid" ++ "github.com/docker/go-units" ++ "github.com/pkg/errors" ++ "github.com/stretchr/testify/assert" ++ "github.com/stretchr/testify/require" ++ "golang.org/x/sys/unix" ++) ++ ++var ( ++ drv *Driver ++) ++ ++// Driver conforms to graphdriver.Driver interface and ++// contains information such as root and reference count of the number of clients using it. ++// This helps in testing drivers added into the framework. ++type Driver struct { ++ graphdriver.Driver ++ root string ++ refCount int ++} ++ ++func newDriver(t testing.TB, name string, options []string) *Driver { ++ root, err := ioutil.TempDir("", "storage-graphtest-") ++ require.NoError(t, err) ++ ++ require.NoError(t, os.MkdirAll(root, 0755)) ++ d, err := graphdriver.GetDriver(name, graphdriver.Options{DriverOptions: options, Root: root}) ++ if err != nil { ++ t.Logf("graphdriver: %v\n", err) ++ cause := errors.Cause(err) ++ if cause == graphdriver.ErrNotSupported || cause == graphdriver.ErrPrerequisites || cause == graphdriver.ErrIncompatibleFS { ++ t.Skipf("Driver %s not supported", name) ++ } ++ t.Fatal(err) ++ } ++ return &Driver{d, root, 1} ++} ++ ++func cleanup(t testing.TB, d *Driver) { ++ if err := drv.Cleanup(); err != nil { ++ t.Fatal(err) ++ } ++ os.RemoveAll(d.root) ++} ++ ++// GetDriver create a new driver with given name or return an existing driver with the name updating the reference count. ++func GetDriver(t testing.TB, name string, options ...string) graphdriver.Driver { ++ if drv == nil { ++ drv = newDriver(t, name, options) ++ } else { ++ drv.refCount++ ++ } ++ return drv ++} ++ ++// PutDriver removes the driver if it is no longer used and updates the reference count. ++func PutDriver(t testing.TB) { ++ if drv == nil { ++ t.Skip("No driver to put!") ++ } ++ drv.refCount-- ++ if drv.refCount == 0 { ++ cleanup(t, drv) ++ drv = nil ++ } ++} ++ ++// DriverTestCreateEmpty creates a new image and verifies it is empty and the right metadata ++func DriverTestCreateEmpty(t testing.TB, drivername string, driverOptions ...string) { ++ driver := GetDriver(t, drivername, driverOptions...) ++ defer PutDriver(t) ++ ++ err := driver.Create("empty", "", nil) ++ require.NoError(t, err) ++ ++ defer func() { ++ require.NoError(t, driver.Remove("empty")) ++ }() ++ ++ if !driver.Exists("empty") { ++ t.Fatal("Newly created image doesn't exist") ++ } ++ ++ dir, err := driver.Get("empty", graphdriver.MountOpts{}) ++ require.NoError(t, err) ++ ++ verifyFile(t, dir, 0755|os.ModeDir, 0, 0) ++ ++ // Verify that the directory is empty ++ fis, err := readDir(dir) ++ require.NoError(t, err) ++ assert.Len(t, fis, 0) ++ ++ driver.Put("empty") ++} ++ ++// DriverTestCreateBase create a base driver and verify. ++func DriverTestCreateBase(t testing.TB, drivername string, driverOptions ...string) { ++ driver := GetDriver(t, drivername, driverOptions...) ++ defer PutDriver(t) ++ ++ createBase(t, driver, "Base") ++ defer func() { ++ require.NoError(t, driver.Remove("Base")) ++ }() ++ verifyBase(t, driver, "Base") ++} ++ ++// DriverTestCreateSnap Create a driver and snap and verify. ++func DriverTestCreateSnap(t testing.TB, drivername string, driverOptions ...string) { ++ driver := GetDriver(t, drivername, driverOptions...) ++ defer PutDriver(t) ++ ++ createBase(t, driver, "Base") ++ defer func() { ++ require.NoError(t, driver.Remove("Base")) ++ }() ++ ++ err := driver.Create("Snap", "Base", nil) ++ require.NoError(t, err) ++ defer func() { ++ require.NoError(t, driver.Remove("Snap")) ++ }() ++ ++ verifyBase(t, driver, "Snap") ++} ++ ++// DriverTestDeepLayerRead reads a file from a lower layer under a given number of layers ++func DriverTestDeepLayerRead(t testing.TB, layerCount int, drivername string, driverOptions ...string) { ++ driver := GetDriver(t, drivername, driverOptions...) ++ defer PutDriver(t) ++ ++ base := stringid.GenerateRandomID() ++ if err := driver.Create(base, "", nil); err != nil { ++ t.Fatal(err) ++ } ++ ++ content := []byte("test content") ++ if err := addFile(driver, base, "testfile.txt", content); err != nil { ++ t.Fatal(err) ++ } ++ ++ topLayer, err := addManyLayers(driver, base, layerCount) ++ if err != nil { ++ t.Fatal(err) ++ } ++ ++ err = checkManyLayers(driver, topLayer, layerCount) ++ if err != nil { ++ t.Fatal(err) ++ } ++ ++ if err := checkFile(driver, topLayer, "testfile.txt", content); err != nil { ++ t.Fatal(err) ++ } ++} ++ ++// DriverTestDiffApply tests diffing and applying produces the same layer ++func DriverTestDiffApply(t testing.TB, fileCount int, drivername string, driverOptions ...string) { ++ driver := GetDriver(t, drivername, driverOptions...) ++ defer PutDriver(t) ++ base := stringid.GenerateRandomID() ++ upper := stringid.GenerateRandomID() ++ deleteFile := "file-remove.txt" ++ deleteFileContent := []byte("This file should get removed in upper!") ++ deleteDir := "var/lib" ++ ++ if err := driver.Create(base, "", nil); err != nil { ++ t.Fatal(err) ++ } ++ ++ if err := addManyFiles(driver, base, fileCount, 3); err != nil { ++ t.Fatal(err) ++ } ++ ++ if err := addFile(driver, base, deleteFile, deleteFileContent); err != nil { ++ t.Fatal(err) ++ } ++ ++ if err := addDirectory(driver, base, deleteDir); err != nil { ++ t.Fatal(err) ++ } ++ ++ if err := driver.Create(upper, base, nil); err != nil { ++ t.Fatal(err) ++ } ++ ++ if err := addManyFiles(driver, upper, fileCount, 6); err != nil { ++ t.Fatal(err) ++ } ++ ++ if err := removeAll(driver, upper, deleteFile, deleteDir); err != nil { ++ t.Fatal(err) ++ } ++ ++ diffSize, err := driver.DiffSize(upper, nil, "", nil, "") ++ if err != nil { ++ t.Fatal(err) ++ } ++ ++ diff := stringid.GenerateRandomID() ++ if err := driver.Create(diff, base, nil); err != nil { ++ t.Fatal(err) ++ } ++ ++ if err := checkManyFiles(driver, diff, fileCount, 3); err != nil { ++ t.Fatal(err) ++ } ++ ++ if err := checkFile(driver, diff, deleteFile, deleteFileContent); err != nil { ++ t.Fatal(err) ++ } ++ ++ arch, err := driver.Diff(upper, nil, base, nil, "") ++ if err != nil { ++ t.Fatal(err) ++ } ++ ++ buf := bytes.NewBuffer(nil) ++ if _, err := buf.ReadFrom(arch); err != nil { ++ t.Fatal(err) ++ } ++ if err := arch.Close(); err != nil { ++ t.Fatal(err) ++ } ++ ++ applyDiffSize, err := driver.ApplyDiff(diff, nil, base, "", bytes.NewReader(buf.Bytes())) ++ if err != nil { ++ t.Fatal(err) ++ } ++ ++ if applyDiffSize != diffSize { ++ t.Fatalf("Apply diff size different, got %d, expected %d", applyDiffSize, diffSize) ++ } ++ ++ if err := checkManyFiles(driver, diff, fileCount, 6); err != nil { ++ t.Fatal(err) ++ } ++ ++ if err := checkFileRemoved(driver, diff, deleteFile); err != nil { ++ t.Fatal(err) ++ } ++ ++ if err := checkFileRemoved(driver, diff, deleteDir); err != nil { ++ t.Fatal(err) ++ } ++} ++ ++// DriverTestChanges tests computed changes on a layer matches changes made ++func DriverTestChanges(t testing.TB, drivername string, driverOptions ...string) { ++ driver := GetDriver(t, drivername, driverOptions...) ++ defer PutDriver(t) ++ base := stringid.GenerateRandomID() ++ upper := stringid.GenerateRandomID() ++ if err := driver.Create(base, "", nil); err != nil { ++ t.Fatal(err) ++ } ++ ++ if err := addManyFiles(driver, base, 20, 3); err != nil { ++ t.Fatal(err) ++ } ++ ++ if err := driver.Create(upper, base, nil); err != nil { ++ t.Fatal(err) ++ } ++ ++ expectedChanges, err := changeManyFiles(driver, upper, 20, 6) ++ if err != nil { ++ t.Fatal(err) ++ } ++ ++ changes, err := driver.Changes(upper, nil, base, nil, "") ++ if err != nil { ++ t.Fatal(err) ++ } ++ ++ if err = checkChanges(expectedChanges, changes); err != nil { ++ t.Fatal(err) ++ } ++} ++ ++func writeRandomFile(path string, size uint64) error { ++ buf := make([]int64, size/8) ++ ++ r := rand.NewSource(0) ++ for i := range buf { ++ buf[i] = r.Int63() ++ } ++ ++ // Cast to []byte ++ header := *(*reflect.SliceHeader)(unsafe.Pointer(&buf)) ++ header.Len *= 8 ++ header.Cap *= 8 ++ data := *(*[]byte)(unsafe.Pointer(&header)) ++ ++ return ioutil.WriteFile(path, data, 0700) ++} ++ ++// DriverTestSetQuota Create a driver and test setting quota. ++func DriverTestSetQuota(t *testing.T, drivername string) { ++ driver := GetDriver(t, drivername) ++ defer PutDriver(t) ++ ++ createBase(t, driver, "Base") ++ createOpts := &graphdriver.CreateOpts{} ++ createOpts.StorageOpt = make(map[string]string, 1) ++ createOpts.StorageOpt["size"] = "50M" ++ if err := driver.Create("zfsTest", "Base", createOpts); err != nil { ++ t.Fatal(err) ++ } ++ ++ mountPath, err := driver.Get("zfsTest", graphdriver.MountOpts{}) ++ if err != nil { ++ t.Fatal(err) ++ } ++ ++ quota := uint64(50 * units.MiB) ++ err = writeRandomFile(path.Join(mountPath, "file"), quota*2) ++ if pathError, ok := err.(*os.PathError); ok && pathError.Err != unix.EDQUOT { ++ t.Fatalf("expect write() to fail with %v, got %v", unix.EDQUOT, err) ++ } ++ ++} ++ ++// DriverTestEcho tests that we can diff a layer correctly, focusing on trouble spots that NaiveDiff doesn't have ++func DriverTestEcho(t testing.TB, drivername string, driverOptions ...string) { ++ driver := GetDriver(t, drivername, driverOptions...) ++ defer PutDriver(t) ++ var err error ++ var root string ++ components := 10 ++ ++ for depth := 0; depth < components; depth++ { ++ base := stringid.GenerateRandomID() ++ second := stringid.GenerateRandomID() ++ third := stringid.GenerateRandomID() ++ ++ if err := driver.Create(base, "", nil); err != nil { ++ t.Fatal(err) ++ } ++ ++ if root, err = driver.Get(base, graphdriver.MountOpts{}); err != nil { ++ t.Fatal(err) ++ } ++ ++ paths := []string{} ++ path := "/" ++ expectedChanges := []archive.Change{} ++ for i := 0; i < components-1; i++ { ++ path = filepath.Join(path, fmt.Sprintf("subdir%d", i+1)) ++ paths = append(paths, path) ++ if err = os.Mkdir(filepath.Join(root, path), 0700); err != nil { ++ t.Fatal(err) ++ } ++ expectedChanges = append(expectedChanges, archive.Change{Kind: archive.ChangeAdd, Path: path}) ++ } ++ path = filepath.Join(path, "file") ++ paths = append(paths, path) ++ if err = ioutil.WriteFile(filepath.Join(root, path), randomContent(128, int64(depth)), 0600); err != nil { ++ t.Fatal(err) ++ } ++ expectedChanges = append(expectedChanges, archive.Change{Kind: archive.ChangeAdd, Path: path}) ++ ++ changes, err := driver.Changes(base, nil, "", nil, "") ++ if err != nil { ++ t.Fatal(err) ++ } ++ ++ if err = checkChanges(expectedChanges, changes); err != nil { ++ t.Fatal(err) ++ } ++ ++ if err := driver.Create(second, base, nil); err != nil { ++ t.Fatal(err) ++ } ++ ++ if root, err = driver.Get(second, graphdriver.MountOpts{}); err != nil { ++ t.Fatal(err) ++ } ++ ++ if err = os.RemoveAll(filepath.Join(root, paths[depth])); err != nil { ++ t.Fatal(err) ++ } ++ expectedChanges = []archive.Change{} ++ for i := 0; i < depth; i++ { ++ expectedChanges = append(expectedChanges, archive.Change{Kind: archive.ChangeModify, Path: paths[i]}) ++ } ++ expectedChanges = append(expectedChanges, archive.Change{Kind: archive.ChangeDelete, Path: paths[depth]}) ++ ++ changes, err = driver.Changes(second, nil, base, nil, "") ++ if err != nil { ++ t.Fatal(err) ++ } ++ ++ if err = checkChanges(expectedChanges, changes); err != nil { ++ t.Fatal(err) ++ } ++ ++ if err = driver.Create(third, second, nil); err != nil { ++ t.Fatal(err) ++ } ++ ++ if root, err = driver.Get(third, graphdriver.MountOpts{}); err != nil { ++ t.Fatal(err) ++ } ++ ++ expectedChanges = []archive.Change{} ++ for i := 0; i < depth; i++ { ++ expectedChanges = append(expectedChanges, archive.Change{Kind: archive.ChangeModify, Path: paths[i]}) ++ } ++ for i := depth; i < components-1; i++ { ++ if err = os.Mkdir(filepath.Join(root, paths[i]), 0700); err != nil { ++ t.Fatal(err) ++ } ++ expectedChanges = append(expectedChanges, archive.Change{Kind: archive.ChangeAdd, Path: paths[i]}) ++ } ++ if err = ioutil.WriteFile(filepath.Join(root, paths[len(paths)-1]), randomContent(128, int64(depth)), 0600); err != nil { ++ t.Fatal(err) ++ } ++ expectedChanges = append(expectedChanges, archive.Change{Kind: archive.ChangeAdd, Path: paths[len(paths)-1]}) ++ ++ changes, err = driver.Changes(third, nil, second, nil, "") ++ if err != nil { ++ t.Fatal(err) ++ } ++ ++ if err = checkChanges(expectedChanges, changes); err != nil { ++ t.Fatal(err) ++ } ++ ++ err = driver.Put(third) ++ if err != nil { ++ t.Fatal(err) ++ } ++ err = driver.Put(second) ++ if err != nil { ++ t.Fatal(err) ++ } ++ err = driver.Put(base) ++ if err != nil { ++ t.Fatal(err) ++ } ++ } ++} +diff --git a/vendor/github.com/containers/storage/drivers/graphtest/testutil.go b/vendor/github.com/containers/storage/drivers/graphtest/testutil.go +new file mode 100644 +index 0000000..3ab7541 +--- /dev/null ++++ b/vendor/github.com/containers/storage/drivers/graphtest/testutil.go +@@ -0,0 +1,351 @@ ++package graphtest ++ ++import ( ++ "bytes" ++ "fmt" ++ "io/ioutil" ++ "math/rand" ++ "os" ++ "path" ++ "sort" ++ ++ graphdriver "github.com/containers/storage/drivers" ++ "github.com/containers/storage/pkg/archive" ++ "github.com/containers/storage/pkg/stringid" ++) ++ ++func randomContent(size int, seed int64) []byte { ++ s := rand.NewSource(seed) ++ content := make([]byte, size) ++ ++ for i := 0; i < len(content); i += 7 { ++ val := s.Int63() ++ for j := 0; i+j < len(content) && j < 7; j++ { ++ content[i+j] = byte(val) ++ val >>= 8 ++ } ++ } ++ ++ return content ++} ++ ++func addFiles(drv graphdriver.Driver, layer string, seed int64) error { ++ root, err := drv.Get(layer, graphdriver.MountOpts{}) ++ if err != nil { ++ return err ++ } ++ defer drv.Put(layer) ++ ++ if err := ioutil.WriteFile(path.Join(root, "file-a"), randomContent(64, seed), 0755); err != nil { ++ return err ++ } ++ if err := os.MkdirAll(path.Join(root, "dir-b"), 0755); err != nil { ++ return err ++ } ++ if err := ioutil.WriteFile(path.Join(root, "dir-b", "file-b"), randomContent(128, seed+1), 0755); err != nil { ++ return err ++ } ++ ++ return ioutil.WriteFile(path.Join(root, "file-c"), randomContent(128*128, seed+2), 0755) ++} ++ ++func checkFile(drv graphdriver.Driver, layer, filename string, content []byte) error { ++ root, err := drv.Get(layer, graphdriver.MountOpts{}) ++ if err != nil { ++ return err ++ } ++ defer drv.Put(layer) ++ ++ fileContent, err := ioutil.ReadFile(path.Join(root, filename)) ++ if err != nil { ++ return err ++ } ++ ++ if bytes.Compare(fileContent, content) != 0 { ++ return fmt.Errorf("mismatched file content %v, expecting %v", fileContent, content) ++ } ++ ++ return nil ++} ++ ++func addFile(drv graphdriver.Driver, layer, filename string, content []byte) error { ++ root, err := drv.Get(layer, graphdriver.MountOpts{}) ++ if err != nil { ++ return err ++ } ++ defer drv.Put(layer) ++ ++ return ioutil.WriteFile(path.Join(root, filename), content, 0755) ++} ++ ++func addDirectory(drv graphdriver.Driver, layer, dir string) error { ++ root, err := drv.Get(layer, graphdriver.MountOpts{}) ++ if err != nil { ++ return err ++ } ++ defer drv.Put(layer) ++ ++ return os.MkdirAll(path.Join(root, dir), 0755) ++} ++ ++func removeAll(drv graphdriver.Driver, layer string, names ...string) error { ++ root, err := drv.Get(layer, graphdriver.MountOpts{}) ++ if err != nil { ++ return err ++ } ++ defer drv.Put(layer) ++ ++ for _, filename := range names { ++ if err := os.RemoveAll(path.Join(root, filename)); err != nil { ++ return err ++ } ++ } ++ return nil ++} ++ ++func checkFileRemoved(drv graphdriver.Driver, layer, filename string) error { ++ root, err := drv.Get(layer, graphdriver.MountOpts{}) ++ if err != nil { ++ return err ++ } ++ defer drv.Put(layer) ++ ++ if _, err := os.Stat(path.Join(root, filename)); err == nil { ++ return fmt.Errorf("file still exists: %s", path.Join(root, filename)) ++ } else if !os.IsNotExist(err) { ++ return err ++ } ++ ++ return nil ++} ++ ++func addManyFiles(drv graphdriver.Driver, layer string, count int, seed int64) error { ++ root, err := drv.Get(layer, graphdriver.MountOpts{}) ++ if err != nil { ++ return err ++ } ++ defer drv.Put(layer) ++ ++ for i := 0; i < count; i += 100 { ++ dir := path.Join(root, fmt.Sprintf("directory-%d", i)) ++ if err := os.MkdirAll(dir, 0755); err != nil { ++ return err ++ } ++ for j := 0; i+j < count && j < 100; j++ { ++ file := path.Join(dir, fmt.Sprintf("file-%d", i+j)) ++ if err := ioutil.WriteFile(file, randomContent(64, seed+int64(i+j)), 0755); err != nil { ++ return err ++ } ++ } ++ } ++ ++ return nil ++} ++ ++func changeManyFiles(drv graphdriver.Driver, layer string, count int, seed int64) ([]archive.Change, error) { ++ root, err := drv.Get(layer, graphdriver.MountOpts{}) ++ if err != nil { ++ return nil, err ++ } ++ defer drv.Put(layer) ++ ++ changes := []archive.Change{} ++ for i := 0; i < count; i += 100 { ++ archiveRoot := fmt.Sprintf("/directory-%d", i) ++ if err := os.MkdirAll(path.Join(root, archiveRoot), 0755); err != nil { ++ return nil, err ++ } ++ for j := 0; i+j < count && j < 100; j++ { ++ if j == 0 { ++ changes = append(changes, archive.Change{ ++ Path: archiveRoot, ++ Kind: archive.ChangeModify, ++ }) ++ } ++ var change archive.Change ++ switch j % 3 { ++ // Update file ++ case 0: ++ var originalFileInfo, updatedFileInfo os.FileInfo ++ change.Path = path.Join(archiveRoot, fmt.Sprintf("file-%d", i+j)) ++ change.Kind = archive.ChangeModify ++ if originalFileInfo, err = os.Stat(path.Join(root, change.Path)); err != nil { ++ return nil, err ++ } ++ for updatedFileInfo == nil || updatedFileInfo.ModTime().Equal(originalFileInfo.ModTime()) { ++ if err := ioutil.WriteFile(path.Join(root, change.Path), randomContent(64, seed+int64(i+j)), 0755); err != nil { ++ return nil, err ++ } ++ if updatedFileInfo, err = os.Stat(path.Join(root, change.Path)); err != nil { ++ return nil, err ++ } ++ } ++ // Add file ++ case 1: ++ change.Path = path.Join(archiveRoot, fmt.Sprintf("file-%d-%d", seed, i+j)) ++ change.Kind = archive.ChangeAdd ++ if err := ioutil.WriteFile(path.Join(root, change.Path), randomContent(64, seed+int64(i+j)), 0755); err != nil { ++ return nil, err ++ } ++ // Remove file ++ case 2: ++ change.Path = path.Join(archiveRoot, fmt.Sprintf("file-%d", i+j)) ++ change.Kind = archive.ChangeDelete ++ if err := os.Remove(path.Join(root, change.Path)); err != nil { ++ return nil, err ++ } ++ } ++ changes = append(changes, change) ++ } ++ } ++ ++ return changes, nil ++} ++ ++func checkManyFiles(drv graphdriver.Driver, layer string, count int, seed int64) error { ++ root, err := drv.Get(layer, graphdriver.MountOpts{}) ++ if err != nil { ++ return err ++ } ++ defer drv.Put(layer) ++ ++ for i := 0; i < count; i += 100 { ++ dir := path.Join(root, fmt.Sprintf("directory-%d", i)) ++ for j := 0; i+j < count && j < 100; j++ { ++ file := path.Join(dir, fmt.Sprintf("file-%d", i+j)) ++ fileContent, err := ioutil.ReadFile(file) ++ if err != nil { ++ return err ++ } ++ ++ content := randomContent(64, seed+int64(i+j)) ++ ++ if bytes.Compare(fileContent, content) != 0 { ++ return fmt.Errorf("mismatched file content %v, expecting %v", fileContent, content) ++ } ++ } ++ } ++ ++ return nil ++} ++ ++type changeList []archive.Change ++ ++func (c changeList) Less(i, j int) bool { ++ if c[i].Path == c[j].Path { ++ return c[i].Kind < c[j].Kind ++ } ++ return c[i].Path < c[j].Path ++} ++func (c changeList) Len() int { return len(c) } ++func (c changeList) Swap(i, j int) { c[j], c[i] = c[i], c[j] } ++ ++func checkChanges(expected, actual []archive.Change) error { ++ if len(expected) != len(actual) { ++ return fmt.Errorf("unexpected number of changes, expected %d, got %d", len(expected), len(actual)) ++ } ++ sort.Sort(changeList(expected)) ++ sort.Sort(changeList(actual)) ++ ++ for i := range expected { ++ if expected[i] != actual[i] { ++ return fmt.Errorf("unexpected change, expecting %v, got %v", expected[i], actual[i]) ++ } ++ } ++ ++ return nil ++} ++ ++func addLayerFiles(drv graphdriver.Driver, layer, parent string, i int) error { ++ root, err := drv.Get(layer, graphdriver.MountOpts{}) ++ if err != nil { ++ return err ++ } ++ defer drv.Put(layer) ++ ++ if err := ioutil.WriteFile(path.Join(root, "top-id"), []byte(layer), 0755); err != nil { ++ return err ++ } ++ layerDir := path.Join(root, fmt.Sprintf("layer-%d", i)) ++ if err := os.MkdirAll(layerDir, 0755); err != nil { ++ return err ++ } ++ if err := ioutil.WriteFile(path.Join(layerDir, "layer-id"), []byte(layer), 0755); err != nil { ++ return err ++ } ++ if err := ioutil.WriteFile(path.Join(layerDir, "parent-id"), []byte(parent), 0755); err != nil { ++ return err ++ } ++ ++ return nil ++} ++ ++func addManyLayers(drv graphdriver.Driver, baseLayer string, count int) (string, error) { ++ lastLayer := baseLayer ++ for i := 1; i <= count; i++ { ++ nextLayer := stringid.GenerateRandomID() ++ if err := drv.Create(nextLayer, lastLayer, nil); err != nil { ++ return "", err ++ } ++ if err := addLayerFiles(drv, nextLayer, lastLayer, i); err != nil { ++ return "", err ++ } ++ ++ lastLayer = nextLayer ++ ++ } ++ return lastLayer, nil ++} ++ ++func checkManyLayers(drv graphdriver.Driver, layer string, count int) error { ++ root, err := drv.Get(layer, graphdriver.MountOpts{}) ++ if err != nil { ++ return err ++ } ++ defer drv.Put(layer) ++ ++ layerIDBytes, err := ioutil.ReadFile(path.Join(root, "top-id")) ++ if err != nil { ++ return err ++ } ++ ++ if bytes.Compare(layerIDBytes, []byte(layer)) != 0 { ++ return fmt.Errorf("mismatched file content %v, expecting %v", layerIDBytes, []byte(layer)) ++ } ++ ++ for i := count; i > 0; i-- { ++ layerDir := path.Join(root, fmt.Sprintf("layer-%d", i)) ++ ++ thisLayerIDBytes, err := ioutil.ReadFile(path.Join(layerDir, "layer-id")) ++ if err != nil { ++ return err ++ } ++ if bytes.Compare(thisLayerIDBytes, layerIDBytes) != 0 { ++ return fmt.Errorf("mismatched file content %v, expecting %v", thisLayerIDBytes, layerIDBytes) ++ } ++ layerIDBytes, err = ioutil.ReadFile(path.Join(layerDir, "parent-id")) ++ if err != nil { ++ return err ++ } ++ } ++ return nil ++} ++ ++// readDir reads a directory just like ioutil.ReadDir() ++// then hides specific files (currently "lost+found") ++// so the tests don't "see" it ++func readDir(dir string) ([]os.FileInfo, error) { ++ a, err := ioutil.ReadDir(dir) ++ if err != nil { ++ return nil, err ++ } ++ ++ b := a[:0] ++ for _, x := range a { ++ if x.Name() != "lost+found" { // ext4 always have this dir ++ b = append(b, x) ++ } ++ } ++ ++ return b, nil ++} +diff --git a/vendor/github.com/containers/storage/drivers/graphtest/testutil_unix.go b/vendor/github.com/containers/storage/drivers/graphtest/testutil_unix.go +new file mode 100644 +index 0000000..dd5090a +--- /dev/null ++++ b/vendor/github.com/containers/storage/drivers/graphtest/testutil_unix.go +@@ -0,0 +1,70 @@ ++// +build linux freebsd ++ ++package graphtest ++ ++import ( ++ "io/ioutil" ++ "os" ++ "path" ++ "syscall" ++ "testing" ++ ++ graphdriver "github.com/containers/storage/drivers" ++ "github.com/stretchr/testify/assert" ++ "github.com/stretchr/testify/require" ++ "golang.org/x/sys/unix" ++) ++ ++func verifyFile(t testing.TB, path string, mode os.FileMode, uid, gid uint32) { ++ fi, err := os.Stat(path) ++ require.NoError(t, err) ++ ++ actual := fi.Mode() ++ assert.Equal(t, mode&os.ModeType, actual&os.ModeType, path) ++ assert.Equal(t, mode&os.ModePerm, actual&os.ModePerm, path) ++ assert.Equal(t, mode&os.ModeSticky, actual&os.ModeSticky, path) ++ assert.Equal(t, mode&os.ModeSetuid, actual&os.ModeSetuid, path) ++ assert.Equal(t, mode&os.ModeSetgid, actual&os.ModeSetgid, path) ++ ++ if stat, ok := fi.Sys().(*syscall.Stat_t); ok { ++ assert.Equal(t, uid, stat.Uid, path) ++ assert.Equal(t, gid, stat.Gid, path) ++ } ++} ++ ++func createBase(t testing.TB, driver graphdriver.Driver, name string) { ++ // We need to be able to set any perms ++ oldmask := unix.Umask(0) ++ defer unix.Umask(oldmask) ++ ++ err := driver.CreateReadWrite(name, "", nil) ++ require.NoError(t, err) ++ ++ dir, err := driver.Get(name, graphdriver.MountOpts{}) ++ require.NoError(t, err) ++ defer driver.Put(name) ++ ++ subdir := path.Join(dir, "a subdir") ++ require.NoError(t, os.Mkdir(subdir, 0705|os.ModeSticky)) ++ require.NoError(t, os.Chown(subdir, 1, 2)) ++ ++ file := path.Join(dir, "a file") ++ err = ioutil.WriteFile(file, []byte("Some data"), 0222|os.ModeSetuid) ++ require.NoError(t, err) ++} ++ ++func verifyBase(t testing.TB, driver graphdriver.Driver, name string) { ++ dir, err := driver.Get(name, graphdriver.MountOpts{}) ++ require.NoError(t, err) ++ defer driver.Put(name) ++ ++ subdir := path.Join(dir, "a subdir") ++ verifyFile(t, subdir, 0705|os.ModeDir|os.ModeSticky, 1, 2) ++ ++ file := path.Join(dir, "a file") ++ verifyFile(t, file, 0222|os.ModeSetuid, 0, 0) ++ ++ files, err := readDir(dir) ++ require.NoError(t, err) ++ assert.Len(t, files, 2) ++} +-- +2.19.1 + diff --git a/patch/series-patch.conf b/patch/series-patch.conf index 8011e7b75d127e5de3aa30ad1aa9ec5f71c94ec5..1572ebb29cf2cee1c6c5ee0e1c26c26be550decc 100644 --- a/patch/series-patch.conf +++ b/patch/series-patch.conf @@ -37,3 +37,4 @@ 0037-Change-iSulad-kit-to-iSulad-img.patch 0038-Fix-some-devicemapper-bugs.patch 0039-Fix-wrong-mount-count-and-avoid-failure-when-unmount.patch +0040-Add-unit-test-for-devicemapper.patch