Merge "added detail page for keypair"
This commit is contained in:
commit
52d5673e36
|
@ -542,6 +542,10 @@ def keypair_list(request):
|
|||
return novaclient(request).keypairs.list()
|
||||
|
||||
|
||||
def keypair_get(request, keypair_id):
|
||||
return novaclient(request).keypairs.get(keypair_id)
|
||||
|
||||
|
||||
def server_create(request, name, image, flavor, key_name, user_data,
|
||||
security_groups, block_device_mapping=None,
|
||||
block_device_mapping_v2=None, nics=None,
|
||||
|
|
|
@ -79,7 +79,10 @@ class CreateKeyPair(tables.LinkAction):
|
|||
|
||||
|
||||
class KeypairsTable(tables.DataTable):
|
||||
name = tables.Column("name", verbose_name=_("Key Pair Name"))
|
||||
detail_link = "horizon:project:access_and_security:keypairs:detail"
|
||||
|
||||
name = tables.Column("name", verbose_name=_("Key Pair Name"),
|
||||
link=detail_link)
|
||||
fingerprint = tables.Column("fingerprint", verbose_name=_("Fingerprint"))
|
||||
|
||||
def get_object_id(self, keypair):
|
||||
|
|
|
@ -100,6 +100,23 @@ class KeyPairViewTests(test.TestCase):
|
|||
|
||||
self.assertTrue(res.has_header('content-disposition'))
|
||||
|
||||
def test_keypair_detail_get(self):
|
||||
keypair = self.keypairs.first()
|
||||
keypair.private_key = "secrete"
|
||||
|
||||
self.mox.StubOutWithMock(api.nova, 'keypair_get')
|
||||
api.nova.keypair_get(IsA(http.HttpRequest),
|
||||
keypair.name).AndReturn(keypair)
|
||||
self.mox.ReplayAll()
|
||||
|
||||
context = {'keypair_name': keypair.name}
|
||||
url = reverse('horizon:project:access_and_security:keypairs:detail',
|
||||
kwargs={'keypair_name': keypair.name})
|
||||
res = self.client.get(url, context)
|
||||
|
||||
self.assertContains(res, "<h1>Key Pair Details</h1>", 1, 200)
|
||||
self.assertContains(res, "<dd>%s</dd>" % keypair.name, 2, 200)
|
||||
|
||||
@test.create_stubs({api.nova: ("keypair_create", "keypair_delete")})
|
||||
def test_regenerate_keypair_get(self):
|
||||
keypair = self.keypairs.first()
|
||||
|
|
|
@ -33,4 +33,6 @@ urlpatterns = patterns(
|
|||
name='generate'),
|
||||
url(r'^(?P<keypair_name>[^/]+)/(?P<optional>[^/]+)/generate/$',
|
||||
views.GenerateView.as_view(), name='generate'),
|
||||
url(r'^(?P<keypair_name>[^/]+)/$', views.DetailView.as_view(),
|
||||
name='detail'),
|
||||
)
|
||||
|
|
|
@ -29,6 +29,7 @@ from django.views.generic import View # noqa
|
|||
|
||||
from horizon import exceptions
|
||||
from horizon import forms
|
||||
from horizon.utils import memoized
|
||||
|
||||
from openstack_dashboard import api
|
||||
|
||||
|
@ -55,6 +56,30 @@ class ImportView(forms.ModalFormView):
|
|||
return keypair.name
|
||||
|
||||
|
||||
class DetailView(TemplateView):
|
||||
template_name = 'project/access_and_security/keypairs/detail.html'
|
||||
|
||||
@memoized.memoized_method
|
||||
def _get_data(self):
|
||||
try:
|
||||
keypair = api.nova.keypair_get(self.request,
|
||||
self.kwargs['keypair_name'])
|
||||
except Exception:
|
||||
redirect = reverse('horizon:project:access_and_security:index')
|
||||
msg = _('Unable to retrieve details for keypair "%s".')\
|
||||
% (self.kwargs['keypair_name'])
|
||||
exceptions.handle(self.request, msg,
|
||||
redirect=redirect)
|
||||
return keypair
|
||||
|
||||
def get_context_data(self, **kwargs):
|
||||
"""Gets the context data for keypair."""
|
||||
context = super(DetailView, self).get_context_data(**kwargs)
|
||||
context['page_title'] = _("Key Pair Details")
|
||||
context['keypair'] = self._get_data()
|
||||
return context
|
||||
|
||||
|
||||
class DownloadView(TemplateView):
|
||||
def get_context_data(self, keypair_name=None):
|
||||
return {'keypair_name': keypair_name}
|
||||
|
|
|
@ -0,0 +1,34 @@
|
|||
{% extends 'base.html' %}
|
||||
{% load i18n sizeformat %}
|
||||
|
||||
{% block title %}{% trans "Key Pair Details" %}{% endblock %}
|
||||
{% block page_header %}
|
||||
{% include "horizon/common/_page_header.html" with title=page_title %}
|
||||
{% endblock page_header %}
|
||||
|
||||
{% block main %}
|
||||
<div class="row-fluid">
|
||||
<div class="info detail col-sm-12">
|
||||
<h4>{% trans "Information" %}</h4>
|
||||
<hr class="header_rule">
|
||||
<dl class="dl-horizontal">
|
||||
<dt>{% trans "Name" %}</dt>
|
||||
<dd>{{ keypair.name|default:_("None") }}</dd>
|
||||
<dt>{% trans "ID" %}</dt>
|
||||
<dd>{{ keypair.id|default:_("None") }}</dd>
|
||||
<dt>{% trans "Fingerprint" %}</dt>
|
||||
<dd>{{ keypair.fingerprint|default:_("None") }}</dd>
|
||||
<dt>{% trans "Created" %}</dt>
|
||||
<dd>{{ keypair.created_at|parse_isotime}}</dd>
|
||||
{% if keypair.updated_at %}
|
||||
<dt>{% trans "Updated" %}
|
||||
<dd>{{ keypair.updated_at|parse_isotime}}</dd>
|
||||
{% endif %}
|
||||
<dt>{% trans "User ID" %}</dt>
|
||||
<dd>{{ keypair.user_id|default:_("None") }}</dd>
|
||||
<dt>{% trans "Public Key" %}</dt>
|
||||
<dd><textarea class="key_text">{{ keypair.public_key|default:_("None") }}</textarea></dd>
|
||||
</dl>
|
||||
</div>
|
||||
</div>
|
||||
{% endblock %}
|
|
@ -1884,3 +1884,11 @@ a:hover.link-popover { text-decoration: none; }
|
|||
input::-ms-clear, input::-ms-reveal{
|
||||
display: none;
|
||||
}
|
||||
|
||||
/* public key text area */
|
||||
textarea.key_text {
|
||||
width: 55em;
|
||||
height: 11em;
|
||||
resize: none;
|
||||
border: none;
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue