From 5eeaa95440aa01c6be2c58c7959e70dbed7bfb69 Mon Sep 17 00:00:00 2001 From: Christian Schwede <cschwede@redhat.com> Date: Fri, 19 May 2017 12:09:02 +0200 Subject: [PATCH] Make mount_check option usable in containerized environments The ismount_raw method does not work inside containers if disks are mounted on the hostsystem and only mountpoints are exposed inside the containers. In this case the inode and device checks fail, making this option unusable. Mounting devices into the containers would solve this. However, this would require that all processes that require access to a device are running inside the same container, which counteracts the container concept. This patch adds the possiblity to place stubfiles named ".ismount" into the root directory of any device, and Swift assumes a given device to be mounted if that file exists. This should be transparent to existing clusters. Change-Id: I9d9fc0a4447a8c5dd39ca60b274c119af6b4c28f --- swift/common/utils.py | 6 ++++++ test/unit/common/test_utils.py | 10 ++++++++++ 2 files changed, 16 insertions(+) diff --git a/swift/common/utils.py b/swift/common/utils.py index 5c50e198f1..4ed6e64967 100644 --- a/swift/common/utils.py +++ b/swift/common/utils.py @@ -3583,6 +3583,12 @@ def ismount_raw(path): # path/.. is the same i-node as path return True + # Device and inode checks are not properly working inside containerized + # environments, therefore using a workaround to check if there is a + # stubfile placed by an operator + if os.path.isfile(os.path.join(path, ".ismount")): + return True + return False diff --git a/test/unit/common/test_utils.py b/test/unit/common/test_utils.py index 25926f2ed1..aaf2e1f83a 100644 --- a/test/unit/common/test_utils.py +++ b/test/unit/common/test_utils.py @@ -3300,6 +3300,16 @@ cluster_dfw1 = http://dfw1.host/v1/ finally: shutil.rmtree(tmpdir) + def test_ismount_successes_stubfile(self): + tmpdir = mkdtemp() + fname = os.path.join(tmpdir, ".ismount") + try: + with open(fname, "w") as stubfile: + stubfile.write("") + self.assertTrue(utils.ismount(tmpdir)) + finally: + shutil.rmtree(tmpdir) + def test_parse_content_type(self): self.assertEqual(utils.parse_content_type('text/plain'), ('text/plain', []))