trunk merge and migration bump
This commit is contained in:
		@@ -873,7 +873,7 @@ class InstanceTypeCommands(object):
 | 
			
		||||
        try:
 | 
			
		||||
            instance_types.create(name, memory, vcpus, local_gb,
 | 
			
		||||
                                  flavorid, swap, rxtx_quota, rxtx_cap)
 | 
			
		||||
        except exception.InvalidInputException:
 | 
			
		||||
        except exception.InvalidInput:
 | 
			
		||||
            print "Must supply valid parameters to create instance_type"
 | 
			
		||||
            print e
 | 
			
		||||
            sys.exit(1)
 | 
			
		||||
@@ -1071,6 +1071,70 @@ class ImageCommands(object):
 | 
			
		||||
        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 for exposing the flags defined by flag_file(s)."""
 | 
			
		||||
 | 
			
		||||
@@ -1083,6 +1147,7 @@ class ConfigCommands(object):
 | 
			
		||||
 | 
			
		||||
CATEGORIES = [
 | 
			
		||||
    ('account', AccountCommands),
 | 
			
		||||
    ('agent', AgentBuildCommands),
 | 
			
		||||
    ('config', ConfigCommands),
 | 
			
		||||
    ('db', DbCommands),
 | 
			
		||||
    ('fixed', FixedIpCommands),
 | 
			
		||||
 
 | 
			
		||||
@@ -110,7 +110,7 @@ def fake_ask_child_zone_to_create_instance(context, zone_info,
 | 
			
		||||
    was_called = True
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
def fake_provision_resource_locally(context, build_plan, request_spec):
 | 
			
		||||
def fake_provision_resource_locally(context, build_plan, request_spec, kwargs):
 | 
			
		||||
    global was_called
 | 
			
		||||
    was_called = True
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -281,6 +281,14 @@ class ComputeTestCase(test.TestCase):
 | 
			
		||||
                "File Contents")
 | 
			
		||||
        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):
 | 
			
		||||
        """Ensure instance can be snapshotted"""
 | 
			
		||||
        instance_id = self._create_instance()
 | 
			
		||||
 
 | 
			
		||||
@@ -37,9 +37,8 @@ from nova import exception
 | 
			
		||||
from nova.virt import xenapi_conn
 | 
			
		||||
from nova.virt.xenapi import fake as xenapi_fake
 | 
			
		||||
from nova.virt.xenapi import volume_utils
 | 
			
		||||
from nova.virt.xenapi import vmops
 | 
			
		||||
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.xenapi import stubs
 | 
			
		||||
from nova.tests.glance import stubs as glance_stubs
 | 
			
		||||
@@ -85,7 +84,8 @@ class XenAPIVolumeTestCase(test.TestCase):
 | 
			
		||||
                  'ramdisk_id': 3,
 | 
			
		||||
                  'instance_type_id': '3',  # m1.large
 | 
			
		||||
                  'mac_address': 'aa:bb:cc:dd:ee:ff',
 | 
			
		||||
                  'os_type': 'linux'}
 | 
			
		||||
                  'os_type': 'linux',
 | 
			
		||||
                  'architecture': 'x86-64'}
 | 
			
		||||
 | 
			
		||||
    def _create_volume(self, size='0'):
 | 
			
		||||
        """Create a volume object."""
 | 
			
		||||
@@ -192,7 +192,7 @@ class XenAPIVMTestCase(test.TestCase):
 | 
			
		||||
        stubs.stubout_get_this_vm_uuid(self.stubs)
 | 
			
		||||
        stubs.stubout_stream_disk(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)
 | 
			
		||||
        glance_stubs.stubout_glance_client(self.stubs)
 | 
			
		||||
        fake_utils.stub_out_utils_execute(self.stubs)
 | 
			
		||||
@@ -212,7 +212,8 @@ class XenAPIVMTestCase(test.TestCase):
 | 
			
		||||
                'ramdisk_id': 3,
 | 
			
		||||
                'instance_type_id': '3',  # m1.large
 | 
			
		||||
                'mac_address': 'aa:bb:cc:dd:ee:ff',
 | 
			
		||||
                'os_type': 'linux'}
 | 
			
		||||
                'os_type': 'linux',
 | 
			
		||||
                'architecture': 'x86-64'}
 | 
			
		||||
            instance = db.instance_create(self.context, values)
 | 
			
		||||
            self.conn.spawn(instance)
 | 
			
		||||
 | 
			
		||||
@@ -370,7 +371,8 @@ class XenAPIVMTestCase(test.TestCase):
 | 
			
		||||
 | 
			
		||||
    def _test_spawn(self, image_ref, kernel_id, ramdisk_id,
 | 
			
		||||
                    instance_type_id="3", os_type="linux",
 | 
			
		||||
                    instance_id=1, check_injection=False):
 | 
			
		||||
                    architecture="x86-64", instance_id=1,
 | 
			
		||||
                    check_injection=False):
 | 
			
		||||
        stubs.stubout_loopingcall_start(self.stubs)
 | 
			
		||||
        values = {'id': instance_id,
 | 
			
		||||
                  'project_id': self.project.id,
 | 
			
		||||
@@ -380,11 +382,14 @@ class XenAPIVMTestCase(test.TestCase):
 | 
			
		||||
                  'ramdisk_id': ramdisk_id,
 | 
			
		||||
                  'instance_type_id': instance_type_id,
 | 
			
		||||
                  'mac_address': 'aa:bb:cc:dd:ee:ff',
 | 
			
		||||
                  'os_type': os_type}
 | 
			
		||||
                  'os_type': os_type,
 | 
			
		||||
                  'architecture': architecture}
 | 
			
		||||
        instance = db.instance_create(self.context, values)
 | 
			
		||||
        self.conn.spawn(instance)
 | 
			
		||||
        self.create_vm_record(self.conn, os_type, instance_id)
 | 
			
		||||
        self.check_vm_record(self.conn, check_injection)
 | 
			
		||||
        self.assertTrue(instance.os_type)
 | 
			
		||||
        self.assertTrue(instance.architecture)
 | 
			
		||||
 | 
			
		||||
    def test_spawn_not_enough_memory(self):
 | 
			
		||||
        FLAGS.xenapi_image_service = 'glance'
 | 
			
		||||
@@ -409,7 +414,7 @@ class XenAPIVMTestCase(test.TestCase):
 | 
			
		||||
    def test_spawn_vhd_glance_linux(self):
 | 
			
		||||
        FLAGS.xenapi_image_service = 'glance'
 | 
			
		||||
        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()
 | 
			
		||||
 | 
			
		||||
    def test_spawn_vhd_glance_swapdisk(self):
 | 
			
		||||
@@ -438,7 +443,7 @@ class XenAPIVMTestCase(test.TestCase):
 | 
			
		||||
    def test_spawn_vhd_glance_windows(self):
 | 
			
		||||
        FLAGS.xenapi_image_service = 'glance'
 | 
			
		||||
        self._test_spawn(glance_stubs.FakeGlance.IMAGE_VHD, None, None,
 | 
			
		||||
                         os_type="windows")
 | 
			
		||||
                         os_type="windows", architecture="i386")
 | 
			
		||||
        self.check_vm_params_for_windows()
 | 
			
		||||
 | 
			
		||||
    def test_spawn_glance(self):
 | 
			
		||||
@@ -589,7 +594,8 @@ class XenAPIVMTestCase(test.TestCase):
 | 
			
		||||
            'ramdisk_id': 3,
 | 
			
		||||
            'instance_type_id': '3',  # m1.large
 | 
			
		||||
            'mac_address': 'aa:bb:cc:dd:ee:ff',
 | 
			
		||||
            'os_type': 'linux'}
 | 
			
		||||
            'os_type': 'linux',
 | 
			
		||||
            'architecture': 'x86-64'}
 | 
			
		||||
        instance = db.instance_create(self.context, values)
 | 
			
		||||
        self.conn.spawn(instance)
 | 
			
		||||
        return instance
 | 
			
		||||
@@ -599,8 +605,8 @@ class XenAPIDiffieHellmanTestCase(test.TestCase):
 | 
			
		||||
    """Unit tests for Diffie-Hellman code."""
 | 
			
		||||
    def setUp(self):
 | 
			
		||||
        super(XenAPIDiffieHellmanTestCase, self).setUp()
 | 
			
		||||
        self.alice = SimpleDH()
 | 
			
		||||
        self.bob = SimpleDH()
 | 
			
		||||
        self.alice = vmops.SimpleDH()
 | 
			
		||||
        self.bob = vmops.SimpleDH()
 | 
			
		||||
 | 
			
		||||
    def test_shared(self):
 | 
			
		||||
        alice_pub = self.alice.get_public()
 | 
			
		||||
@@ -664,7 +670,8 @@ class XenAPIMigrateInstance(test.TestCase):
 | 
			
		||||
                  'local_gb': 5,
 | 
			
		||||
                  'instance_type_id': '3',  # m1.large
 | 
			
		||||
                  'mac_address': 'aa:bb:cc:dd:ee:ff',
 | 
			
		||||
                  'os_type': 'linux'}
 | 
			
		||||
                  'os_type': 'linux',
 | 
			
		||||
                  'architecture': 'x86-64'}
 | 
			
		||||
 | 
			
		||||
        fake_utils.stub_out_utils_execute(self.stubs)
 | 
			
		||||
        stubs.stub_out_migration_methods(self.stubs)
 | 
			
		||||
@@ -703,6 +710,7 @@ class XenAPIDetermineDiskImageTestCase(test.TestCase):
 | 
			
		||||
        self.fake_instance = FakeInstance()
 | 
			
		||||
        self.fake_instance.id = 42
 | 
			
		||||
        self.fake_instance.os_type = 'linux'
 | 
			
		||||
        self.fake_instance.architecture = 'x86-64'
 | 
			
		||||
 | 
			
		||||
    def assert_disk_type(self, disk_type):
 | 
			
		||||
        dt = vm_utils.VMHelper.determine_disk_image_type(
 | 
			
		||||
@@ -747,6 +755,28 @@ class XenAPIDetermineDiskImageTestCase(test.TestCase):
 | 
			
		||||
        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):
 | 
			
		||||
    """Fake XenApi for testing HostState."""
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user