Skip to content

Commit

Permalink
ceph_volume: support overriding bind-mounts
Browse files Browse the repository at this point in the history
This makes it possible to call `podman run` with custom bind-mounts.

cephadm-adopt.yml playbook needs it for a very specific use case:

Closes: https://bugzilla.redhat.com/show_bug.cgi?id=2027411

Signed-off-by: Guillaume Abrioux <gabrioux@redhat.com>
(cherry picked from commit b02d71c)

# Conflicts:
#	library/ceph_volume.py
  • Loading branch information
guits committed Dec 2, 2021
1 parent 9423ec3 commit f2eab35
Show file tree
Hide file tree
Showing 2 changed files with 111 additions and 68 deletions.
45 changes: 34 additions & 11 deletions library/ceph_volume.py
Original file line number Diff line number Diff line change
Expand Up @@ -186,6 +186,7 @@
'''


<<<<<<< HEAD
def fatal(message, module):
'''
Report a fatal error and exit
Expand All @@ -198,23 +199,42 @@ def fatal(message, module):


def container_exec(binary, container_image):
=======
def container_exec(binary, container_image, mounts=None):
>>>>>>> b02d71c30 (ceph_volume: support overriding bind-mounts)
'''
Build the docker CLI to run a command inside a container
'''
_mounts = {}
_mounts['/run/lock/lvm'] = '/run/lock/lvm:z'
_mounts['/var/run/udev'] = '/var/run/udev:z'
_mounts['/dev'] = '/dev'
_mounts['/etc/ceph'] = '/etc/ceph:z'
_mounts['/run/lvm'] = '/run/lvm'
_mounts['/var/lib/ceph'] = '/var/lib/ceph:z'
_mounts['/var/log/ceph'] = '/var/log/ceph:z'
if mounts is None:
mounts = _mounts
else:
_mounts.update(mounts)

volumes = sum(
[['-v', '{}:{}'.format(src_dir, dst_dir)]
for src_dir, dst_dir in _mounts.items()], [])

container_binary = os.getenv('CEPH_CONTAINER_BINARY')
command_exec = [container_binary, 'run',
'--rm', '--privileged', '--net=host', '--ipc=host',
'-v', '/run/lock/lvm:/run/lock/lvm:z',
'-v', '/var/run/udev/:/var/run/udev/:z',
'-v', '/dev:/dev', '-v', '/etc/ceph:/etc/ceph:z',
'-v', '/run/lvm/:/run/lvm/',
'-v', '/var/lib/ceph/:/var/lib/ceph/:z',
'-v', '/var/log/ceph/:/var/log/ceph/:z',
'--entrypoint=' + binary, container_image]
'--rm',
'--privileged',
'--net=host',
'--ipc=host'] + volumes + \
['--entrypoint=' + binary, container_image]
return command_exec


def build_cmd(action, container_image, cluster='ceph', binary='ceph-volume'):
def build_cmd(action, container_image,
cluster='ceph',
binary='ceph-volume', mounts=None):
'''
Build the ceph-volume command
'''
Expand All @@ -223,7 +243,7 @@ def build_cmd(action, container_image, cluster='ceph', binary='ceph-volume'):

if container_image:
cmd = container_exec(
binary, container_image)
binary, container_image, mounts=mounts)
else:
binary = [binary]
cmd = binary
Expand Down Expand Up @@ -434,7 +454,10 @@ def list_osd(module, container_image):

# Build the CLI
action = ['lvm', 'list']
cmd = build_cmd(action, container_image, cluster)
cmd = build_cmd(action,
container_image,
cluster,
mounts={'/var/lib/ceph': '/var/lib/ceph:ro'})
if data:
cmd.append(data)
cmd.append('--format=json')
Expand Down
134 changes: 77 additions & 57 deletions tests/library/test_ceph_volume.py
Original file line number Diff line number Diff line change
Expand Up @@ -17,15 +17,26 @@
print('You need the mock library installed on python2.x to run tests')


container_cmd = ['docker', 'run', '--rm', '--privileged',
'--net=host', '--ipc=host',
'-v', '/run/lock/lvm:/run/lock/lvm:z',
'-v', '/var/run/udev/:/var/run/udev/:z',
'-v', '/dev:/dev', '-v', '/etc/ceph:/etc/ceph:z',
'-v', '/run/lvm/:/run/lvm/',
'-v', '/var/lib/ceph/:/var/lib/ceph/:z',
'-v', '/var/log/ceph/:/var/log/ceph/:z',
'--entrypoint=ceph-volume']
def get_mounts(mounts=None):
volumes = {}
volumes['/run/lock/lvm'] = '/run/lock/lvm:z'
volumes['/var/run/udev'] = '/var/run/udev:z'
volumes['/dev'] = '/dev'
volumes['/etc/ceph'] = '/etc/ceph:z'
volumes['/run/lvm'] = '/run/lvm'
volumes['/var/lib/ceph'] = '/var/lib/ceph:z'
volumes['/var/log/ceph'] = '/var/log/ceph:z'
if mounts is not None:
volumes.update(mounts)

return sum([['-v', '{}:{}'.format(src_dir, dst_dir)] for src_dir, dst_dir in volumes.items()], [])


def get_container_cmd(mounts=None):

return ['docker', 'run', '--rm', '--privileged',
'--net=host', '--ipc=host'] + \
get_mounts(mounts) + ['--entrypoint=ceph-volume']


@mock.patch.dict(os.environ, {'CEPH_CONTAINER_BINARY': 'docker'})
Expand Down Expand Up @@ -66,21 +77,22 @@ def test_wal_with_vg(self):
def test_container_exec(self):
fake_binary = "ceph-volume"
fake_container_image = "quay.ceph.io/ceph-ci/daemon:latest"
expected_command_list = container_cmd + [fake_container_image]
expected_command_list = get_container_cmd() + [fake_container_image]
result = ceph_volume.container_exec(fake_binary, fake_container_image)
assert result == expected_command_list

def test_zap_osd_container(self):
fake_module = MagicMock()
fake_module.params = {'data': '/dev/sda'}
fake_container_image = "quay.ceph.io/ceph-ci/daemon:latest"
expected_command_list = container_cmd + [fake_container_image,
'--cluster',
'ceph',
'lvm',
'zap',
'--destroy',
'/dev/sda']
expected_command_list = get_container_cmd() + \
[fake_container_image,
'--cluster',
'ceph',
'lvm',
'zap',
'--destroy',
'/dev/sda']
result = ceph_volume.zap_devices(fake_module, fake_container_image)
assert result == expected_command_list

Expand Down Expand Up @@ -156,13 +168,17 @@ def test_list_osd_container(self):
fake_module = MagicMock()
fake_module.params = {'cluster': 'ceph', 'data': '/dev/sda'}
fake_container_image = "quay.ceph.io/ceph-ci/daemon:latest"
expected_command_list = container_cmd + [fake_container_image,
'--cluster',
'ceph',
'lvm',
'list',
'/dev/sda',
'--format=json']
expected_command_list = get_container_cmd(
{
'/var/lib/ceph': '/var/lib/ceph:ro'
}) + \
[fake_container_image,
'--cluster',
'ceph',
'lvm',
'list',
'/dev/sda',
'--format=json']
result = ceph_volume.list_osd(fake_module, fake_container_image)
assert result == expected_command_list

Expand All @@ -181,11 +197,12 @@ def test_list_storage_inventory(self):
def test_list_storage_inventory_container(self):
fake_module = MagicMock()
fake_container_image = "quay.ceph.io/ceph-ci/daemon:latest"
expected_command_list = container_cmd + [fake_container_image,
'--cluster',
'ceph',
'inventory',
'--format=json']
expected_command_list = get_container_cmd() + \
[fake_container_image,
'--cluster',
'ceph',
'inventory',
'--format=json']
result = ceph_volume.list_storage_inventory(fake_module, fake_container_image)
assert result == expected_command_list

Expand All @@ -198,14 +215,15 @@ def test_create_osd_container(self, objectstore):

fake_action = "create"
fake_container_image = "quay.ceph.io/ceph-ci/daemon:latest"
expected_command_list = container_cmd + [fake_container_image,
'--cluster',
'ceph',
'lvm',
'create',
'--%s' % objectstore,
'--data',
'/dev/sda']
expected_command_list = get_container_cmd() + \
[fake_container_image,
'--cluster',
'ceph',
'lvm',
'create',
'--%s' % objectstore,
'--data',
'/dev/sda']
result = ceph_volume.prepare_or_create_osd(
fake_module, fake_action, fake_container_image)
assert result == expected_command_list
Expand Down Expand Up @@ -240,14 +258,15 @@ def test_prepare_osd_container(self, objectstore):

fake_action = "prepare"
fake_container_image = "quay.ceph.io/ceph-ci/daemon:latest"
expected_command_list = container_cmd + [fake_container_image,
'--cluster',
'ceph',
'lvm',
'prepare',
'--%s' % objectstore,
'--data',
'/dev/sda']
expected_command_list = get_container_cmd() + \
[fake_container_image,
'--cluster',
'ceph',
'lvm',
'prepare',
'--%s' % objectstore,
'--data',
'/dev/sda']
result = ceph_volume.prepare_or_create_osd(
fake_module, fake_action, fake_container_image)
assert result == expected_command_list
Expand Down Expand Up @@ -284,18 +303,19 @@ def test_batch_osd_container(self, objectstore):
'batch_devices': ["/dev/sda", "/dev/sdb"]}

fake_container_image = "quay.ceph.io/ceph-ci/daemon:latest"
expected_command_list = container_cmd + [fake_container_image,
'--cluster',
'ceph',
'lvm',
'batch',
'--%s' % objectstore,
'--yes',
'--prepare',
'--journal-size' if objectstore == 'filestore' else '--block-db-size', # noqa E501
'4096',
'/dev/sda',
'/dev/sdb']
expected_command_list = get_container_cmd() + \
[fake_container_image,
'--cluster',
'ceph',
'lvm',
'batch',
'--%s' % objectstore,
'--yes',
'--prepare',
'--journal-size' if objectstore == 'filestore' else '--block-db-size', # noqa E501
'4096',
'/dev/sda',
'/dev/sdb']
result = ceph_volume.batch(
fake_module, fake_container_image)
assert result == expected_command_list
Expand Down

0 comments on commit f2eab35

Please sign in to comment.