#!/usr/bin/env python
#
# entry_q
#
# Similar to condor_q, but look for a specific entry
#
# Usage: entry_q entry|-l [-dir <dir>] [-printschedd] [condor_q options]
#

from __future__ import print_function
import os
import sys
STARTUP_DIR=sys.path[0]
sys.path.append(os.path.join(STARTUP_DIR,"../../.."))

from glideinwms.factory import glideFactoryConfig

USAGE = "Usage: entry_q entry|-l [-dir <dir>] [-printschedd] [condor_q options]"


def print_entries(entries, want_schedd):
    print("Available entries:")
    for entry in entries.split(','):
        if not want_schedd:
            print("  %s" % entry)
        else:
            jobDescript=glideFactoryConfig.JobDescript(entry)
            schedd_name=jobDescript.data['Schedd']
            print("  %-40s %-30s" % (entry,schedd_name))


def main(argv):
    if len(argv)<2:
      print(USAGE)
      sys.exit(1)

    entry=argv[1]

    # Try GLIDEIN_FACTORY_DIR env var first
    if 'GLIDEIN_FACTORY_DIR' in os.environ:
        gfactory_dir = os.environ['GLIDEIN_FACTORY_DIR']
    # is it an rpm install?
    elif os.path.isdir("/var/lib/gwms-factory/work-dir"):
        gfactory_dir = "/var/lib/gwms-factory/work-dir"
    else:
        gfactory_dir = "."

    want_schedd=False
    
    # parse arguments
    alen=len(argv)
    i=2
    while (i<alen):
        ael=argv[i]
        if ael=='-dir':
            i=i+1
            gfactory_dir=argv[i]
            i=i+1
        elif ael=='-printschedd':
            i=i+1
            want_schedd=True
        else:
            break # got everything

    curdir=os.getcwd()
    try:
        os.chdir(gfactory_dir) # factoryConfig assumes the right dir
    except OSError as e:
        print("Dir '%s' not a valid factory dir: %s"%(gfactory_dir, e))
        sys.exit(1)

    try:
        glideinDescript=glideFactoryConfig.GlideinDescript()
    except IOError as e:
        print("Dir '%s' not a valid factory dir: %s"%(gfactory_dir, e))
        sys.exit(1)

    if entry=="-l":
        print_entries(glideinDescript.data['Entries'],want_schedd)
        sys.exit(0)
    
    jobDescript=glideFactoryConfig.JobDescript(entry)
    os.chdir(curdir)

    factory_name = glideinDescript.data['FactoryName']
    glidein_name = glideinDescript.data['GlideinName']
    schedd_name = jobDescript.data['Schedd']
    const_str = '(GlideinFactory=?="%s")&&(GlideinName=?="%s")&&(GlideinEntryName=?="%s")' % (factory_name, glidein_name, entry)

    cq_argv=argv[i:]
    # print cq_argv

    i = 0
    while (i < len(cq_argv)):
        qel = cq_argv[i]
        if qel[:3] == '-co':
            const_str = '(%s)&&(%s)'%(const_str,cq_argv[i+1])
            del cq_argv[i]
            del cq_argv[i]
        else:
            i = i + 1  # not an interesting one

    if want_schedd:
        print("Schedd: %s" % schedd_name)
        print("Constraint: '%s'" % const_str)
    
    # must flush out before forking, or any buffered content wil be lost
    sys.__stdout__.flush()
    sys.__stderr__.flush()
    os.execvp('condor_q', ['condor_q', '-name', schedd_name, '-const', const_str]+cq_argv)


if __name__ == '__main__':
    main(sys.argv)
