def test_boolean_header_values(self): """ Tests that boolean headers like is_public can be set to True if any of ('True', 'On', 1) is provided, case-insensitive """ fixtures = [{ 'is_public': True }, { 'is_public': 'True' }, { 'is_public': 'true' }] expected = {'is_public': True} class FakeResponse(): pass for fixture in fixtures: headers = utils.image_meta_to_http_headers(fixture) response = FakeResponse() response.headers = headers result = utils.get_image_meta_from_headers(response) for k, v in expected.items(): self.assertEqual(v, result[k]) # Ensure False for other values... fixtures = [{ 'is_public': False }, { 'is_public': 'Off' }, { 'is_public': 'on' }, { 'is_public': '1' }, { 'is_public': 'False' }] expected = {'is_public': False} for fixture in fixtures: headers = utils.image_meta_to_http_headers(fixture) response = FakeResponse() response.headers = headers result = utils.get_image_meta_from_headers(response) for k, v in expected.items(): self.assertEqual(v, result[k])
def test_get_meta_from_headers_none_virtual_size(self): resp = webob.Response() resp.headers = {"x-image-meta-name": 'test', 'x-image-meta-virtual-size': 'None'} result = utils.get_image_meta_from_headers(resp) self.assertEqual({'name': 'test', 'properties': {}, 'virtual_size': None}, result)
def test_data_passed_properly_through_headers(self): """ Verifies that data is the same after being passed through headers """ fixture = {'name': 'fake public image', 'is_public': True, 'deleted': False, 'type': 'kernel', 'name': None, 'size': 19, 'location': "file:///tmp/glance-tests/2", 'properties': {'distro': 'Ubuntu 10.04 LTS'}} headers = utils.image_meta_to_http_headers(fixture) class FakeResponse(): pass response = FakeResponse() response.headers = headers result = utils.get_image_meta_from_headers(response) for k, v in fixture.iteritems(): if v is not None: self.assertEqual(v, result[k]) else: self.assertFalse(k in result)
def _deserialize(self, request): result = {} try: result["image_meta"] = utils.get_image_meta_from_headers(request) except exception.Invalid: image_size_str = request.headers["x-image-meta-size"] msg = _("Incoming image size of %s was not convertible to " "an integer.") % image_size_str raise HTTPBadRequest(msg, request=request) image_meta = result["image_meta"] if "size" in image_meta: incoming_image_size = image_meta["size"] if incoming_image_size > IMAGE_SIZE_CAP: max_image_size = IMAGE_SIZE_CAP msg = ( _( "Denying attempt to upload image larger than " "%(max_image_size)d. Supplied image size was " "%(incoming_image_size)d" ) % locals() ) logger.warn(msg) raise HTTPBadRequest(msg, request=request) data = request.body_file if self.has_body(request) else None result["image_data"] = data return result
def _deserialize(self, request): result = {} try: result["image_meta"] = utils.get_image_meta_from_headers(request) except exception.InvalidParameterValue as e: msg = utils.exception_to_str(e) LOG.warn(msg, exc_info=True) raise HTTPBadRequest(explanation=e.msg, request=request) image_meta = result["image_meta"] image_meta = validate_image_meta(request, image_meta) if request.content_length: image_size = request.content_length elif "size" in image_meta: image_size = image_meta["size"] else: image_size = None data = request.body_file if self.has_body(request) else None if image_size is None and data is not None: data = utils.LimitingReader(data, CONF.image_size_cap) # NOTE(bcwaldon): this is a hack to make sure the downstream code # gets the correct image data request.body_file = data elif image_size > CONF.image_size_cap: max_image_size = CONF.image_size_cap msg = _("Denying attempt to upload image larger than %d bytes.") LOG.warn(msg % max_image_size) raise HTTPBadRequest(explanation=msg % max_image_size, request=request) result["image_data"] = data return result
def test_data_passed_properly_through_headers(self): """ Verifies that data is the same after being passed through headers """ fixture = { "name": "fake public image", "is_public": True, "deleted": False, "name": None, "size": 19, "location": "file:///tmp/glance-tests/2", "properties": {"distro": "Ubuntu 10.04 LTS"}, } headers = utils.image_meta_to_http_headers(fixture) class FakeResponse: pass response = FakeResponse() response.headers = headers result = utils.get_image_meta_from_headers(response) for k, v in six.iteritems(fixture): if v is not None: self.assertEqual(v, result[k]) else: self.assertNotIn(k, result)
def test_data_passed_properly_through_headers(self): """ Verifies that data is the same after being passed through headers """ fixture = { 'name': 'fake public image', 'is_public': True, 'deleted': False, 'name': None, 'size': 19, 'location': "file:///tmp/glance-tests/2", 'properties': { 'distro': 'Ubuntu 10.04 LTS' } } headers = utils.image_meta_to_http_headers(fixture) class FakeResponse(): pass response = FakeResponse() response.headers = headers result = utils.get_image_meta_from_headers(response) for k, v in six.iteritems(fixture): if v is not None: self.assertEqual(v, result[k]) else: self.assertNotIn(k, result)
def get_image_meta(self, image_id): """ Returns a mapping of image metadata from Registry :raises exception.NotFound if image is not in registry """ res = self.do_request("HEAD", "/images/%s" % image_id) image = utils.get_image_meta_from_headers(res) return image
def test_boolean_header_values(self): """ Tests that boolean headers like is_public can be set to True if any of ('True', 'On', 1) is provided, case-insensitive """ fixtures = [{'is_public': True}, {'is_public': 'True'}, {'is_public': 'true'}] expected = {'is_public': True} class FakeResponse(): pass for fixture in fixtures: headers = utils.image_meta_to_http_headers(fixture) response = FakeResponse() response.headers = headers result = utils.get_image_meta_from_headers(response) for k, v in expected.items(): self.assertEqual(v, result[k]) # Ensure False for other values... fixtures = [{'is_public': False}, {'is_public': 'Off'}, {'is_public': 'on'}, {'is_public': '1'}, {'is_public': 'False'}] expected = {'is_public': False} for fixture in fixtures: headers = utils.image_meta_to_http_headers(fixture) response = FakeResponse() response.headers = headers result = utils.get_image_meta_from_headers(response) for k, v in expected.items(): self.assertEqual(v, result[k])
def get_image(self, image_id): """ Returns a tuple with the image's metadata and the raw disk image as a mime-encoded blob stream for the supplied opaque image identifier. :param image_id: The opaque image identifier :retval Tuple containing (image_meta, image_blob) :raises exception.NotFound if image is not found """ res = self.do_request("GET", "/images/%s" % image_id) image = utils.get_image_meta_from_headers(res) return image, base_client.ImageBodyIterator(res)
def _deserialize(self, request): result = {} try: result['image_meta'] = utils.get_image_meta_from_headers(request) except exception.Invalid: image_size_str = request.headers['x-image-meta-size'] msg = _("Incoming image size of %s was not convertible to " "an integer.") % image_size_str raise HTTPBadRequest(explanation=msg, request=request) image_meta = result['image_meta'] image_meta = validate_image_meta(request, image_meta) if request.content_length: image_size = request.content_length elif 'size' in image_meta: image_size = image_meta['size'] else: image_size = None data = request.body_file if self.has_body(request) else None if image_size is None and data is not None: data = utils.LimitingReader(data, CONF.image_size_cap) #NOTE(bcwaldon): this is a hack to make sure the downstream code # gets the correct image data request.body_file = data elif image_size > CONF.image_size_cap: max_image_size = CONF.image_size_cap msg = _("Denying attempt to upload image larger than %d bytes.") LOG.warn(msg % max_image_size) raise HTTPBadRequest(explanation=msg % max_image_size, request=request) result['image_data'] = data return result
def _deserialize(self, request): result = {} try: result['image_meta'] = utils.get_image_meta_from_headers(request) except exception.Invalid: image_size_str = request.headers['x-image-meta-size'] msg = _("Incoming image size of %s was not convertible to " "an integer.") % image_size_str raise HTTPBadRequest(msg, request=request) image_meta = result['image_meta'] if 'size' in image_meta: incoming_image_size = image_meta['size'] if incoming_image_size > IMAGE_SIZE_CAP: max_image_size = IMAGE_SIZE_CAP msg = _("Denying attempt to upload image larger than " "%(max_image_size)d. Supplied image size was " "%(incoming_image_size)d") % locals() logger.warn(msg) raise HTTPBadRequest(msg, request=request) data = request.body_file if self.has_body(request) else None result['image_data'] = data return result
def test_get_meta_from_headers(self): resp = webob.Response() resp.headers = {"x-image-meta-name": 'test'} result = utils.get_image_meta_from_headers(resp) self.assertEqual({'name': 'test', 'properties': {}}, result)
def _deserialize(self, request): result = {} result['image_meta'] = utils.get_image_meta_from_headers(request) data = request.body_file if self.has_body(request) else None result['image_data'] = data return result
def test_get_meta_from_headers(self): resp = webob.Response() resp.headers = {"x-image-meta-name": "test"} result = utils.get_image_meta_from_headers(resp) self.assertEqual({"name": "test", "properties": {}}, result)