trove-dashboard/trove_dashboard/content/databases/logs/views.py

133 lines
4.5 KiB
Python

# Copyright 2016 Tesora Inc.
#
# Licensed under the Apache License, Version 2.0 (the "License"); you may
# not use this file except in compliance with the License. You may obtain
# a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
# License for the specific language governing permissions and limitations
# under the License.
from django import http
from django import shortcuts
from django.utils.translation import ugettext_lazy as _
from django.views import generic
import six
from horizon import exceptions
from horizon import messages
from openstack_dashboard import api as dash_api
from trove_dashboard import api
FULL_LOG_VALUE = 0
DEFAULT_LINES = 50
class LogContentsView(generic.TemplateView):
template_name = 'project/databases/logs/view_log.html'
preload = False
def get_context_data(self, **kwargs):
context = super(LogContentsView, self).get_context_data(**kwargs)
context["instance_id"] = kwargs['instance_id']
context["filename"] = kwargs['filename']
context["publish"] = ''
try:
log_length = int(kwargs['lines'])
except Exception:
log_length = DEFAULT_LINES
context["log_length"] = log_length
context["log_contents"] = get_contents(self.request,
kwargs['instance_id'],
kwargs['filename'],
False,
log_length)
return context
def get_contents(request, instance_id, filename, publish, lines):
try:
log_generator = api.trove.log_tail(request,
instance_id,
filename,
publish,
lines,
dash_api.swift.swift_api(request))
data = ""
for log_part in log_generator():
data += log_part
except Exception as e:
data = _('Unable to load {0} log\n{1}').format(filename,
six.text_type(e))
return data
def build_response(request, instance_id, filename, tail):
data = (_('Unable to load {0} log for instance "{1}".')
.format(filename, instance_id))
if request.GET.get('publish'):
publish = True
else:
publish = False
try:
data = get_contents(request,
instance_id,
filename,
publish,
int(tail))
except Exception:
exceptions.handle(request, ignore=True)
return http.HttpResponse(data.encode('utf-8'), content_type='text/plain')
def console(request, instance_id, filename):
tail = request.GET.get('length')
if not tail or (tail and not tail.isdigit()):
msg = _('Log length must be a nonnegative integer.')
messages.warning(request, msg)
data = (_('Unable to load {0} log for instance "{1}".')
.format(filename, instance_id))
return http.HttpResponse(data.encode('utf-8'),
content_type='text/plain')
return build_response(request, instance_id, filename, tail)
def full_log(request, instance_id, filename):
return build_response(request, instance_id, filename, FULL_LOG_VALUE)
def download_log(request, instance_id, filename):
try:
publish_value = request.GET.get('publish')
if publish_value:
publish = True
else:
publish = False
data = get_contents(request,
instance_id,
filename,
publish,
FULL_LOG_VALUE)
response = http.HttpResponse()
response.write(data)
response['Content-Disposition'] = ('attachment; '
'filename="%s.log"' % filename)
response['Content-Length'] = str(len(response.content))
return response
except Exception as e:
messages.error(request, _('Error downloading log file: %s') % e)
return shortcuts.redirect(request.build_absolute_uri())