#!/usr/bin/python
#
# Authors:
# - peter.bandzi@cisco.com
# - morgan.richomme@orange.com
#
# src: Peter Bandzi
# https://github.com/pbandzi/parse-robot/blob/master/convert_robot_to_json.py
#
# Copyright (c) 2015 All rights reserved
# This program and the accompanying materials
# are made available under the terms of the Apache License, Version 2.0
# which accompanies this distribution, and is available at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# 0.1: This script boots the VM1 and allocates IP address from Nova
# Later, the VM2 boots then execute cloud-init to ping VM1.
# After successful ping, both the VMs are deleted.
# 0.2: measure test duration and publish results under json format
#
#
import xmltodict
import json
import sys
import getopt
import yaml


sys.path.append("/home/opnfv/repos/functest/testcases")
import functest_utils


def usage():
    print """Usage:
    get-json-from-robot.py --xml=<output.xml> --pod=<pod_name>
                           --installer=<installer> --database=<Database URL>
                           --scenaro=SCENARIO
    -x, --xml   xml file generated by robot test
    -p, --pod   POD name where the test come from
    -i, --installer
    -s, --scenario
    -h, --help  this message
    """
    sys.exit(2)


def populate_detail(test):
    detail = {}
    detail['test_name'] = test['@name']
    detail['test_status'] = test['status']
    detail['test_doc'] = test['doc']
    return detail


def parse_test(tests, details):
    try:
        for test in tests:
            details.append(populate_detail(test))
    except TypeError:
        # tests is not iterable
        details.append(populate_detail(tests))
    return details


def parse_suites(suites):
    data = {}
    details = []
    try:
        for suite in suites:
            data['details'] = parse_test(suite['test'], details)
    except TypeError:
        # suites is not iterable
        data['details'] = parse_test(suites['test'], details)
    return data


def main(argv):
    try:
        opts, args = getopt.getopt(argv,
                                   'x:p:i:s:h',
                                   ['xml=', 'pod=',
                                    'installer=',
                                    'scenario=',
                                    'help'])
    except getopt.GetoptError:
        usage()

    for opt, arg in opts:
        if opt in ('-h', '--help'):
            usage()
        elif opt in ('-x', '--xml'):
            xml_file = arg
        elif opt in ('-p', '--pod'):
            pod = arg
        elif opt in ('-i', '--installer'):
            installer = arg
        elif opt in ('-s', '--scenario'):
            scenario = arg
        else:
            usage()

    with open(xml_file, "r") as myfile:
        xml_input = myfile.read().replace('\n', '')

    # dictionary populated with data from xml file
    all_data = xmltodict.parse(xml_input)['robot']

    data = parse_suites(all_data['suite']['suite'])
    data['description'] = all_data['suite']['@name']
    data['version'] = all_data['@generator']
    data['test_project'] = "functest"
    data['case_name'] = "ODL"
    data['pod_name'] = pod
    data['installer'] = installer

    json.dumps(data, indent=4, separators=(',', ': '))

    # Only used from container, we can set up absolute path
    with open("/home/opnfv/functest/conf/config_functest.yaml") as f:
        functest_yaml = yaml.safe_load(f)
        f.close()

    database = functest_yaml.get("results").get("test_db_url")

    try:
        # example:
        # python odlreport2db.py -x ~/Pictures/Perso/odl/output3.xml
        #                        -i fuel
        #                        -p opnfv-jump-2
        #                        -s os-odl_l2-ha
        functest_utils.push_results_to_db(database,
                                          data['case_name'],
                                          None,
                                          data['pod_name'],
                                          scenario,
                                          data)
    except:
        print("Error pushing results into Database '%s'" % sys.exc_info()[0])


if __name__ == "__main__":
    main(sys.argv[1:])