Merge pull request #21 from mgius/improve_logging_again_fixed

Totally out of band diff of improve_logging_again
This commit is contained in:
Devin Carlen 2011-06-28 11:40:42 -07:00
commit 23e928c1e2
15 changed files with 187 additions and 36 deletions

View File

@ -15,6 +15,9 @@ from urlparse import urlparse
import json
LOG = logging.getLogger('django_openstack.api')
def url_for(request, service_name, admin=False):
catalog = request.session['serviceCatalog']
if admin:
@ -31,10 +34,17 @@ def compute_api(request):
# this below hack is necessary to make the jacobian compute client work
compute.client.auth_token = request.session['token']
compute.client.management_url = url_for(request, 'nova')
LOG.debug('compute_api connection created using token "%s"'
' and url "%s"' %
(request.session['token'], url_for(request, 'nova')))
return compute
def account_api(request):
LOG.debug('account_api connection created using token "%s"'
' and url "%s"' %
(request.session['token'],
url_for(request, 'keystone', True)))
return openstackx.extras.Account(
auth_token=request.session['token'],
management_url=url_for(request, 'keystone', True))
@ -42,22 +52,31 @@ def account_api(request):
def glance_api(request):
o = urlparse(url_for(request, 'glance'))
LOG.debug('glance_api connection created for host "%s:%d"' %
(o.hostname, o.port))
return glance.client.Client(o.hostname, o.port)
def admin_api(request):
LOG.debug('admin_api connection created using token "%s"'
' and url "%s"' %
(request.session['token'], url_for(request, 'nova', True)))
return openstackx.admin.Admin(auth_token=request.session['token'],
management_url=url_for(request, 'nova', True))
def extras_api(request):
LOG.debug('extras_api connection created using token "%s"'
' and url "%s"' %
(request.session['token'], url_for(request, 'nova')))
return openstackx.extras.Extras(auth_token=request.session['token'],
management_url=url_for(request, 'nova'))
def auth_api():
return openstackx.auth.Auth(management_url=\
settings.OPENSTACK_KEYSTONE_URL)
LOG.debug('auth_api connection created using url "%s"' %
settings.OPENSTACK_KEYSTONE_URL)
return openstackx.auth.Auth(management_url=settings.OPENSTACK_KEYSTONE_URL)
def console_create(request, instance_id, kind=None):
@ -215,6 +234,8 @@ def token_info(request, token):
def usage_get(request, tenant_id, start, end):
LOG.debug('Usage_get for tenant "%s" from %s to %s"' %
(tenant_id, start, end))
return extras_api(request).usage.get(tenant_id, start, end)

View File

@ -12,6 +12,9 @@ from django_openstack import forms
from openstackx.api import exceptions as api_exceptions
LOG = logging.getLogger('django_openstack.auth')
class Login(forms.SelfHandlingForm):
username = forms.CharField(max_length="20", label="User Name")
password = forms.CharField(max_length="20", label="Password")
@ -28,7 +31,8 @@ class Login(forms.SelfHandlingForm):
request.session['tenant'] = info['tenant']
request.session['admin'] = info['admin']
request.session['serviceCatalog'] = token.serviceCatalog
logging.info(token.serviceCatalog)
LOG.info('Login form for user "%s". Service Catalog data:\n%s' %
(data['username'], token.serviceCatalog))
if request.session['admin']:
return shortcuts.redirect('syspanel_overview')
@ -36,7 +40,9 @@ class Login(forms.SelfHandlingForm):
return shortcuts.redirect('dash_overview')
except api_exceptions.Unauthorized as e:
messages.error(request, 'Error authenticating: %s' % e.message)
msg = 'Error authenticating: %s' % e.message
LOG.error(msg, exc_info=True)
messages.error(request, msg)
def login(request):

View File

@ -36,10 +36,11 @@ from django import shortcuts
from django_openstack import api
from django_openstack import forms
from openstackx.api import exceptions as api_exceptions
from glance import client as glance_client
from glance.common import exception as glance_exception
LOG = logging.getLogger('django_openstack.dash')
LOG = logging.getLogger('django_openstack.dash.views.images')
class LaunchForm(forms.SelfHandlingForm):
@ -76,11 +77,14 @@ class LaunchForm(forms.SelfHandlingForm):
user_data=data['user_data'],
key_name=data.get('key_name'))
messages.success(request, "Instance was successfully\
launched.")
msg = 'Instance was successfully launched'
LOG.info(msg)
messages.success(request, msg)
return shortcuts.redirect(request.build_absolute_uri())
except api_exceptions.ApiException, e:
LOG.error('ApiException while creating instances of image "%s"' %
image_id, exc_info=True)
messages.error(request,
'Unable to launch instance: %s' % e.message)
@ -93,9 +97,11 @@ def index(request, tenant_id):
all_images = api.image_list_detailed(request)
if not all_images:
messages.info(request, "There are currently no images.")
except GlanceClientConnectionError, e:
except glance_client.ClientConnectionError, e:
LOG.error("Error connecting to glance", exc_info=True)
messages.error(request, "Error connecting to glance: %s" % e.message)
except glance_exception.Error, e:
LOG.error("Error retrieving image list", exc_info=True)
messages.error(request, "Error retrieving image list: %s" % e.message)
images = []
@ -129,6 +135,8 @@ def launch(request, tenant_id, image_id):
(f.name, f.vcpus, f.disk, f.ram)) for f in fl]
return sorted(sel)
except:
LOG.error('Unable to retrieve list of instance types',
exc_info=True)
return [(1, 'm1.tiny')]
def keynamelist():
@ -137,6 +145,7 @@ def launch(request, tenant_id, image_id):
sel = [(f.key_name, f.key_name) for f in fl]
return sel
except:
LOG.error('Unable to retrieve list of keypairs', exc_info=True)
return []
image = api.image_get(request, image_id)

View File

@ -49,12 +49,15 @@ class TerminateInstance(forms.SelfHandlingForm):
try:
api.server_delete(request, instance)
except api_exceptions.ApiException, e:
LOG.error('ApiException while terminating instance "%s"' %
instance_id, exc_info=True)
messages.error(request,
'Unable to terminate %s: %s' %
(instance_id, e.message,))
else:
messages.success(request,
'Instance %s has been terminated.' % instance_id)
msg = 'Instance %s has been terminated.' % instance_id
LOG.info(msg)
messages.success(request, msg)
return redirect(request.build_absolute_uri())
@ -68,9 +71,16 @@ class RebootInstance(forms.SelfHandlingForm):
server = api.server_reboot(request, instance_id)
messages.success(request, "Instance rebooting")
except api_exceptions.ApiException, e:
LOG.error('ApiException while rebooting instance "%s"' %
instance_id, exc_info=True)
messages.error(request,
'Unable to reboot instance: %s' % e.message)
else:
msg = 'Instance %s has been rebooted.' % instance_id
LOG.info(msg)
messages.success(request, msg)
return redirect(request.build_absolute_uri())
@ -88,8 +98,10 @@ def index(request, tenant_id):
for instance in instances:
# FIXME - ported this over, but it is hacky
instance._info['attrs']['image_name'] =\
image_dict.get(int(instance.attrs['image_id']),{}).get('name')
image_dict.get(int(instance.attrs['image_id']), {}).get('name')
# TODO(markgius): Why isn't this an apiexception?
except Exception as e:
LOG.error('Exception in instance index', exc_info=True)
messages.error(request, 'Unable to get instance list: %s' % e.message)
# We don't have any way of showing errors for these, so don't bother
@ -118,6 +130,8 @@ def usage(request, tenant_id=None):
try:
usage = api.usage_get(request, tenant_id, datetime_start, datetime_end)
except api_exceptions.ApiException, e:
LOG.error('ApiException in instance usage', exc_info=True)
messages.error(request, 'Unable to get usage info: %s' % e.message)
return render_to_response('dash_usage.html', {
'usage': usage,
@ -133,6 +147,9 @@ def console(request, tenant_id, instance_id):
response.flush()
return response
except api_exceptions.ApiException, e:
LOG.error('ApiException while fetching instance console',
exc_info=True)
messages.error(request,
'Unable to get log for instance %s: %s' %
(instance_id, e.message))
@ -145,6 +162,9 @@ def vnc(request, tenant_id, instance_id):
console = api.console_create(request, instance_id, 'vnc')
return redirect(console.output)
except api_exceptions.ApiException, e:
LOG.error('ApiException while fetching instance vnc connection',
exc_info=True)
messages.error(request,
'Unable to get vnc console for instance %s: %s' %
(instance_id, e.message))

View File

@ -37,7 +37,7 @@ import openstack.compute.servers
import openstackx.api.exceptions as api_exceptions
LOG = logging.getLogger('django_openstack.dash')
LOG = logging.getLogger('django_openstack.dash.views.keypairs')
class DeleteKeypair(forms.SelfHandlingForm):
@ -45,18 +45,22 @@ class DeleteKeypair(forms.SelfHandlingForm):
def handle(self, request, data):
try:
LOG.info('Deleting keypair "%s"' % data['keypair_id'])
keypair = api.keypair_delete(request, data['keypair_id'])
messages.info(request, 'Successfully deleted keypair: %s' \
% data['keypair_id'])
except api_exceptions.ApiException, e:
LOG.error("ApiException in DeleteKeypair", exc_info=True)
messages.error(request, 'Error deleting keypair: %s' % e.message)
return shortcuts.redirect(request.build_absolute_uri())
class CreateKeypair(forms.SelfHandlingForm):
name = forms.CharField(max_length="20", label="Keypair Name")
def handle(self, request, data):
try:
LOG.info('Creating keypair "%s"' % data['name'])
keypair = api.keypair_create(request, data['name'])
response = http.HttpResponse(mimetype='application/binary')
response['Content-Disposition'] = \
@ -65,9 +69,11 @@ class CreateKeypair(forms.SelfHandlingForm):
response.write(keypair.private_key)
return response
except api_exceptions.ApiException, e:
LOG.error("ApiException in CreateKeyPair", exc_info=True)
messages.error(request, 'Error Creating Keypair: %s' % e.message)
return shortcuts.redirect(request.build_absolute_uri())
@login_required
def index(request, tenant_id):
delete_form, handled = DeleteKeypair.maybe_handle(request)
@ -78,6 +84,7 @@ def index(request, tenant_id):
keypairs = api.keypair_list(request)
except api_exceptions.ApiException, e:
keypairs = []
LOG.error("ApiException in keypair index", exc_info=True)
messages.error(request, 'Error featching keypairs: %s' % e.message)
return render_to_response('dash_keypairs.html', {
@ -85,6 +92,7 @@ def index(request, tenant_id):
'delete_form': delete_form,
}, context_instance=template.RequestContext(request))
@login_required
def create(request, tenant_id):
form, handled = CreateKeypair.maybe_handle(request)

View File

@ -14,7 +14,7 @@ from django.utils import formats
from django.forms import *
LOG = logging.getLogger('django_openstack.forms')
RE_DATE = re.compile(r'(\d{4})-(\d\d?)-(\d\d?)$')
@ -132,7 +132,6 @@ class SelfHandlingForm(Form):
kwargs['initial'] = initial
super(SelfHandlingForm, self).__init__(*args, **kwargs)
@classmethod
def maybe_handle(cls, request, *args, **kwargs):
if cls.__name__ != request.POST.get('method'):
@ -148,7 +147,7 @@ class SelfHandlingForm(Form):
return form, form.handle(request, data)
except Exception as e:
logging.exception('Error while handling form.')
LOG.error('Nonspecific error while handling form', exc_info=True)
messages.error(request, 'Unexpected error: %s' % e.message)
return form, None

View File

@ -1,5 +1,7 @@
# vim: tabstop=4 shiftwidth=4 softtabstop=4
import logging
from operator import itemgetter
from django import template
@ -15,6 +17,8 @@ from openstackx.api import exceptions as api_exceptions
from django_openstack import api
from django_openstack import forms
LOG = logging.getLogger('django_openstack.syspanel.views.flavors')
class CreateFlavor(forms.SelfHandlingForm):
flavorid = forms.CharField(max_length="10", label="Flavor ID")
@ -30,8 +34,9 @@ class CreateFlavor(forms.SelfHandlingForm):
int(data['vcpus']),
int(data['disk_gb']),
int(data['flavorid']))
messages.success(request,
'%s was successfully added to flavors.' % data['name'])
msg = '%s was successfully added to flavors.' % data['name']
LOG.info(msg)
messages.success(request, msg)
return redirect('syspanel_flavors')
@ -40,6 +45,7 @@ class DeleteFlavor(forms.SelfHandlingForm):
def handle(self, request, data):
flavor_id = data['flavorid']
LOG.info('Deleting flavor with id "%s"' % flavor_id)
api.flavor_delete(flavor_id, True)
return redirect(request.build_absolute_uri())
@ -59,6 +65,7 @@ def index(request):
try:
flavors = api.flavor_list_admin(request)
except api_exceptions.ApiException, e:
LOG.error('ApiException while fetching usage info', exc_info=True)
messages.error(request, 'Unable to get usage info: %s' % e.message)
flavors.sort(key=lambda x: x.id, reverse=True)

View File

@ -1,5 +1,7 @@
# vim: tabstop=4 shiftwidth=4 softtabstop=4
import logging
from django import template
from django import http
from django.conf import settings
@ -14,6 +16,9 @@ from django_openstack import api
from django_openstack import forms
LOG = logging.getLogger('django_openstack.sysadmin.views.images')
class DeleteImage(forms.SelfHandlingForm):
image_id = forms.CharField(required=True)
@ -22,8 +27,12 @@ class DeleteImage(forms.SelfHandlingForm):
try:
api.image_delete(request, image_id)
except GlanceClientConnectionError, e:
messages.error(request, "Error connecting to glance: %s" % e.message)
LOG.error("Error connecting to glance", exc_info=True)
messages.error(request,
"Error connecting to glance: %s" % e.message)
except glance_exception.Error, e:
LOG.error('Error deleting image with id "%s"' % image_id,
exc_info=True)
messages.error(request, "Error deleting image: %s" % e.message)
return redirect(request.build_absolute_uri())
@ -36,13 +45,16 @@ class ToggleImage(forms.SelfHandlingForm):
try:
api.image_update(request, image_id, image_meta={'is_public': False})
except GlanceClientConnectionError, e:
messages.error(request, "Error connecting to glance: %s" % e.message)
LOG.error("Error connecting to glance", exc_info=True)
messages.error(request,
"Error connecting to glance: %s" % e.message)
except glance_exception.Error, e:
LOG.error('Error updating image with id "%s"' % image_id,
exc_info=True)
messages.error(request, "Error updating image: %s" % e.message)
return redirect(request.build_absolute_uri())
@login_required
def index(request):
for f in (DeleteImage, ToggleImage):
@ -61,8 +73,10 @@ def index(request):
if not images:
messages.info(request, "There are currently no images.")
except GlanceClientConnectionError, e:
LOG.error("Error connecting to glance", exc_info=True)
messages.error(request, "Error connecting to glance: %s" % e.message)
except glance_exception.Error, e:
LOG.error("Error retrieving image list", exc_info=True)
messages.error(request, "Error retrieving image list: %s" % e.message)
return render_to_response('syspanel_images.html', {
@ -77,9 +91,13 @@ def update(request, image_id):
try:
image = api.image_get(request, image_id)
except GlanceClientConnectionError, e:
LOG.error("Error connecting to glance", exc_info=True)
messages.error(request, "Error connecting to glance: %s" % e.message)
except glance_exception.Error, e:
messages.error(request, "Error retrieving image %s: %s" % (image_id, e.message))
LOG.error('Error retrieving image with id "%s"' % image_id,
exc_info=True)
messages.error(request,
"Error retrieving image %s: %s" % (image_id, e.message))
if request.method == "POST":
form = UpdateImageForm(request.POST)
@ -104,15 +122,24 @@ def update(request, image_id):
api.image_update(request, image_id, metadata)
messages.success(request, "Image was successfully updated.")
except GlanceClientConnectionError, e:
messages.error(request, "Error connecting to glance: %s" % e.message)
LOG.error("Error connecting to glance", exc_info=True)
messages.error(request,
"Error connecting to glance: %s" % e.message)
except glance_exception.Error, e:
LOG.error('Error updating image with id "%s"' % image_id,
exc_info=True)
messages.error(request, "Error updating image: %s" % e.message)
except:
messages.error(request, "Image could not be updated, please try again.")
LOG.error('Unspecified Exception in image update',
exc_info=True)
messages.error(request,
"Image could not be updated, please try again.")
else:
messages.error(request, "Image could not be uploaded, please try agian.")
LOG.error('Image "%s" failed to update' % image['name'],
exc_info=True)
messages.error(request,
"Image could not be uploaded, please try agian.")
form = UpdateImageForm(request.POST)
return render_to_response('django_nova_syspanel/images/image_update.html',{
'image': image,
@ -139,6 +166,7 @@ def update(request, image_id):
'form': form,
}, context_instance = template.RequestContext(request))
@login_required
def upload(request):
if request.method == "POST":
@ -158,11 +186,19 @@ def upload(request):
try:
api.image_create(request, metadata, image['image_file'])
except GlanceClientConnectionError, e:
messages.error(request, "Error connecting to glance: %s" % e.message)
LOG.error('Error connecting to glance while trying to upload'
' image', exc_info=True)
messages.error(request,
"Error connecting to glance: %s" % e.message)
except glance_exception.Error, e:
LOG.error('Glance exception while uploading image',
exc_info=True)
messages.error(request, "Error adding image: %s" % e.message)
else:
messages.error(request, "Image could not be uploaded, please try agian.")
LOG.error('Image "%s" failed to upload' % image['name'],
exc_info=True)
messages.error(request,
"Image could not be uploaded, please try agian.")
form = UploadImageForm(request.POST)
return render_to_response('django_nova_syspanel/images/image_upload.html',{
'form': form,

View File

@ -21,6 +21,8 @@ from openstackx.api import exceptions as api_exceptions
TerminateInstance = dash_instances.TerminateInstance
RebootInstance = dash_instances.RebootInstance
LOG = logging.getLogger('django_openstack.syspanel.views.instances')
def _next_month(date_start):
y = date_start.year + (date_start.month + 1)/13
@ -63,7 +65,10 @@ def usage(request):
try:
service_list = api.service_list(request)
except api_exceptions.ApiException, e:
messages.error(request, 'Unable to get service info: %s' % e.message)
LOG.error('ApiException fetching service list in instance usage',
exc_info=True)
messages.error(request,
'Unable to get service info: %s' % e.message)
for service in service_list:
if service.type == 'nova-compute':
@ -73,6 +78,10 @@ def usage(request):
try:
usage_list = api.usage_list(request, datetime_start, datetime_end)
except api_exceptions.ApiException, e:
LOG.error('ApiException fetching usage list in instance usage'
' on date range "%s to %s"' % (datetime_start,
datetime_end),
exc_info=True)
messages.error(request, 'Unable to get usage info: %s' % e.message)
dateform = forms.DateForm()
@ -144,6 +153,10 @@ def tenant_usage(request, tenant_id):
try:
usage = api.usage_get(request, tenant_id, datetime_start, datetime_end)
except api_exceptions.ApiException, e:
LOG.error('ApiException getting usage info for tenant "%s"'
' on date range "%s to %s"' % (tenant_id,
datetime_start,
datetime_end))
messages.error(request, 'Unable to get usage info: %s' % e.message)
return render_to_response(
@ -169,6 +182,7 @@ def index(request):
instance._info['attrs']['image_name'] =\
image_dict.get(int(instance.attrs['image_id']),{}).get('name')
except Exception as e:
LOG.error('Unspecified error in instance index', exc_info=True)
messages.error(request, 'Unable to get instance list: %s' % e.message)
# We don't have any way of showing errors for these, so don't bother

View File

@ -12,6 +12,7 @@ import datetime
import json
import logging
import subprocess
import sys
import urlparse
from django.contrib import messages
@ -21,6 +22,8 @@ from django_openstack import forms
from django_openstack.dash.views import instances as dash_instances
from openstackx.api import exceptions as api_exceptions
LOG = logging.getLogger('django_openstack.syspanel.views.services')
class ToggleService(forms.SelfHandlingForm):
service = forms.CharField(required=False)
@ -39,6 +42,8 @@ class ToggleService(forms.SelfHandlingForm):
messages.info(request, "Service '%s' has been disabled"
% data['name'])
except api_exceptions.ApiException, e:
LOG.error('ApiException while toggling service %s' %
data['service'], exc_info=True)
messages.error(request, "Unable to update service '%s': %s"
% data['name'], e.message)
@ -56,6 +61,7 @@ def index(request):
try:
services = api.service_list(request)
except api_exceptions.ApiException, e:
LOG.error('ApiException fetching service list', exc_info=True)
messages.error(request, 'Unable to get service info: %s' % e.message)
other_services = []
@ -63,7 +69,11 @@ def index(request):
for k, v in request.session['serviceCatalog'].iteritems():
v = v[0]
try:
subprocess.check_call(['curl', '-m', '1', v['internalURL']])
# TODO(mgius): This silences curl, but there's probably
# a better solution than using curl to begin with
subprocess.check_call(['curl', '-m', '1', v['internalURL']],
stdout=open(sys.devnull, 'w'),
stderr=open(sys.devnull, 'w'))
up = True
except:
up = False

View File

@ -20,6 +20,9 @@ from django_openstack.dash.views import instances as dash_instances
from openstackx.api import exceptions as api_exceptions
LOG = logging.getLogger('django_openstack.syspanel.views.tenants')
class CreateTenant(forms.SelfHandlingForm):
id = forms.CharField(label="ID (name)")
description = forms.CharField(widget=forms.widgets.Textarea(), label="Description")
@ -27,6 +30,7 @@ class CreateTenant(forms.SelfHandlingForm):
def handle(self, request, data):
try:
LOG.info('Creating tenant with id "%s"' % data['id'])
api.tenant_create(request,
data['id'],
data['description'],
@ -35,6 +39,10 @@ class CreateTenant(forms.SelfHandlingForm):
'%s was successfully created.'
% data['id'])
except api_exceptions.ApiException, e:
LOG.error('ApiException while creating tenant\n'
'Id: "%s", Description: "%s", Enabled "%s"' %
(data['id'], data['description'], data['enabled']),
exc_info=True)
messages.error(request, 'Unable to create tenant: %s' %
(e.message))
return redirect('syspanel_tenants')
@ -47,6 +55,7 @@ class UpdateTenant(forms.SelfHandlingForm):
def handle(self, request, data):
try:
LOG.info('Updating tenant with id "%s"' % data['id'])
api.tenant_update(request,
data['id'],
data['description'],
@ -55,6 +64,10 @@ class UpdateTenant(forms.SelfHandlingForm):
'%s was successfully updated.'
% data['id'])
except api_exceptions.ApiException, e:
LOG.error('ApiException while updating tenant\n'
'Id: "%s", Description: "%s", Enabled "%s"' %
(data['id'], data['description'], data['enabled']),
exc_info=True)
messages.error(request, 'Unable to update tenant: %s' % e.message)
return redirect('syspanel_tenants')
@ -65,6 +78,7 @@ def index(request):
try:
tenants = api.tenant_list(request)
except api_exceptions.ApiException, e:
LOG.error('ApiException while getting tenant list', exc_info=True)
messages.error(request, 'Unable to get tenant info: %s' % e.message)
tenants.sort(key=lambda x: x.id, reverse=True)
return render_to_response('syspanel_tenants.html',{
@ -97,6 +111,8 @@ def update(request, tenant_id):
'description': tenant.description,
'enabled': tenant.enabled})
except api_exceptions.ApiException, e:
LOG.error('Error fetching tenant with id "%s"' % tenant_id,
exc_info=True)
messages.error(request, 'Unable to update tenant: %s' % e.message)
return redirect('syspanel_tenants')

View File

@ -20,6 +20,8 @@ from django_openstack.dash.views import instances as dash_instances
from openstackx.api import exceptions as api_exceptions
LOG = logging.getLogger('django_openstack.syspanel.views.users')
class UserForm(forms.Form):
def __init__(self, *args, **kwargs):
@ -38,6 +40,7 @@ class UserDeleteForm(forms.SelfHandlingForm):
def handle(self, request, data):
user_id = data['user']
LOG.info('Deleting user with id "%s"' % user_id)
api.user_delete(request, user_id)
messages.success(request,
'%s was successfully deleted.'
@ -127,6 +130,7 @@ def create(request):
user = form.clean()
# TODO Make this a real request
try:
LOG.info('Creating user with id "%s"' % user['id'])
api.user_create(request,
user['id'],
user['email'],
@ -140,6 +144,10 @@ def create(request):
return redirect('syspanel_users')
except api_exceptions.ApiException, e:
LOG.error('ApiException while creating user\n'
'id: "%s", email: "%s", tenant_id: "%s"' %
(user['id'], user['email'], user['tenant_id']),
exc_info=True)
messages.error(request,
'Error creating user: %s'
% e.message)

View File

@ -1,11 +1,9 @@
import logging
import traceback
LOG = logging.getLogger('openstack_dashboard')
class DashboardLogUnhandledExceptionsMiddleware(object):
def process_exception(self, request, exception):
tb_text = traceback.format_exc()
LOG.critical('Unhandled Exception in dashboard. Exception "%s"'
'\n%s' % (str(exception), tb_text))
LOG.critical('Unhandled Exception in of type "%s" in dashboard.'
% type(exception), exc_info=True)

View File

@ -93,7 +93,7 @@ USE_I18N = True
ACCOUNT_ACTIVATION_DAYS = 7
TOTAL_CLOUD_RAM_GB=10
TOTAL_CLOUD_RAM_GB = 10
try:
from local.local_settings import *

View File

@ -19,8 +19,6 @@
"""
Views for home page.
"""
import logging
from django import template
from django import shortcuts
from django.views.decorators import vary
@ -28,6 +26,7 @@ from django.views.decorators import vary
from django_openstack import api
from django_openstack.auth import views as auth_views
@vary.vary_on_cookie
def splash(request):
if request.user: