Exemple #1
0
 def test_place_new_with_cpu(self, mem_overcommit, cpu_overcommit,
                             expected):
     vm = Vm(new_id(), VM_FLAVOR, State.STOPPED, None)
     manager = PMBuilder(mem_overcommit=mem_overcommit,
                         cpu_overcommit=cpu_overcommit).build()
     score, placement_list = manager.place(vm, None)
     assert_that(score, is_(AgentPlacementScore(*expected)))
Exemple #2
0
 def test_place_new_with_mem_consumed(self, mem_consumed, mem_overcommit,
                                      expected):
     vm = Vm(new_id(), VM_FLAVOR, State.STOPPED, None)
     manager = PMBuilder(mem_overcommit=mem_overcommit).build()
     manager._system.host_consumed_memory_mb.return_value = mem_consumed
     score, placement_list = manager.place(vm, None)
     assert_that(score, is_(AgentPlacementScore(*expected)))
Exemple #3
0
    def test_place_vm_existing_image_two_matching_datastores(self):
        ds_map = {
            "datastore_id_1": (DatastoreInfo(8 * 1024, 0), set([])),
            "datastore_id_2": (DatastoreInfo(16 * 1024, 0), set([])),
            "datastore_id_3": (DatastoreInfo(15 * 1024, 0), set([]))
        }
        ds_with_image = ["datastore_id_1", "datastore_id_2"]
        manager = PMBuilder(ds_map=ds_map, ds_with_image=ds_with_image).build()
        total_storage = sum(t[0].total for t in ds_map.values())

        image = DiskImage("disk_image", DiskImage.COPY_ON_WRITE)
        # disk1 and disk2 both take 1/100
        disk1 = Disk(new_id(), DISK_FLAVOR, False, True, total_storage / 100,
                     image)
        disk2 = Disk(new_id(), DISK_FLAVOR, False, True, total_storage / 100,
                     image)
        vm = Vm(new_id(), self._vm_flavor_mb(1), State.STOPPED, None, None,
                [disk1, disk2])
        score, placement_list = manager.place(vm, None)

        # There are 2 disk of approx size 1/100 of avail space
        # the score should be 98
        assert_that(score, is_(AgentPlacementScore(98, 100)))

        base_index = 0
        assert_that(placement_list[base_index].resource_id, is_(vm.id))
        assert_that(placement_list[base_index].container_id,
                    is_("datastore_id_2"))
        base_index += 1
        assert_that(placement_list[base_index].resource_id, is_(disk1.id))
        assert_that(placement_list[base_index + 1].resource_id, is_(disk2.id))
        assert_that(placement_list[base_index].container_id,
                    is_("datastore_id_2"))
        assert_that(placement_list[base_index + 1].container_id,
                    is_("datastore_id_2"))
Exemple #4
0
 def test_place_vm_no_disks(self):
     manager = PMBuilder().build()
     vm = Vm(new_id(), VM_FLAVOR, State.STOPPED, None, None, None)
     score, placement_list = manager.place(vm, None)
     assert_that(score, is_(AgentPlacementScore(97, 100)))
     assert_that(len(placement_list) is 1)
     assert_that(placement_list[0].resource_id, equal_to(vm.id))
     assert_that(placement_list[0].container_id, equal_to('datastore_id_1'))
Exemple #5
0
    def test_place_new_with_reservations(self, disk1_capacity, disk2_capacity,
                                         overcommit, expected):
        disk1 = Disk(new_id(), DISK_FLAVOR, True, True, disk1_capacity)
        disk2 = Disk(new_id(), DISK_FLAVOR, True, True, disk2_capacity)
        vm = Vm(new_id(), VM_FLAVOR, State.STOPPED, None)
        vm.disks = [disk1, disk2]

        manager = PMBuilder(mem_overcommit=overcommit).build()
        # Disable freespace based admission control.
        manager.FREESPACE_THRESHOLD = 0
        manager.reserve(vm, None)
        score, placement_list = manager.place(vm, None)
        assert_that(score, is_(AgentPlacementScore(*expected)))
Exemple #6
0
    def test_place_large_disks(self, use_vm):
        ds_map = {
            "datastore_id_1": (DatastoreInfo(1 * 1024, 0), set([])),
            "datastore_id_2": (DatastoreInfo(2 * 1024, 0), set([])),
            "datastore_id_3": (DatastoreInfo(3 * 1024, 0), set([]))
        }
        ds_with_image = ["datastore_id_3"]
        total_storage = sum(t[0].total for t in ds_map.values())
        manager = PMBuilder(ds_map=ds_map, ds_with_image=ds_with_image).build()

        image = DiskImage("disk_image", DiskImage.FULL_COPY)
        disk1 = Disk(new_id(), DISK_FLAVOR, False, True, 1024, image)
        disk2 = Disk(new_id(), DISK_FLAVOR, False, True, 1024, image)
        disk3 = Disk(new_id(), DISK_FLAVOR, False, True, 1024, image)
        disk4 = Disk(new_id(), DISK_FLAVOR, False, True, 1024, image)
        disk_list = [disk1, disk2, disk3, disk4]
        used_storage = sum(disk.capacity_gb for disk in disk_list)

        if use_vm:
            vm = Vm(new_id(), VM_FLAVOR, State.STOPPED, None, None, disk_list)
            disks = None
        else:
            vm = None
            disks = disk_list
        score, placement_list = manager.place(vm, disks)

        # optimal placement cannot be achieved,
        # divide the expected score by NOT_OPTIMAL_DIVIDE_FACTOR
        expected_score = 100 * (total_storage - used_storage) / \
            total_storage / PlacementManager.NOT_OPTIMAL_DIVIDE_FACTOR
        assert_that(score, is_(AgentPlacementScore(expected_score, 100)))
        base_index = 0

        if vm:
            assert_that(placement_list[base_index].resource_id, is_(vm.id))
            assert_that(placement_list[base_index].container_id,
                        is_("datastore_id_3"))
            base_index += 1

        assert_that(placement_list[base_index].resource_id, is_(disk1.id))
        assert_that(placement_list[base_index + 1].resource_id, is_(disk2.id))
        assert_that(placement_list[base_index + 2].resource_id, is_(disk3.id))
        assert_that(placement_list[base_index + 3].resource_id, is_(disk4.id))
        assert_that(placement_list[base_index].container_id,
                    is_("datastore_id_3"))
        assert_that(placement_list[base_index + 1].container_id,
                    is_("datastore_id_3"))
        assert_that(placement_list[base_index + 2].container_id,
                    is_("datastore_id_3"))
        assert_that(placement_list[base_index + 3].container_id,
                    is_("datastore_id_2"))
Exemple #7
0
    def test_place_with_disks_constraints(self):
        ds_map = {
            "datastore_id_1": (DatastoreInfo(8 * 1024, 0), set([])),
            "datastore_id_2": (DatastoreInfo(16 * 1024, 0), set([])),
            "datastore_id_3": (DatastoreInfo(16 * 1024, 0), set([]))
        }
        ds_name_id_map = {
            "ds1": "datastore_id_1",
            "ds2": "datastore_id_2",
            "ds3": "datastore_id_3"
        }
        ds_with_image = ["datastore_id_1", "datastore_id_2"]
        total_storage = sum(t[0].total for t in ds_map.values())
        manager = PMBuilder(ds_map=ds_map,
                            ds_with_image=ds_with_image,
                            ds_name_id_map=ds_name_id_map).build()
        # Disable freespace based admission control.
        manager.FREESPACE_THRESHOLD = 0

        image = DiskImage("disk_image", DiskImage.COPY_ON_WRITE)
        constraint1 = ResourceConstraint(ResourceConstraintType.DATASTORE,
                                         ["datastore_id_1"])
        constraint2 = ResourceConstraint(ResourceConstraintType.DATASTORE,
                                         ["ds2"])
        disk1 = Disk(new_id(),
                     DISK_FLAVOR,
                     False,
                     True,
                     total_storage / 100,
                     image,
                     constraints=[constraint1])
        disk2 = Disk(new_id(),
                     DISK_FLAVOR,
                     False,
                     True,
                     total_storage / 100,
                     image,
                     constraints=[constraint2])
        disks = [disk1, disk2]

        score, placement_list = manager.place(None, disks)
        # Image disks doesn't count in utilization score
        assert_that(score, is_(AgentPlacementScore(100, 100)))

        base_index = 0
        assert_that(placement_list[base_index].resource_id, is_(disk1.id))
        assert_that(placement_list[base_index + 1].resource_id, is_(disk2.id))
        assert_that(placement_list[base_index].container_id,
                    is_("datastore_id_1"))
        assert_that(placement_list[base_index + 1].container_id,
                    is_("datastore_id_2"))
Exemple #8
0
    def test_place_disks_with_threshold(self, use_vm, threshold, expected):
        ds_map = {"datastore_id_1": (DatastoreInfo(1 * 1024, 0), set([]))}
        manager = PMBuilder(ds_map=ds_map).build()
        manager.FREESPACE_THRESHOLD = threshold

        disk1 = Disk(new_id(), DISK_FLAVOR, False, True, 512, None)
        disk_list = [disk1]

        if use_vm:
            vm = Vm(new_id(), VM_FLAVOR, State.STOPPED, None, None, disk_list)
            disks = None
        else:
            vm = None
            disks = disk_list
        score, placement_list = manager.place(vm, disks)

        # optimal placement cannot be achieved,
        # divide the expected score by NOT_OPTIMAL_DIVIDE_FACTOR
        assert_that(score, is_(AgentPlacementScore(expected, 100)))
Exemple #9
0
    def test_place_vm_in_no_image_datastore(self):
        ds_map = {
            "datastore_id_1": (DatastoreInfo(8 * 1024, 0), set([])),
            "datastore_id_2": (DatastoreInfo(8 * 1024, 0), set([])),
            "datastore_id_3": (DatastoreInfo(16 * 1024, 0), set([]))
        }
        ds_with_image = ["datastore_id_1", "datastore_id_2"]
        manager = PMBuilder(ds_map=ds_map,
                            ds_with_image=ds_with_image,
                            image_size=100 * 1024 * 1024).build()
        total_storage = sum(t[0].total for t in ds_map.values())

        image = DiskImage("disk_image", DiskImage.COPY_ON_WRITE)
        # disk1 and disk2 both take 1/100
        disk1 = Disk(new_id(), DISK_FLAVOR, False, True, total_storage / 100,
                     image)
        disk2 = Disk(new_id(), DISK_FLAVOR, False, True, total_storage / 100)
        vm = Vm(new_id(), self._vm_flavor_mb(1), State.STOPPED, None, None,
                [disk1, disk2])
        score, placement_list = manager.place(vm, None)

        # disk1 and disk2 both take 1% space, so utilization score is 98
        # image takes 100MB, which is 10% of 1GB, so transfer score is 90
        assert_that(score, is_(AgentPlacementScore(98, 90)))
        assert_that(placement_list, has_length(3))
        for placement in placement_list:
            assert_that(placement.container_id, is_("datastore_id_3"))

        # no other datastores except only image datastore available,
        # and use_image_datastore_for_vms:False, thus should fail.
        ds_map = {"image_datastore": (DatastoreInfo(8 * 1024, 0), set())}
        manager = PMBuilder(ds_map=ds_map, im_ds_for_vm=False).build()
        # vm with disks
        self.assertRaises(NoSuchResourceException, manager.place, vm, None)
        # vm without disks
        vm = Vm(new_id(), VM_FLAVOR, State.STOPPED)
        self.assertRaises(NoSuchResourceException, manager.place, vm, None)
Exemple #10
0
    def test_place_large_disks_image_datastore(self, use_vm):
        ds_map = {"datastore_id_1": (DatastoreInfo(3 * 1024, 0), set([]))}
        ds_with_image = ["datastore_id_1", "datastore_id_2"]
        total_storage = sum(t[0].total for t in ds_map.values())
        manager = PMBuilder(ds_map=ds_map, ds_with_image=ds_with_image).build()
        # Disable freespace based admission control.
        manager.FREESPACE_THRESHOLD = 0

        disk1 = Disk(new_id(), DISK_FLAVOR, False, True, 1024)
        disk2 = Disk(new_id(), DISK_FLAVOR, False, True, 1024)
        disk_list = [disk1, disk2]
        used_storage = sum(disk.capacity_gb for disk in disk_list)
        if use_vm:
            vm = Vm(new_id(), VM_FLAVOR, State.STOPPED, None, None, disk_list)
            disks = None
        else:
            vm = None
            disks = disk_list
        score, placement_list = manager.place(vm, disks)
        expected_score = 100 * (total_storage - used_storage) / total_storage
        assert_that(score, is_(AgentPlacementScore(expected_score, 100)))
        base_index = 0

        if vm:
            assert_that(placement_list[base_index].resource_id, is_(vm.id))
            assert_that(placement_list[base_index].container_id,
                        is_("datastore_id_1"))
            base_index += 1

        assert_that(placement_list[base_index].resource_id, is_(disk1.id))
        assert_that(placement_list[base_index + 1].resource_id, is_(disk2.id))

        assert_that(placement_list[base_index].container_id,
                    is_("datastore_id_1"))
        assert_that(placement_list[base_index + 1].container_id,
                    is_("datastore_id_1"))
Exemple #11
0
 def test_empty_disk_place(self, overcommit, vm_memory, expected):
     vm = Vm(new_id(), self._vm_flavor_gb(vm_memory), State.STOPPED, None)
     manager = PMBuilder(mem_overcommit=overcommit).build()
     score, placement_list = manager.place(vm, None)
     assert_that(score, is_(AgentPlacementScore(*expected)))