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))
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))