Merge "Fix trigger creation failed"

This commit is contained in:
Zuul 2017-11-23 14:05:09 +00:00 committed by Gerrit Code Review
commit bfcecfee68
5 changed files with 159 additions and 25 deletions

View File

@ -112,6 +112,12 @@ msgstr "Error Deleting"
msgid "Event Trigger"
msgstr "Event Trigger"
msgid "Every Minute"
msgstr "Every Minute"
msgid "Every Hour"
msgstr "Every Hour"
msgid "Every Day"
msgstr "Every Day"

View File

@ -22,5 +22,17 @@
<dt>{% trans "Execution Time (HH:MM)" %}</dt>
<dd>{{ trigger.time }}</dd>
{% endif %}
{% if trigger.hour %}
<dt>{% trans "Hour" %}</dt>
<dd>{{ trigger.hour }}</dd>
{% endif %}
{% if trigger.minute %}
<dt>{% trans "Minute" %}</dt>
<dd>{{ trigger.minute }}</dd>
{% endif %}
{% if trigger.interval %}
<dt>{% trans "Execution Interval" %}</dt>
<dd>{{ trigger.interval }}</dd>
{% endif %}
</dl>
</div>

View File

@ -34,7 +34,7 @@ class CreateTriggerForm(horizon_forms.SelfHandlingForm):
}))
frequence = forms.ChoiceField(
label=_('Frequence'),
choices=utils.FREQUENCE_CHOICES,
choices=utils.CRONTAB_FREQUENCE_CHOICES,
widget=forms.Select(attrs={
'class': 'switchable switched',
'data-slug': 'frequence'}))
@ -60,12 +60,12 @@ class CreateTriggerForm(horizon_forms.SelfHandlingForm):
def __init__(self, request, *args, **kwargs):
super(CreateTriggerForm, self).__init__(request, *args, **kwargs)
self.fields['day'].choices = utils.DAY_CHOICES
self.fields['day'].choices = utils.CRONTAB_DAY_CHOICES
self.fields['date'].choices = [(e, e) for e in range(1, 31 + 1)]
def handle(self, request, data):
try:
data_properties = utils.CrontabUtil.convert_to_crontab(data)
data_properties = utils.CalendarUtil.convert_to_calendar(data)
new_trigger = karborclient.trigger_create(request,
data["name"],
data["type"],

View File

@ -14,29 +14,32 @@
import collections
from django.utils.translation import ugettext_lazy as _
from icalendar.cal import Component
from icalendar import Event
from oslo_serialization import jsonutils
TRIGGERTYPE_CHOICES = [('time', _('Time Trigger')),
('event', _('Event Trigger'))]
CRONTAB = 'crontab'
DAY_CHOICES = [('1', _('Monday')),
('2', _('Tuesday')),
('3', _('Wednesday')),
('4', _('Thursday')),
('5', _('Friday')),
('6', _('Saturday')),
('0', _('Sunday'))]
DAY_DICT = collections.OrderedDict(DAY_CHOICES)
CRONTAB_DAY_CHOICES = [('1', _('Monday')),
('2', _('Tuesday')),
('3', _('Wednesday')),
('4', _('Thursday')),
('5', _('Friday')),
('6', _('Saturday')),
('0', _('Sunday'))]
CRONTAB_DAY_DICT = collections.OrderedDict(CRONTAB_DAY_CHOICES)
EVERYDAY = 'everyday'
EVERYWEEK = 'everyweek'
EVERYMONTH = 'everymonth'
FREQUENCE_CHOICES = [(EVERYDAY, _('Every Day')),
(EVERYWEEK, _('Every Week')),
(EVERYMONTH, _('Every Month'))]
FREQUENCE_DICT = collections.OrderedDict(FREQUENCE_CHOICES)
CRONTAB_FREQUENCE_CHOICES = [(EVERYDAY, _('Every Day')),
(EVERYWEEK, _('Every Week')),
(EVERYMONTH, _('Every Month'))]
CRONTAB_FREQUENCE_DICT = collections.OrderedDict(CRONTAB_FREQUENCE_CHOICES)
class CrontabUtil(object):
@ -78,7 +81,9 @@ class CrontabUtil(object):
@staticmethod
def convert_from_crontab(dict_crontab):
data = {}
data = {
'format': dict_crontab['format']
}
if dict_crontab["format"] == CRONTAB:
pattern = dict_crontab["pattern"]
patterns = pattern.split(" ")
@ -86,18 +91,124 @@ class CrontabUtil(object):
if patterns[2] == "*" \
and patterns[3] == "*" \
and patterns[4] == "*":
data["frequence"] = FREQUENCE_DICT[EVERYDAY]
data["frequence"] = CRONTAB_FREQUENCE_DICT[EVERYDAY]
elif patterns[2] == "*" \
and patterns[3] == "*" \
and patterns[4] != "*":
data["frequence"] = FREQUENCE_DICT[EVERYWEEK]
data["day"] = DAY_DICT[patterns[4]]
data["frequence"] = CRONTAB_FREQUENCE_DICT[EVERYWEEK]
data["day"] = CRONTAB_DAY_DICT[patterns[4]]
elif patterns[2] != "*" \
and patterns[3] == "*" \
and patterns[4] == "*":
data["frequence"] = FREQUENCE_DICT[EVERYMONTH]
data["frequence"] = CRONTAB_FREQUENCE_DICT[EVERYMONTH]
data["date"] = patterns[2]
data["time"] = '%s:%s' % (patterns[1].zfill(2),
patterns[0].zfill(2))
return data
CALENDAR = 'calendar'
CALENDAR_DAY_CHOICES = [('1', _('MO')),
('2', _('TU')),
('3', _('WE')),
('4', _('TH')),
('5', _('FR')),
('6', _('SA')),
('0', _('SU'))]
CALENDAR_DAY_DICT = collections.OrderedDict(CALENDAR_DAY_CHOICES)
CALENDAR_DAY_MAPPING = [('MO', _('Monday')),
('TU', _('Tuesday')),
('WE', _('Wednesday')),
('TH', _('Thursday')),
('FR', _('Friday')),
('SA', _('Saturday')),
('SU', _('Sunday'))]
CALENDAR_DAY_MAPPING_DICT = collections.OrderedDict(CALENDAR_DAY_MAPPING)
MINUTELY = 'MINUTELY'
HOURLY = 'HOURLY'
DAILY = 'DAILY'
WEEKLY = 'WEEKLY'
MONTHLY = 'MONTHLY'
class CalendarUtil(object):
"""Convert to or from calendar format."""
@staticmethod
def convert_to_calendar(data):
dict_calendar = {
"format": CALENDAR,
}
pattern_frequence = ''
if data['frequence'] == EVERYMONTH:
pattern_frequence = MONTHLY
elif data['frequence'] == EVERYWEEK:
pattern_frequence = WEEKLY
elif data['frequence'] == EVERYDAY:
pattern_frequence = DAILY
calendar_event = Event()
rule_pattern = {
'freq': pattern_frequence,
'byhour': data["time"].hour,
'byminute': data["time"].minute,
}
if pattern_frequence == MONTHLY:
rule_pattern['bymonthday'] = data["date"]
elif pattern_frequence == WEEKLY:
rule_pattern['byday'] = CALENDAR_DAY_DICT[data["day"]]
calendar_event.add('rrule', rule_pattern)
dict_calendar['pattern'] = calendar_event.to_ical()
return dict_calendar
@staticmethod
def decode_calendar_pattern(pattern):
try:
pattern.index('\\')
pattern_dict = jsonutils.loads('{"pattern": "%s"}' % pattern)
return pattern_dict["pattern"]
except Exception:
return pattern
@staticmethod
def convert_from_calendar(dict_calendar):
data = {
'format': dict_calendar['format']
}
if dict_calendar["format"] == CALENDAR:
pattern = dict_calendar["pattern"]
calendar_event = Component.from_ical(
CalendarUtil.decode_calendar_pattern(pattern)
)
if isinstance(calendar_event, Event):
calendar_event_rule = calendar_event['RRULE']
data['frequence'] = calendar_event_rule['FREQ'][0]
if data['frequence'] == MONTHLY and not (
'INTERVAL' in calendar_event['RRULE']):
data['date'] = ' '.join(
str(date)
for date in calendar_event_rule['BYMONTHDAY'])
if data['frequence'] == WEEKLY and not (
'INTERVAL' in calendar_event['RRULE']):
data['day'] = ' '.join(
str(CALENDAR_DAY_MAPPING_DICT[day])
for day in calendar_event_rule['BYDAY'])
if 'BYHOUR' in calendar_event['RRULE']:
data['hour'] = ' '.join(
str(hour) for hour in calendar_event_rule['BYHOUR'])
if 'BYMINUTE' in calendar_event['RRULE']:
data['minute'] = ' '.join(
str(minute)
for minute in calendar_event_rule['BYMINUTE'])
if 'INTERVAL' in calendar_event['RRULE']:
data['interval'] = ' '.join(
str(interval)
for interval in calendar_event_rule['INTERVAL'])
return data

View File

@ -89,11 +89,16 @@ class DetailView(horizon_views.HorizonTemplateView):
if trigger is not None and trigger.properties is not None:
if trigger.properties["format"] == utils.CRONTAB:
data = utils.CrontabUtil\
.convert_from_crontab(trigger.properties)
if data:
for key, value in data.items():
setattr(trigger, key, value)
data = utils.CrontabUtil.convert_from_crontab(
trigger.properties
)
else:
data = utils.CalendarUtil.convert_from_calendar(
trigger.properties
)
if data:
for key, value in data.items():
setattr(trigger, key, value)
context["trigger"] = trigger
context["url"] = reverse("horizon:karbor:triggers:index")