Why Gemfury? Push, build, and install  RubyGems npm packages Python packages Maven artifacts PHP packages Go Modules Debian packages RPM packages NuGet packages

Repository URL to install this package:

Details    
Size: Mime:
# Copyright (c) 2014 TrilioData, Inc.
# All Rights Reserved.

"""
Views for managing WorkloadMgr Migration Plans.
"""
from datetime import datetime
import json
import logging
import ast

from django.utils.translation import ugettext_lazy as _
from django.views.generic import View
from django.http import HttpResponse, JsonResponse
try:
    from django.core.urlresolvers import reverse
except ImportError:
    from django.urls import reverse
try:
    from django.core.urlresolvers import reverse_lazy
except ImportError:
    from django.urls import reverse_lazy

from horizon import messages
from horizon import exceptions
from horizon import forms
from horizon import tables
from horizon import workflows
from horizon import messages

from openstack_dashboard import api
from trilio_dashboard import workloadmgr

from .tables import MigrationPlansTable
from .migrations.tables import MigrationsTable
from .migrations.forms import DiscoverVMsServiceForm
from .workflows import CreateMigrationPlan
from .workflows import UpdateMigrationPlan
from .workflows import CreateMigration, SetCreateMigration_DefaultSteps


LOG = logging.getLogger(__name__)


class NextMigrationView(View):
    """
        This will give Next Migration Id.
    """
    def get(self, request):
        """
        Args:
            request: HttpRequest Object.

        Returns: Dict Next_migration_id
        """
        req = request.GET
        migration_plan_id = req.get('migration_plan_id')
        migration_id = req.get('migration_id')
        next_migration_id = workloadmgr.next_migration_by_id(request,
                                                             migration_plan_id,
                                                             migration_id)
        return JsonResponse({"id": next_migration_id})


class PreviousMigrationView(View):
    """
        This will give Previous Migration Id.
    """
    def get(self, request):
        """
        Args:
            request: HttpRequest Object

        Returns: dict Migration_id
        """
        req = request.GET
        migration_plan_id = req.get('migration_plan_id')
        migration_id = req.get('migration_id')
        next_migration_id = workloadmgr.prev_migration_by_id(request,
                                                        migration_plan_id,
                                                        migration_id)
        return JsonResponse({"id": next_migration_id})


class IndexView(tables.DataTableView):
    table_class = MigrationPlansTable
    template_name = 'project/migration_plans/index.html'

    def get_migration_plans_data(self):
        try:             
            migration_plans = workloadmgr.migration_plan_list(self.request)
        except Exception as ex:
            migration_plans = []
            msg = _('Migration Plans list can not be retrieved.')
            messages.error(self.request, msg)

        return migration_plans

    def get_data(self):
        return self.get_migration_plans_data()


class DetailView(tables.DataTableView):
    table_class = MigrationsTable
    template_name = 'project/migration_plans/detail.html'
    failure_url = reverse_lazy('horizon:project:migration_plans:index')

    def get_data(self):
        migrations = []
        try:
            migration_plan = self._get_data()
            if migration_plan:
                migrations = workloadmgr.migration_list(
                    self.request,
                    migration_plan_id=migration_plan.id)
        except Exception as ex:
            msg = _('Migrations list can not be retrieved. Error %s' % str(ex))
            messages.error(self.request, msg)  
        return migrations

    def _get_data(self):
        if not hasattr(self, "_migration_plan"):
            migration_plan = None
            try:
                migration_plan_id = self.kwargs['migration_plan_id']
                migration_plan = workloadmgr.migration_plan_get(self.request, migration_plan_id)
            except:
                msg = _('Unable to retrieve details for migration plan "%s".') \
                      % (migration_plan_id)
                messages.error(self.request, msg)  
            self._migration_plan = migration_plan
            
        return self._migration_plan
  
    def _get_migrations(self, migration_plan_id):
        try:
            migrations = []
            unique_vm_list = []
            unique_vm_list_info = []
            migrations = workloadmgr.migration_list(
                self.request,
                migration_plan_id=migration_plan_id,
                status="available",
                filter_it=False, get_instances=True)
            tz = workloadmgr.get_time_zone(self.request)
            for migration in migrations:
                migration.created_at = workloadmgr.get_local_time(
                    migration.created_at, "%H:%M:%S %p - %m/%d/%Y",
                    "%m/%d/%Y - %I:%M:%S %p", tz)
                if hasattr(migration, 'vms'):
                   for instance in migration.vms:
                       if instance['vm_id'] in unique_vm_list:
                          continue
                       unique_vm_list.append(instance['vm_id'])
                       d = {}
                       d['vm_name'] = instance['vm_name']
                       d['vm_id'] = instance['vm_id']
                       unique_vm_list_info.append(d)
        except Exception as ex:
               msg = _('Migrations list can not be retrieved. Error %s' % str(ex))
               messages.error(self.request, msg)
        return (migrations, unique_vm_list, unique_vm_list_info)

    def get_context_data(self, **kwargs):
        context = super(DetailView, self).get_context_data(**kwargs)
        context["migration_plan"] = self._get_data()
        migrations, unique_vm_list, unique_vm_list_info = self._get_migrations(context["migration_plan_id"])
        context["migrations"] = migrations
        context["unique_vm_list"] = unique_vm_list
        context["unique_vm_list_info"] = unique_vm_list_info
        if len(migrations) == 0 and len(unique_vm_list_info) == 0:
           for vm in context["migration_plan"].vms:
               d = {}
               d['vm_name'] = vm['name']
               d['vm_id'] = vm['id']
               unique_vm_list_info.append(d)
        return context


class CreateView(workflows.WorkflowView):
    workflow_class = CreateMigrationPlan
    template_name = 'project/migration_plans/create.html'

    def get_initial(self):
        pass


class UpdateView(workflows.WorkflowView):
    workflow_class = UpdateMigrationPlan
    template_name = 'project/migration_plans/create.html'
    failure_url = reverse_lazy('horizon:project:migration_plans:index')

    def _get_data(self):
        migration_plan = None
        try:
            migration_plan_id = self.kwargs['migration_plan_id']
            migration_plan = workloadmgr.migration_plan_get(self.request, migration_plan_id)
        except Exception as ex:
            msg = _('Unable to retrieve details for migration_plan "%s". Reason: %s') \
                    % (migration_plan_id, str(ex))
            messages.error(self.request, msg)  
        self._migration_plan = migration_plan

        return self._migration_plan

    def get_context_data(self, **kwargs):
        
        migration_plan = self._get_data()
        context = super(UpdateView, self).get_context_data(**kwargs)
        context['migration_plan_id'] = self.kwargs['migration_plan_id']
        context["migration_plan"] = self._migration_plan
        context['workflow'].context['migration_plan_id'] = self.kwargs['migration_plan_id']
        context["project_id"] = self._migration_plan.project_id
        return context

    def get_initial(self):
        initial = super(UpdateView, self).get_initial()
        initial_values = {'migration_plan_id': self.kwargs['migration_plan_id'],
                         'name': self._migration_plan.name,
                         'description': self._migration_plan.description,
                         'migration_plan_id': self._migration_plan.id,
                         'VMs': self._migration_plan.vms,
                         'project_id':self._migration_plan.project_id,}

        initial.update(initial_values)

        return initial


class CreateMigrationView(workflows.WorkflowView):
    workflow_class = CreateMigration
    template_name = 'project/migration_plans/migrations/migrate.html'
    failure_url = reverse_lazy('horizon:project:migration_plans:index')

    def _get_data(self):
        if not hasattr(self, "_migration_plan"):
            try:
                migration_plan_id = self.kwargs['migration_plan_id']
                migration_plan = workloadmgr.migration_plan_get(self.request, migration_plan_id)
            except Exception:
                msg = _('Unable to retrieve details for migration_plan "%s".') \
                    % (migration_plan_id)
                exceptions.handle(self.request, msg, redirect=self.failure_url)
            self._migration_plan = migration_plan
        return self._migration_plan

    def get_context_data(self, **kwargs):

        # set class specific attributes here
        # once super class method is called, it is too late
        migration_plan = self._get_data()
        SetCreateMigration_DefaultSteps(migration_plan)
        context = super(CreateMigrationView, self).get_context_data(**kwargs)
        context['migration_plan_id'] = self.kwargs['migration_plan_id']
        context["migration_plan"] = self._migration_plan
        context['workflow'].context['migration_plan_id'] = self.kwargs['migration_plan_id']
        return context


class DiscoverVMsView(forms.ModalFormView):
    form_class = DiscoverVMsServiceForm
    template_name = 'project/migration_plans/migrations/discover.html'
    submit_label = _("Discover VM's")

    def get_success_url(self):
        if self.request.META['HTTP_REFERER'].endswith('migration_plans/') or self.request.META['HTTP_REFERER'].endswith('migration_plans'):
            return reverse_lazy('horizon:project:migration_plans:index')
        else:
            return reverse_lazy('horizon:project:migration_plans:detail', kwargs={'migration_plan_id': self.migration_plan_id})

    def get_failure_url(self):
        if self.request.META['HTTP_REFERER'].endswith('migration_plans/') or self.request.META['HTTP_REFERER'].endswith('migration_plans'):
            return reverse_lazy('horizon:project:migration_plans:index')
        else:
            return reverse_lazy('horizon:project:migration_plans:detail', kwargs={'migration_plan_id': self.migration_plan_id})

    def get_context_data(self, **kwargs):
        migration_plan_url = self.request.META['PATH_INFO'].split('/')
        self.migration_plan_id = migration_plan_url[migration_plan_url.index('migration_plans') + 1]
        context = super(DiscoverVMsView, self).get_context_data(**kwargs)
        context["migration_plan_id"] = self.migration_plan_id
        return context

    def get_initial(self):
        migration_plan_url = self.request.META['PATH_INFO'].split('/')
        self.migration_plan_id = migration_plan_url[migration_plan_url.index('migration_plans') + 1]
        initial = super(DiscoverVMsView, self).get_initial()
        initial.update({'migration_plan_id': self.migration_plan_id})
        return initial