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" msgid "Event Trigger"
msgstr "Event Trigger" msgstr "Event Trigger"
msgid "Every Minute"
msgstr "Every Minute"
msgid "Every Hour"
msgstr "Every Hour"
msgid "Every Day" msgid "Every Day"
msgstr "Every Day" msgstr "Every Day"

View File

@ -22,5 +22,17 @@
<dt>{% trans "Execution Time (HH:MM)" %}</dt> <dt>{% trans "Execution Time (HH:MM)" %}</dt>
<dd>{{ trigger.time }}</dd> <dd>{{ trigger.time }}</dd>
{% endif %} {% 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> </dl>
</div> </div>

View File

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

View File

@ -14,29 +14,32 @@
import collections import collections
from django.utils.translation import ugettext_lazy as _ 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')), TRIGGERTYPE_CHOICES = [('time', _('Time Trigger')),
('event', _('Event Trigger'))] ('event', _('Event Trigger'))]
CRONTAB = 'crontab' CRONTAB = 'crontab'
DAY_CHOICES = [('1', _('Monday')), CRONTAB_DAY_CHOICES = [('1', _('Monday')),
('2', _('Tuesday')), ('2', _('Tuesday')),
('3', _('Wednesday')), ('3', _('Wednesday')),
('4', _('Thursday')), ('4', _('Thursday')),
('5', _('Friday')), ('5', _('Friday')),
('6', _('Saturday')), ('6', _('Saturday')),
('0', _('Sunday'))] ('0', _('Sunday'))]
DAY_DICT = collections.OrderedDict(DAY_CHOICES) CRONTAB_DAY_DICT = collections.OrderedDict(CRONTAB_DAY_CHOICES)
EVERYDAY = 'everyday' EVERYDAY = 'everyday'
EVERYWEEK = 'everyweek' EVERYWEEK = 'everyweek'
EVERYMONTH = 'everymonth' EVERYMONTH = 'everymonth'
FREQUENCE_CHOICES = [(EVERYDAY, _('Every Day')), CRONTAB_FREQUENCE_CHOICES = [(EVERYDAY, _('Every Day')),
(EVERYWEEK, _('Every Week')), (EVERYWEEK, _('Every Week')),
(EVERYMONTH, _('Every Month'))] (EVERYMONTH, _('Every Month'))]
FREQUENCE_DICT = collections.OrderedDict(FREQUENCE_CHOICES) CRONTAB_FREQUENCE_DICT = collections.OrderedDict(CRONTAB_FREQUENCE_CHOICES)
class CrontabUtil(object): class CrontabUtil(object):
@ -78,7 +81,9 @@ class CrontabUtil(object):
@staticmethod @staticmethod
def convert_from_crontab(dict_crontab): def convert_from_crontab(dict_crontab):
data = {} data = {
'format': dict_crontab['format']
}
if dict_crontab["format"] == CRONTAB: if dict_crontab["format"] == CRONTAB:
pattern = dict_crontab["pattern"] pattern = dict_crontab["pattern"]
patterns = pattern.split(" ") patterns = pattern.split(" ")
@ -86,18 +91,124 @@ class CrontabUtil(object):
if patterns[2] == "*" \ if patterns[2] == "*" \
and patterns[3] == "*" \ and patterns[3] == "*" \
and patterns[4] == "*": and patterns[4] == "*":
data["frequence"] = FREQUENCE_DICT[EVERYDAY] data["frequence"] = CRONTAB_FREQUENCE_DICT[EVERYDAY]
elif patterns[2] == "*" \ elif patterns[2] == "*" \
and patterns[3] == "*" \ and patterns[3] == "*" \
and patterns[4] != "*": and patterns[4] != "*":
data["frequence"] = FREQUENCE_DICT[EVERYWEEK] data["frequence"] = CRONTAB_FREQUENCE_DICT[EVERYWEEK]
data["day"] = DAY_DICT[patterns[4]] data["day"] = CRONTAB_DAY_DICT[patterns[4]]
elif patterns[2] != "*" \ elif patterns[2] != "*" \
and patterns[3] == "*" \ and patterns[3] == "*" \
and patterns[4] == "*": and patterns[4] == "*":
data["frequence"] = FREQUENCE_DICT[EVERYMONTH] data["frequence"] = CRONTAB_FREQUENCE_DICT[EVERYMONTH]
data["date"] = patterns[2] data["date"] = patterns[2]
data["time"] = '%s:%s' % (patterns[1].zfill(2), data["time"] = '%s:%s' % (patterns[1].zfill(2),
patterns[0].zfill(2)) patterns[0].zfill(2))
return data 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 is not None and trigger.properties is not None:
if trigger.properties["format"] == utils.CRONTAB: if trigger.properties["format"] == utils.CRONTAB:
data = utils.CrontabUtil\ data = utils.CrontabUtil.convert_from_crontab(
.convert_from_crontab(trigger.properties) trigger.properties
if data: )
for key, value in data.items(): else:
setattr(trigger, key, value) data = utils.CalendarUtil.convert_from_calendar(
trigger.properties
)
if data:
for key, value in data.items():
setattr(trigger, key, value)
context["trigger"] = trigger context["trigger"] = trigger
context["url"] = reverse("horizon:karbor:triggers:index") context["url"] = reverse("horizon:karbor:triggers:index")