def test_success(self): qs = "VCPU:1" resources = util.normalize_resources_qs_param(qs) expected = { 'VCPU': 1, } self.assertEqual(expected, resources) qs = "VCPU:1,MEMORY_MB:1024,DISK_GB:100" resources = util.normalize_resources_qs_param(qs) expected = { 'VCPU': 1, 'MEMORY_MB': 1024, 'DISK_GB': 100, } self.assertEqual(expected, resources)
def test_success(self): qs = "VCPU:1" resources = util.normalize_resources_qs_param(qs) expected = { 'VCPU': 1, } self.assertEqual(expected, resources) qs = "VCPU:1,MEMORY_MB:1024,DISK_GB:100" resources = util.normalize_resources_qs_param(qs) expected = { 'VCPU': 1, 'MEMORY_MB': 1024, 'DISK_GB': 100, } self.assertEqual(expected, resources)
def list_allocation_candidates(req): """GET a JSON object with a list of allocation requests and a JSON object of provider summary objects On success return a 200 and an application/json body representing a collection of allocation requests and provider summaries """ context = req.environ['placement.context'] schema = _GET_SCHEMA_1_10 util.validate_query_params(req, schema) resources = util.normalize_resources_qs_param(req.GET['resources']) filters = { 'resources': resources, } try: cands = rp_obj.AllocationCandidates.get_by_filters(context, filters) except exception.ResourceClassNotFound as exc: raise webob.exc.HTTPBadRequest( _('Invalid resource class in resources parameter: %(error)s') % {'error': exc}) response = req.response trx_cands = _transform_allocation_candidates(cands) json_data = jsonutils.dumps(trx_cands) response.body = encodeutils.to_utf8(json_data) response.content_type = 'application/json' return response
def list_resource_providers(req): """GET a list of resource providers. On success return a 200 and an application/json body representing a collection of resource providers. """ context = req.environ['placement.context'] want_version = req.environ[microversion.MICROVERSION_ENVIRON] schema = GET_RPS_SCHEMA_1_0 if want_version.matches((1, 14)): schema = GET_RPS_SCHEMA_1_14 elif want_version.matches((1, 4)): schema = GET_RPS_SCHEMA_1_4 elif want_version.matches((1, 3)): schema = GET_RPS_SCHEMA_1_3 util.validate_query_params(req, schema) filters = {} for attr in ['uuid', 'name', 'member_of', 'in_tree']: if attr in req.GET: value = req.GET[attr] # special case member_of to always make its value a # list, either by accepting the single value, or if it # starts with 'in:' splitting on ','. # NOTE(cdent): This will all change when we start using # JSONSchema validation of query params. if attr == 'member_of': if value.startswith('in:'): value = value[3:].split(',') else: value = [value] # Make sure the values are actually UUIDs. for aggr_uuid in value: if not uuidutils.is_uuid_like(aggr_uuid): raise webob.exc.HTTPBadRequest( _('Invalid uuid value: %(uuid)s') % {'uuid': aggr_uuid}) filters[attr] = value if 'resources' in req.GET: resources = util.normalize_resources_qs_param(req.GET['resources']) filters['resources'] = resources try: resource_providers = rp_obj.ResourceProviderList.get_all_by_filters( context, filters) except exception.ResourceClassNotFound as exc: raise webob.exc.HTTPBadRequest( _('Invalid resource class in resources parameter: %(error)s') % {'error': exc}) response = req.response output, last_modified = _serialize_providers( req.environ, resource_providers, want_version) response.body = encodeutils.to_utf8(jsonutils.dumps(output)) response.content_type = 'application/json' if want_version.matches((1, 15)): response.last_modified = last_modified response.cache_control = 'no-cache' return response
def list_allocation_candidates(req): """GET a JSON object with a list of allocation requests and a JSON object of provider summary objects On success return a 200 and an application/json body representing a collection of allocation requests and provider summaries """ context = req.environ['placement.context'] schema = _GET_SCHEMA_1_10 util.validate_query_params(req, schema) resources = util.normalize_resources_qs_param(req.GET['resources']) filters = { 'resources': resources, } try: cands = rp_obj.AllocationCandidates.get_by_filters(context, filters) except exception.ResourceClassNotFound as exc: raise webob.exc.HTTPBadRequest( _('Invalid resource class in resources parameter: %(error)s') % {'error': exc}) response = req.response trx_cands = _transform_allocation_candidates(cands) json_data = jsonutils.dumps(trx_cands) response.body = encodeutils.to_utf8(json_data) response.content_type = 'application/json' return response
def list_resource_providers(req): """GET a list of resource providers. On success return a 200 and an application/json body representing a collection of resource providers. """ context = req.environ['placement.context'] want_version = req.environ[microversion.MICROVERSION_ENVIRON] schema = GET_RPS_SCHEMA_1_0 if want_version == (1, 3): schema = GET_RPS_SCHEMA_1_3 if want_version >= (1, 4): schema = GET_RPS_SCHEMA_1_4 util.validate_query_params(req, schema) filters = {} for attr in ['uuid', 'name', 'member_of']: if attr in req.GET: value = req.GET[attr] # special case member_of to always make its value a # list, either by accepting the single value, or if it # starts with 'in:' splitting on ','. # NOTE(cdent): This will all change when we start using # JSONSchema validation of query params. if attr == 'member_of': if value.startswith('in:'): value = value[3:].split(',') else: value = [value] # Make sure the values are actually UUIDs. for aggr_uuid in value: if not uuidutils.is_uuid_like(aggr_uuid): raise webob.exc.HTTPBadRequest( _('Invalid uuid value: %(uuid)s') % {'uuid': aggr_uuid}) filters[attr] = value if 'resources' in req.GET: resources = util.normalize_resources_qs_param(req.GET['resources']) filters['resources'] = resources try: resource_providers = objects.ResourceProviderList.get_all_by_filters( context, filters) except exception.ResourceClassNotFound as exc: raise webob.exc.HTTPBadRequest( _('Invalid resource class in resources parameter: %(error)s') % {'error': exc}) response = req.response response.body = encodeutils.to_utf8( jsonutils.dumps(_serialize_providers(req.environ, resource_providers))) response.content_type = 'application/json' return response
def list_resource_providers(req): """GET a list of resource providers. On success return a 200 and an application/json body representing a collection of resource providers. """ context = req.environ['placement.context'] context.can(policies.LIST) want_version = req.environ[microversion.MICROVERSION_ENVIRON] schema = rp_schema.GET_RPS_SCHEMA_1_0 if want_version.matches((1, 18)): schema = rp_schema.GET_RPS_SCHEMA_1_18 elif want_version.matches((1, 14)): schema = rp_schema.GET_RPS_SCHEMA_1_14 elif want_version.matches((1, 4)): schema = rp_schema.GET_RPS_SCHEMA_1_4 elif want_version.matches((1, 3)): schema = rp_schema.GET_RPS_SCHEMA_1_3 allow_forbidden = want_version.matches((1, 22)) util.validate_query_params(req, schema) filters = {} # special handling of member_of qparam since we allow multiple member_of # params at microversion 1.24. if 'member_of' in req.GET: filters['member_of'] = util.normalize_member_of_qs_params(req) qpkeys = ('uuid', 'name', 'in_tree', 'resources', 'required') for attr in qpkeys: if attr in req.GET: value = req.GET[attr] if attr == 'resources': value = util.normalize_resources_qs_param(value) elif attr == 'required': value = util.normalize_traits_qs_param( value, allow_forbidden=allow_forbidden) filters[attr] = value try: resource_providers = rp_obj.ResourceProviderList.get_all_by_filters( context, filters) except exception.ResourceClassNotFound as exc: raise webob.exc.HTTPBadRequest( _('Invalid resource class in resources parameter: %(error)s') % {'error': exc}) except exception.TraitNotFound as exc: raise webob.exc.HTTPBadRequest( _('Invalid trait(s) in "required" parameter: %(error)s') % {'error': exc}) response = req.response output, last_modified = _serialize_providers( req.environ, resource_providers, want_version) response.body = encodeutils.to_utf8(jsonutils.dumps(output)) response.content_type = 'application/json' if want_version.matches((1, 15)): response.last_modified = last_modified response.cache_control = 'no-cache' return response