Esempio n. 1
0
    def test_create_vm_on_correct_resource(self):
        """Check that we create the vm on the correct datastore"""

        vm = MagicMock()
        vm.id = str(uuid.uuid4())
        vm.networks = ["net_1", "net_2"]
        vm.project_id = "p1"
        vm.tenant_id = "t1"

        mock_env = MagicMock()
        mock_reservation = MagicMock()
        mock_net_spec = MagicMock()

        req = CreateVmRequest(reservation=mock_reservation,
                              environment=mock_env,
                              network_connection_spec=mock_net_spec)
        image_id = stable_uuid('image_id')
        handler = HostHandler(MagicMock())
        pm = handler.hypervisor.placement_manager
        pm.consume_vm_reservation.return_value = vm
        handler._datastores_for_image = MagicMock()
        handler.hypervisor.datastore_manager.datastore_type.\
            return_value = DatastoreType.EXT3
        handler.hypervisor.datastore_manager.image_datastores = MagicMock(
            return_value=set("ds2"))
        im = handler.hypervisor.image_manager
        im.get_image_refcount_filename.return_value = \
            os.path.join(self.agent_conf_dir, vm.id)
        im.get_image_id_from_disks.return_value = image_id

        # No placement descriptor
        vm.placement = None
        response = handler.create_vm(req)
        pm.remove_vm_reservation.assert_called_once_with(mock_reservation)
        assert_that(response.result,
                    equal_to(CreateVmResultCode.PLACEMENT_NOT_FOUND))

        # If vm reservation has placement datastore info, it should
        # be placed there
        handler.hypervisor.vm_manager.create_vm_spec.reset_mock()
        pm.remove_vm_reservation.reset_mock()
        vm.placement = AgentResourcePlacement(AgentResourcePlacement.VM,
                                              "vm_ids", "ds2")
        response = handler.create_vm(req)
        spec = handler.hypervisor.vm_manager.create_vm_spec.return_value
        metadata = handler.hypervisor.image_manager.image_metadata.return_value
        handler.hypervisor.vm_manager.create_vm_spec.assert_called_once_with(
            vm.id, "ds2", vm.flavor, metadata, mock_env, image_id=image_id)
        handler.hypervisor.vm_manager.create_vm.assert_called_once_with(
            vm.id, spec)
        handler.hypervisor.vm_manager.set_vminfo.assert_called_once_with(
            spec, {
                handler.VMINFO_PROJECT_KEY: 'p1',
                handler.VMINFO_TENANT_KEY: 't1'
            })
        pm.remove_vm_reservation.assert_called_once_with(mock_reservation)
        assert_that(response.result, equal_to(CreateVmResultCode.OK))

        # Test create_vm honors vm.networks information
        # Host has the provisioned networks required by placement_list,
        # should succeed.
        handler.hypervisor.network_manager.get_vm_networks.return_value = \
            ["net_2", "net_1"]
        add_nic_mock = MagicMock()
        handler.hypervisor.vm_manager.add_nic = add_nic_mock

        handler.hypervisor.vm_manager.create_vm_spec.reset_mock()
        pm.remove_vm_reservation.reset_mock()
        spec = handler.hypervisor.vm_manager.create_vm_spec.return_value
        req = CreateVmRequest(reservation=mock_reservation)
        response = handler.create_vm(req)

        called_networks = add_nic_mock.call_args_list
        expected_networks = [call(spec, 'net_1'), call(spec, 'net_2')]
        assert_that(called_networks == expected_networks, is_(True))
        pm.remove_vm_reservation.assert_called_once_with(mock_reservation)
        assert_that(response.result, equal_to(CreateVmResultCode.OK))

        # Host does not have the provisioned networks
        # required by placement_list, should fail.
        handler.hypervisor.network_manager.get_vm_networks.return_value = \
            ["net_1", "net_7"]
        handler.hypervisor.vm_manager.add_nic.reset_mock()
        pm.remove_vm_reservation.reset_mock()

        req = CreateVmRequest(reservation=mock_reservation)
        response = handler.create_vm(req)

        pm.remove_vm_reservation.assert_called_once_with(mock_reservation)
        assert_that(response.result,
                    equal_to(CreateVmResultCode.NETWORK_NOT_FOUND))
    def test_create_vm_on_correct_resource(self):
        """Check that we create the vm on the correct datastore"""

        vm = MagicMock()
        vm.id = str(uuid.uuid4())
        vm.networks = [NetworkInfo(NetworkInfoType.NETWORK, "net_1"),
                       NetworkInfo(NetworkInfoType.NETWORK, "net_2")]
        vm.project_id = "p1"
        vm.tenant_id = "t1"

        mock_env = MagicMock()
        mock_reservation = MagicMock()

        req = CreateVmRequest(reservation=mock_reservation, environment=mock_env)
        image_id = stable_uuid('image_id')
        handler = HostHandler(MagicMock())
        pm = handler.hypervisor.placement_manager
        pm.consume_vm_reservation.return_value = vm
        handler._datastores_for_image = MagicMock()
        handler.hypervisor.datastore_manager.datastore_type.return_value = DatastoreType.EXT3
        handler.hypervisor.datastore_manager.image_datastores = MagicMock(return_value=set("ds2"))
        handler.hypervisor.vm_manager.get_vm_networks = MagicMock()
        im = handler.hypervisor.image_manager
        im.get_image_refcount_filename.return_value = os.path.join(self.agent_conf_dir, vm.id)
        im.get_image_id_from_disks.return_value = image_id

        # No placement descriptor
        vm.placement = None
        response = handler.create_vm(req)
        pm.remove_vm_reservation.assert_called_once_with(mock_reservation)
        assert_that(response.result, equal_to(CreateVmResultCode.PLACEMENT_NOT_FOUND))

        # If vm reservation has placement datastore info, it should
        # be placed there
        handler.hypervisor.vm_manager.create_vm_spec.reset_mock()
        pm.remove_vm_reservation.reset_mock()
        vm.placement = AgentResourcePlacement(AgentResourcePlacement.VM, "vm_ids", "ds2")
        handler.hypervisor.network_manager.get_vm_networks.return_value = ["net_2", "net_1"]

        response = handler.create_vm(req)
        spec = handler.hypervisor.vm_manager.create_vm_spec.return_value
        metadata = handler.hypervisor.image_manager.image_metadata.return_value
        handler.hypervisor.vm_manager.create_vm_spec.assert_called_once_with(
            vm.id, "ds2", vm.flavor, metadata, mock_env)
        handler.hypervisor.vm_manager.create_vm.assert_called_once_with(vm.id, spec)
        pm.remove_vm_reservation.assert_called_once_with(mock_reservation)
        assert_that(response.result, equal_to(CreateVmResultCode.OK))

        # Test create_vm honors vm.networks information
        # Host has the provisioned networks required by placement_list,
        # should succeed.
        handler.hypervisor.network_manager.get_vm_networks.return_value = ["net_2", "net_1"]

        handler.hypervisor.vm_manager.create_vm_spec.reset_mock()
        pm.remove_vm_reservation.reset_mock()
        spec = handler.hypervisor.vm_manager.create_vm_spec.return_value
        req = CreateVmRequest(reservation=mock_reservation)
        response = handler.create_vm(req)

        called_networks = spec.add_nic.call_args_list
        expected_networks = [call('net_1'), call('net_2')]
        assert_that(called_networks == expected_networks, is_(True))
        pm.remove_vm_reservation.assert_called_once_with(mock_reservation)
        assert_that(response.result, equal_to(CreateVmResultCode.OK))

        # Host does not have the provisioned networks
        # required by placement_list, should fail.
        handler.hypervisor.network_manager.get_vm_networks.return_value = ["net_1", "net_7"]
        pm.remove_vm_reservation.reset_mock()

        req = CreateVmRequest(reservation=mock_reservation)
        response = handler.create_vm(req)

        pm.remove_vm_reservation.assert_called_once_with(mock_reservation)
        assert_that(response.result, equal_to(CreateVmResultCode.NETWORK_NOT_FOUND))

        # Test create_vm honors vm.networks information (virtual network)
        # should succeed.
        vm.networks = [NetworkInfo(NetworkInfoType.VIRTUAL_NETWORK, "vnet")]

        handler.hypervisor.vm_manager.create_vm_spec.reset_mock()
        pm.remove_vm_reservation.reset_mock()
        req = CreateVmRequest(reservation=mock_reservation)
        response = handler.create_vm(req)

        called_virtual_network = handler.hypervisor.vm_manager.attach_virtual_network.call_args_list
        expected_virtual_network = [call(vm.id, 'vnet')]
        assert_that(called_virtual_network == expected_virtual_network, is_(True))
        pm.remove_vm_reservation.assert_called_once_with(mock_reservation)
        assert_that(response.result, equal_to(CreateVmResultCode.OK))
Esempio n. 3
0
    def test_create_vm(self):
        handler = HostHandler(MagicMock())
        # test create_vm under entering-maintenance-mode and maintenance mode
        state = common.services.get(ServiceName.MODE)
        state.set_mode(MODE.ENTERING_MAINTENANCE)
        request = MagicMock()
        response = handler.create_vm(request)
        assert_that(response.result,
                    equal_to(CreateVmResultCode.OPERATION_NOT_ALLOWED))

        state.set_mode(MODE.MAINTENANCE)
        response = handler.create_vm(request)
        assert_that(response.result,
                    equal_to(CreateVmResultCode.OPERATION_NOT_ALLOWED))

        # Back to NORMAL mode
        state.set_mode(MODE.NORMAL)
        handler.hypervisor.placement_manager = MagicMock()
        handler._select_datastore_for_vm_create = MagicMock(return_value="ds1")
        handler.hypervisor.datastore_manager.image_datastores = MagicMock(
            return_value=set("image_ds"))
        handler.hypervisor.image_manager.get_image_id_from_disks = MagicMock(
            return_value="image_id")

        vm = MagicMock()
        vm.id = str(uuid.uuid4())
        pm = handler.hypervisor.placement_manager
        pm.consume_vm_reservation.return_value = vm
        dm = handler.hypervisor.datastore_manager
        dm.datastore_type.return_value = DatastoreType.EXT3
        dm.image_datastores.return_value = set(["image_ds"])
        im = handler.hypervisor.image_manager
        request = MagicMock()
        response = handler.create_vm(request)
        assert_that(response.result, equal_to(CreateVmResultCode.OK))
        pm.remove_vm_reservation.assert_called_once_with(request.reservation)

        # Test lazy image copy
        assert_that(im.copy_image.called, is_(False))
        im.check_and_validate_image = MagicMock(side_effect=[False, True])
        im.check_and_validate_image.return_value = False
        pm.remove_vm_reservation.reset_mock()
        response = handler.create_vm(request)
        assert_that(response.result, equal_to(CreateVmResultCode.OK))
        pm.remove_vm_reservation.assert_called_once_with(request.reservation)
        im.copy_image.assert_called_once_with("image_ds", "image_id", "ds1",
                                              "image_id")

        # Test VM existed
        im.check_image.return_value = True
        im.check_and_validate_image = MagicMock(side_effect=[False, True])
        pm.remove_vm_reservation.reset_mock()
        handler.hypervisor.vm_manager.create_vm.side_effect = \
            VmAlreadyExistException

        response = handler.create_vm(request)
        assert_that(response.result,
                    equal_to(CreateVmResultCode.VM_ALREADY_EXIST))
        pm.remove_vm_reservation.assert_called_once_with(request.reservation)

        # Test invalid reservation
        class PlacementManagerInvalidReservation:
            def consume_vm_reservation(self, reservation):
                raise InvalidReservationException

        handler.hypervisor.placement_manager = \
            PlacementManagerInvalidReservation()
        response = handler.create_vm(request)
        assert_that(response.result,
                    equal_to(CreateVmResultCode.INVALID_RESERVATION))
    def test_create_vm(self):
        handler = HostHandler(MagicMock())
        # test create_vm under entering-maintenance-mode and maintenance mode
        state = common.services.get(ServiceName.MODE)
        state.set_mode(MODE.ENTERING_MAINTENANCE)
        request = MagicMock()
        handler.hypervisor.vm_manager.get_vm_networks = MagicMock()
        response = handler.create_vm(request)
        assert_that(response.result, equal_to(CreateVmResultCode.OPERATION_NOT_ALLOWED))

        state.set_mode(MODE.MAINTENANCE)
        response = handler.create_vm(request)
        assert_that(response.result, equal_to(CreateVmResultCode.OPERATION_NOT_ALLOWED))

        # Back to NORMAL mode
        state.set_mode(MODE.NORMAL)
        handler.hypervisor.placement_manager = MagicMock()
        handler._select_datastore_for_vm_create = MagicMock(return_value="ds1")
        handler.hypervisor.datastore_manager.image_datastores = MagicMock(return_value=set("image_ds"))
        handler.hypervisor.image_manager.get_image_id_from_disks = MagicMock(return_value="image_id")

        vm = MagicMock()
        vm.id = str(uuid.uuid4())
        vm_manager = handler.hypervisor.vm_manager
        vm_location_id = str(uuid.uuid4())
        vm_manager.get_location_id.return_value = vm_location_id
        pm = handler.hypervisor.placement_manager
        pm.consume_vm_reservation.return_value = vm
        dm = handler.hypervisor.datastore_manager
        dm.datastore_type.return_value = DatastoreType.EXT3
        dm.image_datastores.return_value = set(["image_ds"])
        im = handler.hypervisor.image_manager
        request = MagicMock()
        response = handler.create_vm(request)
        assert_that(response.result, equal_to(CreateVmResultCode.OK))
        pm.remove_vm_reservation.assert_called_once_with(request.reservation)
        vm_manager.get_location_id.assert_called_once_with(vm.id)
        assert_that(vm.location_id, equal_to(vm_location_id))
        vm.to_thrift.assert_called_once()
        handler.hypervisor.vm_manager.get_vm_networks.assert_called_once_with(vm.id)

        # Test lazy image copy
        assert_that(im.copy_image.called, is_(False))
        im.check_and_validate_image = MagicMock(side_effect=[False, True])
        im.check_and_validate_image.return_value = False
        pm.remove_vm_reservation.reset_mock()
        response = handler.create_vm(request)
        assert_that(response.result, equal_to(CreateVmResultCode.OK))
        pm.remove_vm_reservation.assert_called_once_with(request.reservation)
        im.copy_image.assert_called_once_with(
            "image_ds", "image_id", "ds1", "image_id"
        )

        # Test VM existed
        im.check_image.return_value = True
        im.check_and_validate_image = MagicMock(side_effect=[False, True])
        pm.remove_vm_reservation.reset_mock()
        handler.hypervisor.vm_manager.create_vm.side_effect = VmAlreadyExistException

        response = handler.create_vm(request)
        assert_that(response.result, equal_to(CreateVmResultCode.VM_ALREADY_EXIST))
        pm.remove_vm_reservation.assert_called_once_with(request.reservation)

        # Test invalid reservation
        class PlacementManagerInvalidReservation:
            def consume_vm_reservation(self, reservation):
                raise InvalidReservationException

        handler.hypervisor.placement_manager = PlacementManagerInvalidReservation()
        response = handler.create_vm(request)
        assert_that(response.result, equal_to(CreateVmResultCode.INVALID_RESERVATION))