aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorbozo.kopic <bozo.kopic@gmail.com>2017-07-03 15:40:16 +0200
committerbozo.kopic <bozo.kopic@gmail.com>2017-07-03 15:40:16 +0200
commitfe888f22a7183740dd2381b8d5d08c0fb1fcf3b7 (patch)
tree988986a549dc33dfdcfb8092c2762036232432f4
parentfebfac15fa1c8342620aae16035a5a75e8a2be4b (diff)
libvirt interface
-rw-r--r--playground/a01/main.py38
-rw-r--r--schemas_json/project.yaml8
-rw-r--r--src_py/hatter/__init__.py0
-rw-r--r--src_py/hatter/vm.py105
4 files changed, 112 insertions, 39 deletions
diff --git a/playground/a01/main.py b/playground/a01/main.py
index aa6ce8e..9f96465 100644
--- a/playground/a01/main.py
+++ b/playground/a01/main.py
@@ -1,7 +1,6 @@
import libvirt
import sys
import time
-import io
import git
import os
import shutil
@@ -11,41 +10,11 @@ import paramiko.client
import paramiko.rsakey
-private_key_str = """-----BEGIN RSA PRIVATE KEY-----
-MIIEpAIBAAKCAQEA9t4sSxeHa8A0TwMOzD9M9OITtcbl3rki/QfBLIFBkKlP24Tx
-BOH5dRfWq0LC7j1+ViDUyBEuPw513ADxuwUhpLbhelkDM7rrmobXvKfYfKlK6mtn
-RA2tFSeJNmWO7Cz3VYR3JWUgG5TGowXWHRx42MP7fzmbWKd2HSVUUmKVONb98YjW
-nZFTmBaV53lHfVLCKitxsToFL0uGzqFSMt27BK9GDaCA159zC4G7YqjiqxkqA5UY
-x2IbMFKMd7eAKw/yCdBRuCWGYFvjPlHj1m4zCHZsfFQ5fYrO9NFd2ieYxQBgSfJ+
-cDSmiaXXWWfooaG0h2UKMkrqU0YmHGOA2c/xJwIDAQABAoIBAE0Q4Iz0pG7ryqib
-0MPMQw7zgKmvlNUpwJVzFUf6deheIrLp1n/qt4BpV7eRGN9czRLAHwzx6BkBP6PV
-m6EBohYUjWEvZoOAp8pOrAyV7UxFYUC7FLq29kBzXi9gFvT9uJy2xKck4ZgaosQD
-r2rZF5S74cg+yJMte/7vR1qMsf7S6eyrDVMQGP6c0apMT1GxmcAHx9T71ePoYnD2
-faUzr+lVnTLGB6wv1cyaF/Nrt/leskBJ0qmKfkWMRc2uPPPDIvGW39z9OIoPqlEr
-4RKqwvyqRzh0uQ/4tpZzMQTfQQSzQ3B9gxCyox7Fc8z/KOSVHzbFso9FCjidCtxR
-054KmqkCgYEA/r1tdovJzv7AYJeeEV81VFCwtxIg2T04JhhfYiGg/MSSp4Jc05UM
-ivVn9VIyjj9kP0mFTSH/4zLFpo9jp7a/HTfqOK6fIT0p8bQ/PJ8ZZ7cQN1MsV7bh
-YaXaUF8Oh/yidnZC3dH1ByVrvZC8DolGlpLAvl8i66kUXGvHvnuYNB0CgYEA+BbG
-84ge1O9aLxEKzW9soTglFJREMT3jMvK7oUPvYy6JhjoKbM3CnkFSQx+k+QA5wgKf
-Z+bWGjWZ3paOP1wgmRl/3/ST08W79I6WaQVBx28DiGypyJ3V0/lkfxvsAhsPhM0n
-qya+ASYuYa1OZR2sdykyYA74+lor8DzEwIfB7xMCgYEA9516QbkvuZ23siyu4YQC
-eqrUm59rfr8bTSxzyxeVPR52z4zQXnqLbqeNHdGAgvTrpPj6MjfSXC6GIZlP7T6e
-FvC7I83ZsJ2bn+7taSfdsgsoIB8hA0IpYpms1GMR5O2VnkDmTmhAHWoqiGGf6yFV
-FBgicupXL2ty90NtLaNGF6ECgYAcvE6pEKA5m8u/XeL5bqmPdvhcjNvlNDznvtPa
-1wqYW2CUio6Akci0Ge7UVYr/SHZoMXOTTlqISKMc9CVf02T3Nsvn/eVNhz7BEe78
-FR7MYeBv4d48nYOR/PYV/v70M3w1rqmkmmUxruF6cN9+uNQsLTpng/R00xL5zaAg
-iNj+vwKBgQCbPS90lQ+d3YSB0W5kdBigTfgMASwFiENXHEPReTTDi73y9AQL8yh7
-fhwegAxBuKYUMqUh/yjE/lWE9j+TjLufPOLq3K0C+xoOQExuZ7+xEg9SjIju+Fj5
-iebkM6IzOZtiCNZXEQvJiHj6aTM6wTy8OhuLry04ayXvJ6Kmj63lsw==
------END RSA PRIVATE KEY-----
-"""
-
-
def main():
repo_path = 'repository'
conf = {'domain': 'archlinux',
'ssh_username': 'root',
- 'ssh_key': private_key_str,
+ 'ssh_password': 'archlinux',
'script': ['pwd',
'ls',
'cat test.txt']}
@@ -103,14 +72,13 @@ def execute_libvirt(conf, repo_arch_path):
def execute_ssh(conf, address, repo_arch_path):
- pkey = paramiko.rsakey.RSAKey.from_private_key(
- io.StringIO(conf['ssh_key']))
conn = paramiko.client.SSHClient()
conn.set_missing_host_key_policy(paramiko.client.AutoAddPolicy)
connected = False
for _ in range(10):
try:
- conn.connect(address, username=conf['ssh_username'], pkey=pkey,
+ conn.connect(address, username=conf['ssh_username'],
+ password=conf['ssh_password'],
timeout=1, auth_timeout=1)
connected = True
break
diff --git a/schemas_json/project.yaml b/schemas_json/project.yaml
index 214e388..f3440b9 100644
--- a/schemas_json/project.yaml
+++ b/schemas_json/project.yaml
@@ -7,7 +7,7 @@ type: object
required:
- domain
- ssh_username
- - ssh_key
+ - ssh_password
- script
properties:
uri:
@@ -31,10 +31,10 @@ properties:
description: |
Username for connecting to VM guest SSH daemon
type: string
- ssh_key:
- title: SSH key
+ ssh_password:
+ title: SSH password
description: |
- Content of SSH key used for connecting to VM guest SSH daemon
+ Password for connecting to VM guest SSH daemon
type: string
script:
title: Script
diff --git a/src_py/hatter/__init__.py b/src_py/hatter/__init__.py
deleted file mode 100644
index e69de29..0000000
--- a/src_py/hatter/__init__.py
+++ /dev/null
diff --git a/src_py/hatter/vm.py b/src_py/hatter/vm.py
new file mode 100644
index 0000000..87e71b9
--- /dev/null
+++ b/src_py/hatter/vm.py
@@ -0,0 +1,105 @@
+import time
+import libvirt
+
+
+class VM:
+
+ def __init__(self, domain_name, uri='qemu:///system', snapshot_name=None,
+ temp_snapshot_name='temp_hatter', address_retry_count=10,
+ address_delay=5):
+ self._domain_name = domain_name
+ self._uri = uri
+ self._snapshot_name = snapshot_name
+ self._temp_snapshot_name = temp_snapshot_name
+ self._address_retry_count = address_retry_count
+ self._address_delay = address_delay
+ self._conn = None
+ self._domain = None
+ self._temp_snapshot = None
+ self._address = None
+
+ @property
+ def address(self):
+ return self._address
+
+ def start(self):
+ try:
+ self._conn = _libvirt_connect(self._uri)
+ self._domain = _libvirt_get_domain(self._conn, self._domain_name)
+ if self._domain.isActive():
+ self._domain.destroy()
+ self._temp_snapshot = _libvirt_create_temp_snapshot(
+ self._domain, self._temp_snapshot_name)
+ if self._snapshot_name:
+ _libvirt_revert_snapshot(self._domain, self._snapshot_name)
+ _libvirt_start_domain(self._domain)
+ for _ in range(self._address_retry_count):
+ self._address = _libvirt_get_address(self._domain)
+ if self._address:
+ return
+ time.sleep(self._address_delay)
+ raise Exception('ip addess not detected')
+ except Exception:
+ self.stop()
+ raise
+
+ def stop(self):
+ if self._domain:
+ self._domain.destroy()
+ if self._domain and self._temp_snapshot:
+ self._domain.revertToSnapshot(self._temp_snapshot)
+ if self._temp_snapshot:
+ self._temp_snapshot.delete()
+ if self._conn:
+ self._conn.close()
+ self._temp_snapshot = None
+ self._domain = None
+ self._conn = None
+ self._address = None
+
+
+def _libvirt_connect(uri):
+ conn = libvirt.open(uri)
+ if not conn:
+ raise Exception('could not open connection to {}'.format(uri))
+ return conn
+
+
+def _libvirt_get_domain(conn, domain_name):
+ domain = conn.lookupByName(domain_name)
+ if not domain:
+ raise Exception('domain {} not available'.format(domain_name))
+ return domain
+
+
+def _libvirt_start_domain(domain):
+ if domain.create():
+ raise Exception('could not run vm')
+
+
+def _libvirt_create_temp_snapshot(domain, temp_snapshot_name):
+ temp_snapshot = domain.snapshotLookupByName(temp_snapshot_name)
+ if temp_snapshot:
+ temp_snapshot.delete()
+ temp_snapshot = domain.snapshotCreateXML(
+ "<domainsnapshot><name>{}</name></domainsnapshot>".format(
+ temp_snapshot_name))
+ if not temp_snapshot:
+ raise Exception('could not create snapshot {}'.format(
+ temp_snapshot_name))
+ return temp_snapshot
+
+
+def _libvirt_revert_snapshot(domain, snapshot_name):
+ snapshot = domain.snapshotLookupByName(snapshot_name)
+ if not snapshot:
+ raise Exception('snapshot {} not available'.format(snapshot_name))
+ if domain.revertToSnapshot(snapshot):
+ raise Exception('could not revert snapshot {}'.format(snapshot_name))
+
+
+def _libvirt_get_address(domain):
+ addresses = domain.interfaceAddresses(0)
+ for i in addresses.values():
+ for j in i.get('addrs', []):
+ return j.get('addr')