Skip to content

Commit

Permalink
calling nova extensions api to enable certain nova features
Browse files Browse the repository at this point in the history
Fixes: bug #1202310

Change-Id: I47365b0a89ab572f25cb71bfe17cae547261df9d
  • Loading branch information
ericpeterson-l committed Jul 30, 2013
1 parent 9bb75cf commit db9c08e
Show file tree
Hide file tree
Showing 4 changed files with 118 additions and 28 deletions.
20 changes: 20 additions & 0 deletions openstack_dashboard/api/nova.py
Expand Up @@ -28,6 +28,7 @@
from django.utils.translation import ugettext_lazy as _

from novaclient.v1_1 import client as nova_client
from novaclient.v1_1.contrib.list_extensions import ListExtManager
from novaclient.v1_1 import security_group_rules as nova_rules
from novaclient.v1_1.security_groups import SecurityGroup as NovaSecurityGroup
from novaclient.v1_1.servers import REBOOT_HARD
Expand Down Expand Up @@ -628,3 +629,22 @@ def aggregate_list(request):
result.append(novaclient(request).aggregates.get(aggregate.id))

return result


@memoized
def list_extensions(request):
return ListExtManager(novaclient(request)).show_all()


@memoized
def extension_supported(extension_name, request):
"""
this method will determine if nova supports a given extension name.
example values for the extension_name include AdminActions, ConsoleOutput,
etc.
"""
extensions = list_extensions(request)
for extension in extensions:
if extension.name == extension_name:
return True
return False
28 changes: 22 additions & 6 deletions openstack_dashboard/dashboards/admin/instances/tests.py
Expand Up @@ -27,12 +27,15 @@


class InstanceViewTest(test.BaseAdminViewTests):
@test.create_stubs({api.nova: ('flavor_list', 'server_list',),
@test.create_stubs({api.nova: ('flavor_list', 'server_list',
'extension_supported',),
api.keystone: ('tenant_list',)})
def test_index(self):
servers = self.servers.list()
flavors = self.flavors.list()
tenants = self.tenants.list()
api.nova.extension_supported('AdminActions', IsA(http.HttpRequest)) \
.MultipleTimes().AndReturn(True)
api.keystone.tenant_list(IsA(http.HttpRequest)).\
AndReturn([tenants, False])
search_opts = {'marker': None, 'paginate': True}
Expand All @@ -48,7 +51,7 @@ def test_index(self):
self.assertItemsEqual(instances, servers)

@test.create_stubs({api.nova: ('flavor_list', 'flavor_get',
'server_list',),
'server_list', 'extension_supported',),
api.keystone: ('tenant_list',)})
def test_index_flavor_list_exception(self):
servers = self.servers.list()
Expand All @@ -60,6 +63,8 @@ def test_index_flavor_list_exception(self):
api.nova.server_list(IsA(http.HttpRequest),
all_tenants=True, search_opts=search_opts) \
.AndReturn([servers, False])
api.nova.extension_supported('AdminActions', IsA(http.HttpRequest)) \
.MultipleTimes().AndReturn(True)
api.nova.flavor_list(IsA(http.HttpRequest)). \
AndRaise(self.exceptions.nova)
api.keystone.tenant_list(IsA(http.HttpRequest)).\
Expand All @@ -76,7 +81,7 @@ def test_index_flavor_list_exception(self):
self.assertItemsEqual(instances, servers)

@test.create_stubs({api.nova: ('flavor_list', 'flavor_get',
'server_list',),
'server_list', 'extension_supported', ),
api.keystone: ('tenant_list',)})
def test_index_flavor_get_exception(self):
servers = self.servers.list()
Expand All @@ -91,6 +96,8 @@ def test_index_flavor_get_exception(self):
api.nova.server_list(IsA(http.HttpRequest),
all_tenants=True, search_opts=search_opts) \
.AndReturn([servers, False])
api.nova.extension_supported('AdminActions', IsA(http.HttpRequest)) \
.MultipleTimes().AndReturn(True)
api.nova.flavor_list(IsA(http.HttpRequest)). \
AndReturn(flavors)
api.keystone.tenant_list(IsA(http.HttpRequest)).\
Expand Down Expand Up @@ -119,14 +126,17 @@ def test_index_server_list_exception(self):
self.assertTemplateUsed(res, 'admin/instances/index.html')
self.assertEqual(len(res.context['instances_table'].data), 0)

@test.create_stubs({api.nova: ('server_get', 'flavor_get',),
@test.create_stubs({api.nova: ('server_get', 'flavor_get',
'extension_supported', ),
api.keystone: ('tenant_get',)})
def test_ajax_loading_instances(self):
server = self.servers.first()
flavor = self.flavors.list()[0]
tenant = self.tenants.list()[0]

api.nova.server_get(IsA(http.HttpRequest), server.id).AndReturn(server)
api.nova.extension_supported('AdminActions', IsA(http.HttpRequest)) \
.MultipleTimes().AndReturn(True)
api.nova.flavor_get(IsA(http.HttpRequest),
server.flavor['id']).AndReturn(flavor)
api.keystone.tenant_get(IsA(http.HttpRequest),
Expand All @@ -150,7 +160,8 @@ def test_ajax_loading_instances(self):
self.assertContains(res, "Active", 1, 200)
self.assertContains(res, "Running", 1, 200)

@test.create_stubs({api.nova: ('flavor_list', 'server_list',),
@test.create_stubs({api.nova: ('flavor_list', 'server_list',
'extension_supported', ),
api.keystone: ('tenant_list',)})
def test_index_options_before_migrate(self):
api.keystone.tenant_list(IsA(http.HttpRequest)).\
Expand All @@ -159,6 +170,8 @@ def test_index_options_before_migrate(self):
api.nova.server_list(IsA(http.HttpRequest),
all_tenants=True, search_opts=search_opts) \
.AndReturn([self.servers.list(), False])
api.nova.extension_supported('AdminActions', IsA(http.HttpRequest)) \
.MultipleTimes().AndReturn(True)
api.nova.flavor_list(IsA(http.HttpRequest)).\
AndReturn(self.flavors.list())
self.mox.ReplayAll()
Expand All @@ -168,7 +181,8 @@ def test_index_options_before_migrate(self):
self.assertNotContains(res, "instances__confirm")
self.assertNotContains(res, "instances__revert")

@test.create_stubs({api.nova: ('flavor_list', 'server_list',),
@test.create_stubs({api.nova: ('flavor_list', 'server_list',
'extension_supported', ),
api.keystone: ('tenant_list',)})
def test_index_options_after_migrate(self):
servers = self.servers.list()
Expand All @@ -179,6 +193,8 @@ def test_index_options_after_migrate(self):
api.keystone.tenant_list(IsA(http.HttpRequest)) \
.AndReturn([self.tenants.list(), False])
search_opts = {'marker': None, 'paginate': True}
api.nova.extension_supported('AdminActions', IsA(http.HttpRequest)) \
.MultipleTimes().AndReturn(True)
api.nova.server_list(IsA(http.HttpRequest),
all_tenants=True, search_opts=search_opts) \
.AndReturn([self.servers.list(), False])
Expand Down
6 changes: 6 additions & 0 deletions openstack_dashboard/dashboards/project/instances/tables.py
Expand Up @@ -127,6 +127,9 @@ class TogglePause(tables.BatchAction):
classes = ("btn-pause",)

def allowed(self, request, instance=None):
if not api.nova.extension_supported('AdminActions',
request):
return False
self.paused = False
if not instance:
return self.paused
Expand Down Expand Up @@ -156,6 +159,9 @@ class ToggleSuspend(tables.BatchAction):
classes = ("btn-suspend",)

def allowed(self, request, instance=None):
if not api.nova.extension_supported('AdminActions',
request):
return False
self.suspended = False
if not instance:
self.suspended
Expand Down

0 comments on commit db9c08e

Please sign in to comment.