Skip to content

Commit

Permalink
Merge pull request #30236 from smithfarm/wip-40853-mimic
Browse files Browse the repository at this point in the history
mimic: cephfs: test_volume_client: fix test_put_object_versioned()

Reviewed-by: Rishabh Dave <ridave@redhat.com>
Reviewed-by: Venky Shankar <vshankar@redhat.com>
  • Loading branch information
yuriw committed Oct 10, 2019
2 parents 074d3b0 + 90ed59c commit 5bcdd91
Showing 1 changed file with 53 additions and 33 deletions.
86 changes: 53 additions & 33 deletions qa/tasks/cephfs/test_volume_client.py
Expand Up @@ -6,6 +6,7 @@
from tasks.cephfs.cephfs_test_case import CephFSTestCase
from tasks.cephfs.fuse_mount import FuseMount
from teuthology.exceptions import CommandFailedError
from teuthology.misc import sudo_write_file

log = logging.getLogger(__name__)

Expand All @@ -14,7 +15,7 @@ class TestVolumeClient(CephFSTestCase):
# One for looking at the global filesystem, one for being
# the VolumeClient, two for mounting the created shares
CLIENTS_REQUIRED = 4
py_version = 'python'
default_py_version = 'python3'

def setUp(self):
CephFSTestCase.setUp(self)
Expand All @@ -33,6 +34,8 @@ def _volume_client_python(self, client, script, vol_prefix=None, ns_prefix=None)
return client.run_python("""
from __future__ import print_function
from ceph_volume_client import CephFSVolumeClient, VolumePath
from sys import version_info as sys_version_info
from rados import OSError as rados_OSError
import logging
log = logging.getLogger("ceph_volume_client")
log.addHandler(logging.StreamHandler())
Expand All @@ -45,27 +48,6 @@ def _volume_client_python(self, client, script, vol_prefix=None, ns_prefix=None)
vol_prefix=vol_prefix, ns_prefix=ns_prefix),
self.py_version)

def _sudo_write_file(self, remote, path, data):
"""
Write data to a remote file as super user
:param remote: Remote site.
:param path: Path on the remote being written to.
:param data: Data to be written.
Both perms and owner are passed directly to chmod.
"""
remote.run(
args=[
'sudo',
'python',
'-c',
'import shutil, sys; shutil.copyfileobj(sys.stdin, file(sys.argv[1], "wb"))',
path,
],
stdin=data,
)

def _configure_vc_auth(self, mount, id_name):
"""
Set up auth credentials for the VolumeClient user
Expand All @@ -77,7 +59,7 @@ def _configure_vc_auth(self, mount, id_name):
"mon", "allow *"
)
mount.client_id = id_name
self._sudo_write_file(mount.client_remote, mount.get_keyring_path(), out)
sudo_write_file(mount.client_remote, mount.get_keyring_path(), out)
self.set_conf("client.{name}".format(name=id_name), "keyring", mount.get_keyring_path())

def _configure_guest_auth(self, volumeclient_mount, guest_mount,
Expand Down Expand Up @@ -140,9 +122,8 @@ def _configure_guest_auth(self, volumeclient_mount, guest_mount,
key=key
))
guest_mount.client_id = guest_entity
self._sudo_write_file(guest_mount.client_remote,
guest_mount.get_keyring_path(),
keyring_txt)
sudo_write_file(guest_mount.client_remote,
guest_mount.get_keyring_path(), keyring_txt)

# Add a guest client section to the ceph config file.
self.set_conf("client.{0}".format(guest_entity), "client quota", "True")
Expand Down Expand Up @@ -990,21 +971,60 @@ def test_put_object_versioned(self):
vc_mount.umount_wait()
self._configure_vc_auth(vc_mount, "manila")

obj_data = 'test_data'
obj_name = 'test_vc_obj'
pool_name = self.fs.get_data_pool_names()[0]
self.fs.rados(['put', obj_name, '-'], pool=pool_name, stdin_data=obj_data)

self._volume_client_python(vc_mount, dedent("""
data, version_before = vc.get_object_and_version("{pool_name}", "{obj_name}")
if sys_version_info.major < 3:
data = data + 'modification1'
elif sys_version_info.major > 3:
data = str.encode(data.decode() + 'modification1')
vc.put_object_versioned("{pool_name}", "{obj_name}", data, version_before)
data, version_after = vc.get_object_and_version("{pool_name}", "{obj_name}")
assert version_after == version_before + 1
""").format(pool_name=pool_name, obj_name=obj_name))

def test_version_check_for_put_object_versioned(self):
vc_mount = self.mounts[1]
vc_mount.umount_wait()
self._configure_vc_auth(vc_mount, "manila")

obj_data = 'test_data'
obj_name = 'test_vc_ob_2'
pool_name = self.fs.get_data_pool_names()[0]
self.fs.rados(['put', obj_name, '-'], pool=pool_name, stdin_data=obj_data)

# Test if put_object_versioned() crosschecks the version of the
# given object. Being a negative test, an exception is expected.
with self.assertRaises(CommandFailedError):
self._volume_client_python(vc_mount, dedent("""
data, version = vc.get_object_and_version("{pool_name}", "{obj_name}")
data += 'm1'
vc.put_object("{pool_name}", "{obj_name}", data)
data += 'm2'
expected_exception = 'rados_OSError'
output = self._volume_client_python(vc_mount, dedent("""
data, version = vc.get_object_and_version("{pool_name}", "{obj_name}")
if sys_version_info.major < 3:
data = data + 'm1'
elif sys_version_info.major > 3:
data = str.encode(data.decode('utf-8') + 'm1')
vc.put_object("{pool_name}", "{obj_name}", data)
if sys_version_info.major < 3:
data = data + 'm2'
elif sys_version_info.major > 3:
data = str.encode(data.decode('utf-8') + 'm2')
try:
vc.put_object_versioned("{pool_name}", "{obj_name}", data, version)
""").format(pool_name=pool_name, obj_name=obj_name))
except {expected_exception}:
print('{expected_exception} raised')
""").format(pool_name=pool_name, obj_name=obj_name,
expected_exception=expected_exception))
self.assertEqual(expected_exception + ' raised', output)


def test_delete_object(self):
vc_mount = self.mounts[1]
Expand Down

0 comments on commit 5bcdd91

Please sign in to comment.