示例#1
0
    def enable(self, server_id, retention, day_of_week=None):
        """
        Enable the creation of scheduled images for the server.

        :param server_id: The ID of the server to enable scheduled images for.
        :param retention: The number of scheduled images to retain.
        :param day_of_week: If given, the day of week (0-6, 0=Sunday) to create
        a weekly schedule for. If omitted, create a daily schedule.
        :rtype: :class:`ScheduledImage`
        """
        try:
            retention_val = int(retention)
        except ValueError:
            msg = "Retention value must be an integer"
            raise exceptions.BadRequest(400, msg)

        body = {'image_schedule': {'retention': int(retention_val)}}

        if day_of_week is not None:
            day_of_week_str = str(day_of_week)
            if day_of_week_str.lower() not in DAYS:
                msg = ("Day_of_week value must be a string in %s" % str(DAYS))
                raise exceptions.BadRequest(400, msg)

            body['image_schedule']['day_of_week'] = day_of_week_str

        return self._create("/servers/%s/rax-si-image-schedule" % server_id,
                            body, "image_schedule")
示例#2
0
    def test_get_console_url_tolerate_unavailable(self):
        msg = 'Unavailable console type %s.' % self.console_type
        self.console_method.side_effect = nova_exceptions.BadRequest(
            400, message=msg)

        console_url = self.nova_plugin.get_console_urls(
            self.server)[self.console_type]

        self.console_method.assert_called_once_with(self.console_type)
        self.assertEqual(msg, console_url)
示例#3
0
    def test_delete_quotas(self, mock_keystone, mock_nova):
        project = fakes.FakeProject('project_a')
        mock_keystone.tenants.list.return_value = [project]
        self.op_cloud.delete_compute_quotas(project)

        mock_nova.quotas.delete.assert_called_once_with(tenant_id='project_a')

        mock_nova.quotas.delete.side_effect = nova_exceptions.BadRequest(400)
        self.assertRaises(exc.OpenStackCloudException,
                          self.op_cloud.delete_compute_quotas, project)
示例#4
0
    def test_get_server_console_no_console(self, mock_nova):
        server = dict(id='12345')
        exc = nova_exceptions.BadRequest(
            'There is no such action: os-getConsoleOutput')
        mock_nova.servers.get_console_output.side_effect = exc
        log = self.cloud.get_server_console(server)

        self.assertEqual('', log)
        mock_nova.servers.list.assert_not_called()
        mock_nova.servers.get_console_output.assert_called_once_with(
            server='12345', length=None)
示例#5
0
    def test_delete_quotas(self, mock_nova):
        project = self.mock_for_keystone_projects(project_count=1,
                                                  list_get=True)[0]
        # re-mock the list-get as the call to set_delete_compute_quotas when
        # bad-request is raised, still calls out to get the project data.
        self.mock_for_keystone_projects(project=project, list_get=True)

        self.op_cloud.delete_compute_quotas(project.project_id)

        mock_nova.quotas.delete.assert_called_once_with(
            tenant_id=project.project_id)

        mock_nova.quotas.delete.side_effect = nova_exceptions.BadRequest(400)
        self.assertRaises(exc.OpenStackCloudException,
                          self.op_cloud.delete_compute_quotas, project)
        self.assert_calls()
示例#6
0
    def test_delete_floating_ip_assoc_successful_if_create_failed(self):
        rsrc = self.prepare_floating_ip_assoc()
        self.novaclient.servers.add_floating_ip(None, '11.0.0.1').AndRaise(
            ncli_ex.BadRequest(400))

        self.m.ReplayAll()

        rsrc.validate()

        self.assertRaises(heat_ex.ResourceFailure,
                          scheduler.TaskRunner(rsrc.create))
        self.assertEqual((rsrc.CREATE, rsrc.FAILED), rsrc.state)
        scheduler.TaskRunner(rsrc.delete)()
        self.assertEqual((rsrc.DELETE, rsrc.COMPLETE), rsrc.state)

        self.m.VerifyAll()
示例#7
0
    def test_execute_error(self):
        @tools.screen_all_logs
        def do_check(ex, status, code, message):
            self.controller.reset_mock()
            self.controller.fake_action.side_effect = ex

            res = self.request.send(self.application)

            self.assertEqual(status, res.status_code)
            self.assertEqual('text/xml', res.content_type)
            expected_xml = fakes.XML_ERROR_TEMPLATE % {
                'code': code,
                'message': message,
                'request_id': self.fake_context.request_id
            }
            self.assertThat(res.body.decode("utf-8"),
                            matchers.XMLMatches(expected_xml))
            self.controller.fake_action.assert_called_once_with(
                self.fake_context, param='fake_param')

        do_check(exception.EC2Exception('fake_msg'), 400, 'EC2Exception',
                 'fake_msg')
        do_check(KeyError('fake_msg'), 500, 'KeyError',
                 'Unknown error occurred.')
        do_check(exception.InvalidVpcIDNotFound('fake_msg'), 400,
                 'InvalidVpcID.NotFound', 'fake_msg')
        do_check(nova_exception.BadRequest(400, message='fake_msg'), 400,
                 'BadRequest', 'fake_msg')
        do_check(glance_exception.HTTPBadRequest(), 400, 'HTTPBadRequest',
                 'HTTP HTTPBadRequest')
        do_check(cinder_exception.BadRequest(400, message='fake_msg'), 400,
                 'BadRequest', 'fake_msg')
        do_check(neutron_exception.BadRequest(message='fake_msg'), 400,
                 'BadRequest', 'fake_msg')
        do_check(keystone_exception.BadRequest(message='fake_msg'), 400,
                 'BadRequest', 'fake_msg (HTTP 400)')
        do_check(
            botocore_exceptions.ClientError(
                {
                    'Error': {
                        'Code': '',
                        'Message': ''
                    },
                    'Code': 'FakeCode',
                    'Message': 'fake_msg'
                }, 'register_image'), 400, 'FakeCode', 'fake_msg')
示例#8
0
    def test_attach_interface_with_bad_request_exception_raised(self):
        instance = MagicMock()
        attach_instance = pvcIns
        attach_instance.interface_attach = \
            MagicMock(side_effect=exceptions.BadRequest("Attach failed"))

        vif = self._get_vif_instance()
        pvc_driver = self._driver
        pvc_driver._service._api = MagicMock()
        pvc_driver._service._manager.get = \
            MagicMock(return_value=attach_instance)
        pvc_driver._service._api.get_pvc_port_uuid = \
            MagicMock(return_value='')
        pvc_driver._service._api.get_pvc_network_uuid = \
            MagicMock(return_value='powervc-network-id-88888888')

        self.assertRaises(exceptions.BadRequest, pvc_driver.attach_interface,
                          instance, {}, vif)
示例#9
0
    def test_delete_eip_successful_if_eip_associate_failed(self):
        floating_ip = mox.IsA(object)
        floating_ip.ip = '172.24.4.13'
        floating_ip.id = '9037272b-6875-42e6-82e9-4342d5925da4'

        self.m.StubOutWithMock(self.fc.floating_ips, 'create')
        self.fc.floating_ips.create().AndReturn(floating_ip)

        server = self.fc.servers.list()[0]
        self._mock_server_get(mock_server=server, multiple=True)

        self.m.StubOutWithMock(self.fc.servers, 'add_floating_ip')
        self.fc.servers.add_floating_ip(
            server, floating_ip.ip, None
        ).AndRaise(nova_exceptions.BadRequest(400))

        self.m.StubOutWithMock(self.fc.servers, 'remove_floating_ip')
        msg = ("ClientException: Floating ip 172.24.4.13 is not associated "
               "with instance 1234.")
        self.fc.servers.remove_floating_ip(
            server, floating_ip.ip
        ).AndRaise(nova_exceptions.ClientException(422, msg))
        self.m.StubOutWithMock(self.fc.floating_ips, 'delete')
        self.fc.floating_ips.delete(mox.IsA(object))

        self.m.ReplayAll()

        t = template_format.parse(eip_template)
        stack = utils.parse_stack(t)
        resource_name = 'IPAddress'
        resource_defns = stack.t.resource_definitions(stack)
        rsrc = eip.ElasticIp(resource_name,
                             resource_defns[resource_name],
                             stack)

        self.assertIsNone(rsrc.validate())
        self.assertRaises(exception.ResourceFailure,
                          scheduler.TaskRunner(rsrc.create))
        self.assertEqual((rsrc.CREATE, rsrc.FAILED), rsrc.state)

        # to delete the eip
        scheduler.TaskRunner(rsrc.delete)()
        self.assertEqual((rsrc.DELETE, rsrc.COMPLETE), rsrc.state)
        self.m.VerifyAll()
示例#10
0
    def test_get_failed_bad_request(self, mock_novaclient):
        mock_novaclient.return_value.servers.get.side_effect = (
            nova_exception.BadRequest(http.BAD_REQUEST, '400'))

        self.assertRaises(exception.InvalidInput,
                  self.api.get_server, self.ctx, uuidsentinel.fake_server)
示例#11
0
class NovaApiTestCase(test.TestCase):
    def setUp(self):
        super(NovaApiTestCase, self).setUp()

        self.api = nova.API()
        self.novaclient = FakeNovaClient()
        self.ctx = context.get_admin_context()
        self.mock_object(nova, 'novaclient',
                         mock.Mock(return_value=self.novaclient))
        self.mock_object(nova, '_untranslate_server_summary_view',
                         lambda server: server)

    def test_server_create(self):
        result = self.api.server_create(self.ctx, 'server_name', 'fake_image',
                                        'fake_flavor', None, None, None)
        self.assertEqual('created_id', result['id'])

    def test_server_delete(self):
        self.mock_object(self.novaclient.servers, 'delete')
        self.api.server_delete(self.ctx, 'id1')
        self.novaclient.servers.delete.assert_called_once_with('id1')

    def test_server_get(self):
        instance_id = 'instance_id1'
        result = self.api.server_get(self.ctx, instance_id)
        self.assertEqual(instance_id, result['id'])

    def test_server_get_by_name_or_id(self):
        instance_id = 'instance_id1'
        server = {'id': instance_id, 'fake_key': 'fake_value'}
        self.mock_object(utils, 'find_resource',
                         mock.Mock(return_value=server))

        result = self.api.server_get_by_name_or_id(self.ctx, instance_id)

        self.assertEqual(instance_id, result['id'])
        utils.find_resource.assert_called_once_with(mock.ANY, instance_id)

    @ddt.data(
        {
            'nova_e': nova_exception.NotFound(404),
            'manila_e': exception.InstanceNotFound
        },
        {
            'nova_e': nova_exception.BadRequest(400),
            'manila_e': exception.InvalidInput
        },
    )
    @ddt.unpack
    def test_server_get_failed(self, nova_e, manila_e):
        nova.novaclient.side_effect = nova_e
        instance_id = 'instance_id'
        self.assertRaises(manila_e, self.api.server_get, self.ctx, instance_id)

    def test_server_list(self):
        self.assertEqual([{
            'id': 'id1'
        }, {
            'id': 'id2'
        }], self.api.server_list(self.ctx))

    def test_server_pause(self):
        self.mock_object(self.novaclient.servers, 'pause')
        self.api.server_pause(self.ctx, 'id1')
        self.novaclient.servers.pause.assert_called_once_with('id1')

    def test_server_unpause(self):
        self.mock_object(self.novaclient.servers, 'unpause')
        self.api.server_unpause(self.ctx, 'id1')
        self.novaclient.servers.unpause.assert_called_once_with('id1')

    def test_server_suspend(self):
        self.mock_object(self.novaclient.servers, 'suspend')
        self.api.server_suspend(self.ctx, 'id1')
        self.novaclient.servers.suspend.assert_called_once_with('id1')

    def test_server_resume(self):
        self.mock_object(self.novaclient.servers, 'resume')
        self.api.server_resume(self.ctx, 'id1')
        self.novaclient.servers.resume.assert_called_once_with('id1')

    def test_server_reboot_hard(self):
        self.mock_object(self.novaclient.servers, 'reboot')
        self.api.server_reboot(self.ctx, 'id1')
        self.novaclient.servers.reboot.assert_called_once_with(
            'id1', nova_servers.REBOOT_HARD)

    def test_server_reboot_soft(self):
        self.mock_object(self.novaclient.servers, 'reboot')
        self.api.server_reboot(self.ctx, 'id1', True)
        self.novaclient.servers.reboot.assert_called_once_with(
            'id1', nova_servers.REBOOT_SOFT)

    def test_server_rebuild(self):
        self.mock_object(self.novaclient.servers, 'rebuild')
        self.api.server_rebuild(self.ctx, 'id1', 'fake_image')
        self.novaclient.servers.rebuild.assert_called_once_with(
            'id1', 'fake_image', None)

    def test_instance_volume_attach(self):
        self.mock_object(self.novaclient.volumes, 'create_server_volume')
        self.api.instance_volume_attach(self.ctx, 'instance_id', 'vol_id',
                                        'device')
        self.novaclient.volumes.create_server_volume.\
            assert_called_once_with('instance_id', 'vol_id', 'device')

    def test_instance_volume_detach(self):
        self.mock_object(self.novaclient.volumes, 'delete_server_volume')
        self.api.instance_volume_detach(self.ctx, 'instance_id', 'att_id')
        self.novaclient.volumes.delete_server_volume.\
            assert_called_once_with('instance_id', 'att_id')

    def test_instance_volumes_list(self):
        self.mock_object(
            self.novaclient.volumes, 'get_server_volumes',
            mock.Mock(
                return_value=[Volume('id1'), Volume('id2')]))
        self.cinderclient = self.novaclient
        self.mock_object(cinder, 'cinderclient',
                         mock.Mock(return_value=self.novaclient))
        result = self.api.instance_volumes_list(self.ctx, 'instance_id')
        self.assertEqual(2, len(result))
        self.assertEqual('id1', result[0].id)
        self.assertEqual('id2', result[1].id)

    def test_server_update(self):
        self.mock_object(self.novaclient.servers, 'update')
        self.api.server_update(self.ctx, 'id1', 'new_name')
        self.novaclient.servers.update.assert_called_once_with('id1',
                                                               name='new_name')

    def test_update_server_volume(self):
        self.mock_object(self.novaclient.volumes, 'update_server_volume')
        self.api.update_server_volume(self.ctx, 'instance_id', 'att_id',
                                      'new_vol_id')
        self.novaclient.volumes.update_server_volume.\
            assert_called_once_with('instance_id', 'att_id', 'new_vol_id')

    def test_keypair_create(self):
        self.mock_object(self.novaclient.keypairs, 'create')
        self.api.keypair_create(self.ctx, 'keypair_name')
        self.novaclient.keypairs.create.assert_called_once_with('keypair_name')

    def test_keypair_import(self):
        self.mock_object(self.novaclient.keypairs, 'create')
        self.api.keypair_import(self.ctx, 'keypair_name', 'fake_pub_key')
        self.novaclient.keypairs.create.\
            assert_called_once_with('keypair_name', 'fake_pub_key')

    def test_keypair_delete(self):
        self.mock_object(self.novaclient.keypairs, 'delete')
        self.api.keypair_delete(self.ctx, 'fake_keypair_id')
        self.novaclient.keypairs.delete.\
            assert_called_once_with('fake_keypair_id')

    def test_keypair_list(self):
        self.assertEqual([{
            'id': 'id1'
        }, {
            'id': 'id2'
        }], self.api.keypair_list(self.ctx))

    def test_fixed_ip_get(self):
        fixed_ip = 'fake_fixed_ip'
        result = self.api.fixed_ip_get(self.ctx, fixed_ip)
        self.assertIsInstance(result, dict)
        self.assertEqual(fixed_ip, result['address'])

    def test_fixed_ip_reserve(self):
        fixed_ip = 'fake_fixed_ip'
        result = self.api.fixed_ip_reserve(self.ctx, fixed_ip)
        self.assertIsNone(result)

    def test_fixed_ip_unreserve(self):
        fixed_ip = 'fake_fixed_ip'
        result = self.api.fixed_ip_unreserve(self.ctx, fixed_ip)
        self.assertIsNone(result)

    def test_network_get(self):
        net_id = 'fake_net_id'
        net = self.api.network_get(self.ctx, net_id)
        self.assertIsInstance(net, dict)
        self.assertEqual(net_id, net['id'])
示例#12
0
    def test_get_console_url_tolerate_unavailable(self):
        msg = 'Unavailable console type %s.' % self.console_type
        self.console_method.side_effect = nova_exceptions.BadRequest(
            400, message=msg)

        self._test_get_console_url_tolerate_exception(msg)
示例#13
0
    def create_vm(self,
                  name,
                  image,
                  flavor,
                  nics=None,
                  security_groups=None,
                  scheduler_hints=None,
                  **kwargs):
        """Mock'd version of novaclient...create_vm().

        Create a Nova VM.

        :param body: Dictionary with vm information.
        :return: An updated copy of the 'body' that was passed in, with other
                 information populated.
        """
        if len(self._vm_list) >= self._vm_limit:
            raise nova_exc.OverLimit(413)
        try:
            flavor_id = flavor.id
        except AttributeError:
            flavor_id = flavor

        try:
            image_id = image.id
        except AttributeError:
            image_id = image

        if flavor_id not in self._flavor_list:
            raise nova_exc.BadRequest(400)

        if image_id not in self._image_list:
            raise nova_exc.BadRequest(400)

        port_list = list()
        if nics is not None:
            neutron_client = client.neutron_client()
            for nic in nics:
                if 'net-id' in nic:
                    network_list = neutron_client.list_networks(
                        id=nic['net-id'])
                    if (not network_list or 'networks' not in network_list
                            or len(network_list['networks']) == 0):
                        raise nova_exc.BadRequest(400)

                    else:
                        body_value = {
                            "port": {
                                "admin_state_up": True,
                                "name": "test port",
                                "network_id": nic['net-id'],
                            }
                        }
                        port_info = neutron_client.create_port(body=body_value)
                        port_id = port_info['port']['id']
                        port_list.append(
                            InterfaceDetails(net_id=nic['net-id'],
                                             port_id=port_id))
                if 'port-id' in nic:
                    port_list.append(InterfaceDetails(port_id=nic['port-id']))

        if security_groups is not None:
            missing = set(security_groups) - set(self._security_group_list)
            if missing:
                raise nova_exc.BadRequest(400)

        newVm = VmDetails(vm_id=uuid.uuid4(),
                          name=name,
                          flavor=flavor,
                          image=image,
                          port_list=port_list,
                          status='BUILDING')

        if scheduler_hints is not None:
            try:
                group_id = scheduler_hints['group']
            except AttributeError:
                group_id = scheduler_hints

            if group_id not in self._vm_group_list:
                raise nova_exc.BadRequest(400)

            newVm.host_id = str(uuid.uuid4())

        self._vm_list[str(newVm.id)] = newVm

        return newVm
示例#14
0
class NovaApiTestCase(test.TestCase):
    def setUp(self):
        super(NovaApiTestCase, self).setUp()

        self.api = nova.API()
        self.novaclient = FakeNovaClient()
        self.ctx = context.get_admin_context()
        self.mock_object(nova, 'novaclient',
                         mock.Mock(return_value=self.novaclient))
        self.mock_object(nova, '_untranslate_server_summary_view',
                         lambda server: server)

    def test_image_list_novaclient_has_no_proxy(self):
        image_list = ['fake', 'image', 'list']

        class FakeGlanceClient(object):
            def list(self):
                return image_list

        self.novaclient.glance = FakeGlanceClient()

        result = self.api.image_list(self.ctx)

        self.assertEqual(image_list, result)

    def test_image_list_novaclient_has_proxy(self):
        image_list1 = ['fake', 'image', 'list1']
        image_list2 = ['fake', 'image', 'list2']

        class FakeImagesClient(object):
            def list(self):
                return image_list1

        class FakeGlanceClient(object):
            def list(self):
                return image_list2

        self.novaclient.images = FakeImagesClient()
        self.novaclient.glance = FakeGlanceClient()

        result = self.api.image_list(self.ctx)

        self.assertEqual(image_list1, result)

    def test_server_create(self):
        result = self.api.server_create(self.ctx, 'server_name', 'fake_image',
                                        'fake_flavor', None, None, None)
        self.assertEqual('created_id', result['id'])

    def test_server_delete(self):
        self.mock_object(self.novaclient.servers, 'delete')
        self.api.server_delete(self.ctx, 'id1')
        self.novaclient.servers.delete.assert_called_once_with('id1')

    def test_server_get(self):
        instance_id = 'instance_id1'
        result = self.api.server_get(self.ctx, instance_id)
        self.assertEqual(instance_id, result['id'])

    def test_server_get_by_name_or_id(self):
        instance_id = 'instance_id1'
        server = {'id': instance_id, 'fake_key': 'fake_value'}
        self.mock_object(utils, 'find_resource',
                         mock.Mock(return_value=server))

        result = self.api.server_get_by_name_or_id(self.ctx, instance_id)

        self.assertEqual(instance_id, result['id'])
        utils.find_resource.assert_called_once_with(mock.ANY, instance_id)

    def test_server_get_by_name_or_id_failed(self):
        instance_id = 'instance_id1'
        server = {'id': instance_id, 'fake_key': 'fake_value'}
        self.mock_object(utils, 'find_resource',
                         mock.Mock(return_value=server,
                                   side_effect=nova_exception.CommandError))

        self.assertRaises(exception.ManilaException,
                          self.api.server_get_by_name_or_id,
                          self.ctx, instance_id)
        utils.find_resource.assert_any_call(mock.ANY, instance_id)
        utils.find_resource.assert_called_with(mock.ANY, instance_id,
                                               all_tenants=True)

    @ddt.data(
        {'nova_e': nova_exception.NotFound(404),
         'manila_e': exception.InstanceNotFound},
        {'nova_e': nova_exception.BadRequest(400),
         'manila_e': exception.InvalidInput},
    )
    @ddt.unpack
    def test_server_get_failed(self, nova_e, manila_e):
        nova.novaclient.side_effect = nova_e
        instance_id = 'instance_id'
        self.assertRaises(manila_e, self.api.server_get, self.ctx, instance_id)

    def test_server_pause(self):
        self.mock_object(self.novaclient.servers, 'pause')
        self.api.server_pause(self.ctx, 'id1')
        self.novaclient.servers.pause.assert_called_once_with('id1')

    def test_server_unpause(self):
        self.mock_object(self.novaclient.servers, 'unpause')
        self.api.server_unpause(self.ctx, 'id1')
        self.novaclient.servers.unpause.assert_called_once_with('id1')

    def test_server_suspend(self):
        self.mock_object(self.novaclient.servers, 'suspend')
        self.api.server_suspend(self.ctx, 'id1')
        self.novaclient.servers.suspend.assert_called_once_with('id1')

    def test_server_resume(self):
        self.mock_object(self.novaclient.servers, 'resume')
        self.api.server_resume(self.ctx, 'id1')
        self.novaclient.servers.resume.assert_called_once_with('id1')

    def test_server_reboot_hard(self):
        self.mock_object(self.novaclient.servers, 'reboot')
        self.api.server_reboot(self.ctx, 'id1')
        self.novaclient.servers.reboot.assert_called_once_with(
            'id1', nova_servers.REBOOT_HARD)

    def test_server_reboot_soft(self):
        self.mock_object(self.novaclient.servers, 'reboot')
        self.api.server_reboot(self.ctx, 'id1', True)
        self.novaclient.servers.reboot.assert_called_once_with(
            'id1', nova_servers.REBOOT_SOFT)

    def test_server_rebuild(self):
        self.mock_object(self.novaclient.servers, 'rebuild')
        self.api.server_rebuild(self.ctx, 'id1', 'fake_image')
        self.novaclient.servers.rebuild.assert_called_once_with('id1',
                                                                'fake_image',
                                                                None)

    def test_instance_volume_attach(self):
        self.mock_object(self.novaclient.volumes, 'create_server_volume')
        self.api.instance_volume_attach(self.ctx, 'instance_id',
                                        'vol_id', 'device')
        (self.novaclient.volumes.create_server_volume.
            assert_called_once_with('instance_id', 'vol_id', 'device'))

    def test_instance_volume_detach(self):
        self.mock_object(self.novaclient.volumes, 'delete_server_volume')
        self.api.instance_volume_detach(self.ctx, 'instance_id',
                                        'att_id')
        (self.novaclient.volumes.delete_server_volume.
            assert_called_once_with('instance_id', 'att_id'))

    def test_instance_volumes_list(self):
        self.mock_object(
            self.novaclient.volumes, 'get_server_volumes',
            mock.Mock(return_value=[Volume('id1'), Volume('id2')]))
        self.cinderclient = self.novaclient
        self.mock_object(cinder, 'cinderclient',
                         mock.Mock(return_value=self.novaclient))
        result = self.api.instance_volumes_list(self.ctx, 'instance_id')
        self.assertEqual(2, len(result))
        self.assertEqual('id1', result[0].id)
        self.assertEqual('id2', result[1].id)

    def test_server_update(self):
        self.mock_object(self.novaclient.servers, 'update')
        self.api.server_update(self.ctx, 'id1', 'new_name')
        self.novaclient.servers.update.assert_called_once_with('id1',
                                                               name='new_name')

    def test_update_server_volume(self):
        self.mock_object(self.novaclient.volumes, 'update_server_volume')
        self.api.update_server_volume(self.ctx, 'instance_id', 'att_id',
                                      'new_vol_id')
        (self.novaclient.volumes.update_server_volume.
            assert_called_once_with('instance_id', 'att_id', 'new_vol_id'))

    def test_keypair_create(self):
        self.mock_object(self.novaclient.keypairs, 'create')
        self.api.keypair_create(self.ctx, 'keypair_name')
        self.novaclient.keypairs.create.assert_called_once_with('keypair_name')

    def test_keypair_import(self):
        self.mock_object(self.novaclient.keypairs, 'create')
        self.api.keypair_import(self.ctx, 'keypair_name', 'fake_pub_key')
        (self.novaclient.keypairs.create.
            assert_called_once_with('keypair_name', 'fake_pub_key'))

    def test_keypair_delete(self):
        self.mock_object(self.novaclient.keypairs, 'delete')
        self.api.keypair_delete(self.ctx, 'fake_keypair_id')
        (self.novaclient.keypairs.delete.
            assert_called_once_with('fake_keypair_id'))

    def test_keypair_list(self):
        self.assertEqual([{'id': 'id1'}, {'id': 'id2'}],
                         self.api.keypair_list(self.ctx))