The next intermediate state
This commit is contained in:
parent
5b44b1a628
commit
095aae2632
|
@ -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()
|
||||
|
|
|
@ -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):
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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):
|
||||
|
|
|
@ -67,7 +67,7 @@ class TestIpNetworksPool(TestCase):
|
|||
# self.manager.create_interface(node=node, network=private)
|
||||
environment.define()
|
||||
except:
|
||||
environment.remove()
|
||||
environment.erase()
|
||||
|
||||
|
||||
|
||||
|
|
Loading…
Reference in New Issue