summaryrefslogtreecommitdiff
path: root/morphlib
diff options
context:
space:
mode:
authorSam Thursfield <sam.thursfield@codethink.co.uk>2014-04-11 12:29:32 +0000
committerSam Thursfield <sam.thursfield@codethink.co.uk>2014-04-14 14:11:58 +0000
commitc0ecac7662235a66adca1c483f1a170c8a479bd0 (patch)
tree12941e0767dedfcf9d5b8f08d88fd9e34d7f6490 /morphlib
parent78b46a60a5d482f0c302c83b200157cdb25730ca (diff)
downloadmorph-c0ecac7662235a66adca1c483f1a170c8a479bd0.tar.gz
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.
Diffstat (limited to 'morphlib')
-rwxr-xr-xmorphlib/exts/kvm.check29
-rwxr-xr-xmorphlib/exts/kvm.write9
2 files changed, 32 insertions, 6 deletions
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<guest>[^/]+)(?P<path>/.+)$'
+
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<guest>[^/]+)(?P<path>/.+)$'
+
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<guest>[^/]+)(?P<path>/.+)$', 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):