Reformat code

This commit is contained in:
vic 2013-05-15 16:44:30 +04:00
parent 1b5c033f5c
commit f46edac356
18 changed files with 75 additions and 80 deletions

View File

@ -1,2 +0,0 @@
#from importlib import import_module
#backend = import_module

View File

@ -1,2 +1,2 @@
class DevopsDriver(object):
pass
pass

View File

@ -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

View File

@ -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)

View File

@ -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

View File

@ -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

View File

@ -26,4 +26,3 @@ class IpNetworksPool(object):
def next(self):
return self._generator.next()

View File

@ -16,5 +16,7 @@ def retry(count=10, delay=1):
if i >= count:
raise
sleep(delay)
return wrapper
return decorator

View File

@ -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 = []

View File

@ -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):

View File

@ -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):

View File

@ -1,5 +1,3 @@
import os
DRIVER = 'devops.driver.libvirt.libvirt_driver'
INSTALLED_APPS = ['devops']
@ -13,4 +11,4 @@ DATABASES = {
'PORT': '',
'TEST_CHARSET': 'UTF8'
}
}
}

View File

@ -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()

View File

@ -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'])

View File

@ -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()

View File

@ -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'))

View File

@ -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

View File

@ -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