diff options
Diffstat (limited to 'morphlib/exts/kvm.check')
-rwxr-xr-x | morphlib/exts/kvm.check | 47 |
1 files changed, 47 insertions, 0 deletions
diff --git a/morphlib/exts/kvm.check b/morphlib/exts/kvm.check index be7c51c2..957d0893 100755 --- a/morphlib/exts/kvm.check +++ b/morphlib/exts/kvm.check @@ -17,11 +17,16 @@ '''Preparatory checks for Morph 'kvm' write extension''' import cliapp +import re +import urlparse import morphlib.writeexts class KvmPlusSshCheckExtension(morphlib.writeexts.WriteExtension): + + location_pattern = '^/(?P<guest>[^/]+)(?P<path>/.+)$' + def process_args(self, args): if len(args) != 1: raise cliapp.AppException('Wrong number of command line args') @@ -32,4 +37,46 @@ class KvmPlusSshCheckExtension(morphlib.writeexts.WriteExtension): 'Use the `ssh-rsync` write extension to deploy upgrades to an ' 'existing remote system.') + location = args[0] + ssh_host, vm_name, vm_path = self.check_and_parse_location(location) + + self.check_ssh_connectivity(ssh_host) + self.check_no_existing_libvirt_vm(ssh_host, vm_name) + self.check_extra_disks_exist(ssh_host, self.parse_attach_disks()) + + def check_and_parse_location(self, location): + '''Check and parse the location argument to get relevant data.''' + + x = urlparse.urlparse(location) + + if x.scheme != 'kvm+ssh': + raise cliapp.AppException( + 'URL schema must be kvm+ssh in %s' % location) + + m = re.match(self.location_pattern, x.path) + if not m: + raise cliapp.AppException('Cannot parse location %s' % location) + + return x.netloc, m.group('guest'), m.group('path') + + def check_no_existing_libvirt_vm(self, ssh_host, vm_name): + try: + cliapp.ssh_runcmd(ssh_host, + ['virsh', '--connect', 'qemu:///system', 'domstate', vm_name]) + except cliapp.AppException as e: + pass + else: + raise cliapp.AppException( + 'Host %s already has a VM named %s. You can use the ssh-rsync ' + 'write extension to deploy upgrades to existing machines.' % + (ssh_host, vm_name)) + + def check_extra_disks_exist(self, ssh_host, filename_list): + for filename in filename_list: + try: + cliapp.ssh_runcmd(ssh_host, ['ls', filename]) + except cliapp.AppException as e: + raise cliapp.AppException('Did not find file %s on host %s' % + (filename, ssh_host)) + KvmPlusSshCheckExtension().run() |