Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions SoftLayer/API.py
Original file line number Diff line number Diff line change
Expand Up @@ -6,8 +6,10 @@
:license: MIT, see LICENSE for more details.
"""
# pylint: disable=invalid-name
from __future__ import generators
import warnings


from SoftLayer import auth as slauth
from SoftLayer import config
from SoftLayer import consts
Expand Down
26 changes: 13 additions & 13 deletions SoftLayer/CLI/call_api.py
Original file line number Diff line number Diff line change
Expand Up @@ -87,19 +87,19 @@ def cli(env, service, method, parameters, _id, _filters, mask, limit, offset,
output_python=False):
"""Call arbitrary API endpoints with the given SERVICE and METHOD.

\b
Examples:
slcli call-api Account getObject
slcli call-api Account getVirtualGuests --limit=10 --mask=id,hostname
slcli call-api Virtual_Guest getObject --id=12345
slcli call-api Metric_Tracking_Object getBandwidthData --id=1234 \\
"2015-01-01 00:00:00" "2015-01-1 12:00:00" public
slcli call-api Account getVirtualGuests \\
-f 'virtualGuests.datacenter.name=dal05' \\
-f 'virtualGuests.maxCpu=4' \\
--mask=id,hostname,datacenter.name,maxCpu
slcli call-api Account getVirtualGuests \\
-f 'virtualGuests.datacenter.name IN dal05,sng01'
Example::

slcli call-api Account getObject
slcli call-api Account getVirtualGuests --limit=10 --mask=id,hostname
slcli call-api Virtual_Guest getObject --id=12345
slcli call-api Metric_Tracking_Object getBandwidthData --id=1234 \\
"2015-01-01 00:00:00" "2015-01-1 12:00:00" public
slcli call-api Account getVirtualGuests \\
-f 'virtualGuests.datacenter.name=dal05' \\
-f 'virtualGuests.maxCpu=4' \\
--mask=id,hostname,datacenter.name,maxCpu
slcli call-api Account getVirtualGuests \\
-f 'virtualGuests.datacenter.name IN dal05,sng01'
"""

args = [service, method] + list(parameters)
Expand Down
83 changes: 50 additions & 33 deletions SoftLayer/CLI/event_log/get.py
Original file line number Diff line number Diff line change
@@ -1,15 +1,11 @@
"""Get Event Logs."""
# :license: MIT, see LICENSE for more details.

import json

import click

import SoftLayer
from SoftLayer.CLI import environment
from SoftLayer.CLI import formatting

COLUMNS = ['event', 'object', 'type', 'date', 'username']
from SoftLayer import utils


@click.command()
Expand All @@ -23,44 +19,65 @@
help="The id of the object we want to get event logs for")
@click.option('--obj-type', '-t',
help="The type of the object we want to get event logs for")
@click.option('--utc-offset', '-z',
help="UTC Offset for searching with dates. The default is -0000")
@click.option('--metadata/--no-metadata', default=False,
@click.option('--utc-offset', '-z', default='-0000', show_default=True,
help="UTC Offset for searching with dates. +/-HHMM format")
@click.option('--metadata/--no-metadata', default=False, show_default=True,
help="Display metadata if present")
@click.option('--limit', '-l', type=click.INT, default=50, show_default=True,
help="Total number of result to return. -1 to return ALL, there may be a LOT of these.")
@environment.pass_env
def cli(env, date_min, date_max, obj_event, obj_id, obj_type, utc_offset, metadata):
"""Get Event Logs"""
mgr = SoftLayer.EventLogManager(env.client)
usrmgr = SoftLayer.UserManager(env.client)
request_filter = mgr.build_filter(date_min, date_max, obj_event, obj_id, obj_type, utc_offset)
logs = mgr.get_event_logs(request_filter)
def cli(env, date_min, date_max, obj_event, obj_id, obj_type, utc_offset, metadata, limit):
"""Get Event Logs

if logs is None:
env.fout('None available.')
return
Example:
slcli event-log get -d 01/01/2019 -D 02/01/2019 -t User -l 10
"""
columns = ['Event', 'Object', 'Type', 'Date', 'Username']

if metadata and 'metadata' not in COLUMNS:
COLUMNS.append('metadata')
event_mgr = SoftLayer.EventLogManager(env.client)
user_mgr = SoftLayer.UserManager(env.client)
request_filter = event_mgr.build_filter(date_min, date_max, obj_event, obj_id, obj_type, utc_offset)
logs = event_mgr.get_event_logs(request_filter)
log_time = "%Y-%m-%dT%H:%M:%S.%f%z"
user_data = {}

table = formatting.Table(COLUMNS)
if metadata:
table.align['metadata'] = "l"
columns.append('Metadata')

row_count = 0
click.secho(", ".join(columns))
for log in logs:
if log is None:
click.secho('No logs available for filter %s.' % request_filter, fg='red')
return

user = log['userType']
label = log.get('label', '')
if user == "CUSTOMER":
user = usrmgr.get_user(log['userId'], "mask[username]")['username']
username = user_data.get(log['userId'])
if username is None:
username = user_mgr.get_user(log['userId'], "mask[username]")['username']
user_data[log['userId']] = username
user = username

if metadata:
try:
metadata_data = json.dumps(json.loads(log['metaData']), indent=4, sort_keys=True)
if env.format == "table":
metadata_data = metadata_data.strip("{}\n\t")
except ValueError:
metadata_data = log['metaData']
metadata_data = log['metaData'].strip("\n\t")

table.add_row([log['eventName'], log['label'], log['objectName'],
log['eventCreateDate'], user, metadata_data])
click.secho("'{0}','{1}','{2}','{3}','{4}','{5}'".format(
log['eventName'],
label,
log['objectName'],
utils.clean_time(log['eventCreateDate'], in_format=log_time),
user,
metadata_data))
else:
table.add_row([log['eventName'], log['label'], log['objectName'],
log['eventCreateDate'], user])
env.fout(table)
click.secho("'{0}','{1}','{2}','{3}','{4}'".format(
log['eventName'],
label,
log['objectName'],
utils.clean_time(log['eventCreateDate'], in_format=log_time),
user))

row_count = row_count + 1
if row_count >= limit and limit != -1:
return
63 changes: 25 additions & 38 deletions SoftLayer/managers/event_log.py
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
"""
SoftLayer.event_log
~~~~~~~~~~~~~~~~~
~~~~~~~~~~~~~~~~~~~
Network Manager/helpers

:license: MIT, see LICENSE for more details.
Expand All @@ -17,16 +17,31 @@ class EventLogManager(object):
"""

def __init__(self, client):
self.client = client
self.event_log = client['Event_Log']

def get_event_logs(self, request_filter):
def get_event_logs(self, request_filter=None, log_limit=20, iterator=True):
"""Returns a list of event logs

Example::

event_mgr = SoftLayer.EventLogManager(env.client)
request_filter = event_mgr.build_filter(date_min="01/01/2019", date_max="02/01/2019")
logs = event_mgr.get_event_logs(request_filter)
for log in logs:
print("Event Name: {}".format(log['eventName']))


:param dict request_filter: filter dict
:returns: List of event logs
:param int log_limit: number of results to get in one API call
:param bool iterator: False will only make one API call for log_limit results.
True will keep making API calls until all logs have been retreived. There may be a lot of these.
:returns: List of event logs. If iterator=True, will return a python generator object instead.
"""
results = self.event_log.getAllObjects(filter=request_filter)
return results
if iterator:
# Call iter_call directly as this returns the actual generator
return self.client.iter_call('Event_Log', 'getAllObjects', filter=request_filter, limit=log_limit)
return self.client.call('Event_Log', 'getAllObjects', filter=request_filter, limit=log_limit)

def get_event_log_types(self):
"""Returns a list of event log types
Expand All @@ -36,30 +51,8 @@ def get_event_log_types(self):
results = self.event_log.getAllEventObjectNames()
return results

def get_event_logs_by_type(self, event_type):
"""Returns a list of event logs, filtered on the 'objectName' field

:param string event_type: The event type we want to filter on
:returns: List of event logs, filtered on the 'objectName' field
"""
request_filter = {}
request_filter['objectName'] = {'operation': event_type}

return self.event_log.getAllObjects(filter=request_filter)

def get_event_logs_by_event_name(self, event_name):
"""Returns a list of event logs, filtered on the 'eventName' field

:param string event_type: The event type we want to filter on
:returns: List of event logs, filtered on the 'eventName' field
"""
request_filter = {}
request_filter['eventName'] = {'operation': event_name}

return self.event_log.getAllObjects(filter=request_filter)

@staticmethod
def build_filter(date_min, date_max, obj_event, obj_id, obj_type, utc_offset):
def build_filter(date_min=None, date_max=None, obj_event=None, obj_id=None, obj_type=None, utc_offset=None):
"""Returns a query filter that can be passed into EventLogManager.get_event_logs

:param string date_min: Lower bound date in MM/DD/YYYY format
Expand All @@ -73,24 +66,18 @@ def build_filter(date_min, date_max, obj_event, obj_id, obj_type, utc_offset):
:returns: dict: The generated query filter
"""

if not date_min and not date_max and not obj_event and not obj_id and not obj_type:
return None
if not any([date_min, date_max, obj_event, obj_id, obj_type]):
return {}

request_filter = {}

if date_min and date_max:
request_filter['eventCreateDate'] = utils.event_log_filter_between_date(date_min, date_max, utc_offset)
else:
if date_min:
request_filter['eventCreateDate'] = utils.event_log_filter_greater_than_date(
date_min,
utc_offset
)
request_filter['eventCreateDate'] = utils.event_log_filter_greater_than_date(date_min, utc_offset)
elif date_max:
request_filter['eventCreateDate'] = utils.event_log_filter_less_than_date(
date_max,
utc_offset
)
request_filter['eventCreateDate'] = utils.event_log_filter_less_than_date(date_max, utc_offset)

if obj_event:
request_filter['eventName'] = {'operation': obj_event}
Expand Down
6 changes: 4 additions & 2 deletions SoftLayer/managers/network.py
Original file line number Diff line number Diff line change
Expand Up @@ -575,14 +575,16 @@ def _get_cci_event_logs(self):
event_log_mgr = event_log.EventLogManager(self.client)

# Get CCI Event Logs
return event_log_mgr.get_event_logs_by_type('CCI')
_filter = event_log_mgr.build_filter(obj_type='CCI')
return event_log_mgr.get_event_logs(request_filter=_filter)

def _get_security_group_event_logs(self):
# Load the event log manager
event_log_mgr = event_log.EventLogManager(self.client)

# Get CCI Event Logs
return event_log_mgr.get_event_logs_by_type('Security Group')
_filter = event_log_mgr.build_filter(obj_type='Security Group')
return event_log_mgr.get_event_logs(request_filter=_filter)

def resolve_global_ip_ids(self, identifier):
"""Resolve global ip ids."""
Expand Down
5 changes: 5 additions & 0 deletions docs/api/managers/event_log.rst
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
.. _event_log:

.. automodule:: SoftLayer.managers.event_log
:members:
:inherited-members:
9 changes: 3 additions & 6 deletions docs/cli.rst
Original file line number Diff line number Diff line change
Expand Up @@ -11,13 +11,9 @@ functionality not fully documented here.

.. toctree::
:maxdepth: 2
:glob:

cli/account
cli/vs
cli/hardware
cli/ordering
cli/users
cli/ipsec
cli/*

.. _config_setup:

Expand Down Expand Up @@ -179,3 +175,4 @@ Most commands will take in additional options/arguments. To see all available ac
--tags TEXT Show instances that have one of these comma-
separated tags
--help Show this message and exit.

9 changes: 9 additions & 0 deletions docs/cli/call_api.rst
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
.. _cli_call_api:

Call API
========


.. click:: SoftLayer.CLI.call_api:cli
:prog: call-api
:show-nested:
36 changes: 36 additions & 0 deletions docs/cli/event_log.rst
Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
.. _cli_event_log:

Event-Log Commands
====================


.. click:: SoftLayer.CLI.event_log.get:cli
:prog: event-log get
:show-nested:

There are usually quite a few events on an account, so be careful when using the `--limit -1` option. The command will automatically break requests out into smaller sub-requests, but this command may take a very long time to complete. It will however print out data as it comes in.

.. click:: SoftLayer.CLI.event_log.types:cli
:prog: event-log types
:show-nested:


Currently the types are as follows, more may be added in the future.
::

:......................:
: types :
:......................:
: Account :
: CDN :
: User :
: Bare Metal Instance :
: API Authentication :
: Server :
: CCI :
: Image :
: Bluemix LB :
: Facility :
: Cloud Object Storage :
: Security Group :
:......................:
Loading