#
# Autogenerated by Thrift Compiler (0.18.1)
#
# 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
from thrift.TRecursive import fix_spec

import sys
import airavata.model.commons.ttypes
import airavata.model.appcatalog.computeresource.ttypes
import airavata.model.data.movement.ttypes

from thrift.transport import TTransport
all_structs = []


class GroupAccountSSHProvisionerConfig(object):
    """
    Attributes:
     - resourceId
     - groupResourceProfileId
     - configName
     - configValue

    """


    def __init__(self, resourceId=None, groupResourceProfileId="DO_NOT_SET_AT_CLIENTS", configName=None, configValue=None,):
        self.resourceId = resourceId
        self.groupResourceProfileId = groupResourceProfileId
        self.configName = configName
        self.configValue = configValue

    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.resourceId = iprot.readString().decode('utf-8', errors='replace') if sys.version_info[0] == 2 else iprot.readString()
                else:
                    iprot.skip(ftype)
            elif fid == 2:
                if ftype == TType.STRING:
                    self.groupResourceProfileId = iprot.readString().decode('utf-8', errors='replace') if sys.version_info[0] == 2 else iprot.readString()
                else:
                    iprot.skip(ftype)
            elif fid == 3:
                if ftype == TType.STRING:
                    self.configName = iprot.readString().decode('utf-8', errors='replace') if sys.version_info[0] == 2 else iprot.readString()
                else:
                    iprot.skip(ftype)
            elif fid == 4:
                if ftype == TType.STRING:
                    self.configValue = iprot.readString().decode('utf-8', errors='replace') 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('GroupAccountSSHProvisionerConfig')
        if self.resourceId is not None:
            oprot.writeFieldBegin('resourceId', TType.STRING, 1)
            oprot.writeString(self.resourceId.encode('utf-8') if sys.version_info[0] == 2 else self.resourceId)
            oprot.writeFieldEnd()
        if self.groupResourceProfileId is not None:
            oprot.writeFieldBegin('groupResourceProfileId', TType.STRING, 2)
            oprot.writeString(self.groupResourceProfileId.encode('utf-8') if sys.version_info[0] == 2 else self.groupResourceProfileId)
            oprot.writeFieldEnd()
        if self.configName is not None:
            oprot.writeFieldBegin('configName', TType.STRING, 3)
            oprot.writeString(self.configName.encode('utf-8') if sys.version_info[0] == 2 else self.configName)
            oprot.writeFieldEnd()
        if self.configValue is not None:
            oprot.writeFieldBegin('configValue', TType.STRING, 4)
            oprot.writeString(self.configValue.encode('utf-8') if sys.version_info[0] == 2 else self.configValue)
            oprot.writeFieldEnd()
        oprot.writeFieldStop()
        oprot.writeStructEnd()

    def validate(self):
        if self.resourceId is None:
            raise TProtocolException(message='Required field resourceId is unset!')
        if self.groupResourceProfileId is None:
            raise TProtocolException(message='Required field groupResourceProfileId is unset!')
        if self.configName is None:
            raise TProtocolException(message='Required field configName 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 ComputeResourceReservation(object):
    """
    Attributes:
     - reservationId
     - reservationName
     - queueNames
     - startTime
     - endTime

    """


    def __init__(self, reservationId="DO_NOT_SET_AT_CLIENTS", reservationName=None, queueNames=None, startTime=None, endTime=None,):
        self.reservationId = reservationId
        self.reservationName = reservationName
        self.queueNames = queueNames
        self.startTime = startTime
        self.endTime = endTime

    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.reservationId = iprot.readString().decode('utf-8', errors='replace') if sys.version_info[0] == 2 else iprot.readString()
                else:
                    iprot.skip(ftype)
            elif fid == 2:
                if ftype == TType.STRING:
                    self.reservationName = iprot.readString().decode('utf-8', errors='replace') if sys.version_info[0] == 2 else iprot.readString()
                else:
                    iprot.skip(ftype)
            elif fid == 3:
                if ftype == TType.LIST:
                    self.queueNames = []
                    (_etype3, _size0) = iprot.readListBegin()
                    for _i4 in range(_size0):
                        _elem5 = iprot.readString().decode('utf-8', errors='replace') if sys.version_info[0] == 2 else iprot.readString()
                        self.queueNames.append(_elem5)
                    iprot.readListEnd()
                else:
                    iprot.skip(ftype)
            elif fid == 4:
                if ftype == TType.I64:
                    self.startTime = iprot.readI64()
                else:
                    iprot.skip(ftype)
            elif fid == 5:
                if ftype == TType.I64:
                    self.endTime = iprot.readI64()
                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('ComputeResourceReservation')
        if self.reservationId is not None:
            oprot.writeFieldBegin('reservationId', TType.STRING, 1)
            oprot.writeString(self.reservationId.encode('utf-8') if sys.version_info[0] == 2 else self.reservationId)
            oprot.writeFieldEnd()
        if self.reservationName is not None:
            oprot.writeFieldBegin('reservationName', TType.STRING, 2)
            oprot.writeString(self.reservationName.encode('utf-8') if sys.version_info[0] == 2 else self.reservationName)
            oprot.writeFieldEnd()
        if self.queueNames is not None:
            oprot.writeFieldBegin('queueNames', TType.LIST, 3)
            oprot.writeListBegin(TType.STRING, len(self.queueNames))
            for iter6 in self.queueNames:
                oprot.writeString(iter6.encode('utf-8') if sys.version_info[0] == 2 else iter6)
            oprot.writeListEnd()
            oprot.writeFieldEnd()
        if self.startTime is not None:
            oprot.writeFieldBegin('startTime', TType.I64, 4)
            oprot.writeI64(self.startTime)
            oprot.writeFieldEnd()
        if self.endTime is not None:
            oprot.writeFieldBegin('endTime', TType.I64, 5)
            oprot.writeI64(self.endTime)
            oprot.writeFieldEnd()
        oprot.writeFieldStop()
        oprot.writeStructEnd()

    def validate(self):
        if self.reservationId is None:
            raise TProtocolException(message='Required field reservationId is unset!')
        if self.reservationName is None:
            raise TProtocolException(message='Required field reservationName is unset!')
        if self.queueNames is None:
            raise TProtocolException(message='Required field queueNames is unset!')
        if self.startTime is None:
            raise TProtocolException(message='Required field startTime is unset!')
        if self.endTime is None:
            raise TProtocolException(message='Required field endTime 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 GroupComputeResourcePreference(object):
    """
    Attributes:
     - computeResourceId
     - groupResourceProfileId
     - overridebyAiravata
     - loginUserName
     - preferredJobSubmissionProtocol
     - preferredDataMovementProtocol
     - preferredBatchQueue
     - scratchLocation
     - allocationProjectNumber
     - resourceSpecificCredentialStoreToken
     - usageReportingGatewayId
     - qualityOfService
     - sshAccountProvisioner
     - groupSSHAccountProvisionerConfigs
     - sshAccountProvisionerAdditionalInfo
     - reservations

    """


    def __init__(self, computeResourceId=None, groupResourceProfileId="DO_NOT_SET_AT_CLIENTS", overridebyAiravata=True, loginUserName=None, preferredJobSubmissionProtocol=None, preferredDataMovementProtocol=None, preferredBatchQueue=None, scratchLocation=None, allocationProjectNumber=None, resourceSpecificCredentialStoreToken=None, usageReportingGatewayId=None, qualityOfService=None, sshAccountProvisioner=None, groupSSHAccountProvisionerConfigs=None, sshAccountProvisionerAdditionalInfo=None, reservations=None,):
        self.computeResourceId = computeResourceId
        self.groupResourceProfileId = groupResourceProfileId
        self.overridebyAiravata = overridebyAiravata
        self.loginUserName = loginUserName
        self.preferredJobSubmissionProtocol = preferredJobSubmissionProtocol
        self.preferredDataMovementProtocol = preferredDataMovementProtocol
        self.preferredBatchQueue = preferredBatchQueue
        self.scratchLocation = scratchLocation
        self.allocationProjectNumber = allocationProjectNumber
        self.resourceSpecificCredentialStoreToken = resourceSpecificCredentialStoreToken
        self.usageReportingGatewayId = usageReportingGatewayId
        self.qualityOfService = qualityOfService
        self.sshAccountProvisioner = sshAccountProvisioner
        self.groupSSHAccountProvisionerConfigs = groupSSHAccountProvisionerConfigs
        self.sshAccountProvisionerAdditionalInfo = sshAccountProvisionerAdditionalInfo
        self.reservations = reservations

    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', errors='replace') if sys.version_info[0] == 2 else iprot.readString()
                else:
                    iprot.skip(ftype)
            elif fid == 2:
                if ftype == TType.STRING:
                    self.groupResourceProfileId = iprot.readString().decode('utf-8', errors='replace') if sys.version_info[0] == 2 else iprot.readString()
                else:
                    iprot.skip(ftype)
            elif fid == 3:
                if ftype == TType.BOOL:
                    self.overridebyAiravata = iprot.readBool()
                else:
                    iprot.skip(ftype)
            elif fid == 4:
                if ftype == TType.STRING:
                    self.loginUserName = iprot.readString().decode('utf-8', errors='replace') if sys.version_info[0] == 2 else iprot.readString()
                else:
                    iprot.skip(ftype)
            elif fid == 5:
                if ftype == TType.I32:
                    self.preferredJobSubmissionProtocol = iprot.readI32()
                else:
                    iprot.skip(ftype)
            elif fid == 6:
                if ftype == TType.I32:
                    self.preferredDataMovementProtocol = iprot.readI32()
                else:
                    iprot.skip(ftype)
            elif fid == 7:
                if ftype == TType.STRING:
                    self.preferredBatchQueue = iprot.readString().decode('utf-8', errors='replace') if sys.version_info[0] == 2 else iprot.readString()
                else:
                    iprot.skip(ftype)
            elif fid == 8:
                if ftype == TType.STRING:
                    self.scratchLocation = iprot.readString().decode('utf-8', errors='replace') if sys.version_info[0] == 2 else iprot.readString()
                else:
                    iprot.skip(ftype)
            elif fid == 9:
                if ftype == TType.STRING:
                    self.allocationProjectNumber = iprot.readString().decode('utf-8', errors='replace') if sys.version_info[0] == 2 else iprot.readString()
                else:
                    iprot.skip(ftype)
            elif fid == 10:
                if ftype == TType.STRING:
                    self.resourceSpecificCredentialStoreToken = iprot.readString().decode('utf-8', errors='replace') if sys.version_info[0] == 2 else iprot.readString()
                else:
                    iprot.skip(ftype)
            elif fid == 11:
                if ftype == TType.STRING:
                    self.usageReportingGatewayId = iprot.readString().decode('utf-8', errors='replace') if sys.version_info[0] == 2 else iprot.readString()
                else:
                    iprot.skip(ftype)
            elif fid == 12:
                if ftype == TType.STRING:
                    self.qualityOfService = iprot.readString().decode('utf-8', errors='replace') if sys.version_info[0] == 2 else iprot.readString()
                else:
                    iprot.skip(ftype)
            elif fid == 16:
                if ftype == TType.STRING:
                    self.sshAccountProvisioner = iprot.readString().decode('utf-8', errors='replace') if sys.version_info[0] == 2 else iprot.readString()
                else:
                    iprot.skip(ftype)
            elif fid == 17:
                if ftype == TType.LIST:
                    self.groupSSHAccountProvisionerConfigs = []
                    (_etype10, _size7) = iprot.readListBegin()
                    for _i11 in range(_size7):
                        _elem12 = GroupAccountSSHProvisionerConfig()
                        _elem12.read(iprot)
                        self.groupSSHAccountProvisionerConfigs.append(_elem12)
                    iprot.readListEnd()
                else:
                    iprot.skip(ftype)
            elif fid == 18:
                if ftype == TType.STRING:
                    self.sshAccountProvisionerAdditionalInfo = iprot.readString().decode('utf-8', errors='replace') if sys.version_info[0] == 2 else iprot.readString()
                else:
                    iprot.skip(ftype)
            elif fid == 19:
                if ftype == TType.LIST:
                    self.reservations = []
                    (_etype16, _size13) = iprot.readListBegin()
                    for _i17 in range(_size13):
                        _elem18 = ComputeResourceReservation()
                        _elem18.read(iprot)
                        self.reservations.append(_elem18)
                    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('GroupComputeResourcePreference')
        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.groupResourceProfileId is not None:
            oprot.writeFieldBegin('groupResourceProfileId', TType.STRING, 2)
            oprot.writeString(self.groupResourceProfileId.encode('utf-8') if sys.version_info[0] == 2 else self.groupResourceProfileId)
            oprot.writeFieldEnd()
        if self.overridebyAiravata is not None:
            oprot.writeFieldBegin('overridebyAiravata', TType.BOOL, 3)
            oprot.writeBool(self.overridebyAiravata)
            oprot.writeFieldEnd()
        if self.loginUserName is not None:
            oprot.writeFieldBegin('loginUserName', TType.STRING, 4)
            oprot.writeString(self.loginUserName.encode('utf-8') if sys.version_info[0] == 2 else self.loginUserName)
            oprot.writeFieldEnd()
        if self.preferredJobSubmissionProtocol is not None:
            oprot.writeFieldBegin('preferredJobSubmissionProtocol', TType.I32, 5)
            oprot.writeI32(self.preferredJobSubmissionProtocol)
            oprot.writeFieldEnd()
        if self.preferredDataMovementProtocol is not None:
            oprot.writeFieldBegin('preferredDataMovementProtocol', TType.I32, 6)
            oprot.writeI32(self.preferredDataMovementProtocol)
            oprot.writeFieldEnd()
        if self.preferredBatchQueue is not None:
            oprot.writeFieldBegin('preferredBatchQueue', TType.STRING, 7)
            oprot.writeString(self.preferredBatchQueue.encode('utf-8') if sys.version_info[0] == 2 else self.preferredBatchQueue)
            oprot.writeFieldEnd()
        if self.scratchLocation is not None:
            oprot.writeFieldBegin('scratchLocation', TType.STRING, 8)
            oprot.writeString(self.scratchLocation.encode('utf-8') if sys.version_info[0] == 2 else self.scratchLocation)
            oprot.writeFieldEnd()
        if self.allocationProjectNumber is not None:
            oprot.writeFieldBegin('allocationProjectNumber', TType.STRING, 9)
            oprot.writeString(self.allocationProjectNumber.encode('utf-8') if sys.version_info[0] == 2 else self.allocationProjectNumber)
            oprot.writeFieldEnd()
        if self.resourceSpecificCredentialStoreToken is not None:
            oprot.writeFieldBegin('resourceSpecificCredentialStoreToken', TType.STRING, 10)
            oprot.writeString(self.resourceSpecificCredentialStoreToken.encode('utf-8') if sys.version_info[0] == 2 else self.resourceSpecificCredentialStoreToken)
            oprot.writeFieldEnd()
        if self.usageReportingGatewayId is not None:
            oprot.writeFieldBegin('usageReportingGatewayId', TType.STRING, 11)
            oprot.writeString(self.usageReportingGatewayId.encode('utf-8') if sys.version_info[0] == 2 else self.usageReportingGatewayId)
            oprot.writeFieldEnd()
        if self.qualityOfService is not None:
            oprot.writeFieldBegin('qualityOfService', TType.STRING, 12)
            oprot.writeString(self.qualityOfService.encode('utf-8') if sys.version_info[0] == 2 else self.qualityOfService)
            oprot.writeFieldEnd()
        if self.sshAccountProvisioner is not None:
            oprot.writeFieldBegin('sshAccountProvisioner', TType.STRING, 16)
            oprot.writeString(self.sshAccountProvisioner.encode('utf-8') if sys.version_info[0] == 2 else self.sshAccountProvisioner)
            oprot.writeFieldEnd()
        if self.groupSSHAccountProvisionerConfigs is not None:
            oprot.writeFieldBegin('groupSSHAccountProvisionerConfigs', TType.LIST, 17)
            oprot.writeListBegin(TType.STRUCT, len(self.groupSSHAccountProvisionerConfigs))
            for iter19 in self.groupSSHAccountProvisionerConfigs:
                iter19.write(oprot)
            oprot.writeListEnd()
            oprot.writeFieldEnd()
        if self.sshAccountProvisionerAdditionalInfo is not None:
            oprot.writeFieldBegin('sshAccountProvisionerAdditionalInfo', TType.STRING, 18)
            oprot.writeString(self.sshAccountProvisionerAdditionalInfo.encode('utf-8') if sys.version_info[0] == 2 else self.sshAccountProvisionerAdditionalInfo)
            oprot.writeFieldEnd()
        if self.reservations is not None:
            oprot.writeFieldBegin('reservations', TType.LIST, 19)
            oprot.writeListBegin(TType.STRUCT, len(self.reservations))
            for iter20 in self.reservations:
                iter20.write(oprot)
            oprot.writeListEnd()
            oprot.writeFieldEnd()
        oprot.writeFieldStop()
        oprot.writeStructEnd()

    def validate(self):
        if self.computeResourceId is None:
            raise TProtocolException(message='Required field computeResourceId is unset!')
        if self.groupResourceProfileId is None:
            raise TProtocolException(message='Required field groupResourceProfileId is unset!')
        if self.overridebyAiravata is None:
            raise TProtocolException(message='Required field overridebyAiravata 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 ComputeResourcePolicy(object):
    """
    Attributes:
     - resourcePolicyId
     - computeResourceId
     - groupResourceProfileId
     - allowedBatchQueues

    """


    def __init__(self, resourcePolicyId="DO_NOT_SET_AT_CLIENTS", computeResourceId=None, groupResourceProfileId="DO_NOT_SET_AT_CLIENTS", allowedBatchQueues=None,):
        self.resourcePolicyId = resourcePolicyId
        self.computeResourceId = computeResourceId
        self.groupResourceProfileId = groupResourceProfileId
        self.allowedBatchQueues = allowedBatchQueues

    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.resourcePolicyId = iprot.readString().decode('utf-8', errors='replace') if sys.version_info[0] == 2 else iprot.readString()
                else:
                    iprot.skip(ftype)
            elif fid == 2:
                if ftype == TType.STRING:
                    self.computeResourceId = iprot.readString().decode('utf-8', errors='replace') if sys.version_info[0] == 2 else iprot.readString()
                else:
                    iprot.skip(ftype)
            elif fid == 3:
                if ftype == TType.STRING:
                    self.groupResourceProfileId = iprot.readString().decode('utf-8', errors='replace') if sys.version_info[0] == 2 else iprot.readString()
                else:
                    iprot.skip(ftype)
            elif fid == 4:
                if ftype == TType.LIST:
                    self.allowedBatchQueues = []
                    (_etype24, _size21) = iprot.readListBegin()
                    for _i25 in range(_size21):
                        _elem26 = iprot.readString().decode('utf-8', errors='replace') if sys.version_info[0] == 2 else iprot.readString()
                        self.allowedBatchQueues.append(_elem26)
                    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('ComputeResourcePolicy')
        if self.resourcePolicyId is not None:
            oprot.writeFieldBegin('resourcePolicyId', TType.STRING, 1)
            oprot.writeString(self.resourcePolicyId.encode('utf-8') if sys.version_info[0] == 2 else self.resourcePolicyId)
            oprot.writeFieldEnd()
        if self.computeResourceId is not None:
            oprot.writeFieldBegin('computeResourceId', TType.STRING, 2)
            oprot.writeString(self.computeResourceId.encode('utf-8') if sys.version_info[0] == 2 else self.computeResourceId)
            oprot.writeFieldEnd()
        if self.groupResourceProfileId is not None:
            oprot.writeFieldBegin('groupResourceProfileId', TType.STRING, 3)
            oprot.writeString(self.groupResourceProfileId.encode('utf-8') if sys.version_info[0] == 2 else self.groupResourceProfileId)
            oprot.writeFieldEnd()
        if self.allowedBatchQueues is not None:
            oprot.writeFieldBegin('allowedBatchQueues', TType.LIST, 4)
            oprot.writeListBegin(TType.STRING, len(self.allowedBatchQueues))
            for iter27 in self.allowedBatchQueues:
                oprot.writeString(iter27.encode('utf-8') if sys.version_info[0] == 2 else iter27)
            oprot.writeListEnd()
            oprot.writeFieldEnd()
        oprot.writeFieldStop()
        oprot.writeStructEnd()

    def validate(self):
        if self.resourcePolicyId is None:
            raise TProtocolException(message='Required field resourcePolicyId is unset!')
        if self.computeResourceId is None:
            raise TProtocolException(message='Required field computeResourceId is unset!')
        if self.groupResourceProfileId is None:
            raise TProtocolException(message='Required field groupResourceProfileId 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 BatchQueueResourcePolicy(object):
    """
    Attributes:
     - resourcePolicyId
     - computeResourceId
     - groupResourceProfileId
     - queuename
     - maxAllowedNodes
     - maxAllowedCores
     - maxAllowedWalltime

    """


    def __init__(self, resourcePolicyId="DO_NOT_SET_AT_CLIENTS", computeResourceId=None, groupResourceProfileId="DO_NOT_SET_AT_CLIENTS", queuename=None, maxAllowedNodes=None, maxAllowedCores=None, maxAllowedWalltime=None,):
        self.resourcePolicyId = resourcePolicyId
        self.computeResourceId = computeResourceId
        self.groupResourceProfileId = groupResourceProfileId
        self.queuename = queuename
        self.maxAllowedNodes = maxAllowedNodes
        self.maxAllowedCores = maxAllowedCores
        self.maxAllowedWalltime = maxAllowedWalltime

    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.resourcePolicyId = iprot.readString().decode('utf-8', errors='replace') if sys.version_info[0] == 2 else iprot.readString()
                else:
                    iprot.skip(ftype)
            elif fid == 2:
                if ftype == TType.STRING:
                    self.computeResourceId = iprot.readString().decode('utf-8', errors='replace') if sys.version_info[0] == 2 else iprot.readString()
                else:
                    iprot.skip(ftype)
            elif fid == 3:
                if ftype == TType.STRING:
                    self.groupResourceProfileId = iprot.readString().decode('utf-8', errors='replace') if sys.version_info[0] == 2 else iprot.readString()
                else:
                    iprot.skip(ftype)
            elif fid == 4:
                if ftype == TType.STRING:
                    self.queuename = iprot.readString().decode('utf-8', errors='replace') if sys.version_info[0] == 2 else iprot.readString()
                else:
                    iprot.skip(ftype)
            elif fid == 5:
                if ftype == TType.I32:
                    self.maxAllowedNodes = iprot.readI32()
                else:
                    iprot.skip(ftype)
            elif fid == 6:
                if ftype == TType.I32:
                    self.maxAllowedCores = iprot.readI32()
                else:
                    iprot.skip(ftype)
            elif fid == 7:
                if ftype == TType.I32:
                    self.maxAllowedWalltime = 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('BatchQueueResourcePolicy')
        if self.resourcePolicyId is not None:
            oprot.writeFieldBegin('resourcePolicyId', TType.STRING, 1)
            oprot.writeString(self.resourcePolicyId.encode('utf-8') if sys.version_info[0] == 2 else self.resourcePolicyId)
            oprot.writeFieldEnd()
        if self.computeResourceId is not None:
            oprot.writeFieldBegin('computeResourceId', TType.STRING, 2)
            oprot.writeString(self.computeResourceId.encode('utf-8') if sys.version_info[0] == 2 else self.computeResourceId)
            oprot.writeFieldEnd()
        if self.groupResourceProfileId is not None:
            oprot.writeFieldBegin('groupResourceProfileId', TType.STRING, 3)
            oprot.writeString(self.groupResourceProfileId.encode('utf-8') if sys.version_info[0] == 2 else self.groupResourceProfileId)
            oprot.writeFieldEnd()
        if self.queuename is not None:
            oprot.writeFieldBegin('queuename', TType.STRING, 4)
            oprot.writeString(self.queuename.encode('utf-8') if sys.version_info[0] == 2 else self.queuename)
            oprot.writeFieldEnd()
        if self.maxAllowedNodes is not None:
            oprot.writeFieldBegin('maxAllowedNodes', TType.I32, 5)
            oprot.writeI32(self.maxAllowedNodes)
            oprot.writeFieldEnd()
        if self.maxAllowedCores is not None:
            oprot.writeFieldBegin('maxAllowedCores', TType.I32, 6)
            oprot.writeI32(self.maxAllowedCores)
            oprot.writeFieldEnd()
        if self.maxAllowedWalltime is not None:
            oprot.writeFieldBegin('maxAllowedWalltime', TType.I32, 7)
            oprot.writeI32(self.maxAllowedWalltime)
            oprot.writeFieldEnd()
        oprot.writeFieldStop()
        oprot.writeStructEnd()

    def validate(self):
        if self.resourcePolicyId is None:
            raise TProtocolException(message='Required field resourcePolicyId is unset!')
        if self.computeResourceId is None:
            raise TProtocolException(message='Required field computeResourceId is unset!')
        if self.groupResourceProfileId is None:
            raise TProtocolException(message='Required field groupResourceProfileId 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 GroupResourceProfile(object):
    """
    Group Resource Profile

    gatewayID:
     Unique identifier for the gateway assigned by Airavata. Corelate this to Airavata Admin API Gateway Registration.

    groupResourceProfileId:

    computeResourcePreferences:
     List of resource preferences for each of the registered compute resources.

    computeResourcePolicies:
     List of enforced policies for each of the registered compute resources.

    batchQueueResourcePolicies:
     List of enforced policies on registered batch queues

    defaultCredentialStoreToken:
     The default credential store token to use for compute resources that don't specify a resource specific credential store token.


    Attributes:
     - gatewayId
     - groupResourceProfileId
     - groupResourceProfileName
     - computePreferences
     - computeResourcePolicies
     - batchQueueResourcePolicies
     - creationTime
     - updatedTime
     - defaultCredentialStoreToken

    """


    def __init__(self, gatewayId=None, groupResourceProfileId="DO_NOT_SET_AT_CLIENTS", groupResourceProfileName=None, computePreferences=None, computeResourcePolicies=None, batchQueueResourcePolicies=None, creationTime=None, updatedTime=None, defaultCredentialStoreToken=None,):
        self.gatewayId = gatewayId
        self.groupResourceProfileId = groupResourceProfileId
        self.groupResourceProfileName = groupResourceProfileName
        self.computePreferences = computePreferences
        self.computeResourcePolicies = computeResourcePolicies
        self.batchQueueResourcePolicies = batchQueueResourcePolicies
        self.creationTime = creationTime
        self.updatedTime = updatedTime
        self.defaultCredentialStoreToken = defaultCredentialStoreToken

    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.gatewayId = iprot.readString().decode('utf-8', errors='replace') if sys.version_info[0] == 2 else iprot.readString()
                else:
                    iprot.skip(ftype)
            elif fid == 2:
                if ftype == TType.STRING:
                    self.groupResourceProfileId = iprot.readString().decode('utf-8', errors='replace') if sys.version_info[0] == 2 else iprot.readString()
                else:
                    iprot.skip(ftype)
            elif fid == 3:
                if ftype == TType.STRING:
                    self.groupResourceProfileName = iprot.readString().decode('utf-8', errors='replace') if sys.version_info[0] == 2 else iprot.readString()
                else:
                    iprot.skip(ftype)
            elif fid == 4:
                if ftype == TType.LIST:
                    self.computePreferences = []
                    (_etype31, _size28) = iprot.readListBegin()
                    for _i32 in range(_size28):
                        _elem33 = GroupComputeResourcePreference()
                        _elem33.read(iprot)
                        self.computePreferences.append(_elem33)
                    iprot.readListEnd()
                else:
                    iprot.skip(ftype)
            elif fid == 5:
                if ftype == TType.LIST:
                    self.computeResourcePolicies = []
                    (_etype37, _size34) = iprot.readListBegin()
                    for _i38 in range(_size34):
                        _elem39 = ComputeResourcePolicy()
                        _elem39.read(iprot)
                        self.computeResourcePolicies.append(_elem39)
                    iprot.readListEnd()
                else:
                    iprot.skip(ftype)
            elif fid == 6:
                if ftype == TType.LIST:
                    self.batchQueueResourcePolicies = []
                    (_etype43, _size40) = iprot.readListBegin()
                    for _i44 in range(_size40):
                        _elem45 = BatchQueueResourcePolicy()
                        _elem45.read(iprot)
                        self.batchQueueResourcePolicies.append(_elem45)
                    iprot.readListEnd()
                else:
                    iprot.skip(ftype)
            elif fid == 7:
                if ftype == TType.I64:
                    self.creationTime = iprot.readI64()
                else:
                    iprot.skip(ftype)
            elif fid == 8:
                if ftype == TType.I64:
                    self.updatedTime = iprot.readI64()
                else:
                    iprot.skip(ftype)
            elif fid == 9:
                if ftype == TType.STRING:
                    self.defaultCredentialStoreToken = iprot.readString().decode('utf-8', errors='replace') 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('GroupResourceProfile')
        if self.gatewayId is not None:
            oprot.writeFieldBegin('gatewayId', TType.STRING, 1)
            oprot.writeString(self.gatewayId.encode('utf-8') if sys.version_info[0] == 2 else self.gatewayId)
            oprot.writeFieldEnd()
        if self.groupResourceProfileId is not None:
            oprot.writeFieldBegin('groupResourceProfileId', TType.STRING, 2)
            oprot.writeString(self.groupResourceProfileId.encode('utf-8') if sys.version_info[0] == 2 else self.groupResourceProfileId)
            oprot.writeFieldEnd()
        if self.groupResourceProfileName is not None:
            oprot.writeFieldBegin('groupResourceProfileName', TType.STRING, 3)
            oprot.writeString(self.groupResourceProfileName.encode('utf-8') if sys.version_info[0] == 2 else self.groupResourceProfileName)
            oprot.writeFieldEnd()
        if self.computePreferences is not None:
            oprot.writeFieldBegin('computePreferences', TType.LIST, 4)
            oprot.writeListBegin(TType.STRUCT, len(self.computePreferences))
            for iter46 in self.computePreferences:
                iter46.write(oprot)
            oprot.writeListEnd()
            oprot.writeFieldEnd()
        if self.computeResourcePolicies is not None:
            oprot.writeFieldBegin('computeResourcePolicies', TType.LIST, 5)
            oprot.writeListBegin(TType.STRUCT, len(self.computeResourcePolicies))
            for iter47 in self.computeResourcePolicies:
                iter47.write(oprot)
            oprot.writeListEnd()
            oprot.writeFieldEnd()
        if self.batchQueueResourcePolicies is not None:
            oprot.writeFieldBegin('batchQueueResourcePolicies', TType.LIST, 6)
            oprot.writeListBegin(TType.STRUCT, len(self.batchQueueResourcePolicies))
            for iter48 in self.batchQueueResourcePolicies:
                iter48.write(oprot)
            oprot.writeListEnd()
            oprot.writeFieldEnd()
        if self.creationTime is not None:
            oprot.writeFieldBegin('creationTime', TType.I64, 7)
            oprot.writeI64(self.creationTime)
            oprot.writeFieldEnd()
        if self.updatedTime is not None:
            oprot.writeFieldBegin('updatedTime', TType.I64, 8)
            oprot.writeI64(self.updatedTime)
            oprot.writeFieldEnd()
        if self.defaultCredentialStoreToken is not None:
            oprot.writeFieldBegin('defaultCredentialStoreToken', TType.STRING, 9)
            oprot.writeString(self.defaultCredentialStoreToken.encode('utf-8') if sys.version_info[0] == 2 else self.defaultCredentialStoreToken)
            oprot.writeFieldEnd()
        oprot.writeFieldStop()
        oprot.writeStructEnd()

    def validate(self):
        if self.gatewayId is None:
            raise TProtocolException(message='Required field gatewayId is unset!')
        if self.groupResourceProfileId is None:
            raise TProtocolException(message='Required field groupResourceProfileId 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)
all_structs.append(GroupAccountSSHProvisionerConfig)
GroupAccountSSHProvisionerConfig.thrift_spec = (
    None,  # 0
    (1, TType.STRING, 'resourceId', 'UTF8', None, ),  # 1
    (2, TType.STRING, 'groupResourceProfileId', 'UTF8', "DO_NOT_SET_AT_CLIENTS", ),  # 2
    (3, TType.STRING, 'configName', 'UTF8', None, ),  # 3
    (4, TType.STRING, 'configValue', 'UTF8', None, ),  # 4
)
all_structs.append(ComputeResourceReservation)
ComputeResourceReservation.thrift_spec = (
    None,  # 0
    (1, TType.STRING, 'reservationId', 'UTF8', "DO_NOT_SET_AT_CLIENTS", ),  # 1
    (2, TType.STRING, 'reservationName', 'UTF8', None, ),  # 2
    (3, TType.LIST, 'queueNames', (TType.STRING, 'UTF8', False), None, ),  # 3
    (4, TType.I64, 'startTime', None, None, ),  # 4
    (5, TType.I64, 'endTime', None, None, ),  # 5
)
all_structs.append(GroupComputeResourcePreference)
GroupComputeResourcePreference.thrift_spec = (
    None,  # 0
    (1, TType.STRING, 'computeResourceId', 'UTF8', None, ),  # 1
    (2, TType.STRING, 'groupResourceProfileId', 'UTF8', "DO_NOT_SET_AT_CLIENTS", ),  # 2
    (3, TType.BOOL, 'overridebyAiravata', None, True, ),  # 3
    (4, TType.STRING, 'loginUserName', 'UTF8', None, ),  # 4
    (5, TType.I32, 'preferredJobSubmissionProtocol', None, None, ),  # 5
    (6, TType.I32, 'preferredDataMovementProtocol', None, None, ),  # 6
    (7, TType.STRING, 'preferredBatchQueue', 'UTF8', None, ),  # 7
    (8, TType.STRING, 'scratchLocation', 'UTF8', None, ),  # 8
    (9, TType.STRING, 'allocationProjectNumber', 'UTF8', None, ),  # 9
    (10, TType.STRING, 'resourceSpecificCredentialStoreToken', 'UTF8', None, ),  # 10
    (11, TType.STRING, 'usageReportingGatewayId', 'UTF8', None, ),  # 11
    (12, TType.STRING, 'qualityOfService', 'UTF8', None, ),  # 12
    None,  # 13
    None,  # 14
    None,  # 15
    (16, TType.STRING, 'sshAccountProvisioner', 'UTF8', None, ),  # 16
    (17, TType.LIST, 'groupSSHAccountProvisionerConfigs', (TType.STRUCT, [GroupAccountSSHProvisionerConfig, None], False), None, ),  # 17
    (18, TType.STRING, 'sshAccountProvisionerAdditionalInfo', 'UTF8', None, ),  # 18
    (19, TType.LIST, 'reservations', (TType.STRUCT, [ComputeResourceReservation, None], False), None, ),  # 19
)
all_structs.append(ComputeResourcePolicy)
ComputeResourcePolicy.thrift_spec = (
    None,  # 0
    (1, TType.STRING, 'resourcePolicyId', 'UTF8', "DO_NOT_SET_AT_CLIENTS", ),  # 1
    (2, TType.STRING, 'computeResourceId', 'UTF8', None, ),  # 2
    (3, TType.STRING, 'groupResourceProfileId', 'UTF8', "DO_NOT_SET_AT_CLIENTS", ),  # 3
    (4, TType.LIST, 'allowedBatchQueues', (TType.STRING, 'UTF8', False), None, ),  # 4
)
all_structs.append(BatchQueueResourcePolicy)
BatchQueueResourcePolicy.thrift_spec = (
    None,  # 0
    (1, TType.STRING, 'resourcePolicyId', 'UTF8', "DO_NOT_SET_AT_CLIENTS", ),  # 1
    (2, TType.STRING, 'computeResourceId', 'UTF8', None, ),  # 2
    (3, TType.STRING, 'groupResourceProfileId', 'UTF8', "DO_NOT_SET_AT_CLIENTS", ),  # 3
    (4, TType.STRING, 'queuename', 'UTF8', None, ),  # 4
    (5, TType.I32, 'maxAllowedNodes', None, None, ),  # 5
    (6, TType.I32, 'maxAllowedCores', None, None, ),  # 6
    (7, TType.I32, 'maxAllowedWalltime', None, None, ),  # 7
)
all_structs.append(GroupResourceProfile)
GroupResourceProfile.thrift_spec = (
    None,  # 0
    (1, TType.STRING, 'gatewayId', 'UTF8', None, ),  # 1
    (2, TType.STRING, 'groupResourceProfileId', 'UTF8', "DO_NOT_SET_AT_CLIENTS", ),  # 2
    (3, TType.STRING, 'groupResourceProfileName', 'UTF8', None, ),  # 3
    (4, TType.LIST, 'computePreferences', (TType.STRUCT, [GroupComputeResourcePreference, None], False), None, ),  # 4
    (5, TType.LIST, 'computeResourcePolicies', (TType.STRUCT, [ComputeResourcePolicy, None], False), None, ),  # 5
    (6, TType.LIST, 'batchQueueResourcePolicies', (TType.STRUCT, [BatchQueueResourcePolicy, None], False), None, ),  # 6
    (7, TType.I64, 'creationTime', None, None, ),  # 7
    (8, TType.I64, 'updatedTime', None, None, ),  # 8
    (9, TType.STRING, 'defaultCredentialStoreToken', 'UTF8', None, ),  # 9
)
fix_spec(all_structs)
del all_structs
