#!/usr/bin/python
''' This Python script validates sched domain information in dmesg
    with information in sysfs topology
'''

import os
import sys
LIB_DIR = "%s/lib" % os.path.dirname(__file__)
sys.path.append(LIB_DIR)
from sched_mc import *
from optparse import OptionParser

__author__ = "Poornima Nayak <mpnayak@linux.vnet.ibm.com>"

class Usage(Exception):
    def __init__(self, msg):
        self.msg = msg

def main(argv=None):
    if argv is None:
        argv = sys.argv

    usage = "-w"
    parser = OptionParser(usage)
    parser.add_option("-c", "--mc_level", dest="mc_level", default=-1,
        help="Sched mc power saving value 0/1/2")
    parser.add_option("-t", "--smt_level", dest="smt_level", default=-1,
        help="Sched smt power saving value 0/1/2")
    (options, args) = parser.parse_args()

    try:
        clear_dmesg()
        count_num_cpu()
        map_cpuid_pkgid()

        if is_hyper_threaded() and int(options.smt_level) >= 0:
            set_sched_smt_power(options.smt_level)

        if int(options.mc_level) >= 0:
            set_sched_mc_power(options.mc_level)
        if int(options.smt_level) >= 0 or int(options.mc_level) >= 0:
            status = verify_sched_domain_dmesg(options.mc_level, options.smt_level)
            reset_schedmc()
            if is_hyper_threaded():
                reset_schedsmt()
        	return(status)
        else:
            print "INFO: Invalid arguments given"
            return 1
    except Exception, details:
        print "INFO: sched domain test failed: ", details
        return(1)

# Run test based on the command line arguments
if __name__ == "__main__":
    sys.exit(main())
