Reformat code
This commit is contained in:
parent
1b5c033f5c
commit
f46edac356
|
@ -1,2 +0,0 @@
|
|||
#from importlib import import_module
|
||||
#backend = import_module
|
|
@ -1,2 +1,2 @@
|
|||
class DevopsDriver(object):
|
||||
pass
|
||||
pass
|
||||
|
|
|
@ -63,7 +63,6 @@ class DevopsDriver(object):
|
|||
"""
|
||||
return self.conn.lookupByUUIDString(node.uuid).isActive()
|
||||
|
||||
|
||||
@retry()
|
||||
def network_exists(self, network):
|
||||
"""
|
||||
|
@ -349,8 +348,9 @@ class DevopsDriver(object):
|
|||
if key_code[0] == 'wait':
|
||||
sleep(1)
|
||||
continue
|
||||
self.conn.lookupByUUIDString(node.uuid).sendKey(0, 0, list(key_code),
|
||||
len(key_code), 0)
|
||||
self.conn.lookupByUUIDString(node.uuid).sendKey(0, 0,
|
||||
list(key_code),
|
||||
len(key_code), 0)
|
||||
|
||||
@retry()
|
||||
def volume_define(self, volume, pool='default'):
|
||||
|
@ -425,5 +425,3 @@ class DevopsDriver(object):
|
|||
"{0:>s}/{1:>s}".format(address, prefix_or_netmask)))
|
||||
self.allocated_networks = allocated_networks
|
||||
return self.allocated_networks
|
||||
|
||||
|
||||
|
|
|
@ -15,7 +15,7 @@ class LibvirtXMLBuilder(object):
|
|||
if len(name) > self.NAME_SIZE:
|
||||
hash_str = str(hash(name))
|
||||
name = hash_str + name[len(name) - self.NAME_SIZE + len(hash_str):]
|
||||
return name
|
||||
return name
|
||||
|
||||
def build_network_xml(self, network):
|
||||
"""
|
||||
|
@ -30,15 +30,13 @@ class LibvirtXMLBuilder(object):
|
|||
network_xml.forward(mode=network.forward)
|
||||
if not (network.ip_network is None):
|
||||
ip_network = IPNetwork(network.ip_network)
|
||||
with network_xml.ip(
|
||||
address=str(ip_network[1]),
|
||||
prefix=str(ip_network.prefixlen)):
|
||||
with network_xml.ip(address=str(ip_network[1]), prefix=str(ip_network.prefixlen)):
|
||||
if network.has_pxe_server:
|
||||
network_xml.tftp(root=network.tftp_root_dir)
|
||||
if network.has_dhcp_server:
|
||||
with network_xml.dhcp:
|
||||
network_xml.range(start=str(network.ip_pool_start),
|
||||
end=str(network.ip_pool_end))
|
||||
end=str(network.ip_pool_end))
|
||||
for interface in network.interfaces:
|
||||
for address in interface.addresses:
|
||||
if IPAddress(address.ip_address) in ip_network:
|
||||
|
@ -59,7 +57,8 @@ class LibvirtXMLBuilder(object):
|
|||
"""
|
||||
volume_xml = XMLBuilder('volume')
|
||||
volume_xml.name(
|
||||
self._get_name(volume.environment and volume.environment.name or '',
|
||||
self._get_name(
|
||||
volume.environment and volume.environment.name or '',
|
||||
volume.name))
|
||||
volume_xml.capacity(str(volume.capacity))
|
||||
with volume_xml.target:
|
||||
|
@ -108,9 +107,9 @@ class LibvirtXMLBuilder(object):
|
|||
node_xml = XMLBuilder("domain", type=node.hypervisor)
|
||||
node_xml.name(
|
||||
self._get_name(node.environment and node.environment.name or '',
|
||||
node.name))
|
||||
node.name))
|
||||
node_xml.vcpu(str(node.vcpu))
|
||||
node_xml.memory(str(node.memory*1024), unit='KiB')
|
||||
node_xml.memory(str(node.memory * 1024), unit='KiB')
|
||||
|
||||
with node_xml.os:
|
||||
node_xml.type(node.os_type, arch=node.architecture)
|
||||
|
|
|
@ -3,14 +3,14 @@ class DevopsError(Exception):
|
|||
|
||||
|
||||
class DevopsCalledProcessError(DevopsError):
|
||||
def __init__(self, command, returncode, output=None):
|
||||
def __init__(self, command, returncode, output=None):
|
||||
self.returncode = returncode
|
||||
self.cmd = command
|
||||
self.output = output
|
||||
|
||||
def __str__(self):
|
||||
message = "Command '%s' returned non-zero exit status %s" % (
|
||||
self.cmd, self.returncode)
|
||||
self.cmd, self.returncode)
|
||||
if self.output:
|
||||
message += "\n%s" % '\n'.join(self.output)
|
||||
return message
|
||||
|
|
|
@ -15,7 +15,8 @@ import logging
|
|||
import paramiko
|
||||
|
||||
from devops.helpers.retry import retry
|
||||
from devops.error import DevopsError, DevopsCalledProcessError, TimeoutError, AuthenticationError
|
||||
from devops.error import DevopsError, DevopsCalledProcessError, TimeoutError, \
|
||||
AuthenticationError
|
||||
|
||||
|
||||
logger = logging.getLogger(__name__)
|
||||
|
@ -38,6 +39,7 @@ def icmp_ping(host, timeout=1):
|
|||
"ping -c 1 -W '%(timeout)d' '%(host)s' 1>/dev/null 2>&1" % {
|
||||
'host': str(host), 'timeout': timeout}) == 0
|
||||
|
||||
|
||||
def _tcp_ping(host, port):
|
||||
s = socket.socket()
|
||||
s.connect((str(host), int(port)))
|
||||
|
@ -77,7 +79,7 @@ def wait(predicate, interval=5, timeout=None):
|
|||
return timeout + start_time - time.time() if timeout else 0
|
||||
|
||||
|
||||
def _wait(raising_predicate, expected = Exception, interval=5, timeout=None):
|
||||
def _wait(raising_predicate, expected=Exception, interval=5, timeout=None):
|
||||
start_time = time.time()
|
||||
try:
|
||||
return raising_predicate()
|
||||
|
@ -122,7 +124,8 @@ class SSHClient(object):
|
|||
self.port = int(port)
|
||||
self.username = username
|
||||
self.password = password
|
||||
if not private_keys: private_keys = []
|
||||
if not private_keys:
|
||||
private_keys = []
|
||||
self.private_keys = private_keys
|
||||
|
||||
self.sudo_mode = False
|
||||
|
@ -140,7 +143,7 @@ class SSHClient(object):
|
|||
def __exit__(self, type, value, traceback):
|
||||
pass
|
||||
|
||||
@retry(count=3,delay=3)
|
||||
@retry(count=3, delay=3)
|
||||
def connect(self):
|
||||
logging.debug(
|
||||
"Connect to '%s:%s' as '%s:%s'" % (
|
||||
|
@ -153,8 +156,8 @@ class SSHClient(object):
|
|||
except paramiko.AuthenticationException:
|
||||
pass
|
||||
return self._ssh.connect(
|
||||
self.host, port=self.port, username=self.username,
|
||||
password=self.password)
|
||||
self.host, port=self.port, username=self.username,
|
||||
password=self.password)
|
||||
|
||||
def reconnect(self):
|
||||
self._ssh = paramiko.SSHClient()
|
||||
|
@ -165,30 +168,32 @@ class SSHClient(object):
|
|||
def check_call(self, command, verbose=False):
|
||||
ret = self.execute(command, verbose)
|
||||
if ret['exit_code'] != 0:
|
||||
raise DevopsCalledProcessError(command, ret['exit_code'], ret['stdout'] + ret['stderr'])
|
||||
raise DevopsCalledProcessError(command, ret['exit_code'],
|
||||
ret['stdout'] + ret['stderr'])
|
||||
return ret
|
||||
|
||||
def check_stderr(self, command, verbose=False):
|
||||
ret = self.check_call(command, verbose)
|
||||
if ret['stderr']:
|
||||
raise DevopsCalledProcessError(command, ret['exit_code'], ret['stdout'] + ret['stderr'])
|
||||
raise DevopsCalledProcessError(command, ret['exit_code'],
|
||||
ret['stdout'] + ret['stderr'])
|
||||
return ret
|
||||
|
||||
@classmethod
|
||||
def execute_together(cls, remotes, command):
|
||||
futures={}
|
||||
errors={}
|
||||
futures = {}
|
||||
errors = {}
|
||||
for remote in remotes:
|
||||
cmd = "%s\n" % command
|
||||
if remote.sudo_mode:
|
||||
cmd = 'sudo -S bash -c "%s"' % cmd.replace('"', '\\"')
|
||||
chan = remote._ssh.get_transport().open_session()
|
||||
chan.exec_command(cmd)
|
||||
futures[remote]=chan
|
||||
futures[remote] = chan
|
||||
for remote, chan in futures.items():
|
||||
ret=chan.recv_exit_status()
|
||||
if ret != 0:
|
||||
errors[remote.host]=ret
|
||||
ret = chan.recv_exit_status()
|
||||
if ret != 0:
|
||||
errors[remote.host] = ret
|
||||
if errors:
|
||||
raise DevopsCalledProcessError(command, errors)
|
||||
|
||||
|
@ -390,4 +395,4 @@ def _get_file_size(path):
|
|||
size = file.tell()
|
||||
finally:
|
||||
file.seek(current)
|
||||
return size
|
||||
return size
|
||||
|
|
|
@ -26,4 +26,3 @@ class IpNetworksPool(object):
|
|||
|
||||
def next(self):
|
||||
return self._generator.next()
|
||||
|
||||
|
|
|
@ -16,5 +16,7 @@ def retry(count=10, delay=1):
|
|||
if i >= count:
|
||||
raise
|
||||
sleep(delay)
|
||||
|
||||
return wrapper
|
||||
|
||||
return decorator
|
||||
|
|
|
@ -143,7 +143,7 @@ def iterable(a):
|
|||
|
||||
|
||||
def from_string(s):
|
||||
"from_string(s) - Convert string of chars into string of corresponding scancodes."
|
||||
"from_string(s) - Convert string of chars into string of scancodes."
|
||||
|
||||
scancodes = []
|
||||
|
||||
|
|
|
@ -5,7 +5,8 @@ os.environ.setdefault("DJANGO_SETTINGS_MODULE", "devops.settings")
|
|||
import ipaddr
|
||||
from devops.helpers.helpers import generate_mac
|
||||
from devops.helpers.network import IpNetworksPool
|
||||
from devops.models import Address, Interface, Node, Network, Environment, Volume, DiskDevice, ExternalModel
|
||||
from devops.models import Address, Interface, Node, Network, Environment, \
|
||||
Volume, DiskDevice, ExternalModel
|
||||
|
||||
|
||||
class Manager(object):
|
||||
|
@ -128,7 +129,8 @@ class Manager(object):
|
|||
"""
|
||||
:rtype : Address
|
||||
"""
|
||||
return Address.objects.create(ip_address=ip_address, interface=interface)
|
||||
return Address.objects.create(ip_address=ip_address,
|
||||
interface=interface)
|
||||
|
||||
def node_attach_volume(self, node, volume, device='disk', type='file',
|
||||
bus='virtio', target_dev=None):
|
||||
|
|
|
@ -47,7 +47,7 @@ class Environment(models.Model):
|
|||
return self.networks.get(name=name, environment=self)
|
||||
|
||||
def has_snapshot(self, name):
|
||||
return all(map(lambda x:x.has_snapshot(name), self.nodes))
|
||||
return all(map(lambda x: x.has_snapshot(name), self.nodes))
|
||||
|
||||
def define(self):
|
||||
for network in self.networks:
|
||||
|
@ -63,7 +63,7 @@ class Environment(models.Model):
|
|||
for node in nodes or self.nodes:
|
||||
node.start()
|
||||
|
||||
def destroy(self, verbose = True):
|
||||
def destroy(self, verbose=True):
|
||||
for node in self.nodes:
|
||||
node.destroy(verbose=verbose)
|
||||
|
||||
|
@ -165,12 +165,9 @@ class Network(ExternalModel):
|
|||
ip = self._iterhosts.next()
|
||||
if ip < self.ip_pool_start or ip > self.ip_pool_end:
|
||||
continue
|
||||
if not Address.objects.filter(
|
||||
interface__network=self,
|
||||
ip_address=str(ip)).exists():
|
||||
if not Address.objects.filter(interface__network=self, ip_address=str(ip)).exists():
|
||||
return ip
|
||||
|
||||
|
||||
def bridge_name(self):
|
||||
return self.driver.network_bridge_name(self)
|
||||
|
||||
|
@ -288,7 +285,7 @@ class Node(ExternalModel):
|
|||
self.driver.node_resume(self)
|
||||
|
||||
def has_snapshot(self, name):
|
||||
return self.driver.node_snapshot_exists(node=self, name=name)
|
||||
return self.driver.node_snapshot_exists(node=self, name=name)
|
||||
|
||||
def snapshot(self, name=None, force=False, description=None):
|
||||
if force and self.has_snapshot(name):
|
||||
|
|
|
@ -1,5 +1,3 @@
|
|||
import os
|
||||
|
||||
DRIVER = 'devops.driver.libvirt.libvirt_driver'
|
||||
INSTALLED_APPS = ['devops']
|
||||
|
||||
|
@ -13,4 +11,4 @@ DATABASES = {
|
|||
'PORT': '',
|
||||
'TEST_CHARSET': 'UTF8'
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -2,6 +2,7 @@ import argparse
|
|||
import os
|
||||
from devops.manager import Manager
|
||||
|
||||
|
||||
class Shell(object):
|
||||
def __init__(self):
|
||||
super(Shell, self).__init__()
|
||||
|
@ -15,15 +16,16 @@ class Shell(object):
|
|||
print self.manager.environment_list().values('name')
|
||||
|
||||
def node_dict(self, node):
|
||||
return { 'name':node.name,
|
||||
'vnc':node.get_vnc_port(),
|
||||
return {'name': node.name,
|
||||
'vnc': node.get_vnc_port(),
|
||||
}
|
||||
|
||||
def do_show(self):
|
||||
environment = self.manager.environment_get(self.params.name)
|
||||
print {
|
||||
'name': environment.name,
|
||||
'nodes': map(lambda x: {'node': self.node_dict(x)}, environment.nodes)
|
||||
'nodes': map(lambda x: {'node': self.node_dict(x)},
|
||||
environment.nodes)
|
||||
}
|
||||
|
||||
def do_erase(self):
|
||||
|
@ -49,7 +51,6 @@ class Shell(object):
|
|||
self.manager.environment_get(self.params.name).snapshot(
|
||||
self.params.snapshot_name)
|
||||
|
||||
|
||||
commands = {
|
||||
'list': do_list,
|
||||
'show': do_show,
|
||||
|
@ -65,10 +66,11 @@ class Shell(object):
|
|||
def get_params(self):
|
||||
name_parser = argparse.ArgumentParser(add_help=False)
|
||||
name_parser.add_argument('name', help='environment name',
|
||||
default=os.getenv('ENV_NAME'))
|
||||
default=os.getenv('ENV_NAME'))
|
||||
snapshot_name_parser = argparse.ArgumentParser(add_help=False)
|
||||
snapshot_name_parser.add_argument('--snapshot-name',
|
||||
help='snapshot name', default=os.getenv('SNAPSHOT_NAME'))
|
||||
help='snapshot name',
|
||||
default=os.getenv('SNAPSHOT_NAME'))
|
||||
parser = argparse.ArgumentParser(
|
||||
description="Manage virtual environments")
|
||||
subparsers = parser.add_subparsers(help='commands', dest='command')
|
||||
|
@ -80,7 +82,7 @@ class Shell(object):
|
|||
subparsers.add_parser('suspend', parents=[name_parser])
|
||||
subparsers.add_parser('resume', parents=[name_parser])
|
||||
subparsers.add_parser('revert',
|
||||
parents=[name_parser, snapshot_name_parser])
|
||||
parents=[name_parser, snapshot_name_parser])
|
||||
subparsers.add_parser('snapshot',
|
||||
parents=[name_parser, snapshot_name_parser])
|
||||
parents=[name_parser, snapshot_name_parser])
|
||||
return parser.parse_args()
|
||||
|
|
|
@ -1,8 +1,8 @@
|
|||
from unittest import TestCase
|
||||
from devops.error import DevopsCalledProcessError
|
||||
|
||||
class TestManager(TestCase):
|
||||
|
||||
class TestManager(TestCase):
|
||||
def test(self):
|
||||
raise DevopsCalledProcessError('asdf', 1, ['a', 'b'] + ['b', 'c'])
|
||||
|
||||
|
|
|
@ -30,10 +30,10 @@ class TestManager(TestCase):
|
|||
environment=environment, name='internal', ip_network='10.1.0.0/24')
|
||||
interface = self.manager.interface_create(network=network, node=node)
|
||||
self.manager.network_create_address(str('10.1.0.1'),
|
||||
interface=interface)
|
||||
interface=interface)
|
||||
ip = network.next_ip()
|
||||
self.manager.network_create_address(str('10.1.0.3'),
|
||||
interface=interface)
|
||||
interface=interface)
|
||||
ip = network.next_ip()
|
||||
self.assertEquals('10.1.0.4', str(ip))
|
||||
|
||||
|
@ -57,11 +57,10 @@ class TestManager(TestCase):
|
|||
self.assertEqual('10.0.5.0/24', str(self.manager.network_create(
|
||||
environment=environment, name='private', pool=None).ip_network))
|
||||
|
||||
|
||||
def test_node_creationw(self):
|
||||
environment = self.manager.environment_create('test_env55')
|
||||
node = self.manager.node_create(name='test_node4',
|
||||
environment=environment)
|
||||
environment=environment)
|
||||
node.define()
|
||||
|
||||
def test_node_creation(self):
|
||||
|
@ -73,7 +72,7 @@ class TestManager(TestCase):
|
|||
# private = self.manager.create_network(
|
||||
# environment=environment, name='private', pool=None)
|
||||
node = self.manager.node_create(name='test_node',
|
||||
environment=environment)
|
||||
environment=environment)
|
||||
self.manager.interface_create(node=node, network=internal)
|
||||
# self.manager.create_interface(node=node, network=external)
|
||||
# self.manager.create_interface(node=node, network=private)
|
||||
|
@ -83,8 +82,8 @@ class TestManager(TestCase):
|
|||
environment = self.manager.environment_create('test_env3')
|
||||
volume = self.manager.volume_get_predefined(
|
||||
'/var/lib/libvirt/images/disk-135824657433.qcow2')
|
||||
v3 = self.manager.volume_create_child('test_vp89', backing_store=volume,
|
||||
environment=environment)
|
||||
v3 = self.manager.volume_create_child(
|
||||
'test_vp89', backing_store=volume, environment=environment)
|
||||
v3.define()
|
||||
|
||||
def test_create_volume(self):
|
||||
|
@ -102,21 +101,18 @@ class TestManager(TestCase):
|
|||
private = self.manager.network_create(
|
||||
environment=environment, name='private', pool=None)
|
||||
node = self.manager.node_create(name='test_node',
|
||||
environment=environment)
|
||||
environment=environment)
|
||||
self.manager.interface_create(node=node, network=internal)
|
||||
self.manager.interface_create(node=node, network=external)
|
||||
self.manager.interface_create(node=node, network=private)
|
||||
volume = self.manager.volume_get_predefined(
|
||||
'/var/lib/libvirt/images/disk-135824657433.qcow2')
|
||||
v3 = self.manager.volume_create_child('test_vp892',
|
||||
backing_store=volume, environment=environment)
|
||||
backing_store=volume,
|
||||
environment=environment)
|
||||
v4 = self.manager.volume_create_child('test_vp891',
|
||||
backing_store=volume, environment=environment)
|
||||
backing_store=volume,
|
||||
environment=environment)
|
||||
self.manager.node_attach_volume(node=node, volume=v3)
|
||||
self.manager.node_attach_volume(node, v4)
|
||||
environment.define()
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
|
|
@ -5,4 +5,3 @@ from devops.models import double_tuple
|
|||
class TestModels(unittest.TestCase):
|
||||
def test_django_choices(self):
|
||||
self.assertEquals((('a', 'a'), ('b', 'b')), double_tuple('a', 'b'))
|
||||
|
||||
|
|
|
@ -1,6 +1,7 @@
|
|||
import ipaddr
|
||||
from devops.helpers.helpers import SSHClient
|
||||
|
||||
|
||||
def one(manager):
|
||||
environment = manager.environment_create('cdrom')
|
||||
internal_pool = manager.create_network_pool(
|
||||
|
@ -19,7 +20,7 @@ def one(manager):
|
|||
forward='nat')
|
||||
private = manager.network_create(
|
||||
environment=environment, name='private', pool=private_pool)
|
||||
for i in range(1,2):
|
||||
for i in range(1, 2):
|
||||
node = manager.node_create(name='test_node' + str(i), environment=environment)
|
||||
manager.interface_create(node=node, network=internal)
|
||||
manager.interface_create(node=node, network=external)
|
||||
|
@ -28,7 +29,7 @@ def one(manager):
|
|||
'/var/lib/libvirt/images/centos63-cobbler-base.qcow2')
|
||||
v3 = manager.volume_create_child('test_vp895' + str(i), backing_store=volume,
|
||||
environment=environment)
|
||||
v4 = manager.volume_create_child('test_vp896'+ str(i), backing_store=volume,
|
||||
v4 = manager.volume_create_child('test_vp896' + str(i), backing_store=volume,
|
||||
environment=environment)
|
||||
manager.node_attach_volume(node=node, volume=v3)
|
||||
manager.node_attach_volume(node, v4)
|
||||
|
@ -44,7 +45,6 @@ def one(manager):
|
|||
SSHClient.execute_together(remotes, 'ls -la')
|
||||
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
from devops.manager import Manager
|
||||
|
||||
|
|
|
@ -1,6 +1,7 @@
|
|||
import ipaddr
|
||||
from devops.helpers.helpers import SSHClient
|
||||
|
||||
|
||||
def one(manager):
|
||||
environment = manager.environment_create('test_env7')
|
||||
internal_pool = manager.create_network_pool(
|
||||
|
@ -19,7 +20,7 @@ def one(manager):
|
|||
forward='nat')
|
||||
private = manager.network_create(
|
||||
environment=environment, name='private', pool=private_pool)
|
||||
for i in range(0,15):
|
||||
for i in range(0, 15):
|
||||
node = manager.node_create(name='test_node' + str(i), environment=environment)
|
||||
manager.interface_create(node=node, network=internal)
|
||||
manager.interface_create(node=node, network=external)
|
||||
|
@ -27,9 +28,9 @@ def one(manager):
|
|||
volume = manager.volume_get_predefined(
|
||||
'/var/lib/libvirt/images/centos63-cobbler-base.qcow2')
|
||||
v3 = manager.volume_create_child('test_vp895' + str(i), backing_store=volume,
|
||||
environment=environment)
|
||||
v4 = manager.volume_create_child('test_vp896'+ str(i), backing_store=volume,
|
||||
environment=environment)
|
||||
environment=environment)
|
||||
v4 = manager.volume_create_child('test_vp896' + str(i), backing_store=volume,
|
||||
environment=environment)
|
||||
manager.node_attach_volume(node=node, volume=v3)
|
||||
manager.node_attach_volume(node, v4)
|
||||
environment.define()
|
||||
|
@ -42,7 +43,6 @@ def one(manager):
|
|||
SSHClient.execute_together(remotes, 'ls -la')
|
||||
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
from devops.manager import Manager
|
||||
|
||||
|
|
Loading…
Reference in New Issue