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:
zhangshuai 2017-03-03 07:59:03 +08:00
parent 8b4778db03
commit 06c3a3235a
2 changed files with 37 additions and 3 deletions

View File

@ -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)

View File

@ -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())