The next intermediate state

This commit is contained in:
vic 2013-01-20 19:57:41 +04:00
parent 5b44b1a628
commit 095aae2632
5 changed files with 73 additions and 62 deletions

View File

@ -47,7 +47,7 @@ class LibvirtDriver(object):
:type network: Network
:rtype : Boolean
"""
return self.conn.networkLookupByUUID(network.uuid).isActive()
return self.conn.networkLookupByUUIDString(network.uuid).isActive()
@retry()
def node_active(self, node):
@ -55,7 +55,7 @@ class LibvirtDriver(object):
:type node: Node
:rtype : Boolean
"""
return self.conn.networkLookupByUUID(node.uuid).isActive()
return self.conn.networkLookupByUUIDString(node.uuid).isActive()
@retry()
@ -65,10 +65,10 @@ class LibvirtDriver(object):
:rtype : Boolean
"""
try:
self.conn.networkLookupByUUID(network.uuid)
self.conn.networkLookupByUUIDString(network.uuid)
return True
except libvirt.libvirtError, e:
if e.get_error_message() == 'virNetworkLookupByUUID() failed':
if e.message == 'virNetworkLookupByUUIDString() failed':
return False
raise
@ -79,10 +79,10 @@ class LibvirtDriver(object):
:rtype : Boolean
"""
try:
self.conn.lookupByUUID(node.uuid)
self.conn.lookupByUUIDString(node.uuid)
return True
except libvirt.libvirtError, e:
if e.get_error_message() == 'virDomainLookupByUUID() failed':
if e.message == 'virDomainLookupByUUIDString() failed':
return False
raise
@ -96,7 +96,7 @@ class LibvirtDriver(object):
self.conn.storageVolLookupByKey(volume.uuid)
return True
except libvirt.libvirtError, e:
if e.get_error_message() == 'virStorageVolLookupByKey() failed':
if e.message == 'virStorageVolLookupByKey() failed':
return False
raise
@ -114,14 +114,14 @@ class LibvirtDriver(object):
"""
:rtype : None
"""
self.conn.networkLookupByUUID(network.uuid).destroy()
self.conn.networkLookupByUUIDString(network.uuid).destroy()
@retry()
def network_undefine(self, network):
"""
:rtype : None
"""
self.conn.networkLookupByUUID(network.uuid).undefine()
self.conn.networkLookupByUUIDString(network.uuid).undefine()
@retry()
def network_create(self, network):
@ -149,8 +149,10 @@ class LibvirtDriver(object):
node.architecture, node.hypervisor)).text
node_xml = self.xml_builder.build_node_xml(node, emulator)
for network in node.networks:
if not self.network_active:
print network
if not self.network_active(network):
self.network_create(network)
print node_xml
self.uuid = self.conn.createXML(node_xml, 0).UUIDString()
@retry()
@ -159,7 +161,7 @@ class LibvirtDriver(object):
:type node: Node
:rtype : None
"""
self.conn.lookupByUUID(node.uuid).destroy()
self.conn.lookupByUUIDString(node.uuid).destroy()
@retry()
def node_undefine(self, node):
@ -167,7 +169,7 @@ class LibvirtDriver(object):
:type node: Node
:rtype : None
"""
self.conn.lookupByUUID(node.uuid).undefine()
self.conn.lookupByUUIDString(node.uuid).undefine()
@retry()
def node_get_vnc_port(self, node):
@ -175,7 +177,7 @@ class LibvirtDriver(object):
:type node: Node
:rtype : String
"""
xml_desc = ET.fromstring(self.conn.lookupByUUID(node.uuid).XMLDesc(0))
xml_desc = ET.fromstring(self.conn.lookupByUUIDString(node.uuid).XMLDesc(0))
vnc_element = xml_desc.find('devices/graphics[@type="vnc"][@port]')
if vnc_element:
return vnc_element.get('port')
@ -186,7 +188,7 @@ class LibvirtDriver(object):
:type node: Node
:rtype : None
"""
self.conn.lookupByUUID(node.uuid).create()
self.conn.lookupByUUIDString(node.uuid).create()
@retry()
def node_reset(self, node):
@ -194,7 +196,7 @@ class LibvirtDriver(object):
:type node: Node
:rtype : None
"""
self.conn.lookupByUUID(node.uuid).reset()
self.conn.lookupByUUIDString(node.uuid).reset()
@retry()
def node_reboot(self, node):
@ -202,7 +204,7 @@ class LibvirtDriver(object):
:type node: Node
:rtype : None
"""
self.conn.lookupByUUID(node.uuid).reboot()
self.conn.lookupByUUIDString(node.uuid).reboot()
@retry()
def node_suspend(self, node):
@ -210,7 +212,7 @@ class LibvirtDriver(object):
:type node: Node
:rtype : None
"""
self.conn.lookupByUUID(node.uuid).suspend()
self.conn.lookupByUUIDString(node.uuid).suspend()
@retry()
def node_resume(self, node):
@ -218,7 +220,7 @@ class LibvirtDriver(object):
:type node: Node
:rtype : None
"""
self.conn.lookupByUUID(node.uuid).resume()
self.conn.lookupByUUIDString(node.uuid).resume()
@retry()
def node_shutdown(self, node):
@ -226,7 +228,7 @@ class LibvirtDriver(object):
:type node: Node
:rtype : None
"""
self.conn.lookupByUUID(node.uuid).shutdown()
self.conn.lookupByUUIDString(node.uuid).shutdown()
@retry()
def node_destroy(self, node):
@ -234,7 +236,7 @@ class LibvirtDriver(object):
:type node: Node
:rtype : None
"""
self.conn.lookupByUUID(node.uuid).destroy()
self.conn.lookupByUUIDString(node.uuid).destroy()
# @retry()
def node_get_snapshots(self, node):
@ -242,7 +244,7 @@ class LibvirtDriver(object):
:rtype : List
:type node: Node
"""
return self.conn.lookupByUUID(node.uuid).snapshotListNames(0)
return self.conn.lookupByUUIDString(node.uuid).snapshotListNames(0)
@retry()
def node_create_snapshot(self, node, name=None, description=None):
@ -253,7 +255,7 @@ class LibvirtDriver(object):
:rtype : None
"""
xml = self.xml_builder.build_snapshot_xml(name, description)
self.conn.lookupByUUID(node.uuid).snapshotCreateXML(xml)
self.conn.lookupByUUIDString(node.uuid).snapshotCreateXML(xml)
def _get_snapshot(self, domain, name):
"""
@ -272,7 +274,7 @@ class LibvirtDriver(object):
:type name: String
:rtype : None
"""
domain = self.conn.lookupByUUID(node.uuid)
domain = self.conn.lookupByUUIDString(node.uuid)
snapshot = self._get_snapshot(domain, name)
domain.revertToSnapshot(snapshot, 0)
@ -282,7 +284,7 @@ class LibvirtDriver(object):
:type node: Node
:type name: String
"""
domain = self.conn.lookupByUUID(node.uuid)
domain = self.conn.lookupByUUIDString(node.uuid)
snapshot = self._get_snapshot(domain, name)
snapshot.delete(0)
@ -299,7 +301,7 @@ class LibvirtDriver(object):
if key_codes[0] == 'wait':
sleep(1)
continue
self.conn.lookupByUUID(node.uuid).sendKey(0, 0, key_codes,
self.conn.lookupByUUIDString(node.uuid).sendKey(0, 0, key_codes,
len(key_codes), 0, 0)
@retry()

View File

@ -84,6 +84,8 @@ class LibvirtXMLBuilder(object):
device_xml.target(dev=disk_device.target_dev, bus=disk_device.bus)
def _build_interface_device(self, device_xml, interface):
if interface.type != 'network':
raise NotImplementedError()
with device_xml.interface(type=interface.type):
device_xml.source(network=self.driver.network_name(interface.network))
if not (interface.type is None):

View File

@ -1,7 +1,7 @@
import functools
from time import sleep
def retry(count=10, delay=1):
def retry(count=1, delay=1):
def decorator(func):
@functools.wraps(func)
def wrapper(*args, **kwargs):
@ -11,9 +11,9 @@ def retry(count=10, delay=1):
try:
return func(*args, **kwargs)
except:
i += 1
if i >= count:
raise
i += 1
sleep(delay)
return wrapper
return decorator

View File

@ -23,26 +23,10 @@ def get_driver():
global _driver
return _driver or LibvirtDriver()
class ExternalModel(models.Model):
@property
def driver(self):
"""
:rtype : LibvirtDriver
"""
return get_driver()
name = models.CharField(max_length=255, unique=False, null=False)
uuid = models.CharField(max_length=255)
class Meta:
unique_together = ('name', 'environment')
class Environment(models.Model):
name = models.CharField(max_length=255, unique=True, null=False)
# TODO find corresponded place
# TODO find corresponded place
@property
def driver(self):
"""
@ -98,13 +82,31 @@ class Environment(models.Model):
for node in self.nodes:
node.destroy()
def remove(self):
def erase(self):
for node in self.nodes:
node.remove()
node.erase()
for network in self.networks:
network.remove()
network.erase()
for volume in self.volumes:
volume.remove()
volume.erase()
class ExternalModel(models.Model):
@property
def driver(self):
"""
:rtype : LibvirtDriver
"""
return get_driver()
name = models.CharField(max_length=255, unique=False, null=False)
uuid = models.CharField(max_length=255)
environment = models.ForeignKey(Environment, null=True)
class Meta:
unique_together = ('name', 'environment')
class Network(ExternalModel):
@ -116,7 +118,6 @@ class Network(ExternalModel):
tftp_root_dir = models.CharField(max_length=255)
forward = choices('nat', 'route', 'bridge', 'private', 'vepa', 'passthrough', 'hostdev')
ip_network = models.CharField(max_length=255, unique=True)
environment = models.ForeignKey(Environment, null=True)
@property
def interfaces(self):
@ -160,10 +161,11 @@ class Network(ExternalModel):
self.remove(verbose=False)
def remove(self, verbose = True):
if self.driver.network_exists(self) or verbose:
if self.driver.network_active(self):
self.driver.network_destroy(self)
self.driver.network_undefine(self)
if verbose or self.uuid:
if verbose or self.driver.network_exists(self):
if self.driver.network_active(self):
self.driver.network_destroy(self)
self.driver.network_undefine(self)
self.delete()
class Node(ExternalModel):
@ -176,7 +178,7 @@ class Node(ExternalModel):
vcpu = models.PositiveSmallIntegerField(null=False, default=1)
memory = models.IntegerField(null=False, default=1024)
has_vnc = models.BooleanField(null=False, default=True)
environment = models.ForeignKey(Environment, null=True)
@property
def disk_devices(self):
@ -215,10 +217,11 @@ class Node(ExternalModel):
self.remove(verbose=False)
def remove(self, verbose = True):
if verbose or self.driver.node_exists(self):
if self.driver.node_active(self):
self.driver.node_destroy(self)
self.driver.node_undefine(self)
if verbose or self.uuid:
if verbose or self.driver.node_exists(self):
if self.driver.node_active(self):
self.driver.node_destroy(self)
self.driver.node_undefine(self)
self.delete()
class DiskDevice(models.Model):
@ -232,14 +235,18 @@ class Volume(ExternalModel):
capacity = models.IntegerField(null=False)
backing_store = models.ForeignKey('self', null=True)
format = models.CharField(max_length=255, null=False)
environment = models.ForeignKey(Environment, null=True)
def define(self):
self.driver.volume_define(self)
self.save()
def remove(self):
self.driver.volume_delete(self)
def erase(self):
self.remove(verbose=False)
def remove(self, verbose = True):
if verbose or self.uuid:
if verbose or self.driver.volume_exists(self):
self.driver.volume_delete(self)
self.delete()
class Interface(models.Model):

View File

@ -67,7 +67,7 @@ class TestIpNetworksPool(TestCase):
# self.manager.create_interface(node=node, network=private)
environment.define()
except:
environment.remove()
environment.erase()