Merge branch 'master' of github.com:cloudbuilders/openstack-dashboard
This commit is contained in:
commit
9d67a05d2b
@ -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)
|
||||
|
||||
|
@ -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')
|
||||
|
||||
|
||||
|
||||
|
@ -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': []}
|
||||
|
@ -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',
|
||||
|
@ -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(),
|
||||
|
@ -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))
|
||||
|
@ -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')
|
||||
|
@ -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))
|
||||
|
@ -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.'
|
||||
|
@ -1,8 +1,9 @@
|
||||
<form id="form_add_tenant_user{{user.id}}" method="post">
|
||||
<form id="form_add_tenant_user{{user}}" method="post">
|
||||
{% csrf_token %}
|
||||
{% for hidden in form.hidden_fields %}
|
||||
{{hidden}}
|
||||
{% endfor %}
|
||||
<input name="user" type="hidden" value="{{user.id}}" />
|
||||
<input id="add_tenant_user_{{user.id}}" class="add" ttle="User: {{user.id}}" type="submit" value="Delete" />
|
||||
<input name="user" type="hidden" value="{{user}}" />
|
||||
<input name="tenant" type="hidden" value="{{tenant_id}}" />
|
||||
<input id="add_tenant_user_{{user}}" class="add" ttle="User: {{user}}" type="submit" value="Add" />
|
||||
</form>
|
||||
|
10
openstack-dashboard/dashboard/templates/_instance_form.html
Normal file
10
openstack-dashboard/dashboard/templates/_instance_form.html
Normal file
@ -0,0 +1,10 @@
|
||||
<form id="tenant_form" method="post">
|
||||
{% csrf_token %}
|
||||
{% for hidden in form.hidden_fields %}{{ hidden }}{% endfor %}
|
||||
{% for field in form.visible_fields %}
|
||||
{{ field.label_tag }}
|
||||
{{ field.errors }}
|
||||
{{ field }}
|
||||
{% endfor %}
|
||||
<input type="submit" value="Update Instance" class="large-rounded" />
|
||||
</form>
|
@ -40,6 +40,7 @@
|
||||
<li>{% include "_reboot.html" with form=reboot_form %}</li>
|
||||
<li><a target="_blank" href="{% url dash_instances_console request.user.tenant instance.id %}">Log</a></li>
|
||||
<li><a target="_blank" href="{% url dash_instances_vnc request.user.tenant instance.id %}">VNC Console</a></li>
|
||||
<li><a href="{% url dash_instances_update request.user.tenant instance.id %}">Edit</a></li>
|
||||
</ul>
|
||||
</td>
|
||||
</tr>
|
||||
|
@ -0,0 +1,36 @@
|
||||
{% extends 'dash_base.html' %}
|
||||
|
||||
{% block sidebar %}
|
||||
{% with current_sidebar="instances" %}
|
||||
{{block.super}}
|
||||
{% endwith %}
|
||||
{% endblock %}
|
||||
|
||||
{% block main %}
|
||||
<div id='page_header'>
|
||||
<h2><span>Compute:</span> Update Instance </h2>
|
||||
<!--
|
||||
<p class='desc'><span>—</span>Update Instance</p>
|
||||
-->
|
||||
</div>
|
||||
|
||||
{% include "_messages.html" %}
|
||||
|
||||
<div class="main_content">
|
||||
<div class="dash_block wide form">
|
||||
<div class='title_block'>
|
||||
<h3>Update Instance</h3>
|
||||
</div>
|
||||
<div class="left">
|
||||
{% include '_instance_form.html' with form=form %}
|
||||
<h3><a href="{% url dash_instances request.user.tenant %}"><< Return to Instances List</a></h3>
|
||||
</div>
|
||||
|
||||
<div class="right">
|
||||
<h3>Description:</h3>
|
||||
<p>Update the name and description of your instance</p>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
{% endblock %}
|
||||
|
@ -39,7 +39,7 @@
|
||||
<div class="usage_block">
|
||||
<h3>RAM</h3>
|
||||
<ul>
|
||||
<li><span class="quantity">{{usage.total_active_ram_size}}</span><span class="unit">GB</span> Active</li>
|
||||
<li><span class="quantity">{{usage.total_active_ram_size}}</span><span class="unit">MB</span> Active</li>
|
||||
</ul>
|
||||
</div>
|
||||
|
||||
|
@ -57,5 +57,26 @@
|
||||
<p>There are currently no users for this tenant</p>
|
||||
</div>
|
||||
{% endif %}
|
||||
{% if new_users %}
|
||||
<h3>Add new users</h3>
|
||||
<table class="wide">
|
||||
<tr id='headings'>
|
||||
<th>Name</th>
|
||||
<th>Actions</th>
|
||||
</tr>
|
||||
<tbody class='main'>
|
||||
{% for user in new_users %}
|
||||
<tr class="{% cycle 'odd' 'even' %}">
|
||||
<td>{{user}}</td>
|
||||
<td id="actions">
|
||||
<ul>
|
||||
<li>{% include "_add_tenant_user.html" with form=add_user_form %}</li>
|
||||
</ul>
|
||||
</td>
|
||||
</tr>
|
||||
{% endfor %}
|
||||
</tbody>
|
||||
</table>
|
||||
{% endif %}
|
||||
</div>
|
||||
{% endblock %}
|
||||
|
@ -23,6 +23,7 @@ CACHE_BACKEND = 'dummy://'
|
||||
|
||||
OPENSTACK_ADMIN_TOKEN = "999888777666"
|
||||
OPENSTACK_KEYSTONE_URL = "http://localhost:8080/v2.0/"
|
||||
OPENSTACK_KEYSTONE_DEFAULT_ROLE = "Member"
|
||||
|
||||
# If you have external monitoring links
|
||||
EXTERNAL_MONITORING = [
|
||||
|
Loading…
x
Reference in New Issue
Block a user