diff options
| author | bozo.kopic <bozo.kopic@gmail.com> | 2017-07-03 15:40:16 +0200 |
|---|---|---|
| committer | bozo.kopic <bozo.kopic@gmail.com> | 2017-07-03 15:40:16 +0200 |
| commit | fe888f22a7183740dd2381b8d5d08c0fb1fcf3b7 (patch) | |
| tree | 988986a549dc33dfdcfb8092c2762036232432f4 | |
| parent | febfac15fa1c8342620aae16035a5a75e8a2be4b (diff) | |
libvirt interface
| -rw-r--r-- | playground/a01/main.py | 38 | ||||
| -rw-r--r-- | schemas_json/project.yaml | 8 | ||||
| -rw-r--r-- | src_py/hatter/__init__.py | 0 | ||||
| -rw-r--r-- | src_py/hatter/vm.py | 105 |
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') |
