Interacting_with_Airavata_using_ipython_Notebook/Admin-User/apache/airavata/model/workspace/experiment/ttypes.py [16:3474]:
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
try:
  from thrift.protocol import fastbinary
except:
  fastbinary = None


class ExperimentState:
  CREATED = 0
  VALIDATED = 1
  SCHEDULED = 2
  LAUNCHED = 3
  EXECUTING = 4
  CANCELING = 5
  CANCELED = 6
  SUSPENDED = 7
  COMPLETED = 8
  FAILED = 9
  UNKNOWN = 10

  _VALUES_TO_NAMES = {
    0: "CREATED",
    1: "VALIDATED",
    2: "SCHEDULED",
    3: "LAUNCHED",
    4: "EXECUTING",
    5: "CANCELING",
    6: "CANCELED",
    7: "SUSPENDED",
    8: "COMPLETED",
    9: "FAILED",
    10: "UNKNOWN",
  }

  _NAMES_TO_VALUES = {
    "CREATED": 0,
    "VALIDATED": 1,
    "SCHEDULED": 2,
    "LAUNCHED": 3,
    "EXECUTING": 4,
    "CANCELING": 5,
    "CANCELED": 6,
    "SUSPENDED": 7,
    "COMPLETED": 8,
    "FAILED": 9,
    "UNKNOWN": 10,
  }

class ExperimentSearchFields:
  EXPERIMENT_NAME = 0
  EXPERIMENT_DESC = 1
  APPLICATION_ID = 2
  FROM_DATE = 3
  TO_DATE = 4
  STATUS = 5

  _VALUES_TO_NAMES = {
    0: "EXPERIMENT_NAME",
    1: "EXPERIMENT_DESC",
    2: "APPLICATION_ID",
    3: "FROM_DATE",
    4: "TO_DATE",
    5: "STATUS",
  }

  _NAMES_TO_VALUES = {
    "EXPERIMENT_NAME": 0,
    "EXPERIMENT_DESC": 1,
    "APPLICATION_ID": 2,
    "FROM_DATE": 3,
    "TO_DATE": 4,
    "STATUS": 5,
  }

class WorkflowNodeState:
  INVOKED = 0
  EXECUTING = 1
  CANCELING = 2
  CANCELED = 3
  SUSPENDED = 4
  COMPLETED = 5
  FAILED = 6
  UNKNOWN = 7

  _VALUES_TO_NAMES = {
    0: "INVOKED",
    1: "EXECUTING",
    2: "CANCELING",
    3: "CANCELED",
    4: "SUSPENDED",
    5: "COMPLETED",
    6: "FAILED",
    7: "UNKNOWN",
  }

  _NAMES_TO_VALUES = {
    "INVOKED": 0,
    "EXECUTING": 1,
    "CANCELING": 2,
    "CANCELED": 3,
    "SUSPENDED": 4,
    "COMPLETED": 5,
    "FAILED": 6,
    "UNKNOWN": 7,
  }

class TaskState:
  WAITING = 0
  STARTED = 1
  PRE_PROCESSING = 2
  CONFIGURING_WORKSPACE = 3
  INPUT_DATA_STAGING = 4
  OUTPUT_DATA_STAGING = 5
  POST_PROCESSING = 6
  EXECUTING = 7
  CANCELING = 8
  CANCELED = 9
  COMPLETED = 10
  FAILED = 11
  UNKNOWN = 12

  _VALUES_TO_NAMES = {
    0: "WAITING",
    1: "STARTED",
    2: "PRE_PROCESSING",
    3: "CONFIGURING_WORKSPACE",
    4: "INPUT_DATA_STAGING",
    5: "OUTPUT_DATA_STAGING",
    6: "POST_PROCESSING",
    7: "EXECUTING",
    8: "CANCELING",
    9: "CANCELED",
    10: "COMPLETED",
    11: "FAILED",
    12: "UNKNOWN",
  }

  _NAMES_TO_VALUES = {
    "WAITING": 0,
    "STARTED": 1,
    "PRE_PROCESSING": 2,
    "CONFIGURING_WORKSPACE": 3,
    "INPUT_DATA_STAGING": 4,
    "OUTPUT_DATA_STAGING": 5,
    "POST_PROCESSING": 6,
    "EXECUTING": 7,
    "CANCELING": 8,
    "CANCELED": 9,
    "COMPLETED": 10,
    "FAILED": 11,
    "UNKNOWN": 12,
  }

class JobState:
  SUBMITTED = 0
  UN_SUBMITTED = 1
  SETUP = 2
  QUEUED = 3
  ACTIVE = 4
  COMPLETE = 5
  CANCELING = 6
  CANCELED = 7
  FAILED = 8
  HELD = 9
  SUSPENDED = 10
  UNKNOWN = 11

  _VALUES_TO_NAMES = {
    0: "SUBMITTED",
    1: "UN_SUBMITTED",
    2: "SETUP",
    3: "QUEUED",
    4: "ACTIVE",
    5: "COMPLETE",
    6: "CANCELING",
    7: "CANCELED",
    8: "FAILED",
    9: "HELD",
    10: "SUSPENDED",
    11: "UNKNOWN",
  }

  _NAMES_TO_VALUES = {
    "SUBMITTED": 0,
    "UN_SUBMITTED": 1,
    "SETUP": 2,
    "QUEUED": 3,
    "ACTIVE": 4,
    "COMPLETE": 5,
    "CANCELING": 6,
    "CANCELED": 7,
    "FAILED": 8,
    "HELD": 9,
    "SUSPENDED": 10,
    "UNKNOWN": 11,
  }

class TransferState:
  DIRECTORY_SETUP = 0
  UPLOAD = 1
  DOWNLOAD = 2
  ACTIVE = 3
  COMPLETE = 4
  STDOUT_DOWNLOAD = 5
  STDERROR_DOWNLOAD = 6
  CANCELING = 7
  CANCELED = 8
  FAILED = 9
  HELD = 10
  SUSPENDED = 11
  UNKNOWN = 12

  _VALUES_TO_NAMES = {
    0: "DIRECTORY_SETUP",
    1: "UPLOAD",
    2: "DOWNLOAD",
    3: "ACTIVE",
    4: "COMPLETE",
    5: "STDOUT_DOWNLOAD",
    6: "STDERROR_DOWNLOAD",
    7: "CANCELING",
    8: "CANCELED",
    9: "FAILED",
    10: "HELD",
    11: "SUSPENDED",
    12: "UNKNOWN",
  }

  _NAMES_TO_VALUES = {
    "DIRECTORY_SETUP": 0,
    "UPLOAD": 1,
    "DOWNLOAD": 2,
    "ACTIVE": 3,
    "COMPLETE": 4,
    "STDOUT_DOWNLOAD": 5,
    "STDERROR_DOWNLOAD": 6,
    "CANCELING": 7,
    "CANCELED": 8,
    "FAILED": 9,
    "HELD": 10,
    "SUSPENDED": 11,
    "UNKNOWN": 12,
  }

class ActionableGroup:
  RESOURCE_ADMINS = 0
  AIRAVATA_ADMINS = 1
  GATEWAYS_ADMINS = 2
  USER = 3
  CANNOT_BE_DETERMINED = 4

  _VALUES_TO_NAMES = {
    0: "RESOURCE_ADMINS",
    1: "AIRAVATA_ADMINS",
    2: "GATEWAYS_ADMINS",
    3: "USER",
    4: "CANNOT_BE_DETERMINED",
  }

  _NAMES_TO_VALUES = {
    "RESOURCE_ADMINS": 0,
    "AIRAVATA_ADMINS": 1,
    "GATEWAYS_ADMINS": 2,
    "USER": 3,
    "CANNOT_BE_DETERMINED": 4,
  }

class ErrorCategory:
  FILE_SYSTEM_FAILURE = 0
  APPLICATION_FAILURE = 1
  RESOURCE_NODE_FAILURE = 2
  DISK_FULL = 3
  INSUFFICIENT_ALLOCATION = 4
  SYSTEM_MAINTENANCE = 5
  AIRAVATA_INTERNAL_ERROR = 6
  CANNOT_BE_DETERMINED = 7

  _VALUES_TO_NAMES = {
    0: "FILE_SYSTEM_FAILURE",
    1: "APPLICATION_FAILURE",
    2: "RESOURCE_NODE_FAILURE",
    3: "DISK_FULL",
    4: "INSUFFICIENT_ALLOCATION",
    5: "SYSTEM_MAINTENANCE",
    6: "AIRAVATA_INTERNAL_ERROR",
    7: "CANNOT_BE_DETERMINED",
  }

  _NAMES_TO_VALUES = {
    "FILE_SYSTEM_FAILURE": 0,
    "APPLICATION_FAILURE": 1,
    "RESOURCE_NODE_FAILURE": 2,
    "DISK_FULL": 3,
    "INSUFFICIENT_ALLOCATION": 4,
    "SYSTEM_MAINTENANCE": 5,
    "AIRAVATA_INTERNAL_ERROR": 6,
    "CANNOT_BE_DETERMINED": 7,
  }

class CorrectiveAction:
  RETRY_SUBMISSION = 0
  CONTACT_SUPPORT = 1
  CANNOT_BE_DETERMINED = 2

  _VALUES_TO_NAMES = {
    0: "RETRY_SUBMISSION",
    1: "CONTACT_SUPPORT",
    2: "CANNOT_BE_DETERMINED",
  }

  _NAMES_TO_VALUES = {
    "RETRY_SUBMISSION": 0,
    "CONTACT_SUPPORT": 1,
    "CANNOT_BE_DETERMINED": 2,
  }

class ExecutionUnit:
  INPUT = 0
  APPLICATION = 1
  OUTPUT = 2
  OTHER = 3

  _VALUES_TO_NAMES = {
    0: "INPUT",
    1: "APPLICATION",
    2: "OUTPUT",
    3: "OTHER",
  }

  _NAMES_TO_VALUES = {
    "INPUT": 0,
    "APPLICATION": 1,
    "OUTPUT": 2,
    "OTHER": 3,
  }


class ExperimentStatus:
  """
  Attributes:
   - experimentState
   - timeOfStateChange
  """

  thrift_spec = (
    None, # 0
    (1, TType.I32, 'experimentState', None, None, ), # 1
    (2, TType.I64, 'timeOfStateChange', None, None, ), # 2
  )

  def __init__(self, experimentState=None, timeOfStateChange=None,):
    self.experimentState = experimentState
    self.timeOfStateChange = timeOfStateChange

  def read(self, iprot):
    if iprot.__class__ == TBinaryProtocol.TBinaryProtocolAccelerated and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None and fastbinary is not None:
      fastbinary.decode_binary(self, iprot.trans, (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.I32:
          self.experimentState = iprot.readI32();
        else:
          iprot.skip(ftype)
      elif fid == 2:
        if ftype == TType.I64:
          self.timeOfStateChange = iprot.readI64();
        else:
          iprot.skip(ftype)
      else:
        iprot.skip(ftype)
      iprot.readFieldEnd()
    iprot.readStructEnd()

  def write(self, oprot):
    if oprot.__class__ == TBinaryProtocol.TBinaryProtocolAccelerated and self.thrift_spec is not None and fastbinary is not None:
      oprot.trans.write(fastbinary.encode_binary(self, (self.__class__, self.thrift_spec)))
      return
    oprot.writeStructBegin('ExperimentStatus')
    if self.experimentState is not None:
      oprot.writeFieldBegin('experimentState', TType.I32, 1)
      oprot.writeI32(self.experimentState)
      oprot.writeFieldEnd()
    if self.timeOfStateChange is not None:
      oprot.writeFieldBegin('timeOfStateChange', TType.I64, 2)
      oprot.writeI64(self.timeOfStateChange)
      oprot.writeFieldEnd()
    oprot.writeFieldStop()
    oprot.writeStructEnd()

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


  def __hash__(self):
    value = 17
    value = (value * 31) ^ hash(self.experimentState)
    value = (value * 31) ^ hash(self.timeOfStateChange)
    return value

  def __repr__(self):
    L = ['%s=%r' % (key, value)
      for key, value in self.__dict__.iteritems()]
    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 WorkflowNodeStatus:
  """
  Attributes:
   - workflowNodeState
   - timeOfStateChange
  """

  thrift_spec = (
    None, # 0
    (1, TType.I32, 'workflowNodeState', None, None, ), # 1
    (2, TType.I64, 'timeOfStateChange', None, None, ), # 2
  )

  def __init__(self, workflowNodeState=None, timeOfStateChange=None,):
    self.workflowNodeState = workflowNodeState
    self.timeOfStateChange = timeOfStateChange

  def read(self, iprot):
    if iprot.__class__ == TBinaryProtocol.TBinaryProtocolAccelerated and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None and fastbinary is not None:
      fastbinary.decode_binary(self, iprot.trans, (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.I32:
          self.workflowNodeState = iprot.readI32();
        else:
          iprot.skip(ftype)
      elif fid == 2:
        if ftype == TType.I64:
          self.timeOfStateChange = iprot.readI64();
        else:
          iprot.skip(ftype)
      else:
        iprot.skip(ftype)
      iprot.readFieldEnd()
    iprot.readStructEnd()

  def write(self, oprot):
    if oprot.__class__ == TBinaryProtocol.TBinaryProtocolAccelerated and self.thrift_spec is not None and fastbinary is not None:
      oprot.trans.write(fastbinary.encode_binary(self, (self.__class__, self.thrift_spec)))
      return
    oprot.writeStructBegin('WorkflowNodeStatus')
    if self.workflowNodeState is not None:
      oprot.writeFieldBegin('workflowNodeState', TType.I32, 1)
      oprot.writeI32(self.workflowNodeState)
      oprot.writeFieldEnd()
    if self.timeOfStateChange is not None:
      oprot.writeFieldBegin('timeOfStateChange', TType.I64, 2)
      oprot.writeI64(self.timeOfStateChange)
      oprot.writeFieldEnd()
    oprot.writeFieldStop()
    oprot.writeStructEnd()

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


  def __hash__(self):
    value = 17
    value = (value * 31) ^ hash(self.workflowNodeState)
    value = (value * 31) ^ hash(self.timeOfStateChange)
    return value

  def __repr__(self):
    L = ['%s=%r' % (key, value)
      for key, value in self.__dict__.iteritems()]
    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 TaskStatus:
  """
  Attributes:
   - executionState
   - timeOfStateChange
  """

  thrift_spec = (
    None, # 0
    (1, TType.I32, 'executionState', None, None, ), # 1
    (2, TType.I64, 'timeOfStateChange', None, None, ), # 2
  )

  def __init__(self, executionState=None, timeOfStateChange=None,):
    self.executionState = executionState
    self.timeOfStateChange = timeOfStateChange

  def read(self, iprot):
    if iprot.__class__ == TBinaryProtocol.TBinaryProtocolAccelerated and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None and fastbinary is not None:
      fastbinary.decode_binary(self, iprot.trans, (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.I32:
          self.executionState = iprot.readI32();
        else:
          iprot.skip(ftype)
      elif fid == 2:
        if ftype == TType.I64:
          self.timeOfStateChange = iprot.readI64();
        else:
          iprot.skip(ftype)
      else:
        iprot.skip(ftype)
      iprot.readFieldEnd()
    iprot.readStructEnd()

  def write(self, oprot):
    if oprot.__class__ == TBinaryProtocol.TBinaryProtocolAccelerated and self.thrift_spec is not None and fastbinary is not None:
      oprot.trans.write(fastbinary.encode_binary(self, (self.__class__, self.thrift_spec)))
      return
    oprot.writeStructBegin('TaskStatus')
    if self.executionState is not None:
      oprot.writeFieldBegin('executionState', TType.I32, 1)
      oprot.writeI32(self.executionState)
      oprot.writeFieldEnd()
    if self.timeOfStateChange is not None:
      oprot.writeFieldBegin('timeOfStateChange', TType.I64, 2)
      oprot.writeI64(self.timeOfStateChange)
      oprot.writeFieldEnd()
    oprot.writeFieldStop()
    oprot.writeStructEnd()

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


  def __hash__(self):
    value = 17
    value = (value * 31) ^ hash(self.executionState)
    value = (value * 31) ^ hash(self.timeOfStateChange)
    return value

  def __repr__(self):
    L = ['%s=%r' % (key, value)
      for key, value in self.__dict__.iteritems()]
    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 JobStatus:
  """
  Attributes:
   - jobState
   - timeOfStateChange
  """

  thrift_spec = (
    None, # 0
    (1, TType.I32, 'jobState', None, None, ), # 1
    (2, TType.I64, 'timeOfStateChange', None, None, ), # 2
  )

  def __init__(self, jobState=None, timeOfStateChange=None,):
    self.jobState = jobState
    self.timeOfStateChange = timeOfStateChange

  def read(self, iprot):
    if iprot.__class__ == TBinaryProtocol.TBinaryProtocolAccelerated and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None and fastbinary is not None:
      fastbinary.decode_binary(self, iprot.trans, (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.I32:
          self.jobState = iprot.readI32();
        else:
          iprot.skip(ftype)
      elif fid == 2:
        if ftype == TType.I64:
          self.timeOfStateChange = iprot.readI64();
        else:
          iprot.skip(ftype)
      else:
        iprot.skip(ftype)
      iprot.readFieldEnd()
    iprot.readStructEnd()

  def write(self, oprot):
    if oprot.__class__ == TBinaryProtocol.TBinaryProtocolAccelerated and self.thrift_spec is not None and fastbinary is not None:
      oprot.trans.write(fastbinary.encode_binary(self, (self.__class__, self.thrift_spec)))
      return
    oprot.writeStructBegin('JobStatus')
    if self.jobState is not None:
      oprot.writeFieldBegin('jobState', TType.I32, 1)
      oprot.writeI32(self.jobState)
      oprot.writeFieldEnd()
    if self.timeOfStateChange is not None:
      oprot.writeFieldBegin('timeOfStateChange', TType.I64, 2)
      oprot.writeI64(self.timeOfStateChange)
      oprot.writeFieldEnd()
    oprot.writeFieldStop()
    oprot.writeStructEnd()

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


  def __hash__(self):
    value = 17
    value = (value * 31) ^ hash(self.jobState)
    value = (value * 31) ^ hash(self.timeOfStateChange)
    return value

  def __repr__(self):
    L = ['%s=%r' % (key, value)
      for key, value in self.__dict__.iteritems()]
    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 TransferStatus:
  """
  Attributes:
   - transferState
   - timeOfStateChange
  """

  thrift_spec = (
    None, # 0
    (1, TType.I32, 'transferState', None, None, ), # 1
    (2, TType.I64, 'timeOfStateChange', None, None, ), # 2
  )

  def __init__(self, transferState=None, timeOfStateChange=None,):
    self.transferState = transferState
    self.timeOfStateChange = timeOfStateChange

  def read(self, iprot):
    if iprot.__class__ == TBinaryProtocol.TBinaryProtocolAccelerated and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None and fastbinary is not None:
      fastbinary.decode_binary(self, iprot.trans, (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.I32:
          self.transferState = iprot.readI32();
        else:
          iprot.skip(ftype)
      elif fid == 2:
        if ftype == TType.I64:
          self.timeOfStateChange = iprot.readI64();
        else:
          iprot.skip(ftype)
      else:
        iprot.skip(ftype)
      iprot.readFieldEnd()
    iprot.readStructEnd()

  def write(self, oprot):
    if oprot.__class__ == TBinaryProtocol.TBinaryProtocolAccelerated and self.thrift_spec is not None and fastbinary is not None:
      oprot.trans.write(fastbinary.encode_binary(self, (self.__class__, self.thrift_spec)))
      return
    oprot.writeStructBegin('TransferStatus')
    if self.transferState is not None:
      oprot.writeFieldBegin('transferState', TType.I32, 1)
      oprot.writeI32(self.transferState)
      oprot.writeFieldEnd()
    if self.timeOfStateChange is not None:
      oprot.writeFieldBegin('timeOfStateChange', TType.I64, 2)
      oprot.writeI64(self.timeOfStateChange)
      oprot.writeFieldEnd()
    oprot.writeFieldStop()
    oprot.writeStructEnd()

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


  def __hash__(self):
    value = 17
    value = (value * 31) ^ hash(self.transferState)
    value = (value * 31) ^ hash(self.timeOfStateChange)
    return value

  def __repr__(self):
    L = ['%s=%r' % (key, value)
      for key, value in self.__dict__.iteritems()]
    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 ApplicationStatus:
  """
  Attributes:
   - applicationState
   - timeOfStateChange
  """

  thrift_spec = (
    None, # 0
    (1, TType.STRING, 'applicationState', None, None, ), # 1
    (2, TType.I64, 'timeOfStateChange', None, None, ), # 2
  )

  def __init__(self, applicationState=None, timeOfStateChange=None,):
    self.applicationState = applicationState
    self.timeOfStateChange = timeOfStateChange

  def read(self, iprot):
    if iprot.__class__ == TBinaryProtocol.TBinaryProtocolAccelerated and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None and fastbinary is not None:
      fastbinary.decode_binary(self, iprot.trans, (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.applicationState = iprot.readString();
        else:
          iprot.skip(ftype)
      elif fid == 2:
        if ftype == TType.I64:
          self.timeOfStateChange = iprot.readI64();
        else:
          iprot.skip(ftype)
      else:
        iprot.skip(ftype)
      iprot.readFieldEnd()
    iprot.readStructEnd()

  def write(self, oprot):
    if oprot.__class__ == TBinaryProtocol.TBinaryProtocolAccelerated and self.thrift_spec is not None and fastbinary is not None:
      oprot.trans.write(fastbinary.encode_binary(self, (self.__class__, self.thrift_spec)))
      return
    oprot.writeStructBegin('ApplicationStatus')
    if self.applicationState is not None:
      oprot.writeFieldBegin('applicationState', TType.STRING, 1)
      oprot.writeString(self.applicationState)
      oprot.writeFieldEnd()
    if self.timeOfStateChange is not None:
      oprot.writeFieldBegin('timeOfStateChange', TType.I64, 2)
      oprot.writeI64(self.timeOfStateChange)
      oprot.writeFieldEnd()
    oprot.writeFieldStop()
    oprot.writeStructEnd()

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


  def __hash__(self):
    value = 17
    value = (value * 31) ^ hash(self.applicationState)
    value = (value * 31) ^ hash(self.timeOfStateChange)
    return value

  def __repr__(self):
    L = ['%s=%r' % (key, value)
      for key, value in self.__dict__.iteritems()]
    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 ComputationalResourceScheduling:
  """
  A structure holding the Computational Resource Scheduling.


  Attributes:
   - resourceHostId
   - totalCPUCount
   - nodeCount
   - numberOfThreads
   - queueName
   - wallTimeLimit
   - jobStartTime
   - totalPhysicalMemory
   - computationalProjectAccount
   - chassisName
  """

  thrift_spec = (
    None, # 0
    (1, TType.STRING, 'resourceHostId', None, None, ), # 1
    (2, TType.I32, 'totalCPUCount', None, None, ), # 2
    (3, TType.I32, 'nodeCount', None, None, ), # 3
    (4, TType.I32, 'numberOfThreads', None, None, ), # 4
    (5, TType.STRING, 'queueName', None, None, ), # 5
    (6, TType.I32, 'wallTimeLimit', None, None, ), # 6
    (7, TType.I32, 'jobStartTime', None, None, ), # 7
    (8, TType.I32, 'totalPhysicalMemory', None, None, ), # 8
    (9, TType.STRING, 'computationalProjectAccount', None, None, ), # 9
    (10, TType.STRING, 'chassisName', None, None, ), # 10
  )

  def __init__(self, resourceHostId=None, totalCPUCount=None, nodeCount=None, numberOfThreads=None, queueName=None, wallTimeLimit=None, jobStartTime=None, totalPhysicalMemory=None, computationalProjectAccount=None, chassisName=None,):
    self.resourceHostId = resourceHostId
    self.totalCPUCount = totalCPUCount
    self.nodeCount = nodeCount
    self.numberOfThreads = numberOfThreads
    self.queueName = queueName
    self.wallTimeLimit = wallTimeLimit
    self.jobStartTime = jobStartTime
    self.totalPhysicalMemory = totalPhysicalMemory
    self.computationalProjectAccount = computationalProjectAccount
    self.chassisName = chassisName

  def read(self, iprot):
    if iprot.__class__ == TBinaryProtocol.TBinaryProtocolAccelerated and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None and fastbinary is not None:
      fastbinary.decode_binary(self, iprot.trans, (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.resourceHostId = iprot.readString();
        else:
          iprot.skip(ftype)
      elif fid == 2:
        if ftype == TType.I32:
          self.totalCPUCount = iprot.readI32();
        else:
          iprot.skip(ftype)
      elif fid == 3:
        if ftype == TType.I32:
          self.nodeCount = iprot.readI32();
        else:
          iprot.skip(ftype)
      elif fid == 4:
        if ftype == TType.I32:
          self.numberOfThreads = iprot.readI32();
        else:
          iprot.skip(ftype)
      elif fid == 5:
        if ftype == TType.STRING:
          self.queueName = iprot.readString();
        else:
          iprot.skip(ftype)
      elif fid == 6:
        if ftype == TType.I32:
          self.wallTimeLimit = iprot.readI32();
        else:
          iprot.skip(ftype)
      elif fid == 7:
        if ftype == TType.I32:
          self.jobStartTime = iprot.readI32();
        else:
          iprot.skip(ftype)
      elif fid == 8:
        if ftype == TType.I32:
          self.totalPhysicalMemory = iprot.readI32();
        else:
          iprot.skip(ftype)
      elif fid == 9:
        if ftype == TType.STRING:
          self.computationalProjectAccount = iprot.readString();
        else:
          iprot.skip(ftype)
      elif fid == 10:
        if ftype == TType.STRING:
          self.chassisName = iprot.readString();
        else:
          iprot.skip(ftype)
      else:
        iprot.skip(ftype)
      iprot.readFieldEnd()
    iprot.readStructEnd()

  def write(self, oprot):
    if oprot.__class__ == TBinaryProtocol.TBinaryProtocolAccelerated and self.thrift_spec is not None and fastbinary is not None:
      oprot.trans.write(fastbinary.encode_binary(self, (self.__class__, self.thrift_spec)))
      return
    oprot.writeStructBegin('ComputationalResourceScheduling')
    if self.resourceHostId is not None:
      oprot.writeFieldBegin('resourceHostId', TType.STRING, 1)
      oprot.writeString(self.resourceHostId)
      oprot.writeFieldEnd()
    if self.totalCPUCount is not None:
      oprot.writeFieldBegin('totalCPUCount', TType.I32, 2)
      oprot.writeI32(self.totalCPUCount)
      oprot.writeFieldEnd()
    if self.nodeCount is not None:
      oprot.writeFieldBegin('nodeCount', TType.I32, 3)
      oprot.writeI32(self.nodeCount)
      oprot.writeFieldEnd()
    if self.numberOfThreads is not None:
      oprot.writeFieldBegin('numberOfThreads', TType.I32, 4)
      oprot.writeI32(self.numberOfThreads)
      oprot.writeFieldEnd()
    if self.queueName is not None:
      oprot.writeFieldBegin('queueName', TType.STRING, 5)
      oprot.writeString(self.queueName)
      oprot.writeFieldEnd()
    if self.wallTimeLimit is not None:
      oprot.writeFieldBegin('wallTimeLimit', TType.I32, 6)
      oprot.writeI32(self.wallTimeLimit)
      oprot.writeFieldEnd()
    if self.jobStartTime is not None:
      oprot.writeFieldBegin('jobStartTime', TType.I32, 7)
      oprot.writeI32(self.jobStartTime)
      oprot.writeFieldEnd()
    if self.totalPhysicalMemory is not None:
      oprot.writeFieldBegin('totalPhysicalMemory', TType.I32, 8)
      oprot.writeI32(self.totalPhysicalMemory)
      oprot.writeFieldEnd()
    if self.computationalProjectAccount is not None:
      oprot.writeFieldBegin('computationalProjectAccount', TType.STRING, 9)
      oprot.writeString(self.computationalProjectAccount)
      oprot.writeFieldEnd()
    if self.chassisName is not None:
      oprot.writeFieldBegin('chassisName', TType.STRING, 10)
      oprot.writeString(self.chassisName)
      oprot.writeFieldEnd()
    oprot.writeFieldStop()
    oprot.writeStructEnd()

  def validate(self):
    return


  def __hash__(self):
    value = 17
    value = (value * 31) ^ hash(self.resourceHostId)
    value = (value * 31) ^ hash(self.totalCPUCount)
    value = (value * 31) ^ hash(self.nodeCount)
    value = (value * 31) ^ hash(self.numberOfThreads)
    value = (value * 31) ^ hash(self.queueName)
    value = (value * 31) ^ hash(self.wallTimeLimit)
    value = (value * 31) ^ hash(self.jobStartTime)
    value = (value * 31) ^ hash(self.totalPhysicalMemory)
    value = (value * 31) ^ hash(self.computationalProjectAccount)
    value = (value * 31) ^ hash(self.chassisName)
    return value

  def __repr__(self):
    L = ['%s=%r' % (key, value)
      for key, value in self.__dict__.iteritems()]
    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 AdvancedInputDataHandling:
  """
  A structure holding specified input data handling.


  Attributes:
   - stageInputFilesToWorkingDir
   - parentWorkingDirectory
   - uniqueWorkingDirectory
   - cleanUpWorkingDirAfterJob
  """

  thrift_spec = (
    None, # 0
    (1, TType.BOOL, 'stageInputFilesToWorkingDir', None, False, ), # 1
    (2, TType.STRING, 'parentWorkingDirectory', None, None, ), # 2
    (3, TType.STRING, 'uniqueWorkingDirectory', None, None, ), # 3
    (4, TType.BOOL, 'cleanUpWorkingDirAfterJob', None, False, ), # 4
  )

  def __init__(self, stageInputFilesToWorkingDir=thrift_spec[1][4], parentWorkingDirectory=None, uniqueWorkingDirectory=None, cleanUpWorkingDirAfterJob=thrift_spec[4][4],):
    self.stageInputFilesToWorkingDir = stageInputFilesToWorkingDir
    self.parentWorkingDirectory = parentWorkingDirectory
    self.uniqueWorkingDirectory = uniqueWorkingDirectory
    self.cleanUpWorkingDirAfterJob = cleanUpWorkingDirAfterJob

  def read(self, iprot):
    if iprot.__class__ == TBinaryProtocol.TBinaryProtocolAccelerated and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None and fastbinary is not None:
      fastbinary.decode_binary(self, iprot.trans, (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.BOOL:
          self.stageInputFilesToWorkingDir = iprot.readBool();
        else:
          iprot.skip(ftype)
      elif fid == 2:
        if ftype == TType.STRING:
          self.parentWorkingDirectory = iprot.readString();
        else:
          iprot.skip(ftype)
      elif fid == 3:
        if ftype == TType.STRING:
          self.uniqueWorkingDirectory = iprot.readString();
        else:
          iprot.skip(ftype)
      elif fid == 4:
        if ftype == TType.BOOL:
          self.cleanUpWorkingDirAfterJob = iprot.readBool();
        else:
          iprot.skip(ftype)
      else:
        iprot.skip(ftype)
      iprot.readFieldEnd()
    iprot.readStructEnd()

  def write(self, oprot):
    if oprot.__class__ == TBinaryProtocol.TBinaryProtocolAccelerated and self.thrift_spec is not None and fastbinary is not None:
      oprot.trans.write(fastbinary.encode_binary(self, (self.__class__, self.thrift_spec)))
      return
    oprot.writeStructBegin('AdvancedInputDataHandling')
    if self.stageInputFilesToWorkingDir is not None:
      oprot.writeFieldBegin('stageInputFilesToWorkingDir', TType.BOOL, 1)
      oprot.writeBool(self.stageInputFilesToWorkingDir)
      oprot.writeFieldEnd()
    if self.parentWorkingDirectory is not None:
      oprot.writeFieldBegin('parentWorkingDirectory', TType.STRING, 2)
      oprot.writeString(self.parentWorkingDirectory)
      oprot.writeFieldEnd()
    if self.uniqueWorkingDirectory is not None:
      oprot.writeFieldBegin('uniqueWorkingDirectory', TType.STRING, 3)
      oprot.writeString(self.uniqueWorkingDirectory)
      oprot.writeFieldEnd()
    if self.cleanUpWorkingDirAfterJob is not None:
      oprot.writeFieldBegin('cleanUpWorkingDirAfterJob', TType.BOOL, 4)
      oprot.writeBool(self.cleanUpWorkingDirAfterJob)
      oprot.writeFieldEnd()
    oprot.writeFieldStop()
    oprot.writeStructEnd()

  def validate(self):
    return


  def __hash__(self):
    value = 17
    value = (value * 31) ^ hash(self.stageInputFilesToWorkingDir)
    value = (value * 31) ^ hash(self.parentWorkingDirectory)
    value = (value * 31) ^ hash(self.uniqueWorkingDirectory)
    value = (value * 31) ^ hash(self.cleanUpWorkingDirAfterJob)
    return value

  def __repr__(self):
    L = ['%s=%r' % (key, value)
      for key, value in self.__dict__.iteritems()]
    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 AdvancedOutputDataHandling:
  """
  A structure holding specified output data handling.


  Attributes:
   - outputDataDir
   - dataRegistryURL
   - persistOutputData
  """

  thrift_spec = (
    None, # 0
    None, # 1
    (2, TType.STRING, 'outputDataDir', None, None, ), # 2
    (3, TType.STRING, 'dataRegistryURL', None, None, ), # 3
    (4, TType.BOOL, 'persistOutputData', None, True, ), # 4
  )

  def __init__(self, outputDataDir=None, dataRegistryURL=None, persistOutputData=thrift_spec[4][4],):
    self.outputDataDir = outputDataDir
    self.dataRegistryURL = dataRegistryURL
    self.persistOutputData = persistOutputData

  def read(self, iprot):
    if iprot.__class__ == TBinaryProtocol.TBinaryProtocolAccelerated and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None and fastbinary is not None:
      fastbinary.decode_binary(self, iprot.trans, (self.__class__, self.thrift_spec))
      return
    iprot.readStructBegin()
    while True:
      (fname, ftype, fid) = iprot.readFieldBegin()
      if ftype == TType.STOP:
        break
      if fid == 2:
        if ftype == TType.STRING:
          self.outputDataDir = iprot.readString();
        else:
          iprot.skip(ftype)
      elif fid == 3:
        if ftype == TType.STRING:
          self.dataRegistryURL = iprot.readString();
        else:
          iprot.skip(ftype)
      elif fid == 4:
        if ftype == TType.BOOL:
          self.persistOutputData = iprot.readBool();
        else:
          iprot.skip(ftype)
      else:
        iprot.skip(ftype)
      iprot.readFieldEnd()
    iprot.readStructEnd()

  def write(self, oprot):
    if oprot.__class__ == TBinaryProtocol.TBinaryProtocolAccelerated and self.thrift_spec is not None and fastbinary is not None:
      oprot.trans.write(fastbinary.encode_binary(self, (self.__class__, self.thrift_spec)))
      return
    oprot.writeStructBegin('AdvancedOutputDataHandling')
    if self.outputDataDir is not None:
      oprot.writeFieldBegin('outputDataDir', TType.STRING, 2)
      oprot.writeString(self.outputDataDir)
      oprot.writeFieldEnd()
    if self.dataRegistryURL is not None:
      oprot.writeFieldBegin('dataRegistryURL', TType.STRING, 3)
      oprot.writeString(self.dataRegistryURL)
      oprot.writeFieldEnd()
    if self.persistOutputData is not None:
      oprot.writeFieldBegin('persistOutputData', TType.BOOL, 4)
      oprot.writeBool(self.persistOutputData)
      oprot.writeFieldEnd()
    oprot.writeFieldStop()
    oprot.writeStructEnd()

  def validate(self):
    return


  def __hash__(self):
    value = 17
    value = (value * 31) ^ hash(self.outputDataDir)
    value = (value * 31) ^ hash(self.dataRegistryURL)
    value = (value * 31) ^ hash(self.persistOutputData)
    return value

  def __repr__(self):
    L = ['%s=%r' % (key, value)
      for key, value in self.__dict__.iteritems()]
    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 QualityOfServiceParams:
  """
  A structure holding Quality of Service Parameters.


  Attributes:
   - startExecutionAt
   - executeBefore
   - numberofRetries
  """

  thrift_spec = (
    None, # 0
    (1, TType.STRING, 'startExecutionAt', None, None, ), # 1
    (2, TType.STRING, 'executeBefore', None, None, ), # 2
    (3, TType.I32, 'numberofRetries', None, None, ), # 3
  )

  def __init__(self, startExecutionAt=None, executeBefore=None, numberofRetries=None,):
    self.startExecutionAt = startExecutionAt
    self.executeBefore = executeBefore
    self.numberofRetries = numberofRetries

  def read(self, iprot):
    if iprot.__class__ == TBinaryProtocol.TBinaryProtocolAccelerated and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None and fastbinary is not None:
      fastbinary.decode_binary(self, iprot.trans, (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.startExecutionAt = iprot.readString();
        else:
          iprot.skip(ftype)
      elif fid == 2:
        if ftype == TType.STRING:
          self.executeBefore = iprot.readString();
        else:
          iprot.skip(ftype)
      elif fid == 3:
        if ftype == TType.I32:
          self.numberofRetries = iprot.readI32();
        else:
          iprot.skip(ftype)
      else:
        iprot.skip(ftype)
      iprot.readFieldEnd()
    iprot.readStructEnd()

  def write(self, oprot):
    if oprot.__class__ == TBinaryProtocol.TBinaryProtocolAccelerated and self.thrift_spec is not None and fastbinary is not None:
      oprot.trans.write(fastbinary.encode_binary(self, (self.__class__, self.thrift_spec)))
      return
    oprot.writeStructBegin('QualityOfServiceParams')
    if self.startExecutionAt is not None:
      oprot.writeFieldBegin('startExecutionAt', TType.STRING, 1)
      oprot.writeString(self.startExecutionAt)
      oprot.writeFieldEnd()
    if self.executeBefore is not None:
      oprot.writeFieldBegin('executeBefore', TType.STRING, 2)
      oprot.writeString(self.executeBefore)
      oprot.writeFieldEnd()
    if self.numberofRetries is not None:
      oprot.writeFieldBegin('numberofRetries', TType.I32, 3)
      oprot.writeI32(self.numberofRetries)
      oprot.writeFieldEnd()
    oprot.writeFieldStop()
    oprot.writeStructEnd()

  def validate(self):
    return


  def __hash__(self):
    value = 17
    value = (value * 31) ^ hash(self.startExecutionAt)
    value = (value * 31) ^ hash(self.executeBefore)
    value = (value * 31) ^ hash(self.numberofRetries)
    return value

  def __repr__(self):
    L = ['%s=%r' % (key, value)
      for key, value in self.__dict__.iteritems()]
    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 UserConfigurationData:
  """
  A structure holding the experiment configuration.



  Attributes:
   - airavataAutoSchedule
   - overrideManualScheduledParams
   - shareExperimentPublicly
   - computationalResourceScheduling
   - advanceInputDataHandling
   - advanceOutputDataHandling
   - qosParams
   - throttleResources
   - userDN
   - generateCert
  """

  thrift_spec = (
    None, # 0
    (1, TType.BOOL, 'airavataAutoSchedule', None, False, ), # 1
    (2, TType.BOOL, 'overrideManualScheduledParams', None, False, ), # 2
    (3, TType.BOOL, 'shareExperimentPublicly', None, False, ), # 3
    (4, TType.STRUCT, 'computationalResourceScheduling', (ComputationalResourceScheduling, ComputationalResourceScheduling.thrift_spec), None, ), # 4
    (5, TType.STRUCT, 'advanceInputDataHandling', (AdvancedInputDataHandling, AdvancedInputDataHandling.thrift_spec), None, ), # 5
    (6, TType.STRUCT, 'advanceOutputDataHandling', (AdvancedOutputDataHandling, AdvancedOutputDataHandling.thrift_spec), None, ), # 6
    (7, TType.STRUCT, 'qosParams', (QualityOfServiceParams, QualityOfServiceParams.thrift_spec), None, ), # 7
    (8, TType.BOOL, 'throttleResources', None, False, ), # 8
    (9, TType.STRING, 'userDN', None, None, ), # 9
    (10, TType.BOOL, 'generateCert', None, False, ), # 10
  )

  def __init__(self, airavataAutoSchedule=thrift_spec[1][4], overrideManualScheduledParams=thrift_spec[2][4], shareExperimentPublicly=thrift_spec[3][4], computationalResourceScheduling=None, advanceInputDataHandling=None, advanceOutputDataHandling=None, qosParams=None, throttleResources=thrift_spec[8][4], userDN=None, generateCert=thrift_spec[10][4],):
    self.airavataAutoSchedule = airavataAutoSchedule
    self.overrideManualScheduledParams = overrideManualScheduledParams
    self.shareExperimentPublicly = shareExperimentPublicly
    self.computationalResourceScheduling = computationalResourceScheduling
    self.advanceInputDataHandling = advanceInputDataHandling
    self.advanceOutputDataHandling = advanceOutputDataHandling
    self.qosParams = qosParams
    self.throttleResources = throttleResources
    self.userDN = userDN
    self.generateCert = generateCert

  def read(self, iprot):
    if iprot.__class__ == TBinaryProtocol.TBinaryProtocolAccelerated and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None and fastbinary is not None:
      fastbinary.decode_binary(self, iprot.trans, (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.BOOL:
          self.airavataAutoSchedule = iprot.readBool();
        else:
          iprot.skip(ftype)
      elif fid == 2:
        if ftype == TType.BOOL:
          self.overrideManualScheduledParams = iprot.readBool();
        else:
          iprot.skip(ftype)
      elif fid == 3:
        if ftype == TType.BOOL:
          self.shareExperimentPublicly = iprot.readBool();
        else:
          iprot.skip(ftype)
      elif fid == 4:
        if ftype == TType.STRUCT:
          self.computationalResourceScheduling = ComputationalResourceScheduling()
          self.computationalResourceScheduling.read(iprot)
        else:
          iprot.skip(ftype)
      elif fid == 5:
        if ftype == TType.STRUCT:
          self.advanceInputDataHandling = AdvancedInputDataHandling()
          self.advanceInputDataHandling.read(iprot)
        else:
          iprot.skip(ftype)
      elif fid == 6:
        if ftype == TType.STRUCT:
          self.advanceOutputDataHandling = AdvancedOutputDataHandling()
          self.advanceOutputDataHandling.read(iprot)
        else:
          iprot.skip(ftype)
      elif fid == 7:
        if ftype == TType.STRUCT:
          self.qosParams = QualityOfServiceParams()
          self.qosParams.read(iprot)
        else:
          iprot.skip(ftype)
      elif fid == 8:
        if ftype == TType.BOOL:
          self.throttleResources = iprot.readBool();
        else:
          iprot.skip(ftype)
      elif fid == 9:
        if ftype == TType.STRING:
          self.userDN = iprot.readString();
        else:
          iprot.skip(ftype)
      elif fid == 10:
        if ftype == TType.BOOL:
          self.generateCert = iprot.readBool();
        else:
          iprot.skip(ftype)
      else:
        iprot.skip(ftype)
      iprot.readFieldEnd()
    iprot.readStructEnd()

  def write(self, oprot):
    if oprot.__class__ == TBinaryProtocol.TBinaryProtocolAccelerated and self.thrift_spec is not None and fastbinary is not None:
      oprot.trans.write(fastbinary.encode_binary(self, (self.__class__, self.thrift_spec)))
      return
    oprot.writeStructBegin('UserConfigurationData')
    if self.airavataAutoSchedule is not None:
      oprot.writeFieldBegin('airavataAutoSchedule', TType.BOOL, 1)
      oprot.writeBool(self.airavataAutoSchedule)
      oprot.writeFieldEnd()
    if self.overrideManualScheduledParams is not None:
      oprot.writeFieldBegin('overrideManualScheduledParams', TType.BOOL, 2)
      oprot.writeBool(self.overrideManualScheduledParams)
      oprot.writeFieldEnd()
    if self.shareExperimentPublicly is not None:
      oprot.writeFieldBegin('shareExperimentPublicly', TType.BOOL, 3)
      oprot.writeBool(self.shareExperimentPublicly)
      oprot.writeFieldEnd()
    if self.computationalResourceScheduling is not None:
      oprot.writeFieldBegin('computationalResourceScheduling', TType.STRUCT, 4)
      self.computationalResourceScheduling.write(oprot)
      oprot.writeFieldEnd()
    if self.advanceInputDataHandling is not None:
      oprot.writeFieldBegin('advanceInputDataHandling', TType.STRUCT, 5)
      self.advanceInputDataHandling.write(oprot)
      oprot.writeFieldEnd()
    if self.advanceOutputDataHandling is not None:
      oprot.writeFieldBegin('advanceOutputDataHandling', TType.STRUCT, 6)
      self.advanceOutputDataHandling.write(oprot)
      oprot.writeFieldEnd()
    if self.qosParams is not None:
      oprot.writeFieldBegin('qosParams', TType.STRUCT, 7)
      self.qosParams.write(oprot)
      oprot.writeFieldEnd()
    if self.throttleResources is not None:
      oprot.writeFieldBegin('throttleResources', TType.BOOL, 8)
      oprot.writeBool(self.throttleResources)
      oprot.writeFieldEnd()
    if self.userDN is not None:
      oprot.writeFieldBegin('userDN', TType.STRING, 9)
      oprot.writeString(self.userDN)
      oprot.writeFieldEnd()
    if self.generateCert is not None:
      oprot.writeFieldBegin('generateCert', TType.BOOL, 10)
      oprot.writeBool(self.generateCert)
      oprot.writeFieldEnd()
    oprot.writeFieldStop()
    oprot.writeStructEnd()

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


  def __hash__(self):
    value = 17
    value = (value * 31) ^ hash(self.airavataAutoSchedule)
    value = (value * 31) ^ hash(self.overrideManualScheduledParams)
    value = (value * 31) ^ hash(self.shareExperimentPublicly)
    value = (value * 31) ^ hash(self.computationalResourceScheduling)
    value = (value * 31) ^ hash(self.advanceInputDataHandling)
    value = (value * 31) ^ hash(self.advanceOutputDataHandling)
    value = (value * 31) ^ hash(self.qosParams)
    value = (value * 31) ^ hash(self.throttleResources)
    value = (value * 31) ^ hash(self.userDN)
    value = (value * 31) ^ hash(self.generateCert)
    return value

  def __repr__(self):
    L = ['%s=%r' % (key, value)
      for key, value in self.__dict__.iteritems()]
    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 ErrorDetails:
  """
  Attributes:
   - errorID
   - creationTime
   - actualErrorMessage
   - userFriendlyMessage
   - errorCategory
   - transientOrPersistent
   - correctiveAction
   - actionableGroup
   - rootCauseErrorIdList
  """

  thrift_spec = (
    None, # 0
    (1, TType.STRING, 'errorID', None, "DO_NOT_SET_AT_CLIENTS", ), # 1
    (2, TType.I64, 'creationTime', None, None, ), # 2
    (3, TType.STRING, 'actualErrorMessage', None, None, ), # 3
    (4, TType.STRING, 'userFriendlyMessage', None, None, ), # 4
    (5, TType.I32, 'errorCategory', None, None, ), # 5
    (6, TType.BOOL, 'transientOrPersistent', None, False, ), # 6
    (7, TType.I32, 'correctiveAction', None, None, ), # 7
    (8, TType.I32, 'actionableGroup', None, None, ), # 8
    (9, TType.LIST, 'rootCauseErrorIdList', (TType.STRING,None), None, ), # 9
  )

  def __init__(self, errorID=thrift_spec[1][4], creationTime=None, actualErrorMessage=None, userFriendlyMessage=None, errorCategory=None, transientOrPersistent=thrift_spec[6][4], correctiveAction=None, actionableGroup=None, rootCauseErrorIdList=None,):
    self.errorID = errorID
    self.creationTime = creationTime
    self.actualErrorMessage = actualErrorMessage
    self.userFriendlyMessage = userFriendlyMessage
    self.errorCategory = errorCategory
    self.transientOrPersistent = transientOrPersistent
    self.correctiveAction = correctiveAction
    self.actionableGroup = actionableGroup
    self.rootCauseErrorIdList = rootCauseErrorIdList

  def read(self, iprot):
    if iprot.__class__ == TBinaryProtocol.TBinaryProtocolAccelerated and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None and fastbinary is not None:
      fastbinary.decode_binary(self, iprot.trans, (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.errorID = iprot.readString();
        else:
          iprot.skip(ftype)
      elif fid == 2:
        if ftype == TType.I64:
          self.creationTime = iprot.readI64();
        else:
          iprot.skip(ftype)
      elif fid == 3:
        if ftype == TType.STRING:
          self.actualErrorMessage = iprot.readString();
        else:
          iprot.skip(ftype)
      elif fid == 4:
        if ftype == TType.STRING:
          self.userFriendlyMessage = iprot.readString();
        else:
          iprot.skip(ftype)
      elif fid == 5:
        if ftype == TType.I32:
          self.errorCategory = iprot.readI32();
        else:
          iprot.skip(ftype)
      elif fid == 6:
        if ftype == TType.BOOL:
          self.transientOrPersistent = iprot.readBool();
        else:
          iprot.skip(ftype)
      elif fid == 7:
        if ftype == TType.I32:
          self.correctiveAction = iprot.readI32();
        else:
          iprot.skip(ftype)
      elif fid == 8:
        if ftype == TType.I32:
          self.actionableGroup = iprot.readI32();
        else:
          iprot.skip(ftype)
      elif fid == 9:
        if ftype == TType.LIST:
          self.rootCauseErrorIdList = []
          (_etype3, _size0) = iprot.readListBegin()
          for _i4 in xrange(_size0):
            _elem5 = iprot.readString();
            self.rootCauseErrorIdList.append(_elem5)
          iprot.readListEnd()
        else:
          iprot.skip(ftype)
      else:
        iprot.skip(ftype)
      iprot.readFieldEnd()
    iprot.readStructEnd()

  def write(self, oprot):
    if oprot.__class__ == TBinaryProtocol.TBinaryProtocolAccelerated and self.thrift_spec is not None and fastbinary is not None:
      oprot.trans.write(fastbinary.encode_binary(self, (self.__class__, self.thrift_spec)))
      return
    oprot.writeStructBegin('ErrorDetails')
    if self.errorID is not None:
      oprot.writeFieldBegin('errorID', TType.STRING, 1)
      oprot.writeString(self.errorID)
      oprot.writeFieldEnd()
    if self.creationTime is not None:
      oprot.writeFieldBegin('creationTime', TType.I64, 2)
      oprot.writeI64(self.creationTime)
      oprot.writeFieldEnd()
    if self.actualErrorMessage is not None:
      oprot.writeFieldBegin('actualErrorMessage', TType.STRING, 3)
      oprot.writeString(self.actualErrorMessage)
      oprot.writeFieldEnd()
    if self.userFriendlyMessage is not None:
      oprot.writeFieldBegin('userFriendlyMessage', TType.STRING, 4)
      oprot.writeString(self.userFriendlyMessage)
      oprot.writeFieldEnd()
    if self.errorCategory is not None:
      oprot.writeFieldBegin('errorCategory', TType.I32, 5)
      oprot.writeI32(self.errorCategory)
      oprot.writeFieldEnd()
    if self.transientOrPersistent is not None:
      oprot.writeFieldBegin('transientOrPersistent', TType.BOOL, 6)
      oprot.writeBool(self.transientOrPersistent)
      oprot.writeFieldEnd()
    if self.correctiveAction is not None:
      oprot.writeFieldBegin('correctiveAction', TType.I32, 7)
      oprot.writeI32(self.correctiveAction)
      oprot.writeFieldEnd()
    if self.actionableGroup is not None:
      oprot.writeFieldBegin('actionableGroup', TType.I32, 8)
      oprot.writeI32(self.actionableGroup)
      oprot.writeFieldEnd()
    if self.rootCauseErrorIdList is not None:
      oprot.writeFieldBegin('rootCauseErrorIdList', TType.LIST, 9)
      oprot.writeListBegin(TType.STRING, len(self.rootCauseErrorIdList))
      for iter6 in self.rootCauseErrorIdList:
        oprot.writeString(iter6)
      oprot.writeListEnd()
      oprot.writeFieldEnd()
    oprot.writeFieldStop()
    oprot.writeStructEnd()

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


  def __hash__(self):
    value = 17
    value = (value * 31) ^ hash(self.errorID)
    value = (value * 31) ^ hash(self.creationTime)
    value = (value * 31) ^ hash(self.actualErrorMessage)
    value = (value * 31) ^ hash(self.userFriendlyMessage)
    value = (value * 31) ^ hash(self.errorCategory)
    value = (value * 31) ^ hash(self.transientOrPersistent)
    value = (value * 31) ^ hash(self.correctiveAction)
    value = (value * 31) ^ hash(self.actionableGroup)
    value = (value * 31) ^ hash(self.rootCauseErrorIdList)
    return value

  def __repr__(self):
    L = ['%s=%r' % (key, value)
      for key, value in self.__dict__.iteritems()]
    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 JobDetails:
  """
  Attributes:
   - jobID
   - jobDescription
   - creationTime
   - jobStatus
   - applicationStatus
   - errors
   - computeResourceConsumed
   - jobName
   - workingDir
  """

  thrift_spec = (
    None, # 0
    (1, TType.STRING, 'jobID', None, "DO_NOT_SET_AT_CLIENTS", ), # 1
    (2, TType.STRING, 'jobDescription', None, None, ), # 2
    (3, TType.I64, 'creationTime', None, None, ), # 3
    (4, TType.STRUCT, 'jobStatus', (JobStatus, JobStatus.thrift_spec), None, ), # 4
    (5, TType.STRUCT, 'applicationStatus', (ApplicationStatus, ApplicationStatus.thrift_spec), None, ), # 5
    (6, TType.LIST, 'errors', (TType.STRUCT,(ErrorDetails, ErrorDetails.thrift_spec)), None, ), # 6
    (7, TType.STRING, 'computeResourceConsumed', None, None, ), # 7
    (8, TType.STRING, 'jobName', None, None, ), # 8
    (9, TType.STRING, 'workingDir', None, None, ), # 9
  )

  def __init__(self, jobID=thrift_spec[1][4], jobDescription=None, creationTime=None, jobStatus=None, applicationStatus=None, errors=None, computeResourceConsumed=None, jobName=None, workingDir=None,):
    self.jobID = jobID
    self.jobDescription = jobDescription
    self.creationTime = creationTime
    self.jobStatus = jobStatus
    self.applicationStatus = applicationStatus
    self.errors = errors
    self.computeResourceConsumed = computeResourceConsumed
    self.jobName = jobName
    self.workingDir = workingDir

  def read(self, iprot):
    if iprot.__class__ == TBinaryProtocol.TBinaryProtocolAccelerated and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None and fastbinary is not None:
      fastbinary.decode_binary(self, iprot.trans, (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.jobID = iprot.readString();
        else:
          iprot.skip(ftype)
      elif fid == 2:
        if ftype == TType.STRING:
          self.jobDescription = iprot.readString();
        else:
          iprot.skip(ftype)
      elif fid == 3:
        if ftype == TType.I64:
          self.creationTime = iprot.readI64();
        else:
          iprot.skip(ftype)
      elif fid == 4:
        if ftype == TType.STRUCT:
          self.jobStatus = JobStatus()
          self.jobStatus.read(iprot)
        else:
          iprot.skip(ftype)
      elif fid == 5:
        if ftype == TType.STRUCT:
          self.applicationStatus = ApplicationStatus()
          self.applicationStatus.read(iprot)
        else:
          iprot.skip(ftype)
      elif fid == 6:
        if ftype == TType.LIST:
          self.errors = []
          (_etype10, _size7) = iprot.readListBegin()
          for _i11 in xrange(_size7):
            _elem12 = ErrorDetails()
            _elem12.read(iprot)
            self.errors.append(_elem12)
          iprot.readListEnd()
        else:
          iprot.skip(ftype)
      elif fid == 7:
        if ftype == TType.STRING:
          self.computeResourceConsumed = iprot.readString();
        else:
          iprot.skip(ftype)
      elif fid == 8:
        if ftype == TType.STRING:
          self.jobName = iprot.readString();
        else:
          iprot.skip(ftype)
      elif fid == 9:
        if ftype == TType.STRING:
          self.workingDir = iprot.readString();
        else:
          iprot.skip(ftype)
      else:
        iprot.skip(ftype)
      iprot.readFieldEnd()
    iprot.readStructEnd()

  def write(self, oprot):
    if oprot.__class__ == TBinaryProtocol.TBinaryProtocolAccelerated and self.thrift_spec is not None and fastbinary is not None:
      oprot.trans.write(fastbinary.encode_binary(self, (self.__class__, self.thrift_spec)))
      return
    oprot.writeStructBegin('JobDetails')
    if self.jobID is not None:
      oprot.writeFieldBegin('jobID', TType.STRING, 1)
      oprot.writeString(self.jobID)
      oprot.writeFieldEnd()
    if self.jobDescription is not None:
      oprot.writeFieldBegin('jobDescription', TType.STRING, 2)
      oprot.writeString(self.jobDescription)
      oprot.writeFieldEnd()
    if self.creationTime is not None:
      oprot.writeFieldBegin('creationTime', TType.I64, 3)
      oprot.writeI64(self.creationTime)
      oprot.writeFieldEnd()
    if self.jobStatus is not None:
      oprot.writeFieldBegin('jobStatus', TType.STRUCT, 4)
      self.jobStatus.write(oprot)
      oprot.writeFieldEnd()
    if self.applicationStatus is not None:
      oprot.writeFieldBegin('applicationStatus', TType.STRUCT, 5)
      self.applicationStatus.write(oprot)
      oprot.writeFieldEnd()
    if self.errors is not None:
      oprot.writeFieldBegin('errors', TType.LIST, 6)
      oprot.writeListBegin(TType.STRUCT, len(self.errors))
      for iter13 in self.errors:
        iter13.write(oprot)
      oprot.writeListEnd()
      oprot.writeFieldEnd()
    if self.computeResourceConsumed is not None:
      oprot.writeFieldBegin('computeResourceConsumed', TType.STRING, 7)
      oprot.writeString(self.computeResourceConsumed)
      oprot.writeFieldEnd()
    if self.jobName is not None:
      oprot.writeFieldBegin('jobName', TType.STRING, 8)
      oprot.writeString(self.jobName)
      oprot.writeFieldEnd()
    if self.workingDir is not None:
      oprot.writeFieldBegin('workingDir', TType.STRING, 9)
      oprot.writeString(self.workingDir)
      oprot.writeFieldEnd()
    oprot.writeFieldStop()
    oprot.writeStructEnd()

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


  def __hash__(self):
    value = 17
    value = (value * 31) ^ hash(self.jobID)
    value = (value * 31) ^ hash(self.jobDescription)
    value = (value * 31) ^ hash(self.creationTime)
    value = (value * 31) ^ hash(self.jobStatus)
    value = (value * 31) ^ hash(self.applicationStatus)
    value = (value * 31) ^ hash(self.errors)
    value = (value * 31) ^ hash(self.computeResourceConsumed)
    value = (value * 31) ^ hash(self.jobName)
    value = (value * 31) ^ hash(self.workingDir)
    return value

  def __repr__(self):
    L = ['%s=%r' % (key, value)
      for key, value in self.__dict__.iteritems()]
    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 DataTransferDetails:
  """
  Attributes:
   - transferID
   - creationTime
   - transferDescription
   - transferStatus
  """

  thrift_spec = (
    None, # 0
    (1, TType.STRING, 'transferID', None, "DO_NOT_SET_AT_CLIENTS", ), # 1
    (2, TType.I64, 'creationTime', None, None, ), # 2
    (3, TType.STRING, 'transferDescription', None, None, ), # 3
    (4, TType.STRUCT, 'transferStatus', (TransferStatus, TransferStatus.thrift_spec), None, ), # 4
  )

  def __init__(self, transferID=thrift_spec[1][4], creationTime=None, transferDescription=None, transferStatus=None,):
    self.transferID = transferID
    self.creationTime = creationTime
    self.transferDescription = transferDescription
    self.transferStatus = transferStatus

  def read(self, iprot):
    if iprot.__class__ == TBinaryProtocol.TBinaryProtocolAccelerated and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None and fastbinary is not None:
      fastbinary.decode_binary(self, iprot.trans, (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.transferID = iprot.readString();
        else:
          iprot.skip(ftype)
      elif fid == 2:
        if ftype == TType.I64:
          self.creationTime = iprot.readI64();
        else:
          iprot.skip(ftype)
      elif fid == 3:
        if ftype == TType.STRING:
          self.transferDescription = iprot.readString();
        else:
          iprot.skip(ftype)
      elif fid == 4:
        if ftype == TType.STRUCT:
          self.transferStatus = TransferStatus()
          self.transferStatus.read(iprot)
        else:
          iprot.skip(ftype)
      else:
        iprot.skip(ftype)
      iprot.readFieldEnd()
    iprot.readStructEnd()

  def write(self, oprot):
    if oprot.__class__ == TBinaryProtocol.TBinaryProtocolAccelerated and self.thrift_spec is not None and fastbinary is not None:
      oprot.trans.write(fastbinary.encode_binary(self, (self.__class__, self.thrift_spec)))
      return
    oprot.writeStructBegin('DataTransferDetails')
    if self.transferID is not None:
      oprot.writeFieldBegin('transferID', TType.STRING, 1)
      oprot.writeString(self.transferID)
      oprot.writeFieldEnd()
    if self.creationTime is not None:
      oprot.writeFieldBegin('creationTime', TType.I64, 2)
      oprot.writeI64(self.creationTime)
      oprot.writeFieldEnd()
    if self.transferDescription is not None:
      oprot.writeFieldBegin('transferDescription', TType.STRING, 3)
      oprot.writeString(self.transferDescription)
      oprot.writeFieldEnd()
    if self.transferStatus is not None:
      oprot.writeFieldBegin('transferStatus', TType.STRUCT, 4)
      self.transferStatus.write(oprot)
      oprot.writeFieldEnd()
    oprot.writeFieldStop()
    oprot.writeStructEnd()

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


  def __hash__(self):
    value = 17
    value = (value * 31) ^ hash(self.transferID)
    value = (value * 31) ^ hash(self.creationTime)
    value = (value * 31) ^ hash(self.transferDescription)
    value = (value * 31) ^ hash(self.transferStatus)
    return value

  def __repr__(self):
    L = ['%s=%r' % (key, value)
      for key, value in self.__dict__.iteritems()]
    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 TaskDetails:
  """
  A structure holding the actual execution context decided based on user provided configuration data or system inferred
    information from scheduling and QoS parameters. One experiment can have multiple tasks. Each tasks results in
    data transfers and jobs


  Attributes:
   - taskID
   - creationTime
   - applicationId
   - applicationVersion
   - applicationDeploymentId
   - applicationInputs
   - applicationOutputs
   - taskScheduling
   - advancedInputDataHandling
   - advancedOutputDataHandling
   - taskStatus
   - jobDetailsList
   - dataTransferDetailsList
   - errors
   - enableEmailNotification
   - emailAddresses
  """

  thrift_spec = (
    None, # 0
    (1, TType.STRING, 'taskID', None, "DO_NOT_SET_AT_CLIENTS", ), # 1
    (2, TType.I64, 'creationTime', None, None, ), # 2
    (3, TType.STRING, 'applicationId', None, None, ), # 3
    (4, TType.STRING, 'applicationVersion', None, None, ), # 4
    (5, TType.STRING, 'applicationDeploymentId', None, None, ), # 5
    (6, TType.LIST, 'applicationInputs', (TType.STRUCT,(apache.airavata.model.appcatalog.appinterface.ttypes.InputDataObjectType, apache.airavata.model.appcatalog.appinterface.ttypes.InputDataObjectType.thrift_spec)), None, ), # 6
    (7, TType.LIST, 'applicationOutputs', (TType.STRUCT,(apache.airavata.model.appcatalog.appinterface.ttypes.OutputDataObjectType, apache.airavata.model.appcatalog.appinterface.ttypes.OutputDataObjectType.thrift_spec)), None, ), # 7
    (8, TType.STRUCT, 'taskScheduling', (ComputationalResourceScheduling, ComputationalResourceScheduling.thrift_spec), None, ), # 8
    (9, TType.STRUCT, 'advancedInputDataHandling', (AdvancedInputDataHandling, AdvancedInputDataHandling.thrift_spec), None, ), # 9
    (10, TType.STRUCT, 'advancedOutputDataHandling', (AdvancedOutputDataHandling, AdvancedOutputDataHandling.thrift_spec), None, ), # 10
    (11, TType.STRUCT, 'taskStatus', (TaskStatus, TaskStatus.thrift_spec), None, ), # 11
    (12, TType.LIST, 'jobDetailsList', (TType.STRUCT,(JobDetails, JobDetails.thrift_spec)), None, ), # 12
    (13, TType.LIST, 'dataTransferDetailsList', (TType.STRUCT,(DataTransferDetails, DataTransferDetails.thrift_spec)), None, ), # 13
    (14, TType.LIST, 'errors', (TType.STRUCT,(ErrorDetails, ErrorDetails.thrift_spec)), None, ), # 14
    (15, TType.BOOL, 'enableEmailNotification', None, None, ), # 15
    (16, TType.LIST, 'emailAddresses', (TType.STRING,None), None, ), # 16
  )

  def __init__(self, taskID=thrift_spec[1][4], creationTime=None, applicationId=None, applicationVersion=None, applicationDeploymentId=None, applicationInputs=None, applicationOutputs=None, taskScheduling=None, advancedInputDataHandling=None, advancedOutputDataHandling=None, taskStatus=None, jobDetailsList=None, dataTransferDetailsList=None, errors=None, enableEmailNotification=None, emailAddresses=None,):
    self.taskID = taskID
    self.creationTime = creationTime
    self.applicationId = applicationId
    self.applicationVersion = applicationVersion
    self.applicationDeploymentId = applicationDeploymentId
    self.applicationInputs = applicationInputs
    self.applicationOutputs = applicationOutputs
    self.taskScheduling = taskScheduling
    self.advancedInputDataHandling = advancedInputDataHandling
    self.advancedOutputDataHandling = advancedOutputDataHandling
    self.taskStatus = taskStatus
    self.jobDetailsList = jobDetailsList
    self.dataTransferDetailsList = dataTransferDetailsList
    self.errors = errors
    self.enableEmailNotification = enableEmailNotification
    self.emailAddresses = emailAddresses

  def read(self, iprot):
    if iprot.__class__ == TBinaryProtocol.TBinaryProtocolAccelerated and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None and fastbinary is not None:
      fastbinary.decode_binary(self, iprot.trans, (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.taskID = iprot.readString();
        else:
          iprot.skip(ftype)
      elif fid == 2:
        if ftype == TType.I64:
          self.creationTime = iprot.readI64();
        else:
          iprot.skip(ftype)
      elif fid == 3:
        if ftype == TType.STRING:
          self.applicationId = iprot.readString();
        else:
          iprot.skip(ftype)
      elif fid == 4:
        if ftype == TType.STRING:
          self.applicationVersion = iprot.readString();
        else:
          iprot.skip(ftype)
      elif fid == 5:
        if ftype == TType.STRING:
          self.applicationDeploymentId = iprot.readString();
        else:
          iprot.skip(ftype)
      elif fid == 6:
        if ftype == TType.LIST:
          self.applicationInputs = []
          (_etype17, _size14) = iprot.readListBegin()
          for _i18 in xrange(_size14):
            _elem19 = apache.airavata.model.appcatalog.appinterface.ttypes.InputDataObjectType()
            _elem19.read(iprot)
            self.applicationInputs.append(_elem19)
          iprot.readListEnd()
        else:
          iprot.skip(ftype)
      elif fid == 7:
        if ftype == TType.LIST:
          self.applicationOutputs = []
          (_etype23, _size20) = iprot.readListBegin()
          for _i24 in xrange(_size20):
            _elem25 = apache.airavata.model.appcatalog.appinterface.ttypes.OutputDataObjectType()
            _elem25.read(iprot)
            self.applicationOutputs.append(_elem25)
          iprot.readListEnd()
        else:
          iprot.skip(ftype)
      elif fid == 8:
        if ftype == TType.STRUCT:
          self.taskScheduling = ComputationalResourceScheduling()
          self.taskScheduling.read(iprot)
        else:
          iprot.skip(ftype)
      elif fid == 9:
        if ftype == TType.STRUCT:
          self.advancedInputDataHandling = AdvancedInputDataHandling()
          self.advancedInputDataHandling.read(iprot)
        else:
          iprot.skip(ftype)
      elif fid == 10:
        if ftype == TType.STRUCT:
          self.advancedOutputDataHandling = AdvancedOutputDataHandling()
          self.advancedOutputDataHandling.read(iprot)
        else:
          iprot.skip(ftype)
      elif fid == 11:
        if ftype == TType.STRUCT:
          self.taskStatus = TaskStatus()
          self.taskStatus.read(iprot)
        else:
          iprot.skip(ftype)
      elif fid == 12:
        if ftype == TType.LIST:
          self.jobDetailsList = []
          (_etype29, _size26) = iprot.readListBegin()
          for _i30 in xrange(_size26):
            _elem31 = JobDetails()
            _elem31.read(iprot)
            self.jobDetailsList.append(_elem31)
          iprot.readListEnd()
        else:
          iprot.skip(ftype)
      elif fid == 13:
        if ftype == TType.LIST:
          self.dataTransferDetailsList = []
          (_etype35, _size32) = iprot.readListBegin()
          for _i36 in xrange(_size32):
            _elem37 = DataTransferDetails()
            _elem37.read(iprot)
            self.dataTransferDetailsList.append(_elem37)
          iprot.readListEnd()
        else:
          iprot.skip(ftype)
      elif fid == 14:
        if ftype == TType.LIST:
          self.errors = []
          (_etype41, _size38) = iprot.readListBegin()
          for _i42 in xrange(_size38):
            _elem43 = ErrorDetails()
            _elem43.read(iprot)
            self.errors.append(_elem43)
          iprot.readListEnd()
        else:
          iprot.skip(ftype)
      elif fid == 15:
        if ftype == TType.BOOL:
          self.enableEmailNotification = iprot.readBool();
        else:
          iprot.skip(ftype)
      elif fid == 16:
        if ftype == TType.LIST:
          self.emailAddresses = []
          (_etype47, _size44) = iprot.readListBegin()
          for _i48 in xrange(_size44):
            _elem49 = iprot.readString();
            self.emailAddresses.append(_elem49)
          iprot.readListEnd()
        else:
          iprot.skip(ftype)
      else:
        iprot.skip(ftype)
      iprot.readFieldEnd()
    iprot.readStructEnd()

  def write(self, oprot):
    if oprot.__class__ == TBinaryProtocol.TBinaryProtocolAccelerated and self.thrift_spec is not None and fastbinary is not None:
      oprot.trans.write(fastbinary.encode_binary(self, (self.__class__, self.thrift_spec)))
      return
    oprot.writeStructBegin('TaskDetails')
    if self.taskID is not None:
      oprot.writeFieldBegin('taskID', TType.STRING, 1)
      oprot.writeString(self.taskID)
      oprot.writeFieldEnd()
    if self.creationTime is not None:
      oprot.writeFieldBegin('creationTime', TType.I64, 2)
      oprot.writeI64(self.creationTime)
      oprot.writeFieldEnd()
    if self.applicationId is not None:
      oprot.writeFieldBegin('applicationId', TType.STRING, 3)
      oprot.writeString(self.applicationId)
      oprot.writeFieldEnd()
    if self.applicationVersion is not None:
      oprot.writeFieldBegin('applicationVersion', TType.STRING, 4)
      oprot.writeString(self.applicationVersion)
      oprot.writeFieldEnd()
    if self.applicationDeploymentId is not None:
      oprot.writeFieldBegin('applicationDeploymentId', TType.STRING, 5)
      oprot.writeString(self.applicationDeploymentId)
      oprot.writeFieldEnd()
    if self.applicationInputs is not None:
      oprot.writeFieldBegin('applicationInputs', TType.LIST, 6)
      oprot.writeListBegin(TType.STRUCT, len(self.applicationInputs))
      for iter50 in self.applicationInputs:
        iter50.write(oprot)
      oprot.writeListEnd()
      oprot.writeFieldEnd()
    if self.applicationOutputs is not None:
      oprot.writeFieldBegin('applicationOutputs', TType.LIST, 7)
      oprot.writeListBegin(TType.STRUCT, len(self.applicationOutputs))
      for iter51 in self.applicationOutputs:
        iter51.write(oprot)
      oprot.writeListEnd()
      oprot.writeFieldEnd()
    if self.taskScheduling is not None:
      oprot.writeFieldBegin('taskScheduling', TType.STRUCT, 8)
      self.taskScheduling.write(oprot)
      oprot.writeFieldEnd()
    if self.advancedInputDataHandling is not None:
      oprot.writeFieldBegin('advancedInputDataHandling', TType.STRUCT, 9)
      self.advancedInputDataHandling.write(oprot)
      oprot.writeFieldEnd()
    if self.advancedOutputDataHandling is not None:
      oprot.writeFieldBegin('advancedOutputDataHandling', TType.STRUCT, 10)
      self.advancedOutputDataHandling.write(oprot)
      oprot.writeFieldEnd()
    if self.taskStatus is not None:
      oprot.writeFieldBegin('taskStatus', TType.STRUCT, 11)
      self.taskStatus.write(oprot)
      oprot.writeFieldEnd()
    if self.jobDetailsList is not None:
      oprot.writeFieldBegin('jobDetailsList', TType.LIST, 12)
      oprot.writeListBegin(TType.STRUCT, len(self.jobDetailsList))
      for iter52 in self.jobDetailsList:
        iter52.write(oprot)
      oprot.writeListEnd()
      oprot.writeFieldEnd()
    if self.dataTransferDetailsList is not None:
      oprot.writeFieldBegin('dataTransferDetailsList', TType.LIST, 13)
      oprot.writeListBegin(TType.STRUCT, len(self.dataTransferDetailsList))
      for iter53 in self.dataTransferDetailsList:
        iter53.write(oprot)
      oprot.writeListEnd()
      oprot.writeFieldEnd()
    if self.errors is not None:
      oprot.writeFieldBegin('errors', TType.LIST, 14)
      oprot.writeListBegin(TType.STRUCT, len(self.errors))
      for iter54 in self.errors:
        iter54.write(oprot)
      oprot.writeListEnd()
      oprot.writeFieldEnd()
    if self.enableEmailNotification is not None:
      oprot.writeFieldBegin('enableEmailNotification', TType.BOOL, 15)
      oprot.writeBool(self.enableEmailNotification)
      oprot.writeFieldEnd()
    if self.emailAddresses is not None:
      oprot.writeFieldBegin('emailAddresses', TType.LIST, 16)
      oprot.writeListBegin(TType.STRING, len(self.emailAddresses))
      for iter55 in self.emailAddresses:
        oprot.writeString(iter55)
      oprot.writeListEnd()
      oprot.writeFieldEnd()
    oprot.writeFieldStop()
    oprot.writeStructEnd()

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


  def __hash__(self):
    value = 17
    value = (value * 31) ^ hash(self.taskID)
    value = (value * 31) ^ hash(self.creationTime)
    value = (value * 31) ^ hash(self.applicationId)
    value = (value * 31) ^ hash(self.applicationVersion)
    value = (value * 31) ^ hash(self.applicationDeploymentId)
    value = (value * 31) ^ hash(self.applicationInputs)
    value = (value * 31) ^ hash(self.applicationOutputs)
    value = (value * 31) ^ hash(self.taskScheduling)
    value = (value * 31) ^ hash(self.advancedInputDataHandling)
    value = (value * 31) ^ hash(self.advancedOutputDataHandling)
    value = (value * 31) ^ hash(self.taskStatus)
    value = (value * 31) ^ hash(self.jobDetailsList)
    value = (value * 31) ^ hash(self.dataTransferDetailsList)
    value = (value * 31) ^ hash(self.errors)
    value = (value * 31) ^ hash(self.enableEmailNotification)
    value = (value * 31) ^ hash(self.emailAddresses)
    return value

  def __repr__(self):
    L = ['%s=%r' % (key, value)
      for key, value in self.__dict__.iteritems()]
    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 WorkflowNodeDetails:
  """
  A structure holding the node data.
  nodeInstanceId - unique node identifier for each run

  Attributes:
   - nodeInstanceId
   - creationTime
   - nodeName
   - executionUnit
   - executionUnitData
   - nodeInputs
   - nodeOutputs
   - workflowNodeStatus
   - taskDetailsList
   - errors
  """

  thrift_spec = (
    None, # 0
    (1, TType.STRING, 'nodeInstanceId', None, "DO_NOT_SET_AT_CLIENTS", ), # 1
    (2, TType.I64, 'creationTime', None, None, ), # 2
    (3, TType.STRING, 'nodeName', None, "SINGLE_APP_NODE", ), # 3
    (4, TType.I32, 'executionUnit', None,     1, ), # 4
    (5, TType.STRING, 'executionUnitData', None, None, ), # 5
    (6, TType.LIST, 'nodeInputs', (TType.STRUCT,(apache.airavata.model.appcatalog.appinterface.ttypes.InputDataObjectType, apache.airavata.model.appcatalog.appinterface.ttypes.InputDataObjectType.thrift_spec)), None, ), # 6
    (7, TType.LIST, 'nodeOutputs', (TType.STRUCT,(apache.airavata.model.appcatalog.appinterface.ttypes.OutputDataObjectType, apache.airavata.model.appcatalog.appinterface.ttypes.OutputDataObjectType.thrift_spec)), None, ), # 7
    (8, TType.STRUCT, 'workflowNodeStatus', (WorkflowNodeStatus, WorkflowNodeStatus.thrift_spec), None, ), # 8
    (9, TType.LIST, 'taskDetailsList', (TType.STRUCT,(TaskDetails, TaskDetails.thrift_spec)), None, ), # 9
    (10, TType.LIST, 'errors', (TType.STRUCT,(ErrorDetails, ErrorDetails.thrift_spec)), None, ), # 10
  )

  def __init__(self, nodeInstanceId=thrift_spec[1][4], creationTime=None, nodeName=thrift_spec[3][4], executionUnit=thrift_spec[4][4], executionUnitData=None, nodeInputs=None, nodeOutputs=None, workflowNodeStatus=None, taskDetailsList=None, errors=None,):
    self.nodeInstanceId = nodeInstanceId
    self.creationTime = creationTime
    self.nodeName = nodeName
    self.executionUnit = executionUnit
    self.executionUnitData = executionUnitData
    self.nodeInputs = nodeInputs
    self.nodeOutputs = nodeOutputs
    self.workflowNodeStatus = workflowNodeStatus
    self.taskDetailsList = taskDetailsList
    self.errors = errors

  def read(self, iprot):
    if iprot.__class__ == TBinaryProtocol.TBinaryProtocolAccelerated and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None and fastbinary is not None:
      fastbinary.decode_binary(self, iprot.trans, (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.nodeInstanceId = iprot.readString();
        else:
          iprot.skip(ftype)
      elif fid == 2:
        if ftype == TType.I64:
          self.creationTime = iprot.readI64();
        else:
          iprot.skip(ftype)
      elif fid == 3:
        if ftype == TType.STRING:
          self.nodeName = iprot.readString();
        else:
          iprot.skip(ftype)
      elif fid == 4:
        if ftype == TType.I32:
          self.executionUnit = iprot.readI32();
        else:
          iprot.skip(ftype)
      elif fid == 5:
        if ftype == TType.STRING:
          self.executionUnitData = iprot.readString();
        else:
          iprot.skip(ftype)
      elif fid == 6:
        if ftype == TType.LIST:
          self.nodeInputs = []
          (_etype59, _size56) = iprot.readListBegin()
          for _i60 in xrange(_size56):
            _elem61 = apache.airavata.model.appcatalog.appinterface.ttypes.InputDataObjectType()
            _elem61.read(iprot)
            self.nodeInputs.append(_elem61)
          iprot.readListEnd()
        else:
          iprot.skip(ftype)
      elif fid == 7:
        if ftype == TType.LIST:
          self.nodeOutputs = []
          (_etype65, _size62) = iprot.readListBegin()
          for _i66 in xrange(_size62):
            _elem67 = apache.airavata.model.appcatalog.appinterface.ttypes.OutputDataObjectType()
            _elem67.read(iprot)
            self.nodeOutputs.append(_elem67)
          iprot.readListEnd()
        else:
          iprot.skip(ftype)
      elif fid == 8:
        if ftype == TType.STRUCT:
          self.workflowNodeStatus = WorkflowNodeStatus()
          self.workflowNodeStatus.read(iprot)
        else:
          iprot.skip(ftype)
      elif fid == 9:
        if ftype == TType.LIST:
          self.taskDetailsList = []
          (_etype71, _size68) = iprot.readListBegin()
          for _i72 in xrange(_size68):
            _elem73 = TaskDetails()
            _elem73.read(iprot)
            self.taskDetailsList.append(_elem73)
          iprot.readListEnd()
        else:
          iprot.skip(ftype)
      elif fid == 10:
        if ftype == TType.LIST:
          self.errors = []
          (_etype77, _size74) = iprot.readListBegin()
          for _i78 in xrange(_size74):
            _elem79 = ErrorDetails()
            _elem79.read(iprot)
            self.errors.append(_elem79)
          iprot.readListEnd()
        else:
          iprot.skip(ftype)
      else:
        iprot.skip(ftype)
      iprot.readFieldEnd()
    iprot.readStructEnd()

  def write(self, oprot):
    if oprot.__class__ == TBinaryProtocol.TBinaryProtocolAccelerated and self.thrift_spec is not None and fastbinary is not None:
      oprot.trans.write(fastbinary.encode_binary(self, (self.__class__, self.thrift_spec)))
      return
    oprot.writeStructBegin('WorkflowNodeDetails')
    if self.nodeInstanceId is not None:
      oprot.writeFieldBegin('nodeInstanceId', TType.STRING, 1)
      oprot.writeString(self.nodeInstanceId)
      oprot.writeFieldEnd()
    if self.creationTime is not None:
      oprot.writeFieldBegin('creationTime', TType.I64, 2)
      oprot.writeI64(self.creationTime)
      oprot.writeFieldEnd()
    if self.nodeName is not None:
      oprot.writeFieldBegin('nodeName', TType.STRING, 3)
      oprot.writeString(self.nodeName)
      oprot.writeFieldEnd()
    if self.executionUnit is not None:
      oprot.writeFieldBegin('executionUnit', TType.I32, 4)
      oprot.writeI32(self.executionUnit)
      oprot.writeFieldEnd()
    if self.executionUnitData is not None:
      oprot.writeFieldBegin('executionUnitData', TType.STRING, 5)
      oprot.writeString(self.executionUnitData)
      oprot.writeFieldEnd()
    if self.nodeInputs is not None:
      oprot.writeFieldBegin('nodeInputs', TType.LIST, 6)
      oprot.writeListBegin(TType.STRUCT, len(self.nodeInputs))
      for iter80 in self.nodeInputs:
        iter80.write(oprot)
      oprot.writeListEnd()
      oprot.writeFieldEnd()
    if self.nodeOutputs is not None:
      oprot.writeFieldBegin('nodeOutputs', TType.LIST, 7)
      oprot.writeListBegin(TType.STRUCT, len(self.nodeOutputs))
      for iter81 in self.nodeOutputs:
        iter81.write(oprot)
      oprot.writeListEnd()
      oprot.writeFieldEnd()
    if self.workflowNodeStatus is not None:
      oprot.writeFieldBegin('workflowNodeStatus', TType.STRUCT, 8)
      self.workflowNodeStatus.write(oprot)
      oprot.writeFieldEnd()
    if self.taskDetailsList is not None:
      oprot.writeFieldBegin('taskDetailsList', TType.LIST, 9)
      oprot.writeListBegin(TType.STRUCT, len(self.taskDetailsList))
      for iter82 in self.taskDetailsList:
        iter82.write(oprot)
      oprot.writeListEnd()
      oprot.writeFieldEnd()
    if self.errors is not None:
      oprot.writeFieldBegin('errors', TType.LIST, 10)
      oprot.writeListBegin(TType.STRUCT, len(self.errors))
      for iter83 in self.errors:
        iter83.write(oprot)
      oprot.writeListEnd()
      oprot.writeFieldEnd()
    oprot.writeFieldStop()
    oprot.writeStructEnd()

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


  def __hash__(self):
    value = 17
    value = (value * 31) ^ hash(self.nodeInstanceId)
    value = (value * 31) ^ hash(self.creationTime)
    value = (value * 31) ^ hash(self.nodeName)
    value = (value * 31) ^ hash(self.executionUnit)
    value = (value * 31) ^ hash(self.executionUnitData)
    value = (value * 31) ^ hash(self.nodeInputs)
    value = (value * 31) ^ hash(self.nodeOutputs)
    value = (value * 31) ^ hash(self.workflowNodeStatus)
    value = (value * 31) ^ hash(self.taskDetailsList)
    value = (value * 31) ^ hash(self.errors)
    return value

  def __repr__(self):
    L = ['%s=%r' % (key, value)
      for key, value in self.__dict__.iteritems()]
    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 ValidatorResult:
  """
  This data structure can be used to store the validation results
  captured during validation step and during the launchExperiment
  operation it can be easilly checked to see the errors occured
  during the experiment launch operation


  Attributes:
   - result
   - errorDetails
  """

  thrift_spec = (
    None, # 0
    (1, TType.BOOL, 'result', None, None, ), # 1
    (2, TType.STRING, 'errorDetails', None, None, ), # 2
  )

  def __init__(self, result=None, errorDetails=None,):
    self.result = result
    self.errorDetails = errorDetails

  def read(self, iprot):
    if iprot.__class__ == TBinaryProtocol.TBinaryProtocolAccelerated and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None and fastbinary is not None:
      fastbinary.decode_binary(self, iprot.trans, (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.BOOL:
          self.result = iprot.readBool();
        else:
          iprot.skip(ftype)
      elif fid == 2:
        if ftype == TType.STRING:
          self.errorDetails = iprot.readString();
        else:
          iprot.skip(ftype)
      else:
        iprot.skip(ftype)
      iprot.readFieldEnd()
    iprot.readStructEnd()

  def write(self, oprot):
    if oprot.__class__ == TBinaryProtocol.TBinaryProtocolAccelerated and self.thrift_spec is not None and fastbinary is not None:
      oprot.trans.write(fastbinary.encode_binary(self, (self.__class__, self.thrift_spec)))
      return
    oprot.writeStructBegin('ValidatorResult')
    if self.result is not None:
      oprot.writeFieldBegin('result', TType.BOOL, 1)
      oprot.writeBool(self.result)
      oprot.writeFieldEnd()
    if self.errorDetails is not None:
      oprot.writeFieldBegin('errorDetails', TType.STRING, 2)
      oprot.writeString(self.errorDetails)
      oprot.writeFieldEnd()
    oprot.writeFieldStop()
    oprot.writeStructEnd()

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


  def __hash__(self):
    value = 17
    value = (value * 31) ^ hash(self.result)
    value = (value * 31) ^ hash(self.errorDetails)
    return value

  def __repr__(self):
    L = ['%s=%r' % (key, value)
      for key, value in self.__dict__.iteritems()]
    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 ValidationResults:
  """
  Attributes:
   - validationState
   - validationResultList
  """

  thrift_spec = (
    None, # 0
    (1, TType.BOOL, 'validationState', None, None, ), # 1
    (2, TType.LIST, 'validationResultList', (TType.STRUCT,(ValidatorResult, ValidatorResult.thrift_spec)), None, ), # 2
  )

  def __init__(self, validationState=None, validationResultList=None,):
    self.validationState = validationState
    self.validationResultList = validationResultList

  def read(self, iprot):
    if iprot.__class__ == TBinaryProtocol.TBinaryProtocolAccelerated and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None and fastbinary is not None:
      fastbinary.decode_binary(self, iprot.trans, (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.BOOL:
          self.validationState = iprot.readBool();
        else:
          iprot.skip(ftype)
      elif fid == 2:
        if ftype == TType.LIST:
          self.validationResultList = []
          (_etype87, _size84) = iprot.readListBegin()
          for _i88 in xrange(_size84):
            _elem89 = ValidatorResult()
            _elem89.read(iprot)
            self.validationResultList.append(_elem89)
          iprot.readListEnd()
        else:
          iprot.skip(ftype)
      else:
        iprot.skip(ftype)
      iprot.readFieldEnd()
    iprot.readStructEnd()

  def write(self, oprot):
    if oprot.__class__ == TBinaryProtocol.TBinaryProtocolAccelerated and self.thrift_spec is not None and fastbinary is not None:
      oprot.trans.write(fastbinary.encode_binary(self, (self.__class__, self.thrift_spec)))
      return
    oprot.writeStructBegin('ValidationResults')
    if self.validationState is not None:
      oprot.writeFieldBegin('validationState', TType.BOOL, 1)
      oprot.writeBool(self.validationState)
      oprot.writeFieldEnd()
    if self.validationResultList is not None:
      oprot.writeFieldBegin('validationResultList', TType.LIST, 2)
      oprot.writeListBegin(TType.STRUCT, len(self.validationResultList))
      for iter90 in self.validationResultList:
        iter90.write(oprot)
      oprot.writeListEnd()
      oprot.writeFieldEnd()
    oprot.writeFieldStop()
    oprot.writeStructEnd()

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


  def __hash__(self):
    value = 17
    value = (value * 31) ^ hash(self.validationState)
    value = (value * 31) ^ hash(self.validationResultList)
    return value

  def __repr__(self):
    L = ['%s=%r' % (key, value)
      for key, value in self.__dict__.iteritems()]
    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 Experiment:
  """
  A structure holding the experiment metadata and its child models.

  userName:
    The user name of the targeted gateway end user on whose behalf the experiment is being created.
      the associated gateway identity can only be inferred from the security hand-shake so as to avoid
      authorized Airavata Clients mimicking an unauthorized request. If a gateway is not registered with
      Airavata, an authorization exception is thrown.

  experimentName:
    The name of the experiment as defined by the user. The name need not be unique as uniqueness is enforced
       by the generated experiment id.

  experimentDescription:
     The verbose description of the experiment. This is an optional parameter.

  Attributes:
   - experimentID
   - projectID
   - creationTime
   - userName
   - name
   - description
   - applicationId
   - applicationVersion
   - workflowTemplateId
   - workflowTemplateVersion
   - gatewayExecutionId
   - enableEmailNotification
   - emailAddresses
   - userConfigurationData
   - workflowExecutionInstanceId
   - experimentInputs
   - experimentOutputs
   - experimentStatus
   - stateChangeList
   - workflowNodeDetailsList
   - errors
  """

  thrift_spec = (
    None, # 0
    (1, TType.STRING, 'experimentID', None, "DO_NOT_SET_AT_CLIENTS", ), # 1
    (2, TType.STRING, 'projectID', None, "DEFAULT", ), # 2
    (3, TType.I64, 'creationTime', None, None, ), # 3
    (4, TType.STRING, 'userName', None, None, ), # 4
    (5, TType.STRING, 'name', None, None, ), # 5
    (6, TType.STRING, 'description', None, None, ), # 6
    (7, TType.STRING, 'applicationId', None, None, ), # 7
    (8, TType.STRING, 'applicationVersion', None, None, ), # 8
    (9, TType.STRING, 'workflowTemplateId', None, None, ), # 9
    (10, TType.STRING, 'workflowTemplateVersion', None, None, ), # 10
    (11, TType.STRING, 'gatewayExecutionId', None, None, ), # 11
    (12, TType.BOOL, 'enableEmailNotification', None, None, ), # 12
    (13, TType.LIST, 'emailAddresses', (TType.STRING,None), None, ), # 13
    (14, TType.STRUCT, 'userConfigurationData', (UserConfigurationData, UserConfigurationData.thrift_spec), None, ), # 14
    (15, TType.STRING, 'workflowExecutionInstanceId', None, None, ), # 15
    (16, TType.LIST, 'experimentInputs', (TType.STRUCT,(apache.airavata.model.appcatalog.appinterface.ttypes.InputDataObjectType, apache.airavata.model.appcatalog.appinterface.ttypes.InputDataObjectType.thrift_spec)), None, ), # 16
    (17, TType.LIST, 'experimentOutputs', (TType.STRUCT,(apache.airavata.model.appcatalog.appinterface.ttypes.OutputDataObjectType, apache.airavata.model.appcatalog.appinterface.ttypes.OutputDataObjectType.thrift_spec)), None, ), # 17
    (18, TType.STRUCT, 'experimentStatus', (ExperimentStatus, ExperimentStatus.thrift_spec), None, ), # 18
    (19, TType.LIST, 'stateChangeList', (TType.STRUCT,(WorkflowNodeStatus, WorkflowNodeStatus.thrift_spec)), None, ), # 19
    (20, TType.LIST, 'workflowNodeDetailsList', (TType.STRUCT,(WorkflowNodeDetails, WorkflowNodeDetails.thrift_spec)), None, ), # 20
    (21, TType.LIST, 'errors', (TType.STRUCT,(ErrorDetails, ErrorDetails.thrift_spec)), None, ), # 21
  )

  def __init__(self, experimentID=thrift_spec[1][4], projectID=thrift_spec[2][4], creationTime=None, userName=None, name=None, description=None, applicationId=None, applicationVersion=None, workflowTemplateId=None, workflowTemplateVersion=None, gatewayExecutionId=None, enableEmailNotification=None, emailAddresses=None, userConfigurationData=None, workflowExecutionInstanceId=None, experimentInputs=None, experimentOutputs=None, experimentStatus=None, stateChangeList=None, workflowNodeDetailsList=None, errors=None,):
    self.experimentID = experimentID
    self.projectID = projectID
    self.creationTime = creationTime
    self.userName = userName
    self.name = name
    self.description = description
    self.applicationId = applicationId
    self.applicationVersion = applicationVersion
    self.workflowTemplateId = workflowTemplateId
    self.workflowTemplateVersion = workflowTemplateVersion
    self.gatewayExecutionId = gatewayExecutionId
    self.enableEmailNotification = enableEmailNotification
    self.emailAddresses = emailAddresses
    self.userConfigurationData = userConfigurationData
    self.workflowExecutionInstanceId = workflowExecutionInstanceId
    self.experimentInputs = experimentInputs
    self.experimentOutputs = experimentOutputs
    self.experimentStatus = experimentStatus
    self.stateChangeList = stateChangeList
    self.workflowNodeDetailsList = workflowNodeDetailsList
    self.errors = errors

  def read(self, iprot):
    if iprot.__class__ == TBinaryProtocol.TBinaryProtocolAccelerated and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None and fastbinary is not None:
      fastbinary.decode_binary(self, iprot.trans, (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.experimentID = iprot.readString();
        else:
          iprot.skip(ftype)
      elif fid == 2:
        if ftype == TType.STRING:
          self.projectID = iprot.readString();
        else:
          iprot.skip(ftype)
      elif fid == 3:
        if ftype == TType.I64:
          self.creationTime = iprot.readI64();
        else:
          iprot.skip(ftype)
      elif fid == 4:
        if ftype == TType.STRING:
          self.userName = iprot.readString();
        else:
          iprot.skip(ftype)
      elif fid == 5:
        if ftype == TType.STRING:
          self.name = iprot.readString();
        else:
          iprot.skip(ftype)
      elif fid == 6:
        if ftype == TType.STRING:
          self.description = iprot.readString();
        else:
          iprot.skip(ftype)
      elif fid == 7:
        if ftype == TType.STRING:
          self.applicationId = iprot.readString();
        else:
          iprot.skip(ftype)
      elif fid == 8:
        if ftype == TType.STRING:
          self.applicationVersion = iprot.readString();
        else:
          iprot.skip(ftype)
      elif fid == 9:
        if ftype == TType.STRING:
          self.workflowTemplateId = iprot.readString();
        else:
          iprot.skip(ftype)
      elif fid == 10:
        if ftype == TType.STRING:
          self.workflowTemplateVersion = iprot.readString();
        else:
          iprot.skip(ftype)
      elif fid == 11:
        if ftype == TType.STRING:
          self.gatewayExecutionId = iprot.readString();
        else:
          iprot.skip(ftype)
      elif fid == 12:
        if ftype == TType.BOOL:
          self.enableEmailNotification = iprot.readBool();
        else:
          iprot.skip(ftype)
      elif fid == 13:
        if ftype == TType.LIST:
          self.emailAddresses = []
          (_etype94, _size91) = iprot.readListBegin()
          for _i95 in xrange(_size91):
            _elem96 = iprot.readString();
            self.emailAddresses.append(_elem96)
          iprot.readListEnd()
        else:
          iprot.skip(ftype)
      elif fid == 14:
        if ftype == TType.STRUCT:
          self.userConfigurationData = UserConfigurationData()
          self.userConfigurationData.read(iprot)
        else:
          iprot.skip(ftype)
      elif fid == 15:
        if ftype == TType.STRING:
          self.workflowExecutionInstanceId = iprot.readString();
        else:
          iprot.skip(ftype)
      elif fid == 16:
        if ftype == TType.LIST:
          self.experimentInputs = []
          (_etype100, _size97) = iprot.readListBegin()
          for _i101 in xrange(_size97):
            _elem102 = apache.airavata.model.appcatalog.appinterface.ttypes.InputDataObjectType()
            _elem102.read(iprot)
            self.experimentInputs.append(_elem102)
          iprot.readListEnd()
        else:
          iprot.skip(ftype)
      elif fid == 17:
        if ftype == TType.LIST:
          self.experimentOutputs = []
          (_etype106, _size103) = iprot.readListBegin()
          for _i107 in xrange(_size103):
            _elem108 = apache.airavata.model.appcatalog.appinterface.ttypes.OutputDataObjectType()
            _elem108.read(iprot)
            self.experimentOutputs.append(_elem108)
          iprot.readListEnd()
        else:
          iprot.skip(ftype)
      elif fid == 18:
        if ftype == TType.STRUCT:
          self.experimentStatus = ExperimentStatus()
          self.experimentStatus.read(iprot)
        else:
          iprot.skip(ftype)
      elif fid == 19:
        if ftype == TType.LIST:
          self.stateChangeList = []
          (_etype112, _size109) = iprot.readListBegin()
          for _i113 in xrange(_size109):
            _elem114 = WorkflowNodeStatus()
            _elem114.read(iprot)
            self.stateChangeList.append(_elem114)
          iprot.readListEnd()
        else:
          iprot.skip(ftype)
      elif fid == 20:
        if ftype == TType.LIST:
          self.workflowNodeDetailsList = []
          (_etype118, _size115) = iprot.readListBegin()
          for _i119 in xrange(_size115):
            _elem120 = WorkflowNodeDetails()
            _elem120.read(iprot)
            self.workflowNodeDetailsList.append(_elem120)
          iprot.readListEnd()
        else:
          iprot.skip(ftype)
      elif fid == 21:
        if ftype == TType.LIST:
          self.errors = []
          (_etype124, _size121) = iprot.readListBegin()
          for _i125 in xrange(_size121):
            _elem126 = ErrorDetails()
            _elem126.read(iprot)
            self.errors.append(_elem126)
          iprot.readListEnd()
        else:
          iprot.skip(ftype)
      else:
        iprot.skip(ftype)
      iprot.readFieldEnd()
    iprot.readStructEnd()

  def write(self, oprot):
    if oprot.__class__ == TBinaryProtocol.TBinaryProtocolAccelerated and self.thrift_spec is not None and fastbinary is not None:
      oprot.trans.write(fastbinary.encode_binary(self, (self.__class__, self.thrift_spec)))
      return
    oprot.writeStructBegin('Experiment')
    if self.experimentID is not None:
      oprot.writeFieldBegin('experimentID', TType.STRING, 1)
      oprot.writeString(self.experimentID)
      oprot.writeFieldEnd()
    if self.projectID is not None:
      oprot.writeFieldBegin('projectID', TType.STRING, 2)
      oprot.writeString(self.projectID)
      oprot.writeFieldEnd()
    if self.creationTime is not None:
      oprot.writeFieldBegin('creationTime', TType.I64, 3)
      oprot.writeI64(self.creationTime)
      oprot.writeFieldEnd()
    if self.userName is not None:
      oprot.writeFieldBegin('userName', TType.STRING, 4)
      oprot.writeString(self.userName)
      oprot.writeFieldEnd()
    if self.name is not None:
      oprot.writeFieldBegin('name', TType.STRING, 5)
      oprot.writeString(self.name)
      oprot.writeFieldEnd()
    if self.description is not None:
      oprot.writeFieldBegin('description', TType.STRING, 6)
      oprot.writeString(self.description)
      oprot.writeFieldEnd()
    if self.applicationId is not None:
      oprot.writeFieldBegin('applicationId', TType.STRING, 7)
      oprot.writeString(self.applicationId)
      oprot.writeFieldEnd()
    if self.applicationVersion is not None:
      oprot.writeFieldBegin('applicationVersion', TType.STRING, 8)
      oprot.writeString(self.applicationVersion)
      oprot.writeFieldEnd()
    if self.workflowTemplateId is not None:
      oprot.writeFieldBegin('workflowTemplateId', TType.STRING, 9)
      oprot.writeString(self.workflowTemplateId)
      oprot.writeFieldEnd()
    if self.workflowTemplateVersion is not None:
      oprot.writeFieldBegin('workflowTemplateVersion', TType.STRING, 10)
      oprot.writeString(self.workflowTemplateVersion)
      oprot.writeFieldEnd()
    if self.gatewayExecutionId is not None:
      oprot.writeFieldBegin('gatewayExecutionId', TType.STRING, 11)
      oprot.writeString(self.gatewayExecutionId)
      oprot.writeFieldEnd()
    if self.enableEmailNotification is not None:
      oprot.writeFieldBegin('enableEmailNotification', TType.BOOL, 12)
      oprot.writeBool(self.enableEmailNotification)
      oprot.writeFieldEnd()
    if self.emailAddresses is not None:
      oprot.writeFieldBegin('emailAddresses', TType.LIST, 13)
      oprot.writeListBegin(TType.STRING, len(self.emailAddresses))
      for iter127 in self.emailAddresses:
        oprot.writeString(iter127)
      oprot.writeListEnd()
      oprot.writeFieldEnd()
    if self.userConfigurationData is not None:
      oprot.writeFieldBegin('userConfigurationData', TType.STRUCT, 14)
      self.userConfigurationData.write(oprot)
      oprot.writeFieldEnd()
    if self.workflowExecutionInstanceId is not None:
      oprot.writeFieldBegin('workflowExecutionInstanceId', TType.STRING, 15)
      oprot.writeString(self.workflowExecutionInstanceId)
      oprot.writeFieldEnd()
    if self.experimentInputs is not None:
      oprot.writeFieldBegin('experimentInputs', TType.LIST, 16)
      oprot.writeListBegin(TType.STRUCT, len(self.experimentInputs))
      for iter128 in self.experimentInputs:
        iter128.write(oprot)
      oprot.writeListEnd()
      oprot.writeFieldEnd()
    if self.experimentOutputs is not None:
      oprot.writeFieldBegin('experimentOutputs', TType.LIST, 17)
      oprot.writeListBegin(TType.STRUCT, len(self.experimentOutputs))
      for iter129 in self.experimentOutputs:
        iter129.write(oprot)
      oprot.writeListEnd()
      oprot.writeFieldEnd()
    if self.experimentStatus is not None:
      oprot.writeFieldBegin('experimentStatus', TType.STRUCT, 18)
      self.experimentStatus.write(oprot)
      oprot.writeFieldEnd()
    if self.stateChangeList is not None:
      oprot.writeFieldBegin('stateChangeList', TType.LIST, 19)
      oprot.writeListBegin(TType.STRUCT, len(self.stateChangeList))
      for iter130 in self.stateChangeList:
        iter130.write(oprot)
      oprot.writeListEnd()
      oprot.writeFieldEnd()
    if self.workflowNodeDetailsList is not None:
      oprot.writeFieldBegin('workflowNodeDetailsList', TType.LIST, 20)
      oprot.writeListBegin(TType.STRUCT, len(self.workflowNodeDetailsList))
      for iter131 in self.workflowNodeDetailsList:
        iter131.write(oprot)
      oprot.writeListEnd()
      oprot.writeFieldEnd()
    if self.errors is not None:
      oprot.writeFieldBegin('errors', TType.LIST, 21)
      oprot.writeListBegin(TType.STRUCT, len(self.errors))
      for iter132 in self.errors:
        iter132.write(oprot)
      oprot.writeListEnd()
      oprot.writeFieldEnd()
    oprot.writeFieldStop()
    oprot.writeStructEnd()

  def validate(self):
    if self.experimentID is None:
      raise TProtocol.TProtocolException(message='Required field experimentID is unset!')
    if self.projectID is None:
      raise TProtocol.TProtocolException(message='Required field projectID is unset!')
    if self.userName is None:
      raise TProtocol.TProtocolException(message='Required field userName is unset!')
    if self.name is None:
      raise TProtocol.TProtocolException(message='Required field name is unset!')
    return


  def __hash__(self):
    value = 17
    value = (value * 31) ^ hash(self.experimentID)
    value = (value * 31) ^ hash(self.projectID)
    value = (value * 31) ^ hash(self.creationTime)
    value = (value * 31) ^ hash(self.userName)
    value = (value * 31) ^ hash(self.name)
    value = (value * 31) ^ hash(self.description)
    value = (value * 31) ^ hash(self.applicationId)
    value = (value * 31) ^ hash(self.applicationVersion)
    value = (value * 31) ^ hash(self.workflowTemplateId)
    value = (value * 31) ^ hash(self.workflowTemplateVersion)
    value = (value * 31) ^ hash(self.gatewayExecutionId)
    value = (value * 31) ^ hash(self.enableEmailNotification)
    value = (value * 31) ^ hash(self.emailAddresses)
    value = (value * 31) ^ hash(self.userConfigurationData)
    value = (value * 31) ^ hash(self.workflowExecutionInstanceId)
    value = (value * 31) ^ hash(self.experimentInputs)
    value = (value * 31) ^ hash(self.experimentOutputs)
    value = (value * 31) ^ hash(self.experimentStatus)
    value = (value * 31) ^ hash(self.stateChangeList)
    value = (value * 31) ^ hash(self.workflowNodeDetailsList)
    value = (value * 31) ^ hash(self.errors)
    return value

  def __repr__(self):
    L = ['%s=%r' % (key, value)
      for key, value in self.__dict__.iteritems()]
    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 ExperimentSummary:
  """
  Attributes:
   - experimentID
   - projectID
   - creationTime
   - userName
   - name
   - description
   - applicationId
   - experimentStatus
  """

  thrift_spec = (
    None, # 0
    (1, TType.STRING, 'experimentID', None, None, ), # 1
    (2, TType.STRING, 'projectID', None, None, ), # 2
    (3, TType.I64, 'creationTime', None, None, ), # 3
    (4, TType.STRING, 'userName', None, None, ), # 4
    (5, TType.STRING, 'name', None, None, ), # 5
    (6, TType.STRING, 'description', None, None, ), # 6
    (7, TType.STRING, 'applicationId', None, None, ), # 7
    (8, TType.STRUCT, 'experimentStatus', (ExperimentStatus, ExperimentStatus.thrift_spec), None, ), # 8
  )

  def __init__(self, experimentID=None, projectID=None, creationTime=None, userName=None, name=None, description=None, applicationId=None, experimentStatus=None,):
    self.experimentID = experimentID
    self.projectID = projectID
    self.creationTime = creationTime
    self.userName = userName
    self.name = name
    self.description = description
    self.applicationId = applicationId
    self.experimentStatus = experimentStatus

  def read(self, iprot):
    if iprot.__class__ == TBinaryProtocol.TBinaryProtocolAccelerated and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None and fastbinary is not None:
      fastbinary.decode_binary(self, iprot.trans, (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.experimentID = iprot.readString();
        else:
          iprot.skip(ftype)
      elif fid == 2:
        if ftype == TType.STRING:
          self.projectID = iprot.readString();
        else:
          iprot.skip(ftype)
      elif fid == 3:
        if ftype == TType.I64:
          self.creationTime = iprot.readI64();
        else:
          iprot.skip(ftype)
      elif fid == 4:
        if ftype == TType.STRING:
          self.userName = iprot.readString();
        else:
          iprot.skip(ftype)
      elif fid == 5:
        if ftype == TType.STRING:
          self.name = iprot.readString();
        else:
          iprot.skip(ftype)
      elif fid == 6:
        if ftype == TType.STRING:
          self.description = iprot.readString();
        else:
          iprot.skip(ftype)
      elif fid == 7:
        if ftype == TType.STRING:
          self.applicationId = iprot.readString();
        else:
          iprot.skip(ftype)
      elif fid == 8:
        if ftype == TType.STRUCT:
          self.experimentStatus = ExperimentStatus()
          self.experimentStatus.read(iprot)
        else:
          iprot.skip(ftype)
      else:
        iprot.skip(ftype)
      iprot.readFieldEnd()
    iprot.readStructEnd()

  def write(self, oprot):
    if oprot.__class__ == TBinaryProtocol.TBinaryProtocolAccelerated and self.thrift_spec is not None and fastbinary is not None:
      oprot.trans.write(fastbinary.encode_binary(self, (self.__class__, self.thrift_spec)))
      return
    oprot.writeStructBegin('ExperimentSummary')
    if self.experimentID is not None:
      oprot.writeFieldBegin('experimentID', TType.STRING, 1)
      oprot.writeString(self.experimentID)
      oprot.writeFieldEnd()
    if self.projectID is not None:
      oprot.writeFieldBegin('projectID', TType.STRING, 2)
      oprot.writeString(self.projectID)
      oprot.writeFieldEnd()
    if self.creationTime is not None:
      oprot.writeFieldBegin('creationTime', TType.I64, 3)
      oprot.writeI64(self.creationTime)
      oprot.writeFieldEnd()
    if self.userName is not None:
      oprot.writeFieldBegin('userName', TType.STRING, 4)
      oprot.writeString(self.userName)
      oprot.writeFieldEnd()
    if self.name is not None:
      oprot.writeFieldBegin('name', TType.STRING, 5)
      oprot.writeString(self.name)
      oprot.writeFieldEnd()
    if self.description is not None:
      oprot.writeFieldBegin('description', TType.STRING, 6)
      oprot.writeString(self.description)
      oprot.writeFieldEnd()
    if self.applicationId is not None:
      oprot.writeFieldBegin('applicationId', TType.STRING, 7)
      oprot.writeString(self.applicationId)
      oprot.writeFieldEnd()
    if self.experimentStatus is not None:
      oprot.writeFieldBegin('experimentStatus', TType.STRUCT, 8)
      self.experimentStatus.write(oprot)
      oprot.writeFieldEnd()
    oprot.writeFieldStop()
    oprot.writeStructEnd()

  def validate(self):
    if self.experimentID is None:
      raise TProtocol.TProtocolException(message='Required field experimentID is unset!')
    if self.projectID is None:
      raise TProtocol.TProtocolException(message='Required field projectID is unset!')
    if self.userName is None:
      raise TProtocol.TProtocolException(message='Required field userName is unset!')
    if self.name is None:
      raise TProtocol.TProtocolException(message='Required field name is unset!')
    return


  def __hash__(self):
    value = 17
    value = (value * 31) ^ hash(self.experimentID)
    value = (value * 31) ^ hash(self.projectID)
    value = (value * 31) ^ hash(self.creationTime)
    value = (value * 31) ^ hash(self.userName)
    value = (value * 31) ^ hash(self.name)
    value = (value * 31) ^ hash(self.description)
    value = (value * 31) ^ hash(self.applicationId)
    value = (value * 31) ^ hash(self.experimentStatus)
    return value

  def __repr__(self):
    L = ['%s=%r' % (key, value)
      for key, value in self.__dict__.iteritems()]
    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 ExperimentStatistics:
  """
  Attributes:
   - allExperimentCount
   - completedExperimentCount
   - cancelledExperimentCount
   - failedExperimentCount
   - allExperiments
   - completedExperiments
   - failedExperiments
   - cancelledExperiments
  """

  thrift_spec = (
    None, # 0
    (1, TType.I32, 'allExperimentCount', None, None, ), # 1
    (2, TType.I32, 'completedExperimentCount', None, None, ), # 2
    (3, TType.I32, 'cancelledExperimentCount', None, None, ), # 3
    (4, TType.I32, 'failedExperimentCount', None, None, ), # 4
    (5, TType.LIST, 'allExperiments', (TType.STRUCT,(ExperimentSummary, ExperimentSummary.thrift_spec)), None, ), # 5
    (6, TType.LIST, 'completedExperiments', (TType.STRUCT,(ExperimentSummary, ExperimentSummary.thrift_spec)), None, ), # 6
    (7, TType.LIST, 'failedExperiments', (TType.STRUCT,(ExperimentSummary, ExperimentSummary.thrift_spec)), None, ), # 7
    (8, TType.LIST, 'cancelledExperiments', (TType.STRUCT,(ExperimentSummary, ExperimentSummary.thrift_spec)), None, ), # 8
  )

  def __init__(self, allExperimentCount=None, completedExperimentCount=None, cancelledExperimentCount=None, failedExperimentCount=None, allExperiments=None, completedExperiments=None, failedExperiments=None, cancelledExperiments=None,):
    self.allExperimentCount = allExperimentCount
    self.completedExperimentCount = completedExperimentCount
    self.cancelledExperimentCount = cancelledExperimentCount
    self.failedExperimentCount = failedExperimentCount
    self.allExperiments = allExperiments
    self.completedExperiments = completedExperiments
    self.failedExperiments = failedExperiments
    self.cancelledExperiments = cancelledExperiments

  def read(self, iprot):
    if iprot.__class__ == TBinaryProtocol.TBinaryProtocolAccelerated and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None and fastbinary is not None:
      fastbinary.decode_binary(self, iprot.trans, (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.I32:
          self.allExperimentCount = iprot.readI32();
        else:
          iprot.skip(ftype)
      elif fid == 2:
        if ftype == TType.I32:
          self.completedExperimentCount = iprot.readI32();
        else:
          iprot.skip(ftype)
      elif fid == 3:
        if ftype == TType.I32:
          self.cancelledExperimentCount = iprot.readI32();
        else:
          iprot.skip(ftype)
      elif fid == 4:
        if ftype == TType.I32:
          self.failedExperimentCount = iprot.readI32();
        else:
          iprot.skip(ftype)
      elif fid == 5:
        if ftype == TType.LIST:
          self.allExperiments = []
          (_etype136, _size133) = iprot.readListBegin()
          for _i137 in xrange(_size133):
            _elem138 = ExperimentSummary()
            _elem138.read(iprot)
            self.allExperiments.append(_elem138)
          iprot.readListEnd()
        else:
          iprot.skip(ftype)
      elif fid == 6:
        if ftype == TType.LIST:
          self.completedExperiments = []
          (_etype142, _size139) = iprot.readListBegin()
          for _i143 in xrange(_size139):
            _elem144 = ExperimentSummary()
            _elem144.read(iprot)
            self.completedExperiments.append(_elem144)
          iprot.readListEnd()
        else:
          iprot.skip(ftype)
      elif fid == 7:
        if ftype == TType.LIST:
          self.failedExperiments = []
          (_etype148, _size145) = iprot.readListBegin()
          for _i149 in xrange(_size145):
            _elem150 = ExperimentSummary()
            _elem150.read(iprot)
            self.failedExperiments.append(_elem150)
          iprot.readListEnd()
        else:
          iprot.skip(ftype)
      elif fid == 8:
        if ftype == TType.LIST:
          self.cancelledExperiments = []
          (_etype154, _size151) = iprot.readListBegin()
          for _i155 in xrange(_size151):
            _elem156 = ExperimentSummary()
            _elem156.read(iprot)
            self.cancelledExperiments.append(_elem156)
          iprot.readListEnd()
        else:
          iprot.skip(ftype)
      else:
        iprot.skip(ftype)
      iprot.readFieldEnd()
    iprot.readStructEnd()

  def write(self, oprot):
    if oprot.__class__ == TBinaryProtocol.TBinaryProtocolAccelerated and self.thrift_spec is not None and fastbinary is not None:
      oprot.trans.write(fastbinary.encode_binary(self, (self.__class__, self.thrift_spec)))
      return
    oprot.writeStructBegin('ExperimentStatistics')
    if self.allExperimentCount is not None:
      oprot.writeFieldBegin('allExperimentCount', TType.I32, 1)
      oprot.writeI32(self.allExperimentCount)
      oprot.writeFieldEnd()
    if self.completedExperimentCount is not None:
      oprot.writeFieldBegin('completedExperimentCount', TType.I32, 2)
      oprot.writeI32(self.completedExperimentCount)
      oprot.writeFieldEnd()
    if self.cancelledExperimentCount is not None:
      oprot.writeFieldBegin('cancelledExperimentCount', TType.I32, 3)
      oprot.writeI32(self.cancelledExperimentCount)
      oprot.writeFieldEnd()
    if self.failedExperimentCount is not None:
      oprot.writeFieldBegin('failedExperimentCount', TType.I32, 4)
      oprot.writeI32(self.failedExperimentCount)
      oprot.writeFieldEnd()
    if self.allExperiments is not None:
      oprot.writeFieldBegin('allExperiments', TType.LIST, 5)
      oprot.writeListBegin(TType.STRUCT, len(self.allExperiments))
      for iter157 in self.allExperiments:
        iter157.write(oprot)
      oprot.writeListEnd()
      oprot.writeFieldEnd()
    if self.completedExperiments is not None:
      oprot.writeFieldBegin('completedExperiments', TType.LIST, 6)
      oprot.writeListBegin(TType.STRUCT, len(self.completedExperiments))
      for iter158 in self.completedExperiments:
        iter158.write(oprot)
      oprot.writeListEnd()
      oprot.writeFieldEnd()
    if self.failedExperiments is not None:
      oprot.writeFieldBegin('failedExperiments', TType.LIST, 7)
      oprot.writeListBegin(TType.STRUCT, len(self.failedExperiments))
      for iter159 in self.failedExperiments:
        iter159.write(oprot)
      oprot.writeListEnd()
      oprot.writeFieldEnd()
    if self.cancelledExperiments is not None:
      oprot.writeFieldBegin('cancelledExperiments', TType.LIST, 8)
      oprot.writeListBegin(TType.STRUCT, len(self.cancelledExperiments))
      for iter160 in self.cancelledExperiments:
        iter160.write(oprot)
      oprot.writeListEnd()
      oprot.writeFieldEnd()
    oprot.writeFieldStop()
    oprot.writeStructEnd()

  def validate(self):
    if self.allExperimentCount is None:
      raise TProtocol.TProtocolException(message='Required field allExperimentCount is unset!')
    if self.completedExperimentCount is None:
      raise TProtocol.TProtocolException(message='Required field completedExperimentCount is unset!')
    if self.failedExperimentCount is None:
      raise TProtocol.TProtocolException(message='Required field failedExperimentCount is unset!')
    if self.allExperiments is None:
      raise TProtocol.TProtocolException(message='Required field allExperiments is unset!')
    return


  def __hash__(self):
    value = 17
    value = (value * 31) ^ hash(self.allExperimentCount)
    value = (value * 31) ^ hash(self.completedExperimentCount)
    value = (value * 31) ^ hash(self.cancelledExperimentCount)
    value = (value * 31) ^ hash(self.failedExperimentCount)
    value = (value * 31) ^ hash(self.allExperiments)
    value = (value * 31) ^ hash(self.completedExperiments)
    value = (value * 31) ^ hash(self.failedExperiments)
    value = (value * 31) ^ hash(self.cancelledExperiments)
    return value

  def __repr__(self):
    L = ['%s=%r' % (key, value)
      for key, value in self.__dict__.iteritems()]
    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)
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -



Interacting_with_Airavata_using_ipython_Notebook/create-experiment/apache/airavata/model/workspace/experiment/ttypes.py [16:3474]:
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
try:
  from thrift.protocol import fastbinary
except:
  fastbinary = None


class ExperimentState:
  CREATED = 0
  VALIDATED = 1
  SCHEDULED = 2
  LAUNCHED = 3
  EXECUTING = 4
  CANCELING = 5
  CANCELED = 6
  SUSPENDED = 7
  COMPLETED = 8
  FAILED = 9
  UNKNOWN = 10

  _VALUES_TO_NAMES = {
    0: "CREATED",
    1: "VALIDATED",
    2: "SCHEDULED",
    3: "LAUNCHED",
    4: "EXECUTING",
    5: "CANCELING",
    6: "CANCELED",
    7: "SUSPENDED",
    8: "COMPLETED",
    9: "FAILED",
    10: "UNKNOWN",
  }

  _NAMES_TO_VALUES = {
    "CREATED": 0,
    "VALIDATED": 1,
    "SCHEDULED": 2,
    "LAUNCHED": 3,
    "EXECUTING": 4,
    "CANCELING": 5,
    "CANCELED": 6,
    "SUSPENDED": 7,
    "COMPLETED": 8,
    "FAILED": 9,
    "UNKNOWN": 10,
  }

class ExperimentSearchFields:
  EXPERIMENT_NAME = 0
  EXPERIMENT_DESC = 1
  APPLICATION_ID = 2
  FROM_DATE = 3
  TO_DATE = 4
  STATUS = 5

  _VALUES_TO_NAMES = {
    0: "EXPERIMENT_NAME",
    1: "EXPERIMENT_DESC",
    2: "APPLICATION_ID",
    3: "FROM_DATE",
    4: "TO_DATE",
    5: "STATUS",
  }

  _NAMES_TO_VALUES = {
    "EXPERIMENT_NAME": 0,
    "EXPERIMENT_DESC": 1,
    "APPLICATION_ID": 2,
    "FROM_DATE": 3,
    "TO_DATE": 4,
    "STATUS": 5,
  }

class WorkflowNodeState:
  INVOKED = 0
  EXECUTING = 1
  CANCELING = 2
  CANCELED = 3
  SUSPENDED = 4
  COMPLETED = 5
  FAILED = 6
  UNKNOWN = 7

  _VALUES_TO_NAMES = {
    0: "INVOKED",
    1: "EXECUTING",
    2: "CANCELING",
    3: "CANCELED",
    4: "SUSPENDED",
    5: "COMPLETED",
    6: "FAILED",
    7: "UNKNOWN",
  }

  _NAMES_TO_VALUES = {
    "INVOKED": 0,
    "EXECUTING": 1,
    "CANCELING": 2,
    "CANCELED": 3,
    "SUSPENDED": 4,
    "COMPLETED": 5,
    "FAILED": 6,
    "UNKNOWN": 7,
  }

class TaskState:
  WAITING = 0
  STARTED = 1
  PRE_PROCESSING = 2
  CONFIGURING_WORKSPACE = 3
  INPUT_DATA_STAGING = 4
  OUTPUT_DATA_STAGING = 5
  POST_PROCESSING = 6
  EXECUTING = 7
  CANCELING = 8
  CANCELED = 9
  COMPLETED = 10
  FAILED = 11
  UNKNOWN = 12

  _VALUES_TO_NAMES = {
    0: "WAITING",
    1: "STARTED",
    2: "PRE_PROCESSING",
    3: "CONFIGURING_WORKSPACE",
    4: "INPUT_DATA_STAGING",
    5: "OUTPUT_DATA_STAGING",
    6: "POST_PROCESSING",
    7: "EXECUTING",
    8: "CANCELING",
    9: "CANCELED",
    10: "COMPLETED",
    11: "FAILED",
    12: "UNKNOWN",
  }

  _NAMES_TO_VALUES = {
    "WAITING": 0,
    "STARTED": 1,
    "PRE_PROCESSING": 2,
    "CONFIGURING_WORKSPACE": 3,
    "INPUT_DATA_STAGING": 4,
    "OUTPUT_DATA_STAGING": 5,
    "POST_PROCESSING": 6,
    "EXECUTING": 7,
    "CANCELING": 8,
    "CANCELED": 9,
    "COMPLETED": 10,
    "FAILED": 11,
    "UNKNOWN": 12,
  }

class JobState:
  SUBMITTED = 0
  UN_SUBMITTED = 1
  SETUP = 2
  QUEUED = 3
  ACTIVE = 4
  COMPLETE = 5
  CANCELING = 6
  CANCELED = 7
  FAILED = 8
  HELD = 9
  SUSPENDED = 10
  UNKNOWN = 11

  _VALUES_TO_NAMES = {
    0: "SUBMITTED",
    1: "UN_SUBMITTED",
    2: "SETUP",
    3: "QUEUED",
    4: "ACTIVE",
    5: "COMPLETE",
    6: "CANCELING",
    7: "CANCELED",
    8: "FAILED",
    9: "HELD",
    10: "SUSPENDED",
    11: "UNKNOWN",
  }

  _NAMES_TO_VALUES = {
    "SUBMITTED": 0,
    "UN_SUBMITTED": 1,
    "SETUP": 2,
    "QUEUED": 3,
    "ACTIVE": 4,
    "COMPLETE": 5,
    "CANCELING": 6,
    "CANCELED": 7,
    "FAILED": 8,
    "HELD": 9,
    "SUSPENDED": 10,
    "UNKNOWN": 11,
  }

class TransferState:
  DIRECTORY_SETUP = 0
  UPLOAD = 1
  DOWNLOAD = 2
  ACTIVE = 3
  COMPLETE = 4
  STDOUT_DOWNLOAD = 5
  STDERROR_DOWNLOAD = 6
  CANCELING = 7
  CANCELED = 8
  FAILED = 9
  HELD = 10
  SUSPENDED = 11
  UNKNOWN = 12

  _VALUES_TO_NAMES = {
    0: "DIRECTORY_SETUP",
    1: "UPLOAD",
    2: "DOWNLOAD",
    3: "ACTIVE",
    4: "COMPLETE",
    5: "STDOUT_DOWNLOAD",
    6: "STDERROR_DOWNLOAD",
    7: "CANCELING",
    8: "CANCELED",
    9: "FAILED",
    10: "HELD",
    11: "SUSPENDED",
    12: "UNKNOWN",
  }

  _NAMES_TO_VALUES = {
    "DIRECTORY_SETUP": 0,
    "UPLOAD": 1,
    "DOWNLOAD": 2,
    "ACTIVE": 3,
    "COMPLETE": 4,
    "STDOUT_DOWNLOAD": 5,
    "STDERROR_DOWNLOAD": 6,
    "CANCELING": 7,
    "CANCELED": 8,
    "FAILED": 9,
    "HELD": 10,
    "SUSPENDED": 11,
    "UNKNOWN": 12,
  }

class ActionableGroup:
  RESOURCE_ADMINS = 0
  AIRAVATA_ADMINS = 1
  GATEWAYS_ADMINS = 2
  USER = 3
  CANNOT_BE_DETERMINED = 4

  _VALUES_TO_NAMES = {
    0: "RESOURCE_ADMINS",
    1: "AIRAVATA_ADMINS",
    2: "GATEWAYS_ADMINS",
    3: "USER",
    4: "CANNOT_BE_DETERMINED",
  }

  _NAMES_TO_VALUES = {
    "RESOURCE_ADMINS": 0,
    "AIRAVATA_ADMINS": 1,
    "GATEWAYS_ADMINS": 2,
    "USER": 3,
    "CANNOT_BE_DETERMINED": 4,
  }

class ErrorCategory:
  FILE_SYSTEM_FAILURE = 0
  APPLICATION_FAILURE = 1
  RESOURCE_NODE_FAILURE = 2
  DISK_FULL = 3
  INSUFFICIENT_ALLOCATION = 4
  SYSTEM_MAINTENANCE = 5
  AIRAVATA_INTERNAL_ERROR = 6
  CANNOT_BE_DETERMINED = 7

  _VALUES_TO_NAMES = {
    0: "FILE_SYSTEM_FAILURE",
    1: "APPLICATION_FAILURE",
    2: "RESOURCE_NODE_FAILURE",
    3: "DISK_FULL",
    4: "INSUFFICIENT_ALLOCATION",
    5: "SYSTEM_MAINTENANCE",
    6: "AIRAVATA_INTERNAL_ERROR",
    7: "CANNOT_BE_DETERMINED",
  }

  _NAMES_TO_VALUES = {
    "FILE_SYSTEM_FAILURE": 0,
    "APPLICATION_FAILURE": 1,
    "RESOURCE_NODE_FAILURE": 2,
    "DISK_FULL": 3,
    "INSUFFICIENT_ALLOCATION": 4,
    "SYSTEM_MAINTENANCE": 5,
    "AIRAVATA_INTERNAL_ERROR": 6,
    "CANNOT_BE_DETERMINED": 7,
  }

class CorrectiveAction:
  RETRY_SUBMISSION = 0
  CONTACT_SUPPORT = 1
  CANNOT_BE_DETERMINED = 2

  _VALUES_TO_NAMES = {
    0: "RETRY_SUBMISSION",
    1: "CONTACT_SUPPORT",
    2: "CANNOT_BE_DETERMINED",
  }

  _NAMES_TO_VALUES = {
    "RETRY_SUBMISSION": 0,
    "CONTACT_SUPPORT": 1,
    "CANNOT_BE_DETERMINED": 2,
  }

class ExecutionUnit:
  INPUT = 0
  APPLICATION = 1
  OUTPUT = 2
  OTHER = 3

  _VALUES_TO_NAMES = {
    0: "INPUT",
    1: "APPLICATION",
    2: "OUTPUT",
    3: "OTHER",
  }

  _NAMES_TO_VALUES = {
    "INPUT": 0,
    "APPLICATION": 1,
    "OUTPUT": 2,
    "OTHER": 3,
  }


class ExperimentStatus:
  """
  Attributes:
   - experimentState
   - timeOfStateChange
  """

  thrift_spec = (
    None, # 0
    (1, TType.I32, 'experimentState', None, None, ), # 1
    (2, TType.I64, 'timeOfStateChange', None, None, ), # 2
  )

  def __init__(self, experimentState=None, timeOfStateChange=None,):
    self.experimentState = experimentState
    self.timeOfStateChange = timeOfStateChange

  def read(self, iprot):
    if iprot.__class__ == TBinaryProtocol.TBinaryProtocolAccelerated and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None and fastbinary is not None:
      fastbinary.decode_binary(self, iprot.trans, (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.I32:
          self.experimentState = iprot.readI32();
        else:
          iprot.skip(ftype)
      elif fid == 2:
        if ftype == TType.I64:
          self.timeOfStateChange = iprot.readI64();
        else:
          iprot.skip(ftype)
      else:
        iprot.skip(ftype)
      iprot.readFieldEnd()
    iprot.readStructEnd()

  def write(self, oprot):
    if oprot.__class__ == TBinaryProtocol.TBinaryProtocolAccelerated and self.thrift_spec is not None and fastbinary is not None:
      oprot.trans.write(fastbinary.encode_binary(self, (self.__class__, self.thrift_spec)))
      return
    oprot.writeStructBegin('ExperimentStatus')
    if self.experimentState is not None:
      oprot.writeFieldBegin('experimentState', TType.I32, 1)
      oprot.writeI32(self.experimentState)
      oprot.writeFieldEnd()
    if self.timeOfStateChange is not None:
      oprot.writeFieldBegin('timeOfStateChange', TType.I64, 2)
      oprot.writeI64(self.timeOfStateChange)
      oprot.writeFieldEnd()
    oprot.writeFieldStop()
    oprot.writeStructEnd()

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


  def __hash__(self):
    value = 17
    value = (value * 31) ^ hash(self.experimentState)
    value = (value * 31) ^ hash(self.timeOfStateChange)
    return value

  def __repr__(self):
    L = ['%s=%r' % (key, value)
      for key, value in self.__dict__.iteritems()]
    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 WorkflowNodeStatus:
  """
  Attributes:
   - workflowNodeState
   - timeOfStateChange
  """

  thrift_spec = (
    None, # 0
    (1, TType.I32, 'workflowNodeState', None, None, ), # 1
    (2, TType.I64, 'timeOfStateChange', None, None, ), # 2
  )

  def __init__(self, workflowNodeState=None, timeOfStateChange=None,):
    self.workflowNodeState = workflowNodeState
    self.timeOfStateChange = timeOfStateChange

  def read(self, iprot):
    if iprot.__class__ == TBinaryProtocol.TBinaryProtocolAccelerated and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None and fastbinary is not None:
      fastbinary.decode_binary(self, iprot.trans, (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.I32:
          self.workflowNodeState = iprot.readI32();
        else:
          iprot.skip(ftype)
      elif fid == 2:
        if ftype == TType.I64:
          self.timeOfStateChange = iprot.readI64();
        else:
          iprot.skip(ftype)
      else:
        iprot.skip(ftype)
      iprot.readFieldEnd()
    iprot.readStructEnd()

  def write(self, oprot):
    if oprot.__class__ == TBinaryProtocol.TBinaryProtocolAccelerated and self.thrift_spec is not None and fastbinary is not None:
      oprot.trans.write(fastbinary.encode_binary(self, (self.__class__, self.thrift_spec)))
      return
    oprot.writeStructBegin('WorkflowNodeStatus')
    if self.workflowNodeState is not None:
      oprot.writeFieldBegin('workflowNodeState', TType.I32, 1)
      oprot.writeI32(self.workflowNodeState)
      oprot.writeFieldEnd()
    if self.timeOfStateChange is not None:
      oprot.writeFieldBegin('timeOfStateChange', TType.I64, 2)
      oprot.writeI64(self.timeOfStateChange)
      oprot.writeFieldEnd()
    oprot.writeFieldStop()
    oprot.writeStructEnd()

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


  def __hash__(self):
    value = 17
    value = (value * 31) ^ hash(self.workflowNodeState)
    value = (value * 31) ^ hash(self.timeOfStateChange)
    return value

  def __repr__(self):
    L = ['%s=%r' % (key, value)
      for key, value in self.__dict__.iteritems()]
    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 TaskStatus:
  """
  Attributes:
   - executionState
   - timeOfStateChange
  """

  thrift_spec = (
    None, # 0
    (1, TType.I32, 'executionState', None, None, ), # 1
    (2, TType.I64, 'timeOfStateChange', None, None, ), # 2
  )

  def __init__(self, executionState=None, timeOfStateChange=None,):
    self.executionState = executionState
    self.timeOfStateChange = timeOfStateChange

  def read(self, iprot):
    if iprot.__class__ == TBinaryProtocol.TBinaryProtocolAccelerated and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None and fastbinary is not None:
      fastbinary.decode_binary(self, iprot.trans, (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.I32:
          self.executionState = iprot.readI32();
        else:
          iprot.skip(ftype)
      elif fid == 2:
        if ftype == TType.I64:
          self.timeOfStateChange = iprot.readI64();
        else:
          iprot.skip(ftype)
      else:
        iprot.skip(ftype)
      iprot.readFieldEnd()
    iprot.readStructEnd()

  def write(self, oprot):
    if oprot.__class__ == TBinaryProtocol.TBinaryProtocolAccelerated and self.thrift_spec is not None and fastbinary is not None:
      oprot.trans.write(fastbinary.encode_binary(self, (self.__class__, self.thrift_spec)))
      return
    oprot.writeStructBegin('TaskStatus')
    if self.executionState is not None:
      oprot.writeFieldBegin('executionState', TType.I32, 1)
      oprot.writeI32(self.executionState)
      oprot.writeFieldEnd()
    if self.timeOfStateChange is not None:
      oprot.writeFieldBegin('timeOfStateChange', TType.I64, 2)
      oprot.writeI64(self.timeOfStateChange)
      oprot.writeFieldEnd()
    oprot.writeFieldStop()
    oprot.writeStructEnd()

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


  def __hash__(self):
    value = 17
    value = (value * 31) ^ hash(self.executionState)
    value = (value * 31) ^ hash(self.timeOfStateChange)
    return value

  def __repr__(self):
    L = ['%s=%r' % (key, value)
      for key, value in self.__dict__.iteritems()]
    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 JobStatus:
  """
  Attributes:
   - jobState
   - timeOfStateChange
  """

  thrift_spec = (
    None, # 0
    (1, TType.I32, 'jobState', None, None, ), # 1
    (2, TType.I64, 'timeOfStateChange', None, None, ), # 2
  )

  def __init__(self, jobState=None, timeOfStateChange=None,):
    self.jobState = jobState
    self.timeOfStateChange = timeOfStateChange

  def read(self, iprot):
    if iprot.__class__ == TBinaryProtocol.TBinaryProtocolAccelerated and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None and fastbinary is not None:
      fastbinary.decode_binary(self, iprot.trans, (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.I32:
          self.jobState = iprot.readI32();
        else:
          iprot.skip(ftype)
      elif fid == 2:
        if ftype == TType.I64:
          self.timeOfStateChange = iprot.readI64();
        else:
          iprot.skip(ftype)
      else:
        iprot.skip(ftype)
      iprot.readFieldEnd()
    iprot.readStructEnd()

  def write(self, oprot):
    if oprot.__class__ == TBinaryProtocol.TBinaryProtocolAccelerated and self.thrift_spec is not None and fastbinary is not None:
      oprot.trans.write(fastbinary.encode_binary(self, (self.__class__, self.thrift_spec)))
      return
    oprot.writeStructBegin('JobStatus')
    if self.jobState is not None:
      oprot.writeFieldBegin('jobState', TType.I32, 1)
      oprot.writeI32(self.jobState)
      oprot.writeFieldEnd()
    if self.timeOfStateChange is not None:
      oprot.writeFieldBegin('timeOfStateChange', TType.I64, 2)
      oprot.writeI64(self.timeOfStateChange)
      oprot.writeFieldEnd()
    oprot.writeFieldStop()
    oprot.writeStructEnd()

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


  def __hash__(self):
    value = 17
    value = (value * 31) ^ hash(self.jobState)
    value = (value * 31) ^ hash(self.timeOfStateChange)
    return value

  def __repr__(self):
    L = ['%s=%r' % (key, value)
      for key, value in self.__dict__.iteritems()]
    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 TransferStatus:
  """
  Attributes:
   - transferState
   - timeOfStateChange
  """

  thrift_spec = (
    None, # 0
    (1, TType.I32, 'transferState', None, None, ), # 1
    (2, TType.I64, 'timeOfStateChange', None, None, ), # 2
  )

  def __init__(self, transferState=None, timeOfStateChange=None,):
    self.transferState = transferState
    self.timeOfStateChange = timeOfStateChange

  def read(self, iprot):
    if iprot.__class__ == TBinaryProtocol.TBinaryProtocolAccelerated and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None and fastbinary is not None:
      fastbinary.decode_binary(self, iprot.trans, (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.I32:
          self.transferState = iprot.readI32();
        else:
          iprot.skip(ftype)
      elif fid == 2:
        if ftype == TType.I64:
          self.timeOfStateChange = iprot.readI64();
        else:
          iprot.skip(ftype)
      else:
        iprot.skip(ftype)
      iprot.readFieldEnd()
    iprot.readStructEnd()

  def write(self, oprot):
    if oprot.__class__ == TBinaryProtocol.TBinaryProtocolAccelerated and self.thrift_spec is not None and fastbinary is not None:
      oprot.trans.write(fastbinary.encode_binary(self, (self.__class__, self.thrift_spec)))
      return
    oprot.writeStructBegin('TransferStatus')
    if self.transferState is not None:
      oprot.writeFieldBegin('transferState', TType.I32, 1)
      oprot.writeI32(self.transferState)
      oprot.writeFieldEnd()
    if self.timeOfStateChange is not None:
      oprot.writeFieldBegin('timeOfStateChange', TType.I64, 2)
      oprot.writeI64(self.timeOfStateChange)
      oprot.writeFieldEnd()
    oprot.writeFieldStop()
    oprot.writeStructEnd()

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


  def __hash__(self):
    value = 17
    value = (value * 31) ^ hash(self.transferState)
    value = (value * 31) ^ hash(self.timeOfStateChange)
    return value

  def __repr__(self):
    L = ['%s=%r' % (key, value)
      for key, value in self.__dict__.iteritems()]
    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 ApplicationStatus:
  """
  Attributes:
   - applicationState
   - timeOfStateChange
  """

  thrift_spec = (
    None, # 0
    (1, TType.STRING, 'applicationState', None, None, ), # 1
    (2, TType.I64, 'timeOfStateChange', None, None, ), # 2
  )

  def __init__(self, applicationState=None, timeOfStateChange=None,):
    self.applicationState = applicationState
    self.timeOfStateChange = timeOfStateChange

  def read(self, iprot):
    if iprot.__class__ == TBinaryProtocol.TBinaryProtocolAccelerated and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None and fastbinary is not None:
      fastbinary.decode_binary(self, iprot.trans, (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.applicationState = iprot.readString();
        else:
          iprot.skip(ftype)
      elif fid == 2:
        if ftype == TType.I64:
          self.timeOfStateChange = iprot.readI64();
        else:
          iprot.skip(ftype)
      else:
        iprot.skip(ftype)
      iprot.readFieldEnd()
    iprot.readStructEnd()

  def write(self, oprot):
    if oprot.__class__ == TBinaryProtocol.TBinaryProtocolAccelerated and self.thrift_spec is not None and fastbinary is not None:
      oprot.trans.write(fastbinary.encode_binary(self, (self.__class__, self.thrift_spec)))
      return
    oprot.writeStructBegin('ApplicationStatus')
    if self.applicationState is not None:
      oprot.writeFieldBegin('applicationState', TType.STRING, 1)
      oprot.writeString(self.applicationState)
      oprot.writeFieldEnd()
    if self.timeOfStateChange is not None:
      oprot.writeFieldBegin('timeOfStateChange', TType.I64, 2)
      oprot.writeI64(self.timeOfStateChange)
      oprot.writeFieldEnd()
    oprot.writeFieldStop()
    oprot.writeStructEnd()

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


  def __hash__(self):
    value = 17
    value = (value * 31) ^ hash(self.applicationState)
    value = (value * 31) ^ hash(self.timeOfStateChange)
    return value

  def __repr__(self):
    L = ['%s=%r' % (key, value)
      for key, value in self.__dict__.iteritems()]
    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 ComputationalResourceScheduling:
  """
  A structure holding the Computational Resource Scheduling.


  Attributes:
   - resourceHostId
   - totalCPUCount
   - nodeCount
   - numberOfThreads
   - queueName
   - wallTimeLimit
   - jobStartTime
   - totalPhysicalMemory
   - computationalProjectAccount
   - chassisName
  """

  thrift_spec = (
    None, # 0
    (1, TType.STRING, 'resourceHostId', None, None, ), # 1
    (2, TType.I32, 'totalCPUCount', None, None, ), # 2
    (3, TType.I32, 'nodeCount', None, None, ), # 3
    (4, TType.I32, 'numberOfThreads', None, None, ), # 4
    (5, TType.STRING, 'queueName', None, None, ), # 5
    (6, TType.I32, 'wallTimeLimit', None, None, ), # 6
    (7, TType.I32, 'jobStartTime', None, None, ), # 7
    (8, TType.I32, 'totalPhysicalMemory', None, None, ), # 8
    (9, TType.STRING, 'computationalProjectAccount', None, None, ), # 9
    (10, TType.STRING, 'chassisName', None, None, ), # 10
  )

  def __init__(self, resourceHostId=None, totalCPUCount=None, nodeCount=None, numberOfThreads=None, queueName=None, wallTimeLimit=None, jobStartTime=None, totalPhysicalMemory=None, computationalProjectAccount=None, chassisName=None,):
    self.resourceHostId = resourceHostId
    self.totalCPUCount = totalCPUCount
    self.nodeCount = nodeCount
    self.numberOfThreads = numberOfThreads
    self.queueName = queueName
    self.wallTimeLimit = wallTimeLimit
    self.jobStartTime = jobStartTime
    self.totalPhysicalMemory = totalPhysicalMemory
    self.computationalProjectAccount = computationalProjectAccount
    self.chassisName = chassisName

  def read(self, iprot):
    if iprot.__class__ == TBinaryProtocol.TBinaryProtocolAccelerated and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None and fastbinary is not None:
      fastbinary.decode_binary(self, iprot.trans, (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.resourceHostId = iprot.readString();
        else:
          iprot.skip(ftype)
      elif fid == 2:
        if ftype == TType.I32:
          self.totalCPUCount = iprot.readI32();
        else:
          iprot.skip(ftype)
      elif fid == 3:
        if ftype == TType.I32:
          self.nodeCount = iprot.readI32();
        else:
          iprot.skip(ftype)
      elif fid == 4:
        if ftype == TType.I32:
          self.numberOfThreads = iprot.readI32();
        else:
          iprot.skip(ftype)
      elif fid == 5:
        if ftype == TType.STRING:
          self.queueName = iprot.readString();
        else:
          iprot.skip(ftype)
      elif fid == 6:
        if ftype == TType.I32:
          self.wallTimeLimit = iprot.readI32();
        else:
          iprot.skip(ftype)
      elif fid == 7:
        if ftype == TType.I32:
          self.jobStartTime = iprot.readI32();
        else:
          iprot.skip(ftype)
      elif fid == 8:
        if ftype == TType.I32:
          self.totalPhysicalMemory = iprot.readI32();
        else:
          iprot.skip(ftype)
      elif fid == 9:
        if ftype == TType.STRING:
          self.computationalProjectAccount = iprot.readString();
        else:
          iprot.skip(ftype)
      elif fid == 10:
        if ftype == TType.STRING:
          self.chassisName = iprot.readString();
        else:
          iprot.skip(ftype)
      else:
        iprot.skip(ftype)
      iprot.readFieldEnd()
    iprot.readStructEnd()

  def write(self, oprot):
    if oprot.__class__ == TBinaryProtocol.TBinaryProtocolAccelerated and self.thrift_spec is not None and fastbinary is not None:
      oprot.trans.write(fastbinary.encode_binary(self, (self.__class__, self.thrift_spec)))
      return
    oprot.writeStructBegin('ComputationalResourceScheduling')
    if self.resourceHostId is not None:
      oprot.writeFieldBegin('resourceHostId', TType.STRING, 1)
      oprot.writeString(self.resourceHostId)
      oprot.writeFieldEnd()
    if self.totalCPUCount is not None:
      oprot.writeFieldBegin('totalCPUCount', TType.I32, 2)
      oprot.writeI32(self.totalCPUCount)
      oprot.writeFieldEnd()
    if self.nodeCount is not None:
      oprot.writeFieldBegin('nodeCount', TType.I32, 3)
      oprot.writeI32(self.nodeCount)
      oprot.writeFieldEnd()
    if self.numberOfThreads is not None:
      oprot.writeFieldBegin('numberOfThreads', TType.I32, 4)
      oprot.writeI32(self.numberOfThreads)
      oprot.writeFieldEnd()
    if self.queueName is not None:
      oprot.writeFieldBegin('queueName', TType.STRING, 5)
      oprot.writeString(self.queueName)
      oprot.writeFieldEnd()
    if self.wallTimeLimit is not None:
      oprot.writeFieldBegin('wallTimeLimit', TType.I32, 6)
      oprot.writeI32(self.wallTimeLimit)
      oprot.writeFieldEnd()
    if self.jobStartTime is not None:
      oprot.writeFieldBegin('jobStartTime', TType.I32, 7)
      oprot.writeI32(self.jobStartTime)
      oprot.writeFieldEnd()
    if self.totalPhysicalMemory is not None:
      oprot.writeFieldBegin('totalPhysicalMemory', TType.I32, 8)
      oprot.writeI32(self.totalPhysicalMemory)
      oprot.writeFieldEnd()
    if self.computationalProjectAccount is not None:
      oprot.writeFieldBegin('computationalProjectAccount', TType.STRING, 9)
      oprot.writeString(self.computationalProjectAccount)
      oprot.writeFieldEnd()
    if self.chassisName is not None:
      oprot.writeFieldBegin('chassisName', TType.STRING, 10)
      oprot.writeString(self.chassisName)
      oprot.writeFieldEnd()
    oprot.writeFieldStop()
    oprot.writeStructEnd()

  def validate(self):
    return


  def __hash__(self):
    value = 17
    value = (value * 31) ^ hash(self.resourceHostId)
    value = (value * 31) ^ hash(self.totalCPUCount)
    value = (value * 31) ^ hash(self.nodeCount)
    value = (value * 31) ^ hash(self.numberOfThreads)
    value = (value * 31) ^ hash(self.queueName)
    value = (value * 31) ^ hash(self.wallTimeLimit)
    value = (value * 31) ^ hash(self.jobStartTime)
    value = (value * 31) ^ hash(self.totalPhysicalMemory)
    value = (value * 31) ^ hash(self.computationalProjectAccount)
    value = (value * 31) ^ hash(self.chassisName)
    return value

  def __repr__(self):
    L = ['%s=%r' % (key, value)
      for key, value in self.__dict__.iteritems()]
    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 AdvancedInputDataHandling:
  """
  A structure holding specified input data handling.


  Attributes:
   - stageInputFilesToWorkingDir
   - parentWorkingDirectory
   - uniqueWorkingDirectory
   - cleanUpWorkingDirAfterJob
  """

  thrift_spec = (
    None, # 0
    (1, TType.BOOL, 'stageInputFilesToWorkingDir', None, False, ), # 1
    (2, TType.STRING, 'parentWorkingDirectory', None, None, ), # 2
    (3, TType.STRING, 'uniqueWorkingDirectory', None, None, ), # 3
    (4, TType.BOOL, 'cleanUpWorkingDirAfterJob', None, False, ), # 4
  )

  def __init__(self, stageInputFilesToWorkingDir=thrift_spec[1][4], parentWorkingDirectory=None, uniqueWorkingDirectory=None, cleanUpWorkingDirAfterJob=thrift_spec[4][4],):
    self.stageInputFilesToWorkingDir = stageInputFilesToWorkingDir
    self.parentWorkingDirectory = parentWorkingDirectory
    self.uniqueWorkingDirectory = uniqueWorkingDirectory
    self.cleanUpWorkingDirAfterJob = cleanUpWorkingDirAfterJob

  def read(self, iprot):
    if iprot.__class__ == TBinaryProtocol.TBinaryProtocolAccelerated and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None and fastbinary is not None:
      fastbinary.decode_binary(self, iprot.trans, (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.BOOL:
          self.stageInputFilesToWorkingDir = iprot.readBool();
        else:
          iprot.skip(ftype)
      elif fid == 2:
        if ftype == TType.STRING:
          self.parentWorkingDirectory = iprot.readString();
        else:
          iprot.skip(ftype)
      elif fid == 3:
        if ftype == TType.STRING:
          self.uniqueWorkingDirectory = iprot.readString();
        else:
          iprot.skip(ftype)
      elif fid == 4:
        if ftype == TType.BOOL:
          self.cleanUpWorkingDirAfterJob = iprot.readBool();
        else:
          iprot.skip(ftype)
      else:
        iprot.skip(ftype)
      iprot.readFieldEnd()
    iprot.readStructEnd()

  def write(self, oprot):
    if oprot.__class__ == TBinaryProtocol.TBinaryProtocolAccelerated and self.thrift_spec is not None and fastbinary is not None:
      oprot.trans.write(fastbinary.encode_binary(self, (self.__class__, self.thrift_spec)))
      return
    oprot.writeStructBegin('AdvancedInputDataHandling')
    if self.stageInputFilesToWorkingDir is not None:
      oprot.writeFieldBegin('stageInputFilesToWorkingDir', TType.BOOL, 1)
      oprot.writeBool(self.stageInputFilesToWorkingDir)
      oprot.writeFieldEnd()
    if self.parentWorkingDirectory is not None:
      oprot.writeFieldBegin('parentWorkingDirectory', TType.STRING, 2)
      oprot.writeString(self.parentWorkingDirectory)
      oprot.writeFieldEnd()
    if self.uniqueWorkingDirectory is not None:
      oprot.writeFieldBegin('uniqueWorkingDirectory', TType.STRING, 3)
      oprot.writeString(self.uniqueWorkingDirectory)
      oprot.writeFieldEnd()
    if self.cleanUpWorkingDirAfterJob is not None:
      oprot.writeFieldBegin('cleanUpWorkingDirAfterJob', TType.BOOL, 4)
      oprot.writeBool(self.cleanUpWorkingDirAfterJob)
      oprot.writeFieldEnd()
    oprot.writeFieldStop()
    oprot.writeStructEnd()

  def validate(self):
    return


  def __hash__(self):
    value = 17
    value = (value * 31) ^ hash(self.stageInputFilesToWorkingDir)
    value = (value * 31) ^ hash(self.parentWorkingDirectory)
    value = (value * 31) ^ hash(self.uniqueWorkingDirectory)
    value = (value * 31) ^ hash(self.cleanUpWorkingDirAfterJob)
    return value

  def __repr__(self):
    L = ['%s=%r' % (key, value)
      for key, value in self.__dict__.iteritems()]
    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 AdvancedOutputDataHandling:
  """
  A structure holding specified output data handling.


  Attributes:
   - outputDataDir
   - dataRegistryURL
   - persistOutputData
  """

  thrift_spec = (
    None, # 0
    None, # 1
    (2, TType.STRING, 'outputDataDir', None, None, ), # 2
    (3, TType.STRING, 'dataRegistryURL', None, None, ), # 3
    (4, TType.BOOL, 'persistOutputData', None, True, ), # 4
  )

  def __init__(self, outputDataDir=None, dataRegistryURL=None, persistOutputData=thrift_spec[4][4],):
    self.outputDataDir = outputDataDir
    self.dataRegistryURL = dataRegistryURL
    self.persistOutputData = persistOutputData

  def read(self, iprot):
    if iprot.__class__ == TBinaryProtocol.TBinaryProtocolAccelerated and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None and fastbinary is not None:
      fastbinary.decode_binary(self, iprot.trans, (self.__class__, self.thrift_spec))
      return
    iprot.readStructBegin()
    while True:
      (fname, ftype, fid) = iprot.readFieldBegin()
      if ftype == TType.STOP:
        break
      if fid == 2:
        if ftype == TType.STRING:
          self.outputDataDir = iprot.readString();
        else:
          iprot.skip(ftype)
      elif fid == 3:
        if ftype == TType.STRING:
          self.dataRegistryURL = iprot.readString();
        else:
          iprot.skip(ftype)
      elif fid == 4:
        if ftype == TType.BOOL:
          self.persistOutputData = iprot.readBool();
        else:
          iprot.skip(ftype)
      else:
        iprot.skip(ftype)
      iprot.readFieldEnd()
    iprot.readStructEnd()

  def write(self, oprot):
    if oprot.__class__ == TBinaryProtocol.TBinaryProtocolAccelerated and self.thrift_spec is not None and fastbinary is not None:
      oprot.trans.write(fastbinary.encode_binary(self, (self.__class__, self.thrift_spec)))
      return
    oprot.writeStructBegin('AdvancedOutputDataHandling')
    if self.outputDataDir is not None:
      oprot.writeFieldBegin('outputDataDir', TType.STRING, 2)
      oprot.writeString(self.outputDataDir)
      oprot.writeFieldEnd()
    if self.dataRegistryURL is not None:
      oprot.writeFieldBegin('dataRegistryURL', TType.STRING, 3)
      oprot.writeString(self.dataRegistryURL)
      oprot.writeFieldEnd()
    if self.persistOutputData is not None:
      oprot.writeFieldBegin('persistOutputData', TType.BOOL, 4)
      oprot.writeBool(self.persistOutputData)
      oprot.writeFieldEnd()
    oprot.writeFieldStop()
    oprot.writeStructEnd()

  def validate(self):
    return


  def __hash__(self):
    value = 17
    value = (value * 31) ^ hash(self.outputDataDir)
    value = (value * 31) ^ hash(self.dataRegistryURL)
    value = (value * 31) ^ hash(self.persistOutputData)
    return value

  def __repr__(self):
    L = ['%s=%r' % (key, value)
      for key, value in self.__dict__.iteritems()]
    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 QualityOfServiceParams:
  """
  A structure holding Quality of Service Parameters.


  Attributes:
   - startExecutionAt
   - executeBefore
   - numberofRetries
  """

  thrift_spec = (
    None, # 0
    (1, TType.STRING, 'startExecutionAt', None, None, ), # 1
    (2, TType.STRING, 'executeBefore', None, None, ), # 2
    (3, TType.I32, 'numberofRetries', None, None, ), # 3
  )

  def __init__(self, startExecutionAt=None, executeBefore=None, numberofRetries=None,):
    self.startExecutionAt = startExecutionAt
    self.executeBefore = executeBefore
    self.numberofRetries = numberofRetries

  def read(self, iprot):
    if iprot.__class__ == TBinaryProtocol.TBinaryProtocolAccelerated and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None and fastbinary is not None:
      fastbinary.decode_binary(self, iprot.trans, (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.startExecutionAt = iprot.readString();
        else:
          iprot.skip(ftype)
      elif fid == 2:
        if ftype == TType.STRING:
          self.executeBefore = iprot.readString();
        else:
          iprot.skip(ftype)
      elif fid == 3:
        if ftype == TType.I32:
          self.numberofRetries = iprot.readI32();
        else:
          iprot.skip(ftype)
      else:
        iprot.skip(ftype)
      iprot.readFieldEnd()
    iprot.readStructEnd()

  def write(self, oprot):
    if oprot.__class__ == TBinaryProtocol.TBinaryProtocolAccelerated and self.thrift_spec is not None and fastbinary is not None:
      oprot.trans.write(fastbinary.encode_binary(self, (self.__class__, self.thrift_spec)))
      return
    oprot.writeStructBegin('QualityOfServiceParams')
    if self.startExecutionAt is not None:
      oprot.writeFieldBegin('startExecutionAt', TType.STRING, 1)
      oprot.writeString(self.startExecutionAt)
      oprot.writeFieldEnd()
    if self.executeBefore is not None:
      oprot.writeFieldBegin('executeBefore', TType.STRING, 2)
      oprot.writeString(self.executeBefore)
      oprot.writeFieldEnd()
    if self.numberofRetries is not None:
      oprot.writeFieldBegin('numberofRetries', TType.I32, 3)
      oprot.writeI32(self.numberofRetries)
      oprot.writeFieldEnd()
    oprot.writeFieldStop()
    oprot.writeStructEnd()

  def validate(self):
    return


  def __hash__(self):
    value = 17
    value = (value * 31) ^ hash(self.startExecutionAt)
    value = (value * 31) ^ hash(self.executeBefore)
    value = (value * 31) ^ hash(self.numberofRetries)
    return value

  def __repr__(self):
    L = ['%s=%r' % (key, value)
      for key, value in self.__dict__.iteritems()]
    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 UserConfigurationData:
  """
  A structure holding the experiment configuration.



  Attributes:
   - airavataAutoSchedule
   - overrideManualScheduledParams
   - shareExperimentPublicly
   - computationalResourceScheduling
   - advanceInputDataHandling
   - advanceOutputDataHandling
   - qosParams
   - throttleResources
   - userDN
   - generateCert
  """

  thrift_spec = (
    None, # 0
    (1, TType.BOOL, 'airavataAutoSchedule', None, False, ), # 1
    (2, TType.BOOL, 'overrideManualScheduledParams', None, False, ), # 2
    (3, TType.BOOL, 'shareExperimentPublicly', None, False, ), # 3
    (4, TType.STRUCT, 'computationalResourceScheduling', (ComputationalResourceScheduling, ComputationalResourceScheduling.thrift_spec), None, ), # 4
    (5, TType.STRUCT, 'advanceInputDataHandling', (AdvancedInputDataHandling, AdvancedInputDataHandling.thrift_spec), None, ), # 5
    (6, TType.STRUCT, 'advanceOutputDataHandling', (AdvancedOutputDataHandling, AdvancedOutputDataHandling.thrift_spec), None, ), # 6
    (7, TType.STRUCT, 'qosParams', (QualityOfServiceParams, QualityOfServiceParams.thrift_spec), None, ), # 7
    (8, TType.BOOL, 'throttleResources', None, False, ), # 8
    (9, TType.STRING, 'userDN', None, None, ), # 9
    (10, TType.BOOL, 'generateCert', None, False, ), # 10
  )

  def __init__(self, airavataAutoSchedule=thrift_spec[1][4], overrideManualScheduledParams=thrift_spec[2][4], shareExperimentPublicly=thrift_spec[3][4], computationalResourceScheduling=None, advanceInputDataHandling=None, advanceOutputDataHandling=None, qosParams=None, throttleResources=thrift_spec[8][4], userDN=None, generateCert=thrift_spec[10][4],):
    self.airavataAutoSchedule = airavataAutoSchedule
    self.overrideManualScheduledParams = overrideManualScheduledParams
    self.shareExperimentPublicly = shareExperimentPublicly
    self.computationalResourceScheduling = computationalResourceScheduling
    self.advanceInputDataHandling = advanceInputDataHandling
    self.advanceOutputDataHandling = advanceOutputDataHandling
    self.qosParams = qosParams
    self.throttleResources = throttleResources
    self.userDN = userDN
    self.generateCert = generateCert

  def read(self, iprot):
    if iprot.__class__ == TBinaryProtocol.TBinaryProtocolAccelerated and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None and fastbinary is not None:
      fastbinary.decode_binary(self, iprot.trans, (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.BOOL:
          self.airavataAutoSchedule = iprot.readBool();
        else:
          iprot.skip(ftype)
      elif fid == 2:
        if ftype == TType.BOOL:
          self.overrideManualScheduledParams = iprot.readBool();
        else:
          iprot.skip(ftype)
      elif fid == 3:
        if ftype == TType.BOOL:
          self.shareExperimentPublicly = iprot.readBool();
        else:
          iprot.skip(ftype)
      elif fid == 4:
        if ftype == TType.STRUCT:
          self.computationalResourceScheduling = ComputationalResourceScheduling()
          self.computationalResourceScheduling.read(iprot)
        else:
          iprot.skip(ftype)
      elif fid == 5:
        if ftype == TType.STRUCT:
          self.advanceInputDataHandling = AdvancedInputDataHandling()
          self.advanceInputDataHandling.read(iprot)
        else:
          iprot.skip(ftype)
      elif fid == 6:
        if ftype == TType.STRUCT:
          self.advanceOutputDataHandling = AdvancedOutputDataHandling()
          self.advanceOutputDataHandling.read(iprot)
        else:
          iprot.skip(ftype)
      elif fid == 7:
        if ftype == TType.STRUCT:
          self.qosParams = QualityOfServiceParams()
          self.qosParams.read(iprot)
        else:
          iprot.skip(ftype)
      elif fid == 8:
        if ftype == TType.BOOL:
          self.throttleResources = iprot.readBool();
        else:
          iprot.skip(ftype)
      elif fid == 9:
        if ftype == TType.STRING:
          self.userDN = iprot.readString();
        else:
          iprot.skip(ftype)
      elif fid == 10:
        if ftype == TType.BOOL:
          self.generateCert = iprot.readBool();
        else:
          iprot.skip(ftype)
      else:
        iprot.skip(ftype)
      iprot.readFieldEnd()
    iprot.readStructEnd()

  def write(self, oprot):
    if oprot.__class__ == TBinaryProtocol.TBinaryProtocolAccelerated and self.thrift_spec is not None and fastbinary is not None:
      oprot.trans.write(fastbinary.encode_binary(self, (self.__class__, self.thrift_spec)))
      return
    oprot.writeStructBegin('UserConfigurationData')
    if self.airavataAutoSchedule is not None:
      oprot.writeFieldBegin('airavataAutoSchedule', TType.BOOL, 1)
      oprot.writeBool(self.airavataAutoSchedule)
      oprot.writeFieldEnd()
    if self.overrideManualScheduledParams is not None:
      oprot.writeFieldBegin('overrideManualScheduledParams', TType.BOOL, 2)
      oprot.writeBool(self.overrideManualScheduledParams)
      oprot.writeFieldEnd()
    if self.shareExperimentPublicly is not None:
      oprot.writeFieldBegin('shareExperimentPublicly', TType.BOOL, 3)
      oprot.writeBool(self.shareExperimentPublicly)
      oprot.writeFieldEnd()
    if self.computationalResourceScheduling is not None:
      oprot.writeFieldBegin('computationalResourceScheduling', TType.STRUCT, 4)
      self.computationalResourceScheduling.write(oprot)
      oprot.writeFieldEnd()
    if self.advanceInputDataHandling is not None:
      oprot.writeFieldBegin('advanceInputDataHandling', TType.STRUCT, 5)
      self.advanceInputDataHandling.write(oprot)
      oprot.writeFieldEnd()
    if self.advanceOutputDataHandling is not None:
      oprot.writeFieldBegin('advanceOutputDataHandling', TType.STRUCT, 6)
      self.advanceOutputDataHandling.write(oprot)
      oprot.writeFieldEnd()
    if self.qosParams is not None:
      oprot.writeFieldBegin('qosParams', TType.STRUCT, 7)
      self.qosParams.write(oprot)
      oprot.writeFieldEnd()
    if self.throttleResources is not None:
      oprot.writeFieldBegin('throttleResources', TType.BOOL, 8)
      oprot.writeBool(self.throttleResources)
      oprot.writeFieldEnd()
    if self.userDN is not None:
      oprot.writeFieldBegin('userDN', TType.STRING, 9)
      oprot.writeString(self.userDN)
      oprot.writeFieldEnd()
    if self.generateCert is not None:
      oprot.writeFieldBegin('generateCert', TType.BOOL, 10)
      oprot.writeBool(self.generateCert)
      oprot.writeFieldEnd()
    oprot.writeFieldStop()
    oprot.writeStructEnd()

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


  def __hash__(self):
    value = 17
    value = (value * 31) ^ hash(self.airavataAutoSchedule)
    value = (value * 31) ^ hash(self.overrideManualScheduledParams)
    value = (value * 31) ^ hash(self.shareExperimentPublicly)
    value = (value * 31) ^ hash(self.computationalResourceScheduling)
    value = (value * 31) ^ hash(self.advanceInputDataHandling)
    value = (value * 31) ^ hash(self.advanceOutputDataHandling)
    value = (value * 31) ^ hash(self.qosParams)
    value = (value * 31) ^ hash(self.throttleResources)
    value = (value * 31) ^ hash(self.userDN)
    value = (value * 31) ^ hash(self.generateCert)
    return value

  def __repr__(self):
    L = ['%s=%r' % (key, value)
      for key, value in self.__dict__.iteritems()]
    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 ErrorDetails:
  """
  Attributes:
   - errorID
   - creationTime
   - actualErrorMessage
   - userFriendlyMessage
   - errorCategory
   - transientOrPersistent
   - correctiveAction
   - actionableGroup
   - rootCauseErrorIdList
  """

  thrift_spec = (
    None, # 0
    (1, TType.STRING, 'errorID', None, "DO_NOT_SET_AT_CLIENTS", ), # 1
    (2, TType.I64, 'creationTime', None, None, ), # 2
    (3, TType.STRING, 'actualErrorMessage', None, None, ), # 3
    (4, TType.STRING, 'userFriendlyMessage', None, None, ), # 4
    (5, TType.I32, 'errorCategory', None, None, ), # 5
    (6, TType.BOOL, 'transientOrPersistent', None, False, ), # 6
    (7, TType.I32, 'correctiveAction', None, None, ), # 7
    (8, TType.I32, 'actionableGroup', None, None, ), # 8
    (9, TType.LIST, 'rootCauseErrorIdList', (TType.STRING,None), None, ), # 9
  )

  def __init__(self, errorID=thrift_spec[1][4], creationTime=None, actualErrorMessage=None, userFriendlyMessage=None, errorCategory=None, transientOrPersistent=thrift_spec[6][4], correctiveAction=None, actionableGroup=None, rootCauseErrorIdList=None,):
    self.errorID = errorID
    self.creationTime = creationTime
    self.actualErrorMessage = actualErrorMessage
    self.userFriendlyMessage = userFriendlyMessage
    self.errorCategory = errorCategory
    self.transientOrPersistent = transientOrPersistent
    self.correctiveAction = correctiveAction
    self.actionableGroup = actionableGroup
    self.rootCauseErrorIdList = rootCauseErrorIdList

  def read(self, iprot):
    if iprot.__class__ == TBinaryProtocol.TBinaryProtocolAccelerated and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None and fastbinary is not None:
      fastbinary.decode_binary(self, iprot.trans, (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.errorID = iprot.readString();
        else:
          iprot.skip(ftype)
      elif fid == 2:
        if ftype == TType.I64:
          self.creationTime = iprot.readI64();
        else:
          iprot.skip(ftype)
      elif fid == 3:
        if ftype == TType.STRING:
          self.actualErrorMessage = iprot.readString();
        else:
          iprot.skip(ftype)
      elif fid == 4:
        if ftype == TType.STRING:
          self.userFriendlyMessage = iprot.readString();
        else:
          iprot.skip(ftype)
      elif fid == 5:
        if ftype == TType.I32:
          self.errorCategory = iprot.readI32();
        else:
          iprot.skip(ftype)
      elif fid == 6:
        if ftype == TType.BOOL:
          self.transientOrPersistent = iprot.readBool();
        else:
          iprot.skip(ftype)
      elif fid == 7:
        if ftype == TType.I32:
          self.correctiveAction = iprot.readI32();
        else:
          iprot.skip(ftype)
      elif fid == 8:
        if ftype == TType.I32:
          self.actionableGroup = iprot.readI32();
        else:
          iprot.skip(ftype)
      elif fid == 9:
        if ftype == TType.LIST:
          self.rootCauseErrorIdList = []
          (_etype3, _size0) = iprot.readListBegin()
          for _i4 in xrange(_size0):
            _elem5 = iprot.readString();
            self.rootCauseErrorIdList.append(_elem5)
          iprot.readListEnd()
        else:
          iprot.skip(ftype)
      else:
        iprot.skip(ftype)
      iprot.readFieldEnd()
    iprot.readStructEnd()

  def write(self, oprot):
    if oprot.__class__ == TBinaryProtocol.TBinaryProtocolAccelerated and self.thrift_spec is not None and fastbinary is not None:
      oprot.trans.write(fastbinary.encode_binary(self, (self.__class__, self.thrift_spec)))
      return
    oprot.writeStructBegin('ErrorDetails')
    if self.errorID is not None:
      oprot.writeFieldBegin('errorID', TType.STRING, 1)
      oprot.writeString(self.errorID)
      oprot.writeFieldEnd()
    if self.creationTime is not None:
      oprot.writeFieldBegin('creationTime', TType.I64, 2)
      oprot.writeI64(self.creationTime)
      oprot.writeFieldEnd()
    if self.actualErrorMessage is not None:
      oprot.writeFieldBegin('actualErrorMessage', TType.STRING, 3)
      oprot.writeString(self.actualErrorMessage)
      oprot.writeFieldEnd()
    if self.userFriendlyMessage is not None:
      oprot.writeFieldBegin('userFriendlyMessage', TType.STRING, 4)
      oprot.writeString(self.userFriendlyMessage)
      oprot.writeFieldEnd()
    if self.errorCategory is not None:
      oprot.writeFieldBegin('errorCategory', TType.I32, 5)
      oprot.writeI32(self.errorCategory)
      oprot.writeFieldEnd()
    if self.transientOrPersistent is not None:
      oprot.writeFieldBegin('transientOrPersistent', TType.BOOL, 6)
      oprot.writeBool(self.transientOrPersistent)
      oprot.writeFieldEnd()
    if self.correctiveAction is not None:
      oprot.writeFieldBegin('correctiveAction', TType.I32, 7)
      oprot.writeI32(self.correctiveAction)
      oprot.writeFieldEnd()
    if self.actionableGroup is not None:
      oprot.writeFieldBegin('actionableGroup', TType.I32, 8)
      oprot.writeI32(self.actionableGroup)
      oprot.writeFieldEnd()
    if self.rootCauseErrorIdList is not None:
      oprot.writeFieldBegin('rootCauseErrorIdList', TType.LIST, 9)
      oprot.writeListBegin(TType.STRING, len(self.rootCauseErrorIdList))
      for iter6 in self.rootCauseErrorIdList:
        oprot.writeString(iter6)
      oprot.writeListEnd()
      oprot.writeFieldEnd()
    oprot.writeFieldStop()
    oprot.writeStructEnd()

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


  def __hash__(self):
    value = 17
    value = (value * 31) ^ hash(self.errorID)
    value = (value * 31) ^ hash(self.creationTime)
    value = (value * 31) ^ hash(self.actualErrorMessage)
    value = (value * 31) ^ hash(self.userFriendlyMessage)
    value = (value * 31) ^ hash(self.errorCategory)
    value = (value * 31) ^ hash(self.transientOrPersistent)
    value = (value * 31) ^ hash(self.correctiveAction)
    value = (value * 31) ^ hash(self.actionableGroup)
    value = (value * 31) ^ hash(self.rootCauseErrorIdList)
    return value

  def __repr__(self):
    L = ['%s=%r' % (key, value)
      for key, value in self.__dict__.iteritems()]
    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 JobDetails:
  """
  Attributes:
   - jobID
   - jobDescription
   - creationTime
   - jobStatus
   - applicationStatus
   - errors
   - computeResourceConsumed
   - jobName
   - workingDir
  """

  thrift_spec = (
    None, # 0
    (1, TType.STRING, 'jobID', None, "DO_NOT_SET_AT_CLIENTS", ), # 1
    (2, TType.STRING, 'jobDescription', None, None, ), # 2
    (3, TType.I64, 'creationTime', None, None, ), # 3
    (4, TType.STRUCT, 'jobStatus', (JobStatus, JobStatus.thrift_spec), None, ), # 4
    (5, TType.STRUCT, 'applicationStatus', (ApplicationStatus, ApplicationStatus.thrift_spec), None, ), # 5
    (6, TType.LIST, 'errors', (TType.STRUCT,(ErrorDetails, ErrorDetails.thrift_spec)), None, ), # 6
    (7, TType.STRING, 'computeResourceConsumed', None, None, ), # 7
    (8, TType.STRING, 'jobName', None, None, ), # 8
    (9, TType.STRING, 'workingDir', None, None, ), # 9
  )

  def __init__(self, jobID=thrift_spec[1][4], jobDescription=None, creationTime=None, jobStatus=None, applicationStatus=None, errors=None, computeResourceConsumed=None, jobName=None, workingDir=None,):
    self.jobID = jobID
    self.jobDescription = jobDescription
    self.creationTime = creationTime
    self.jobStatus = jobStatus
    self.applicationStatus = applicationStatus
    self.errors = errors
    self.computeResourceConsumed = computeResourceConsumed
    self.jobName = jobName
    self.workingDir = workingDir

  def read(self, iprot):
    if iprot.__class__ == TBinaryProtocol.TBinaryProtocolAccelerated and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None and fastbinary is not None:
      fastbinary.decode_binary(self, iprot.trans, (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.jobID = iprot.readString();
        else:
          iprot.skip(ftype)
      elif fid == 2:
        if ftype == TType.STRING:
          self.jobDescription = iprot.readString();
        else:
          iprot.skip(ftype)
      elif fid == 3:
        if ftype == TType.I64:
          self.creationTime = iprot.readI64();
        else:
          iprot.skip(ftype)
      elif fid == 4:
        if ftype == TType.STRUCT:
          self.jobStatus = JobStatus()
          self.jobStatus.read(iprot)
        else:
          iprot.skip(ftype)
      elif fid == 5:
        if ftype == TType.STRUCT:
          self.applicationStatus = ApplicationStatus()
          self.applicationStatus.read(iprot)
        else:
          iprot.skip(ftype)
      elif fid == 6:
        if ftype == TType.LIST:
          self.errors = []
          (_etype10, _size7) = iprot.readListBegin()
          for _i11 in xrange(_size7):
            _elem12 = ErrorDetails()
            _elem12.read(iprot)
            self.errors.append(_elem12)
          iprot.readListEnd()
        else:
          iprot.skip(ftype)
      elif fid == 7:
        if ftype == TType.STRING:
          self.computeResourceConsumed = iprot.readString();
        else:
          iprot.skip(ftype)
      elif fid == 8:
        if ftype == TType.STRING:
          self.jobName = iprot.readString();
        else:
          iprot.skip(ftype)
      elif fid == 9:
        if ftype == TType.STRING:
          self.workingDir = iprot.readString();
        else:
          iprot.skip(ftype)
      else:
        iprot.skip(ftype)
      iprot.readFieldEnd()
    iprot.readStructEnd()

  def write(self, oprot):
    if oprot.__class__ == TBinaryProtocol.TBinaryProtocolAccelerated and self.thrift_spec is not None and fastbinary is not None:
      oprot.trans.write(fastbinary.encode_binary(self, (self.__class__, self.thrift_spec)))
      return
    oprot.writeStructBegin('JobDetails')
    if self.jobID is not None:
      oprot.writeFieldBegin('jobID', TType.STRING, 1)
      oprot.writeString(self.jobID)
      oprot.writeFieldEnd()
    if self.jobDescription is not None:
      oprot.writeFieldBegin('jobDescription', TType.STRING, 2)
      oprot.writeString(self.jobDescription)
      oprot.writeFieldEnd()
    if self.creationTime is not None:
      oprot.writeFieldBegin('creationTime', TType.I64, 3)
      oprot.writeI64(self.creationTime)
      oprot.writeFieldEnd()
    if self.jobStatus is not None:
      oprot.writeFieldBegin('jobStatus', TType.STRUCT, 4)
      self.jobStatus.write(oprot)
      oprot.writeFieldEnd()
    if self.applicationStatus is not None:
      oprot.writeFieldBegin('applicationStatus', TType.STRUCT, 5)
      self.applicationStatus.write(oprot)
      oprot.writeFieldEnd()
    if self.errors is not None:
      oprot.writeFieldBegin('errors', TType.LIST, 6)
      oprot.writeListBegin(TType.STRUCT, len(self.errors))
      for iter13 in self.errors:
        iter13.write(oprot)
      oprot.writeListEnd()
      oprot.writeFieldEnd()
    if self.computeResourceConsumed is not None:
      oprot.writeFieldBegin('computeResourceConsumed', TType.STRING, 7)
      oprot.writeString(self.computeResourceConsumed)
      oprot.writeFieldEnd()
    if self.jobName is not None:
      oprot.writeFieldBegin('jobName', TType.STRING, 8)
      oprot.writeString(self.jobName)
      oprot.writeFieldEnd()
    if self.workingDir is not None:
      oprot.writeFieldBegin('workingDir', TType.STRING, 9)
      oprot.writeString(self.workingDir)
      oprot.writeFieldEnd()
    oprot.writeFieldStop()
    oprot.writeStructEnd()

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


  def __hash__(self):
    value = 17
    value = (value * 31) ^ hash(self.jobID)
    value = (value * 31) ^ hash(self.jobDescription)
    value = (value * 31) ^ hash(self.creationTime)
    value = (value * 31) ^ hash(self.jobStatus)
    value = (value * 31) ^ hash(self.applicationStatus)
    value = (value * 31) ^ hash(self.errors)
    value = (value * 31) ^ hash(self.computeResourceConsumed)
    value = (value * 31) ^ hash(self.jobName)
    value = (value * 31) ^ hash(self.workingDir)
    return value

  def __repr__(self):
    L = ['%s=%r' % (key, value)
      for key, value in self.__dict__.iteritems()]
    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 DataTransferDetails:
  """
  Attributes:
   - transferID
   - creationTime
   - transferDescription
   - transferStatus
  """

  thrift_spec = (
    None, # 0
    (1, TType.STRING, 'transferID', None, "DO_NOT_SET_AT_CLIENTS", ), # 1
    (2, TType.I64, 'creationTime', None, None, ), # 2
    (3, TType.STRING, 'transferDescription', None, None, ), # 3
    (4, TType.STRUCT, 'transferStatus', (TransferStatus, TransferStatus.thrift_spec), None, ), # 4
  )

  def __init__(self, transferID=thrift_spec[1][4], creationTime=None, transferDescription=None, transferStatus=None,):
    self.transferID = transferID
    self.creationTime = creationTime
    self.transferDescription = transferDescription
    self.transferStatus = transferStatus

  def read(self, iprot):
    if iprot.__class__ == TBinaryProtocol.TBinaryProtocolAccelerated and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None and fastbinary is not None:
      fastbinary.decode_binary(self, iprot.trans, (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.transferID = iprot.readString();
        else:
          iprot.skip(ftype)
      elif fid == 2:
        if ftype == TType.I64:
          self.creationTime = iprot.readI64();
        else:
          iprot.skip(ftype)
      elif fid == 3:
        if ftype == TType.STRING:
          self.transferDescription = iprot.readString();
        else:
          iprot.skip(ftype)
      elif fid == 4:
        if ftype == TType.STRUCT:
          self.transferStatus = TransferStatus()
          self.transferStatus.read(iprot)
        else:
          iprot.skip(ftype)
      else:
        iprot.skip(ftype)
      iprot.readFieldEnd()
    iprot.readStructEnd()

  def write(self, oprot):
    if oprot.__class__ == TBinaryProtocol.TBinaryProtocolAccelerated and self.thrift_spec is not None and fastbinary is not None:
      oprot.trans.write(fastbinary.encode_binary(self, (self.__class__, self.thrift_spec)))
      return
    oprot.writeStructBegin('DataTransferDetails')
    if self.transferID is not None:
      oprot.writeFieldBegin('transferID', TType.STRING, 1)
      oprot.writeString(self.transferID)
      oprot.writeFieldEnd()
    if self.creationTime is not None:
      oprot.writeFieldBegin('creationTime', TType.I64, 2)
      oprot.writeI64(self.creationTime)
      oprot.writeFieldEnd()
    if self.transferDescription is not None:
      oprot.writeFieldBegin('transferDescription', TType.STRING, 3)
      oprot.writeString(self.transferDescription)
      oprot.writeFieldEnd()
    if self.transferStatus is not None:
      oprot.writeFieldBegin('transferStatus', TType.STRUCT, 4)
      self.transferStatus.write(oprot)
      oprot.writeFieldEnd()
    oprot.writeFieldStop()
    oprot.writeStructEnd()

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


  def __hash__(self):
    value = 17
    value = (value * 31) ^ hash(self.transferID)
    value = (value * 31) ^ hash(self.creationTime)
    value = (value * 31) ^ hash(self.transferDescription)
    value = (value * 31) ^ hash(self.transferStatus)
    return value

  def __repr__(self):
    L = ['%s=%r' % (key, value)
      for key, value in self.__dict__.iteritems()]
    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 TaskDetails:
  """
  A structure holding the actual execution context decided based on user provided configuration data or system inferred
    information from scheduling and QoS parameters. One experiment can have multiple tasks. Each tasks results in
    data transfers and jobs


  Attributes:
   - taskID
   - creationTime
   - applicationId
   - applicationVersion
   - applicationDeploymentId
   - applicationInputs
   - applicationOutputs
   - taskScheduling
   - advancedInputDataHandling
   - advancedOutputDataHandling
   - taskStatus
   - jobDetailsList
   - dataTransferDetailsList
   - errors
   - enableEmailNotification
   - emailAddresses
  """

  thrift_spec = (
    None, # 0
    (1, TType.STRING, 'taskID', None, "DO_NOT_SET_AT_CLIENTS", ), # 1
    (2, TType.I64, 'creationTime', None, None, ), # 2
    (3, TType.STRING, 'applicationId', None, None, ), # 3
    (4, TType.STRING, 'applicationVersion', None, None, ), # 4
    (5, TType.STRING, 'applicationDeploymentId', None, None, ), # 5
    (6, TType.LIST, 'applicationInputs', (TType.STRUCT,(apache.airavata.model.appcatalog.appinterface.ttypes.InputDataObjectType, apache.airavata.model.appcatalog.appinterface.ttypes.InputDataObjectType.thrift_spec)), None, ), # 6
    (7, TType.LIST, 'applicationOutputs', (TType.STRUCT,(apache.airavata.model.appcatalog.appinterface.ttypes.OutputDataObjectType, apache.airavata.model.appcatalog.appinterface.ttypes.OutputDataObjectType.thrift_spec)), None, ), # 7
    (8, TType.STRUCT, 'taskScheduling', (ComputationalResourceScheduling, ComputationalResourceScheduling.thrift_spec), None, ), # 8
    (9, TType.STRUCT, 'advancedInputDataHandling', (AdvancedInputDataHandling, AdvancedInputDataHandling.thrift_spec), None, ), # 9
    (10, TType.STRUCT, 'advancedOutputDataHandling', (AdvancedOutputDataHandling, AdvancedOutputDataHandling.thrift_spec), None, ), # 10
    (11, TType.STRUCT, 'taskStatus', (TaskStatus, TaskStatus.thrift_spec), None, ), # 11
    (12, TType.LIST, 'jobDetailsList', (TType.STRUCT,(JobDetails, JobDetails.thrift_spec)), None, ), # 12
    (13, TType.LIST, 'dataTransferDetailsList', (TType.STRUCT,(DataTransferDetails, DataTransferDetails.thrift_spec)), None, ), # 13
    (14, TType.LIST, 'errors', (TType.STRUCT,(ErrorDetails, ErrorDetails.thrift_spec)), None, ), # 14
    (15, TType.BOOL, 'enableEmailNotification', None, None, ), # 15
    (16, TType.LIST, 'emailAddresses', (TType.STRING,None), None, ), # 16
  )

  def __init__(self, taskID=thrift_spec[1][4], creationTime=None, applicationId=None, applicationVersion=None, applicationDeploymentId=None, applicationInputs=None, applicationOutputs=None, taskScheduling=None, advancedInputDataHandling=None, advancedOutputDataHandling=None, taskStatus=None, jobDetailsList=None, dataTransferDetailsList=None, errors=None, enableEmailNotification=None, emailAddresses=None,):
    self.taskID = taskID
    self.creationTime = creationTime
    self.applicationId = applicationId
    self.applicationVersion = applicationVersion
    self.applicationDeploymentId = applicationDeploymentId
    self.applicationInputs = applicationInputs
    self.applicationOutputs = applicationOutputs
    self.taskScheduling = taskScheduling
    self.advancedInputDataHandling = advancedInputDataHandling
    self.advancedOutputDataHandling = advancedOutputDataHandling
    self.taskStatus = taskStatus
    self.jobDetailsList = jobDetailsList
    self.dataTransferDetailsList = dataTransferDetailsList
    self.errors = errors
    self.enableEmailNotification = enableEmailNotification
    self.emailAddresses = emailAddresses

  def read(self, iprot):
    if iprot.__class__ == TBinaryProtocol.TBinaryProtocolAccelerated and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None and fastbinary is not None:
      fastbinary.decode_binary(self, iprot.trans, (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.taskID = iprot.readString();
        else:
          iprot.skip(ftype)
      elif fid == 2:
        if ftype == TType.I64:
          self.creationTime = iprot.readI64();
        else:
          iprot.skip(ftype)
      elif fid == 3:
        if ftype == TType.STRING:
          self.applicationId = iprot.readString();
        else:
          iprot.skip(ftype)
      elif fid == 4:
        if ftype == TType.STRING:
          self.applicationVersion = iprot.readString();
        else:
          iprot.skip(ftype)
      elif fid == 5:
        if ftype == TType.STRING:
          self.applicationDeploymentId = iprot.readString();
        else:
          iprot.skip(ftype)
      elif fid == 6:
        if ftype == TType.LIST:
          self.applicationInputs = []
          (_etype17, _size14) = iprot.readListBegin()
          for _i18 in xrange(_size14):
            _elem19 = apache.airavata.model.appcatalog.appinterface.ttypes.InputDataObjectType()
            _elem19.read(iprot)
            self.applicationInputs.append(_elem19)
          iprot.readListEnd()
        else:
          iprot.skip(ftype)
      elif fid == 7:
        if ftype == TType.LIST:
          self.applicationOutputs = []
          (_etype23, _size20) = iprot.readListBegin()
          for _i24 in xrange(_size20):
            _elem25 = apache.airavata.model.appcatalog.appinterface.ttypes.OutputDataObjectType()
            _elem25.read(iprot)
            self.applicationOutputs.append(_elem25)
          iprot.readListEnd()
        else:
          iprot.skip(ftype)
      elif fid == 8:
        if ftype == TType.STRUCT:
          self.taskScheduling = ComputationalResourceScheduling()
          self.taskScheduling.read(iprot)
        else:
          iprot.skip(ftype)
      elif fid == 9:
        if ftype == TType.STRUCT:
          self.advancedInputDataHandling = AdvancedInputDataHandling()
          self.advancedInputDataHandling.read(iprot)
        else:
          iprot.skip(ftype)
      elif fid == 10:
        if ftype == TType.STRUCT:
          self.advancedOutputDataHandling = AdvancedOutputDataHandling()
          self.advancedOutputDataHandling.read(iprot)
        else:
          iprot.skip(ftype)
      elif fid == 11:
        if ftype == TType.STRUCT:
          self.taskStatus = TaskStatus()
          self.taskStatus.read(iprot)
        else:
          iprot.skip(ftype)
      elif fid == 12:
        if ftype == TType.LIST:
          self.jobDetailsList = []
          (_etype29, _size26) = iprot.readListBegin()
          for _i30 in xrange(_size26):
            _elem31 = JobDetails()
            _elem31.read(iprot)
            self.jobDetailsList.append(_elem31)
          iprot.readListEnd()
        else:
          iprot.skip(ftype)
      elif fid == 13:
        if ftype == TType.LIST:
          self.dataTransferDetailsList = []
          (_etype35, _size32) = iprot.readListBegin()
          for _i36 in xrange(_size32):
            _elem37 = DataTransferDetails()
            _elem37.read(iprot)
            self.dataTransferDetailsList.append(_elem37)
          iprot.readListEnd()
        else:
          iprot.skip(ftype)
      elif fid == 14:
        if ftype == TType.LIST:
          self.errors = []
          (_etype41, _size38) = iprot.readListBegin()
          for _i42 in xrange(_size38):
            _elem43 = ErrorDetails()
            _elem43.read(iprot)
            self.errors.append(_elem43)
          iprot.readListEnd()
        else:
          iprot.skip(ftype)
      elif fid == 15:
        if ftype == TType.BOOL:
          self.enableEmailNotification = iprot.readBool();
        else:
          iprot.skip(ftype)
      elif fid == 16:
        if ftype == TType.LIST:
          self.emailAddresses = []
          (_etype47, _size44) = iprot.readListBegin()
          for _i48 in xrange(_size44):
            _elem49 = iprot.readString();
            self.emailAddresses.append(_elem49)
          iprot.readListEnd()
        else:
          iprot.skip(ftype)
      else:
        iprot.skip(ftype)
      iprot.readFieldEnd()
    iprot.readStructEnd()

  def write(self, oprot):
    if oprot.__class__ == TBinaryProtocol.TBinaryProtocolAccelerated and self.thrift_spec is not None and fastbinary is not None:
      oprot.trans.write(fastbinary.encode_binary(self, (self.__class__, self.thrift_spec)))
      return
    oprot.writeStructBegin('TaskDetails')
    if self.taskID is not None:
      oprot.writeFieldBegin('taskID', TType.STRING, 1)
      oprot.writeString(self.taskID)
      oprot.writeFieldEnd()
    if self.creationTime is not None:
      oprot.writeFieldBegin('creationTime', TType.I64, 2)
      oprot.writeI64(self.creationTime)
      oprot.writeFieldEnd()
    if self.applicationId is not None:
      oprot.writeFieldBegin('applicationId', TType.STRING, 3)
      oprot.writeString(self.applicationId)
      oprot.writeFieldEnd()
    if self.applicationVersion is not None:
      oprot.writeFieldBegin('applicationVersion', TType.STRING, 4)
      oprot.writeString(self.applicationVersion)
      oprot.writeFieldEnd()
    if self.applicationDeploymentId is not None:
      oprot.writeFieldBegin('applicationDeploymentId', TType.STRING, 5)
      oprot.writeString(self.applicationDeploymentId)
      oprot.writeFieldEnd()
    if self.applicationInputs is not None:
      oprot.writeFieldBegin('applicationInputs', TType.LIST, 6)
      oprot.writeListBegin(TType.STRUCT, len(self.applicationInputs))
      for iter50 in self.applicationInputs:
        iter50.write(oprot)
      oprot.writeListEnd()
      oprot.writeFieldEnd()
    if self.applicationOutputs is not None:
      oprot.writeFieldBegin('applicationOutputs', TType.LIST, 7)
      oprot.writeListBegin(TType.STRUCT, len(self.applicationOutputs))
      for iter51 in self.applicationOutputs:
        iter51.write(oprot)
      oprot.writeListEnd()
      oprot.writeFieldEnd()
    if self.taskScheduling is not None:
      oprot.writeFieldBegin('taskScheduling', TType.STRUCT, 8)
      self.taskScheduling.write(oprot)
      oprot.writeFieldEnd()
    if self.advancedInputDataHandling is not None:
      oprot.writeFieldBegin('advancedInputDataHandling', TType.STRUCT, 9)
      self.advancedInputDataHandling.write(oprot)
      oprot.writeFieldEnd()
    if self.advancedOutputDataHandling is not None:
      oprot.writeFieldBegin('advancedOutputDataHandling', TType.STRUCT, 10)
      self.advancedOutputDataHandling.write(oprot)
      oprot.writeFieldEnd()
    if self.taskStatus is not None:
      oprot.writeFieldBegin('taskStatus', TType.STRUCT, 11)
      self.taskStatus.write(oprot)
      oprot.writeFieldEnd()
    if self.jobDetailsList is not None:
      oprot.writeFieldBegin('jobDetailsList', TType.LIST, 12)
      oprot.writeListBegin(TType.STRUCT, len(self.jobDetailsList))
      for iter52 in self.jobDetailsList:
        iter52.write(oprot)
      oprot.writeListEnd()
      oprot.writeFieldEnd()
    if self.dataTransferDetailsList is not None:
      oprot.writeFieldBegin('dataTransferDetailsList', TType.LIST, 13)
      oprot.writeListBegin(TType.STRUCT, len(self.dataTransferDetailsList))
      for iter53 in self.dataTransferDetailsList:
        iter53.write(oprot)
      oprot.writeListEnd()
      oprot.writeFieldEnd()
    if self.errors is not None:
      oprot.writeFieldBegin('errors', TType.LIST, 14)
      oprot.writeListBegin(TType.STRUCT, len(self.errors))
      for iter54 in self.errors:
        iter54.write(oprot)
      oprot.writeListEnd()
      oprot.writeFieldEnd()
    if self.enableEmailNotification is not None:
      oprot.writeFieldBegin('enableEmailNotification', TType.BOOL, 15)
      oprot.writeBool(self.enableEmailNotification)
      oprot.writeFieldEnd()
    if self.emailAddresses is not None:
      oprot.writeFieldBegin('emailAddresses', TType.LIST, 16)
      oprot.writeListBegin(TType.STRING, len(self.emailAddresses))
      for iter55 in self.emailAddresses:
        oprot.writeString(iter55)
      oprot.writeListEnd()
      oprot.writeFieldEnd()
    oprot.writeFieldStop()
    oprot.writeStructEnd()

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


  def __hash__(self):
    value = 17
    value = (value * 31) ^ hash(self.taskID)
    value = (value * 31) ^ hash(self.creationTime)
    value = (value * 31) ^ hash(self.applicationId)
    value = (value * 31) ^ hash(self.applicationVersion)
    value = (value * 31) ^ hash(self.applicationDeploymentId)
    value = (value * 31) ^ hash(self.applicationInputs)
    value = (value * 31) ^ hash(self.applicationOutputs)
    value = (value * 31) ^ hash(self.taskScheduling)
    value = (value * 31) ^ hash(self.advancedInputDataHandling)
    value = (value * 31) ^ hash(self.advancedOutputDataHandling)
    value = (value * 31) ^ hash(self.taskStatus)
    value = (value * 31) ^ hash(self.jobDetailsList)
    value = (value * 31) ^ hash(self.dataTransferDetailsList)
    value = (value * 31) ^ hash(self.errors)
    value = (value * 31) ^ hash(self.enableEmailNotification)
    value = (value * 31) ^ hash(self.emailAddresses)
    return value

  def __repr__(self):
    L = ['%s=%r' % (key, value)
      for key, value in self.__dict__.iteritems()]
    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 WorkflowNodeDetails:
  """
  A structure holding the node data.
  nodeInstanceId - unique node identifier for each run

  Attributes:
   - nodeInstanceId
   - creationTime
   - nodeName
   - executionUnit
   - executionUnitData
   - nodeInputs
   - nodeOutputs
   - workflowNodeStatus
   - taskDetailsList
   - errors
  """

  thrift_spec = (
    None, # 0
    (1, TType.STRING, 'nodeInstanceId', None, "DO_NOT_SET_AT_CLIENTS", ), # 1
    (2, TType.I64, 'creationTime', None, None, ), # 2
    (3, TType.STRING, 'nodeName', None, "SINGLE_APP_NODE", ), # 3
    (4, TType.I32, 'executionUnit', None,     1, ), # 4
    (5, TType.STRING, 'executionUnitData', None, None, ), # 5
    (6, TType.LIST, 'nodeInputs', (TType.STRUCT,(apache.airavata.model.appcatalog.appinterface.ttypes.InputDataObjectType, apache.airavata.model.appcatalog.appinterface.ttypes.InputDataObjectType.thrift_spec)), None, ), # 6
    (7, TType.LIST, 'nodeOutputs', (TType.STRUCT,(apache.airavata.model.appcatalog.appinterface.ttypes.OutputDataObjectType, apache.airavata.model.appcatalog.appinterface.ttypes.OutputDataObjectType.thrift_spec)), None, ), # 7
    (8, TType.STRUCT, 'workflowNodeStatus', (WorkflowNodeStatus, WorkflowNodeStatus.thrift_spec), None, ), # 8
    (9, TType.LIST, 'taskDetailsList', (TType.STRUCT,(TaskDetails, TaskDetails.thrift_spec)), None, ), # 9
    (10, TType.LIST, 'errors', (TType.STRUCT,(ErrorDetails, ErrorDetails.thrift_spec)), None, ), # 10
  )

  def __init__(self, nodeInstanceId=thrift_spec[1][4], creationTime=None, nodeName=thrift_spec[3][4], executionUnit=thrift_spec[4][4], executionUnitData=None, nodeInputs=None, nodeOutputs=None, workflowNodeStatus=None, taskDetailsList=None, errors=None,):
    self.nodeInstanceId = nodeInstanceId
    self.creationTime = creationTime
    self.nodeName = nodeName
    self.executionUnit = executionUnit
    self.executionUnitData = executionUnitData
    self.nodeInputs = nodeInputs
    self.nodeOutputs = nodeOutputs
    self.workflowNodeStatus = workflowNodeStatus
    self.taskDetailsList = taskDetailsList
    self.errors = errors

  def read(self, iprot):
    if iprot.__class__ == TBinaryProtocol.TBinaryProtocolAccelerated and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None and fastbinary is not None:
      fastbinary.decode_binary(self, iprot.trans, (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.nodeInstanceId = iprot.readString();
        else:
          iprot.skip(ftype)
      elif fid == 2:
        if ftype == TType.I64:
          self.creationTime = iprot.readI64();
        else:
          iprot.skip(ftype)
      elif fid == 3:
        if ftype == TType.STRING:
          self.nodeName = iprot.readString();
        else:
          iprot.skip(ftype)
      elif fid == 4:
        if ftype == TType.I32:
          self.executionUnit = iprot.readI32();
        else:
          iprot.skip(ftype)
      elif fid == 5:
        if ftype == TType.STRING:
          self.executionUnitData = iprot.readString();
        else:
          iprot.skip(ftype)
      elif fid == 6:
        if ftype == TType.LIST:
          self.nodeInputs = []
          (_etype59, _size56) = iprot.readListBegin()
          for _i60 in xrange(_size56):
            _elem61 = apache.airavata.model.appcatalog.appinterface.ttypes.InputDataObjectType()
            _elem61.read(iprot)
            self.nodeInputs.append(_elem61)
          iprot.readListEnd()
        else:
          iprot.skip(ftype)
      elif fid == 7:
        if ftype == TType.LIST:
          self.nodeOutputs = []
          (_etype65, _size62) = iprot.readListBegin()
          for _i66 in xrange(_size62):
            _elem67 = apache.airavata.model.appcatalog.appinterface.ttypes.OutputDataObjectType()
            _elem67.read(iprot)
            self.nodeOutputs.append(_elem67)
          iprot.readListEnd()
        else:
          iprot.skip(ftype)
      elif fid == 8:
        if ftype == TType.STRUCT:
          self.workflowNodeStatus = WorkflowNodeStatus()
          self.workflowNodeStatus.read(iprot)
        else:
          iprot.skip(ftype)
      elif fid == 9:
        if ftype == TType.LIST:
          self.taskDetailsList = []
          (_etype71, _size68) = iprot.readListBegin()
          for _i72 in xrange(_size68):
            _elem73 = TaskDetails()
            _elem73.read(iprot)
            self.taskDetailsList.append(_elem73)
          iprot.readListEnd()
        else:
          iprot.skip(ftype)
      elif fid == 10:
        if ftype == TType.LIST:
          self.errors = []
          (_etype77, _size74) = iprot.readListBegin()
          for _i78 in xrange(_size74):
            _elem79 = ErrorDetails()
            _elem79.read(iprot)
            self.errors.append(_elem79)
          iprot.readListEnd()
        else:
          iprot.skip(ftype)
      else:
        iprot.skip(ftype)
      iprot.readFieldEnd()
    iprot.readStructEnd()

  def write(self, oprot):
    if oprot.__class__ == TBinaryProtocol.TBinaryProtocolAccelerated and self.thrift_spec is not None and fastbinary is not None:
      oprot.trans.write(fastbinary.encode_binary(self, (self.__class__, self.thrift_spec)))
      return
    oprot.writeStructBegin('WorkflowNodeDetails')
    if self.nodeInstanceId is not None:
      oprot.writeFieldBegin('nodeInstanceId', TType.STRING, 1)
      oprot.writeString(self.nodeInstanceId)
      oprot.writeFieldEnd()
    if self.creationTime is not None:
      oprot.writeFieldBegin('creationTime', TType.I64, 2)
      oprot.writeI64(self.creationTime)
      oprot.writeFieldEnd()
    if self.nodeName is not None:
      oprot.writeFieldBegin('nodeName', TType.STRING, 3)
      oprot.writeString(self.nodeName)
      oprot.writeFieldEnd()
    if self.executionUnit is not None:
      oprot.writeFieldBegin('executionUnit', TType.I32, 4)
      oprot.writeI32(self.executionUnit)
      oprot.writeFieldEnd()
    if self.executionUnitData is not None:
      oprot.writeFieldBegin('executionUnitData', TType.STRING, 5)
      oprot.writeString(self.executionUnitData)
      oprot.writeFieldEnd()
    if self.nodeInputs is not None:
      oprot.writeFieldBegin('nodeInputs', TType.LIST, 6)
      oprot.writeListBegin(TType.STRUCT, len(self.nodeInputs))
      for iter80 in self.nodeInputs:
        iter80.write(oprot)
      oprot.writeListEnd()
      oprot.writeFieldEnd()
    if self.nodeOutputs is not None:
      oprot.writeFieldBegin('nodeOutputs', TType.LIST, 7)
      oprot.writeListBegin(TType.STRUCT, len(self.nodeOutputs))
      for iter81 in self.nodeOutputs:
        iter81.write(oprot)
      oprot.writeListEnd()
      oprot.writeFieldEnd()
    if self.workflowNodeStatus is not None:
      oprot.writeFieldBegin('workflowNodeStatus', TType.STRUCT, 8)
      self.workflowNodeStatus.write(oprot)
      oprot.writeFieldEnd()
    if self.taskDetailsList is not None:
      oprot.writeFieldBegin('taskDetailsList', TType.LIST, 9)
      oprot.writeListBegin(TType.STRUCT, len(self.taskDetailsList))
      for iter82 in self.taskDetailsList:
        iter82.write(oprot)
      oprot.writeListEnd()
      oprot.writeFieldEnd()
    if self.errors is not None:
      oprot.writeFieldBegin('errors', TType.LIST, 10)
      oprot.writeListBegin(TType.STRUCT, len(self.errors))
      for iter83 in self.errors:
        iter83.write(oprot)
      oprot.writeListEnd()
      oprot.writeFieldEnd()
    oprot.writeFieldStop()
    oprot.writeStructEnd()

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


  def __hash__(self):
    value = 17
    value = (value * 31) ^ hash(self.nodeInstanceId)
    value = (value * 31) ^ hash(self.creationTime)
    value = (value * 31) ^ hash(self.nodeName)
    value = (value * 31) ^ hash(self.executionUnit)
    value = (value * 31) ^ hash(self.executionUnitData)
    value = (value * 31) ^ hash(self.nodeInputs)
    value = (value * 31) ^ hash(self.nodeOutputs)
    value = (value * 31) ^ hash(self.workflowNodeStatus)
    value = (value * 31) ^ hash(self.taskDetailsList)
    value = (value * 31) ^ hash(self.errors)
    return value

  def __repr__(self):
    L = ['%s=%r' % (key, value)
      for key, value in self.__dict__.iteritems()]
    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 ValidatorResult:
  """
  This data structure can be used to store the validation results
  captured during validation step and during the launchExperiment
  operation it can be easilly checked to see the errors occured
  during the experiment launch operation


  Attributes:
   - result
   - errorDetails
  """

  thrift_spec = (
    None, # 0
    (1, TType.BOOL, 'result', None, None, ), # 1
    (2, TType.STRING, 'errorDetails', None, None, ), # 2
  )

  def __init__(self, result=None, errorDetails=None,):
    self.result = result
    self.errorDetails = errorDetails

  def read(self, iprot):
    if iprot.__class__ == TBinaryProtocol.TBinaryProtocolAccelerated and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None and fastbinary is not None:
      fastbinary.decode_binary(self, iprot.trans, (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.BOOL:
          self.result = iprot.readBool();
        else:
          iprot.skip(ftype)
      elif fid == 2:
        if ftype == TType.STRING:
          self.errorDetails = iprot.readString();
        else:
          iprot.skip(ftype)
      else:
        iprot.skip(ftype)
      iprot.readFieldEnd()
    iprot.readStructEnd()

  def write(self, oprot):
    if oprot.__class__ == TBinaryProtocol.TBinaryProtocolAccelerated and self.thrift_spec is not None and fastbinary is not None:
      oprot.trans.write(fastbinary.encode_binary(self, (self.__class__, self.thrift_spec)))
      return
    oprot.writeStructBegin('ValidatorResult')
    if self.result is not None:
      oprot.writeFieldBegin('result', TType.BOOL, 1)
      oprot.writeBool(self.result)
      oprot.writeFieldEnd()
    if self.errorDetails is not None:
      oprot.writeFieldBegin('errorDetails', TType.STRING, 2)
      oprot.writeString(self.errorDetails)
      oprot.writeFieldEnd()
    oprot.writeFieldStop()
    oprot.writeStructEnd()

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


  def __hash__(self):
    value = 17
    value = (value * 31) ^ hash(self.result)
    value = (value * 31) ^ hash(self.errorDetails)
    return value

  def __repr__(self):
    L = ['%s=%r' % (key, value)
      for key, value in self.__dict__.iteritems()]
    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 ValidationResults:
  """
  Attributes:
   - validationState
   - validationResultList
  """

  thrift_spec = (
    None, # 0
    (1, TType.BOOL, 'validationState', None, None, ), # 1
    (2, TType.LIST, 'validationResultList', (TType.STRUCT,(ValidatorResult, ValidatorResult.thrift_spec)), None, ), # 2
  )

  def __init__(self, validationState=None, validationResultList=None,):
    self.validationState = validationState
    self.validationResultList = validationResultList

  def read(self, iprot):
    if iprot.__class__ == TBinaryProtocol.TBinaryProtocolAccelerated and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None and fastbinary is not None:
      fastbinary.decode_binary(self, iprot.trans, (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.BOOL:
          self.validationState = iprot.readBool();
        else:
          iprot.skip(ftype)
      elif fid == 2:
        if ftype == TType.LIST:
          self.validationResultList = []
          (_etype87, _size84) = iprot.readListBegin()
          for _i88 in xrange(_size84):
            _elem89 = ValidatorResult()
            _elem89.read(iprot)
            self.validationResultList.append(_elem89)
          iprot.readListEnd()
        else:
          iprot.skip(ftype)
      else:
        iprot.skip(ftype)
      iprot.readFieldEnd()
    iprot.readStructEnd()

  def write(self, oprot):
    if oprot.__class__ == TBinaryProtocol.TBinaryProtocolAccelerated and self.thrift_spec is not None and fastbinary is not None:
      oprot.trans.write(fastbinary.encode_binary(self, (self.__class__, self.thrift_spec)))
      return
    oprot.writeStructBegin('ValidationResults')
    if self.validationState is not None:
      oprot.writeFieldBegin('validationState', TType.BOOL, 1)
      oprot.writeBool(self.validationState)
      oprot.writeFieldEnd()
    if self.validationResultList is not None:
      oprot.writeFieldBegin('validationResultList', TType.LIST, 2)
      oprot.writeListBegin(TType.STRUCT, len(self.validationResultList))
      for iter90 in self.validationResultList:
        iter90.write(oprot)
      oprot.writeListEnd()
      oprot.writeFieldEnd()
    oprot.writeFieldStop()
    oprot.writeStructEnd()

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


  def __hash__(self):
    value = 17
    value = (value * 31) ^ hash(self.validationState)
    value = (value * 31) ^ hash(self.validationResultList)
    return value

  def __repr__(self):
    L = ['%s=%r' % (key, value)
      for key, value in self.__dict__.iteritems()]
    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 Experiment:
  """
  A structure holding the experiment metadata and its child models.

  userName:
    The user name of the targeted gateway end user on whose behalf the experiment is being created.
      the associated gateway identity can only be inferred from the security hand-shake so as to avoid
      authorized Airavata Clients mimicking an unauthorized request. If a gateway is not registered with
      Airavata, an authorization exception is thrown.

  experimentName:
    The name of the experiment as defined by the user. The name need not be unique as uniqueness is enforced
       by the generated experiment id.

  experimentDescription:
     The verbose description of the experiment. This is an optional parameter.

  Attributes:
   - experimentID
   - projectID
   - creationTime
   - userName
   - name
   - description
   - applicationId
   - applicationVersion
   - workflowTemplateId
   - workflowTemplateVersion
   - gatewayExecutionId
   - enableEmailNotification
   - emailAddresses
   - userConfigurationData
   - workflowExecutionInstanceId
   - experimentInputs
   - experimentOutputs
   - experimentStatus
   - stateChangeList
   - workflowNodeDetailsList
   - errors
  """

  thrift_spec = (
    None, # 0
    (1, TType.STRING, 'experimentID', None, "DO_NOT_SET_AT_CLIENTS", ), # 1
    (2, TType.STRING, 'projectID', None, "DEFAULT", ), # 2
    (3, TType.I64, 'creationTime', None, None, ), # 3
    (4, TType.STRING, 'userName', None, None, ), # 4
    (5, TType.STRING, 'name', None, None, ), # 5
    (6, TType.STRING, 'description', None, None, ), # 6
    (7, TType.STRING, 'applicationId', None, None, ), # 7
    (8, TType.STRING, 'applicationVersion', None, None, ), # 8
    (9, TType.STRING, 'workflowTemplateId', None, None, ), # 9
    (10, TType.STRING, 'workflowTemplateVersion', None, None, ), # 10
    (11, TType.STRING, 'gatewayExecutionId', None, None, ), # 11
    (12, TType.BOOL, 'enableEmailNotification', None, None, ), # 12
    (13, TType.LIST, 'emailAddresses', (TType.STRING,None), None, ), # 13
    (14, TType.STRUCT, 'userConfigurationData', (UserConfigurationData, UserConfigurationData.thrift_spec), None, ), # 14
    (15, TType.STRING, 'workflowExecutionInstanceId', None, None, ), # 15
    (16, TType.LIST, 'experimentInputs', (TType.STRUCT,(apache.airavata.model.appcatalog.appinterface.ttypes.InputDataObjectType, apache.airavata.model.appcatalog.appinterface.ttypes.InputDataObjectType.thrift_spec)), None, ), # 16
    (17, TType.LIST, 'experimentOutputs', (TType.STRUCT,(apache.airavata.model.appcatalog.appinterface.ttypes.OutputDataObjectType, apache.airavata.model.appcatalog.appinterface.ttypes.OutputDataObjectType.thrift_spec)), None, ), # 17
    (18, TType.STRUCT, 'experimentStatus', (ExperimentStatus, ExperimentStatus.thrift_spec), None, ), # 18
    (19, TType.LIST, 'stateChangeList', (TType.STRUCT,(WorkflowNodeStatus, WorkflowNodeStatus.thrift_spec)), None, ), # 19
    (20, TType.LIST, 'workflowNodeDetailsList', (TType.STRUCT,(WorkflowNodeDetails, WorkflowNodeDetails.thrift_spec)), None, ), # 20
    (21, TType.LIST, 'errors', (TType.STRUCT,(ErrorDetails, ErrorDetails.thrift_spec)), None, ), # 21
  )

  def __init__(self, experimentID=thrift_spec[1][4], projectID=thrift_spec[2][4], creationTime=None, userName=None, name=None, description=None, applicationId=None, applicationVersion=None, workflowTemplateId=None, workflowTemplateVersion=None, gatewayExecutionId=None, enableEmailNotification=None, emailAddresses=None, userConfigurationData=None, workflowExecutionInstanceId=None, experimentInputs=None, experimentOutputs=None, experimentStatus=None, stateChangeList=None, workflowNodeDetailsList=None, errors=None,):
    self.experimentID = experimentID
    self.projectID = projectID
    self.creationTime = creationTime
    self.userName = userName
    self.name = name
    self.description = description
    self.applicationId = applicationId
    self.applicationVersion = applicationVersion
    self.workflowTemplateId = workflowTemplateId
    self.workflowTemplateVersion = workflowTemplateVersion
    self.gatewayExecutionId = gatewayExecutionId
    self.enableEmailNotification = enableEmailNotification
    self.emailAddresses = emailAddresses
    self.userConfigurationData = userConfigurationData
    self.workflowExecutionInstanceId = workflowExecutionInstanceId
    self.experimentInputs = experimentInputs
    self.experimentOutputs = experimentOutputs
    self.experimentStatus = experimentStatus
    self.stateChangeList = stateChangeList
    self.workflowNodeDetailsList = workflowNodeDetailsList
    self.errors = errors

  def read(self, iprot):
    if iprot.__class__ == TBinaryProtocol.TBinaryProtocolAccelerated and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None and fastbinary is not None:
      fastbinary.decode_binary(self, iprot.trans, (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.experimentID = iprot.readString();
        else:
          iprot.skip(ftype)
      elif fid == 2:
        if ftype == TType.STRING:
          self.projectID = iprot.readString();
        else:
          iprot.skip(ftype)
      elif fid == 3:
        if ftype == TType.I64:
          self.creationTime = iprot.readI64();
        else:
          iprot.skip(ftype)
      elif fid == 4:
        if ftype == TType.STRING:
          self.userName = iprot.readString();
        else:
          iprot.skip(ftype)
      elif fid == 5:
        if ftype == TType.STRING:
          self.name = iprot.readString();
        else:
          iprot.skip(ftype)
      elif fid == 6:
        if ftype == TType.STRING:
          self.description = iprot.readString();
        else:
          iprot.skip(ftype)
      elif fid == 7:
        if ftype == TType.STRING:
          self.applicationId = iprot.readString();
        else:
          iprot.skip(ftype)
      elif fid == 8:
        if ftype == TType.STRING:
          self.applicationVersion = iprot.readString();
        else:
          iprot.skip(ftype)
      elif fid == 9:
        if ftype == TType.STRING:
          self.workflowTemplateId = iprot.readString();
        else:
          iprot.skip(ftype)
      elif fid == 10:
        if ftype == TType.STRING:
          self.workflowTemplateVersion = iprot.readString();
        else:
          iprot.skip(ftype)
      elif fid == 11:
        if ftype == TType.STRING:
          self.gatewayExecutionId = iprot.readString();
        else:
          iprot.skip(ftype)
      elif fid == 12:
        if ftype == TType.BOOL:
          self.enableEmailNotification = iprot.readBool();
        else:
          iprot.skip(ftype)
      elif fid == 13:
        if ftype == TType.LIST:
          self.emailAddresses = []
          (_etype94, _size91) = iprot.readListBegin()
          for _i95 in xrange(_size91):
            _elem96 = iprot.readString();
            self.emailAddresses.append(_elem96)
          iprot.readListEnd()
        else:
          iprot.skip(ftype)
      elif fid == 14:
        if ftype == TType.STRUCT:
          self.userConfigurationData = UserConfigurationData()
          self.userConfigurationData.read(iprot)
        else:
          iprot.skip(ftype)
      elif fid == 15:
        if ftype == TType.STRING:
          self.workflowExecutionInstanceId = iprot.readString();
        else:
          iprot.skip(ftype)
      elif fid == 16:
        if ftype == TType.LIST:
          self.experimentInputs = []
          (_etype100, _size97) = iprot.readListBegin()
          for _i101 in xrange(_size97):
            _elem102 = apache.airavata.model.appcatalog.appinterface.ttypes.InputDataObjectType()
            _elem102.read(iprot)
            self.experimentInputs.append(_elem102)
          iprot.readListEnd()
        else:
          iprot.skip(ftype)
      elif fid == 17:
        if ftype == TType.LIST:
          self.experimentOutputs = []
          (_etype106, _size103) = iprot.readListBegin()
          for _i107 in xrange(_size103):
            _elem108 = apache.airavata.model.appcatalog.appinterface.ttypes.OutputDataObjectType()
            _elem108.read(iprot)
            self.experimentOutputs.append(_elem108)
          iprot.readListEnd()
        else:
          iprot.skip(ftype)
      elif fid == 18:
        if ftype == TType.STRUCT:
          self.experimentStatus = ExperimentStatus()
          self.experimentStatus.read(iprot)
        else:
          iprot.skip(ftype)
      elif fid == 19:
        if ftype == TType.LIST:
          self.stateChangeList = []
          (_etype112, _size109) = iprot.readListBegin()
          for _i113 in xrange(_size109):
            _elem114 = WorkflowNodeStatus()
            _elem114.read(iprot)
            self.stateChangeList.append(_elem114)
          iprot.readListEnd()
        else:
          iprot.skip(ftype)
      elif fid == 20:
        if ftype == TType.LIST:
          self.workflowNodeDetailsList = []
          (_etype118, _size115) = iprot.readListBegin()
          for _i119 in xrange(_size115):
            _elem120 = WorkflowNodeDetails()
            _elem120.read(iprot)
            self.workflowNodeDetailsList.append(_elem120)
          iprot.readListEnd()
        else:
          iprot.skip(ftype)
      elif fid == 21:
        if ftype == TType.LIST:
          self.errors = []
          (_etype124, _size121) = iprot.readListBegin()
          for _i125 in xrange(_size121):
            _elem126 = ErrorDetails()
            _elem126.read(iprot)
            self.errors.append(_elem126)
          iprot.readListEnd()
        else:
          iprot.skip(ftype)
      else:
        iprot.skip(ftype)
      iprot.readFieldEnd()
    iprot.readStructEnd()

  def write(self, oprot):
    if oprot.__class__ == TBinaryProtocol.TBinaryProtocolAccelerated and self.thrift_spec is not None and fastbinary is not None:
      oprot.trans.write(fastbinary.encode_binary(self, (self.__class__, self.thrift_spec)))
      return
    oprot.writeStructBegin('Experiment')
    if self.experimentID is not None:
      oprot.writeFieldBegin('experimentID', TType.STRING, 1)
      oprot.writeString(self.experimentID)
      oprot.writeFieldEnd()
    if self.projectID is not None:
      oprot.writeFieldBegin('projectID', TType.STRING, 2)
      oprot.writeString(self.projectID)
      oprot.writeFieldEnd()
    if self.creationTime is not None:
      oprot.writeFieldBegin('creationTime', TType.I64, 3)
      oprot.writeI64(self.creationTime)
      oprot.writeFieldEnd()
    if self.userName is not None:
      oprot.writeFieldBegin('userName', TType.STRING, 4)
      oprot.writeString(self.userName)
      oprot.writeFieldEnd()
    if self.name is not None:
      oprot.writeFieldBegin('name', TType.STRING, 5)
      oprot.writeString(self.name)
      oprot.writeFieldEnd()
    if self.description is not None:
      oprot.writeFieldBegin('description', TType.STRING, 6)
      oprot.writeString(self.description)
      oprot.writeFieldEnd()
    if self.applicationId is not None:
      oprot.writeFieldBegin('applicationId', TType.STRING, 7)
      oprot.writeString(self.applicationId)
      oprot.writeFieldEnd()
    if self.applicationVersion is not None:
      oprot.writeFieldBegin('applicationVersion', TType.STRING, 8)
      oprot.writeString(self.applicationVersion)
      oprot.writeFieldEnd()
    if self.workflowTemplateId is not None:
      oprot.writeFieldBegin('workflowTemplateId', TType.STRING, 9)
      oprot.writeString(self.workflowTemplateId)
      oprot.writeFieldEnd()
    if self.workflowTemplateVersion is not None:
      oprot.writeFieldBegin('workflowTemplateVersion', TType.STRING, 10)
      oprot.writeString(self.workflowTemplateVersion)
      oprot.writeFieldEnd()
    if self.gatewayExecutionId is not None:
      oprot.writeFieldBegin('gatewayExecutionId', TType.STRING, 11)
      oprot.writeString(self.gatewayExecutionId)
      oprot.writeFieldEnd()
    if self.enableEmailNotification is not None:
      oprot.writeFieldBegin('enableEmailNotification', TType.BOOL, 12)
      oprot.writeBool(self.enableEmailNotification)
      oprot.writeFieldEnd()
    if self.emailAddresses is not None:
      oprot.writeFieldBegin('emailAddresses', TType.LIST, 13)
      oprot.writeListBegin(TType.STRING, len(self.emailAddresses))
      for iter127 in self.emailAddresses:
        oprot.writeString(iter127)
      oprot.writeListEnd()
      oprot.writeFieldEnd()
    if self.userConfigurationData is not None:
      oprot.writeFieldBegin('userConfigurationData', TType.STRUCT, 14)
      self.userConfigurationData.write(oprot)
      oprot.writeFieldEnd()
    if self.workflowExecutionInstanceId is not None:
      oprot.writeFieldBegin('workflowExecutionInstanceId', TType.STRING, 15)
      oprot.writeString(self.workflowExecutionInstanceId)
      oprot.writeFieldEnd()
    if self.experimentInputs is not None:
      oprot.writeFieldBegin('experimentInputs', TType.LIST, 16)
      oprot.writeListBegin(TType.STRUCT, len(self.experimentInputs))
      for iter128 in self.experimentInputs:
        iter128.write(oprot)
      oprot.writeListEnd()
      oprot.writeFieldEnd()
    if self.experimentOutputs is not None:
      oprot.writeFieldBegin('experimentOutputs', TType.LIST, 17)
      oprot.writeListBegin(TType.STRUCT, len(self.experimentOutputs))
      for iter129 in self.experimentOutputs:
        iter129.write(oprot)
      oprot.writeListEnd()
      oprot.writeFieldEnd()
    if self.experimentStatus is not None:
      oprot.writeFieldBegin('experimentStatus', TType.STRUCT, 18)
      self.experimentStatus.write(oprot)
      oprot.writeFieldEnd()
    if self.stateChangeList is not None:
      oprot.writeFieldBegin('stateChangeList', TType.LIST, 19)
      oprot.writeListBegin(TType.STRUCT, len(self.stateChangeList))
      for iter130 in self.stateChangeList:
        iter130.write(oprot)
      oprot.writeListEnd()
      oprot.writeFieldEnd()
    if self.workflowNodeDetailsList is not None:
      oprot.writeFieldBegin('workflowNodeDetailsList', TType.LIST, 20)
      oprot.writeListBegin(TType.STRUCT, len(self.workflowNodeDetailsList))
      for iter131 in self.workflowNodeDetailsList:
        iter131.write(oprot)
      oprot.writeListEnd()
      oprot.writeFieldEnd()
    if self.errors is not None:
      oprot.writeFieldBegin('errors', TType.LIST, 21)
      oprot.writeListBegin(TType.STRUCT, len(self.errors))
      for iter132 in self.errors:
        iter132.write(oprot)
      oprot.writeListEnd()
      oprot.writeFieldEnd()
    oprot.writeFieldStop()
    oprot.writeStructEnd()

  def validate(self):
    if self.experimentID is None:
      raise TProtocol.TProtocolException(message='Required field experimentID is unset!')
    if self.projectID is None:
      raise TProtocol.TProtocolException(message='Required field projectID is unset!')
    if self.userName is None:
      raise TProtocol.TProtocolException(message='Required field userName is unset!')
    if self.name is None:
      raise TProtocol.TProtocolException(message='Required field name is unset!')
    return


  def __hash__(self):
    value = 17
    value = (value * 31) ^ hash(self.experimentID)
    value = (value * 31) ^ hash(self.projectID)
    value = (value * 31) ^ hash(self.creationTime)
    value = (value * 31) ^ hash(self.userName)
    value = (value * 31) ^ hash(self.name)
    value = (value * 31) ^ hash(self.description)
    value = (value * 31) ^ hash(self.applicationId)
    value = (value * 31) ^ hash(self.applicationVersion)
    value = (value * 31) ^ hash(self.workflowTemplateId)
    value = (value * 31) ^ hash(self.workflowTemplateVersion)
    value = (value * 31) ^ hash(self.gatewayExecutionId)
    value = (value * 31) ^ hash(self.enableEmailNotification)
    value = (value * 31) ^ hash(self.emailAddresses)
    value = (value * 31) ^ hash(self.userConfigurationData)
    value = (value * 31) ^ hash(self.workflowExecutionInstanceId)
    value = (value * 31) ^ hash(self.experimentInputs)
    value = (value * 31) ^ hash(self.experimentOutputs)
    value = (value * 31) ^ hash(self.experimentStatus)
    value = (value * 31) ^ hash(self.stateChangeList)
    value = (value * 31) ^ hash(self.workflowNodeDetailsList)
    value = (value * 31) ^ hash(self.errors)
    return value

  def __repr__(self):
    L = ['%s=%r' % (key, value)
      for key, value in self.__dict__.iteritems()]
    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 ExperimentSummary:
  """
  Attributes:
   - experimentID
   - projectID
   - creationTime
   - userName
   - name
   - description
   - applicationId
   - experimentStatus
  """

  thrift_spec = (
    None, # 0
    (1, TType.STRING, 'experimentID', None, None, ), # 1
    (2, TType.STRING, 'projectID', None, None, ), # 2
    (3, TType.I64, 'creationTime', None, None, ), # 3
    (4, TType.STRING, 'userName', None, None, ), # 4
    (5, TType.STRING, 'name', None, None, ), # 5
    (6, TType.STRING, 'description', None, None, ), # 6
    (7, TType.STRING, 'applicationId', None, None, ), # 7
    (8, TType.STRUCT, 'experimentStatus', (ExperimentStatus, ExperimentStatus.thrift_spec), None, ), # 8
  )

  def __init__(self, experimentID=None, projectID=None, creationTime=None, userName=None, name=None, description=None, applicationId=None, experimentStatus=None,):
    self.experimentID = experimentID
    self.projectID = projectID
    self.creationTime = creationTime
    self.userName = userName
    self.name = name
    self.description = description
    self.applicationId = applicationId
    self.experimentStatus = experimentStatus

  def read(self, iprot):
    if iprot.__class__ == TBinaryProtocol.TBinaryProtocolAccelerated and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None and fastbinary is not None:
      fastbinary.decode_binary(self, iprot.trans, (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.experimentID = iprot.readString();
        else:
          iprot.skip(ftype)
      elif fid == 2:
        if ftype == TType.STRING:
          self.projectID = iprot.readString();
        else:
          iprot.skip(ftype)
      elif fid == 3:
        if ftype == TType.I64:
          self.creationTime = iprot.readI64();
        else:
          iprot.skip(ftype)
      elif fid == 4:
        if ftype == TType.STRING:
          self.userName = iprot.readString();
        else:
          iprot.skip(ftype)
      elif fid == 5:
        if ftype == TType.STRING:
          self.name = iprot.readString();
        else:
          iprot.skip(ftype)
      elif fid == 6:
        if ftype == TType.STRING:
          self.description = iprot.readString();
        else:
          iprot.skip(ftype)
      elif fid == 7:
        if ftype == TType.STRING:
          self.applicationId = iprot.readString();
        else:
          iprot.skip(ftype)
      elif fid == 8:
        if ftype == TType.STRUCT:
          self.experimentStatus = ExperimentStatus()
          self.experimentStatus.read(iprot)
        else:
          iprot.skip(ftype)
      else:
        iprot.skip(ftype)
      iprot.readFieldEnd()
    iprot.readStructEnd()

  def write(self, oprot):
    if oprot.__class__ == TBinaryProtocol.TBinaryProtocolAccelerated and self.thrift_spec is not None and fastbinary is not None:
      oprot.trans.write(fastbinary.encode_binary(self, (self.__class__, self.thrift_spec)))
      return
    oprot.writeStructBegin('ExperimentSummary')
    if self.experimentID is not None:
      oprot.writeFieldBegin('experimentID', TType.STRING, 1)
      oprot.writeString(self.experimentID)
      oprot.writeFieldEnd()
    if self.projectID is not None:
      oprot.writeFieldBegin('projectID', TType.STRING, 2)
      oprot.writeString(self.projectID)
      oprot.writeFieldEnd()
    if self.creationTime is not None:
      oprot.writeFieldBegin('creationTime', TType.I64, 3)
      oprot.writeI64(self.creationTime)
      oprot.writeFieldEnd()
    if self.userName is not None:
      oprot.writeFieldBegin('userName', TType.STRING, 4)
      oprot.writeString(self.userName)
      oprot.writeFieldEnd()
    if self.name is not None:
      oprot.writeFieldBegin('name', TType.STRING, 5)
      oprot.writeString(self.name)
      oprot.writeFieldEnd()
    if self.description is not None:
      oprot.writeFieldBegin('description', TType.STRING, 6)
      oprot.writeString(self.description)
      oprot.writeFieldEnd()
    if self.applicationId is not None:
      oprot.writeFieldBegin('applicationId', TType.STRING, 7)
      oprot.writeString(self.applicationId)
      oprot.writeFieldEnd()
    if self.experimentStatus is not None:
      oprot.writeFieldBegin('experimentStatus', TType.STRUCT, 8)
      self.experimentStatus.write(oprot)
      oprot.writeFieldEnd()
    oprot.writeFieldStop()
    oprot.writeStructEnd()

  def validate(self):
    if self.experimentID is None:
      raise TProtocol.TProtocolException(message='Required field experimentID is unset!')
    if self.projectID is None:
      raise TProtocol.TProtocolException(message='Required field projectID is unset!')
    if self.userName is None:
      raise TProtocol.TProtocolException(message='Required field userName is unset!')
    if self.name is None:
      raise TProtocol.TProtocolException(message='Required field name is unset!')
    return


  def __hash__(self):
    value = 17
    value = (value * 31) ^ hash(self.experimentID)
    value = (value * 31) ^ hash(self.projectID)
    value = (value * 31) ^ hash(self.creationTime)
    value = (value * 31) ^ hash(self.userName)
    value = (value * 31) ^ hash(self.name)
    value = (value * 31) ^ hash(self.description)
    value = (value * 31) ^ hash(self.applicationId)
    value = (value * 31) ^ hash(self.experimentStatus)
    return value

  def __repr__(self):
    L = ['%s=%r' % (key, value)
      for key, value in self.__dict__.iteritems()]
    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 ExperimentStatistics:
  """
  Attributes:
   - allExperimentCount
   - completedExperimentCount
   - cancelledExperimentCount
   - failedExperimentCount
   - allExperiments
   - completedExperiments
   - failedExperiments
   - cancelledExperiments
  """

  thrift_spec = (
    None, # 0
    (1, TType.I32, 'allExperimentCount', None, None, ), # 1
    (2, TType.I32, 'completedExperimentCount', None, None, ), # 2
    (3, TType.I32, 'cancelledExperimentCount', None, None, ), # 3
    (4, TType.I32, 'failedExperimentCount', None, None, ), # 4
    (5, TType.LIST, 'allExperiments', (TType.STRUCT,(ExperimentSummary, ExperimentSummary.thrift_spec)), None, ), # 5
    (6, TType.LIST, 'completedExperiments', (TType.STRUCT,(ExperimentSummary, ExperimentSummary.thrift_spec)), None, ), # 6
    (7, TType.LIST, 'failedExperiments', (TType.STRUCT,(ExperimentSummary, ExperimentSummary.thrift_spec)), None, ), # 7
    (8, TType.LIST, 'cancelledExperiments', (TType.STRUCT,(ExperimentSummary, ExperimentSummary.thrift_spec)), None, ), # 8
  )

  def __init__(self, allExperimentCount=None, completedExperimentCount=None, cancelledExperimentCount=None, failedExperimentCount=None, allExperiments=None, completedExperiments=None, failedExperiments=None, cancelledExperiments=None,):
    self.allExperimentCount = allExperimentCount
    self.completedExperimentCount = completedExperimentCount
    self.cancelledExperimentCount = cancelledExperimentCount
    self.failedExperimentCount = failedExperimentCount
    self.allExperiments = allExperiments
    self.completedExperiments = completedExperiments
    self.failedExperiments = failedExperiments
    self.cancelledExperiments = cancelledExperiments

  def read(self, iprot):
    if iprot.__class__ == TBinaryProtocol.TBinaryProtocolAccelerated and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None and fastbinary is not None:
      fastbinary.decode_binary(self, iprot.trans, (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.I32:
          self.allExperimentCount = iprot.readI32();
        else:
          iprot.skip(ftype)
      elif fid == 2:
        if ftype == TType.I32:
          self.completedExperimentCount = iprot.readI32();
        else:
          iprot.skip(ftype)
      elif fid == 3:
        if ftype == TType.I32:
          self.cancelledExperimentCount = iprot.readI32();
        else:
          iprot.skip(ftype)
      elif fid == 4:
        if ftype == TType.I32:
          self.failedExperimentCount = iprot.readI32();
        else:
          iprot.skip(ftype)
      elif fid == 5:
        if ftype == TType.LIST:
          self.allExperiments = []
          (_etype136, _size133) = iprot.readListBegin()
          for _i137 in xrange(_size133):
            _elem138 = ExperimentSummary()
            _elem138.read(iprot)
            self.allExperiments.append(_elem138)
          iprot.readListEnd()
        else:
          iprot.skip(ftype)
      elif fid == 6:
        if ftype == TType.LIST:
          self.completedExperiments = []
          (_etype142, _size139) = iprot.readListBegin()
          for _i143 in xrange(_size139):
            _elem144 = ExperimentSummary()
            _elem144.read(iprot)
            self.completedExperiments.append(_elem144)
          iprot.readListEnd()
        else:
          iprot.skip(ftype)
      elif fid == 7:
        if ftype == TType.LIST:
          self.failedExperiments = []
          (_etype148, _size145) = iprot.readListBegin()
          for _i149 in xrange(_size145):
            _elem150 = ExperimentSummary()
            _elem150.read(iprot)
            self.failedExperiments.append(_elem150)
          iprot.readListEnd()
        else:
          iprot.skip(ftype)
      elif fid == 8:
        if ftype == TType.LIST:
          self.cancelledExperiments = []
          (_etype154, _size151) = iprot.readListBegin()
          for _i155 in xrange(_size151):
            _elem156 = ExperimentSummary()
            _elem156.read(iprot)
            self.cancelledExperiments.append(_elem156)
          iprot.readListEnd()
        else:
          iprot.skip(ftype)
      else:
        iprot.skip(ftype)
      iprot.readFieldEnd()
    iprot.readStructEnd()

  def write(self, oprot):
    if oprot.__class__ == TBinaryProtocol.TBinaryProtocolAccelerated and self.thrift_spec is not None and fastbinary is not None:
      oprot.trans.write(fastbinary.encode_binary(self, (self.__class__, self.thrift_spec)))
      return
    oprot.writeStructBegin('ExperimentStatistics')
    if self.allExperimentCount is not None:
      oprot.writeFieldBegin('allExperimentCount', TType.I32, 1)
      oprot.writeI32(self.allExperimentCount)
      oprot.writeFieldEnd()
    if self.completedExperimentCount is not None:
      oprot.writeFieldBegin('completedExperimentCount', TType.I32, 2)
      oprot.writeI32(self.completedExperimentCount)
      oprot.writeFieldEnd()
    if self.cancelledExperimentCount is not None:
      oprot.writeFieldBegin('cancelledExperimentCount', TType.I32, 3)
      oprot.writeI32(self.cancelledExperimentCount)
      oprot.writeFieldEnd()
    if self.failedExperimentCount is not None:
      oprot.writeFieldBegin('failedExperimentCount', TType.I32, 4)
      oprot.writeI32(self.failedExperimentCount)
      oprot.writeFieldEnd()
    if self.allExperiments is not None:
      oprot.writeFieldBegin('allExperiments', TType.LIST, 5)
      oprot.writeListBegin(TType.STRUCT, len(self.allExperiments))
      for iter157 in self.allExperiments:
        iter157.write(oprot)
      oprot.writeListEnd()
      oprot.writeFieldEnd()
    if self.completedExperiments is not None:
      oprot.writeFieldBegin('completedExperiments', TType.LIST, 6)
      oprot.writeListBegin(TType.STRUCT, len(self.completedExperiments))
      for iter158 in self.completedExperiments:
        iter158.write(oprot)
      oprot.writeListEnd()
      oprot.writeFieldEnd()
    if self.failedExperiments is not None:
      oprot.writeFieldBegin('failedExperiments', TType.LIST, 7)
      oprot.writeListBegin(TType.STRUCT, len(self.failedExperiments))
      for iter159 in self.failedExperiments:
        iter159.write(oprot)
      oprot.writeListEnd()
      oprot.writeFieldEnd()
    if self.cancelledExperiments is not None:
      oprot.writeFieldBegin('cancelledExperiments', TType.LIST, 8)
      oprot.writeListBegin(TType.STRUCT, len(self.cancelledExperiments))
      for iter160 in self.cancelledExperiments:
        iter160.write(oprot)
      oprot.writeListEnd()
      oprot.writeFieldEnd()
    oprot.writeFieldStop()
    oprot.writeStructEnd()

  def validate(self):
    if self.allExperimentCount is None:
      raise TProtocol.TProtocolException(message='Required field allExperimentCount is unset!')
    if self.completedExperimentCount is None:
      raise TProtocol.TProtocolException(message='Required field completedExperimentCount is unset!')
    if self.failedExperimentCount is None:
      raise TProtocol.TProtocolException(message='Required field failedExperimentCount is unset!')
    if self.allExperiments is None:
      raise TProtocol.TProtocolException(message='Required field allExperiments is unset!')
    return


  def __hash__(self):
    value = 17
    value = (value * 31) ^ hash(self.allExperimentCount)
    value = (value * 31) ^ hash(self.completedExperimentCount)
    value = (value * 31) ^ hash(self.cancelledExperimentCount)
    value = (value * 31) ^ hash(self.failedExperimentCount)
    value = (value * 31) ^ hash(self.allExperiments)
    value = (value * 31) ^ hash(self.completedExperiments)
    value = (value * 31) ^ hash(self.failedExperiments)
    value = (value * 31) ^ hash(self.cancelledExperiments)
    return value

  def __repr__(self):
    L = ['%s=%r' % (key, value)
      for key, value in self.__dict__.iteritems()]
    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)
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -



