summaryrefslogtreecommitdiffstats
path: root/src/vpp-api/python
AgeCommit message (Expand)AuthorFilesLines
2017-11-20Have PAPI find its API definition filesChris Luke1-5/+140
2017-11-20nowhere to set read_timeoutdongjuan1-2/+2
2017-11-01VPP-959: Support old version of CFFIOle Troan2-3/+17
2017-10-31VPP PAPI: Error in unserializer for non-array compound types.Ole Troan1-0/+1
2017-10-25VPP-1033: Python API support arbitrary sized input parameters.Ole Troan1-13/+49
2017-09-13VPP-960: Python API add more information in exception for invalid arguments t...Ole Troan1-1/+4
2017-08-31VPP-959: Python API require minimum CFFI version.Ole Troan1-1/+1
2017-08-18Python API: Fix error message typo.Ole Troan1-1/+1
2017-08-17Python API: VPP-947 Empty chroot_prefix fails on encode()Ole Troan3-4/+209
2017-07-08API: Add Python3 support to vpp_papi.pyOle Troan1-65/+97
2017-05-16Place the vpp_papi*.egg file together with other build products.Igor Mikhailov (imichail)1-1/+2
2017-05-10Produce vpp_papi*.egg for virtual environmentsIgor Mikhailov (imichail)1-1/+2
2017-04-20vpp-api: rename libpneum to libvppapiclientDamjan Marion1-33/+33
2017-03-15Python API: Change from cPython to CFFI.Ole Troan9-977/+94
2017-03-07Python API: Synchronous mode.Ole Troan5-147/+365
2017-03-03python API: work towards python/vpp api separationKlement Sekera1-1/+30
2017-01-27Python API: event_callback not initialised.Ole Troan1-0/+1
2017-01-26Change automake python macro to get python pathTomofumi Hayashi1-1/+2
2017-01-24Fix PAPI async responseWojciech Dec1-1/+1
2017-01-20Python API: Missing locking of results data structure.Ole Troan1-84/+219
2017-01-11Makefile.am cleanupDamjan Marion1-2/+3
2017-01-09papi: fix building on aarch64Damjan Marion1-1/+1
2017-01-06python clients can set the API rx message queue lengthDave Barach5-10/+13
2017-01-03vpp-python-api deb packaging - use easy_install to install the python apiroot1-0/+1
2016-12-28Reorganize source tree to use single autotools instanceDamjan Marion15-0/+1896
able.Instance */ .highlight .vm { color: #f8f8f2 } /* Name.Variable.Magic */ .highlight .il { color: #ae81ff } /* Literal.Number.Integer.Long */ } @media (prefers-color-scheme: light) { .highlight .hll { background-color: #ffffcc } .highlight .c { color: #888888 } /* Comment */ .highlight .err { color: #a61717; background-color: #e3d2d2 } /* Error */ .highlight .k { color: #008800; font-weight: bold } /* Keyword */ .highlight .ch { color: #888888 } /* Comment.Hashbang */ .highlight .cm { color: #888888 } /* Comment.Multiline */ .highlight .cp { color: #cc0000; font-weight: bold } /* Comment.Preproc */ .highlight .cpf { color: #888888 } /* Comment.PreprocFile */ .highlight .c1 { color: #888888 } /* Comment.Single */ .highlight .cs { color: #cc0000; font-weight: bold; background-color: #fff0f0 } /* Comment.Special */ .highlight .gd { color: #000000; background-color: #ffdddd } /* Generic.Deleted */ .highlight .ge { font-style: italic } /* Generic.Emph */ .highlight .gr { color: #aa0000 } /* Generic.Error */ .highlight .gh { color: #333333 } /* Generic.Heading */ .highlight .gi { color: #000000; background-color: #ddffdd } /* Generic.Inserted */ .highlight .go { color: #888888 } /* Generic.Output */ .highlight .gp { color: #555555 } /* Generic.Prompt */ .highlight .gs { font-weight: bold } /* Generic.Strong */ .highlight .gu { color: #666666 } /* Generic.Subheading */ .highlight .gt { color: #aa0000 } /* Generic.Traceback */ .highlight .kc { color: #008800; font-weight: bold } /* Keyword.Constant */ .highlight .kd { color: #008800; font-weight: bold } /* Keyword.Declaration */ .highlight .kn { color: #008800; font-weight: bold } /* Keyword.Namespace */ .highlight .kp { color: #008800 } /* Keyword.Pseudo */ .highlight .kr { color: #008800; font-weight: bold } /* Keyword.Reserved */ .highlight .kt { color: #888888; font-weight: bold } /* Keyword.Type */ .highlight .m { color: #0000DD; font-weight: bold } /* Literal.Number */ .highlight .s { color: #dd2200; background-color: #fff0f0 } /* Literal.String */ .highlight .na { color: #336699 } /* Name.Attribute */ .highlight .nb { color: #003388 } /* Name.Builtin */ .highlight .nc { color: #bb0066; font-weight: bold } /* Name.Class */ .highlight .no { color: #003366; font-weight: bold } /* Name.Constant */ .highlight .nd { color: #555555 } /* Name.Decorator */ .highlight .ne { color: #bb0066; font-weight: bold } /* Name.Exception */ .highlight .nf { color: #0066bb; font-weight: bold } /* Name.Function */ .highlight .nl { color: #336699; font-style: italic } /* Name.Label */ .highlight .nn { color: #bb0066; font-weight: bold } /* Name.Namespace */ .highlight .py { color: #336699; font-weight: bold } /* Name.Property */ .highlight .nt { color: #bb0066; font-weight: bold } /* Name.Tag */ .highlight .nv { color: #336699 } /* Name.Variable */ .highlight .ow { color: #008800 } /* Operator.Word */ .highlight .w { color: #bbbbbb } /* Text.Whitespace */ .highlight .mb { color: #0000DD; font-weight: bold } /* Literal.Number.Bin */ .highlight .mf { color: #0000DD; font-weight: bold } /* Literal.Number.Float */ .highlight .mh { color: #0000DD; font-weight: bold } /* Literal.Number.Hex */ .highlight .mi { color: #0000DD; font-weight: bold } /* Literal.Number.Integer */ .highlight .mo { color: #0000DD; font-weight: bold } /* Literal.Number.Oct */ .highlight .sa { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Affix */ .highlight .sb { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Backtick */ .highlight .sc { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Char */ .highlight .dl { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Delimiter */ .highlight .sd { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Doc */ .highlight .s2 { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Double */ .highlight .se { color: #0044dd; background-color: #fff0f0 } /* Literal.String.Escape */ .highlight .sh { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Heredoc */ .highlight .si { color: #3333bb; background-color: #fff0f0 } /* Literal.String.Interpol */ .highlight .sx { color: #22bb22; background-color: #f0fff0 } /* Literal.String.Other */ .highlight .sr { color: #008800; background-color: #fff0ff } /* Literal.String.Regex */ .highlight .s1 { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Single */ .highlight .ss { color: #aa6600; background-color: #fff0f0 } /* Literal.String.Symbol */ .highlight .bp { color: #003388 } /* Name.Builtin.Pseudo */ .highlight .fm { color: #0066bb; font-weight: bold } /* Name.Function.Magic */ .highlight .vc { color: #336699 } /* Name.Variable.Class */ .highlight .vg { color: #dd7700 } /* Name.Variable.Global */ .highlight .vi { color: #3333bb } /* Name.Variable.Instance */ .highlight .vm { color: #336699 } /* Name.Variable.Magic */ .highlight .il { color: #0000DD; font-weight: bold } /* Literal.Number.Integer.Long */ }
# Copyright (c) 2023 Cisco and/or its affiliates.
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at:
#
#     http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.

"""CSIT Presentation and Analytics Layer.
"""

import sys
import argparse
import logging

from pal_errors import PresentationError
from specification_parser import Specification
from environment import Environment, clean_environment
from static_content import prepare_static_content
from input_data_parser import InputData
from generator_tables import generate_tables
from generator_plots import generate_plots
from generator_files import generate_files
from generator_report import generate_report
from generator_cpta import generate_cpta
from generator_alerts import Alerting, AlertingError
from convert_xml_json import convert_xml_to_json


OUTPUTS = ("none", "report", "trending", "convert-xml-to-json")


def parse_args():
    """Parse arguments from cmd line.

    :returns: Parsed arguments.
    :rtype: ArgumentParser
    """

    parser = argparse.ArgumentParser(
        description=__doc__,
        formatter_class=argparse.RawDescriptionHelpFormatter
    )
    parser.add_argument(
        "-s", "--specification",
        required=True,
        type=str,
        help="Specification YAML file."
    )
    parser.add_argument(
        "-r", "--release",
        default="master",
        type=str,
        help="Release string of the product."
    )
    parser.add_argument(
        "-w", "--week",
        default="1",
        type=str,
        help="Calendar week when the report is published."
    )
    parser.add_argument(
        "-l", "--logging",
        choices=[
            "NOTSET", "DEBUG", "INFO", "WARNING", "ERROR", "CRITICAL"
        ],
        default="ERROR",
        help="Logging level."
    )
    parser.add_argument(
        "-f", "--force",
        action="store_true",
        help="Force removing the old build(s) if present."
    )
    parser.add_argument(
        "-o", "--print-all-oper-data",
        action="store_true",
        help="Print all operational data to console. Be careful, the output "
             "can be really long."
    )
    parser.add_argument(
        "-i", "--input-file",
        type=str,
        default="",
        help="XML file generated by RobotFramework which will be processed "
             "instead of downloading the data from Nexus and/or Jenkins. In "
             "this case, the section 'input' in the specification file is "
             "ignored."
    )
    parser.add_argument(
        "-d", "--input-directory",
        type=str,
        default="",
        help="Directory with XML file(s) generated by RobotFramework or with "
             "sub-directories with XML file(s) which will be processed "
             "instead of downloading the data from Nexus and/or Jenkins. In "
             "this case, the section 'input' in the specification file is "
             "ignored."
    )

    return parser.parse_args()


def main():
    """Main function."""

    log_levels = {
        "NOTSET": logging.NOTSET,
        "DEBUG": logging.DEBUG,
        "INFO": logging.INFO,
        "WARNING": logging.WARNING,
        "ERROR": logging.ERROR,
        "CRITICAL": logging.CRITICAL
    }

    args = parse_args()
    logging.basicConfig(
        format="%(asctime)s: %(levelname)s: %(message)s",
        datefmt="%Y/%m/%d %H:%M:%S",
        level=log_levels[args.logging]
    )

    logging.info("Application started.")

    try:
        spec = Specification(args.specification)
        spec.read_specification()
    except PresentationError as err:
        logging.critical("Finished with error.")
        logging.critical(repr(err))
        return 1

    if spec.output["output"] not in OUTPUTS:
        logging.critical(
            f"The output {spec.output[u'output']} is not supported."
        )
        return 1

    return_code = 1
    try:
        env = Environment(spec.environment, args.force)
        env.set_environment()

        prepare_static_content(spec)

        data = InputData(spec, spec.output["output"])
        if args.input_file:
            data.process_local_file(args.input_file)
        elif args.input_directory:
            data.process_local_directory(args.input_directory)
        else:
            data.download_and_parse_data(repeat=1)

        if args.print_all_oper_data:
            data.print_all_oper_data()

        generate_tables(spec, data)
        generate_plots(spec, data)
        generate_files(spec, data)

        if spec.output["output"] == "report":
            generate_report(args.release, spec, args.week)
        elif spec.output["output"] == "trending":
            sys.stdout.write(generate_cpta(spec, data))
            try:
                alert = Alerting(spec)
                alert.generate_alerts()
            except AlertingError as err:
                logging.warning(repr(err))
        elif spec.output["output"] == "convert-xml-to-json":
            convert_xml_to_json(spec, data)
        else:
            logging.info("No output will be generated.")

        logging.info("Successfully finished.")
        return_code = 0

    except AlertingError as err:
        logging.critical(f"Finished with an alerting error.\n{repr(err)}")
    except PresentationError as err:
        logging.critical(f"Finished with a PAL error.\n{str(err)}")
    except (KeyError, ValueError) as err:
        logging.critical(f"Finished with an error.\n{repr(err)}")
    finally:
        if spec is not None:
            clean_environment(spec.environment)
    return return_code


if __name__ == "__main__":
    sys.exit(main())