Merge "policy: Replaces 'authorize' in nova-api (part 5)"

This commit is contained in:
Jenkins
2016-06-30 12:22:35 +00:00
committed by Gerrit Code Review
20 changed files with 108 additions and 107 deletions

View File

@@ -20,10 +20,10 @@ from nova.api.openstack import wsgi
from nova import exception from nova import exception
from nova.i18n import _ from nova.i18n import _
from nova.network.security_group import openstack_driver from nova.network.security_group import openstack_driver
from nova.policies import security_group_default_rules as sgdr_policies
ALIAS = "os-security-group-default-rules" ALIAS = "os-security-group-default-rules"
authorize = extensions.os_compute_authorizer(ALIAS)
class SecurityGroupDefaultRulesController(sg.SecurityGroupControllerBase): class SecurityGroupDefaultRulesController(sg.SecurityGroupControllerBase):
@@ -35,7 +35,7 @@ class SecurityGroupDefaultRulesController(sg.SecurityGroupControllerBase):
@extensions.expected_errors((400, 409, 501)) @extensions.expected_errors((400, 409, 501))
def create(self, req, body): def create(self, req, body):
context = req.environ['nova.context'] context = req.environ['nova.context']
authorize(context) context.can(sgdr_policies.BASE_POLICY_NAME)
sg_rule = self._from_body(body, 'security_group_default_rule') sg_rule = self._from_body(body, 'security_group_default_rule')
@@ -72,7 +72,7 @@ class SecurityGroupDefaultRulesController(sg.SecurityGroupControllerBase):
@extensions.expected_errors((400, 404, 501)) @extensions.expected_errors((400, 404, 501))
def show(self, req, id): def show(self, req, id):
context = req.environ['nova.context'] context = req.environ['nova.context']
authorize(context) context.can(sgdr_policies.BASE_POLICY_NAME)
try: try:
id = self.security_group_api.validate_id(id) id = self.security_group_api.validate_id(id)
@@ -91,7 +91,7 @@ class SecurityGroupDefaultRulesController(sg.SecurityGroupControllerBase):
@wsgi.response(204) @wsgi.response(204)
def delete(self, req, id): def delete(self, req, id):
context = req.environ['nova.context'] context = req.environ['nova.context']
authorize(context) context.can(sgdr_policies.BASE_POLICY_NAME)
try: try:
id = self.security_group_api.validate_id(id) id = self.security_group_api.validate_id(id)
@@ -107,7 +107,7 @@ class SecurityGroupDefaultRulesController(sg.SecurityGroupControllerBase):
@extensions.expected_errors((404, 501)) @extensions.expected_errors((404, 501))
def index(self, req): def index(self, req):
context = req.environ['nova.context'] context = req.environ['nova.context']
authorize(context) context.can(sgdr_policies.BASE_POLICY_NAME)
ret = {'security_group_default_rules': []} ret = {'security_group_default_rules': []}
try: try:

View File

@@ -28,19 +28,18 @@ from nova import compute
from nova import exception from nova import exception
from nova.i18n import _ from nova.i18n import _
from nova.network.security_group import openstack_driver from nova.network.security_group import openstack_driver
from nova.policies import security_groups as sg_policies
from nova.virt import netutils from nova.virt import netutils
LOG = logging.getLogger(__name__) LOG = logging.getLogger(__name__)
ALIAS = 'os-security-groups' ALIAS = 'os-security-groups'
ATTRIBUTE_NAME = 'security_groups' ATTRIBUTE_NAME = 'security_groups'
authorize = extensions.os_compute_authorizer(ALIAS)
softauth = extensions.os_compute_soft_authorizer(ALIAS)
def _authorize_context(req): def _authorize_context(req):
context = req.environ['nova.context'] context = req.environ['nova.context']
authorize(context) context.can(sg_policies.BASE_POLICY_NAME)
return context return context
@@ -386,7 +385,7 @@ class SecurityGroupActionController(wsgi.Controller):
@wsgi.action('addSecurityGroup') @wsgi.action('addSecurityGroup')
def _addSecurityGroup(self, req, id, body): def _addSecurityGroup(self, req, id, body):
context = req.environ['nova.context'] context = req.environ['nova.context']
authorize(context) context.can(sg_policies.BASE_POLICY_NAME)
group_name = self._parse(body, 'addSecurityGroup') group_name = self._parse(body, 'addSecurityGroup')
try: try:
@@ -406,7 +405,7 @@ class SecurityGroupActionController(wsgi.Controller):
@wsgi.action('removeSecurityGroup') @wsgi.action('removeSecurityGroup')
def _removeSecurityGroup(self, req, id, body): def _removeSecurityGroup(self, req, id, body):
context = req.environ['nova.context'] context = req.environ['nova.context']
authorize(context) context.can(sg_policies.BASE_POLICY_NAME)
group_name = self._parse(body, 'removeSecurityGroup') group_name = self._parse(body, 'removeSecurityGroup')
@@ -436,7 +435,7 @@ class SecurityGroupsOutputController(wsgi.Controller):
return return
key = "security_groups" key = "security_groups"
context = req.environ['nova.context'] context = req.environ['nova.context']
if not softauth(context): if not context.can(sg_policies.BASE_POLICY_NAME, fatal=False):
return return
if not openstack_driver.is_neutron_security_groups(): if not openstack_driver.is_neutron_security_groups():

View File

@@ -18,10 +18,10 @@ from nova.api.openstack import extensions
from nova.api.openstack import wsgi from nova.api.openstack import wsgi
from nova import compute from nova import compute
from nova import exception from nova import exception
from nova.policies import server_diagnostics as sd_policies
ALIAS = "os-server-diagnostics" ALIAS = "os-server-diagnostics"
authorize = extensions.os_compute_authorizer(ALIAS)
class ServerDiagnosticsController(wsgi.Controller): class ServerDiagnosticsController(wsgi.Controller):
@@ -31,7 +31,7 @@ class ServerDiagnosticsController(wsgi.Controller):
@extensions.expected_errors((404, 409, 501)) @extensions.expected_errors((404, 409, 501))
def index(self, req, server_id): def index(self, req, server_id):
context = req.environ["nova.context"] context = req.environ["nova.context"]
authorize(context) context.can(sd_policies.BASE_POLICY_NAME)
instance = common.get_instance(self.compute_api, context, server_id) instance = common.get_instance(self.compute_api, context, server_id)

View File

@@ -24,11 +24,11 @@ from nova import exception
from nova.i18n import _ from nova.i18n import _
from nova.i18n import _LI from nova.i18n import _LI
from nova import objects from nova import objects
from nova.policies import server_external_events as see_policies
LOG = logging.getLogger(__name__) LOG = logging.getLogger(__name__)
ALIAS = 'os-server-external-events' ALIAS = 'os-server-external-events'
authorize = extensions.os_compute_authorizer(ALIAS)
class ServerExternalEventsController(wsgi.Controller): class ServerExternalEventsController(wsgi.Controller):
@@ -43,7 +43,7 @@ class ServerExternalEventsController(wsgi.Controller):
def create(self, req, body): def create(self, req, body):
"""Creates a new instance event.""" """Creates a new instance event."""
context = req.environ['nova.context'] context = req.environ['nova.context']
authorize(context, action='create') context.can(see_policies.POLICY_ROOT % 'create')
response_events = [] response_events = []
accepted_events = [] accepted_events = []

View File

@@ -29,18 +29,16 @@ import nova.exception
from nova.i18n import _ from nova.i18n import _
from nova.i18n import _LE from nova.i18n import _LE
from nova import objects from nova import objects
from nova.policies import server_groups as sg_policies
LOG = logging.getLogger(__name__) LOG = logging.getLogger(__name__)
ALIAS = "os-server-groups" ALIAS = "os-server-groups"
authorize = extensions.os_compute_authorizer(ALIAS)
def _authorize_context(req): def _authorize_context(req):
context = req.environ['nova.context'] context = req.environ['nova.context']
authorize(context) context.can(sg_policies.BASE_POLICY_NAME)
return context return context

View File

@@ -24,9 +24,9 @@ from nova.api import validation
from nova import compute from nova import compute
from nova import exception from nova import exception
from nova.i18n import _ from nova.i18n import _
from nova.policies import server_metadata as sm_policies
ALIAS = 'server-metadata' ALIAS = 'server-metadata'
authorize = extensions.os_compute_authorizer(ALIAS)
class ServerMetadataController(wsgi.Controller): class ServerMetadataController(wsgi.Controller):
@@ -55,7 +55,7 @@ class ServerMetadataController(wsgi.Controller):
def index(self, req, server_id): def index(self, req, server_id):
"""Returns the list of metadata for a given instance.""" """Returns the list of metadata for a given instance."""
context = req.environ['nova.context'] context = req.environ['nova.context']
authorize(context, action='index') context.can(sm_policies.POLICY_ROOT % 'index')
return {'metadata': self._get_metadata(context, server_id)} return {'metadata': self._get_metadata(context, server_id)}
@extensions.expected_errors((400, 403, 404, 409)) @extensions.expected_errors((400, 403, 404, 409))
@@ -65,7 +65,7 @@ class ServerMetadataController(wsgi.Controller):
def create(self, req, server_id, body): def create(self, req, server_id, body):
metadata = body['metadata'] metadata = body['metadata']
context = req.environ['nova.context'] context = req.environ['nova.context']
authorize(context, action='create') context.can(sm_policies.POLICY_ROOT % 'create')
new_metadata = self._update_instance_metadata(context, new_metadata = self._update_instance_metadata(context,
server_id, server_id,
metadata, metadata,
@@ -77,7 +77,7 @@ class ServerMetadataController(wsgi.Controller):
@validation.schema(server_metadata.update) @validation.schema(server_metadata.update)
def update(self, req, server_id, id, body): def update(self, req, server_id, id, body):
context = req.environ['nova.context'] context = req.environ['nova.context']
authorize(context, action='update') context.can(sm_policies.POLICY_ROOT % 'update')
meta_item = body['meta'] meta_item = body['meta']
if id not in meta_item: if id not in meta_item:
expl = _('Request body and URI mismatch') expl = _('Request body and URI mismatch')
@@ -94,7 +94,7 @@ class ServerMetadataController(wsgi.Controller):
@validation.schema(server_metadata.update_all) @validation.schema(server_metadata.update_all)
def update_all(self, req, server_id, body): def update_all(self, req, server_id, body):
context = req.environ['nova.context'] context = req.environ['nova.context']
authorize(context, action='update_all') context.can(sm_policies.POLICY_ROOT % 'update_all')
metadata = body['metadata'] metadata = body['metadata']
new_metadata = self._update_instance_metadata(context, new_metadata = self._update_instance_metadata(context,
server_id, server_id,
@@ -129,7 +129,7 @@ class ServerMetadataController(wsgi.Controller):
def show(self, req, server_id, id): def show(self, req, server_id, id):
"""Return a single metadata item.""" """Return a single metadata item."""
context = req.environ['nova.context'] context = req.environ['nova.context']
authorize(context, action='show') context.can(sm_policies.POLICY_ROOT % 'show')
data = self._get_metadata(context, server_id) data = self._get_metadata(context, server_id)
try: try:
@@ -143,7 +143,7 @@ class ServerMetadataController(wsgi.Controller):
def delete(self, req, server_id, id): def delete(self, req, server_id, id):
"""Deletes an existing metadata.""" """Deletes an existing metadata."""
context = req.environ['nova.context'] context = req.environ['nova.context']
authorize(context, action='delete') context.can(sm_policies.POLICY_ROOT % 'delete')
metadata = self._get_metadata(context, server_id) metadata = self._get_metadata(context, server_id)
if id not in metadata: if id not in metadata:

View File

@@ -23,10 +23,10 @@ from nova.api import validation
from nova import compute from nova import compute
from nova import exception from nova import exception
from nova.i18n import _ from nova.i18n import _
from nova.policies import servers_migrations as sm_policies
ALIAS = 'servers:migrations' ALIAS = 'servers:migrations'
authorize = extensions.os_compute_authorizer(ALIAS)
def output(migration): def output(migration):
@@ -69,7 +69,7 @@ class ServerMigrationsController(wsgi.Controller):
@validation.schema(server_migrations.force_complete) @validation.schema(server_migrations.force_complete)
def _force_complete(self, req, id, server_id, body): def _force_complete(self, req, id, server_id, body):
context = req.environ['nova.context'] context = req.environ['nova.context']
authorize(context, action='force_complete') context.can(sm_policies.POLICY_ROOT % 'force_complete')
instance = common.get_instance(self.compute_api, context, server_id) instance = common.get_instance(self.compute_api, context, server_id)
try: try:
@@ -91,7 +91,7 @@ class ServerMigrationsController(wsgi.Controller):
def index(self, req, server_id): def index(self, req, server_id):
"""Return all migrations of an instance in progress.""" """Return all migrations of an instance in progress."""
context = req.environ['nova.context'] context = req.environ['nova.context']
authorize(context, action="index") context.can(sm_policies.POLICY_ROOT % 'index')
# NOTE(Shaohe Feng) just check the instance is available. To keep # NOTE(Shaohe Feng) just check the instance is available. To keep
# consistency with other API, check it before get migrations. # consistency with other API, check it before get migrations.
@@ -107,7 +107,7 @@ class ServerMigrationsController(wsgi.Controller):
def show(self, req, server_id, id): def show(self, req, server_id, id):
"""Return the migration of an instance in progress by id.""" """Return the migration of an instance in progress by id."""
context = req.environ['nova.context'] context = req.environ['nova.context']
authorize(context, action="show") context.can(sm_policies.POLICY_ROOT % 'show')
# NOTE(Shaohe Feng) just check the instance is available. To keep # NOTE(Shaohe Feng) just check the instance is available. To keep
# consistency with other API, check it before get migrations. # consistency with other API, check it before get migrations.
@@ -141,7 +141,7 @@ class ServerMigrationsController(wsgi.Controller):
def delete(self, req, server_id, id): def delete(self, req, server_id, id):
"""Abort an in progress migration of an instance.""" """Abort an in progress migration of an instance."""
context = req.environ['nova.context'] context = req.environ['nova.context']
authorize(context, action="delete") context.can(sm_policies.POLICY_ROOT % 'delete')
instance = common.get_instance(self.compute_api, context, server_id) instance = common.get_instance(self.compute_api, context, server_id)
try: try:

View File

@@ -20,10 +20,10 @@ from nova.api.openstack import common
from nova.api.openstack import extensions from nova.api.openstack import extensions
from nova.api.openstack import wsgi from nova.api.openstack import wsgi
from nova import compute from nova import compute
from nova.policies import server_password as sp_policies
ALIAS = 'os-server-password' ALIAS = 'os-server-password'
authorize = extensions.os_compute_authorizer(ALIAS)
class ServerPasswordController(wsgi.Controller): class ServerPasswordController(wsgi.Controller):
@@ -34,7 +34,7 @@ class ServerPasswordController(wsgi.Controller):
@extensions.expected_errors(404) @extensions.expected_errors(404)
def index(self, req, server_id): def index(self, req, server_id):
context = req.environ['nova.context'] context = req.environ['nova.context']
authorize(context) context.can(sp_policies.BASE_POLICY_NAME)
instance = common.get_instance(self.compute_api, context, server_id) instance = common.get_instance(self.compute_api, context, server_id)
passw = password.extract_password(instance) passw = password.extract_password(instance)
@@ -50,7 +50,7 @@ class ServerPasswordController(wsgi.Controller):
""" """
context = req.environ['nova.context'] context = req.environ['nova.context']
authorize(context) context.can(sp_policies.BASE_POLICY_NAME)
instance = common.get_instance(self.compute_api, context, server_id) instance = common.get_instance(self.compute_api, context, server_id)
meta = password.convert_password(context, None) meta = password.convert_password(context, None)
instance.system_metadata.update(meta) instance.system_metadata.update(meta)

View File

@@ -25,10 +25,10 @@ from nova.compute import vm_states
from nova import exception from nova import exception
from nova.i18n import _ from nova.i18n import _
from nova import objects from nova import objects
from nova.policies import server_tags as st_policies
ALIAS = "os-server-tags" ALIAS = "os-server-tags"
authorize = extensions.os_compute_authorizer(ALIAS)
def _get_tags_names(tags): def _get_tags_names(tags):
@@ -58,7 +58,7 @@ class ServerTagsController(wsgi.Controller):
@extensions.expected_errors(404) @extensions.expected_errors(404)
def show(self, req, server_id, id): def show(self, req, server_id, id):
context = req.environ["nova.context"] context = req.environ["nova.context"]
authorize(context, action='show') context.can(st_policies.POLICY_ROOT % 'show')
try: try:
exists = objects.Tag.exists(context, server_id, id) exists = objects.Tag.exists(context, server_id, id)
@@ -74,7 +74,7 @@ class ServerTagsController(wsgi.Controller):
@extensions.expected_errors(404) @extensions.expected_errors(404)
def index(self, req, server_id): def index(self, req, server_id):
context = req.environ["nova.context"] context = req.environ["nova.context"]
authorize(context, action='index') context.can(st_policies.POLICY_ROOT % 'index')
try: try:
tags = objects.TagList.get_by_resource_id(context, server_id) tags = objects.TagList.get_by_resource_id(context, server_id)
@@ -88,7 +88,7 @@ class ServerTagsController(wsgi.Controller):
@validation.schema(schema.update) @validation.schema(schema.update)
def update(self, req, server_id, id, body): def update(self, req, server_id, id, body):
context = req.environ["nova.context"] context = req.environ["nova.context"]
authorize(context, action='update') context.can(st_policies.POLICY_ROOT % 'update')
self._check_instance_in_valid_state(context, server_id, 'update tag') self._check_instance_in_valid_state(context, server_id, 'update tag')
try: try:
@@ -136,7 +136,7 @@ class ServerTagsController(wsgi.Controller):
@validation.schema(schema.update_all) @validation.schema(schema.update_all)
def update_all(self, req, server_id, body): def update_all(self, req, server_id, body):
context = req.environ["nova.context"] context = req.environ["nova.context"]
authorize(context, action='update_all') context.can(st_policies.POLICY_ROOT % 'update_all')
self._check_instance_in_valid_state(context, server_id, 'update tags') self._check_instance_in_valid_state(context, server_id, 'update tags')
invalid_tags = [] invalid_tags = []
@@ -178,7 +178,7 @@ class ServerTagsController(wsgi.Controller):
@extensions.expected_errors((404, 409)) @extensions.expected_errors((404, 409))
def delete(self, req, server_id, id): def delete(self, req, server_id, id):
context = req.environ["nova.context"] context = req.environ["nova.context"]
authorize(context, action='delete') context.can(st_policies.POLICY_ROOT % 'delete')
self._check_instance_in_valid_state(context, server_id, 'delete tag') self._check_instance_in_valid_state(context, server_id, 'delete tag')
try: try:
@@ -193,7 +193,7 @@ class ServerTagsController(wsgi.Controller):
@extensions.expected_errors((404, 409)) @extensions.expected_errors((404, 409))
def delete_all(self, req, server_id): def delete_all(self, req, server_id):
context = req.environ["nova.context"] context = req.environ["nova.context"]
authorize(context, action='delete_all') context.can(st_policies.POLICY_ROOT % 'delete_all')
self._check_instance_in_valid_state(context, server_id, 'delete tags') self._check_instance_in_valid_state(context, server_id, 'delete tags')
try: try:

View File

@@ -14,10 +14,10 @@
from nova.api.openstack import extensions from nova.api.openstack import extensions
from nova.api.openstack import wsgi from nova.api.openstack import wsgi
from nova.policies import server_usage as su_policies
ALIAS = "os-server-usage" ALIAS = "os-server-usage"
authorize = extensions.os_compute_soft_authorizer(ALIAS)
resp_topic = "OS-SRV-USG" resp_topic = "OS-SRV-USG"
@@ -37,7 +37,7 @@ class ServerUsageController(wsgi.Controller):
@wsgi.extends @wsgi.extends
def show(self, req, resp_obj, id): def show(self, req, resp_obj, id):
context = req.environ['nova.context'] context = req.environ['nova.context']
if authorize(context): if context.can(su_policies.BASE_POLICY_NAME, fatal=False):
server = resp_obj.obj['server'] server = resp_obj.obj['server']
db_instance = req.get_db_instance(server['id']) db_instance = req.get_db_instance(server['id'])
# server['id'] is guaranteed to be in the cache due to # server['id'] is guaranteed to be in the cache due to
@@ -47,7 +47,7 @@ class ServerUsageController(wsgi.Controller):
@wsgi.extends @wsgi.extends
def detail(self, req, resp_obj): def detail(self, req, resp_obj):
context = req.environ['nova.context'] context = req.environ['nova.context']
if authorize(context): if context.can(su_policies.BASE_POLICY_NAME, fatal=False):
servers = list(resp_obj.obj['servers']) servers = list(resp_obj.obj['servers'])
for server in servers: for server in servers:
db_instance = req.get_db_instance(server['id']) db_instance = req.get_db_instance(server['id'])

View File

@@ -22,11 +22,11 @@ from nova.api import validation
from nova import compute from nova import compute
from nova import exception from nova import exception
from nova.i18n import _ from nova.i18n import _
from nova.policies import services as services_policies
from nova import servicegroup from nova import servicegroup
from nova import utils from nova import utils
ALIAS = "os-services" ALIAS = "os-services"
authorize = extensions.os_compute_authorizer(ALIAS)
class ServiceController(wsgi.Controller): class ServiceController(wsgi.Controller):
@@ -42,7 +42,7 @@ class ServiceController(wsgi.Controller):
api_services = ('nova-osapi_compute', 'nova-ec2', 'nova-metadata') api_services = ('nova-osapi_compute', 'nova-ec2', 'nova-metadata')
context = req.environ['nova.context'] context = req.environ['nova.context']
authorize(context) context.can(services_policies.BASE_POLICY_NAME)
_services = [ _services = [
s s
@@ -155,7 +155,7 @@ class ServiceController(wsgi.Controller):
def _perform_action(self, req, id, body, actions): def _perform_action(self, req, id, body, actions):
"""Calculate action dictionary dependent on provided fields""" """Calculate action dictionary dependent on provided fields"""
context = req.environ['nova.context'] context = req.environ['nova.context']
authorize(context) context.can(services_policies.BASE_POLICY_NAME)
try: try:
action = actions[id] action = actions[id]
@@ -170,7 +170,7 @@ class ServiceController(wsgi.Controller):
def delete(self, req, id): def delete(self, req, id):
"""Deletes the specified service.""" """Deletes the specified service."""
context = req.environ['nova.context'] context = req.environ['nova.context']
authorize(context) context.can(services_policies.BASE_POLICY_NAME)
try: try:
utils.validate_integer(id, 'id') utils.validate_integer(id, 'id')

View File

@@ -21,10 +21,10 @@ from nova.api.openstack import extensions as exts
from nova.api.openstack import wsgi from nova.api.openstack import wsgi
from nova import compute from nova import compute
from nova import exception from nova import exception
from nova.policies import shelve as shelve_policies
ALIAS = 'os-shelve' ALIAS = 'os-shelve'
authorize = exts.os_compute_authorizer(ALIAS)
class ShelveController(wsgi.Controller): class ShelveController(wsgi.Controller):
@@ -38,7 +38,7 @@ class ShelveController(wsgi.Controller):
def _shelve(self, req, id, body): def _shelve(self, req, id, body):
"""Move an instance into shelved mode.""" """Move an instance into shelved mode."""
context = req.environ["nova.context"] context = req.environ["nova.context"]
authorize(context, action='shelve') context.can(shelve_policies.POLICY_ROOT % 'shelve')
instance = common.get_instance(self.compute_api, context, id) instance = common.get_instance(self.compute_api, context, id)
try: try:
@@ -57,7 +57,7 @@ class ShelveController(wsgi.Controller):
def _shelve_offload(self, req, id, body): def _shelve_offload(self, req, id, body):
"""Force removal of a shelved instance from the compute node.""" """Force removal of a shelved instance from the compute node."""
context = req.environ["nova.context"] context = req.environ["nova.context"]
authorize(context, action='shelve_offload') context.can(shelve_policies.POLICY_ROOT % 'shelve_offload')
instance = common.get_instance(self.compute_api, context, id) instance = common.get_instance(self.compute_api, context, id)
try: try:
@@ -77,7 +77,7 @@ class ShelveController(wsgi.Controller):
def _unshelve(self, req, id, body): def _unshelve(self, req, id, body):
"""Restore an instance from shelved mode.""" """Restore an instance from shelved mode."""
context = req.environ["nova.context"] context = req.environ["nova.context"]
authorize(context, action='unshelve') context.can(shelve_policies.POLICY_ROOT % 'unshelve')
instance = common.get_instance(self.compute_api, context, id) instance = common.get_instance(self.compute_api, context, id)
try: try:
self.compute_api.unshelve(context, instance) self.compute_api.unshelve(context, instance)

View File

@@ -26,9 +26,9 @@ from nova.api.openstack import wsgi
from nova import exception from nova import exception
from nova.i18n import _ from nova.i18n import _
from nova import objects from nova import objects
from nova.policies import simple_tenant_usage as stu_policies
ALIAS = "os-simple-tenant-usage" ALIAS = "os-simple-tenant-usage"
authorize = extensions.os_compute_authorizer(ALIAS)
def parse_strtime(dstr, fmt): def parse_strtime(dstr, fmt):
@@ -220,7 +220,7 @@ class SimpleTenantUsageController(wsgi.Controller):
"""Retrieve tenant_usage for all tenants.""" """Retrieve tenant_usage for all tenants."""
context = req.environ['nova.context'] context = req.environ['nova.context']
authorize(context, action='list') context.can(stu_policies.POLICY_ROOT % 'list')
try: try:
(period_start, period_stop, detailed) = self._get_datetime_range( (period_start, period_stop, detailed) = self._get_datetime_range(
@@ -243,7 +243,8 @@ class SimpleTenantUsageController(wsgi.Controller):
tenant_id = id tenant_id = id
context = req.environ['nova.context'] context = req.environ['nova.context']
authorize(context, action='show', target={'project_id': tenant_id}) context.can(stu_policies.POLICY_ROOT % 'show',
{'project_id': tenant_id})
try: try:
(period_start, period_stop, ignore) = self._get_datetime_range( (period_start, period_stop, ignore) = self._get_datetime_range(

View File

@@ -19,13 +19,11 @@ from nova.api.openstack import extensions
from nova.api.openstack import wsgi from nova.api.openstack import wsgi
from nova import compute from nova import compute
from nova import exception from nova import exception
from nova.policies import suspend_server as ss_policies
ALIAS = "os-suspend-server" ALIAS = "os-suspend-server"
authorize = extensions.os_compute_authorizer(ALIAS)
class SuspendServerController(wsgi.Controller): class SuspendServerController(wsgi.Controller):
def __init__(self, *args, **kwargs): def __init__(self, *args, **kwargs):
super(SuspendServerController, self).__init__(*args, **kwargs) super(SuspendServerController, self).__init__(*args, **kwargs)
@@ -37,7 +35,7 @@ class SuspendServerController(wsgi.Controller):
def _suspend(self, req, id, body): def _suspend(self, req, id, body):
"""Permit admins to suspend the server.""" """Permit admins to suspend the server."""
context = req.environ['nova.context'] context = req.environ['nova.context']
authorize(context, action='suspend') context.can(ss_policies.POLICY_ROOT % 'suspend')
try: try:
server = common.get_instance(self.compute_api, context, id) server = common.get_instance(self.compute_api, context, id)
self.compute_api.suspend(context, server) self.compute_api.suspend(context, server)
@@ -55,7 +53,7 @@ class SuspendServerController(wsgi.Controller):
def _resume(self, req, id, body): def _resume(self, req, id, body):
"""Permit admins to resume the server from suspend.""" """Permit admins to resume the server from suspend."""
context = req.environ['nova.context'] context = req.environ['nova.context']
authorize(context, action='resume') context.can(ss_policies.POLICY_ROOT % 'resume')
try: try:
server = common.get_instance(self.compute_api, context, id) server = common.get_instance(self.compute_api, context, id)
self.compute_api.resume(context, server) self.compute_api.resume(context, server)

View File

@@ -30,6 +30,7 @@ from nova import exception
from nova.i18n import _ from nova.i18n import _
from nova.i18n import _LE from nova.i18n import _LE
import nova.network import nova.network
from nova.policies import tenant_networks as tn_policies
from nova import quota from nova import quota
@@ -39,7 +40,6 @@ ALIAS = 'os-tenant-networks'
QUOTAS = quota.QUOTAS QUOTAS = quota.QUOTAS
LOG = logging.getLogger(__name__) LOG = logging.getLogger(__name__)
authorize = extensions.os_compute_authorizer(ALIAS)
def network_dict(network): def network_dict(network):
@@ -76,7 +76,7 @@ class TenantNetworkController(wsgi.Controller):
@extensions.expected_errors(()) @extensions.expected_errors(())
def index(self, req): def index(self, req):
context = req.environ['nova.context'] context = req.environ['nova.context']
authorize(context) context.can(tn_policies.BASE_POLICY_NAME)
networks = list(self.network_api.get_all(context)) networks = list(self.network_api.get_all(context))
if not self._default_networks: if not self._default_networks:
self._refresh_default_networks() self._refresh_default_networks()
@@ -86,7 +86,7 @@ class TenantNetworkController(wsgi.Controller):
@extensions.expected_errors(404) @extensions.expected_errors(404)
def show(self, req, id): def show(self, req, id):
context = req.environ['nova.context'] context = req.environ['nova.context']
authorize(context) context.can(tn_policies.BASE_POLICY_NAME)
try: try:
network = self.network_api.get(context, id) network = self.network_api.get(context, id)
except exception.NetworkNotFound: except exception.NetworkNotFound:
@@ -98,7 +98,7 @@ class TenantNetworkController(wsgi.Controller):
@wsgi.response(202) @wsgi.response(202)
def delete(self, req, id): def delete(self, req, id):
context = req.environ['nova.context'] context = req.environ['nova.context']
authorize(context) context.can(tn_policies.BASE_POLICY_NAME)
reservation = None reservation = None
try: try:
if CONF.enable_network_quota: if CONF.enable_network_quota:
@@ -133,7 +133,7 @@ class TenantNetworkController(wsgi.Controller):
@validation.schema(schema.create) @validation.schema(schema.create)
def create(self, req, body): def create(self, req, body):
context = req.environ["nova.context"] context = req.environ["nova.context"]
authorize(context) context.can(tn_policies.BASE_POLICY_NAME)
network = body["network"] network = body["network"]
keys = ["cidr", "cidr_v6", "ipam", "vlan_start", "network_size", keys = ["cidr", "cidr_v6", "ipam", "vlan_start", "network_size",

View File

@@ -16,6 +16,7 @@ import six
from nova.api.openstack import extensions from nova.api.openstack import extensions
from nova.api.openstack import wsgi from nova.api.openstack import wsgi
from nova.policies import used_limits as ul_policies
from nova import quota from nova import quota
@@ -23,7 +24,6 @@ QUOTAS = quota.QUOTAS
ALIAS = "os-used-limits" ALIAS = "os-used-limits"
authorize = extensions.os_compute_authorizer(ALIAS)
class UsedLimitsController(wsgi.Controller): class UsedLimitsController(wsgi.Controller):
@@ -65,7 +65,7 @@ class UsedLimitsController(wsgi.Controller):
'project_id': tenant_id, 'project_id': tenant_id,
'user_id': context.user_id 'user_id': context.user_id
} }
authorize(context, target=target) context.can(ul_policies.BASE_POLICY_NAME, target)
return tenant_id return tenant_id
return context.project_id return context.project_id

View File

@@ -24,10 +24,10 @@ from nova.api.openstack import wsgi
from nova import compute from nova import compute
from nova.i18n import _ from nova.i18n import _
from nova import network from nova import network
from nova.policies import virtual_interfaces as vif_policies
ALIAS = 'os-virtual-interfaces' ALIAS = 'os-virtual-interfaces'
authorize = extensions.os_compute_authorizer(ALIAS)
def _translate_vif_summary_view(req, vif): def _translate_vif_summary_view(req, vif):
@@ -56,7 +56,7 @@ class ServerVirtualInterfaceController(wsgi.Controller):
def _items(self, req, server_id, entity_maker): def _items(self, req, server_id, entity_maker):
"""Returns a list of VIFs, transformed through entity_maker.""" """Returns a list of VIFs, transformed through entity_maker."""
context = req.environ['nova.context'] context = req.environ['nova.context']
authorize(context) context.can(vif_policies.BASE_POLICY_NAME)
instance = common.get_instance(self.compute_api, context, server_id) instance = common.get_instance(self.compute_api, context, server_id)
try: try:

View File

@@ -29,11 +29,11 @@ from nova.compute import vm_states
from nova import exception from nova import exception
from nova.i18n import _ from nova.i18n import _
from nova import objects from nova import objects
from nova.policies import volumes as vol_policies
from nova.policies import volumes_attachments as va_policies
from nova import volume from nova import volume
ALIAS = "os-volumes" ALIAS = "os-volumes"
authorize = extensions.os_compute_authorizer(ALIAS)
authorize_attach = extensions.os_compute_authorizer('os-volumes-attachments')
def _translate_volume_detail_view(context, vol): def _translate_volume_detail_view(context, vol):
@@ -104,7 +104,7 @@ class VolumeController(wsgi.Controller):
def show(self, req, id): def show(self, req, id):
"""Return data about the given volume.""" """Return data about the given volume."""
context = req.environ['nova.context'] context = req.environ['nova.context']
authorize(context) context.can(vol_policies.BASE_POLICY_NAME)
try: try:
vol = self.volume_api.get(context, id) vol = self.volume_api.get(context, id)
@@ -118,7 +118,7 @@ class VolumeController(wsgi.Controller):
def delete(self, req, id): def delete(self, req, id):
"""Delete a volume.""" """Delete a volume."""
context = req.environ['nova.context'] context = req.environ['nova.context']
authorize(context) context.can(vol_policies.BASE_POLICY_NAME)
try: try:
self.volume_api.delete(context, id) self.volume_api.delete(context, id)
@@ -138,7 +138,7 @@ class VolumeController(wsgi.Controller):
def _items(self, req, entity_maker): def _items(self, req, entity_maker):
"""Returns a list of volumes, transformed through entity_maker.""" """Returns a list of volumes, transformed through entity_maker."""
context = req.environ['nova.context'] context = req.environ['nova.context']
authorize(context) context.can(vol_policies.BASE_POLICY_NAME)
volumes = self.volume_api.get_all(context) volumes = self.volume_api.get_all(context)
limited_list = common.limited(volumes, req) limited_list = common.limited(volumes, req)
@@ -150,7 +150,7 @@ class VolumeController(wsgi.Controller):
def create(self, req, body): def create(self, req, body):
"""Creates a new volume.""" """Creates a new volume."""
context = req.environ['nova.context'] context = req.environ['nova.context']
authorize(context) context.can(vol_policies.BASE_POLICY_NAME)
vol = body['volume'] vol = body['volume']
@@ -256,7 +256,7 @@ class VolumeAttachmentController(wsgi.Controller):
def index(self, req, server_id): def index(self, req, server_id):
"""Returns the list of volume attachments for a given instance.""" """Returns the list of volume attachments for a given instance."""
context = req.environ['nova.context'] context = req.environ['nova.context']
authorize_attach(context, action='index') context.can(va_policies.POLICY_ROOT % 'index')
return self._items(req, server_id, return self._items(req, server_id,
entity_maker=_translate_attachment_summary_view) entity_maker=_translate_attachment_summary_view)
@@ -264,8 +264,8 @@ class VolumeAttachmentController(wsgi.Controller):
def show(self, req, server_id, id): def show(self, req, server_id, id):
"""Return data about the given volume attachment.""" """Return data about the given volume attachment."""
context = req.environ['nova.context'] context = req.environ['nova.context']
authorize(context) context.can(vol_policies.BASE_POLICY_NAME)
authorize_attach(context, action='show') context.can(va_policies.POLICY_ROOT % 'show')
volume_id = id volume_id = id
instance = common.get_instance(self.compute_api, context, server_id) instance = common.get_instance(self.compute_api, context, server_id)
@@ -298,8 +298,8 @@ class VolumeAttachmentController(wsgi.Controller):
def create(self, req, server_id, body): def create(self, req, server_id, body):
"""Attach a volume to an instance.""" """Attach a volume to an instance."""
context = req.environ['nova.context'] context = req.environ['nova.context']
authorize(context) context.can(vol_policies.BASE_POLICY_NAME)
authorize_attach(context, action='create') context.can(va_policies.POLICY_ROOT % 'create')
volume_id = body['volumeAttachment']['volumeId'] volume_id = body['volumeAttachment']['volumeId']
device = body['volumeAttachment'].get('device') device = body['volumeAttachment'].get('device')
@@ -350,8 +350,8 @@ class VolumeAttachmentController(wsgi.Controller):
@validation.schema(volumes_schema.update_volume_attachment) @validation.schema(volumes_schema.update_volume_attachment)
def update(self, req, server_id, id, body): def update(self, req, server_id, id, body):
context = req.environ['nova.context'] context = req.environ['nova.context']
authorize(context) context.can(vol_policies.BASE_POLICY_NAME)
authorize_attach(context, action='update') context.can(va_policies.POLICY_ROOT % 'update')
old_volume_id = id old_volume_id = id
try: try:
@@ -398,8 +398,8 @@ class VolumeAttachmentController(wsgi.Controller):
def delete(self, req, server_id, id): def delete(self, req, server_id, id):
"""Detach a volume from an instance.""" """Detach a volume from an instance."""
context = req.environ['nova.context'] context = req.environ['nova.context']
authorize(context) context.can(vol_policies.BASE_POLICY_NAME)
authorize_attach(context, action='delete') context.can(va_policies.POLICY_ROOT % 'delete')
volume_id = id volume_id = id
@@ -455,7 +455,7 @@ class VolumeAttachmentController(wsgi.Controller):
def _items(self, req, server_id, entity_maker): def _items(self, req, server_id, entity_maker):
"""Returns a list of attachments, transformed through entity_maker.""" """Returns a list of attachments, transformed through entity_maker."""
context = req.environ['nova.context'] context = req.environ['nova.context']
authorize(context) context.can(vol_policies.BASE_POLICY_NAME)
instance = common.get_instance(self.compute_api, context, server_id) instance = common.get_instance(self.compute_api, context, server_id)
@@ -508,7 +508,7 @@ class SnapshotController(wsgi.Controller):
def show(self, req, id): def show(self, req, id):
"""Return data about the given snapshot.""" """Return data about the given snapshot."""
context = req.environ['nova.context'] context = req.environ['nova.context']
authorize(context) context.can(vol_policies.BASE_POLICY_NAME)
try: try:
vol = self.volume_api.get_snapshot(context, id) vol = self.volume_api.get_snapshot(context, id)
@@ -522,7 +522,7 @@ class SnapshotController(wsgi.Controller):
def delete(self, req, id): def delete(self, req, id):
"""Delete a snapshot.""" """Delete a snapshot."""
context = req.environ['nova.context'] context = req.environ['nova.context']
authorize(context) context.can(vol_policies.BASE_POLICY_NAME)
try: try:
self.volume_api.delete_snapshot(context, id) self.volume_api.delete_snapshot(context, id)
@@ -542,7 +542,7 @@ class SnapshotController(wsgi.Controller):
def _items(self, req, entity_maker): def _items(self, req, entity_maker):
"""Returns a list of snapshots, transformed through entity_maker.""" """Returns a list of snapshots, transformed through entity_maker."""
context = req.environ['nova.context'] context = req.environ['nova.context']
authorize(context) context.can(vol_policies.BASE_POLICY_NAME)
snapshots = self.volume_api.get_all_snapshots(context) snapshots = self.volume_api.get_all_snapshots(context)
limited_list = common.limited(snapshots, req) limited_list = common.limited(snapshots, req)
@@ -554,7 +554,7 @@ class SnapshotController(wsgi.Controller):
def create(self, req, body): def create(self, req, body):
"""Creates a new snapshot.""" """Creates a new snapshot."""
context = req.environ['nova.context'] context = req.environ['nova.context']
authorize(context) context.can(vol_policies.BASE_POLICY_NAME)
snapshot = body['snapshot'] snapshot = body['snapshot']
volume_id = snapshot['volume_id'] volume_id = snapshot['volume_id']

View File

@@ -1398,11 +1398,11 @@ class SecurityGroupsOutputPolicyEnforcementV21(test.NoDBTestCase):
'server': {'id': '0'}, 'server': {'id': '0'},
'servers': [{'id': '0'}, {'id': '2'}]}) 'servers': [{'id': '0'}, {'id': '2'}]})
@mock.patch.object(secgroups_v21, "softauth") @mock.patch('nova.policy.authorize')
def test_show_policy_softauth_is_called(self, mock_softauth): def test_show_policy_softauth_is_called(self, mock_authorize):
mock_softauth.return_value = False mock_authorize.return_value = False
self.controller.show(self.req, self.fake_res, FAKE_UUID1) self.controller.show(self.req, self.fake_res, FAKE_UUID1)
self.assertTrue(mock_softauth.called) self.assertTrue(mock_authorize.called)
@mock.patch.object(nova.network.security_group.openstack_driver, @mock.patch.object(nova.network.security_group.openstack_driver,
"is_neutron_security_groups") "is_neutron_security_groups")
@@ -1410,11 +1410,11 @@ class SecurityGroupsOutputPolicyEnforcementV21(test.NoDBTestCase):
self.controller.show(self.req, self.fake_res, FAKE_UUID1) self.controller.show(self.req, self.fake_res, FAKE_UUID1)
self.assertFalse(is_neutron_security_groups.called) self.assertFalse(is_neutron_security_groups.called)
@mock.patch.object(secgroups_v21, "softauth") @mock.patch('nova.policy.authorize')
def test_create_policy_softauth_is_called(self, mock_softauth): def test_create_policy_softauth_is_called(self, mock_authorize):
mock_softauth.return_value = False mock_authorize.return_value = False
self.controller.show(self.req, self.fake_res, {}) self.controller.show(self.req, self.fake_res, {})
self.assertTrue(mock_softauth.called) self.assertTrue(mock_authorize.called)
@mock.patch.object(nova.network.security_group.openstack_driver, @mock.patch.object(nova.network.security_group.openstack_driver,
"is_neutron_security_groups") "is_neutron_security_groups")
@@ -1422,11 +1422,11 @@ class SecurityGroupsOutputPolicyEnforcementV21(test.NoDBTestCase):
self.controller.create(self.req, self.fake_res, {}) self.controller.create(self.req, self.fake_res, {})
self.assertFalse(is_neutron_security_groups.called) self.assertFalse(is_neutron_security_groups.called)
@mock.patch.object(secgroups_v21, "softauth") @mock.patch('nova.policy.authorize')
def test_detail_policy_softauth_is_called(self, mock_softauth): def test_detail_policy_softauth_is_called(self, mock_authorize):
mock_softauth.return_value = False mock_authorize.return_value = False
self.controller.detail(self.req, self.fake_res) self.controller.detail(self.req, self.fake_res)
self.assertTrue(mock_softauth.called) self.assertTrue(mock_authorize.called)
@mock.patch.object(nova.network.security_group.openstack_driver, @mock.patch.object(nova.network.security_group.openstack_driver,
"is_neutron_security_groups") "is_neutron_security_groups")

View File

@@ -13,6 +13,7 @@
# License for the specific language governing permissions and limitations # License for the specific language governing permissions and limitations
# under the License. # under the License.
import mock
import six import six
from nova.api.openstack.compute import used_limits \ from nova.api.openstack.compute import used_limits \
@@ -20,6 +21,7 @@ from nova.api.openstack.compute import used_limits \
from nova.api.openstack import wsgi from nova.api.openstack import wsgi
import nova.context import nova.context
from nova import exception from nova import exception
from nova.policies import used_limits as ul_policies
from nova import quota from nova import quota
from nova import test from nova import test
@@ -44,8 +46,9 @@ class UsedLimitsTestCaseV21(test.NoDBTestCase):
def _set_up_controller(self): def _set_up_controller(self):
self.ext_mgr = None self.ext_mgr = None
self.controller = used_limits_v21.UsedLimitsController() self.controller = used_limits_v21.UsedLimitsController()
self.mox.StubOutWithMock(used_limits_v21, 'authorize') patcher = self.mock_can = mock.patch('nova.context.RequestContext.can')
self.authorize = used_limits_v21.authorize self.mock_can = patcher.start()
self.addCleanup(patcher.stop)
def _do_test_used_limits(self, reserved): def _do_test_used_limits(self, reserved):
fake_req = FakeRequest(self.fake_context, reserved=reserved) fake_req = FakeRequest(self.fake_context, reserved=reserved)
@@ -120,13 +123,14 @@ class UsedLimitsTestCaseV21(test.NoDBTestCase):
self.ext_mgr.is_loaded('os-used-limits-for-admin').AndReturn(True) self.ext_mgr.is_loaded('os-used-limits-for-admin').AndReturn(True)
self.ext_mgr.is_loaded('os-server-group-quotas').AndReturn( self.ext_mgr.is_loaded('os-server-group-quotas').AndReturn(
self.include_server_group_quotas) self.include_server_group_quotas)
self.authorize(self.fake_context, target=target)
self.mox.StubOutWithMock(quota.QUOTAS, 'get_project_quotas') self.mox.StubOutWithMock(quota.QUOTAS, 'get_project_quotas')
quota.QUOTAS.get_project_quotas(self.fake_context, '%s' % tenant_id, quota.QUOTAS.get_project_quotas(self.fake_context, '%s' % tenant_id,
usages=True).AndReturn({}) usages=True).AndReturn({})
self.mox.ReplayAll() self.mox.ReplayAll()
res = wsgi.ResponseObject(obj) res = wsgi.ResponseObject(obj)
self.controller.index(fake_req, res) self.controller.index(fake_req, res)
self.mock_can.assert_called_once_with(ul_policies.BASE_POLICY_NAME,
target)
def test_admin_can_fetch_used_limits_for_own_project(self): def test_admin_can_fetch_used_limits_for_own_project(self):
project_id = "123456" project_id = "123456"
@@ -172,13 +176,14 @@ class UsedLimitsTestCaseV21(test.NoDBTestCase):
fake_req.GET = {'tenant_id': tenant_id} fake_req.GET = {'tenant_id': tenant_id}
if self.ext_mgr is not None: if self.ext_mgr is not None:
self.ext_mgr.is_loaded('os-used-limits-for-admin').AndReturn(True) self.ext_mgr.is_loaded('os-used-limits-for-admin').AndReturn(True)
self.authorize(self.fake_context, target=target). \ self.mock_can.side_effect = exception.PolicyNotAuthorized(
AndRaise(exception.PolicyNotAuthorized( action=self.used_limit_extension)
action=self.used_limit_extension))
self.mox.ReplayAll() self.mox.ReplayAll()
res = wsgi.ResponseObject(obj) res = wsgi.ResponseObject(obj)
self.assertRaises(exception.PolicyNotAuthorized, self.controller.index, self.assertRaises(exception.PolicyNotAuthorized, self.controller.index,
fake_req, res) fake_req, res)
self.mock_can.assert_called_once_with(ul_policies.BASE_POLICY_NAME,
target)
def test_used_limits_fetched_for_context_project_id(self): def test_used_limits_fetched_for_context_project_id(self):
project_id = "123456" project_id = "123456"