Merge branch 'master' of github.com:cloudbuilders/openstack-dashboard

This commit is contained in:
Jake Dahn
2011-07-09 01:11:48 -07:00
16 changed files with 187 additions and 21 deletions

View File

@@ -131,7 +131,7 @@ def server_delete(request, instance):
def server_get(request, instance_id):
return compute_api(request).servers.get(instance_id)
return extras_api(request).servers.get(instance_id)
def server_list(request):
@@ -143,6 +143,12 @@ def server_reboot(request, instance_id, hardness=openstack.compute.servers.REBOO
return server.reboot(hardness)
def server_update(request, instance_id, name, description):
return extras_api(request).servers.update(instance_id,
name=name,
description=description)
def service_get(request, name):
return admin_api(request).services.get(name)

View File

@@ -35,6 +35,9 @@ class Login(forms.SelfHandlingForm):
except api_exceptions.Unauthorized as e:
messages.error(request, 'Error authenticating: %s' % e.message)
except api_exceptions.ApiException as e:
messages.error(request, 'Error authenticating with keystone: %s' %
e.message)
def login(request):
@@ -68,6 +71,3 @@ def switch_tenants(request, tenant_id):
def logout(request):
request.session.clear()
return shortcuts.redirect('splash')

View File

@@ -1,8 +1,15 @@
from django_openstack import api
from django.contrib import messages
from openstackx.api import exceptions as api_exceptions
def tenants(request):
if not request.user or not request.user.is_authenticated():
return {}
return {'tenants': api.token_list_tenants(request, request.user.token)}
try:
return {'tenants': api.token_list_tenants(request, request.user.token)}
except api_exceptions.BadRequest, e:
messages.error(request, "Unable to retrieve tenant list from\
keystone: %s" % e.message)
return {'tenants': []}

View File

@@ -13,6 +13,7 @@ urlpatterns = patterns('django_openstack.dash.views.instances',
url(r'^(?P<tenant_id>[^/]+)/instances/refresh$', 'refresh', name='dash_instances_refresh'),
url(INSTANCES % 'console', 'console', name='dash_instances_console'),
url(INSTANCES % 'vnc', 'vnc', name='dash_instances_vnc'),
url(INSTANCES % 'update', 'update', name='dash_instances_update'),
)
urlpatterns += patterns('django_openstack.dash.views.images',

View File

@@ -114,7 +114,14 @@ class LaunchForm(forms.SelfHandlingForm):
@login_required
def index(request, tenant_id):
tenant = api.token_get_tenant(request, request.user.tenant)
tenant = {}
try:
tenant = api.token_get_tenant(request, request.user.tenant)
except api_exceptions.ApiException, e:
messages.error(request, "Unable to retrienve tenant info\
from keystone: %s" % e.message)
all_images = []
try:
all_images = api.image_list_detailed(request)
@@ -166,8 +173,19 @@ def launch(request, tenant_id, image_id):
except:
return []
image = api.image_get(request, image_id)
tenant = api.token_get_tenant(request, request.user.tenant)
try:
image = api.image_get(request, image_id)
except Exception, e:
messages.error(request, 'Unable to retrieve image %s: %s' %
(image_id, e.message))
return redirect('dash_instances', tenant_id)
try:
tenant = api.token_get_tenant(request, request.user.tenant)
except api_exceptions.ApiException, e:
messages.error(request, 'Unable to retrieve tenant %s: %s' %
(request.user.tenant, e.message))
return redirect('dash_instances', tenant_id)
form, handled = LaunchForm.maybe_handle(
request, initial={'flavorlist': flavorlist(),

View File

@@ -74,6 +74,13 @@ class RebootInstance(forms.SelfHandlingForm):
return redirect(request.build_absolute_uri())
class UpdateInstance(forms.Form):
instance = forms.CharField(widget=forms.TextInput(
attrs={'readonly':'readonly'}))
name = forms.CharField(required=True)
description = forms.CharField(required=False)
@login_required
def index(request, tenant_id):
for f in (TerminateInstance, RebootInstance):
@@ -208,3 +215,33 @@ def vnc(request, tenant_id, instance_id):
'Unable to get vnc console for instance %s: %s' %
(instance_id, e.message))
return redirect('dash_instances', tenant_id)
@login_required
def update(request, tenant_id, instance_id):
if request.POST:
form = UpdateInstance(request.POST)
if form.is_valid():
data = form.clean()
instance_id = data['instance']
name = data['name']
description = data.get('description', '')
try:
api.server_update(request, instance_id, name, description)
messages.success(request, "Instance %s updated" % instance_id)
except api_exceptions.ApiException, e:
messages.error(request,
'Unable to update instance: %s' % e.message)
return redirect('dash_instances', tenant_id)
else:
instance = api.server_get(request, instance_id)
form = UpdateInstance(initial={'instance': instance_id,
'tenant_id': tenant_id,
'name': instance.name,
'description': instance.attrs['description']})
return render_to_response('dash_instance_update.html', {
'instance': instance,
'form': form,
}, context_instance=template.RequestContext(request))

View File

@@ -46,6 +46,10 @@ class AuthenticationMiddleware(object):
#BEWARE - had to add this exception handler
# to make token expiration work
openstackx.api.exceptions.NotFound]:
# flush other error messages, which are collateral damage
# when our token expires
for message in messages.get_messages(request):
pass
messages.error(request, 'Your token has expired.\
Please log in again')
return shortcuts.redirect('/auth/logout')

View File

@@ -27,12 +27,12 @@ class AddUser(forms.SelfHandlingForm):
def handle(self, request, data):
try:
api.account_api(request).role_refs.add_for_tenant_user(data['tenant'],
data['user'], 'Member')
data['user'], settings.OPENSTACK_KEYSTONE_DEFAULT_ROLE)
messages.success(request,
'%s was successfully removed from %s.'
'%s was successfully added to %s.'
% (data['user'], data['tenant']))
except api_exceptions.ApiException, e:
messages.error(request, 'Unable to create tenant: %s' %
messages.error(request, 'Unable to create user association: %s' %
(e.message))
return redirect('syspanel_tenants')
@@ -154,10 +154,20 @@ def users(request, tenant_id):
users = api.account_api(request).users.get_for_tenant(tenant_id).values
all_users = api.account_api(request).users.list()
new_user_ids = []
user_ids = [u['id'] for u in users]
all_user_ids = [u.id for u in all_users]
for uid in all_user_ids:
if not uid in user_ids:
new_user_ids.append(uid)
for i in user_ids:
if i in new_user_ids:
new_user_ids.remove(i)
return render_to_response(
'syspanel_tenant_users.html',{
'add_user_form': add_user_form,
'remove_user_form': remove_user_form,
'tenant_id': tenant_id,
'users': users,
'new_users': new_user_ids,
}, context_instance = template.RequestContext(request))

View File

@@ -39,9 +39,9 @@ class UserDeleteForm(forms.SelfHandlingForm):
def handle(self, request, data):
user_id = data['user']
api.user_delete(request, user_id)
messages.info(request,
'%s was successfully deleted.'
% user_id)
messages.info(request, '%s was successfully deleted.'
% user_id)
return redirect(request.build_absolute_uri())
@@ -52,7 +52,12 @@ def index(request):
if handled:
return handled
users = api.user_list(request)
users = []
try:
users = api.user_list(request)
except api_exceptions.ApiException, e:
messages.error(request, 'Unable to list users: %s' %
e.message)
user_delete_form = UserDeleteForm()
return render_to_response('syspanel_users.html',{
@@ -119,7 +124,12 @@ def update(request, user_id):
@login_required
def create(request):
tenants = api.tenant_list(request)
try:
tenants = api.tenant_list(request)
except api_exceptions.ApiException, e:
messages.error(request, 'Unable to retrieve tenant list: %s' %
e.message)
return redirect('syspanel_users')
if request.method == "POST":
form = UserForm(request.POST, tenant_list=tenants)
@@ -133,6 +143,9 @@ def create(request):
user['password'],
user['tenant_id'],
True)
api.account_api(request).role_refs.add_for_tenant_user(
user['tenant_id'], user['id'],
settings.OPENSTACK_KEYSTONE_DEFAULT_ROLE)
messages.success(request,
'%s was successfully created.'