Skip to content

Commit 8c4fd58

Browse files
committed
Added flag to command slcli account events --date-min
1 parent 4c4cce7 commit 8c4fd58

File tree

4 files changed

+61
-24
lines changed

4 files changed

+61
-24
lines changed

SoftLayer/CLI/account/events.py

Lines changed: 12 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -11,21 +11,25 @@
1111

1212
@click.command(cls=SLCommand)
1313
@click.option('--ack-all', is_flag=True, default=False,
14-
help="Acknowledge every upcoming event. Doing so will turn off the popup in the control portal")
14+
help="Acknowledge every upcoming event. Doing so will turn off the popup in the control portal.")
1515
@click.option('--planned', is_flag=True, default=False,
16-
help="Show only planned events")
16+
help="Show only planned events.")
1717
@click.option('--unplanned', is_flag=True, default=False,
18-
help="Show only unplanned events")
18+
help="Show only unplanned events.")
1919
@click.option('--announcement', is_flag=True, default=False,
20-
help="Show only announcement events")
20+
help="Show only announcement events.")
21+
@click.option('--date-min', help="Earliest date to retrieve events for [MM/DD/YYYY]. Default: 2 days ago.")
2122
@environment.pass_env
22-
def cli(env, ack_all, planned, unplanned, announcement):
23+
def cli(env, ack_all, planned, unplanned, announcement, date_min):
2324
"""Summary and acknowledgement of upcoming and ongoing maintenance events"""
2425

26+
if date_min:
27+
utils.verify_date(date_min)
28+
2529
manager = AccountManager(env.client)
26-
planned_events = manager.get_upcoming_events("PLANNED")
27-
unplanned_events = manager.get_upcoming_events("UNPLANNED_INCIDENT")
28-
announcement_events = manager.get_upcoming_events("ANNOUNCEMENT")
30+
planned_events = manager.get_upcoming_events("PLANNED", date_min)
31+
unplanned_events = manager.get_upcoming_events("UNPLANNED_INCIDENT", date_min)
32+
announcement_events = manager.get_upcoming_events("ANNOUNCEMENT", date_min)
2933

3034
add_ack_flag(planned_events, manager, ack_all)
3135
add_ack_flag(unplanned_events, manager, ack_all)

SoftLayer/managers/account.py

Lines changed: 30 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -53,10 +53,11 @@ def get_summary(self):
5353
"""
5454
return self.client.call('Account', 'getObject', mask=mask)
5555

56-
def get_upcoming_events(self, event_type):
56+
def get_upcoming_events(self, event_type, date_min):
5757
"""Retrieves a list of Notification_Occurrence_Events that have not ended yet
5858
5959
:param: String event_type: notification event type.
60+
:param: String date_min: greater Than Date to data recovery, default is 2 days ago.
6061
:return: SoftLayer_Notification_Occurrence_Event
6162
"""
6263
mask = "mask[id, subject, startDate, endDate, modifyDate, statusCode, acknowledgedFlag, " \
@@ -70,21 +71,32 @@ def get_upcoming_events(self, event_type):
7071
}
7172
}
7273

73-
self.add_event_filter(_filter, event_type)
74+
self.add_event_filter(_filter, event_type, date_min)
7475

7576
return self.client.call('Notification_Occurrence_Event', 'getAllObjects', filter=_filter, mask=mask, iter=True)
7677

7778
@staticmethod
78-
def add_event_filter(_filter, event_type):
79+
def add_event_filter(_filter, event_type, date_min):
7980
"""Add data to the object filter.
8081
8182
:param: _filter: event filter.
8283
:param: string event_type: event type.
84+
:param: string date_min: greater Than Date to data recovery, default is 2 days ago.
8385
"""
86+
8487
if event_type == 'PLANNED':
85-
_filter['endDate'] = {
86-
'operation': '> sysdate - 2'
87-
}
88+
if date_min:
89+
_filter['endDate'] = {
90+
'operation': 'greaterThanDate',
91+
'options': [{
92+
'name': 'date',
93+
'value': [date_min]
94+
}]
95+
}
96+
else:
97+
_filter['endDate'] = {
98+
'operation': '> sysdate - 2'
99+
}
88100
_filter['startDate'] = {
89101
'operation': 'orderBy',
90102
'options': [{
@@ -94,9 +106,18 @@ def add_event_filter(_filter, event_type):
94106
}
95107

96108
if event_type == 'UNPLANNED_INCIDENT':
97-
_filter['modifyDate'] = {
98-
'operation': '> sysdate - 2'
99-
}
109+
if date_min:
110+
_filter['modifyDate'] = {
111+
'operation': 'greaterThanDate',
112+
'options': [{
113+
'name': 'date',
114+
'value': [date_min]
115+
}]
116+
}
117+
else:
118+
_filter['modifyDate'] = {
119+
'operation': '> sysdate - 2'
120+
}
100121

101122
if event_type == 'ANNOUNCEMENT':
102123
_filter['statusCode'] = {

SoftLayer/utils.py

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@
1313

1414
from rich.console import Console
1515
from rich.theme import Theme
16-
16+
from SoftLayer.CLI import exceptions
1717
# pylint: disable=no-member, invalid-name
1818

1919
UUID_RE = re.compile(r'^[0-9A-F]{8}-[0-9A-F]{4}-4[0-9A-F]{3}-[89AB][0-9A-F]{3}-[0-9A-F]{12}$', re.I)
@@ -371,6 +371,18 @@ def clean_time(sltime, in_format='%Y-%m-%dT%H:%M:%S%z', out_format='%Y-%m-%d %H:
371371
return sltime
372372

373373

374+
def verify_date(date):
375+
"""Verify if the date format is correct
376+
377+
:param string date: A date in format string
378+
:return a exception if the date is not the correct format
379+
"""
380+
try:
381+
date = datetime.datetime.strptime(date, '%m/%d/%Y')
382+
except Exception as exc:
383+
raise exceptions.CLIAbort('Date invalid, example date: mm/dd/yyyy, 01/15/2023.') from exc
384+
385+
374386
def timestamp(date):
375387
"""Converts a datetime to timestamp
376388

tests/managers/account_tests.py

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -21,15 +21,15 @@ def test_get_summary(self):
2121
self.assert_called_with('SoftLayer_Account', 'getObject')
2222

2323
def test_get_planned_upcoming_events(self):
24-
self.manager.get_upcoming_events("PLANNED")
24+
self.manager.get_upcoming_events("PLANNED", "")
2525
self.assert_called_with(self.SLNOE, 'getAllObjects')
2626

2727
def test_get_unplanned_upcoming_events(self):
28-
self.manager.get_upcoming_events("UNPLANNED_INCIDENT")
28+
self.manager.get_upcoming_events("UNPLANNED_INCIDENT", "")
2929
self.assert_called_with(self.SLNOE, 'getAllObjects')
3030

3131
def test_get_announcement_upcoming_events(self):
32-
self.manager.get_upcoming_events("ANNOUNCEMENT")
32+
self.manager.get_upcoming_events("ANNOUNCEMENT", "")
3333
self.assert_called_with(self.SLNOE, 'getAllObjects')
3434

3535
def test_add_planned_event_filter(self):
@@ -41,7 +41,7 @@ def test_add_planned_event_filter(self):
4141
}
4242
}
4343
}
44-
self.manager.add_event_filter(_filter, event_type)
44+
self.manager.add_event_filter(_filter, event_type, "")
4545

4646
def test_add_unplanned_event_filter(self):
4747
event_type = 'UNPLANNED_INCIDENT'
@@ -52,7 +52,7 @@ def test_add_unplanned_event_filter(self):
5252
}
5353
}
5454
}
55-
self.manager.add_event_filter(_filter, event_type)
55+
self.manager.add_event_filter(_filter, event_type, "")
5656

5757
def test_add_announcement_event_filter(self):
5858
event_type = 'ANNOUNCEMENT'
@@ -63,7 +63,7 @@ def test_add_announcement_event_filter(self):
6363
}
6464
}
6565
}
66-
self.manager.add_event_filter(_filter, event_type)
66+
self.manager.add_event_filter(_filter, event_type, "")
6767

6868
def test_ack_event(self):
6969
self.manager.ack_event(12345)

0 commit comments

Comments
 (0)