From c0ecac7662235a66adca1c483f1a170c8a479bd0 Mon Sep 17 00:00:00 2001 From: Sam Thursfield Date: Fri, 11 Apr 2014 12:29:32 +0000 Subject: deploy: Check SSH connection for KVM deployment before starting Slight duplication is necessary, but it's only a few lines. We could move the duplicated code into the base class in 'morphlib.writeexts' if there was more duplication. --- morphlib/exts/kvm.check | 29 +++++++++++++++++++++++++++++ morphlib/exts/kvm.write | 9 +++------ 2 files changed, 32 insertions(+), 6 deletions(-) (limited to 'morphlib') diff --git a/morphlib/exts/kvm.check b/morphlib/exts/kvm.check index be7c51c2..04c25069 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[^/]+)(?P/.+)$' + def process_args(self, args): if len(args) != 1: raise cliapp.AppException('Wrong number of command line args') @@ -32,4 +37,28 @@ 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) + + try: + cliapp.ssh_runcmd(ssh_host, ['true']) + except cliapp.AppException: + raise cliapp.AppException('Unable to SSH to %s' % ssh_host) + + 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') + + KvmPlusSshCheckExtension().run() diff --git a/morphlib/exts/kvm.write b/morphlib/exts/kvm.write index 94560972..94a55daa 100755 --- a/morphlib/exts/kvm.write +++ b/morphlib/exts/kvm.write @@ -50,6 +50,8 @@ class KvmPlusSshWriteExtension(morphlib.writeexts.WriteExtension): ''' + location_pattern = '^/(?P[^/]+)(?P/.+)$' + def process_args(self, args): if len(args) != 2: raise cliapp.AppException('Wrong number of command line args') @@ -79,14 +81,9 @@ class KvmPlusSshWriteExtension(morphlib.writeexts.WriteExtension): def parse_location(self, location): '''Parse the location argument to get relevant data.''' - + x = urlparse.urlparse(location) - if x.scheme != 'kvm+ssh': - raise cliapp.AppException( - 'URL schema must be vbox+ssh in %s' % location) m = re.match('^/(?P[^/]+)(?P/.+)$', x.path) - if not m: - raise cliapp.AppException('Cannot parse location %s' % location) return x.netloc, m.group('guest'), m.group('path') def transfer(self, raw_disk, ssh_host, vm_path): -- cgit v1.2.1