pyats.easypy.plugins package

Submodules

class pyats.easypy.plugins.bases.BasePlugin(runtime)

Bases: Component

Base class for all plugin

initializes basic information about a plugin

error_handler(stage, e)

each plugin has the built-in ability to handle its own exceptions. By default, this exception is caught and stored - in order to avoid system crashing. This is the default error handler that handles this behavior.

Warning

overwriting this function allows you to control how errors in your plugins are handled, but also may lead to errors being “hidden” when you truly want them. Make sure you… keep track of what you are doing.

static fmt_stage_name(stage)

formats the current stage name and add pid to it if it’s a task-related stage. This allows task errors to be split from each other

has_errors(stage=None)

checks if errors occured during a particular execution stage of this plugin. This is the API to use to access the errors generated when this plugin’s various stages are run.

property name

The name of a plugin defaults to its class name. This is also used to start the plugin’s command-line parser section when available.

parse_args()

parse arguments if available, store results to self.args. This follows the easypy argument propagation scheme, where any unknown arguments to this plugin is then stored back into sys.argv and untouched.

Does nothing if a plugin doesn’t come with a built-in parser.

run(obj, stage, reporter)

run plugin stage

plugin entry point called by plugin manager to run a particular stage.

any exceptions/errors during execution of a plugin stage would be stored within the plugin itself, accessible via .has_errors() api.

Parameters:
  • (Task/Job) (obj) –

  • (Stage) (stage) –

class pyats.easypy.plugins.debug.ArchiveConfigPlugin(runtime)

Bases: BasePlugin

Plugin that writes the global config to the RunTime Directory

__init__

initializes basic information about a plugin

pre_job()
class pyats.easypy.plugins.debug.ConfigDumper(stream, default_style=None, default_flow_style=False, canonical=None, indent=None, width=None, allow_unicode=None, line_break=None, encoding=None, explicit_start=None, explicit_end=None, version=None, tags=None, sort_keys=True)

Bases: SafeDumper

yaml_representers = {<class 'NoneType'>: <function SafeRepresenter.represent_none>, <class 'bool'>: <function SafeRepresenter.represent_bool>, <class 'bytes'>: <function SafeRepresenter.represent_binary>, <class 'datetime.date'>: <function SafeRepresenter.represent_date>, <class 'datetime.datetime'>: <function SafeRepresenter.represent_datetime>, <class 'dict'>: <function SafeRepresenter.represent_dict>, <class 'float'>: <function SafeRepresenter.represent_float>, <class 'int'>: <function SafeRepresenter.represent_int>, <class 'list'>: <function SafeRepresenter.represent_list>, <class 'pyats.datastructures.attrdict.AttrDict'>: <function represent_dict>, <class 'pyats.datastructures.factory.MetaClassFactory'>: <function represent_class>, <class 'set'>: <function SafeRepresenter.represent_set>, <class 'str'>: <function SafeRepresenter.represent_str>, <class 'tuple'>: <function SafeRepresenter.represent_list>, <class 'type'>: <function represent_class>, None: <function SafeRepresenter.represent_undefined>}
class pyats.easypy.plugins.debug.CopyJobfileToRunInfo(runtime)

Bases: BasePlugin

copies the current running jobfile to runtime directory for debugging purposes.

__init__

initializes basic information about a plugin

pre_job(job)
class pyats.easypy.plugins.debug.CopyManifestFileToRunInfo(runtime)

Bases: BasePlugin

copies the job manifest file to runtime directory for debugging purposes.

__init__

initializes basic information about a plugin

pre_job(job)
class pyats.easypy.plugins.debug.EnvironmentDebugPlugin(runtime)

Bases: BasePlugin

saves the current environment information to env.txt file under the runinfo directory.

__init__

initializes basic information about a plugin

EXTERNAL_PYATS_PKGS = '^pyats($|\\..+$)'
INTERNAL_PYATS_PKGS = '^ats($|\\..+$)'
pre_job(job)
exception pyats.easypy.plugins.debug.InstallationError

Bases: Exception

pyats.easypy.plugins.debug.check_pyats_version()
pyats.easypy.plugins.debug.represent_class(dumper, data)
pyats.easypy.plugins.debug.represent_dict(dumper, data)
pyats.easypy.plugins.debug.write_env_variables(fh)
pyats.easypy.plugins.debug.write_pip_pkgs(fh)
pyats.easypy.plugins.debug.write_runtime_values(fh, runtime_env)
pyats.easypy.plugins.debug.write_tcl_pkgs(fh)
class pyats.easypy.plugins.htmllogs.HTMLLogsPlugin(runtime)

Bases: BasePlugin

initializes basic information about a plugin

classmethod configure_parser(parser, legacy_cli=True)

configures the main runtime parser with this component’s own parser group.

Note

  • to be implemented by the component owner/developer.

  • should be adding argument groups and args to the provided parser

post_job(job)

Generate HTML logs.

pyats.easypy.plugins.htmllogs.convert_seconds_to_hhmmss(seconds)
pyats.easypy.plugins.htmllogs.get_overall_result(summary)
class pyats.easypy.plugins.kleenex.KleenexPlugin(*args, **kwargs)

Bases: BasePlugin

initializes basic information about a plugin

classmethod configure_parser(parser, legacy_cli=True)

configures the main runtime parser with this component’s own parser group.

Note

  • to be implemented by the component owner/developer.

  • should be adding argument groups and args to the provided parser

create_topology_graph(taskid='')

Create a diagram representing the actual topology.

do_bringup_clean_logic(task=None, reporter=None)

Do bringup and clean as required.

do_bringup_if_required(task=None)

Launch a dynamic topology if required, and load testbed config.

do_clean(task=None)
load_actual_testbed_configuration()

Load actual testbed configuration. Pull the testbed configuration from bringup and load it into self.runtime.job.testbed (possibly replacing the content created by the testbed plugin, which is OK because bringup also merges in content from the original testbed_file, if specified).

post_job(job)
post_task(task)
pre_job(job, reporter)
pre_task(task, reporter)
prepare_clean(job=None, task=None, reporter=None)

Prepare the clean execution. This can be done pre-job or pre-task.

Load clean files, identify which devices to clean.

If task is passed, check if arguments clean_files and/or logical_testbed_file are passed and use them for task-specific clean.

Store processed data in runinfo directory, with taskid if applicable.

Parameters:
  • job (Job) – job object, used when called from pre_job

  • task (Task) – task object, used when called from pre_task

  • reporter (Reporter) – reporter object

process_clean_image_attributes(clean_config)
  1. Get the clean image attributes from testbed.

  2. Get the latest images using image attributes.

  3. Update the clean extended data with the latest image.

Parameters:

clean_config (dict) – Extended clean config data

undo_bringup_if_required()

Tear down a dynamic topology if it has been previously launched.

update_device_recovery_info(device, clean_data)
  1. Get the ip address, gateway, tftp server details from the testbed

  2. Update the clean extended data with the recovery information.

Parameters:
  • device (device) – device object.

  • clean_data (dict) – Device specific clean config data

class pyats.easypy.plugins.logs.JobLogPlugin(runtime)

Bases: BasePlugin

JobLogPLugin

Creates a separate easypy module logger and save all easypy internal log messages to that file.

Note

Redirects all log messages in the easypy main process to TaskLog.

initializes basic information about a plugin

post_job(job)
post_task(task)

Remove what pre-task did

pre_job(job)

Everything goes into JobLog

pre_task(task)

Move easypy logging into separate handler, ensure it still gets displayed on the screen

class pyats.easypy.plugins.logs.LiveviewPlugin(runtime)

Bases: BasePlugin

Plugin that starts the liveview server in another process and subscribes to the reporter socket.

__init__

initializes basic information about a plugin

classmethod configure_parser(parser, legacy_cli=True)

configures the main runtime parser with this component’s own parser group.

Note

  • to be implemented by the component owner/developer.

  • should be adding argument groups and args to the provided parser

hijack_main()
post_job()
pre_job()
print_tip()
class pyats.easypy.plugins.logs.LogWarnings(runtime)

Bases: BasePlugin

Plugin that redirects all python warnings (from warnings module) to both stderr and logging.

Also enables the filtration of all pyATS deprecated warning messages.

__init__

initializes basic information about a plugin

pre_job()
class pyats.easypy.plugins.logs.TaskLogPlugin(*args, **kwargs)

Bases: BasePlugin

Creates the TaskLogHandler to each Task process, and attaches to the root logger to collect all messages into the TaskLog. Also sets the default log-level to INFO, and enables on-fork auto-create of new tasklogs.

This handler is removed at the end of Task process.

__init__

initializes basic information about a plugin

post_task(task)
pre_task(task)
class pyats.easypy.plugins.manager.PluginManager(*args, **kwargs)

Bases: Component

Plugin Manager class

Instanciates, configures, manages and runs all easypy plugins. This is the main driver behind the easypy plugin system. Do not mock: may blow up.

In any given process, there is only a single instance of PluginManager.

errored_plugins(stage=None)

return list of plugins that errored out when they ran.

has_errors(stage=None)

errors

True/False for if any plugin errored out

load(data)

loads plugins from dictionary data

this api loads plugins defined in a specific dictionary format (same as that defined in load_from_yaml). It does the heavy-lifting of actual plugin module loading and instanciatation.

Parameters:

(dict) (data) –

Example

PluginManater().load({‘SomePlugin’: {

‘enabled’: True, ‘module’: ‘pyats.easypy.plugins’, ‘order’: 60})

Return type:

list of discovered and loaded plugins

parse_plugin_args()

Parse plugin arguments

Iterates over all plugins and invoke their parsers, if any. Plugin’s argument parsing shall follow the argument propagation scheme: sys.argv is left with any arguments it doesn’t recognize.

run(obj, stage)

run plugin stage

main function called by job/tasks to run all plugins in order, for any given stage.

The PluginManager.run() controls the execution order of plugins. When any errors are encountered during a plugin’s PRE-stage run, the corresponding POST-stage section of all plugin ran so far will be run, and the plugin engine will raise exception and error out.

This ensures proper clean-up behavior of plugins, and as well make sure nothing is run (job/task) in case a plugin is not running correctly.

If a plugin action method has “job” or “task” argument, the current executing job/task object will be automatically provided as function argument.

Parameters:
  • (Task/Job) (obj) –

  • (str) (stage) –

class pyats.easypy.plugins.rerun.Matcher(args)

Bases: object

class pyats.easypy.plugins.rerun.RerunPlugin(runtime)

Bases: BasePlugin

Rerun is an important plugin of pyATS that enables the re-execution of testcases depending on their result types.

Before running the tests this plugin checks for rerun input file to determine which tests will be run

After the execution there will be rerun input file created in order to have the list of testcases that will be run again.

Parameters:
  • rerun_file (-) – tasks

  • rerun_condition (-) – If any of the testcases has a result matching one of the result types in the rerun_conditiion list, it will run again.

__init__

initializes basic information about a plugin

classmethod configure_parser(parser, legacy_cli=True)

configures the main runtime parser with this component’s own parser group.

Note

  • to be implemented by the component owner/developer.

  • should be adding argument groups and args to the provided parser

get_file_rerun_report(filename: str) dict
Read the rerun report from a rerun results file, or the archive of a

previous run

Parameters:

filename (str) – Path to the rerun results file or run archive

Returns:

Rerun report of previous run

Return type:

dict

get_http_rerun_report(url: str) dict
Download and read the rerun report from a rerun results file, or the

archive of a previous run

Parameters:

url (str) – Address of the rerun results file or run archive

Returns:

Rerun report of previous run

Return type:

dict

post_job(job)
pre_job(job)
pre_task(task)
class pyats.easypy.plugins.runinfo.RuninfoSymlinkPlugin(runtime)

Bases: BasePlugin

Note

This is a legacy behavior carried over from Tcl-ATS that not many people knows or uses.

Example

basic_example -> basic_example.2015Aug31_10:47:31

__init__

initializes basic information about a plugin

post_job()
pre_job(job)
class pyats.easypy.plugins.runinfo.TaskResultsPlugin(runtime)

Bases: BasePlugin

creates and delete runinfo/taskresults folder before and after each job run. This is used for debugging and visualizing task progresses.

__init__

initializes basic information about a plugin

post_job(job)
pre_job(job)
class pyats.easypy.plugins.stages.PluginStage(value)

Bases: Enum

An enumeration.

property counterpart
property is_post
property is_pre
post_job = 'post_job'
post_task = 'post_task'
pre_job = 'pre_job'
pre_task = 'pre_task'
property scope
class pyats.easypy.plugins.stages.Scope(value)

Bases: Enum

An enumeration.

job = 'job'
task = 'task'
class pyats.easypy.plugins.testbed.TestbedPlugin(runtime)

Bases: BasePlugin

Loads the provided testbed yaml file into pyats.topology.Testbed objects, and makes them available as testscript parameters in task processes.

__init__

initializes basic information about a plugin

classmethod configure_parser(parser, legacy_cli=True)

configures the main runtime parser with this component’s own parser group.

Note

  • to be implemented by the component owner/developer.

  • should be adding argument groups and args to the provided parser

post_job(job)
pre_job(job)
class pyats.easypy.plugins.xunit.XunitPlugin(runtime)

Bases: BasePlugin

initializes basic information about a plugin

classmethod configure_parser(parser, legacy_cli=True)

configures the main runtime parser with this component’s own parser group.

Note

  • to be implemented by the component owner/developer.

  • should be adding argument groups and args to the provided parser

generate_xunit_report_data(ts, trade_url)

Generate xUnit xml report data.

post_job(job)

Generate xUnit xml and report.

pyats.easypy.plugins.xunit.pad_number(number)

Pads number with N zeroes so that lexicographical sort works properly Accepts numbers, returns a string