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:
Alexey Stepanov 2016-09-08 14:02:36 +03:00
parent 8877bd8b6c
commit 66a89d8eb9
32 changed files with 461 additions and 466 deletions

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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