def test_attach(self):
        volume_id = '00000000-0000-0000-0000-000000000000'
        server_id = '11111111-1111-1111-1111-111111111111'
        device_name = '/dev/fake'

        volume_ctx = cfy_mocks.MockContext({
            'node':
            cfy_mocks.MockContext(
                {'properties': {
                    volume.DEVICE_NAME_PROPERTY: device_name
                }}),
            'instance':
            cfy_mocks.MockContext(
                {'runtime_properties': {
                    OPENSTACK_ID_PROPERTY: volume_id,
                }})
        })
        server_ctx = cfy_mocks.MockContext({
            'node':
            cfy_mocks.MockContext({'properties': {}}),
            'instance':
            cfy_mocks.MockContext({
                'runtime_properties': {
                    server.OPENSTACK_ID_PROPERTY: server_id
                }
            })
        })

        ctx_m = cfy_mocks.MockCloudifyContext(node_id='a',
                                              target=server_ctx,
                                              source=volume_ctx)

        cinderclient_m = mock.Mock()
        novaclient_m = mock.Mock()
        novaclient_m.volumes = mock.Mock()
        novaclient_m.volumes.create_server_volume = mock.Mock()

        with contextlib.nested(
                mock.patch.object(NovaClient, 'get',
                                  mock.Mock(return_value=novaclient_m)),
                mock.patch.object(CinderClient, 'get',
                                  mock.Mock(return_value=cinderclient_m)),
                mock.patch.object(volume, 'wait_until_status',
                                  mock.Mock(return_value=(None, True)))):

            server.attach_volume(ctx=ctx_m)

            novaclient_m.volumes.create_server_volume.assert_called_once_with(
                server_id, volume_id, device_name)
            volume.wait_until_status.assert_called_once_with(
                cinder_client=cinderclient_m,
                volume_id=volume_id,
                status=volume.VOLUME_STATUS_IN_USE)
    def test_attach(self):
        volume_id = '00000000-0000-0000-0000-000000000000'
        server_id = '11111111-1111-1111-1111-111111111111'
        device_name = '/dev/fake'

        volume_ctx = cfy_mocks.MockContext({
            'node': cfy_mocks.MockContext({
                'properties': {volume.DEVICE_NAME_PROPERTY: device_name}
            }),
            'instance': cfy_mocks.MockContext({
                'runtime_properties': {
                    OPENSTACK_ID_PROPERTY: volume_id,
                }
            })
        })
        server_ctx = cfy_mocks.MockContext({
            'node': cfy_mocks.MockContext({
                'properties': {}
            }),
            'instance': cfy_mocks.MockContext({
                'runtime_properties': {
                    server.OPENSTACK_ID_PROPERTY: server_id
                }
            })
        })

        ctx_m = self._mock(node_id='a',
                           target=server_ctx,
                           source=volume_ctx)

        cinderclient_m = mock.Mock()
        novaclient_m = mock.Mock()
        novaclient_m.volumes = mock.Mock()
        novaclient_m.volumes.create_server_volume = mock.Mock()

        with contextlib.nested(
                mock.patch.object(NovaClient, 'get',
                                  mock.Mock(return_value=novaclient_m)),
                mock.patch.object(CinderClient, 'get',
                                  mock.Mock(return_value=cinderclient_m)),
                mock.patch.object(volume,
                                  'wait_until_status',
                                  mock.Mock(return_value=(None, True)))):

            server.attach_volume(ctx=ctx_m)

            novaclient_m.volumes.create_server_volume.assert_called_once_with(
                server_id, volume_id, device_name)
            volume.wait_until_status.assert_called_once_with(
                cinder_client=cinderclient_m,
                volume_id=volume_id,
                status=volume.VOLUME_STATUS_IN_USE)
    def test_attach(self, wait_until_status_m, cinder_m, nova_m):
        volume_id = '00000000-0000-0000-0000-000000000000'
        server_id = '11111111-1111-1111-1111-111111111111'
        device_name = '/dev/fake'

        volume_ctx = cfy_mocks.MockContext({
            'node': cfy_mocks.MockContext({
                'properties': {volume.DEVICE_NAME_PROPERTY: device_name}
            }),
            'instance': cfy_mocks.MockContext({
                'runtime_properties': {
                    OPENSTACK_ID_PROPERTY: volume_id,
                }
            })
        })
        server_ctx = cfy_mocks.MockContext({
            'node': cfy_mocks.MockContext({
                'properties': {}
            }),
            'instance': cfy_mocks.MockContext({
                'runtime_properties': {
                    server.OPENSTACK_ID_PROPERTY: server_id
                }
            })
        })

        ctx_m = self._mock(node_id='a',
                           target=server_ctx,
                           source=volume_ctx)

        nova_instance = nova_m.return_value
        cinder_instance = cinder_m.return_value

        server.attach_volume(ctx=ctx_m, status_attempts=10,
                             status_timeout=2)

        nova_instance.volumes.create_server_volume.assert_called_once_with(
            server_id, volume_id, device_name)
        wait_until_status_m.assert_called_once_with(
            cinder_client=cinder_instance,
            volume_id=volume_id,
            status=volume.VOLUME_STATUS_IN_USE,
            num_tries=10,
            timeout=2,
            )
Exemple #4
0
    def _test_cleanup__after_attach_fails(
            self, volume_ctx_mgr, expected_err_cls, expect_cleanup=True):
        volume_id = '00000000-0000-0000-0000-000000000000'
        server_id = '11111111-1111-1111-1111-111111111111'
        attachment_id = '22222222-2222-2222-2222-222222222222'
        device_name = '/dev/fake'

        attachment = {'id': attachment_id,
                      'server_id': server_id,
                      'volume_id': volume_id}

        volume_ctx = cfy_mocks.MockContext({
            'node': cfy_mocks.MockContext({
                'properties': {volume.DEVICE_NAME_PROPERTY: device_name}
            }),
            'instance': cfy_mocks.MockContext({
                'runtime_properties': {
                    OPENSTACK_ID_PROPERTY: volume_id,
                }
            })
        })
        server_ctx = cfy_mocks.MockContext({
            'node': cfy_mocks.MockContext({
                'properties': {}
            }),
            'instance': cfy_mocks.MockContext({
                'runtime_properties': {
                    server.OPENSTACK_ID_PROPERTY: server_id
                }
            })
        })

        ctx_m = self._mock(node_id='a',
                           target=server_ctx,
                           source=volume_ctx)

        attached_volume_m = mock.Mock()
        attached_volume_m.id = volume_id
        attached_volume_m.status = volume.VOLUME_STATUS_IN_USE
        attached_volume_m.attachments = [attachment]
        cinderclient_m = mock.Mock()
        cinderclient_m.volumes = mock.Mock()
        cinderclient_m.volumes.get = mock.Mock(
            return_value=attached_volume_m)
        novaclient_m = mock.Mock()
        novacl_vols_m = novaclient_m.volumes = mock.Mock()
        novacl_vols_m.create_server_volume = mock.Mock()

        with contextlib.nested(
                mock.patch.object(NovaClient, 'get',
                                  mock.Mock(return_value=novaclient_m)),
                mock.patch.object(CinderClient, 'get',
                                  mock.Mock(return_value=cinderclient_m)),
                volume_ctx_mgr):
            with self.assertRaises(expected_err_cls):
                server.attach_volume(ctx=ctx_m)

            novacl_vols_m.create_server_volume.assert_called_once_with(
                server_id, volume_id, device_name)
            volume.wait_until_status.assert_any_call(
                cinder_client=cinderclient_m,
                volume_id=volume_id,
                status=volume.VOLUME_STATUS_IN_USE)
            if expect_cleanup:
                novacl_vols_m.delete_server_volume.assert_called_once_with(
                    server_id, attachment_id)
                self.assertEqual(2, volume.wait_until_status.call_count)
                volume.wait_until_status.assert_called_with(
                    cinder_client=cinderclient_m,
                    volume_id=volume_id,
                    status=volume.VOLUME_STATUS_AVAILABLE)
    def _test_cleanup__after_attach_fails(
            self, expected_err_cls, expect_cleanup,
            wait_until_status_m, cinder_m, nova_m):
        volume_id = '00000000-0000-0000-0000-000000000000'
        server_id = '11111111-1111-1111-1111-111111111111'
        attachment_id = '22222222-2222-2222-2222-222222222222'
        device_name = '/dev/fake'

        attachment = {'id': attachment_id,
                      'server_id': server_id,
                      'volume_id': volume_id}

        volume_ctx = cfy_mocks.MockContext({
            'node': cfy_mocks.MockContext({
                'properties': {volume.DEVICE_NAME_PROPERTY: device_name}
            }),
            'instance': cfy_mocks.MockContext({
                'runtime_properties': {
                    OPENSTACK_ID_PROPERTY: volume_id,
                }
            })
        })
        server_ctx = cfy_mocks.MockContext({
            'node': cfy_mocks.MockContext({
                'properties': {}
            }),
            'instance': cfy_mocks.MockContext({
                'runtime_properties': {
                    server.OPENSTACK_ID_PROPERTY: server_id
                }
            })
        })

        ctx_m = self._mock(node_id='a',
                           target=server_ctx,
                           source=volume_ctx)

        attached_volume = mock.Mock(id=volume_id,
                                    status=volume.VOLUME_STATUS_IN_USE,
                                    attachments=[attachment])
        nova_instance = nova_m.return_value
        cinder_instance = cinder_m.return_value
        cinder_instance.volumes.get.return_value = attached_volume

        with self.assertRaises(expected_err_cls):
            server.attach_volume(ctx=ctx_m, status_attempts=10,
                                 status_timeout=2)

        nova_instance.volumes.create_server_volume.assert_called_once_with(
            server_id, volume_id, device_name)
        volume.wait_until_status.assert_any_call(
            cinder_client=cinder_instance,
            volume_id=volume_id,
            status=volume.VOLUME_STATUS_IN_USE,
            num_tries=10,
            timeout=2,
            )
        if expect_cleanup:
            nova_instance.volumes.delete_server_volume.assert_called_once_with(
                server_id, attachment_id)
            self.assertEqual(2, volume.wait_until_status.call_count)
            volume.wait_until_status.assert_called_with(
                cinder_client=cinder_instance,
                volume_id=volume_id,
                status=volume.VOLUME_STATUS_AVAILABLE,
                num_tries=10,
                timeout=2)