Source code for lease_it.views

#!/usr/local/bin/python2.7
"""
Views module manage interface between user and openstack-lease-it.

lease_it.views provide interaction based on REST good practice.
"""
import ast

from django.shortcuts import render
from django.http import JsonResponse
from django.contrib.auth.decorators import login_required

from lease_it import backend
from lease_it.backend import Exceptions as bckExceptions  # pylint: disable=ungrouped-imports
from lease_it.datastore.ModelAccess import InstancesAccess
from lease_it.datastore.Exceptions import StillRunning

from openstack_lease_it.settings import GLOBAL_CONFIG, LOGGER
from openstack_lease_it.decorators import superuser_required

# We load backend specify by configuration file
BACKEND_PLUGIN = getattr(backend, "{0}Connection".format(GLOBAL_CONFIG['BACKEND_PLUGIN']))
BACKEND = BACKEND_PLUGIN()  # pylint: disable=not-callable


@login_required
[docs]def dashboard(request): """ The default dashboard :param request: Web request :return: HTML Rendering """ return render(request, 'dashboard/dashboard.html')
@login_required
[docs]def flavors(request): # pylint: disable=unused-argument """ View for flavors request :param request: Web request :return: JsonResponse w/ list of flavor and details values """ # We call our method response = BACKEND.flavors() return JsonResponse(response)
@login_required
[docs]def instances(request): #pylint: disable=unused-argument """ View for instances list :param request: Web request :return: JsonResponse w/ list of instances and details """ response = list() # Retrieve filtered parameter on GET. It's used to display all instances or just user instances # In all cases, if user is not superuser, only user instances are displayed if 'filtered' in request.GET: filtered = ast.literal_eval(request.GET['filtered']) else: # By default, we filter based on user_id filtered = True # By default, we just list user instances, not all instances if not request.user.is_superuser: # If user is superuser and user are requesting admin view of instances # We ask a full list of instances filtered = True # We retrieve data from backend data_instances = BACKEND.instances(request, filtered) data_users = BACKEND.users() data_projects = BACKEND.projects() # We merge user and project information w/ instances for data_instance in data_instances: try: project = "{name}".format( **data_projects[data_instances[data_instance]['project_id']]) except KeyError: project = data_instances[data_instance]['project_id'] try: user = "{name}".format( **data_users[data_instances[data_instance]['user_id']]) except KeyError: user = data_instances[data_instance]['user_id'] response.append({ 'id': data_instances[data_instance]['id'], 'name': data_instances[data_instance]['name'], 'created_at': data_instances[data_instance]['created_at'], 'lease_end': data_instances[data_instance]['lease_end'], 'project': project, 'user': user }) return JsonResponse(response, safe=False)
@login_required
[docs]def instance(request, instance_id): """ This is view used to for a new lease on a specific instance (http://url/instances/instance_id) a PermissionDenied exception is raised decided by backend. Mainly if instance is not owned by user but see Backend comment. :param request: Web request :param instance_id: retrieve from url :return: JsonResponse """ response = { 'status': 'success' } try: instance_info = BACKEND.lease_instance(request, instance_id) response['instance'] = instance_info except bckExceptions.PermissionDenied as error: LOGGER.info("Permission Denied to lease %s", instance_id) response = { 'status': 'error', 'message': error.message } return JsonResponse(response)
@superuser_required
[docs]def users(request): # pylint: disable=unused-argument """ View for users :param request: Web request :return: JsonResponse w/ list of users and details """ response = BACKEND.users() return JsonResponse(response)
@superuser_required
[docs]def databases(request): # pylint: disable=unused-argument """ View for all entries on database, used to delete old instances data :param request: Web request :return: JSonResponse w/ list of database entries """ response = InstancesAccess.get_all() # By default, JsonResponse refuse to serialize a list to a Json list. safe=False allow it. return JsonResponse(response, safe=False)
@superuser_required
[docs]def database(request, instance_id): # pylint: disable=unused-argument """ This view is used to delete instance from database :param request: Web request :param instance_id: instance id :return: JSonResponse w/ status of deletion """ response = { 'status': 'success', 'instance': {'id': instance_id} } try: InstancesAccess.delete(instance_id) except StillRunning as error: response = { 'status': 'failed', 'message': error.message } return JsonResponse(response)