Skip to content

Commit

Permalink
Improve error message when the default role doesn't exist
Browse files Browse the repository at this point in the history
To add members to a project, Horizon requires a default role to exist
in Keystone.  This provides a clearer error message when the role
cannot be found.

Fixes bug #1108063

Change-Id: I0e3cd4cb96c7896c675055671e0875840b1a41d3
  • Loading branch information
jpichon committed Feb 11, 2013
1 parent 216d566 commit 0e414a9
Show file tree
Hide file tree
Showing 2 changed files with 40 additions and 2 deletions.
30 changes: 30 additions & 0 deletions openstack_dashboard/dashboards/admin/projects/tests.py
Expand Up @@ -14,11 +14,15 @@
# License for the specific language governing permissions and limitations
# under the License.

import logging

from django import http
from django.core.urlresolvers import reverse

from mox import IsA

from horizon import exceptions

from openstack_dashboard import api
from openstack_dashboard.test import helpers as test
from openstack_dashboard.usage import quotas
Expand Down Expand Up @@ -844,3 +848,29 @@ def test_update_project_member_update_error(self):
self.assertNoFormErrors(res)
self.assertMessageCount(error=1, warning=0)
self.assertRedirectsNoFollow(res, INDEX_URL)

@test.create_stubs({api.keystone: ('get_default_role', 'tenant_get'),
quotas: ('get_tenant_quota_data',)})
def test_update_project_when_default_role_does_not_exist(self):
project = self.tenants.first()
quota = self.quotas.first()

api.keystone.get_default_role(IsA(http.HttpRequest)) \
.AndReturn(None) # Default role doesn't exist
api.keystone.tenant_get(IsA(http.HttpRequest), self.tenant.id,
admin=True) \
.AndReturn(project)
quotas.get_tenant_quota_data(IsA(http.HttpRequest)).AndReturn(quota)
self.mox.ReplayAll()

url = reverse('horizon:admin:projects:update',
args=[self.tenant.id])

try:
# Avoid the log message in the test output when the workflow's
# step action cannot be instantiated
logging.disable(logging.ERROR)
with self.assertRaises(exceptions.NotFound):
res = self.client.get(url)
finally:
logging.disable(logging.NOTSET)
12 changes: 10 additions & 2 deletions openstack_dashboard/dashboards/admin/projects/workflows.py
Expand Up @@ -19,6 +19,7 @@
# under the License.


from django.conf import settings
from django.utils.translation import ugettext as _
from django.core.urlresolvers import reverse

Expand Down Expand Up @@ -110,12 +111,19 @@ def __init__(self, request, *args, **kwargs):

# Get the default role
try:
default_role = api.keystone.get_default_role(self.request).id
default_role = api.keystone.get_default_role(self.request)
# Default role is necessary to add members to a project
if default_role is None:
default = getattr(settings,
"OPENSTACK_KEYSTONE_DEFAULT_ROLE", None)
msg = _('Could not find default role "%s" in Keystone'
% default)
raise exceptions.NotFound(msg)
except:
exceptions.handle(self.request,
err_msg,
redirect=reverse(INDEX_URL))
self.fields['default_role'].initial = default_role
self.fields['default_role'].initial = default_role.id

# Get list of available users
all_users = []
Expand Down

0 comments on commit 0e414a9

Please sign in to comment.