def test_download_with_retries(self, mock_sleep):
        tries = [0]

        class MyGlanceStubClient(stubs.StubGlanceClient):
            """A client that fails the first time, then succeeds."""
            def get(self, image_id):
                if tries[0] == 0:
                    tries[0] = 1
                    raise glance_exc.ServiceUnavailable('')
                else:
                    return {}

        stub_client = MyGlanceStubClient()
        stub_context = context.RequestContext(auth_token=True)
        stub_context.user_id = 'fake'
        stub_context.project_id = 'fake'
        stub_service = image_service.GlanceImageService(
            stub_client, stub_context)
        image_id = uuidutils.generate_uuid()
        writer = NullWriter()

        # When retries are disabled, we should get an exception
        self.config(num_retries=0, group='glance')
        self.assertRaises(exception.GlanceConnectionFailed,
                          stub_service.download, image_id, writer)

        # Now lets enable retries. No exception should happen now.
        self.config(num_retries=1, group='glance')
        importlib.reload(image_service)
        stub_service = image_service.GlanceImageService(
            stub_client, stub_context)
        tries = [0]
        stub_service.download(image_id, writer)
        self.assertTrue(mock_sleep.called)
 def setUp(self):
     super(TestGlanceImageService, self).setUp()
     self.client = stubs.StubGlanceClient()
     self.context = context.RequestContext(auth_token=True)
     self.context.user_id = 'fake'
     self.context.project_id = 'fake'
     self.service = image_service.GlanceImageService(
         self.client, self.context)
    def test_client_httpnotfound_converts_to_imagenotfound(self):
        class MyGlanceStubClient(stubs.StubGlanceClient):
            """A client that raises a HTTPNotFound exception."""
            def get(self, image_id):
                raise glance_exc.HTTPNotFound(image_id)

        stub_client = MyGlanceStubClient()
        stub_context = context.RequestContext(auth_token=True)
        stub_context.user_id = 'fake'
        stub_context.project_id = 'fake'
        stub_service = image_service.GlanceImageService(
            stub_client, stub_context)
        image_id = uuidutils.generate_uuid()
        writer = NullWriter()
        self.assertRaises(exception.ImageNotFound, stub_service.download,
                          image_id, writer)
 def setUp(self):
     super(TestGlanceSwiftTempURL, self).setUp()
     client = stubs.StubGlanceClient()
     self.context = context.RequestContext()
     self.context.auth_token = 'fake'
     self.service = image_service.GlanceImageService(client, self.context)
     self.config(swift_temp_url_key='correcthorsebatterystaple',
                 group='glance')
     self.config(swift_endpoint_url='https://swift.example.com',
                 group='glance')
     self.config(swift_account='AUTH_a422b2-91f3-2f46-74b7-d7c9e8958f5d30',
                 group='glance')
     self.config(swift_api_version='v1', group='glance')
     self.config(swift_container='glance', group='glance')
     self.config(swift_temp_url_duration=1200, group='glance')
     self.config(swift_store_multiple_containers_seed=0, group='glance')
     self.fake_image = {'id': '757274c4-2856-4bd2-bb20-9a4a231e187b'}
 def setUp(self):
     super(CheckImageServiceTestCase, self).setUp()
     self.context = context.RequestContext(global_request_id='global')
     self.service = image_service.GlanceImageService(None, self.context)
     # NOTE(pas-ha) register keystoneauth dynamic options manually
     plugin = kaloading.get_plugin_loader('password')
     opts = kaloading.get_auth_plugin_conf_options(plugin)
     self.cfg_fixture.register_opts(opts, group='glance')
     self.config(auth_type='password',
                 auth_url='viking',
                 username='******',
                 password='******',
                 project_name='parrot',
                 service_type='image',
                 region_name='SomeRegion',
                 interface='internal',
                 group='glance')
     image_service._GLANCE_SESSION = None
 def setUp(self):
     super(TestSwiftTempUrlCache, self).setUp()
     client = stubs.StubGlanceClient()
     self.context = context.RequestContext()
     self.context.auth_token = 'fake'
     self.config(swift_temp_url_expected_download_start_delay=100,
                 group='glance')
     self.config(swift_temp_url_key='correcthorsebatterystaple',
                 group='glance')
     self.config(swift_endpoint_url='https://swift.example.com',
                 group='glance')
     self.config(swift_account='AUTH_a422b2-91f3-2f46-74b7-d7c9e8958f5d30',
                 group='glance')
     self.config(swift_api_version='v1', group='glance')
     self.config(swift_container='glance', group='glance')
     self.config(swift_temp_url_duration=1200, group='glance')
     self.config(swift_temp_url_cache_enabled=True, group='glance')
     self.config(swift_store_multiple_containers_seed=0, group='glance')
     self.glance_service = image_service.GlanceImageService(
         client, context=self.context)
    def test_download_file_url(self, mock_getsize, mock_sendfile):
        # NOTE: only in v2 API
        class MyGlanceStubClient(stubs.StubGlanceClient):
            """A client that returns a file url."""

            s_tmpfname = '/whatever/source'

            def get(self, image_id):
                return type('GlanceTestDirectUrlMeta', (object, ),
                            {'direct_url': 'file://%s' + self.s_tmpfname})

        stub_context = context.RequestContext(auth_token=True)
        stub_context.user_id = 'fake'
        stub_context.project_id = 'fake'
        stub_client = MyGlanceStubClient()

        stub_service = image_service.GlanceImageService(stub_client,
                                                        context=stub_context)
        image_id = uuidutils.generate_uuid()

        self.config(allowed_direct_url_schemes=['file'], group='glance')

        # patching open in image_service module namespace
        # to make call-spec assertions
        with mock.patch('ironic.common.glance_service.image_service.open',
                        new=mock.mock_open(),
                        create=True) as mock_ironic_open:
            with open('/whatever/target', 'w') as mock_target_fd:
                stub_service.download(image_id, mock_target_fd)

        # assert the image data was neither read nor written
        # but rather sendfiled
        mock_ironic_open.assert_called_once_with(MyGlanceStubClient.s_tmpfname,
                                                 'r')
        mock_source_fd = mock_ironic_open()
        self.assertFalse(mock_source_fd.read.called)
        self.assertFalse(mock_target_fd.write.called)
        mock_sendfile.assert_called_once_with(
            mock_target_fd.fileno(), mock_source_fd.fileno(), 0,
            mock_getsize(MyGlanceStubClient.s_tmpfname))