Example #1
0
    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])
Example #2
0
 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)
Example #3
0
    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)
Example #4
0
    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
Example #5
0
    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
Example #6
0
    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)
Example #7
0
    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)
Example #8
0
    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
Example #9
0
    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])
Example #10
0
    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)
Example #11
0
    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
Example #12
0
    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
Example #13
0
    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
Example #14
0
 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)
Example #15
0
 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)
Example #16
0
 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
Example #17
0
 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
Example #18
0
 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)