Skip to content

Commit d43b475

Browse files
committed
Make topology.Downtime.parsetime() public & don't use dateparser (SOFTWARE-3313)
1 parent b44e326 commit d43b475

File tree

2 files changed

+28
-21
lines changed

2 files changed

+28
-21
lines changed

requirements.txt

-1
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,4 @@
11
Flask
22
gunicorn
33
anymarkup
4-
dateparser
54
requests

src/webapp/topology.py

+28-20
Original file line numberDiff line numberDiff line change
@@ -2,12 +2,9 @@
22
from datetime import datetime, timedelta, timezone
33
from enum import Enum
44
from logging import getLogger
5-
import re
65
import urllib.parse
76
from typing import Dict, List
87

9-
import dateparser
10-
118
from .common import MaybeOrderedDict, RGDOWNTIME_SCHEMA_URL, RGSUMMARY_SCHEMA_URL, Filters,\
129
is_null, expand_attr_list_single, expand_attr_list, ensure_list
1310
from .contacts_reader import ContactsData
@@ -289,8 +286,8 @@ class Downtime(object):
289286
def __init__(self, rg: ResourceGroup, yaml_data: Dict):
290287
self.rg = rg
291288
self.data = yaml_data
292-
self.start_time = self._parsetime(yaml_data["StartTime"])
293-
self.end_time = self._parsetime(yaml_data["EndTime"])
289+
self.start_time = self.parsetime(yaml_data["StartTime"])
290+
self.end_time = self.parsetime(yaml_data["EndTime"])
294291

295292
@property
296293
def timeframe(self) -> Timeframe:
@@ -367,28 +364,39 @@ def _expand_downtime(self, service_filter=None) -> MaybeOrderedDict:
367364
new_downtime["CreatedTime"] = "Not Available"
368365
new_downtime["UpdateTime"] = "Not Available"
369366

370-
fmt = "%b %d, %Y %H:%M %p %Z"
371-
new_downtime["StartTime"] = self.start_time.strftime(fmt)
372-
new_downtime["EndTime"] = self.end_time.strftime(fmt)
367+
output_fmt = "%b %d, %Y %H:%M %p %Z"
368+
new_downtime["StartTime"] = self.start_time.strftime(output_fmt)
369+
new_downtime["EndTime"] = self.end_time.strftime(output_fmt)
373370

374371
for k in ["ID", "Class", "Severity", "Description"]:
375372
new_downtime[k] = self.data.get(k, None)
376373

377374
return new_downtime
378375

379376
@staticmethod
380-
def _parsetime(time_str: str) -> datetime:
381-
# get rid of stupid times like "00:00 AM" or "17:00 PM"
382-
if re.search(r"\s+00:\d\d\s+AM", time_str):
383-
time_str = time_str.replace(" AM", "")
384-
elif re.search(r"\s+(1[3-9]|2[0-3]):\d\d\s+PM", time_str):
385-
time_str = time_str.replace(" PM", "")
386-
time = dateparser.parse(time_str)
387-
if not time:
388-
raise ValueError("Invalid time {0}".format(time_str))
389-
if not time.tzinfo:
390-
time = time.replace(tzinfo=timezone.utc)
391-
return time
377+
def parsetime(time_str: str) -> datetime:
378+
"""Parse the downtime found in the YAML file; tries multiple formats,
379+
returns the first one that matches.
380+
381+
Raises ValueError if time_str cannot be parsed with any of the formats.
382+
"""
383+
384+
fmts = ["%b %d, %Y %H:%M %z", # preferred format, e.g. "Mar 7, 2017 03:00 -0500"
385+
"%b %d, %Y %H:%M UTC", # explicit UTC timezone
386+
"%b %d, %Y %H:%M", # without timezone (assumes UTC)
387+
"%b %d, %Y %H:%M %p UTC"] # format existing data is in, e.g. "Mar 7, 2017 03:00 AM UTC"
388+
389+
time = None
390+
for fmt in fmts:
391+
try:
392+
time = datetime.strptime(time_str, fmt)
393+
except ValueError:
394+
pass
395+
if time:
396+
if not time.tzinfo:
397+
time = time.replace(tzinfo=timezone.utc)
398+
return time
399+
raise ValueError("Cannot parse time {}".format(time_str))
392400

393401

394402
class Topology(object):

0 commit comments

Comments
 (0)