#
# Autogenerated by Thrift Compiler (0.10.0)
#
# DO NOT EDIT UNLESS YOU ARE SURE THAT YOU KNOW WHAT YOU ARE DOING
#
#  options string: py
#

from thrift.Thrift import TType, TMessageType, TFrozenDict, TException, TApplicationException
from thrift.protocol.TProtocol import TProtocolException
import sys
import apache.airavata.model.commons.ttypes
import apache.airavata.model.appcatalog.parallelism.ttypes
import apache.airavata.model.data.movement.ttypes

from thrift.transport import TTransport


class ResourceJobManagerType(object):
    """
    * Enumeration of local resource job manager types supported by Airavata
    *
    * FORK:
    *  Forking of commands without any job manager
    *
    * PBS:
    *  Job manager supporting the Portal Batch System (PBS) protocol. Some examples include TORQUE, PBSPro, Grid Engine.
    *
    * SLURM:
    *  The Simple Linux Utility for Resource Management is a open source workload manager.
     *
     * UGE:
     *  Univa Grid Engine, a variation of PBS implementation.
     *
     * LSF:
     *  IBM Platform Load Sharing Facility is dominantly installed on IBM clusters.
    *
    """
    FORK = 0
    PBS = 1
    SLURM = 2
    LSF = 3
    UGE = 4
    CLOUD = 5
    AIRAVATA_CUSTOM = 6

    _VALUES_TO_NAMES = {
        0: "FORK",
        1: "PBS",
        2: "SLURM",
        3: "LSF",
        4: "UGE",
        5: "CLOUD",
        6: "AIRAVATA_CUSTOM",
    }

    _NAMES_TO_VALUES = {
        "FORK": 0,
        "PBS": 1,
        "SLURM": 2,
        "LSF": 3,
        "UGE": 4,
        "CLOUD": 5,
        "AIRAVATA_CUSTOM": 6,
    }


class JobManagerCommand(object):
    """
    Enumeration of resource job manager commands

    SUBMISSION:
     Ex: qsub, sbatch

    JOBMONITORING:
     Ex: qstat, squeue

    DELETION:
     Ex: qdel, scancel

    CHECK_JOB:
     Detailed Status about the Job. Ex: checkjob

    SHOW_QUEUE:
     List of Queued Job by the schedular. Ex: showq

    SHOW_RESERVATION:
     List all reservations. Ex:showres, show_res

    SHOW_START:
     Display the start time of the specified job. Ex: showstart

    """
    SUBMISSION = 0
    JOB_MONITORING = 1
    DELETION = 2
    CHECK_JOB = 3
    SHOW_QUEUE = 4
    SHOW_RESERVATION = 5
    SHOW_START = 6

    _VALUES_TO_NAMES = {
        0: "SUBMISSION",
        1: "JOB_MONITORING",
        2: "DELETION",
        3: "CHECK_JOB",
        4: "SHOW_QUEUE",
        5: "SHOW_RESERVATION",
        6: "SHOW_START",
    }

    _NAMES_TO_VALUES = {
        "SUBMISSION": 0,
        "JOB_MONITORING": 1,
        "DELETION": 2,
        "CHECK_JOB": 3,
        "SHOW_QUEUE": 4,
        "SHOW_RESERVATION": 5,
        "SHOW_START": 6,
    }


class FileSystems(object):
    """
    Enumeration of File Systems on the resource

    FORK:
     Forking of commands without any job manager

    PBS:
     Job manager supporting the Portal Batch System (PBS) protocol. Some examples include TORQUE, PBSPro, Grid Engine.

    UGE:
     Univa Grid Engine, a variation of PBS implementation.

    SLURM:
     The Simple Linux Utility for Resource Management is a open source workload manager.

    """
    HOME = 0
    WORK = 1
    LOCALTMP = 2
    SCRATCH = 3
    ARCHIVE = 4

    _VALUES_TO_NAMES = {
        0: "HOME",
        1: "WORK",
        2: "LOCALTMP",
        3: "SCRATCH",
        4: "ARCHIVE",
    }

    _NAMES_TO_VALUES = {
        "HOME": 0,
        "WORK": 1,
        "LOCALTMP": 2,
        "SCRATCH": 3,
        "ARCHIVE": 4,
    }


class JobSubmissionProtocol(object):
    """
    Enumeration of Airavata supported Job Submission Mechanisms for High Performance Computing Clusters.

    SSH:
     Execute remote job submission commands using via secure shell protocol.

    GRAM:
     Execute remote jobs via Globus GRAM service.

    UNICORE:
     Execute remote jobs via Unicore services

    """
    LOCAL = 0
    SSH = 1
    GLOBUS = 2
    UNICORE = 3
    CLOUD = 4
    SSH_FORK = 5
    LOCAL_FORK = 6

    _VALUES_TO_NAMES = {
        0: "LOCAL",
        1: "SSH",
        2: "GLOBUS",
        3: "UNICORE",
        4: "CLOUD",
        5: "SSH_FORK",
        6: "LOCAL_FORK",
    }

    _NAMES_TO_VALUES = {
        "LOCAL": 0,
        "SSH": 1,
        "GLOBUS": 2,
        "UNICORE": 3,
        "CLOUD": 4,
        "SSH_FORK": 5,
        "LOCAL_FORK": 6,
    }


class MonitorMode(object):
    """
    Monitoring modes

    POLL_JOB_MANAGER:
    GFac need to pull job status changes.

    XSEDE_AMQP_SUBSCRIBE:
    Server will publish job status changes to amqp servert.


    """
    POLL_JOB_MANAGER = 0
    CLOUD_JOB_MONITOR = 1
    JOB_EMAIL_NOTIFICATION_MONITOR = 2
    XSEDE_AMQP_SUBSCRIBE = 3
    FORK = 4
    LOCAL = 5

    _VALUES_TO_NAMES = {
        0: "POLL_JOB_MANAGER",
        1: "CLOUD_JOB_MONITOR",
        2: "JOB_EMAIL_NOTIFICATION_MONITOR",
        3: "XSEDE_AMQP_SUBSCRIBE",
        4: "FORK",
        5: "LOCAL",
    }

    _NAMES_TO_VALUES = {
        "POLL_JOB_MANAGER": 0,
        "CLOUD_JOB_MONITOR": 1,
        "JOB_EMAIL_NOTIFICATION_MONITOR": 2,
        "XSEDE_AMQP_SUBSCRIBE": 3,
        "FORK": 4,
        "LOCAL": 5,
    }


class DMType(object):
    COMPUTE_RESOURCE = 0
    STORAGE_RESOURCE = 1

    _VALUES_TO_NAMES = {
        0: "COMPUTE_RESOURCE",
        1: "STORAGE_RESOURCE",
    }

    _NAMES_TO_VALUES = {
        "COMPUTE_RESOURCE": 0,
        "STORAGE_RESOURCE": 1,
    }


class ProviderName(object):
    """
    Provider name

    """
    EC2 = 0
    AWSEC2 = 1
    RACKSPACE = 2

    _VALUES_TO_NAMES = {
        0: "EC2",
        1: "AWSEC2",
        2: "RACKSPACE",
    }

    _NAMES_TO_VALUES = {
        "EC2": 0,
        "AWSEC2": 1,
        "RACKSPACE": 2,
    }


class ResourceJobManager(object):
    """
    Resource Job Manager Information

    resourceJobManagerType:
     A typical HPC cluster has a single Job Manager to manage the resources.

    pushMonitoringEndpoint:
     If the job manager pushes out state changes to a database or bus, specify the service endpoint.
      Ex: Moab Web Service, Moab MongoDB URL, AMQP (GLUE2) Broker

    jobManagerBinPath:
     Path to the Job Manager Installation Binary directory.

    jobManagerCommands:
     An enumeration of commonly used manager commands.


    Attributes:
     - resourceJobManagerId
     - resourceJobManagerType
     - pushMonitoringEndpoint
     - jobManagerBinPath
     - jobManagerCommands
     - parallelismPrefix
    """

    thrift_spec = (
        None,  # 0
        (1, TType.STRING, 'resourceJobManagerId', 'UTF8', "DO_NOT_SET_AT_CLIENTS", ),  # 1
        (2, TType.I32, 'resourceJobManagerType', None, None, ),  # 2
        (3, TType.STRING, 'pushMonitoringEndpoint', 'UTF8', None, ),  # 3
        (4, TType.STRING, 'jobManagerBinPath', 'UTF8', None, ),  # 4
        (5, TType.MAP, 'jobManagerCommands', (TType.I32, None, TType.STRING, 'UTF8', False), None, ),  # 5
        (6, TType.MAP, 'parallelismPrefix', (TType.I32, None, TType.STRING, 'UTF8', False), None, ),  # 6
    )

    def __init__(self, resourceJobManagerId=thrift_spec[1][4], resourceJobManagerType=None, pushMonitoringEndpoint=None, jobManagerBinPath=None, jobManagerCommands=None, parallelismPrefix=None,):
        self.resourceJobManagerId = resourceJobManagerId
        self.resourceJobManagerType = resourceJobManagerType
        self.pushMonitoringEndpoint = pushMonitoringEndpoint
        self.jobManagerBinPath = jobManagerBinPath
        self.jobManagerCommands = jobManagerCommands
        self.parallelismPrefix = parallelismPrefix

    def read(self, iprot):
        if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None:
            iprot._fast_decode(self, iprot, (self.__class__, self.thrift_spec))
            return
        iprot.readStructBegin()
        while True:
            (fname, ftype, fid) = iprot.readFieldBegin()
            if ftype == TType.STOP:
                break
            if fid == 1:
                if ftype == TType.STRING:
                    self.resourceJobManagerId = iprot.readString().decode('utf-8') if sys.version_info[0] == 2 else iprot.readString()
                else:
                    iprot.skip(ftype)
            elif fid == 2:
                if ftype == TType.I32:
                    self.resourceJobManagerType = iprot.readI32()
                else:
                    iprot.skip(ftype)
            elif fid == 3:
                if ftype == TType.STRING:
                    self.pushMonitoringEndpoint = iprot.readString().decode('utf-8') if sys.version_info[0] == 2 else iprot.readString()
                else:
                    iprot.skip(ftype)
            elif fid == 4:
                if ftype == TType.STRING:
                    self.jobManagerBinPath = iprot.readString().decode('utf-8') if sys.version_info[0] == 2 else iprot.readString()
                else:
                    iprot.skip(ftype)
            elif fid == 5:
                if ftype == TType.MAP:
                    self.jobManagerCommands = {}
                    (_ktype1, _vtype2, _size0) = iprot.readMapBegin()
                    for _i4 in range(_size0):
                        _key5 = iprot.readI32()
                        _val6 = iprot.readString().decode('utf-8') if sys.version_info[0] == 2 else iprot.readString()
                        self.jobManagerCommands[_key5] = _val6
                    iprot.readMapEnd()
                else:
                    iprot.skip(ftype)
            elif fid == 6:
                if ftype == TType.MAP:
                    self.parallelismPrefix = {}
                    (_ktype8, _vtype9, _size7) = iprot.readMapBegin()
                    for _i11 in range(_size7):
                        _key12 = iprot.readI32()
                        _val13 = iprot.readString().decode('utf-8') if sys.version_info[0] == 2 else iprot.readString()
                        self.parallelismPrefix[_key12] = _val13
                    iprot.readMapEnd()
                else:
                    iprot.skip(ftype)
            else:
                iprot.skip(ftype)
            iprot.readFieldEnd()
        iprot.readStructEnd()

    def write(self, oprot):
        if oprot._fast_encode is not None and self.thrift_spec is not None:
            oprot.trans.write(oprot._fast_encode(self, (self.__class__, self.thrift_spec)))
            return
        oprot.writeStructBegin('ResourceJobManager')
        if self.resourceJobManagerId is not None:
            oprot.writeFieldBegin('resourceJobManagerId', TType.STRING, 1)
            oprot.writeString(self.resourceJobManagerId.encode('utf-8') if sys.version_info[0] == 2 else self.resourceJobManagerId)
            oprot.writeFieldEnd()
        if self.resourceJobManagerType is not None:
            oprot.writeFieldBegin('resourceJobManagerType', TType.I32, 2)
            oprot.writeI32(self.resourceJobManagerType)
            oprot.writeFieldEnd()
        if self.pushMonitoringEndpoint is not None:
            oprot.writeFieldBegin('pushMonitoringEndpoint', TType.STRING, 3)
            oprot.writeString(self.pushMonitoringEndpoint.encode('utf-8') if sys.version_info[0] == 2 else self.pushMonitoringEndpoint)
            oprot.writeFieldEnd()
        if self.jobManagerBinPath is not None:
            oprot.writeFieldBegin('jobManagerBinPath', TType.STRING, 4)
            oprot.writeString(self.jobManagerBinPath.encode('utf-8') if sys.version_info[0] == 2 else self.jobManagerBinPath)
            oprot.writeFieldEnd()
        if self.jobManagerCommands is not None:
            oprot.writeFieldBegin('jobManagerCommands', TType.MAP, 5)
            oprot.writeMapBegin(TType.I32, TType.STRING, len(self.jobManagerCommands))
            for kiter14, viter15 in self.jobManagerCommands.items():
                oprot.writeI32(kiter14)
                oprot.writeString(viter15.encode('utf-8') if sys.version_info[0] == 2 else viter15)
            oprot.writeMapEnd()
            oprot.writeFieldEnd()
        if self.parallelismPrefix is not None:
            oprot.writeFieldBegin('parallelismPrefix', TType.MAP, 6)
            oprot.writeMapBegin(TType.I32, TType.STRING, len(self.parallelismPrefix))
            for kiter16, viter17 in self.parallelismPrefix.items():
                oprot.writeI32(kiter16)
                oprot.writeString(viter17.encode('utf-8') if sys.version_info[0] == 2 else viter17)
            oprot.writeMapEnd()
            oprot.writeFieldEnd()
        oprot.writeFieldStop()
        oprot.writeStructEnd()

    def validate(self):
        if self.resourceJobManagerId is None:
            raise TProtocolException(message='Required field resourceJobManagerId is unset!')
        if self.resourceJobManagerType is None:
            raise TProtocolException(message='Required field resourceJobManagerType is unset!')
        return

    def __repr__(self):
        L = ['%s=%r' % (key, value)
             for key, value in self.__dict__.items()]
        return '%s(%s)' % (self.__class__.__name__, ', '.join(L))

    def __eq__(self, other):
        return isinstance(other, self.__class__) and self.__dict__ == other.__dict__

    def __ne__(self, other):
        return not (self == other)


class BatchQueue(object):
    """
    Batch Queue Information on SuperComputers

    maxRunTime:
     Maximum allowed run time in hours.

    Attributes:
     - queueName
     - queueDescription
     - maxRunTime
     - maxNodes
     - maxProcessors
     - maxJobsInQueue
     - maxMemory
     - cpuPerNode
     - defaultNodeCount
     - defaultCPUCount
     - isDefaultQueue
    """

    thrift_spec = (
        None,  # 0
        (1, TType.STRING, 'queueName', 'UTF8', None, ),  # 1
        (2, TType.STRING, 'queueDescription', 'UTF8', None, ),  # 2
        (3, TType.I32, 'maxRunTime', None, None, ),  # 3
        (4, TType.I32, 'maxNodes', None, None, ),  # 4
        (5, TType.I32, 'maxProcessors', None, None, ),  # 5
        (6, TType.I32, 'maxJobsInQueue', None, None, ),  # 6
        (7, TType.I32, 'maxMemory', None, None, ),  # 7
        (8, TType.I32, 'cpuPerNode', None, None, ),  # 8
        (9, TType.I32, 'defaultNodeCount', None, None, ),  # 9
        (10, TType.I32, 'defaultCPUCount', None, None, ),  # 10
        (11, TType.BOOL, 'isDefaultQueue', None, None, ),  # 11
    )

    def __init__(self, queueName=None, queueDescription=None, maxRunTime=None, maxNodes=None, maxProcessors=None, maxJobsInQueue=None, maxMemory=None, cpuPerNode=None, defaultNodeCount=None, defaultCPUCount=None, isDefaultQueue=None,):
        self.queueName = queueName
        self.queueDescription = queueDescription
        self.maxRunTime = maxRunTime
        self.maxNodes = maxNodes
        self.maxProcessors = maxProcessors
        self.maxJobsInQueue = maxJobsInQueue
        self.maxMemory = maxMemory
        self.cpuPerNode = cpuPerNode
        self.defaultNodeCount = defaultNodeCount
        self.defaultCPUCount = defaultCPUCount
        self.isDefaultQueue = isDefaultQueue

    def read(self, iprot):
        if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None:
            iprot._fast_decode(self, iprot, (self.__class__, self.thrift_spec))
            return
        iprot.readStructBegin()
        while True:
            (fname, ftype, fid) = iprot.readFieldBegin()
            if ftype == TType.STOP:
                break
            if fid == 1:
                if ftype == TType.STRING:
                    self.queueName = iprot.readString().decode('utf-8') if sys.version_info[0] == 2 else iprot.readString()
                else:
                    iprot.skip(ftype)
            elif fid == 2:
                if ftype == TType.STRING:
                    self.queueDescription = iprot.readString().decode('utf-8') if sys.version_info[0] == 2 else iprot.readString()
                else:
                    iprot.skip(ftype)
            elif fid == 3:
                if ftype == TType.I32:
                    self.maxRunTime = iprot.readI32()
                else:
                    iprot.skip(ftype)
            elif fid == 4:
                if ftype == TType.I32:
                    self.maxNodes = iprot.readI32()
                else:
                    iprot.skip(ftype)
            elif fid == 5:
                if ftype == TType.I32:
                    self.maxProcessors = iprot.readI32()
                else:
                    iprot.skip(ftype)
            elif fid == 6:
                if ftype == TType.I32:
                    self.maxJobsInQueue = iprot.readI32()
                else:
                    iprot.skip(ftype)
            elif fid == 7:
                if ftype == TType.I32:
                    self.maxMemory = iprot.readI32()
                else:
                    iprot.skip(ftype)
            elif fid == 8:
                if ftype == TType.I32:
                    self.cpuPerNode = iprot.readI32()
                else:
                    iprot.skip(ftype)
            elif fid == 9:
                if ftype == TType.I32:
                    self.defaultNodeCount = iprot.readI32()
                else:
                    iprot.skip(ftype)
            elif fid == 10:
                if ftype == TType.I32:
                    self.defaultCPUCount = iprot.readI32()
                else:
                    iprot.skip(ftype)
            elif fid == 11:
                if ftype == TType.BOOL:
                    self.isDefaultQueue = iprot.readBool()
                else:
                    iprot.skip(ftype)
            else:
                iprot.skip(ftype)
            iprot.readFieldEnd()
        iprot.readStructEnd()

    def write(self, oprot):
        if oprot._fast_encode is not None and self.thrift_spec is not None:
            oprot.trans.write(oprot._fast_encode(self, (self.__class__, self.thrift_spec)))
            return
        oprot.writeStructBegin('BatchQueue')
        if self.queueName is not None:
            oprot.writeFieldBegin('queueName', TType.STRING, 1)
            oprot.writeString(self.queueName.encode('utf-8') if sys.version_info[0] == 2 else self.queueName)
            oprot.writeFieldEnd()
        if self.queueDescription is not None:
            oprot.writeFieldBegin('queueDescription', TType.STRING, 2)
            oprot.writeString(self.queueDescription.encode('utf-8') if sys.version_info[0] == 2 else self.queueDescription)
            oprot.writeFieldEnd()
        if self.maxRunTime is not None:
            oprot.writeFieldBegin('maxRunTime', TType.I32, 3)
            oprot.writeI32(self.maxRunTime)
            oprot.writeFieldEnd()
        if self.maxNodes is not None:
            oprot.writeFieldBegin('maxNodes', TType.I32, 4)
            oprot.writeI32(self.maxNodes)
            oprot.writeFieldEnd()
        if self.maxProcessors is not None:
            oprot.writeFieldBegin('maxProcessors', TType.I32, 5)
            oprot.writeI32(self.maxProcessors)
            oprot.writeFieldEnd()
        if self.maxJobsInQueue is not None:
            oprot.writeFieldBegin('maxJobsInQueue', TType.I32, 6)
            oprot.writeI32(self.maxJobsInQueue)
            oprot.writeFieldEnd()
        if self.maxMemory is not None:
            oprot.writeFieldBegin('maxMemory', TType.I32, 7)
            oprot.writeI32(self.maxMemory)
            oprot.writeFieldEnd()
        if self.cpuPerNode is not None:
            oprot.writeFieldBegin('cpuPerNode', TType.I32, 8)
            oprot.writeI32(self.cpuPerNode)
            oprot.writeFieldEnd()
        if self.defaultNodeCount is not None:
            oprot.writeFieldBegin('defaultNodeCount', TType.I32, 9)
            oprot.writeI32(self.defaultNodeCount)
            oprot.writeFieldEnd()
        if self.defaultCPUCount is not None:
            oprot.writeFieldBegin('defaultCPUCount', TType.I32, 10)
            oprot.writeI32(self.defaultCPUCount)
            oprot.writeFieldEnd()
        if self.isDefaultQueue is not None:
            oprot.writeFieldBegin('isDefaultQueue', TType.BOOL, 11)
            oprot.writeBool(self.isDefaultQueue)
            oprot.writeFieldEnd()
        oprot.writeFieldStop()
        oprot.writeStructEnd()

    def validate(self):
        if self.queueName is None:
            raise TProtocolException(message='Required field queueName is unset!')
        return

    def __repr__(self):
        L = ['%s=%r' % (key, value)
             for key, value in self.__dict__.items()]
        return '%s(%s)' % (self.__class__.__name__, ', '.join(L))

    def __eq__(self, other):
        return isinstance(other, self.__class__) and self.__dict__ == other.__dict__

    def __ne__(self, other):
        return not (self == other)


class LOCALSubmission(object):
    """
    Locally Fork Jobs as OS processes

    alternativeSSHHostName:
     If the login to ssh is different than the hostname itself, specify it here

    sshPort:
     If a non-default port needs to used, specify it.

    Attributes:
     - jobSubmissionInterfaceId
     - resourceJobManager
     - securityProtocol
    """

    thrift_spec = (
        None,  # 0
        (1, TType.STRING, 'jobSubmissionInterfaceId', 'UTF8', "DO_NOT_SET_AT_CLIENTS", ),  # 1
        (2, TType.STRUCT, 'resourceJobManager', (ResourceJobManager, ResourceJobManager.thrift_spec), None, ),  # 2
        (3, TType.I32, 'securityProtocol', None, None, ),  # 3
    )

    def __init__(self, jobSubmissionInterfaceId=thrift_spec[1][4], resourceJobManager=None, securityProtocol=None,):
        self.jobSubmissionInterfaceId = jobSubmissionInterfaceId
        self.resourceJobManager = resourceJobManager
        self.securityProtocol = securityProtocol

    def read(self, iprot):
        if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None:
            iprot._fast_decode(self, iprot, (self.__class__, self.thrift_spec))
            return
        iprot.readStructBegin()
        while True:
            (fname, ftype, fid) = iprot.readFieldBegin()
            if ftype == TType.STOP:
                break
            if fid == 1:
                if ftype == TType.STRING:
                    self.jobSubmissionInterfaceId = iprot.readString().decode('utf-8') if sys.version_info[0] == 2 else iprot.readString()
                else:
                    iprot.skip(ftype)
            elif fid == 2:
                if ftype == TType.STRUCT:
                    self.resourceJobManager = ResourceJobManager()
                    self.resourceJobManager.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 3:
                if ftype == TType.I32:
                    self.securityProtocol = iprot.readI32()
                else:
                    iprot.skip(ftype)
            else:
                iprot.skip(ftype)
            iprot.readFieldEnd()
        iprot.readStructEnd()

    def write(self, oprot):
        if oprot._fast_encode is not None and self.thrift_spec is not None:
            oprot.trans.write(oprot._fast_encode(self, (self.__class__, self.thrift_spec)))
            return
        oprot.writeStructBegin('LOCALSubmission')
        if self.jobSubmissionInterfaceId is not None:
            oprot.writeFieldBegin('jobSubmissionInterfaceId', TType.STRING, 1)
            oprot.writeString(self.jobSubmissionInterfaceId.encode('utf-8') if sys.version_info[0] == 2 else self.jobSubmissionInterfaceId)
            oprot.writeFieldEnd()
        if self.resourceJobManager is not None:
            oprot.writeFieldBegin('resourceJobManager', TType.STRUCT, 2)
            self.resourceJobManager.write(oprot)
            oprot.writeFieldEnd()
        if self.securityProtocol is not None:
            oprot.writeFieldBegin('securityProtocol', TType.I32, 3)
            oprot.writeI32(self.securityProtocol)
            oprot.writeFieldEnd()
        oprot.writeFieldStop()
        oprot.writeStructEnd()

    def validate(self):
        if self.jobSubmissionInterfaceId is None:
            raise TProtocolException(message='Required field jobSubmissionInterfaceId is unset!')
        if self.resourceJobManager is None:
            raise TProtocolException(message='Required field resourceJobManager is unset!')
        if self.securityProtocol is None:
            raise TProtocolException(message='Required field securityProtocol is unset!')
        return

    def __repr__(self):
        L = ['%s=%r' % (key, value)
             for key, value in self.__dict__.items()]
        return '%s(%s)' % (self.__class__.__name__, ', '.join(L))

    def __eq__(self, other):
        return isinstance(other, self.__class__) and self.__dict__ == other.__dict__

    def __ne__(self, other):
        return not (self == other)


class SSHJobSubmission(object):
    """
    Authenticate using Secured Shell

    alternativeSSHHostName:
     If the login to ssh is different than the hostname itself, specify it here

    sshPort:
     If a non-default port needs to used, specify it.

    batchQueueEmailSenders:
     If a resource always sends the monitoring from a specific address, specify the
      full email address. If a resource sends emails from multiple addresses (
       example: based on the submitted login node) then use the wildchar * to indicate
       the same. Example: *@*.example.com or *@example.com


    Attributes:
     - jobSubmissionInterfaceId
     - securityProtocol
     - resourceJobManager
     - alternativeSSHHostName
     - sshPort
     - monitorMode
     - batchQueueEmailSenders
    """

    thrift_spec = (
        None,  # 0
        (1, TType.STRING, 'jobSubmissionInterfaceId', 'UTF8', "DO_NOT_SET_AT_CLIENTS", ),  # 1
        (2, TType.I32, 'securityProtocol', None, None, ),  # 2
        (3, TType.STRUCT, 'resourceJobManager', (ResourceJobManager, ResourceJobManager.thrift_spec), None, ),  # 3
        (4, TType.STRING, 'alternativeSSHHostName', 'UTF8', None, ),  # 4
        (5, TType.I32, 'sshPort', None, 22, ),  # 5
        (6, TType.I32, 'monitorMode', None, None, ),  # 6
        (7, TType.LIST, 'batchQueueEmailSenders', (TType.STRING, 'UTF8', False), None, ),  # 7
    )

    def __init__(self, jobSubmissionInterfaceId=thrift_spec[1][4], securityProtocol=None, resourceJobManager=None, alternativeSSHHostName=None, sshPort=thrift_spec[5][4], monitorMode=None, batchQueueEmailSenders=None,):
        self.jobSubmissionInterfaceId = jobSubmissionInterfaceId
        self.securityProtocol = securityProtocol
        self.resourceJobManager = resourceJobManager
        self.alternativeSSHHostName = alternativeSSHHostName
        self.sshPort = sshPort
        self.monitorMode = monitorMode
        self.batchQueueEmailSenders = batchQueueEmailSenders

    def read(self, iprot):
        if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None:
            iprot._fast_decode(self, iprot, (self.__class__, self.thrift_spec))
            return
        iprot.readStructBegin()
        while True:
            (fname, ftype, fid) = iprot.readFieldBegin()
            if ftype == TType.STOP:
                break
            if fid == 1:
                if ftype == TType.STRING:
                    self.jobSubmissionInterfaceId = iprot.readString().decode('utf-8') if sys.version_info[0] == 2 else iprot.readString()
                else:
                    iprot.skip(ftype)
            elif fid == 2:
                if ftype == TType.I32:
                    self.securityProtocol = iprot.readI32()
                else:
                    iprot.skip(ftype)
            elif fid == 3:
                if ftype == TType.STRUCT:
                    self.resourceJobManager = ResourceJobManager()
                    self.resourceJobManager.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 4:
                if ftype == TType.STRING:
                    self.alternativeSSHHostName = iprot.readString().decode('utf-8') if sys.version_info[0] == 2 else iprot.readString()
                else:
                    iprot.skip(ftype)
            elif fid == 5:
                if ftype == TType.I32:
                    self.sshPort = iprot.readI32()
                else:
                    iprot.skip(ftype)
            elif fid == 6:
                if ftype == TType.I32:
                    self.monitorMode = iprot.readI32()
                else:
                    iprot.skip(ftype)
            elif fid == 7:
                if ftype == TType.LIST:
                    self.batchQueueEmailSenders = []
                    (_etype21, _size18) = iprot.readListBegin()
                    for _i22 in range(_size18):
                        _elem23 = iprot.readString().decode('utf-8') if sys.version_info[0] == 2 else iprot.readString()
                        self.batchQueueEmailSenders.append(_elem23)
                    iprot.readListEnd()
                else:
                    iprot.skip(ftype)
            else:
                iprot.skip(ftype)
            iprot.readFieldEnd()
        iprot.readStructEnd()

    def write(self, oprot):
        if oprot._fast_encode is not None and self.thrift_spec is not None:
            oprot.trans.write(oprot._fast_encode(self, (self.__class__, self.thrift_spec)))
            return
        oprot.writeStructBegin('SSHJobSubmission')
        if self.jobSubmissionInterfaceId is not None:
            oprot.writeFieldBegin('jobSubmissionInterfaceId', TType.STRING, 1)
            oprot.writeString(self.jobSubmissionInterfaceId.encode('utf-8') if sys.version_info[0] == 2 else self.jobSubmissionInterfaceId)
            oprot.writeFieldEnd()
        if self.securityProtocol is not None:
            oprot.writeFieldBegin('securityProtocol', TType.I32, 2)
            oprot.writeI32(self.securityProtocol)
            oprot.writeFieldEnd()
        if self.resourceJobManager is not None:
            oprot.writeFieldBegin('resourceJobManager', TType.STRUCT, 3)
            self.resourceJobManager.write(oprot)
            oprot.writeFieldEnd()
        if self.alternativeSSHHostName is not None:
            oprot.writeFieldBegin('alternativeSSHHostName', TType.STRING, 4)
            oprot.writeString(self.alternativeSSHHostName.encode('utf-8') if sys.version_info[0] == 2 else self.alternativeSSHHostName)
            oprot.writeFieldEnd()
        if self.sshPort is not None:
            oprot.writeFieldBegin('sshPort', TType.I32, 5)
            oprot.writeI32(self.sshPort)
            oprot.writeFieldEnd()
        if self.monitorMode is not None:
            oprot.writeFieldBegin('monitorMode', TType.I32, 6)
            oprot.writeI32(self.monitorMode)
            oprot.writeFieldEnd()
        if self.batchQueueEmailSenders is not None:
            oprot.writeFieldBegin('batchQueueEmailSenders', TType.LIST, 7)
            oprot.writeListBegin(TType.STRING, len(self.batchQueueEmailSenders))
            for iter24 in self.batchQueueEmailSenders:
                oprot.writeString(iter24.encode('utf-8') if sys.version_info[0] == 2 else iter24)
            oprot.writeListEnd()
            oprot.writeFieldEnd()
        oprot.writeFieldStop()
        oprot.writeStructEnd()

    def validate(self):
        if self.jobSubmissionInterfaceId is None:
            raise TProtocolException(message='Required field jobSubmissionInterfaceId is unset!')
        if self.securityProtocol is None:
            raise TProtocolException(message='Required field securityProtocol is unset!')
        if self.resourceJobManager is None:
            raise TProtocolException(message='Required field resourceJobManager is unset!')
        return

    def __repr__(self):
        L = ['%s=%r' % (key, value)
             for key, value in self.__dict__.items()]
        return '%s(%s)' % (self.__class__.__name__, ', '.join(L))

    def __eq__(self, other):
        return isinstance(other, self.__class__) and self.__dict__ == other.__dict__

    def __ne__(self, other):
        return not (self == other)


class GlobusJobSubmission(object):
    """
    Attributes:
     - jobSubmissionInterfaceId
     - securityProtocol
     - globusGateKeeperEndPoint
    """

    thrift_spec = (
        None,  # 0
        (1, TType.STRING, 'jobSubmissionInterfaceId', 'UTF8', "DO_NOT_SET_AT_CLIENTS", ),  # 1
        (2, TType.I32, 'securityProtocol', None, None, ),  # 2
        (3, TType.LIST, 'globusGateKeeperEndPoint', (TType.STRING, 'UTF8', False), None, ),  # 3
    )

    def __init__(self, jobSubmissionInterfaceId=thrift_spec[1][4], securityProtocol=None, globusGateKeeperEndPoint=None,):
        self.jobSubmissionInterfaceId = jobSubmissionInterfaceId
        self.securityProtocol = securityProtocol
        self.globusGateKeeperEndPoint = globusGateKeeperEndPoint

    def read(self, iprot):
        if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None:
            iprot._fast_decode(self, iprot, (self.__class__, self.thrift_spec))
            return
        iprot.readStructBegin()
        while True:
            (fname, ftype, fid) = iprot.readFieldBegin()
            if ftype == TType.STOP:
                break
            if fid == 1:
                if ftype == TType.STRING:
                    self.jobSubmissionInterfaceId = iprot.readString().decode('utf-8') if sys.version_info[0] == 2 else iprot.readString()
                else:
                    iprot.skip(ftype)
            elif fid == 2:
                if ftype == TType.I32:
                    self.securityProtocol = iprot.readI32()
                else:
                    iprot.skip(ftype)
            elif fid == 3:
                if ftype == TType.LIST:
                    self.globusGateKeeperEndPoint = []
                    (_etype28, _size25) = iprot.readListBegin()
                    for _i29 in range(_size25):
                        _elem30 = iprot.readString().decode('utf-8') if sys.version_info[0] == 2 else iprot.readString()
                        self.globusGateKeeperEndPoint.append(_elem30)
                    iprot.readListEnd()
                else:
                    iprot.skip(ftype)
            else:
                iprot.skip(ftype)
            iprot.readFieldEnd()
        iprot.readStructEnd()

    def write(self, oprot):
        if oprot._fast_encode is not None and self.thrift_spec is not None:
            oprot.trans.write(oprot._fast_encode(self, (self.__class__, self.thrift_spec)))
            return
        oprot.writeStructBegin('GlobusJobSubmission')
        if self.jobSubmissionInterfaceId is not None:
            oprot.writeFieldBegin('jobSubmissionInterfaceId', TType.STRING, 1)
            oprot.writeString(self.jobSubmissionInterfaceId.encode('utf-8') if sys.version_info[0] == 2 else self.jobSubmissionInterfaceId)
            oprot.writeFieldEnd()
        if self.securityProtocol is not None:
            oprot.writeFieldBegin('securityProtocol', TType.I32, 2)
            oprot.writeI32(self.securityProtocol)
            oprot.writeFieldEnd()
        if self.globusGateKeeperEndPoint is not None:
            oprot.writeFieldBegin('globusGateKeeperEndPoint', TType.LIST, 3)
            oprot.writeListBegin(TType.STRING, len(self.globusGateKeeperEndPoint))
            for iter31 in self.globusGateKeeperEndPoint:
                oprot.writeString(iter31.encode('utf-8') if sys.version_info[0] == 2 else iter31)
            oprot.writeListEnd()
            oprot.writeFieldEnd()
        oprot.writeFieldStop()
        oprot.writeStructEnd()

    def validate(self):
        if self.jobSubmissionInterfaceId is None:
            raise TProtocolException(message='Required field jobSubmissionInterfaceId is unset!')
        if self.securityProtocol is None:
            raise TProtocolException(message='Required field securityProtocol is unset!')
        return

    def __repr__(self):
        L = ['%s=%r' % (key, value)
             for key, value in self.__dict__.items()]
        return '%s(%s)' % (self.__class__.__name__, ', '.join(L))

    def __eq__(self, other):
        return isinstance(other, self.__class__) and self.__dict__ == other.__dict__

    def __ne__(self, other):
        return not (self == other)


class UnicoreJobSubmission(object):
    """
    Unicore Job Submission

    unicoreEndPointURL:
     unicoreGateway End Point. The provider will query this service to fetch required service end points.
    authenticationMode
     The authenticationMode defines the way certificate is fetched.

    Attributes:
     - jobSubmissionInterfaceId
     - securityProtocol
     - unicoreEndPointURL
    """

    thrift_spec = (
        None,  # 0
        (1, TType.STRING, 'jobSubmissionInterfaceId', 'UTF8', "DO_NOT_SET_AT_CLIENTS", ),  # 1
        (2, TType.I32, 'securityProtocol', None, None, ),  # 2
        (3, TType.STRING, 'unicoreEndPointURL', 'UTF8', None, ),  # 3
    )

    def __init__(self, jobSubmissionInterfaceId=thrift_spec[1][4], securityProtocol=None, unicoreEndPointURL=None,):
        self.jobSubmissionInterfaceId = jobSubmissionInterfaceId
        self.securityProtocol = securityProtocol
        self.unicoreEndPointURL = unicoreEndPointURL

    def read(self, iprot):
        if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None:
            iprot._fast_decode(self, iprot, (self.__class__, self.thrift_spec))
            return
        iprot.readStructBegin()
        while True:
            (fname, ftype, fid) = iprot.readFieldBegin()
            if ftype == TType.STOP:
                break
            if fid == 1:
                if ftype == TType.STRING:
                    self.jobSubmissionInterfaceId = iprot.readString().decode('utf-8') if sys.version_info[0] == 2 else iprot.readString()
                else:
                    iprot.skip(ftype)
            elif fid == 2:
                if ftype == TType.I32:
                    self.securityProtocol = iprot.readI32()
                else:
                    iprot.skip(ftype)
            elif fid == 3:
                if ftype == TType.STRING:
                    self.unicoreEndPointURL = iprot.readString().decode('utf-8') if sys.version_info[0] == 2 else iprot.readString()
                else:
                    iprot.skip(ftype)
            else:
                iprot.skip(ftype)
            iprot.readFieldEnd()
        iprot.readStructEnd()

    def write(self, oprot):
        if oprot._fast_encode is not None and self.thrift_spec is not None:
            oprot.trans.write(oprot._fast_encode(self, (self.__class__, self.thrift_spec)))
            return
        oprot.writeStructBegin('UnicoreJobSubmission')
        if self.jobSubmissionInterfaceId is not None:
            oprot.writeFieldBegin('jobSubmissionInterfaceId', TType.STRING, 1)
            oprot.writeString(self.jobSubmissionInterfaceId.encode('utf-8') if sys.version_info[0] == 2 else self.jobSubmissionInterfaceId)
            oprot.writeFieldEnd()
        if self.securityProtocol is not None:
            oprot.writeFieldBegin('securityProtocol', TType.I32, 2)
            oprot.writeI32(self.securityProtocol)
            oprot.writeFieldEnd()
        if self.unicoreEndPointURL is not None:
            oprot.writeFieldBegin('unicoreEndPointURL', TType.STRING, 3)
            oprot.writeString(self.unicoreEndPointURL.encode('utf-8') if sys.version_info[0] == 2 else self.unicoreEndPointURL)
            oprot.writeFieldEnd()
        oprot.writeFieldStop()
        oprot.writeStructEnd()

    def validate(self):
        if self.jobSubmissionInterfaceId is None:
            raise TProtocolException(message='Required field jobSubmissionInterfaceId is unset!')
        if self.securityProtocol is None:
            raise TProtocolException(message='Required field securityProtocol is unset!')
        if self.unicoreEndPointURL is None:
            raise TProtocolException(message='Required field unicoreEndPointURL is unset!')
        return

    def __repr__(self):
        L = ['%s=%r' % (key, value)
             for key, value in self.__dict__.items()]
        return '%s(%s)' % (self.__class__.__name__, ', '.join(L))

    def __eq__(self, other):
        return isinstance(other, self.__class__) and self.__dict__ == other.__dict__

    def __ne__(self, other):
        return not (self == other)


class CloudJobSubmission(object):
    """
    Cloud Job Submission



    Attributes:
     - jobSubmissionInterfaceId
     - securityProtocol
     - nodeId
     - executableType
     - providerName
     - userAccountName
    """

    thrift_spec = (
        None,  # 0
        (1, TType.STRING, 'jobSubmissionInterfaceId', 'UTF8', "DO_NOT_SET_AT_CLIENTS", ),  # 1
        (2, TType.I32, 'securityProtocol', None, None, ),  # 2
        (3, TType.STRING, 'nodeId', 'UTF8', None, ),  # 3
        (4, TType.STRING, 'executableType', 'UTF8', None, ),  # 4
        (5, TType.I32, 'providerName', None, None, ),  # 5
        (6, TType.STRING, 'userAccountName', 'UTF8', None, ),  # 6
    )

    def __init__(self, jobSubmissionInterfaceId=thrift_spec[1][4], securityProtocol=None, nodeId=None, executableType=None, providerName=None, userAccountName=None,):
        self.jobSubmissionInterfaceId = jobSubmissionInterfaceId
        self.securityProtocol = securityProtocol
        self.nodeId = nodeId
        self.executableType = executableType
        self.providerName = providerName
        self.userAccountName = userAccountName

    def read(self, iprot):
        if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None:
            iprot._fast_decode(self, iprot, (self.__class__, self.thrift_spec))
            return
        iprot.readStructBegin()
        while True:
            (fname, ftype, fid) = iprot.readFieldBegin()
            if ftype == TType.STOP:
                break
            if fid == 1:
                if ftype == TType.STRING:
                    self.jobSubmissionInterfaceId = iprot.readString().decode('utf-8') if sys.version_info[0] == 2 else iprot.readString()
                else:
                    iprot.skip(ftype)
            elif fid == 2:
                if ftype == TType.I32:
                    self.securityProtocol = iprot.readI32()
                else:
                    iprot.skip(ftype)
            elif fid == 3:
                if ftype == TType.STRING:
                    self.nodeId = iprot.readString().decode('utf-8') if sys.version_info[0] == 2 else iprot.readString()
                else:
                    iprot.skip(ftype)
            elif fid == 4:
                if ftype == TType.STRING:
                    self.executableType = iprot.readString().decode('utf-8') if sys.version_info[0] == 2 else iprot.readString()
                else:
                    iprot.skip(ftype)
            elif fid == 5:
                if ftype == TType.I32:
                    self.providerName = iprot.readI32()
                else:
                    iprot.skip(ftype)
            elif fid == 6:
                if ftype == TType.STRING:
                    self.userAccountName = iprot.readString().decode('utf-8') if sys.version_info[0] == 2 else iprot.readString()
                else:
                    iprot.skip(ftype)
            else:
                iprot.skip(ftype)
            iprot.readFieldEnd()
        iprot.readStructEnd()

    def write(self, oprot):
        if oprot._fast_encode is not None and self.thrift_spec is not None:
            oprot.trans.write(oprot._fast_encode(self, (self.__class__, self.thrift_spec)))
            return
        oprot.writeStructBegin('CloudJobSubmission')
        if self.jobSubmissionInterfaceId is not None:
            oprot.writeFieldBegin('jobSubmissionInterfaceId', TType.STRING, 1)
            oprot.writeString(self.jobSubmissionInterfaceId.encode('utf-8') if sys.version_info[0] == 2 else self.jobSubmissionInterfaceId)
            oprot.writeFieldEnd()
        if self.securityProtocol is not None:
            oprot.writeFieldBegin('securityProtocol', TType.I32, 2)
            oprot.writeI32(self.securityProtocol)
            oprot.writeFieldEnd()
        if self.nodeId is not None:
            oprot.writeFieldBegin('nodeId', TType.STRING, 3)
            oprot.writeString(self.nodeId.encode('utf-8') if sys.version_info[0] == 2 else self.nodeId)
            oprot.writeFieldEnd()
        if self.executableType is not None:
            oprot.writeFieldBegin('executableType', TType.STRING, 4)
            oprot.writeString(self.executableType.encode('utf-8') if sys.version_info[0] == 2 else self.executableType)
            oprot.writeFieldEnd()
        if self.providerName is not None:
            oprot.writeFieldBegin('providerName', TType.I32, 5)
            oprot.writeI32(self.providerName)
            oprot.writeFieldEnd()
        if self.userAccountName is not None:
            oprot.writeFieldBegin('userAccountName', TType.STRING, 6)
            oprot.writeString(self.userAccountName.encode('utf-8') if sys.version_info[0] == 2 else self.userAccountName)
            oprot.writeFieldEnd()
        oprot.writeFieldStop()
        oprot.writeStructEnd()

    def validate(self):
        if self.jobSubmissionInterfaceId is None:
            raise TProtocolException(message='Required field jobSubmissionInterfaceId is unset!')
        if self.securityProtocol is None:
            raise TProtocolException(message='Required field securityProtocol is unset!')
        if self.nodeId is None:
            raise TProtocolException(message='Required field nodeId is unset!')
        if self.executableType is None:
            raise TProtocolException(message='Required field executableType is unset!')
        if self.providerName is None:
            raise TProtocolException(message='Required field providerName is unset!')
        if self.userAccountName is None:
            raise TProtocolException(message='Required field userAccountName is unset!')
        return

    def __repr__(self):
        L = ['%s=%r' % (key, value)
             for key, value in self.__dict__.items()]
        return '%s(%s)' % (self.__class__.__name__, ', '.join(L))

    def __eq__(self, other):
        return isinstance(other, self.__class__) and self.__dict__ == other.__dict__

    def __ne__(self, other):
        return not (self == other)


class JobSubmissionInterface(object):
    """
    Job Submission Interfaces

    jobSubmissionInterfaceId: The Job Submission Interface has to be previously registered and referenced here.

    priorityOrder:
     For resources with multiple interfaces, the priority order should be selected.
      Lower the numerical number, higher the priority


    Attributes:
     - jobSubmissionInterfaceId
     - jobSubmissionProtocol
     - priorityOrder
    """

    thrift_spec = (
        None,  # 0
        (1, TType.STRING, 'jobSubmissionInterfaceId', 'UTF8', None, ),  # 1
        (2, TType.I32, 'jobSubmissionProtocol', None, None, ),  # 2
        (3, TType.I32, 'priorityOrder', None, 0, ),  # 3
    )

    def __init__(self, jobSubmissionInterfaceId=None, jobSubmissionProtocol=None, priorityOrder=thrift_spec[3][4],):
        self.jobSubmissionInterfaceId = jobSubmissionInterfaceId
        self.jobSubmissionProtocol = jobSubmissionProtocol
        self.priorityOrder = priorityOrder

    def read(self, iprot):
        if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None:
            iprot._fast_decode(self, iprot, (self.__class__, self.thrift_spec))
            return
        iprot.readStructBegin()
        while True:
            (fname, ftype, fid) = iprot.readFieldBegin()
            if ftype == TType.STOP:
                break
            if fid == 1:
                if ftype == TType.STRING:
                    self.jobSubmissionInterfaceId = iprot.readString().decode('utf-8') if sys.version_info[0] == 2 else iprot.readString()
                else:
                    iprot.skip(ftype)
            elif fid == 2:
                if ftype == TType.I32:
                    self.jobSubmissionProtocol = iprot.readI32()
                else:
                    iprot.skip(ftype)
            elif fid == 3:
                if ftype == TType.I32:
                    self.priorityOrder = iprot.readI32()
                else:
                    iprot.skip(ftype)
            else:
                iprot.skip(ftype)
            iprot.readFieldEnd()
        iprot.readStructEnd()

    def write(self, oprot):
        if oprot._fast_encode is not None and self.thrift_spec is not None:
            oprot.trans.write(oprot._fast_encode(self, (self.__class__, self.thrift_spec)))
            return
        oprot.writeStructBegin('JobSubmissionInterface')
        if self.jobSubmissionInterfaceId is not None:
            oprot.writeFieldBegin('jobSubmissionInterfaceId', TType.STRING, 1)
            oprot.writeString(self.jobSubmissionInterfaceId.encode('utf-8') if sys.version_info[0] == 2 else self.jobSubmissionInterfaceId)
            oprot.writeFieldEnd()
        if self.jobSubmissionProtocol is not None:
            oprot.writeFieldBegin('jobSubmissionProtocol', TType.I32, 2)
            oprot.writeI32(self.jobSubmissionProtocol)
            oprot.writeFieldEnd()
        if self.priorityOrder is not None:
            oprot.writeFieldBegin('priorityOrder', TType.I32, 3)
            oprot.writeI32(self.priorityOrder)
            oprot.writeFieldEnd()
        oprot.writeFieldStop()
        oprot.writeStructEnd()

    def validate(self):
        if self.jobSubmissionInterfaceId is None:
            raise TProtocolException(message='Required field jobSubmissionInterfaceId is unset!')
        if self.jobSubmissionProtocol is None:
            raise TProtocolException(message='Required field jobSubmissionProtocol is unset!')
        if self.priorityOrder is None:
            raise TProtocolException(message='Required field priorityOrder is unset!')
        return

    def __repr__(self):
        L = ['%s=%r' % (key, value)
             for key, value in self.__dict__.items()]
        return '%s(%s)' % (self.__class__.__name__, ', '.join(L))

    def __eq__(self, other):
        return isinstance(other, self.__class__) and self.__dict__ == other.__dict__

    def __ne__(self, other):
        return not (self == other)


class ComputeResourceDescription(object):
    """
    Computational Resource Description

    computeResourceId: Airavata Internal Unique Identifier to distinguish Compute Resource.

    hostName:
      Fully Qualified Host Name.

    hostAliases:
      Aliases if any.

    ipAddress:
      IP Addresses of the Resource.

    resourceDescription:
     A user friendly description of the resource.

    JobSubmissionProtocols:
     A computational resources may have one or more ways of submitting Jobs. This structure
       will hold all available mechanisms to interact with the resource.
     The key is the priority

    DataMovementProtocol:
     Option to specify a prefered data movement mechanism of the available options.

    fileSystems:
     Map of file systems type and the path.


    Attributes:
     - computeResourceId
     - hostName
     - hostAliases
     - ipAddresses
     - resourceDescription
     - enabled
     - batchQueues
     - fileSystems
     - jobSubmissionInterfaces
     - dataMovementInterfaces
     - maxMemoryPerNode
     - gatewayUsageReporting
     - gatewayUsageModuleLoadCommand
     - gatewayUsageExecutable
    """

    thrift_spec = (
        None,  # 0
        (1, TType.STRING, 'computeResourceId', 'UTF8', "DO_NOT_SET_AT_CLIENTS", ),  # 1
        (2, TType.STRING, 'hostName', 'UTF8', None, ),  # 2
        (3, TType.LIST, 'hostAliases', (TType.STRING, 'UTF8', False), None, ),  # 3
        (4, TType.LIST, 'ipAddresses', (TType.STRING, 'UTF8', False), None, ),  # 4
        (5, TType.STRING, 'resourceDescription', 'UTF8', None, ),  # 5
        (6, TType.BOOL, 'enabled', None, None, ),  # 6
        (7, TType.LIST, 'batchQueues', (TType.STRUCT, (BatchQueue, BatchQueue.thrift_spec), False), None, ),  # 7
        (8, TType.MAP, 'fileSystems', (TType.I32, None, TType.STRING, 'UTF8', False), None, ),  # 8
        (9, TType.LIST, 'jobSubmissionInterfaces', (TType.STRUCT, (JobSubmissionInterface, JobSubmissionInterface.thrift_spec), False), None, ),  # 9
        (10, TType.LIST, 'dataMovementInterfaces', (TType.STRUCT, (apache.airavata.model.data.movement.ttypes.DataMovementInterface, apache.airavata.model.data.movement.ttypes.DataMovementInterface.thrift_spec), False), None, ),  # 10
        (11, TType.I32, 'maxMemoryPerNode', None, None, ),  # 11
        (12, TType.BOOL, 'gatewayUsageReporting', None, None, ),  # 12
        (13, TType.STRING, 'gatewayUsageModuleLoadCommand', 'UTF8', None, ),  # 13
        (14, TType.STRING, 'gatewayUsageExecutable', 'UTF8', None, ),  # 14
    )

    def __init__(self, computeResourceId=thrift_spec[1][4], hostName=None, hostAliases=None, ipAddresses=None, resourceDescription=None, enabled=None, batchQueues=None, fileSystems=None, jobSubmissionInterfaces=None, dataMovementInterfaces=None, maxMemoryPerNode=None, gatewayUsageReporting=None, gatewayUsageModuleLoadCommand=None, gatewayUsageExecutable=None,):
        self.computeResourceId = computeResourceId
        self.hostName = hostName
        self.hostAliases = hostAliases
        self.ipAddresses = ipAddresses
        self.resourceDescription = resourceDescription
        self.enabled = enabled
        self.batchQueues = batchQueues
        self.fileSystems = fileSystems
        self.jobSubmissionInterfaces = jobSubmissionInterfaces
        self.dataMovementInterfaces = dataMovementInterfaces
        self.maxMemoryPerNode = maxMemoryPerNode
        self.gatewayUsageReporting = gatewayUsageReporting
        self.gatewayUsageModuleLoadCommand = gatewayUsageModuleLoadCommand
        self.gatewayUsageExecutable = gatewayUsageExecutable

    def read(self, iprot):
        if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None:
            iprot._fast_decode(self, iprot, (self.__class__, self.thrift_spec))
            return
        iprot.readStructBegin()
        while True:
            (fname, ftype, fid) = iprot.readFieldBegin()
            if ftype == TType.STOP:
                break
            if fid == 1:
                if ftype == TType.STRING:
                    self.computeResourceId = iprot.readString().decode('utf-8') if sys.version_info[0] == 2 else iprot.readString()
                else:
                    iprot.skip(ftype)
            elif fid == 2:
                if ftype == TType.STRING:
                    self.hostName = iprot.readString().decode('utf-8') if sys.version_info[0] == 2 else iprot.readString()
                else:
                    iprot.skip(ftype)
            elif fid == 3:
                if ftype == TType.LIST:
                    self.hostAliases = []
                    (_etype35, _size32) = iprot.readListBegin()
                    for _i36 in range(_size32):
                        _elem37 = iprot.readString().decode('utf-8') if sys.version_info[0] == 2 else iprot.readString()
                        self.hostAliases.append(_elem37)
                    iprot.readListEnd()
                else:
                    iprot.skip(ftype)
            elif fid == 4:
                if ftype == TType.LIST:
                    self.ipAddresses = []
                    (_etype41, _size38) = iprot.readListBegin()
                    for _i42 in range(_size38):
                        _elem43 = iprot.readString().decode('utf-8') if sys.version_info[0] == 2 else iprot.readString()
                        self.ipAddresses.append(_elem43)
                    iprot.readListEnd()
                else:
                    iprot.skip(ftype)
            elif fid == 5:
                if ftype == TType.STRING:
                    self.resourceDescription = iprot.readString().decode('utf-8') if sys.version_info[0] == 2 else iprot.readString()
                else:
                    iprot.skip(ftype)
            elif fid == 6:
                if ftype == TType.BOOL:
                    self.enabled = iprot.readBool()
                else:
                    iprot.skip(ftype)
            elif fid == 7:
                if ftype == TType.LIST:
                    self.batchQueues = []
                    (_etype47, _size44) = iprot.readListBegin()
                    for _i48 in range(_size44):
                        _elem49 = BatchQueue()
                        _elem49.read(iprot)
                        self.batchQueues.append(_elem49)
                    iprot.readListEnd()
                else:
                    iprot.skip(ftype)
            elif fid == 8:
                if ftype == TType.MAP:
                    self.fileSystems = {}
                    (_ktype51, _vtype52, _size50) = iprot.readMapBegin()
                    for _i54 in range(_size50):
                        _key55 = iprot.readI32()
                        _val56 = iprot.readString().decode('utf-8') if sys.version_info[0] == 2 else iprot.readString()
                        self.fileSystems[_key55] = _val56
                    iprot.readMapEnd()
                else:
                    iprot.skip(ftype)
            elif fid == 9:
                if ftype == TType.LIST:
                    self.jobSubmissionInterfaces = []
                    (_etype60, _size57) = iprot.readListBegin()
                    for _i61 in range(_size57):
                        _elem62 = JobSubmissionInterface()
                        _elem62.read(iprot)
                        self.jobSubmissionInterfaces.append(_elem62)
                    iprot.readListEnd()
                else:
                    iprot.skip(ftype)
            elif fid == 10:
                if ftype == TType.LIST:
                    self.dataMovementInterfaces = []
                    (_etype66, _size63) = iprot.readListBegin()
                    for _i67 in range(_size63):
                        _elem68 = apache.airavata.model.data.movement.ttypes.DataMovementInterface()
                        _elem68.read(iprot)
                        self.dataMovementInterfaces.append(_elem68)
                    iprot.readListEnd()
                else:
                    iprot.skip(ftype)
            elif fid == 11:
                if ftype == TType.I32:
                    self.maxMemoryPerNode = iprot.readI32()
                else:
                    iprot.skip(ftype)
            elif fid == 12:
                if ftype == TType.BOOL:
                    self.gatewayUsageReporting = iprot.readBool()
                else:
                    iprot.skip(ftype)
            elif fid == 13:
                if ftype == TType.STRING:
                    self.gatewayUsageModuleLoadCommand = iprot.readString().decode('utf-8') if sys.version_info[0] == 2 else iprot.readString()
                else:
                    iprot.skip(ftype)
            elif fid == 14:
                if ftype == TType.STRING:
                    self.gatewayUsageExecutable = iprot.readString().decode('utf-8') if sys.version_info[0] == 2 else iprot.readString()
                else:
                    iprot.skip(ftype)
            else:
                iprot.skip(ftype)
            iprot.readFieldEnd()
        iprot.readStructEnd()

    def write(self, oprot):
        if oprot._fast_encode is not None and self.thrift_spec is not None:
            oprot.trans.write(oprot._fast_encode(self, (self.__class__, self.thrift_spec)))
            return
        oprot.writeStructBegin('ComputeResourceDescription')
        if self.computeResourceId is not None:
            oprot.writeFieldBegin('computeResourceId', TType.STRING, 1)
            oprot.writeString(self.computeResourceId.encode('utf-8') if sys.version_info[0] == 2 else self.computeResourceId)
            oprot.writeFieldEnd()
        if self.hostName is not None:
            oprot.writeFieldBegin('hostName', TType.STRING, 2)
            oprot.writeString(self.hostName.encode('utf-8') if sys.version_info[0] == 2 else self.hostName)
            oprot.writeFieldEnd()
        if self.hostAliases is not None:
            oprot.writeFieldBegin('hostAliases', TType.LIST, 3)
            oprot.writeListBegin(TType.STRING, len(self.hostAliases))
            for iter69 in self.hostAliases:
                oprot.writeString(iter69.encode('utf-8') if sys.version_info[0] == 2 else iter69)
            oprot.writeListEnd()
            oprot.writeFieldEnd()
        if self.ipAddresses is not None:
            oprot.writeFieldBegin('ipAddresses', TType.LIST, 4)
            oprot.writeListBegin(TType.STRING, len(self.ipAddresses))
            for iter70 in self.ipAddresses:
                oprot.writeString(iter70.encode('utf-8') if sys.version_info[0] == 2 else iter70)
            oprot.writeListEnd()
            oprot.writeFieldEnd()
        if self.resourceDescription is not None:
            oprot.writeFieldBegin('resourceDescription', TType.STRING, 5)
            oprot.writeString(self.resourceDescription.encode('utf-8') if sys.version_info[0] == 2 else self.resourceDescription)
            oprot.writeFieldEnd()
        if self.enabled is not None:
            oprot.writeFieldBegin('enabled', TType.BOOL, 6)
            oprot.writeBool(self.enabled)
            oprot.writeFieldEnd()
        if self.batchQueues is not None:
            oprot.writeFieldBegin('batchQueues', TType.LIST, 7)
            oprot.writeListBegin(TType.STRUCT, len(self.batchQueues))
            for iter71 in self.batchQueues:
                iter71.write(oprot)
            oprot.writeListEnd()
            oprot.writeFieldEnd()
        if self.fileSystems is not None:
            oprot.writeFieldBegin('fileSystems', TType.MAP, 8)
            oprot.writeMapBegin(TType.I32, TType.STRING, len(self.fileSystems))
            for kiter72, viter73 in self.fileSystems.items():
                oprot.writeI32(kiter72)
                oprot.writeString(viter73.encode('utf-8') if sys.version_info[0] == 2 else viter73)
            oprot.writeMapEnd()
            oprot.writeFieldEnd()
        if self.jobSubmissionInterfaces is not None:
            oprot.writeFieldBegin('jobSubmissionInterfaces', TType.LIST, 9)
            oprot.writeListBegin(TType.STRUCT, len(self.jobSubmissionInterfaces))
            for iter74 in self.jobSubmissionInterfaces:
                iter74.write(oprot)
            oprot.writeListEnd()
            oprot.writeFieldEnd()
        if self.dataMovementInterfaces is not None:
            oprot.writeFieldBegin('dataMovementInterfaces', TType.LIST, 10)
            oprot.writeListBegin(TType.STRUCT, len(self.dataMovementInterfaces))
            for iter75 in self.dataMovementInterfaces:
                iter75.write(oprot)
            oprot.writeListEnd()
            oprot.writeFieldEnd()
        if self.maxMemoryPerNode is not None:
            oprot.writeFieldBegin('maxMemoryPerNode', TType.I32, 11)
            oprot.writeI32(self.maxMemoryPerNode)
            oprot.writeFieldEnd()
        if self.gatewayUsageReporting is not None:
            oprot.writeFieldBegin('gatewayUsageReporting', TType.BOOL, 12)
            oprot.writeBool(self.gatewayUsageReporting)
            oprot.writeFieldEnd()
        if self.gatewayUsageModuleLoadCommand is not None:
            oprot.writeFieldBegin('gatewayUsageModuleLoadCommand', TType.STRING, 13)
            oprot.writeString(self.gatewayUsageModuleLoadCommand.encode('utf-8') if sys.version_info[0] == 2 else self.gatewayUsageModuleLoadCommand)
            oprot.writeFieldEnd()
        if self.gatewayUsageExecutable is not None:
            oprot.writeFieldBegin('gatewayUsageExecutable', TType.STRING, 14)
            oprot.writeString(self.gatewayUsageExecutable.encode('utf-8') if sys.version_info[0] == 2 else self.gatewayUsageExecutable)
            oprot.writeFieldEnd()
        oprot.writeFieldStop()
        oprot.writeStructEnd()

    def validate(self):
        if self.computeResourceId is None:
            raise TProtocolException(message='Required field computeResourceId is unset!')
        if self.hostName is None:
            raise TProtocolException(message='Required field hostName is unset!')
        return

    def __repr__(self):
        L = ['%s=%r' % (key, value)
             for key, value in self.__dict__.items()]
        return '%s(%s)' % (self.__class__.__name__, ', '.join(L))

    def __eq__(self, other):
        return isinstance(other, self.__class__) and self.__dict__ == other.__dict__

    def __ne__(self, other):
        return not (self == other)
