diff --git a/openstack_dashboard/dashboards/admin/aggregates/tests.py b/openstack_dashboard/dashboards/admin/aggregates/tests.py index 8941679a70..76974cf0de 100644 --- a/openstack_dashboard/dashboards/admin/aggregates/tests.py +++ b/openstack_dashboard/dashboards/admin/aggregates/tests.py @@ -179,11 +179,26 @@ class AggregatesViewTests(test.BaseAdminViewTests): @mock.patch('openstack_dashboard.api.nova.extension_supported', mock.Mock(return_value=False)) @test.create_stubs({api.nova: ('aggregate_details_list', - 'availability_zone_list',), - api.cinder: ('tenant_absolute_limits',)}) + 'availability_zone_list', + 'tenant_absolute_limits',), + api.cinder: ('tenant_absolute_limits',), + api.neutron: ('list_extensions',), + api.network: ('tenant_floating_ip_list', + 'security_group_list'), + api.keystone: ('tenant_list',)}) def test_panel_not_available(self): + api.nova.tenant_absolute_limits(IsA(http.HttpRequest)). \ + MultipleTimes().AndReturn(self.limits['absolute']) api.cinder.tenant_absolute_limits(IsA(http.HttpRequest)). \ MultipleTimes().AndReturn(self.cinder_limits['absolute']) + api.neutron.list_extensions(IsA(http.HttpRequest)). \ + AndReturn(self.api_extensions.list()) + api.network.tenant_floating_ip_list(IsA(http.HttpRequest)) \ + .AndReturn(self.floating_ips.list()) + api.network.security_group_list(IsA(http.HttpRequest)) \ + .AndReturn(self.security_groups.list()) + api.keystone.tenant_list(IsA(http.HttpRequest)) \ + .AndReturn(self.tenants.list()) self.mox.ReplayAll() self.patchers['aggregates'].stop() diff --git a/openstack_dashboard/dashboards/admin/instances/tests.py b/openstack_dashboard/dashboards/admin/instances/tests.py index aa505cd527..e2b33d5a28 100644 --- a/openstack_dashboard/dashboards/admin/instances/tests.py +++ b/openstack_dashboard/dashboards/admin/instances/tests.py @@ -133,12 +133,16 @@ class InstanceViewTest(test.BaseAdminViewTests): self.assertMessageCount(res, error=1) self.assertItemsEqual(instances, servers) - @test.create_stubs({api.nova: ('server_list',)}) + @test.create_stubs({api.nova: ('server_list',), + api.keystone: ('tenant_list',)}) def test_index_server_list_exception(self): + tenants = self.tenants.list() search_opts = {'marker': None, 'paginate': True} api.nova.server_list(IsA(http.HttpRequest), all_tenants=True, search_opts=search_opts) \ .AndRaise(self.exceptions.nova) + api.keystone.tenant_list(IsA(http.HttpRequest)).\ + AndReturn([tenants, False]) self.mox.ReplayAll() diff --git a/openstack_dashboard/dashboards/admin/networks/ports/tests.py b/openstack_dashboard/dashboards/admin/networks/ports/tests.py index 78ba638742..a36ee3f809 100644 --- a/openstack_dashboard/dashboards/admin/networks/ports/tests.py +++ b/openstack_dashboard/dashboards/admin/networks/ports/tests.py @@ -29,23 +29,28 @@ NETWORKS_DETAIL_URL = 'horizon:admin:networks:detail' class NetworkPortTests(test.BaseAdminViewTests): - @test.create_stubs({api.neutron: ('port_get', + @test.create_stubs({api.neutron: ('network_get', + 'port_get', 'is_extension_supported',)}) def test_port_detail(self): self._test_port_detail() - @test.create_stubs({api.neutron: ('port_get', + @test.create_stubs({api.neutron: ('network_get', + 'port_get', 'is_extension_supported',)}) def test_port_detail_with_mac_learning(self): self._test_port_detail(mac_learning=True) def _test_port_detail(self, mac_learning=False): port = self.ports.first() + network_id = self.networks.first().id api.neutron.port_get(IsA(http.HttpRequest), port.id)\ .AndReturn(self.ports.first()) api.neutron.is_extension_supported(IsA(http.HttpRequest), 'mac-learning')\ .MultipleTimes().AndReturn(mac_learning) + api.neutron.network_get(IsA(http.HttpRequest), network_id)\ + .AndReturn(self.networks.first()) self.mox.ReplayAll() res = self.client.get(reverse(DETAIL_URL, args=[port.id])) diff --git a/openstack_dashboard/dashboards/admin/networks/subnets/tests.py b/openstack_dashboard/dashboards/admin/networks/subnets/tests.py index 7fc01c9ac5..1a2295d7d4 100644 --- a/openstack_dashboard/dashboards/admin/networks/subnets/tests.py +++ b/openstack_dashboard/dashboards/admin/networks/subnets/tests.py @@ -63,12 +63,20 @@ class NetworkSubnetTests(test.BaseAdminViewTests): redir_url = NETWORKS_INDEX_URL self.assertRedirectsNoFollow(res, redir_url) - @test.create_stubs({api.neutron: ('network_get',)}) + @test.create_stubs({api.neutron: ('network_get', + 'is_extension_supported', + 'subnetpool_list',)}) def test_subnet_create_get(self): network = self.networks.first() api.neutron.network_get(IsA(http.HttpRequest), network.id)\ .AndReturn(self.networks.first()) + api.neutron.is_extension_supported(IsA(http.HttpRequest), + 'subnet_allocation')\ + .AndReturn(True) + api.neutron.subnetpool_list(IsA(http.HttpRequest))\ + .AndReturn(self.subnets) + self.mox.ReplayAll() url = reverse('horizon:admin:networks:addsubnet', @@ -78,16 +86,20 @@ class NetworkSubnetTests(test.BaseAdminViewTests): self.assertTemplateUsed(res, views.WorkflowView.template_name) @test.create_stubs({api.neutron: ('network_get', + 'is_extension_supported', + 'subnetpool_list', 'subnet_create',)}) def test_subnet_create_post(self): network = self.networks.first() subnet = self.subnets.first() api.neutron.network_get(IsA(http.HttpRequest), network.id)\ - .AndReturn(self.networks.first()) - api.neutron.network_get(IsA(http.HttpRequest), - network.id)\ - .AndReturn(self.networks.first()) + .MultipleTimes().AndReturn(self.networks.first()) + api.neutron.is_extension_supported(IsA(http.HttpRequest), + 'subnet_allocation')\ + .MultipleTimes().AndReturn(True) + api.neutron.subnetpool_list(IsA(http.HttpRequest))\ + .AndReturn(self.subnets) api.neutron.subnet_create(IsA(http.HttpRequest), network_id=network.id, name=subnet.name, @@ -131,16 +143,21 @@ class NetworkSubnetTests(test.BaseAdminViewTests): self.assertRedirectsNoFollow(res, redir_url) @test.create_stubs({api.neutron: ('network_get', + 'is_extension_supported', + 'subnetpool_list', 'subnet_create',)}) def test_subnet_create_post_subnet_exception(self): network = self.networks.first() subnet = self.subnets.first() api.neutron.network_get(IsA(http.HttpRequest), network.id)\ - .AndReturn(self.networks.first()) - api.neutron.network_get(IsA(http.HttpRequest), - network.id)\ - .AndReturn(self.networks.first()) + .MultipleTimes().AndReturn(self.networks.first()) + api.neutron.is_extension_supported(IsA(http.HttpRequest), + 'subnet_allocation')\ + .AndReturn(True) + api.neutron.subnetpool_list(IsA(http.HttpRequest))\ + .AndReturn(self.subnets) + api.neutron.subnet_create(IsA(http.HttpRequest), network_id=network.id, name=subnet.name, @@ -160,13 +177,21 @@ class NetworkSubnetTests(test.BaseAdminViewTests): redir_url = reverse(NETWORKS_DETAIL_URL, args=[subnet.network_id]) self.assertRedirectsNoFollow(res, redir_url) - @test.create_stubs({api.neutron: ('network_get',)}) + @test.create_stubs({api.neutron: ('network_get', + 'is_extension_supported', + 'subnetpool_list',)}) def test_subnet_create_post_cidr_inconsistent(self): network = self.networks.first() subnet = self.subnets.first() api.neutron.network_get(IsA(http.HttpRequest), network.id)\ .AndReturn(self.networks.first()) + api.neutron.is_extension_supported(IsA(http.HttpRequest), + 'subnet_allocation')\ + .AndReturn(True) + api.neutron.subnetpool_list(IsA(http.HttpRequest))\ + .AndReturn(self.subnets) + self.mox.ReplayAll() # dummy IPv6 address @@ -180,13 +205,21 @@ class NetworkSubnetTests(test.BaseAdminViewTests): expected_msg = 'Network Address and IP version are inconsistent.' self.assertContains(res, expected_msg) - @test.create_stubs({api.neutron: ('network_get',)}) + @test.create_stubs({api.neutron: ('network_get', + 'is_extension_supported', + 'subnetpool_list',)}) def test_subnet_create_post_gw_inconsistent(self): network = self.networks.first() subnet = self.subnets.first() api.neutron.network_get(IsA(http.HttpRequest), network.id)\ .AndReturn(self.networks.first()) + api.neutron.is_extension_supported(IsA(http.HttpRequest), + 'subnet_allocation')\ + .AndReturn(True) + api.neutron.subnetpool_list(IsA(http.HttpRequest))\ + .AndReturn(self.subnets) + self.mox.ReplayAll() # dummy IPv6 address @@ -200,9 +233,16 @@ class NetworkSubnetTests(test.BaseAdminViewTests): self.assertContains(res, 'Gateway IP and IP version are inconsistent.') @test.create_stubs({api.neutron: ('subnet_update', - 'subnet_get',)}) + 'subnet_get', + 'is_extension_supported', + 'subnetpool_list')}) def test_subnet_update_post(self): subnet = self.subnets.first() + api.neutron.is_extension_supported(IsA(http.HttpRequest), + 'subnet_allocation')\ + .AndReturn(True) + api.neutron.subnetpool_list(IsA(http.HttpRequest))\ + .AndReturn(self.subnetpools.list()) api.neutron.subnet_get(IsA(http.HttpRequest), subnet.id)\ .AndReturn(subnet) api.neutron.subnet_get(IsA(http.HttpRequest), subnet.id)\ @@ -224,9 +264,16 @@ class NetworkSubnetTests(test.BaseAdminViewTests): self.assertRedirectsNoFollow(res, redir_url) @test.create_stubs({api.neutron: ('subnet_update', - 'subnet_get',)}) + 'subnet_get', + 'is_extension_supported', + 'subnetpool_list')}) def test_subnet_update_post_gw_inconsistent(self): subnet = self.subnets.first() + api.neutron.is_extension_supported(IsA(http.HttpRequest), + 'subnet_allocation')\ + .AndReturn(True) + api.neutron.subnetpool_list(IsA(http.HttpRequest))\ + .AndReturn(self.subnetpools.list()) api.neutron.subnet_get(IsA(http.HttpRequest), subnet.id)\ .AndReturn(subnet) self.mox.ReplayAll() diff --git a/openstack_dashboard/dashboards/identity/domains/tests.py b/openstack_dashboard/dashboards/identity/domains/tests.py index 5886c11b0a..7974715a2f 100644 --- a/openstack_dashboard/dashboards/identity/domains/tests.py +++ b/openstack_dashboard/dashboards/identity/domains/tests.py @@ -36,8 +36,11 @@ GROUP_ROLE_PREFIX = constants.DOMAIN_GROUP_MEMBER_SLUG + "_role_" class DomainsViewTests(test.BaseAdminViewTests): - @test.create_stubs({api.keystone: ('domain_list',)}) + @test.create_stubs({api.keystone: ('domain_get', + 'domain_list',)}) def test_index(self): + domain = self.domains.get(id="1") + api.keystone.domain_get(IsA(http.HttpRequest), '1').AndReturn(domain) api.keystone.domain_list(IgnoreArg()).AndReturn(self.domains.list()) self.mox.ReplayAll() @@ -52,9 +55,12 @@ class DomainsViewTests(test.BaseAdminViewTests): self.assertContains(res, 'Disable Domain') self.assertContains(res, 'Enable Domain') - @test.create_stubs({api.keystone: ('domain_list', + @test.create_stubs({api.keystone: ('domain_get', + 'domain_list', 'keystone_can_edit_domain')}) def test_index_with_keystone_can_edit_domain_false(self): + domain = self.domains.get(id="1") + api.keystone.domain_get(IsA(http.HttpRequest), '1').AndReturn(domain) api.keystone.domain_list(IgnoreArg()).AndReturn(self.domains.list()) api.keystone.keystone_can_edit_domain() \ .MultipleTimes().AndReturn(False) @@ -71,11 +77,13 @@ class DomainsViewTests(test.BaseAdminViewTests): self.assertNotContains(res, 'Disable Domain') self.assertNotContains(res, 'Enable Domain') - @test.create_stubs({api.keystone: ('domain_list', + @test.create_stubs({api.keystone: ('domain_get', + 'domain_list', 'domain_delete')}) def test_delete_domain(self): domain = self.domains.get(id="2") + api.keystone.domain_get(IsA(http.HttpRequest), '2').AndReturn(domain) api.keystone.domain_list(IgnoreArg()).AndReturn(self.domains.list()) api.keystone.domain_delete(IgnoreArg(), domain.id) @@ -86,10 +94,12 @@ class DomainsViewTests(test.BaseAdminViewTests): self.assertRedirectsNoFollow(res, DOMAINS_INDEX_URL) - @test.create_stubs({api.keystone: ('domain_list', )}) + @test.create_stubs({api.keystone: ('domain_get', + 'domain_list', )}) def test_delete_with_enabled_domain(self): domain = self.domains.get(id="1") + api.keystone.domain_get(IsA(http.HttpRequest), '1').AndReturn(domain) api.keystone.domain_list(IgnoreArg()).AndReturn(self.domains.list()) self.mox.ReplayAll() @@ -100,11 +110,13 @@ class DomainsViewTests(test.BaseAdminViewTests): self.assertRedirectsNoFollow(res, DOMAINS_INDEX_URL) self.assertMessageCount(error=2) - @test.create_stubs({api.keystone: ('domain_list', + @test.create_stubs({api.keystone: ('domain_get', + 'domain_list', 'domain_update')}) def test_disable(self): domain = self.domains.get(id="1") + api.keystone.domain_get(IsA(http.HttpRequest), '1').AndReturn(domain) api.keystone.domain_list(IgnoreArg()).AndReturn(self.domains.list()) api.keystone.domain_update(IsA(http.HttpRequest), description=domain.description, @@ -120,11 +132,13 @@ class DomainsViewTests(test.BaseAdminViewTests): self.assertRedirectsNoFollow(res, DOMAINS_INDEX_URL) self.assertMessageCount(error=0) - @test.create_stubs({api.keystone: ('domain_list', + @test.create_stubs({api.keystone: ('domain_get', + 'domain_list', 'domain_update')}) def test_enable(self): domain = self.domains.get(id="2") + api.keystone.domain_get(IsA(http.HttpRequest), '1').AndReturn(domain) api.keystone.domain_list(IgnoreArg()).AndReturn(self.domains.list()) api.keystone.domain_update(IsA(http.HttpRequest), description=domain.description, diff --git a/openstack_dashboard/dashboards/identity/groups/tests.py b/openstack_dashboard/dashboards/identity/groups/tests.py index 6711b02117..5ba13f7907 100644 --- a/openstack_dashboard/dashboards/identity/groups/tests.py +++ b/openstack_dashboard/dashboards/identity/groups/tests.py @@ -43,11 +43,14 @@ class GroupsViewTests(test.BaseAdminViewTests): if group.domain_id == domain_id] return groups - @test.create_stubs({api.keystone: ('group_list',)}) + @test.create_stubs({api.keystone: ('domain_get', + 'group_list',)}) def test_index(self): domain_id = self._get_domain_id() groups = self._get_groups(domain_id) + domain = self.domains.get(id="1") + api.keystone.domain_get(IsA(http.HttpRequest), '1').AndReturn(domain) api.keystone.group_list(IgnoreArg(), domain=domain_id) \ .AndReturn(groups) @@ -93,12 +96,14 @@ class GroupsViewTests(test.BaseAdminViewTests): self.assertContains(res, 'Edit') self.assertContains(res, 'Delete Group') - @test.create_stubs({api.keystone: ('group_list', + @test.create_stubs({api.keystone: ('domain_get', + 'group_list', 'keystone_can_edit_group')}) def test_index_with_keystone_can_edit_group_false(self): domain_id = self._get_domain_id() groups = self._get_groups(domain_id) - + domain = self.domains.get(id="1") + api.keystone.domain_get(IsA(http.HttpRequest), '1').AndReturn(domain) api.keystone.group_list(IgnoreArg(), domain=domain_id) \ .AndReturn(groups) api.keystone.keystone_can_edit_group() \ @@ -115,11 +120,15 @@ class GroupsViewTests(test.BaseAdminViewTests): self.assertNotContains(res, 'Edit') self.assertNotContains(res, 'Delete Group') - @test.create_stubs({api.keystone: ('group_create', )}) + @test.create_stubs({api.keystone: ('group_create', + 'domain_get')}) def test_create(self): domain_id = self._get_domain_id() + domain = self.domains.get(id="1") group = self.groups.get(id="1") + api.keystone.domain_get(IsA(http.HttpRequest), '1') \ + .AndReturn(domain) api.keystone.group_create(IsA(http.HttpRequest), description=group.description, domain_id=domain_id, @@ -135,11 +144,28 @@ class GroupsViewTests(test.BaseAdminViewTests): self.assertNoFormErrors(res) self.assertMessageCount(success=1) + @test.create_stubs({api.keystone: ('group_create',)}) def test_create_with_domain(self): domain = self.domains.get(id="1") + group = self.groups.get(id="1") + self.setSessionValues(domain_context=domain.id, domain_context_name=domain.name) - self.test_create() + + api.keystone.group_create(IsA(http.HttpRequest), + description=group.description, + domain_id=domain.id, + name=group.name).AndReturn(group) + + self.mox.ReplayAll() + + formData = {'method': 'CreateGroupForm', + 'name': group.name, + 'description': group.description} + res = self.client.post(GROUP_CREATE_URL, formData) + + self.assertNoFormErrors(res) + self.assertMessageCount(success=1) @test.create_stubs({api.keystone: ('group_get', 'group_update')}) @@ -164,12 +190,15 @@ class GroupsViewTests(test.BaseAdminViewTests): self.assertNoFormErrors(res) - @test.create_stubs({api.keystone: ('group_list', + @test.create_stubs({api.keystone: ('domain_get', + 'group_list', 'group_delete')}) def test_delete_group(self): domain_id = self._get_domain_id() group = self.groups.get(id="2") + domain = self.domains.get(id="1") + api.keystone.domain_get(IsA(http.HttpRequest), '1').AndReturn(domain) api.keystone.group_list(IgnoreArg(), domain=domain_id) \ .AndReturn(self.groups.list()) api.keystone.group_delete(IgnoreArg(), group.id) diff --git a/openstack_dashboard/dashboards/identity/projects/tests.py b/openstack_dashboard/dashboards/identity/projects/tests.py index 00b777a4af..7562821ccc 100644 --- a/openstack_dashboard/dashboards/identity/projects/tests.py +++ b/openstack_dashboard/dashboards/identity/projects/tests.py @@ -51,9 +51,12 @@ PROJECT_DETAIL_URL = reverse('horizon:identity:projects:detail', args=[1]) class TenantsViewTests(test.BaseAdminViewTests): - @test.create_stubs({api.keystone: ('tenant_list', 'domain_lookup')}) + @test.create_stubs({api.keystone: ('domain_get', + 'tenant_list', + 'domain_lookup')}) def test_index(self): domain = self.domains.get(id="1") + api.keystone.domain_get(IsA(http.HttpRequest), '1').AndReturn(domain) api.keystone.tenant_list(IsA(http.HttpRequest), domain=None, paginate=True, @@ -1374,7 +1377,8 @@ class UpdateProjectWorkflowTests(test.BaseAdminViewTests): 'get_effective_domain_id'), quotas: ('get_tenant_quota_data', 'get_disabled_quotas', - 'tenant_quota_usages')}) + 'tenant_quota_usages'), + api.nova: ('tenant_quota_update',)}) def test_update_project_member_update_error(self): keystone_api_version = api.keystone.VERSIONS.active @@ -1394,7 +1398,7 @@ class UpdateProjectWorkflowTests(test.BaseAdminViewTests): admin=True) \ .AndReturn(project) api.keystone.domain_get(IsA(http.HttpRequest), domain_id) \ - .AndReturn(self.domain) + .MultipleTimes().AndReturn(self.domain) quotas.get_disabled_quotas(IsA(http.HttpRequest)) \ .AndReturn(self.disabled_quotas.first()) quotas.get_tenant_quota_data(IsA(http.HttpRequest), @@ -1457,6 +1461,8 @@ class UpdateProjectWorkflowTests(test.BaseAdminViewTests): self._check_role_list(keystone_api_version, role_assignments, groups, proj_users, roles, workflow_data) + api.nova.tenant_quota_update(IsA(http.HttpRequest), project.id, + **updated_quota) self.mox.ReplayAll() diff --git a/openstack_dashboard/dashboards/identity/users/tests.py b/openstack_dashboard/dashboards/identity/users/tests.py index 3753c10bcc..b12cfde46c 100644 --- a/openstack_dashboard/dashboards/identity/users/tests.py +++ b/openstack_dashboard/dashboards/identity/users/tests.py @@ -637,7 +637,8 @@ class UsersViewTests(test.BaseAdminViewTests): res, "form", 'password', ['Password must be between 8 and 18 characters.']) - @test.create_stubs({api.keystone: ('user_update_enabled', + @test.create_stubs({api.keystone: ('domain_get', + 'user_update_enabled', 'user_list', 'domain_lookup')}) def test_enable_user(self): @@ -647,6 +648,7 @@ class UsersViewTests(test.BaseAdminViewTests): users = self._get_users(domain_id) user.enabled = False + api.keystone.domain_get(IsA(http.HttpRequest), '1').AndReturn(domain) api.keystone.user_list(IgnoreArg(), domain=domain_id).AndReturn(users) api.keystone.user_update_enabled(IgnoreArg(), user.id, @@ -661,7 +663,8 @@ class UsersViewTests(test.BaseAdminViewTests): self.assertRedirectsNoFollow(res, USERS_INDEX_URL) - @test.create_stubs({api.keystone: ('user_update_enabled', + @test.create_stubs({api.keystone: ('domain_get', + 'user_update_enabled', 'user_list', 'domain_lookup')}) def test_disable_user(self): @@ -672,6 +675,7 @@ class UsersViewTests(test.BaseAdminViewTests): self.assertTrue(user.enabled) + api.keystone.domain_get(IsA(http.HttpRequest), '1').AndReturn(domain) api.keystone.user_list(IgnoreArg(), domain=domain_id) \ .AndReturn(users) api.keystone.user_update_enabled(IgnoreArg(), @@ -687,7 +691,8 @@ class UsersViewTests(test.BaseAdminViewTests): self.assertRedirectsNoFollow(res, USERS_INDEX_URL) - @test.create_stubs({api.keystone: ('user_update_enabled', + @test.create_stubs({api.keystone: ('domain_get', + 'user_update_enabled', 'user_list', 'domain_lookup')}) def test_enable_disable_user_exception(self): @@ -697,6 +702,7 @@ class UsersViewTests(test.BaseAdminViewTests): users = self._get_users(domain_id) user.enabled = False + api.keystone.domain_get(IsA(http.HttpRequest), '1').AndReturn(domain) api.keystone.user_list(IgnoreArg(), domain=domain_id) \ .AndReturn(users) api.keystone.user_update_enabled(IgnoreArg(), user.id, True) \ @@ -710,11 +716,14 @@ class UsersViewTests(test.BaseAdminViewTests): self.assertRedirectsNoFollow(res, USERS_INDEX_URL) - @test.create_stubs({api.keystone: ('user_list', 'domain_lookup')}) + @test.create_stubs({api.keystone: ('domain_get', + 'user_list', + 'domain_lookup')}) def test_disabling_current_user(self): domain = self._get_default_domain() domain_id = domain.id users = self._get_users(domain_id) + api.keystone.domain_get(IsA(http.HttpRequest), '1').AndReturn(domain) for i in range(0, 2): api.keystone.user_list(IgnoreArg(), domain=domain_id) \ .AndReturn(users) @@ -730,7 +739,9 @@ class UsersViewTests(test.BaseAdminViewTests): u'You are not allowed to disable user: ' u'test_user') - @test.create_stubs({api.keystone: ('user_list', 'domain_lookup')}) + @test.create_stubs({api.keystone: ('domain_get', + 'user_list', + 'domain_lookup')}) def test_disabling_current_user_domain_name(self): domain = self._get_default_domain() domains = self.domains.list() @@ -738,6 +749,7 @@ class UsersViewTests(test.BaseAdminViewTests): users = self._get_users(domain_id) domain_lookup = dict((d.id, d.name) for d in domains) + api.keystone.domain_get(IsA(http.HttpRequest), '1').AndReturn(domain) for u in users: u.domain_name = domain_lookup.get(u.domain_id) @@ -755,11 +767,14 @@ class UsersViewTests(test.BaseAdminViewTests): u'You are not allowed to disable user: ' u'test_user') - @test.create_stubs({api.keystone: ('user_list', 'domain_lookup')}) + @test.create_stubs({api.keystone: ('domain_get', + 'user_list', + 'domain_lookup')}) def test_delete_user_with_improper_permissions(self): domain = self._get_default_domain() domain_id = domain.id users = self._get_users(domain_id) + api.keystone.domain_get(IsA(http.HttpRequest), '1').AndReturn(domain) for i in range(0, 2): api.keystone.user_list(IgnoreArg(), domain=domain_id) \ .AndReturn(users) @@ -775,7 +790,9 @@ class UsersViewTests(test.BaseAdminViewTests): u'You are not allowed to delete user: %s' % self.request.user.username) - @test.create_stubs({api.keystone: ('user_list', 'domain_lookup')}) + @test.create_stubs({api.keystone: ('domain_get', + 'user_list', + 'domain_lookup')}) def test_delete_user_with_improper_permissions_domain_name(self): domain = self._get_default_domain() domains = self.domains.list() @@ -783,6 +800,7 @@ class UsersViewTests(test.BaseAdminViewTests): users = self._get_users(domain_id) domain_lookup = dict((d.id, d.name) for d in domains) + api.keystone.domain_get(IsA(http.HttpRequest), '1').AndReturn(domain) for u in users: u.domain_name = domain_lookup.get(u.domain_id) @@ -800,11 +818,15 @@ class UsersViewTests(test.BaseAdminViewTests): u'You are not allowed to delete user: %s' % self.request.user.username) - @test.create_stubs({api.keystone: ('user_get', 'tenant_get')}) + @test.create_stubs({api.keystone: ('domain_get', + 'user_get', + 'tenant_get')}) def test_detail_view(self): + domain = self._get_default_domain() user = self.users.get(id="1") tenant = self.tenants.get(id=user.project_id) + api.keystone.domain_get(IsA(http.HttpRequest), '1').AndReturn(domain) api.keystone.user_get(IsA(http.HttpRequest), '1').AndReturn(user) api.keystone.tenant_get(IsA(http.HttpRequest), user.project_id) \ .AndReturn(tenant) diff --git a/openstack_dashboard/dashboards/project/access_and_security/floating_ips/tests.py b/openstack_dashboard/dashboards/project/access_and_security/floating_ips/tests.py index 35f7a232c7..a13e7ef438 100644 --- a/openstack_dashboard/dashboards/project/access_and_security/floating_ips/tests.py +++ b/openstack_dashboard/dashboards/project/access_and_security/floating_ips/tests.py @@ -169,7 +169,8 @@ class FloatingIpViewTests(test.TestCase): api.network: ('floating_ip_disassociate', 'floating_ip_supported', 'tenant_floating_ip_get', - 'tenant_floating_ip_list',)}) + 'tenant_floating_ip_list',), + api.neutron: ('is_extension_supported',)}) def test_disassociate_post(self): floating_ip = self.floating_ips.first() @@ -179,6 +180,9 @@ class FloatingIpViewTests(test.TestCase): .AndReturn(True) api.network.tenant_floating_ip_list(IsA(http.HttpRequest)) \ .AndReturn(self.floating_ips.list()) + api.neutron.is_extension_supported(IsA(http.HttpRequest), + 'subnet_allocation')\ + .AndReturn(True) api.network.floating_ip_disassociate(IsA(http.HttpRequest), floating_ip.id) self.mox.ReplayAll() @@ -192,7 +196,8 @@ class FloatingIpViewTests(test.TestCase): api.network: ('floating_ip_disassociate', 'floating_ip_supported', 'tenant_floating_ip_get', - 'tenant_floating_ip_list',)}) + 'tenant_floating_ip_list',), + api.neutron: ('is_extension_supported',)}) def test_disassociate_post_with_exception(self): floating_ip = self.floating_ips.first() @@ -202,6 +207,9 @@ class FloatingIpViewTests(test.TestCase): .AndReturn(True) api.network.tenant_floating_ip_list(IsA(http.HttpRequest)) \ .AndReturn(self.floating_ips.list()) + api.neutron.is_extension_supported(IsA(http.HttpRequest), + 'subnet_allocation')\ + .AndReturn(True) api.network.floating_ip_disassociate(IsA(http.HttpRequest), floating_ip.id) \ diff --git a/openstack_dashboard/dashboards/project/access_and_security/tests.py b/openstack_dashboard/dashboards/project/access_and_security/tests.py index e7dc307493..de1a066e98 100644 --- a/openstack_dashboard/dashboards/project/access_and_security/tests.py +++ b/openstack_dashboard/dashboards/project/access_and_security/tests.py @@ -39,49 +39,48 @@ class AccessAndSecurityTests(test.TestCase): @test.create_stubs({api.network: ('floating_ip_supported', 'tenant_floating_ip_list', + 'floating_ip_pools_list', 'security_group_list',), api.nova: ('keypair_list', 'server_list',), api.base: ('is_service_enabled',), - quotas: ('tenant_quota_usages',)}) + quotas: ('tenant_quota_usages',), + api.keystone: ('list_ec2_credentials',)}) def _test_index(self, ec2_enabled=True, instanceless_ips=False): keypairs = self.keypairs.list() sec_groups = self.security_groups.list() floating_ips = self.floating_ips.list() + floating_pools = self.pools.list() if instanceless_ips: for fip in floating_ips: fip.instance_id = None quota_data = self.quota_usages.first() quota_data['security_groups']['available'] = 10 - if not instanceless_ips: - api.nova.server_list( - IsA(http.HttpRequest)) \ - .AndReturn([self.servers.list(), False]) - api.nova.keypair_list( - IsA(http.HttpRequest)) \ - .AndReturn(keypairs) - api.network.floating_ip_supported( - IsA(http.HttpRequest)) \ + api.network.floating_ip_supported(IsA(http.HttpRequest)) \ .AndReturn(True) - api.network.tenant_floating_ip_list( - IsA(http.HttpRequest)) \ + if not instanceless_ips: + api.nova.server_list(IsA(http.HttpRequest)) \ + .AndReturn([self.servers.list(), False]) + api.nova.keypair_list(IsA(http.HttpRequest)) \ + .AndReturn(keypairs) + api.network.tenant_floating_ip_list(IsA(http.HttpRequest)) \ .AndReturn(floating_ips) - api.network.security_group_list( - IsA(http.HttpRequest)) \ + api.network.floating_ip_pools_list(IsA(http.HttpRequest)) \ + .AndReturn(floating_pools) + api.network.security_group_list(IsA(http.HttpRequest)) \ .AndReturn(sec_groups) - quotas.tenant_quota_usages( - IsA(http.HttpRequest)).MultipleTimes() \ + quotas.tenant_quota_usages(IsA(http.HttpRequest)).MultipleTimes() \ .AndReturn(quota_data) - api.base.is_service_enabled( - IsA(http.HttpRequest), - 'network').MultipleTimes() \ - .AndReturn(True) - api.base.is_service_enabled( - IsA(http.HttpRequest), - 'ec2').MultipleTimes() \ - .AndReturn(ec2_enabled) + api.base.is_service_enabled(IsA(http.HttpRequest), 'network') \ + .MultipleTimes().AndReturn(True) + api.base.is_service_enabled(IsA(http.HttpRequest), 'ec2') \ + .MultipleTimes().AndReturn(ec2_enabled) + if ec2_enabled: + api.keystone.list_ec2_credentials(IsA(http.HttpRequest), + self.user.id)\ + .AndReturn(self.ec2.list()) self.mox.ReplayAll() diff --git a/openstack_dashboard/dashboards/project/instances/tests.py b/openstack_dashboard/dashboards/project/instances/tests.py index cd4b9fb416..452d88aba8 100644 --- a/openstack_dashboard/dashboards/project/instances/tests.py +++ b/openstack_dashboard/dashboards/project/instances/tests.py @@ -1002,8 +1002,18 @@ class InstanceTests(helpers.TestCase): res = self._get_instance_details(server) self.assertItemsEqual(res.context['instance'].fault, server.fault) + @helpers.create_stubs({console: ('get_console',)}) def test_instance_details_console_tab(self): server = self.servers.first() + CONSOLE_OUTPUT = '/vncserver' + CONSOLE_TITLE = '&title=%s(%s)' % (server.name, server.id) + CONSOLE_URL = CONSOLE_OUTPUT + CONSOLE_TITLE + + console_mock = self.mox.CreateMock(api.nova.VNCConsole) + console_mock.url = CONSOLE_OUTPUT + + console.get_console(IgnoreArg(), 'AUTO', server) \ + .AndReturn(('VNC', CONSOLE_URL)) tg = tabs.InstanceDetailTabs(self.request, instance=server) qs = "?%s=%s" % (tg.param_name, tg.get_tab("console").get_id()) @@ -2791,12 +2801,14 @@ class InstanceTests(helpers.TestCase): api.neutron: ('network_list', 'profile_list', 'port_create', - 'port_list'), + 'port_list', + 'is_port_profiles_supported'), api.nova: ('extension_supported', 'flavor_list', 'keypair_list', 'availability_zone_list', - 'server_create',), + 'server_create', + 'tenant_absolute_limits'), api.network: ('security_group_list',), cinder: ('volume_list', 'volume_snapshot_list',), @@ -2811,11 +2823,6 @@ class InstanceTests(helpers.TestCase): avail_zone = self.availability_zones.first() quota_usages = self.quota_usages.first() - api.nova.extension_supported('BlockDeviceMappingV2Boot', - IsA(http.HttpRequest)) \ - .AndReturn(True) - api.nova.flavor_list(IsA(http.HttpRequest)) \ - .AndReturn(self.flavors.list()) api.glance.image_list_detailed(IsA(http.HttpRequest), filters={'is_public': True, 'status': 'active'}) \ @@ -2825,6 +2832,12 @@ class InstanceTests(helpers.TestCase): filters={'property-owner_id': self.tenant.id, 'status': 'active'}) \ .AndReturn([[], False, False]) + + quotas.tenant_quota_usages(IsA(http.HttpRequest)) \ + .AndReturn(quota_usages) + + api.neutron.is_port_profiles_supported()\ + .MultipleTimes().AndReturn(test_with_profile) api.neutron.network_list(IsA(http.HttpRequest), tenant_id=self.tenant.id, shared=False) \ @@ -2843,30 +2856,14 @@ class InstanceTests(helpers.TestCase): api.neutron.port_list(IsA(http.HttpRequest), network_id=net.id) \ .AndReturn(self.ports.list()) - api.nova.flavor_list(IsA(http.HttpRequest)) \ - .AndReturn(self.flavors.list()) - api.nova.keypair_list(IsA(http.HttpRequest)) \ - .AndReturn(self.keypairs.list()) - api.network.security_group_list(IsA(http.HttpRequest)) \ - .AndReturn(self.security_groups.list()) - api.nova.availability_zone_list(IsA(http.HttpRequest)) \ - .AndReturn(self.availability_zones.list()) api.nova.extension_supported('DiskConfig', IsA(http.HttpRequest)) \ .AndReturn(True) api.nova.extension_supported('ConfigDrive', IsA(http.HttpRequest)).AndReturn(True) - cinder.volume_list(IsA(http.HttpRequest), - search_opts=VOLUME_SEARCH_OPTS) \ - .AndReturn([]) - cinder.volume_snapshot_list(IsA(http.HttpRequest), - search_opts=SNAPSHOT_SEARCH_OPTS) \ - .AndReturn([]) - - quotas.tenant_quota_usages(IsA(http.HttpRequest)) \ - .AndReturn(quota_usages) - + api.nova.tenant_absolute_limits(IsA(http.HttpRequest)) \ + .MultipleTimes().AndReturn(self.limits['absolute']) self.mox.ReplayAll() bad_snapshot_id = 'a-bogus-id' @@ -2890,7 +2887,7 @@ class InstanceTests(helpers.TestCase): url = reverse('horizon:project:instances:launch') res = self.client.post(url, form_data) - self.assertFormErrors(res, 1, "You must select a snapshot.") + self.assertFormErrors(res, 3, "You must select a snapshot.") @helpers.create_stubs({api.glance: ('image_list_detailed',), api.neutron: ('network_list', diff --git a/openstack_dashboard/dashboards/project/loadbalancers/tests.py b/openstack_dashboard/dashboards/project/loadbalancers/tests.py index 9f3c0bbfc4..ebbe796c67 100644 --- a/openstack_dashboard/dashboards/project/loadbalancers/tests.py +++ b/openstack_dashboard/dashboards/project/loadbalancers/tests.py @@ -89,11 +89,16 @@ class LoadBalancerTests(test.TestCase): @test.create_stubs({api.lbaas: ('pool_list', 'member_list', 'pool_health_monitor_list'), api.network: ('floating_ip_supported', - 'floating_ip_simple_associate_supported') + 'floating_ip_simple_associate_supported', + 'tenant_floating_ip_list') }) def test_index_pools(self): + fips = self.floating_ips.list() self.set_up_expect() + api.network.tenant_floating_ip_list(IsA(http.HttpRequest)).\ + AndReturn(fips) + self.mox.ReplayAll() res = self.client.get(self.INDEX_URL) @@ -107,11 +112,16 @@ class LoadBalancerTests(test.TestCase): @test.create_stubs({api.lbaas: ('pool_list', 'member_list', 'pool_health_monitor_list'), api.network: ('floating_ip_supported', - 'floating_ip_simple_associate_supported') + 'floating_ip_simple_associate_supported', + 'tenant_floating_ip_list') }) def test_index_members(self): + fips = self.floating_ips.list() self.set_up_expect() + api.network.tenant_floating_ip_list(IsA(http.HttpRequest)).\ + AndReturn(fips) + self.mox.ReplayAll() res = self.client.get(self.INDEX_URL + '?tab=lbtabs__members') @@ -125,11 +135,16 @@ class LoadBalancerTests(test.TestCase): @test.create_stubs({api.lbaas: ('pool_list', 'member_list', 'pool_health_monitor_list'), api.network: ('floating_ip_supported', - 'floating_ip_simple_associate_supported') + 'floating_ip_simple_associate_supported', + 'tenant_floating_ip_list') }) def test_index_monitors(self): + fips = self.floating_ips.list() self.set_up_expect() + api.network.tenant_floating_ip_list(IsA(http.HttpRequest)).\ + AndReturn(fips) + self.mox.ReplayAll() res = self.client.get(self.INDEX_URL + '?tab=lbtabs__monitors') @@ -942,16 +957,20 @@ class LoadBalancerTests(test.TestCase): '', ] self.assertQuerysetEqual(workflow.steps, expected_objs) - @test.create_stubs({api.lbaas: ('pool_list', 'pool_delete')}) + @test.create_stubs({api.lbaas: ('pool_list', 'pool_delete'), + api.network: ('tenant_floating_ip_list',)}) def test_delete_pool(self): pool_list = self.pools.list() pool = pool_list[0] + fips = self.floating_ips.list() # the test pool needs to have no vip # in order to be able to be deleted pool.vip_id = None api.lbaas.pool_list( IsA(http.HttpRequest), tenant_id=self.tenant.id) \ .AndReturn(pool_list) + api.network.tenant_floating_ip_list(IsA(http.HttpRequest)).\ + AndReturn(fips) api.lbaas.pool_delete(IsA(http.HttpRequest), pool.id) self.mox.ReplayAll() @@ -961,13 +980,16 @@ class LoadBalancerTests(test.TestCase): self.assertNoFormErrors(res) @test.create_stubs({api.lbaas: ('pool_list', 'pool_get', - 'vip_delete'), + 'member_list', 'vip_delete', + 'pool_health_monitor_list'), api.network: ( + 'tenant_floating_ip_list', 'floating_ip_supported', 'floating_ip_simple_associate_supported')}) def test_delete_vip(self): pool = self.pools.first() vip = self.vips.first() + fips = self.floating_ips.list() api.lbaas.pool_list( IsA(http.HttpRequest), tenant_id=self.tenant.id) \ .AndReturn(self.pools.list()) @@ -976,6 +998,8 @@ class LoadBalancerTests(test.TestCase): .AndReturn(True) api.network.floating_ip_simple_associate_supported(IgnoreArg()) \ .MultipleTimes().AndReturn(True) + api.network.tenant_floating_ip_list(IsA(http.HttpRequest)).\ + AndReturn(fips) api.lbaas.vip_delete(IsA(http.HttpRequest), vip.id) self.mox.ReplayAll() diff --git a/openstack_dashboard/dashboards/project/network_topology/tests.py b/openstack_dashboard/dashboards/project/network_topology/tests.py index 65cbcd6b85..b0303ce5d1 100644 --- a/openstack_dashboard/dashboards/project/network_topology/tests.py +++ b/openstack_dashboard/dashboards/project/network_topology/tests.py @@ -16,10 +16,12 @@ from django.core.urlresolvers import reverse from django import http import django.test +from mox3.mox import IgnoreArg # noqa from mox3.mox import IsA # noqa from oslo_serialization import jsonutils from openstack_dashboard import api +from openstack_dashboard.dashboards.project.instances import console from openstack_dashboard.dashboards.project.network_topology.views import \ TranslationHelper from openstack_dashboard.test import helpers as test @@ -36,7 +38,8 @@ class NetworkTopologyTests(test.TestCase): api.neutron: ('network_list_for_tenant', 'network_list', 'router_list', - 'port_list')}) + 'port_list',), + console: ('get_console',)}) def test_json_view(self): self._test_json_view() @@ -44,13 +47,15 @@ class NetworkTopologyTests(test.TestCase): OPENSTACK_NEUTRON_NETWORK={'enable_router': False}) @test.create_stubs({api.nova: ('server_list',), api.neutron: ('network_list_for_tenant', - 'port_list')}) + 'port_list'), + console: ('get_console',)}) def test_json_view_router_disabled(self): self._test_json_view(router_enable=False) def _test_json_view(self, router_enable=True): api.nova.server_list( IsA(http.HttpRequest)).AndReturn([self.servers.list(), False]) + tenant_networks = [net for net in self.networks.list() if not net['router:external']] external_networks = [net for net in self.networks.list() @@ -58,10 +63,17 @@ class NetworkTopologyTests(test.TestCase): api.neutron.network_list_for_tenant( IsA(http.HttpRequest), self.tenant.id).AndReturn(tenant_networks) - if router_enable: - api.neutron.network_list( - IsA(http.HttpRequest), - **{'router:external': True}).AndReturn(external_networks) + + for server in self.servers.list(): + if server.status != u'BUILD': + CONSOLE_OUTPUT = '/vncserver' + CONSOLE_TITLE = '&title=%s' % server.id + CONSOLE_URL = CONSOLE_OUTPUT + CONSOLE_TITLE + + console_mock = self.mox.CreateMock(api.nova.VNCConsole) + console_mock.url = CONSOLE_OUTPUT + console.get_console(IsA(http.HttpRequest), 'AUTO', server) \ + .AndReturn(('VNC', CONSOLE_URL)) # router1 : gateway port not in the port list # router2 : no gateway port @@ -73,24 +85,34 @@ class NetworkTopologyTests(test.TestCase): tenant_id=self.tenant.id).AndReturn(routers) api.neutron.port_list( IsA(http.HttpRequest)).AndReturn(self.ports.list()) + if router_enable: + api.neutron.network_list( + IsA(http.HttpRequest), + **{'router:external': True}).AndReturn(external_networks) self.mox.ReplayAll() res = self.client.get(JSON_URL) + self.assertEqual('text/json', res['Content-Type']) data = jsonutils.loads(res.content) # servers # result_server_urls = [(server['id'], server['url']) # for server in data['servers']] - expect_server_urls = [ - {'id': server.id, - 'name': server.name, - 'status': self.trans.instance[server.status], - 'original_status': server.status, - 'task': None, - 'url': '/project/instances/%s/' % server.id} - for server in self.servers.list()] + expect_server_urls = [] + for server in self.servers.list(): + expect_server = { + 'id': server.id, + 'name': server.name, + 'status': server.status.title(), + 'original_status': server.status, + 'task': None, + 'url': '/project/instances/%s/' % server.id + } + if server.status != 'BUILD': + expect_server['console'] = 'vnc' + expect_server_urls.append(expect_server) self.assertEqual(expect_server_urls, data['servers']) # routers @@ -102,7 +124,7 @@ class NetworkTopologyTests(test.TestCase): 'external_gateway_info': router.external_gateway_info, 'name': router.name, - 'status': self.trans.router[router.status], + 'status': router.status.title(), 'original_status': router.status, 'url': '/project/routers/%s/' % router.id} for router in routers] @@ -117,23 +139,23 @@ class NetworkTopologyTests(test.TestCase): 'url': '/project/networks/%s/detail' % net.id, 'name': net.name, 'router:external': net.router__external, - 'status': self.trans.network[net.status], + 'status': net.status.title(), 'original_status': net.status, 'subnets': []} for net in external_networks] - expect_net_urls += [{'id': net.id, - 'url': '/project/networks/%s/detail' % net.id, - 'name': net.name, - 'router:external': net.router__external, - 'status': self.trans.network[net.status], - 'original_status': net.status, - 'subnets': [{'cidr': subnet.cidr, - 'id': subnet.id, - 'url': - '/project/networks/subnets/%s/detail' - % subnet.id} - for subnet in net.subnets]} - for net in tenant_networks] + expect_net_urls.extend([{ + 'id': net.id, + 'url': '/project/networks/%s/detail' % net.id, + 'name': net.name, + 'router:external': net.router__external, + 'status': net.status.title(), + 'original_status': net.status, + 'subnets': [{ + 'cidr': subnet.cidr, + 'id': subnet.id, + 'url': '/project/networks/subnets/%s/detail' % subnet.id} + for subnet in net.subnets]} + for net in tenant_networks]) for exp_net in expect_net_urls: if exp_net['url'] is None: del exp_net['url'] @@ -146,7 +168,7 @@ class NetworkTopologyTests(test.TestCase): 'device_owner': port.device_owner, 'fixed_ips': port.fixed_ips, 'network_id': port.network_id, - 'status': self.trans.port[port.status], + 'status': port.status.title(), 'original_status': port.status, 'url': '/project/networks/ports/%s/detail' % port.id} for port in self.ports.list()] diff --git a/openstack_dashboard/dashboards/project/networks/ports/tests.py b/openstack_dashboard/dashboards/project/networks/ports/tests.py index 1ef180ab72..8d7bc048bb 100644 --- a/openstack_dashboard/dashboards/project/networks/ports/tests.py +++ b/openstack_dashboard/dashboards/project/networks/ports/tests.py @@ -29,23 +29,28 @@ NETWORKS_DETAIL_URL = 'horizon:project:networks:detail' class NetworkPortTests(test.TestCase): - @test.create_stubs({api.neutron: ('port_get', + @test.create_stubs({api.neutron: ('network_get', + 'port_get', 'is_extension_supported',)}) def test_port_detail(self): self._test_port_detail() - @test.create_stubs({api.neutron: ('port_get', + @test.create_stubs({api.neutron: ('network_get', + 'port_get', 'is_extension_supported',)}) def test_port_detail_with_mac_learning(self): self._test_port_detail(mac_learning=True) def _test_port_detail(self, mac_learning=False): port = self.ports.first() + network_id = self.networks.first().id api.neutron.port_get(IsA(http.HttpRequest), port.id)\ .AndReturn(self.ports.first()) api.neutron.is_extension_supported(IsA(http.HttpRequest), 'mac-learning')\ .AndReturn(mac_learning) + api.neutron.network_get(IsA(http.HttpRequest), network_id)\ + .AndReturn(self.networks.first()) api.neutron.is_extension_supported(IsA(http.HttpRequest), 'mac-learning')\ .AndReturn(mac_learning) diff --git a/openstack_dashboard/dashboards/project/networks/subnets/tests.py b/openstack_dashboard/dashboards/project/networks/subnets/tests.py index da93a1ac11..536536c49b 100644 --- a/openstack_dashboard/dashboards/project/networks/subnets/tests.py +++ b/openstack_dashboard/dashboards/project/networks/subnets/tests.py @@ -65,12 +65,19 @@ class NetworkSubnetTests(test.TestCase): self.assertRedirectsNoFollow(res, NETWORKS_INDEX_URL) - @test.create_stubs({api.neutron: ('network_get',)}) + @test.create_stubs({api.neutron: ('network_get', + 'is_extension_supported', + 'subnetpool_list')}) def test_subnet_create_get(self): network = self.networks.first() api.neutron.network_get(IsA(http.HttpRequest), network.id)\ .AndReturn(self.networks.first()) + api.neutron.is_extension_supported(IsA(http.HttpRequest), + 'subnet_allocation') \ + .AndReturn(True) + api.neutron.subnetpool_list(IsA(http.HttpRequest)).\ + AndReturn(self.subnetpools.list()) self.mox.ReplayAll() url = reverse('horizon:project:networks:addsubnet', @@ -80,13 +87,20 @@ class NetworkSubnetTests(test.TestCase): self.assertTemplateUsed(res, views.WorkflowView.template_name) @test.create_stubs({api.neutron: ('network_get', - 'subnet_create',)}) + 'subnet_create', + 'is_extension_supported', + 'subnetpool_list')}) def test_subnet_create_post(self, test_with_subnetpool=False): network = self.networks.first() subnet = self.subnets.first() api.neutron.network_get(IsA(http.HttpRequest), network.id)\ .AndReturn(self.networks.first()) + api.neutron.is_extension_supported(IsA(http.HttpRequest), + 'subnet_allocation') \ + .AndReturn(True) + api.neutron.subnetpool_list(IsA(http.HttpRequest)).\ + AndReturn(self.subnetpools.list()) api.neutron.subnet_create(IsA(http.HttpRequest), network_id=network.id, name=subnet.name, @@ -108,13 +122,20 @@ class NetworkSubnetTests(test.TestCase): self.assertRedirectsNoFollow(res, redir_url) @test.create_stubs({api.neutron: ('network_get', - 'subnet_create',)}) + 'subnet_create', + 'is_extension_supported', + 'subnetpool_list')}) def test_subnet_create_post_with_additional_attributes(self): network = self.networks.list()[1] subnet = self.subnets.list()[1] api.neutron.network_get(IsA(http.HttpRequest), network.id)\ .AndReturn(self.networks.first()) + api.neutron.is_extension_supported(IsA(http.HttpRequest), + 'subnet_allocation') \ + .AndReturn(True) + api.neutron.subnetpool_list(IsA(http.HttpRequest)).\ + AndReturn(self.subnetpools.list()) api.neutron.subnet_create(IsA(http.HttpRequest), network_id=network.id, name=subnet.name, @@ -138,13 +159,20 @@ class NetworkSubnetTests(test.TestCase): self.assertRedirectsNoFollow(res, redir_url) @test.create_stubs({api.neutron: ('network_get', - 'subnet_create',)}) + 'subnet_create', + 'is_extension_supported', + 'subnetpool_list')}) def test_subnet_create_post_with_additional_attributes_no_gateway(self): network = self.networks.first() subnet = self.subnets.first() api.neutron.network_get(IsA(http.HttpRequest), network.id)\ .AndReturn(self.networks.first()) + api.neutron.is_extension_supported(IsA(http.HttpRequest), + 'subnet_allocation') \ + .AndReturn(True) + api.neutron.subnetpool_list(IsA(http.HttpRequest)).\ + AndReturn(self.subnetpools.list()) api.neutron.subnet_create(IsA(http.HttpRequest), network_id=network.id, name=subnet.name, @@ -194,7 +222,9 @@ class NetworkSubnetTests(test.TestCase): test_with_subnetpool=True) @test.create_stubs({api.neutron: ('network_get', - 'subnet_create',)}) + 'subnet_create', + 'is_extension_supported', + 'subnetpool_list')}) def test_subnet_create_post_subnet_exception(self, test_with_subnetpool=False): network = self.networks.first() @@ -202,6 +232,11 @@ class NetworkSubnetTests(test.TestCase): api.neutron.network_get(IsA(http.HttpRequest), network.id)\ .AndReturn(self.networks.first()) + api.neutron.is_extension_supported(IsA(http.HttpRequest), + 'subnet_allocation') \ + .AndReturn(True) + api.neutron.subnetpool_list(IsA(http.HttpRequest)).\ + AndReturn(self.subnetpools.list()) api.neutron.subnet_create(IsA(http.HttpRequest), network_id=network.id, name=subnet.name, @@ -347,10 +382,10 @@ class NetworkSubnetTests(test.TestCase): network.id).AndReturn(network) api.neutron.is_extension_supported(IsA(http.HttpRequest), - 'subnet_allocation').\ - AndReturn(True) - api.neutron.subnetpool_list(IsA(http.HttpRequest)).\ - AndReturn(self.subnetpools.list()) + 'subnet_allocation') \ + .AndReturn(True) + api.neutron.subnetpool_list(IsA(http.HttpRequest)) \ + .AndReturn(self.subnetpools.list()) self.mox.ReplayAll() @@ -731,13 +766,20 @@ class NetworkSubnetTests(test.TestCase): self.assertRedirectsNoFollow(res, redir_url) @test.create_stubs({api.neutron: ('network_get', - 'subnet_create',)}) + 'subnet_create', + 'is_extension_supported', + 'subnetpool_list')}) def test_v6subnet_create_post_with_slaac_attributes(self): network = self.networks.get(name="v6_net2") subnet = self.subnets.get(name="v6_subnet2") api.neutron.network_get(IsA(http.HttpRequest), network.id)\ .AndReturn(network) + api.neutron.is_extension_supported(IsA(http.HttpRequest), + 'subnet_allocation') \ + .AndReturn(True) + api.neutron.subnetpool_list(IsA(http.HttpRequest)).\ + AndReturn(self.subnetpools.list()) api.neutron.subnet_create(IsA(http.HttpRequest), network_id=network.id, name=subnet.name, @@ -761,9 +803,16 @@ class NetworkSubnetTests(test.TestCase): self.assertRedirectsNoFollow(res, redir_url) @test.create_stubs({api.neutron: ('subnet_update', - 'subnet_get',)}) + 'subnet_get', + 'is_extension_supported', + 'subnetpool_list')}) def test_subnet_update_post(self): subnet = self.subnets.first() + api.neutron.is_extension_supported(IsA(http.HttpRequest), + 'subnet_allocation') \ + .AndReturn(True) + api.neutron.subnetpool_list(IsA(http.HttpRequest)).\ + AndReturn(self.subnetpools.list()) api.neutron.subnet_get(IsA(http.HttpRequest), subnet.id)\ .AndReturn(subnet) api.neutron.subnet_get(IsA(http.HttpRequest), subnet.id)\ @@ -786,14 +835,19 @@ class NetworkSubnetTests(test.TestCase): self.assertRedirectsNoFollow(res, redir_url) @test.create_stubs({api.neutron: ('subnet_update', - 'subnet_get',)}) + 'subnet_get', + 'is_extension_supported', + 'subnetpool_list')}) def test_subnet_update_post_with_gateway_ip(self): subnet = self.subnets.first() api.neutron.subnet_get(IsA(http.HttpRequest), subnet.id)\ - .AndReturn(subnet) - api.neutron.subnet_get(IsA(http.HttpRequest), subnet.id)\ - .AndReturn(subnet) + .MultipleTimes().AndReturn(subnet) gateway_ip = '10.0.0.100' + api.neutron.is_extension_supported(IsA(http.HttpRequest), + 'subnet_allocation') \ + .AndReturn(True) + api.neutron.subnetpool_list(IsA(http.HttpRequest)) \ + .AndReturn(self.subnetpools.list()) api.neutron.subnet_update(IsA(http.HttpRequest), subnet.id, name=subnet.name, gateway_ip=gateway_ip, @@ -814,13 +868,18 @@ class NetworkSubnetTests(test.TestCase): self.assertRedirectsNoFollow(res, redir_url) @test.create_stubs({api.neutron: ('subnet_update', - 'subnet_get',)}) + 'subnet_get', + 'is_extension_supported', + 'subnetpool_list')}) def test_subnet_update_post_no_gateway(self): subnet = self.subnets.first() api.neutron.subnet_get(IsA(http.HttpRequest), subnet.id)\ - .AndReturn(subnet) - api.neutron.subnet_get(IsA(http.HttpRequest), subnet.id)\ - .AndReturn(subnet) + .MultipleTimes().AndReturn(subnet) + api.neutron.is_extension_supported(IsA(http.HttpRequest), + 'subnet_allocation') \ + .AndReturn(True) + api.neutron.subnetpool_list(IsA(http.HttpRequest)).\ + AndReturn(self.subnetpools.list()) api.neutron.subnet_update(IsA(http.HttpRequest), subnet.id, name=subnet.name, gateway_ip=None, @@ -841,13 +900,20 @@ class NetworkSubnetTests(test.TestCase): self.assertRedirectsNoFollow(res, redir_url) @test.create_stubs({api.neutron: ('subnet_update', - 'subnet_get',)}) + 'subnet_get', + 'is_extension_supported', + 'subnetpool_list')}) def test_subnet_update_post_with_additional_attributes(self): subnet = self.subnets.list()[1] api.neutron.subnet_get(IsA(http.HttpRequest), subnet.id)\ .AndReturn(subnet) api.neutron.subnet_get(IsA(http.HttpRequest), subnet.id)\ .AndReturn(subnet) + api.neutron.is_extension_supported(IsA(http.HttpRequest), + 'subnet_allocation') \ + .AndReturn(True) + api.neutron.subnetpool_list(IsA(http.HttpRequest)).\ + AndReturn(self.subnetpools.list()) start = subnet.allocation_pools[0]['start'] end = subnet.allocation_pools[0]['end'] api.neutron.subnet_update(IsA(http.HttpRequest), subnet.id, @@ -870,11 +936,18 @@ class NetworkSubnetTests(test.TestCase): self.assertRedirectsNoFollow(res, redir_url) @test.create_stubs({api.neutron: ('subnet_update', - 'subnet_get',)}) + 'subnet_get', + 'is_extension_supported', + 'subnetpool_list')}) def test_subnet_update_post_gw_inconsistent(self): subnet = self.subnets.first() api.neutron.subnet_get(IsA(http.HttpRequest), subnet.id)\ .AndReturn(subnet) + api.neutron.is_extension_supported(IsA(http.HttpRequest), + 'subnet_allocation') \ + .AndReturn(True) + api.neutron.subnetpool_list(IsA(http.HttpRequest)).\ + AndReturn(self.subnetpools.list()) self.mox.ReplayAll() # dummy IPv6 address @@ -888,11 +961,18 @@ class NetworkSubnetTests(test.TestCase): self.assertContains(res, 'Gateway IP and IP version are inconsistent.') @test.create_stubs({api.neutron: ('subnet_update', - 'subnet_get',)}) + 'subnet_get', + 'is_extension_supported', + 'subnetpool_list')}) def test_subnet_update_post_invalid_nameservers(self): subnet = self.subnets.first() api.neutron.subnet_get(IsA(http.HttpRequest), subnet.id)\ .AndReturn(subnet) + api.neutron.is_extension_supported(IsA(http.HttpRequest), + 'subnet_allocation') \ + .AndReturn(True) + api.neutron.subnetpool_list(IsA(http.HttpRequest)).\ + AndReturn(self.subnetpools.list()) self.mox.ReplayAll() # invalid DNS server address @@ -908,11 +988,18 @@ class NetworkSubnetTests(test.TestCase): '(value=%s)' % dns_nameservers[1]) @test.create_stubs({api.neutron: ('subnet_update', - 'subnet_get',)}) + 'subnet_get', + 'is_extension_supported', + 'subnetpool_list')}) def test_subnet_update_post_invalid_routes_destination_only(self): subnet = self.subnets.first() api.neutron.subnet_get(IsA(http.HttpRequest), subnet.id)\ .AndReturn(subnet) + api.neutron.is_extension_supported(IsA(http.HttpRequest), + 'subnet_allocation') \ + .AndReturn(True) + api.neutron.subnetpool_list(IsA(http.HttpRequest)).\ + AndReturn(self.subnetpools.list()) self.mox.ReplayAll() # Start only host_route @@ -930,11 +1017,18 @@ class NetworkSubnetTests(test.TestCase): '(value=%s)' % host_routes) @test.create_stubs({api.neutron: ('subnet_update', - 'subnet_get',)}) + 'subnet_get', + 'is_extension_supported', + 'subnetpool_list')}) def test_subnet_update_post_invalid_routes_three_entries(self): subnet = self.subnets.first() api.neutron.subnet_get(IsA(http.HttpRequest), subnet.id)\ .AndReturn(subnet) + api.neutron.is_extension_supported(IsA(http.HttpRequest), + 'subnet_allocation') \ + .AndReturn(True) + api.neutron.subnetpool_list(IsA(http.HttpRequest)).\ + AndReturn(self.subnetpools.list()) self.mox.ReplayAll() # host_route with three entries @@ -952,11 +1046,18 @@ class NetworkSubnetTests(test.TestCase): '(value=%s)' % host_routes) @test.create_stubs({api.neutron: ('subnet_update', - 'subnet_get',)}) + 'subnet_get', + 'is_extension_supported', + 'subnetpool_list')}) def test_subnet_update_post_invalid_routes_invalid_destination(self): subnet = self.subnets.first() api.neutron.subnet_get(IsA(http.HttpRequest), subnet.id)\ .AndReturn(subnet) + api.neutron.is_extension_supported(IsA(http.HttpRequest), + 'subnet_allocation') \ + .AndReturn(True) + api.neutron.subnetpool_list(IsA(http.HttpRequest)).\ + AndReturn(self.subnetpools.list()) self.mox.ReplayAll() # invalid destination network @@ -973,11 +1074,18 @@ class NetworkSubnetTests(test.TestCase): '(value=%s)' % host_routes.split(',')[0]) @test.create_stubs({api.neutron: ('subnet_update', - 'subnet_get',)}) + 'subnet_get', + 'is_extension_supported', + 'subnetpool_list')}) def test_subnet_update_post_invalid_routes_nexthop_ip_network(self): subnet = self.subnets.first() api.neutron.subnet_get(IsA(http.HttpRequest), subnet.id)\ .AndReturn(subnet) + api.neutron.is_extension_supported(IsA(http.HttpRequest), + 'subnet_allocation') \ + .AndReturn(True) + api.neutron.subnetpool_list(IsA(http.HttpRequest)).\ + AndReturn(self.subnetpools.list()) self.mox.ReplayAll() # nexthop is not an IP address diff --git a/openstack_dashboard/dashboards/project/networks/tests.py b/openstack_dashboard/dashboards/project/networks/tests.py index 07ee1d711a..024e0c8b26 100644 --- a/openstack_dashboard/dashboards/project/networks/tests.py +++ b/openstack_dashboard/dashboards/project/networks/tests.py @@ -323,9 +323,16 @@ class NetworkTests(test.TestCase, NetworkStubMixin): self.assertItemsEqual(subnets, [self.subnets.first()]) self.assertEqual(len(ports), 0) - @test.create_stubs({api.neutron: ('profile_list',)}) + @test.create_stubs({api.neutron: ('profile_list', + 'is_extension_supported', + 'subnetpool_list')}) def test_network_create_get(self, test_with_profile=False): + api.neutron.is_extension_supported(IsA(http.HttpRequest), + 'subnet_allocation').\ + AndReturn(True) + api.neutron.subnetpool_list(IsA(http.HttpRequest)).\ + AndReturn(self.subnetpools.list()) if test_with_profile: net_profiles = self.net_profiles.list() api.neutron.profile_list(IsA(http.HttpRequest), @@ -349,7 +356,9 @@ class NetworkTests(test.TestCase, NetworkStubMixin): self.test_network_create_get(test_with_profile=True) @test.create_stubs({api.neutron: ('network_create', - 'profile_list',)}) + 'profile_list', + 'is_extension_supported', + 'subnetpool_list')}) def test_network_create_post(self, test_with_profile=False): network = self.networks.first() @@ -362,6 +371,11 @@ class NetworkTests(test.TestCase, NetworkStubMixin): api.neutron.profile_list(IsA(http.HttpRequest), 'network').AndReturn(net_profiles) params['net_profile_id'] = net_profile_id + api.neutron.is_extension_supported(IsA(http.HttpRequest), + 'subnet_allocation').\ + AndReturn(True) + api.neutron.subnetpool_list(IsA(http.HttpRequest)).\ + AndReturn(self.subnetpools.list()) api.neutron.network_create(IsA(http.HttpRequest), **params).AndReturn(network) self.mox.ReplayAll() @@ -381,7 +395,9 @@ class NetworkTests(test.TestCase, NetworkStubMixin): self.assertRedirectsNoFollow(res, INDEX_URL) @test.create_stubs({api.neutron: ('network_create', - 'profile_list',)}) + 'profile_list', + 'is_extension_supported', + 'subnetpool_list')}) def test_network_create_post_with_shared(self, test_with_profile=False): network = self.networks.first() params = {'name': network.name, @@ -393,6 +409,11 @@ class NetworkTests(test.TestCase, NetworkStubMixin): api.neutron.profile_list(IsA(http.HttpRequest), 'network').AndReturn(net_profiles) params['net_profile_id'] = net_profile_id + api.neutron.is_extension_supported(IsA(http.HttpRequest), + 'subnet_allocation').\ + AndReturn(True) + api.neutron.subnetpool_list(IsA(http.HttpRequest)).\ + AndReturn(self.subnetpools.list()) api.neutron.network_create(IsA(http.HttpRequest), **params).AndReturn(network) self.mox.ReplayAll() @@ -418,7 +439,9 @@ class NetworkTests(test.TestCase, NetworkStubMixin): @test.create_stubs({api.neutron: ('network_create', 'subnet_create', - 'profile_list',)}) + 'profile_list', + 'is_extension_supported', + 'subnetpool_list')}) def test_network_create_post_with_subnet(self, test_with_profile=False, test_with_ipv6=True): @@ -442,6 +465,11 @@ class NetworkTests(test.TestCase, NetworkStubMixin): if not test_with_ipv6: subnet.ip_version = 4 subnet_params['ip_version'] = subnet.ip_version + api.neutron.is_extension_supported(IsA(http.HttpRequest), + 'subnet_allocation').\ + AndReturn(True) + api.neutron.subnetpool_list(IsA(http.HttpRequest)).\ + AndReturn(self.subnetpools.list()) api.neutron.network_create(IsA(http.HttpRequest), **params).AndReturn(network) api.neutron.subnet_create(IsA(http.HttpRequest), @@ -471,7 +499,9 @@ class NetworkTests(test.TestCase, NetworkStubMixin): self.test_network_create_post_with_subnet(test_with_ipv6=False) @test.create_stubs({api.neutron: ('network_create', - 'profile_list',)}) + 'profile_list', + 'is_extension_supported', + 'subnetpool_list')}) def test_network_create_post_network_exception(self, test_with_profile=False): network = self.networks.first() @@ -484,6 +514,11 @@ class NetworkTests(test.TestCase, NetworkStubMixin): api.neutron.profile_list(IsA(http.HttpRequest), 'network').AndReturn(net_profiles) params['net_profile_id'] = net_profile_id + api.neutron.is_extension_supported(IsA(http.HttpRequest), + 'subnet_allocation').\ + AndReturn(True) + api.neutron.subnetpool_list(IsA(http.HttpRequest)).\ + AndReturn(self.subnetpools.list()) api.neutron.network_create(IsA(http.HttpRequest), **params).AndRaise(self.exceptions.neutron) self.mox.ReplayAll() @@ -509,7 +544,9 @@ class NetworkTests(test.TestCase, NetworkStubMixin): test_with_profile=True) @test.create_stubs({api.neutron: ('network_create', - 'profile_list')}) + 'profile_list', + 'is_extension_supported', + 'subnetpool_list')}) def test_network_create_post_with_subnet_network_exception( self, test_with_profile=False, @@ -526,6 +563,11 @@ class NetworkTests(test.TestCase, NetworkStubMixin): api.neutron.profile_list(IsA(http.HttpRequest), 'network').AndReturn(net_profiles) params['net_profile_id'] = net_profile_id + api.neutron.is_extension_supported(IsA(http.HttpRequest), + 'subnet_allocation').\ + AndReturn(True) + api.neutron.subnetpool_list(IsA(http.HttpRequest)).\ + AndReturn(self.subnetpools.list()) api.neutron.network_create(IsA(http.HttpRequest), **params).AndRaise(self.exceptions.neutron) self.mox.ReplayAll() diff --git a/openstack_dashboard/dashboards/project/routers/tests.py b/openstack_dashboard/dashboards/project/routers/tests.py index 7acc63e17e..ebc367589a 100644 --- a/openstack_dashboard/dashboards/project/routers/tests.py +++ b/openstack_dashboard/dashboards/project/routers/tests.py @@ -253,7 +253,8 @@ class RouterActionTests(RouterMixin, test.TestCase): DETAIL_PATH = 'horizon:%s:routers:detail' % DASHBOARD @test.create_stubs({api.neutron: ('router_create', - 'get_feature_permission',)}) + 'get_feature_permission', + 'network_list')}) def test_router_create_post(self): router = self.routers.first() api.neutron.get_feature_permission(IsA(http.HttpRequest), @@ -262,6 +263,8 @@ class RouterActionTests(RouterMixin, test.TestCase): api.neutron.get_feature_permission(IsA(http.HttpRequest), "l3-ha", "create")\ .AndReturn(False) + api.neutron.network_list(IsA(http.HttpRequest))\ + .AndReturn(self.networks.list()) params = {'name': router.name, 'admin_state_up': str(router.admin_state_up)} api.neutron.router_create(IsA(http.HttpRequest), **params)\ @@ -277,7 +280,8 @@ class RouterActionTests(RouterMixin, test.TestCase): self.assertRedirectsNoFollow(res, self.INDEX_URL) @test.create_stubs({api.neutron: ('router_create', - 'get_feature_permission',)}) + 'get_feature_permission', + 'network_list')}) def test_router_create_post_mode_server_default(self): router = self.routers.first() api.neutron.get_feature_permission(IsA(http.HttpRequest), @@ -286,6 +290,8 @@ class RouterActionTests(RouterMixin, test.TestCase): api.neutron.get_feature_permission(IsA(http.HttpRequest), "l3-ha", "create")\ .AndReturn(True) + api.neutron.network_list(IsA(http.HttpRequest))\ + .AndReturn(self.networks.list()) params = {'name': router.name, 'admin_state_up': str(router.admin_state_up)} api.neutron.router_create(IsA(http.HttpRequest), **params)\ @@ -303,7 +309,8 @@ class RouterActionTests(RouterMixin, test.TestCase): self.assertRedirectsNoFollow(res, self.INDEX_URL) @test.create_stubs({api.neutron: ('router_create', - 'get_feature_permission',)}) + 'get_feature_permission', + 'network_list')}) def test_dvr_ha_router_create_post(self): router = self.routers.first() api.neutron.get_feature_permission(IsA(http.HttpRequest), @@ -312,6 +319,8 @@ class RouterActionTests(RouterMixin, test.TestCase): api.neutron.get_feature_permission(IsA(http.HttpRequest), "l3-ha", "create")\ .MultipleTimes().AndReturn(True) + api.neutron.network_list(IsA(http.HttpRequest))\ + .AndReturn(self.networks.list()) param = {'name': router.name, 'distributed': True, 'ha': True, @@ -331,7 +340,8 @@ class RouterActionTests(RouterMixin, test.TestCase): self.assertRedirectsNoFollow(res, self.INDEX_URL) @test.create_stubs({api.neutron: ('router_create', - 'get_feature_permission',)}) + 'get_feature_permission', + 'network_list')}) def test_router_create_post_exception_error_case_409(self): router = self.routers.first() api.neutron.get_feature_permission(IsA(http.HttpRequest), @@ -341,6 +351,8 @@ class RouterActionTests(RouterMixin, test.TestCase): "l3-ha", "create")\ .AndReturn(False) self.exceptions.neutron.status_code = 409 + api.neutron.network_list(IsA(http.HttpRequest))\ + .MultipleTimes().AndReturn(self.networks.list()) params = {'name': router.name, 'admin_state_up': str(router.admin_state_up)} api.neutron.router_create(IsA(http.HttpRequest), **params)\ @@ -356,7 +368,8 @@ class RouterActionTests(RouterMixin, test.TestCase): self.assertRedirectsNoFollow(res, self.INDEX_URL) @test.create_stubs({api.neutron: ('router_create', - 'get_feature_permission',)}) + 'get_feature_permission', + 'network_list')}) def test_router_create_post_exception_error_case_non_409(self): router = self.routers.first() api.neutron.get_feature_permission(IsA(http.HttpRequest), @@ -366,6 +379,8 @@ class RouterActionTests(RouterMixin, test.TestCase): "l3-ha", "create")\ .MultipleTimes().AndReturn(False) self.exceptions.neutron.status_code = 999 + api.neutron.network_list(IsA(http.HttpRequest))\ + .MultipleTimes().AndReturn(self.networks.list()) params = {'name': router.name, 'admin_state_up': str(router.admin_state_up)} api.neutron.router_create(IsA(http.HttpRequest), **params)\ diff --git a/openstack_dashboard/dashboards/project/stacks/tests.py b/openstack_dashboard/dashboards/project/stacks/tests.py index a8168772c5..4ecfc39ed0 100644 --- a/openstack_dashboard/dashboards/project/stacks/tests.py +++ b/openstack_dashboard/dashboards/project/stacks/tests.py @@ -27,6 +27,7 @@ from heatclient.common import template_format as hc_format from openstack_dashboard import api from openstack_dashboard.test import helpers as test +from openstack_dashboard.dashboards.project.stacks import api as project_api from openstack_dashboard.dashboards.project.stacks import forms from openstack_dashboard.dashboards.project.stacks import mappings from openstack_dashboard.dashboards.project.stacks import tables @@ -803,7 +804,8 @@ class StackTests(test.TestCase): self.assertEqual(res.context['stack_preview']['stack_name'], stack.stack_name) - @test.create_stubs({api.heat: ('stack_get', 'template_get')}) + @test.create_stubs({api.heat: ('stack_get', 'template_get', + 'resources_list')}) def test_detail_stack_topology(self): stack = self.stacks.first() template = self.stack_templates.first() @@ -811,6 +813,8 @@ class StackTests(test.TestCase): .MultipleTimes().AndReturn(stack) api.heat.template_get(IsA(http.HttpRequest), stack.id) \ .AndReturn(json.loads(template.validate)) + api.heat.resources_list(IsA(http.HttpRequest), stack.stack_name) \ + .AndReturn([]) self.mox.ReplayAll() url = '?'.join([reverse(DETAIL_URL, args=[stack.id]), @@ -825,7 +829,8 @@ class StackTests(test.TestCase): self.assertIn('stack-green.svg', d3_data) self.assertIn('Create Complete', d3_data) - @test.create_stubs({api.heat: ('stack_get', 'template_get')}) + @test.create_stubs({api.heat: ('stack_get', 'template_get'), + project_api: ('d3_data',)}) def test_detail_stack_overview(self): stack = self.stacks.first() template = self.stack_templates.first() @@ -833,6 +838,8 @@ class StackTests(test.TestCase): .MultipleTimes().AndReturn(stack) api.heat.template_get(IsA(http.HttpRequest), stack.id) \ .AndReturn(json.loads(template.validate)) + project_api.d3_data(IsA(http.HttpRequest), stack_id=stack.id) \ + .AndReturn(json.dumps({"nodes": [], "stack": {}})) self.mox.ReplayAll() url = '?'.join([reverse(DETAIL_URL, args=[stack.id]), @@ -844,7 +851,8 @@ class StackTests(test.TestCase): 'project/stacks/_detail_overview.html') self.assertEqual(stack.stack_name, overview_data.stack_name) - @test.create_stubs({api.heat: ('stack_get', 'template_get')}) + @test.create_stubs({api.heat: ('stack_get', 'template_get'), + project_api: ('d3_data',)}) def test_detail_stack_resources(self): stack = self.stacks.first() template = self.stack_templates.first() @@ -852,6 +860,8 @@ class StackTests(test.TestCase): .MultipleTimes().AndReturn(stack) api.heat.template_get(IsA(http.HttpRequest), stack.id) \ .AndReturn(json.loads(template.validate)) + project_api.d3_data(IsA(http.HttpRequest), stack_id=stack.id) \ + .AndReturn(json.dumps({"nodes": [], "stack": {}})) self.mox.ReplayAll() url = '?'.join([reverse(DETAIL_URL, args=[stack.id]), diff --git a/openstack_dashboard/test/helpers.py b/openstack_dashboard/test/helpers.py index 2336bfdaea..8c7d6cba4a 100644 --- a/openstack_dashboard/test/helpers.py +++ b/openstack_dashboard/test/helpers.py @@ -20,6 +20,7 @@ import collections import copy from functools import wraps # noqa import os +import traceback import unittest import django @@ -35,7 +36,6 @@ from ceilometerclient.v2 import client as ceilometer_client from cinderclient import client as cinder_client import glanceclient from heatclient import client as heat_client -import httplib2 from importlib import import_module from keystoneclient.v2_0 import client as keystone_client import mock @@ -44,6 +44,7 @@ from neutronclient.v2_0 import client as neutron_client from novaclient.v2 import client as nova_client from openstack_auth import user from openstack_auth import utils +from requests.packages.urllib3.connection import HTTPConnection import six from six import moves from swiftclient import client as swift_client @@ -151,14 +152,21 @@ class TestCase(horizon_helpers.TestCase): * The ability to override specific time data controls for easier testing. * Several handy additional assertion methods. """ - def setUp(self): - def fake_conn_request(*args, **kwargs): - raise Exception("An external URI request tried to escape through " - "an httplib2 client. Args: %s, kwargs: %s" - % (args, kwargs)) - self._real_conn_request = httplib2.Http._conn_request - httplib2.Http._conn_request = fake_conn_request + # To force test failures when unmocked API calls are attempted, provide + # boolean variable to store failures + missing_mocks = False + + def fake_conn_request(self): + # print a stacktrace to illustrate where the unmocked API call + # is being made from + traceback.print_stack() + # forcing a test failure for missing mock + self.missing_mocks = True + + def setUp(self): + self._real_conn_request = HTTPConnection.connect + HTTPConnection.connect = self.fake_conn_request self._real_context_processor = context_processors.openstack context_processors.openstack = lambda request: self.context @@ -202,12 +210,16 @@ class TestCase(horizon_helpers.TestCase): self.patchers['aggregates'].start() def tearDown(self): - httplib2.Http._conn_request = self._real_conn_request + HTTPConnection.connect = self._real_conn_request context_processors.openstack = self._real_context_processor utils.get_user = self._real_get_user mock.patch.stopall() super(TestCase, self).tearDown() + # cause a test failure if an unmocked API call was attempted + if self.missing_mocks: + raise AssertionError("An unmocked API call was made.") + def setActiveUser(self, id=None, token=None, username=None, tenant_id=None, service_catalog=None, tenant_name=None, roles=None, authorized_tenants=None, enabled=True, domain_id=None, diff --git a/requirements.txt b/requirements.txt index 13fd580072..9f8849a711 100644 --- a/requirements.txt +++ b/requirements.txt @@ -16,7 +16,6 @@ django-babel>=0.4.0 # BSD django-compressor>=2.0 # MIT django-openstack-auth>=2.2.0 # Apache-2.0 django-pyscss>=2.0.2 # BSD License (2 clause) -httplib2>=0.7.5 # MIT iso8601>=0.1.11 # MIT netaddr!=0.7.16,>=0.7.12 # BSD oslo.concurrency>=3.5.0 # Apache-2.0 diff --git a/test-requirements.txt b/test-requirements.txt index d38a32d54f..05a983576c 100644 --- a/test-requirements.txt +++ b/test-requirements.txt @@ -21,6 +21,7 @@ nosexcover # BSD openstack.nose-plugin>=0.7 # Apache-2.0 oslosphinx!=3.4.0,>=2.5.0 # Apache-2.0 reno>=1.6.2 # Apache2 +requests>=2.8.1,!=2.9.0 # Apache-2.0 selenium>=2.50.1 # Apache-2.0 sphinx!=1.2.0,!=1.3b1,<1.3,>=1.1.2 # BSD testtools>=1.4.0 # MIT