Fix trigger creation failed

Currently, karbor use 'calendar' format as the default
time format, but karbor-dashboard use 'crontab', this
makes the trigger creation failed. This patch convert
the time format of the dashboard to canlendar to make
it work.

Change-Id: I7a89365005af3256bdf02478dd60428a118a8bbe
Closes-Bug: #1613587
This commit is contained in:
Jiao Pengju
2017-11-23 15:07:55 +08:00
parent 29740fce21
commit cce93819d1
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")