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.


import logging
import netaddr

from datetime import date, timedelta, datetime, time

try:
    from django.core.urlresolvers import reverse
except ImportError:
    from django.urls import reverse
from django.utils.translation import ugettext_lazy as _
from django.core.exceptions import ValidationError
from django import http

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

from openstack_dashboard import api
from dashboards import workloadmgr
from openstack_dashboard.api import nova
from openstack_dashboard.usage import quotas
from openstack_dashboard.local import local_settings as ls

LOG = logging.getLogger(__name__)

INDEX_URL = "horizon:project:workloads:index"
PROJECT_USER_MEMBER_SLUG = "update_members"
PROJECT_GROUP_MEMBER_SLUG = "update_group_members"

TRILIO_ENCRYPTION_SUPPORT = None
OPENSTACK_ENCRYPTION_SUPPORT = None

try:
    TRILIO_ENCRYPTION_SUPPORT = ls.TRILIO_ENCRYPTION_SUPPORT
    OPENSTACK_ENCRYPTION_SUPPORT = ls.OPENSTACK_ENCRYPTION_SUPPORT
except Exception as ex:
    TRILIO_ENCRYPTION_SUPPORT = False
    OPENSTACK_ENCRYPTION_SUPPORT = False

def getStartTime(request):
    cookie_tz = workloadmgr.get_time_zone(request)
    local_time = workloadmgr.get_local_time(datetime.now().strftime('%m/%d/%Y %I:%M %p'), "%m/%d/%Y %I:%M %p", "%m/%d/%Y %I:%M %p", cookie_tz).split(" ")
    return workloadmgr.roundTime(local_time[1], 15)+" "+local_time[2]

def populate_time_list():
    current_date = date.today()
    min_time = datetime.combine(current_date, time.min)
    max_time = datetime.combine(current_date, time.max)
    start_time = min_time
    times = []
    while start_time <= max_time:
        times.append(start_time)
        start_time+=timedelta(minutes=15)
        time_list = [(t.strftime('%I:%M %p'), t.strftime('%I:%M %p')) for t in times]
    return time_list

class SelectProjectUserAction(workflows.Action):
    project_id = forms.ChoiceField(label=_("Project"))
    user_id = forms.ChoiceField(label=_("User"))

    def __init__(self, request, *args, **kwargs):
        super(SelectProjectUserAction, self).__init__(request, *args, **kwargs)
        # Set our project choices
        projects = [(tenant.id, tenant.name)
                    for tenant in request.user.authorized_tenants]
        self.fields['project_id'].choices = projects

        # Set our user options
        users = [(request.user.id, request.user.username)]
        self.fields['user_id'].choices = users

    class Meta:
        name = _("Project & User")
        # Unusable permission so this is always hidden. However, we
        # keep this step in the workflow for validation/verification purposes.
        permissions = ("!",)


class SelectProjectUser(workflows.Step):
    action_class = SelectProjectUserAction
    contributes = ("project_id", "user_id")

class SetWorkloadDetailsAction(workflows.Action):
    if TRILIO_ENCRYPTION_SUPPORT and OPENSTACK_ENCRYPTION_SUPPORT:
        encryption = forms.BooleanField(label=_("Enable Encryption"),
                        required=False,
                        widget=forms.CheckboxInput(
                                    attrs={
                                           'onchange': 
                                             "if (document.getElementById('id_encryption').checked){"
                                             "    $('#secret_uuid_id').removeAttr('disabled'); "
                                     	     "} else {"
                                             "    $('#secret_uuid_id').attr('disabled', 'disabled'); "
                                     	     "} ",
                                             #'onclick': 'loadSecretUUID();'
                                        }),
                        initial=True)

    name = forms.CharField(max_length=80, 
                   required=False,
                   widget=forms.TextInput(
                              attrs={'placeholder': 'Workload Name here...',
                                     'id':'create_workload_details_id'}),
                   label=_("Workload Name") )
    description = forms.CharField(max_length=1024, 
                   required=False,
                   widget=forms.TextInput(
                        attrs={'placeholder': 'Workload Description here...',
                               'id':'create_workload_details_desc'}),
                   label=_("Workload Description") )
    workload_type = forms.ChoiceField(label=_("Workload Type"),
                   widget=forms.Select(
                        attrs={'id':'create_workload_details_type'}),
                   initial = "f82ce76f-17fe-438b-aa37-7a023058e50d" )
    '''
    TODO: Implement this dropdown instead of textbox.
    workload_secret_uuid = forms.ChoiceField(label=_("workload Secret"),
                            widget=forms.Select(
                                attrs={'id': 'workload_secret','disabled': 'disabled'}
                                ))'''
    if TRILIO_ENCRYPTION_SUPPORT and OPENSTACK_ENCRYPTION_SUPPORT:
        workload_secret_uuid = forms.CharField(max_length=80,
                                required=False,
                                widget=forms.TextInput(
                                        attrs={'placeholder': 'Enter Valid secret UUID...',
                                            'id':'secret_uuid_id'}),
                                label=_("Secret UUID") )

    workload_policy = forms.ChoiceField(label=_("Workload Policy"),
                      required=False,
                      widget=forms.Select(
                        attrs={'id':'create_workload_policy','style':'display:none;'}))

    def __init__(self, request, *args, **kwargs):
        super(SetWorkloadDetailsAction, self).__init__(request,
                                            *args, **kwargs)
        err_msg = _('Unable to retrieve workload policy list. '
                    'Please try again later.')
        project_id = request.user.project_id
        policy_list = self.populate_workload_policy_choices(request,project_id)
        if len(policy_list) > 0:
            self.fields['workload_policy'].choices = policy_list        
            self.fields['workload_policy'].widget.attrs.update({'style': "display:block;"})
        else:
            self.fields['workload_policy'].label = ""

    class Meta:
        name = _("Details")
        help_text_template = ("project/workloads/"
                              "_workload_details_help.html")
        
    def populate_workload_type_choices(self, request, context):
        """
        returns the available workload_types
        """
        try:
            workload_types = workloadmgr.workload_type_list(request)
            workload_type_list = [(workload_type.id, "%s" % workload_type.name)
                                   for workload_type in workload_types]
        except Exception:
            workload_type_list = []
            exceptions.handle(request,_('Unable to retrieve workload_types'))
        return workload_type_list

    def populate_workload_policy_choices(self, request,project_id):
        """
        returns the available workload_policy
        """
        try:
            workload_policies = workloadmgr.workload_policy_list(request,project_id)
            workload_policy_list = [(workload_policy['policy_id'], "%s" % workload_policy['policy_name'])
                                   for workload_policy in workload_policies]
        except Exception:
            workload_policy_list = []
            exceptions.handle(request,_('Unable to retrieve workload_policy'))
        return workload_policy_list

    def clean(self):
        cleaned_data = super(SetWorkloadDetailsAction, self).clean()
        encryption = cleaned_data.get('encryption', False) 
        sec_uuid = cleaned_data.get('workload_secret_uuid')
        if encryption and not sec_uuid:
            raise forms.ValidationError(_("Secret UUID cannot be Empty, "
                                          "If Encryption is True On Workload."))
        return cleaned_data

class SetWorkloadDetails(workflows.Step):
    action_class = SetWorkloadDetailsAction
    contributes = ("encryption", "name", "description", "workload_type","workload_secret_uuid", "workload_policy")


    def contribute(self, data, context):
        context = super(SetWorkloadDetails, self).contribute(data, context)
        # Translate form input to context for name values.
        if 'workload_policy' in data:
            context['workload_policy'] = data['workload_policy']
        return context


class SetInstancesAction(workflows.MembershipAction):
    # We are force fitting MembershipAction class with 
    # workload members, but it should work
    def __init__(self, request, *args, **kwargs):
        super(SetInstancesAction, self).__init__(request,
                                            *args, **kwargs)
        err_msg = _('Unable to retrieve instances list. '
                    'Please try again later.')

        default_role_name = self.get_default_role_field_name()
        self.fields[default_role_name] = forms.CharField(required=False)
        self.fields[default_role_name].initial = "Fakeid"
        # self.fields[default_role_name].error_messages={'required': 'Please choose a star rating'}

        # Get list of available users
        try:
            instances = api.nova.server_list(request)[0]
        except Exception:
            # exceptions.handle(request, err_msg)
            messages.error(request, err_msg)  

        # instances_list = [(instance.id, instance.name) for instance in instances]
        available_instances_list = []
        try:
            workload_vms_list = workloadmgr.workload_vms_list(request)
        except Exception:
            messages.error(request, err_msg)  
        workload_vms_ids_list = \
            [(workload_vm['id']) for workload_vm in workload_vms_list]
        data_position = 0
        for instance in instances:
            try:
                task_state = instance.to_dict()['OS-EXT-STS:task_state']
                power_state = instance.to_dict()['OS-EXT-STS:power_state']
            except AttributeError:
                   task_state = instance.__getattr__('OS-EXT-STS:task_state')
                   power_state = instance.__getattr__('OS-EXT-STS:power_state')
            if power_state == 1:
                power_state = "Running"
            elif power_state == 3:
                power_state = "Paused"
            else:
                power_state = "Shutdown"
            status =  instance.status
            if str(task_state) == 'None' \
                    and (status in ('ACTIVE', 'SHUTOFF', 'PAUSED', 'SUSPENDED')) \
                    and instance.id not in workload_vms_ids_list:

                hw_qemu_guest_agent = instance.metadata.get('hw_qemu_guest_agent', 'no') == 'yes'
                if hw_qemu_guest_agent is False:
                    if instance.image:
                        try:
                            image = api.glance.image_get(request, instance.image['id'])
                            hw_qemu_guest_agent = image.properties.get('hw_qemu_guest_agent', 'no') == 'yes'
                        except Exception as ex:
                            LOG.exception(ex)
                            pass

                instance_name = instance.name + \
                            ' (Id:' + str(instance.id) + \
                            '|Status:' + str(status) + \
                            '|Power:' + str(power_state) 
                instance_name += '|QEMU Guest Agent:' 
                if hw_qemu_guest_agent is True:
                    instance_name += 'configured'
                else:
                    instance_name += 'not configured'
                instance_name += ')'
                available_instances_list.append([instance.id, instance_name])

        # Get list of roles
        role_list = []
        try:
            role_list = [{'id': "Fakeid", 'name': 'Fake'}]
        except Exception:
            # exceptions.handle(request, err_msg,
            #                   redirect=reverse(INDEX_URL))
            messages.error(request, err_msg)  
        for role in role_list:
            field_name = self.get_member_field_name(role['id'])
            label = role['name']
            self.fields[field_name] = forms.MultipleChoiceField(required=False,
                                                            label=label)
            self.fields[field_name].choices = available_instances_list
            self.fields[field_name].initial = []
            
    class Meta:
        name = _("Workload Members")
        help_text_template = ("project/workloads/"
                              "_create_instances_help.html")
        slug = PROJECT_USER_MEMBER_SLUG

    def clean(self):
        cleaned_data = super(SetInstancesAction, self).clean()

        # Validate our instance source.
        field_name = self.get_member_field_name('Fakeid')
        instances = cleaned_data[field_name]
        if not len(instances):
            raise forms.ValidationError(_("At least one instance should be "
                                          "part of workload definition"))
        return cleaned_data

class SetInstances(workflows.UpdateMembersStep):
    action_class = SetInstancesAction
    available_list_title = _("All Instances")
    members_list_title = _("Workload Members")
    no_available_text = _("No instances found.")
    no_members_text = _("Select at least one instance, "
                                     "to be the part of workload definition.")
    show_roles = False

    def contribute(self, data, context):
        if data:
            roles = [{'id': "Fakeid", 'name': 'Fake'}]
            post = self.workflow.request.POST
            for role in roles:
                field = self.get_member_field_name(role['id'])
                context['instances'] = post.getlist(field)
        return context

def validate_retention_snapshots(value):
    if int(value) < 1 or int(value) > 365:
        raise ValidationError(
            _('Number of Snapshots should be in between 1 to 365.'),
            params={'value': value},
        )

def validate_retention_days(value):
    if int(value) < 1 or int(value) > 365:
        raise ValidationError(
            _('Number of days should be in between 1 to 365.'),
            params={'value': value},
        )

def validate_interval(value):
    if int(value) < -1 or int(value) >= 999:
        raise ValidationError(
            _("Full Backup interval should be in between 1 to 999 incremental snapshots, otherwise  '-1' for 'NEVER' and '0' for 'ALWAYS' "),
            params={'value': value},
        )


def validate_scheduler_interval(value):
    value = str(value).lower().split('hr')[0].strip()
    if int(value) < 1:
        raise ValidationError(
            _("Interval should be > 0 "),
            params={'value': value},
        )

class SetSnapshotPolicyAction(workflows.Action):
    retention_policy_type_choices = [('Number of Snapshots to Keep', 'Number of Snapshots to Keep'),
                                              ('Number of days to retain Snapshots', 'Number of days to retain Snapshots')]
    retention_policy_type = forms.ChoiceField(label=_("Snapshot Retention type"),
                                 initial = "Number of Snapshots to Keep", 
                                 required=False,
                                 choices = retention_policy_type_choices,
                                 widget=forms.RadioSelect(
                                     attrs={
                                         'style': "width:auto; ", 
                                         'onchange': 
                                             "if (document.getElementById('id_retention_policy_type_0').checked){"
                                             "    $('#id_retention_snapshots').css('display', 'block'); "
                                             "    $('#id_retention_days').css('display', 'none'); "
                                             "    $('#id_retention_policy_value').val($('#id_retention_snapshots').val()); "
                                             "}else if (document.getElementById('id_retention_policy_type_1').checked){"
                                             "    $('#id_retention_snapshots').css('display', 'none'); "
                                             "    $('#id_retention_days').css('display', 'block'); "
                                             "    $('#id_retention_policy_value').val($('#id_retention_days').val()); "
                                     	     "} "
                                     }))

    retention_snapshots = forms.IntegerField(label=_(" "),
                                 initial=30,
                                 required=False,
                                 validators=[validate_retention_snapshots],
                                 widget=forms.TextInput(
                                     attrs={'placeholder': "Enter number of snapshots here...",
                                               'onkeyup': " $('#id_retention_policy_value').val(document.getElementById('id_retention_snapshots').value); "
                                     }))

    retention_days = forms.IntegerField(label=_(" "),
                                 initial=30,
                                 required=False,
                                 validators=[validate_retention_days],
                                 widget=forms.TextInput(
                                     attrs={'placeholder': "Enter number of days here...",
                                               'style' : "margin-top: -9px; display:none;",
                                               'onkeyup': " $('#id_retention_policy_value').val(document.getElementById('id_retention_days').value); "
                                     }))

    retention_policy_value = forms.IntegerField(label=_(" "),
                                 initial=30,
                                 required=False,
                                 widget=forms.TextInput(
                                     attrs={'style': "display:none;"}))

    fullbackup_interval_choices = [('NEVER', 'Never'), ('ALWAYS', 'Always'), 
                            ('CUSTOM', 'Number of Snapshots')]
    fullbackup_interval_rdo = forms.ChoiceField(label=_("Full Backup Interval"),
                                 initial = "NEVER",
                                 required=False, 
                                 choices = fullbackup_interval_choices,
                                 widget=forms.RadioSelect(
                                     attrs={
                                         'style': "width:auto; ", 
                                         'onchange': 
                                             "if (document.getElementById('id_fullbackup_interval_rdo_0').checked){"
                                             "    $('#id_fullbackup_interval').val('-1'); "
                                             "    $('#id_fullbackup_interval').css('display', 'none'); "
                                             "}else if (document.getElementById('id_fullbackup_interval_rdo_1').checked){"
                                             "    $('#id_fullbackup_interval').val('0'); "
                                             "    $('#id_fullbackup_interval').css('display', 'none'); "
                                     	     "} else if (document.getElementById('id_fullbackup_interval_rdo_2').checked){"
                                             "    $('#id_fullbackup_interval').val('1'); "
                                             "    $('#id_fullbackup_interval').css('display', 'inline'); "
                                     	     "} "
                                     }))
    fullbackup_interval = forms.CharField(label=_("  "),
                                 initial='-1',
                                 required=False,
                                 validators=[validate_interval],
                                 widget=forms.TextInput(
                                     attrs={'style': "display:none; ", 'placeholder': "Enter Number of days to Full Backup...."}))

    class Meta:
        name = _("Policy")
        help_text_template = ("project/workloads/"
                              "_create_policy_help.html")

    def populate_retention_policy_type_choices(self, request, context):
        """
        returns the available retention_policy_types
        """
        try:
            retention_policy_type_list = [('Number of Snapshots to Keep', 'Number of Snapshots to Keep'),
                                          ('Number of days to retain Snapshots', 'Number of days to retain Snapshots')]
        except Exception:
            retention_policy_type_list = []
            exceptions.handle(request,_('Unable to retrieve retention_policy_types'))
        return retention_policy_type_list

class SetSnapshotScheduleAction(workflows.Action):
    cleaned_data = []
    enabled = forms.BooleanField(label=_("Enable Scheduler"),
                                 required=False,
                                 widget=forms.CheckboxInput(
                                     attrs={
                                         'onchange': 
                                             "if (document.getElementById('id_enabled').checked){"
                                             "    $('#id_start_date').removeAttr('disabled'); "
                                             "    $('#id_end_date').removeAttr('disabled'); "
                                             "    $('#id_start_time').removeAttr('disabled'); "
                                             "    if($('#create_workload_policy').val()==null) $('#id_interval').removeAttr('disabled'); "
                                     	     "} else {"
                                             "    $('#id_start_date').attr('disabled', 'disabled'); "
                                             "    $('#id_end_date').attr('disabled', 'disabled'); "
                                             "    $('#id_start_time').attr('disabled', 'disabled'); "
                                             "    $('#id_interval').attr('disabled', 'disabled'); "
                                     	     "} "
                                     }),
                                 initial=True)

    start_date = forms.DateField(input_formats=("%m/%d/%Y",),
                                 label=_("Start Date"), required=False,
                                 #initial=datetime.now().strftime('%m/%d/%Y'),
                                 widget=forms.TextInput(
                                     attrs={'placeholder': "Start Date here (in format 'mm/dd/yyyy')..."}))

    end_date = forms.DateField(input_formats=("%m/%d/%Y", "No End Date"),
                                 label=_("End Date"), required=False,
                                 initial=datetime.now().strftime('No End Date'),
                                 widget=forms.TextInput(
                                     attrs={'placeholder': "End Date here (in format 'mm/dd/yyyy')..."}))
    start_time = forms.ChoiceField(label=_("Start Time"), required=False)


    interval = forms.CharField(label=_("Repeat Every (in hrs)"),
                                 required=False,
                                 initial=24,
                                 validators=[validate_scheduler_interval],
                                 widget=forms.TextInput(
                                     attrs={'placeholder': "Repeat interval must be in numbers only (Ex: 1 or 2)...", 'onkeyup': " $('#id_interval').val(document.getElementById('id_interval').value)"}))

    class Meta:
        name = _("Schedule")
        help_text_template = ("project/workloads/"
                              "_create_schedule_help.html")

    def __init__(self, request, *args, **kwargs):
        super(SetSnapshotScheduleAction, self).__init__(request,
                                        *args, **kwargs)

        start_time_list = populate_time_list()
        self.fields['start_time'].choices = start_time_list

class SetSnapshotPolicy(workflows.Step):
    action_class = SetSnapshotPolicyAction
    contributes = ("jobschedule",)

    def contribute(self, data, context):
        if data:
            jobschedule = context['jobschedule']
            jobschedule['fullbackup_interval'] = 'fullbackup_interval' in data\
                                 and data['fullbackup_interval'] or "-1"
            jobschedule['retention_policy_type'] = 'retention_policy_type' in data \
                                 and data['retention_policy_type'] or \
                                 "Number of Snapshots to Keep"
            jobschedule['retention_policy_value'] = 'retention_policy_value' in data \
                                 and data['retention_policy_value'] or "30"
            context['jobschedule'] = jobschedule
        return context

class SetSnapshotSchedule(workflows.Step):
    action_class = SetSnapshotScheduleAction
    contributes = ("jobschedule",)

    def contribute(self, data, context):
        if data:
            context['jobschedule'] = jobschedule = {}
            jobschedule['enabled'] = 'enabled' in data and data['enabled'] or\
                                     data['enabled'] or False
            if hasattr(data['start_date'], 'strftime'):
                jobschedule['start_date'] = data['start_date'].strftime('%m/%d/%Y')
            else:
                jobschedule['start_date'] = datetime.now().strftime('%m/%d/%Y')
            if hasattr(data['end_date'], 'strftime'):
                if data['end_date'] == datetime(1900, 1, 1).date():
                    jobschedule['end_date'] = "No End"
                else:
                    jobschedule['end_date'] = data['end_date'].strftime('%m/%d/%Y')
            else:
                jobschedule['end_date']=datetime.now().strftime('No End')
            if 'start_time' in data and data['start_time']!='':
                data['start_time'] = datetime.strptime(data['start_time'],('%I:%M %p'))
            if hasattr(data['start_time'], 'strftime'):
                jobschedule['start_time'] = data['start_time'].strftime('%I:%M %p')
            else:
                jobschedule['start_time'] = \
                    'on-fly'
            if 'interval' in data and data['interval']!='':
               jobschedule['interval'] = str(data['interval']) +" hrs" if len(data['interval']) > 0 else "24" + " hrs"
            else:
                 jobschedule['interval'] = "24 hrs"
            context['jobschedule'] = jobschedule
        return context

class SetOptionsAction(workflows.Action):

    pause_at_snapshot = forms.BooleanField(label=_("Pause VM"),
                                 required=False,
                                 widget=forms.CheckboxInput(
                                     attrs={
                                     }),
                                 initial=False)

    """enable_compression = forms.BooleanField(label=_("Enable Compression"),
                                 required=False,
                                 widget=forms.CheckboxInput(
                                     attrs={
                                     }),
                                 initial=True)"""

    class Meta:
        name = _("Options")
        help_text_template = ("project/workloads/"
                              "_create_options_help.html")

class SetOptions(workflows.Step):
    action_class = SetOptionsAction
    contributes = ("options",)

    def contribute(self, data, context):
        if data:
            context['metadata'] = data

        return context


class CreateWorkload(workflows.Workflow):
    slug = "create_workload"
    name = _("Create Workload")
    finalize_button_name = _("Create")
    success_message = _('Created a workload named "%(name)s".')

    failure_message = _('Unable to create workload named "%(name)s".')
    default_steps = (SelectProjectUser,
                     SetWorkloadDetails,
                     SetInstances,
                     SetSnapshotSchedule,
                     SetSnapshotPolicy,
                     SetOptions,)


    def get_success_url(self):
        return reverse("horizon:project:workloads:index")

    def get_failure_url(self):
        return reverse("horizon:project:workloads:index")

    def format_status_message(self, message):
        name = self.context.get('name', '')
        return message % {"name": name}

    def handle(self, request, data):
        try:
            workload_def = {}
            workload_def['encryption'] = data.get('encryption', False)
            workload_def['workload_secret_uuid'] = data.get('workload_secret_uuid')
            workload_def['name'] = data['name']
            workload_def['description'] = data['description']
            workload_def['workload_type'] = data['workload_type']
            if not workload_def['name'] or  workload_def['name'] == None or \
                workload_def['name'] == '' or len(workload_def['name']) <= 1:
                workload_def['name'] = 'workload'
            if not workload_def['description'] or workload_def['description'] == '' or \
                len(workload_def['description']) <= 1:
                workload_def['description'] = None
            workload_def['instances'] = []
            for instance in data['instances']:
                workload_def['instances'].append({'instance-id': instance})
            workload_def['jobschedule'] = data['jobschedule']
            workload_def['jobschedule']['timezone'] = workloadmgr.get_time_zone(request)
            workload_def['jobschedule']['local_clock'] = request.POST.get('id_local_clock')
            if 'start_time' in  workload_def['jobschedule'] and workload_def['jobschedule']['start_time'] == 'on-fly':
               workload_def['jobschedule']['start_time'] = getStartTime(request)
            workload_def['metadata'] = data['metadata']
            if len(data['workload_policy']) !=0:
               workload_def['metadata']['policy_id']=data['workload_policy'] 
            workloadmgr.workload_create(request, context = workload_def)
            return True
        except Exception as ex:
            #exceptions.handle(request)
            messages.error(request, str(ex))  
            return False


class EditSnapshotPolicyAction(workflows.Action):
    retention_policy_type_choices = [('Number of Snapshots to Keep', 'Number of Snapshots to Keep'),
                                              ('Number of days to retain Snapshots', 'Number of days to retain Snapshots')]
    retention_policy_type = forms.ChoiceField(label=_("Snapshot Retention type"),
                                 initial = "Number of Snapshots to Keep", 
                                 required=False,
                                 choices = retention_policy_type_choices,
                                 widget=forms.RadioSelect(
                                     attrs={
                                         'style': "width:auto; ", 
                                         'onchange': 
                                             "if (document.getElementById('id_retention_policy_type_0').checked){"
                                             "    $('#id_retention_snapshots').css('display', 'block'); "
                                             "    $('#id_retention_days').css('display', 'none'); "
                                             "    $('#id_retention_policy_value').val($('#id_retention_snapshots').val()); "
                                             "}else if (document.getElementById('id_retention_policy_type_1').checked){"
                                             "    $('#id_retention_snapshots').css('display', 'none'); "
                                             "    $('#id_retention_days').css('display', 'block'); "
                                             "    $('#id_retention_policy_value').val($('#id_retention_days').val()); "
                                     	     "} "
                                     }))

    retention_snapshots = forms.IntegerField(label=_(" "),
                                 initial=30,
                                 required=False,
                                 validators=[validate_retention_snapshots],
                                 widget=forms.TextInput(
                                     attrs={'placeholder': "Enter number of snapshots here...",
                                               'onkeyup': " $('#id_retention_policy_value').val(document.getElementById('id_retention_snapshots').value); "
                                     }) )

    retention_days = forms.IntegerField(label=_(" "),
                                 initial=30,
                                 required=False,
                                 validators=[validate_retention_days],
                                 widget=forms.TextInput(
                                     attrs={'placeholder': "Enter number of days here...",
                                               'style' : "margin-top: -9px; display:none;",
                                               'onkeyup': " $('#id_retention_policy_value').val(document.getElementById('id_retention_days').value); "
                                     }) )

    retention_policy_value = forms.IntegerField(label=_(" "),
                                 initial=30,
                                 required=False,
                                 widget=forms.TextInput(
                                     attrs={'style': "display:none;"}))

    fullbackup_interval_choices = [('NEVER', 'Never'), ('ALWAYS', 'Always'), 
                            ('CUSTOM', 'Number of Snapshots')]
    fullbackup_interval_rdo = forms.ChoiceField(label=_("Full Backup Interval"),
                                 initial = "NEVER", 
                                 required=False,
                                 choices = fullbackup_interval_choices,
                                 widget=forms.RadioSelect(
                                     attrs={
                                         'style': "width:auto; ", 
                                         'onchange': 
                                             "if (document.getElementById('id_fullbackup_interval_rdo_0').checked){"
                                             "    $('#id_fullbackup_interval').val('-1'); "
                                             "    $('#id_fullbackup_interval').css('display', 'none'); "
                                             "}else if (document.getElementById('id_fullbackup_interval_rdo_1').checked){"
                                             "    $('#id_fullbackup_interval').val('0'); "
                                             "    $('#id_fullbackup_interval').css('display', 'none'); "
                                     	     "} else if (document.getElementById('id_fullbackup_interval_rdo_2').checked){"
                                             "    $('#id_fullbackup_interval').val('1'); "
                                             "    $('#id_fullbackup_interval').css('display', 'inline'); "
                                     	     "} "
                                     }))
    fullbackup_interval = forms.CharField(label=_("  "),
                                 initial='-1',
                                 required=False,
                                 validators=[validate_interval],
                                 widget=forms.TextInput(
                                     attrs={'style': "display:none; ",
                                            'placeholder': "Enter Number of days to Full Backup...."}) )

    class Meta:
        name = _("Policy")
        help_text_template = ("project/workloads/"
                              "_create_policy_help.html")

    def __init__(self, request, *args, **kwargs):
        super(EditSnapshotPolicyAction, self).__init__(request,
                                        *args, **kwargs)
        if 'workload_id' in args[0]:
            self.fields['retention_policy_type'].initial = args[0]['jobschedule']['retention_policy_type']
            if (args[0]['jobschedule']['retention_policy_type'] == "Number of Snapshots to Keep"):
                self.fields['retention_snapshots'].initial = args[0]['jobschedule']['retention_policy_value']
                self.fields['retention_snapshots'].widget.attrs['style'] = "display:block;"
                self.fields['retention_days'].widget.attrs['style'] = "display:none;"
            if (args[0]['jobschedule']['retention_policy_type'] == "Number of days to retain Snapshots"):
                self.fields['retention_days'].initial = args[0]['jobschedule']['retention_policy_value']
                self.fields['retention_snapshots'].widget.attrs['style'] = "display:none;"
                self.fields['retention_days'].widget.attrs['style'] = "display:block;"
            self.fields['retention_policy_value'].initial = args[0]['jobschedule']['retention_policy_value']
            self.fields['fullbackup_interval'].initial = args[0]['jobschedule']['fullbackup_interval']

            if args[0]['jobschedule']['fullbackup_interval'] == '-1':
                self.fields['fullbackup_interval_rdo'].initial = 'NEVER'
            elif args[0]['jobschedule']['fullbackup_interval'] == '0':
                self.fields['fullbackup_interval_rdo'].initial = 'ALWAYS'
            else:
                self.fields['fullbackup_interval_rdo'].initial = 'CUSTOM'
                self.fields['fullbackup_interval'].widget.attrs['style'] = 'display:block'

class EditSnapshotScheduleAction(workflows.Action):
    cleaned_data = []
    enabled = forms.BooleanField(label=_("Enabled"),
                required=False,
                widget=forms.CheckboxInput(
                    attrs={'onchange':
                        "if(document.getElementById('id_enabled').checked){"
                        "    $('#id_start_date').removeAttr('disabled'); "
                        "    $('#id_end_date').removeAttr('disabled'); "
                        "    $('#id_start_time').removeAttr('disabled'); "
                        "    if($('#create_workload_policy').val()== null) $('#id_interval').removeAttr('disabled'); "
                        "} else {"
                        "    $('#id_start_date').attr('disabled', 'disabled');"
                        "    $('#id_end_date').attr('disabled', 'disabled'); "
                        "    $('#id_start_time').attr('disabled', 'disabled');"
                        "    $('#id_interval').attr('disabled', 'disabled'); "
                        "} "
                    }),
                initial=True)

    start_date = forms.DateField(input_formats=("%m/%d/%Y",),
                     label=_("Start Date"),
                     #initial=datetime.now().strftime('%m/%d/%Y'),
                     required=False,
                     widget=forms.TextInput(
                         attrs={'placeholder':
                    "Start Date here (in format 'mm/dd/yyyy')..."}) )
    end_date = forms.DateField(input_formats=("%m/%d/%Y", "No End Date"), label=_("End Date"),
                     initial=datetime.now().strftime('No End Date'),
                     required=False,
                     widget=forms.TextInput(
                         attrs={'placeholder': "End Date here (in format 'mm/dd/yyyy')..."}) )
    start_time = forms.ChoiceField(label=_("Start Time"), required=False)

    interval = forms.CharField(label=_("Repeat Every (in hrs)"),
                     initial=24,
                     required=False,
                     validators=[validate_scheduler_interval],
                     widget=forms.TextInput(
                         attrs={'placeholder': "Repeat interval must be in numbers only (Ex: 1 or 2)..."}) )
    global_scheduler_off = forms.CharField(required=False, widget=forms.HiddenInput(), initial="False")
    controller_tz = forms.CharField(required=False, widget=forms.HiddenInput(), disabled = True)
    controller_start_time = forms.ChoiceField(required=False, widget=forms.HiddenInput(), disabled = True)

    class Meta:
        name = _("Schedule")
        help_text_template = ("project/workloads/"
                              "_create_schedule_help.html")

    def __init__(self, request, *args, **kwargs):
        super(EditSnapshotScheduleAction, self).__init__(request,
                                        *args, **kwargs)
        start_time_list = populate_time_list()
        self.fields['start_time'].choices = start_time_list
        if 'workload_id' in args[0]:
            self.fields['enabled'].initial = args[0]['jobschedule']['enabled']
            self.fields['controller_tz'].initial = args[0]['jobschedule']['controller_tz']
            try:
                self.fields['start_date'].initial = \
                    datetime.strptime(args[0]['jobschedule']['start_date'],
                           "%m/%d/%Y").strftime("%m/%d/%Y")
            except:
                try:
                    self.fields['start_date'].initial = \
                        datetime.strptime(args[0]['jobschedule']['start_date'],
                               "%m/%d/%y").strftime("%m/%d/%Y")
                except:
                    self.fields['start_date'].initial = \
                        datetime.strptime(args[0]['jobschedule']['start_date'],
                               "%Y-%m-%d").strftime("%m/%d/%Y")

            if args[0]['jobschedule']['end_date'] == "No End" or \
                args[0]['jobschedule']['end_date'] == "No End Date" :
                self.fields['end_date'].initial = "No End Date"
            else:
                try:
                    self.fields['end_date'].initial = \
                        datetime.strptime(args[0]['jobschedule']['end_date'],
                               "%m/%d/%Y").strftime("%m/%d/%Y")
                except:
                    self.fields['end_date'].initial = \
                        datetime.strptime(args[0]['jobschedule']['end_date'],
                               "%m/%d/%y").strftime("%m/%d/%Y")     		
            try:
               self.fields['controller_start_time'].initial = datetime.strptime(
                           args[0]['jobschedule']['start_time'],
                           '%H:%M %p').strftime("%I:%M %p")        
            except:
               self.fields['controller_start_time'].initial = datetime.strptime(
                           args[0]['jobschedule']['start_time'],
                           '%H:%M').strftime("%I:%M %p")    
            self.fields['interval'].initial = (args[0]['jobschedule']['interval']).split(" ")[0] \
                                               if (args[0]['jobschedule']['interval']).endswith("hrs") else args[0]['jobschedule']['interval']

            if args[0]['jobschedule']['enabled'] == True or \
                    (len(args[0]['jobschedule']['start_date']) > 0 and len(args[0]['jobschedule']['start_time'])) > 0:
                self.fields['enabled'].widget.attrs = {'onchange':
                                                           "if(document.getElementById('id_enabled').checked){"
                                                           " $('#id_start_date').removeAttr('disabled'); "
                                                           " $('#id_end_date').removeAttr('disabled'); "
                                                           " $('#id_start_time').removeAttr('disabled'); "
                                                           " $('#id_interval').removeAttr('disabled'); "
                                                           "} else {"
                                                           " $('#id_start_date').attr('disabled', 'disabled');"
                                                           " $('#id_end_date').attr('disabled', 'disabled'); "
                                                           " $('#id_start_time').attr('disabled', 'disabled');"
                                                           " $('#id_interval').attr('disabled', 'disabled'); "
                                                           "} "
                                                       }
             
            if not args[0]['jobschedule']['enabled']:
                self.fields['start_date'].widget.attrs['disabled'] = 'disabled'
                self.fields['end_date'].widget.attrs['disabled'] = 'disabled'
                self.fields['start_time'].widget.attrs['disabled'] = 'disabled'
                self.fields['interval'].widget.attrs['disabled'] = 'disabled'

class EditSnapshotPolicy(workflows.Step):
    action_class = EditSnapshotPolicyAction
    contributes = ("jobschedule",)

    def contribute(self, data, context):
        if data:
            jobschedule = context['jobschedule']

            jobschedule['fullbackup_interval'] = 'fullbackup_interval' in data\
                                 and data['fullbackup_interval'] or "-1"
            jobschedule['retention_policy_type'] = 'retention_policy_type' in data \
                                 and data['retention_policy_type'] or \
                                 "Number of Snapshots to Keep"
            jobschedule['retention_policy_value'] = 'retention_policy_value' in data \
                                 and data['retention_policy_value'] or "30"
            context['jobschedule'] = jobschedule
        return context

class EditSnapshotSchedule(workflows.Step):
    action_class = EditSnapshotScheduleAction
    contributes = ("jobschedule",)

    def contribute(self, data, context):
        if data:
            # Extracting previous values from context which came from DB and Request.
            past_scheduler = context.get('jobschedule')
            start_date = past_scheduler.get('start_date')
            end_date = past_scheduler.get('end_date')
            start_time = past_scheduler.get('start_time')
            interval = past_scheduler.get('interval')
            data = data.copy()
            context['jobschedule'] = jobschedule = {}
            
            jobschedule['enabled'] = 'enabled' in data and data['enabled'] or\
                                     data['enabled'] or False
            if hasattr(data['start_date'], 'strftime'):
                jobschedule['start_date'] = data['start_date'].strftime('%m/%d/%Y')
            else:
                jobschedule['start_date'] = datetime.now().strftime('%m/%d/%Y')
            if hasattr(data['end_date'], 'strftime'):
                if data['end_date'] == datetime(1900, 1, 1).date():
                    jobschedule['end_date'] = "No End"
                else:
                    jobschedule['end_date'] = data['end_date'].strftime('%m/%d/%Y')
            else:
                jobschedule['end_date']=datetime.now().strftime('No End')

            if 'start_time' in data and data['start_time']!='':
                try:
                    data['start_time'] = datetime.strptime(data['start_time'],'%I:%M %p')
                except:
                    data['start_time'] = datetime.strptime(data['start_time'],'%H:%M')

            if hasattr(data['start_time'], 'strftime'):
                jobschedule['start_time'] = data['start_time'].strftime("%I:%M %p")
            else:
                jobschedule['start_time'] = \
                    'on-fly'

            jobschedule['interval'] = 'interval' in data and str(data.get('interval')) + " " + "hrs" \
                if len(data.get('interval')) > 0 else interval or interval
            
            context['jobschedule'] = jobschedule
        return context

class EditWorkloadDetailsAction(workflows.Action):
    
    name = forms.CharField(max_length=80,
                   required=False,
                   widget=forms.TextInput(
                              attrs={'placeholder': 'Workload Name here...',
                                     'id':'create_workload_details_id'}),
                   label=_("Workload Name"))
    description = forms.CharField(max_length=1024,
                   required=False,
                   widget=forms.TextInput(
                        attrs={'placeholder': 'Workload Description here...',
                               'id':'create_workload_details_desc'}),
                   label=_("Workload Description"))
    workload_id = forms.CharField(label=_("ID"),
                                 widget=forms.TextInput(
                                     attrs={'readonly': 'readonly'}))
    workload_type = forms.CharField(label=_("Type"),
                                 widget=forms.TextInput(
                                     attrs={'readonly': 'readonly'}))
    policy = forms.ChoiceField(label=_("Workload Policy"),
                      required=False,
                      widget=forms.Select(
                        attrs={'id':'create_workload_policy','style':'display:none;'}))

    class Meta:
        name = _("Details")
        help_text_template = ("project/workloads/"
                              "_workload_details_help.html")

    
        
    def __init__(self, request,*args, **kwargs):
        super(EditWorkloadDetailsAction, self).__init__(request,
                                        *args, **kwargs)
         
        if 'workload_id' in args[0]:
            workload_id = args[0]['workload_id']
            workload = workloadmgr.workload_get(request, workload_id)
            self.fields['name'].initial = workload.name
            self.fields['description'].initial = workload.description
            self.fields['workload_id'].initial = workload.id
            self.fields['workload_type'].initial = workload.workload_type_id
            policy_list = self.populate_policy_choices(request,args[0])
            if len(policy_list) > 0:
                self.fields['policy'].widget.attrs.update({'style': "display:block;"})
                if 'policy_id' in workload.metadata:
                    self.fields['policy'].initial = workload.metadata['policy_id']
            else:
                self.fields['policy'].label = ""

    def populate_policy_choices(self,request,context):
        """
        returns the available workload_policy
        """
        project_id = context.get('project_id') 
        try:
            workload_policies = workloadmgr.workload_policy_list(request,project_id)
            workload_policy_list = [(workload_policy['policy_id'], "%s" % workload_policy['policy_name'])
                                   for workload_policy in workload_policies]
        except Exception:
            workload_policy_list = []
            exceptions.handle(request,_('Unable to retrieve workload_policy'))
        return workload_policy_list


    def clean(self):
        cleaned_data = super(EditWorkloadDetailsAction, self).clean()
        # Validate our instance source.
        name = cleaned_data['name']
        if name == None or name == '':
            raise forms.ValidationError(_("There is no name for workload"))
        if not cleaned_data['name']:
            raise forms.ValidationError(_("Please enter name of the workload"))
        return cleaned_data

class EditWorkloadDetails(workflows.Step):
    action_class = EditWorkloadDetailsAction
    contributes = ("name", "description", "workload_type","policy","project_id")

    def contribute(self, data, context):
        context = super(EditWorkloadDetails, self).contribute(data, context)
        # Translate form input to context for name values.
        return context

class EditInstancesAction(workflows.MembershipAction):
    # We are force fitting MembershipAction class with 
    # workload members, but it should work
    def __init__(self, request, *args, **kwargs):
        super(EditInstancesAction, self).__init__(request,
                                            *args, **kwargs)
        err_msg = _('Unable to retrieve instances list. '
                    'Please try again later.')

        workload_id = 'workload_id' in args[0] and args[0]['workload_id'] or\
                      self.data['workload_id']
        default_role_name = self.get_default_role_field_name()
        self.fields[default_role_name] = forms.CharField(required=False)
        self.fields[default_role_name].initial = "Fakeid"

        workload_instances_ids_list = []
        try:
            workload = workloadmgr.workload_get(self.request, workload_id)
            workload_members = workload.instances
        except Exception:
            # exceptions.handle(request, err_msg)
            messages.error(request, err_msg)  
        workload_instances_ids_list = \
            [(workload_instance['id']) for workload_instance in workload_members]
        
        # Get list of available users
        try:
            instances = api.nova.server_list(request)[0]
        except Exception:
            # exceptions.handle(request, err_msg)
            messages.error(request, err_msg)  

        # instances_list = [(instance.id, instance.name) for instance in instances]
        available_instances_list = []
        intances_within_list = []
        try:
            workload_vms_list = workloadmgr.workload_vms_list(request)
        except Exception:
            messages.error(request, err_msg)  
        workload_vms_ids_list = \
            [(workload_vm['id']) for workload_vm in workload_vms_list]

        for instance in instances:
            try:
                task_state = instance.to_dict()['OS-EXT-STS:task_state']
                power_state = instance.to_dict()['OS-EXT-STS:power_state']
            except AttributeError:
                   task_state = instance.__getattr__('OS-EXT-STS:task_state')
                   power_state = instance.__getattr__('OS-EXT-STS:power_state')
            if power_state == 1:
                power_state = "Running"
            elif power_state == 3:
                power_state = "Paused"
            else:
                power_state = "Shutdown"
            status =  instance.status
            if str(task_state) == 'None' \
                    and (status in ('ACTIVE', 'SHUTOFF', 'PAUSED', 'SUSPENDED')) \
                    and (instance.id in workload_instances_ids_list):
               intances_within_list.append(instance.id)

            if str(task_state) == 'None' \
                    and (status in ('ACTIVE', 'SHUTOFF', 'PAUSED', 'SUSPENDED')) \
                    and (instance.id not in workload_vms_ids_list \
                          or instance.id in workload_instances_ids_list):
                hw_qemu_guest_agent = instance.metadata.get('hw_qemu_guest_agent', False)
                if hw_qemu_guest_agent is False:
                    if instance.image:
                        try:
                            image = api.glance.image_get(request, instance.image['id'])
                            hw_qemu_guest_agent = image.properties.get('hw_qemu_guest_agent', 'no') == 'yes'
                        except Exception as ex:
                            LOG.exception(ex)
                            pass

                instance_name = instance.name + \
                            ' (Id:' + str(instance.id) + \
                            '|Status:' + str(status) + \
                            '|Power:' + str(power_state) 
                instance_name += '|QEMU Guest Agent:' 
                if hw_qemu_guest_agent is True:
                    instance_name += 'configured'
                else:
                    instance_name += 'not configured'
                instance_name += ')'
                available_instances_list.append([instance.id, instance_name])

        # Get list of roles
        role_list = []
        try:
            role_list = [{'id': "Fakeid", 'name': 'Fake'}]
        except Exception:
            # exceptions.handle(request, err_msg,
            #                   redirect=reverse(INDEX_URL))
            messages.error(request, err_msg)  
        for role in role_list:
            field_name = self.get_member_field_name(role['id'])
            label = role['name']
            self.fields[field_name] = forms.MultipleChoiceField(required=False,
                                                                label=label)
            self.fields[field_name].choices = available_instances_list
            self.fields[field_name].initial = []

        if len(intances_within_list) == 0 and len(workload_instances_ids_list) >= 1:
           self.fields['deleted_instances'] = forms.CharField(widget = forms.HiddenInput(), required = False)

        tenant_id = self.request.user.tenant_id
        for inst in workload_members:
            try:
                roles = [{'id': "Fakeid", 'name': 'Fake'}]
            except Exception:
                # exceptions.handle(request,
                #                 err_msg, redirect=reverse(INDEX_URL))
                messages.error(request, err_msg)  
            for role in roles:
                field_name = self.get_member_field_name(role['id'])
                self.fields[field_name].initial.append(inst['id'])

    class Meta:
        name = _("Workload Members")
        help_text_template = ("project/workloads/"
                              "_create_instances_help.html")
        slug = PROJECT_USER_MEMBER_SLUG

    def clean(self):
        cleaned_data = super(EditInstancesAction, self).clean()

        # Validate our instance source.
        field_name = self.get_member_field_name('Fakeid')
        instances = cleaned_data[field_name]
        if 'deleted_instances' in self.fields:
            return cleaned_data
        if not len(instances):
            raise forms.ValidationError(_("At least one instance should be "
                                          "part of workload definition"))
        return cleaned_data

class EditInstances(workflows.UpdateMembersStep):
    action_class = EditInstancesAction
    available_list_title = _("All Instances")
    members_list_title = _("Workload Members")
    no_available_text = _("No instances found.")
    no_members_text = _("Select at least one instance, "
                                     "to be the part of workload definition.")
    show_roles = False

    def contribute(self, data, context):
        if data:
            roles = [{'id': "Fakeid", 'name': 'Fake'}]
            post = self.workflow.request.POST
            for role in roles:
                field = self.get_member_field_name(role['id'])
                context['instances'] = post.getlist(field)

        return context

class EditOptionsAction(workflows.Action):

    pause_at_snapshot = forms.BooleanField(label=_("Pause VM"),
                                 required=False,
                                 widget=forms.CheckboxInput(
                                     attrs={
                                     }))

    """enable_compression = forms.BooleanField(label=_("Enable Compression"),
                                 required=False,
                                 widget=forms.CheckboxInput(
                                     attrs={
                                     }))"""

    class Meta:
        name = _("Options")
        help_text_template = ("project/workloads/"
                              "_create_options_help.html")

    def __init__(self, request, *args, **kwargs):
        super(EditOptionsAction, self).__init__(request,
                                        *args, **kwargs)

        if 'workload_id' in args[0]:
            workload_id = args[0]['workload_id']
            workload = workloadmgr.workload_get(self.request, workload_id)
            for key in workload.metadata:
                if (workload.metadata[key] == '1' or workload.metadata[key] == '0') and key in self.fields:
                   self.fields[key].initial = bool(int(workload.metadata[key]))
                elif key in self.fields:
                     self.fields[key].initial = workload.metadata[key]
 
class EditOptions(workflows.Step):
    action_class = EditOptionsAction
    contributes = ("options",)

    def contribute(self, data, context):
        if data:
            context['metadata'] = data

        return context


class UpdateWorkload(workflows.Workflow):
    slug = "update_workload"
    name = _("Update Workload")
    finalize_button_name = _("Update")
    success_message = _('Updated workload named "%(name)s".')
    failure_message = _('Unable to update workload named "%(name)s".')
    default_steps = (SelectProjectUser,
                     EditWorkloadDetails,
                     EditInstances,
                     EditSnapshotSchedule,
                     EditSnapshotPolicy,
                     EditOptions,)

    def get_success_url(self):
        return reverse("horizon:project:workloads:index")

    def get_failure_url(self):
        return reverse("horizon:project:workloads:index")

    def format_status_message(self, message):
        name = self.context.get('name', '')
        return message % {"name": name}

    def handle(self, request, data):
        try:
            workload_def = {}
            workload_def['name'] = data['name']
            workload_def['description'] = data['description']
            workload_def['workload_id'] = data['workload_id']
            workload_def['workload_type_id'] = data['workload_type']
            workload_def['instances'] = []
            for instance in data['instances']:
                workload_def['instances'].append({'instance-id': instance})
            workload_def['jobschedule'] = data['jobschedule']
            workload_def['jobschedule']['timezone'] = workloadmgr.get_time_zone(request)
            workload_def['jobschedule']['local_clock'] = request.POST.get('id_local_clock')
            if 'start_time' in  workload_def['jobschedule'] and workload_def['jobschedule']['start_time'] == 'on-fly':
               workload_def['jobschedule']['start_time'] = getStartTime(request)
            workload_def['metadata'] = data['metadata']
            if len(data['policy']) != 0 :
               workload_def['metadata']['policy_id']=data['policy']
            workloadmgr.workload_update(request, workload_def['workload_id'],
                                        context = workload_def)
            return True
        except Exception as ex:
            # exceptions.handle(request)
            messages.error(request, str(ex))  
            return False

class SetSnapshotDetailsAction(workflows.Action):
    name = forms.CharField(max_length=80, 
                   required=False,
                   widget=forms.TextInput(
                              attrs={'placeholder': 'Snapshot Name here...'}),
                   label=_("Snapshot Name"),
                   help_text=_("Enter name of the Snapshot, "
                                     "default is 'snapshot' "))
    description = forms.CharField(max_length=1024, 
                   required=False,
                   widget=forms.TextInput(
                        attrs={'placeholder': 'Snapshot Description here...'}),
                   label=_("Snapshot Description"),
                   help_text=_("Enter additional information of " 
                                     "the Snapshot, default is '-' "))
    snapshot_type = forms.ChoiceField(label=_("Snapshot Type"),
                   initial = "1",
                   help_text=_("Type of Snapshot"))    

    class Meta:
        name = _("Details")
        # help_text_template = ("project/workloads/snapshots" "_snapshot_details_help.html")
        
    def populate_snapshot_type_choices(self, request, context):
        """
        returns the available snapshot_types
        """
        try:
            # snapshot_types = workloadmgr.snapshot_type_list(request)
            # snapshot_type_list = [(snapshot_type.id, "%s" % snapshot_type.name)
            #                       for workload_type in workload_types]
            snapshot_type_list = [('1', 'Incremental'), ('0', 'Full')]
        except Exception:
            snapshot_type_list = []
            exceptions.handle(request,_('Unable to retrieve snapshot_types'))
        return snapshot_type_list

class SetSnapshotDetails(workflows.Step):
    action_class = SetSnapshotDetailsAction
    contributes = ("name", "description", "snapshot_type")

class CreateSnapshot(workflows.Workflow):
    slug = "create_snapshot"
    name = _("Create Snapshot")
    finalize_button_name = _("Create")
    success_message = _('Created a Snapshot named "%(name)s".')
    failure_message = _('Unable to create Snapshot named "%(name)s".')
    default_steps = (SelectProjectUser,
                     SetSnapshotDetails)

    def _redirect_url(self):
        url_prefix = self.request.META['HTTP_REFERER'].split('workloads',1)[0]
        url_postfix = self.request.META['PATH_INFO'].split('workloads',1)[1]
        workload_url = url_prefix  + 'workloads' + url_postfix
        workload_url = workload_url.replace('snapshot', '', 1)
        if not 'activetab' in workload_url:
            return (workload_url + "?activetab=snapshots")
        else:
            return workload_url

    def get_success_url(self):
        return self._redirect_url()

    def get_failure_url(self):
        return self._redirect_url()

    def format_status_message(self, message):
        name = self.context.get('name', '')
        return message % {"name": name}

    def handle(self, request, data):
        try:       
            workload_url = request.META['PATH_INFO'] 
            if workload_url.find('?') > 0:                         
                workload_end = workload_url.find('?') 
                workload_url =  workload_url[0:workload_end]
            workload_start = workload_url.find('workloads') + 10
            workload_end = len(workload_url) - 9
            workload_id = workload_url[workload_start:workload_end]
            if not data['name'] or  data['name'] == None or \
                data['name'] == '' or len(data['name']) <= 1:
                pname = 'snapshot'
            else:
                pname = data['name']
            if not data['description'] or  data['description'] == None or \
                data['description'] == '' or len(data['description']) <= 1:
                pdescription = '-'
            else:
                pdescription = data['description']
            if  data['snapshot_type'] == "0":
                pfull=True
            else:
                pfull=False
            workloadmgr.workload_snapshot(request, workload_id, full=pfull, name=pname, description=pdescription)
            LOG.debug('Snapshot of workload %s scheduled successfully' % workload_id)
            return True
        except Exception as ex:
            # exceptions.handle(request)
            messages.error(request, str(ex))  
            return False

class CreateTransferForm(forms.SelfHandlingForm):
    name = forms.CharField(max_length=255, label=_("Transfer Name"),
                           required=False)

    def handle(self, request, data):
        try:
            workload_id = self.initial['workload_id']
            transfer = workloadmgr.transfer_create(request, workload_id, data['name'])

            if data['name']:
                msg = _('Created workload transfer: "%s".') % data['name']
            else:
                msg = _('Created workload transfer.')
            messages.success(request, msg)
            response = http.HttpResponseRedirect(
                reverse("horizon:project:workloads:show_transfer",
                        args=(transfer.id, transfer.auth_key)))
            return response
        except Exception:
            redirect = reverse("horizon:project:workloads:index")
            exceptions.handle(request, _('Unable to create workload transfer.'),
                              redirect=redirect)


class AcceptTransferForm(forms.SelfHandlingForm):
    # These max lengths correspond to the sizes in workloadmgr
    transfer_id = forms.CharField(max_length=36, label=_("Transfer ID"))
    auth_key = forms.CharField(max_length=16, label=_("Authorization Key"))

    def handle(self, request, data):
        try:
            transfer = workloadmgr.transfer_accept(request,
                                              data['transfer_id'],
                                              data['auth_key'])

            msg = (_('Successfully accepted workload transfer: "%s"')
                   % data['transfer_id'])
            messages.success(request, msg)
            return transfer
        except Exception:
            redirect = reverse("horizon:project:workload:index")
            exceptions.handle(request, _('Unable to accept workload transfer.'),
                              redirect=redirect)


class ShowTransferForm(forms.SelfHandlingForm):
    name = forms.CharField(
        label=_("Transfer Name"),
        widget=forms.TextInput(attrs={'readonly': 'readonly'}),
        required=False)
    id = forms.CharField(
        label=_("Transfer ID"),
        widget=forms.TextInput(attrs={'readonly': 'readonly'}),
        required=False)
    auth_key = forms.CharField(
        label=_("Authorization Key"),
        widget=forms.TextInput(attrs={'readonly': 'readonly'}),
        required=False)

    def handle(self, request, data):
        pass