bilean/bilean/api/openstack/v1/resources.py

121 lines
4.1 KiB
Python

#
# Licensed under the Apache License, Version 2.0 (the "License"); you may
# not use this file except in compliance with the License. You may obtain
# a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
# License for the specific language governing permissions and limitations
# under the License.
from webob import exc
from bilean.api.openstack.v1 import util
from bilean.api import validator
from bilean.common import consts
from bilean.common import exception
from bilean.common.i18n import _
from bilean.common import serializers
from bilean.common import utils
from bilean.common import wsgi
from bilean.rpc import client as rpc_client
class ResourceController(object):
"""WSGI controller for Resources in Bilean v1 API
Implements the API actions, cause action 'create' and 'delete' is
triggered by notification, it's not necessary to provide here.
"""
# Define request scope (must match what is in policy.json)
REQUEST_SCOPE = 'resources'
def __init__(self, options):
self.options = options
self.rpc_client = rpc_client.EngineClient()
@util.policy_enforce
def index(self, req):
"""Lists summary information for all resources"""
filter_whitelist = {
'resource_type': 'mixed',
'rule_id': 'mixed',
}
param_whitelist = {
'user_id': 'single',
'limit': 'single',
'marker': 'single',
'sort_dir': 'single',
'sort_keys': 'multi',
'show_deleted': 'single',
}
params = util.get_allowed_params(req.params, param_whitelist)
filters = util.get_allowed_params(req.params, filter_whitelist)
key = consts.PARAM_LIMIT
if key in params:
params[key] = utils.parse_int_param(key, params[key])
key = consts.PARAM_SHOW_DELETED
if key in params:
params[key] = utils.parse_bool_param(key, params[key])
if not filters:
filters = None
resources = self.rpc_client.resource_list(req.context, filters=filters,
**params)
return {'resources': resources}
@util.policy_enforce
def get(self, req, resource_id):
"""Gets detailed information for a resource"""
resource = self.rpc_client.resource_get(req.context, resource_id)
return {'resource': resource}
@util.policy_enforce
def validate_creation(self, req, body):
"""Validate resources creation
:param user_id: Id of user to validate
:param body: dict body include resources and count
:return True|False
"""
if not validator.is_valid_body(body):
raise exc.HTTPUnprocessableEntity()
resources = body.get('resources')
if not resources:
msg = _("Resources is empty")
raise exc.HTTPBadRequest(explanation=msg)
count = body.get('count')
if count:
try:
validator.validate_integer(count, 'count',
consts.MIN_RESOURCE_NUM,
consts.MAX_RESOURCE_NUM)
except exception.InvalidInput as e:
raise exc.HTTPBadRequest(explanation=e.format_message())
try:
for resource in resources:
validator.validate_resource(resource)
except exception.InvalidInput as e:
raise exc.HTTPBadRequest(explanation=e.format_message())
except Exception as e:
raise exc.HTTPBadRequest(explanation=e)
return self.rpc_client.validate_creation(req.context, body)
def create_resource(options):
"""Resource resource factory method."""
deserializer = wsgi.JSONRequestDeserializer()
serializer = serializers.JSONResponseSerializer()
return wsgi.Resource(ResourceController(options), deserializer, serializer)