~ubuntu-branches/ubuntu/raring/nova/raring-proposed

« back to all changes in this revision

Viewing changes to nova/tests/test_xenapi.py

  • Committer: Package Import Robot
  • Author(s): Chuck Short, Adam Gandelman, Chuck Short
  • Date: 2012-11-23 09:04:58 UTC
  • mfrom: (1.1.66)
  • Revision ID: package-import@ubuntu.com-20121123090458-91565o7aev1i1h71
Tags: 2013.1~g1-0ubuntu1
[ Adam Gandelman ]
* debian/control: Ensure novaclient is upgraded with nova,
  require python-keystoneclient >= 1:2.9.0. (LP: #1073289)
* debian/patches/{ubuntu/*, rbd-security.patch}: Dropped, applied
  upstream.
* debian/control: Add python-testtools to Build-Depends.

[ Chuck Short ]
* New upstream version.
* Refreshed debian/patches/avoid_setuptools_git_dependency.patch.
* debian/rules: FTBFS if missing binaries.
* debian/nova-scheudler.install: Add missing rabbit-queues and
  nova-rpc-zmq-receiver.
* Remove nova-volume since it doesnt exist anymore, transition to cinder-*.
* debian/rules: install apport hook in the right place.
* debian/patches/ubuntu-show-tests.patch: Display test failures.
* debian/control: Add depends on genisoimage
* debian/control: Suggest guestmount.
* debian/control: Suggest websockify. (LP: #1076442)
* debian/nova.conf: Disable nova-volume service.
* debian/control: Depend on xen-system-* rather than the hypervisor.
* debian/control, debian/mans/nova-conductor.8, debian/nova-conductor.init,
  debian/nova-conductor.install, debian/nova-conductor.logrotate
  debian/nova-conductor.manpages, debian/nova-conductor.postrm
  debian/nova-conductor.upstart.in: Add nova-conductor service.
* debian/control: Add python-fixtures as a build deps.

Show diffs side-by-side

added added

removed removed

Lines of Context:
27
27
from nova.compute import api as compute_api
28
28
from nova.compute import instance_types
29
29
from nova.compute import power_state
 
30
from nova.compute import task_states
 
31
from nova.compute import vm_states
30
32
from nova import context
31
33
from nova import db
32
34
from nova import exception
33
 
from nova import flags
 
35
from nova.openstack.common import cfg
34
36
from nova.openstack.common import importutils
35
37
from nova.openstack.common import jsonutils
36
38
from nova.openstack.common import log as logging
37
 
from nova.openstack.common import timeutils
38
39
from nova import test
39
40
from nova.tests.db import fakes as db_fakes
40
41
from nova.tests import fake_network
41
42
from nova.tests import fake_utils
42
43
import nova.tests.image.fake as fake_image
 
44
from nova.tests import matchers
43
45
from nova.tests.xenapi import stubs
 
46
from nova.virt import fake
44
47
from nova.virt.xenapi import agent
45
48
from nova.virt.xenapi import driver as xenapi_conn
46
49
from nova.virt.xenapi import fake as xenapi_fake
 
50
from nova.virt.xenapi import host
47
51
from nova.virt.xenapi import pool
48
52
from nova.virt.xenapi import pool_states
49
53
from nova.virt.xenapi import vm_utils
52
56
 
53
57
LOG = logging.getLogger(__name__)
54
58
 
55
 
FLAGS = flags.FLAGS
 
59
CONF = cfg.CONF
 
60
CONF.import_opt('compute_manager', 'nova.config')
 
61
CONF.import_opt('host', 'nova.config')
 
62
CONF.import_opt('network_manager', 'nova.config')
 
63
CONF.import_opt('node_availability_zone', 'nova.config')
56
64
 
57
65
IMAGE_MACHINE = '1'
58
66
IMAGE_KERNEL = '2'
170
178
        vol['user_id'] = 'fake'
171
179
        vol['project_id'] = 'fake'
172
180
        vol['host'] = 'localhost'
173
 
        vol['availability_zone'] = FLAGS.storage_availability_zone
 
181
        vol['availability_zone'] = CONF.node_availability_zone
174
182
        vol['status'] = "creating"
175
183
        vol['attach_status'] = "detached"
176
184
        return db.volume_create(self.context, vol)
177
185
 
178
186
    @staticmethod
179
 
    def _make_info():
 
187
    def _make_connection_data():
 
188
        return {
 
189
            'volume_id': 1,
 
190
            'target_iqn': 'iqn.2010-10.org.openstack:volume-00000001',
 
191
            'target_portal': '127.0.0.1:3260,fake',
 
192
            'target_lun': None,
 
193
            'auth_method': 'CHAP',
 
194
            'auth_username': 'username',
 
195
            'auth_password': 'password',
 
196
        }
 
197
 
 
198
    @classmethod
 
199
    def _make_connection_info(cls):
180
200
        return {
181
201
            'driver_volume_type': 'iscsi',
182
 
            'data': {
183
 
                'volume_id': 1,
184
 
                'target_iqn': 'iqn.2010-10.org.openstack:volume-00000001',
185
 
                'target_portal': '127.0.0.1:3260,fake',
186
 
                'target_lun': None,
187
 
                'auth_method': 'CHAP',
188
 
                'auth_method': 'fake',
189
 
                'auth_method': 'fake',
190
 
            }
 
202
            'data': cls._make_connection_data()
191
203
        }
192
204
 
193
205
    def test_mountpoint_to_number(self):
211
223
            self.assertEqual(actual, expected,
212
224
                    '%s yielded %s, not %s' % (input, actual, expected))
213
225
 
214
 
    def test_parse_volume_info_raise_exception(self):
215
 
        """This shows how to test helper classes' methods."""
216
 
        stubs.stubout_session(self.stubs, stubs.FakeSessionForVolumeTests)
217
 
        session = xenapi_conn.XenAPISession('test_url', 'root', 'test_pass')
218
 
        vol = self._create_volume()
219
 
        # oops, wrong mount point!
220
 
        self.assertRaises(volume_utils.StorageError,
221
 
                          volume_utils.parse_volume_info,
222
 
                          self._make_info(),
223
 
                          'dev/sd'
224
 
                          )
225
 
        db.volume_destroy(context.get_admin_context(), vol['id'])
 
226
    def test_parse_volume_info_parsing_auth_details(self):
 
227
        result = volume_utils.parse_volume_info(
 
228
            self._make_connection_data())
 
229
 
 
230
        self.assertEquals('username', result['chapuser'])
 
231
        self.assertEquals('password', result['chappassword'])
 
232
 
 
233
    def test_get_device_number_raise_exception_on_wrong_mountpoint(self):
 
234
        self.assertRaises(
 
235
            volume_utils.StorageError,
 
236
            volume_utils.get_device_number,
 
237
            'dev/sd')
226
238
 
227
239
    def test_attach_volume(self):
228
240
        """This shows how to test Ops classes' methods."""
229
241
        stubs.stubout_session(self.stubs, stubs.FakeSessionForVolumeTests)
230
 
        conn = xenapi_conn.XenAPIDriver(False)
231
 
        volume = self._create_volume()
 
242
        conn = xenapi_conn.XenAPIDriver(fake.FakeVirtAPI(), False)
232
243
        instance = db.instance_create(self.context, self.instance_values)
233
244
        vm = xenapi_fake.create_vm(instance.name, 'Running')
234
 
        result = conn.attach_volume(self._make_info(),
 
245
        result = conn.attach_volume(self._make_connection_info(),
235
246
                                    instance.name, '/dev/sdc')
236
247
 
237
248
        # check that the VM has a VBD attached to it
245
256
        """This shows how to test when exceptions are raised."""
246
257
        stubs.stubout_session(self.stubs,
247
258
                              stubs.FakeSessionForVolumeFailedTests)
248
 
        conn = xenapi_conn.XenAPIDriver(False)
249
 
        volume = self._create_volume()
 
259
        conn = xenapi_conn.XenAPIDriver(fake.FakeVirtAPI(), False)
250
260
        instance = db.instance_create(self.context, self.instance_values)
251
261
        xenapi_fake.create_vm(instance.name, 'Running')
252
262
        self.assertRaises(exception.VolumeDriverNotFound,
260
270
    """Unit tests for VM operations."""
261
271
    def setUp(self):
262
272
        super(XenAPIVMTestCase, self).setUp()
263
 
        self.network = importutils.import_object(FLAGS.network_manager)
 
273
        self.network = importutils.import_object(CONF.network_manager)
264
274
        self.flags(disable_process_locking=True,
265
275
                   instance_name_template='%d',
266
276
                   firewall_driver='nova.virt.xenapi.firewall.'
270
280
        xenapi_fake.create_local_srs()
271
281
        xenapi_fake.create_local_pifs()
272
282
        db_fakes.stub_out_db_instance_api(self.stubs)
273
 
        xenapi_fake.create_network('fake', FLAGS.flat_network_bridge)
 
283
        xenapi_fake.create_network('fake', CONF.flat_network_bridge)
274
284
        stubs.stubout_session(self.stubs, stubs.FakeSessionForVMTests)
275
285
        stubs.stubout_get_this_vm_uuid(self.stubs)
276
286
        stubs.stubout_is_vdi_pv(self.stubs)
279
289
        self.user_id = 'fake'
280
290
        self.project_id = 'fake'
281
291
        self.context = context.RequestContext(self.user_id, self.project_id)
282
 
        self.conn = xenapi_conn.XenAPIDriver(False)
 
292
        self.conn = xenapi_conn.XenAPIDriver(fake.FakeVirtAPI(), False)
283
293
 
284
294
        fake_image.stub_out_image_service(self.stubs)
285
295
        set_image_fixtures()
305
315
        fake_image.FakeImageService_reset()
306
316
 
307
317
    def test_init_host(self):
308
 
        session = xenapi_conn.XenAPISession('test_url', 'root', 'test_pass')
 
318
        session = xenapi_conn.XenAPISession('test_url', 'root', 'test_pass',
 
319
                                            fake.FakeVirtAPI())
309
320
        vm = vm_utils._get_this_vm_ref(session)
310
321
        # Local root disk
311
322
        vdi0 = xenapi_fake.create_vdi('compute', None)
354
365
        }
355
366
        instance = self._create_instance()
356
367
        expected = self.conn.get_diagnostics(instance)
357
 
        self.assertDictMatch(fake_diagnostics, expected)
 
368
        self.assertThat(fake_diagnostics, matchers.DictMatches(expected))
358
369
 
359
370
    def test_instance_snapshot_fails_with_no_primary_vdi(self):
360
 
        def create_bad_vbd(vm_ref, vdi_ref):
 
371
        def create_bad_vbd(session, vm_ref, vdi_ref, userdevice,
 
372
                           vbd_type='disk', read_only=False, bootable=False,
 
373
                           osvol=False):
361
374
            vbd_rec = {'VM': vm_ref,
362
375
               'VDI': vdi_ref,
363
376
               'userdevice': 'fake',
366
379
            xenapi_fake.after_VBD_create(vbd_ref, vbd_rec)
367
380
            return vbd_ref
368
381
 
369
 
        self.stubs.Set(xenapi_fake, 'create_vbd', create_bad_vbd)
 
382
        self.stubs.Set(vm_utils, 'create_vbd', create_bad_vbd)
370
383
        stubs.stubout_instance_snapshot(self.stubs)
371
384
        # Stubbing out firewall driver as previous stub sets alters
372
385
        # xml rpc result parsing
504
517
        self.assertEquals(self.vm['HVM_boot_policy'], '')
505
518
 
506
519
    def _list_vdis(self):
507
 
        url = FLAGS.xenapi_connection_url
508
 
        username = FLAGS.xenapi_connection_username
509
 
        password = FLAGS.xenapi_connection_password
510
 
        session = xenapi_conn.XenAPISession(url, username, password)
 
520
        url = CONF.xenapi_connection_url
 
521
        username = CONF.xenapi_connection_username
 
522
        password = CONF.xenapi_connection_password
 
523
        session = xenapi_conn.XenAPISession(url, username, password,
 
524
                                            fake.FakeVirtAPI())
511
525
        return session.call_xenapi('VDI.get_all')
512
526
 
 
527
    def _list_vms(self):
 
528
        url = CONF.xenapi_connection_url
 
529
        username = CONF.xenapi_connection_username
 
530
        password = CONF.xenapi_connection_password
 
531
        session = xenapi_conn.XenAPISession(url, username, password,
 
532
                                            fake.FakeVirtAPI())
 
533
        return session.call_xenapi('VM.get_all')
 
534
 
513
535
    def _check_vdis(self, start_list, end_list):
514
536
        for vdi_ref in end_list:
515
537
            if not vdi_ref in start_list:
582
604
    def test_spawn_fail_cleanup_1(self):
583
605
        """Simulates an error while downloading an image.
584
606
 
585
 
        Verifies that VDIs created are properly cleaned up.
586
 
 
 
607
        Verifies that the VM and VDIs created are properly cleaned up.
587
608
        """
588
609
        vdi_recs_start = self._list_vdis()
 
610
        start_vms = self._list_vms()
589
611
        stubs.stubout_fetch_disk_image(self.stubs, raise_failure=True)
590
612
        self.assertRaises(xenapi_fake.Failure,
591
613
                          self._test_spawn, 1, 2, 3)
592
614
        # No additional VDI should be found.
593
615
        vdi_recs_end = self._list_vdis()
 
616
        end_vms = self._list_vms()
594
617
        self._check_vdis(vdi_recs_start, vdi_recs_end)
 
618
        # No additional VMs should be found.
 
619
        self.assertEqual(start_vms, end_vms)
595
620
 
596
621
    def test_spawn_fail_cleanup_2(self):
597
622
        """Simulates an error while creating VM record.
598
623
 
599
 
        It verifies that VDIs created are properly cleaned up.
600
 
 
 
624
        Verifies that the VM and VDIs created are properly cleaned up.
601
625
        """
602
626
        vdi_recs_start = self._list_vdis()
 
627
        start_vms = self._list_vms()
603
628
        stubs.stubout_create_vm(self.stubs)
604
629
        self.assertRaises(xenapi_fake.Failure,
605
630
                          self._test_spawn, 1, 2, 3)
606
631
        # No additional VDI should be found.
607
632
        vdi_recs_end = self._list_vdis()
608
 
        self._check_vdis(vdi_recs_start, vdi_recs_end)
 
633
        end_vms = self._list_vms()
 
634
        self._check_vdis(vdi_recs_start, vdi_recs_end)
 
635
        # No additional VMs should be found.
 
636
        self.assertEqual(start_vms, end_vms)
 
637
 
 
638
    def test_spawn_fail_cleanup_3(self):
 
639
        """Simulates an error while attaching disks.
 
640
 
 
641
        Verifies that the VM and VDIs created are properly cleaned up.
 
642
        """
 
643
        stubs.stubout_attach_disks(self.stubs)
 
644
        vdi_recs_start = self._list_vdis()
 
645
        start_vms = self._list_vms()
 
646
        self.assertRaises(xenapi_fake.Failure,
 
647
                          self._test_spawn, 1, 2, 3)
 
648
        # No additional VDI should be found.
 
649
        vdi_recs_end = self._list_vdis()
 
650
        end_vms = self._list_vms()
 
651
        self._check_vdis(vdi_recs_start, vdi_recs_end)
 
652
        # No additional VMs should be found.
 
653
        self.assertEqual(start_vms, end_vms)
609
654
 
610
655
    @stub_vm_utils_with_vdi_attached_here
611
656
    def test_spawn_raw_glance(self):
617
662
                         os_type="linux", architecture="x86-64")
618
663
        self.check_vm_params_for_linux()
619
664
 
620
 
    def test_spawn_vhd_glance_swapdisk(self):
621
 
        # Change the default host_call_plugin to one that'll return
622
 
        # a swap disk
623
 
        orig_func = stubs.FakeSessionForVMTests.host_call_plugin
624
 
        _host_call_plugin = stubs.FakeSessionForVMTests.host_call_plugin_swap
625
 
        stubs.FakeSessionForVMTests.host_call_plugin = _host_call_plugin
626
 
        # Stubbing out firewall driver as previous stub sets a particular
627
 
        # stub for async plugin calls
628
 
        stubs.stubout_firewall_driver(self.stubs, self.conn)
629
 
        try:
630
 
            # We'll steal the above glance linux test
631
 
            self.test_spawn_vhd_glance_linux()
632
 
        finally:
633
 
            # Make sure to put this back
634
 
            stubs.FakeSessionForVMTests.host_call_plugin = orig_func
635
 
 
636
 
        # We should have 2 VBDs.
637
 
        self.assertEqual(len(self.vm['VBDs']), 2)
638
 
        # Now test that we have 1.
639
 
        self.tearDown()
640
 
        self.setUp()
641
 
        self.test_spawn_vhd_glance_linux()
642
 
        self.assertEqual(len(self.vm['VBDs']), 1)
643
 
 
644
665
    def test_spawn_vhd_glance_windows(self):
645
666
        self._test_spawn(IMAGE_VHD, None, None,
646
667
                         os_type="windows", architecture="i386")
759
780
        self.network.allocate_for_instance(ctxt,
760
781
                          instance_id=2,
761
782
                          instance_uuid='00000000-0000-0000-0000-000000000002',
762
 
                          host=FLAGS.host,
 
783
                          host=CONF.host,
763
784
                          vpn=None,
764
785
                          rxtx_factor=3,
765
786
                          project_id=self.project_id)
801
822
 
802
823
    def test_rescue(self):
803
824
        instance = self._create_instance()
804
 
        session = xenapi_conn.XenAPISession('test_url', 'root', 'test_pass')
 
825
        session = xenapi_conn.XenAPISession('test_url', 'root', 'test_pass',
 
826
                                            fake.FakeVirtAPI())
805
827
        vm_ref = vm_utils.lookup(session, instance.name)
806
828
 
807
829
        swap_vdi_ref = xenapi_fake.create_vdi('swap', None)
810
832
        xenapi_fake.create_vbd(vm_ref, swap_vdi_ref, userdevice=1)
811
833
        xenapi_fake.create_vbd(vm_ref, root_vdi_ref, userdevice=0)
812
834
 
813
 
        conn = xenapi_conn.XenAPIDriver(False)
 
835
        conn = xenapi_conn.XenAPIDriver(fake.FakeVirtAPI(), False)
814
836
        image_meta = {'id': IMAGE_VHD,
815
837
                      'disk_format': 'vhd'}
816
838
        conn.rescue(self.context, instance, [], image_meta, '')
827
849
 
828
850
    def test_unrescue(self):
829
851
        instance = self._create_instance()
830
 
        conn = xenapi_conn.XenAPIDriver(False)
 
852
        conn = xenapi_conn.XenAPIDriver(fake.FakeVirtAPI(), False)
831
853
        # Unrescue expects the original instance to be powered off
832
854
        conn.power_off(instance)
833
855
        rescue_vm = xenapi_fake.create_vm(instance.name + '-rescue', 'Running')
835
857
 
836
858
    def test_unrescue_not_in_rescue(self):
837
859
        instance = self._create_instance()
838
 
        conn = xenapi_conn.XenAPIDriver(False)
 
860
        conn = xenapi_conn.XenAPIDriver(fake.FakeVirtAPI(), False)
839
861
        # Ensure that it will not unrescue a non-rescued instance.
840
862
        self.assertRaises(exception.InstanceNotInRescueMode, conn.unrescue,
841
863
                          instance, None)
851
873
            def finish_revert_migration(self, instance):
852
874
                self.finish_revert_migration_called = True
853
875
 
854
 
        conn = xenapi_conn.XenAPIDriver(False)
 
876
        conn = xenapi_conn.XenAPIDriver(fake.FakeVirtAPI(), False)
855
877
        conn._vmops = VMOpsMock()
856
878
        conn.finish_revert_migration(instance, None)
857
879
        self.assertTrue(conn._vmops.finish_revert_migration_called)
858
880
 
859
881
    def test_reboot_hard(self):
860
882
        instance = self._create_instance()
861
 
        conn = xenapi_conn.XenAPIDriver(False)
 
883
        conn = xenapi_conn.XenAPIDriver(fake.FakeVirtAPI(), False)
862
884
        conn.reboot(instance, None, "HARD")
863
885
 
864
886
    def test_reboot_soft(self):
865
887
        instance = self._create_instance()
866
 
        conn = xenapi_conn.XenAPIDriver(False)
 
888
        conn = xenapi_conn.XenAPIDriver(fake.FakeVirtAPI(), False)
867
889
        conn.reboot(instance, None, "SOFT")
868
890
 
869
891
    def test_reboot_halted(self):
870
 
        session = xenapi_conn.XenAPISession('test_url', 'root', 'test_pass')
 
892
        session = xenapi_conn.XenAPISession('test_url', 'root', 'test_pass',
 
893
                                            fake.FakeVirtAPI())
871
894
        instance = self._create_instance(spawn=False)
872
 
        conn = xenapi_conn.XenAPIDriver(False)
 
895
        conn = xenapi_conn.XenAPIDriver(fake.FakeVirtAPI(), False)
873
896
        xenapi_fake.create_vm(instance.name, 'Halted')
874
897
        conn.reboot(instance, None, "SOFT")
875
898
        vm_ref = vm_utils.lookup(session, instance.name)
878
901
 
879
902
    def test_reboot_unknown_state(self):
880
903
        instance = self._create_instance(spawn=False)
881
 
        conn = xenapi_conn.XenAPIDriver(False)
 
904
        conn = xenapi_conn.XenAPIDriver(fake.FakeVirtAPI(), False)
882
905
        xenapi_fake.create_vm(instance.name, 'Unknown')
883
906
        self.assertRaises(xenapi_fake.Failure, conn.reboot, instance,
884
907
                None, "SOFT")
885
908
 
 
909
    def _test_maintenance_mode(self, find_host, find_aggregate):
 
910
        real_call_xenapi = self.conn._session.call_xenapi
 
911
        instance = self._create_instance(spawn=True)
 
912
        api_calls = {}
 
913
 
 
914
        # Record all the xenapi calls, and return a fake list of hosts
 
915
        # for the host.get_all call
 
916
        def fake_call_xenapi(method, *args):
 
917
            api_calls[method] = args
 
918
            if method == 'host.get_all':
 
919
                return ['foo', 'bar', 'baz']
 
920
            return real_call_xenapi(method, *args)
 
921
        self.stubs.Set(self.conn._session, 'call_xenapi', fake_call_xenapi)
 
922
 
 
923
        def fake_aggregate_get(context, host, key):
 
924
            if find_aggregate:
 
925
                return [{'fake': 'aggregate'}]
 
926
            else:
 
927
                return []
 
928
        self.stubs.Set(self.conn.virtapi, 'aggregate_get_by_host',
 
929
                       fake_aggregate_get)
 
930
 
 
931
        def fake_host_find(context, session, src, dst):
 
932
            if find_host:
 
933
                return 'bar'
 
934
            else:
 
935
                raise exception.NoValidHost("I saw this one coming...")
 
936
        self.stubs.Set(host, '_host_find', fake_host_find)
 
937
 
 
938
        result = self.conn.host_maintenance_mode('bar', 'on_maintenance')
 
939
        self.assertEqual(result, 'on_maintenance')
 
940
 
 
941
        # We expect the VM.pool_migrate call to have been called to
 
942
        # migrate our instance to the 'bar' host
 
943
        expected = (instance['uuid'], 'bar', {})
 
944
        self.assertTrue(api_calls.get('VM.pool_migrate'), expected)
 
945
 
 
946
        instance = db.instance_get_by_uuid(self.context, instance['uuid'])
 
947
        self.assertTrue(instance['vm_state'], vm_states.ACTIVE)
 
948
        self.assertTrue(instance['task_state'], task_states.MIGRATING)
 
949
 
 
950
    def test_maintenance_mode(self):
 
951
        self._test_maintenance_mode(True, True)
 
952
 
 
953
    def test_maintenance_mode_no_host(self):
 
954
        self.assertRaises(exception.NoValidHost,
 
955
                          self._test_maintenance_mode, False, True)
 
956
 
 
957
    def test_maintenance_mode_no_aggregate(self):
 
958
        self.assertRaises(exception.NotFound,
 
959
                          self._test_maintenance_mode, True, False)
 
960
 
 
961
    def test_session_virtapi(self):
 
962
        was = {'called': False}
 
963
 
 
964
        def fake_aggregate_get_by_host(self, *args, **kwargs):
 
965
            was['called'] = True
 
966
            raise Exception()
 
967
        self.stubs.Set(self.conn._session._virtapi, "aggregate_get_by_host",
 
968
                       fake_aggregate_get_by_host)
 
969
 
 
970
        self.stubs.Set(self.conn._session, "is_slave", True)
 
971
 
 
972
        try:
 
973
            self.conn._session._get_host_uuid()
 
974
        except Exception:
 
975
            pass
 
976
        self.assertTrue(was['called'])
 
977
 
886
978
    def _create_instance(self, instance_id=1, spawn=True):
887
979
        """Creates and spawns a test instance."""
888
980
        instance_values = {
959
1051
                                   'Dom0IptablesFirewallDriver')
960
1052
        stubs.stubout_session(self.stubs, stubs.FakeSessionForVMTests)
961
1053
        db_fakes.stub_out_db_instance_api(self.stubs)
962
 
        xenapi_fake.create_network('fake', FLAGS.flat_network_bridge)
 
1054
        xenapi_fake.create_network('fake', CONF.flat_network_bridge)
963
1055
        self.user_id = 'fake'
964
1056
        self.project_id = 'fake'
965
1057
        self.context = context.RequestContext(self.user_id, self.project_id)
1007
1099
        stubs.stubout_session(self.stubs, stubs.FakeSessionForVMTests,
1008
1100
                              product_version=(6, 0, 0),
1009
1101
                              product_brand='XenServer')
1010
 
        conn = xenapi_conn.XenAPIDriver(False)
 
1102
        conn = xenapi_conn.XenAPIDriver(fake.FakeVirtAPI(), False)
1011
1103
        vdi_ref = xenapi_fake.create_vdi('hurr', 'fake')
1012
1104
        vdi_uuid = xenapi_fake.get_record('VDI', vdi_ref)['uuid']
1013
1105
        conn._vmops._resize_instance(instance,
1026
1118
        stubs.stubout_session(self.stubs, stubs.FakeSessionForVMTests,
1027
1119
                              product_version=(1, 4, 99),
1028
1120
                              product_brand='XCP')
1029
 
        conn = xenapi_conn.XenAPIDriver(False)
 
1121
        conn = xenapi_conn.XenAPIDriver(fake.FakeVirtAPI(), False)
1030
1122
        vdi_ref = xenapi_fake.create_vdi('hurr', 'fake')
1031
1123
        vdi_uuid = xenapi_fake.get_record('VDI', vdi_ref)['uuid']
1032
1124
        conn._vmops._resize_instance(instance,
1037
1129
        instance = db.instance_create(self.context, self.instance_values)
1038
1130
        xenapi_fake.create_vm(instance.name, 'Running')
1039
1131
        instance_type = db.instance_type_get_by_name(self.context, 'm1.large')
1040
 
        conn = xenapi_conn.XenAPIDriver(False)
 
1132
        conn = xenapi_conn.XenAPIDriver(fake.FakeVirtAPI(), False)
1041
1133
        conn.migrate_disk_and_power_off(self.context, instance,
1042
1134
                                        '127.0.0.1', instance_type, None)
1043
1135
 
1050
1142
            raise exception.MigrationError(reason='test failure')
1051
1143
        self.stubs.Set(vmops.VMOps, "_migrate_vhd", fake_raise)
1052
1144
 
1053
 
        conn = xenapi_conn.XenAPIDriver(False)
 
1145
        conn = xenapi_conn.XenAPIDriver(fake.FakeVirtAPI(), False)
1054
1146
        self.assertRaises(exception.MigrationError,
1055
1147
                          conn.migrate_disk_and_power_off,
1056
1148
                          self.context, instance,
1080
1172
                              product_version=(4, 0, 0),
1081
1173
                              product_brand='XenServer')
1082
1174
 
1083
 
        conn = xenapi_conn.XenAPIDriver(False)
 
1175
        conn = xenapi_conn.XenAPIDriver(fake.FakeVirtAPI(), False)
1084
1176
        network_info = fake_network.fake_get_instance_nw_info(self.stubs,
1085
1177
                                                              spectacular=True)
1086
1178
        image_meta = {'id': instance.image_ref, 'disk_format': 'vhd'}
1115
1207
                              product_version=(4, 0, 0),
1116
1208
                              product_brand='XenServer')
1117
1209
 
1118
 
        conn = xenapi_conn.XenAPIDriver(False)
 
1210
        conn = xenapi_conn.XenAPIDriver(fake.FakeVirtAPI(), False)
1119
1211
        network_info = fake_network.fake_get_instance_nw_info(self.stubs,
1120
1212
                                                              spectacular=True)
1121
1213
        image_meta = {'id': instance.image_ref, 'disk_format': 'vhd'}
1137
1229
 
1138
1230
        self.stubs.Set(stubs.FakeSessionForVMTests,
1139
1231
                       "VDI_resize_online", fake_vdi_resize)
1140
 
        conn = xenapi_conn.XenAPIDriver(False)
 
1232
        conn = xenapi_conn.XenAPIDriver(fake.FakeVirtAPI(), False)
1141
1233
        network_info = fake_network.fake_get_instance_nw_info(self.stubs,
1142
1234
                                                              spectacular=True)
1143
1235
        image_meta = {'id': instance.image_ref, 'disk_format': 'vhd'}
1153
1245
 
1154
1246
        self.stubs.Set(stubs.FakeSessionForVMTests,
1155
1247
                       "VDI_resize_online", fake_vdi_resize)
1156
 
        conn = xenapi_conn.XenAPIDriver(False)
 
1248
        conn = xenapi_conn.XenAPIDriver(fake.FakeVirtAPI(), False)
1157
1249
        network_info = fake_network.fake_get_instance_nw_info(self.stubs,
1158
1250
                                                              spectacular=True)
1159
1251
        # Resize instance would be determined by the compute call
1172
1264
            vm_utils.ImageType.to_string(vm_utils.ImageType.KERNEL),
1173
1265
            vm_utils.ImageType.KERNEL_STR)
1174
1266
 
1175
 
    def test_from_string(self):
1176
 
        """Can convert from string to type id."""
 
1267
    def _assert_role(self, expected_role, image_type_id):
1177
1268
        self.assertEquals(
1178
 
            vm_utils.ImageType.from_string(vm_utils.ImageType.KERNEL_STR),
1179
 
            vm_utils.ImageType.KERNEL)
 
1269
            expected_role,
 
1270
            vm_utils.ImageType.get_role(image_type_id))
 
1271
 
 
1272
    def test_get_image_role_kernel(self):
 
1273
        self._assert_role('kernel', vm_utils.ImageType.KERNEL)
 
1274
 
 
1275
    def test_get_image_role_ramdisk(self):
 
1276
        self._assert_role('ramdisk', vm_utils.ImageType.RAMDISK)
 
1277
 
 
1278
    def test_get_image_role_disk(self):
 
1279
        self._assert_role('root', vm_utils.ImageType.DISK)
 
1280
 
 
1281
    def test_get_image_role_disk_raw(self):
 
1282
        self._assert_role('root', vm_utils.ImageType.DISK_RAW)
 
1283
 
 
1284
    def test_get_image_role_disk_vhd(self):
 
1285
        self._assert_role('root', vm_utils.ImageType.DISK_VHD)
1180
1286
 
1181
1287
 
1182
1288
class XenAPIDetermineDiskImageTestCase(test.TestCase):
1230
1336
                   xenapi_connection_password='test_pass')
1231
1337
        stubs.stubout_session(self.stubs, stubs.FakeSessionForVMTests)
1232
1338
        xenapi_fake.create_local_srs()
1233
 
        self.conn = xenapi_conn.XenAPIDriver(False)
 
1339
        self.conn = xenapi_conn.XenAPIDriver(fake.FakeVirtAPI(), False)
1234
1340
 
1235
1341
    def test_host_state(self):
1236
1342
        stats = self.conn.get_host_stats()
1275
1381
        result = self.conn.get_host_uptime('host')
1276
1382
        self.assertEqual(result, 'fake uptime')
1277
1383
 
 
1384
    def test_supported_instances_is_included_in_host_state(self):
 
1385
        stats = self.conn.get_host_stats()
 
1386
        self.assertTrue('supported_instances' in stats)
 
1387
 
 
1388
    def test_supported_instances_is_calculated_by_to_supported_instances(self):
 
1389
 
 
1390
        def to_supported_instances(somedata):
 
1391
            self.assertEquals(None, somedata)
 
1392
            return "SOMERETURNVALUE"
 
1393
        self.stubs.Set(host, 'to_supported_instances', to_supported_instances)
 
1394
 
 
1395
        stats = self.conn.get_host_stats()
 
1396
        self.assertEquals("SOMERETURNVALUE", stats['supported_instances'])
 
1397
 
 
1398
 
 
1399
class ToSupportedInstancesTestCase(test.TestCase):
 
1400
    def test_default_return_value(self):
 
1401
        self.assertEquals([],
 
1402
            host.to_supported_instances(None))
 
1403
 
 
1404
    def test_return_value(self):
 
1405
        self.assertEquals([('x86_64', 'xapi', 'xen')],
 
1406
             host.to_supported_instances([u'xen-3.0-x86_64']))
 
1407
 
 
1408
    def test_invalid_values_do_not_break(self):
 
1409
        self.assertEquals([('x86_64', 'xapi', 'xen')],
 
1410
             host.to_supported_instances([u'xen-3.0-x86_64', 'spam']))
 
1411
 
 
1412
    def test_multiple_values(self):
 
1413
        self.assertEquals(
 
1414
            [
 
1415
                ('x86_64', 'xapi', 'xen'),
 
1416
                ('x86_32', 'xapi', 'hvm')
 
1417
            ],
 
1418
            host.to_supported_instances([u'xen-3.0-x86_64', 'hvm-3.0-x86_32'])
 
1419
        )
 
1420
 
1278
1421
 
1279
1422
class XenAPIAutoDiskConfigTestCase(stubs.XenAPITestBase):
1280
1423
    def setUp(self):
1284
1427
                   firewall_driver='nova.virt.xenapi.firewall.'
1285
1428
                                   'Dom0IptablesFirewallDriver')
1286
1429
        stubs.stubout_session(self.stubs, stubs.FakeSessionForVMTests)
1287
 
        self.conn = xenapi_conn.XenAPIDriver(False)
 
1430
        self.conn = xenapi_conn.XenAPIDriver(fake.FakeVirtAPI(), False)
1288
1431
 
1289
1432
        self.user_id = 'fake'
1290
1433
        self.project_id = 'fake'
1303
1446
        self.context = context.RequestContext(self.user_id, self.project_id)
1304
1447
 
1305
1448
        def fake_create_vbd(session, vm_ref, vdi_ref, userdevice,
1306
 
                            vbd_type='disk', read_only=False, bootable=True):
 
1449
                            vbd_type='disk', read_only=False, bootable=True,
 
1450
                            osvol=False):
1307
1451
            pass
1308
1452
 
1309
1453
        self.stubs.Set(vm_utils, 'create_vbd', fake_create_vbd)
1317
1461
                       fake_resize_part_and_fs)
1318
1462
 
1319
1463
        ctx = context.RequestContext(self.user_id, self.project_id)
1320
 
        session = xenapi_conn.XenAPISession('test_url', 'root', 'test_pass')
 
1464
        session = xenapi_conn.XenAPISession('test_url', 'root', 'test_pass',
 
1465
                                            fake.FakeVirtAPI())
1321
1466
 
1322
1467
        disk_image_type = vm_utils.ImageType.DISK_VHD
1323
1468
        instance = db.instance_create(self.context, self.instance_values)
1328
1473
        vdis = {'root': {'uuid': vdi_uuid, 'ref': vdi_ref}}
1329
1474
 
1330
1475
        self.conn._vmops._attach_disks(instance, vm_ref, instance['name'],
1331
 
                                       disk_image_type, vdis)
 
1476
                                       vdis, disk_image_type)
1332
1477
 
1333
1478
        self.assertEqual(marker["partition_called"], called)
1334
1479
 
1372
1517
        super(XenAPIGenerateLocal, self).setUp()
1373
1518
        self.flags(xenapi_connection_url='test_url',
1374
1519
                   xenapi_connection_password='test_pass',
1375
 
                   xenapi_generate_swap=True,
1376
1520
                   firewall_driver='nova.virt.xenapi.firewall.'
1377
1521
                                   'Dom0IptablesFirewallDriver')
1378
1522
        stubs.stubout_session(self.stubs, stubs.FakeSessionForVMTests)
1379
1523
        db_fakes.stub_out_db_instance_api(self.stubs)
1380
 
        self.conn = xenapi_conn.XenAPIDriver(False)
 
1524
        self.conn = xenapi_conn.XenAPIDriver(fake.FakeVirtAPI(), False)
1381
1525
 
1382
1526
        self.user_id = 'fake'
1383
1527
        self.project_id = 'fake'
1396
1540
        self.context = context.RequestContext(self.user_id, self.project_id)
1397
1541
 
1398
1542
        def fake_create_vbd(session, vm_ref, vdi_ref, userdevice,
1399
 
                            vbd_type='disk', read_only=False, bootable=True):
 
1543
                            vbd_type='disk', read_only=False, bootable=True,
 
1544
                            osvol=False):
1400
1545
            pass
1401
1546
 
1402
1547
        self.stubs.Set(vm_utils, 'create_vbd', fake_create_vbd)
1403
1548
 
1404
1549
    def assertCalled(self, instance):
1405
1550
        ctx = context.RequestContext(self.user_id, self.project_id)
1406
 
        session = xenapi_conn.XenAPISession('test_url', 'root', 'test_pass')
 
1551
        session = xenapi_conn.XenAPISession('test_url', 'root', 'test_pass',
 
1552
                                            fake.FakeVirtAPI())
1407
1553
 
1408
1554
        disk_image_type = vm_utils.ImageType.DISK_VHD
1409
1555
        vm_ref = xenapi_fake.create_vm(instance['name'], 'Halted')
1414
1560
 
1415
1561
        self.called = False
1416
1562
        self.conn._vmops._attach_disks(instance, vm_ref, instance['name'],
1417
 
                                       disk_image_type, vdis)
 
1563
                                       vdis, disk_image_type)
1418
1564
        self.assertTrue(self.called)
1419
1565
 
1420
1566
    def test_generate_swap(self):
1423
1569
        instance = db.instance_update(self.context, instance['uuid'],
1424
1570
                                      {'instance_type_id': 5})
1425
1571
 
 
1572
        # NOTE(danms): because we're stubbing out the instance_types from
 
1573
        # the database, our instance['instance_type'] doesn't get properly
 
1574
        # filled out here, so put what we need into it
 
1575
        instance['instance_type']['swap'] = 1024
 
1576
 
1426
1577
        def fake_generate_swap(*args, **kwargs):
1427
1578
            self.called = True
1428
1579
        self.stubs.Set(vm_utils, 'generate_swap', fake_generate_swap)
1435
1586
        instance = db.instance_update(self.context, instance['uuid'],
1436
1587
                                      {'instance_type_id': 4})
1437
1588
 
 
1589
        # NOTE(danms): because we're stubbing out the instance_types from
 
1590
        # the database, our instance['instance_type'] doesn't get properly
 
1591
        # filled out here, so put what we need into it
 
1592
        instance['instance_type']['ephemeral_gb'] = 160
 
1593
 
1438
1594
        def fake_generate_ephemeral(*args):
1439
1595
            self.called = True
1440
1596
        self.stubs.Set(vm_utils, 'generate_ephemeral', fake_generate_ephemeral)
1442
1598
        self.assertCalled(instance)
1443
1599
 
1444
1600
 
1445
 
class XenAPIBWUsageTestCase(stubs.XenAPITestBase):
 
1601
class XenAPIBWCountersTestCase(stubs.XenAPITestBase):
 
1602
    FAKE_VMS = {'test1:ref': dict(name_label='test1',
 
1603
                                   other_config=dict(nova_uuid='hash'),
 
1604
                                   domid='12',
 
1605
                                   _vifmap={'0': "a:b:c:d...",
 
1606
                                           '1': "e:f:12:q..."}),
 
1607
                'test2:ref': dict(name_label='test2',
 
1608
                                   other_config=dict(nova_uuid='hash'),
 
1609
                                   domid='42',
 
1610
                                   _vifmap={'0': "a:3:c:d...",
 
1611
                                           '1': "e:f:42:q..."}),
 
1612
               }
 
1613
 
1446
1614
    def setUp(self):
1447
 
        super(XenAPIBWUsageTestCase, self).setUp()
1448
 
        self.stubs.Set(vm_utils, 'compile_metrics',
1449
 
                       XenAPIBWUsageTestCase._fake_compile_metrics)
 
1615
        super(XenAPIBWCountersTestCase, self).setUp()
 
1616
        self.stubs.Set(vm_utils, 'list_vms',
 
1617
                       XenAPIBWCountersTestCase._fake_list_vms)
1450
1618
        self.flags(xenapi_connection_url='test_url',
1451
1619
                   xenapi_connection_password='test_pass',
1452
1620
                   firewall_driver='nova.virt.xenapi.firewall.'
1453
1621
                                   'Dom0IptablesFirewallDriver')
1454
1622
        stubs.stubout_session(self.stubs, stubs.FakeSessionForVMTests)
1455
 
        self.conn = xenapi_conn.XenAPIDriver(False)
1456
 
 
1457
 
    @classmethod
1458
 
    def _fake_compile_metrics(cls, start_time, stop_time=None):
1459
 
        raise exception.CouldNotFetchMetrics()
1460
 
 
1461
 
    def test_get_all_bw_usage_in_failure_case(self):
1462
 
        """Test that get_all_bw_usage returns an empty list when metrics
1463
 
        compilation failed.  c.f. bug #910045.
 
1623
        self.conn = xenapi_conn.XenAPIDriver(fake.FakeVirtAPI(), False)
 
1624
 
 
1625
        def _fake_get_vif_device_map(vm_rec):
 
1626
            return vm_rec['_vifmap']
 
1627
 
 
1628
        self.stubs.Set(self.conn._vmops, "_get_vif_device_map",
 
1629
                                         _fake_get_vif_device_map)
 
1630
 
 
1631
    @classmethod
 
1632
    def _fake_list_vms(cls, session):
 
1633
        return cls.FAKE_VMS.iteritems()
 
1634
 
 
1635
    @classmethod
 
1636
    def _fake_fetch_bandwidth_mt(cls, session):
 
1637
        return {}
 
1638
 
 
1639
    @classmethod
 
1640
    def _fake_fetch_bandwidth(cls, session):
 
1641
        return {'42':
 
1642
                    {'0': {'bw_in': 21024, 'bw_out': 22048},
 
1643
                     '1': {'bw_in': 231337, 'bw_out': 221212121}},
 
1644
                '12':
 
1645
                    {'0': {'bw_in': 1024, 'bw_out': 2048},
 
1646
                     '1': {'bw_in': 31337, 'bw_out': 21212121}},
 
1647
                }
 
1648
 
 
1649
    def test_get_all_bw_counters(self):
 
1650
        class testinstance(object):
 
1651
            def __init__(self, name, uuid):
 
1652
                self.name = name
 
1653
                self.uuid = uuid
 
1654
 
 
1655
        self.stubs.Set(vm_utils, 'fetch_bandwidth',
 
1656
                       XenAPIBWCountersTestCase._fake_fetch_bandwidth)
 
1657
        result = self.conn.get_all_bw_counters([testinstance(
 
1658
                                                   name='test1',
 
1659
                                                   uuid='1-2-3'),
 
1660
                                                testinstance(
 
1661
                                                   name='test2',
 
1662
                                                   uuid='4-5-6')])
 
1663
        self.assertEqual(len(result), 4)
 
1664
        self.assertIn(dict(uuid='1-2-3',
 
1665
                           mac_address="a:b:c:d...",
 
1666
                           bw_in=1024,
 
1667
                           bw_out=2048), result)
 
1668
        self.assertIn(dict(uuid='1-2-3',
 
1669
                           mac_address="e:f:12:q...",
 
1670
                           bw_in=31337,
 
1671
                           bw_out=21212121), result)
 
1672
 
 
1673
        self.assertIn(dict(uuid='4-5-6',
 
1674
                           mac_address="a:3:c:d...",
 
1675
                           bw_in=21024,
 
1676
                           bw_out=22048), result)
 
1677
        self.assertIn(dict(uuid='4-5-6',
 
1678
                           mac_address="e:f:42:q...",
 
1679
                           bw_in=231337,
 
1680
                           bw_out=221212121), result)
 
1681
 
 
1682
    def test_get_all_bw_counters_in_failure_case(self):
 
1683
        """Test that get_all_bw_conters returns an empty list when
 
1684
        no data returned from Xenserver.  c.f. bug #910045.
1464
1685
        """
1465
1686
        class testinstance(object):
1466
1687
            def __init__(self):
1467
1688
                self.name = "instance-0001"
1468
1689
                self.uuid = "1-2-3-4-5"
1469
1690
 
1470
 
        result = self.conn.get_all_bw_usage([testinstance()],
1471
 
                                            timeutils.utcnow())
 
1691
        self.stubs.Set(vm_utils, 'fetch_bandwidth',
 
1692
                       XenAPIBWCountersTestCase._fake_fetch_bandwidth_mt)
 
1693
        result = self.conn.get_all_bw_counters([testinstance()])
1472
1694
        self.assertEqual(result, [])
1473
1695
 
1474
1696
 
1530
1752
        stubs.stubout_session(self.stubs, stubs.FakeSessionForFirewallTests,
1531
1753
                              test_case=self)
1532
1754
        self.context = context.RequestContext(self.user_id, self.project_id)
1533
 
        self.network = importutils.import_object(FLAGS.network_manager)
1534
 
        self.conn = xenapi_conn.XenAPIDriver(False)
 
1755
        self.network = importutils.import_object(CONF.network_manager)
 
1756
        self.conn = xenapi_conn.XenAPIDriver(fake.FakeVirtAPI(), False)
1535
1757
        self.fw = self.conn._vmops.firewall_driver
1536
1758
 
1537
1759
    def _create_instance_ref(self):
1784
2006
        """Ensure StorageRepositoryNotFound is raise when wrong filter."""
1785
2007
        self.flags(sr_matching_filter='yadayadayada')
1786
2008
        stubs.stubout_session(self.stubs, stubs.FakeSessionForVMTests)
1787
 
        session = xenapi_conn.XenAPISession('test_url', 'root', 'test_pass')
 
2009
        session = xenapi_conn.XenAPISession('test_url', 'root', 'test_pass',
 
2010
                                            fake.FakeVirtAPI())
1788
2011
        self.assertRaises(exception.StorageRepositoryNotFound,
1789
2012
                          vm_utils.safe_find_sr, session)
1790
2013
 
1792
2015
        """Ensure the default local-storage is found."""
1793
2016
        self.flags(sr_matching_filter='other-config:i18n-key=local-storage')
1794
2017
        stubs.stubout_session(self.stubs, stubs.FakeSessionForVMTests)
1795
 
        session = xenapi_conn.XenAPISession('test_url', 'root', 'test_pass')
 
2018
        session = xenapi_conn.XenAPISession('test_url', 'root', 'test_pass',
 
2019
                                            fake.FakeVirtAPI())
1796
2020
        host_ref = xenapi_fake.get_all('host')[0]
1797
2021
        local_sr = xenapi_fake.create_sr(
1798
2022
                              name_label='Fake Storage',
1808
2032
        """Ensure the SR is found when using a different filter."""
1809
2033
        self.flags(sr_matching_filter='other-config:my_fake_sr=true')
1810
2034
        stubs.stubout_session(self.stubs, stubs.FakeSessionForVMTests)
1811
 
        session = xenapi_conn.XenAPISession('test_url', 'root', 'test_pass')
 
2035
        session = xenapi_conn.XenAPISession('test_url', 'root', 'test_pass',
 
2036
                                            fake.FakeVirtAPI())
1812
2037
        host_ref = xenapi_fake.get_all('host')[0]
1813
2038
        local_sr = xenapi_fake.create_sr(name_label='Fake Storage',
1814
2039
                                         type='lvm',
1821
2046
        """Ensure the default SR is found regardless of other-config."""
1822
2047
        self.flags(sr_matching_filter='default-sr:true')
1823
2048
        stubs.stubout_session(self.stubs, stubs.FakeSessionForVMTests)
1824
 
        session = xenapi_conn.XenAPISession('test_url', 'root', 'test_pass')
 
2049
        session = xenapi_conn.XenAPISession('test_url', 'root', 'test_pass',
 
2050
                                            fake.FakeVirtAPI())
1825
2051
        pool_ref = xenapi_fake.create_pool('')
1826
2052
        expected = vm_utils.safe_find_sr(session)
1827
2053
        self.assertEqual(session.call_xenapi('pool.get_default_SR', pool_ref),
1853
2079
                   firewall_driver='nova.virt.xenapi.firewall.'
1854
2080
                                   'Dom0IptablesFirewallDriver',
1855
2081
                   host='host',
1856
 
                   connection_type='xenapi',
1857
 
                   compute_driver='nova.virt.xenapi.driver.XenAPIDriver')
 
2082
                   compute_driver='xenapi.XenAPIDriver',
 
2083
                   node_availability_zone='avail_zone1')
1858
2084
        host_ref = xenapi_fake.get_all('host')[0]
1859
2085
        stubs.stubout_session(self.stubs, stubs.FakeSessionForVMTests)
1860
2086
        self.context = context.get_admin_context()
1861
 
        self.conn = xenapi_conn.XenAPIDriver(False)
1862
 
        self.compute = importutils.import_object(FLAGS.compute_manager)
 
2087
        self.conn = xenapi_conn.XenAPIDriver(fake.FakeVirtAPI(), False)
 
2088
        self.compute = importutils.import_object(CONF.compute_manager)
1863
2089
        self.api = compute_api.AggregateAPI()
1864
2090
        values = {'name': 'test_aggr',
1865
2091
                  'availability_zone': 'test_zone',
1919
2145
        self.conn._pool.add_to_aggregate(self.context, aggregate, "host")
1920
2146
        result = db.aggregate_get(self.context, aggregate.id)
1921
2147
        self.assertTrue(fake_init_pool.called)
1922
 
        self.assertDictMatch(self.fake_metadata, result.metadetails)
 
2148
        self.assertThat(self.fake_metadata,
 
2149
                        matchers.DictMatches(result.metadetails))
1923
2150
 
1924
2151
    def test_join_slave(self):
1925
2152
        """Ensure join_slave gets called when the request gets to master."""
1997
2224
        self.conn._pool.remove_from_aggregate(self.context, aggregate, "host")
1998
2225
        result = db.aggregate_get(self.context, aggregate.id)
1999
2226
        self.assertTrue(fake_clear_pool.called)
2000
 
        self.assertDictMatch({pool_states.POOL_FLAG: 'XenAPI',
2001
 
                pool_states.KEY: pool_states.ACTIVE}, result.metadetails)
 
2227
        self.assertThat({pool_states.POOL_FLAG: 'XenAPI',
 
2228
                pool_states.KEY: pool_states.ACTIVE},
 
2229
                matchers.DictMatches(result.metadetails))
2002
2230
 
2003
2231
    def test_remote_master_non_empty_pool(self):
2004
2232
        """Ensure AggregateError is raised if removing the master."""
2101
2329
 
2102
2330
        self.assertRaises(exception.AggregateError,
2103
2331
                          self.compute.add_aggregate_host,
2104
 
                          self.context, self.aggr.id, "fake_host")
 
2332
                          self.context, "fake_host",
 
2333
                          aggregate=jsonutils.to_primitive(self.aggr))
2105
2334
        excepted = db.aggregate_get(self.context, self.aggr.id)
2106
2335
        self.assertEqual(excepted.metadetails[pool_states.KEY],
2107
2336
                pool_states.ERROR)
2118
2347
    def __init__(self):
2119
2348
        self._mock_calls = []
2120
2349
 
2121
 
    def add_aggregate_host(self, ctxt, aggregate_id,
 
2350
    def add_aggregate_host(self, ctxt, aggregate,
2122
2351
                                     host_param, host, slave_info):
2123
2352
        self._mock_calls.append((
2124
 
            self.add_aggregate_host, ctxt, aggregate_id,
 
2353
            self.add_aggregate_host, ctxt, aggregate,
2125
2354
            host_param, host, slave_info))
2126
2355
 
2127
2356
    def remove_aggregate_host(self, ctxt, aggregate_id, host_param,
2164
2393
 
2165
2394
        self.assertIn(
2166
2395
            (slave.compute_rpcapi.add_aggregate_host,
2167
 
            "CONTEXT", 98, "slave", "master", "SLAVE_INFO"),
 
2396
            "CONTEXT", jsonutils.to_primitive(aggregate),
 
2397
            "slave", "master", "SLAVE_INFO"),
2168
2398
            slave.compute_rpcapi._mock_calls)
2169
2399
 
2170
2400
    def test_slave_asks_master_to_remove_slave_from_pool(self):
2204
2434
    """Unit tests for xenapi utils."""
2205
2435
 
2206
2436
    def test_upload_image(self):
2207
 
        """Ensure image properties include instance system metadata
2208
 
           as well as few local settings."""
2209
 
 
2210
2437
        def fake_instance_system_metadata_get(context, uuid):
2211
2438
            return dict(image_a=1, image_b=2, image_c='c', d='d')
2212
2439
 
2245
2472
        vm_utils.upload_image(ctx, session, instance, "vmi uuids", "image id")
2246
2473
 
2247
2474
        actual = self.kwargs['properties']
2248
 
        expected = dict(a=1, b=2, c='c', d='d',
2249
 
                        auto_disk_config='auto disk config',
 
2475
        # Inheritance happens in another place, now
 
2476
        expected = dict(auto_disk_config='auto disk config',
2250
2477
                        os_type='os type')
2251
2478
        self.assertEquals(expected, actual)
2252
2479
 
2266
2493
 
2267
2494
    def test_live_migration_calls_vmops(self):
2268
2495
        stubs.stubout_session(self.stubs, stubs.FakeSessionForVMTests)
2269
 
        self.conn = xenapi_conn.XenAPIDriver(False)
 
2496
        self.conn = xenapi_conn.XenAPIDriver(fake.FakeVirtAPI(), False)
2270
2497
 
2271
2498
        def fake_live_migrate(context, instance_ref, dest, post_method,
2272
2499
                              recover_method, block_migration, migrate_data):
2280
2507
    def test_pre_live_migration(self):
2281
2508
        # ensure method is present
2282
2509
        stubs.stubout_session(self.stubs, stubs.FakeSessionForVMTests)
2283
 
        self.conn = xenapi_conn.XenAPIDriver(False)
 
2510
        self.conn = xenapi_conn.XenAPIDriver(fake.FakeVirtAPI(), False)
2284
2511
        self.conn.pre_live_migration(None, None, None, None)
2285
2512
 
2286
2513
    def test_post_live_migration_at_destination(self):
2287
2514
        # ensure method is present
2288
2515
        stubs.stubout_session(self.stubs, stubs.FakeSessionForVMTests)
2289
 
        self.conn = xenapi_conn.XenAPIDriver(False)
 
2516
        self.conn = xenapi_conn.XenAPIDriver(fake.FakeVirtAPI(), False)
2290
2517
        self.conn.post_live_migration_at_destination(None, None, None, None)
2291
2518
 
2292
2519
    def test_check_can_live_migrate_destination_with_block_migration(self):
2293
2520
        stubs.stubout_session(self.stubs, stubs.FakeSessionForVMTests)
2294
 
        self.conn = xenapi_conn.XenAPIDriver(False)
 
2521
        self.conn = xenapi_conn.XenAPIDriver(fake.FakeVirtAPI(), False)
2295
2522
 
2296
2523
        self.stubs.Set(vm_utils, "safe_find_sr", lambda _x: "asdf")
2297
2524
 
2302
2529
                        }
2303
2530
                    }
2304
2531
        result = self.conn.check_can_live_migrate_destination(self.context,
2305
 
                              {'host': 'host'}, True, False)
 
2532
                              {'host': 'host'},
 
2533
                              {}, {},
 
2534
                              True, False)
2306
2535
        self.assertEqual(expected, result)
2307
2536
 
2308
2537
    def test_check_can_live_migrate_destination_block_migration_fails(self):
2309
2538
        stubs.stubout_session(self.stubs,
2310
2539
                              stubs.FakeSessionForFailedMigrateTests)
2311
 
        self.conn = xenapi_conn.XenAPIDriver(False)
 
2540
        self.conn = xenapi_conn.XenAPIDriver(fake.FakeVirtAPI(), False)
2312
2541
        self.assertRaises(exception.MigrationError,
2313
2542
                          self.conn.check_can_live_migrate_destination,
2314
 
                          self.context, {'host': 'host'}, True, False)
 
2543
                          self.context, {'host': 'host'},
 
2544
                          {}, {},
 
2545
                          True, False)
2315
2546
 
2316
2547
    def test_check_can_live_migrate_source_with_block_migrate(self):
2317
2548
        stubs.stubout_session(self.stubs, stubs.FakeSessionForVMTests)
2318
 
        self.conn = xenapi_conn.XenAPIDriver(False)
 
2549
        self.conn = xenapi_conn.XenAPIDriver(fake.FakeVirtAPI(), False)
2319
2550
 
2320
2551
        def fake_generate_vdi_map(destination_sr_ref, _vm_ref):
2321
2552
            pass
2333
2564
                            'destination_sr_ref': None,
2334
2565
                            'migrate_send_data': None
2335
2566
                           }}
2336
 
        self.assertNotRaises(None,
2337
 
                             self.conn.check_can_live_migrate_source,
2338
 
                             self.context,
2339
 
                             {'host': 'host'},
2340
 
                             dest_check_data)
 
2567
        self.conn.check_can_live_migrate_source(self.context,
 
2568
                                                {'host': 'host'},
 
2569
                                                dest_check_data)
2341
2570
 
2342
2571
    def test_check_can_live_migrate_source_with_block_migrate_fails(self):
2343
2572
        stubs.stubout_session(self.stubs,
2344
2573
                              stubs.FakeSessionForFailedMigrateTests)
2345
 
        self.conn = xenapi_conn.XenAPIDriver(False)
 
2574
        self.conn = xenapi_conn.XenAPIDriver(fake.FakeVirtAPI(), False)
2346
2575
 
2347
2576
        def fake_generate_vdi_map(destination_sr_ref, _vm_ref):
2348
2577
            pass
2369
2598
 
2370
2599
    def test_check_can_live_migrate_works(self):
2371
2600
        stubs.stubout_session(self.stubs, stubs.FakeSessionForVMTests)
2372
 
        self.conn = xenapi_conn.XenAPIDriver(False)
 
2601
        self.conn = xenapi_conn.XenAPIDriver(fake.FakeVirtAPI(), False)
2373
2602
 
2374
2603
        class fake_aggregate:
2375
2604
            def __init__(self):
2376
2605
                self.metadetails = {"host": "test_host_uuid"}
2377
2606
 
2378
2607
        def fake_aggregate_get_by_host(context, host, key=None):
2379
 
            self.assertEqual(FLAGS.host, host)
 
2608
            self.assertEqual(CONF.host, host)
2380
2609
            return [fake_aggregate()]
2381
2610
 
2382
2611
        self.stubs.Set(db, "aggregate_get_by_host",
2386
2615
 
2387
2616
    def test_check_can_live_migrate_fails(self):
2388
2617
        stubs.stubout_session(self.stubs, stubs.FakeSessionForVMTests)
2389
 
        self.conn = xenapi_conn.XenAPIDriver(False)
 
2618
        self.conn = xenapi_conn.XenAPIDriver(fake.FakeVirtAPI(), False)
2390
2619
 
2391
2620
        class fake_aggregate:
2392
2621
            def __init__(self):
2393
2622
                self.metadetails = {"dest_other": "test_host_uuid"}
2394
2623
 
2395
2624
        def fake_aggregate_get_by_host(context, host, key=None):
2396
 
            self.assertEqual(FLAGS.host, host)
 
2625
            self.assertEqual(CONF.host, host)
2397
2626
            return [fake_aggregate()]
2398
2627
 
2399
2628
        self.stubs.Set(db, "aggregate_get_by_host",
2404
2633
 
2405
2634
    def test_live_migration(self):
2406
2635
        stubs.stubout_session(self.stubs, stubs.FakeSessionForVMTests)
2407
 
        self.conn = xenapi_conn.XenAPIDriver(False)
 
2636
        self.conn = xenapi_conn.XenAPIDriver(fake.FakeVirtAPI(), False)
2408
2637
 
2409
2638
        def fake_get_vm_opaque_ref(instance):
2410
2639
            return "fake_vm"
2426
2655
 
2427
2656
    def test_live_migration_on_failure(self):
2428
2657
        stubs.stubout_session(self.stubs, stubs.FakeSessionForVMTests)
2429
 
        self.conn = xenapi_conn.XenAPIDriver(False)
 
2658
        self.conn = xenapi_conn.XenAPIDriver(fake.FakeVirtAPI(), False)
2430
2659
 
2431
2660
        def fake_get_vm_opaque_ref(instance):
2432
2661
            return "fake_vm"
2453
2682
 
2454
2683
    def test_live_migration_calls_post_migration(self):
2455
2684
        stubs.stubout_session(self.stubs, stubs.FakeSessionForVMTests)
2456
 
        self.conn = xenapi_conn.XenAPIDriver(False)
 
2685
        self.conn = xenapi_conn.XenAPIDriver(fake.FakeVirtAPI(), False)
2457
2686
 
2458
2687
        def fake_generate_vdi_map(destination_sr_ref, _vm_ref):
2459
2688
            pass
2480
2709
 
2481
2710
    def test_live_migration_with_block_migration_raises_invalid_param(self):
2482
2711
        stubs.stubout_session(self.stubs, stubs.FakeSessionForVMTests)
2483
 
        self.conn = xenapi_conn.XenAPIDriver(False)
 
2712
        self.conn = xenapi_conn.XenAPIDriver(fake.FakeVirtAPI(), False)
2484
2713
 
2485
2714
        def fake_get_vm_opaque_ref(instance):
2486
2715
            return "fake_vm"
2499
2728
    def test_live_migration_with_block_migration_fails_migrate_send(self):
2500
2729
        stubs.stubout_session(self.stubs,
2501
2730
                              stubs.FakeSessionForFailedMigrateTests)
2502
 
        self.conn = xenapi_conn.XenAPIDriver(False)
 
2731
        self.conn = xenapi_conn.XenAPIDriver(fake.FakeVirtAPI(), False)
2503
2732
 
2504
2733
        def fake_get_vm_opaque_ref(instance):
2505
2734
            return "fake_vm"
2533
2762
 
2534
2763
        stubs.stubout_session(self.stubs, Session)
2535
2764
 
2536
 
        conn = xenapi_conn.XenAPIDriver(False)
 
2765
        conn = xenapi_conn.XenAPIDriver(fake.FakeVirtAPI(), False)
2537
2766
 
2538
2767
        def fake_get_vm_opaque_ref(instance):
2539
2768
            return "fake_vm"
2559
2788
 
2560
2789
    def test_generate_vdi_map(self):
2561
2790
        stubs.stubout_session(self.stubs, xenapi_fake.SessionBase)
2562
 
        conn = xenapi_conn.XenAPIDriver(False)
 
2791
        conn = xenapi_conn.XenAPIDriver(fake.FakeVirtAPI(), False)
2563
2792
 
2564
2793
        vm_ref = "fake_vm_ref"
2565
2794
 
2591
2820
                   firewall_driver='nova.virt.xenapi.firewall.'
2592
2821
                                   'Dom0IptablesFirewallDriver')
2593
2822
        stubs.stubout_session(self.stubs, stubs.FakeSessionForVMTests)
2594
 
        self.conn = xenapi_conn.XenAPIDriver(False)
 
2823
        self.conn = xenapi_conn.XenAPIDriver(fake.FakeVirtAPI(), False)
2595
2824
 
2596
2825
        self.xenstore = dict(persist={}, ephem={})
2597
2826
 
2762
2991
 
2763
2992
    def test_check_resize_func_name_defaults_to_VDI_resize(self):
2764
2993
        session = self._get_mock_session(None, None)
2765
 
        ops = vmops.VMOps(session)
 
2994
        ops = vmops.VMOps(session, fake.FakeVirtAPI())
2766
2995
 
2767
2996
        self.assertEquals(
2768
2997
            'VDI.resize',