Skip to content

Commit b1752c1

Browse files
softlayer#1099 updated event_log get to support pagination
1 parent 44c9c9c commit b1752c1

3 files changed

Lines changed: 68 additions & 68 deletions

File tree

SoftLayer/API.py

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -296,12 +296,15 @@ def iter_call(self, service, method, *args, **kwargs):
296296
if isinstance(results, list):
297297
# Close enough, this makes testing a lot easier
298298
results = transports.SoftLayerListResult(results, len(results))
299+
elif results is None:
300+
yield results, 0
301+
return
299302
else:
300-
yield results
303+
yield results, 1
301304
return
302305

303306
for item in results:
304-
yield item
307+
yield item, results.total_count
305308
result_count += 1
306309

307310
# Got less results than requested, we are at the end

SoftLayer/CLI/event_log/get.py

Lines changed: 49 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -6,8 +6,8 @@
66
import click
77

88
import SoftLayer
9+
from SoftLayer import utils
910
from SoftLayer.CLI import environment
10-
from SoftLayer.CLI import formatting
1111

1212
COLUMNS = ['event', 'object', 'type', 'date', 'username']
1313

@@ -23,44 +23,47 @@
2323
help="The id of the object we want to get event logs for")
2424
@click.option('--obj-type', '-t',
2525
help="The type of the object we want to get event logs for")
26-
@click.option('--utc-offset', '-z',
27-
help="UTC Offset for searching with dates. The default is -0000")
28-
@click.option('--metadata/--no-metadata', default=False,
26+
@click.option('--utc-offset', '-z', default='-0000', show_default=True,
27+
help="UTC Offset for searching with dates. +/-HHMM format")
28+
@click.option('--metadata/--no-metadata', default=False, show_default=True,
2929
help="Display metadata if present")
30-
@click.option('--limit', '-l', default=30,
31-
help="How many results to get in one api call, default is 30.")
30+
@click.option('--limit', '-l', type=click.INT, default=50, show_default=True,
31+
help="Total number of result to return. -1 to return ALL, there may be a LOT of these.")
3232
@environment.pass_env
3333
def cli(env, date_min, date_max, obj_event, obj_id, obj_type, utc_offset, metadata, limit):
3434
"""Get Event Logs"""
3535

36-
mgr = SoftLayer.EventLogManager(env.client)
37-
usrmgr = SoftLayer.UserManager(env.client)
38-
request_filter = mgr.build_filter(date_min, date_max, obj_event, obj_id, obj_type, utc_offset)
39-
logs = mgr.get_event_logs(request_filter, log_limit=limit)
40-
41-
if logs is None:
42-
env.fout('None available.')
43-
return
36+
event_mgr = SoftLayer.EventLogManager(env.client)
37+
user_mgr = SoftLayer.UserManager(env.client)
38+
request_filter = event_mgr.build_filter(date_min, date_max, obj_event, obj_id, obj_type, utc_offset)
39+
logs = event_mgr.get_event_logs(request_filter)
40+
log_time = "%Y-%m-%dT%H:%M:%S.%f%z"
41+
user_data = {}
4442

4543
if metadata and 'metadata' not in COLUMNS:
4644
COLUMNS.append('metadata')
4745

48-
table = formatting.Table(COLUMNS)
46+
row_count = 0
47+
for log, rows in logs:
48+
if log is None:
49+
click.secho('No logs available for filter %s.' % request_filter, fg='red')
50+
return
4951

50-
if metadata:
51-
table.align['metadata'] = "l"
52+
if row_count == 0:
53+
if limit < 0:
54+
limit = rows
55+
click.secho("Number of records: %s" % rows, fg='red')
56+
click.secho(", ".join(COLUMNS))
5257

53-
for log in logs:
5458
user = log['userType']
55-
label = ''
56-
57-
try:
58-
label = log['label']
59-
except KeyError:
60-
pass # label is already at default value.
61-
59+
label = log.get('label', '')
6260
if user == "CUSTOMER":
63-
user = usrmgr.get_user(log['userId'], "mask[username]")['username']
61+
username = user_data.get(log['userId'])
62+
if username is None:
63+
username = user_mgr.get_user(log['userId'], "mask[username]")['username']
64+
user_data[log['userId']] = username
65+
user = username
66+
6467
if metadata:
6568
try:
6669
metadata_data = json.dumps(json.loads(log['metaData']), indent=4, sort_keys=True)
@@ -69,9 +72,24 @@ def cli(env, date_min, date_max, obj_event, obj_id, obj_type, utc_offset, metada
6972
except ValueError:
7073
metadata_data = log['metaData']
7174

72-
table.add_row([log['eventName'], label, log['objectName'],
73-
log['eventCreateDate'], user, metadata_data])
75+
click.secho('"{0}","{1}","{2}","{3}","{4}","{5}"'.format(
76+
log['eventName'],
77+
label,
78+
log['objectName'],
79+
utils.clean_time(log['eventCreateDate'], in_format=log_time),
80+
user,
81+
metadata_data)
82+
)
7483
else:
75-
table.add_row([log['eventName'], label, log['objectName'],
76-
log['eventCreateDate'], user])
77-
env.fout(table)
84+
click.secho('"{0}","{1}","{2}","{3}","{4}"'.format(
85+
log['eventName'],
86+
label,
87+
log['objectName'],
88+
utils.clean_time(log['eventCreateDate'], in_format=log_time),
89+
user)
90+
)
91+
92+
row_count = row_count + 1
93+
if row_count >= limit:
94+
return
95+

SoftLayer/managers/event_log.py

Lines changed: 14 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -17,16 +17,23 @@ class EventLogManager(object):
1717
"""
1818

1919
def __init__(self, client):
20+
self.client = client
2021
self.event_log = client['Event_Log']
2122

22-
def get_event_logs(self, request_filter, log_limit=10):
23+
def get_event_logs(self, request_filter={}, log_limit=50, iter=True):
2324
"""Returns a list of event logs
2425
2526
:param dict request_filter: filter dict
27+
:param int log_limit: number of results to get in one API call
28+
:param bool iter: False will only make one API call for log_limit results.
29+
True will keep making API calls until all logs have been retreived. There may be a lot of these.
2630
:returns: List of event logs
2731
"""
28-
results = self.event_log.getAllObjects(filter=request_filter, limit=log_limit)
29-
return results
32+
if iter:
33+
# Call iter_call directly as this returns the actual generator
34+
return self.client.iter_call('Event_Log', 'getAllObjects', filter=request_filter, limit=log_limit)
35+
return self.client.call('Event_Log', 'getAllObjects', filter=request_filter, limit=log_limit)
36+
3037

3138
def get_event_log_types(self):
3239
"""Returns a list of event log types
@@ -36,28 +43,6 @@ def get_event_log_types(self):
3643
results = self.event_log.getAllEventObjectNames()
3744
return results
3845

39-
def get_event_logs_by_type(self, event_type):
40-
"""Returns a list of event logs, filtered on the 'objectName' field
41-
42-
:param string event_type: The event type we want to filter on
43-
:returns: List of event logs, filtered on the 'objectName' field
44-
"""
45-
request_filter = {}
46-
request_filter['objectName'] = {'operation': event_type}
47-
48-
return self.event_log.getAllObjects(filter=request_filter)
49-
50-
def get_event_logs_by_event_name(self, event_name):
51-
"""Returns a list of event logs, filtered on the 'eventName' field
52-
53-
:param string event_type: The event type we want to filter on
54-
:returns: List of event logs, filtered on the 'eventName' field
55-
"""
56-
request_filter = {}
57-
request_filter['eventName'] = {'operation': event_name}
58-
59-
return self.event_log.getAllObjects(filter=request_filter)
60-
6146
@staticmethod
6247
def build_filter(date_min, date_max, obj_event, obj_id, obj_type, utc_offset):
6348
"""Returns a query filter that can be passed into EventLogManager.get_event_logs
@@ -73,24 +58,18 @@ def build_filter(date_min, date_max, obj_event, obj_id, obj_type, utc_offset):
7358
:returns: dict: The generated query filter
7459
"""
7560

76-
if not date_min and not date_max and not obj_event and not obj_id and not obj_type:
77-
return None
61+
if not any([date_min, date_max, obj_event, obj_id, obj_type]):
62+
return {}
7863

7964
request_filter = {}
8065

8166
if date_min and date_max:
8267
request_filter['eventCreateDate'] = utils.event_log_filter_between_date(date_min, date_max, utc_offset)
8368
else:
8469
if date_min:
85-
request_filter['eventCreateDate'] = utils.event_log_filter_greater_than_date(
86-
date_min,
87-
utc_offset
88-
)
70+
request_filter['eventCreateDate'] = utils.event_log_filter_greater_than_date(date_min, utc_offset)
8971
elif date_max:
90-
request_filter['eventCreateDate'] = utils.event_log_filter_less_than_date(
91-
date_max,
92-
utc_offset
93-
)
72+
request_filter['eventCreateDate'] = utils.event_log_filter_less_than_date(date_max, utc_offset)
9473

9574
if obj_event:
9675
request_filter['eventName'] = {'operation': obj_event}

0 commit comments

Comments
 (0)