Skip to content

Commit 48acb5f

Browse files
Merge pull request #1264 from FernandoOjeda/fo_account_events
Add Account planned, unplanned and announcement events.
2 parents 508966c + 7203df0 commit 48acb5f

File tree

3 files changed

+158
-30
lines changed

3 files changed

+158
-30
lines changed

SoftLayer/CLI/account/events.py

Lines changed: 69 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -16,39 +16,90 @@ def cli(env, ack_all):
1616
"""Summary and acknowledgement of upcoming and ongoing maintenance events"""
1717

1818
manager = AccountManager(env.client)
19-
events = manager.get_upcoming_events()
19+
planned_events = manager.get_upcoming_events("PLANNED")
20+
unplanned_events = manager.get_upcoming_events("UNPLANNED_INCIDENT")
21+
announcement_events = manager.get_upcoming_events("ANNOUNCEMENT")
2022

23+
add_ack_flag(planned_events, manager, ack_all)
24+
env.fout(planned_event_table(planned_events))
25+
26+
add_ack_flag(unplanned_events, manager, ack_all)
27+
env.fout(unplanned_event_table(unplanned_events))
28+
29+
add_ack_flag(announcement_events, manager, ack_all)
30+
env.fout(announcement_event_table(announcement_events))
31+
32+
33+
def add_ack_flag(events, manager, ack_all):
34+
"""Add acknowledgedFlag to the event"""
2135
if ack_all:
2236
for event in events:
2337
result = manager.ack_event(event['id'])
2438
event['acknowledgedFlag'] = result
25-
env.fout(event_table(events))
2639

2740

28-
def event_table(events):
41+
def planned_event_table(events):
2942
"""Formats a table for events"""
30-
table = formatting.Table([
31-
"Id",
32-
"Start Date",
33-
"End Date",
34-
"Subject",
35-
"Status",
36-
"Acknowledged",
37-
"Updates",
38-
"Impacted Resources"
39-
], title="Upcoming Events")
40-
table.align['Subject'] = 'l'
41-
table.align['Impacted Resources'] = 'l'
43+
planned_table = formatting.Table(['Event Data', 'Id', 'Event ID', 'Subject', 'Status', 'Items', 'Start Date',
44+
'End Date', 'Acknowledged', 'Updates'], title="Planned Events")
45+
planned_table.align['Subject'] = 'l'
46+
planned_table.align['Impacted Resources'] = 'l'
4247
for event in events:
43-
table.add_row([
48+
planned_table.add_row([
49+
utils.clean_time(event.get('startDate')),
4450
event.get('id'),
51+
event.get('systemTicketId'),
52+
# Some subjects can have \r\n for some reason.
53+
utils.clean_splitlines(event.get('subject')),
54+
utils.lookup(event, 'statusCode', 'name'),
55+
event.get('impactedResourceCount'),
4556
utils.clean_time(event.get('startDate')),
4657
utils.clean_time(event.get('endDate')),
58+
event.get('acknowledgedFlag'),
59+
event.get('updateCount'),
60+
61+
])
62+
return planned_table
63+
64+
65+
def unplanned_event_table(events):
66+
"""Formats a table for events"""
67+
unplanned_table = formatting.Table(['Id', 'Event ID', 'Subject', 'Status', 'Items', 'Start Date',
68+
'Last Updated', 'Acknowledged', 'Updates'], title="Unplanned Events")
69+
unplanned_table.align['Subject'] = 'l'
70+
unplanned_table.align['Impacted Resources'] = 'l'
71+
for event in events:
72+
print(event.get('modifyDate'))
73+
unplanned_table.add_row([
74+
event.get('id'),
75+
event.get('systemTicketId'),
4776
# Some subjects can have \r\n for some reason.
4877
utils.clean_splitlines(event.get('subject')),
4978
utils.lookup(event, 'statusCode', 'name'),
79+
event.get('impactedResourceCount'),
80+
utils.clean_time(event.get('startDate')),
81+
utils.clean_time(event.get('modifyDate')),
5082
event.get('acknowledgedFlag'),
5183
event.get('updateCount'),
52-
event.get('impactedResourceCount')
5384
])
54-
return table
85+
return unplanned_table
86+
87+
88+
def announcement_event_table(events):
89+
"""Formats a table for events"""
90+
announcement_table = formatting.Table(
91+
['Id', 'Event ID', 'Subject', 'Status', 'Items', 'Acknowledged', 'Updates'], title="Announcement Events")
92+
announcement_table.align['Subject'] = 'l'
93+
announcement_table.align['Impacted Resources'] = 'l'
94+
for event in events:
95+
announcement_table.add_row([
96+
event.get('id'),
97+
event.get('systemTicketId'),
98+
# Some subjects can have \r\n for some reason.
99+
utils.clean_splitlines(event.get('subject')),
100+
utils.lookup(event, 'statusCode', 'name'),
101+
event.get('impactedResourceCount'),
102+
event.get('acknowledgedFlag'),
103+
event.get('updateCount')
104+
])
105+
return announcement_table

SoftLayer/managers/account.py

Lines changed: 46 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -47,25 +47,61 @@ def get_summary(self):
4747
"""
4848
return self.client.call('Account', 'getObject', mask=mask)
4949

50-
def get_upcoming_events(self):
51-
"""Retreives a list of Notification_Occurrence_Events that have not ended yet
50+
def get_upcoming_events(self, event_type):
51+
"""Retrieves a list of Notification_Occurrence_Events that have not ended yet
5252
53+
:param: String event_type: notification event type.
5354
:return: SoftLayer_Notification_Occurrence_Event
5455
"""
55-
mask = "mask[id, subject, startDate, endDate, statusCode, acknowledgedFlag, impactedResourceCount, updateCount]"
56+
mask = "mask[id, subject, startDate, endDate, modifyDate, statusCode, acknowledgedFlag, " \
57+
"impactedResourceCount, updateCount, systemTicketId, notificationOccurrenceEventType[keyName]]"
58+
5659
_filter = {
57-
'endDate': {
58-
'operation': '> sysdate'
59-
},
60-
'startDate': {
60+
'notificationOccurrenceEventType': {
61+
'keyName': {
62+
'operation': event_type
63+
}
64+
}
65+
}
66+
67+
self.add_event_filter(_filter, event_type)
68+
69+
return self.client.call('Notification_Occurrence_Event', 'getAllObjects', filter=_filter, mask=mask, iter=True)
70+
71+
@staticmethod
72+
def add_event_filter(_filter, event_type):
73+
"""Add data to the object filter.
74+
75+
:param: _filter: event filter.
76+
:param: string event_type: event type.
77+
"""
78+
if event_type == 'PLANNED':
79+
_filter['endDate'] = {
80+
'operation': '> sysdate - 2'
81+
}
82+
_filter['startDate'] = {
6183
'operation': 'orderBy',
6284
'options': [{
6385
'name': 'sort',
64-
'value': ['ASC']
86+
'value': ['DESC']
6587
}]
6688
}
67-
}
68-
return self.client.call('Notification_Occurrence_Event', 'getAllObjects', filter=_filter, mask=mask, iter=True)
89+
90+
if event_type == 'UNPLANNED_INCIDENT':
91+
_filter['modifyDate'] = {
92+
'operation': '> sysdate - 2'
93+
}
94+
95+
if event_type == 'ANNOUNCEMENT':
96+
_filter['statusCode'] = {
97+
'keyName': {
98+
'operation': 'in',
99+
'options': [{
100+
'name': 'data',
101+
'value': ['PUBLISHED']
102+
}]
103+
}
104+
}
69105

70106
def ack_event(self, event_id):
71107
"""Acknowledge an event. This mostly prevents it from appearing as a notification in the control portal.

tests/managers/account_tests.py

Lines changed: 43 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -18,10 +18,51 @@ def test_get_summary(self):
1818
self.manager.get_summary()
1919
self.assert_called_with('SoftLayer_Account', 'getObject')
2020

21-
def test_get_upcoming_events(self):
22-
self.manager.get_upcoming_events()
21+
def test_get_planned_upcoming_events(self):
22+
self.manager.get_upcoming_events("PLANNED")
2323
self.assert_called_with(self.SLNOE, 'getAllObjects')
2424

25+
def test_get_unplanned_upcoming_events(self):
26+
self.manager.get_upcoming_events("UNPLANNED_INCIDENT")
27+
self.assert_called_with(self.SLNOE, 'getAllObjects')
28+
29+
def test_get_announcement_upcoming_events(self):
30+
self.manager.get_upcoming_events("ANNOUNCEMENT")
31+
self.assert_called_with(self.SLNOE, 'getAllObjects')
32+
33+
def test_add_planned_event_filter(self):
34+
event_type = 'PLANNED'
35+
_filter = {
36+
'notificationOccurrenceEventType': {
37+
'keyName': {
38+
'operation': event_type
39+
}
40+
}
41+
}
42+
self.manager.add_event_filter(_filter, event_type)
43+
44+
def test_add_unplanned_event_filter(self):
45+
event_type = 'UNPLANNED_INCIDENT'
46+
_filter = {
47+
'notificationOccurrenceEventType': {
48+
'keyName': {
49+
'operation': event_type
50+
}
51+
}
52+
}
53+
self.manager.add_event_filter(_filter, event_type)
54+
55+
def test_add_announcement_event_filter(self):
56+
event_type = 'ANNOUNCEMENT'
57+
_filter = {
58+
'notificationOccurrenceEventType': {
59+
'keyName': {
60+
'operation': event_type
61+
}
62+
}
63+
}
64+
self.manager.add_event_filter(_filter, event_type)
65+
2566
def test_ack_event(self):
2667
self.manager.ack_event(12345)
2768
self.assert_called_with(self.SLNOE, 'acknowledgeNotification', identifier=12345)

0 commit comments

Comments
 (0)