#!/usr/bin/python
#
# Determine if this tool can run a test based on a test spec.
#

import datetime
import sys

import pscheduler

logger = pscheduler.Log(prefix='tool-iperf', quiet=True)
    
json = pscheduler.json_load(exit_on_error=True)

try:
    if json['type'] != 'throughput':
        pscheduler.succeed_json({
            "can-run": False,
            "reasons": [ "Unsupported test type" ]
        })
except KeyError:
    pscheduler.succeed_json({
        "can-run": False,
        "reasons": [ "Missing test type" ]
    })


try:
    spec = json["spec"]
    pscheduler.json_check_schema(spec, 1)
except KeyError:
    pscheduler.succeed_json({
        "can-run": False,
        "reasons": ["Missing test specification"]
    })
except ValueError as ex:
    pscheduler.succeed_json({
        "can-run": False,
        "reasons": [str(ex)]
    })


errors = []

if spec.has_key('bandwidth') and not spec.has_key('udp'):
    errors.append('iperf cannot run TCP tests with throttled bandwidth')

if spec.has_key('omit'):
    errors.append('iperf does not support the --omit flag')

if spec.has_key('flow-label'):
    errors.append('iperf does not support the --flow-label flag')

if spec.has_key('zero-copy'):
    errors.append('iperf does not support the --zero-copy flag')

if spec.has_key('congestion'):
    errors.append('iperf does not support the --congestion flag')

if spec.has_key('server-cpu-affinity') or spec.has_key('client-cpu-affinity'):
    errors.append('iperf does not support the --server-cpu-affinity or --client-cpu-affinity flag')

if spec.has_key('no-delay'):
    errors.append('iperf does not support the --no-delay flag')

if spec.has_key('reverse'):
    errors.append('iperf does not support the --reverse flag')

try:
    source = spec['source']
except KeyError:
    source = None

try: 
    destination = spec['dest']
except KeyError:
    errors.append("Missing dest argument in spec")


# This digs up everything we can on the hosts involved in a
# time-predictable way.
has = pscheduler.api_has_services([source, destination], timeout=3)

src_has_psc = has[source]["pscheduler"]
dst_has_psc = has[destination]["pscheduler"]

if src_has_psc and dst_has_psc:
    errors.append("Both sides have pscheduler, no need for BWCTL")

if not has[destination]["bwctl"]:
    logger.debug("No BWCTL at destination")
    errors.append("No BWCTL on %s" % destination)


result = {
    "can-run": len(errors) == 0
}

if len(errors) > 0:
    result["reasons"] = errors

pscheduler.succeed_json(result)



