From ff3071612f74c6413644bfdb2191e0c095f261e6 Mon Sep 17 00:00:00 2001 From: Lin Hua Cheng Date: Thu, 22 Aug 2013 17:30:10 -0700 Subject: [PATCH] Fix the Domain context for Projects panel Add display of Domain ID and Domain Name in the Create and Update Projects page to give user a hint where the Project will be created. For Keystone V2, the two fields will be hidden. When the Domain Context is set, the Project will be created in that Domain Context. Otherwise, the Project will be created in the Domain of the logon user. On project creation, the listing of available users and groups will be based on the Domain where it will be created. While on project update, the listing of available users and groups will be based on the Domain of the Project. Fixes bug 1215196 Change-Id: Ia2ab25956621d01c2173e08402241b7f60401e0f --- openstack_dashboard/api/keystone.py | 22 +++ .../dashboards/admin/projects/tests.py | 148 +++++++++++------- .../dashboards/admin/projects/views.py | 21 ++- .../dashboards/admin/projects/workflows.py | 64 +++++--- .../test/test_data/keystone_data.py | 9 +- 5 files changed, 181 insertions(+), 83 deletions(-) diff --git a/openstack_dashboard/api/keystone.py b/openstack_dashboard/api/keystone.py index 3bc2a4c030..846ddbe84e 100644 --- a/openstack_dashboard/api/keystone.py +++ b/openstack_dashboard/api/keystone.py @@ -213,6 +213,28 @@ def tenant_create(request, name, description=None, enabled=None, domain=None): enabled=enabled) +def get_default_domain(request): + """ + Gets the default domain object to use when creating Identity object. + Returns the domain context if is set, otherwise return the domain + of the logon user. + """ + domain_id = request.session.get("domain_context", None) + domain_name = request.session.get("domain_context_name", None) + # if running in Keystone V3 or later + if VERSIONS.active >= 3 and not domain_id: + # if no domain context set, default to users' domain + domain_id = request.user.user_domain_id + try: + domain = domain_get(request, domain_id) + domain_name = domain.name + except Exception: + LOG.warning("Unable to retrieve Domain: %s" % domain_id) + domain = base.APIDictWrapper({"id": domain_id, + "name": domain_name}) + return domain + + # TODO(gabriel): Is there ever a valid case for admin to be false here? # A quick search through the codebase reveals that it's always called with # admin=true so I suspect we could eliminate it entirely as with the other diff --git a/openstack_dashboard/dashboards/admin/projects/tests.py b/openstack_dashboard/dashboards/admin/projects/tests.py index 962fe0a0ce..49e883d7c9 100644 --- a/openstack_dashboard/dashboards/admin/projects/tests.py +++ b/openstack_dashboard/dashboards/admin/projects/tests.py @@ -70,15 +70,18 @@ class TenantsViewTests(test.BaseAdminViewTests): class CreateProjectWorkflowTests(test.BaseAdminViewTests): def _get_project_info(self, project): - domain_id = self.request.session.get('domain_context', None) + domain = self._get_default_domain() project_info = {"name": project.name, "description": project.description, "enabled": project.enabled, - "domain": domain_id} + "domain": domain.id} return project_info def _get_workflow_fields(self, project): - project_info = {"name": project.name, + domain = self._get_default_domain() + project_info = {"domain_id": domain.id, + "domain_name": domain.name, + "name": project.name, "description": project.description, "enabled": project.enabled} return project_info @@ -101,8 +104,13 @@ class CreateProjectWorkflowTests(test.BaseAdminViewTests): project_info.update(quota_data) return project_info - def _get_domain_id(self): - return self.request.session.get('domain_context', None) + def _get_default_domain(self): + default_domain = self.domain + domain = {"id": self.request.session.get('domain_context', + default_domain.id), + "name": self.request.session.get('domain_context_name', + default_domain.name)} + return api.base.APIDictWrapper(domain) def _get_all_users(self, domain_id): if not domain_id: @@ -120,7 +128,8 @@ class CreateProjectWorkflowTests(test.BaseAdminViewTests): if group.domain_id == domain_id] return groups - @test.create_stubs({api.keystone: ('get_default_role', + @test.create_stubs({api.keystone: ('get_default_domain', + 'get_default_role', 'user_list', 'group_list', 'role_list'), @@ -128,14 +137,17 @@ class CreateProjectWorkflowTests(test.BaseAdminViewTests): def test_add_project_get(self): quota = self.quotas.first() default_role = self.roles.first() - domain_id = self._get_domain_id() + default_domain = self._get_default_domain() + domain_id = default_domain.id users = self._get_all_users(domain_id) groups = self._get_all_groups(domain_id) roles = self.roles.list() + # init + api.keystone.get_default_domain(IsA(http.HttpRequest)) \ + .AndReturn(default_domain) quotas.get_default_quota_data(IsA(http.HttpRequest)).AndReturn(quota) - # init api.keystone.get_default_role(IsA(http.HttpRequest)) \ .MultipleTimes().AndReturn(default_role) api.keystone.user_list(IsA(http.HttpRequest), domain=domain_id) \ @@ -233,7 +245,8 @@ class CreateProjectWorkflowTests(test.BaseAdminViewTests): project = self.tenants.first() quota = self.quotas.first() default_role = self.roles.first() - domain_id = self._get_domain_id() + default_domain = self._get_default_domain() + domain_id = default_domain.id users = self._get_all_users(domain_id) groups = self._get_all_groups(domain_id) roles = self.roles.list() @@ -320,16 +333,20 @@ class CreateProjectWorkflowTests(test.BaseAdminViewTests): @test.create_stubs({api.keystone: ('user_list', 'role_list', 'group_list', + 'get_default_domain', 'get_default_role'), quotas: ('get_default_quota_data',)}) def test_add_project_quota_defaults_error(self): default_role = self.roles.first() - domain_id = self._get_domain_id() + default_domain = self._get_default_domain() + domain_id = default_domain.id users = self._get_all_users(domain_id) groups = self._get_all_groups(domain_id) roles = self.roles.list() # init + api.keystone.get_default_domain(IsA(http.HttpRequest)) \ + .AndReturn(default_domain) quotas.get_default_quota_data(IsA(http.HttpRequest)) \ .AndRaise(self.exceptions.nova) @@ -360,18 +377,22 @@ class CreateProjectWorkflowTests(test.BaseAdminViewTests): 'user_list', 'role_list', 'group_list', + 'get_default_domain', 'get_default_role'), quotas: ('get_default_quota_data',)}) def test_add_project_tenant_create_error(self): project = self.tenants.first() quota = self.quotas.first() default_role = self.roles.first() - domain_id = self._get_domain_id() + default_domain = self._get_default_domain() + domain_id = default_domain.id users = self._get_all_users(domain_id) groups = self._get_all_groups(domain_id) roles = self.roles.list() # init + api.keystone.get_default_domain(IsA(http.HttpRequest)) \ + .AndReturn(default_domain) quotas.get_default_quota_data(IsA(http.HttpRequest)).AndReturn(quota) api.keystone.get_default_role(IsA(http.HttpRequest)) \ @@ -409,6 +430,7 @@ class CreateProjectWorkflowTests(test.BaseAdminViewTests): 'user_list', 'role_list', 'group_list', + 'get_default_domain', 'get_default_role', 'add_tenant_user_role'), quotas: ('get_default_quota_data',), @@ -417,12 +439,15 @@ class CreateProjectWorkflowTests(test.BaseAdminViewTests): project = self.tenants.first() quota = self.quotas.first() default_role = self.roles.first() - domain_id = self._get_domain_id() + default_domain = self._get_default_domain() + domain_id = default_domain.id users = self._get_all_users(domain_id) groups = self._get_all_groups(domain_id) roles = self.roles.list() # init + api.keystone.get_default_domain(IsA(http.HttpRequest)) \ + .AndReturn(default_domain) quotas.get_default_quota_data(IsA(http.HttpRequest)).AndReturn(quota) api.keystone.get_default_role(IsA(http.HttpRequest)) \ @@ -486,6 +511,7 @@ class CreateProjectWorkflowTests(test.BaseAdminViewTests): 'user_list', 'role_list', 'group_list', + 'get_default_domain', 'get_default_role', 'add_tenant_user_role'), quotas: ('get_default_quota_data',), @@ -495,12 +521,15 @@ class CreateProjectWorkflowTests(test.BaseAdminViewTests): project = self.tenants.first() quota = self.quotas.first() default_role = self.roles.first() - domain_id = self._get_domain_id() + default_domain = self._get_default_domain() + domain_id = default_domain.id users = self._get_all_users(domain_id) groups = self._get_all_groups(domain_id) roles = self.roles.list() # init + api.keystone.get_default_domain(IsA(http.HttpRequest)) \ + .AndReturn(default_domain) quotas.get_default_quota_data(IsA(http.HttpRequest)).AndReturn(quota) api.keystone.get_default_role(IsA(http.HttpRequest)) \ @@ -563,18 +592,22 @@ class CreateProjectWorkflowTests(test.BaseAdminViewTests): @test.create_stubs({api.keystone: ('user_list', 'role_list', 'group_list', + 'get_default_domain', 'get_default_role'), quotas: ('get_default_quota_data',)}) def test_add_project_missing_field_error(self): project = self.tenants.first() quota = self.quotas.first() default_role = self.roles.first() - domain_id = self._get_domain_id() + default_domain = self._get_default_domain() + domain_id = default_domain.id users = self._get_all_users(domain_id) groups = self._get_all_groups(domain_id) roles = self.roles.list() # init + api.keystone.get_default_domain(IsA(http.HttpRequest)) \ + .AndReturn(default_domain) quotas.get_default_quota_data(IsA(http.HttpRequest)).AndReturn(quota) api.keystone.get_default_role(IsA(http.HttpRequest)) \ @@ -616,9 +649,6 @@ class UpdateProjectWorkflowTests(test.BaseAdminViewTests): quota_data[field] = int(neutron_quota.get(field).limit) return quota_data - def _get_domain_id(self): - return self.request.session.get('domain_context', None) - def _get_all_users(self, domain_id): if not domain_id: users = self.users.list() @@ -646,6 +676,7 @@ class UpdateProjectWorkflowTests(test.BaseAdminViewTests): @test.create_stubs({api.keystone: ('get_default_role', 'roles_for_user', 'tenant_get', + 'domain_get', 'user_list', 'roles_for_group', 'group_list', @@ -655,7 +686,7 @@ class UpdateProjectWorkflowTests(test.BaseAdminViewTests): project = self.tenants.first() quota = self.quotas.first() default_role = self.roles.first() - domain_id = self._get_domain_id() + domain_id = project.domain_id users = self._get_all_users(domain_id) groups = self._get_all_groups(domain_id) roles = self.roles.list() @@ -663,6 +694,8 @@ class UpdateProjectWorkflowTests(test.BaseAdminViewTests): api.keystone.tenant_get(IsA(http.HttpRequest), self.tenant.id, admin=True) \ .AndReturn(project) + api.keystone.domain_get(IsA(http.HttpRequest), domain_id) \ + .AndReturn(self.domain) quotas.get_tenant_quota_data(IsA(http.HttpRequest), tenant_id=self.tenant.id) \ .AndReturn(quota) @@ -712,13 +745,8 @@ class UpdateProjectWorkflowTests(test.BaseAdminViewTests): '', '']) - def test_update_project_get_domain(self): - domain = self.domains.get(id="1") - self.setSessionValues(domain_context=domain.id, - domain_context_name=domain.name) - self.test_update_project_get() - @test.create_stubs({api.keystone: ('tenant_get', + 'domain_get', 'tenant_update', 'get_default_role', 'roles_for_user', @@ -737,7 +765,7 @@ class UpdateProjectWorkflowTests(test.BaseAdminViewTests): project = self.tenants.first() quota = self.quotas.first() default_role = self.roles.first() - domain_id = self._get_domain_id() + domain_id = project.domain_id users = self._get_all_users(domain_id) proj_users = self._get_proj_users(project.id) groups = self._get_all_groups(domain_id) @@ -748,6 +776,8 @@ class UpdateProjectWorkflowTests(test.BaseAdminViewTests): api.keystone.tenant_get(IsA(http.HttpRequest), self.tenant.id, admin=True) \ .AndReturn(project) + api.keystone.domain_get(IsA(http.HttpRequest), domain_id) \ + .AndReturn(self.domain) quotas.get_tenant_quota_data(IsA(http.HttpRequest), tenant_id=self.tenant.id) \ .AndReturn(quota) @@ -779,6 +809,7 @@ class UpdateProjectWorkflowTests(test.BaseAdminViewTests): workflow_data[GROUP_ROLE_PREFIX + "2"] = ['2'] # member role # update some fields + project._info["domain_id"] = domain_id project._info["name"] = "updated name" project._info["description"] = "updated description" quota.metadata_items = 444 @@ -895,7 +926,8 @@ class UpdateProjectWorkflowTests(test.BaseAdminViewTests): self.mox.ReplayAll() # submit form data - project_data = {"name": project._info["name"], + project_data = {"domain_id": project._info["domain_id"], + "name": project._info["name"], "id": project.id, "description": project._info["description"], "enabled": project.enabled} @@ -909,12 +941,6 @@ class UpdateProjectWorkflowTests(test.BaseAdminViewTests): self.assertMessageCount(error=0, warning=1) self.assertRedirectsNoFollow(res, INDEX_URL) - def test_update_project_save_domain(self): - domain = self.domains.get(id="1") - self.setSessionValues(domain_context=domain.id, - domain_context_name=domain.name) - self.test_update_project_save() - @test.create_stubs({api.neutron: ('is_extension_supported', 'tenant_quota_get', 'tenant_quota_update')}) @@ -950,6 +976,7 @@ class UpdateProjectWorkflowTests(test.BaseAdminViewTests): self.assertRedirectsNoFollow(res, INDEX_URL) @test.create_stubs({api.keystone: ('tenant_get', + 'domain_get', 'tenant_update', 'get_default_role', 'roles_for_user', @@ -967,7 +994,7 @@ class UpdateProjectWorkflowTests(test.BaseAdminViewTests): project = self.tenants.first() quota = self.quotas.first() default_role = self.roles.first() - domain_id = self._get_domain_id() + domain_id = project.domain_id users = self._get_all_users(domain_id) groups = self._get_all_groups(domain_id) roles = self.roles.list() @@ -976,6 +1003,8 @@ class UpdateProjectWorkflowTests(test.BaseAdminViewTests): api.keystone.tenant_get(IsA(http.HttpRequest), self.tenant.id, admin=True) \ .AndReturn(project) + api.keystone.domain_get(IsA(http.HttpRequest), domain_id) \ + .AndReturn(self.domain) quotas.get_tenant_quota_data(IsA(http.HttpRequest), tenant_id=self.tenant.id) \ .AndReturn(quota) @@ -1010,6 +1039,7 @@ class UpdateProjectWorkflowTests(test.BaseAdminViewTests): .append(group.id) # update some fields + project._info["domain_id"] = domain_id project._info["name"] = "updated name" project._info["description"] = "updated description" quota.metadata_items = 444 @@ -1029,7 +1059,8 @@ class UpdateProjectWorkflowTests(test.BaseAdminViewTests): self.mox.ReplayAll() # submit form data - project_data = {"name": project._info["name"], + project_data = {"domain_id": project._info["domain_id"], + "name": project._info["name"], "id": project.id, "description": project._info["description"], "enabled": project.enabled} @@ -1042,13 +1073,8 @@ class UpdateProjectWorkflowTests(test.BaseAdminViewTests): self.assertNoFormErrors(res) self.assertRedirectsNoFollow(res, INDEX_URL) - def test_update_project_tenant_update_error_domain(self): - domain = self.domains.get(id="1") - self.setSessionValues(domain_context=domain.id, - domain_context_name=domain.name) - self.test_update_project_tenant_update_error() - @test.create_stubs({api.keystone: ('tenant_get', + 'domain_get', 'tenant_update', 'get_default_role', 'roles_for_user', @@ -1066,7 +1092,7 @@ class UpdateProjectWorkflowTests(test.BaseAdminViewTests): project = self.tenants.first() quota = self.quotas.first() default_role = self.roles.first() - domain_id = self._get_domain_id() + domain_id = project.domain_id users = self._get_all_users(domain_id) proj_users = self._get_proj_users(project.id) groups = self._get_all_groups(domain_id) @@ -1077,6 +1103,8 @@ class UpdateProjectWorkflowTests(test.BaseAdminViewTests): api.keystone.tenant_get(IsA(http.HttpRequest), self.tenant.id, admin=True) \ .AndReturn(project) + api.keystone.domain_get(IsA(http.HttpRequest), domain_id) \ + .AndReturn(self.domain) quotas.get_tenant_quota_data(IsA(http.HttpRequest), tenant_id=self.tenant.id) \ .AndReturn(quota) @@ -1110,6 +1138,7 @@ class UpdateProjectWorkflowTests(test.BaseAdminViewTests): workflow_data[GROUP_ROLE_PREFIX + "2"] = ['1', '2', '3'] # member role # update some fields + project._info["domain_id"] = domain_id project._info["name"] = "updated name" project._info["description"] = "updated description" quota[0].limit = 444 @@ -1188,10 +1217,11 @@ class UpdateProjectWorkflowTests(test.BaseAdminViewTests): self.mox.ReplayAll() # submit form data - project_data = {"name": project._info["name"], - "id": project.id, - "description": project._info["description"], - "enabled": project.enabled} + project_data = {"domain_id": project._info["domain_id"], + "name": project._info["name"], + "id": project.id, + "description": project._info["description"], + "enabled": project.enabled} workflow_data.update(project_data) workflow_data.update(updated_quota) url = reverse('horizon:admin:projects:update', @@ -1202,13 +1232,8 @@ class UpdateProjectWorkflowTests(test.BaseAdminViewTests): self.assertMessageCount(error=1, warning=0) self.assertRedirectsNoFollow(res, INDEX_URL) - def test_update_project_quota_update_error_domain(self): - domain = self.domains.get(id="1") - self.setSessionValues(domain_context=domain.id, - domain_context_name=domain.name) - self.test_update_project_quota_update_error() - @test.create_stubs({api.keystone: ('tenant_get', + 'domain_get', 'tenant_update', 'get_default_role', 'roles_for_user', @@ -1225,7 +1250,7 @@ class UpdateProjectWorkflowTests(test.BaseAdminViewTests): project = self.tenants.first() quota = self.quotas.first() default_role = self.roles.first() - domain_id = self._get_domain_id() + domain_id = project.domain_id users = self._get_all_users(domain_id) proj_users = self._get_proj_users(project.id) groups = self._get_all_groups(domain_id) @@ -1235,6 +1260,8 @@ class UpdateProjectWorkflowTests(test.BaseAdminViewTests): api.keystone.tenant_get(IsA(http.HttpRequest), self.tenant.id, admin=True) \ .AndReturn(project) + api.keystone.domain_get(IsA(http.HttpRequest), domain_id) \ + .AndReturn(self.domain) quotas.get_tenant_quota_data(IsA(http.HttpRequest), tenant_id=self.tenant.id) \ .AndReturn(quota) @@ -1265,6 +1292,7 @@ class UpdateProjectWorkflowTests(test.BaseAdminViewTests): workflow_data[GROUP_ROLE_PREFIX + "1"] = ['1', '3'] # admin role workflow_data[GROUP_ROLE_PREFIX + "2"] = ['1', '2', '3'] # member role # update some fields + project._info["domain_id"] = domain_id project._info["name"] = "updated name" project._info["description"] = "updated description" quota.metadata_items = 444 @@ -1305,7 +1333,8 @@ class UpdateProjectWorkflowTests(test.BaseAdminViewTests): self.mox.ReplayAll() # submit form data - project_data = {"name": project._info["name"], + project_data = {"domain_id": project._info["domain_id"], + "name": project._info["name"], "id": project.id, "description": project._info["description"], "enabled": project.enabled} @@ -1319,16 +1348,13 @@ class UpdateProjectWorkflowTests(test.BaseAdminViewTests): self.assertMessageCount(error=1, warning=0) self.assertRedirectsNoFollow(res, INDEX_URL) - def test_update_project_member_update_error_domain(self): - domain = self.domains.get(id="1") - self.setSessionValues(domain_context=domain.id, - domain_context_name=domain.name) - self.test_update_project_member_update_error() - - @test.create_stubs({api.keystone: ('get_default_role', 'tenant_get'), + @test.create_stubs({api.keystone: ('get_default_role', + 'tenant_get', + 'domain_get'), quotas: ('get_tenant_quota_data',)}) def test_update_project_when_default_role_does_not_exist(self): project = self.tenants.first() + domain_id = project.domain_id quota = self.quotas.first() api.keystone.get_default_role(IsA(http.HttpRequest)) \ @@ -1336,6 +1362,8 @@ class UpdateProjectWorkflowTests(test.BaseAdminViewTests): api.keystone.tenant_get(IsA(http.HttpRequest), self.tenant.id, admin=True) \ .AndReturn(project) + api.keystone.domain_get(IsA(http.HttpRequest), domain_id) \ + .AndReturn(self.domain) quotas.get_tenant_quota_data(IsA(http.HttpRequest), tenant_id=self.tenant.id) \ .AndReturn(quota) diff --git a/openstack_dashboard/dashboards/admin/projects/views.py b/openstack_dashboard/dashboards/admin/projects/views.py index 2d2327d484..8aee66fd15 100644 --- a/openstack_dashboard/dashboards/admin/projects/views.py +++ b/openstack_dashboard/dashboards/admin/projects/views.py @@ -28,6 +28,7 @@ from horizon import tables from horizon import workflows from openstack_dashboard import api +from openstack_dashboard.api import keystone from openstack_dashboard import usage from openstack_dashboard.usage import quotas @@ -38,7 +39,9 @@ from openstack_dashboard.dashboards.admin.projects \ LOG = logging.getLogger(__name__) -PROJECT_INFO_FIELDS = ("name", +PROJECT_INFO_FIELDS = ("domain_id", + "domain_name", + "name", "description", "enabled") @@ -106,6 +109,11 @@ class CreateProjectView(workflows.WorkflowView): def get_initial(self): initial = super(CreateProjectView, self).get_initial() + # Set the domain of the project + domain = api.keystone.get_default_domain(self.request) + initial["domain_id"] = domain.id + initial["domain_name"] = domain.name + # get initial quota defaults try: quota_defaults = quotas.get_default_quota_data(self.request) @@ -151,6 +159,17 @@ class UpdateProjectView(workflows.WorkflowView): for field in PROJECT_INFO_FIELDS: initial[field] = getattr(project_info, field, None) + # Retrieve the domain name where the project belong + if keystone.VERSIONS.active >= 3: + try: + domain = api.keystone.domain_get(self.request, + initial["domain_id"]) + initial["domain_name"] = domain.name + except Exception: + exceptions.handle(self.request, + _('Unable to retrieve project domain.'), + redirect=reverse(INDEX_URL)) + # get initial project quota quota_data = quotas.get_tenant_quota_data(self.request, tenant_id=project_id) diff --git a/openstack_dashboard/dashboards/admin/projects/workflows.py b/openstack_dashboard/dashboards/admin/projects/workflows.py index 7c479e1f03..7a5ae69406 100644 --- a/openstack_dashboard/dashboards/admin/projects/workflows.py +++ b/openstack_dashboard/dashboards/admin/projects/workflows.py @@ -94,6 +94,13 @@ class UpdateProjectQuota(workflows.Step): class CreateProjectInfoAction(workflows.Action): + # Hide the domain_id and domain_name by default + domain_id = forms.CharField(label=_("Domain ID"), + required=False, + widget=forms.HiddenInput()) + domain_name = forms.CharField(label=_("Domain Name"), + required=False, + widget=forms.HiddenInput()) name = forms.CharField(label=_("Name")) description = forms.CharField(widget=forms.widgets.Textarea(), label=_("Description"), @@ -102,6 +109,16 @@ class CreateProjectInfoAction(workflows.Action): required=False, initial=True) + def __init__(self, request, *args, **kwargs): + super(CreateProjectInfoAction, self).__init__(request, + *args, + **kwargs) + # For keystone V3, display the two fields in read-only + if keystone.VERSIONS.active >= 3: + readonlyInput = forms.TextInput(attrs={'readonly': 'readonly'}) + self.fields["domain_id"].widget = readonlyInput + self.fields["domain_name"].widget = readonlyInput + class Meta: name = _("Project Info") help_text = _("From here you can create a new " @@ -110,7 +127,9 @@ class CreateProjectInfoAction(workflows.Action): class CreateProjectInfo(workflows.Step): action_class = CreateProjectInfoAction - contributes = ("project_id", + contributes = ("domain_id", + "domain_name", + "project_id", "name", "description", "enabled") @@ -122,9 +141,11 @@ class UpdateProjectMembersAction(workflows.MembershipAction): *args, **kwargs) err_msg = _('Unable to retrieve user list. Please try again later.') + # Use the domain_id from the project + domain_id = self.initial.get("domain_id", None) project_id = '' - if 'project_id' in args[0]: - project_id = args[0]['project_id'] + if 'project_id' in self.initial: + project_id = self.initial['project_id'] # Get the default role try: @@ -146,10 +167,9 @@ class UpdateProjectMembersAction(workflows.MembershipAction): # Get list of available users all_users = [] - domain_context = request.session.get('domain_context', None) try: all_users = api.keystone.user_list(request, - domain=domain_context) + domain=domain_id) except Exception: exceptions.handle(request, err_msg) users_list = [(user.id, user.name) for user in all_users] @@ -218,9 +238,11 @@ class UpdateProjectGroupsAction(workflows.MembershipAction): *args, **kwargs) err_msg = _('Unable to retrieve group list. Please try again later.') + # Use the domain_id from the project + domain_id = self.initial.get("domain_id", None) project_id = '' - if 'project_id' in args[0]: - project_id = args[0]['project_id'] + if 'project_id' in self.initial: + project_id = self.initial['project_id'] # Get the default role try: @@ -242,10 +264,9 @@ class UpdateProjectGroupsAction(workflows.MembershipAction): # Get list of available groups all_groups = [] - domain_context = request.session.get('domain_context', None) try: all_groups = api.keystone.group_list(request, - domain=domain_context) + domain=domain_id) except Exception: exceptions.handle(request, err_msg) groups_list = [(group.id, group.name) for group in all_groups] @@ -337,14 +358,14 @@ class CreateProject(workflows.Workflow): def handle(self, request, data): # create the project - domain_context = self.request.session.get('domain_context', None) + domain_id = data['domain_id'] try: desc = data['description'] self.object = api.keystone.tenant_create(request, name=data['name'], description=desc, enabled=data['enabled'], - domain=domain_context) + domain=domain_id) except Exception: exceptions.handle(request, ignore=True) return False @@ -450,7 +471,9 @@ class UpdateProjectInfoAction(CreateProjectInfoAction): class UpdateProjectInfo(workflows.Step): action_class = UpdateProjectInfoAction depends_on = ("project_id",) - contributes = ("name", + contributes = ("domain_id", + "domain_name", + "name", "description", "enabled") @@ -488,15 +511,18 @@ class UpdateProject(workflows.Workflow): # sets and do this all in a single "roles to add" and "roles to remove" # pass instead of the multi-pass thing happening now. - domain_context = request.session.get('domain_context', None) project_id = data['project_id'] + domain_id = '' # update project info try: - api.keystone.tenant_update(request, - project_id, - name=data['name'], - description=data['description'], - enabled=data['enabled']) + project = api.keystone.tenant_update( + request, + project_id, + name=data['name'], + description=data['description'], + enabled=data['enabled']) + # Use the domain_id from the project if available + domain_id = getattr(project, "domain_id", None) except Exception: exceptions.handle(request, ignore=True) return False @@ -605,7 +631,7 @@ class UpdateProject(workflows.Workflow): # Get the groups currently associated with this project so we # can diff against it. project_groups = api.keystone.group_list(request, - domain=domain_context, + domain=domain_id, project=project_id) groups_to_modify = len(project_groups) for group in project_groups: diff --git a/openstack_dashboard/test/test_data/keystone_data.py b/openstack_dashboard/test/test_data/keystone_data.py index cc09507e1e..ec62fd17df 100644 --- a/openstack_dashboard/test/test_data/keystone_data.py +++ b/openstack_dashboard/test/test_data/keystone_data.py @@ -220,17 +220,20 @@ def data(TEST): 'name': 'test_tenant', 'description': "a test tenant.", 'enabled': True, - 'domain_id': '1'} + 'domain_id': '1', + 'domain_name': 'test_domain'} tenant_dict_2 = {'id': "2", 'name': 'disabled_tenant', 'description': "a disabled test tenant.", 'enabled': False, - 'domain_id': '2'} + 'domain_id': '2', + 'domain_name': 'disabled_domain'} tenant_dict_3 = {'id': "3", 'name': u'\u4e91\u89c4\u5219', 'description': "an unicode-named tenant.", 'enabled': True, - 'domain_id': '2'} + 'domain_id': '2', + 'domain_name': 'disabled_domain'} tenant = tenants.Tenant(tenants.TenantManager, tenant_dict) disabled_tenant = tenants.Tenant(tenants.TenantManager, tenant_dict_2) tenant_unicode = tenants.Tenant(tenants.TenantManager, tenant_dict_3)