trunk merge
This commit is contained in:
@@ -1098,6 +1098,70 @@ class ImageCommands(object):
|
|||||||
self._convert_images(machine_images)
|
self._convert_images(machine_images)
|
||||||
|
|
||||||
|
|
||||||
|
class AgentBuildCommands(object):
|
||||||
|
"""Class for managing agent builds."""
|
||||||
|
|
||||||
|
def create(self, os, architecture, version, url, md5hash,
|
||||||
|
hypervisor='xen'):
|
||||||
|
"""Creates a new agent build.
|
||||||
|
arguments: os architecture version url md5hash [hypervisor='xen']"""
|
||||||
|
ctxt = context.get_admin_context()
|
||||||
|
agent_build = db.agent_build_create(ctxt,
|
||||||
|
{'hypervisor': hypervisor,
|
||||||
|
'os': os,
|
||||||
|
'architecture': architecture,
|
||||||
|
'version': version,
|
||||||
|
'url': url,
|
||||||
|
'md5hash': md5hash})
|
||||||
|
|
||||||
|
def delete(self, os, architecture, hypervisor='xen'):
|
||||||
|
"""Deletes an existing agent build.
|
||||||
|
arguments: os architecture [hypervisor='xen']"""
|
||||||
|
ctxt = context.get_admin_context()
|
||||||
|
agent_build_ref = db.agent_build_get_by_triple(ctxt,
|
||||||
|
hypervisor, os, architecture)
|
||||||
|
db.agent_build_destroy(ctxt, agent_build_ref['id'])
|
||||||
|
|
||||||
|
def list(self, hypervisor=None):
|
||||||
|
"""Lists all agent builds.
|
||||||
|
arguments: <none>"""
|
||||||
|
fmt = "%-10s %-8s %12s %s"
|
||||||
|
ctxt = context.get_admin_context()
|
||||||
|
by_hypervisor = {}
|
||||||
|
for agent_build in db.agent_build_get_all(ctxt):
|
||||||
|
buildlist = by_hypervisor.get(agent_build.hypervisor)
|
||||||
|
if not buildlist:
|
||||||
|
buildlist = by_hypervisor[agent_build.hypervisor] = []
|
||||||
|
|
||||||
|
buildlist.append(agent_build)
|
||||||
|
|
||||||
|
for key, buildlist in by_hypervisor.iteritems():
|
||||||
|
if hypervisor and key != hypervisor:
|
||||||
|
continue
|
||||||
|
|
||||||
|
print "Hypervisor: %s" % key
|
||||||
|
print fmt % ('-' * 10, '-' * 8, '-' * 12, '-' * 32)
|
||||||
|
for agent_build in buildlist:
|
||||||
|
print fmt % (agent_build.os, agent_build.architecture,
|
||||||
|
agent_build.version, agent_build.md5hash)
|
||||||
|
print ' %s' % agent_build.url
|
||||||
|
|
||||||
|
print
|
||||||
|
|
||||||
|
def modify(self, os, architecture, version, url, md5hash,
|
||||||
|
hypervisor='xen'):
|
||||||
|
"""Update an existing agent build.
|
||||||
|
arguments: os architecture version url md5hash [hypervisor='xen']
|
||||||
|
"""
|
||||||
|
ctxt = context.get_admin_context()
|
||||||
|
agent_build_ref = db.agent_build_get_by_triple(ctxt,
|
||||||
|
hypervisor, os, architecture)
|
||||||
|
db.agent_build_update(ctxt, agent_build_ref['id'],
|
||||||
|
{'version': version,
|
||||||
|
'url': url,
|
||||||
|
'md5hash': md5hash})
|
||||||
|
|
||||||
|
|
||||||
class ConfigCommands(object):
|
class ConfigCommands(object):
|
||||||
"""Class for exposing the flags defined by flag_file(s)."""
|
"""Class for exposing the flags defined by flag_file(s)."""
|
||||||
|
|
||||||
@@ -1110,6 +1174,7 @@ class ConfigCommands(object):
|
|||||||
|
|
||||||
CATEGORIES = [
|
CATEGORIES = [
|
||||||
('account', AccountCommands),
|
('account', AccountCommands),
|
||||||
|
('agent', AgentBuildCommands),
|
||||||
('config', ConfigCommands),
|
('config', ConfigCommands),
|
||||||
('db', DbCommands),
|
('db', DbCommands),
|
||||||
('fixed', FixedIpCommands),
|
('fixed', FixedIpCommands),
|
||||||
|
|||||||
@@ -280,6 +280,14 @@ class ComputeTestCase(test.TestCase):
|
|||||||
"File Contents")
|
"File Contents")
|
||||||
self.compute.terminate_instance(self.context, instance_id)
|
self.compute.terminate_instance(self.context, instance_id)
|
||||||
|
|
||||||
|
def test_agent_update(self):
|
||||||
|
"""Ensure instance can have its agent updated"""
|
||||||
|
instance_id = self._create_instance()
|
||||||
|
self.compute.run_instance(self.context, instance_id)
|
||||||
|
self.compute.agent_update(self.context, instance_id,
|
||||||
|
'http://127.0.0.1/agent', '00112233445566778899aabbccddeeff')
|
||||||
|
self.compute.terminate_instance(self.context, instance_id)
|
||||||
|
|
||||||
def test_snapshot(self):
|
def test_snapshot(self):
|
||||||
"""Ensure instance can be snapshotted"""
|
"""Ensure instance can be snapshotted"""
|
||||||
instance_id = self._create_instance()
|
instance_id = self._create_instance()
|
||||||
|
|||||||
@@ -37,9 +37,8 @@ from nova import exception
|
|||||||
from nova.virt import xenapi_conn
|
from nova.virt import xenapi_conn
|
||||||
from nova.virt.xenapi import fake as xenapi_fake
|
from nova.virt.xenapi import fake as xenapi_fake
|
||||||
from nova.virt.xenapi import volume_utils
|
from nova.virt.xenapi import volume_utils
|
||||||
|
from nova.virt.xenapi import vmops
|
||||||
from nova.virt.xenapi import vm_utils
|
from nova.virt.xenapi import vm_utils
|
||||||
from nova.virt.xenapi.vmops import SimpleDH
|
|
||||||
from nova.virt.xenapi.vmops import VMOps
|
|
||||||
from nova.tests.db import fakes as db_fakes
|
from nova.tests.db import fakes as db_fakes
|
||||||
from nova.tests.xenapi import stubs
|
from nova.tests.xenapi import stubs
|
||||||
from nova.tests.glance import stubs as glance_stubs
|
from nova.tests.glance import stubs as glance_stubs
|
||||||
@@ -84,7 +83,8 @@ class XenAPIVolumeTestCase(test.TestCase):
|
|||||||
'kernel_id': 2,
|
'kernel_id': 2,
|
||||||
'ramdisk_id': 3,
|
'ramdisk_id': 3,
|
||||||
'instance_type_id': '3', # m1.large
|
'instance_type_id': '3', # m1.large
|
||||||
'os_type': 'linux'}
|
'os_type': 'linux',
|
||||||
|
'architecture': 'x86-64'}
|
||||||
|
|
||||||
def _create_volume(self, size='0'):
|
def _create_volume(self, size='0'):
|
||||||
"""Create a volume object."""
|
"""Create a volume object."""
|
||||||
@@ -191,7 +191,7 @@ class XenAPIVMTestCase(test.TestCase):
|
|||||||
stubs.stubout_get_this_vm_uuid(self.stubs)
|
stubs.stubout_get_this_vm_uuid(self.stubs)
|
||||||
stubs.stubout_stream_disk(self.stubs)
|
stubs.stubout_stream_disk(self.stubs)
|
||||||
stubs.stubout_is_vdi_pv(self.stubs)
|
stubs.stubout_is_vdi_pv(self.stubs)
|
||||||
self.stubs.Set(VMOps, 'reset_network', reset_network)
|
self.stubs.Set(vmops.VMOps, 'reset_network', reset_network)
|
||||||
stubs.stub_out_vm_methods(self.stubs)
|
stubs.stub_out_vm_methods(self.stubs)
|
||||||
glance_stubs.stubout_glance_client(self.stubs)
|
glance_stubs.stubout_glance_client(self.stubs)
|
||||||
fake_utils.stub_out_utils_execute(self.stubs)
|
fake_utils.stub_out_utils_execute(self.stubs)
|
||||||
@@ -210,7 +210,8 @@ class XenAPIVMTestCase(test.TestCase):
|
|||||||
'kernel_id': 2,
|
'kernel_id': 2,
|
||||||
'ramdisk_id': 3,
|
'ramdisk_id': 3,
|
||||||
'instance_type_id': '3', # m1.large
|
'instance_type_id': '3', # m1.large
|
||||||
'os_type': 'linux'}
|
'os_type': 'linux',
|
||||||
|
'architecture': 'x86-64'}
|
||||||
network_info = [({'bridge': 'fa0', 'id': 0, 'injected': False},
|
network_info = [({'bridge': 'fa0', 'id': 0, 'injected': False},
|
||||||
{'broadcast': '192.168.0.255',
|
{'broadcast': '192.168.0.255',
|
||||||
'dns': ['192.168.0.1'],
|
'dns': ['192.168.0.1'],
|
||||||
@@ -382,7 +383,8 @@ class XenAPIVMTestCase(test.TestCase):
|
|||||||
|
|
||||||
def _test_spawn(self, image_ref, kernel_id, ramdisk_id,
|
def _test_spawn(self, image_ref, kernel_id, ramdisk_id,
|
||||||
instance_type_id="3", os_type="linux",
|
instance_type_id="3", os_type="linux",
|
||||||
instance_id=1, check_injection=False, create_record=True):
|
architecture="x86-64", instance_id=1,
|
||||||
|
check_injection=False):
|
||||||
stubs.stubout_loopingcall_start(self.stubs)
|
stubs.stubout_loopingcall_start(self.stubs)
|
||||||
values = {'id': instance_id,
|
values = {'id': instance_id,
|
||||||
'project_id': self.project.id,
|
'project_id': self.project.id,
|
||||||
@@ -391,28 +393,28 @@ class XenAPIVMTestCase(test.TestCase):
|
|||||||
'kernel_id': kernel_id,
|
'kernel_id': kernel_id,
|
||||||
'ramdisk_id': ramdisk_id,
|
'ramdisk_id': ramdisk_id,
|
||||||
'instance_type_id': instance_type_id,
|
'instance_type_id': instance_type_id,
|
||||||
'os_type': os_type}
|
'os_type': os_type,
|
||||||
if create_record:
|
'architecture': architecture}
|
||||||
instance = db.instance_create(self.context, values)
|
instance = db.instance_create(self.context, values)
|
||||||
network_info = [({'bridge': 'fa0', 'id': 0, 'injected': True},
|
network_info = [({'bridge': 'fa0', 'id': 0, 'injected': True},
|
||||||
{'broadcast': '192.168.0.255',
|
{'broadcast': '192.168.0.255',
|
||||||
'dns': ['192.168.0.1'],
|
'dns': ['192.168.0.1'],
|
||||||
'gateway': '192.168.0.1',
|
'gateway': '192.168.0.1',
|
||||||
'gateway6': 'dead:beef::1',
|
'gateway6': 'dead:beef::1',
|
||||||
'ip6s': [{'enabled': '1',
|
'ip6s': [{'enabled': '1',
|
||||||
'ip': 'dead:beef::dcad:beff:feef:0',
|
'ip': 'dead:beef::dcad:beff:feef:0',
|
||||||
'netmask': '64'}],
|
'netmask': '64'}],
|
||||||
'ips': [{'enabled': '1',
|
'ips': [{'enabled': '1',
|
||||||
'ip': '192.168.0.100',
|
'ip': '192.168.0.100',
|
||||||
'netmask': '255.255.255.0'}],
|
'netmask': '255.255.255.0'}],
|
||||||
'label': 'fake',
|
'label': 'fake',
|
||||||
'mac': 'DE:AD:BE:EF:00:00',
|
'mac': 'DE:AD:BE:EF:00:00',
|
||||||
'rxtx_cap': 3})]
|
'rxtx_cap': 3})]
|
||||||
self.conn.spawn(instance, network_info)
|
self.conn.spawn(instance, network_info)
|
||||||
else:
|
|
||||||
instance = db.instance_get(self.context, instance_id)
|
|
||||||
self.create_vm_record(self.conn, os_type, instance_id)
|
self.create_vm_record(self.conn, os_type, instance_id)
|
||||||
self.check_vm_record(self.conn, check_injection)
|
self.check_vm_record(self.conn, check_injection)
|
||||||
|
self.assertTrue(instance.os_type)
|
||||||
|
self.assertTrue(instance.architecture)
|
||||||
|
|
||||||
def test_spawn_not_enough_memory(self):
|
def test_spawn_not_enough_memory(self):
|
||||||
FLAGS.xenapi_image_service = 'glance'
|
FLAGS.xenapi_image_service = 'glance'
|
||||||
@@ -437,7 +439,7 @@ class XenAPIVMTestCase(test.TestCase):
|
|||||||
def test_spawn_vhd_glance_linux(self):
|
def test_spawn_vhd_glance_linux(self):
|
||||||
FLAGS.xenapi_image_service = 'glance'
|
FLAGS.xenapi_image_service = 'glance'
|
||||||
self._test_spawn(glance_stubs.FakeGlance.IMAGE_VHD, None, None,
|
self._test_spawn(glance_stubs.FakeGlance.IMAGE_VHD, None, None,
|
||||||
os_type="linux")
|
os_type="linux", architecture="x86-64")
|
||||||
self.check_vm_params_for_linux()
|
self.check_vm_params_for_linux()
|
||||||
|
|
||||||
def test_spawn_vhd_glance_swapdisk(self):
|
def test_spawn_vhd_glance_swapdisk(self):
|
||||||
@@ -466,7 +468,7 @@ class XenAPIVMTestCase(test.TestCase):
|
|||||||
def test_spawn_vhd_glance_windows(self):
|
def test_spawn_vhd_glance_windows(self):
|
||||||
FLAGS.xenapi_image_service = 'glance'
|
FLAGS.xenapi_image_service = 'glance'
|
||||||
self._test_spawn(glance_stubs.FakeGlance.IMAGE_VHD, None, None,
|
self._test_spawn(glance_stubs.FakeGlance.IMAGE_VHD, None, None,
|
||||||
os_type="windows")
|
os_type="windows", architecture="i386")
|
||||||
self.check_vm_params_for_windows()
|
self.check_vm_params_for_windows()
|
||||||
|
|
||||||
def test_spawn_glance(self):
|
def test_spawn_glance(self):
|
||||||
@@ -630,7 +632,8 @@ class XenAPIVMTestCase(test.TestCase):
|
|||||||
'kernel_id': 2,
|
'kernel_id': 2,
|
||||||
'ramdisk_id': 3,
|
'ramdisk_id': 3,
|
||||||
'instance_type_id': '3', # m1.large
|
'instance_type_id': '3', # m1.large
|
||||||
'os_type': 'linux'}
|
'os_type': 'linux',
|
||||||
|
'architecture': 'x86-64'}
|
||||||
instance = db.instance_create(self.context, values)
|
instance = db.instance_create(self.context, values)
|
||||||
network_info = [({'bridge': 'fa0', 'id': 0, 'injected': False},
|
network_info = [({'bridge': 'fa0', 'id': 0, 'injected': False},
|
||||||
{'broadcast': '192.168.0.255',
|
{'broadcast': '192.168.0.255',
|
||||||
@@ -654,8 +657,8 @@ class XenAPIDiffieHellmanTestCase(test.TestCase):
|
|||||||
"""Unit tests for Diffie-Hellman code."""
|
"""Unit tests for Diffie-Hellman code."""
|
||||||
def setUp(self):
|
def setUp(self):
|
||||||
super(XenAPIDiffieHellmanTestCase, self).setUp()
|
super(XenAPIDiffieHellmanTestCase, self).setUp()
|
||||||
self.alice = SimpleDH()
|
self.alice = vmops.SimpleDH()
|
||||||
self.bob = SimpleDH()
|
self.bob = vmops.SimpleDH()
|
||||||
|
|
||||||
def test_shared(self):
|
def test_shared(self):
|
||||||
alice_pub = self.alice.get_public()
|
alice_pub = self.alice.get_public()
|
||||||
@@ -718,7 +721,8 @@ class XenAPIMigrateInstance(test.TestCase):
|
|||||||
'ramdisk_id': None,
|
'ramdisk_id': None,
|
||||||
'local_gb': 5,
|
'local_gb': 5,
|
||||||
'instance_type_id': '3', # m1.large
|
'instance_type_id': '3', # m1.large
|
||||||
'os_type': 'linux'}
|
'os_type': 'linux',
|
||||||
|
'architecture': 'x86-64'}
|
||||||
|
|
||||||
fake_utils.stub_out_utils_execute(self.stubs)
|
fake_utils.stub_out_utils_execute(self.stubs)
|
||||||
stubs.stub_out_migration_methods(self.stubs)
|
stubs.stub_out_migration_methods(self.stubs)
|
||||||
@@ -772,6 +776,7 @@ class XenAPIDetermineDiskImageTestCase(test.TestCase):
|
|||||||
self.fake_instance = FakeInstance()
|
self.fake_instance = FakeInstance()
|
||||||
self.fake_instance.id = 42
|
self.fake_instance.id = 42
|
||||||
self.fake_instance.os_type = 'linux'
|
self.fake_instance.os_type = 'linux'
|
||||||
|
self.fake_instance.architecture = 'x86-64'
|
||||||
|
|
||||||
def assert_disk_type(self, disk_type):
|
def assert_disk_type(self, disk_type):
|
||||||
dt = vm_utils.VMHelper.determine_disk_image_type(
|
dt = vm_utils.VMHelper.determine_disk_image_type(
|
||||||
@@ -816,6 +821,28 @@ class XenAPIDetermineDiskImageTestCase(test.TestCase):
|
|||||||
self.assert_disk_type(vm_utils.ImageType.DISK_VHD)
|
self.assert_disk_type(vm_utils.ImageType.DISK_VHD)
|
||||||
|
|
||||||
|
|
||||||
|
class CompareVersionTestCase(test.TestCase):
|
||||||
|
def test_less_than(self):
|
||||||
|
"""Test that cmp_version compares a as less than b"""
|
||||||
|
self.assertTrue(vmops.cmp_version('1.2.3.4', '1.2.3.5') < 0)
|
||||||
|
|
||||||
|
def test_greater_than(self):
|
||||||
|
"""Test that cmp_version compares a as greater than b"""
|
||||||
|
self.assertTrue(vmops.cmp_version('1.2.3.5', '1.2.3.4') > 0)
|
||||||
|
|
||||||
|
def test_equal(self):
|
||||||
|
"""Test that cmp_version compares a as equal to b"""
|
||||||
|
self.assertTrue(vmops.cmp_version('1.2.3.4', '1.2.3.4') == 0)
|
||||||
|
|
||||||
|
def test_non_lexical(self):
|
||||||
|
"""Test that cmp_version compares non-lexically"""
|
||||||
|
self.assertTrue(vmops.cmp_version('1.2.3.10', '1.2.3.4') > 0)
|
||||||
|
|
||||||
|
def test_length(self):
|
||||||
|
"""Test that cmp_version compares by length as last resort"""
|
||||||
|
self.assertTrue(vmops.cmp_version('1.2.3', '1.2.3.4') < 0)
|
||||||
|
|
||||||
|
|
||||||
class FakeXenApi(object):
|
class FakeXenApi(object):
|
||||||
"""Fake XenApi for testing HostState."""
|
"""Fake XenApi for testing HostState."""
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user