parent
37310e5455
commit
eeb8879f73
|
@ -891,33 +891,6 @@ def delete_profile(name):
|
||||||
close_database(conn, cur)
|
close_database(conn, cur)
|
||||||
return retmsg, retcode
|
return retmsg, retcode
|
||||||
|
|
||||||
#
|
|
||||||
# VM provisioning helper functions
|
|
||||||
#
|
|
||||||
def run_os_command(command_string, background=False, environment=None, timeout=None):
|
|
||||||
command = shlex.split(command_string)
|
|
||||||
try:
|
|
||||||
command_output = subprocess.run(
|
|
||||||
command,
|
|
||||||
env=environment,
|
|
||||||
timeout=timeout,
|
|
||||||
stdout=subprocess.PIPE,
|
|
||||||
stderr=subprocess.PIPE,
|
|
||||||
)
|
|
||||||
retcode = command_output.returncode
|
|
||||||
except subprocess.TimeoutExpired:
|
|
||||||
retcode = 128
|
|
||||||
|
|
||||||
try:
|
|
||||||
stdout = command_output.stdout.decode('ascii')
|
|
||||||
except:
|
|
||||||
stdout = ''
|
|
||||||
try:
|
|
||||||
stderr = command_output.stderr.decode('ascii')
|
|
||||||
except:
|
|
||||||
stderr = ''
|
|
||||||
return retcode, stdout, stderr
|
|
||||||
|
|
||||||
#
|
#
|
||||||
# Cloned VM provisioning function - executed by the Celery worker
|
# Cloned VM provisioning function - executed by the Celery worker
|
||||||
#
|
#
|
||||||
|
@ -1103,11 +1076,11 @@ def create_vm(self, vm_name, vm_profile, define_vm=True, start_vm=True):
|
||||||
|
|
||||||
for filesystem in used_filesystems:
|
for filesystem in used_filesystems:
|
||||||
if filesystem == 'swap':
|
if filesystem == 'swap':
|
||||||
retcode, stdout, stderr = run_os_command("which mkswap")
|
retcode, stdout, stderr = pvc_common.run_os_command("which mkswap")
|
||||||
if retcode:
|
if retcode:
|
||||||
raise ProvisioningError("Failed to find binary for mkswap: {}".format(filesystem, stderr))
|
raise ProvisioningError("Failed to find binary for mkswap: {}".format(filesystem, stderr))
|
||||||
else:
|
else:
|
||||||
retcode, stdout, stderr = run_os_command("which mkfs.{}".format(filesystem))
|
retcode, stdout, stderr = pvc_common.run_os_command("which mkfs.{}".format(filesystem))
|
||||||
if retcode:
|
if retcode:
|
||||||
raise ProvisioningError("Failed to find binary for mkfs.{}: {}".format(filesystem, stderr))
|
raise ProvisioningError("Failed to find binary for mkfs.{}: {}".format(filesystem, stderr))
|
||||||
|
|
||||||
|
@ -1121,7 +1094,7 @@ def create_vm(self, vm_name, vm_profile, define_vm=True, start_vm=True):
|
||||||
|
|
||||||
if is_script_install:
|
if is_script_install:
|
||||||
# Write the script out to a temporary file
|
# Write the script out to a temporary file
|
||||||
retcode, stdout, stderr = run_os_command("mktemp")
|
retcode, stdout, stderr = pvc_common.run_os_command("mktemp")
|
||||||
if retcode:
|
if retcode:
|
||||||
raise ProvisioningError("Failed to create a temporary file: {}".format(stderr))
|
raise ProvisioningError("Failed to create a temporary file: {}".format(stderr))
|
||||||
script_file = stdout.strip()
|
script_file = stdout.strip()
|
||||||
|
@ -1152,7 +1125,7 @@ def create_vm(self, vm_name, vm_profile, define_vm=True, start_vm=True):
|
||||||
vm_uuid = uuid.uuid4()
|
vm_uuid = uuid.uuid4()
|
||||||
vm_description = "PVC provisioner @ {}, profile '{}'".format(datetime.datetime.now(), vm_profile)
|
vm_description = "PVC provisioner @ {}, profile '{}'".format(datetime.datetime.now(), vm_profile)
|
||||||
|
|
||||||
retcode, stdout, stderr = run_os_command("uname -m")
|
retcode, stdout, stderr = pvc_common.run_os_command("uname -m")
|
||||||
system_architecture = stdout.strip()
|
system_architecture = stdout.strip()
|
||||||
|
|
||||||
# Begin assembling libvirt schema
|
# Begin assembling libvirt schema
|
||||||
|
@ -1322,17 +1295,17 @@ def create_vm(self, vm_name, vm_profile, define_vm=True, start_vm=True):
|
||||||
filesystem_args = ' '.join(filesystem_args_list)
|
filesystem_args = ' '.join(filesystem_args_list)
|
||||||
|
|
||||||
# Map the RBD device
|
# Map the RBD device
|
||||||
retcode, stdout, stderr = run_os_command("rbd map {}".format(rbd_volume))
|
retcode, stdout, stderr = pvc_common.run_os_command("rbd map {}".format(rbd_volume))
|
||||||
if retcode:
|
if retcode:
|
||||||
raise ProvisioningError('Failed to map volume "{}": {}'.format(rbd_volume, stderr))
|
raise ProvisioningError('Failed to map volume "{}": {}'.format(rbd_volume, stderr))
|
||||||
|
|
||||||
# Create the filesystem
|
# Create the filesystem
|
||||||
if volume['filesystem'] == 'swap':
|
if volume['filesystem'] == 'swap':
|
||||||
retcode, stdout, stderr = run_os_command("mkswap -f /dev/rbd/{}".format(rbd_volume))
|
retcode, stdout, stderr = pvc_common.run_os_command("mkswap -f /dev/rbd/{}".format(rbd_volume))
|
||||||
if retcode:
|
if retcode:
|
||||||
raise ProvisioningError('Failed to create swap on "{}": {}'.format(rbd_volume, stderr))
|
raise ProvisioningError('Failed to create swap on "{}": {}'.format(rbd_volume, stderr))
|
||||||
else:
|
else:
|
||||||
retcode, stdout, stderr = run_os_command("mkfs.{} {} /dev/rbd/{}".format(volume['filesystem'], filesystem_args, rbd_volume))
|
retcode, stdout, stderr = pvc_common.run_os_command("mkfs.{} {} /dev/rbd/{}".format(volume['filesystem'], filesystem_args, rbd_volume))
|
||||||
if retcode:
|
if retcode:
|
||||||
raise ProvisioningError('Failed to create {} filesystem on "{}": {}'.format(volume['filesystem'], rbd_volume, stderr))
|
raise ProvisioningError('Failed to create {} filesystem on "{}": {}'.format(volume['filesystem'], rbd_volume, stderr))
|
||||||
|
|
||||||
|
@ -1340,7 +1313,7 @@ def create_vm(self, vm_name, vm_profile, define_vm=True, start_vm=True):
|
||||||
|
|
||||||
if is_script_install:
|
if is_script_install:
|
||||||
# Create temporary directory
|
# Create temporary directory
|
||||||
retcode, stdout, stderr = run_os_command("mktemp -d")
|
retcode, stdout, stderr = pvc_common.run_os_command("mktemp -d")
|
||||||
if retcode:
|
if retcode:
|
||||||
raise ProvisioningError("Failed to create a temporary directory: {}".format(stderr))
|
raise ProvisioningError("Failed to create a temporary directory: {}".format(stderr))
|
||||||
temp_dir = stdout.strip()
|
temp_dir = stdout.strip()
|
||||||
|
@ -1356,12 +1329,12 @@ def create_vm(self, vm_name, vm_profile, define_vm=True, start_vm=True):
|
||||||
mount_path = "{}{}".format(temp_dir, volume['mountpoint'])
|
mount_path = "{}{}".format(temp_dir, volume['mountpoint'])
|
||||||
|
|
||||||
# Ensure the mount path exists (within the filesystems)
|
# Ensure the mount path exists (within the filesystems)
|
||||||
retcode, stdout, stderr = run_os_command("mkdir -p {}".format(mount_path))
|
retcode, stdout, stderr = pvc_common.run_os_command("mkdir -p {}".format(mount_path))
|
||||||
if retcode:
|
if retcode:
|
||||||
raise ProvisioningError('Failed to create mountpoint "{}": {}'.format(mount_path, stderr))
|
raise ProvisioningError('Failed to create mountpoint "{}": {}'.format(mount_path, stderr))
|
||||||
|
|
||||||
# Mount filesystems to temporary directory
|
# Mount filesystems to temporary directory
|
||||||
retcode, stdout, stderr = run_os_command("mount {} {}".format(mapped_rbd_volume, mount_path))
|
retcode, stdout, stderr = pvc_common.run_os_command("mount {} {}".format(mapped_rbd_volume, mount_path))
|
||||||
if retcode:
|
if retcode:
|
||||||
raise ProvisioningError('Failed to mount "{}" on "{}": {}'.format(mapped_rbd_volume, mount_path, stderr))
|
raise ProvisioningError('Failed to mount "{}" on "{}": {}'.format(mapped_rbd_volume, mount_path, stderr))
|
||||||
|
|
||||||
|
@ -1410,7 +1383,7 @@ def create_vm(self, vm_name, vm_profile, define_vm=True, start_vm=True):
|
||||||
print("Cleaning up mount {}{}".format(temp_dir, volume['mountpoint']))
|
print("Cleaning up mount {}{}".format(temp_dir, volume['mountpoint']))
|
||||||
|
|
||||||
mount_path = "{}{}".format(temp_dir, volume['mountpoint'])
|
mount_path = "{}{}".format(temp_dir, volume['mountpoint'])
|
||||||
retcode, stdout, stderr = run_os_command("umount {}".format(mount_path))
|
retcode, stdout, stderr = pvc_common.run_os_command("umount {}".format(mount_path))
|
||||||
if retcode:
|
if retcode:
|
||||||
raise ProvisioningError('Failed to unmount "{}": {}'.format(mount_path, stderr))
|
raise ProvisioningError('Failed to unmount "{}": {}'.format(mount_path, stderr))
|
||||||
|
|
||||||
|
@ -1419,7 +1392,7 @@ def create_vm(self, vm_name, vm_profile, define_vm=True, start_vm=True):
|
||||||
print("Cleaning up RBD mapping /dev/rbd/{}/{}_{}".format(volume['pool'], vm_name, volume['disk_id']))
|
print("Cleaning up RBD mapping /dev/rbd/{}/{}_{}".format(volume['pool'], vm_name, volume['disk_id']))
|
||||||
|
|
||||||
rbd_volume = "/dev/rbd/{}/{}_{}".format(volume['pool'], vm_name, volume['disk_id'])
|
rbd_volume = "/dev/rbd/{}/{}_{}".format(volume['pool'], vm_name, volume['disk_id'])
|
||||||
retcode, stdout, stderr = run_os_command("rbd unmap {}".format(rbd_volume))
|
retcode, stdout, stderr = pvc_common.run_os_command("rbd unmap {}".format(rbd_volume))
|
||||||
if retcode:
|
if retcode:
|
||||||
raise ProvisioningError('Failed to unmap volume "{}": {}'.format(rbd_volume, stderr))
|
raise ProvisioningError('Failed to unmap volume "{}": {}'.format(rbd_volume, stderr))
|
||||||
|
|
||||||
|
@ -1427,12 +1400,12 @@ def create_vm(self, vm_name, vm_profile, define_vm=True, start_vm=True):
|
||||||
|
|
||||||
if is_script_install:
|
if is_script_install:
|
||||||
# Remove temporary mount directory (don't fail if not removed)
|
# Remove temporary mount directory (don't fail if not removed)
|
||||||
retcode, stdout, stderr = run_os_command("rmdir {}".format(temp_dir))
|
retcode, stdout, stderr = pvc_common.run_os_command("rmdir {}".format(temp_dir))
|
||||||
if retcode:
|
if retcode:
|
||||||
print('Failed to delete temporary directory "{}": {}'.format(temp_dir, stderr))
|
print('Failed to delete temporary directory "{}": {}'.format(temp_dir, stderr))
|
||||||
|
|
||||||
# Remote temporary script (don't fail if not removed)
|
# Remote temporary script (don't fail if not removed)
|
||||||
retcode, stdout, stderr = run_os_command("rm -f {}".format(script_file))
|
retcode, stdout, stderr = pvc_common.run_os_command("rm -f {}".format(script_file))
|
||||||
if retcode:
|
if retcode:
|
||||||
print('Failed to delete temporary script file "{}": {}'.format(script_file, stderr))
|
print('Failed to delete temporary script file "{}": {}'.format(script_file, stderr))
|
||||||
|
|
||||||
|
|
|
@ -33,6 +33,33 @@ import daemon_lib.zkhandler as zkhandler
|
||||||
# Supplemental functions
|
# Supplemental functions
|
||||||
###############################################################################
|
###############################################################################
|
||||||
|
|
||||||
|
#
|
||||||
|
# Run a local OS command via shell
|
||||||
|
#
|
||||||
|
def run_os_command(command_string, background=False, environment=None, timeout=None):
|
||||||
|
command = shlex.split(command_string)
|
||||||
|
try:
|
||||||
|
command_output = subprocess.run(
|
||||||
|
command,
|
||||||
|
env=environment,
|
||||||
|
timeout=timeout,
|
||||||
|
stdout=subprocess.PIPE,
|
||||||
|
stderr=subprocess.PIPE,
|
||||||
|
)
|
||||||
|
retcode = command_output.returncode
|
||||||
|
except subprocess.TimeoutExpired:
|
||||||
|
retcode = 128
|
||||||
|
|
||||||
|
try:
|
||||||
|
stdout = command_output.stdout.decode('ascii')
|
||||||
|
except:
|
||||||
|
stdout = ''
|
||||||
|
try:
|
||||||
|
stderr = command_output.stderr.decode('ascii')
|
||||||
|
except:
|
||||||
|
stderr = ''
|
||||||
|
return retcode, stdout, stderr
|
||||||
|
|
||||||
#
|
#
|
||||||
# Validate a UUID
|
# Validate a UUID
|
||||||
#
|
#
|
||||||
|
|
Loading…
Reference in New Issue