pyats.aetest.utils package

pyats.aetest.utils.exit_cli_code(result)

Sets the cli exit code to 0 (no error) or 1 (error) and calls sys.exit. Takes a TestResult object as the result parameter. If the TestResults object’s .value attribute is ‘passed’ or ‘passx’ then the cli exit code is 0.

Returns

Return type

nothing

pyats.aetest.utils.filter_exception(tb)

Filters an exception’s traceback stack and removes AEtest stack frames from it to make it more apparent that the error came from a script. Should be only used on user-script errors, and must not be used when an error is caught from pyats.aetest infra itself.

Any frame with __aetest_infra__ flag set is considered aetest infra stack.

Returns

Return type

return filtered exception stack trace, with aetest stacks removed

pyats.aetest.utils.format_filter_exception(exc_type, exc_value, tb)

format filter_exception

Filters an exception’s traceback stack and removes AEtest stack frames from it to make it more apparent that the error came from a script. Should be only used on user-script errors, and must not be used when an error is caught from pyats.aetest infra itself.

Any frame with __aetest_infra__ flag set is considered aetest infra stack.

calls filter_exception to filter the traceback then formats the exception message

Returns

  • properly formatted exception message with stack trace, with aetest

  • stacks removed

pyats.aetest.utils.get_defining_class(obj)

Property: defining class

Returns the parent class where the test function/method is defined. If object is a classtype, return itself. For methods, return the class where it was defined in.

Returns

Return type

parent class object or None

pyats.aetest.utils.getfullargspec(func)

Return the list of arguments to function. Removes the first argument (self) if the function is a bound method.

Parameters

(function) (func) –

Returns

Return type

list of function arguments (without self)

pyats.aetest.utils.getmodule(obj)

wrapper api to inspect.getmodule. attempts to unwrap the object before actually reading its module information.

Parameters

(object) (obj) –

Returns

Return type

module where object was defined

pyats.aetest.utils.getname(obj)

returns the name of class and/or function object. If name cannot be resolved, return the object itself.

Parameters

(object) (obj) –

Returns

Return type

object name

pyats.aetest.utils.getsourcefile(obj)

getmodule

wrapper api to inspect.getsourcefile, makes sure that it never errors out when we cannot get the actual source information, returning ‘unknown’ instead.

Parameters

(object) (obj) –

Returns

Return type

object source file or unknown

pyats.aetest.utils.getsourcelines(obj)

getmodule

wrapper api to inspect.getsourcelines, makes sure that it never errors out when we cannot get the actual source line information, returning 0 instead.

Note

there is a bug with inspect.getsourcelines where if a class was defined more than once in the same file, it returns the line number of the first instance of it regardless of context. (issue 24078)

Parameters

(object) (obj) –

Returns

Return type

object source line or 0

pyats.aetest.utils.hasarg(func, argument)

Returns boolean on whether a function has a particular argument in its arguments list. Does not consider vararg or varkwargs.

Parameters
  • (object) (func) –

  • (str) (argument) –

Returns

Return type

True/False

pyats.aetest.utils.start_pdb(pdb_package)

Starts the PDB post-mortem process

Returns

Return type

nothing

pyats.aetest.utils.unwrap(obj)

wrapper function to inspect.unwrap. This is really just a redirect to inspect.unwrap function. However, since it’s a py3 functionality, we are consolidating the api call here so that in py2 we can just return the original function without erroring.

Parameters

(object) (obj) –

Returns

Return type

unwrapped original function

Submodules

class pyats.aetest.utils.interaction.BaseInteraction(subject, message, section, *, timeout=None, timeout_result=None, no_email=None, from_address=None, to_address=None, email_subject=None, email_body=None)

Bases: object

BaseInteraction class

Base Interaction class to inherit from. Sets up common configuration arguments as well as the execution order when calling interact().

Set up base configuration for any interaction class

Parameters
  • (str) (message) –

  • (str) – information needed for interaction.

  • (ref) (section) –

timeout (float/str): Number of seconds before interaction times out.

“inf” will keep going forever.

timeout_result (str): What to return (or raise) when interaction

times out before retrieving user input. Can be something other than a string depending on implementation of _handle_timeout() Default is “BLOCKED”.

no_email (bool): When True prevents the notification email from

being sent.

from_address (str): Email address to send notification from.

Default is the user login.

to_address (str): Email address to send notification to.

Default is the user login.

email_subject (str/jinja2.Template): Alternate Subject line for

email notification.

email_body (str/jinja2.Template): Alternate Body for email

notification.

interact()

Function that will pause script execution and wait for some input from a user (or timeout) before continuing. Returns a processed result, or raises an exception based on the result.

class pyats.aetest.utils.interaction.WebInteraction(*args, host=None, port=None, web_template=None, **kwargs)

Bases: pyats.aetest.utils.interaction.BaseInteraction

WebInteraction class

Interaction class that hosts a webpage for feedback from the user. The webpage has options for all possible section results, and will raise that signal when selected, terminating exectution in that section.

Initialize the WebInteraction class with an extra argument for port

Parameters
  • (str) (message) –

  • (str) – information needed for interaction.

  • (ref) (section) –

host (str): Host address to bind to. Default is “”, which

accepts any incoming connections.

port (int): Port to host webpage. Default is 0, which requests a

port from the kernel.

web_template (str/jinja2.Template): Jinja template for webpage. Can

extend default_web_template for jinja template inheritence.

timeout (float/str): Number of seconds before interaction times out.

“inf” will keep going forever.

timeout_result (str): What to return (or raise) when interaction

times out before retrieving user input. Can be something other than a string depending on implementation of _handle_timeout() Default is “blocked”.

no_email (bool): When True prevents the notification email from

being sent.

from_address (str): Email address to send notification from.

Default is the user login.

to_address (str): Email address to send notification to.

Default is the user login.

email_subject (str/jinja2.Template): Alternate Subject line for

email notification.

email_body (str/jinja2.Template): Alternate Body for email

notification.

class pyats.aetest.utils.interaction.WebInteractionHTTPHandler(request, client_address, server)

Bases: http.server.BaseHTTPRequestHandler

HTTPHandler to serve interation webpage and process contents. Subclass of http.server.BaseHTTPRequestHandler

do_GET()

Override do_GET to handle GET requests. URL path is disregarded since only one page exists to be served. Serves HTML webpage with a submit button to trigger a seperate POST request.

do_POST()

Override do_POST to handle POST requests. URL path is disregarded since only one POST request is expected.

log_message(format_str, *args)

Overrides the default logger for the HTTP Handler so that it logs to the same logger as the rest of the module.

class pyats.aetest.utils.interaction.WebInteractionTCPServer(*args, html_layout, **kwargs)

Bases: socketserver.TCPServer

TCP server subclass for retrieving webpage content. Other than additional instance variable, behaves exactly like socketserver’s TCPServer.

Built-in __init__

Initializes WebInteractionTCPServer with additional variables.

Parameters
  • (str (server_address) – for hosting server

  • int) (Tuple containing host address and port) – for hosting server

  • (cls) (RequestHandlerClass) – requests

  • (str) (html_layout) –

class pyats.aetest.utils.pause.PauseOnPhrase(pause_on)

Bases: logging.Handler

Pause on phrase is implemented internally using this class - a subclass of logging.Handler.

In effect, when pause on phrase is enabled, an instance of this class is attached at root logger to handle all incoming message. If a message mets the given conditions, pause will occur.

built-in __init__

instantiates the pause handler with given information.

Parameters

(str/dict) (pause_on) – of pause_on information

code(frame, section, message, pattern, **kwargs)

on pause, provide code.interact() shell to user

collect(frame, section, message, pattern, **kwargs)

collect data from devices using CLI command or Genie API calls

custom(frame, section, message, pattern, pattern_match, **kwargs)

Custom handler for log messages. Calls the custom method configured by the user and pass the currect test function object and steps to user method.

Parameters
  • frame (FrameType) – Current frame object from inspect.currentframe (unused)

  • section (str) – Current section from the reporter

  • message (str) – the log message that was matched

  • pattern (str) – the pattern that matched the message (unused)

  • pattern_match (regex object) – the pattern match regex object that matched

email(frame, section, message, pattern, **kwargs)

on pause, sends user notification email and generates pause file

emit(record)

api called by logger while handling LogRecord objects. This is where the log message is validated against the pause criterions, and if found, performs the given action.

static get_user_frame()

Static method that returns the actual frame where the pause occured, eg, ignore all frames related to this file & logging module.

classmethod init(pause_on)

API called by AEtest.run() api that sets and starts this feature.

pdb(frame, section, message, pattern, **kwargs)

on pause, provide pdb.set_trace() debugger to user

static translate_pause_string(string)

api called by AEtest command-line parser. Allows conversion of string command-line inputs into dict types required by the loader class (and adheres to schema)

class pyats.aetest.utils.pause.PausePdb(completekey='tab', stdin=None, stdout=None, skip=None, nosigint=False, readrc=True)

Bases: pdb.Pdb

Subclass of pdb.Pdb, intended to do everything except always skips all frames related to this file and python logging module. This allows the debugger/interactive shell to be started always in the frame that called logging (where we are paused on)

Instantiate a line-oriented interpreter framework.

The optional argument ‘completekey’ is the readline name of a completion key; it defaults to the Tab key. If completekey is not None and the readline module is available, command completion is done automatically. The optional arguments stdin and stdout specify alternate input and output file objects; if not specified, sys.stdin and sys.stdout are used.

trace_dispatch(frame, event, arg)

Dispatch a trace function for debugged frames based on the event.

This function is installed as the trace function for debugged frames. Its return value is the new trace function, which is usually itself. The default implementation decides how to dispatch a frame, depending on the type of event (passed in as a string) that is about to be executed.

The event can be one of the following:

line: A new line of code is going to be executed. call: A function is about to be called or another code block

is entered.

return: A function or other code block is about to return. exception: An exception has occurred. c_call: A C function is about to be called. c_return: A C function has returned. c_exception: A C function has raised an exception.

For the Python events, specialized functions (see the dispatch_*() methods) are called. For the C events, no action is taken.

The arg parameter depends on the previous event.

pyats.aetest.utils.pause.check_list(value)

api to be used by pause_file_schema, validating that the input patterns format matches up to the expectation. This is a workaround for schemaengine not supporting nested list/dict types correctly.