rework imports: import module instead of object
rework imports: import module instead of object http://docs.openstack.org/developer/hacking/#imports Change-Id: I5c1f8518060ca717259f94cb3a8ceaa2590d4197
This commit is contained in:
parent
8877bd8b6c
commit
66a89d8eb9
|
@ -13,10 +13,10 @@
|
|||
# License for the specific language governing permissions and limitations
|
||||
# under the License.
|
||||
|
||||
from os import environ
|
||||
import os
|
||||
|
||||
if __name__ == "__main__":
|
||||
environ.setdefault("DJANGO_SETTINGS_MODULE", "devops.settings")
|
||||
from devops.shell import main
|
||||
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "devops.settings")
|
||||
from devops import shell
|
||||
|
||||
main()
|
||||
shell.main()
|
||||
|
|
|
@ -14,7 +14,7 @@
|
|||
|
||||
import subprocess
|
||||
|
||||
from devops.error import DevopsError
|
||||
from devops import error
|
||||
from devops import logger
|
||||
|
||||
|
||||
|
@ -104,12 +104,12 @@ class IpmiClient(object):
|
|||
ipmitool_cmd = subprocess.check_output(["which",
|
||||
"ipmitool"]).strip()
|
||||
if not ipmitool_cmd:
|
||||
raise DevopsError('ipmitool not found')
|
||||
raise error.DevopsError('ipmitool not found')
|
||||
except Exception:
|
||||
raise DevopsError('Node:{} ipmi_host:{} '
|
||||
'ipmitool has not installed.\
|
||||
No chance to go over'.format(self.nodename,
|
||||
self.remote_host))
|
||||
raise error.DevopsError(
|
||||
'Node:{} ipmi_host:{} ipmitool has not installed. '
|
||||
'No chance to go over'.format(self.nodename,
|
||||
self.remote_host))
|
||||
ipmi_cmd_dict = {'ipmitool': ipmitool_cmd,
|
||||
'remote_lan_interface': self.remote_lan_interface,
|
||||
'remote_host': self.remote_host,
|
||||
|
@ -121,13 +121,14 @@ class IpmiClient(object):
|
|||
lerrors = [(key, value) for (key, value) in ipmi_cmd_dict.items()
|
||||
if value is None]
|
||||
if lerrors:
|
||||
raise DevopsError('Node:{} ipmi_host:{} '
|
||||
'ipmitool arguments '
|
||||
'key={}, value={}'
|
||||
'are not valid'.format(self.nodename,
|
||||
self.remote_host,
|
||||
lerrors[0],
|
||||
lerrors[1]))
|
||||
raise error.DevopsError(
|
||||
'Node:{} ipmi_host:{} '
|
||||
'ipmitool arguments '
|
||||
'key={}, value={}'
|
||||
'are not valid'.format(self.nodename,
|
||||
self.remote_host,
|
||||
lerrors[0],
|
||||
lerrors[1]))
|
||||
ipmi_cmd = [ipmitool_cmd,
|
||||
'-I', self.remote_lan_interface,
|
||||
'-H', self.remote_host,
|
||||
|
@ -157,18 +158,19 @@ class IpmiClient(object):
|
|||
code = pipe.returncode
|
||||
except Exception as message:
|
||||
logger.debug('{}'.format(message))
|
||||
raise DevopsError('Node:{} Remote:{} ipmitool command [{}] '
|
||||
'has failed with'
|
||||
' the exception: {}'.format(self.nodename,
|
||||
self.remote_host,
|
||||
cmd, message))
|
||||
raise error.DevopsError(
|
||||
'Node:{} Remote:{} ipmitool command [{}] '
|
||||
'has failed with'
|
||||
' the exception: {}'.format(self.nodename,
|
||||
self.remote_host,
|
||||
cmd, message))
|
||||
|
||||
if (out is None) or code != 0:
|
||||
logger.debug("rcode ={} or err ={}".format(code, err))
|
||||
raise DevopsError('Node:{} Remote:{} ipmitool command [{}] '
|
||||
'has failed with the message: {}'
|
||||
.format(self.nodename, self.remote_host,
|
||||
cmd, err))
|
||||
raise error.DevopsError(
|
||||
'Node:{} Remote:{} ipmitool command [{}] '
|
||||
'has failed with the message: {}'.format(
|
||||
self.nodename, self.remote_host, cmd, err))
|
||||
return out
|
||||
|
||||
def __controller_management(self, command):
|
||||
|
|
|
@ -14,33 +14,33 @@
|
|||
|
||||
import uuid
|
||||
|
||||
from django.utils.functional import cached_property
|
||||
from django.utils import functional
|
||||
|
||||
from devops.driver.baremetal.ipmi_client import IpmiClient
|
||||
from devops.helpers.helpers import wait
|
||||
from devops.models.base import ParamField
|
||||
from devops.models.driver import Driver
|
||||
from devops.models.network import L2NetworkDevice
|
||||
from devops.models.node import Node
|
||||
from devops.models.volume import Volume
|
||||
from devops.driver.baremetal import ipmi_client
|
||||
from devops.helpers import helpers
|
||||
from devops.models import base
|
||||
from devops.models import driver
|
||||
from devops.models import network
|
||||
from devops.models import node
|
||||
from devops.models import volume
|
||||
|
||||
|
||||
class IpmiDriver(Driver):
|
||||
class IpmiDriver(driver.Driver):
|
||||
"""Driver params from template. keep in DB"""
|
||||
pass
|
||||
|
||||
|
||||
class IpmiL2NetworkDevice(L2NetworkDevice):
|
||||
class IpmiL2NetworkDevice(network.L2NetworkDevice):
|
||||
"""L2NetworkDevice params from template. keep in DB"""
|
||||
pass
|
||||
|
||||
|
||||
class IpmiVolume(Volume):
|
||||
class IpmiVolume(volume.Volume):
|
||||
"""Volume params from template"""
|
||||
pass
|
||||
|
||||
|
||||
class IpmiNode(Node):
|
||||
class IpmiNode(node.Node):
|
||||
"""IPMI Node
|
||||
|
||||
Intel IPMI specification:
|
||||
|
@ -71,27 +71,29 @@ class IpmiNode(Node):
|
|||
:param ipmi_lan_interface: str - the lan interface (lan, lanplus)
|
||||
"""
|
||||
|
||||
uuid = ParamField() # LEGACY, for compatibility reason
|
||||
boot = ParamField(default='pxe')
|
||||
force_set_boot = ParamField(default=True)
|
||||
ipmi_user = ParamField()
|
||||
ipmi_password = ParamField()
|
||||
ipmi_previlegies = ParamField(default='OPERATOR')
|
||||
ipmi_host = ParamField()
|
||||
ipmi_lan_interface = ParamField(default="lanplus")
|
||||
ipmi_port = ParamField(default=623)
|
||||
uuid = base.ParamField() # LEGACY, for compatibility reason
|
||||
boot = base.ParamField(default='pxe')
|
||||
force_set_boot = base.ParamField(default=True)
|
||||
ipmi_user = base.ParamField()
|
||||
ipmi_password = base.ParamField()
|
||||
ipmi_previlegies = base.ParamField(default='OPERATOR')
|
||||
ipmi_host = base.ParamField()
|
||||
ipmi_lan_interface = base.ParamField(default="lanplus")
|
||||
ipmi_port = base.ParamField(default=623)
|
||||
|
||||
@cached_property
|
||||
@functional.cached_property
|
||||
def conn(self):
|
||||
"""Connection to ipmi api"""
|
||||
return IpmiClient(self.ipmi_user, self.ipmi_password, self.ipmi_host,
|
||||
self.ipmi_previlegies, self.ipmi_lan_interface,
|
||||
self.ipmi_port, self.name)
|
||||
return ipmi_client.IpmiClient(
|
||||
self.ipmi_user, self.ipmi_password, self.ipmi_host,
|
||||
self.ipmi_previlegies, self.ipmi_lan_interface,
|
||||
self.ipmi_port, self.name)
|
||||
|
||||
def _wait_power_off(self):
|
||||
wait(lambda: not self.is_active(), timeout=60,
|
||||
timeout_msg="Node {0} / {1} wasn't stopped in 60 sec".
|
||||
format(self.name, self.ipmi_host))
|
||||
helpers.wait(
|
||||
lambda: not self.is_active(), timeout=60,
|
||||
timeout_msg="Node {0} / {1} wasn't stopped in 60 sec".format(
|
||||
self.name, self.ipmi_host))
|
||||
|
||||
def exists(self):
|
||||
"""Check if node exists
|
||||
|
@ -111,7 +113,7 @@ class IpmiNode(Node):
|
|||
:param: None
|
||||
:return: bool - True if successful, False otherwise.
|
||||
"""
|
||||
return (0 == self.conn.power_status())
|
||||
return 0 == self.conn.power_status()
|
||||
|
||||
def define(self):
|
||||
"""Prepare node to start
|
||||
|
@ -136,9 +138,10 @@ class IpmiNode(Node):
|
|||
self.reboot()
|
||||
else:
|
||||
self.conn.power_on()
|
||||
wait(self.is_active, timeout=60,
|
||||
timeout_msg="Node {0} / {1} wasn't started in 60 sec".
|
||||
format(self.name, self.ipmi_host))
|
||||
helpers.wait(
|
||||
self.is_active, timeout=60,
|
||||
timeout_msg="Node {0} / {1} wasn't started in 60 sec".format(
|
||||
self.name, self.ipmi_host))
|
||||
|
||||
def destroy(self):
|
||||
"""Node destroy. Power off """
|
||||
|
|
|
@ -22,15 +22,14 @@ Driver, L2NetworkDevice, Volume, Node.
|
|||
|
||||
from __future__ import print_function
|
||||
|
||||
from devops.models.base import ParamField
|
||||
from devops.models.base import ParamMultiField
|
||||
from devops.models.driver import Driver
|
||||
from devops.models.network import L2NetworkDevice
|
||||
from devops.models.node import Node
|
||||
from devops.models.volume import Volume
|
||||
from devops.models import base
|
||||
from devops.models import driver
|
||||
from devops.models import network
|
||||
from devops.models import node
|
||||
from devops.models import volume
|
||||
|
||||
|
||||
class DummyDriver(Driver):
|
||||
class DummyDriver(driver.Driver):
|
||||
"""Example of driver implementation
|
||||
|
||||
Note: This class is imported as Driver at .__init__.py
|
||||
|
@ -53,11 +52,11 @@ class DummyDriver(Driver):
|
|||
"""
|
||||
|
||||
# example parameters
|
||||
dummy_parameter = ParamField(default=10)
|
||||
choice_parameter = ParamField(default='one',
|
||||
choices=('one', 'two', 'three'))
|
||||
nested = ParamMultiField(
|
||||
parameter=ParamField()
|
||||
dummy_parameter = base.ParamField(default=10)
|
||||
choice_parameter = base.ParamField(default='one',
|
||||
choices=('one', 'two', 'three'))
|
||||
nested = base.ParamMultiField(
|
||||
parameter=base.ParamField()
|
||||
)
|
||||
|
||||
def get_allocated_networks(self):
|
||||
|
@ -70,7 +69,7 @@ class DummyDriver(Driver):
|
|||
return ['192.168.0.0/24', '192.168.1.0/24']
|
||||
|
||||
|
||||
class DummyL2NetworkDevice(L2NetworkDevice):
|
||||
class DummyL2NetworkDevice(network.L2NetworkDevice):
|
||||
"""Example implementation of l2 network device.
|
||||
|
||||
Note: This class is imported as L2NetworkDevice at .__init__.py
|
||||
|
@ -93,8 +92,8 @@ class DummyL2NetworkDevice(L2NetworkDevice):
|
|||
"""
|
||||
|
||||
# example parameter
|
||||
dhcp = ParamField(default=False)
|
||||
other = ParamField(default='')
|
||||
dhcp = base.ParamField(default=False)
|
||||
other = base.ParamField(default='')
|
||||
|
||||
def define(self):
|
||||
"""Define
|
||||
|
@ -154,7 +153,7 @@ class DummyL2NetworkDevice(L2NetworkDevice):
|
|||
print('Do something after erase')
|
||||
|
||||
|
||||
class DummyVolume(Volume):
|
||||
class DummyVolume(volume.Volume):
|
||||
"""Example implementation of volume
|
||||
|
||||
Note: This class is imported as Volume at .__init__.py
|
||||
|
@ -163,7 +162,7 @@ class DummyVolume(Volume):
|
|||
"""
|
||||
|
||||
# example parameter
|
||||
size = ParamField(default=1024)
|
||||
size = base.ParamField(default=1024)
|
||||
|
||||
def define(self):
|
||||
"""Define
|
||||
|
@ -192,7 +191,7 @@ class DummyVolume(Volume):
|
|||
print('Do something after erase')
|
||||
|
||||
|
||||
class DummyNode(Node):
|
||||
class DummyNode(node.Node):
|
||||
"""Example implementation of node
|
||||
|
||||
Note: This class is imported as Node at .__init__.py
|
||||
|
@ -225,9 +224,9 @@ class DummyNode(Node):
|
|||
- fuelweb_admin
|
||||
"""
|
||||
|
||||
cpu = ParamField(default=1)
|
||||
memory = ParamField(default=1024)
|
||||
boot = ParamField(default=['network', 'cdrom', 'hd'])
|
||||
cpu = base.ParamField(default=1)
|
||||
memory = base.ParamField(default=1024)
|
||||
boot = base.ParamField(default=['network', 'cdrom', 'hd'])
|
||||
|
||||
def define(self):
|
||||
"""Define
|
||||
|
|
|
@ -12,33 +12,31 @@
|
|||
# License for the specific language governing permissions and limitations
|
||||
# under the License.
|
||||
|
||||
from devops.models.driver import Driver
|
||||
from devops.models.network import Interface
|
||||
from devops.models.network import L2NetworkDevice
|
||||
from devops.models.node import Node
|
||||
from devops.models.volume import DiskDevice
|
||||
from devops.models.volume import Volume
|
||||
from devops.models import driver
|
||||
from devops.models import network
|
||||
from devops.models import node
|
||||
from devops.models import volume
|
||||
|
||||
|
||||
class EmptyDriver(Driver):
|
||||
class EmptyDriver(driver.Driver):
|
||||
pass
|
||||
|
||||
|
||||
class EmptyInterface(Interface):
|
||||
class EmptyInterface(network.Interface):
|
||||
pass
|
||||
|
||||
|
||||
class EmptyL2NetworkDevice(L2NetworkDevice):
|
||||
class EmptyL2NetworkDevice(network.L2NetworkDevice):
|
||||
pass
|
||||
|
||||
|
||||
class EmptyNode(Node):
|
||||
class EmptyNode(node.Node):
|
||||
pass
|
||||
|
||||
|
||||
class EmptyDiskDevice(DiskDevice):
|
||||
class EmptyDiskDevice(volume.DiskDevice):
|
||||
pass
|
||||
|
||||
|
||||
class EmptyVolume(Volume):
|
||||
class EmptyVolume(volume.Volume):
|
||||
pass
|
||||
|
|
|
@ -16,37 +16,30 @@ import datetime
|
|||
import itertools
|
||||
import os
|
||||
import shutil
|
||||
from time import sleep
|
||||
import time
|
||||
import uuid
|
||||
from warnings import warn
|
||||
import warnings
|
||||
import xml.etree.ElementTree as ET
|
||||
|
||||
|
||||
from django.conf import settings
|
||||
from django.utils.functional import cached_property
|
||||
from django.utils import functional
|
||||
import libvirt
|
||||
import netaddr
|
||||
|
||||
from devops.driver.libvirt.libvirt_xml_builder import LibvirtXMLBuilder
|
||||
from devops.error import DevopsCalledProcessError
|
||||
from devops.error import DevopsError
|
||||
from devops.helpers.cloud_image_settings import generate_cloud_image_settings
|
||||
from devops.helpers.helpers import deepgetattr
|
||||
from devops.helpers.helpers import get_file_size
|
||||
from devops.helpers.helpers import underscored
|
||||
from devops.helpers.helpers import xml_tostring
|
||||
from devops.driver.libvirt import libvirt_xml_builder as builder
|
||||
from devops import error
|
||||
from devops.helpers import cloud_image_settings
|
||||
from devops.helpers import helpers
|
||||
from devops.helpers.retry import retry
|
||||
from devops.helpers import scancodes
|
||||
from devops.helpers.subprocess_runner import Subprocess
|
||||
from devops.helpers import subprocess_runner
|
||||
from devops import logger
|
||||
from devops.models.base import ParamField
|
||||
from devops.models.base import ParamMultiField
|
||||
from devops.models.driver import Driver
|
||||
from devops.models.network import Interface
|
||||
from devops.models.network import L2NetworkDevice
|
||||
from devops.models.node import Node
|
||||
from devops.models.volume import DiskDevice
|
||||
from devops.models.volume import Volume
|
||||
from devops.models import base
|
||||
from devops.models import driver
|
||||
from devops.models import network
|
||||
from devops.models import node
|
||||
from devops.models import volume
|
||||
|
||||
|
||||
class _LibvirtManager(object):
|
||||
|
@ -137,7 +130,7 @@ class Snapshot(object):
|
|||
domain_element.remove(domain_element.findall('./cpu')[0])
|
||||
domain_element.append(cpu_element)
|
||||
|
||||
return xml_tostring(snapshot_xmltree)
|
||||
return helpers.xml_tostring(snapshot_xmltree)
|
||||
|
||||
@property
|
||||
def _xml_tree(self):
|
||||
|
@ -197,7 +190,7 @@ class Snapshot(object):
|
|||
self.name, self.created)
|
||||
|
||||
|
||||
class LibvirtDriver(Driver):
|
||||
class LibvirtDriver(driver.Driver):
|
||||
"""libvirt driver
|
||||
|
||||
:param use_host_cpu: When creating nodes, should libvirt's
|
||||
|
@ -207,20 +200,20 @@ class LibvirtDriver(Driver):
|
|||
Note: This class is imported as Driver at .__init__.py
|
||||
"""
|
||||
|
||||
connection_string = ParamField(default="qemu:///system")
|
||||
storage_pool_name = ParamField(default="default")
|
||||
stp = ParamField(default=True)
|
||||
hpet = ParamField(default=True)
|
||||
use_host_cpu = ParamField(default=True)
|
||||
enable_acpi = ParamField(default=False)
|
||||
enable_nwfilters = ParamField(default=False)
|
||||
reboot_timeout = ParamField()
|
||||
use_hugepages = ParamField(default=False)
|
||||
vnc_password = ParamField()
|
||||
connection_string = base.ParamField(default="qemu:///system")
|
||||
storage_pool_name = base.ParamField(default="default")
|
||||
stp = base.ParamField(default=True)
|
||||
hpet = base.ParamField(default=True)
|
||||
use_host_cpu = base.ParamField(default=True)
|
||||
enable_acpi = base.ParamField(default=False)
|
||||
enable_nwfilters = base.ParamField(default=False)
|
||||
reboot_timeout = base.ParamField()
|
||||
use_hugepages = base.ParamField(default=False)
|
||||
vnc_password = base.ParamField()
|
||||
|
||||
_device_name_generators = {}
|
||||
|
||||
@cached_property
|
||||
@functional.cached_property
|
||||
def conn(self):
|
||||
"""Connection to libvirt api"""
|
||||
return LibvirtManager.get_connection(self.connection_string)
|
||||
|
@ -234,7 +227,7 @@ class LibvirtDriver(Driver):
|
|||
"""
|
||||
return self.capabilities
|
||||
|
||||
@cached_property
|
||||
@functional.cached_property
|
||||
def capabilities(self):
|
||||
return ET.fromstring(self.conn.getCapabilities())
|
||||
|
||||
|
@ -249,8 +242,8 @@ class LibvirtDriver(Driver):
|
|||
:rtype : List
|
||||
"""
|
||||
allocated_networks = []
|
||||
for network in self.conn.listAllNetworks():
|
||||
et = ET.fromstring(network.XMLDesc())
|
||||
for nwk in self.conn.listAllNetworks():
|
||||
et = ET.fromstring(nwk.XMLDesc())
|
||||
ip = et.find('ip[@address]')
|
||||
if ip is not None:
|
||||
address = ip.get('address')
|
||||
|
@ -302,7 +295,7 @@ class LibvirtDriver(Driver):
|
|||
return self.conn.getLibVersion()
|
||||
|
||||
|
||||
class LibvirtL2NetworkDevice(L2NetworkDevice):
|
||||
class LibvirtL2NetworkDevice(network.L2NetworkDevice):
|
||||
"""L2 network device based on libvirt Network
|
||||
|
||||
forward:
|
||||
|
@ -429,25 +422,25 @@ class LibvirtL2NetworkDevice(L2NetworkDevice):
|
|||
|
||||
Note: This class is imported as L2NetworkDevice at .__init__.py
|
||||
"""
|
||||
uuid = ParamField()
|
||||
uuid = base.ParamField()
|
||||
|
||||
forward = ParamMultiField(
|
||||
mode=ParamField(
|
||||
forward = base.ParamMultiField(
|
||||
mode=base.ParamField(
|
||||
choices=(None, 'nat', 'route', 'bridge', 'private',
|
||||
'vepa', 'passthrough', 'hostdev'),
|
||||
)
|
||||
)
|
||||
dhcp = ParamField(default=False)
|
||||
stp = ParamField()
|
||||
dhcp = base.ParamField(default=False)
|
||||
stp = base.ParamField()
|
||||
|
||||
has_pxe_server = ParamField(default=False)
|
||||
tftp_root_dir = ParamField()
|
||||
has_pxe_server = base.ParamField(default=False)
|
||||
tftp_root_dir = base.ParamField()
|
||||
|
||||
vlan_ifaces = ParamField(default=[])
|
||||
parent_iface = ParamMultiField(
|
||||
phys_dev=ParamField(default=None),
|
||||
l2_net_dev=ParamField(default=None),
|
||||
tag=ParamField(default=None),
|
||||
vlan_ifaces = base.ParamField(default=[])
|
||||
parent_iface = base.ParamMultiField(
|
||||
phys_dev=base.ParamField(default=None),
|
||||
l2_net_dev=base.ParamField(default=None),
|
||||
tag=base.ParamField(default=None),
|
||||
)
|
||||
|
||||
@property
|
||||
|
@ -467,8 +460,8 @@ class LibvirtL2NetworkDevice(L2NetworkDevice):
|
|||
|
||||
:rtype : String
|
||||
"""
|
||||
return underscored(
|
||||
deepgetattr(self, 'group.environment.name'),
|
||||
return helpers.underscored(
|
||||
helpers.deepgetattr(self, 'group.environment.name'),
|
||||
self.name)
|
||||
|
||||
def is_active(self):
|
||||
|
@ -482,7 +475,7 @@ class LibvirtL2NetworkDevice(L2NetworkDevice):
|
|||
def define(self):
|
||||
# define filter first
|
||||
if self.driver.enable_nwfilters:
|
||||
filter_xml = LibvirtXMLBuilder.build_network_filter(
|
||||
filter_xml = builder.LibvirtXMLBuilder.build_network_filter(
|
||||
name=self.network_name)
|
||||
self.driver.conn.nwfilterDefineXML(filter_xml)
|
||||
|
||||
|
@ -525,7 +518,7 @@ class LibvirtL2NetworkDevice(L2NetworkDevice):
|
|||
name=interface.node.name
|
||||
))
|
||||
|
||||
xml = LibvirtXMLBuilder.build_network_xml(
|
||||
xml = builder.LibvirtXMLBuilder.build_network_xml(
|
||||
network_name=self.network_name,
|
||||
bridge_name=bridge_name,
|
||||
addresses=addresses,
|
||||
|
@ -583,8 +576,8 @@ class LibvirtL2NetworkDevice(L2NetworkDevice):
|
|||
# to any bridge before adding it to the current bridge instead
|
||||
# of this try/except workaround
|
||||
try:
|
||||
Subprocess.check_call(cmd)
|
||||
except DevopsCalledProcessError:
|
||||
subprocess_runner.Subprocess.check_call(cmd)
|
||||
except error.DevopsCalledProcessError:
|
||||
pass
|
||||
|
||||
@retry(libvirt.libvirtError)
|
||||
|
@ -638,7 +631,8 @@ class LibvirtL2NetworkDevice(L2NetworkDevice):
|
|||
:rtype : None
|
||||
"""
|
||||
self.driver.conn.interfaceDefineXML(
|
||||
LibvirtXMLBuilder.build_iface_xml(name, ip, prefix, vlanid))
|
||||
builder.LibvirtXMLBuilder.build_iface_xml(
|
||||
name, ip, prefix, vlanid))
|
||||
|
||||
@retry(libvirt.libvirtError)
|
||||
def iface_undefine(self, iface_name):
|
||||
|
@ -679,11 +673,11 @@ class LibvirtL2NetworkDevice(L2NetworkDevice):
|
|||
if not self.driver.enable_nwfilters:
|
||||
return
|
||||
if not self._nwfilter:
|
||||
raise DevopsError(
|
||||
raise error.DevopsError(
|
||||
'Unable to block network {0}: nwfilter not found!'
|
||||
''.format(self.network_name))
|
||||
|
||||
filter_xml = LibvirtXMLBuilder.build_network_filter(
|
||||
filter_xml = builder.LibvirtXMLBuilder.build_network_filter(
|
||||
name=self.network_name,
|
||||
uuid=self._nwfilter.UUIDString(),
|
||||
rule=dict(action='drop',
|
||||
|
@ -696,28 +690,28 @@ class LibvirtL2NetworkDevice(L2NetworkDevice):
|
|||
if not self.driver.enable_nwfilters:
|
||||
return
|
||||
if not self._nwfilter:
|
||||
raise DevopsError(
|
||||
raise error.DevopsError(
|
||||
'Unable to unblock network {0}: nwfilter not found!'
|
||||
''.format(self.network_name))
|
||||
|
||||
filter_xml = LibvirtXMLBuilder.build_network_filter(
|
||||
filter_xml = builder.LibvirtXMLBuilder.build_network_filter(
|
||||
name=self.network_name,
|
||||
uuid=self._nwfilter.UUIDString())
|
||||
self.driver.conn.nwfilterDefineXML(filter_xml)
|
||||
|
||||
|
||||
class LibvirtVolume(Volume):
|
||||
class LibvirtVolume(volume.Volume):
|
||||
"""Note: This class is imported as Volume at .__init__.py """
|
||||
|
||||
uuid = ParamField()
|
||||
capacity = ParamField(default=None) # in gigabytes
|
||||
format = ParamField(default='qcow2', choices=('qcow2', 'raw'))
|
||||
source_image = ParamField(default=None)
|
||||
serial = ParamField()
|
||||
wwn = ParamField()
|
||||
multipath_count = ParamField(default=0)
|
||||
cloudinit_meta_data = ParamField(default=None)
|
||||
cloudinit_user_data = ParamField(default=None)
|
||||
uuid = base.ParamField()
|
||||
capacity = base.ParamField(default=None) # in gigabytes
|
||||
format = base.ParamField(default='qcow2', choices=('qcow2', 'raw'))
|
||||
source_image = base.ParamField(default=None)
|
||||
serial = base.ParamField()
|
||||
wwn = base.ParamField()
|
||||
multipath_count = base.ParamField(default=0)
|
||||
cloudinit_meta_data = base.ParamField(default=None)
|
||||
cloudinit_user_data = base.ParamField(default=None)
|
||||
|
||||
@property
|
||||
def _libvirt_volume(self):
|
||||
|
@ -731,27 +725,28 @@ class LibvirtVolume(Volume):
|
|||
def define(self):
|
||||
# Generate libvirt volume name
|
||||
if self.node:
|
||||
name = underscored(
|
||||
deepgetattr(self, 'node.group.environment.name'),
|
||||
deepgetattr(self, 'node.name'),
|
||||
name = helpers.underscored(
|
||||
helpers.deepgetattr(self, 'node.group.environment.name'),
|
||||
helpers.deepgetattr(self, 'node.name'),
|
||||
self.name,
|
||||
)
|
||||
elif self.group:
|
||||
name = underscored(
|
||||
deepgetattr(self, 'group.environment.name'),
|
||||
deepgetattr(self, 'group.name'),
|
||||
name = helpers.underscored(
|
||||
helpers.deepgetattr(self, 'group.environment.name'),
|
||||
helpers.deepgetattr(self, 'group.name'),
|
||||
self.name,
|
||||
)
|
||||
else:
|
||||
raise DevopsError("Can't craete volume that is not "
|
||||
"associated with any node or group")
|
||||
raise error.DevopsError(
|
||||
"Can't craete volume that is not "
|
||||
"associated with any node or group")
|
||||
|
||||
# Find backing store format and path
|
||||
backing_store_path = None
|
||||
backing_store_format = None
|
||||
if self.backing_store:
|
||||
if not self.backing_store.exists():
|
||||
raise DevopsError(
|
||||
raise error.DevopsError(
|
||||
"Can't create volume {!r}. backing_store volume {!r} does "
|
||||
"not exists.".format(self.name, self.backing_store.name))
|
||||
backing_store_path = self.backing_store.get_path()
|
||||
|
@ -763,18 +758,19 @@ class LibvirtVolume(Volume):
|
|||
capacity = int(self.capacity * 1024 ** 3)
|
||||
elif self.source_image is not None:
|
||||
# limit capacity to the sorse image file size
|
||||
capacity = get_file_size(self.source_image)
|
||||
capacity = helpers.get_file_size(self.source_image)
|
||||
elif self.backing_store:
|
||||
# limit capacity to backing_store capacity
|
||||
capacity = self.backing_store.get_capacity()
|
||||
else:
|
||||
raise DevopsError("Can't create volume {!r}: no capacity or "
|
||||
"source_image specified".format(self.name))
|
||||
raise error.DevopsError(
|
||||
"Can't create volume {!r}: no capacity or "
|
||||
"source_image specified".format(self.name))
|
||||
|
||||
# Generate xml
|
||||
pool_name = self.driver.storage_pool_name
|
||||
pool = self.driver.conn.storagePoolLookupByName(pool_name)
|
||||
xml = LibvirtXMLBuilder.build_volume_xml(
|
||||
xml = builder.LibvirtXMLBuilder.build_volume_xml(
|
||||
name=name,
|
||||
capacity=capacity,
|
||||
vol_format=self.format,
|
||||
|
@ -820,7 +816,7 @@ class LibvirtVolume(Volume):
|
|||
|
||||
def fill_from_exist(self):
|
||||
msg = 'LibvirtVolume.fill_from_exist() is deprecated and do nothing'
|
||||
warn(msg, DeprecationWarning)
|
||||
warnings.warn(msg, DeprecationWarning)
|
||||
logger.debug(msg)
|
||||
|
||||
@retry(libvirt.libvirtError, count=2)
|
||||
|
@ -828,7 +824,7 @@ class LibvirtVolume(Volume):
|
|||
def chunk_render(_, _size, _fd):
|
||||
return _fd.read(_size)
|
||||
|
||||
size = get_file_size(path)
|
||||
size = helpers.get_file_size(path)
|
||||
current_size = self._libvirt_volume.info()[1]
|
||||
|
||||
# resize volume if more space required to upload the image
|
||||
|
@ -903,7 +899,7 @@ class LibvirtVolume(Volume):
|
|||
"""
|
||||
msg = ('LibvirtVolume.volume_get_predefined() is deprecated. '
|
||||
'Please use Volumes associated with Groups')
|
||||
warn(msg, DeprecationWarning)
|
||||
warnings.warn(msg, DeprecationWarning)
|
||||
logger.debug(msg)
|
||||
|
||||
try:
|
||||
|
@ -911,28 +907,29 @@ class LibvirtVolume(Volume):
|
|||
except cls.DoesNotExist:
|
||||
volume = cls(uuid=uuid)
|
||||
if not volume.exists():
|
||||
raise DevopsError(
|
||||
raise error.DevopsError(
|
||||
'Predefined volume {!r} not found'.format(uuid))
|
||||
volume.format = volume.get_format()
|
||||
volume.save()
|
||||
return volume
|
||||
|
||||
|
||||
class LibvirtNode(Node):
|
||||
class LibvirtNode(node.Node):
|
||||
"""Note: This class is imported as Node at .__init__.py """
|
||||
|
||||
uuid = ParamField()
|
||||
hypervisor = ParamField(default='kvm', choices=('kvm', 'test'))
|
||||
os_type = ParamField(default='hvm', choices=['hvm'])
|
||||
architecture = ParamField(default='x86_64', choices=['x86_64', 'i686'])
|
||||
boot = ParamField(default=['network', 'cdrom', 'hd'])
|
||||
vcpu = ParamField(default=1)
|
||||
memory = ParamField(default=1024)
|
||||
has_vnc = ParamField(default=True)
|
||||
bootmenu_timeout = ParamField(default=0)
|
||||
numa = ParamField(default=[])
|
||||
cloud_init_volume_name = ParamField()
|
||||
cloud_init_iface_up = ParamField()
|
||||
uuid = base.ParamField()
|
||||
hypervisor = base.ParamField(default='kvm', choices=('kvm', 'test'))
|
||||
os_type = base.ParamField(default='hvm', choices=['hvm'])
|
||||
architecture = base.ParamField(
|
||||
default='x86_64', choices=['x86_64', 'i686'])
|
||||
boot = base.ParamField(default=['network', 'cdrom', 'hd'])
|
||||
vcpu = base.ParamField(default=1)
|
||||
memory = base.ParamField(default=1024)
|
||||
has_vnc = base.ParamField(default=True)
|
||||
bootmenu_timeout = base.ParamField(default=0)
|
||||
numa = base.ParamField(default=[])
|
||||
cloud_init_volume_name = base.ParamField()
|
||||
cloud_init_iface_up = base.ParamField()
|
||||
|
||||
@property
|
||||
def _libvirt_node(self):
|
||||
|
@ -988,7 +985,7 @@ class LibvirtNode(Node):
|
|||
for key_code in key_codes:
|
||||
if isinstance(key_code[0], str):
|
||||
if key_code[0] == 'wait':
|
||||
sleep(1)
|
||||
time.sleep(1)
|
||||
continue
|
||||
self._libvirt_node.sendKey(0, 0, list(key_code), len(key_code), 0)
|
||||
|
||||
|
@ -998,8 +995,8 @@ class LibvirtNode(Node):
|
|||
|
||||
:rtype : None
|
||||
"""
|
||||
name = underscored(
|
||||
deepgetattr(self, 'group.environment.name'),
|
||||
name = helpers.underscored(
|
||||
helpers.deepgetattr(self, 'group.environment.name'),
|
||||
self.name,
|
||||
)
|
||||
|
||||
|
@ -1025,8 +1022,8 @@ class LibvirtNode(Node):
|
|||
|
||||
l2_dev = interface.l2_network_device
|
||||
if self.driver.enable_nwfilters:
|
||||
filter_name = underscored(
|
||||
deepgetattr(self, 'group.environment.name'),
|
||||
filter_name = helpers.underscored(
|
||||
helpers.deepgetattr(self, 'group.environment.name'),
|
||||
l2_dev.name,
|
||||
interface.mac_address
|
||||
)
|
||||
|
@ -1046,7 +1043,7 @@ class LibvirtNode(Node):
|
|||
'guest/arch[@name="{0:>s}"]/'
|
||||
'domain[@type="{1:>s}"]/emulator'.format(
|
||||
self.architecture, self.hypervisor)).text
|
||||
node_xml = LibvirtXMLBuilder.build_node_xml(
|
||||
node_xml = builder.LibvirtXMLBuilder.build_node_xml(
|
||||
name=name,
|
||||
hypervisor=self.hypervisor,
|
||||
use_host_cpu=self.driver.use_host_cpu,
|
||||
|
@ -1163,7 +1160,7 @@ class LibvirtNode(Node):
|
|||
admin_network = str(admin_ap.ip_network)
|
||||
hostname = self.name
|
||||
|
||||
generate_cloud_image_settings(
|
||||
cloud_image_settings.generate_cloud_image_settings(
|
||||
cloud_image_settings_path=cloud_image_settings_path,
|
||||
meta_data_path=meta_data_path,
|
||||
user_data_path=user_data_path,
|
||||
|
@ -1197,7 +1194,7 @@ class LibvirtNode(Node):
|
|||
back_vol_name = disk_test.name
|
||||
disk_test = disk_test.backing_store
|
||||
if back_count > 500:
|
||||
raise DevopsError(
|
||||
raise error.DevopsError(
|
||||
"More then 500 snapshots in chain for {0}.{1}"
|
||||
.format(back_vol_name, name))
|
||||
# Create new volume for snapshot
|
||||
|
@ -1220,10 +1217,10 @@ class LibvirtNode(Node):
|
|||
if len(snap_list) > 0:
|
||||
snap_type = snap_list[0].get_type
|
||||
if external and snap_type == 'internal':
|
||||
raise DevopsError(
|
||||
raise error.DevopsError(
|
||||
"Cannot create external snapshot when internal exists")
|
||||
if not external and snap_type == 'external':
|
||||
raise DevopsError(
|
||||
raise error.DevopsError(
|
||||
"Cannot create internal snapshot when external exists")
|
||||
|
||||
# EXTERNAL SNAPSHOT
|
||||
|
@ -1250,8 +1247,8 @@ class LibvirtNode(Node):
|
|||
if force:
|
||||
self.erase_snapshot(name)
|
||||
else:
|
||||
raise DevopsError("Snapshot with name {0} already exists"
|
||||
.format(name))
|
||||
raise error.DevopsError(
|
||||
"Snapshot with name {0} already exists".format(name))
|
||||
|
||||
# Check that existing snapshot has the same type
|
||||
self._assert_snapshot_type(external=external)
|
||||
|
@ -1260,7 +1257,7 @@ class LibvirtNode(Node):
|
|||
if external:
|
||||
# EXTERNAL SNAPSHOTS
|
||||
if self.driver.get_libvirt_version() < 1002012:
|
||||
raise DevopsError(
|
||||
raise error.DevopsError(
|
||||
"For external snapshots we need libvirtd >= 1.2.12")
|
||||
|
||||
# Check whether we have directory for snapshots, if not
|
||||
|
@ -1274,7 +1271,7 @@ class LibvirtNode(Node):
|
|||
|
||||
base_memory_file = '{0}/snapshot-memory-{1}_{2}.{3}'.format(
|
||||
settings.SNAPSHOTS_EXTERNAL_DIR,
|
||||
deepgetattr(self, 'group.environment.name'),
|
||||
helpers.deepgetattr(self, 'group.environment.name'),
|
||||
self.name,
|
||||
name)
|
||||
file_count = 0
|
||||
|
@ -1303,7 +1300,7 @@ class LibvirtNode(Node):
|
|||
memory_file = ''
|
||||
create_xml_flag = 0
|
||||
|
||||
xml = LibvirtXMLBuilder.build_snapshot_xml(
|
||||
xml = builder.LibvirtXMLBuilder.build_snapshot_xml(
|
||||
name=name,
|
||||
description=description,
|
||||
external=external,
|
||||
|
@ -1331,7 +1328,7 @@ class LibvirtNode(Node):
|
|||
|
||||
:type snapshot: Snapshot
|
||||
"""
|
||||
warn(
|
||||
warnings.warn(
|
||||
'_delete_snapshot_files(snapshot) has been deprecated in favor of '
|
||||
'snapshot.delete_snapshot_files()', DeprecationWarning)
|
||||
return snapshot.delete_snapshot_files()
|
||||
|
@ -1353,6 +1350,7 @@ class LibvirtNode(Node):
|
|||
# For snapshot with children we need to create new snapshot chain
|
||||
# and we need to start from original disks, this disks will get new
|
||||
# snapshot point in node class
|
||||
# noinspection PyProtectedMember
|
||||
xml_domain = snapshot._xml_tree.find('domain')
|
||||
if snapshot.children_num == 0:
|
||||
domain_disks = xml_domain.findall('./devices/disk')
|
||||
|
@ -1365,11 +1363,11 @@ class LibvirtNode(Node):
|
|||
|
||||
if snapshot.state == 'shutoff':
|
||||
# Redefine domain for snapshot without memory save
|
||||
self.driver.conn.defineXML(xml_tostring(xml_domain))
|
||||
self.driver.conn.defineXML(helpers.xml_tostring(xml_domain))
|
||||
else:
|
||||
self.driver.conn.restoreFlags(
|
||||
snapshot.memory_file,
|
||||
dxml=xml_tostring(xml_domain),
|
||||
dxml=helpers.xml_tostring(xml_domain),
|
||||
flags=libvirt.VIR_DOMAIN_SAVE_PAUSED)
|
||||
|
||||
# set snapshot as current
|
||||
|
@ -1493,10 +1491,11 @@ class LibvirtNode(Node):
|
|||
# ORIGINAL SNAPSHOT
|
||||
logger.info("Revert {0} ({1}) to internal snapshot {2}".format(
|
||||
self.name, snapshot.state, name))
|
||||
# noinspection PyProtectedMember
|
||||
self._libvirt_node.revertToSnapshot(snapshot._snapshot, 0)
|
||||
|
||||
else:
|
||||
raise DevopsError(
|
||||
raise error.DevopsError(
|
||||
'Domain snapshot for {0} node not found: no domain '
|
||||
'snapshot with matching'
|
||||
' name {1}'.format(self.name, name))
|
||||
|
@ -1542,8 +1541,9 @@ class LibvirtNode(Node):
|
|||
self.destroy()
|
||||
|
||||
# Update domain to snapshot state
|
||||
# noinspection PyProtectedMember
|
||||
xml_domain = snapshot._xml_tree.find('domain')
|
||||
self.driver.conn.defineXML(xml_tostring(xml_domain))
|
||||
self.driver.conn.defineXML(helpers.xml_tostring(xml_domain))
|
||||
snapshot.delete_snapshot_files()
|
||||
snapshot.delete(2)
|
||||
|
||||
|
@ -1635,7 +1635,7 @@ class LibvirtNode(Node):
|
|||
os_el.append(ET.Element('boot', dev=boot_dev))
|
||||
|
||||
# apply changes to domain
|
||||
self.driver.conn.defineXML(xml_tostring(domain_xml))
|
||||
self.driver.conn.defineXML(helpers.xml_tostring(domain_xml))
|
||||
|
||||
self.boot = boot
|
||||
self.save()
|
||||
|
@ -1657,17 +1657,17 @@ class LibvirtNode(Node):
|
|||
|
||||
if target_els:
|
||||
# apply changes to domain
|
||||
self.driver.conn.defineXML(xml_tostring(domain_xml))
|
||||
self.driver.conn.defineXML(helpers.xml_tostring(domain_xml))
|
||||
else:
|
||||
logger.warning("Can't close tray: no cdrom devices "
|
||||
"found for Node {!r}".format(self.name))
|
||||
|
||||
|
||||
class LibvirtInterface(Interface):
|
||||
class LibvirtInterface(network.Interface):
|
||||
|
||||
def define(self):
|
||||
if self.driver.enable_nwfilters:
|
||||
filter_xml = LibvirtXMLBuilder.build_interface_filter(
|
||||
filter_xml = builder.LibvirtXMLBuilder.build_interface_filter(
|
||||
name=self.nwfilter_name,
|
||||
filterref=self.l2_network_device.network_name)
|
||||
self.driver.conn.nwfilterDefineXML(filter_xml)
|
||||
|
@ -1682,7 +1682,7 @@ class LibvirtInterface(Interface):
|
|||
|
||||
@property
|
||||
def nwfilter_name(self):
|
||||
return underscored(
|
||||
return helpers.underscored(
|
||||
self.node.group.environment.name,
|
||||
self.l2_network_device.name,
|
||||
self.mac_address)
|
||||
|
@ -1711,11 +1711,11 @@ class LibvirtInterface(Interface):
|
|||
if not self.driver.enable_nwfilters:
|
||||
return
|
||||
if not self._nwfilter:
|
||||
raise DevopsError(
|
||||
raise error.DevopsError(
|
||||
"Unable to block interface {} on node {}: nwfilter not"
|
||||
" found!".format(self.label, self.node.name))
|
||||
|
||||
filter_xml = LibvirtXMLBuilder.build_interface_filter(
|
||||
filter_xml = builder.LibvirtXMLBuilder.build_interface_filter(
|
||||
name=self.nwfilter_name,
|
||||
filterref=self.l2_network_device.network_name,
|
||||
uuid=self._nwfilter.UUIDString(),
|
||||
|
@ -1730,23 +1730,23 @@ class LibvirtInterface(Interface):
|
|||
if not self.driver.enable_nwfilters:
|
||||
return
|
||||
if not self._nwfilter:
|
||||
raise DevopsError(
|
||||
raise error.DevopsError(
|
||||
"Unable to unblock interface {} on node {}: nwfilter not"
|
||||
" found!".format(self.label, self.node.name))
|
||||
|
||||
filter_xml = LibvirtXMLBuilder.build_interface_filter(
|
||||
filter_xml = builder.LibvirtXMLBuilder.build_interface_filter(
|
||||
name=self.nwfilter_name,
|
||||
filterref=self.l2_network_device.network_name,
|
||||
uuid=self._nwfilter.UUIDString())
|
||||
self.driver.conn.nwfilterDefineXML(filter_xml)
|
||||
|
||||
|
||||
class LibvirtDiskDevice(DiskDevice):
|
||||
class LibvirtDiskDevice(volume.DiskDevice):
|
||||
|
||||
device = ParamField(default='disk', choices=('disk', 'cdrom'))
|
||||
type = ParamField(default='file', choices=('file'))
|
||||
bus = ParamField(default='virtio', choices=('virtio', 'ide', 'scsi'))
|
||||
target_dev = ParamField()
|
||||
device = base.ParamField(default='disk', choices=('disk', 'cdrom'))
|
||||
type = base.ParamField(default='file', choices='file')
|
||||
bus = base.ParamField(default='virtio', choices=('virtio', 'ide', 'scsi'))
|
||||
target_dev = base.ParamField()
|
||||
|
||||
@property
|
||||
def multipath_enabled(self):
|
||||
|
|
|
@ -248,6 +248,7 @@ class LibvirtXMLBuilder(object):
|
|||
|
||||
if acpi:
|
||||
with node_xml.features:
|
||||
# noinspection PyStatementEffect
|
||||
node_xml.acpi
|
||||
|
||||
cpu_args = {}
|
||||
|
@ -269,6 +270,7 @@ class LibvirtXMLBuilder(object):
|
|||
|
||||
if use_hugepages:
|
||||
with node_xml.memoryBacking:
|
||||
# noinspection PyStatementEffect
|
||||
node_xml.hugepages
|
||||
|
||||
node_xml.clock(offset='utc')
|
||||
|
|
|
@ -14,7 +14,7 @@
|
|||
|
||||
import os
|
||||
|
||||
from devops.helpers.subprocess_runner import Subprocess
|
||||
from devops.helpers import subprocess_runner
|
||||
from devops import logger
|
||||
|
||||
|
||||
|
@ -94,4 +94,4 @@ def generate_cloud_image_settings(cloud_image_settings_path, meta_data_path,
|
|||
user_data_path,
|
||||
meta_data_path)
|
||||
|
||||
Subprocess.check_call(cmd)
|
||||
subprocess_runner.Subprocess.check_call(cmd)
|
||||
|
|
|
@ -14,14 +14,13 @@
|
|||
|
||||
from __future__ import unicode_literals
|
||||
|
||||
from json import loads
|
||||
from threading import RLock
|
||||
import json
|
||||
import threading
|
||||
|
||||
from yaml import safe_load
|
||||
import yaml
|
||||
|
||||
from devops.error import DevopsError
|
||||
from devops.error import DevopsNotImplementedError
|
||||
from devops.helpers.proc_enums import ExitCodes
|
||||
from devops import error
|
||||
from devops.helpers import proc_enums
|
||||
from devops import logger
|
||||
|
||||
|
||||
|
@ -42,7 +41,7 @@ class ExecResult(object):
|
|||
]
|
||||
|
||||
def __init__(self, cmd, stdout=None, stderr=None,
|
||||
exit_code=ExitCodes.EX_INVALID):
|
||||
exit_code=proc_enums.ExitCodes.EX_INVALID):
|
||||
"""Command execution result read from fifo
|
||||
|
||||
:type cmd: str
|
||||
|
@ -50,7 +49,7 @@ class ExecResult(object):
|
|||
:type stderr: list
|
||||
:type exit_code: ExitCodes
|
||||
"""
|
||||
self.__lock = RLock()
|
||||
self.__lock = threading.RLock()
|
||||
|
||||
self.__cmd = cmd
|
||||
self.__stdout = stdout if stdout is not None else []
|
||||
|
@ -211,12 +210,12 @@ class ExecResult(object):
|
|||
|
||||
:type new_val: int
|
||||
"""
|
||||
if not isinstance(new_val, (int, ExitCodes)):
|
||||
if not isinstance(new_val, (int, proc_enums.ExitCodes)):
|
||||
raise TypeError('Exit code is strictly int')
|
||||
with self.lock:
|
||||
if isinstance(new_val, int) and \
|
||||
new_val in ExitCodes.__members__.values():
|
||||
new_val = ExitCodes(new_val)
|
||||
new_val in proc_enums.ExitCodes.__members__.values():
|
||||
new_val = proc_enums.ExitCodes(new_val)
|
||||
self.__exit_code = new_val
|
||||
|
||||
def __deserialize(self, fmt):
|
||||
|
@ -228,9 +227,9 @@ class ExecResult(object):
|
|||
"""
|
||||
try:
|
||||
if fmt == 'json':
|
||||
return loads(self.stdout_str, encoding='utf-8')
|
||||
return json.loads(self.stdout_str, encoding='utf-8')
|
||||
elif fmt == 'yaml':
|
||||
return safe_load(self.stdout_str)
|
||||
return yaml.safe_load(self.stdout_str)
|
||||
except BaseException:
|
||||
tmpl = (
|
||||
"'{cmd}' stdout is not valid {fmt}:\n"
|
||||
|
@ -238,10 +237,10 @@ class ExecResult(object):
|
|||
cmd=self.cmd,
|
||||
fmt=fmt))
|
||||
logger.exception(tmpl.format(stdout=self.stdout_str))
|
||||
raise DevopsError(tmpl.format(stdout=self.stdout_brief))
|
||||
raise error.DevopsError(tmpl.format(stdout=self.stdout_brief))
|
||||
msg = '{fmt} deserialize target is not implemented'.format(fmt=fmt)
|
||||
logger.error(msg)
|
||||
raise DevopsNotImplementedError(msg)
|
||||
raise error.DevopsNotImplementedError(msg)
|
||||
|
||||
@property
|
||||
def stdout_json(self):
|
||||
|
@ -298,7 +297,7 @@ class ExecResult(object):
|
|||
)
|
||||
return
|
||||
if key in dir(self):
|
||||
raise DevopsError(
|
||||
raise error.DevopsError(
|
||||
'{key} is read-only!'.format(key=key)
|
||||
)
|
||||
raise IndexError(
|
||||
|
|
|
@ -11,7 +11,7 @@
|
|||
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
|
||||
# License for the specific language governing permissions and limitations
|
||||
# under the License.
|
||||
from netaddr import IPSet
|
||||
import netaddr
|
||||
|
||||
|
||||
class IpNetworksPool(object):
|
||||
|
@ -26,7 +26,9 @@ class IpNetworksPool(object):
|
|||
|
||||
@staticmethod
|
||||
def _overlaps(network, allocated_networks):
|
||||
return any((IPSet(network) & IPSet(an)) for an in allocated_networks)
|
||||
return any(
|
||||
(netaddr.IPSet(network) & netaddr.IPSet(an))
|
||||
for an in allocated_networks)
|
||||
|
||||
def __iter__(self):
|
||||
for network in self.networks:
|
||||
|
|
|
@ -14,7 +14,7 @@
|
|||
|
||||
import functools
|
||||
import inspect
|
||||
from time import sleep
|
||||
import time
|
||||
|
||||
from devops import error
|
||||
from devops import logger
|
||||
|
@ -63,7 +63,7 @@ def retry(exception, count=10, delay=1):
|
|||
'Exception {!r} while running {!r}. '
|
||||
'Waiting {} seconds.'.format(e, func.__name__, delay),
|
||||
exc_info=True) # logs traceback
|
||||
sleep(delay)
|
||||
time.sleep(delay)
|
||||
|
||||
arg_str = ', '.join((
|
||||
', '.join(map(repr, args)),
|
||||
|
|
|
@ -14,13 +14,13 @@
|
|||
|
||||
from __future__ import division
|
||||
|
||||
from collections import OrderedDict
|
||||
import collections
|
||||
import os
|
||||
|
||||
from netaddr import IPNetwork
|
||||
import netaddr
|
||||
import yaml
|
||||
|
||||
from devops.error import DevopsError
|
||||
from devops import error
|
||||
|
||||
|
||||
def yaml_template_load(config_file):
|
||||
|
@ -30,7 +30,7 @@ def yaml_template_load(config_file):
|
|||
def yaml_include(loader, node):
|
||||
file_name = os.path.join(os.path.dirname(loader.name), node.value)
|
||||
if not os.path.isfile(file_name):
|
||||
raise DevopsError(
|
||||
raise error.DevopsError(
|
||||
"Cannot load the environment template {0} : include file {1} "
|
||||
"doesn't exist.".format(loader.name, file_name))
|
||||
with open(file_name) as inputfile:
|
||||
|
@ -38,7 +38,7 @@ def yaml_template_load(config_file):
|
|||
|
||||
def yaml_get_env_variable(loader, node):
|
||||
if not node.value.strip():
|
||||
raise DevopsError(
|
||||
raise error.DevopsError(
|
||||
"Environment variable is required after {tag} in "
|
||||
"{filename}".format(tag=node.tag, filename=loader.name))
|
||||
node_value = node.value.split(',', 1)
|
||||
|
@ -53,7 +53,7 @@ def yaml_template_load(config_file):
|
|||
|
||||
value = os.environ.get(env_variable, default_val)
|
||||
if value is None:
|
||||
raise DevopsError(
|
||||
raise error.DevopsError(
|
||||
"Environment variable {var} is not set from shell"
|
||||
" environment! No default value provided in file "
|
||||
"{filename}".format(var=env_variable, filename=loader.name))
|
||||
|
@ -62,10 +62,10 @@ def yaml_template_load(config_file):
|
|||
|
||||
def construct_mapping(loader, node):
|
||||
loader.flatten_mapping(node)
|
||||
return OrderedDict(loader.construct_pairs(node))
|
||||
return collections.OrderedDict(loader.construct_pairs(node))
|
||||
|
||||
if not os.path.isfile(config_file):
|
||||
raise DevopsError(
|
||||
raise error.DevopsError(
|
||||
"Cannot load the environment template {0} : file "
|
||||
"doesn't exist.".format(config_file))
|
||||
|
||||
|
@ -378,7 +378,7 @@ def create_address_pools(interfaceorder, networks_pools):
|
|||
floating_pool_name = 'floating'
|
||||
|
||||
# Take a first subnet with necessary size and calculate the size
|
||||
net = IPNetwork(networks_pools['public'][0])
|
||||
net = netaddr.IPNetwork(networks_pools['public'][0])
|
||||
new_prefix = int(networks_pools['public'][1])
|
||||
subnet = next(net.subnet(prefixlen=new_prefix))
|
||||
network_size = subnet.size
|
||||
|
@ -411,12 +411,12 @@ def _calculate_numa(numa_nodes, vcpu, memory, name):
|
|||
if numa_nodes:
|
||||
cpus_per_numa = vcpu // numa_nodes
|
||||
if cpus_per_numa * numa_nodes != vcpu:
|
||||
raise DevopsError(
|
||||
raise error.DevopsError(
|
||||
"NUMA_NODES={0} is not a multiple of the number of CPU={1}"
|
||||
" for node '{2}'".format(numa_nodes, vcpu, name))
|
||||
memory_per_numa = memory // numa_nodes
|
||||
if memory_per_numa * numa_nodes != memory:
|
||||
raise DevopsError(
|
||||
raise error.DevopsError(
|
||||
"NUMA_NODES={0} is not a multiple of the amount of "
|
||||
"MEMORY={1} for node '{2}'".format(numa_nodes,
|
||||
memory,
|
||||
|
|
|
@ -15,11 +15,10 @@
|
|||
from django.db import models
|
||||
|
||||
from devops.helpers import loader
|
||||
from devops.models.base import BaseModel
|
||||
from devops.models.base import ParamedModel
|
||||
from devops.models import base
|
||||
|
||||
|
||||
class Driver(ParamedModel, BaseModel):
|
||||
class Driver(base.ParamedModel, base.BaseModel):
|
||||
|
||||
class Meta(object):
|
||||
db_table = 'devops_driver'
|
||||
|
|
|
@ -13,28 +13,26 @@
|
|||
# under the License.
|
||||
|
||||
import time
|
||||
from warnings import warn
|
||||
import warnings
|
||||
|
||||
from django.conf import settings
|
||||
from django.db import IntegrityError
|
||||
from django.db import models
|
||||
from netaddr import IPNetwork
|
||||
from paramiko import Agent
|
||||
from paramiko import RSAKey
|
||||
import netaddr
|
||||
import paramiko
|
||||
|
||||
from devops import error
|
||||
from devops.helpers.network import IpNetworksPool
|
||||
from devops.helpers import network as network_helpers
|
||||
from devops.helpers import ssh_client
|
||||
from devops import logger
|
||||
from devops.models.base import BaseModel
|
||||
from devops.models.driver import Driver
|
||||
from devops.models.group import Group
|
||||
from devops.models.network import AddressPool
|
||||
from devops.models.network import L2NetworkDevice
|
||||
from devops.models.node import Node
|
||||
from devops.models import base
|
||||
from devops.models import driver
|
||||
from devops.models import group
|
||||
from devops.models import network
|
||||
from devops.models import node
|
||||
|
||||
|
||||
class Environment(BaseModel):
|
||||
class Environment(base.BaseModel):
|
||||
class Meta(object):
|
||||
db_table = 'devops_environment'
|
||||
app_label = 'devops'
|
||||
|
@ -51,7 +49,7 @@ class Environment(BaseModel):
|
|||
'Replace by string "admin".'
|
||||
)
|
||||
logger.warning(msg)
|
||||
warn(msg, DeprecationWarning)
|
||||
warnings.warn(msg, DeprecationWarning)
|
||||
return 'admin'
|
||||
|
||||
@property
|
||||
|
@ -60,20 +58,20 @@ class Environment(BaseModel):
|
|||
'Environment.nat_interface is deprecated.'
|
||||
)
|
||||
logger.warning(msg)
|
||||
warn(msg, DeprecationWarning)
|
||||
warnings.warn(msg, DeprecationWarning)
|
||||
return ''
|
||||
|
||||
def get_allocated_networks(self):
|
||||
allocated_networks = []
|
||||
for group in self.get_groups():
|
||||
allocated_networks += group.get_allocated_networks()
|
||||
for grp in self.get_groups():
|
||||
allocated_networks += grp.get_allocated_networks()
|
||||
return allocated_networks
|
||||
|
||||
def get_address_pool(self, **kwargs):
|
||||
try:
|
||||
return self.addresspool_set.get(**kwargs)
|
||||
except AddressPool.DoesNotExist:
|
||||
raise error.DevopsObjNotFound(AddressPool, **kwargs)
|
||||
except network.AddressPool.DoesNotExist:
|
||||
raise error.DevopsObjNotFound(network.AddressPool, **kwargs)
|
||||
|
||||
def get_address_pools(self, **kwargs):
|
||||
return self.addresspool_set.filter(**kwargs).order_by('id')
|
||||
|
@ -81,8 +79,8 @@ class Environment(BaseModel):
|
|||
def get_group(self, **kwargs):
|
||||
try:
|
||||
return self.group_set.get(**kwargs)
|
||||
except Group.DoesNotExist:
|
||||
raise error.DevopsObjNotFound(Group, **kwargs)
|
||||
except group.Group.DoesNotExist:
|
||||
raise error.DevopsObjNotFound(group.Group, **kwargs)
|
||||
|
||||
def get_groups(self, **kwargs):
|
||||
return self.group_set.filter(**kwargs).order_by('id')
|
||||
|
@ -91,7 +89,7 @@ class Environment(BaseModel):
|
|||
for group_data in groups:
|
||||
driver_data = group_data['driver']
|
||||
if driver_data['name'] == 'devops.driver.libvirt.libvirt_driver':
|
||||
warn(
|
||||
warnings.warn(
|
||||
"Driver 'devops.driver.libvirt.libvirt_driver' "
|
||||
"has been renamed to 'devops.driver.libvirt', "
|
||||
"please update the tests!",
|
||||
|
@ -108,14 +106,14 @@ class Environment(BaseModel):
|
|||
)
|
||||
|
||||
def add_group(self, group_name, driver_name, **driver_params):
|
||||
driver = Driver.driver_create(
|
||||
drv = driver.Driver.driver_create(
|
||||
name=driver_name,
|
||||
**driver_params
|
||||
)
|
||||
return Group.group_create(
|
||||
return group.Group.group_create(
|
||||
name=group_name,
|
||||
environment=self,
|
||||
driver=driver,
|
||||
driver=drv,
|
||||
)
|
||||
|
||||
def add_address_pools(self, address_pools):
|
||||
|
@ -129,14 +127,14 @@ class Environment(BaseModel):
|
|||
def add_address_pool(self, name, net, **params):
|
||||
|
||||
networks, prefix = net.split(':')
|
||||
ip_networks = [IPNetwork(x) for x in networks.split(',')]
|
||||
ip_networks = [netaddr.IPNetwork(x) for x in networks.split(',')]
|
||||
|
||||
pool = IpNetworksPool(
|
||||
pool = network_helpers.IpNetworksPool(
|
||||
networks=ip_networks,
|
||||
prefix=int(prefix),
|
||||
allocated_networks=self.get_allocated_networks())
|
||||
|
||||
return AddressPool.address_pool_create(
|
||||
return network.AddressPool.address_pool_create(
|
||||
environment=self,
|
||||
name=name,
|
||||
pool=pool,
|
||||
|
@ -176,35 +174,35 @@ class Environment(BaseModel):
|
|||
return False
|
||||
|
||||
def define(self):
|
||||
for group in self.get_groups():
|
||||
group.define_networks()
|
||||
for group in self.get_groups():
|
||||
group.define_volumes()
|
||||
for group in self.get_groups():
|
||||
group.define_nodes()
|
||||
for grp in self.get_groups():
|
||||
grp.define_networks()
|
||||
for grp in self.get_groups():
|
||||
grp.define_volumes()
|
||||
for grp in self.get_groups():
|
||||
grp.define_nodes()
|
||||
|
||||
def start(self, nodes=None):
|
||||
for group in self.get_groups():
|
||||
group.start_networks()
|
||||
for group in self.get_groups():
|
||||
group.start_nodes(nodes)
|
||||
for grp in self.get_groups():
|
||||
grp.start_networks()
|
||||
for grp in self.get_groups():
|
||||
grp.start_nodes(nodes)
|
||||
|
||||
def destroy(self):
|
||||
for group in self.get_groups():
|
||||
group.destroy()
|
||||
for grp in self.get_groups():
|
||||
grp.destroy()
|
||||
|
||||
def erase(self):
|
||||
for group in self.get_groups():
|
||||
group.erase()
|
||||
for grp in self.get_groups():
|
||||
grp.erase()
|
||||
self.delete()
|
||||
|
||||
def suspend(self, **kwargs):
|
||||
for node in self.get_nodes():
|
||||
node.suspend()
|
||||
for nod in self.get_nodes():
|
||||
nod.suspend()
|
||||
|
||||
def resume(self, **kwargs):
|
||||
for node in self.get_nodes():
|
||||
node.resume()
|
||||
for nod in self.get_nodes():
|
||||
nod.resume()
|
||||
|
||||
def snapshot(self, name=None, description=None, force=False):
|
||||
if name is None:
|
||||
|
@ -213,19 +211,19 @@ class Environment(BaseModel):
|
|||
raise error.DevopsError(
|
||||
'Snapshot with name {0} already exists.'.format(
|
||||
self.params.snapshot_name))
|
||||
for node in self.get_nodes():
|
||||
node.snapshot(name=name, description=description, force=force,
|
||||
external=settings.SNAPSHOTS_EXTERNAL)
|
||||
for nod in self.get_nodes():
|
||||
nod.snapshot(name=name, description=description, force=force,
|
||||
external=settings.SNAPSHOTS_EXTERNAL)
|
||||
|
||||
def revert(self, name=None, flag=True):
|
||||
if flag and not self.has_snapshot(name):
|
||||
raise Exception("some nodes miss snapshot,"
|
||||
" test should be interrupted")
|
||||
for node in self.get_nodes():
|
||||
node.revert(name)
|
||||
for nod in self.get_nodes():
|
||||
nod.revert(name)
|
||||
|
||||
for group in self.get_groups():
|
||||
for l2netdev in group.get_l2_network_devices():
|
||||
for grp in self.get_groups():
|
||||
for l2netdev in grp.get_l2_network_devices():
|
||||
l2netdev.unblock()
|
||||
|
||||
# NOTE: Does not work
|
||||
|
@ -268,7 +266,7 @@ class Environment(BaseModel):
|
|||
Reserved for backward compatibility only.
|
||||
Please use self.create_environment() instead.
|
||||
"""
|
||||
warn(
|
||||
warnings.warn(
|
||||
'describe_environment is deprecated in favor of '
|
||||
'DevopsClient.create_env_from_config', DeprecationWarning)
|
||||
|
||||
|
@ -340,7 +338,7 @@ class Environment(BaseModel):
|
|||
msg = ('router has been deprecated in favor of '
|
||||
'DevopsEnvironment.get_default_gw')
|
||||
logger.warning(msg)
|
||||
warn(msg, DeprecationWarning)
|
||||
warnings.warn(msg, DeprecationWarning)
|
||||
|
||||
from devops.client import DevopsClient
|
||||
env = DevopsClient().get_env(self.name)
|
||||
|
@ -358,7 +356,7 @@ class Environment(BaseModel):
|
|||
msg = ('get_admin_remote has been deprecated in favor of '
|
||||
'DevopsEnvironment.get_admin_remote')
|
||||
logger.warning(msg)
|
||||
warn(msg, DeprecationWarning)
|
||||
warnings.warn(msg, DeprecationWarning)
|
||||
|
||||
from devops.client import DevopsClient
|
||||
env = DevopsClient().get_env(self.name)
|
||||
|
@ -372,7 +370,7 @@ class Environment(BaseModel):
|
|||
msg = ('get_ssh_to_remote has been deprecated in favor of '
|
||||
'DevopsEnvironment.get_node_remote')
|
||||
logger.warning(msg)
|
||||
warn(msg, DeprecationWarning)
|
||||
warnings.warn(msg, DeprecationWarning)
|
||||
|
||||
from devops.client import DevopsClient
|
||||
env = DevopsClient().get_env(self.name)
|
||||
|
@ -386,21 +384,21 @@ class Environment(BaseModel):
|
|||
# @logwrap
|
||||
@staticmethod
|
||||
def get_ssh_to_remote_by_key(ip, keyfile):
|
||||
warn('LEGACY, for fuel-qa compatibility', DeprecationWarning)
|
||||
warnings.warn('LEGACY, for fuel-qa compatibility', DeprecationWarning)
|
||||
try:
|
||||
with open(keyfile) as f:
|
||||
keys = [RSAKey.from_private_key(f)]
|
||||
keys = [paramiko.RSAKey.from_private_key(f)]
|
||||
except IOError:
|
||||
logger.warning('Loading of SSH key from file failed. Trying to use'
|
||||
' SSH agent ...')
|
||||
keys = Agent().get_keys()
|
||||
keys = paramiko.Agent().get_keys()
|
||||
return ssh_client.SSHClient(
|
||||
ip,
|
||||
auth=ssh_client.SSHAuth(keys=keys))
|
||||
|
||||
# LEGACY, TO REMOVE (for fuel-qa compatibility)
|
||||
def nodes(self): # migrated from EnvironmentModel.nodes()
|
||||
warn(
|
||||
warnings.warn(
|
||||
'environment.nodes is deprecated in favor of'
|
||||
' environment.get_nodes', DeprecationWarning)
|
||||
# DEPRECATED. Please use environment.get_nodes() instead.
|
||||
|
@ -463,13 +461,13 @@ class Environment(BaseModel):
|
|||
|
||||
def get_env_l2_network_device(self, **kwargs):
|
||||
try:
|
||||
return L2NetworkDevice.objects.get(
|
||||
return network.L2NetworkDevice.objects.get(
|
||||
group__environment=self, **kwargs)
|
||||
except L2NetworkDevice.DoesNotExist:
|
||||
raise error.DevopsObjNotFound(L2NetworkDevice, **kwargs)
|
||||
except network.L2NetworkDevice.DoesNotExist:
|
||||
raise error.DevopsObjNotFound(network.L2NetworkDevice, **kwargs)
|
||||
|
||||
def get_env_l2_network_devices(self, **kwargs):
|
||||
return L2NetworkDevice.objects.filter(
|
||||
return network.L2NetworkDevice.objects.filter(
|
||||
group__environment=self, **kwargs).order_by('id')
|
||||
|
||||
# LEGACY, TO CHECK IN fuel-qa / PROXY
|
||||
|
@ -486,10 +484,11 @@ class Environment(BaseModel):
|
|||
|
||||
def get_node(self, *args, **kwargs):
|
||||
try:
|
||||
return Node.objects.get(*args, group__environment=self, **kwargs)
|
||||
except Node.DoesNotExist:
|
||||
raise error.DevopsObjNotFound(Node, *args, **kwargs)
|
||||
return node.Node.objects.get(
|
||||
*args, group__environment=self, **kwargs)
|
||||
except node.Node.DoesNotExist:
|
||||
raise error.DevopsObjNotFound(node.Node, *args, **kwargs)
|
||||
|
||||
def get_nodes(self, *args, **kwargs):
|
||||
return Node.objects.filter(
|
||||
return node.Node.objects.filter(
|
||||
*args, group__environment=self, **kwargs).order_by('id')
|
||||
|
|
|
@ -12,20 +12,19 @@
|
|||
# License for the specific language governing permissions and limitations
|
||||
# under the License.
|
||||
|
||||
from copy import deepcopy
|
||||
import copy
|
||||
|
||||
from django.db import models
|
||||
|
||||
from devops import error
|
||||
from devops import logger
|
||||
from devops.models.base import BaseModel
|
||||
from devops.models.network import L2NetworkDevice
|
||||
from devops.models.network import NetworkPool
|
||||
from devops.models.node import Node
|
||||
from devops.models.node import Volume
|
||||
from devops.models import base
|
||||
from devops.models import network
|
||||
from devops.models import node
|
||||
from devops.models import volume
|
||||
|
||||
|
||||
class Group(BaseModel):
|
||||
class Group(base.BaseModel):
|
||||
"""Groups nodes controlled by a specific driver"""
|
||||
|
||||
class Meta(object):
|
||||
|
@ -39,8 +38,8 @@ class Group(BaseModel):
|
|||
def get_l2_network_device(self, **kwargs):
|
||||
try:
|
||||
return self.l2networkdevice_set.get(**kwargs)
|
||||
except L2NetworkDevice.DoesNotExist:
|
||||
raise error.DevopsObjNotFound(L2NetworkDevice, **kwargs)
|
||||
except network.L2NetworkDevice.DoesNotExist:
|
||||
raise error.DevopsObjNotFound(network.L2NetworkDevice, **kwargs)
|
||||
|
||||
def get_l2_network_devices(self, **kwargs):
|
||||
return self.l2networkdevice_set.filter(**kwargs).order_by('id')
|
||||
|
@ -48,8 +47,8 @@ class Group(BaseModel):
|
|||
def get_network_pool(self, **kwargs):
|
||||
try:
|
||||
return self.networkpool_set.get(**kwargs)
|
||||
except NetworkPool.DoesNotExist:
|
||||
raise error.DevopsObjNotFound(NetworkPool, **kwargs)
|
||||
except network.NetworkPool.DoesNotExist:
|
||||
raise error.DevopsObjNotFound(network.NetworkPool, **kwargs)
|
||||
|
||||
def get_network_pools(self, **kwargs):
|
||||
return self.networkpool_set.filter(**kwargs).order_by('id')
|
||||
|
@ -57,8 +56,8 @@ class Group(BaseModel):
|
|||
def get_node(self, **kwargs):
|
||||
try:
|
||||
return self.node_set.get(**kwargs)
|
||||
except Node.DoesNotExist:
|
||||
raise error.DevopsObjNotFound(Node, **kwargs)
|
||||
except node.Node.DoesNotExist:
|
||||
raise error.DevopsObjNotFound(node.Node, **kwargs)
|
||||
|
||||
def get_nodes(self, **kwargs):
|
||||
return self.node_set.filter(**kwargs).order_by('id')
|
||||
|
@ -89,18 +88,18 @@ class Group(BaseModel):
|
|||
return all(n.has_snapshot(name) for n in self.get_nodes())
|
||||
|
||||
def define_volumes(self):
|
||||
for volume in self.get_volumes():
|
||||
volume.define()
|
||||
for vol in self.get_volumes():
|
||||
vol.define()
|
||||
|
||||
def define_networks(self):
|
||||
for l2_network_device in self.get_l2_network_devices():
|
||||
l2_network_device.define()
|
||||
|
||||
def define_nodes(self):
|
||||
for node in self.get_nodes():
|
||||
for volume in node.get_volumes():
|
||||
volume.define()
|
||||
node.define()
|
||||
for nod in self.get_nodes():
|
||||
for vol in nod.get_volumes():
|
||||
vol.define()
|
||||
nod.define()
|
||||
|
||||
def start_networks(self):
|
||||
for l2_network_device in self.get_l2_network_devices():
|
||||
|
@ -109,19 +108,19 @@ class Group(BaseModel):
|
|||
def start_nodes(self, nodes=None):
|
||||
if nodes is None:
|
||||
nodes = self.get_nodes()
|
||||
for node in nodes:
|
||||
node.start()
|
||||
for nod in nodes:
|
||||
nod.start()
|
||||
|
||||
def destroy(self, **kwargs):
|
||||
for node in self.get_nodes():
|
||||
node.destroy()
|
||||
for nod in self.get_nodes():
|
||||
nod.destroy()
|
||||
|
||||
def erase(self):
|
||||
for node in self.get_nodes():
|
||||
node.erase()
|
||||
for nod in self.get_nodes():
|
||||
nod.erase()
|
||||
|
||||
for volume in self.get_volumes():
|
||||
volume.erase()
|
||||
for vol in self.get_volumes():
|
||||
vol.erase()
|
||||
|
||||
for l2_network_device in self.get_l2_network_devices():
|
||||
l2_network_device.erase()
|
||||
|
@ -190,7 +189,7 @@ class Group(BaseModel):
|
|||
**node_cfg['params'])
|
||||
|
||||
def add_node(self, name, role=None, **params):
|
||||
new_params = deepcopy(params)
|
||||
new_params = copy.deepcopy(params)
|
||||
interfaces = new_params.pop('interfaces', [])
|
||||
network_configs = new_params.pop('network_config', {})
|
||||
volumes = new_params.pop('volumes', [])
|
||||
|
@ -219,7 +218,7 @@ class Group(BaseModel):
|
|||
address_pool = self.environment.get_address_pool(
|
||||
name=address_pool_name)
|
||||
|
||||
return NetworkPool.objects.create(
|
||||
return network.NetworkPool.objects.create(
|
||||
group=self,
|
||||
name=name,
|
||||
address_pool=address_pool,
|
||||
|
@ -242,8 +241,8 @@ class Group(BaseModel):
|
|||
def get_volume(self, **kwargs):
|
||||
try:
|
||||
return self.volume_set.get(**kwargs)
|
||||
except Volume.DoesNotExist:
|
||||
raise error.DevopsObjNotFound(Volume, **kwargs)
|
||||
except volume.Volume.DoesNotExist:
|
||||
raise error.DevopsObjNotFound(volume.Volume, **kwargs)
|
||||
|
||||
def get_volumes(self, **kwargs):
|
||||
return self.volume_set.filter(**kwargs)
|
||||
|
|
|
@ -18,19 +18,16 @@ from django.db import IntegrityError
|
|||
from django.db import models
|
||||
from django.db import transaction
|
||||
import jsonfield
|
||||
from netaddr import IPNetwork
|
||||
import netaddr
|
||||
|
||||
from devops.error import DevopsError
|
||||
from devops.helpers.helpers import generate_mac
|
||||
from devops.helpers.network import IpNetworksPool
|
||||
from devops import error
|
||||
from devops.helpers import helpers
|
||||
from devops.helpers import network
|
||||
from devops import logger
|
||||
from devops.models.base import BaseModel
|
||||
from devops.models.base import choices
|
||||
from devops.models.base import ParamedModel
|
||||
from devops.models.base import ParamField
|
||||
from devops.models import base
|
||||
|
||||
|
||||
class AddressPool(ParamedModel, BaseModel):
|
||||
class AddressPool(base.ParamedModel, base.BaseModel):
|
||||
"""Address pool
|
||||
|
||||
address_pools:
|
||||
|
@ -108,17 +105,17 @@ class AddressPool(ParamedModel, BaseModel):
|
|||
environment = models.ForeignKey('Environment')
|
||||
name = models.CharField(max_length=255)
|
||||
net = models.CharField(max_length=255, unique=True)
|
||||
vlan_start = ParamField()
|
||||
vlan_end = ParamField()
|
||||
tag = ParamField() # DEPRECATED, use vlan_start instead
|
||||
vlan_start = base.ParamField()
|
||||
vlan_end = base.ParamField()
|
||||
tag = base.ParamField() # DEPRECATED, use vlan_start instead
|
||||
|
||||
# ip_reserved = {'l2_network_device': 'm.m.m.50',
|
||||
# 'gateway': 'n.n.n.254', ...}
|
||||
ip_reserved = ParamField(default={})
|
||||
ip_reserved = base.ParamField(default={})
|
||||
|
||||
# ip_ranges = {'range_a': ('x.x.x.x', 'y.y.y.y'),
|
||||
# 'range_b': ('a.a.a.a', 'b.b.b.b'), ...}
|
||||
ip_ranges = ParamField(default={})
|
||||
ip_ranges = base.ParamField(default={})
|
||||
|
||||
# NEW. Warning: Old implementation returned self.net
|
||||
@property
|
||||
|
@ -127,7 +124,7 @@ class AddressPool(ParamedModel, BaseModel):
|
|||
|
||||
:return: IPNetwork()
|
||||
"""
|
||||
return IPNetwork(self.net)
|
||||
return netaddr.IPNetwork(self.net)
|
||||
|
||||
@property
|
||||
def gateway(self):
|
||||
|
@ -176,7 +173,7 @@ class AddressPool(ParamedModel, BaseModel):
|
|||
If range_name already exists, then DevopsError raises.
|
||||
"""
|
||||
if range_name in self.ip_ranges:
|
||||
raise DevopsError(
|
||||
raise error.DevopsError(
|
||||
"Setting IP range '{0}' for address pool '{1}' failed: range "
|
||||
"already exists".format(range_name, self.name))
|
||||
self.ip_ranges[range_name] = (ip_range_start, ip_range_end)
|
||||
|
@ -208,8 +205,9 @@ class AddressPool(ParamedModel, BaseModel):
|
|||
if already_exists:
|
||||
continue
|
||||
return ip
|
||||
raise DevopsError("No more free addresses in the address pool {0}"
|
||||
" with CIDR {1}".format(self.name, self.net))
|
||||
raise error.DevopsError(
|
||||
"No more free addresses in the address pool {0}"
|
||||
" with CIDR {1}".format(self.name, self.net))
|
||||
|
||||
@classmethod
|
||||
def _safe_create_network(cls, name, pool, environment, **params):
|
||||
|
@ -229,13 +227,14 @@ class AddressPool(ParamedModel, BaseModel):
|
|||
except IntegrityError as e:
|
||||
logger.debug(e)
|
||||
if 'name' in str(e):
|
||||
raise DevopsError(
|
||||
raise error.DevopsError(
|
||||
'AddressPool with name "{}" already exists'
|
||||
''.format(name))
|
||||
continue
|
||||
|
||||
raise DevopsError("There is no network pool available for creating "
|
||||
"address pool {}".format(name))
|
||||
raise error.DevopsError(
|
||||
"There is no network pool available for creating "
|
||||
"address pool {}".format(name))
|
||||
|
||||
@classmethod
|
||||
def address_pool_create(cls, name, environment, pool=None, **params):
|
||||
|
@ -244,8 +243,8 @@ class AddressPool(ParamedModel, BaseModel):
|
|||
:rtype : Network
|
||||
"""
|
||||
if pool is None:
|
||||
pool = IpNetworksPool(
|
||||
networks=[IPNetwork('10.0.0.0/16')],
|
||||
pool = network.IpNetworksPool(
|
||||
networks=[netaddr.IPNetwork('10.0.0.0/16')],
|
||||
prefix=24,
|
||||
allocated_networks=environment.get_allocated_networks())
|
||||
|
||||
|
@ -292,7 +291,7 @@ class AddressPool(ParamedModel, BaseModel):
|
|||
return address_pool
|
||||
|
||||
|
||||
class NetworkPool(BaseModel):
|
||||
class NetworkPool(base.BaseModel):
|
||||
"""Network pools for mapping logical (OpenStack) networks and AddressPools
|
||||
|
||||
This object is not used for environment creation, only for mapping some
|
||||
|
@ -422,7 +421,7 @@ class NetworkPool(BaseModel):
|
|||
return self.address_pool.net
|
||||
|
||||
|
||||
class L2NetworkDevice(ParamedModel, BaseModel):
|
||||
class L2NetworkDevice(base.ParamedModel, base.BaseModel):
|
||||
class Meta(object):
|
||||
db_table = 'devops_l2_network_device'
|
||||
app_label = 'devops'
|
||||
|
@ -480,7 +479,7 @@ class NetworkConfig(models.Model):
|
|||
parents = jsonfield.JSONField(default=[])
|
||||
|
||||
|
||||
class Interface(ParamedModel):
|
||||
class Interface(base.ParamedModel):
|
||||
class Meta(object):
|
||||
db_table = 'devops_interface'
|
||||
app_label = 'devops'
|
||||
|
@ -490,8 +489,8 @@ class Interface(ParamedModel):
|
|||
label = models.CharField(max_length=255, null=True)
|
||||
mac_address = models.CharField(max_length=255, unique=True, null=False)
|
||||
type = models.CharField(max_length=255, null=False)
|
||||
model = choices('virtio', 'e1000', 'pcnet', 'rtl8139', 'ne2k_pci')
|
||||
features = ParamField(default=[])
|
||||
model = base.choices('virtio', 'e1000', 'pcnet', 'rtl8139', 'ne2k_pci')
|
||||
features = base.ParamField(default=[])
|
||||
|
||||
@property
|
||||
def driver(self):
|
||||
|
@ -553,7 +552,7 @@ class Interface(ParamedModel):
|
|||
node=node,
|
||||
label=label,
|
||||
type=if_type,
|
||||
mac_address=mac_address or generate_mac(),
|
||||
mac_address=mac_address or helpers.generate_mac(),
|
||||
model=model,
|
||||
features=features or [])
|
||||
if (interface.l2_network_device and
|
||||
|
|
|
@ -15,24 +15,20 @@
|
|||
import functools
|
||||
|
||||
from django.db import models
|
||||
from django.utils.functional import cached_property
|
||||
from django.utils import functional
|
||||
import six
|
||||
|
||||
from devops import error
|
||||
from devops.helpers.helpers import tcp_ping_
|
||||
from devops.helpers.helpers import wait_pass
|
||||
from devops.helpers import helpers
|
||||
from devops.helpers import loader
|
||||
from devops.helpers.ssh_client import SSHClient
|
||||
from devops.helpers import ssh_client
|
||||
from devops import logger
|
||||
from devops.models.base import BaseModel
|
||||
from devops.models.base import ParamedModel
|
||||
from devops.models.base import ParamedModelType
|
||||
from devops.models.base import ParamField
|
||||
from devops.models.network import NetworkConfig
|
||||
from devops.models.volume import Volume
|
||||
from devops.models import base
|
||||
from devops.models import network
|
||||
from devops.models import volume
|
||||
|
||||
|
||||
class ExtendableNodeType(ParamedModelType):
|
||||
class ExtendableNodeType(base.ParamedModelType):
|
||||
"""Atomatically installs hooks on Node subclasses
|
||||
|
||||
This class dynamically installs hooks for specified methods,
|
||||
|
@ -81,6 +77,7 @@ class ExtendableNodeType(ParamedModelType):
|
|||
|
||||
METHOD_NAMES = ('define', 'start', 'destroy', 'remove')
|
||||
|
||||
# noinspection PyMethodParameters
|
||||
def __new__(cls, name, bases, attrs):
|
||||
super_new = super(ExtendableNodeType, cls).__new__
|
||||
|
||||
|
@ -137,7 +134,11 @@ class ExtendableNodeType(ParamedModelType):
|
|||
return method
|
||||
|
||||
|
||||
class Node(six.with_metaclass(ExtendableNodeType, ParamedModel, BaseModel)):
|
||||
class Node(
|
||||
six.with_metaclass(
|
||||
ExtendableNodeType,
|
||||
base.ParamedModel,
|
||||
base.BaseModel)):
|
||||
class Meta(object):
|
||||
unique_together = ('name', 'group')
|
||||
db_table = 'devops_node'
|
||||
|
@ -147,11 +148,11 @@ class Node(six.with_metaclass(ExtendableNodeType, ParamedModel, BaseModel)):
|
|||
name = models.CharField(max_length=255, unique=False, null=False)
|
||||
role = models.CharField(max_length=255, null=True)
|
||||
|
||||
kernel_cmd = ParamField()
|
||||
ssh_port = ParamField(default=22)
|
||||
bootstrap_timeout = ParamField(default=600)
|
||||
deploy_timeout = ParamField(default=3600)
|
||||
deploy_check_cmd = ParamField()
|
||||
kernel_cmd = base.ParamField()
|
||||
ssh_port = base.ParamField(default=22)
|
||||
bootstrap_timeout = base.ParamField(default=600)
|
||||
deploy_timeout = base.ParamField(default=3600)
|
||||
deploy_check_cmd = base.ParamField()
|
||||
|
||||
@property
|
||||
def driver(self):
|
||||
|
@ -164,7 +165,7 @@ class Node(six.with_metaclass(ExtendableNodeType, ParamedModel, BaseModel)):
|
|||
|
||||
return drv
|
||||
|
||||
@cached_property
|
||||
@functional.cached_property
|
||||
def ext(self):
|
||||
try:
|
||||
ExtCls = loader.load_class(
|
||||
|
@ -185,20 +186,20 @@ class Node(six.with_metaclass(ExtendableNodeType, ParamedModel, BaseModel)):
|
|||
pass
|
||||
|
||||
def destroy(self, *args, **kwargs):
|
||||
SSHClient.close_connections()
|
||||
ssh_client.SSHClient.close_connections()
|
||||
|
||||
def erase(self, *args, **kwargs):
|
||||
self.remove()
|
||||
|
||||
def remove(self, *args, **kwargs):
|
||||
SSHClient.close_connections()
|
||||
ssh_client.SSHClient.close_connections()
|
||||
self.erase_volumes()
|
||||
for iface in self.interfaces:
|
||||
iface.remove()
|
||||
self.delete()
|
||||
|
||||
def suspend(self, *args, **kwargs):
|
||||
SSHClient.close_connections()
|
||||
ssh_client.SSHClient.close_connections()
|
||||
|
||||
def resume(self, *args, **kwargs):
|
||||
pass
|
||||
|
@ -207,10 +208,10 @@ class Node(six.with_metaclass(ExtendableNodeType, ParamedModel, BaseModel)):
|
|||
return False
|
||||
|
||||
def snapshot(self, *args, **kwargs):
|
||||
SSHClient.close_connections()
|
||||
ssh_client.SSHClient.close_connections()
|
||||
|
||||
def revert(self, *args, **kwargs):
|
||||
SSHClient.close_connections()
|
||||
ssh_client.SSHClient.close_connections()
|
||||
|
||||
# for fuel-qa compatibility
|
||||
def has_snapshot(self, *args, **kwargs):
|
||||
|
@ -220,10 +221,10 @@ class Node(six.with_metaclass(ExtendableNodeType, ParamedModel, BaseModel)):
|
|||
pass
|
||||
|
||||
def shutdown(self):
|
||||
SSHClient.close_connections()
|
||||
ssh_client.SSHClient.close_connections()
|
||||
|
||||
def reset(self):
|
||||
SSHClient.close_connections()
|
||||
ssh_client.SSHClient.close_connections()
|
||||
|
||||
def get_vnc_port(self):
|
||||
return None
|
||||
|
@ -303,7 +304,7 @@ class Node(six.with_metaclass(ExtendableNodeType, ParamedModel, BaseModel)):
|
|||
|
||||
:rtype : SSHClient
|
||||
"""
|
||||
return SSHClient(
|
||||
return ssh_client.SSHClient(
|
||||
self.get_ip_address_by_network_name(network_name),
|
||||
username=login,
|
||||
password=password, private_keys=private_keys, auth=auth)
|
||||
|
@ -311,8 +312,8 @@ class Node(six.with_metaclass(ExtendableNodeType, ParamedModel, BaseModel)):
|
|||
# LEGACY
|
||||
# NOTE: this method works only for master node
|
||||
def await(self, network_name, timeout=120, by_port=22):
|
||||
wait_pass(
|
||||
lambda: tcp_ping_(
|
||||
helpers.wait_pass(
|
||||
lambda: helpers.tcp_ping_(
|
||||
self.get_ip_address_by_network_name(network_name), by_port),
|
||||
timeout=timeout)
|
||||
|
||||
|
@ -369,7 +370,7 @@ class Node(six.with_metaclass(ExtendableNodeType, ParamedModel, BaseModel)):
|
|||
networks = []
|
||||
if parents is None:
|
||||
parents = []
|
||||
NetworkConfig.objects.create(
|
||||
network.NetworkConfig.objects.create(
|
||||
node=self,
|
||||
label=label,
|
||||
networks=networks,
|
||||
|
@ -423,8 +424,8 @@ class Node(six.with_metaclass(ExtendableNodeType, ParamedModel, BaseModel)):
|
|||
def get_volume(self, **kwargs):
|
||||
try:
|
||||
return self.volume_set.get(**kwargs)
|
||||
except Volume.DoesNotExist:
|
||||
raise error.DevopsObjNotFound(Volume, **kwargs)
|
||||
except volume.Volume.DoesNotExist:
|
||||
raise error.DevopsObjNotFound(volume.Volume, **kwargs)
|
||||
|
||||
# NEW
|
||||
def get_volumes(self, **kwargs):
|
||||
|
@ -432,5 +433,5 @@ class Node(six.with_metaclass(ExtendableNodeType, ParamedModel, BaseModel)):
|
|||
|
||||
# NEW
|
||||
def erase_volumes(self):
|
||||
for volume in self.get_volumes():
|
||||
volume.erase()
|
||||
for vol in self.get_volumes():
|
||||
vol.erase()
|
||||
|
|
|
@ -14,12 +14,10 @@
|
|||
|
||||
from django.db import models
|
||||
|
||||
from devops.models.base import BaseModel
|
||||
from devops.models.base import ParamedModel
|
||||
from devops.models.base import ParamField
|
||||
from devops.models import base
|
||||
|
||||
|
||||
class Volume(ParamedModel, BaseModel):
|
||||
class Volume(base.ParamedModel, base.BaseModel):
|
||||
class Meta(object):
|
||||
unique_together = (('name', 'node'), ('name', 'group'))
|
||||
db_table = 'devops_volume'
|
||||
|
@ -44,7 +42,7 @@ class Volume(ParamedModel, BaseModel):
|
|||
self.delete()
|
||||
|
||||
|
||||
class DiskDevice(ParamedModel):
|
||||
class DiskDevice(base.ParamedModel):
|
||||
class Meta(object):
|
||||
db_table = 'devops_diskdevice'
|
||||
app_label = 'devops'
|
||||
|
@ -55,7 +53,7 @@ class DiskDevice(ParamedModel):
|
|||
# TODO(astudenov): temporarily added for ipmi driver
|
||||
# and driverless testcase. These fields should be removed
|
||||
# after refactoring of volume section in themplate
|
||||
device = ParamField()
|
||||
type = ParamField()
|
||||
bus = ParamField()
|
||||
target_dev = ParamField()
|
||||
device = base.ParamField()
|
||||
type = base.ParamField()
|
||||
bus = base.ParamField()
|
||||
target_dev = base.ParamField()
|
||||
|
|
|
@ -113,9 +113,9 @@ class TestIPMITemplate(TestCase):
|
|||
self.full_conf = yaml.load(ENV_TMPLT)
|
||||
self.env = Environment.create_environment(self.full_conf)
|
||||
self.ipmiclient_mock = self.patch(
|
||||
'devops.driver.baremetal.ipmi_driver.IpmiClient')
|
||||
'devops.driver.baremetal.ipmi_client.IpmiClient')
|
||||
self.wait_mock = self.patch(
|
||||
'devops.driver.baremetal.ipmi_driver.wait')
|
||||
'devops.helpers.helpers.wait')
|
||||
self.ipmiclient1 = mock.Mock(spec=IpmiClient)
|
||||
self.ipmiclient2 = mock.Mock(spec=IpmiClient)
|
||||
|
||||
|
@ -131,20 +131,20 @@ class TestIPMITemplate(TestCase):
|
|||
def test_db(self):
|
||||
"""Tets DB """
|
||||
node = self.env.get_node(name='slave-01')
|
||||
assert(node.ipmi_user) == 'user1'
|
||||
assert (node.ipmi_password) == 'pass1'
|
||||
assert (node.ipmi_previlegies) == 'OPERATOR'
|
||||
assert (node.ipmi_host) == 'ipmi-1.host.address.net'
|
||||
assert (node.ipmi_lan_interface) == 'lanplus'
|
||||
assert (node.ipmi_port) == 623
|
||||
assert node.ipmi_user == 'user1'
|
||||
assert node.ipmi_password == 'pass1'
|
||||
assert node.ipmi_previlegies == 'OPERATOR'
|
||||
assert node.ipmi_host == 'ipmi-1.host.address.net'
|
||||
assert node.ipmi_lan_interface == 'lanplus'
|
||||
assert node.ipmi_port == 623
|
||||
|
||||
node2 = self.env.get_node(name='slave-02')
|
||||
assert (node2.ipmi_user) == 'user2'
|
||||
assert (node2.ipmi_password) == 'pass2'
|
||||
assert (node2.ipmi_previlegies) == 'OPERATOR'
|
||||
assert (node2.ipmi_host) == 'ipmi-2.host.address.net'
|
||||
assert (node2.ipmi_lan_interface) == 'lanplus'
|
||||
assert (node2.ipmi_port) == 623
|
||||
assert node2.ipmi_user == 'user2'
|
||||
assert node2.ipmi_password == 'pass2'
|
||||
assert node2.ipmi_previlegies == 'OPERATOR'
|
||||
assert node2.ipmi_host == 'ipmi-2.host.address.net'
|
||||
assert node2.ipmi_lan_interface == 'lanplus'
|
||||
assert node2.ipmi_port == 623
|
||||
|
||||
def test_life_cycle(self):
|
||||
"""Test lifecycle """
|
||||
|
|
|
@ -32,10 +32,9 @@ class TestIpmiNode(TestCase):
|
|||
|
||||
# Create Environment
|
||||
self.ipmiclient_mock = self.patch(
|
||||
'devops.driver.baremetal.ipmi_driver.IpmiClient', autospec=True)
|
||||
'devops.driver.baremetal.ipmi_client.IpmiClient', autospec=True)
|
||||
self.ipmiclient = self.ipmiclient_mock.return_value
|
||||
self.wait_mock = self.patch(
|
||||
'devops.driver.baremetal.ipmi_driver.wait')
|
||||
self.wait_mock = self.patch('devops.helpers.helpers.wait')
|
||||
|
||||
self.env = Environment.create('test_env')
|
||||
self.group = self.env.add_group(
|
||||
|
|
|
@ -19,6 +19,7 @@ import libvirt
|
|||
import mock
|
||||
from netaddr import IPNetwork
|
||||
|
||||
# noinspection PyProtectedMember
|
||||
from devops.driver.libvirt.libvirt_driver import _LibvirtManager
|
||||
from devops.driver.libvirt.libvirt_driver import LibvirtDriver
|
||||
from devops.models import Environment
|
||||
|
|
|
@ -89,7 +89,7 @@ class TestLibvirtL2NetworkDevice(LibvirtTestCase):
|
|||
assert self.l2_net_dev.exists() is False
|
||||
|
||||
# speed up retry
|
||||
@mock.patch('devops.helpers.retry.sleep')
|
||||
@mock.patch('time.sleep')
|
||||
def test_remove_active(self, sleep_mock):
|
||||
self.l2_net_dev.define()
|
||||
self.l2_net_dev.start()
|
||||
|
|
|
@ -29,9 +29,7 @@ class TestLibvirtNode(LibvirtTestCase):
|
|||
def setUp(self):
|
||||
super(TestLibvirtNode, self).setUp()
|
||||
|
||||
self.sleep_mock = self.patch('devops.helpers.retry.sleep')
|
||||
self.libvirt_sleep_mock = self.patch(
|
||||
'devops.driver.libvirt.libvirt_driver.sleep')
|
||||
self.sleep_mock = self.patch('time.sleep')
|
||||
|
||||
self.env = Environment.create('test_env')
|
||||
self.group = self.env.add_group(
|
||||
|
@ -212,7 +210,7 @@ class TestLibvirtNode(LibvirtTestCase):
|
|||
mock.call(0, 0, [4], 1, 0),
|
||||
mock.call(0, 0, [28], 1, 0),
|
||||
])
|
||||
self.libvirt_sleep_mock.assert_called_once_with(1)
|
||||
self.sleep_mock.assert_called_once_with(1)
|
||||
|
||||
def test_start_reboot(self):
|
||||
self.node.define()
|
||||
|
|
|
@ -44,7 +44,7 @@ class TestCloudImage(LibvirtTestCase):
|
|||
self.os_mock.stat.side_effect = self.file_sizes.get
|
||||
|
||||
self.generate_cloud_image_settings_mock = self.patch(
|
||||
'devops.driver.libvirt.libvirt_driver'
|
||||
'devops.helpers.cloud_image_settings'
|
||||
'.generate_cloud_image_settings')
|
||||
|
||||
self.volume_upload_mock = self.patch(
|
||||
|
|
|
@ -23,9 +23,7 @@ class TestLibvirtNodeMultipath(LibvirtTestCase):
|
|||
def setUp(self):
|
||||
super(TestLibvirtNodeMultipath, self).setUp()
|
||||
|
||||
self.sleep_mock = self.patch('devops.helpers.retry.sleep')
|
||||
self.libvirt_sleep_mock = self.patch(
|
||||
'devops.driver.libvirt.libvirt_driver.sleep')
|
||||
self.sleep_mock = self.patch('time.sleep')
|
||||
|
||||
self.env = Environment.create('test_env')
|
||||
self.group = self.env.add_group(
|
||||
|
|
|
@ -30,9 +30,7 @@ class TestLibvirtNodeSnapshotBase(LibvirtTestCase):
|
|||
def setUp(self):
|
||||
super(TestLibvirtNodeSnapshotBase, self).setUp()
|
||||
|
||||
self.sleep_mock = self.patch('devops.helpers.retry.sleep')
|
||||
self.libvirt_sleep_mock = self.patch(
|
||||
'devops.driver.libvirt.libvirt_driver.sleep')
|
||||
self.sleep_mock = self.patch('time.sleep')
|
||||
|
||||
self.nwfilter = self.libvirt_nwfilter_lookup_mock.return_value
|
||||
self.nwfilter.XMLDesc.return_value = (
|
||||
|
@ -125,6 +123,7 @@ class TestLibvirtNodeSnapshot(TestLibvirtNodeSnapshotBase):
|
|||
assert snapshot.memory_file is None
|
||||
assert snapshot.name == 'test1'
|
||||
with self.assertRaises(libvirt.libvirtError):
|
||||
# noinspection PyStatementEffect
|
||||
snapshot.parent
|
||||
assert snapshot.state == 'shutoff'
|
||||
|
||||
|
|
|
@ -229,7 +229,7 @@ class TestLibvirtTemplate(LibvirtTestCase):
|
|||
super(TestLibvirtTemplate, self).setUp()
|
||||
|
||||
# speed up retry
|
||||
self.sleep_mock = self.patch('devops.helpers.retry.sleep')
|
||||
self.sleep_mock = self.patch('time.sleep')
|
||||
|
||||
# mock open
|
||||
self.open_mock = mock.mock_open(read_data='image_data')
|
||||
|
|
|
@ -26,7 +26,7 @@ class TestLibvirtVolume(LibvirtTestCase):
|
|||
def setUp(self):
|
||||
super(TestLibvirtVolume, self).setUp()
|
||||
|
||||
self.sleep_mock = self.patch('devops.helpers.retry.sleep')
|
||||
self.sleep_mock = self.patch('time.sleep')
|
||||
|
||||
self.open_mock = mock.mock_open(read_data='image_data')
|
||||
self.patch('devops.driver.libvirt.libvirt_driver.open',
|
||||
|
|
|
@ -25,7 +25,7 @@ class TestLibvirtVolumeBackingStore(LibvirtTestCase):
|
|||
def setUp(self):
|
||||
super(TestLibvirtVolumeBackingStore, self).setUp()
|
||||
|
||||
self.sleep_mock = self.patch('devops.helpers.retry.sleep')
|
||||
self.sleep_mock = self.patch('time.sleep')
|
||||
|
||||
self.open_mock = mock.mock_open(read_data='image_data')
|
||||
self.patch('devops.driver.libvirt.libvirt_driver.open',
|
||||
|
|
|
@ -32,7 +32,7 @@ class TestCloudImageSettings(unittest.TestCase):
|
|||
|
||||
def setUp(self):
|
||||
self.subprocess_mock = self.patch(
|
||||
'devops.helpers.cloud_image_settings.Subprocess', autospec=True)
|
||||
'devops.helpers.subprocess_runner.Subprocess', autospec=True)
|
||||
|
||||
self.os_mock = self.patch(
|
||||
'devops.helpers.cloud_image_settings.os', autospec=True)
|
||||
|
|
|
@ -30,7 +30,7 @@ class TestRetry(TestCase):
|
|||
|
||||
def setUp(self):
|
||||
self.sleep_mock = self.patch(
|
||||
'devops.helpers.retry.sleep')
|
||||
'time.sleep')
|
||||
|
||||
def create_class_with_retry(self, count, delay):
|
||||
class MyClass(object):
|
||||
|
|
|
@ -82,7 +82,7 @@ class TestCentosMasterExt(LibvirtTestCase):
|
|||
'devops.models.node_ext.centos_master.wait_tcp')
|
||||
|
||||
@mock.patch(
|
||||
'devops.helpers.cloud_image_settings.Subprocess', autospec=True)
|
||||
'devops.helpers.subprocess_runner.Subprocess', autospec=True)
|
||||
@mock.patch('devops.driver.libvirt.libvirt_driver.uuid')
|
||||
@mock.patch('libvirt.virConnect.defineXML')
|
||||
@mock.patch.multiple(settings, CLOUD_IMAGE_DIR='/tmp/')
|
||||
|
|
Loading…
Reference in New Issue