Repository URL to install this package:
Version:
4.2.64-4.2 ▾
|
python3-tvault-horizon-plugin-el8
/
usr
/
lib
/
python3.6
/
site-packages
/
dashboards
/
workloads
/
workflows.py
|
---|
# 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