Fix the error of escape character in calendar_time.py
When create trigger by CLI or other method, the body will be transformated, such as: "BEGIN:VEVENT\nRRULE:FREQ=MINUTELY;INTERVAL=5;\nEND:VEVENT" will be transformated as: "BEGIN:VEVENT\\nRRULE:FREQ=MINUTELY;INTERVAL=5;\\nEND:VEVENT" that will be an error in initializing ICal object or check_time_format. Change-Id: I78d046047b08013bd0cc9540f9c9ec7e30a4bf0a
This commit is contained in:
parent
8b4778db03
commit
06c3a3235a
|
@ -14,6 +14,7 @@ import os
|
|||
from datetime import timedelta
|
||||
from dateutil import rrule
|
||||
from icalendar import Calendar
|
||||
from oslo_serialization import jsonutils
|
||||
from oslo_utils import timeutils
|
||||
|
||||
from karbor import exception
|
||||
|
@ -45,12 +46,21 @@ class ICal(timeformats.TimeFormat):
|
|||
|
||||
def __init__(self, start_time, pattern):
|
||||
super(ICal, self).__init__(start_time, pattern)
|
||||
cal = Calendar.from_ical(pattern)
|
||||
cal = Calendar.from_ical(self._decode_calendar_pattern(pattern))
|
||||
vevent = cal.walk('VEVENT')[0]
|
||||
self.dtstart = start_time
|
||||
self.min_freq = self._get_min_freq(vevent)
|
||||
self.rrule_obj = self._get_rrule_obj(vevent, start_time)
|
||||
|
||||
@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 _get_rrule_obj(vevent, dtstart):
|
||||
rrules = vevent.get('RRULE')
|
||||
|
@ -76,7 +86,7 @@ class ICal(timeformats.TimeFormat):
|
|||
:param pattern: The pattern of the icalendar time
|
||||
"""
|
||||
try:
|
||||
cal_obj = Calendar.from_ical(pattern)
|
||||
cal_obj = Calendar.from_ical(cls._decode_calendar_pattern(pattern))
|
||||
except Exception:
|
||||
msg = (_("The trigger pattern(%s) is invalid") % pattern)
|
||||
raise exception.InvalidInput(msg)
|
||||
|
|
|
@ -13,6 +13,7 @@
|
|||
import re
|
||||
|
||||
from datetime import datetime
|
||||
from oslo_serialization import jsonutils
|
||||
|
||||
from karbor import exception
|
||||
from karbor.services.operationengine.engine.triggers.timetrigger.timeformats \
|
||||
|
@ -95,6 +96,29 @@ class CalendarTimeTestCase(base.TestCase):
|
|||
calendar_time.ICal.check_time_format,
|
||||
pattern)
|
||||
|
||||
def test_valid_pattern(self):
|
||||
pattern = "BEGIN:VEVENT\nRRULE:FREQ=MINUTELY;INTERVAL=60;\nEND:VEVENT"
|
||||
self.assertIsNone(calendar_time.ICal.check_time_format(pattern))
|
||||
|
||||
def test_escape_valid_pattern(self):
|
||||
pattern0 = "BEGIN:VEVENT\\nRRULE:FREQ=HOURLY;INTERVAL=1;\\nEND:VEVENT"
|
||||
self.assertIsNone(calendar_time.ICal.check_time_format(pattern0))
|
||||
|
||||
pattern1 = "BEGIN:VEVENT\nRRULE:FREQ=HOURLY;INTERVAL=1;\nEND:VEVENT"
|
||||
properties = {"format": "calendar",
|
||||
"pattern": pattern1}
|
||||
body = {"trigger_info": {"name": "test",
|
||||
"type": "time",
|
||||
"properties": properties,
|
||||
}}
|
||||
quest = jsonutils.dumps(body)
|
||||
recieve = jsonutils.loads(quest)
|
||||
trigger_info = recieve["trigger_info"]
|
||||
trigger_property = trigger_info.get("properties", None)
|
||||
pattern_ = trigger_property.get("pattern", None)
|
||||
|
||||
self.assertIsNone(calendar_time.ICal.check_time_format(pattern_))
|
||||
|
||||
def test_compute_next_time(self):
|
||||
pattern = (
|
||||
"BEGIN:VEVENT\n"
|
||||
|
@ -148,4 +172,4 @@ class CalendarTimeTestCase(base.TestCase):
|
|||
)
|
||||
dtstart = datetime(2016, 2, 20, 17, 0, 0)
|
||||
time_obj = calendar_time.ICal(dtstart, pattern)
|
||||
self.assertEqual(None, time_obj.get_min_interval())
|
||||
self.assertIsNone(time_obj.get_min_interval())
|
||||
|
|
Loading…
Reference in New Issue