mirror of https://github.com/ceph/ceph-ansible.git
114 lines
2.6 KiB
Python
114 lines
2.6 KiB
Python
import os
|
|
import datetime
|
|
|
|
|
|
def generate_ceph_cmd(sub_cmd, args, user_key=None, cluster='ceph', user='client.admin', container_image=None, interactive=False):
|
|
'''
|
|
Generate 'ceph' command line to execute
|
|
'''
|
|
|
|
if not user_key:
|
|
user_key = '/etc/ceph/{}.{}.keyring'.format(cluster, user)
|
|
|
|
cmd = pre_generate_ceph_cmd(container_image=container_image, interactive=interactive)
|
|
|
|
base_cmd = [
|
|
'-n',
|
|
user,
|
|
'-k',
|
|
user_key,
|
|
'--cluster',
|
|
cluster
|
|
]
|
|
base_cmd.extend(sub_cmd)
|
|
cmd.extend(base_cmd + args)
|
|
|
|
return cmd
|
|
|
|
|
|
def container_exec(binary, container_image, interactive=False):
|
|
'''
|
|
Build the docker CLI to run a command inside a container
|
|
'''
|
|
|
|
container_binary = os.getenv('CEPH_CONTAINER_BINARY')
|
|
command_exec = [container_binary, 'run']
|
|
|
|
if interactive:
|
|
command_exec.extend(['--interactive'])
|
|
|
|
command_exec.extend(['--rm',
|
|
'--net=host',
|
|
'-v', '/etc/ceph:/etc/ceph:z',
|
|
'-v', '/var/lib/ceph/:/var/lib/ceph/:z',
|
|
'-v', '/var/log/ceph/:/var/log/ceph/:z',
|
|
'--entrypoint=' + binary, container_image])
|
|
return command_exec
|
|
|
|
|
|
def is_containerized():
|
|
'''
|
|
Check if we are running on a containerized cluster
|
|
'''
|
|
|
|
if 'CEPH_CONTAINER_IMAGE' in os.environ:
|
|
container_image = os.getenv('CEPH_CONTAINER_IMAGE')
|
|
else:
|
|
container_image = None
|
|
|
|
return container_image
|
|
|
|
|
|
def pre_generate_ceph_cmd(container_image=None, interactive=False):
|
|
'''
|
|
Generate ceph prefix comaand
|
|
'''
|
|
if container_image:
|
|
cmd = container_exec('ceph', container_image, interactive=interactive)
|
|
else:
|
|
cmd = ['ceph']
|
|
|
|
return cmd
|
|
|
|
|
|
def exec_command(module, cmd, stdin=None):
|
|
'''
|
|
Execute command(s)
|
|
'''
|
|
|
|
binary_data = False
|
|
if stdin:
|
|
binary_data = True
|
|
rc, out, err = module.run_command(cmd, data=stdin, binary_data=binary_data)
|
|
|
|
return rc, cmd, out, err
|
|
|
|
|
|
def exit_module(module, out, rc, cmd, err, startd, changed=False, diff=dict(before="", after="")):
|
|
endd = datetime.datetime.now()
|
|
delta = endd - startd
|
|
|
|
result = dict(
|
|
cmd=cmd,
|
|
start=str(startd),
|
|
end=str(endd),
|
|
delta=str(delta),
|
|
rc=rc,
|
|
stdout=out.rstrip("\r\n"),
|
|
stderr=err.rstrip("\r\n"),
|
|
changed=changed,
|
|
diff=diff
|
|
)
|
|
module.exit_json(**result)
|
|
|
|
|
|
def fatal(message, module):
|
|
'''
|
|
Report a fatal error and exit
|
|
'''
|
|
|
|
if module:
|
|
module.fail_json(msg=message, rc=1)
|
|
else:
|
|
raise(Exception(message))
|