adding instance detail to syspanel
This commit is contained in:
@@ -33,6 +33,7 @@ urlpatterns = patterns('django_openstack.syspanel.views.instances',
|
|||||||
name='syspanel_tenant_usage'),
|
name='syspanel_tenant_usage'),
|
||||||
url(r'^instances/$', 'index', name='syspanel_instances'),
|
url(r'^instances/$', 'index', name='syspanel_instances'),
|
||||||
url(r'^instances/refresh$', 'refresh', name='syspanel_instances_refresh'),
|
url(r'^instances/refresh$', 'refresh', name='syspanel_instances_refresh'),
|
||||||
|
url(INSTANCES % 'detail', 'detail', name='syspanel_instances_detail'),
|
||||||
# NOTE(termie): currently just using the 'dash' versions
|
# NOTE(termie): currently just using the 'dash' versions
|
||||||
#url(INSTANCES % 'console', 'console', name='syspanel_instances_console'),
|
#url(INSTANCES % 'console', 'console', name='syspanel_instances_console'),
|
||||||
#url(INSTANCES % 'vnc', 'vnc', name='syspanel_instances_vnc'),
|
#url(INSTANCES % 'vnc', 'vnc', name='syspanel_instances_vnc'),
|
||||||
|
|||||||
@@ -22,7 +22,7 @@ from django import template
|
|||||||
from django import http
|
from django import http
|
||||||
from django.conf import settings
|
from django.conf import settings
|
||||||
from django.contrib.auth.decorators import login_required
|
from django.contrib.auth.decorators import login_required
|
||||||
from django.shortcuts import render_to_response
|
from django.shortcuts import render_to_response, redirect
|
||||||
from django.utils.translation import ugettext as _
|
from django.utils.translation import ugettext as _
|
||||||
|
|
||||||
import datetime
|
import datetime
|
||||||
@@ -229,3 +229,33 @@ def refresh(request):
|
|||||||
'terminate_form': terminate_form,
|
'terminate_form': terminate_form,
|
||||||
'reboot_form': reboot_form,
|
'reboot_form': reboot_form,
|
||||||
}, context_instance=template.RequestContext(request))
|
}, context_instance=template.RequestContext(request))
|
||||||
|
|
||||||
|
|
||||||
|
@login_required
|
||||||
|
def detail(request, instance_id):
|
||||||
|
try:
|
||||||
|
instance = api.server_get(request, instance_id)
|
||||||
|
try:
|
||||||
|
console = api.console_create(request, instance_id, 'vnc')
|
||||||
|
vnc_url = "%s&title=%s(%s)" % (console.output,
|
||||||
|
instance.name,
|
||||||
|
instance_id)
|
||||||
|
except api_exceptions.ApiException, e:
|
||||||
|
LOG.exception('ApiException while fetching instance vnc \
|
||||||
|
connection')
|
||||||
|
messages.error(request,
|
||||||
|
'Unable to get vnc console for instance %s: %s' %
|
||||||
|
(instance_id, e.message))
|
||||||
|
return redirect('dash_instances', tenant_id)
|
||||||
|
except api_exceptions.ApiException, e:
|
||||||
|
LOG.exception('ApiException while fetching instance info')
|
||||||
|
messages.error(request,
|
||||||
|
'Unable to get information for instance %s: %s' %
|
||||||
|
(instance_id, e.message))
|
||||||
|
return redirect('dash_instances', tenant_id)
|
||||||
|
|
||||||
|
return render_to_response(
|
||||||
|
'django_openstack/syspanel/instances/detail.html', {
|
||||||
|
'instance': instance,
|
||||||
|
'vnc_url': vnc_url,
|
||||||
|
}, context_instance=template.RequestContext(request))
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
{% load parse_date %}
|
{% load parse_date %}
|
||||||
<table id="instances" class="wide">
|
<table id="instances" class="wide">
|
||||||
<tr>
|
<tr>
|
||||||
<th>Id</th>
|
<th>Name</th>
|
||||||
<th>Tenant</th>
|
<th>Tenant</th>
|
||||||
<th>User</th>
|
<th>User</th>
|
||||||
<th>Host</th>
|
<th>Host</th>
|
||||||
@@ -13,7 +13,7 @@
|
|||||||
</tr>
|
</tr>
|
||||||
{% for instance in instances %}
|
{% for instance in instances %}
|
||||||
<tr id="{{instance.id}}" class="{% cycle "odd" "even" %}">
|
<tr id="{{instance.id}}" class="{% cycle "odd" "even" %}">
|
||||||
<td>{{instance.id}}</td>
|
<td><a href="{% url syspanel_instances_detail instance.id %}">{{instance.name}} <small>(id: {{instance.id}})</small></a></td>
|
||||||
<td>{{instance.attrs.tenant_id}}</td>
|
<td>{{instance.attrs.tenant_id}}</td>
|
||||||
<td>{{instance.attrs.user_id}}</td>
|
<td>{{instance.attrs.user_id}}</td>
|
||||||
<td class="name">{{instance.attrs.host}}</td>
|
<td class="name">{{instance.attrs.host}}</td>
|
||||||
|
|||||||
@@ -0,0 +1,104 @@
|
|||||||
|
{% extends 'django_openstack/syspanel/base.html' %}
|
||||||
|
|
||||||
|
{% block sidebar %}
|
||||||
|
{% with current_sidebar="instances" %}
|
||||||
|
{{block.super}}
|
||||||
|
{% endwith %}
|
||||||
|
{% endblock %}
|
||||||
|
|
||||||
|
{% block page_header %}
|
||||||
|
{# to make searchable false, just remove it from the include statement #}
|
||||||
|
{% include "django_openstack/common/_page_header.html" with title="Instance Detail" %}
|
||||||
|
{% endblock page_header %}
|
||||||
|
|
||||||
|
{% block syspanel_main %}
|
||||||
|
<ul id="instance_tabs">
|
||||||
|
<li class="active"><a class="overview" href="#">Overview</a></li>
|
||||||
|
<li><a class="log" href="#">Log</a></li>
|
||||||
|
<li><a class="vnc" href="#">VNC</a></li>
|
||||||
|
</ul>
|
||||||
|
|
||||||
|
<div class="dash_block">
|
||||||
|
<div id="overview" class="tab_wrapper">
|
||||||
|
<ul>
|
||||||
|
<li>
|
||||||
|
<div class="status">
|
||||||
|
<h4>Status</h4>
|
||||||
|
<ul>
|
||||||
|
<li><span>Status:</span> {{instance.status}}</li>
|
||||||
|
<li><span>Instance Name:</span> {{instance.name}}</li>
|
||||||
|
<li><span>Instance ID:</span> {{instance.id}}</li>
|
||||||
|
</ul>
|
||||||
|
</div>
|
||||||
|
</li>
|
||||||
|
|
||||||
|
<li>
|
||||||
|
<div class="specs">
|
||||||
|
<h4>Specs</h4>
|
||||||
|
<ul>
|
||||||
|
<li><span>RAM:</span> {{instance.attrs.memory_mb}} MB</li>
|
||||||
|
<li><span>VCPUs:</span> {{instance.attrs.vcpus}} VCPU</li>
|
||||||
|
<li><span>Disk:</span> {{instance.attrs.disk_gb}}GB Disk</li>
|
||||||
|
</ul>
|
||||||
|
</div>
|
||||||
|
</li>
|
||||||
|
|
||||||
|
<li>
|
||||||
|
<div class="meta">
|
||||||
|
<h4>Meta</h4>
|
||||||
|
<ul>
|
||||||
|
<li><span>Key name:</span> {{instance.attrs.key_name}}</li>
|
||||||
|
<li><span>Security Group(s):</span> {% for group in instance.attrs.security_groups %}{{group}}, {% endfor %}</li>
|
||||||
|
<li><span>Image Name:</span> {{instance.image_name}}</li>
|
||||||
|
</ul>
|
||||||
|
</div>
|
||||||
|
</li>
|
||||||
|
</ul>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div id="log" class="tab_wrapper">
|
||||||
|
<a class="view_full" target="_blank" href="{% url dash_instances_console request.user.tenant_id instance.id %}">View Full Log</a>
|
||||||
|
<pre class="logs"></pre>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div id="vnc" class="tab_wrapper">
|
||||||
|
<iframe src="{{vnc_url}}" width="720" height="420"></iframe>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
</div>
|
||||||
|
{% endblock %}
|
||||||
|
|
||||||
|
{% block footer_js %}
|
||||||
|
<script type="text/javascript" charset="utf-8">
|
||||||
|
$(function(){
|
||||||
|
$(".dash_block div.tab_wrapper").hide()
|
||||||
|
$(".dash_block div.tab_wrapper:first").show()
|
||||||
|
|
||||||
|
$("#instance_tabs a").click(function(e){
|
||||||
|
e.preventDefault();
|
||||||
|
e.stopPropagation()
|
||||||
|
$(".dash_block div.tab_wrapper").hide('fast')
|
||||||
|
$(".dash_block div#"+$(this).attr('class')).show('fast')
|
||||||
|
|
||||||
|
$("#instance_tabs li").removeClass('active')
|
||||||
|
$(this).parent().toggleClass('active')
|
||||||
|
})
|
||||||
|
|
||||||
|
$('a.log').click(function(){
|
||||||
|
getlog();
|
||||||
|
})
|
||||||
|
|
||||||
|
setInterval(function(){
|
||||||
|
if ($("a.log").parent().hasClass('active')) {
|
||||||
|
getlog();
|
||||||
|
};
|
||||||
|
}, 3000)
|
||||||
|
})
|
||||||
|
|
||||||
|
function getlog(){
|
||||||
|
$.get("{% url dash_instances_console request.user.tenant_id instance.id %}", function(data){
|
||||||
|
$("#log .logs").html(data)
|
||||||
|
})
|
||||||
|
}
|
||||||
|
</script>
|
||||||
|
{% endblock footer_js %}
|
||||||
Reference in New Issue
Block a user