Exemple #1
0
    def test_serialize(self):
        class JSONSerializer(object):
            def serialize(self, obj):
                return 'json'

        class XMLSerializer(object):
            def serialize(self, obj):
                return 'xml'

        class AtomSerializer(object):
            def serialize(self, obj):
                return 'atom'

        robj = wsgi.ResponseObject({},
                                   code=202,
                                   json=JSONSerializer,
                                   xml=XMLSerializer,
                                   atom=AtomSerializer)
        robj['X-header1'] = 'header1'
        robj['X-header2'] = 'header2'

        for content_type, mtype in wsgi._MEDIA_TYPE_MAP.items():
            request = wsgi.Request.blank('/tests/123')
            response = robj.serialize(request, content_type)

            self.assertEqual(response.headers['Content-Type'], content_type)
            self.assertEqual(response.headers['X-header1'], 'header1')
            self.assertEqual(response.headers['X-header2'], 'header2')
            self.assertEqual(response.status_int, 202)
            self.assertEqual(response.body, mtype)
Exemple #2
0
 def test_get_serializer_defaults(self):
     robj = wsgi.ResponseObject({})
     default_serializers = dict(json='json', xml='xml', atom='atom')
     for content_type, mtype in wsgi._MEDIA_TYPE_MAP.items():
         self.assertRaises(exception.InvalidContentType,
                           robj.get_serializer, content_type)
         serializer = robj.get_serializer(content_type, default_serializers)
         self.assertEqual(serializer, mtype)
Exemple #3
0
    def _action_rebuild(self, info, request, instance_id):
        """Rebuild an instance with the given attributes"""
        try:
            body = info['rebuild']
        except (KeyError, TypeError):
            raise exc.HTTPBadRequest(_("Invalid request body"))

        try:
            image_href = body["imageRef"]
        except (KeyError, TypeError):
            msg = _("Could not parse imageRef from request.")
            raise exc.HTTPBadRequest(explanation=msg)

        try:
            password = body['adminPass']
        except (KeyError, TypeError):
            password = utils.generate_password(FLAGS.password_length)

        context = request.environ['engine.context']
        instance = self._get_server(context, instance_id)

        attr_map = {
            'personality': 'files_to_inject',
            'name': 'display_name',
            'accessIPv4': 'access_ip_v4',
            'accessIPv6': 'access_ip_v6',
            'metadata': 'metadata',
        }

        kwargs = {}

        for request_attribute, instance_attribute in attr_map.items():
            try:
                kwargs[instance_attribute] = body[request_attribute]
            except (KeyError, TypeError):
                pass

        self._validate_metadata(kwargs.get('metadata', {}))

        if 'files_to_inject' in kwargs:
            personality = kwargs['files_to_inject']
            kwargs['files_to_inject'] = self._get_injected_files(personality)

        try:
            self.compute_api.rebuild(context, instance, image_href, password,
                                     **kwargs)

        except exception.RebuildRequiresActiveInstance:
            msg = _("Instance must be active to rebuild.")
            raise exc.HTTPConflict(explanation=msg)
        except exception.InstanceNotFound:
            msg = _("Instance could not be found")
            raise exc.HTTPNotFound(explanation=msg)

        instance = self._get_server(context, instance_id)

        self._add_instance_faults(context, [instance])
        view = self._view_builder.show(request, instance)

        # Add on the adminPass attribute since the view doesn't do it
        view['server']['adminPass'] = password

        robj = wsgi.ResponseObject(view)
        return self._add_location(robj)
Exemple #4
0
    def create(self, req, body):
        """ Creates a new server for a given user """
        if not body:
            raise exc.HTTPUnprocessableEntity()

        if not 'server' in body:
            raise exc.HTTPUnprocessableEntity()

        body['server']['key_name'] = self._get_key_name(req, body)

        context = req.environ['engine.context']
        server_dict = body['server']
        password = self._get_server_admin_password(server_dict)

        if not 'name' in server_dict:
            msg = _("Server name is not defined")
            raise exc.HTTPBadRequest(explanation=msg)

        name = server_dict['name']
        self._validate_server_name(name)
        name = name.strip()

        image_href = self._image_ref_from_req_data(body)

        # If the image href was generated by engine api, strip image_href
        # down to an id and use the default tank connection params
        if str(image_href).startswith(req.application_url):
            image_href = image_href.split('/').pop()

        personality = server_dict.get('personality')
        config_drive = server_dict.get('config_drive')

        injected_files = []
        if personality:
            injected_files = self._get_injected_files(personality)

        sg_names = []
        security_groups = server_dict.get('security_groups')
        if security_groups is not None:
            sg_names = [sg['name'] for sg in security_groups if sg.get('name')]
        if not sg_names:
            sg_names.append('default')

        sg_names = list(set(sg_names))

        requested_networks = server_dict.get('networks')
        if requested_networks is not None:
            requested_networks = self._get_requested_networks(
                requested_networks)

        try:
            flavor_id = self._flavor_id_from_req_data(body)
        except ValueError as error:
            msg = _("Invalid flavorRef provided.")
            raise exc.HTTPBadRequest(explanation=msg)

        zone_blob = server_dict.get('blob')

        # optional x7 extensions:
        key_name = server_dict.get('key_name')
        user_data = server_dict.get('user_data')
        self._validate_user_data(user_data)

        availability_zone = server_dict.get('availability_zone')
        name = server_dict['name']
        self._validate_server_name(name)
        name = name.strip()

        block_device_mapping = self._get_block_device_mapping(server_dict)

        # Only allow admins to specify their own reservation_ids
        # This is really meant to allow zones to work.
        reservation_id = server_dict.get('reservation_id')
        if all([
                reservation_id is not None, reservation_id != '',
                not context.is_admin
        ]):
            reservation_id = None

        ret_resv_id = server_dict.get('return_reservation_id', False)

        min_count = server_dict.get('min_count')
        max_count = server_dict.get('max_count')
        # min_count and max_count are optional.  If they exist, they come
        # in as strings.  We want to default 'min_count' to 1, and default
        # 'max_count' to be 'min_count'.
        min_count = int(min_count) if min_count else 1
        max_count = int(max_count) if max_count else min_count
        if min_count > max_count:
            min_count = max_count

        auto_disk_config = server_dict.get('auto_disk_config')

        try:
            inst_type = \
                    instance_types.get_instance_type_by_flavor_id(flavor_id)

            (instances, resv_id) = self.compute_api.create(
                context,
                inst_type,
                image_href,
                display_name=name,
                display_description=name,
                key_name=key_name,
                metadata=server_dict.get('metadata', {}),
                access_ip_v4=server_dict.get('accessIPv4'),
                access_ip_v6=server_dict.get('accessIPv6'),
                injected_files=injected_files,
                admin_password=password,
                zone_blob=zone_blob,
                reservation_id=reservation_id,
                min_count=min_count,
                max_count=max_count,
                requested_networks=requested_networks,
                security_group=sg_names,
                user_data=user_data,
                availability_zone=availability_zone,
                config_drive=config_drive,
                block_device_mapping=block_device_mapping,
                auto_disk_config=auto_disk_config)
        except exception.QuotaError as error:
            self._handle_quota_error(error)
        except exception.InstanceTypeMemoryTooSmall as error:
            raise exc.HTTPBadRequest(explanation=unicode(error))
        except exception.InstanceTypeDiskTooSmall as error:
            raise exc.HTTPBadRequest(explanation=unicode(error))
        except exception.ImageNotFound as error:
            msg = _("Can not find requested image")
            raise exc.HTTPBadRequest(explanation=msg)
        except exception.FlavorNotFound as error:
            msg = _("Invalid flavorRef provided.")
            raise exc.HTTPBadRequest(explanation=msg)
        except exception.KeypairNotFound as error:
            msg = _("Invalid key_name provided.")
            raise exc.HTTPBadRequest(explanation=msg)
        except exception.SecurityGroupNotFound as error:
            raise exc.HTTPBadRequest(explanation=unicode(error))
        except rpc_common.RemoteError as err:
            msg = "%(err_type)s: %(err_msg)s" % \
                  {'err_type': err.exc_type, 'err_msg': err.value}
            raise exc.HTTPBadRequest(explanation=msg)
        # Let the caller deal with unhandled exceptions.

        # If the caller wanted a reservation_id, return it
        if ret_resv_id:
            return {'reservation_id': resv_id}

        server = self._view_builder.create(req, instances[0])

        if '_is_precooked' in server['server'].keys():
            del server['server']['_is_precooked']
        else:
            server['server']['adminPass'] = password

        robj = wsgi.ResponseObject(server)

        return self._add_location(robj)
Exemple #5
0
 def test_get_serializer(self):
     robj = wsgi.ResponseObject({}, json='json', xml='xml', atom='atom')
     for content_type, mtype in wsgi._MEDIA_TYPE_MAP.items():
         serializer = robj.get_serializer(content_type)
         self.assertEqual(serializer, mtype)
Exemple #6
0
 def test_default_serializers(self):
     robj = wsgi.ResponseObject({})
     self.assertEqual(robj.serializers, {})
Exemple #7
0
 def test_bind_serializers(self):
     robj = wsgi.ResponseObject({}, json='foo')
     robj._bind_method_serializers(dict(xml='bar', json='baz'))
     self.assertEqual(robj.serializers, dict(xml='bar', json='foo'))
Exemple #8
0
 def test_del_header(self):
     robj = wsgi.ResponseObject({})
     robj['Header'] = 'foo'
     del robj['hEADER']
     self.assertFalse('header' in robj.headers)
Exemple #9
0
 def test_header_isolation(self):
     robj = wsgi.ResponseObject({})
     robj['Header'] = 'foo'
     hdrs = robj.headers
     hdrs['hEADER'] = 'bar'
     self.assertEqual(robj['hEADER'], 'foo')
Exemple #10
0
 def test_get_header(self):
     robj = wsgi.ResponseObject({})
     robj['Header'] = 'foo'
     self.assertEqual(robj['hEADER'], 'foo')
Exemple #11
0
 def test_set_header(self):
     robj = wsgi.ResponseObject({})
     robj['Header'] = 'foo'
     self.assertEqual(robj.headers, {'header': 'foo'})
Exemple #12
0
 def test_override_modified_code(self):
     robj = wsgi.ResponseObject({}, code=404)
     robj._default_code = 202
     self.assertEqual(robj.code, 404)
Exemple #13
0
 def test_modified_code(self):
     robj = wsgi.ResponseObject({})
     robj._default_code = 202
     self.assertEqual(robj.code, 202)
Exemple #14
0
 def test_default_code(self):
     robj = wsgi.ResponseObject({})
     self.assertEqual(robj.code, 200)