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

from thrift.Thrift import TType, TMessageType, TFrozenDict, TException, TApplicationException
from thrift.protocol.TProtocol import TProtocolException
import sys
import logging
from .ttypes import *
from thrift.Thrift import TProcessor
from thrift.transport import TTransport


class Iface(object):
    def getAPIVersion(self, authzToken):
        """
        Fetch Apache Airavata API version


        Parameters:
         - authzToken
        """
        pass

    def isUserExists(self, authzToken, gatewayId, userName):
        """
        Verify if User Exists within Airavata.

        @param gatewayId

         @param userName

        @return true/false



        Parameters:
         - authzToken
         - gatewayId
         - userName
        """
        pass

    def addGateway(self, authzToken, gateway):
        """
        Register a Gateway with Airavata.

        @param gateway
           The gateway data model.

        @return gatewayId
          Th unique identifier of the  newly registered gateway.



        Parameters:
         - authzToken
         - gateway
        """
        pass

    def getAllUsersInGateway(self, authzToken, gatewayId):
        """
        Get all users in the gateway

        @param gatewayId
           The gateway data model.

        @return users
          list of usernames of the users in the gateway



        Parameters:
         - authzToken
         - gatewayId
        """
        pass

    def updateGateway(self, authzToken, gatewayId, updatedGateway):
        """
        Update previously registered Gateway metadata.

        @param gatewayId
           The gateway Id of the Gateway which require an update.

        @return gateway
           Modified gateway obejct.

        @exception AiravataClientException



        Parameters:
         - authzToken
         - gatewayId
         - updatedGateway
        """
        pass

    def getGateway(self, authzToken, gatewayId):
        """
        Get Gateway details by providing gatewayId

        @param gatewayId
           The gateway Id of the Gateway.

        @return gateway
           Gateway obejct.



        Parameters:
         - authzToken
         - gatewayId
        """
        pass

    def deleteGateway(self, authzToken, gatewayId):
        """
        Delete a Gateway

        @param gatewayId
           The gateway Id of the Gateway to be deleted.

        @return boolean
           Boolean identifier for the success or failure of the deletion operation.



        Parameters:
         - authzToken
         - gatewayId
        """
        pass

    def getAllGateways(self, authzToken):
        """
        Get All the Gateways Connected to Airavata.


        Parameters:
         - authzToken
        """
        pass

    def isGatewayExist(self, authzToken, gatewayId):
        """
        Check for the Existance of a Gateway within Airavata

        @param gatewayId
          Provide the gatewayId of the gateway you want to check the existancy

        @return boolean
          Boolean idetifier for the existance or non-existane of the gatewayId

        @return gatewayId
          return the gatewayId of the existing gateway.



        Parameters:
         - authzToken
         - gatewayId
        """
        pass

    def createNotification(self, authzToken, notification):
        """
          * API methods to retrieve notifications
        *

        Parameters:
         - authzToken
         - notification
        """
        pass

    def updateNotification(self, authzToken, notification):
        """
        Parameters:
         - authzToken
         - notification
        """
        pass

    def deleteNotification(self, authzToken, gatewayId, notificationId):
        """
        Parameters:
         - authzToken
         - gatewayId
         - notificationId
        """
        pass

    def getNotification(self, authzToken, gatewayId, notificationId):
        """
        Parameters:
         - authzToken
         - gatewayId
         - notificationId
        """
        pass

    def getAllNotifications(self, authzToken, gatewayId):
        """
        Parameters:
         - authzToken
         - gatewayId
        """
        pass

    def generateAndRegisterSSHKeys(self, authzToken, gatewayId, userName, description, credentialOwnerType):
        """
        Generate and Register SSH Key Pair with Airavata Credential Store.

        @param gatewayId
           The identifier for the requested Gateway.

        @param userName
           The User for which the credential should be registered. For community accounts, this user is the name of the
           community user name. For computational resources, this user name need not be the same user name on resoruces.

        @param description
           The description field for a credential type, all type of credential can have a description.

        @param credentialOwnerType
           The type of owner of this credential. Two possible values: GATEWAY (default) and USER

        @return airavataCredStoreToken
          An SSH Key pair is generated and stored in the credential store and associated with users or community account
          belonging to a Gateway.



        Parameters:
         - authzToken
         - gatewayId
         - userName
         - description
         - credentialOwnerType
        """
        pass

    def registerPwdCredential(self, authzToken, gatewayId, portalUserName, loginUserName, password, description):
        """
        Generate and Register Username PWD Pair with Airavata Credential Store.

        @param gatewayId
           The identifier for the requested Gateway.

        @param portalUserName
           The User for which the credential should be registered. For community accounts, this user is the name of the
           community user name. For computational resources, this user name need not be the same user name on resoruces.

        @param loginUserName

        @param password

        @return airavataCredStoreToken
          An SSH Key pair is generated and stored in the credential store and associated with users or community account
          belonging to a Gateway.



        Parameters:
         - authzToken
         - gatewayId
         - portalUserName
         - loginUserName
         - password
         - description
        """
        pass

    def getSSHPubKey(self, authzToken, airavataCredStoreToken, gatewayId):
        """
        Get a Public Key by Providing the Token

        @param CredStoreToken
           Credential Store Token which you want to find the Public Key for.

        @param gatewayId
           This is the unique identifier of your gateway where the token and public key was generated from.

        @return publicKey



        Parameters:
         - authzToken
         - airavataCredStoreToken
         - gatewayId
        """
        pass

    def getAllGatewaySSHPubKeys(self, authzToken, gatewayId):
        """

        Get all Public Keys of the Gateway

        @param CredStoreToken
           Credential Store Token which you want to find the Public Key for.

        @param gatewayId
           This is the unique identifier of your gateway where the token and public key was generated from.

        @return publicKey



        Parameters:
         - authzToken
         - gatewayId
        """
        pass

    def getAllCredentialSummaryForGateway(self, authzToken, type, gatewayId):
        """

        Get all Credential summaries for the Gateway

        @param CredStoreToken
           Credential Store Token which you want to find the Public Key for.

        @param credential_store_data_models.SummaryType
           Summary type : SSH,PASSWD or CERT

        @param gatewayId
           This is the unique identifier of your gateway where the token and public key was generated from.

        @return List of Credential Summary Objects



        Parameters:
         - authzToken
         - type
         - gatewayId
        """
        pass

    def getAllCredentialSummaryForUsersInGateway(self, authzToken, type, gatewayId, userId):
        """

        Get all Credential summaries for user in a Gateway

        @param CredStoreToken
           Credential Store Token which you want to find the Public Key for.

        @param credential_store_data_models.SummaryType
           Summary type : SSH,PASSWD or CERT

        @param gatewayId
           This is the unique identifier of your gateway where the token and public key was generated from.

        @param userId
           This is the unique identifier of user whose public keys are to be fetched.

        @return CredentialSummary



        Parameters:
         - authzToken
         - type
         - gatewayId
         - userId
        """
        pass

    def getAllGatewayPWDCredentials(self, authzToken, gatewayId):
        """
        Parameters:
         - authzToken
         - gatewayId
        """
        pass

    def deleteSSHPubKey(self, authzToken, airavataCredStoreToken, gatewayId):
        """

        Delete a Gateway

        @param gatewayId
           The gateway Id of the Gateway to be deleted.

        @return boolean
           Boolean identifier for the success or failure of the deletion operation.



        Parameters:
         - authzToken
         - airavataCredStoreToken
         - gatewayId
        """
        pass

    def deletePWDCredential(self, authzToken, airavataCredStoreToken, gatewayId):
        """
        Parameters:
         - authzToken
         - airavataCredStoreToken
         - gatewayId
        """
        pass

    def createProject(self, authzToken, gatewayId, project):
        """

        Creates a Project with basic metadata.
           A Project is a container of experiments.

        @param gatewayId
           The identifier for the requested gateway.

        @param Project
           The Project Object described in the workspace_model.



        Parameters:
         - authzToken
         - gatewayId
         - project
        """
        pass

    def updateProject(self, authzToken, projectId, updatedProject):
        """

        Update an Existing Project

        @param projectId
           The projectId of the project needed an update.

        @return void
           Currently this does not return any value.



        Parameters:
         - authzToken
         - projectId
         - updatedProject
        """
        pass

    def getProject(self, authzToken, projectId):
        """

        Get a Project by ID
           This method is to obtain a project by providing a projectId.

        @param projectId
           projectId of the project you require.

        @return project
           project data model will be returned.



        Parameters:
         - authzToken
         - projectId
        """
        pass

    def deleteProject(self, authzToken, projectId):
        """

        Delete a Project
           This method is used to delete an existing Project.

        @param projectId
           projectId of the project you want to delete.

        @return boolean
           Boolean identifier for the success or failure of the deletion operation.

           NOTE: This method is not used within gateways connected with Airavata.



        Parameters:
         - authzToken
         - projectId
        """
        pass

    def getUserProjects(self, authzToken, gatewayId, userName, limit, offset):
        """

        Get All User Projects
        Get all Project for the user with pagination. Results will be ordered based on creation time DESC.

        @param gatewayId
           The identifier for the requested gateway.

        @param userName
           The identifier of the user.

        @param limit
           The amount results to be fetched.

        @param offset
           The starting point of the results to be fetched.



        Parameters:
         - authzToken
         - gatewayId
         - userName
         - limit
         - offset
        """
        pass

    def searchProjects(self, authzToken, gatewayId, userName, filters, limit, offset):
        """

        Search User Projects
        Search and get all Projects for user by project description or/and project name  with pagination.
        Results will be ordered based on creation time DESC.

        @param gatewayId
           The unique identifier of the gateway making the request.

        @param userName
           The identifier of the user.

        @param filters
           Map of multiple filter criteria. Currenlt search filters includes Project Name and Project Description

        @param limit
           The amount results to be fetched.

        @param offset
           The starting point of the results to be fetched.



        Parameters:
         - authzToken
         - gatewayId
         - userName
         - filters
         - limit
         - offset
        """
        pass

    def searchExperiments(self, authzToken, gatewayId, userName, filters, limit, offset):
        """
        Search Experiments.
        Search Experiments by using multiple filter criteria with pagination. Results will be sorted based on creation time DESC.

        @param gatewayId
              Identifier of the requested gateway.

        @param userName
              Username of the user requesting the search function.

        @param filters
              Map of multiple filter criteria. Currenlt search filters includes Experiment Name, Description, Application, etc....

        @param limit
              Amount of results to be fetched.

        @param offset
              The starting point of the results to be fetched.

        @return ExperimentSummaryModel
           List of experiments for the given search filter. Here only the Experiment summary will be returned.



        Parameters:
         - authzToken
         - gatewayId
         - userName
         - filters
         - limit
         - offset
        """
        pass

    def getExperimentStatistics(self, authzToken, gatewayId, fromTime, toTime, userName, applicationName, resourceHostName):
        """

        Get Experiment Statistics
        Get Experiment Statisitics for a given gateway for a specific time period. This feature is available only for admins of a particular gateway. Gateway admin access is managed by the user roles.

        @param gatewayId
              Unique identifier of the gateway making the request to fetch statistics.

        @param fromTime
              Starting date time.

        @param toTime
              Ending data time.

        @param userName
              Gateway username substring with which to further filter statistics.

        @param applicationName
              Application id substring with which to further filter statistics.

        @param resourceHostName
              Hostname id substring with which to further filter statistics.



        Parameters:
         - authzToken
         - gatewayId
         - fromTime
         - toTime
         - userName
         - applicationName
         - resourceHostName
        """
        pass

    def getExperimentsInProject(self, authzToken, projectId, limit, offset):
        """

        Get All Experiments of the Project
        Get Experiments within project with pagination. Results will be sorted based on creation time DESC.

        @param projectId
              Uniqie identifier of the project.

        @param limit
              Amount of results to be fetched.

        @param offset
              The starting point of the results to be fetched.



        Parameters:
         - authzToken
         - projectId
         - limit
         - offset
        """
        pass

    def getUserExperiments(self, authzToken, gatewayId, userName, limit, offset):
        """

        Get All Experiments of the User
        Get experiments by user with pagination. Results will be sorted based on creation time DESC.

        @param gatewayId
              Identifier of the requesting gateway.

        @param userName
              Username of the requested end user.

        @param limit
              Amount of results to be fetched.

        @param offset
              The starting point of the results to be fetched.



        Parameters:
         - authzToken
         - gatewayId
         - userName
         - limit
         - offset
        """
        pass

    def createExperiment(self, authzToken, gatewayId, experiment):
        """
          *
          * Create New Experiment
          * Create an experiment for the specified user belonging to the gateway. The gateway identity is not explicitly passed
          *   but inferred from the sshKeyAuthentication header. This experiment is just a persistent place holder. The client
          *   has to subsequently configure and launch the created experiment. No action is taken on Airavata Server except
          *   registering the experiment in a persistent store.
          *
          * @param gatewayId
          *    The unique ID of the gateway where the experiment is been created.
          *
          * @param ExperimentModel
          *    The create experiment will require the basic experiment metadata like the name and description, intended user,
          *      the gateway identifer and if the experiment should be shared public by defualt. During the creation of an experiment
          *      the ExperimentMetadata is a required field.
          *
          * @return
          *   The server-side generated.airavata.registry.core.experiment.globally unique identifier.
          *
          * @throws org.apache.airavata.model.error.InvalidRequestException
          *    For any incorrect forming of the request itself.
          *
          * @throws org.apache.airavata.model.error.AiravataClientException
          *    The following list of exceptions are thrown which Airavata Client can take corrective actions to resolve:
          *
          *      UNKNOWN_GATEWAY_ID - If a Gateway is not registered with Airavata as a one time administrative
          *         step, then Airavata Registry will not have a provenance area setup. The client has to follow
          *         gateway registration steps and retry this request.
          *
          *      AUTHENTICATION_FAILURE - How Authentication will be implemented is yet to be determined.
          *         For now this is a place holder.
          *
          *      INVALID_AUTHORIZATION - This will throw an authorization exception. When a more robust security hand-shake
          *         is implemented, the authorization will be more substantial.
          *
          * @throws org.apache.airavata.model.error.AiravataSystemException
          *    This exception will be thrown for any Airavata Server side issues and if the problem cannot be corrected by the client
          *       rather an Airavata Administrator will be notified to take corrective action.
          *
        *

        Parameters:
         - authzToken
         - gatewayId
         - experiment
        """
        pass

    def deleteExperiment(self, authzToken, experimentId):
        """

        Delete an Experiment
        If the experiment is not already launched experiment can be deleted.

        @param authzToken

        @param experiementId
            Experiment ID of the experimnet you want to delete.

        @return boolean
            Identifier for the success or failure of the deletion operation.



        Parameters:
         - authzToken
         - experimentId
        """
        pass

    def getExperiment(self, authzToken, airavataExperimentId):
        """
          *
          * Get Experiment
          * Fetch previously created experiment metadata.
          *
          * @param airavataExperimentId
          *    The unique identifier of the requested experiment. This ID is returned during the create experiment step.
          *
          * @return ExperimentModel
          *   This method will return the previously stored experiment metadata.
          *
          * @throws org.apache.airavata.model.error.InvalidRequestException
          *    For any incorrect forming of the request itself.
          *
          * @throws org.apache.airavata.model.error.ExperimentNotFoundException
          *    If the specified experiment is not previously created, then an Experiment Not Found Exception is thrown.
          *
          * @throws org.apache.airavata.model.error.AiravataClientException
          *    The following list of exceptions are thrown which Airavata Client can take corrective actions to resolve:
          *
          *      UNKNOWN_GATEWAY_ID - If a Gateway is not registered with Airavata as a one time administrative
          *         step, then Airavata Registry will not have a provenance area setup. The client has to follow
          *         gateway registration steps and retry this request.
          *
          *      AUTHENTICATION_FAILURE - How Authentication will be implemented is yet to be determined.
          *         For now this is a place holder.
          *
          *      INVALID_AUTHORIZATION - This will throw an authorization exception. When a more robust security hand-shake
          *         is implemented, the authorization will be more substantial.
          *
          * @throws org.apache.airavata.model.error.AiravataSystemException
          *    This exception will be thrown for any Airavata Server side issues and if the problem cannot be corrected by the client
          *       rather an Airavata Administrator will be notified to take corrective action.
          *
        *

        Parameters:
         - authzToken
         - airavataExperimentId
        """
        pass

    def getExperimentByAdmin(self, authzToken, airavataExperimentId):
        """
          *
          * Get Experiment by an admin user
          *
          * Used by an admin user to fetch previously created experiment metadata.
          *
          * @param airavataExperimentId
          *    The unique identifier of the requested experiment. This ID is returned during the create experiment step.
          *
          * @return ExperimentModel
          *   This method will return the previously stored experiment metadata.
          *
          * @throws org.apache.airavata.model.error.InvalidRequestException
          *    For any incorrect forming of the request itself.
          *
          * @throws org.apache.airavata.model.error.ExperimentNotFoundException
          *    If the specified experiment is not previously created, then an Experiment Not Found Exception is thrown.
          *
          * @throws org.apache.airavata.model.error.AiravataClientException
          *    The following list of exceptions are thrown which Airavata Client can take corrective actions to resolve:
          *
          *      UNKNOWN_GATEWAY_ID - If a Gateway is not registered with Airavata as a one time administrative
          *         step, then Airavata Registry will not have a provenance area setup. The client has to follow
          *         gateway registration steps and retry this request.
          *
          *      AUTHENTICATION_FAILURE - How Authentication will be implemented is yet to be determined.
          *         For now this is a place holder.
          *
          *      INVALID_AUTHORIZATION - This will throw an authorization exception. When a more robust security hand-shake
          *         is implemented, the authorization will be more substantial.
          *
          * @throws org.apache.airavata.model.error.AiravataSystemException
          *    This exception will be thrown for any Airavata Server side issues and if the problem cannot be corrected by the client
          *       rather an Airavata Administrator will be notified to take corrective action.
          *
        *

        Parameters:
         - authzToken
         - airavataExperimentId
        """
        pass

    def getDetailedExperimentTree(self, authzToken, airavataExperimentId):
        """

        Get Complete Experiment Details
        Fetch the completed nested tree structue of previously created experiment metadata which includes processes ->
        tasks -> jobs information.

        @param airavataExperimentId
           The identifier for the requested experiment. This is returned during the create experiment step.

        @return ExperimentModel
          This method will return the previously stored experiment metadata including application input parameters, computational resource scheduling
          information, special input output handling and additional quality of service parameters.

        @throws org.apache.airavata.model.error.InvalidRequestException
           For any incorrect forming of the request itself.

        @throws org.apache.airavata.model.error.ExperimentNotFoundException
           If the specified experiment is not previously created, then an Experiment Not Found Exception is thrown.

        @throws org.apache.airavata.model.error.AiravataClientException
           The following list of exceptions are thrown which Airavata Client can take corrective actions to resolve:

             UNKNOWN_GATEWAY_ID - If a Gateway is not registered with Airavata as a one time administrative
                step, then Airavata Registry will not have a provenance area setup. The client has to follow
                gateway registration steps and retry this request.

             AUTHENTICATION_FAILURE - How Authentication will be implemented is yet to be determined.
                For now this is a place holder.

             INVALID_AUTHORIZATION - This will throw an authorization exception. When a more robust security hand-shake
                is implemented, the authorization will be more substantial.

        @throws org.apache.airavata.model.error.AiravataSystemException
           This exception will be thrown for any Airavata Server side issues and if the problem cannot be corrected by the client
              rather an Airavata Administrator will be notified to take corrective action.


        Parameters:
         - authzToken
         - airavataExperimentId
        """
        pass

    def updateExperiment(self, authzToken, airavataExperimentId, experiment):
        """

        Update a Previously Created Experiment
        Configure the CREATED experiment with required inputs, scheduling and other quality of service parameters. This method only updates the experiment object within the registry.
        The experiment has to be launched to make it actionable by the server.

        @param airavataExperimentId
           The identifier for the requested experiment. This is returned during the create experiment step.

        @param ExperimentModel
           The configuration information of the experiment with application input parameters, computational resource scheduling
             information, special input output handling and additional quality of service parameters.

        @return
          This method call does not have a return value.

        @throws org.apache.airavata.model.error.InvalidRequestException
           For any incorrect forming of the request itself.

        @throws org.apache.airavata.model.error.ExperimentNotFoundException
           If the specified experiment is not previously created, then an Experiment Not Found Exception is thrown.

        @throws org.apache.airavata.model.error.AiravataClientException
           The following list of exceptions are thrown which Airavata Client can take corrective actions to resolve:
             
             UNKNOWN_GATEWAY_ID - If a Gateway is not registered with Airavata as a one time administrative
                step, then Airavata Registry will not have a provenance area setup. The client has to follow
                gateway registration steps and retry this request.

             AUTHENTICATION_FAILURE - How Authentication will be implemented is yet to be determined.
                For now this is a place holder.

             INVALID_AUTHORIZATION - This will throw an authorization exception. When a more robust security hand-shake
                is implemented, the authorization will be more substantial.

        @throws org.apache.airavata.model.error.AiravataSystemException
           This exception will be thrown for any Airavata Server side issues and if the problem cannot be corrected by the client
              rather an Airavata Administrator will be notified to take corrective action.


        Parameters:
         - authzToken
         - airavataExperimentId
         - experiment
        """
        pass

    def updateExperimentConfiguration(self, authzToken, airavataExperimentId, userConfiguration):
        """
        Parameters:
         - authzToken
         - airavataExperimentId
         - userConfiguration
        """
        pass

    def updateResourceScheduleing(self, authzToken, airavataExperimentId, resourceScheduling):
        """
        Parameters:
         - authzToken
         - airavataExperimentId
         - resourceScheduling
        """
        pass

    def validateExperiment(self, authzToken, airavataExperimentId):
        """
         *
         * Validate experiment configuration.
         * A true in general indicates, the experiment is ready to be launched.
         *
         * @param airavataExperimentId
         *    Unique identifier of the experiment (Experimnent ID) of the experiment which need to be validated.
         *
         * @return boolean
         *      Identifier for the success or failure of the validation operation.
         *
        *

        Parameters:
         - authzToken
         - airavataExperimentId
        """
        pass

    def launchExperiment(self, authzToken, airavataExperimentId, gatewayId):
        """

        Launch a Previously Created & Configured Experiment.
        Airavata Server will then start processing the request and appropriate notifications and intermediate and output data will be subsequently available for this experiment.

        @gatewayId
           ID of the gateway which will launch the experiment.

        @param airavataExperimentId
           The identifier for the requested experiment. This is returned during the create experiment step.

        @return
          This method call does not have a return value.

        @throws org.apache.airavata.model.error.InvalidRequestException
           For any incorrect forming of the request itself.

        @throws org.apache.airavata.model.error.ExperimentNotFoundException
           If the specified experiment is not previously created, then an Experiment Not Found Exception is thrown.

        @throws org.apache.airavata.model.error.AiravataClientException
           The following list of exceptions are thrown which Airavata Client can take corrective actions to resolve:
             
             UNKNOWN_GATEWAY_ID - If a Gateway is not registered with Airavata as a one time administrative
                step, then Airavata Registry will not have a provenance area setup. The client has to follow
                gateway registration steps and retry this request.

             AUTHENTICATION_FAILURE - How Authentication will be implemented is yet to be determined.
                For now this is a place holder.

             INVALID_AUTHORIZATION - This will throw an authorization exception. When a more robust security hand-shake
                is implemented, the authorization will be more substantial.

        @throws org.apache.airavata.model.error.AiravataSystemException
           This exception will be thrown for any Airavata Server side issues and if the problem cannot be corrected by the client
              rather an Airavata Administrator will be notified to take corrective action.


        Parameters:
         - authzToken
         - airavataExperimentId
         - gatewayId
        """
        pass

    def getExperimentStatus(self, authzToken, airavataExperimentId):
        """

        Get Experiment Status

        Obtain the status of an experiment by providing the Experiment Id

        @param authzToken

        @param airavataExperimentId
            Experiment ID of the experimnet you require the status.

        @return ExperimentStatus
            ExperimentStatus model with the current status will be returned.



        Parameters:
         - authzToken
         - airavataExperimentId
        """
        pass

    def getExperimentOutputs(self, authzToken, airavataExperimentId):
        """

        Get Experiment Outputs
        This method to be used when need to obtain final outputs of a certain Experiment

        @param authzToken

        @param airavataExperimentId
            Experiment ID of the experimnet you need the outputs.

        @return list
            List of experiment outputs will be returned. They will be returned as a list of OutputDataObjectType for the experiment.



        Parameters:
         - authzToken
         - airavataExperimentId
        """
        pass

    def getIntermediateOutputs(self, authzToken, airavataExperimentId):
        """

        Get Intermediate Experiment Outputs
        This method to be used when need to obtain intermediate outputs of a certain Experiment

        @param authzToken

        @param airavataExperimentId
            Experiment ID of the experimnet you need intermediate outputs.

        @return list
            List of intermediate experiment outputs will be returned. They will be returned as a list of OutputDataObjectType for the experiment.



        Parameters:
         - authzToken
         - airavataExperimentId
        """
        pass

    def getJobStatuses(self, authzToken, airavataExperimentId):
        """

        Get Job Statuses for an Experiment
        This method to be used when need to get the job status of an Experiment. An experiment may have one or many jobs; there for one or many job statuses may turnup

        @param authzToken

        @param experiementId
            Experiment ID of the experimnet you need the job statuses.

        @return JobStatus
            Job status (string) for all all the existing jobs for the experiment will be returned in the form of a map



        Parameters:
         - authzToken
         - airavataExperimentId
        """
        pass

    def getJobDetails(self, authzToken, airavataExperimentId):
        """

        Get Job Details for all the jobs within an Experiment.
        This method to be used when need to get the job details for one or many jobs of an Experiment.

        @param authzToken

        @param experiementId
            Experiment ID of the experimnet you need job details.

        @return list of JobDetails
            Job details.



        Parameters:
         - authzToken
         - airavataExperimentId
        """
        pass

    def cloneExperiment(self, authzToken, existingExperimentID, newExperimentName, newExperimentProjectId):
        """

        Clone an Existing Experiment
        Existing specified experiment is cloned and a new name is provided. A copy of the experiment configuration is made and is persisted with new metadata.
          The client has to subsequently update this configuration if needed and launch the cloned experiment.

        @param newExperimentName
           experiment name that should be used in the cloned experiment

        @param updatedExperiment
           Once an experiment is cloned, to disambiguate, the users are suggested to provide new metadata. This will again require
             the basic experiment metadata like the name and description, intended user, the gateway identifier and if the experiment
             should be shared public by default.
        @param newExperimentProjectId
           The project in which to create the cloned experiment. This is optional and if null the experiment will be created
             in the same project as the existing experiment.

        @return
          The server-side generated.airavata.registry.core.experiment.globally unique identifier (Experiment ID) for the newly cloned experiment.

        @throws org.apache.airavata.model.error.InvalidRequestException
           For any incorrect forming of the request itself.

        @throws org.apache.airavata.model.error.ExperimentNotFoundException
           If the specified experiment is not previously created, then an Experiment Not Found Exception is thrown.

        @throws org.apache.airavata.model.error.AiravataClientException
           The following list of exceptions are thrown which Airavata Client can take corrective actions to resolve:
             
             UNKNOWN_GATEWAY_ID - If a Gateway is not registered with Airavata as a one time administrative
                step, then Airavata Registry will not have a provenance area setup. The client has to follow
                gateway registration steps and retry this request.

             AUTHENTICATION_FAILURE - How Authentication will be implemented is yet to be determined.
                For now this is a place holder.

             INVALID_AUTHORIZATION - This will throw an authorization exception. When a more robust security hand-shake
                is implemented, the authorization will be more substantial.

        @throws org.apache.airavata.model.error.AiravataSystemException
           This exception will be thrown for any Airavata Server side issues and if the problem cannot be corrected by the client
              rather an Airavata Administrator will be notified to take corrective action.


        Parameters:
         - authzToken
         - existingExperimentID
         - newExperimentName
         - newExperimentProjectId
        """
        pass

    def cloneExperimentByAdmin(self, authzToken, existingExperimentID, newExperimentName, newExperimentProjectId):
        """

        Clone an Existing Experiment by an admin user
        Existing specified experiment is cloned and a new name is provided. A copy of the experiment configuration is made and is persisted with new metadata.
          The client has to subsequently update this configuration if needed and launch the cloned experiment.

        @param newExperimentName
           experiment name that should be used in the cloned experiment

        @param updatedExperiment
           Once an experiment is cloned, to disambiguate, the users are suggested to provide new metadata. This will again require
             the basic experiment metadata like the name and description, intended user, the gateway identifier and if the experiment
             should be shared public by default.
        @param newExperimentProjectId
           The project in which to create the cloned experiment. This is optional and if null the experiment will be created
             in the same project as the existing experiment.

        @return
          The server-side generated.airavata.registry.core.experiment.globally unique identifier (Experiment ID) for the newly cloned experiment.

        @throws org.apache.airavata.model.error.InvalidRequestException
           For any incorrect forming of the request itself.

        @throws org.apache.airavata.model.error.ExperimentNotFoundException
           If the specified experiment is not previously created, then an Experiment Not Found Exception is thrown.

        @throws org.apache.airavata.model.error.AiravataClientException
           The following list of exceptions are thrown which Airavata Client can take corrective actions to resolve:

             UNKNOWN_GATEWAY_ID - If a Gateway is not registered with Airavata as a one time administrative
                step, then Airavata Registry will not have a provenance area setup. The client has to follow
                gateway registration steps and retry this request.

             AUTHENTICATION_FAILURE - How Authentication will be implemented is yet to be determined.
                For now this is a place holder.

             INVALID_AUTHORIZATION - This will throw an authorization exception. When a more robust security hand-shake
                is implemented, the authorization will be more substantial.

        @throws org.apache.airavata.model.error.AiravataSystemException
           This exception will be thrown for any Airavata Server side issues and if the problem cannot be corrected by the client
              rather an Airavata Administrator will be notified to take corrective action.


        Parameters:
         - authzToken
         - existingExperimentID
         - newExperimentName
         - newExperimentProjectId
        """
        pass

    def terminateExperiment(self, authzToken, airavataExperimentId, gatewayId):
        """

        Terminate a running Experiment.

        @gatewayId
           ID of the gateway which will terminate the running Experiment.

        @param airavataExperimentId
           The identifier of the experiment required termination. This ID is returned during the create experiment step.

        @return status
          This method call does not have a return value.

        @throws org.apache.airavata.model.error.InvalidRequestException
           For any incorrect forming of the request itself.

        @throws org.apache.airavata.model.error.ExperimentNotFoundException
           If the specified experiment is not previously created, then an Experiment Not Found Exception is thrown.

        @throws org.apache.airavata.model.error.AiravataClientException
           The following list of exceptions are thrown which Airavata Client can take corrective actions to resolve:
             
             UNKNOWN_GATEWAY_ID - If a Gateway is not registered with Airavata as a one time administrative
                step, then Airavata Registry will not have a provenance area setup. The client has to follow
                gateway registration steps and retry this request.

             AUTHENTICATION_FAILURE - How Authentication will be implemented is yet to be determined.
                For now this is a place holder.

             INVALID_AUTHORIZATION - This will throw an authorization exception. When a more robust security hand-shake
                is implemented, the authorization will be more substantial.

        @throws org.apache.airavata.model.error.AiravataSystemException
           This exception will be thrown for any Airavata Server side issues and if the problem cannot be corrected by the client
              rather an Airavata Administrator will be notified to take corrective action.


        Parameters:
         - authzToken
         - airavataExperimentId
         - gatewayId
        """
        pass

    def registerApplicationModule(self, authzToken, gatewayId, applicationModule):
        """

        Register a Application Module.

        @gatewayId
           ID of the gateway which is registering the new Application Module.

        @param applicationModule
           Application Module Object created from the datamodel.

        @return appModuleId
          Returns the server-side generated airavata appModule globally unique identifier.


        Parameters:
         - authzToken
         - gatewayId
         - applicationModule
        """
        pass

    def getApplicationModule(self, authzToken, appModuleId):
        """

        Fetch a Application Module.

        @param appModuleId
          The unique identifier of the application module required

        @return applicationModule
          Returns an Application Module Object.


        Parameters:
         - authzToken
         - appModuleId
        """
        pass

    def updateApplicationModule(self, authzToken, appModuleId, applicationModule):
        """

        Update a Application Module.

        @param appModuleId
          The identifier for the requested application module to be updated.

        @param applicationModule
           Application Module Object created from the datamodel.

        @return status
          Returns a success/failure of the update.


        Parameters:
         - authzToken
         - appModuleId
         - applicationModule
        """
        pass

    def getAllAppModules(self, authzToken, gatewayId):
        """

        Fetch all Application Module Descriptions.

        @param gatewayId
           ID of the gateway which need to list all available application deployment documentation.

        @return list
           Returns the list of all Application Module Objects.


        Parameters:
         - authzToken
         - gatewayId
        """
        pass

    def deleteApplicationModule(self, authzToken, appModuleId):
        """

        Delete an Application Module.

        @param appModuleId
          The identifier of the Application Module to be deleted.

        @return status
          Returns a success/failure of the deletion.


        Parameters:
         - authzToken
         - appModuleId
        """
        pass

    def registerApplicationDeployment(self, authzToken, gatewayId, applicationDeployment):
        """

        Register an Application Deployment.

        @param gatewayId
           ID of the gateway which is registering the new Application Deployment.

        @param applicationDeployment
           Application Module Object created from the datamodel.

        @return appDeploymentId
          Returns a server-side generated airavata appDeployment globally unique identifier.


        Parameters:
         - authzToken
         - gatewayId
         - applicationDeployment
        """
        pass

    def getApplicationDeployment(self, authzToken, appDeploymentId):
        """

        Fetch a Application Deployment.

        @param appDeploymentId
          The identifier for the requested application module

        @return applicationDeployment
          Returns a application Deployment Object.


        Parameters:
         - authzToken
         - appDeploymentId
        """
        pass

    def updateApplicationDeployment(self, authzToken, appDeploymentId, applicationDeployment):
        """

        Update an Application Deployment.

        @param appDeploymentId
          The identifier of the requested application deployment to be updated.

        @param appDeployment
           Application Deployment Object created from the datamodel.

        @return status
          Returns a success/failure of the update.


        Parameters:
         - authzToken
         - appDeploymentId
         - applicationDeployment
        """
        pass

    def deleteApplicationDeployment(self, authzToken, appDeploymentId):
        """

        Delete an Application Deployment.

        @param appDeploymentId
          The unique identifier of application deployment to be deleted.

        @return status
          Returns a success/failure of the deletion.


        Parameters:
         - authzToken
         - appDeploymentId
        """
        pass

    def getAllApplicationDeployments(self, authzToken, gatewayId):
        """

        Fetch all Application Deployment Descriptions.

        @param gatewayId
           ID of the gateway which need to list all available application deployment documentation.

        @return list<applicationDeployment.
           Returns the list of all application Deployment Objects.


        Parameters:
         - authzToken
         - gatewayId
        """
        pass

    def getAppModuleDeployedResources(self, authzToken, appModuleId):
        """
        Fetch a list of Deployed Compute Hosts.

        @param appModuleId
          The identifier for the requested application module

        @return list<string>
          Returns a list of Deployed Resources.


        Parameters:
         - authzToken
         - appModuleId
        """
        pass

    def registerApplicationInterface(self, authzToken, gatewayId, applicationInterface):
        """

        Register a Application Interface.

        @param applicationInterface
           Application Module Object created from the datamodel.

        @return appInterfaceId
          Returns a server-side generated airavata application interface globally unique identifier.


        Parameters:
         - authzToken
         - gatewayId
         - applicationInterface
        """
        pass

    def cloneApplicationInterface(self, authzToken, existingAppInterfaceID, newApplicationName, gatewayId):
        """

        Clone an Application Interface.

        @gatewayId
           The identifier for the gateway profile to be requested

        @param existingAppInterfaceID
           Identifier of the existing Application interface you wich to clone.

        @param newApplicationName
           Name for the new application interface.

        @return appInterfaceId
           Returns a server-side generated globally unique identifier for the newly cloned application interface.


        Parameters:
         - authzToken
         - existingAppInterfaceID
         - newApplicationName
         - gatewayId
        """
        pass

    def getApplicationInterface(self, authzToken, appInterfaceId):
        """

        Fetch an Application Interface.

        @param appInterfaceId
          The identifier for the requested application interface.

        @return applicationInterface
          Returns an application Interface Object.


        Parameters:
         - authzToken
         - appInterfaceId
        """
        pass

    def updateApplicationInterface(self, authzToken, appInterfaceId, applicationInterface):
        """

        Update a Application Interface.

        @param appInterfaceId
          The identifier of the requested application deployment to be updated.

        @param appInterface
           Application Interface Object created from the datamodel.

        @return status
          Returns a success/failure of the update.


        Parameters:
         - authzToken
         - appInterfaceId
         - applicationInterface
        """
        pass

    def deleteApplicationInterface(self, authzToken, appInterfaceId):
        """

        Delete an Application Interface.

        @param appInterfaceId
          The identifier for the requested application interface to be deleted.

        @return status
          Returns a success/failure of the deletion.


        Parameters:
         - authzToken
         - appInterfaceId
        """
        pass

    def getAllApplicationInterfaceNames(self, authzToken, gatewayId):
        """

        Fetch name and ID of  Application Interface documents.


        @return map<applicationId, applicationInterfaceNames>
          Returns a list of application interfaces with corresponsing ID's


        Parameters:
         - authzToken
         - gatewayId
        """
        pass

    def getAllApplicationInterfaces(self, authzToken, gatewayId):
        """

        Fetch all Application Interface documents.


        @return map<applicationId, applicationInterfaceNames>
          Returns a list of application interfaces documents (Application Interface ID, name, description, Inputs and Outputs objects).


        Parameters:
         - authzToken
         - gatewayId
        """
        pass

    def getApplicationInputs(self, authzToken, appInterfaceId):
        """

        Fetch the list of Application Inputs.

        @param appInterfaceId
          The identifier of the application interface which need inputs to be fetched.

        @return list<application_interface_model.InputDataObjectType>
          Returns a list of application inputs.


        Parameters:
         - authzToken
         - appInterfaceId
        """
        pass

    def getApplicationOutputs(self, authzToken, appInterfaceId):
        """

        Fetch list of Application Outputs.

        @param appInterfaceId
          The identifier of the application interface which need outputs to be fetched.

        @return list<application_interface_model.OutputDataObjectType>
          Returns a list of application outputs.


        Parameters:
         - authzToken
         - appInterfaceId
        """
        pass

    def getAvailableAppInterfaceComputeResources(self, authzToken, appInterfaceId):
        """

        Fetch a list of all deployed Compute Hosts for a given application interfaces.

        @param appInterfaceId
          The identifier for the requested application interface.

        @return map<computeResourceId, computeResourceName>
          A map of registered compute resource id's and their corresponding hostnames.
          Deployments of each modules listed within the interfaces will be listed.


        Parameters:
         - authzToken
         - appInterfaceId
        """
        pass

    def registerComputeResource(self, authzToken, computeResourceDescription):
        """
        Register a Compute Resource.

        @param computeResourceDescription
           Compute Resource Object created from the datamodel.

        @return computeResourceId
          Returns a server-side generated airavata compute resource globally unique identifier.


        Parameters:
         - authzToken
         - computeResourceDescription
        """
        pass

    def getComputeResource(self, authzToken, computeResourceId):
        """
        Fetch the given Compute Resource.

        @param computeResourceId
          The identifier for the requested compute resource

        @return computeResourceDescription
           Compute Resource Object created from the datamodel..


        Parameters:
         - authzToken
         - computeResourceId
        """
        pass

    def getAllComputeResourceNames(self, authzToken):
        """

        Fetch all registered Compute Resources.

        @return A map of registered compute resource id's and thier corresponding hostnames.
           Compute Resource Object created from the datamodel..


        Parameters:
         - authzToken
        """
        pass

    def updateComputeResource(self, authzToken, computeResourceId, computeResourceDescription):
        """
        Update a Compute Resource.

        @param computeResourceId
          The identifier for the requested compute resource to be updated.

        @param computeResourceDescription
           Compute Resource Object created from the datamodel.

        @return status
          Returns a success/failure of the update.


        Parameters:
         - authzToken
         - computeResourceId
         - computeResourceDescription
        """
        pass

    def deleteComputeResource(self, authzToken, computeResourceId):
        """
        Delete a Compute Resource.

        @param computeResourceId
          The identifier for the requested compute resource to be deleted.

        @return status
          Returns a success/failure of the deletion.


        Parameters:
         - authzToken
         - computeResourceId
        """
        pass

    def registerStorageResource(self, authzToken, storageResourceDescription):
        """
        Register a Storage Resource.

        @param storageResourceDescription
           Storge Resource Object created from the datamodel.

        @return storageResourceId
          Returns a server-side generated airavata storage resource globally unique identifier.


        Parameters:
         - authzToken
         - storageResourceDescription
        """
        pass

    def getStorageResource(self, authzToken, storageResourceId):
        """
        Fetch the given Storage Resource.

        @param storageResourceId
          The identifier for the requested storage resource

        @return storageResourceDescription
           Storage Resource Object created from the datamodel..


        Parameters:
         - authzToken
         - storageResourceId
        """
        pass

    def getAllStorageResourceNames(self, authzToken):
        """
        Fetch all registered Storage Resources.

        @return A map of registered compute resource id's and thier corresponding hostnames.
           Compute Resource Object created from the datamodel..


        Parameters:
         - authzToken
        """
        pass

    def updateStorageResource(self, authzToken, storageResourceId, storageResourceDescription):
        """
        Update a Storage Resource.

        @param storageResourceId
          The identifier for the requested compute resource to be updated.

        @param storageResourceDescription
           Storage Resource Object created from the datamodel.

        @return status
          Returns a success/failure of the update.


        Parameters:
         - authzToken
         - storageResourceId
         - storageResourceDescription
        """
        pass

    def deleteStorageResource(self, authzToken, storageResourceId):
        """
        Delete a Storage Resource.

        @param storageResourceId
          The identifier of the requested compute resource to be deleted.

        @return status
          Returns a success/failure of the deletion.


        Parameters:
         - authzToken
         - storageResourceId
        """
        pass

    def addLocalSubmissionDetails(self, authzToken, computeResourceId, priorityOrder, localSubmission):
        """
        Add a Local Job Submission details to a compute resource
         App catalog will return a jobSubmissionInterfaceId which will be added to the jobSubmissionInterfaces.

        @param computeResourceId
          The identifier of the compute resource to which JobSubmission protocol to be added

        @param priorityOrder
          Specify the priority of this job manager. If this is the only jobmanager, the priority can be zero.

        @param localSubmission
          The LOCALSubmission object to be added to the resource.

        @return status
          Returns the unique job submission id.


        Parameters:
         - authzToken
         - computeResourceId
         - priorityOrder
         - localSubmission
        """
        pass

    def updateLocalSubmissionDetails(self, authzToken, jobSubmissionInterfaceId, localSubmission):
        """
        Update the given Local Job Submission details

        @param jobSubmissionInterfaceId
          The identifier of the JobSubmission Interface to be updated.

        @param localSubmission
          The LOCALSubmission object to be updated.

        @return status
          Returns a success/failure of the deletion.


        Parameters:
         - authzToken
         - jobSubmissionInterfaceId
         - localSubmission
        """
        pass

    def getLocalJobSubmission(self, authzToken, jobSubmissionId):
        """
        This method returns localJobSubmission object
        @param jobSubmissionInterfaceId
          The identifier of the JobSubmission Interface to be retrieved.
         @return LOCALSubmission instance


        Parameters:
         - authzToken
         - jobSubmissionId
        """
        pass

    def addSSHJobSubmissionDetails(self, authzToken, computeResourceId, priorityOrder, sshJobSubmission):
        """
        Add a SSH Job Submission details to a compute resource
         App catalog will return a jobSubmissionInterfaceId which will be added to the jobSubmissionInterfaces.

        @param computeResourceId
          The identifier of the compute resource to which JobSubmission protocol to be added

        @param priorityOrder
          Specify the priority of this job manager. If this is the only jobmanager, the priority can be zero.

        @param sshJobSubmission
          The SSHJobSubmission object to be added to the resource.

        @return status
          Returns the unique job submission id.


        Parameters:
         - authzToken
         - computeResourceId
         - priorityOrder
         - sshJobSubmission
        """
        pass

    def addSSHForkJobSubmissionDetails(self, authzToken, computeResourceId, priorityOrder, sshJobSubmission):
        """
        Add a SSH_FORK Job Submission details to a compute resource
         App catalog will return a jobSubmissionInterfaceId which will be added to the jobSubmissionInterfaces.

        @param computeResourceId
          The identifier of the compute resource to which JobSubmission protocol to be added

        @param priorityOrder
          Specify the priority of this job manager. If this is the only jobmanager, the priority can be zero.

        @param sshJobSubmission
          The SSHJobSubmission object to be added to the resource.

        @return status
          Returns the unique job submission id.


        Parameters:
         - authzToken
         - computeResourceId
         - priorityOrder
         - sshJobSubmission
        """
        pass

    def getSSHJobSubmission(self, authzToken, jobSubmissionId):
        """
        This method returns SSHJobSubmission object
        @param jobSubmissionInterfaceId
          The identifier of the JobSubmission Interface to be retrieved.
         @return SSHJobSubmission instance


        Parameters:
         - authzToken
         - jobSubmissionId
        """
        pass

    def addUNICOREJobSubmissionDetails(self, authzToken, computeResourceId, priorityOrder, unicoreJobSubmission):
        """

        Add a UNICORE Job Submission details to a compute resource
         App catalog will return a jobSubmissionInterfaceId which will be added to the jobSubmissionInterfaces.

        @param computeResourceId
          The identifier of the compute resource to which JobSubmission protocol to be added

        @param priorityOrder
          Specify the priority of this job manager. If this is the only jobmanager, the priority can be zero.

        @param unicoreJobSubmission
          The UnicoreJobSubmission object to be added to the resource.

        @return status
         Returns the unique job submission id.


        Parameters:
         - authzToken
         - computeResourceId
         - priorityOrder
         - unicoreJobSubmission
        """
        pass

    def getUnicoreJobSubmission(self, authzToken, jobSubmissionId):
        """
          *
          * This method returns UnicoreJobSubmission object
          *
          * @param jobSubmissionInterfaceId
          *   The identifier of the JobSubmission Interface to be retrieved.
          *  @return UnicoreJobSubmission instance
          *
        *

        Parameters:
         - authzToken
         - jobSubmissionId
        """
        pass

    def addCloudJobSubmissionDetails(self, authzToken, computeResourceId, priorityOrder, cloudSubmission):
        """
           *
           * Add a Cloud Job Submission details to a compute resource
           *  App catalog will return a jobSubmissionInterfaceId which will be added to the jobSubmissionInterfaces.
           *
           * @param computeResourceId
           *   The identifier of the compute resource to which JobSubmission protocol to be added
           *
           * @param priorityOrder
           *   Specify the priority of this job manager. If this is the only jobmanager, the priority can be zero.
           *
           * @param sshJobSubmission
           *   The SSHJobSubmission object to be added to the resource.
           *
           * @return status
           *   Returns the unique job submission id.
           *
        *

        Parameters:
         - authzToken
         - computeResourceId
         - priorityOrder
         - cloudSubmission
        """
        pass

    def getCloudJobSubmission(self, authzToken, jobSubmissionId):
        """
           *
           * This method returns cloudJobSubmission object
           * @param jobSubmissionInterfaceI
               *   The identifier of the JobSubmission Interface to be retrieved.
           *  @return CloudJobSubmission instance
        *

        Parameters:
         - authzToken
         - jobSubmissionId
        """
        pass

    def updateSSHJobSubmissionDetails(self, authzToken, jobSubmissionInterfaceId, sshJobSubmission):
        """

        Update the given SSH Job Submission details

        @param jobSubmissionInterfaceId
          The identifier of the JobSubmission Interface to be updated.

        @param sshJobSubmission
          The SSHJobSubmission object to be updated.

        @return status
          Returns a success/failure of the update.


        Parameters:
         - authzToken
         - jobSubmissionInterfaceId
         - sshJobSubmission
        """
        pass

    def updateCloudJobSubmissionDetails(self, authzToken, jobSubmissionInterfaceId, sshJobSubmission):
        """

        Update the cloud Job Submission details

        @param jobSubmissionInterfaceId
          The identifier of the JobSubmission Interface to be updated.

        @param cloudJobSubmission
          The CloudJobSubmission object to be updated.

        @return status
          Returns a success/failure of the update.


        Parameters:
         - authzToken
         - jobSubmissionInterfaceId
         - sshJobSubmission
        """
        pass

    def updateUnicoreJobSubmissionDetails(self, authzToken, jobSubmissionInterfaceId, unicoreJobSubmission):
        """

        Update the UNIOCRE Job Submission details

        @param jobSubmissionInterfaceId
          The identifier of the JobSubmission Interface to be updated.

        @param UnicoreJobSubmission
          The UnicoreJobSubmission object to be updated.

        @return status
          Returns a success/failure of the update.



        Parameters:
         - authzToken
         - jobSubmissionInterfaceId
         - unicoreJobSubmission
        """
        pass

    def addLocalDataMovementDetails(self, authzToken, productUri, dataMoveType, priorityOrder, localDataMovement):
        """

        Add a Local data movement details to a compute resource
         App catalog will return a dataMovementInterfaceId which will be added to the dataMovementInterfaces.

        @param productUri
          The identifier of the compute resource to which JobSubmission protocol to be added

        @param DMType
          DMType object to be added to the resource.

        @param priorityOrder
          Specify the priority of this job manager. If this is the only jobmanager, the priority can be zero.

        @param localDataMovement
          The LOCALDataMovement object to be added to the resource.

        @return status
          Returns the unique job submission id.



        Parameters:
         - authzToken
         - productUri
         - dataMoveType
         - priorityOrder
         - localDataMovement
        """
        pass

    def updateLocalDataMovementDetails(self, authzToken, dataMovementInterfaceId, localDataMovement):
        """

        Update the given Local data movement details

        @param dataMovementInterfaceId
          The identifier of the data movement Interface to be updated.

        @param localDataMovement
          The LOCALDataMovement object to be updated.

        @return status
          Returns a success/failure of the update.



        Parameters:
         - authzToken
         - dataMovementInterfaceId
         - localDataMovement
        """
        pass

    def getLocalDataMovement(self, authzToken, dataMovementId):
        """

        This method returns local datamovement object.

        @param dataMovementId
          The identifier of the datamovement Interface to be retrieved.

         @return LOCALDataMovement instance



        Parameters:
         - authzToken
         - dataMovementId
        """
        pass

    def addSCPDataMovementDetails(self, authzToken, productUri, dataMoveType, priorityOrder, scpDataMovement):
        """

        Add a SCP data movement details to a compute resource
         App catalog will return a dataMovementInterfaceId which will be added to the dataMovementInterfaces.

        @param productUri
          The identifier of the compute resource to which JobSubmission protocol to be added

        @param priorityOrder
          Specify the priority of this job manager. If this is the only jobmanager, the priority can be zero.

        @param scpDataMovement
          The SCPDataMovement object to be added to the resource.

        @return status
          Returns the unique job submission id.


        Parameters:
         - authzToken
         - productUri
         - dataMoveType
         - priorityOrder
         - scpDataMovement
        """
        pass

    def updateSCPDataMovementDetails(self, authzToken, dataMovementInterfaceId, scpDataMovement):
        """

        Update the given scp data movement details
         App catalog will return a dataMovementInterfaceId which will be added to the dataMovementInterfaces.

        @param dataMovementInterfaceId
          The identifier of the data movement Interface to be updated.

        @param scpDataMovement
          The SCPDataMovement object to be updated.

        @return status
          Returns a success/failure of the update.


        Parameters:
         - authzToken
         - dataMovementInterfaceId
         - scpDataMovement
        """
        pass

    def getSCPDataMovement(self, authzToken, dataMovementId):
        """
        This method returns SCP datamovement object

        @param dataMovementId
          The identifier of the datamovement Interface to be retrieved.

        @return SCPDataMovement instance



        Parameters:
         - authzToken
         - dataMovementId
        """
        pass

    def addUnicoreDataMovementDetails(self, authzToken, productUri, dataMoveType, priorityOrder, unicoreDataMovement):
        """

        Add a UNICORE data movement details to a compute resource
         App catalog will return a dataMovementInterfaceId which will be added to the dataMovementInterfaces.

        @param productUri
          The identifier of the compute resource to which data movement protocol to be added

        @param priorityOrder
          Specify the priority of this job manager. If this is the only jobmanager, the priority can be zero.

        @param UnicoreDataMovement
          The UnicoreDataMovement object to be added to the resource.

        @return status
          Returns the unique data movement id.


        Parameters:
         - authzToken
         - productUri
         - dataMoveType
         - priorityOrder
         - unicoreDataMovement
        """
        pass

    def updateUnicoreDataMovementDetails(self, authzToken, dataMovementInterfaceId, unicoreDataMovement):
        """

        Update a selected UNICORE data movement details
         App catalog will return a dataMovementInterfaceId which will be added to the dataMovementInterfaces.

        @param dataMovementInterfaceId
          The identifier of the data movement Interface to be updated.

        @param UnicoreDataMovement
          The UnicoreDataMovement object to be updated.

        @return status
          Returns a success/failure of the update.



        Parameters:
         - authzToken
         - dataMovementInterfaceId
         - unicoreDataMovement
        """
        pass

    def getUnicoreDataMovement(self, authzToken, dataMovementId):
        """

        This method returns UNICORE datamovement object

        @param dataMovementId
          The identifier of the datamovement Interface to be retrieved.

        @return UnicoreDataMovement instance



        Parameters:
         - authzToken
         - dataMovementId
        """
        pass

    def addGridFTPDataMovementDetails(self, authzToken, productUri, dataMoveType, priorityOrder, gridFTPDataMovement):
        """

        Add a GridFTP data movement details to a compute resource
         App catalog will return a dataMovementInterfaceId which will be added to the dataMovementInterfaces.

        @param productUri
          The identifier of the compute resource to which dataMovement protocol to be added

        @param DMType
           The DMType object to be added to the resource.

        @param priorityOrder
          Specify the priority of this job manager. If this is the only jobmanager, the priority can be zero.

        @param gridFTPDataMovement
          The GridFTPDataMovement object to be added to the resource.

        @return status
          Returns the unique data movement id.



        Parameters:
         - authzToken
         - productUri
         - dataMoveType
         - priorityOrder
         - gridFTPDataMovement
        """
        pass

    def updateGridFTPDataMovementDetails(self, authzToken, dataMovementInterfaceId, gridFTPDataMovement):
        """
        Update the given GridFTP data movement details to a compute resource
         App catalog will return a dataMovementInterfaceId which will be added to the dataMovementInterfaces.

        @param dataMovementInterfaceId
          The identifier of the data movement Interface to be updated.

        @param gridFTPDataMovement
          The GridFTPDataMovement object to be updated.

        @return boolean
          Returns a success/failure of the update.



        Parameters:
         - authzToken
         - dataMovementInterfaceId
         - gridFTPDataMovement
        """
        pass

    def getGridFTPDataMovement(self, authzToken, dataMovementId):
        """
        This method returns GridFTP datamovement object

        @param dataMovementId
          The identifier of the datamovement Interface to be retrieved.

         @return GridFTPDataMovement instance



        Parameters:
         - authzToken
         - dataMovementId
        """
        pass

    def changeJobSubmissionPriority(self, authzToken, jobSubmissionInterfaceId, newPriorityOrder):
        """
        Change the priority of a given job submisison interface

        @param jobSubmissionInterfaceId
          The identifier of the JobSubmission Interface to be changed

        @param priorityOrder
          The new priority of the job manager interface.

        @return status
          Returns a success/failure of the change.



        Parameters:
         - authzToken
         - jobSubmissionInterfaceId
         - newPriorityOrder
        """
        pass

    def changeDataMovementPriority(self, authzToken, dataMovementInterfaceId, newPriorityOrder):
        """
        Change the priority of a given data movement interface

        @param dataMovementInterfaceId
          The identifier of the DataMovement Interface to be changed

        @param priorityOrder
          The new priority of the data movement interface.

        @return status
          Returns a success/failure of the change.



        Parameters:
         - authzToken
         - dataMovementInterfaceId
         - newPriorityOrder
        """
        pass

    def changeJobSubmissionPriorities(self, authzToken, jobSubmissionPriorityMap):
        """
        Change the priorities of a given set of job submission interfaces

        @param jobSubmissionPriorityMap
          A Map of identifiers of the JobSubmission Interfaces and thier associated priorities to be set.

        @return status
          Returns a success/failure of the changes.


        Parameters:
         - authzToken
         - jobSubmissionPriorityMap
        """
        pass

    def changeDataMovementPriorities(self, authzToken, dataMovementPriorityMap):
        """
        Change the priorities of a given set of data movement interfaces

        @param dataMovementPriorityMap
          A Map of identifiers of the DataMovement Interfaces and thier associated priorities to be set.

        @return status
          Returns a success/failure of the changes.



        Parameters:
         - authzToken
         - dataMovementPriorityMap
        """
        pass

    def deleteJobSubmissionInterface(self, authzToken, computeResourceId, jobSubmissionInterfaceId):
        """
        Delete a given job submisison interface

        @param jobSubmissionInterfaceId
          The identifier of the JobSubmission Interface to be changed

        @return status
          Returns a success/failure of the deletion.



        Parameters:
         - authzToken
         - computeResourceId
         - jobSubmissionInterfaceId
        """
        pass

    def deleteDataMovementInterface(self, authzToken, productUri, dataMovementInterfaceId, dataMoveType):
        """
        Delete a given data movement interface

        @param dataMovementInterfaceId
          The identifier of the DataMovement Interface to be changed

        @return status
          Returns a success/failure of the deletion.



        Parameters:
         - authzToken
         - productUri
         - dataMovementInterfaceId
         - dataMoveType
        """
        pass

    def registerResourceJobManager(self, authzToken, resourceJobManager):
        """
        Parameters:
         - authzToken
         - resourceJobManager
        """
        pass

    def updateResourceJobManager(self, authzToken, resourceJobManagerId, updatedResourceJobManager):
        """
        Parameters:
         - authzToken
         - resourceJobManagerId
         - updatedResourceJobManager
        """
        pass

    def getResourceJobManager(self, authzToken, resourceJobManagerId):
        """
        Parameters:
         - authzToken
         - resourceJobManagerId
        """
        pass

    def deleteResourceJobManager(self, authzToken, resourceJobManagerId):
        """
        Parameters:
         - authzToken
         - resourceJobManagerId
        """
        pass

    def deleteBatchQueue(self, authzToken, computeResourceId, queueName):
        """
        Delete a Compute Resource Queue

        @param computeResourceId
          The identifier of the compute resource which has the queue to be deleted

        @param queueName
          Name of the queue need to be deleted. Name is the uniqueue identifier for the queue within a compute resource

        @return status
          Returns a success/failure of the deletion.



        Parameters:
         - authzToken
         - computeResourceId
         - queueName
        """
        pass

    def registerGatewayResourceProfile(self, authzToken, gatewayResourceProfile):
        """
        Register a Gateway Resource Profile.

        @param gatewayResourceProfile
           Gateway Resource Profile Object.
           The GatewayID should be obtained from Airavata gateway registration and passed to register a corresponding
             resource profile.

        @return status
          Returns a success/failure of the update.


        Parameters:
         - authzToken
         - gatewayResourceProfile
        """
        pass

    def getGatewayResourceProfile(self, authzToken, gatewayID):
        """
        Fetch the given Gateway Resource Profile.

        @param gatewayID
          The identifier for the requested gateway resource.

        @return gatewayResourceProfile
           Gateway Resource Profile Object.


        Parameters:
         - authzToken
         - gatewayID
        """
        pass

    def updateGatewayResourceProfile(self, authzToken, gatewayID, gatewayResourceProfile):
        """
        Update a Gateway Resource Profile.

        @param gatewayID
          The identifier for the requested gateway resource to be updated.

        @param gatewayResourceProfile
           Gateway Resource Profile Object.

        @return status
          Returns a success/failure of the update.


        Parameters:
         - authzToken
         - gatewayID
         - gatewayResourceProfile
        """
        pass

    def deleteGatewayResourceProfile(self, authzToken, gatewayID):
        """
        Delete the given Gateway Resource Profile.

        @param gatewayID
          The identifier for the requested gateway resource to be deleted.

        @return status
          Returns a success/failure of the deletion.


        Parameters:
         - authzToken
         - gatewayID
        """
        pass

    def addGatewayComputeResourcePreference(self, authzToken, gatewayID, computeResourceId, computeResourcePreference):
        """
        Add a Compute Resource Preference to a registered gateway profile.

        @param gatewayID
          The identifier for the gateway profile to be added.

        @param computeResourceId
          Preferences related to a particular compute resource

        @param computeResourcePreference
          The ComputeResourcePreference object to be added to the resource profile.

        @return status
          Returns a success/failure of the addition. If a profile already exists, this operation will fail.
           Instead an update should be used.


        Parameters:
         - authzToken
         - gatewayID
         - computeResourceId
         - computeResourcePreference
        """
        pass

    def addGatewayStoragePreference(self, authzToken, gatewayID, storageResourceId, storagePreference):
        """
        Add a Storage Resource Preference to a registered gateway profile.

        @param gatewayID
          The identifier of the gateway profile to be added.

        @param storageResourceId
          Preferences related to a particular compute resource

        @param computeResourcePreference
          The ComputeResourcePreference object to be added to the resource profile.

        @return status
          Returns a success/failure of the addition. If a profile already exists, this operation will fail.
           Instead an update should be used.


        Parameters:
         - authzToken
         - gatewayID
         - storageResourceId
         - storagePreference
        """
        pass

    def getGatewayComputeResourcePreference(self, authzToken, gatewayID, computeResourceId):
        """

        Fetch a Compute Resource Preference of a registered gateway profile.

        @param gatewayID
          The identifier for the gateway profile to be requested

        @param computeResourceId
          Preferences related to a particular compute resource

        @return computeResourcePreference
          Returns the ComputeResourcePreference object.


        Parameters:
         - authzToken
         - gatewayID
         - computeResourceId
        """
        pass

    def getGatewayStoragePreference(self, authzToken, gatewayID, storageResourceId):
        """

        Fetch a Storage Resource Preference of a registered gateway profile.

        @param gatewayID
          The identifier of the gateway profile to request to fetch the particular storage resource preference.

        @param storageResourceId
          Identifier of the Stprage Preference required to be fetched.

        @return StoragePreference
          Returns the StoragePreference object.


        Parameters:
         - authzToken
         - gatewayID
         - storageResourceId
        """
        pass

    def getAllGatewayComputeResourcePreferences(self, authzToken, gatewayID):
        """

        Fetch all Compute Resource Preferences of a registered gateway profile.

        @param gatewayID
          The identifier for the gateway profile to be requested

        @return computeResourcePreference
          Returns the ComputeResourcePreference object.


        Parameters:
         - authzToken
         - gatewayID
        """
        pass

    def getAllGatewayStoragePreferences(self, authzToken, gatewayID):
        """
        Fetch all Storage Resource Preferences of a registered gateway profile.

        @param gatewayID
          The identifier for the gateway profile to be requested

        @return StoragePreference
          Returns the StoragePreference object.


        Parameters:
         - authzToken
         - gatewayID
        """
        pass

    def getAllGatewayResourceProfiles(self, authzToken):
        """

        Fetch all Gateway Profiles registered

        @return GatewayResourceProfile
          Returns all the GatewayResourcePrifle list object.



        Parameters:
         - authzToken
        """
        pass

    def updateGatewayComputeResourcePreference(self, authzToken, gatewayID, computeResourceId, computeResourcePreference):
        """
        Update a Compute Resource Preference to a registered gateway profile.

        @param gatewayID
          The identifier for the gateway profile to be updated.

        @param computeResourceId
          Preferences related to a particular compute resource

        @param computeResourcePreference
          The ComputeResourcePreference object to be updated to the resource profile.

        @return status
          Returns a success/failure of the updation.


        Parameters:
         - authzToken
         - gatewayID
         - computeResourceId
         - computeResourcePreference
        """
        pass

    def updateGatewayStoragePreference(self, authzToken, gatewayID, storageId, storagePreference):
        """
        Update a Storage Resource Preference of a registered gateway profile.

        @param gatewayID
          The identifier of the gateway profile to be updated.

        @param storageId
          The Storage resource identifier of the one that you want to update

        @param storagePreference
          The storagePreference object to be updated to the resource profile.

        @return status
          Returns a success/failure of the updation.


        Parameters:
         - authzToken
         - gatewayID
         - storageId
         - storagePreference
        """
        pass

    def deleteGatewayComputeResourcePreference(self, authzToken, gatewayID, computeResourceId):
        """
        Delete the Compute Resource Preference of a registered gateway profile.

        @param gatewayID
          The identifier for the gateway profile to be deleted.

        @param computeResourceId
          Preferences related to a particular compute resource

        @return status
          Returns a success/failure of the deletion.


        Parameters:
         - authzToken
         - gatewayID
         - computeResourceId
        """
        pass

    def deleteGatewayStoragePreference(self, authzToken, gatewayID, storageId):
        """
        Delete the Storage Resource Preference of a registered gateway profile.

        @param gatewayID
          The identifier of the gateway profile to be deleted.

        @param storageId
          ID of the storage preference you want to delete.

        @return status
          Returns a success/failure of the deletion.


        Parameters:
         - authzToken
         - gatewayID
         - storageId
        """
        pass

    def registerUserResourceProfile(self, authzToken, userResourceProfile):
        """
        Register User Resource Profile.

        @param UserResourceProfile
           User Resource Profile Object.
           The userId should be obtained from Airavata user profile data model and passed to register a corresponding
             resource profile.

        @return status
          Returns a success/failure of the update.


        Parameters:
         - authzToken
         - userResourceProfile
        """
        pass

    def getUserResourceProfile(self, authzToken, userId, gatewayID):
        """
        Fetch the given User Resource Profile.

        @param userId
          The identifier for the requested user resource profile.

        @param gatewayID
          The identifier to link a gateway for the requested user resource profile.

        @return UserResourceProfile
           User Resource Profile Object.


        Parameters:
         - authzToken
         - userId
         - gatewayID
        """
        pass

    def updateUserResourceProfile(self, authzToken, userId, gatewayID, userResourceProfile):
        """
        Update a User Resource Profile.

        @param userId
          The identifier for the requested user resource to be updated.

        @param gatewayID
          The identifier to link a gateway for the requested user resource profile.

        @param UserResourceProfile
           User Resource Profile Object.

        @return status
          Returns a success/failure of the update.


        Parameters:
         - authzToken
         - userId
         - gatewayID
         - userResourceProfile
        """
        pass

    def deleteUserResourceProfile(self, authzToken, userId, gatewayID):
        """
        Delete the given User Resource Profile.

        @param userId
          The identifier for the requested user resource to be deleted.

        @param gatewayID
          The identifier to link a gateway for the requested user resource profile.

        @return status
          Returns a success/failure of the deletion.


        Parameters:
         - authzToken
         - userId
         - gatewayID
        """
        pass

    def addUserComputeResourcePreference(self, authzToken, userId, gatewayID, userComputeResourceId, userComputeResourcePreference):
        """
        Add a Compute Resource Preference to a registered User profile.

        @param userId
          The identifier for the User resource profile to be added.

        @param gatewayID
          The identifier to link a gateway for the requested user resource profile.

        @param computeResourceId
          Preferences related to a particular compute resource

        @param computeResourcePreference
          The ComputeResourcePreference object to be added to the resource profile.

        @return status
          Returns a success/failure of the addition. If a profile already exists, this operation will fail.
           Instead an update should be used.


        Parameters:
         - authzToken
         - userId
         - gatewayID
         - userComputeResourceId
         - userComputeResourcePreference
        """
        pass

    def addUserStoragePreference(self, authzToken, userId, gatewayID, userStorageResourceId, userStoragePreference):
        """
        Add a Storage Resource Preference to a registered user resource profile.

        @param userId
          The identifier of the user resource profile to be added.

        @param gatewayID
          The identifier to link a gateway for the requested user resource profile.

        @param storageResourceId
          Preferences related to a particular compute resource

        @param computeResourcePreference
          The ComputeResourcePreference object to be added to the resource profile.

        @return status
          Returns a success/failure of the addition. If a profile already exists, this operation will fail.
           Instead an update should be used.


        Parameters:
         - authzToken
         - userId
         - gatewayID
         - userStorageResourceId
         - userStoragePreference
        """
        pass

    def getUserComputeResourcePreference(self, authzToken, userId, gatewayID, userComputeResourceId):
        """

        Fetch a Compute Resource Preference of a registered user resource profile.

        @param userId
          The identifier for the user profile to be requested

        @param gatewayID
          The identifier to link a gateway for the requested user resource profile.

        @param userComputeResourceId
          Preferences related to a particular compute resource

        @return computeResourcePreference
          Returns the ComputeResourcePreference object.


        Parameters:
         - authzToken
         - userId
         - gatewayID
         - userComputeResourceId
        """
        pass

    def getUserStoragePreference(self, authzToken, userId, gatewayID, userStorageResourceId):
        """

        Fetch a Storage Resource Preference of a registered user resource profile.

        @param userId
          The identifier of the user resource profile to request to fetch the particular storage resource preference.

        @param gatewayID
          The identifier to link a gateway for the requested user resource profile.

        @param userStorageResourceId
          Identifier of the Stprage Preference required to be fetched.

        @return UserStoragePreference
          Returns the StoragePreference object.


        Parameters:
         - authzToken
         - userId
         - gatewayID
         - userStorageResourceId
        """
        pass

    def getAllUserComputeResourcePreferences(self, authzToken, userId, gatewayID):
        """

        Fetch all Compute Resource Preferences of a registered gateway profile.

        @param userId
          The identifier of the user resource profile to request to fetch the particular storage resource preference.

        @param gatewayID
          The identifier for the gateway profile to be requested

        @return computeResourcePreference
          Returns the ComputeResourcePreference object.


        Parameters:
         - authzToken
         - userId
         - gatewayID
        """
        pass

    def getAllUserStoragePreferences(self, authzToken, userId, gatewayID):
        """
        Fetch all User Storage Resource Preferences of a registered user profile.

        @param userId
          The identifier of the user resource profile to request to fetch the particular storage resource preference.

        @param gatewayID
          The identifier for the gateway profile to be requested

        @return StoragePreference
          Returns the StoragePreference object.


        Parameters:
         - authzToken
         - userId
         - gatewayID
        """
        pass

    def getAllUserResourceProfiles(self, authzToken):
        """

        Fetch all user resources Profiles registered

        @return UserResourceProfile
          Returns all the UserResourcePrifle list object.



        Parameters:
         - authzToken
        """
        pass

    def updateUserComputeResourcePreference(self, authzToken, userId, gatewayID, userComputeResourceId, userComputeResourcePreference):
        """
        Update a Compute Resource Preference to a registered user resource profile.

        @param userId
          The identifier for the user profile to be updated.

        @param gatewayID
          The identifier to link a gateway for the requested user resource profile.

        @param userComputeResourceId
          Preferences related to a particular compute resource

        @param userComputeResourcePreference
          The ComputeResourcePreference object to be updated to the resource profile.

        @return status
          Returns a success/failure of the updation.


        Parameters:
         - authzToken
         - userId
         - gatewayID
         - userComputeResourceId
         - userComputeResourcePreference
        """
        pass

    def updateUserStoragePreference(self, authzToken, userId, gatewayID, userStorageId, userStoragePreference):
        """
        Update a Storage Resource Preference of a registered user resource profile.

        @param userId
          The identifier of the user resource profile to be updated.

        @param gatewayID
          The identifier to link a gateway for the requested user resource profile.

        @param userStorageId
          The Storage resource identifier of the one that you want to update

        @param userStoragePreference
          The storagePreference object to be updated to the resource profile.

        @return status
          Returns a success/failure of the updation.


        Parameters:
         - authzToken
         - userId
         - gatewayID
         - userStorageId
         - userStoragePreference
        """
        pass

    def deleteUserComputeResourcePreference(self, authzToken, userId, gatewayID, userComputeResourceId):
        """
        Delete the Compute Resource Preference of a registered user resource profile.

        @param userId
          The identifier for the user resource profile to be deleted.

        @param gatewayID
          The identifier to link a gateway for the requested user resource profile.

        @param userComputeResourceId
          Preferences related to a particular compute resource

        @return status
          Returns a success/failure of the deletion.


        Parameters:
         - authzToken
         - userId
         - gatewayID
         - userComputeResourceId
        """
        pass

    def deleteUserStoragePreference(self, authzToken, userId, gatewayID, userStorageId):
        """
        Delete the Storage Resource Preference of a registered user resource profile.

        @param userId
          The identifier of the user profile to be deleted.

        @param gatewayID
          The identifier to link a gateway for the requested user resource profile.

        @param userStorageId
          ID of the storage preference you want to delete.

        @return status
          Returns a success/failure of the deletion.


        Parameters:
         - authzToken
         - userId
         - gatewayID
         - userStorageId
        """
        pass

    def getAllWorkflows(self, authzToken, gatewayId):
        """
        Parameters:
         - authzToken
         - gatewayId
        """
        pass

    def getLatestQueueStatuses(self, authzToken):
        """
        Parameters:
         - authzToken
        """
        pass

    def getWorkflow(self, authzToken, workflowTemplateId):
        """

        API Methods Related for Work-Flow Submission Features.


        Parameters:
         - authzToken
         - workflowTemplateId
        """
        pass

    def deleteWorkflow(self, authzToken, workflowTemplateId):
        """
        Parameters:
         - authzToken
         - workflowTemplateId
        """
        pass

    def registerWorkflow(self, authzToken, gatewayId, workflow):
        """
        Parameters:
         - authzToken
         - gatewayId
         - workflow
        """
        pass

    def updateWorkflow(self, authzToken, workflowTemplateId, workflow):
        """
        Parameters:
         - authzToken
         - workflowTemplateId
         - workflow
        """
        pass

    def getWorkflowTemplateId(self, authzToken, workflowName):
        """
        Parameters:
         - authzToken
         - workflowName
        """
        pass

    def isWorkflowExistWithName(self, authzToken, workflowName):
        """
        Parameters:
         - authzToken
         - workflowName
        """
        pass

    def registerDataProduct(self, authzToken, dataProductModel):
        """
        API Methods related to replica catalog


        Parameters:
         - authzToken
         - dataProductModel
        """
        pass

    def getDataProduct(self, authzToken, dataProductUri):
        """
        Parameters:
         - authzToken
         - dataProductUri
        """
        pass

    def registerReplicaLocation(self, authzToken, replicaLocationModel):
        """
        Parameters:
         - authzToken
         - replicaLocationModel
        """
        pass

    def getParentDataProduct(self, authzToken, productUri):
        """
        Parameters:
         - authzToken
         - productUri
        """
        pass

    def getChildDataProducts(self, authzToken, productUri):
        """
        Parameters:
         - authzToken
         - productUri
        """
        pass

    def shareResourceWithUsers(self, authzToken, resourceId, resourceType, userPermissionList):
        """
        Group Manager and Data Sharing Related API methods


        Parameters:
         - authzToken
         - resourceId
         - resourceType
         - userPermissionList
        """
        pass

    def revokeSharingOfResourceFromUsers(self, authzToken, resourceId, resourceType, userPermissionList):
        """
        Parameters:
         - authzToken
         - resourceId
         - resourceType
         - userPermissionList
        """
        pass

    def getAllAccessibleUsers(self, authzToken, resourceId, resourceType, permissionType):
        """
        Parameters:
         - authzToken
         - resourceId
         - resourceType
         - permissionType
        """
        pass

    def createGroup(self, authzToken, groupModel):
        """
        Parameters:
         - authzToken
         - groupModel
        """
        pass

    def updateGroup(self, authzToken, groupModel):
        """
        Parameters:
         - authzToken
         - groupModel
        """
        pass

    def deleteGroup(self, authzToken, groupId, ownerId, gatewayId):
        """
        Parameters:
         - authzToken
         - groupId
         - ownerId
         - gatewayId
        """
        pass

    def getGroup(self, authzToken, groupId):
        """
        Parameters:
         - authzToken
         - groupId
        """
        pass

    def getAllGroupsUserBelongs(self, authzToken, userName, gatewayId):
        """
        Parameters:
         - authzToken
         - userName
         - gatewayId
        """
        pass


class Client(Iface):
    def __init__(self, iprot, oprot=None):
        self._iprot = self._oprot = iprot
        if oprot is not None:
            self._oprot = oprot
        self._seqid = 0

    def getAPIVersion(self, authzToken):
        """
        Fetch Apache Airavata API version


        Parameters:
         - authzToken
        """
        self.send_getAPIVersion(authzToken)
        return self.recv_getAPIVersion()

    def send_getAPIVersion(self, authzToken):
        self._oprot.writeMessageBegin('getAPIVersion', TMessageType.CALL, self._seqid)
        args = getAPIVersion_args()
        args.authzToken = authzToken
        args.write(self._oprot)
        self._oprot.writeMessageEnd()
        self._oprot.trans.flush()

    def recv_getAPIVersion(self):
        iprot = self._iprot
        (fname, mtype, rseqid) = iprot.readMessageBegin()
        if mtype == TMessageType.EXCEPTION:
            x = TApplicationException()
            x.read(iprot)
            iprot.readMessageEnd()
            raise x
        result = getAPIVersion_result()
        result.read(iprot)
        iprot.readMessageEnd()
        if result.success is not None:
            return result.success
        if result.ire is not None:
            raise result.ire
        if result.ace is not None:
            raise result.ace
        if result.ase is not None:
            raise result.ase
        if result.ae is not None:
            raise result.ae
        raise TApplicationException(TApplicationException.MISSING_RESULT, "getAPIVersion failed: unknown result")

    def isUserExists(self, authzToken, gatewayId, userName):
        """
        Verify if User Exists within Airavata.

        @param gatewayId

         @param userName

        @return true/false



        Parameters:
         - authzToken
         - gatewayId
         - userName
        """
        self.send_isUserExists(authzToken, gatewayId, userName)
        return self.recv_isUserExists()

    def send_isUserExists(self, authzToken, gatewayId, userName):
        self._oprot.writeMessageBegin('isUserExists', TMessageType.CALL, self._seqid)
        args = isUserExists_args()
        args.authzToken = authzToken
        args.gatewayId = gatewayId
        args.userName = userName
        args.write(self._oprot)
        self._oprot.writeMessageEnd()
        self._oprot.trans.flush()

    def recv_isUserExists(self):
        iprot = self._iprot
        (fname, mtype, rseqid) = iprot.readMessageBegin()
        if mtype == TMessageType.EXCEPTION:
            x = TApplicationException()
            x.read(iprot)
            iprot.readMessageEnd()
            raise x
        result = isUserExists_result()
        result.read(iprot)
        iprot.readMessageEnd()
        if result.success is not None:
            return result.success
        if result.ire is not None:
            raise result.ire
        if result.ace is not None:
            raise result.ace
        if result.ase is not None:
            raise result.ase
        if result.ae is not None:
            raise result.ae
        raise TApplicationException(TApplicationException.MISSING_RESULT, "isUserExists failed: unknown result")

    def addGateway(self, authzToken, gateway):
        """
        Register a Gateway with Airavata.

        @param gateway
           The gateway data model.

        @return gatewayId
          Th unique identifier of the  newly registered gateway.



        Parameters:
         - authzToken
         - gateway
        """
        self.send_addGateway(authzToken, gateway)
        return self.recv_addGateway()

    def send_addGateway(self, authzToken, gateway):
        self._oprot.writeMessageBegin('addGateway', TMessageType.CALL, self._seqid)
        args = addGateway_args()
        args.authzToken = authzToken
        args.gateway = gateway
        args.write(self._oprot)
        self._oprot.writeMessageEnd()
        self._oprot.trans.flush()

    def recv_addGateway(self):
        iprot = self._iprot
        (fname, mtype, rseqid) = iprot.readMessageBegin()
        if mtype == TMessageType.EXCEPTION:
            x = TApplicationException()
            x.read(iprot)
            iprot.readMessageEnd()
            raise x
        result = addGateway_result()
        result.read(iprot)
        iprot.readMessageEnd()
        if result.success is not None:
            return result.success
        if result.ire is not None:
            raise result.ire
        if result.ace is not None:
            raise result.ace
        if result.ase is not None:
            raise result.ase
        if result.ae is not None:
            raise result.ae
        raise TApplicationException(TApplicationException.MISSING_RESULT, "addGateway failed: unknown result")

    def getAllUsersInGateway(self, authzToken, gatewayId):
        """
        Get all users in the gateway

        @param gatewayId
           The gateway data model.

        @return users
          list of usernames of the users in the gateway



        Parameters:
         - authzToken
         - gatewayId
        """
        self.send_getAllUsersInGateway(authzToken, gatewayId)
        return self.recv_getAllUsersInGateway()

    def send_getAllUsersInGateway(self, authzToken, gatewayId):
        self._oprot.writeMessageBegin('getAllUsersInGateway', TMessageType.CALL, self._seqid)
        args = getAllUsersInGateway_args()
        args.authzToken = authzToken
        args.gatewayId = gatewayId
        args.write(self._oprot)
        self._oprot.writeMessageEnd()
        self._oprot.trans.flush()

    def recv_getAllUsersInGateway(self):
        iprot = self._iprot
        (fname, mtype, rseqid) = iprot.readMessageBegin()
        if mtype == TMessageType.EXCEPTION:
            x = TApplicationException()
            x.read(iprot)
            iprot.readMessageEnd()
            raise x
        result = getAllUsersInGateway_result()
        result.read(iprot)
        iprot.readMessageEnd()
        if result.success is not None:
            return result.success
        if result.ire is not None:
            raise result.ire
        if result.ace is not None:
            raise result.ace
        if result.ase is not None:
            raise result.ase
        if result.ae is not None:
            raise result.ae
        raise TApplicationException(TApplicationException.MISSING_RESULT, "getAllUsersInGateway failed: unknown result")

    def updateGateway(self, authzToken, gatewayId, updatedGateway):
        """
        Update previously registered Gateway metadata.

        @param gatewayId
           The gateway Id of the Gateway which require an update.

        @return gateway
           Modified gateway obejct.

        @exception AiravataClientException



        Parameters:
         - authzToken
         - gatewayId
         - updatedGateway
        """
        self.send_updateGateway(authzToken, gatewayId, updatedGateway)
        return self.recv_updateGateway()

    def send_updateGateway(self, authzToken, gatewayId, updatedGateway):
        self._oprot.writeMessageBegin('updateGateway', TMessageType.CALL, self._seqid)
        args = updateGateway_args()
        args.authzToken = authzToken
        args.gatewayId = gatewayId
        args.updatedGateway = updatedGateway
        args.write(self._oprot)
        self._oprot.writeMessageEnd()
        self._oprot.trans.flush()

    def recv_updateGateway(self):
        iprot = self._iprot
        (fname, mtype, rseqid) = iprot.readMessageBegin()
        if mtype == TMessageType.EXCEPTION:
            x = TApplicationException()
            x.read(iprot)
            iprot.readMessageEnd()
            raise x
        result = updateGateway_result()
        result.read(iprot)
        iprot.readMessageEnd()
        if result.success is not None:
            return result.success
        if result.ire is not None:
            raise result.ire
        if result.ace is not None:
            raise result.ace
        if result.ase is not None:
            raise result.ase
        if result.ae is not None:
            raise result.ae
        raise TApplicationException(TApplicationException.MISSING_RESULT, "updateGateway failed: unknown result")

    def getGateway(self, authzToken, gatewayId):
        """
        Get Gateway details by providing gatewayId

        @param gatewayId
           The gateway Id of the Gateway.

        @return gateway
           Gateway obejct.



        Parameters:
         - authzToken
         - gatewayId
        """
        self.send_getGateway(authzToken, gatewayId)
        return self.recv_getGateway()

    def send_getGateway(self, authzToken, gatewayId):
        self._oprot.writeMessageBegin('getGateway', TMessageType.CALL, self._seqid)
        args = getGateway_args()
        args.authzToken = authzToken
        args.gatewayId = gatewayId
        args.write(self._oprot)
        self._oprot.writeMessageEnd()
        self._oprot.trans.flush()

    def recv_getGateway(self):
        iprot = self._iprot
        (fname, mtype, rseqid) = iprot.readMessageBegin()
        if mtype == TMessageType.EXCEPTION:
            x = TApplicationException()
            x.read(iprot)
            iprot.readMessageEnd()
            raise x
        result = getGateway_result()
        result.read(iprot)
        iprot.readMessageEnd()
        if result.success is not None:
            return result.success
        if result.ire is not None:
            raise result.ire
        if result.ace is not None:
            raise result.ace
        if result.ase is not None:
            raise result.ase
        if result.ae is not None:
            raise result.ae
        raise TApplicationException(TApplicationException.MISSING_RESULT, "getGateway failed: unknown result")

    def deleteGateway(self, authzToken, gatewayId):
        """
        Delete a Gateway

        @param gatewayId
           The gateway Id of the Gateway to be deleted.

        @return boolean
           Boolean identifier for the success or failure of the deletion operation.



        Parameters:
         - authzToken
         - gatewayId
        """
        self.send_deleteGateway(authzToken, gatewayId)
        return self.recv_deleteGateway()

    def send_deleteGateway(self, authzToken, gatewayId):
        self._oprot.writeMessageBegin('deleteGateway', TMessageType.CALL, self._seqid)
        args = deleteGateway_args()
        args.authzToken = authzToken
        args.gatewayId = gatewayId
        args.write(self._oprot)
        self._oprot.writeMessageEnd()
        self._oprot.trans.flush()

    def recv_deleteGateway(self):
        iprot = self._iprot
        (fname, mtype, rseqid) = iprot.readMessageBegin()
        if mtype == TMessageType.EXCEPTION:
            x = TApplicationException()
            x.read(iprot)
            iprot.readMessageEnd()
            raise x
        result = deleteGateway_result()
        result.read(iprot)
        iprot.readMessageEnd()
        if result.success is not None:
            return result.success
        if result.ire is not None:
            raise result.ire
        if result.ace is not None:
            raise result.ace
        if result.ase is not None:
            raise result.ase
        if result.ae is not None:
            raise result.ae
        raise TApplicationException(TApplicationException.MISSING_RESULT, "deleteGateway failed: unknown result")

    def getAllGateways(self, authzToken):
        """
        Get All the Gateways Connected to Airavata.


        Parameters:
         - authzToken
        """
        self.send_getAllGateways(authzToken)
        return self.recv_getAllGateways()

    def send_getAllGateways(self, authzToken):
        self._oprot.writeMessageBegin('getAllGateways', TMessageType.CALL, self._seqid)
        args = getAllGateways_args()
        args.authzToken = authzToken
        args.write(self._oprot)
        self._oprot.writeMessageEnd()
        self._oprot.trans.flush()

    def recv_getAllGateways(self):
        iprot = self._iprot
        (fname, mtype, rseqid) = iprot.readMessageBegin()
        if mtype == TMessageType.EXCEPTION:
            x = TApplicationException()
            x.read(iprot)
            iprot.readMessageEnd()
            raise x
        result = getAllGateways_result()
        result.read(iprot)
        iprot.readMessageEnd()
        if result.success is not None:
            return result.success
        if result.ire is not None:
            raise result.ire
        if result.ace is not None:
            raise result.ace
        if result.ase is not None:
            raise result.ase
        if result.ae is not None:
            raise result.ae
        raise TApplicationException(TApplicationException.MISSING_RESULT, "getAllGateways failed: unknown result")

    def isGatewayExist(self, authzToken, gatewayId):
        """
        Check for the Existance of a Gateway within Airavata

        @param gatewayId
          Provide the gatewayId of the gateway you want to check the existancy

        @return boolean
          Boolean idetifier for the existance or non-existane of the gatewayId

        @return gatewayId
          return the gatewayId of the existing gateway.



        Parameters:
         - authzToken
         - gatewayId
        """
        self.send_isGatewayExist(authzToken, gatewayId)
        return self.recv_isGatewayExist()

    def send_isGatewayExist(self, authzToken, gatewayId):
        self._oprot.writeMessageBegin('isGatewayExist', TMessageType.CALL, self._seqid)
        args = isGatewayExist_args()
        args.authzToken = authzToken
        args.gatewayId = gatewayId
        args.write(self._oprot)
        self._oprot.writeMessageEnd()
        self._oprot.trans.flush()

    def recv_isGatewayExist(self):
        iprot = self._iprot
        (fname, mtype, rseqid) = iprot.readMessageBegin()
        if mtype == TMessageType.EXCEPTION:
            x = TApplicationException()
            x.read(iprot)
            iprot.readMessageEnd()
            raise x
        result = isGatewayExist_result()
        result.read(iprot)
        iprot.readMessageEnd()
        if result.success is not None:
            return result.success
        if result.ire is not None:
            raise result.ire
        if result.ace is not None:
            raise result.ace
        if result.ase is not None:
            raise result.ase
        if result.ae is not None:
            raise result.ae
        raise TApplicationException(TApplicationException.MISSING_RESULT, "isGatewayExist failed: unknown result")

    def createNotification(self, authzToken, notification):
        """
          * API methods to retrieve notifications
        *

        Parameters:
         - authzToken
         - notification
        """
        self.send_createNotification(authzToken, notification)
        return self.recv_createNotification()

    def send_createNotification(self, authzToken, notification):
        self._oprot.writeMessageBegin('createNotification', TMessageType.CALL, self._seqid)
        args = createNotification_args()
        args.authzToken = authzToken
        args.notification = notification
        args.write(self._oprot)
        self._oprot.writeMessageEnd()
        self._oprot.trans.flush()

    def recv_createNotification(self):
        iprot = self._iprot
        (fname, mtype, rseqid) = iprot.readMessageBegin()
        if mtype == TMessageType.EXCEPTION:
            x = TApplicationException()
            x.read(iprot)
            iprot.readMessageEnd()
            raise x
        result = createNotification_result()
        result.read(iprot)
        iprot.readMessageEnd()
        if result.success is not None:
            return result.success
        if result.ire is not None:
            raise result.ire
        if result.ace is not None:
            raise result.ace
        if result.ase is not None:
            raise result.ase
        if result.ae is not None:
            raise result.ae
        raise TApplicationException(TApplicationException.MISSING_RESULT, "createNotification failed: unknown result")

    def updateNotification(self, authzToken, notification):
        """
        Parameters:
         - authzToken
         - notification
        """
        self.send_updateNotification(authzToken, notification)
        return self.recv_updateNotification()

    def send_updateNotification(self, authzToken, notification):
        self._oprot.writeMessageBegin('updateNotification', TMessageType.CALL, self._seqid)
        args = updateNotification_args()
        args.authzToken = authzToken
        args.notification = notification
        args.write(self._oprot)
        self._oprot.writeMessageEnd()
        self._oprot.trans.flush()

    def recv_updateNotification(self):
        iprot = self._iprot
        (fname, mtype, rseqid) = iprot.readMessageBegin()
        if mtype == TMessageType.EXCEPTION:
            x = TApplicationException()
            x.read(iprot)
            iprot.readMessageEnd()
            raise x
        result = updateNotification_result()
        result.read(iprot)
        iprot.readMessageEnd()
        if result.success is not None:
            return result.success
        if result.ire is not None:
            raise result.ire
        if result.ace is not None:
            raise result.ace
        if result.ase is not None:
            raise result.ase
        if result.ae is not None:
            raise result.ae
        raise TApplicationException(TApplicationException.MISSING_RESULT, "updateNotification failed: unknown result")

    def deleteNotification(self, authzToken, gatewayId, notificationId):
        """
        Parameters:
         - authzToken
         - gatewayId
         - notificationId
        """
        self.send_deleteNotification(authzToken, gatewayId, notificationId)
        return self.recv_deleteNotification()

    def send_deleteNotification(self, authzToken, gatewayId, notificationId):
        self._oprot.writeMessageBegin('deleteNotification', TMessageType.CALL, self._seqid)
        args = deleteNotification_args()
        args.authzToken = authzToken
        args.gatewayId = gatewayId
        args.notificationId = notificationId
        args.write(self._oprot)
        self._oprot.writeMessageEnd()
        self._oprot.trans.flush()

    def recv_deleteNotification(self):
        iprot = self._iprot
        (fname, mtype, rseqid) = iprot.readMessageBegin()
        if mtype == TMessageType.EXCEPTION:
            x = TApplicationException()
            x.read(iprot)
            iprot.readMessageEnd()
            raise x
        result = deleteNotification_result()
        result.read(iprot)
        iprot.readMessageEnd()
        if result.success is not None:
            return result.success
        if result.ire is not None:
            raise result.ire
        if result.ace is not None:
            raise result.ace
        if result.ase is not None:
            raise result.ase
        if result.ae is not None:
            raise result.ae
        raise TApplicationException(TApplicationException.MISSING_RESULT, "deleteNotification failed: unknown result")

    def getNotification(self, authzToken, gatewayId, notificationId):
        """
        Parameters:
         - authzToken
         - gatewayId
         - notificationId
        """
        self.send_getNotification(authzToken, gatewayId, notificationId)
        return self.recv_getNotification()

    def send_getNotification(self, authzToken, gatewayId, notificationId):
        self._oprot.writeMessageBegin('getNotification', TMessageType.CALL, self._seqid)
        args = getNotification_args()
        args.authzToken = authzToken
        args.gatewayId = gatewayId
        args.notificationId = notificationId
        args.write(self._oprot)
        self._oprot.writeMessageEnd()
        self._oprot.trans.flush()

    def recv_getNotification(self):
        iprot = self._iprot
        (fname, mtype, rseqid) = iprot.readMessageBegin()
        if mtype == TMessageType.EXCEPTION:
            x = TApplicationException()
            x.read(iprot)
            iprot.readMessageEnd()
            raise x
        result = getNotification_result()
        result.read(iprot)
        iprot.readMessageEnd()
        if result.success is not None:
            return result.success
        if result.ire is not None:
            raise result.ire
        if result.ace is not None:
            raise result.ace
        if result.ase is not None:
            raise result.ase
        if result.ae is not None:
            raise result.ae
        raise TApplicationException(TApplicationException.MISSING_RESULT, "getNotification failed: unknown result")

    def getAllNotifications(self, authzToken, gatewayId):
        """
        Parameters:
         - authzToken
         - gatewayId
        """
        self.send_getAllNotifications(authzToken, gatewayId)
        return self.recv_getAllNotifications()

    def send_getAllNotifications(self, authzToken, gatewayId):
        self._oprot.writeMessageBegin('getAllNotifications', TMessageType.CALL, self._seqid)
        args = getAllNotifications_args()
        args.authzToken = authzToken
        args.gatewayId = gatewayId
        args.write(self._oprot)
        self._oprot.writeMessageEnd()
        self._oprot.trans.flush()

    def recv_getAllNotifications(self):
        iprot = self._iprot
        (fname, mtype, rseqid) = iprot.readMessageBegin()
        if mtype == TMessageType.EXCEPTION:
            x = TApplicationException()
            x.read(iprot)
            iprot.readMessageEnd()
            raise x
        result = getAllNotifications_result()
        result.read(iprot)
        iprot.readMessageEnd()
        if result.success is not None:
            return result.success
        if result.ire is not None:
            raise result.ire
        if result.ace is not None:
            raise result.ace
        if result.ase is not None:
            raise result.ase
        if result.ae is not None:
            raise result.ae
        raise TApplicationException(TApplicationException.MISSING_RESULT, "getAllNotifications failed: unknown result")

    def generateAndRegisterSSHKeys(self, authzToken, gatewayId, userName, description, credentialOwnerType):
        """
        Generate and Register SSH Key Pair with Airavata Credential Store.

        @param gatewayId
           The identifier for the requested Gateway.

        @param userName
           The User for which the credential should be registered. For community accounts, this user is the name of the
           community user name. For computational resources, this user name need not be the same user name on resoruces.

        @param description
           The description field for a credential type, all type of credential can have a description.

        @param credentialOwnerType
           The type of owner of this credential. Two possible values: GATEWAY (default) and USER

        @return airavataCredStoreToken
          An SSH Key pair is generated and stored in the credential store and associated with users or community account
          belonging to a Gateway.



        Parameters:
         - authzToken
         - gatewayId
         - userName
         - description
         - credentialOwnerType
        """
        self.send_generateAndRegisterSSHKeys(authzToken, gatewayId, userName, description, credentialOwnerType)
        return self.recv_generateAndRegisterSSHKeys()

    def send_generateAndRegisterSSHKeys(self, authzToken, gatewayId, userName, description, credentialOwnerType):
        self._oprot.writeMessageBegin('generateAndRegisterSSHKeys', TMessageType.CALL, self._seqid)
        args = generateAndRegisterSSHKeys_args()
        args.authzToken = authzToken
        args.gatewayId = gatewayId
        args.userName = userName
        args.description = description
        args.credentialOwnerType = credentialOwnerType
        args.write(self._oprot)
        self._oprot.writeMessageEnd()
        self._oprot.trans.flush()

    def recv_generateAndRegisterSSHKeys(self):
        iprot = self._iprot
        (fname, mtype, rseqid) = iprot.readMessageBegin()
        if mtype == TMessageType.EXCEPTION:
            x = TApplicationException()
            x.read(iprot)
            iprot.readMessageEnd()
            raise x
        result = generateAndRegisterSSHKeys_result()
        result.read(iprot)
        iprot.readMessageEnd()
        if result.success is not None:
            return result.success
        if result.ire is not None:
            raise result.ire
        if result.ace is not None:
            raise result.ace
        if result.ase is not None:
            raise result.ase
        raise TApplicationException(TApplicationException.MISSING_RESULT, "generateAndRegisterSSHKeys failed: unknown result")

    def registerPwdCredential(self, authzToken, gatewayId, portalUserName, loginUserName, password, description):
        """
        Generate and Register Username PWD Pair with Airavata Credential Store.

        @param gatewayId
           The identifier for the requested Gateway.

        @param portalUserName
           The User for which the credential should be registered. For community accounts, this user is the name of the
           community user name. For computational resources, this user name need not be the same user name on resoruces.

        @param loginUserName

        @param password

        @return airavataCredStoreToken
          An SSH Key pair is generated and stored in the credential store and associated with users or community account
          belonging to a Gateway.



        Parameters:
         - authzToken
         - gatewayId
         - portalUserName
         - loginUserName
         - password
         - description
        """
        self.send_registerPwdCredential(authzToken, gatewayId, portalUserName, loginUserName, password, description)
        return self.recv_registerPwdCredential()

    def send_registerPwdCredential(self, authzToken, gatewayId, portalUserName, loginUserName, password, description):
        self._oprot.writeMessageBegin('registerPwdCredential', TMessageType.CALL, self._seqid)
        args = registerPwdCredential_args()
        args.authzToken = authzToken
        args.gatewayId = gatewayId
        args.portalUserName = portalUserName
        args.loginUserName = loginUserName
        args.password = password
        args.description = description
        args.write(self._oprot)
        self._oprot.writeMessageEnd()
        self._oprot.trans.flush()

    def recv_registerPwdCredential(self):
        iprot = self._iprot
        (fname, mtype, rseqid) = iprot.readMessageBegin()
        if mtype == TMessageType.EXCEPTION:
            x = TApplicationException()
            x.read(iprot)
            iprot.readMessageEnd()
            raise x
        result = registerPwdCredential_result()
        result.read(iprot)
        iprot.readMessageEnd()
        if result.success is not None:
            return result.success
        if result.ire is not None:
            raise result.ire
        if result.ace is not None:
            raise result.ace
        if result.ase is not None:
            raise result.ase
        raise TApplicationException(TApplicationException.MISSING_RESULT, "registerPwdCredential failed: unknown result")

    def getSSHPubKey(self, authzToken, airavataCredStoreToken, gatewayId):
        """
        Get a Public Key by Providing the Token

        @param CredStoreToken
           Credential Store Token which you want to find the Public Key for.

        @param gatewayId
           This is the unique identifier of your gateway where the token and public key was generated from.

        @return publicKey



        Parameters:
         - authzToken
         - airavataCredStoreToken
         - gatewayId
        """
        self.send_getSSHPubKey(authzToken, airavataCredStoreToken, gatewayId)
        return self.recv_getSSHPubKey()

    def send_getSSHPubKey(self, authzToken, airavataCredStoreToken, gatewayId):
        self._oprot.writeMessageBegin('getSSHPubKey', TMessageType.CALL, self._seqid)
        args = getSSHPubKey_args()
        args.authzToken = authzToken
        args.airavataCredStoreToken = airavataCredStoreToken
        args.gatewayId = gatewayId
        args.write(self._oprot)
        self._oprot.writeMessageEnd()
        self._oprot.trans.flush()

    def recv_getSSHPubKey(self):
        iprot = self._iprot
        (fname, mtype, rseqid) = iprot.readMessageBegin()
        if mtype == TMessageType.EXCEPTION:
            x = TApplicationException()
            x.read(iprot)
            iprot.readMessageEnd()
            raise x
        result = getSSHPubKey_result()
        result.read(iprot)
        iprot.readMessageEnd()
        if result.success is not None:
            return result.success
        if result.ire is not None:
            raise result.ire
        if result.ace is not None:
            raise result.ace
        if result.ase is not None:
            raise result.ase
        raise TApplicationException(TApplicationException.MISSING_RESULT, "getSSHPubKey failed: unknown result")

    def getAllGatewaySSHPubKeys(self, authzToken, gatewayId):
        """

        Get all Public Keys of the Gateway

        @param CredStoreToken
           Credential Store Token which you want to find the Public Key for.

        @param gatewayId
           This is the unique identifier of your gateway where the token and public key was generated from.

        @return publicKey



        Parameters:
         - authzToken
         - gatewayId
        """
        self.send_getAllGatewaySSHPubKeys(authzToken, gatewayId)
        return self.recv_getAllGatewaySSHPubKeys()

    def send_getAllGatewaySSHPubKeys(self, authzToken, gatewayId):
        self._oprot.writeMessageBegin('getAllGatewaySSHPubKeys', TMessageType.CALL, self._seqid)
        args = getAllGatewaySSHPubKeys_args()
        args.authzToken = authzToken
        args.gatewayId = gatewayId
        args.write(self._oprot)
        self._oprot.writeMessageEnd()
        self._oprot.trans.flush()

    def recv_getAllGatewaySSHPubKeys(self):
        iprot = self._iprot
        (fname, mtype, rseqid) = iprot.readMessageBegin()
        if mtype == TMessageType.EXCEPTION:
            x = TApplicationException()
            x.read(iprot)
            iprot.readMessageEnd()
            raise x
        result = getAllGatewaySSHPubKeys_result()
        result.read(iprot)
        iprot.readMessageEnd()
        if result.success is not None:
            return result.success
        if result.ire is not None:
            raise result.ire
        if result.ace is not None:
            raise result.ace
        if result.ase is not None:
            raise result.ase
        raise TApplicationException(TApplicationException.MISSING_RESULT, "getAllGatewaySSHPubKeys failed: unknown result")

    def getAllCredentialSummaryForGateway(self, authzToken, type, gatewayId):
        """

        Get all Credential summaries for the Gateway

        @param CredStoreToken
           Credential Store Token which you want to find the Public Key for.

        @param credential_store_data_models.SummaryType
           Summary type : SSH,PASSWD or CERT

        @param gatewayId
           This is the unique identifier of your gateway where the token and public key was generated from.

        @return List of Credential Summary Objects



        Parameters:
         - authzToken
         - type
         - gatewayId
        """
        self.send_getAllCredentialSummaryForGateway(authzToken, type, gatewayId)
        return self.recv_getAllCredentialSummaryForGateway()

    def send_getAllCredentialSummaryForGateway(self, authzToken, type, gatewayId):
        self._oprot.writeMessageBegin('getAllCredentialSummaryForGateway', TMessageType.CALL, self._seqid)
        args = getAllCredentialSummaryForGateway_args()
        args.authzToken = authzToken
        args.type = type
        args.gatewayId = gatewayId
        args.write(self._oprot)
        self._oprot.writeMessageEnd()
        self._oprot.trans.flush()

    def recv_getAllCredentialSummaryForGateway(self):
        iprot = self._iprot
        (fname, mtype, rseqid) = iprot.readMessageBegin()
        if mtype == TMessageType.EXCEPTION:
            x = TApplicationException()
            x.read(iprot)
            iprot.readMessageEnd()
            raise x
        result = getAllCredentialSummaryForGateway_result()
        result.read(iprot)
        iprot.readMessageEnd()
        if result.success is not None:
            return result.success
        if result.ire is not None:
            raise result.ire
        if result.ace is not None:
            raise result.ace
        if result.ase is not None:
            raise result.ase
        raise TApplicationException(TApplicationException.MISSING_RESULT, "getAllCredentialSummaryForGateway failed: unknown result")

    def getAllCredentialSummaryForUsersInGateway(self, authzToken, type, gatewayId, userId):
        """

        Get all Credential summaries for user in a Gateway

        @param CredStoreToken
           Credential Store Token which you want to find the Public Key for.

        @param credential_store_data_models.SummaryType
           Summary type : SSH,PASSWD or CERT

        @param gatewayId
           This is the unique identifier of your gateway where the token and public key was generated from.

        @param userId
           This is the unique identifier of user whose public keys are to be fetched.

        @return CredentialSummary



        Parameters:
         - authzToken
         - type
         - gatewayId
         - userId
        """
        self.send_getAllCredentialSummaryForUsersInGateway(authzToken, type, gatewayId, userId)
        return self.recv_getAllCredentialSummaryForUsersInGateway()

    def send_getAllCredentialSummaryForUsersInGateway(self, authzToken, type, gatewayId, userId):
        self._oprot.writeMessageBegin('getAllCredentialSummaryForUsersInGateway', TMessageType.CALL, self._seqid)
        args = getAllCredentialSummaryForUsersInGateway_args()
        args.authzToken = authzToken
        args.type = type
        args.gatewayId = gatewayId
        args.userId = userId
        args.write(self._oprot)
        self._oprot.writeMessageEnd()
        self._oprot.trans.flush()

    def recv_getAllCredentialSummaryForUsersInGateway(self):
        iprot = self._iprot
        (fname, mtype, rseqid) = iprot.readMessageBegin()
        if mtype == TMessageType.EXCEPTION:
            x = TApplicationException()
            x.read(iprot)
            iprot.readMessageEnd()
            raise x
        result = getAllCredentialSummaryForUsersInGateway_result()
        result.read(iprot)
        iprot.readMessageEnd()
        if result.success is not None:
            return result.success
        if result.ire is not None:
            raise result.ire
        if result.ace is not None:
            raise result.ace
        if result.ase is not None:
            raise result.ase
        raise TApplicationException(TApplicationException.MISSING_RESULT, "getAllCredentialSummaryForUsersInGateway failed: unknown result")

    def getAllGatewayPWDCredentials(self, authzToken, gatewayId):
        """
        Parameters:
         - authzToken
         - gatewayId
        """
        self.send_getAllGatewayPWDCredentials(authzToken, gatewayId)
        return self.recv_getAllGatewayPWDCredentials()

    def send_getAllGatewayPWDCredentials(self, authzToken, gatewayId):
        self._oprot.writeMessageBegin('getAllGatewayPWDCredentials', TMessageType.CALL, self._seqid)
        args = getAllGatewayPWDCredentials_args()
        args.authzToken = authzToken
        args.gatewayId = gatewayId
        args.write(self._oprot)
        self._oprot.writeMessageEnd()
        self._oprot.trans.flush()

    def recv_getAllGatewayPWDCredentials(self):
        iprot = self._iprot
        (fname, mtype, rseqid) = iprot.readMessageBegin()
        if mtype == TMessageType.EXCEPTION:
            x = TApplicationException()
            x.read(iprot)
            iprot.readMessageEnd()
            raise x
        result = getAllGatewayPWDCredentials_result()
        result.read(iprot)
        iprot.readMessageEnd()
        if result.success is not None:
            return result.success
        if result.ire is not None:
            raise result.ire
        if result.ace is not None:
            raise result.ace
        if result.ase is not None:
            raise result.ase
        raise TApplicationException(TApplicationException.MISSING_RESULT, "getAllGatewayPWDCredentials failed: unknown result")

    def deleteSSHPubKey(self, authzToken, airavataCredStoreToken, gatewayId):
        """

        Delete a Gateway

        @param gatewayId
           The gateway Id of the Gateway to be deleted.

        @return boolean
           Boolean identifier for the success or failure of the deletion operation.



        Parameters:
         - authzToken
         - airavataCredStoreToken
         - gatewayId
        """
        self.send_deleteSSHPubKey(authzToken, airavataCredStoreToken, gatewayId)
        return self.recv_deleteSSHPubKey()

    def send_deleteSSHPubKey(self, authzToken, airavataCredStoreToken, gatewayId):
        self._oprot.writeMessageBegin('deleteSSHPubKey', TMessageType.CALL, self._seqid)
        args = deleteSSHPubKey_args()
        args.authzToken = authzToken
        args.airavataCredStoreToken = airavataCredStoreToken
        args.gatewayId = gatewayId
        args.write(self._oprot)
        self._oprot.writeMessageEnd()
        self._oprot.trans.flush()

    def recv_deleteSSHPubKey(self):
        iprot = self._iprot
        (fname, mtype, rseqid) = iprot.readMessageBegin()
        if mtype == TMessageType.EXCEPTION:
            x = TApplicationException()
            x.read(iprot)
            iprot.readMessageEnd()
            raise x
        result = deleteSSHPubKey_result()
        result.read(iprot)
        iprot.readMessageEnd()
        if result.success is not None:
            return result.success
        if result.ire is not None:
            raise result.ire
        if result.ace is not None:
            raise result.ace
        if result.ase is not None:
            raise result.ase
        raise TApplicationException(TApplicationException.MISSING_RESULT, "deleteSSHPubKey failed: unknown result")

    def deletePWDCredential(self, authzToken, airavataCredStoreToken, gatewayId):
        """
        Parameters:
         - authzToken
         - airavataCredStoreToken
         - gatewayId
        """
        self.send_deletePWDCredential(authzToken, airavataCredStoreToken, gatewayId)
        return self.recv_deletePWDCredential()

    def send_deletePWDCredential(self, authzToken, airavataCredStoreToken, gatewayId):
        self._oprot.writeMessageBegin('deletePWDCredential', TMessageType.CALL, self._seqid)
        args = deletePWDCredential_args()
        args.authzToken = authzToken
        args.airavataCredStoreToken = airavataCredStoreToken
        args.gatewayId = gatewayId
        args.write(self._oprot)
        self._oprot.writeMessageEnd()
        self._oprot.trans.flush()

    def recv_deletePWDCredential(self):
        iprot = self._iprot
        (fname, mtype, rseqid) = iprot.readMessageBegin()
        if mtype == TMessageType.EXCEPTION:
            x = TApplicationException()
            x.read(iprot)
            iprot.readMessageEnd()
            raise x
        result = deletePWDCredential_result()
        result.read(iprot)
        iprot.readMessageEnd()
        if result.success is not None:
            return result.success
        if result.ire is not None:
            raise result.ire
        if result.ace is not None:
            raise result.ace
        if result.ase is not None:
            raise result.ase
        raise TApplicationException(TApplicationException.MISSING_RESULT, "deletePWDCredential failed: unknown result")

    def createProject(self, authzToken, gatewayId, project):
        """

        Creates a Project with basic metadata.
           A Project is a container of experiments.

        @param gatewayId
           The identifier for the requested gateway.

        @param Project
           The Project Object described in the workspace_model.



        Parameters:
         - authzToken
         - gatewayId
         - project
        """
        self.send_createProject(authzToken, gatewayId, project)
        return self.recv_createProject()

    def send_createProject(self, authzToken, gatewayId, project):
        self._oprot.writeMessageBegin('createProject', TMessageType.CALL, self._seqid)
        args = createProject_args()
        args.authzToken = authzToken
        args.gatewayId = gatewayId
        args.project = project
        args.write(self._oprot)
        self._oprot.writeMessageEnd()
        self._oprot.trans.flush()

    def recv_createProject(self):
        iprot = self._iprot
        (fname, mtype, rseqid) = iprot.readMessageBegin()
        if mtype == TMessageType.EXCEPTION:
            x = TApplicationException()
            x.read(iprot)
            iprot.readMessageEnd()
            raise x
        result = createProject_result()
        result.read(iprot)
        iprot.readMessageEnd()
        if result.success is not None:
            return result.success
        if result.ire is not None:
            raise result.ire
        if result.ace is not None:
            raise result.ace
        if result.ase is not None:
            raise result.ase
        if result.ae is not None:
            raise result.ae
        raise TApplicationException(TApplicationException.MISSING_RESULT, "createProject failed: unknown result")

    def updateProject(self, authzToken, projectId, updatedProject):
        """

        Update an Existing Project

        @param projectId
           The projectId of the project needed an update.

        @return void
           Currently this does not return any value.



        Parameters:
         - authzToken
         - projectId
         - updatedProject
        """
        self.send_updateProject(authzToken, projectId, updatedProject)
        self.recv_updateProject()

    def send_updateProject(self, authzToken, projectId, updatedProject):
        self._oprot.writeMessageBegin('updateProject', TMessageType.CALL, self._seqid)
        args = updateProject_args()
        args.authzToken = authzToken
        args.projectId = projectId
        args.updatedProject = updatedProject
        args.write(self._oprot)
        self._oprot.writeMessageEnd()
        self._oprot.trans.flush()

    def recv_updateProject(self):
        iprot = self._iprot
        (fname, mtype, rseqid) = iprot.readMessageBegin()
        if mtype == TMessageType.EXCEPTION:
            x = TApplicationException()
            x.read(iprot)
            iprot.readMessageEnd()
            raise x
        result = updateProject_result()
        result.read(iprot)
        iprot.readMessageEnd()
        if result.ire is not None:
            raise result.ire
        if result.ace is not None:
            raise result.ace
        if result.ase is not None:
            raise result.ase
        if result.pnfe is not None:
            raise result.pnfe
        if result.ae is not None:
            raise result.ae
        return

    def getProject(self, authzToken, projectId):
        """

        Get a Project by ID
           This method is to obtain a project by providing a projectId.

        @param projectId
           projectId of the project you require.

        @return project
           project data model will be returned.



        Parameters:
         - authzToken
         - projectId
        """
        self.send_getProject(authzToken, projectId)
        return self.recv_getProject()

    def send_getProject(self, authzToken, projectId):
        self._oprot.writeMessageBegin('getProject', TMessageType.CALL, self._seqid)
        args = getProject_args()
        args.authzToken = authzToken
        args.projectId = projectId
        args.write(self._oprot)
        self._oprot.writeMessageEnd()
        self._oprot.trans.flush()

    def recv_getProject(self):
        iprot = self._iprot
        (fname, mtype, rseqid) = iprot.readMessageBegin()
        if mtype == TMessageType.EXCEPTION:
            x = TApplicationException()
            x.read(iprot)
            iprot.readMessageEnd()
            raise x
        result = getProject_result()
        result.read(iprot)
        iprot.readMessageEnd()
        if result.success is not None:
            return result.success
        if result.ire is not None:
            raise result.ire
        if result.ace is not None:
            raise result.ace
        if result.ase is not None:
            raise result.ase
        if result.pnfe is not None:
            raise result.pnfe
        if result.ae is not None:
            raise result.ae
        raise TApplicationException(TApplicationException.MISSING_RESULT, "getProject failed: unknown result")

    def deleteProject(self, authzToken, projectId):
        """

        Delete a Project
           This method is used to delete an existing Project.

        @param projectId
           projectId of the project you want to delete.

        @return boolean
           Boolean identifier for the success or failure of the deletion operation.

           NOTE: This method is not used within gateways connected with Airavata.



        Parameters:
         - authzToken
         - projectId
        """
        self.send_deleteProject(authzToken, projectId)
        return self.recv_deleteProject()

    def send_deleteProject(self, authzToken, projectId):
        self._oprot.writeMessageBegin('deleteProject', TMessageType.CALL, self._seqid)
        args = deleteProject_args()
        args.authzToken = authzToken
        args.projectId = projectId
        args.write(self._oprot)
        self._oprot.writeMessageEnd()
        self._oprot.trans.flush()

    def recv_deleteProject(self):
        iprot = self._iprot
        (fname, mtype, rseqid) = iprot.readMessageBegin()
        if mtype == TMessageType.EXCEPTION:
            x = TApplicationException()
            x.read(iprot)
            iprot.readMessageEnd()
            raise x
        result = deleteProject_result()
        result.read(iprot)
        iprot.readMessageEnd()
        if result.success is not None:
            return result.success
        if result.ire is not None:
            raise result.ire
        if result.ace is not None:
            raise result.ace
        if result.ase is not None:
            raise result.ase
        if result.pnfe is not None:
            raise result.pnfe
        if result.ae is not None:
            raise result.ae
        raise TApplicationException(TApplicationException.MISSING_RESULT, "deleteProject failed: unknown result")

    def getUserProjects(self, authzToken, gatewayId, userName, limit, offset):
        """

        Get All User Projects
        Get all Project for the user with pagination. Results will be ordered based on creation time DESC.

        @param gatewayId
           The identifier for the requested gateway.

        @param userName
           The identifier of the user.

        @param limit
           The amount results to be fetched.

        @param offset
           The starting point of the results to be fetched.



        Parameters:
         - authzToken
         - gatewayId
         - userName
         - limit
         - offset
        """
        self.send_getUserProjects(authzToken, gatewayId, userName, limit, offset)
        return self.recv_getUserProjects()

    def send_getUserProjects(self, authzToken, gatewayId, userName, limit, offset):
        self._oprot.writeMessageBegin('getUserProjects', TMessageType.CALL, self._seqid)
        args = getUserProjects_args()
        args.authzToken = authzToken
        args.gatewayId = gatewayId
        args.userName = userName
        args.limit = limit
        args.offset = offset
        args.write(self._oprot)
        self._oprot.writeMessageEnd()
        self._oprot.trans.flush()

    def recv_getUserProjects(self):
        iprot = self._iprot
        (fname, mtype, rseqid) = iprot.readMessageBegin()
        if mtype == TMessageType.EXCEPTION:
            x = TApplicationException()
            x.read(iprot)
            iprot.readMessageEnd()
            raise x
        result = getUserProjects_result()
        result.read(iprot)
        iprot.readMessageEnd()
        if result.success is not None:
            return result.success
        if result.ire is not None:
            raise result.ire
        if result.ace is not None:
            raise result.ace
        if result.ase is not None:
            raise result.ase
        if result.ae is not None:
            raise result.ae
        raise TApplicationException(TApplicationException.MISSING_RESULT, "getUserProjects failed: unknown result")

    def searchProjects(self, authzToken, gatewayId, userName, filters, limit, offset):
        """

        Search User Projects
        Search and get all Projects for user by project description or/and project name  with pagination.
        Results will be ordered based on creation time DESC.

        @param gatewayId
           The unique identifier of the gateway making the request.

        @param userName
           The identifier of the user.

        @param filters
           Map of multiple filter criteria. Currenlt search filters includes Project Name and Project Description

        @param limit
           The amount results to be fetched.

        @param offset
           The starting point of the results to be fetched.



        Parameters:
         - authzToken
         - gatewayId
         - userName
         - filters
         - limit
         - offset
        """
        self.send_searchProjects(authzToken, gatewayId, userName, filters, limit, offset)
        return self.recv_searchProjects()

    def send_searchProjects(self, authzToken, gatewayId, userName, filters, limit, offset):
        self._oprot.writeMessageBegin('searchProjects', TMessageType.CALL, self._seqid)
        args = searchProjects_args()
        args.authzToken = authzToken
        args.gatewayId = gatewayId
        args.userName = userName
        args.filters = filters
        args.limit = limit
        args.offset = offset
        args.write(self._oprot)
        self._oprot.writeMessageEnd()
        self._oprot.trans.flush()

    def recv_searchProjects(self):
        iprot = self._iprot
        (fname, mtype, rseqid) = iprot.readMessageBegin()
        if mtype == TMessageType.EXCEPTION:
            x = TApplicationException()
            x.read(iprot)
            iprot.readMessageEnd()
            raise x
        result = searchProjects_result()
        result.read(iprot)
        iprot.readMessageEnd()
        if result.success is not None:
            return result.success
        if result.ire is not None:
            raise result.ire
        if result.ace is not None:
            raise result.ace
        if result.ase is not None:
            raise result.ase
        if result.ae is not None:
            raise result.ae
        raise TApplicationException(TApplicationException.MISSING_RESULT, "searchProjects failed: unknown result")

    def searchExperiments(self, authzToken, gatewayId, userName, filters, limit, offset):
        """
        Search Experiments.
        Search Experiments by using multiple filter criteria with pagination. Results will be sorted based on creation time DESC.

        @param gatewayId
              Identifier of the requested gateway.

        @param userName
              Username of the user requesting the search function.

        @param filters
              Map of multiple filter criteria. Currenlt search filters includes Experiment Name, Description, Application, etc....

        @param limit
              Amount of results to be fetched.

        @param offset
              The starting point of the results to be fetched.

        @return ExperimentSummaryModel
           List of experiments for the given search filter. Here only the Experiment summary will be returned.



        Parameters:
         - authzToken
         - gatewayId
         - userName
         - filters
         - limit
         - offset
        """
        self.send_searchExperiments(authzToken, gatewayId, userName, filters, limit, offset)
        return self.recv_searchExperiments()

    def send_searchExperiments(self, authzToken, gatewayId, userName, filters, limit, offset):
        self._oprot.writeMessageBegin('searchExperiments', TMessageType.CALL, self._seqid)
        args = searchExperiments_args()
        args.authzToken = authzToken
        args.gatewayId = gatewayId
        args.userName = userName
        args.filters = filters
        args.limit = limit
        args.offset = offset
        args.write(self._oprot)
        self._oprot.writeMessageEnd()
        self._oprot.trans.flush()

    def recv_searchExperiments(self):
        iprot = self._iprot
        (fname, mtype, rseqid) = iprot.readMessageBegin()
        if mtype == TMessageType.EXCEPTION:
            x = TApplicationException()
            x.read(iprot)
            iprot.readMessageEnd()
            raise x
        result = searchExperiments_result()
        result.read(iprot)
        iprot.readMessageEnd()
        if result.success is not None:
            return result.success
        if result.ire is not None:
            raise result.ire
        if result.ace is not None:
            raise result.ace
        if result.ase is not None:
            raise result.ase
        if result.ae is not None:
            raise result.ae
        raise TApplicationException(TApplicationException.MISSING_RESULT, "searchExperiments failed: unknown result")

    def getExperimentStatistics(self, authzToken, gatewayId, fromTime, toTime, userName, applicationName, resourceHostName):
        """

        Get Experiment Statistics
        Get Experiment Statisitics for a given gateway for a specific time period. This feature is available only for admins of a particular gateway. Gateway admin access is managed by the user roles.

        @param gatewayId
              Unique identifier of the gateway making the request to fetch statistics.

        @param fromTime
              Starting date time.

        @param toTime
              Ending data time.

        @param userName
              Gateway username substring with which to further filter statistics.

        @param applicationName
              Application id substring with which to further filter statistics.

        @param resourceHostName
              Hostname id substring with which to further filter statistics.



        Parameters:
         - authzToken
         - gatewayId
         - fromTime
         - toTime
         - userName
         - applicationName
         - resourceHostName
        """
        self.send_getExperimentStatistics(authzToken, gatewayId, fromTime, toTime, userName, applicationName, resourceHostName)
        return self.recv_getExperimentStatistics()

    def send_getExperimentStatistics(self, authzToken, gatewayId, fromTime, toTime, userName, applicationName, resourceHostName):
        self._oprot.writeMessageBegin('getExperimentStatistics', TMessageType.CALL, self._seqid)
        args = getExperimentStatistics_args()
        args.authzToken = authzToken
        args.gatewayId = gatewayId
        args.fromTime = fromTime
        args.toTime = toTime
        args.userName = userName
        args.applicationName = applicationName
        args.resourceHostName = resourceHostName
        args.write(self._oprot)
        self._oprot.writeMessageEnd()
        self._oprot.trans.flush()

    def recv_getExperimentStatistics(self):
        iprot = self._iprot
        (fname, mtype, rseqid) = iprot.readMessageBegin()
        if mtype == TMessageType.EXCEPTION:
            x = TApplicationException()
            x.read(iprot)
            iprot.readMessageEnd()
            raise x
        result = getExperimentStatistics_result()
        result.read(iprot)
        iprot.readMessageEnd()
        if result.success is not None:
            return result.success
        if result.ire is not None:
            raise result.ire
        if result.ace is not None:
            raise result.ace
        if result.ase is not None:
            raise result.ase
        if result.ae is not None:
            raise result.ae
        raise TApplicationException(TApplicationException.MISSING_RESULT, "getExperimentStatistics failed: unknown result")

    def getExperimentsInProject(self, authzToken, projectId, limit, offset):
        """

        Get All Experiments of the Project
        Get Experiments within project with pagination. Results will be sorted based on creation time DESC.

        @param projectId
              Uniqie identifier of the project.

        @param limit
              Amount of results to be fetched.

        @param offset
              The starting point of the results to be fetched.



        Parameters:
         - authzToken
         - projectId
         - limit
         - offset
        """
        self.send_getExperimentsInProject(authzToken, projectId, limit, offset)
        return self.recv_getExperimentsInProject()

    def send_getExperimentsInProject(self, authzToken, projectId, limit, offset):
        self._oprot.writeMessageBegin('getExperimentsInProject', TMessageType.CALL, self._seqid)
        args = getExperimentsInProject_args()
        args.authzToken = authzToken
        args.projectId = projectId
        args.limit = limit
        args.offset = offset
        args.write(self._oprot)
        self._oprot.writeMessageEnd()
        self._oprot.trans.flush()

    def recv_getExperimentsInProject(self):
        iprot = self._iprot
        (fname, mtype, rseqid) = iprot.readMessageBegin()
        if mtype == TMessageType.EXCEPTION:
            x = TApplicationException()
            x.read(iprot)
            iprot.readMessageEnd()
            raise x
        result = getExperimentsInProject_result()
        result.read(iprot)
        iprot.readMessageEnd()
        if result.success is not None:
            return result.success
        if result.ire is not None:
            raise result.ire
        if result.ace is not None:
            raise result.ace
        if result.ase is not None:
            raise result.ase
        if result.pnfe is not None:
            raise result.pnfe
        if result.ae is not None:
            raise result.ae
        raise TApplicationException(TApplicationException.MISSING_RESULT, "getExperimentsInProject failed: unknown result")

    def getUserExperiments(self, authzToken, gatewayId, userName, limit, offset):
        """

        Get All Experiments of the User
        Get experiments by user with pagination. Results will be sorted based on creation time DESC.

        @param gatewayId
              Identifier of the requesting gateway.

        @param userName
              Username of the requested end user.

        @param limit
              Amount of results to be fetched.

        @param offset
              The starting point of the results to be fetched.



        Parameters:
         - authzToken
         - gatewayId
         - userName
         - limit
         - offset
        """
        self.send_getUserExperiments(authzToken, gatewayId, userName, limit, offset)
        return self.recv_getUserExperiments()

    def send_getUserExperiments(self, authzToken, gatewayId, userName, limit, offset):
        self._oprot.writeMessageBegin('getUserExperiments', TMessageType.CALL, self._seqid)
        args = getUserExperiments_args()
        args.authzToken = authzToken
        args.gatewayId = gatewayId
        args.userName = userName
        args.limit = limit
        args.offset = offset
        args.write(self._oprot)
        self._oprot.writeMessageEnd()
        self._oprot.trans.flush()

    def recv_getUserExperiments(self):
        iprot = self._iprot
        (fname, mtype, rseqid) = iprot.readMessageBegin()
        if mtype == TMessageType.EXCEPTION:
            x = TApplicationException()
            x.read(iprot)
            iprot.readMessageEnd()
            raise x
        result = getUserExperiments_result()
        result.read(iprot)
        iprot.readMessageEnd()
        if result.success is not None:
            return result.success
        if result.ire is not None:
            raise result.ire
        if result.ace is not None:
            raise result.ace
        if result.ase is not None:
            raise result.ase
        if result.ae is not None:
            raise result.ae
        raise TApplicationException(TApplicationException.MISSING_RESULT, "getUserExperiments failed: unknown result")

    def createExperiment(self, authzToken, gatewayId, experiment):
        """
          *
          * Create New Experiment
          * Create an experiment for the specified user belonging to the gateway. The gateway identity is not explicitly passed
          *   but inferred from the sshKeyAuthentication header. This experiment is just a persistent place holder. The client
          *   has to subsequently configure and launch the created experiment. No action is taken on Airavata Server except
          *   registering the experiment in a persistent store.
          *
          * @param gatewayId
          *    The unique ID of the gateway where the experiment is been created.
          *
          * @param ExperimentModel
          *    The create experiment will require the basic experiment metadata like the name and description, intended user,
          *      the gateway identifer and if the experiment should be shared public by defualt. During the creation of an experiment
          *      the ExperimentMetadata is a required field.
          *
          * @return
          *   The server-side generated.airavata.registry.core.experiment.globally unique identifier.
          *
          * @throws org.apache.airavata.model.error.InvalidRequestException
          *    For any incorrect forming of the request itself.
          *
          * @throws org.apache.airavata.model.error.AiravataClientException
          *    The following list of exceptions are thrown which Airavata Client can take corrective actions to resolve:
          *
          *      UNKNOWN_GATEWAY_ID - If a Gateway is not registered with Airavata as a one time administrative
          *         step, then Airavata Registry will not have a provenance area setup. The client has to follow
          *         gateway registration steps and retry this request.
          *
          *      AUTHENTICATION_FAILURE - How Authentication will be implemented is yet to be determined.
          *         For now this is a place holder.
          *
          *      INVALID_AUTHORIZATION - This will throw an authorization exception. When a more robust security hand-shake
          *         is implemented, the authorization will be more substantial.
          *
          * @throws org.apache.airavata.model.error.AiravataSystemException
          *    This exception will be thrown for any Airavata Server side issues and if the problem cannot be corrected by the client
          *       rather an Airavata Administrator will be notified to take corrective action.
          *
        *

        Parameters:
         - authzToken
         - gatewayId
         - experiment
        """
        self.send_createExperiment(authzToken, gatewayId, experiment)
        return self.recv_createExperiment()

    def send_createExperiment(self, authzToken, gatewayId, experiment):
        self._oprot.writeMessageBegin('createExperiment', TMessageType.CALL, self._seqid)
        args = createExperiment_args()
        args.authzToken = authzToken
        args.gatewayId = gatewayId
        args.experiment = experiment
        args.write(self._oprot)
        self._oprot.writeMessageEnd()
        self._oprot.trans.flush()

    def recv_createExperiment(self):
        iprot = self._iprot
        (fname, mtype, rseqid) = iprot.readMessageBegin()
        if mtype == TMessageType.EXCEPTION:
            x = TApplicationException()
            x.read(iprot)
            iprot.readMessageEnd()
            raise x
        result = createExperiment_result()
        result.read(iprot)
        iprot.readMessageEnd()
        if result.success is not None:
            return result.success
        if result.ire is not None:
            raise result.ire
        if result.ace is not None:
            raise result.ace
        if result.ase is not None:
            raise result.ase
        if result.ae is not None:
            raise result.ae
        raise TApplicationException(TApplicationException.MISSING_RESULT, "createExperiment failed: unknown result")

    def deleteExperiment(self, authzToken, experimentId):
        """

        Delete an Experiment
        If the experiment is not already launched experiment can be deleted.

        @param authzToken

        @param experiementId
            Experiment ID of the experimnet you want to delete.

        @return boolean
            Identifier for the success or failure of the deletion operation.



        Parameters:
         - authzToken
         - experimentId
        """
        self.send_deleteExperiment(authzToken, experimentId)
        return self.recv_deleteExperiment()

    def send_deleteExperiment(self, authzToken, experimentId):
        self._oprot.writeMessageBegin('deleteExperiment', TMessageType.CALL, self._seqid)
        args = deleteExperiment_args()
        args.authzToken = authzToken
        args.experimentId = experimentId
        args.write(self._oprot)
        self._oprot.writeMessageEnd()
        self._oprot.trans.flush()

    def recv_deleteExperiment(self):
        iprot = self._iprot
        (fname, mtype, rseqid) = iprot.readMessageBegin()
        if mtype == TMessageType.EXCEPTION:
            x = TApplicationException()
            x.read(iprot)
            iprot.readMessageEnd()
            raise x
        result = deleteExperiment_result()
        result.read(iprot)
        iprot.readMessageEnd()
        if result.success is not None:
            return result.success
        if result.ire is not None:
            raise result.ire
        if result.ace is not None:
            raise result.ace
        if result.ase is not None:
            raise result.ase
        if result.ae is not None:
            raise result.ae
        raise TApplicationException(TApplicationException.MISSING_RESULT, "deleteExperiment failed: unknown result")

    def getExperiment(self, authzToken, airavataExperimentId):
        """
          *
          * Get Experiment
          * Fetch previously created experiment metadata.
          *
          * @param airavataExperimentId
          *    The unique identifier of the requested experiment. This ID is returned during the create experiment step.
          *
          * @return ExperimentModel
          *   This method will return the previously stored experiment metadata.
          *
          * @throws org.apache.airavata.model.error.InvalidRequestException
          *    For any incorrect forming of the request itself.
          *
          * @throws org.apache.airavata.model.error.ExperimentNotFoundException
          *    If the specified experiment is not previously created, then an Experiment Not Found Exception is thrown.
          *
          * @throws org.apache.airavata.model.error.AiravataClientException
          *    The following list of exceptions are thrown which Airavata Client can take corrective actions to resolve:
          *
          *      UNKNOWN_GATEWAY_ID - If a Gateway is not registered with Airavata as a one time administrative
          *         step, then Airavata Registry will not have a provenance area setup. The client has to follow
          *         gateway registration steps and retry this request.
          *
          *      AUTHENTICATION_FAILURE - How Authentication will be implemented is yet to be determined.
          *         For now this is a place holder.
          *
          *      INVALID_AUTHORIZATION - This will throw an authorization exception. When a more robust security hand-shake
          *         is implemented, the authorization will be more substantial.
          *
          * @throws org.apache.airavata.model.error.AiravataSystemException
          *    This exception will be thrown for any Airavata Server side issues and if the problem cannot be corrected by the client
          *       rather an Airavata Administrator will be notified to take corrective action.
          *
        *

        Parameters:
         - authzToken
         - airavataExperimentId
        """
        self.send_getExperiment(authzToken, airavataExperimentId)
        return self.recv_getExperiment()

    def send_getExperiment(self, authzToken, airavataExperimentId):
        self._oprot.writeMessageBegin('getExperiment', TMessageType.CALL, self._seqid)
        args = getExperiment_args()
        args.authzToken = authzToken
        args.airavataExperimentId = airavataExperimentId
        args.write(self._oprot)
        self._oprot.writeMessageEnd()
        self._oprot.trans.flush()

    def recv_getExperiment(self):
        iprot = self._iprot
        (fname, mtype, rseqid) = iprot.readMessageBegin()
        if mtype == TMessageType.EXCEPTION:
            x = TApplicationException()
            x.read(iprot)
            iprot.readMessageEnd()
            raise x
        result = getExperiment_result()
        result.read(iprot)
        iprot.readMessageEnd()
        if result.success is not None:
            return result.success
        if result.ire is not None:
            raise result.ire
        if result.enf is not None:
            raise result.enf
        if result.ace is not None:
            raise result.ace
        if result.ase is not None:
            raise result.ase
        if result.ae is not None:
            raise result.ae
        raise TApplicationException(TApplicationException.MISSING_RESULT, "getExperiment failed: unknown result")

    def getExperimentByAdmin(self, authzToken, airavataExperimentId):
        """
          *
          * Get Experiment by an admin user
          *
          * Used by an admin user to fetch previously created experiment metadata.
          *
          * @param airavataExperimentId
          *    The unique identifier of the requested experiment. This ID is returned during the create experiment step.
          *
          * @return ExperimentModel
          *   This method will return the previously stored experiment metadata.
          *
          * @throws org.apache.airavata.model.error.InvalidRequestException
          *    For any incorrect forming of the request itself.
          *
          * @throws org.apache.airavata.model.error.ExperimentNotFoundException
          *    If the specified experiment is not previously created, then an Experiment Not Found Exception is thrown.
          *
          * @throws org.apache.airavata.model.error.AiravataClientException
          *    The following list of exceptions are thrown which Airavata Client can take corrective actions to resolve:
          *
          *      UNKNOWN_GATEWAY_ID - If a Gateway is not registered with Airavata as a one time administrative
          *         step, then Airavata Registry will not have a provenance area setup. The client has to follow
          *         gateway registration steps and retry this request.
          *
          *      AUTHENTICATION_FAILURE - How Authentication will be implemented is yet to be determined.
          *         For now this is a place holder.
          *
          *      INVALID_AUTHORIZATION - This will throw an authorization exception. When a more robust security hand-shake
          *         is implemented, the authorization will be more substantial.
          *
          * @throws org.apache.airavata.model.error.AiravataSystemException
          *    This exception will be thrown for any Airavata Server side issues and if the problem cannot be corrected by the client
          *       rather an Airavata Administrator will be notified to take corrective action.
          *
        *

        Parameters:
         - authzToken
         - airavataExperimentId
        """
        self.send_getExperimentByAdmin(authzToken, airavataExperimentId)
        return self.recv_getExperimentByAdmin()

    def send_getExperimentByAdmin(self, authzToken, airavataExperimentId):
        self._oprot.writeMessageBegin('getExperimentByAdmin', TMessageType.CALL, self._seqid)
        args = getExperimentByAdmin_args()
        args.authzToken = authzToken
        args.airavataExperimentId = airavataExperimentId
        args.write(self._oprot)
        self._oprot.writeMessageEnd()
        self._oprot.trans.flush()

    def recv_getExperimentByAdmin(self):
        iprot = self._iprot
        (fname, mtype, rseqid) = iprot.readMessageBegin()
        if mtype == TMessageType.EXCEPTION:
            x = TApplicationException()
            x.read(iprot)
            iprot.readMessageEnd()
            raise x
        result = getExperimentByAdmin_result()
        result.read(iprot)
        iprot.readMessageEnd()
        if result.success is not None:
            return result.success
        if result.ire is not None:
            raise result.ire
        if result.enf is not None:
            raise result.enf
        if result.ace is not None:
            raise result.ace
        if result.ase is not None:
            raise result.ase
        if result.ae is not None:
            raise result.ae
        raise TApplicationException(TApplicationException.MISSING_RESULT, "getExperimentByAdmin failed: unknown result")

    def getDetailedExperimentTree(self, authzToken, airavataExperimentId):
        """

        Get Complete Experiment Details
        Fetch the completed nested tree structue of previously created experiment metadata which includes processes ->
        tasks -> jobs information.

        @param airavataExperimentId
           The identifier for the requested experiment. This is returned during the create experiment step.

        @return ExperimentModel
          This method will return the previously stored experiment metadata including application input parameters, computational resource scheduling
          information, special input output handling and additional quality of service parameters.

        @throws org.apache.airavata.model.error.InvalidRequestException
           For any incorrect forming of the request itself.

        @throws org.apache.airavata.model.error.ExperimentNotFoundException
           If the specified experiment is not previously created, then an Experiment Not Found Exception is thrown.

        @throws org.apache.airavata.model.error.AiravataClientException
           The following list of exceptions are thrown which Airavata Client can take corrective actions to resolve:

             UNKNOWN_GATEWAY_ID - If a Gateway is not registered with Airavata as a one time administrative
                step, then Airavata Registry will not have a provenance area setup. The client has to follow
                gateway registration steps and retry this request.

             AUTHENTICATION_FAILURE - How Authentication will be implemented is yet to be determined.
                For now this is a place holder.

             INVALID_AUTHORIZATION - This will throw an authorization exception. When a more robust security hand-shake
                is implemented, the authorization will be more substantial.

        @throws org.apache.airavata.model.error.AiravataSystemException
           This exception will be thrown for any Airavata Server side issues and if the problem cannot be corrected by the client
              rather an Airavata Administrator will be notified to take corrective action.


        Parameters:
         - authzToken
         - airavataExperimentId
        """
        self.send_getDetailedExperimentTree(authzToken, airavataExperimentId)
        return self.recv_getDetailedExperimentTree()

    def send_getDetailedExperimentTree(self, authzToken, airavataExperimentId):
        self._oprot.writeMessageBegin('getDetailedExperimentTree', TMessageType.CALL, self._seqid)
        args = getDetailedExperimentTree_args()
        args.authzToken = authzToken
        args.airavataExperimentId = airavataExperimentId
        args.write(self._oprot)
        self._oprot.writeMessageEnd()
        self._oprot.trans.flush()

    def recv_getDetailedExperimentTree(self):
        iprot = self._iprot
        (fname, mtype, rseqid) = iprot.readMessageBegin()
        if mtype == TMessageType.EXCEPTION:
            x = TApplicationException()
            x.read(iprot)
            iprot.readMessageEnd()
            raise x
        result = getDetailedExperimentTree_result()
        result.read(iprot)
        iprot.readMessageEnd()
        if result.success is not None:
            return result.success
        if result.ire is not None:
            raise result.ire
        if result.enf is not None:
            raise result.enf
        if result.ace is not None:
            raise result.ace
        if result.ase is not None:
            raise result.ase
        if result.ae is not None:
            raise result.ae
        raise TApplicationException(TApplicationException.MISSING_RESULT, "getDetailedExperimentTree failed: unknown result")

    def updateExperiment(self, authzToken, airavataExperimentId, experiment):
        """

        Update a Previously Created Experiment
        Configure the CREATED experiment with required inputs, scheduling and other quality of service parameters. This method only updates the experiment object within the registry.
        The experiment has to be launched to make it actionable by the server.

        @param airavataExperimentId
           The identifier for the requested experiment. This is returned during the create experiment step.

        @param ExperimentModel
           The configuration information of the experiment with application input parameters, computational resource scheduling
             information, special input output handling and additional quality of service parameters.

        @return
          This method call does not have a return value.

        @throws org.apache.airavata.model.error.InvalidRequestException
           For any incorrect forming of the request itself.

        @throws org.apache.airavata.model.error.ExperimentNotFoundException
           If the specified experiment is not previously created, then an Experiment Not Found Exception is thrown.

        @throws org.apache.airavata.model.error.AiravataClientException
           The following list of exceptions are thrown which Airavata Client can take corrective actions to resolve:
             
             UNKNOWN_GATEWAY_ID - If a Gateway is not registered with Airavata as a one time administrative
                step, then Airavata Registry will not have a provenance area setup. The client has to follow
                gateway registration steps and retry this request.

             AUTHENTICATION_FAILURE - How Authentication will be implemented is yet to be determined.
                For now this is a place holder.

             INVALID_AUTHORIZATION - This will throw an authorization exception. When a more robust security hand-shake
                is implemented, the authorization will be more substantial.

        @throws org.apache.airavata.model.error.AiravataSystemException
           This exception will be thrown for any Airavata Server side issues and if the problem cannot be corrected by the client
              rather an Airavata Administrator will be notified to take corrective action.


        Parameters:
         - authzToken
         - airavataExperimentId
         - experiment
        """
        self.send_updateExperiment(authzToken, airavataExperimentId, experiment)
        self.recv_updateExperiment()

    def send_updateExperiment(self, authzToken, airavataExperimentId, experiment):
        self._oprot.writeMessageBegin('updateExperiment', TMessageType.CALL, self._seqid)
        args = updateExperiment_args()
        args.authzToken = authzToken
        args.airavataExperimentId = airavataExperimentId
        args.experiment = experiment
        args.write(self._oprot)
        self._oprot.writeMessageEnd()
        self._oprot.trans.flush()

    def recv_updateExperiment(self):
        iprot = self._iprot
        (fname, mtype, rseqid) = iprot.readMessageBegin()
        if mtype == TMessageType.EXCEPTION:
            x = TApplicationException()
            x.read(iprot)
            iprot.readMessageEnd()
            raise x
        result = updateExperiment_result()
        result.read(iprot)
        iprot.readMessageEnd()
        if result.ire is not None:
            raise result.ire
        if result.enf is not None:
            raise result.enf
        if result.ace is not None:
            raise result.ace
        if result.ase is not None:
            raise result.ase
        if result.ae is not None:
            raise result.ae
        return

    def updateExperimentConfiguration(self, authzToken, airavataExperimentId, userConfiguration):
        """
        Parameters:
         - authzToken
         - airavataExperimentId
         - userConfiguration
        """
        self.send_updateExperimentConfiguration(authzToken, airavataExperimentId, userConfiguration)
        self.recv_updateExperimentConfiguration()

    def send_updateExperimentConfiguration(self, authzToken, airavataExperimentId, userConfiguration):
        self._oprot.writeMessageBegin('updateExperimentConfiguration', TMessageType.CALL, self._seqid)
        args = updateExperimentConfiguration_args()
        args.authzToken = authzToken
        args.airavataExperimentId = airavataExperimentId
        args.userConfiguration = userConfiguration
        args.write(self._oprot)
        self._oprot.writeMessageEnd()
        self._oprot.trans.flush()

    def recv_updateExperimentConfiguration(self):
        iprot = self._iprot
        (fname, mtype, rseqid) = iprot.readMessageBegin()
        if mtype == TMessageType.EXCEPTION:
            x = TApplicationException()
            x.read(iprot)
            iprot.readMessageEnd()
            raise x
        result = updateExperimentConfiguration_result()
        result.read(iprot)
        iprot.readMessageEnd()
        if result.ae is not None:
            raise result.ae
        return

    def updateResourceScheduleing(self, authzToken, airavataExperimentId, resourceScheduling):
        """
        Parameters:
         - authzToken
         - airavataExperimentId
         - resourceScheduling
        """
        self.send_updateResourceScheduleing(authzToken, airavataExperimentId, resourceScheduling)
        self.recv_updateResourceScheduleing()

    def send_updateResourceScheduleing(self, authzToken, airavataExperimentId, resourceScheduling):
        self._oprot.writeMessageBegin('updateResourceScheduleing', TMessageType.CALL, self._seqid)
        args = updateResourceScheduleing_args()
        args.authzToken = authzToken
        args.airavataExperimentId = airavataExperimentId
        args.resourceScheduling = resourceScheduling
        args.write(self._oprot)
        self._oprot.writeMessageEnd()
        self._oprot.trans.flush()

    def recv_updateResourceScheduleing(self):
        iprot = self._iprot
        (fname, mtype, rseqid) = iprot.readMessageBegin()
        if mtype == TMessageType.EXCEPTION:
            x = TApplicationException()
            x.read(iprot)
            iprot.readMessageEnd()
            raise x
        result = updateResourceScheduleing_result()
        result.read(iprot)
        iprot.readMessageEnd()
        if result.ae is not None:
            raise result.ae
        return

    def validateExperiment(self, authzToken, airavataExperimentId):
        """
         *
         * Validate experiment configuration.
         * A true in general indicates, the experiment is ready to be launched.
         *
         * @param airavataExperimentId
         *    Unique identifier of the experiment (Experimnent ID) of the experiment which need to be validated.
         *
         * @return boolean
         *      Identifier for the success or failure of the validation operation.
         *
        *

        Parameters:
         - authzToken
         - airavataExperimentId
        """
        self.send_validateExperiment(authzToken, airavataExperimentId)
        return self.recv_validateExperiment()

    def send_validateExperiment(self, authzToken, airavataExperimentId):
        self._oprot.writeMessageBegin('validateExperiment', TMessageType.CALL, self._seqid)
        args = validateExperiment_args()
        args.authzToken = authzToken
        args.airavataExperimentId = airavataExperimentId
        args.write(self._oprot)
        self._oprot.writeMessageEnd()
        self._oprot.trans.flush()

    def recv_validateExperiment(self):
        iprot = self._iprot
        (fname, mtype, rseqid) = iprot.readMessageBegin()
        if mtype == TMessageType.EXCEPTION:
            x = TApplicationException()
            x.read(iprot)
            iprot.readMessageEnd()
            raise x
        result = validateExperiment_result()
        result.read(iprot)
        iprot.readMessageEnd()
        if result.success is not None:
            return result.success
        if result.ire is not None:
            raise result.ire
        if result.enf is not None:
            raise result.enf
        if result.ace is not None:
            raise result.ace
        if result.ase is not None:
            raise result.ase
        if result.ae is not None:
            raise result.ae
        raise TApplicationException(TApplicationException.MISSING_RESULT, "validateExperiment failed: unknown result")

    def launchExperiment(self, authzToken, airavataExperimentId, gatewayId):
        """

        Launch a Previously Created & Configured Experiment.
        Airavata Server will then start processing the request and appropriate notifications and intermediate and output data will be subsequently available for this experiment.

        @gatewayId
           ID of the gateway which will launch the experiment.

        @param airavataExperimentId
           The identifier for the requested experiment. This is returned during the create experiment step.

        @return
          This method call does not have a return value.

        @throws org.apache.airavata.model.error.InvalidRequestException
           For any incorrect forming of the request itself.

        @throws org.apache.airavata.model.error.ExperimentNotFoundException
           If the specified experiment is not previously created, then an Experiment Not Found Exception is thrown.

        @throws org.apache.airavata.model.error.AiravataClientException
           The following list of exceptions are thrown which Airavata Client can take corrective actions to resolve:
             
             UNKNOWN_GATEWAY_ID - If a Gateway is not registered with Airavata as a one time administrative
                step, then Airavata Registry will not have a provenance area setup. The client has to follow
                gateway registration steps and retry this request.

             AUTHENTICATION_FAILURE - How Authentication will be implemented is yet to be determined.
                For now this is a place holder.

             INVALID_AUTHORIZATION - This will throw an authorization exception. When a more robust security hand-shake
                is implemented, the authorization will be more substantial.

        @throws org.apache.airavata.model.error.AiravataSystemException
           This exception will be thrown for any Airavata Server side issues and if the problem cannot be corrected by the client
              rather an Airavata Administrator will be notified to take corrective action.


        Parameters:
         - authzToken
         - airavataExperimentId
         - gatewayId
        """
        self.send_launchExperiment(authzToken, airavataExperimentId, gatewayId)
        self.recv_launchExperiment()

    def send_launchExperiment(self, authzToken, airavataExperimentId, gatewayId):
        self._oprot.writeMessageBegin('launchExperiment', TMessageType.CALL, self._seqid)
        args = launchExperiment_args()
        args.authzToken = authzToken
        args.airavataExperimentId = airavataExperimentId
        args.gatewayId = gatewayId
        args.write(self._oprot)
        self._oprot.writeMessageEnd()
        self._oprot.trans.flush()

    def recv_launchExperiment(self):
        iprot = self._iprot
        (fname, mtype, rseqid) = iprot.readMessageBegin()
        if mtype == TMessageType.EXCEPTION:
            x = TApplicationException()
            x.read(iprot)
            iprot.readMessageEnd()
            raise x
        result = launchExperiment_result()
        result.read(iprot)
        iprot.readMessageEnd()
        if result.ire is not None:
            raise result.ire
        if result.enf is not None:
            raise result.enf
        if result.ace is not None:
            raise result.ace
        if result.ase is not None:
            raise result.ase
        if result.ae is not None:
            raise result.ae
        return

    def getExperimentStatus(self, authzToken, airavataExperimentId):
        """

        Get Experiment Status

        Obtain the status of an experiment by providing the Experiment Id

        @param authzToken

        @param airavataExperimentId
            Experiment ID of the experimnet you require the status.

        @return ExperimentStatus
            ExperimentStatus model with the current status will be returned.



        Parameters:
         - authzToken
         - airavataExperimentId
        """
        self.send_getExperimentStatus(authzToken, airavataExperimentId)
        return self.recv_getExperimentStatus()

    def send_getExperimentStatus(self, authzToken, airavataExperimentId):
        self._oprot.writeMessageBegin('getExperimentStatus', TMessageType.CALL, self._seqid)
        args = getExperimentStatus_args()
        args.authzToken = authzToken
        args.airavataExperimentId = airavataExperimentId
        args.write(self._oprot)
        self._oprot.writeMessageEnd()
        self._oprot.trans.flush()

    def recv_getExperimentStatus(self):
        iprot = self._iprot
        (fname, mtype, rseqid) = iprot.readMessageBegin()
        if mtype == TMessageType.EXCEPTION:
            x = TApplicationException()
            x.read(iprot)
            iprot.readMessageEnd()
            raise x
        result = getExperimentStatus_result()
        result.read(iprot)
        iprot.readMessageEnd()
        if result.success is not None:
            return result.success
        if result.ire is not None:
            raise result.ire
        if result.enf is not None:
            raise result.enf
        if result.ace is not None:
            raise result.ace
        if result.ase is not None:
            raise result.ase
        if result.ae is not None:
            raise result.ae
        raise TApplicationException(TApplicationException.MISSING_RESULT, "getExperimentStatus failed: unknown result")

    def getExperimentOutputs(self, authzToken, airavataExperimentId):
        """

        Get Experiment Outputs
        This method to be used when need to obtain final outputs of a certain Experiment

        @param authzToken

        @param airavataExperimentId
            Experiment ID of the experimnet you need the outputs.

        @return list
            List of experiment outputs will be returned. They will be returned as a list of OutputDataObjectType for the experiment.



        Parameters:
         - authzToken
         - airavataExperimentId
        """
        self.send_getExperimentOutputs(authzToken, airavataExperimentId)
        return self.recv_getExperimentOutputs()

    def send_getExperimentOutputs(self, authzToken, airavataExperimentId):
        self._oprot.writeMessageBegin('getExperimentOutputs', TMessageType.CALL, self._seqid)
        args = getExperimentOutputs_args()
        args.authzToken = authzToken
        args.airavataExperimentId = airavataExperimentId
        args.write(self._oprot)
        self._oprot.writeMessageEnd()
        self._oprot.trans.flush()

    def recv_getExperimentOutputs(self):
        iprot = self._iprot
        (fname, mtype, rseqid) = iprot.readMessageBegin()
        if mtype == TMessageType.EXCEPTION:
            x = TApplicationException()
            x.read(iprot)
            iprot.readMessageEnd()
            raise x
        result = getExperimentOutputs_result()
        result.read(iprot)
        iprot.readMessageEnd()
        if result.success is not None:
            return result.success
        if result.ire is not None:
            raise result.ire
        if result.enf is not None:
            raise result.enf
        if result.ace is not None:
            raise result.ace
        if result.ase is not None:
            raise result.ase
        if result.ae is not None:
            raise result.ae
        raise TApplicationException(TApplicationException.MISSING_RESULT, "getExperimentOutputs failed: unknown result")

    def getIntermediateOutputs(self, authzToken, airavataExperimentId):
        """

        Get Intermediate Experiment Outputs
        This method to be used when need to obtain intermediate outputs of a certain Experiment

        @param authzToken

        @param airavataExperimentId
            Experiment ID of the experimnet you need intermediate outputs.

        @return list
            List of intermediate experiment outputs will be returned. They will be returned as a list of OutputDataObjectType for the experiment.



        Parameters:
         - authzToken
         - airavataExperimentId
        """
        self.send_getIntermediateOutputs(authzToken, airavataExperimentId)
        return self.recv_getIntermediateOutputs()

    def send_getIntermediateOutputs(self, authzToken, airavataExperimentId):
        self._oprot.writeMessageBegin('getIntermediateOutputs', TMessageType.CALL, self._seqid)
        args = getIntermediateOutputs_args()
        args.authzToken = authzToken
        args.airavataExperimentId = airavataExperimentId
        args.write(self._oprot)
        self._oprot.writeMessageEnd()
        self._oprot.trans.flush()

    def recv_getIntermediateOutputs(self):
        iprot = self._iprot
        (fname, mtype, rseqid) = iprot.readMessageBegin()
        if mtype == TMessageType.EXCEPTION:
            x = TApplicationException()
            x.read(iprot)
            iprot.readMessageEnd()
            raise x
        result = getIntermediateOutputs_result()
        result.read(iprot)
        iprot.readMessageEnd()
        if result.success is not None:
            return result.success
        if result.ire is not None:
            raise result.ire
        if result.enf is not None:
            raise result.enf
        if result.ace is not None:
            raise result.ace
        if result.ase is not None:
            raise result.ase
        if result.ae is not None:
            raise result.ae
        raise TApplicationException(TApplicationException.MISSING_RESULT, "getIntermediateOutputs failed: unknown result")

    def getJobStatuses(self, authzToken, airavataExperimentId):
        """

        Get Job Statuses for an Experiment
        This method to be used when need to get the job status of an Experiment. An experiment may have one or many jobs; there for one or many job statuses may turnup

        @param authzToken

        @param experiementId
            Experiment ID of the experimnet you need the job statuses.

        @return JobStatus
            Job status (string) for all all the existing jobs for the experiment will be returned in the form of a map



        Parameters:
         - authzToken
         - airavataExperimentId
        """
        self.send_getJobStatuses(authzToken, airavataExperimentId)
        return self.recv_getJobStatuses()

    def send_getJobStatuses(self, authzToken, airavataExperimentId):
        self._oprot.writeMessageBegin('getJobStatuses', TMessageType.CALL, self._seqid)
        args = getJobStatuses_args()
        args.authzToken = authzToken
        args.airavataExperimentId = airavataExperimentId
        args.write(self._oprot)
        self._oprot.writeMessageEnd()
        self._oprot.trans.flush()

    def recv_getJobStatuses(self):
        iprot = self._iprot
        (fname, mtype, rseqid) = iprot.readMessageBegin()
        if mtype == TMessageType.EXCEPTION:
            x = TApplicationException()
            x.read(iprot)
            iprot.readMessageEnd()
            raise x
        result = getJobStatuses_result()
        result.read(iprot)
        iprot.readMessageEnd()
        if result.success is not None:
            return result.success
        if result.ire is not None:
            raise result.ire
        if result.enf is not None:
            raise result.enf
        if result.ace is not None:
            raise result.ace
        if result.ase is not None:
            raise result.ase
        if result.ae is not None:
            raise result.ae
        raise TApplicationException(TApplicationException.MISSING_RESULT, "getJobStatuses failed: unknown result")

    def getJobDetails(self, authzToken, airavataExperimentId):
        """

        Get Job Details for all the jobs within an Experiment.
        This method to be used when need to get the job details for one or many jobs of an Experiment.

        @param authzToken

        @param experiementId
            Experiment ID of the experimnet you need job details.

        @return list of JobDetails
            Job details.



        Parameters:
         - authzToken
         - airavataExperimentId
        """
        self.send_getJobDetails(authzToken, airavataExperimentId)
        return self.recv_getJobDetails()

    def send_getJobDetails(self, authzToken, airavataExperimentId):
        self._oprot.writeMessageBegin('getJobDetails', TMessageType.CALL, self._seqid)
        args = getJobDetails_args()
        args.authzToken = authzToken
        args.airavataExperimentId = airavataExperimentId
        args.write(self._oprot)
        self._oprot.writeMessageEnd()
        self._oprot.trans.flush()

    def recv_getJobDetails(self):
        iprot = self._iprot
        (fname, mtype, rseqid) = iprot.readMessageBegin()
        if mtype == TMessageType.EXCEPTION:
            x = TApplicationException()
            x.read(iprot)
            iprot.readMessageEnd()
            raise x
        result = getJobDetails_result()
        result.read(iprot)
        iprot.readMessageEnd()
        if result.success is not None:
            return result.success
        if result.ire is not None:
            raise result.ire
        if result.enf is not None:
            raise result.enf
        if result.ace is not None:
            raise result.ace
        if result.ase is not None:
            raise result.ase
        if result.ae is not None:
            raise result.ae
        raise TApplicationException(TApplicationException.MISSING_RESULT, "getJobDetails failed: unknown result")

    def cloneExperiment(self, authzToken, existingExperimentID, newExperimentName, newExperimentProjectId):
        """

        Clone an Existing Experiment
        Existing specified experiment is cloned and a new name is provided. A copy of the experiment configuration is made and is persisted with new metadata.
          The client has to subsequently update this configuration if needed and launch the cloned experiment.

        @param newExperimentName
           experiment name that should be used in the cloned experiment

        @param updatedExperiment
           Once an experiment is cloned, to disambiguate, the users are suggested to provide new metadata. This will again require
             the basic experiment metadata like the name and description, intended user, the gateway identifier and if the experiment
             should be shared public by default.
        @param newExperimentProjectId
           The project in which to create the cloned experiment. This is optional and if null the experiment will be created
             in the same project as the existing experiment.

        @return
          The server-side generated.airavata.registry.core.experiment.globally unique identifier (Experiment ID) for the newly cloned experiment.

        @throws org.apache.airavata.model.error.InvalidRequestException
           For any incorrect forming of the request itself.

        @throws org.apache.airavata.model.error.ExperimentNotFoundException
           If the specified experiment is not previously created, then an Experiment Not Found Exception is thrown.

        @throws org.apache.airavata.model.error.AiravataClientException
           The following list of exceptions are thrown which Airavata Client can take corrective actions to resolve:
             
             UNKNOWN_GATEWAY_ID - If a Gateway is not registered with Airavata as a one time administrative
                step, then Airavata Registry will not have a provenance area setup. The client has to follow
                gateway registration steps and retry this request.

             AUTHENTICATION_FAILURE - How Authentication will be implemented is yet to be determined.
                For now this is a place holder.

             INVALID_AUTHORIZATION - This will throw an authorization exception. When a more robust security hand-shake
                is implemented, the authorization will be more substantial.

        @throws org.apache.airavata.model.error.AiravataSystemException
           This exception will be thrown for any Airavata Server side issues and if the problem cannot be corrected by the client
              rather an Airavata Administrator will be notified to take corrective action.


        Parameters:
         - authzToken
         - existingExperimentID
         - newExperimentName
         - newExperimentProjectId
        """
        self.send_cloneExperiment(authzToken, existingExperimentID, newExperimentName, newExperimentProjectId)
        return self.recv_cloneExperiment()

    def send_cloneExperiment(self, authzToken, existingExperimentID, newExperimentName, newExperimentProjectId):
        self._oprot.writeMessageBegin('cloneExperiment', TMessageType.CALL, self._seqid)
        args = cloneExperiment_args()
        args.authzToken = authzToken
        args.existingExperimentID = existingExperimentID
        args.newExperimentName = newExperimentName
        args.newExperimentProjectId = newExperimentProjectId
        args.write(self._oprot)
        self._oprot.writeMessageEnd()
        self._oprot.trans.flush()

    def recv_cloneExperiment(self):
        iprot = self._iprot
        (fname, mtype, rseqid) = iprot.readMessageBegin()
        if mtype == TMessageType.EXCEPTION:
            x = TApplicationException()
            x.read(iprot)
            iprot.readMessageEnd()
            raise x
        result = cloneExperiment_result()
        result.read(iprot)
        iprot.readMessageEnd()
        if result.success is not None:
            return result.success
        if result.ire is not None:
            raise result.ire
        if result.enf is not None:
            raise result.enf
        if result.ace is not None:
            raise result.ace
        if result.ase is not None:
            raise result.ase
        if result.ae is not None:
            raise result.ae
        if result.pnfe is not None:
            raise result.pnfe
        raise TApplicationException(TApplicationException.MISSING_RESULT, "cloneExperiment failed: unknown result")

    def cloneExperimentByAdmin(self, authzToken, existingExperimentID, newExperimentName, newExperimentProjectId):
        """

        Clone an Existing Experiment by an admin user
        Existing specified experiment is cloned and a new name is provided. A copy of the experiment configuration is made and is persisted with new metadata.
          The client has to subsequently update this configuration if needed and launch the cloned experiment.

        @param newExperimentName
           experiment name that should be used in the cloned experiment

        @param updatedExperiment
           Once an experiment is cloned, to disambiguate, the users are suggested to provide new metadata. This will again require
             the basic experiment metadata like the name and description, intended user, the gateway identifier and if the experiment
             should be shared public by default.
        @param newExperimentProjectId
           The project in which to create the cloned experiment. This is optional and if null the experiment will be created
             in the same project as the existing experiment.

        @return
          The server-side generated.airavata.registry.core.experiment.globally unique identifier (Experiment ID) for the newly cloned experiment.

        @throws org.apache.airavata.model.error.InvalidRequestException
           For any incorrect forming of the request itself.

        @throws org.apache.airavata.model.error.ExperimentNotFoundException
           If the specified experiment is not previously created, then an Experiment Not Found Exception is thrown.

        @throws org.apache.airavata.model.error.AiravataClientException
           The following list of exceptions are thrown which Airavata Client can take corrective actions to resolve:

             UNKNOWN_GATEWAY_ID - If a Gateway is not registered with Airavata as a one time administrative
                step, then Airavata Registry will not have a provenance area setup. The client has to follow
                gateway registration steps and retry this request.

             AUTHENTICATION_FAILURE - How Authentication will be implemented is yet to be determined.
                For now this is a place holder.

             INVALID_AUTHORIZATION - This will throw an authorization exception. When a more robust security hand-shake
                is implemented, the authorization will be more substantial.

        @throws org.apache.airavata.model.error.AiravataSystemException
           This exception will be thrown for any Airavata Server side issues and if the problem cannot be corrected by the client
              rather an Airavata Administrator will be notified to take corrective action.


        Parameters:
         - authzToken
         - existingExperimentID
         - newExperimentName
         - newExperimentProjectId
        """
        self.send_cloneExperimentByAdmin(authzToken, existingExperimentID, newExperimentName, newExperimentProjectId)
        return self.recv_cloneExperimentByAdmin()

    def send_cloneExperimentByAdmin(self, authzToken, existingExperimentID, newExperimentName, newExperimentProjectId):
        self._oprot.writeMessageBegin('cloneExperimentByAdmin', TMessageType.CALL, self._seqid)
        args = cloneExperimentByAdmin_args()
        args.authzToken = authzToken
        args.existingExperimentID = existingExperimentID
        args.newExperimentName = newExperimentName
        args.newExperimentProjectId = newExperimentProjectId
        args.write(self._oprot)
        self._oprot.writeMessageEnd()
        self._oprot.trans.flush()

    def recv_cloneExperimentByAdmin(self):
        iprot = self._iprot
        (fname, mtype, rseqid) = iprot.readMessageBegin()
        if mtype == TMessageType.EXCEPTION:
            x = TApplicationException()
            x.read(iprot)
            iprot.readMessageEnd()
            raise x
        result = cloneExperimentByAdmin_result()
        result.read(iprot)
        iprot.readMessageEnd()
        if result.success is not None:
            return result.success
        if result.ire is not None:
            raise result.ire
        if result.enf is not None:
            raise result.enf
        if result.ace is not None:
            raise result.ace
        if result.ase is not None:
            raise result.ase
        if result.ae is not None:
            raise result.ae
        if result.pnfe is not None:
            raise result.pnfe
        raise TApplicationException(TApplicationException.MISSING_RESULT, "cloneExperimentByAdmin failed: unknown result")

    def terminateExperiment(self, authzToken, airavataExperimentId, gatewayId):
        """

        Terminate a running Experiment.

        @gatewayId
           ID of the gateway which will terminate the running Experiment.

        @param airavataExperimentId
           The identifier of the experiment required termination. This ID is returned during the create experiment step.

        @return status
          This method call does not have a return value.

        @throws org.apache.airavata.model.error.InvalidRequestException
           For any incorrect forming of the request itself.

        @throws org.apache.airavata.model.error.ExperimentNotFoundException
           If the specified experiment is not previously created, then an Experiment Not Found Exception is thrown.

        @throws org.apache.airavata.model.error.AiravataClientException
           The following list of exceptions are thrown which Airavata Client can take corrective actions to resolve:
             
             UNKNOWN_GATEWAY_ID - If a Gateway is not registered with Airavata as a one time administrative
                step, then Airavata Registry will not have a provenance area setup. The client has to follow
                gateway registration steps and retry this request.

             AUTHENTICATION_FAILURE - How Authentication will be implemented is yet to be determined.
                For now this is a place holder.

             INVALID_AUTHORIZATION - This will throw an authorization exception. When a more robust security hand-shake
                is implemented, the authorization will be more substantial.

        @throws org.apache.airavata.model.error.AiravataSystemException
           This exception will be thrown for any Airavata Server side issues and if the problem cannot be corrected by the client
              rather an Airavata Administrator will be notified to take corrective action.


        Parameters:
         - authzToken
         - airavataExperimentId
         - gatewayId
        """
        self.send_terminateExperiment(authzToken, airavataExperimentId, gatewayId)
        self.recv_terminateExperiment()

    def send_terminateExperiment(self, authzToken, airavataExperimentId, gatewayId):
        self._oprot.writeMessageBegin('terminateExperiment', TMessageType.CALL, self._seqid)
        args = terminateExperiment_args()
        args.authzToken = authzToken
        args.airavataExperimentId = airavataExperimentId
        args.gatewayId = gatewayId
        args.write(self._oprot)
        self._oprot.writeMessageEnd()
        self._oprot.trans.flush()

    def recv_terminateExperiment(self):
        iprot = self._iprot
        (fname, mtype, rseqid) = iprot.readMessageBegin()
        if mtype == TMessageType.EXCEPTION:
            x = TApplicationException()
            x.read(iprot)
            iprot.readMessageEnd()
            raise x
        result = terminateExperiment_result()
        result.read(iprot)
        iprot.readMessageEnd()
        if result.ire is not None:
            raise result.ire
        if result.enf is not None:
            raise result.enf
        if result.ace is not None:
            raise result.ace
        if result.ase is not None:
            raise result.ase
        if result.ae is not None:
            raise result.ae
        return

    def registerApplicationModule(self, authzToken, gatewayId, applicationModule):
        """

        Register a Application Module.

        @gatewayId
           ID of the gateway which is registering the new Application Module.

        @param applicationModule
           Application Module Object created from the datamodel.

        @return appModuleId
          Returns the server-side generated airavata appModule globally unique identifier.


        Parameters:
         - authzToken
         - gatewayId
         - applicationModule
        """
        self.send_registerApplicationModule(authzToken, gatewayId, applicationModule)
        return self.recv_registerApplicationModule()

    def send_registerApplicationModule(self, authzToken, gatewayId, applicationModule):
        self._oprot.writeMessageBegin('registerApplicationModule', TMessageType.CALL, self._seqid)
        args = registerApplicationModule_args()
        args.authzToken = authzToken
        args.gatewayId = gatewayId
        args.applicationModule = applicationModule
        args.write(self._oprot)
        self._oprot.writeMessageEnd()
        self._oprot.trans.flush()

    def recv_registerApplicationModule(self):
        iprot = self._iprot
        (fname, mtype, rseqid) = iprot.readMessageBegin()
        if mtype == TMessageType.EXCEPTION:
            x = TApplicationException()
            x.read(iprot)
            iprot.readMessageEnd()
            raise x
        result = registerApplicationModule_result()
        result.read(iprot)
        iprot.readMessageEnd()
        if result.success is not None:
            return result.success
        if result.ire is not None:
            raise result.ire
        if result.ace is not None:
            raise result.ace
        if result.ase is not None:
            raise result.ase
        if result.ae is not None:
            raise result.ae
        raise TApplicationException(TApplicationException.MISSING_RESULT, "registerApplicationModule failed: unknown result")

    def getApplicationModule(self, authzToken, appModuleId):
        """

        Fetch a Application Module.

        @param appModuleId
          The unique identifier of the application module required

        @return applicationModule
          Returns an Application Module Object.


        Parameters:
         - authzToken
         - appModuleId
        """
        self.send_getApplicationModule(authzToken, appModuleId)
        return self.recv_getApplicationModule()

    def send_getApplicationModule(self, authzToken, appModuleId):
        self._oprot.writeMessageBegin('getApplicationModule', TMessageType.CALL, self._seqid)
        args = getApplicationModule_args()
        args.authzToken = authzToken
        args.appModuleId = appModuleId
        args.write(self._oprot)
        self._oprot.writeMessageEnd()
        self._oprot.trans.flush()

    def recv_getApplicationModule(self):
        iprot = self._iprot
        (fname, mtype, rseqid) = iprot.readMessageBegin()
        if mtype == TMessageType.EXCEPTION:
            x = TApplicationException()
            x.read(iprot)
            iprot.readMessageEnd()
            raise x
        result = getApplicationModule_result()
        result.read(iprot)
        iprot.readMessageEnd()
        if result.success is not None:
            return result.success
        if result.ire is not None:
            raise result.ire
        if result.ace is not None:
            raise result.ace
        if result.ase is not None:
            raise result.ase
        if result.ae is not None:
            raise result.ae
        raise TApplicationException(TApplicationException.MISSING_RESULT, "getApplicationModule failed: unknown result")

    def updateApplicationModule(self, authzToken, appModuleId, applicationModule):
        """

        Update a Application Module.

        @param appModuleId
          The identifier for the requested application module to be updated.

        @param applicationModule
           Application Module Object created from the datamodel.

        @return status
          Returns a success/failure of the update.


        Parameters:
         - authzToken
         - appModuleId
         - applicationModule
        """
        self.send_updateApplicationModule(authzToken, appModuleId, applicationModule)
        return self.recv_updateApplicationModule()

    def send_updateApplicationModule(self, authzToken, appModuleId, applicationModule):
        self._oprot.writeMessageBegin('updateApplicationModule', TMessageType.CALL, self._seqid)
        args = updateApplicationModule_args()
        args.authzToken = authzToken
        args.appModuleId = appModuleId
        args.applicationModule = applicationModule
        args.write(self._oprot)
        self._oprot.writeMessageEnd()
        self._oprot.trans.flush()

    def recv_updateApplicationModule(self):
        iprot = self._iprot
        (fname, mtype, rseqid) = iprot.readMessageBegin()
        if mtype == TMessageType.EXCEPTION:
            x = TApplicationException()
            x.read(iprot)
            iprot.readMessageEnd()
            raise x
        result = updateApplicationModule_result()
        result.read(iprot)
        iprot.readMessageEnd()
        if result.success is not None:
            return result.success
        if result.ire is not None:
            raise result.ire
        if result.ace is not None:
            raise result.ace
        if result.ase is not None:
            raise result.ase
        if result.ae is not None:
            raise result.ae
        raise TApplicationException(TApplicationException.MISSING_RESULT, "updateApplicationModule failed: unknown result")

    def getAllAppModules(self, authzToken, gatewayId):
        """

        Fetch all Application Module Descriptions.

        @param gatewayId
           ID of the gateway which need to list all available application deployment documentation.

        @return list
           Returns the list of all Application Module Objects.


        Parameters:
         - authzToken
         - gatewayId
        """
        self.send_getAllAppModules(authzToken, gatewayId)
        return self.recv_getAllAppModules()

    def send_getAllAppModules(self, authzToken, gatewayId):
        self._oprot.writeMessageBegin('getAllAppModules', TMessageType.CALL, self._seqid)
        args = getAllAppModules_args()
        args.authzToken = authzToken
        args.gatewayId = gatewayId
        args.write(self._oprot)
        self._oprot.writeMessageEnd()
        self._oprot.trans.flush()

    def recv_getAllAppModules(self):
        iprot = self._iprot
        (fname, mtype, rseqid) = iprot.readMessageBegin()
        if mtype == TMessageType.EXCEPTION:
            x = TApplicationException()
            x.read(iprot)
            iprot.readMessageEnd()
            raise x
        result = getAllAppModules_result()
        result.read(iprot)
        iprot.readMessageEnd()
        if result.success is not None:
            return result.success
        if result.ire is not None:
            raise result.ire
        if result.ace is not None:
            raise result.ace
        if result.ase is not None:
            raise result.ase
        if result.ae is not None:
            raise result.ae
        raise TApplicationException(TApplicationException.MISSING_RESULT, "getAllAppModules failed: unknown result")

    def deleteApplicationModule(self, authzToken, appModuleId):
        """

        Delete an Application Module.

        @param appModuleId
          The identifier of the Application Module to be deleted.

        @return status
          Returns a success/failure of the deletion.


        Parameters:
         - authzToken
         - appModuleId
        """
        self.send_deleteApplicationModule(authzToken, appModuleId)
        return self.recv_deleteApplicationModule()

    def send_deleteApplicationModule(self, authzToken, appModuleId):
        self._oprot.writeMessageBegin('deleteApplicationModule', TMessageType.CALL, self._seqid)
        args = deleteApplicationModule_args()
        args.authzToken = authzToken
        args.appModuleId = appModuleId
        args.write(self._oprot)
        self._oprot.writeMessageEnd()
        self._oprot.trans.flush()

    def recv_deleteApplicationModule(self):
        iprot = self._iprot
        (fname, mtype, rseqid) = iprot.readMessageBegin()
        if mtype == TMessageType.EXCEPTION:
            x = TApplicationException()
            x.read(iprot)
            iprot.readMessageEnd()
            raise x
        result = deleteApplicationModule_result()
        result.read(iprot)
        iprot.readMessageEnd()
        if result.success is not None:
            return result.success
        if result.ire is not None:
            raise result.ire
        if result.ace is not None:
            raise result.ace
        if result.ase is not None:
            raise result.ase
        if result.ae is not None:
            raise result.ae
        raise TApplicationException(TApplicationException.MISSING_RESULT, "deleteApplicationModule failed: unknown result")

    def registerApplicationDeployment(self, authzToken, gatewayId, applicationDeployment):
        """

        Register an Application Deployment.

        @param gatewayId
           ID of the gateway which is registering the new Application Deployment.

        @param applicationDeployment
           Application Module Object created from the datamodel.

        @return appDeploymentId
          Returns a server-side generated airavata appDeployment globally unique identifier.


        Parameters:
         - authzToken
         - gatewayId
         - applicationDeployment
        """
        self.send_registerApplicationDeployment(authzToken, gatewayId, applicationDeployment)
        return self.recv_registerApplicationDeployment()

    def send_registerApplicationDeployment(self, authzToken, gatewayId, applicationDeployment):
        self._oprot.writeMessageBegin('registerApplicationDeployment', TMessageType.CALL, self._seqid)
        args = registerApplicationDeployment_args()
        args.authzToken = authzToken
        args.gatewayId = gatewayId
        args.applicationDeployment = applicationDeployment
        args.write(self._oprot)
        self._oprot.writeMessageEnd()
        self._oprot.trans.flush()

    def recv_registerApplicationDeployment(self):
        iprot = self._iprot
        (fname, mtype, rseqid) = iprot.readMessageBegin()
        if mtype == TMessageType.EXCEPTION:
            x = TApplicationException()
            x.read(iprot)
            iprot.readMessageEnd()
            raise x
        result = registerApplicationDeployment_result()
        result.read(iprot)
        iprot.readMessageEnd()
        if result.success is not None:
            return result.success
        if result.ire is not None:
            raise result.ire
        if result.ace is not None:
            raise result.ace
        if result.ase is not None:
            raise result.ase
        if result.ae is not None:
            raise result.ae
        raise TApplicationException(TApplicationException.MISSING_RESULT, "registerApplicationDeployment failed: unknown result")

    def getApplicationDeployment(self, authzToken, appDeploymentId):
        """

        Fetch a Application Deployment.

        @param appDeploymentId
          The identifier for the requested application module

        @return applicationDeployment
          Returns a application Deployment Object.


        Parameters:
         - authzToken
         - appDeploymentId
        """
        self.send_getApplicationDeployment(authzToken, appDeploymentId)
        return self.recv_getApplicationDeployment()

    def send_getApplicationDeployment(self, authzToken, appDeploymentId):
        self._oprot.writeMessageBegin('getApplicationDeployment', TMessageType.CALL, self._seqid)
        args = getApplicationDeployment_args()
        args.authzToken = authzToken
        args.appDeploymentId = appDeploymentId
        args.write(self._oprot)
        self._oprot.writeMessageEnd()
        self._oprot.trans.flush()

    def recv_getApplicationDeployment(self):
        iprot = self._iprot
        (fname, mtype, rseqid) = iprot.readMessageBegin()
        if mtype == TMessageType.EXCEPTION:
            x = TApplicationException()
            x.read(iprot)
            iprot.readMessageEnd()
            raise x
        result = getApplicationDeployment_result()
        result.read(iprot)
        iprot.readMessageEnd()
        if result.success is not None:
            return result.success
        if result.ire is not None:
            raise result.ire
        if result.ace is not None:
            raise result.ace
        if result.ase is not None:
            raise result.ase
        if result.ae is not None:
            raise result.ae
        raise TApplicationException(TApplicationException.MISSING_RESULT, "getApplicationDeployment failed: unknown result")

    def updateApplicationDeployment(self, authzToken, appDeploymentId, applicationDeployment):
        """

        Update an Application Deployment.

        @param appDeploymentId
          The identifier of the requested application deployment to be updated.

        @param appDeployment
           Application Deployment Object created from the datamodel.

        @return status
          Returns a success/failure of the update.


        Parameters:
         - authzToken
         - appDeploymentId
         - applicationDeployment
        """
        self.send_updateApplicationDeployment(authzToken, appDeploymentId, applicationDeployment)
        return self.recv_updateApplicationDeployment()

    def send_updateApplicationDeployment(self, authzToken, appDeploymentId, applicationDeployment):
        self._oprot.writeMessageBegin('updateApplicationDeployment', TMessageType.CALL, self._seqid)
        args = updateApplicationDeployment_args()
        args.authzToken = authzToken
        args.appDeploymentId = appDeploymentId
        args.applicationDeployment = applicationDeployment
        args.write(self._oprot)
        self._oprot.writeMessageEnd()
        self._oprot.trans.flush()

    def recv_updateApplicationDeployment(self):
        iprot = self._iprot
        (fname, mtype, rseqid) = iprot.readMessageBegin()
        if mtype == TMessageType.EXCEPTION:
            x = TApplicationException()
            x.read(iprot)
            iprot.readMessageEnd()
            raise x
        result = updateApplicationDeployment_result()
        result.read(iprot)
        iprot.readMessageEnd()
        if result.success is not None:
            return result.success
        if result.ire is not None:
            raise result.ire
        if result.ace is not None:
            raise result.ace
        if result.ase is not None:
            raise result.ase
        if result.ae is not None:
            raise result.ae
        raise TApplicationException(TApplicationException.MISSING_RESULT, "updateApplicationDeployment failed: unknown result")

    def deleteApplicationDeployment(self, authzToken, appDeploymentId):
        """

        Delete an Application Deployment.

        @param appDeploymentId
          The unique identifier of application deployment to be deleted.

        @return status
          Returns a success/failure of the deletion.


        Parameters:
         - authzToken
         - appDeploymentId
        """
        self.send_deleteApplicationDeployment(authzToken, appDeploymentId)
        return self.recv_deleteApplicationDeployment()

    def send_deleteApplicationDeployment(self, authzToken, appDeploymentId):
        self._oprot.writeMessageBegin('deleteApplicationDeployment', TMessageType.CALL, self._seqid)
        args = deleteApplicationDeployment_args()
        args.authzToken = authzToken
        args.appDeploymentId = appDeploymentId
        args.write(self._oprot)
        self._oprot.writeMessageEnd()
        self._oprot.trans.flush()

    def recv_deleteApplicationDeployment(self):
        iprot = self._iprot
        (fname, mtype, rseqid) = iprot.readMessageBegin()
        if mtype == TMessageType.EXCEPTION:
            x = TApplicationException()
            x.read(iprot)
            iprot.readMessageEnd()
            raise x
        result = deleteApplicationDeployment_result()
        result.read(iprot)
        iprot.readMessageEnd()
        if result.success is not None:
            return result.success
        if result.ire is not None:
            raise result.ire
        if result.ace is not None:
            raise result.ace
        if result.ase is not None:
            raise result.ase
        if result.ae is not None:
            raise result.ae
        raise TApplicationException(TApplicationException.MISSING_RESULT, "deleteApplicationDeployment failed: unknown result")

    def getAllApplicationDeployments(self, authzToken, gatewayId):
        """

        Fetch all Application Deployment Descriptions.

        @param gatewayId
           ID of the gateway which need to list all available application deployment documentation.

        @return list<applicationDeployment.
           Returns the list of all application Deployment Objects.


        Parameters:
         - authzToken
         - gatewayId
        """
        self.send_getAllApplicationDeployments(authzToken, gatewayId)
        return self.recv_getAllApplicationDeployments()

    def send_getAllApplicationDeployments(self, authzToken, gatewayId):
        self._oprot.writeMessageBegin('getAllApplicationDeployments', TMessageType.CALL, self._seqid)
        args = getAllApplicationDeployments_args()
        args.authzToken = authzToken
        args.gatewayId = gatewayId
        args.write(self._oprot)
        self._oprot.writeMessageEnd()
        self._oprot.trans.flush()

    def recv_getAllApplicationDeployments(self):
        iprot = self._iprot
        (fname, mtype, rseqid) = iprot.readMessageBegin()
        if mtype == TMessageType.EXCEPTION:
            x = TApplicationException()
            x.read(iprot)
            iprot.readMessageEnd()
            raise x
        result = getAllApplicationDeployments_result()
        result.read(iprot)
        iprot.readMessageEnd()
        if result.success is not None:
            return result.success
        if result.ire is not None:
            raise result.ire
        if result.ace is not None:
            raise result.ace
        if result.ase is not None:
            raise result.ase
        if result.ae is not None:
            raise result.ae
        raise TApplicationException(TApplicationException.MISSING_RESULT, "getAllApplicationDeployments failed: unknown result")

    def getAppModuleDeployedResources(self, authzToken, appModuleId):
        """
        Fetch a list of Deployed Compute Hosts.

        @param appModuleId
          The identifier for the requested application module

        @return list<string>
          Returns a list of Deployed Resources.


        Parameters:
         - authzToken
         - appModuleId
        """
        self.send_getAppModuleDeployedResources(authzToken, appModuleId)
        return self.recv_getAppModuleDeployedResources()

    def send_getAppModuleDeployedResources(self, authzToken, appModuleId):
        self._oprot.writeMessageBegin('getAppModuleDeployedResources', TMessageType.CALL, self._seqid)
        args = getAppModuleDeployedResources_args()
        args.authzToken = authzToken
        args.appModuleId = appModuleId
        args.write(self._oprot)
        self._oprot.writeMessageEnd()
        self._oprot.trans.flush()

    def recv_getAppModuleDeployedResources(self):
        iprot = self._iprot
        (fname, mtype, rseqid) = iprot.readMessageBegin()
        if mtype == TMessageType.EXCEPTION:
            x = TApplicationException()
            x.read(iprot)
            iprot.readMessageEnd()
            raise x
        result = getAppModuleDeployedResources_result()
        result.read(iprot)
        iprot.readMessageEnd()
        if result.success is not None:
            return result.success
        if result.ire is not None:
            raise result.ire
        if result.ace is not None:
            raise result.ace
        if result.ase is not None:
            raise result.ase
        if result.ae is not None:
            raise result.ae
        raise TApplicationException(TApplicationException.MISSING_RESULT, "getAppModuleDeployedResources failed: unknown result")

    def registerApplicationInterface(self, authzToken, gatewayId, applicationInterface):
        """

        Register a Application Interface.

        @param applicationInterface
           Application Module Object created from the datamodel.

        @return appInterfaceId
          Returns a server-side generated airavata application interface globally unique identifier.


        Parameters:
         - authzToken
         - gatewayId
         - applicationInterface
        """
        self.send_registerApplicationInterface(authzToken, gatewayId, applicationInterface)
        return self.recv_registerApplicationInterface()

    def send_registerApplicationInterface(self, authzToken, gatewayId, applicationInterface):
        self._oprot.writeMessageBegin('registerApplicationInterface', TMessageType.CALL, self._seqid)
        args = registerApplicationInterface_args()
        args.authzToken = authzToken
        args.gatewayId = gatewayId
        args.applicationInterface = applicationInterface
        args.write(self._oprot)
        self._oprot.writeMessageEnd()
        self._oprot.trans.flush()

    def recv_registerApplicationInterface(self):
        iprot = self._iprot
        (fname, mtype, rseqid) = iprot.readMessageBegin()
        if mtype == TMessageType.EXCEPTION:
            x = TApplicationException()
            x.read(iprot)
            iprot.readMessageEnd()
            raise x
        result = registerApplicationInterface_result()
        result.read(iprot)
        iprot.readMessageEnd()
        if result.success is not None:
            return result.success
        if result.ire is not None:
            raise result.ire
        if result.ace is not None:
            raise result.ace
        if result.ase is not None:
            raise result.ase
        if result.ae is not None:
            raise result.ae
        raise TApplicationException(TApplicationException.MISSING_RESULT, "registerApplicationInterface failed: unknown result")

    def cloneApplicationInterface(self, authzToken, existingAppInterfaceID, newApplicationName, gatewayId):
        """

        Clone an Application Interface.

        @gatewayId
           The identifier for the gateway profile to be requested

        @param existingAppInterfaceID
           Identifier of the existing Application interface you wich to clone.

        @param newApplicationName
           Name for the new application interface.

        @return appInterfaceId
           Returns a server-side generated globally unique identifier for the newly cloned application interface.


        Parameters:
         - authzToken
         - existingAppInterfaceID
         - newApplicationName
         - gatewayId
        """
        self.send_cloneApplicationInterface(authzToken, existingAppInterfaceID, newApplicationName, gatewayId)
        return self.recv_cloneApplicationInterface()

    def send_cloneApplicationInterface(self, authzToken, existingAppInterfaceID, newApplicationName, gatewayId):
        self._oprot.writeMessageBegin('cloneApplicationInterface', TMessageType.CALL, self._seqid)
        args = cloneApplicationInterface_args()
        args.authzToken = authzToken
        args.existingAppInterfaceID = existingAppInterfaceID
        args.newApplicationName = newApplicationName
        args.gatewayId = gatewayId
        args.write(self._oprot)
        self._oprot.writeMessageEnd()
        self._oprot.trans.flush()

    def recv_cloneApplicationInterface(self):
        iprot = self._iprot
        (fname, mtype, rseqid) = iprot.readMessageBegin()
        if mtype == TMessageType.EXCEPTION:
            x = TApplicationException()
            x.read(iprot)
            iprot.readMessageEnd()
            raise x
        result = cloneApplicationInterface_result()
        result.read(iprot)
        iprot.readMessageEnd()
        if result.success is not None:
            return result.success
        if result.ire is not None:
            raise result.ire
        if result.ace is not None:
            raise result.ace
        if result.ase is not None:
            raise result.ase
        if result.ae is not None:
            raise result.ae
        raise TApplicationException(TApplicationException.MISSING_RESULT, "cloneApplicationInterface failed: unknown result")

    def getApplicationInterface(self, authzToken, appInterfaceId):
        """

        Fetch an Application Interface.

        @param appInterfaceId
          The identifier for the requested application interface.

        @return applicationInterface
          Returns an application Interface Object.


        Parameters:
         - authzToken
         - appInterfaceId
        """
        self.send_getApplicationInterface(authzToken, appInterfaceId)
        return self.recv_getApplicationInterface()

    def send_getApplicationInterface(self, authzToken, appInterfaceId):
        self._oprot.writeMessageBegin('getApplicationInterface', TMessageType.CALL, self._seqid)
        args = getApplicationInterface_args()
        args.authzToken = authzToken
        args.appInterfaceId = appInterfaceId
        args.write(self._oprot)
        self._oprot.writeMessageEnd()
        self._oprot.trans.flush()

    def recv_getApplicationInterface(self):
        iprot = self._iprot
        (fname, mtype, rseqid) = iprot.readMessageBegin()
        if mtype == TMessageType.EXCEPTION:
            x = TApplicationException()
            x.read(iprot)
            iprot.readMessageEnd()
            raise x
        result = getApplicationInterface_result()
        result.read(iprot)
        iprot.readMessageEnd()
        if result.success is not None:
            return result.success
        if result.ire is not None:
            raise result.ire
        if result.ace is not None:
            raise result.ace
        if result.ase is not None:
            raise result.ase
        if result.ae is not None:
            raise result.ae
        raise TApplicationException(TApplicationException.MISSING_RESULT, "getApplicationInterface failed: unknown result")

    def updateApplicationInterface(self, authzToken, appInterfaceId, applicationInterface):
        """

        Update a Application Interface.

        @param appInterfaceId
          The identifier of the requested application deployment to be updated.

        @param appInterface
           Application Interface Object created from the datamodel.

        @return status
          Returns a success/failure of the update.


        Parameters:
         - authzToken
         - appInterfaceId
         - applicationInterface
        """
        self.send_updateApplicationInterface(authzToken, appInterfaceId, applicationInterface)
        return self.recv_updateApplicationInterface()

    def send_updateApplicationInterface(self, authzToken, appInterfaceId, applicationInterface):
        self._oprot.writeMessageBegin('updateApplicationInterface', TMessageType.CALL, self._seqid)
        args = updateApplicationInterface_args()
        args.authzToken = authzToken
        args.appInterfaceId = appInterfaceId
        args.applicationInterface = applicationInterface
        args.write(self._oprot)
        self._oprot.writeMessageEnd()
        self._oprot.trans.flush()

    def recv_updateApplicationInterface(self):
        iprot = self._iprot
        (fname, mtype, rseqid) = iprot.readMessageBegin()
        if mtype == TMessageType.EXCEPTION:
            x = TApplicationException()
            x.read(iprot)
            iprot.readMessageEnd()
            raise x
        result = updateApplicationInterface_result()
        result.read(iprot)
        iprot.readMessageEnd()
        if result.success is not None:
            return result.success
        if result.ire is not None:
            raise result.ire
        if result.ace is not None:
            raise result.ace
        if result.ase is not None:
            raise result.ase
        if result.ae is not None:
            raise result.ae
        raise TApplicationException(TApplicationException.MISSING_RESULT, "updateApplicationInterface failed: unknown result")

    def deleteApplicationInterface(self, authzToken, appInterfaceId):
        """

        Delete an Application Interface.

        @param appInterfaceId
          The identifier for the requested application interface to be deleted.

        @return status
          Returns a success/failure of the deletion.


        Parameters:
         - authzToken
         - appInterfaceId
        """
        self.send_deleteApplicationInterface(authzToken, appInterfaceId)
        return self.recv_deleteApplicationInterface()

    def send_deleteApplicationInterface(self, authzToken, appInterfaceId):
        self._oprot.writeMessageBegin('deleteApplicationInterface', TMessageType.CALL, self._seqid)
        args = deleteApplicationInterface_args()
        args.authzToken = authzToken
        args.appInterfaceId = appInterfaceId
        args.write(self._oprot)
        self._oprot.writeMessageEnd()
        self._oprot.trans.flush()

    def recv_deleteApplicationInterface(self):
        iprot = self._iprot
        (fname, mtype, rseqid) = iprot.readMessageBegin()
        if mtype == TMessageType.EXCEPTION:
            x = TApplicationException()
            x.read(iprot)
            iprot.readMessageEnd()
            raise x
        result = deleteApplicationInterface_result()
        result.read(iprot)
        iprot.readMessageEnd()
        if result.success is not None:
            return result.success
        if result.ire is not None:
            raise result.ire
        if result.ace is not None:
            raise result.ace
        if result.ase is not None:
            raise result.ase
        if result.ae is not None:
            raise result.ae
        raise TApplicationException(TApplicationException.MISSING_RESULT, "deleteApplicationInterface failed: unknown result")

    def getAllApplicationInterfaceNames(self, authzToken, gatewayId):
        """

        Fetch name and ID of  Application Interface documents.


        @return map<applicationId, applicationInterfaceNames>
          Returns a list of application interfaces with corresponsing ID's


        Parameters:
         - authzToken
         - gatewayId
        """
        self.send_getAllApplicationInterfaceNames(authzToken, gatewayId)
        return self.recv_getAllApplicationInterfaceNames()

    def send_getAllApplicationInterfaceNames(self, authzToken, gatewayId):
        self._oprot.writeMessageBegin('getAllApplicationInterfaceNames', TMessageType.CALL, self._seqid)
        args = getAllApplicationInterfaceNames_args()
        args.authzToken = authzToken
        args.gatewayId = gatewayId
        args.write(self._oprot)
        self._oprot.writeMessageEnd()
        self._oprot.trans.flush()

    def recv_getAllApplicationInterfaceNames(self):
        iprot = self._iprot
        (fname, mtype, rseqid) = iprot.readMessageBegin()
        if mtype == TMessageType.EXCEPTION:
            x = TApplicationException()
            x.read(iprot)
            iprot.readMessageEnd()
            raise x
        result = getAllApplicationInterfaceNames_result()
        result.read(iprot)
        iprot.readMessageEnd()
        if result.success is not None:
            return result.success
        if result.ire is not None:
            raise result.ire
        if result.ace is not None:
            raise result.ace
        if result.ase is not None:
            raise result.ase
        if result.ae is not None:
            raise result.ae
        raise TApplicationException(TApplicationException.MISSING_RESULT, "getAllApplicationInterfaceNames failed: unknown result")

    def getAllApplicationInterfaces(self, authzToken, gatewayId):
        """

        Fetch all Application Interface documents.


        @return map<applicationId, applicationInterfaceNames>
          Returns a list of application interfaces documents (Application Interface ID, name, description, Inputs and Outputs objects).


        Parameters:
         - authzToken
         - gatewayId
        """
        self.send_getAllApplicationInterfaces(authzToken, gatewayId)
        return self.recv_getAllApplicationInterfaces()

    def send_getAllApplicationInterfaces(self, authzToken, gatewayId):
        self._oprot.writeMessageBegin('getAllApplicationInterfaces', TMessageType.CALL, self._seqid)
        args = getAllApplicationInterfaces_args()
        args.authzToken = authzToken
        args.gatewayId = gatewayId
        args.write(self._oprot)
        self._oprot.writeMessageEnd()
        self._oprot.trans.flush()

    def recv_getAllApplicationInterfaces(self):
        iprot = self._iprot
        (fname, mtype, rseqid) = iprot.readMessageBegin()
        if mtype == TMessageType.EXCEPTION:
            x = TApplicationException()
            x.read(iprot)
            iprot.readMessageEnd()
            raise x
        result = getAllApplicationInterfaces_result()
        result.read(iprot)
        iprot.readMessageEnd()
        if result.success is not None:
            return result.success
        if result.ire is not None:
            raise result.ire
        if result.ace is not None:
            raise result.ace
        if result.ase is not None:
            raise result.ase
        if result.ae is not None:
            raise result.ae
        raise TApplicationException(TApplicationException.MISSING_RESULT, "getAllApplicationInterfaces failed: unknown result")

    def getApplicationInputs(self, authzToken, appInterfaceId):
        """

        Fetch the list of Application Inputs.

        @param appInterfaceId
          The identifier of the application interface which need inputs to be fetched.

        @return list<application_interface_model.InputDataObjectType>
          Returns a list of application inputs.


        Parameters:
         - authzToken
         - appInterfaceId
        """
        self.send_getApplicationInputs(authzToken, appInterfaceId)
        return self.recv_getApplicationInputs()

    def send_getApplicationInputs(self, authzToken, appInterfaceId):
        self._oprot.writeMessageBegin('getApplicationInputs', TMessageType.CALL, self._seqid)
        args = getApplicationInputs_args()
        args.authzToken = authzToken
        args.appInterfaceId = appInterfaceId
        args.write(self._oprot)
        self._oprot.writeMessageEnd()
        self._oprot.trans.flush()

    def recv_getApplicationInputs(self):
        iprot = self._iprot
        (fname, mtype, rseqid) = iprot.readMessageBegin()
        if mtype == TMessageType.EXCEPTION:
            x = TApplicationException()
            x.read(iprot)
            iprot.readMessageEnd()
            raise x
        result = getApplicationInputs_result()
        result.read(iprot)
        iprot.readMessageEnd()
        if result.success is not None:
            return result.success
        if result.ire is not None:
            raise result.ire
        if result.ace is not None:
            raise result.ace
        if result.ase is not None:
            raise result.ase
        if result.ae is not None:
            raise result.ae
        raise TApplicationException(TApplicationException.MISSING_RESULT, "getApplicationInputs failed: unknown result")

    def getApplicationOutputs(self, authzToken, appInterfaceId):
        """

        Fetch list of Application Outputs.

        @param appInterfaceId
          The identifier of the application interface which need outputs to be fetched.

        @return list<application_interface_model.OutputDataObjectType>
          Returns a list of application outputs.


        Parameters:
         - authzToken
         - appInterfaceId
        """
        self.send_getApplicationOutputs(authzToken, appInterfaceId)
        return self.recv_getApplicationOutputs()

    def send_getApplicationOutputs(self, authzToken, appInterfaceId):
        self._oprot.writeMessageBegin('getApplicationOutputs', TMessageType.CALL, self._seqid)
        args = getApplicationOutputs_args()
        args.authzToken = authzToken
        args.appInterfaceId = appInterfaceId
        args.write(self._oprot)
        self._oprot.writeMessageEnd()
        self._oprot.trans.flush()

    def recv_getApplicationOutputs(self):
        iprot = self._iprot
        (fname, mtype, rseqid) = iprot.readMessageBegin()
        if mtype == TMessageType.EXCEPTION:
            x = TApplicationException()
            x.read(iprot)
            iprot.readMessageEnd()
            raise x
        result = getApplicationOutputs_result()
        result.read(iprot)
        iprot.readMessageEnd()
        if result.success is not None:
            return result.success
        if result.ire is not None:
            raise result.ire
        if result.ace is not None:
            raise result.ace
        if result.ase is not None:
            raise result.ase
        if result.ae is not None:
            raise result.ae
        raise TApplicationException(TApplicationException.MISSING_RESULT, "getApplicationOutputs failed: unknown result")

    def getAvailableAppInterfaceComputeResources(self, authzToken, appInterfaceId):
        """

        Fetch a list of all deployed Compute Hosts for a given application interfaces.

        @param appInterfaceId
          The identifier for the requested application interface.

        @return map<computeResourceId, computeResourceName>
          A map of registered compute resource id's and their corresponding hostnames.
          Deployments of each modules listed within the interfaces will be listed.


        Parameters:
         - authzToken
         - appInterfaceId
        """
        self.send_getAvailableAppInterfaceComputeResources(authzToken, appInterfaceId)
        return self.recv_getAvailableAppInterfaceComputeResources()

    def send_getAvailableAppInterfaceComputeResources(self, authzToken, appInterfaceId):
        self._oprot.writeMessageBegin('getAvailableAppInterfaceComputeResources', TMessageType.CALL, self._seqid)
        args = getAvailableAppInterfaceComputeResources_args()
        args.authzToken = authzToken
        args.appInterfaceId = appInterfaceId
        args.write(self._oprot)
        self._oprot.writeMessageEnd()
        self._oprot.trans.flush()

    def recv_getAvailableAppInterfaceComputeResources(self):
        iprot = self._iprot
        (fname, mtype, rseqid) = iprot.readMessageBegin()
        if mtype == TMessageType.EXCEPTION:
            x = TApplicationException()
            x.read(iprot)
            iprot.readMessageEnd()
            raise x
        result = getAvailableAppInterfaceComputeResources_result()
        result.read(iprot)
        iprot.readMessageEnd()
        if result.success is not None:
            return result.success
        if result.ire is not None:
            raise result.ire
        if result.ace is not None:
            raise result.ace
        if result.ase is not None:
            raise result.ase
        if result.ae is not None:
            raise result.ae
        raise TApplicationException(TApplicationException.MISSING_RESULT, "getAvailableAppInterfaceComputeResources failed: unknown result")

    def registerComputeResource(self, authzToken, computeResourceDescription):
        """
        Register a Compute Resource.

        @param computeResourceDescription
           Compute Resource Object created from the datamodel.

        @return computeResourceId
          Returns a server-side generated airavata compute resource globally unique identifier.


        Parameters:
         - authzToken
         - computeResourceDescription
        """
        self.send_registerComputeResource(authzToken, computeResourceDescription)
        return self.recv_registerComputeResource()

    def send_registerComputeResource(self, authzToken, computeResourceDescription):
        self._oprot.writeMessageBegin('registerComputeResource', TMessageType.CALL, self._seqid)
        args = registerComputeResource_args()
        args.authzToken = authzToken
        args.computeResourceDescription = computeResourceDescription
        args.write(self._oprot)
        self._oprot.writeMessageEnd()
        self._oprot.trans.flush()

    def recv_registerComputeResource(self):
        iprot = self._iprot
        (fname, mtype, rseqid) = iprot.readMessageBegin()
        if mtype == TMessageType.EXCEPTION:
            x = TApplicationException()
            x.read(iprot)
            iprot.readMessageEnd()
            raise x
        result = registerComputeResource_result()
        result.read(iprot)
        iprot.readMessageEnd()
        if result.success is not None:
            return result.success
        if result.ire is not None:
            raise result.ire
        if result.ace is not None:
            raise result.ace
        if result.ase is not None:
            raise result.ase
        if result.ae is not None:
            raise result.ae
        raise TApplicationException(TApplicationException.MISSING_RESULT, "registerComputeResource failed: unknown result")

    def getComputeResource(self, authzToken, computeResourceId):
        """
        Fetch the given Compute Resource.

        @param computeResourceId
          The identifier for the requested compute resource

        @return computeResourceDescription
           Compute Resource Object created from the datamodel..


        Parameters:
         - authzToken
         - computeResourceId
        """
        self.send_getComputeResource(authzToken, computeResourceId)
        return self.recv_getComputeResource()

    def send_getComputeResource(self, authzToken, computeResourceId):
        self._oprot.writeMessageBegin('getComputeResource', TMessageType.CALL, self._seqid)
        args = getComputeResource_args()
        args.authzToken = authzToken
        args.computeResourceId = computeResourceId
        args.write(self._oprot)
        self._oprot.writeMessageEnd()
        self._oprot.trans.flush()

    def recv_getComputeResource(self):
        iprot = self._iprot
        (fname, mtype, rseqid) = iprot.readMessageBegin()
        if mtype == TMessageType.EXCEPTION:
            x = TApplicationException()
            x.read(iprot)
            iprot.readMessageEnd()
            raise x
        result = getComputeResource_result()
        result.read(iprot)
        iprot.readMessageEnd()
        if result.success is not None:
            return result.success
        if result.ire is not None:
            raise result.ire
        if result.ace is not None:
            raise result.ace
        if result.ase is not None:
            raise result.ase
        if result.ae is not None:
            raise result.ae
        raise TApplicationException(TApplicationException.MISSING_RESULT, "getComputeResource failed: unknown result")

    def getAllComputeResourceNames(self, authzToken):
        """

        Fetch all registered Compute Resources.

        @return A map of registered compute resource id's and thier corresponding hostnames.
           Compute Resource Object created from the datamodel..


        Parameters:
         - authzToken
        """
        self.send_getAllComputeResourceNames(authzToken)
        return self.recv_getAllComputeResourceNames()

    def send_getAllComputeResourceNames(self, authzToken):
        self._oprot.writeMessageBegin('getAllComputeResourceNames', TMessageType.CALL, self._seqid)
        args = getAllComputeResourceNames_args()
        args.authzToken = authzToken
        args.write(self._oprot)
        self._oprot.writeMessageEnd()
        self._oprot.trans.flush()

    def recv_getAllComputeResourceNames(self):
        iprot = self._iprot
        (fname, mtype, rseqid) = iprot.readMessageBegin()
        if mtype == TMessageType.EXCEPTION:
            x = TApplicationException()
            x.read(iprot)
            iprot.readMessageEnd()
            raise x
        result = getAllComputeResourceNames_result()
        result.read(iprot)
        iprot.readMessageEnd()
        if result.success is not None:
            return result.success
        if result.ire is not None:
            raise result.ire
        if result.ace is not None:
            raise result.ace
        if result.ase is not None:
            raise result.ase
        if result.ae is not None:
            raise result.ae
        raise TApplicationException(TApplicationException.MISSING_RESULT, "getAllComputeResourceNames failed: unknown result")

    def updateComputeResource(self, authzToken, computeResourceId, computeResourceDescription):
        """
        Update a Compute Resource.

        @param computeResourceId
          The identifier for the requested compute resource to be updated.

        @param computeResourceDescription
           Compute Resource Object created from the datamodel.

        @return status
          Returns a success/failure of the update.


        Parameters:
         - authzToken
         - computeResourceId
         - computeResourceDescription
        """
        self.send_updateComputeResource(authzToken, computeResourceId, computeResourceDescription)
        return self.recv_updateComputeResource()

    def send_updateComputeResource(self, authzToken, computeResourceId, computeResourceDescription):
        self._oprot.writeMessageBegin('updateComputeResource', TMessageType.CALL, self._seqid)
        args = updateComputeResource_args()
        args.authzToken = authzToken
        args.computeResourceId = computeResourceId
        args.computeResourceDescription = computeResourceDescription
        args.write(self._oprot)
        self._oprot.writeMessageEnd()
        self._oprot.trans.flush()

    def recv_updateComputeResource(self):
        iprot = self._iprot
        (fname, mtype, rseqid) = iprot.readMessageBegin()
        if mtype == TMessageType.EXCEPTION:
            x = TApplicationException()
            x.read(iprot)
            iprot.readMessageEnd()
            raise x
        result = updateComputeResource_result()
        result.read(iprot)
        iprot.readMessageEnd()
        if result.success is not None:
            return result.success
        if result.ire is not None:
            raise result.ire
        if result.ace is not None:
            raise result.ace
        if result.ase is not None:
            raise result.ase
        if result.ae is not None:
            raise result.ae
        raise TApplicationException(TApplicationException.MISSING_RESULT, "updateComputeResource failed: unknown result")

    def deleteComputeResource(self, authzToken, computeResourceId):
        """
        Delete a Compute Resource.

        @param computeResourceId
          The identifier for the requested compute resource to be deleted.

        @return status
          Returns a success/failure of the deletion.


        Parameters:
         - authzToken
         - computeResourceId
        """
        self.send_deleteComputeResource(authzToken, computeResourceId)
        return self.recv_deleteComputeResource()

    def send_deleteComputeResource(self, authzToken, computeResourceId):
        self._oprot.writeMessageBegin('deleteComputeResource', TMessageType.CALL, self._seqid)
        args = deleteComputeResource_args()
        args.authzToken = authzToken
        args.computeResourceId = computeResourceId
        args.write(self._oprot)
        self._oprot.writeMessageEnd()
        self._oprot.trans.flush()

    def recv_deleteComputeResource(self):
        iprot = self._iprot
        (fname, mtype, rseqid) = iprot.readMessageBegin()
        if mtype == TMessageType.EXCEPTION:
            x = TApplicationException()
            x.read(iprot)
            iprot.readMessageEnd()
            raise x
        result = deleteComputeResource_result()
        result.read(iprot)
        iprot.readMessageEnd()
        if result.success is not None:
            return result.success
        if result.ire is not None:
            raise result.ire
        if result.ace is not None:
            raise result.ace
        if result.ase is not None:
            raise result.ase
        if result.ae is not None:
            raise result.ae
        raise TApplicationException(TApplicationException.MISSING_RESULT, "deleteComputeResource failed: unknown result")

    def registerStorageResource(self, authzToken, storageResourceDescription):
        """
        Register a Storage Resource.

        @param storageResourceDescription
           Storge Resource Object created from the datamodel.

        @return storageResourceId
          Returns a server-side generated airavata storage resource globally unique identifier.


        Parameters:
         - authzToken
         - storageResourceDescription
        """
        self.send_registerStorageResource(authzToken, storageResourceDescription)
        return self.recv_registerStorageResource()

    def send_registerStorageResource(self, authzToken, storageResourceDescription):
        self._oprot.writeMessageBegin('registerStorageResource', TMessageType.CALL, self._seqid)
        args = registerStorageResource_args()
        args.authzToken = authzToken
        args.storageResourceDescription = storageResourceDescription
        args.write(self._oprot)
        self._oprot.writeMessageEnd()
        self._oprot.trans.flush()

    def recv_registerStorageResource(self):
        iprot = self._iprot
        (fname, mtype, rseqid) = iprot.readMessageBegin()
        if mtype == TMessageType.EXCEPTION:
            x = TApplicationException()
            x.read(iprot)
            iprot.readMessageEnd()
            raise x
        result = registerStorageResource_result()
        result.read(iprot)
        iprot.readMessageEnd()
        if result.success is not None:
            return result.success
        if result.ire is not None:
            raise result.ire
        if result.ace is not None:
            raise result.ace
        if result.ase is not None:
            raise result.ase
        if result.ae is not None:
            raise result.ae
        raise TApplicationException(TApplicationException.MISSING_RESULT, "registerStorageResource failed: unknown result")

    def getStorageResource(self, authzToken, storageResourceId):
        """
        Fetch the given Storage Resource.

        @param storageResourceId
          The identifier for the requested storage resource

        @return storageResourceDescription
           Storage Resource Object created from the datamodel..


        Parameters:
         - authzToken
         - storageResourceId
        """
        self.send_getStorageResource(authzToken, storageResourceId)
        return self.recv_getStorageResource()

    def send_getStorageResource(self, authzToken, storageResourceId):
        self._oprot.writeMessageBegin('getStorageResource', TMessageType.CALL, self._seqid)
        args = getStorageResource_args()
        args.authzToken = authzToken
        args.storageResourceId = storageResourceId
        args.write(self._oprot)
        self._oprot.writeMessageEnd()
        self._oprot.trans.flush()

    def recv_getStorageResource(self):
        iprot = self._iprot
        (fname, mtype, rseqid) = iprot.readMessageBegin()
        if mtype == TMessageType.EXCEPTION:
            x = TApplicationException()
            x.read(iprot)
            iprot.readMessageEnd()
            raise x
        result = getStorageResource_result()
        result.read(iprot)
        iprot.readMessageEnd()
        if result.success is not None:
            return result.success
        if result.ire is not None:
            raise result.ire
        if result.ace is not None:
            raise result.ace
        if result.ase is not None:
            raise result.ase
        if result.ae is not None:
            raise result.ae
        raise TApplicationException(TApplicationException.MISSING_RESULT, "getStorageResource failed: unknown result")

    def getAllStorageResourceNames(self, authzToken):
        """
        Fetch all registered Storage Resources.

        @return A map of registered compute resource id's and thier corresponding hostnames.
           Compute Resource Object created from the datamodel..


        Parameters:
         - authzToken
        """
        self.send_getAllStorageResourceNames(authzToken)
        return self.recv_getAllStorageResourceNames()

    def send_getAllStorageResourceNames(self, authzToken):
        self._oprot.writeMessageBegin('getAllStorageResourceNames', TMessageType.CALL, self._seqid)
        args = getAllStorageResourceNames_args()
        args.authzToken = authzToken
        args.write(self._oprot)
        self._oprot.writeMessageEnd()
        self._oprot.trans.flush()

    def recv_getAllStorageResourceNames(self):
        iprot = self._iprot
        (fname, mtype, rseqid) = iprot.readMessageBegin()
        if mtype == TMessageType.EXCEPTION:
            x = TApplicationException()
            x.read(iprot)
            iprot.readMessageEnd()
            raise x
        result = getAllStorageResourceNames_result()
        result.read(iprot)
        iprot.readMessageEnd()
        if result.success is not None:
            return result.success
        if result.ire is not None:
            raise result.ire
        if result.ace is not None:
            raise result.ace
        if result.ase is not None:
            raise result.ase
        if result.ae is not None:
            raise result.ae
        raise TApplicationException(TApplicationException.MISSING_RESULT, "getAllStorageResourceNames failed: unknown result")

    def updateStorageResource(self, authzToken, storageResourceId, storageResourceDescription):
        """
        Update a Storage Resource.

        @param storageResourceId
          The identifier for the requested compute resource to be updated.

        @param storageResourceDescription
           Storage Resource Object created from the datamodel.

        @return status
          Returns a success/failure of the update.


        Parameters:
         - authzToken
         - storageResourceId
         - storageResourceDescription
        """
        self.send_updateStorageResource(authzToken, storageResourceId, storageResourceDescription)
        return self.recv_updateStorageResource()

    def send_updateStorageResource(self, authzToken, storageResourceId, storageResourceDescription):
        self._oprot.writeMessageBegin('updateStorageResource', TMessageType.CALL, self._seqid)
        args = updateStorageResource_args()
        args.authzToken = authzToken
        args.storageResourceId = storageResourceId
        args.storageResourceDescription = storageResourceDescription
        args.write(self._oprot)
        self._oprot.writeMessageEnd()
        self._oprot.trans.flush()

    def recv_updateStorageResource(self):
        iprot = self._iprot
        (fname, mtype, rseqid) = iprot.readMessageBegin()
        if mtype == TMessageType.EXCEPTION:
            x = TApplicationException()
            x.read(iprot)
            iprot.readMessageEnd()
            raise x
        result = updateStorageResource_result()
        result.read(iprot)
        iprot.readMessageEnd()
        if result.success is not None:
            return result.success
        if result.ire is not None:
            raise result.ire
        if result.ace is not None:
            raise result.ace
        if result.ase is not None:
            raise result.ase
        if result.ae is not None:
            raise result.ae
        raise TApplicationException(TApplicationException.MISSING_RESULT, "updateStorageResource failed: unknown result")

    def deleteStorageResource(self, authzToken, storageResourceId):
        """
        Delete a Storage Resource.

        @param storageResourceId
          The identifier of the requested compute resource to be deleted.

        @return status
          Returns a success/failure of the deletion.


        Parameters:
         - authzToken
         - storageResourceId
        """
        self.send_deleteStorageResource(authzToken, storageResourceId)
        return self.recv_deleteStorageResource()

    def send_deleteStorageResource(self, authzToken, storageResourceId):
        self._oprot.writeMessageBegin('deleteStorageResource', TMessageType.CALL, self._seqid)
        args = deleteStorageResource_args()
        args.authzToken = authzToken
        args.storageResourceId = storageResourceId
        args.write(self._oprot)
        self._oprot.writeMessageEnd()
        self._oprot.trans.flush()

    def recv_deleteStorageResource(self):
        iprot = self._iprot
        (fname, mtype, rseqid) = iprot.readMessageBegin()
        if mtype == TMessageType.EXCEPTION:
            x = TApplicationException()
            x.read(iprot)
            iprot.readMessageEnd()
            raise x
        result = deleteStorageResource_result()
        result.read(iprot)
        iprot.readMessageEnd()
        if result.success is not None:
            return result.success
        if result.ire is not None:
            raise result.ire
        if result.ace is not None:
            raise result.ace
        if result.ase is not None:
            raise result.ase
        if result.ae is not None:
            raise result.ae
        raise TApplicationException(TApplicationException.MISSING_RESULT, "deleteStorageResource failed: unknown result")

    def addLocalSubmissionDetails(self, authzToken, computeResourceId, priorityOrder, localSubmission):
        """
        Add a Local Job Submission details to a compute resource
         App catalog will return a jobSubmissionInterfaceId which will be added to the jobSubmissionInterfaces.

        @param computeResourceId
          The identifier of the compute resource to which JobSubmission protocol to be added

        @param priorityOrder
          Specify the priority of this job manager. If this is the only jobmanager, the priority can be zero.

        @param localSubmission
          The LOCALSubmission object to be added to the resource.

        @return status
          Returns the unique job submission id.


        Parameters:
         - authzToken
         - computeResourceId
         - priorityOrder
         - localSubmission
        """
        self.send_addLocalSubmissionDetails(authzToken, computeResourceId, priorityOrder, localSubmission)
        return self.recv_addLocalSubmissionDetails()

    def send_addLocalSubmissionDetails(self, authzToken, computeResourceId, priorityOrder, localSubmission):
        self._oprot.writeMessageBegin('addLocalSubmissionDetails', TMessageType.CALL, self._seqid)
        args = addLocalSubmissionDetails_args()
        args.authzToken = authzToken
        args.computeResourceId = computeResourceId
        args.priorityOrder = priorityOrder
        args.localSubmission = localSubmission
        args.write(self._oprot)
        self._oprot.writeMessageEnd()
        self._oprot.trans.flush()

    def recv_addLocalSubmissionDetails(self):
        iprot = self._iprot
        (fname, mtype, rseqid) = iprot.readMessageBegin()
        if mtype == TMessageType.EXCEPTION:
            x = TApplicationException()
            x.read(iprot)
            iprot.readMessageEnd()
            raise x
        result = addLocalSubmissionDetails_result()
        result.read(iprot)
        iprot.readMessageEnd()
        if result.success is not None:
            return result.success
        if result.ire is not None:
            raise result.ire
        if result.ace is not None:
            raise result.ace
        if result.ase is not None:
            raise result.ase
        if result.ae is not None:
            raise result.ae
        raise TApplicationException(TApplicationException.MISSING_RESULT, "addLocalSubmissionDetails failed: unknown result")

    def updateLocalSubmissionDetails(self, authzToken, jobSubmissionInterfaceId, localSubmission):
        """
        Update the given Local Job Submission details

        @param jobSubmissionInterfaceId
          The identifier of the JobSubmission Interface to be updated.

        @param localSubmission
          The LOCALSubmission object to be updated.

        @return status
          Returns a success/failure of the deletion.


        Parameters:
         - authzToken
         - jobSubmissionInterfaceId
         - localSubmission
        """
        self.send_updateLocalSubmissionDetails(authzToken, jobSubmissionInterfaceId, localSubmission)
        return self.recv_updateLocalSubmissionDetails()

    def send_updateLocalSubmissionDetails(self, authzToken, jobSubmissionInterfaceId, localSubmission):
        self._oprot.writeMessageBegin('updateLocalSubmissionDetails', TMessageType.CALL, self._seqid)
        args = updateLocalSubmissionDetails_args()
        args.authzToken = authzToken
        args.jobSubmissionInterfaceId = jobSubmissionInterfaceId
        args.localSubmission = localSubmission
        args.write(self._oprot)
        self._oprot.writeMessageEnd()
        self._oprot.trans.flush()

    def recv_updateLocalSubmissionDetails(self):
        iprot = self._iprot
        (fname, mtype, rseqid) = iprot.readMessageBegin()
        if mtype == TMessageType.EXCEPTION:
            x = TApplicationException()
            x.read(iprot)
            iprot.readMessageEnd()
            raise x
        result = updateLocalSubmissionDetails_result()
        result.read(iprot)
        iprot.readMessageEnd()
        if result.success is not None:
            return result.success
        if result.ire is not None:
            raise result.ire
        if result.ace is not None:
            raise result.ace
        if result.ase is not None:
            raise result.ase
        if result.ae is not None:
            raise result.ae
        raise TApplicationException(TApplicationException.MISSING_RESULT, "updateLocalSubmissionDetails failed: unknown result")

    def getLocalJobSubmission(self, authzToken, jobSubmissionId):
        """
        This method returns localJobSubmission object
        @param jobSubmissionInterfaceId
          The identifier of the JobSubmission Interface to be retrieved.
         @return LOCALSubmission instance


        Parameters:
         - authzToken
         - jobSubmissionId
        """
        self.send_getLocalJobSubmission(authzToken, jobSubmissionId)
        return self.recv_getLocalJobSubmission()

    def send_getLocalJobSubmission(self, authzToken, jobSubmissionId):
        self._oprot.writeMessageBegin('getLocalJobSubmission', TMessageType.CALL, self._seqid)
        args = getLocalJobSubmission_args()
        args.authzToken = authzToken
        args.jobSubmissionId = jobSubmissionId
        args.write(self._oprot)
        self._oprot.writeMessageEnd()
        self._oprot.trans.flush()

    def recv_getLocalJobSubmission(self):
        iprot = self._iprot
        (fname, mtype, rseqid) = iprot.readMessageBegin()
        if mtype == TMessageType.EXCEPTION:
            x = TApplicationException()
            x.read(iprot)
            iprot.readMessageEnd()
            raise x
        result = getLocalJobSubmission_result()
        result.read(iprot)
        iprot.readMessageEnd()
        if result.success is not None:
            return result.success
        if result.ire is not None:
            raise result.ire
        if result.ace is not None:
            raise result.ace
        if result.ase is not None:
            raise result.ase
        if result.ae is not None:
            raise result.ae
        raise TApplicationException(TApplicationException.MISSING_RESULT, "getLocalJobSubmission failed: unknown result")

    def addSSHJobSubmissionDetails(self, authzToken, computeResourceId, priorityOrder, sshJobSubmission):
        """
        Add a SSH Job Submission details to a compute resource
         App catalog will return a jobSubmissionInterfaceId which will be added to the jobSubmissionInterfaces.

        @param computeResourceId
          The identifier of the compute resource to which JobSubmission protocol to be added

        @param priorityOrder
          Specify the priority of this job manager. If this is the only jobmanager, the priority can be zero.

        @param sshJobSubmission
          The SSHJobSubmission object to be added to the resource.

        @return status
          Returns the unique job submission id.


        Parameters:
         - authzToken
         - computeResourceId
         - priorityOrder
         - sshJobSubmission
        """
        self.send_addSSHJobSubmissionDetails(authzToken, computeResourceId, priorityOrder, sshJobSubmission)
        return self.recv_addSSHJobSubmissionDetails()

    def send_addSSHJobSubmissionDetails(self, authzToken, computeResourceId, priorityOrder, sshJobSubmission):
        self._oprot.writeMessageBegin('addSSHJobSubmissionDetails', TMessageType.CALL, self._seqid)
        args = addSSHJobSubmissionDetails_args()
        args.authzToken = authzToken
        args.computeResourceId = computeResourceId
        args.priorityOrder = priorityOrder
        args.sshJobSubmission = sshJobSubmission
        args.write(self._oprot)
        self._oprot.writeMessageEnd()
        self._oprot.trans.flush()

    def recv_addSSHJobSubmissionDetails(self):
        iprot = self._iprot
        (fname, mtype, rseqid) = iprot.readMessageBegin()
        if mtype == TMessageType.EXCEPTION:
            x = TApplicationException()
            x.read(iprot)
            iprot.readMessageEnd()
            raise x
        result = addSSHJobSubmissionDetails_result()
        result.read(iprot)
        iprot.readMessageEnd()
        if result.success is not None:
            return result.success
        if result.ire is not None:
            raise result.ire
        if result.ace is not None:
            raise result.ace
        if result.ase is not None:
            raise result.ase
        if result.ae is not None:
            raise result.ae
        raise TApplicationException(TApplicationException.MISSING_RESULT, "addSSHJobSubmissionDetails failed: unknown result")

    def addSSHForkJobSubmissionDetails(self, authzToken, computeResourceId, priorityOrder, sshJobSubmission):
        """
        Add a SSH_FORK Job Submission details to a compute resource
         App catalog will return a jobSubmissionInterfaceId which will be added to the jobSubmissionInterfaces.

        @param computeResourceId
          The identifier of the compute resource to which JobSubmission protocol to be added

        @param priorityOrder
          Specify the priority of this job manager. If this is the only jobmanager, the priority can be zero.

        @param sshJobSubmission
          The SSHJobSubmission object to be added to the resource.

        @return status
          Returns the unique job submission id.


        Parameters:
         - authzToken
         - computeResourceId
         - priorityOrder
         - sshJobSubmission
        """
        self.send_addSSHForkJobSubmissionDetails(authzToken, computeResourceId, priorityOrder, sshJobSubmission)
        return self.recv_addSSHForkJobSubmissionDetails()

    def send_addSSHForkJobSubmissionDetails(self, authzToken, computeResourceId, priorityOrder, sshJobSubmission):
        self._oprot.writeMessageBegin('addSSHForkJobSubmissionDetails', TMessageType.CALL, self._seqid)
        args = addSSHForkJobSubmissionDetails_args()
        args.authzToken = authzToken
        args.computeResourceId = computeResourceId
        args.priorityOrder = priorityOrder
        args.sshJobSubmission = sshJobSubmission
        args.write(self._oprot)
        self._oprot.writeMessageEnd()
        self._oprot.trans.flush()

    def recv_addSSHForkJobSubmissionDetails(self):
        iprot = self._iprot
        (fname, mtype, rseqid) = iprot.readMessageBegin()
        if mtype == TMessageType.EXCEPTION:
            x = TApplicationException()
            x.read(iprot)
            iprot.readMessageEnd()
            raise x
        result = addSSHForkJobSubmissionDetails_result()
        result.read(iprot)
        iprot.readMessageEnd()
        if result.success is not None:
            return result.success
        if result.ire is not None:
            raise result.ire
        if result.ace is not None:
            raise result.ace
        if result.ase is not None:
            raise result.ase
        if result.ae is not None:
            raise result.ae
        raise TApplicationException(TApplicationException.MISSING_RESULT, "addSSHForkJobSubmissionDetails failed: unknown result")

    def getSSHJobSubmission(self, authzToken, jobSubmissionId):
        """
        This method returns SSHJobSubmission object
        @param jobSubmissionInterfaceId
          The identifier of the JobSubmission Interface to be retrieved.
         @return SSHJobSubmission instance


        Parameters:
         - authzToken
         - jobSubmissionId
        """
        self.send_getSSHJobSubmission(authzToken, jobSubmissionId)
        return self.recv_getSSHJobSubmission()

    def send_getSSHJobSubmission(self, authzToken, jobSubmissionId):
        self._oprot.writeMessageBegin('getSSHJobSubmission', TMessageType.CALL, self._seqid)
        args = getSSHJobSubmission_args()
        args.authzToken = authzToken
        args.jobSubmissionId = jobSubmissionId
        args.write(self._oprot)
        self._oprot.writeMessageEnd()
        self._oprot.trans.flush()

    def recv_getSSHJobSubmission(self):
        iprot = self._iprot
        (fname, mtype, rseqid) = iprot.readMessageBegin()
        if mtype == TMessageType.EXCEPTION:
            x = TApplicationException()
            x.read(iprot)
            iprot.readMessageEnd()
            raise x
        result = getSSHJobSubmission_result()
        result.read(iprot)
        iprot.readMessageEnd()
        if result.success is not None:
            return result.success
        if result.ire is not None:
            raise result.ire
        if result.ace is not None:
            raise result.ace
        if result.ase is not None:
            raise result.ase
        if result.ae is not None:
            raise result.ae
        raise TApplicationException(TApplicationException.MISSING_RESULT, "getSSHJobSubmission failed: unknown result")

    def addUNICOREJobSubmissionDetails(self, authzToken, computeResourceId, priorityOrder, unicoreJobSubmission):
        """

        Add a UNICORE Job Submission details to a compute resource
         App catalog will return a jobSubmissionInterfaceId which will be added to the jobSubmissionInterfaces.

        @param computeResourceId
          The identifier of the compute resource to which JobSubmission protocol to be added

        @param priorityOrder
          Specify the priority of this job manager. If this is the only jobmanager, the priority can be zero.

        @param unicoreJobSubmission
          The UnicoreJobSubmission object to be added to the resource.

        @return status
         Returns the unique job submission id.


        Parameters:
         - authzToken
         - computeResourceId
         - priorityOrder
         - unicoreJobSubmission
        """
        self.send_addUNICOREJobSubmissionDetails(authzToken, computeResourceId, priorityOrder, unicoreJobSubmission)
        return self.recv_addUNICOREJobSubmissionDetails()

    def send_addUNICOREJobSubmissionDetails(self, authzToken, computeResourceId, priorityOrder, unicoreJobSubmission):
        self._oprot.writeMessageBegin('addUNICOREJobSubmissionDetails', TMessageType.CALL, self._seqid)
        args = addUNICOREJobSubmissionDetails_args()
        args.authzToken = authzToken
        args.computeResourceId = computeResourceId
        args.priorityOrder = priorityOrder
        args.unicoreJobSubmission = unicoreJobSubmission
        args.write(self._oprot)
        self._oprot.writeMessageEnd()
        self._oprot.trans.flush()

    def recv_addUNICOREJobSubmissionDetails(self):
        iprot = self._iprot
        (fname, mtype, rseqid) = iprot.readMessageBegin()
        if mtype == TMessageType.EXCEPTION:
            x = TApplicationException()
            x.read(iprot)
            iprot.readMessageEnd()
            raise x
        result = addUNICOREJobSubmissionDetails_result()
        result.read(iprot)
        iprot.readMessageEnd()
        if result.success is not None:
            return result.success
        if result.ire is not None:
            raise result.ire
        if result.ace is not None:
            raise result.ace
        if result.ase is not None:
            raise result.ase
        if result.ae is not None:
            raise result.ae
        raise TApplicationException(TApplicationException.MISSING_RESULT, "addUNICOREJobSubmissionDetails failed: unknown result")

    def getUnicoreJobSubmission(self, authzToken, jobSubmissionId):
        """
          *
          * This method returns UnicoreJobSubmission object
          *
          * @param jobSubmissionInterfaceId
          *   The identifier of the JobSubmission Interface to be retrieved.
          *  @return UnicoreJobSubmission instance
          *
        *

        Parameters:
         - authzToken
         - jobSubmissionId
        """
        self.send_getUnicoreJobSubmission(authzToken, jobSubmissionId)
        return self.recv_getUnicoreJobSubmission()

    def send_getUnicoreJobSubmission(self, authzToken, jobSubmissionId):
        self._oprot.writeMessageBegin('getUnicoreJobSubmission', TMessageType.CALL, self._seqid)
        args = getUnicoreJobSubmission_args()
        args.authzToken = authzToken
        args.jobSubmissionId = jobSubmissionId
        args.write(self._oprot)
        self._oprot.writeMessageEnd()
        self._oprot.trans.flush()

    def recv_getUnicoreJobSubmission(self):
        iprot = self._iprot
        (fname, mtype, rseqid) = iprot.readMessageBegin()
        if mtype == TMessageType.EXCEPTION:
            x = TApplicationException()
            x.read(iprot)
            iprot.readMessageEnd()
            raise x
        result = getUnicoreJobSubmission_result()
        result.read(iprot)
        iprot.readMessageEnd()
        if result.success is not None:
            return result.success
        if result.ire is not None:
            raise result.ire
        if result.ace is not None:
            raise result.ace
        if result.ase is not None:
            raise result.ase
        if result.ae is not None:
            raise result.ae
        raise TApplicationException(TApplicationException.MISSING_RESULT, "getUnicoreJobSubmission failed: unknown result")

    def addCloudJobSubmissionDetails(self, authzToken, computeResourceId, priorityOrder, cloudSubmission):
        """
           *
           * Add a Cloud Job Submission details to a compute resource
           *  App catalog will return a jobSubmissionInterfaceId which will be added to the jobSubmissionInterfaces.
           *
           * @param computeResourceId
           *   The identifier of the compute resource to which JobSubmission protocol to be added
           *
           * @param priorityOrder
           *   Specify the priority of this job manager. If this is the only jobmanager, the priority can be zero.
           *
           * @param sshJobSubmission
           *   The SSHJobSubmission object to be added to the resource.
           *
           * @return status
           *   Returns the unique job submission id.
           *
        *

        Parameters:
         - authzToken
         - computeResourceId
         - priorityOrder
         - cloudSubmission
        """
        self.send_addCloudJobSubmissionDetails(authzToken, computeResourceId, priorityOrder, cloudSubmission)
        return self.recv_addCloudJobSubmissionDetails()

    def send_addCloudJobSubmissionDetails(self, authzToken, computeResourceId, priorityOrder, cloudSubmission):
        self._oprot.writeMessageBegin('addCloudJobSubmissionDetails', TMessageType.CALL, self._seqid)
        args = addCloudJobSubmissionDetails_args()
        args.authzToken = authzToken
        args.computeResourceId = computeResourceId
        args.priorityOrder = priorityOrder
        args.cloudSubmission = cloudSubmission
        args.write(self._oprot)
        self._oprot.writeMessageEnd()
        self._oprot.trans.flush()

    def recv_addCloudJobSubmissionDetails(self):
        iprot = self._iprot
        (fname, mtype, rseqid) = iprot.readMessageBegin()
        if mtype == TMessageType.EXCEPTION:
            x = TApplicationException()
            x.read(iprot)
            iprot.readMessageEnd()
            raise x
        result = addCloudJobSubmissionDetails_result()
        result.read(iprot)
        iprot.readMessageEnd()
        if result.success is not None:
            return result.success
        if result.ire is not None:
            raise result.ire
        if result.ace is not None:
            raise result.ace
        if result.ase is not None:
            raise result.ase
        if result.ae is not None:
            raise result.ae
        raise TApplicationException(TApplicationException.MISSING_RESULT, "addCloudJobSubmissionDetails failed: unknown result")

    def getCloudJobSubmission(self, authzToken, jobSubmissionId):
        """
           *
           * This method returns cloudJobSubmission object
           * @param jobSubmissionInterfaceI
               *   The identifier of the JobSubmission Interface to be retrieved.
           *  @return CloudJobSubmission instance
        *

        Parameters:
         - authzToken
         - jobSubmissionId
        """
        self.send_getCloudJobSubmission(authzToken, jobSubmissionId)
        return self.recv_getCloudJobSubmission()

    def send_getCloudJobSubmission(self, authzToken, jobSubmissionId):
        self._oprot.writeMessageBegin('getCloudJobSubmission', TMessageType.CALL, self._seqid)
        args = getCloudJobSubmission_args()
        args.authzToken = authzToken
        args.jobSubmissionId = jobSubmissionId
        args.write(self._oprot)
        self._oprot.writeMessageEnd()
        self._oprot.trans.flush()

    def recv_getCloudJobSubmission(self):
        iprot = self._iprot
        (fname, mtype, rseqid) = iprot.readMessageBegin()
        if mtype == TMessageType.EXCEPTION:
            x = TApplicationException()
            x.read(iprot)
            iprot.readMessageEnd()
            raise x
        result = getCloudJobSubmission_result()
        result.read(iprot)
        iprot.readMessageEnd()
        if result.success is not None:
            return result.success
        if result.ire is not None:
            raise result.ire
        if result.ace is not None:
            raise result.ace
        if result.ase is not None:
            raise result.ase
        if result.ae is not None:
            raise result.ae
        raise TApplicationException(TApplicationException.MISSING_RESULT, "getCloudJobSubmission failed: unknown result")

    def updateSSHJobSubmissionDetails(self, authzToken, jobSubmissionInterfaceId, sshJobSubmission):
        """

        Update the given SSH Job Submission details

        @param jobSubmissionInterfaceId
          The identifier of the JobSubmission Interface to be updated.

        @param sshJobSubmission
          The SSHJobSubmission object to be updated.

        @return status
          Returns a success/failure of the update.


        Parameters:
         - authzToken
         - jobSubmissionInterfaceId
         - sshJobSubmission
        """
        self.send_updateSSHJobSubmissionDetails(authzToken, jobSubmissionInterfaceId, sshJobSubmission)
        return self.recv_updateSSHJobSubmissionDetails()

    def send_updateSSHJobSubmissionDetails(self, authzToken, jobSubmissionInterfaceId, sshJobSubmission):
        self._oprot.writeMessageBegin('updateSSHJobSubmissionDetails', TMessageType.CALL, self._seqid)
        args = updateSSHJobSubmissionDetails_args()
        args.authzToken = authzToken
        args.jobSubmissionInterfaceId = jobSubmissionInterfaceId
        args.sshJobSubmission = sshJobSubmission
        args.write(self._oprot)
        self._oprot.writeMessageEnd()
        self._oprot.trans.flush()

    def recv_updateSSHJobSubmissionDetails(self):
        iprot = self._iprot
        (fname, mtype, rseqid) = iprot.readMessageBegin()
        if mtype == TMessageType.EXCEPTION:
            x = TApplicationException()
            x.read(iprot)
            iprot.readMessageEnd()
            raise x
        result = updateSSHJobSubmissionDetails_result()
        result.read(iprot)
        iprot.readMessageEnd()
        if result.success is not None:
            return result.success
        if result.ire is not None:
            raise result.ire
        if result.ace is not None:
            raise result.ace
        if result.ase is not None:
            raise result.ase
        if result.ae is not None:
            raise result.ae
        raise TApplicationException(TApplicationException.MISSING_RESULT, "updateSSHJobSubmissionDetails failed: unknown result")

    def updateCloudJobSubmissionDetails(self, authzToken, jobSubmissionInterfaceId, sshJobSubmission):
        """

        Update the cloud Job Submission details

        @param jobSubmissionInterfaceId
          The identifier of the JobSubmission Interface to be updated.

        @param cloudJobSubmission
          The CloudJobSubmission object to be updated.

        @return status
          Returns a success/failure of the update.


        Parameters:
         - authzToken
         - jobSubmissionInterfaceId
         - sshJobSubmission
        """
        self.send_updateCloudJobSubmissionDetails(authzToken, jobSubmissionInterfaceId, sshJobSubmission)
        return self.recv_updateCloudJobSubmissionDetails()

    def send_updateCloudJobSubmissionDetails(self, authzToken, jobSubmissionInterfaceId, sshJobSubmission):
        self._oprot.writeMessageBegin('updateCloudJobSubmissionDetails', TMessageType.CALL, self._seqid)
        args = updateCloudJobSubmissionDetails_args()
        args.authzToken = authzToken
        args.jobSubmissionInterfaceId = jobSubmissionInterfaceId
        args.sshJobSubmission = sshJobSubmission
        args.write(self._oprot)
        self._oprot.writeMessageEnd()
        self._oprot.trans.flush()

    def recv_updateCloudJobSubmissionDetails(self):
        iprot = self._iprot
        (fname, mtype, rseqid) = iprot.readMessageBegin()
        if mtype == TMessageType.EXCEPTION:
            x = TApplicationException()
            x.read(iprot)
            iprot.readMessageEnd()
            raise x
        result = updateCloudJobSubmissionDetails_result()
        result.read(iprot)
        iprot.readMessageEnd()
        if result.success is not None:
            return result.success
        if result.ire is not None:
            raise result.ire
        if result.ace is not None:
            raise result.ace
        if result.ase is not None:
            raise result.ase
        if result.ae is not None:
            raise result.ae
        raise TApplicationException(TApplicationException.MISSING_RESULT, "updateCloudJobSubmissionDetails failed: unknown result")

    def updateUnicoreJobSubmissionDetails(self, authzToken, jobSubmissionInterfaceId, unicoreJobSubmission):
        """

        Update the UNIOCRE Job Submission details

        @param jobSubmissionInterfaceId
          The identifier of the JobSubmission Interface to be updated.

        @param UnicoreJobSubmission
          The UnicoreJobSubmission object to be updated.

        @return status
          Returns a success/failure of the update.



        Parameters:
         - authzToken
         - jobSubmissionInterfaceId
         - unicoreJobSubmission
        """
        self.send_updateUnicoreJobSubmissionDetails(authzToken, jobSubmissionInterfaceId, unicoreJobSubmission)
        return self.recv_updateUnicoreJobSubmissionDetails()

    def send_updateUnicoreJobSubmissionDetails(self, authzToken, jobSubmissionInterfaceId, unicoreJobSubmission):
        self._oprot.writeMessageBegin('updateUnicoreJobSubmissionDetails', TMessageType.CALL, self._seqid)
        args = updateUnicoreJobSubmissionDetails_args()
        args.authzToken = authzToken
        args.jobSubmissionInterfaceId = jobSubmissionInterfaceId
        args.unicoreJobSubmission = unicoreJobSubmission
        args.write(self._oprot)
        self._oprot.writeMessageEnd()
        self._oprot.trans.flush()

    def recv_updateUnicoreJobSubmissionDetails(self):
        iprot = self._iprot
        (fname, mtype, rseqid) = iprot.readMessageBegin()
        if mtype == TMessageType.EXCEPTION:
            x = TApplicationException()
            x.read(iprot)
            iprot.readMessageEnd()
            raise x
        result = updateUnicoreJobSubmissionDetails_result()
        result.read(iprot)
        iprot.readMessageEnd()
        if result.success is not None:
            return result.success
        if result.ire is not None:
            raise result.ire
        if result.ace is not None:
            raise result.ace
        if result.ase is not None:
            raise result.ase
        if result.ae is not None:
            raise result.ae
        raise TApplicationException(TApplicationException.MISSING_RESULT, "updateUnicoreJobSubmissionDetails failed: unknown result")

    def addLocalDataMovementDetails(self, authzToken, productUri, dataMoveType, priorityOrder, localDataMovement):
        """

        Add a Local data movement details to a compute resource
         App catalog will return a dataMovementInterfaceId which will be added to the dataMovementInterfaces.

        @param productUri
          The identifier of the compute resource to which JobSubmission protocol to be added

        @param DMType
          DMType object to be added to the resource.

        @param priorityOrder
          Specify the priority of this job manager. If this is the only jobmanager, the priority can be zero.

        @param localDataMovement
          The LOCALDataMovement object to be added to the resource.

        @return status
          Returns the unique job submission id.



        Parameters:
         - authzToken
         - productUri
         - dataMoveType
         - priorityOrder
         - localDataMovement
        """
        self.send_addLocalDataMovementDetails(authzToken, productUri, dataMoveType, priorityOrder, localDataMovement)
        return self.recv_addLocalDataMovementDetails()

    def send_addLocalDataMovementDetails(self, authzToken, productUri, dataMoveType, priorityOrder, localDataMovement):
        self._oprot.writeMessageBegin('addLocalDataMovementDetails', TMessageType.CALL, self._seqid)
        args = addLocalDataMovementDetails_args()
        args.authzToken = authzToken
        args.productUri = productUri
        args.dataMoveType = dataMoveType
        args.priorityOrder = priorityOrder
        args.localDataMovement = localDataMovement
        args.write(self._oprot)
        self._oprot.writeMessageEnd()
        self._oprot.trans.flush()

    def recv_addLocalDataMovementDetails(self):
        iprot = self._iprot
        (fname, mtype, rseqid) = iprot.readMessageBegin()
        if mtype == TMessageType.EXCEPTION:
            x = TApplicationException()
            x.read(iprot)
            iprot.readMessageEnd()
            raise x
        result = addLocalDataMovementDetails_result()
        result.read(iprot)
        iprot.readMessageEnd()
        if result.success is not None:
            return result.success
        if result.ire is not None:
            raise result.ire
        if result.ace is not None:
            raise result.ace
        if result.ase is not None:
            raise result.ase
        if result.ae is not None:
            raise result.ae
        raise TApplicationException(TApplicationException.MISSING_RESULT, "addLocalDataMovementDetails failed: unknown result")

    def updateLocalDataMovementDetails(self, authzToken, dataMovementInterfaceId, localDataMovement):
        """

        Update the given Local data movement details

        @param dataMovementInterfaceId
          The identifier of the data movement Interface to be updated.

        @param localDataMovement
          The LOCALDataMovement object to be updated.

        @return status
          Returns a success/failure of the update.



        Parameters:
         - authzToken
         - dataMovementInterfaceId
         - localDataMovement
        """
        self.send_updateLocalDataMovementDetails(authzToken, dataMovementInterfaceId, localDataMovement)
        return self.recv_updateLocalDataMovementDetails()

    def send_updateLocalDataMovementDetails(self, authzToken, dataMovementInterfaceId, localDataMovement):
        self._oprot.writeMessageBegin('updateLocalDataMovementDetails', TMessageType.CALL, self._seqid)
        args = updateLocalDataMovementDetails_args()
        args.authzToken = authzToken
        args.dataMovementInterfaceId = dataMovementInterfaceId
        args.localDataMovement = localDataMovement
        args.write(self._oprot)
        self._oprot.writeMessageEnd()
        self._oprot.trans.flush()

    def recv_updateLocalDataMovementDetails(self):
        iprot = self._iprot
        (fname, mtype, rseqid) = iprot.readMessageBegin()
        if mtype == TMessageType.EXCEPTION:
            x = TApplicationException()
            x.read(iprot)
            iprot.readMessageEnd()
            raise x
        result = updateLocalDataMovementDetails_result()
        result.read(iprot)
        iprot.readMessageEnd()
        if result.success is not None:
            return result.success
        if result.ire is not None:
            raise result.ire
        if result.ace is not None:
            raise result.ace
        if result.ase is not None:
            raise result.ase
        if result.ae is not None:
            raise result.ae
        raise TApplicationException(TApplicationException.MISSING_RESULT, "updateLocalDataMovementDetails failed: unknown result")

    def getLocalDataMovement(self, authzToken, dataMovementId):
        """

        This method returns local datamovement object.

        @param dataMovementId
          The identifier of the datamovement Interface to be retrieved.

         @return LOCALDataMovement instance



        Parameters:
         - authzToken
         - dataMovementId
        """
        self.send_getLocalDataMovement(authzToken, dataMovementId)
        return self.recv_getLocalDataMovement()

    def send_getLocalDataMovement(self, authzToken, dataMovementId):
        self._oprot.writeMessageBegin('getLocalDataMovement', TMessageType.CALL, self._seqid)
        args = getLocalDataMovement_args()
        args.authzToken = authzToken
        args.dataMovementId = dataMovementId
        args.write(self._oprot)
        self._oprot.writeMessageEnd()
        self._oprot.trans.flush()

    def recv_getLocalDataMovement(self):
        iprot = self._iprot
        (fname, mtype, rseqid) = iprot.readMessageBegin()
        if mtype == TMessageType.EXCEPTION:
            x = TApplicationException()
            x.read(iprot)
            iprot.readMessageEnd()
            raise x
        result = getLocalDataMovement_result()
        result.read(iprot)
        iprot.readMessageEnd()
        if result.success is not None:
            return result.success
        if result.ire is not None:
            raise result.ire
        if result.ace is not None:
            raise result.ace
        if result.ase is not None:
            raise result.ase
        if result.ae is not None:
            raise result.ae
        raise TApplicationException(TApplicationException.MISSING_RESULT, "getLocalDataMovement failed: unknown result")

    def addSCPDataMovementDetails(self, authzToken, productUri, dataMoveType, priorityOrder, scpDataMovement):
        """

        Add a SCP data movement details to a compute resource
         App catalog will return a dataMovementInterfaceId which will be added to the dataMovementInterfaces.

        @param productUri
          The identifier of the compute resource to which JobSubmission protocol to be added

        @param priorityOrder
          Specify the priority of this job manager. If this is the only jobmanager, the priority can be zero.

        @param scpDataMovement
          The SCPDataMovement object to be added to the resource.

        @return status
          Returns the unique job submission id.


        Parameters:
         - authzToken
         - productUri
         - dataMoveType
         - priorityOrder
         - scpDataMovement
        """
        self.send_addSCPDataMovementDetails(authzToken, productUri, dataMoveType, priorityOrder, scpDataMovement)
        return self.recv_addSCPDataMovementDetails()

    def send_addSCPDataMovementDetails(self, authzToken, productUri, dataMoveType, priorityOrder, scpDataMovement):
        self._oprot.writeMessageBegin('addSCPDataMovementDetails', TMessageType.CALL, self._seqid)
        args = addSCPDataMovementDetails_args()
        args.authzToken = authzToken
        args.productUri = productUri
        args.dataMoveType = dataMoveType
        args.priorityOrder = priorityOrder
        args.scpDataMovement = scpDataMovement
        args.write(self._oprot)
        self._oprot.writeMessageEnd()
        self._oprot.trans.flush()

    def recv_addSCPDataMovementDetails(self):
        iprot = self._iprot
        (fname, mtype, rseqid) = iprot.readMessageBegin()
        if mtype == TMessageType.EXCEPTION:
            x = TApplicationException()
            x.read(iprot)
            iprot.readMessageEnd()
            raise x
        result = addSCPDataMovementDetails_result()
        result.read(iprot)
        iprot.readMessageEnd()
        if result.success is not None:
            return result.success
        if result.ire is not None:
            raise result.ire
        if result.ace is not None:
            raise result.ace
        if result.ase is not None:
            raise result.ase
        if result.ae is not None:
            raise result.ae
        raise TApplicationException(TApplicationException.MISSING_RESULT, "addSCPDataMovementDetails failed: unknown result")

    def updateSCPDataMovementDetails(self, authzToken, dataMovementInterfaceId, scpDataMovement):
        """

        Update the given scp data movement details
         App catalog will return a dataMovementInterfaceId which will be added to the dataMovementInterfaces.

        @param dataMovementInterfaceId
          The identifier of the data movement Interface to be updated.

        @param scpDataMovement
          The SCPDataMovement object to be updated.

        @return status
          Returns a success/failure of the update.


        Parameters:
         - authzToken
         - dataMovementInterfaceId
         - scpDataMovement
        """
        self.send_updateSCPDataMovementDetails(authzToken, dataMovementInterfaceId, scpDataMovement)
        return self.recv_updateSCPDataMovementDetails()

    def send_updateSCPDataMovementDetails(self, authzToken, dataMovementInterfaceId, scpDataMovement):
        self._oprot.writeMessageBegin('updateSCPDataMovementDetails', TMessageType.CALL, self._seqid)
        args = updateSCPDataMovementDetails_args()
        args.authzToken = authzToken
        args.dataMovementInterfaceId = dataMovementInterfaceId
        args.scpDataMovement = scpDataMovement
        args.write(self._oprot)
        self._oprot.writeMessageEnd()
        self._oprot.trans.flush()

    def recv_updateSCPDataMovementDetails(self):
        iprot = self._iprot
        (fname, mtype, rseqid) = iprot.readMessageBegin()
        if mtype == TMessageType.EXCEPTION:
            x = TApplicationException()
            x.read(iprot)
            iprot.readMessageEnd()
            raise x
        result = updateSCPDataMovementDetails_result()
        result.read(iprot)
        iprot.readMessageEnd()
        if result.success is not None:
            return result.success
        if result.ire is not None:
            raise result.ire
        if result.ace is not None:
            raise result.ace
        if result.ase is not None:
            raise result.ase
        if result.ae is not None:
            raise result.ae
        raise TApplicationException(TApplicationException.MISSING_RESULT, "updateSCPDataMovementDetails failed: unknown result")

    def getSCPDataMovement(self, authzToken, dataMovementId):
        """
        This method returns SCP datamovement object

        @param dataMovementId
          The identifier of the datamovement Interface to be retrieved.

        @return SCPDataMovement instance



        Parameters:
         - authzToken
         - dataMovementId
        """
        self.send_getSCPDataMovement(authzToken, dataMovementId)
        return self.recv_getSCPDataMovement()

    def send_getSCPDataMovement(self, authzToken, dataMovementId):
        self._oprot.writeMessageBegin('getSCPDataMovement', TMessageType.CALL, self._seqid)
        args = getSCPDataMovement_args()
        args.authzToken = authzToken
        args.dataMovementId = dataMovementId
        args.write(self._oprot)
        self._oprot.writeMessageEnd()
        self._oprot.trans.flush()

    def recv_getSCPDataMovement(self):
        iprot = self._iprot
        (fname, mtype, rseqid) = iprot.readMessageBegin()
        if mtype == TMessageType.EXCEPTION:
            x = TApplicationException()
            x.read(iprot)
            iprot.readMessageEnd()
            raise x
        result = getSCPDataMovement_result()
        result.read(iprot)
        iprot.readMessageEnd()
        if result.success is not None:
            return result.success
        if result.ire is not None:
            raise result.ire
        if result.ace is not None:
            raise result.ace
        if result.ase is not None:
            raise result.ase
        if result.ae is not None:
            raise result.ae
        raise TApplicationException(TApplicationException.MISSING_RESULT, "getSCPDataMovement failed: unknown result")

    def addUnicoreDataMovementDetails(self, authzToken, productUri, dataMoveType, priorityOrder, unicoreDataMovement):
        """

        Add a UNICORE data movement details to a compute resource
         App catalog will return a dataMovementInterfaceId which will be added to the dataMovementInterfaces.

        @param productUri
          The identifier of the compute resource to which data movement protocol to be added

        @param priorityOrder
          Specify the priority of this job manager. If this is the only jobmanager, the priority can be zero.

        @param UnicoreDataMovement
          The UnicoreDataMovement object to be added to the resource.

        @return status
          Returns the unique data movement id.


        Parameters:
         - authzToken
         - productUri
         - dataMoveType
         - priorityOrder
         - unicoreDataMovement
        """
        self.send_addUnicoreDataMovementDetails(authzToken, productUri, dataMoveType, priorityOrder, unicoreDataMovement)
        return self.recv_addUnicoreDataMovementDetails()

    def send_addUnicoreDataMovementDetails(self, authzToken, productUri, dataMoveType, priorityOrder, unicoreDataMovement):
        self._oprot.writeMessageBegin('addUnicoreDataMovementDetails', TMessageType.CALL, self._seqid)
        args = addUnicoreDataMovementDetails_args()
        args.authzToken = authzToken
        args.productUri = productUri
        args.dataMoveType = dataMoveType
        args.priorityOrder = priorityOrder
        args.unicoreDataMovement = unicoreDataMovement
        args.write(self._oprot)
        self._oprot.writeMessageEnd()
        self._oprot.trans.flush()

    def recv_addUnicoreDataMovementDetails(self):
        iprot = self._iprot
        (fname, mtype, rseqid) = iprot.readMessageBegin()
        if mtype == TMessageType.EXCEPTION:
            x = TApplicationException()
            x.read(iprot)
            iprot.readMessageEnd()
            raise x
        result = addUnicoreDataMovementDetails_result()
        result.read(iprot)
        iprot.readMessageEnd()
        if result.success is not None:
            return result.success
        if result.ire is not None:
            raise result.ire
        if result.ace is not None:
            raise result.ace
        if result.ase is not None:
            raise result.ase
        if result.ae is not None:
            raise result.ae
        raise TApplicationException(TApplicationException.MISSING_RESULT, "addUnicoreDataMovementDetails failed: unknown result")

    def updateUnicoreDataMovementDetails(self, authzToken, dataMovementInterfaceId, unicoreDataMovement):
        """

        Update a selected UNICORE data movement details
         App catalog will return a dataMovementInterfaceId which will be added to the dataMovementInterfaces.

        @param dataMovementInterfaceId
          The identifier of the data movement Interface to be updated.

        @param UnicoreDataMovement
          The UnicoreDataMovement object to be updated.

        @return status
          Returns a success/failure of the update.



        Parameters:
         - authzToken
         - dataMovementInterfaceId
         - unicoreDataMovement
        """
        self.send_updateUnicoreDataMovementDetails(authzToken, dataMovementInterfaceId, unicoreDataMovement)
        return self.recv_updateUnicoreDataMovementDetails()

    def send_updateUnicoreDataMovementDetails(self, authzToken, dataMovementInterfaceId, unicoreDataMovement):
        self._oprot.writeMessageBegin('updateUnicoreDataMovementDetails', TMessageType.CALL, self._seqid)
        args = updateUnicoreDataMovementDetails_args()
        args.authzToken = authzToken
        args.dataMovementInterfaceId = dataMovementInterfaceId
        args.unicoreDataMovement = unicoreDataMovement
        args.write(self._oprot)
        self._oprot.writeMessageEnd()
        self._oprot.trans.flush()

    def recv_updateUnicoreDataMovementDetails(self):
        iprot = self._iprot
        (fname, mtype, rseqid) = iprot.readMessageBegin()
        if mtype == TMessageType.EXCEPTION:
            x = TApplicationException()
            x.read(iprot)
            iprot.readMessageEnd()
            raise x
        result = updateUnicoreDataMovementDetails_result()
        result.read(iprot)
        iprot.readMessageEnd()
        if result.success is not None:
            return result.success
        if result.ire is not None:
            raise result.ire
        if result.ace is not None:
            raise result.ace
        if result.ase is not None:
            raise result.ase
        if result.ae is not None:
            raise result.ae
        raise TApplicationException(TApplicationException.MISSING_RESULT, "updateUnicoreDataMovementDetails failed: unknown result")

    def getUnicoreDataMovement(self, authzToken, dataMovementId):
        """

        This method returns UNICORE datamovement object

        @param dataMovementId
          The identifier of the datamovement Interface to be retrieved.

        @return UnicoreDataMovement instance



        Parameters:
         - authzToken
         - dataMovementId
        """
        self.send_getUnicoreDataMovement(authzToken, dataMovementId)
        return self.recv_getUnicoreDataMovement()

    def send_getUnicoreDataMovement(self, authzToken, dataMovementId):
        self._oprot.writeMessageBegin('getUnicoreDataMovement', TMessageType.CALL, self._seqid)
        args = getUnicoreDataMovement_args()
        args.authzToken = authzToken
        args.dataMovementId = dataMovementId
        args.write(self._oprot)
        self._oprot.writeMessageEnd()
        self._oprot.trans.flush()

    def recv_getUnicoreDataMovement(self):
        iprot = self._iprot
        (fname, mtype, rseqid) = iprot.readMessageBegin()
        if mtype == TMessageType.EXCEPTION:
            x = TApplicationException()
            x.read(iprot)
            iprot.readMessageEnd()
            raise x
        result = getUnicoreDataMovement_result()
        result.read(iprot)
        iprot.readMessageEnd()
        if result.success is not None:
            return result.success
        if result.ire is not None:
            raise result.ire
        if result.ace is not None:
            raise result.ace
        if result.ase is not None:
            raise result.ase
        if result.ae is not None:
            raise result.ae
        raise TApplicationException(TApplicationException.MISSING_RESULT, "getUnicoreDataMovement failed: unknown result")

    def addGridFTPDataMovementDetails(self, authzToken, productUri, dataMoveType, priorityOrder, gridFTPDataMovement):
        """

        Add a GridFTP data movement details to a compute resource
         App catalog will return a dataMovementInterfaceId which will be added to the dataMovementInterfaces.

        @param productUri
          The identifier of the compute resource to which dataMovement protocol to be added

        @param DMType
           The DMType object to be added to the resource.

        @param priorityOrder
          Specify the priority of this job manager. If this is the only jobmanager, the priority can be zero.

        @param gridFTPDataMovement
          The GridFTPDataMovement object to be added to the resource.

        @return status
          Returns the unique data movement id.



        Parameters:
         - authzToken
         - productUri
         - dataMoveType
         - priorityOrder
         - gridFTPDataMovement
        """
        self.send_addGridFTPDataMovementDetails(authzToken, productUri, dataMoveType, priorityOrder, gridFTPDataMovement)
        return self.recv_addGridFTPDataMovementDetails()

    def send_addGridFTPDataMovementDetails(self, authzToken, productUri, dataMoveType, priorityOrder, gridFTPDataMovement):
        self._oprot.writeMessageBegin('addGridFTPDataMovementDetails', TMessageType.CALL, self._seqid)
        args = addGridFTPDataMovementDetails_args()
        args.authzToken = authzToken
        args.productUri = productUri
        args.dataMoveType = dataMoveType
        args.priorityOrder = priorityOrder
        args.gridFTPDataMovement = gridFTPDataMovement
        args.write(self._oprot)
        self._oprot.writeMessageEnd()
        self._oprot.trans.flush()

    def recv_addGridFTPDataMovementDetails(self):
        iprot = self._iprot
        (fname, mtype, rseqid) = iprot.readMessageBegin()
        if mtype == TMessageType.EXCEPTION:
            x = TApplicationException()
            x.read(iprot)
            iprot.readMessageEnd()
            raise x
        result = addGridFTPDataMovementDetails_result()
        result.read(iprot)
        iprot.readMessageEnd()
        if result.success is not None:
            return result.success
        if result.ire is not None:
            raise result.ire
        if result.ace is not None:
            raise result.ace
        if result.ase is not None:
            raise result.ase
        if result.ae is not None:
            raise result.ae
        raise TApplicationException(TApplicationException.MISSING_RESULT, "addGridFTPDataMovementDetails failed: unknown result")

    def updateGridFTPDataMovementDetails(self, authzToken, dataMovementInterfaceId, gridFTPDataMovement):
        """
        Update the given GridFTP data movement details to a compute resource
         App catalog will return a dataMovementInterfaceId which will be added to the dataMovementInterfaces.

        @param dataMovementInterfaceId
          The identifier of the data movement Interface to be updated.

        @param gridFTPDataMovement
          The GridFTPDataMovement object to be updated.

        @return boolean
          Returns a success/failure of the update.



        Parameters:
         - authzToken
         - dataMovementInterfaceId
         - gridFTPDataMovement
        """
        self.send_updateGridFTPDataMovementDetails(authzToken, dataMovementInterfaceId, gridFTPDataMovement)
        return self.recv_updateGridFTPDataMovementDetails()

    def send_updateGridFTPDataMovementDetails(self, authzToken, dataMovementInterfaceId, gridFTPDataMovement):
        self._oprot.writeMessageBegin('updateGridFTPDataMovementDetails', TMessageType.CALL, self._seqid)
        args = updateGridFTPDataMovementDetails_args()
        args.authzToken = authzToken
        args.dataMovementInterfaceId = dataMovementInterfaceId
        args.gridFTPDataMovement = gridFTPDataMovement
        args.write(self._oprot)
        self._oprot.writeMessageEnd()
        self._oprot.trans.flush()

    def recv_updateGridFTPDataMovementDetails(self):
        iprot = self._iprot
        (fname, mtype, rseqid) = iprot.readMessageBegin()
        if mtype == TMessageType.EXCEPTION:
            x = TApplicationException()
            x.read(iprot)
            iprot.readMessageEnd()
            raise x
        result = updateGridFTPDataMovementDetails_result()
        result.read(iprot)
        iprot.readMessageEnd()
        if result.success is not None:
            return result.success
        if result.ire is not None:
            raise result.ire
        if result.ace is not None:
            raise result.ace
        if result.ase is not None:
            raise result.ase
        if result.ae is not None:
            raise result.ae
        raise TApplicationException(TApplicationException.MISSING_RESULT, "updateGridFTPDataMovementDetails failed: unknown result")

    def getGridFTPDataMovement(self, authzToken, dataMovementId):
        """
        This method returns GridFTP datamovement object

        @param dataMovementId
          The identifier of the datamovement Interface to be retrieved.

         @return GridFTPDataMovement instance



        Parameters:
         - authzToken
         - dataMovementId
        """
        self.send_getGridFTPDataMovement(authzToken, dataMovementId)
        return self.recv_getGridFTPDataMovement()

    def send_getGridFTPDataMovement(self, authzToken, dataMovementId):
        self._oprot.writeMessageBegin('getGridFTPDataMovement', TMessageType.CALL, self._seqid)
        args = getGridFTPDataMovement_args()
        args.authzToken = authzToken
        args.dataMovementId = dataMovementId
        args.write(self._oprot)
        self._oprot.writeMessageEnd()
        self._oprot.trans.flush()

    def recv_getGridFTPDataMovement(self):
        iprot = self._iprot
        (fname, mtype, rseqid) = iprot.readMessageBegin()
        if mtype == TMessageType.EXCEPTION:
            x = TApplicationException()
            x.read(iprot)
            iprot.readMessageEnd()
            raise x
        result = getGridFTPDataMovement_result()
        result.read(iprot)
        iprot.readMessageEnd()
        if result.success is not None:
            return result.success
        if result.ire is not None:
            raise result.ire
        if result.ace is not None:
            raise result.ace
        if result.ase is not None:
            raise result.ase
        if result.ae is not None:
            raise result.ae
        raise TApplicationException(TApplicationException.MISSING_RESULT, "getGridFTPDataMovement failed: unknown result")

    def changeJobSubmissionPriority(self, authzToken, jobSubmissionInterfaceId, newPriorityOrder):
        """
        Change the priority of a given job submisison interface

        @param jobSubmissionInterfaceId
          The identifier of the JobSubmission Interface to be changed

        @param priorityOrder
          The new priority of the job manager interface.

        @return status
          Returns a success/failure of the change.



        Parameters:
         - authzToken
         - jobSubmissionInterfaceId
         - newPriorityOrder
        """
        self.send_changeJobSubmissionPriority(authzToken, jobSubmissionInterfaceId, newPriorityOrder)
        return self.recv_changeJobSubmissionPriority()

    def send_changeJobSubmissionPriority(self, authzToken, jobSubmissionInterfaceId, newPriorityOrder):
        self._oprot.writeMessageBegin('changeJobSubmissionPriority', TMessageType.CALL, self._seqid)
        args = changeJobSubmissionPriority_args()
        args.authzToken = authzToken
        args.jobSubmissionInterfaceId = jobSubmissionInterfaceId
        args.newPriorityOrder = newPriorityOrder
        args.write(self._oprot)
        self._oprot.writeMessageEnd()
        self._oprot.trans.flush()

    def recv_changeJobSubmissionPriority(self):
        iprot = self._iprot
        (fname, mtype, rseqid) = iprot.readMessageBegin()
        if mtype == TMessageType.EXCEPTION:
            x = TApplicationException()
            x.read(iprot)
            iprot.readMessageEnd()
            raise x
        result = changeJobSubmissionPriority_result()
        result.read(iprot)
        iprot.readMessageEnd()
        if result.success is not None:
            return result.success
        if result.ire is not None:
            raise result.ire
        if result.ace is not None:
            raise result.ace
        if result.ase is not None:
            raise result.ase
        if result.ae is not None:
            raise result.ae
        raise TApplicationException(TApplicationException.MISSING_RESULT, "changeJobSubmissionPriority failed: unknown result")

    def changeDataMovementPriority(self, authzToken, dataMovementInterfaceId, newPriorityOrder):
        """
        Change the priority of a given data movement interface

        @param dataMovementInterfaceId
          The identifier of the DataMovement Interface to be changed

        @param priorityOrder
          The new priority of the data movement interface.

        @return status
          Returns a success/failure of the change.



        Parameters:
         - authzToken
         - dataMovementInterfaceId
         - newPriorityOrder
        """
        self.send_changeDataMovementPriority(authzToken, dataMovementInterfaceId, newPriorityOrder)
        return self.recv_changeDataMovementPriority()

    def send_changeDataMovementPriority(self, authzToken, dataMovementInterfaceId, newPriorityOrder):
        self._oprot.writeMessageBegin('changeDataMovementPriority', TMessageType.CALL, self._seqid)
        args = changeDataMovementPriority_args()
        args.authzToken = authzToken
        args.dataMovementInterfaceId = dataMovementInterfaceId
        args.newPriorityOrder = newPriorityOrder
        args.write(self._oprot)
        self._oprot.writeMessageEnd()
        self._oprot.trans.flush()

    def recv_changeDataMovementPriority(self):
        iprot = self._iprot
        (fname, mtype, rseqid) = iprot.readMessageBegin()
        if mtype == TMessageType.EXCEPTION:
            x = TApplicationException()
            x.read(iprot)
            iprot.readMessageEnd()
            raise x
        result = changeDataMovementPriority_result()
        result.read(iprot)
        iprot.readMessageEnd()
        if result.success is not None:
            return result.success
        if result.ire is not None:
            raise result.ire
        if result.ace is not None:
            raise result.ace
        if result.ase is not None:
            raise result.ase
        if result.ae is not None:
            raise result.ae
        raise TApplicationException(TApplicationException.MISSING_RESULT, "changeDataMovementPriority failed: unknown result")

    def changeJobSubmissionPriorities(self, authzToken, jobSubmissionPriorityMap):
        """
        Change the priorities of a given set of job submission interfaces

        @param jobSubmissionPriorityMap
          A Map of identifiers of the JobSubmission Interfaces and thier associated priorities to be set.

        @return status
          Returns a success/failure of the changes.


        Parameters:
         - authzToken
         - jobSubmissionPriorityMap
        """
        self.send_changeJobSubmissionPriorities(authzToken, jobSubmissionPriorityMap)
        return self.recv_changeJobSubmissionPriorities()

    def send_changeJobSubmissionPriorities(self, authzToken, jobSubmissionPriorityMap):
        self._oprot.writeMessageBegin('changeJobSubmissionPriorities', TMessageType.CALL, self._seqid)
        args = changeJobSubmissionPriorities_args()
        args.authzToken = authzToken
        args.jobSubmissionPriorityMap = jobSubmissionPriorityMap
        args.write(self._oprot)
        self._oprot.writeMessageEnd()
        self._oprot.trans.flush()

    def recv_changeJobSubmissionPriorities(self):
        iprot = self._iprot
        (fname, mtype, rseqid) = iprot.readMessageBegin()
        if mtype == TMessageType.EXCEPTION:
            x = TApplicationException()
            x.read(iprot)
            iprot.readMessageEnd()
            raise x
        result = changeJobSubmissionPriorities_result()
        result.read(iprot)
        iprot.readMessageEnd()
        if result.success is not None:
            return result.success
        if result.ire is not None:
            raise result.ire
        if result.ace is not None:
            raise result.ace
        if result.ase is not None:
            raise result.ase
        if result.ae is not None:
            raise result.ae
        raise TApplicationException(TApplicationException.MISSING_RESULT, "changeJobSubmissionPriorities failed: unknown result")

    def changeDataMovementPriorities(self, authzToken, dataMovementPriorityMap):
        """
        Change the priorities of a given set of data movement interfaces

        @param dataMovementPriorityMap
          A Map of identifiers of the DataMovement Interfaces and thier associated priorities to be set.

        @return status
          Returns a success/failure of the changes.



        Parameters:
         - authzToken
         - dataMovementPriorityMap
        """
        self.send_changeDataMovementPriorities(authzToken, dataMovementPriorityMap)
        return self.recv_changeDataMovementPriorities()

    def send_changeDataMovementPriorities(self, authzToken, dataMovementPriorityMap):
        self._oprot.writeMessageBegin('changeDataMovementPriorities', TMessageType.CALL, self._seqid)
        args = changeDataMovementPriorities_args()
        args.authzToken = authzToken
        args.dataMovementPriorityMap = dataMovementPriorityMap
        args.write(self._oprot)
        self._oprot.writeMessageEnd()
        self._oprot.trans.flush()

    def recv_changeDataMovementPriorities(self):
        iprot = self._iprot
        (fname, mtype, rseqid) = iprot.readMessageBegin()
        if mtype == TMessageType.EXCEPTION:
            x = TApplicationException()
            x.read(iprot)
            iprot.readMessageEnd()
            raise x
        result = changeDataMovementPriorities_result()
        result.read(iprot)
        iprot.readMessageEnd()
        if result.success is not None:
            return result.success
        if result.ire is not None:
            raise result.ire
        if result.ace is not None:
            raise result.ace
        if result.ase is not None:
            raise result.ase
        if result.ae is not None:
            raise result.ae
        raise TApplicationException(TApplicationException.MISSING_RESULT, "changeDataMovementPriorities failed: unknown result")

    def deleteJobSubmissionInterface(self, authzToken, computeResourceId, jobSubmissionInterfaceId):
        """
        Delete a given job submisison interface

        @param jobSubmissionInterfaceId
          The identifier of the JobSubmission Interface to be changed

        @return status
          Returns a success/failure of the deletion.



        Parameters:
         - authzToken
         - computeResourceId
         - jobSubmissionInterfaceId
        """
        self.send_deleteJobSubmissionInterface(authzToken, computeResourceId, jobSubmissionInterfaceId)
        return self.recv_deleteJobSubmissionInterface()

    def send_deleteJobSubmissionInterface(self, authzToken, computeResourceId, jobSubmissionInterfaceId):
        self._oprot.writeMessageBegin('deleteJobSubmissionInterface', TMessageType.CALL, self._seqid)
        args = deleteJobSubmissionInterface_args()
        args.authzToken = authzToken
        args.computeResourceId = computeResourceId
        args.jobSubmissionInterfaceId = jobSubmissionInterfaceId
        args.write(self._oprot)
        self._oprot.writeMessageEnd()
        self._oprot.trans.flush()

    def recv_deleteJobSubmissionInterface(self):
        iprot = self._iprot
        (fname, mtype, rseqid) = iprot.readMessageBegin()
        if mtype == TMessageType.EXCEPTION:
            x = TApplicationException()
            x.read(iprot)
            iprot.readMessageEnd()
            raise x
        result = deleteJobSubmissionInterface_result()
        result.read(iprot)
        iprot.readMessageEnd()
        if result.success is not None:
            return result.success
        if result.ire is not None:
            raise result.ire
        if result.ace is not None:
            raise result.ace
        if result.ase is not None:
            raise result.ase
        if result.ae is not None:
            raise result.ae
        raise TApplicationException(TApplicationException.MISSING_RESULT, "deleteJobSubmissionInterface failed: unknown result")

    def deleteDataMovementInterface(self, authzToken, productUri, dataMovementInterfaceId, dataMoveType):
        """
        Delete a given data movement interface

        @param dataMovementInterfaceId
          The identifier of the DataMovement Interface to be changed

        @return status
          Returns a success/failure of the deletion.



        Parameters:
         - authzToken
         - productUri
         - dataMovementInterfaceId
         - dataMoveType
        """
        self.send_deleteDataMovementInterface(authzToken, productUri, dataMovementInterfaceId, dataMoveType)
        return self.recv_deleteDataMovementInterface()

    def send_deleteDataMovementInterface(self, authzToken, productUri, dataMovementInterfaceId, dataMoveType):
        self._oprot.writeMessageBegin('deleteDataMovementInterface', TMessageType.CALL, self._seqid)
        args = deleteDataMovementInterface_args()
        args.authzToken = authzToken
        args.productUri = productUri
        args.dataMovementInterfaceId = dataMovementInterfaceId
        args.dataMoveType = dataMoveType
        args.write(self._oprot)
        self._oprot.writeMessageEnd()
        self._oprot.trans.flush()

    def recv_deleteDataMovementInterface(self):
        iprot = self._iprot
        (fname, mtype, rseqid) = iprot.readMessageBegin()
        if mtype == TMessageType.EXCEPTION:
            x = TApplicationException()
            x.read(iprot)
            iprot.readMessageEnd()
            raise x
        result = deleteDataMovementInterface_result()
        result.read(iprot)
        iprot.readMessageEnd()
        if result.success is not None:
            return result.success
        if result.ire is not None:
            raise result.ire
        if result.ace is not None:
            raise result.ace
        if result.ase is not None:
            raise result.ase
        if result.ae is not None:
            raise result.ae
        raise TApplicationException(TApplicationException.MISSING_RESULT, "deleteDataMovementInterface failed: unknown result")

    def registerResourceJobManager(self, authzToken, resourceJobManager):
        """
        Parameters:
         - authzToken
         - resourceJobManager
        """
        self.send_registerResourceJobManager(authzToken, resourceJobManager)
        return self.recv_registerResourceJobManager()

    def send_registerResourceJobManager(self, authzToken, resourceJobManager):
        self._oprot.writeMessageBegin('registerResourceJobManager', TMessageType.CALL, self._seqid)
        args = registerResourceJobManager_args()
        args.authzToken = authzToken
        args.resourceJobManager = resourceJobManager
        args.write(self._oprot)
        self._oprot.writeMessageEnd()
        self._oprot.trans.flush()

    def recv_registerResourceJobManager(self):
        iprot = self._iprot
        (fname, mtype, rseqid) = iprot.readMessageBegin()
        if mtype == TMessageType.EXCEPTION:
            x = TApplicationException()
            x.read(iprot)
            iprot.readMessageEnd()
            raise x
        result = registerResourceJobManager_result()
        result.read(iprot)
        iprot.readMessageEnd()
        if result.success is not None:
            return result.success
        if result.ire is not None:
            raise result.ire
        if result.ace is not None:
            raise result.ace
        if result.ase is not None:
            raise result.ase
        if result.ae is not None:
            raise result.ae
        raise TApplicationException(TApplicationException.MISSING_RESULT, "registerResourceJobManager failed: unknown result")

    def updateResourceJobManager(self, authzToken, resourceJobManagerId, updatedResourceJobManager):
        """
        Parameters:
         - authzToken
         - resourceJobManagerId
         - updatedResourceJobManager
        """
        self.send_updateResourceJobManager(authzToken, resourceJobManagerId, updatedResourceJobManager)
        return self.recv_updateResourceJobManager()

    def send_updateResourceJobManager(self, authzToken, resourceJobManagerId, updatedResourceJobManager):
        self._oprot.writeMessageBegin('updateResourceJobManager', TMessageType.CALL, self._seqid)
        args = updateResourceJobManager_args()
        args.authzToken = authzToken
        args.resourceJobManagerId = resourceJobManagerId
        args.updatedResourceJobManager = updatedResourceJobManager
        args.write(self._oprot)
        self._oprot.writeMessageEnd()
        self._oprot.trans.flush()

    def recv_updateResourceJobManager(self):
        iprot = self._iprot
        (fname, mtype, rseqid) = iprot.readMessageBegin()
        if mtype == TMessageType.EXCEPTION:
            x = TApplicationException()
            x.read(iprot)
            iprot.readMessageEnd()
            raise x
        result = updateResourceJobManager_result()
        result.read(iprot)
        iprot.readMessageEnd()
        if result.success is not None:
            return result.success
        if result.ire is not None:
            raise result.ire
        if result.ace is not None:
            raise result.ace
        if result.ase is not None:
            raise result.ase
        if result.ae is not None:
            raise result.ae
        raise TApplicationException(TApplicationException.MISSING_RESULT, "updateResourceJobManager failed: unknown result")

    def getResourceJobManager(self, authzToken, resourceJobManagerId):
        """
        Parameters:
         - authzToken
         - resourceJobManagerId
        """
        self.send_getResourceJobManager(authzToken, resourceJobManagerId)
        return self.recv_getResourceJobManager()

    def send_getResourceJobManager(self, authzToken, resourceJobManagerId):
        self._oprot.writeMessageBegin('getResourceJobManager', TMessageType.CALL, self._seqid)
        args = getResourceJobManager_args()
        args.authzToken = authzToken
        args.resourceJobManagerId = resourceJobManagerId
        args.write(self._oprot)
        self._oprot.writeMessageEnd()
        self._oprot.trans.flush()

    def recv_getResourceJobManager(self):
        iprot = self._iprot
        (fname, mtype, rseqid) = iprot.readMessageBegin()
        if mtype == TMessageType.EXCEPTION:
            x = TApplicationException()
            x.read(iprot)
            iprot.readMessageEnd()
            raise x
        result = getResourceJobManager_result()
        result.read(iprot)
        iprot.readMessageEnd()
        if result.success is not None:
            return result.success
        if result.ire is not None:
            raise result.ire
        if result.ace is not None:
            raise result.ace
        if result.ase is not None:
            raise result.ase
        if result.ae is not None:
            raise result.ae
        raise TApplicationException(TApplicationException.MISSING_RESULT, "getResourceJobManager failed: unknown result")

    def deleteResourceJobManager(self, authzToken, resourceJobManagerId):
        """
        Parameters:
         - authzToken
         - resourceJobManagerId
        """
        self.send_deleteResourceJobManager(authzToken, resourceJobManagerId)
        return self.recv_deleteResourceJobManager()

    def send_deleteResourceJobManager(self, authzToken, resourceJobManagerId):
        self._oprot.writeMessageBegin('deleteResourceJobManager', TMessageType.CALL, self._seqid)
        args = deleteResourceJobManager_args()
        args.authzToken = authzToken
        args.resourceJobManagerId = resourceJobManagerId
        args.write(self._oprot)
        self._oprot.writeMessageEnd()
        self._oprot.trans.flush()

    def recv_deleteResourceJobManager(self):
        iprot = self._iprot
        (fname, mtype, rseqid) = iprot.readMessageBegin()
        if mtype == TMessageType.EXCEPTION:
            x = TApplicationException()
            x.read(iprot)
            iprot.readMessageEnd()
            raise x
        result = deleteResourceJobManager_result()
        result.read(iprot)
        iprot.readMessageEnd()
        if result.success is not None:
            return result.success
        if result.ire is not None:
            raise result.ire
        if result.ace is not None:
            raise result.ace
        if result.ase is not None:
            raise result.ase
        if result.ae is not None:
            raise result.ae
        raise TApplicationException(TApplicationException.MISSING_RESULT, "deleteResourceJobManager failed: unknown result")

    def deleteBatchQueue(self, authzToken, computeResourceId, queueName):
        """
        Delete a Compute Resource Queue

        @param computeResourceId
          The identifier of the compute resource which has the queue to be deleted

        @param queueName
          Name of the queue need to be deleted. Name is the uniqueue identifier for the queue within a compute resource

        @return status
          Returns a success/failure of the deletion.



        Parameters:
         - authzToken
         - computeResourceId
         - queueName
        """
        self.send_deleteBatchQueue(authzToken, computeResourceId, queueName)
        return self.recv_deleteBatchQueue()

    def send_deleteBatchQueue(self, authzToken, computeResourceId, queueName):
        self._oprot.writeMessageBegin('deleteBatchQueue', TMessageType.CALL, self._seqid)
        args = deleteBatchQueue_args()
        args.authzToken = authzToken
        args.computeResourceId = computeResourceId
        args.queueName = queueName
        args.write(self._oprot)
        self._oprot.writeMessageEnd()
        self._oprot.trans.flush()

    def recv_deleteBatchQueue(self):
        iprot = self._iprot
        (fname, mtype, rseqid) = iprot.readMessageBegin()
        if mtype == TMessageType.EXCEPTION:
            x = TApplicationException()
            x.read(iprot)
            iprot.readMessageEnd()
            raise x
        result = deleteBatchQueue_result()
        result.read(iprot)
        iprot.readMessageEnd()
        if result.success is not None:
            return result.success
        if result.ire is not None:
            raise result.ire
        if result.ace is not None:
            raise result.ace
        if result.ase is not None:
            raise result.ase
        if result.ae is not None:
            raise result.ae
        raise TApplicationException(TApplicationException.MISSING_RESULT, "deleteBatchQueue failed: unknown result")

    def registerGatewayResourceProfile(self, authzToken, gatewayResourceProfile):
        """
        Register a Gateway Resource Profile.

        @param gatewayResourceProfile
           Gateway Resource Profile Object.
           The GatewayID should be obtained from Airavata gateway registration and passed to register a corresponding
             resource profile.

        @return status
          Returns a success/failure of the update.


        Parameters:
         - authzToken
         - gatewayResourceProfile
        """
        self.send_registerGatewayResourceProfile(authzToken, gatewayResourceProfile)
        return self.recv_registerGatewayResourceProfile()

    def send_registerGatewayResourceProfile(self, authzToken, gatewayResourceProfile):
        self._oprot.writeMessageBegin('registerGatewayResourceProfile', TMessageType.CALL, self._seqid)
        args = registerGatewayResourceProfile_args()
        args.authzToken = authzToken
        args.gatewayResourceProfile = gatewayResourceProfile
        args.write(self._oprot)
        self._oprot.writeMessageEnd()
        self._oprot.trans.flush()

    def recv_registerGatewayResourceProfile(self):
        iprot = self._iprot
        (fname, mtype, rseqid) = iprot.readMessageBegin()
        if mtype == TMessageType.EXCEPTION:
            x = TApplicationException()
            x.read(iprot)
            iprot.readMessageEnd()
            raise x
        result = registerGatewayResourceProfile_result()
        result.read(iprot)
        iprot.readMessageEnd()
        if result.success is not None:
            return result.success
        if result.ire is not None:
            raise result.ire
        if result.ace is not None:
            raise result.ace
        if result.ase is not None:
            raise result.ase
        if result.ae is not None:
            raise result.ae
        raise TApplicationException(TApplicationException.MISSING_RESULT, "registerGatewayResourceProfile failed: unknown result")

    def getGatewayResourceProfile(self, authzToken, gatewayID):
        """
        Fetch the given Gateway Resource Profile.

        @param gatewayID
          The identifier for the requested gateway resource.

        @return gatewayResourceProfile
           Gateway Resource Profile Object.


        Parameters:
         - authzToken
         - gatewayID
        """
        self.send_getGatewayResourceProfile(authzToken, gatewayID)
        return self.recv_getGatewayResourceProfile()

    def send_getGatewayResourceProfile(self, authzToken, gatewayID):
        self._oprot.writeMessageBegin('getGatewayResourceProfile', TMessageType.CALL, self._seqid)
        args = getGatewayResourceProfile_args()
        args.authzToken = authzToken
        args.gatewayID = gatewayID
        args.write(self._oprot)
        self._oprot.writeMessageEnd()
        self._oprot.trans.flush()

    def recv_getGatewayResourceProfile(self):
        iprot = self._iprot
        (fname, mtype, rseqid) = iprot.readMessageBegin()
        if mtype == TMessageType.EXCEPTION:
            x = TApplicationException()
            x.read(iprot)
            iprot.readMessageEnd()
            raise x
        result = getGatewayResourceProfile_result()
        result.read(iprot)
        iprot.readMessageEnd()
        if result.success is not None:
            return result.success
        if result.ire is not None:
            raise result.ire
        if result.ace is not None:
            raise result.ace
        if result.ase is not None:
            raise result.ase
        if result.ae is not None:
            raise result.ae
        raise TApplicationException(TApplicationException.MISSING_RESULT, "getGatewayResourceProfile failed: unknown result")

    def updateGatewayResourceProfile(self, authzToken, gatewayID, gatewayResourceProfile):
        """
        Update a Gateway Resource Profile.

        @param gatewayID
          The identifier for the requested gateway resource to be updated.

        @param gatewayResourceProfile
           Gateway Resource Profile Object.

        @return status
          Returns a success/failure of the update.


        Parameters:
         - authzToken
         - gatewayID
         - gatewayResourceProfile
        """
        self.send_updateGatewayResourceProfile(authzToken, gatewayID, gatewayResourceProfile)
        return self.recv_updateGatewayResourceProfile()

    def send_updateGatewayResourceProfile(self, authzToken, gatewayID, gatewayResourceProfile):
        self._oprot.writeMessageBegin('updateGatewayResourceProfile', TMessageType.CALL, self._seqid)
        args = updateGatewayResourceProfile_args()
        args.authzToken = authzToken
        args.gatewayID = gatewayID
        args.gatewayResourceProfile = gatewayResourceProfile
        args.write(self._oprot)
        self._oprot.writeMessageEnd()
        self._oprot.trans.flush()

    def recv_updateGatewayResourceProfile(self):
        iprot = self._iprot
        (fname, mtype, rseqid) = iprot.readMessageBegin()
        if mtype == TMessageType.EXCEPTION:
            x = TApplicationException()
            x.read(iprot)
            iprot.readMessageEnd()
            raise x
        result = updateGatewayResourceProfile_result()
        result.read(iprot)
        iprot.readMessageEnd()
        if result.success is not None:
            return result.success
        if result.ire is not None:
            raise result.ire
        if result.ace is not None:
            raise result.ace
        if result.ase is not None:
            raise result.ase
        if result.ae is not None:
            raise result.ae
        raise TApplicationException(TApplicationException.MISSING_RESULT, "updateGatewayResourceProfile failed: unknown result")

    def deleteGatewayResourceProfile(self, authzToken, gatewayID):
        """
        Delete the given Gateway Resource Profile.

        @param gatewayID
          The identifier for the requested gateway resource to be deleted.

        @return status
          Returns a success/failure of the deletion.


        Parameters:
         - authzToken
         - gatewayID
        """
        self.send_deleteGatewayResourceProfile(authzToken, gatewayID)
        return self.recv_deleteGatewayResourceProfile()

    def send_deleteGatewayResourceProfile(self, authzToken, gatewayID):
        self._oprot.writeMessageBegin('deleteGatewayResourceProfile', TMessageType.CALL, self._seqid)
        args = deleteGatewayResourceProfile_args()
        args.authzToken = authzToken
        args.gatewayID = gatewayID
        args.write(self._oprot)
        self._oprot.writeMessageEnd()
        self._oprot.trans.flush()

    def recv_deleteGatewayResourceProfile(self):
        iprot = self._iprot
        (fname, mtype, rseqid) = iprot.readMessageBegin()
        if mtype == TMessageType.EXCEPTION:
            x = TApplicationException()
            x.read(iprot)
            iprot.readMessageEnd()
            raise x
        result = deleteGatewayResourceProfile_result()
        result.read(iprot)
        iprot.readMessageEnd()
        if result.success is not None:
            return result.success
        if result.ire is not None:
            raise result.ire
        if result.ace is not None:
            raise result.ace
        if result.ase is not None:
            raise result.ase
        if result.ae is not None:
            raise result.ae
        raise TApplicationException(TApplicationException.MISSING_RESULT, "deleteGatewayResourceProfile failed: unknown result")

    def addGatewayComputeResourcePreference(self, authzToken, gatewayID, computeResourceId, computeResourcePreference):
        """
        Add a Compute Resource Preference to a registered gateway profile.

        @param gatewayID
          The identifier for the gateway profile to be added.

        @param computeResourceId
          Preferences related to a particular compute resource

        @param computeResourcePreference
          The ComputeResourcePreference object to be added to the resource profile.

        @return status
          Returns a success/failure of the addition. If a profile already exists, this operation will fail.
           Instead an update should be used.


        Parameters:
         - authzToken
         - gatewayID
         - computeResourceId
         - computeResourcePreference
        """
        self.send_addGatewayComputeResourcePreference(authzToken, gatewayID, computeResourceId, computeResourcePreference)
        return self.recv_addGatewayComputeResourcePreference()

    def send_addGatewayComputeResourcePreference(self, authzToken, gatewayID, computeResourceId, computeResourcePreference):
        self._oprot.writeMessageBegin('addGatewayComputeResourcePreference', TMessageType.CALL, self._seqid)
        args = addGatewayComputeResourcePreference_args()
        args.authzToken = authzToken
        args.gatewayID = gatewayID
        args.computeResourceId = computeResourceId
        args.computeResourcePreference = computeResourcePreference
        args.write(self._oprot)
        self._oprot.writeMessageEnd()
        self._oprot.trans.flush()

    def recv_addGatewayComputeResourcePreference(self):
        iprot = self._iprot
        (fname, mtype, rseqid) = iprot.readMessageBegin()
        if mtype == TMessageType.EXCEPTION:
            x = TApplicationException()
            x.read(iprot)
            iprot.readMessageEnd()
            raise x
        result = addGatewayComputeResourcePreference_result()
        result.read(iprot)
        iprot.readMessageEnd()
        if result.success is not None:
            return result.success
        if result.ire is not None:
            raise result.ire
        if result.ace is not None:
            raise result.ace
        if result.ase is not None:
            raise result.ase
        if result.ae is not None:
            raise result.ae
        raise TApplicationException(TApplicationException.MISSING_RESULT, "addGatewayComputeResourcePreference failed: unknown result")

    def addGatewayStoragePreference(self, authzToken, gatewayID, storageResourceId, storagePreference):
        """
        Add a Storage Resource Preference to a registered gateway profile.

        @param gatewayID
          The identifier of the gateway profile to be added.

        @param storageResourceId
          Preferences related to a particular compute resource

        @param computeResourcePreference
          The ComputeResourcePreference object to be added to the resource profile.

        @return status
          Returns a success/failure of the addition. If a profile already exists, this operation will fail.
           Instead an update should be used.


        Parameters:
         - authzToken
         - gatewayID
         - storageResourceId
         - storagePreference
        """
        self.send_addGatewayStoragePreference(authzToken, gatewayID, storageResourceId, storagePreference)
        return self.recv_addGatewayStoragePreference()

    def send_addGatewayStoragePreference(self, authzToken, gatewayID, storageResourceId, storagePreference):
        self._oprot.writeMessageBegin('addGatewayStoragePreference', TMessageType.CALL, self._seqid)
        args = addGatewayStoragePreference_args()
        args.authzToken = authzToken
        args.gatewayID = gatewayID
        args.storageResourceId = storageResourceId
        args.storagePreference = storagePreference
        args.write(self._oprot)
        self._oprot.writeMessageEnd()
        self._oprot.trans.flush()

    def recv_addGatewayStoragePreference(self):
        iprot = self._iprot
        (fname, mtype, rseqid) = iprot.readMessageBegin()
        if mtype == TMessageType.EXCEPTION:
            x = TApplicationException()
            x.read(iprot)
            iprot.readMessageEnd()
            raise x
        result = addGatewayStoragePreference_result()
        result.read(iprot)
        iprot.readMessageEnd()
        if result.success is not None:
            return result.success
        if result.ire is not None:
            raise result.ire
        if result.ace is not None:
            raise result.ace
        if result.ase is not None:
            raise result.ase
        if result.ae is not None:
            raise result.ae
        raise TApplicationException(TApplicationException.MISSING_RESULT, "addGatewayStoragePreference failed: unknown result")

    def getGatewayComputeResourcePreference(self, authzToken, gatewayID, computeResourceId):
        """

        Fetch a Compute Resource Preference of a registered gateway profile.

        @param gatewayID
          The identifier for the gateway profile to be requested

        @param computeResourceId
          Preferences related to a particular compute resource

        @return computeResourcePreference
          Returns the ComputeResourcePreference object.


        Parameters:
         - authzToken
         - gatewayID
         - computeResourceId
        """
        self.send_getGatewayComputeResourcePreference(authzToken, gatewayID, computeResourceId)
        return self.recv_getGatewayComputeResourcePreference()

    def send_getGatewayComputeResourcePreference(self, authzToken, gatewayID, computeResourceId):
        self._oprot.writeMessageBegin('getGatewayComputeResourcePreference', TMessageType.CALL, self._seqid)
        args = getGatewayComputeResourcePreference_args()
        args.authzToken = authzToken
        args.gatewayID = gatewayID
        args.computeResourceId = computeResourceId
        args.write(self._oprot)
        self._oprot.writeMessageEnd()
        self._oprot.trans.flush()

    def recv_getGatewayComputeResourcePreference(self):
        iprot = self._iprot
        (fname, mtype, rseqid) = iprot.readMessageBegin()
        if mtype == TMessageType.EXCEPTION:
            x = TApplicationException()
            x.read(iprot)
            iprot.readMessageEnd()
            raise x
        result = getGatewayComputeResourcePreference_result()
        result.read(iprot)
        iprot.readMessageEnd()
        if result.success is not None:
            return result.success
        if result.ire is not None:
            raise result.ire
        if result.ace is not None:
            raise result.ace
        if result.ase is not None:
            raise result.ase
        if result.ae is not None:
            raise result.ae
        raise TApplicationException(TApplicationException.MISSING_RESULT, "getGatewayComputeResourcePreference failed: unknown result")

    def getGatewayStoragePreference(self, authzToken, gatewayID, storageResourceId):
        """

        Fetch a Storage Resource Preference of a registered gateway profile.

        @param gatewayID
          The identifier of the gateway profile to request to fetch the particular storage resource preference.

        @param storageResourceId
          Identifier of the Stprage Preference required to be fetched.

        @return StoragePreference
          Returns the StoragePreference object.


        Parameters:
         - authzToken
         - gatewayID
         - storageResourceId
        """
        self.send_getGatewayStoragePreference(authzToken, gatewayID, storageResourceId)
        return self.recv_getGatewayStoragePreference()

    def send_getGatewayStoragePreference(self, authzToken, gatewayID, storageResourceId):
        self._oprot.writeMessageBegin('getGatewayStoragePreference', TMessageType.CALL, self._seqid)
        args = getGatewayStoragePreference_args()
        args.authzToken = authzToken
        args.gatewayID = gatewayID
        args.storageResourceId = storageResourceId
        args.write(self._oprot)
        self._oprot.writeMessageEnd()
        self._oprot.trans.flush()

    def recv_getGatewayStoragePreference(self):
        iprot = self._iprot
        (fname, mtype, rseqid) = iprot.readMessageBegin()
        if mtype == TMessageType.EXCEPTION:
            x = TApplicationException()
            x.read(iprot)
            iprot.readMessageEnd()
            raise x
        result = getGatewayStoragePreference_result()
        result.read(iprot)
        iprot.readMessageEnd()
        if result.success is not None:
            return result.success
        if result.ire is not None:
            raise result.ire
        if result.ace is not None:
            raise result.ace
        if result.ase is not None:
            raise result.ase
        if result.ae is not None:
            raise result.ae
        raise TApplicationException(TApplicationException.MISSING_RESULT, "getGatewayStoragePreference failed: unknown result")

    def getAllGatewayComputeResourcePreferences(self, authzToken, gatewayID):
        """

        Fetch all Compute Resource Preferences of a registered gateway profile.

        @param gatewayID
          The identifier for the gateway profile to be requested

        @return computeResourcePreference
          Returns the ComputeResourcePreference object.


        Parameters:
         - authzToken
         - gatewayID
        """
        self.send_getAllGatewayComputeResourcePreferences(authzToken, gatewayID)
        return self.recv_getAllGatewayComputeResourcePreferences()

    def send_getAllGatewayComputeResourcePreferences(self, authzToken, gatewayID):
        self._oprot.writeMessageBegin('getAllGatewayComputeResourcePreferences', TMessageType.CALL, self._seqid)
        args = getAllGatewayComputeResourcePreferences_args()
        args.authzToken = authzToken
        args.gatewayID = gatewayID
        args.write(self._oprot)
        self._oprot.writeMessageEnd()
        self._oprot.trans.flush()

    def recv_getAllGatewayComputeResourcePreferences(self):
        iprot = self._iprot
        (fname, mtype, rseqid) = iprot.readMessageBegin()
        if mtype == TMessageType.EXCEPTION:
            x = TApplicationException()
            x.read(iprot)
            iprot.readMessageEnd()
            raise x
        result = getAllGatewayComputeResourcePreferences_result()
        result.read(iprot)
        iprot.readMessageEnd()
        if result.success is not None:
            return result.success
        if result.ire is not None:
            raise result.ire
        if result.ace is not None:
            raise result.ace
        if result.ase is not None:
            raise result.ase
        if result.ae is not None:
            raise result.ae
        raise TApplicationException(TApplicationException.MISSING_RESULT, "getAllGatewayComputeResourcePreferences failed: unknown result")

    def getAllGatewayStoragePreferences(self, authzToken, gatewayID):
        """
        Fetch all Storage Resource Preferences of a registered gateway profile.

        @param gatewayID
          The identifier for the gateway profile to be requested

        @return StoragePreference
          Returns the StoragePreference object.


        Parameters:
         - authzToken
         - gatewayID
        """
        self.send_getAllGatewayStoragePreferences(authzToken, gatewayID)
        return self.recv_getAllGatewayStoragePreferences()

    def send_getAllGatewayStoragePreferences(self, authzToken, gatewayID):
        self._oprot.writeMessageBegin('getAllGatewayStoragePreferences', TMessageType.CALL, self._seqid)
        args = getAllGatewayStoragePreferences_args()
        args.authzToken = authzToken
        args.gatewayID = gatewayID
        args.write(self._oprot)
        self._oprot.writeMessageEnd()
        self._oprot.trans.flush()

    def recv_getAllGatewayStoragePreferences(self):
        iprot = self._iprot
        (fname, mtype, rseqid) = iprot.readMessageBegin()
        if mtype == TMessageType.EXCEPTION:
            x = TApplicationException()
            x.read(iprot)
            iprot.readMessageEnd()
            raise x
        result = getAllGatewayStoragePreferences_result()
        result.read(iprot)
        iprot.readMessageEnd()
        if result.success is not None:
            return result.success
        if result.ire is not None:
            raise result.ire
        if result.ace is not None:
            raise result.ace
        if result.ase is not None:
            raise result.ase
        if result.ae is not None:
            raise result.ae
        raise TApplicationException(TApplicationException.MISSING_RESULT, "getAllGatewayStoragePreferences failed: unknown result")

    def getAllGatewayResourceProfiles(self, authzToken):
        """

        Fetch all Gateway Profiles registered

        @return GatewayResourceProfile
          Returns all the GatewayResourcePrifle list object.



        Parameters:
         - authzToken
        """
        self.send_getAllGatewayResourceProfiles(authzToken)
        return self.recv_getAllGatewayResourceProfiles()

    def send_getAllGatewayResourceProfiles(self, authzToken):
        self._oprot.writeMessageBegin('getAllGatewayResourceProfiles', TMessageType.CALL, self._seqid)
        args = getAllGatewayResourceProfiles_args()
        args.authzToken = authzToken
        args.write(self._oprot)
        self._oprot.writeMessageEnd()
        self._oprot.trans.flush()

    def recv_getAllGatewayResourceProfiles(self):
        iprot = self._iprot
        (fname, mtype, rseqid) = iprot.readMessageBegin()
        if mtype == TMessageType.EXCEPTION:
            x = TApplicationException()
            x.read(iprot)
            iprot.readMessageEnd()
            raise x
        result = getAllGatewayResourceProfiles_result()
        result.read(iprot)
        iprot.readMessageEnd()
        if result.success is not None:
            return result.success
        if result.ire is not None:
            raise result.ire
        if result.ace is not None:
            raise result.ace
        if result.ase is not None:
            raise result.ase
        if result.ae is not None:
            raise result.ae
        raise TApplicationException(TApplicationException.MISSING_RESULT, "getAllGatewayResourceProfiles failed: unknown result")

    def updateGatewayComputeResourcePreference(self, authzToken, gatewayID, computeResourceId, computeResourcePreference):
        """
        Update a Compute Resource Preference to a registered gateway profile.

        @param gatewayID
          The identifier for the gateway profile to be updated.

        @param computeResourceId
          Preferences related to a particular compute resource

        @param computeResourcePreference
          The ComputeResourcePreference object to be updated to the resource profile.

        @return status
          Returns a success/failure of the updation.


        Parameters:
         - authzToken
         - gatewayID
         - computeResourceId
         - computeResourcePreference
        """
        self.send_updateGatewayComputeResourcePreference(authzToken, gatewayID, computeResourceId, computeResourcePreference)
        return self.recv_updateGatewayComputeResourcePreference()

    def send_updateGatewayComputeResourcePreference(self, authzToken, gatewayID, computeResourceId, computeResourcePreference):
        self._oprot.writeMessageBegin('updateGatewayComputeResourcePreference', TMessageType.CALL, self._seqid)
        args = updateGatewayComputeResourcePreference_args()
        args.authzToken = authzToken
        args.gatewayID = gatewayID
        args.computeResourceId = computeResourceId
        args.computeResourcePreference = computeResourcePreference
        args.write(self._oprot)
        self._oprot.writeMessageEnd()
        self._oprot.trans.flush()

    def recv_updateGatewayComputeResourcePreference(self):
        iprot = self._iprot
        (fname, mtype, rseqid) = iprot.readMessageBegin()
        if mtype == TMessageType.EXCEPTION:
            x = TApplicationException()
            x.read(iprot)
            iprot.readMessageEnd()
            raise x
        result = updateGatewayComputeResourcePreference_result()
        result.read(iprot)
        iprot.readMessageEnd()
        if result.success is not None:
            return result.success
        if result.ire is not None:
            raise result.ire
        if result.ace is not None:
            raise result.ace
        if result.ase is not None:
            raise result.ase
        if result.ae is not None:
            raise result.ae
        raise TApplicationException(TApplicationException.MISSING_RESULT, "updateGatewayComputeResourcePreference failed: unknown result")

    def updateGatewayStoragePreference(self, authzToken, gatewayID, storageId, storagePreference):
        """
        Update a Storage Resource Preference of a registered gateway profile.

        @param gatewayID
          The identifier of the gateway profile to be updated.

        @param storageId
          The Storage resource identifier of the one that you want to update

        @param storagePreference
          The storagePreference object to be updated to the resource profile.

        @return status
          Returns a success/failure of the updation.


        Parameters:
         - authzToken
         - gatewayID
         - storageId
         - storagePreference
        """
        self.send_updateGatewayStoragePreference(authzToken, gatewayID, storageId, storagePreference)
        return self.recv_updateGatewayStoragePreference()

    def send_updateGatewayStoragePreference(self, authzToken, gatewayID, storageId, storagePreference):
        self._oprot.writeMessageBegin('updateGatewayStoragePreference', TMessageType.CALL, self._seqid)
        args = updateGatewayStoragePreference_args()
        args.authzToken = authzToken
        args.gatewayID = gatewayID
        args.storageId = storageId
        args.storagePreference = storagePreference
        args.write(self._oprot)
        self._oprot.writeMessageEnd()
        self._oprot.trans.flush()

    def recv_updateGatewayStoragePreference(self):
        iprot = self._iprot
        (fname, mtype, rseqid) = iprot.readMessageBegin()
        if mtype == TMessageType.EXCEPTION:
            x = TApplicationException()
            x.read(iprot)
            iprot.readMessageEnd()
            raise x
        result = updateGatewayStoragePreference_result()
        result.read(iprot)
        iprot.readMessageEnd()
        if result.success is not None:
            return result.success
        if result.ire is not None:
            raise result.ire
        if result.ace is not None:
            raise result.ace
        if result.ase is not None:
            raise result.ase
        if result.ae is not None:
            raise result.ae
        raise TApplicationException(TApplicationException.MISSING_RESULT, "updateGatewayStoragePreference failed: unknown result")

    def deleteGatewayComputeResourcePreference(self, authzToken, gatewayID, computeResourceId):
        """
        Delete the Compute Resource Preference of a registered gateway profile.

        @param gatewayID
          The identifier for the gateway profile to be deleted.

        @param computeResourceId
          Preferences related to a particular compute resource

        @return status
          Returns a success/failure of the deletion.


        Parameters:
         - authzToken
         - gatewayID
         - computeResourceId
        """
        self.send_deleteGatewayComputeResourcePreference(authzToken, gatewayID, computeResourceId)
        return self.recv_deleteGatewayComputeResourcePreference()

    def send_deleteGatewayComputeResourcePreference(self, authzToken, gatewayID, computeResourceId):
        self._oprot.writeMessageBegin('deleteGatewayComputeResourcePreference', TMessageType.CALL, self._seqid)
        args = deleteGatewayComputeResourcePreference_args()
        args.authzToken = authzToken
        args.gatewayID = gatewayID
        args.computeResourceId = computeResourceId
        args.write(self._oprot)
        self._oprot.writeMessageEnd()
        self._oprot.trans.flush()

    def recv_deleteGatewayComputeResourcePreference(self):
        iprot = self._iprot
        (fname, mtype, rseqid) = iprot.readMessageBegin()
        if mtype == TMessageType.EXCEPTION:
            x = TApplicationException()
            x.read(iprot)
            iprot.readMessageEnd()
            raise x
        result = deleteGatewayComputeResourcePreference_result()
        result.read(iprot)
        iprot.readMessageEnd()
        if result.success is not None:
            return result.success
        if result.ire is not None:
            raise result.ire
        if result.ace is not None:
            raise result.ace
        if result.ase is not None:
            raise result.ase
        if result.ae is not None:
            raise result.ae
        raise TApplicationException(TApplicationException.MISSING_RESULT, "deleteGatewayComputeResourcePreference failed: unknown result")

    def deleteGatewayStoragePreference(self, authzToken, gatewayID, storageId):
        """
        Delete the Storage Resource Preference of a registered gateway profile.

        @param gatewayID
          The identifier of the gateway profile to be deleted.

        @param storageId
          ID of the storage preference you want to delete.

        @return status
          Returns a success/failure of the deletion.


        Parameters:
         - authzToken
         - gatewayID
         - storageId
        """
        self.send_deleteGatewayStoragePreference(authzToken, gatewayID, storageId)
        return self.recv_deleteGatewayStoragePreference()

    def send_deleteGatewayStoragePreference(self, authzToken, gatewayID, storageId):
        self._oprot.writeMessageBegin('deleteGatewayStoragePreference', TMessageType.CALL, self._seqid)
        args = deleteGatewayStoragePreference_args()
        args.authzToken = authzToken
        args.gatewayID = gatewayID
        args.storageId = storageId
        args.write(self._oprot)
        self._oprot.writeMessageEnd()
        self._oprot.trans.flush()

    def recv_deleteGatewayStoragePreference(self):
        iprot = self._iprot
        (fname, mtype, rseqid) = iprot.readMessageBegin()
        if mtype == TMessageType.EXCEPTION:
            x = TApplicationException()
            x.read(iprot)
            iprot.readMessageEnd()
            raise x
        result = deleteGatewayStoragePreference_result()
        result.read(iprot)
        iprot.readMessageEnd()
        if result.success is not None:
            return result.success
        if result.ire is not None:
            raise result.ire
        if result.ace is not None:
            raise result.ace
        if result.ase is not None:
            raise result.ase
        if result.ae is not None:
            raise result.ae
        raise TApplicationException(TApplicationException.MISSING_RESULT, "deleteGatewayStoragePreference failed: unknown result")

    def registerUserResourceProfile(self, authzToken, userResourceProfile):
        """
        Register User Resource Profile.

        @param UserResourceProfile
           User Resource Profile Object.
           The userId should be obtained from Airavata user profile data model and passed to register a corresponding
             resource profile.

        @return status
          Returns a success/failure of the update.


        Parameters:
         - authzToken
         - userResourceProfile
        """
        self.send_registerUserResourceProfile(authzToken, userResourceProfile)
        return self.recv_registerUserResourceProfile()

    def send_registerUserResourceProfile(self, authzToken, userResourceProfile):
        self._oprot.writeMessageBegin('registerUserResourceProfile', TMessageType.CALL, self._seqid)
        args = registerUserResourceProfile_args()
        args.authzToken = authzToken
        args.userResourceProfile = userResourceProfile
        args.write(self._oprot)
        self._oprot.writeMessageEnd()
        self._oprot.trans.flush()

    def recv_registerUserResourceProfile(self):
        iprot = self._iprot
        (fname, mtype, rseqid) = iprot.readMessageBegin()
        if mtype == TMessageType.EXCEPTION:
            x = TApplicationException()
            x.read(iprot)
            iprot.readMessageEnd()
            raise x
        result = registerUserResourceProfile_result()
        result.read(iprot)
        iprot.readMessageEnd()
        if result.success is not None:
            return result.success
        if result.ire is not None:
            raise result.ire
        if result.ace is not None:
            raise result.ace
        if result.ase is not None:
            raise result.ase
        if result.ae is not None:
            raise result.ae
        raise TApplicationException(TApplicationException.MISSING_RESULT, "registerUserResourceProfile failed: unknown result")

    def getUserResourceProfile(self, authzToken, userId, gatewayID):
        """
        Fetch the given User Resource Profile.

        @param userId
          The identifier for the requested user resource profile.

        @param gatewayID
          The identifier to link a gateway for the requested user resource profile.

        @return UserResourceProfile
           User Resource Profile Object.


        Parameters:
         - authzToken
         - userId
         - gatewayID
        """
        self.send_getUserResourceProfile(authzToken, userId, gatewayID)
        return self.recv_getUserResourceProfile()

    def send_getUserResourceProfile(self, authzToken, userId, gatewayID):
        self._oprot.writeMessageBegin('getUserResourceProfile', TMessageType.CALL, self._seqid)
        args = getUserResourceProfile_args()
        args.authzToken = authzToken
        args.userId = userId
        args.gatewayID = gatewayID
        args.write(self._oprot)
        self._oprot.writeMessageEnd()
        self._oprot.trans.flush()

    def recv_getUserResourceProfile(self):
        iprot = self._iprot
        (fname, mtype, rseqid) = iprot.readMessageBegin()
        if mtype == TMessageType.EXCEPTION:
            x = TApplicationException()
            x.read(iprot)
            iprot.readMessageEnd()
            raise x
        result = getUserResourceProfile_result()
        result.read(iprot)
        iprot.readMessageEnd()
        if result.success is not None:
            return result.success
        if result.ire is not None:
            raise result.ire
        if result.ace is not None:
            raise result.ace
        if result.ase is not None:
            raise result.ase
        if result.ae is not None:
            raise result.ae
        raise TApplicationException(TApplicationException.MISSING_RESULT, "getUserResourceProfile failed: unknown result")

    def updateUserResourceProfile(self, authzToken, userId, gatewayID, userResourceProfile):
        """
        Update a User Resource Profile.

        @param userId
          The identifier for the requested user resource to be updated.

        @param gatewayID
          The identifier to link a gateway for the requested user resource profile.

        @param UserResourceProfile
           User Resource Profile Object.

        @return status
          Returns a success/failure of the update.


        Parameters:
         - authzToken
         - userId
         - gatewayID
         - userResourceProfile
        """
        self.send_updateUserResourceProfile(authzToken, userId, gatewayID, userResourceProfile)
        return self.recv_updateUserResourceProfile()

    def send_updateUserResourceProfile(self, authzToken, userId, gatewayID, userResourceProfile):
        self._oprot.writeMessageBegin('updateUserResourceProfile', TMessageType.CALL, self._seqid)
        args = updateUserResourceProfile_args()
        args.authzToken = authzToken
        args.userId = userId
        args.gatewayID = gatewayID
        args.userResourceProfile = userResourceProfile
        args.write(self._oprot)
        self._oprot.writeMessageEnd()
        self._oprot.trans.flush()

    def recv_updateUserResourceProfile(self):
        iprot = self._iprot
        (fname, mtype, rseqid) = iprot.readMessageBegin()
        if mtype == TMessageType.EXCEPTION:
            x = TApplicationException()
            x.read(iprot)
            iprot.readMessageEnd()
            raise x
        result = updateUserResourceProfile_result()
        result.read(iprot)
        iprot.readMessageEnd()
        if result.success is not None:
            return result.success
        if result.ire is not None:
            raise result.ire
        if result.ace is not None:
            raise result.ace
        if result.ase is not None:
            raise result.ase
        if result.ae is not None:
            raise result.ae
        raise TApplicationException(TApplicationException.MISSING_RESULT, "updateUserResourceProfile failed: unknown result")

    def deleteUserResourceProfile(self, authzToken, userId, gatewayID):
        """
        Delete the given User Resource Profile.

        @param userId
          The identifier for the requested user resource to be deleted.

        @param gatewayID
          The identifier to link a gateway for the requested user resource profile.

        @return status
          Returns a success/failure of the deletion.


        Parameters:
         - authzToken
         - userId
         - gatewayID
        """
        self.send_deleteUserResourceProfile(authzToken, userId, gatewayID)
        return self.recv_deleteUserResourceProfile()

    def send_deleteUserResourceProfile(self, authzToken, userId, gatewayID):
        self._oprot.writeMessageBegin('deleteUserResourceProfile', TMessageType.CALL, self._seqid)
        args = deleteUserResourceProfile_args()
        args.authzToken = authzToken
        args.userId = userId
        args.gatewayID = gatewayID
        args.write(self._oprot)
        self._oprot.writeMessageEnd()
        self._oprot.trans.flush()

    def recv_deleteUserResourceProfile(self):
        iprot = self._iprot
        (fname, mtype, rseqid) = iprot.readMessageBegin()
        if mtype == TMessageType.EXCEPTION:
            x = TApplicationException()
            x.read(iprot)
            iprot.readMessageEnd()
            raise x
        result = deleteUserResourceProfile_result()
        result.read(iprot)
        iprot.readMessageEnd()
        if result.success is not None:
            return result.success
        if result.ire is not None:
            raise result.ire
        if result.ace is not None:
            raise result.ace
        if result.ase is not None:
            raise result.ase
        if result.ae is not None:
            raise result.ae
        raise TApplicationException(TApplicationException.MISSING_RESULT, "deleteUserResourceProfile failed: unknown result")

    def addUserComputeResourcePreference(self, authzToken, userId, gatewayID, userComputeResourceId, userComputeResourcePreference):
        """
        Add a Compute Resource Preference to a registered User profile.

        @param userId
          The identifier for the User resource profile to be added.

        @param gatewayID
          The identifier to link a gateway for the requested user resource profile.

        @param computeResourceId
          Preferences related to a particular compute resource

        @param computeResourcePreference
          The ComputeResourcePreference object to be added to the resource profile.

        @return status
          Returns a success/failure of the addition. If a profile already exists, this operation will fail.
           Instead an update should be used.


        Parameters:
         - authzToken
         - userId
         - gatewayID
         - userComputeResourceId
         - userComputeResourcePreference
        """
        self.send_addUserComputeResourcePreference(authzToken, userId, gatewayID, userComputeResourceId, userComputeResourcePreference)
        return self.recv_addUserComputeResourcePreference()

    def send_addUserComputeResourcePreference(self, authzToken, userId, gatewayID, userComputeResourceId, userComputeResourcePreference):
        self._oprot.writeMessageBegin('addUserComputeResourcePreference', TMessageType.CALL, self._seqid)
        args = addUserComputeResourcePreference_args()
        args.authzToken = authzToken
        args.userId = userId
        args.gatewayID = gatewayID
        args.userComputeResourceId = userComputeResourceId
        args.userComputeResourcePreference = userComputeResourcePreference
        args.write(self._oprot)
        self._oprot.writeMessageEnd()
        self._oprot.trans.flush()

    def recv_addUserComputeResourcePreference(self):
        iprot = self._iprot
        (fname, mtype, rseqid) = iprot.readMessageBegin()
        if mtype == TMessageType.EXCEPTION:
            x = TApplicationException()
            x.read(iprot)
            iprot.readMessageEnd()
            raise x
        result = addUserComputeResourcePreference_result()
        result.read(iprot)
        iprot.readMessageEnd()
        if result.success is not None:
            return result.success
        if result.ire is not None:
            raise result.ire
        if result.ace is not None:
            raise result.ace
        if result.ase is not None:
            raise result.ase
        if result.ae is not None:
            raise result.ae
        raise TApplicationException(TApplicationException.MISSING_RESULT, "addUserComputeResourcePreference failed: unknown result")

    def addUserStoragePreference(self, authzToken, userId, gatewayID, userStorageResourceId, userStoragePreference):
        """
        Add a Storage Resource Preference to a registered user resource profile.

        @param userId
          The identifier of the user resource profile to be added.

        @param gatewayID
          The identifier to link a gateway for the requested user resource profile.

        @param storageResourceId
          Preferences related to a particular compute resource

        @param computeResourcePreference
          The ComputeResourcePreference object to be added to the resource profile.

        @return status
          Returns a success/failure of the addition. If a profile already exists, this operation will fail.
           Instead an update should be used.


        Parameters:
         - authzToken
         - userId
         - gatewayID
         - userStorageResourceId
         - userStoragePreference
        """
        self.send_addUserStoragePreference(authzToken, userId, gatewayID, userStorageResourceId, userStoragePreference)
        return self.recv_addUserStoragePreference()

    def send_addUserStoragePreference(self, authzToken, userId, gatewayID, userStorageResourceId, userStoragePreference):
        self._oprot.writeMessageBegin('addUserStoragePreference', TMessageType.CALL, self._seqid)
        args = addUserStoragePreference_args()
        args.authzToken = authzToken
        args.userId = userId
        args.gatewayID = gatewayID
        args.userStorageResourceId = userStorageResourceId
        args.userStoragePreference = userStoragePreference
        args.write(self._oprot)
        self._oprot.writeMessageEnd()
        self._oprot.trans.flush()

    def recv_addUserStoragePreference(self):
        iprot = self._iprot
        (fname, mtype, rseqid) = iprot.readMessageBegin()
        if mtype == TMessageType.EXCEPTION:
            x = TApplicationException()
            x.read(iprot)
            iprot.readMessageEnd()
            raise x
        result = addUserStoragePreference_result()
        result.read(iprot)
        iprot.readMessageEnd()
        if result.success is not None:
            return result.success
        if result.ire is not None:
            raise result.ire
        if result.ace is not None:
            raise result.ace
        if result.ase is not None:
            raise result.ase
        if result.ae is not None:
            raise result.ae
        raise TApplicationException(TApplicationException.MISSING_RESULT, "addUserStoragePreference failed: unknown result")

    def getUserComputeResourcePreference(self, authzToken, userId, gatewayID, userComputeResourceId):
        """

        Fetch a Compute Resource Preference of a registered user resource profile.

        @param userId
          The identifier for the user profile to be requested

        @param gatewayID
          The identifier to link a gateway for the requested user resource profile.

        @param userComputeResourceId
          Preferences related to a particular compute resource

        @return computeResourcePreference
          Returns the ComputeResourcePreference object.


        Parameters:
         - authzToken
         - userId
         - gatewayID
         - userComputeResourceId
        """
        self.send_getUserComputeResourcePreference(authzToken, userId, gatewayID, userComputeResourceId)
        return self.recv_getUserComputeResourcePreference()

    def send_getUserComputeResourcePreference(self, authzToken, userId, gatewayID, userComputeResourceId):
        self._oprot.writeMessageBegin('getUserComputeResourcePreference', TMessageType.CALL, self._seqid)
        args = getUserComputeResourcePreference_args()
        args.authzToken = authzToken
        args.userId = userId
        args.gatewayID = gatewayID
        args.userComputeResourceId = userComputeResourceId
        args.write(self._oprot)
        self._oprot.writeMessageEnd()
        self._oprot.trans.flush()

    def recv_getUserComputeResourcePreference(self):
        iprot = self._iprot
        (fname, mtype, rseqid) = iprot.readMessageBegin()
        if mtype == TMessageType.EXCEPTION:
            x = TApplicationException()
            x.read(iprot)
            iprot.readMessageEnd()
            raise x
        result = getUserComputeResourcePreference_result()
        result.read(iprot)
        iprot.readMessageEnd()
        if result.success is not None:
            return result.success
        if result.ire is not None:
            raise result.ire
        if result.ace is not None:
            raise result.ace
        if result.ase is not None:
            raise result.ase
        if result.ae is not None:
            raise result.ae
        raise TApplicationException(TApplicationException.MISSING_RESULT, "getUserComputeResourcePreference failed: unknown result")

    def getUserStoragePreference(self, authzToken, userId, gatewayID, userStorageResourceId):
        """

        Fetch a Storage Resource Preference of a registered user resource profile.

        @param userId
          The identifier of the user resource profile to request to fetch the particular storage resource preference.

        @param gatewayID
          The identifier to link a gateway for the requested user resource profile.

        @param userStorageResourceId
          Identifier of the Stprage Preference required to be fetched.

        @return UserStoragePreference
          Returns the StoragePreference object.


        Parameters:
         - authzToken
         - userId
         - gatewayID
         - userStorageResourceId
        """
        self.send_getUserStoragePreference(authzToken, userId, gatewayID, userStorageResourceId)
        return self.recv_getUserStoragePreference()

    def send_getUserStoragePreference(self, authzToken, userId, gatewayID, userStorageResourceId):
        self._oprot.writeMessageBegin('getUserStoragePreference', TMessageType.CALL, self._seqid)
        args = getUserStoragePreference_args()
        args.authzToken = authzToken
        args.userId = userId
        args.gatewayID = gatewayID
        args.userStorageResourceId = userStorageResourceId
        args.write(self._oprot)
        self._oprot.writeMessageEnd()
        self._oprot.trans.flush()

    def recv_getUserStoragePreference(self):
        iprot = self._iprot
        (fname, mtype, rseqid) = iprot.readMessageBegin()
        if mtype == TMessageType.EXCEPTION:
            x = TApplicationException()
            x.read(iprot)
            iprot.readMessageEnd()
            raise x
        result = getUserStoragePreference_result()
        result.read(iprot)
        iprot.readMessageEnd()
        if result.success is not None:
            return result.success
        if result.ire is not None:
            raise result.ire
        if result.ace is not None:
            raise result.ace
        if result.ase is not None:
            raise result.ase
        if result.ae is not None:
            raise result.ae
        raise TApplicationException(TApplicationException.MISSING_RESULT, "getUserStoragePreference failed: unknown result")

    def getAllUserComputeResourcePreferences(self, authzToken, userId, gatewayID):
        """

        Fetch all Compute Resource Preferences of a registered gateway profile.

        @param userId
          The identifier of the user resource profile to request to fetch the particular storage resource preference.

        @param gatewayID
          The identifier for the gateway profile to be requested

        @return computeResourcePreference
          Returns the ComputeResourcePreference object.


        Parameters:
         - authzToken
         - userId
         - gatewayID
        """
        self.send_getAllUserComputeResourcePreferences(authzToken, userId, gatewayID)
        return self.recv_getAllUserComputeResourcePreferences()

    def send_getAllUserComputeResourcePreferences(self, authzToken, userId, gatewayID):
        self._oprot.writeMessageBegin('getAllUserComputeResourcePreferences', TMessageType.CALL, self._seqid)
        args = getAllUserComputeResourcePreferences_args()
        args.authzToken = authzToken
        args.userId = userId
        args.gatewayID = gatewayID
        args.write(self._oprot)
        self._oprot.writeMessageEnd()
        self._oprot.trans.flush()

    def recv_getAllUserComputeResourcePreferences(self):
        iprot = self._iprot
        (fname, mtype, rseqid) = iprot.readMessageBegin()
        if mtype == TMessageType.EXCEPTION:
            x = TApplicationException()
            x.read(iprot)
            iprot.readMessageEnd()
            raise x
        result = getAllUserComputeResourcePreferences_result()
        result.read(iprot)
        iprot.readMessageEnd()
        if result.success is not None:
            return result.success
        if result.ire is not None:
            raise result.ire
        if result.ace is not None:
            raise result.ace
        if result.ase is not None:
            raise result.ase
        if result.ae is not None:
            raise result.ae
        raise TApplicationException(TApplicationException.MISSING_RESULT, "getAllUserComputeResourcePreferences failed: unknown result")

    def getAllUserStoragePreferences(self, authzToken, userId, gatewayID):
        """
        Fetch all User Storage Resource Preferences of a registered user profile.

        @param userId
          The identifier of the user resource profile to request to fetch the particular storage resource preference.

        @param gatewayID
          The identifier for the gateway profile to be requested

        @return StoragePreference
          Returns the StoragePreference object.


        Parameters:
         - authzToken
         - userId
         - gatewayID
        """
        self.send_getAllUserStoragePreferences(authzToken, userId, gatewayID)
        return self.recv_getAllUserStoragePreferences()

    def send_getAllUserStoragePreferences(self, authzToken, userId, gatewayID):
        self._oprot.writeMessageBegin('getAllUserStoragePreferences', TMessageType.CALL, self._seqid)
        args = getAllUserStoragePreferences_args()
        args.authzToken = authzToken
        args.userId = userId
        args.gatewayID = gatewayID
        args.write(self._oprot)
        self._oprot.writeMessageEnd()
        self._oprot.trans.flush()

    def recv_getAllUserStoragePreferences(self):
        iprot = self._iprot
        (fname, mtype, rseqid) = iprot.readMessageBegin()
        if mtype == TMessageType.EXCEPTION:
            x = TApplicationException()
            x.read(iprot)
            iprot.readMessageEnd()
            raise x
        result = getAllUserStoragePreferences_result()
        result.read(iprot)
        iprot.readMessageEnd()
        if result.success is not None:
            return result.success
        if result.ire is not None:
            raise result.ire
        if result.ace is not None:
            raise result.ace
        if result.ase is not None:
            raise result.ase
        if result.ae is not None:
            raise result.ae
        raise TApplicationException(TApplicationException.MISSING_RESULT, "getAllUserStoragePreferences failed: unknown result")

    def getAllUserResourceProfiles(self, authzToken):
        """

        Fetch all user resources Profiles registered

        @return UserResourceProfile
          Returns all the UserResourcePrifle list object.



        Parameters:
         - authzToken
        """
        self.send_getAllUserResourceProfiles(authzToken)
        return self.recv_getAllUserResourceProfiles()

    def send_getAllUserResourceProfiles(self, authzToken):
        self._oprot.writeMessageBegin('getAllUserResourceProfiles', TMessageType.CALL, self._seqid)
        args = getAllUserResourceProfiles_args()
        args.authzToken = authzToken
        args.write(self._oprot)
        self._oprot.writeMessageEnd()
        self._oprot.trans.flush()

    def recv_getAllUserResourceProfiles(self):
        iprot = self._iprot
        (fname, mtype, rseqid) = iprot.readMessageBegin()
        if mtype == TMessageType.EXCEPTION:
            x = TApplicationException()
            x.read(iprot)
            iprot.readMessageEnd()
            raise x
        result = getAllUserResourceProfiles_result()
        result.read(iprot)
        iprot.readMessageEnd()
        if result.success is not None:
            return result.success
        if result.ire is not None:
            raise result.ire
        if result.ace is not None:
            raise result.ace
        if result.ase is not None:
            raise result.ase
        if result.ae is not None:
            raise result.ae
        raise TApplicationException(TApplicationException.MISSING_RESULT, "getAllUserResourceProfiles failed: unknown result")

    def updateUserComputeResourcePreference(self, authzToken, userId, gatewayID, userComputeResourceId, userComputeResourcePreference):
        """
        Update a Compute Resource Preference to a registered user resource profile.

        @param userId
          The identifier for the user profile to be updated.

        @param gatewayID
          The identifier to link a gateway for the requested user resource profile.

        @param userComputeResourceId
          Preferences related to a particular compute resource

        @param userComputeResourcePreference
          The ComputeResourcePreference object to be updated to the resource profile.

        @return status
          Returns a success/failure of the updation.


        Parameters:
         - authzToken
         - userId
         - gatewayID
         - userComputeResourceId
         - userComputeResourcePreference
        """
        self.send_updateUserComputeResourcePreference(authzToken, userId, gatewayID, userComputeResourceId, userComputeResourcePreference)
        return self.recv_updateUserComputeResourcePreference()

    def send_updateUserComputeResourcePreference(self, authzToken, userId, gatewayID, userComputeResourceId, userComputeResourcePreference):
        self._oprot.writeMessageBegin('updateUserComputeResourcePreference', TMessageType.CALL, self._seqid)
        args = updateUserComputeResourcePreference_args()
        args.authzToken = authzToken
        args.userId = userId
        args.gatewayID = gatewayID
        args.userComputeResourceId = userComputeResourceId
        args.userComputeResourcePreference = userComputeResourcePreference
        args.write(self._oprot)
        self._oprot.writeMessageEnd()
        self._oprot.trans.flush()

    def recv_updateUserComputeResourcePreference(self):
        iprot = self._iprot
        (fname, mtype, rseqid) = iprot.readMessageBegin()
        if mtype == TMessageType.EXCEPTION:
            x = TApplicationException()
            x.read(iprot)
            iprot.readMessageEnd()
            raise x
        result = updateUserComputeResourcePreference_result()
        result.read(iprot)
        iprot.readMessageEnd()
        if result.success is not None:
            return result.success
        if result.ire is not None:
            raise result.ire
        if result.ace is not None:
            raise result.ace
        if result.ase is not None:
            raise result.ase
        if result.ae is not None:
            raise result.ae
        raise TApplicationException(TApplicationException.MISSING_RESULT, "updateUserComputeResourcePreference failed: unknown result")

    def updateUserStoragePreference(self, authzToken, userId, gatewayID, userStorageId, userStoragePreference):
        """
        Update a Storage Resource Preference of a registered user resource profile.

        @param userId
          The identifier of the user resource profile to be updated.

        @param gatewayID
          The identifier to link a gateway for the requested user resource profile.

        @param userStorageId
          The Storage resource identifier of the one that you want to update

        @param userStoragePreference
          The storagePreference object to be updated to the resource profile.

        @return status
          Returns a success/failure of the updation.


        Parameters:
         - authzToken
         - userId
         - gatewayID
         - userStorageId
         - userStoragePreference
        """
        self.send_updateUserStoragePreference(authzToken, userId, gatewayID, userStorageId, userStoragePreference)
        return self.recv_updateUserStoragePreference()

    def send_updateUserStoragePreference(self, authzToken, userId, gatewayID, userStorageId, userStoragePreference):
        self._oprot.writeMessageBegin('updateUserStoragePreference', TMessageType.CALL, self._seqid)
        args = updateUserStoragePreference_args()
        args.authzToken = authzToken
        args.userId = userId
        args.gatewayID = gatewayID
        args.userStorageId = userStorageId
        args.userStoragePreference = userStoragePreference
        args.write(self._oprot)
        self._oprot.writeMessageEnd()
        self._oprot.trans.flush()

    def recv_updateUserStoragePreference(self):
        iprot = self._iprot
        (fname, mtype, rseqid) = iprot.readMessageBegin()
        if mtype == TMessageType.EXCEPTION:
            x = TApplicationException()
            x.read(iprot)
            iprot.readMessageEnd()
            raise x
        result = updateUserStoragePreference_result()
        result.read(iprot)
        iprot.readMessageEnd()
        if result.success is not None:
            return result.success
        if result.ire is not None:
            raise result.ire
        if result.ace is not None:
            raise result.ace
        if result.ase is not None:
            raise result.ase
        if result.ae is not None:
            raise result.ae
        raise TApplicationException(TApplicationException.MISSING_RESULT, "updateUserStoragePreference failed: unknown result")

    def deleteUserComputeResourcePreference(self, authzToken, userId, gatewayID, userComputeResourceId):
        """
        Delete the Compute Resource Preference of a registered user resource profile.

        @param userId
          The identifier for the user resource profile to be deleted.

        @param gatewayID
          The identifier to link a gateway for the requested user resource profile.

        @param userComputeResourceId
          Preferences related to a particular compute resource

        @return status
          Returns a success/failure of the deletion.


        Parameters:
         - authzToken
         - userId
         - gatewayID
         - userComputeResourceId
        """
        self.send_deleteUserComputeResourcePreference(authzToken, userId, gatewayID, userComputeResourceId)
        return self.recv_deleteUserComputeResourcePreference()

    def send_deleteUserComputeResourcePreference(self, authzToken, userId, gatewayID, userComputeResourceId):
        self._oprot.writeMessageBegin('deleteUserComputeResourcePreference', TMessageType.CALL, self._seqid)
        args = deleteUserComputeResourcePreference_args()
        args.authzToken = authzToken
        args.userId = userId
        args.gatewayID = gatewayID
        args.userComputeResourceId = userComputeResourceId
        args.write(self._oprot)
        self._oprot.writeMessageEnd()
        self._oprot.trans.flush()

    def recv_deleteUserComputeResourcePreference(self):
        iprot = self._iprot
        (fname, mtype, rseqid) = iprot.readMessageBegin()
        if mtype == TMessageType.EXCEPTION:
            x = TApplicationException()
            x.read(iprot)
            iprot.readMessageEnd()
            raise x
        result = deleteUserComputeResourcePreference_result()
        result.read(iprot)
        iprot.readMessageEnd()
        if result.success is not None:
            return result.success
        if result.ire is not None:
            raise result.ire
        if result.ace is not None:
            raise result.ace
        if result.ase is not None:
            raise result.ase
        if result.ae is not None:
            raise result.ae
        raise TApplicationException(TApplicationException.MISSING_RESULT, "deleteUserComputeResourcePreference failed: unknown result")

    def deleteUserStoragePreference(self, authzToken, userId, gatewayID, userStorageId):
        """
        Delete the Storage Resource Preference of a registered user resource profile.

        @param userId
          The identifier of the user profile to be deleted.

        @param gatewayID
          The identifier to link a gateway for the requested user resource profile.

        @param userStorageId
          ID of the storage preference you want to delete.

        @return status
          Returns a success/failure of the deletion.


        Parameters:
         - authzToken
         - userId
         - gatewayID
         - userStorageId
        """
        self.send_deleteUserStoragePreference(authzToken, userId, gatewayID, userStorageId)
        return self.recv_deleteUserStoragePreference()

    def send_deleteUserStoragePreference(self, authzToken, userId, gatewayID, userStorageId):
        self._oprot.writeMessageBegin('deleteUserStoragePreference', TMessageType.CALL, self._seqid)
        args = deleteUserStoragePreference_args()
        args.authzToken = authzToken
        args.userId = userId
        args.gatewayID = gatewayID
        args.userStorageId = userStorageId
        args.write(self._oprot)
        self._oprot.writeMessageEnd()
        self._oprot.trans.flush()

    def recv_deleteUserStoragePreference(self):
        iprot = self._iprot
        (fname, mtype, rseqid) = iprot.readMessageBegin()
        if mtype == TMessageType.EXCEPTION:
            x = TApplicationException()
            x.read(iprot)
            iprot.readMessageEnd()
            raise x
        result = deleteUserStoragePreference_result()
        result.read(iprot)
        iprot.readMessageEnd()
        if result.success is not None:
            return result.success
        if result.ire is not None:
            raise result.ire
        if result.ace is not None:
            raise result.ace
        if result.ase is not None:
            raise result.ase
        if result.ae is not None:
            raise result.ae
        raise TApplicationException(TApplicationException.MISSING_RESULT, "deleteUserStoragePreference failed: unknown result")

    def getAllWorkflows(self, authzToken, gatewayId):
        """
        Parameters:
         - authzToken
         - gatewayId
        """
        self.send_getAllWorkflows(authzToken, gatewayId)
        return self.recv_getAllWorkflows()

    def send_getAllWorkflows(self, authzToken, gatewayId):
        self._oprot.writeMessageBegin('getAllWorkflows', TMessageType.CALL, self._seqid)
        args = getAllWorkflows_args()
        args.authzToken = authzToken
        args.gatewayId = gatewayId
        args.write(self._oprot)
        self._oprot.writeMessageEnd()
        self._oprot.trans.flush()

    def recv_getAllWorkflows(self):
        iprot = self._iprot
        (fname, mtype, rseqid) = iprot.readMessageBegin()
        if mtype == TMessageType.EXCEPTION:
            x = TApplicationException()
            x.read(iprot)
            iprot.readMessageEnd()
            raise x
        result = getAllWorkflows_result()
        result.read(iprot)
        iprot.readMessageEnd()
        if result.success is not None:
            return result.success
        if result.ire is not None:
            raise result.ire
        if result.ace is not None:
            raise result.ace
        if result.ase is not None:
            raise result.ase
        if result.ae is not None:
            raise result.ae
        raise TApplicationException(TApplicationException.MISSING_RESULT, "getAllWorkflows failed: unknown result")

    def getLatestQueueStatuses(self, authzToken):
        """
        Parameters:
         - authzToken
        """
        self.send_getLatestQueueStatuses(authzToken)
        return self.recv_getLatestQueueStatuses()

    def send_getLatestQueueStatuses(self, authzToken):
        self._oprot.writeMessageBegin('getLatestQueueStatuses', TMessageType.CALL, self._seqid)
        args = getLatestQueueStatuses_args()
        args.authzToken = authzToken
        args.write(self._oprot)
        self._oprot.writeMessageEnd()
        self._oprot.trans.flush()

    def recv_getLatestQueueStatuses(self):
        iprot = self._iprot
        (fname, mtype, rseqid) = iprot.readMessageBegin()
        if mtype == TMessageType.EXCEPTION:
            x = TApplicationException()
            x.read(iprot)
            iprot.readMessageEnd()
            raise x
        result = getLatestQueueStatuses_result()
        result.read(iprot)
        iprot.readMessageEnd()
        if result.success is not None:
            return result.success
        if result.ire is not None:
            raise result.ire
        if result.ace is not None:
            raise result.ace
        if result.ase is not None:
            raise result.ase
        if result.ae is not None:
            raise result.ae
        raise TApplicationException(TApplicationException.MISSING_RESULT, "getLatestQueueStatuses failed: unknown result")

    def getWorkflow(self, authzToken, workflowTemplateId):
        """

        API Methods Related for Work-Flow Submission Features.


        Parameters:
         - authzToken
         - workflowTemplateId
        """
        self.send_getWorkflow(authzToken, workflowTemplateId)
        return self.recv_getWorkflow()

    def send_getWorkflow(self, authzToken, workflowTemplateId):
        self._oprot.writeMessageBegin('getWorkflow', TMessageType.CALL, self._seqid)
        args = getWorkflow_args()
        args.authzToken = authzToken
        args.workflowTemplateId = workflowTemplateId
        args.write(self._oprot)
        self._oprot.writeMessageEnd()
        self._oprot.trans.flush()

    def recv_getWorkflow(self):
        iprot = self._iprot
        (fname, mtype, rseqid) = iprot.readMessageBegin()
        if mtype == TMessageType.EXCEPTION:
            x = TApplicationException()
            x.read(iprot)
            iprot.readMessageEnd()
            raise x
        result = getWorkflow_result()
        result.read(iprot)
        iprot.readMessageEnd()
        if result.success is not None:
            return result.success
        if result.ire is not None:
            raise result.ire
        if result.ace is not None:
            raise result.ace
        if result.ase is not None:
            raise result.ase
        if result.ae is not None:
            raise result.ae
        raise TApplicationException(TApplicationException.MISSING_RESULT, "getWorkflow failed: unknown result")

    def deleteWorkflow(self, authzToken, workflowTemplateId):
        """
        Parameters:
         - authzToken
         - workflowTemplateId
        """
        self.send_deleteWorkflow(authzToken, workflowTemplateId)
        self.recv_deleteWorkflow()

    def send_deleteWorkflow(self, authzToken, workflowTemplateId):
        self._oprot.writeMessageBegin('deleteWorkflow', TMessageType.CALL, self._seqid)
        args = deleteWorkflow_args()
        args.authzToken = authzToken
        args.workflowTemplateId = workflowTemplateId
        args.write(self._oprot)
        self._oprot.writeMessageEnd()
        self._oprot.trans.flush()

    def recv_deleteWorkflow(self):
        iprot = self._iprot
        (fname, mtype, rseqid) = iprot.readMessageBegin()
        if mtype == TMessageType.EXCEPTION:
            x = TApplicationException()
            x.read(iprot)
            iprot.readMessageEnd()
            raise x
        result = deleteWorkflow_result()
        result.read(iprot)
        iprot.readMessageEnd()
        if result.ire is not None:
            raise result.ire
        if result.ace is not None:
            raise result.ace
        if result.ase is not None:
            raise result.ase
        if result.ae is not None:
            raise result.ae
        return

    def registerWorkflow(self, authzToken, gatewayId, workflow):
        """
        Parameters:
         - authzToken
         - gatewayId
         - workflow
        """
        self.send_registerWorkflow(authzToken, gatewayId, workflow)
        return self.recv_registerWorkflow()

    def send_registerWorkflow(self, authzToken, gatewayId, workflow):
        self._oprot.writeMessageBegin('registerWorkflow', TMessageType.CALL, self._seqid)
        args = registerWorkflow_args()
        args.authzToken = authzToken
        args.gatewayId = gatewayId
        args.workflow = workflow
        args.write(self._oprot)
        self._oprot.writeMessageEnd()
        self._oprot.trans.flush()

    def recv_registerWorkflow(self):
        iprot = self._iprot
        (fname, mtype, rseqid) = iprot.readMessageBegin()
        if mtype == TMessageType.EXCEPTION:
            x = TApplicationException()
            x.read(iprot)
            iprot.readMessageEnd()
            raise x
        result = registerWorkflow_result()
        result.read(iprot)
        iprot.readMessageEnd()
        if result.success is not None:
            return result.success
        if result.ire is not None:
            raise result.ire
        if result.ace is not None:
            raise result.ace
        if result.ase is not None:
            raise result.ase
        if result.ae is not None:
            raise result.ae
        raise TApplicationException(TApplicationException.MISSING_RESULT, "registerWorkflow failed: unknown result")

    def updateWorkflow(self, authzToken, workflowTemplateId, workflow):
        """
        Parameters:
         - authzToken
         - workflowTemplateId
         - workflow
        """
        self.send_updateWorkflow(authzToken, workflowTemplateId, workflow)
        self.recv_updateWorkflow()

    def send_updateWorkflow(self, authzToken, workflowTemplateId, workflow):
        self._oprot.writeMessageBegin('updateWorkflow', TMessageType.CALL, self._seqid)
        args = updateWorkflow_args()
        args.authzToken = authzToken
        args.workflowTemplateId = workflowTemplateId
        args.workflow = workflow
        args.write(self._oprot)
        self._oprot.writeMessageEnd()
        self._oprot.trans.flush()

    def recv_updateWorkflow(self):
        iprot = self._iprot
        (fname, mtype, rseqid) = iprot.readMessageBegin()
        if mtype == TMessageType.EXCEPTION:
            x = TApplicationException()
            x.read(iprot)
            iprot.readMessageEnd()
            raise x
        result = updateWorkflow_result()
        result.read(iprot)
        iprot.readMessageEnd()
        if result.ire is not None:
            raise result.ire
        if result.ace is not None:
            raise result.ace
        if result.ase is not None:
            raise result.ase
        if result.ae is not None:
            raise result.ae
        return

    def getWorkflowTemplateId(self, authzToken, workflowName):
        """
        Parameters:
         - authzToken
         - workflowName
        """
        self.send_getWorkflowTemplateId(authzToken, workflowName)
        return self.recv_getWorkflowTemplateId()

    def send_getWorkflowTemplateId(self, authzToken, workflowName):
        self._oprot.writeMessageBegin('getWorkflowTemplateId', TMessageType.CALL, self._seqid)
        args = getWorkflowTemplateId_args()
        args.authzToken = authzToken
        args.workflowName = workflowName
        args.write(self._oprot)
        self._oprot.writeMessageEnd()
        self._oprot.trans.flush()

    def recv_getWorkflowTemplateId(self):
        iprot = self._iprot
        (fname, mtype, rseqid) = iprot.readMessageBegin()
        if mtype == TMessageType.EXCEPTION:
            x = TApplicationException()
            x.read(iprot)
            iprot.readMessageEnd()
            raise x
        result = getWorkflowTemplateId_result()
        result.read(iprot)
        iprot.readMessageEnd()
        if result.success is not None:
            return result.success
        if result.ire is not None:
            raise result.ire
        if result.ace is not None:
            raise result.ace
        if result.ase is not None:
            raise result.ase
        if result.ae is not None:
            raise result.ae
        raise TApplicationException(TApplicationException.MISSING_RESULT, "getWorkflowTemplateId failed: unknown result")

    def isWorkflowExistWithName(self, authzToken, workflowName):
        """
        Parameters:
         - authzToken
         - workflowName
        """
        self.send_isWorkflowExistWithName(authzToken, workflowName)
        return self.recv_isWorkflowExistWithName()

    def send_isWorkflowExistWithName(self, authzToken, workflowName):
        self._oprot.writeMessageBegin('isWorkflowExistWithName', TMessageType.CALL, self._seqid)
        args = isWorkflowExistWithName_args()
        args.authzToken = authzToken
        args.workflowName = workflowName
        args.write(self._oprot)
        self._oprot.writeMessageEnd()
        self._oprot.trans.flush()

    def recv_isWorkflowExistWithName(self):
        iprot = self._iprot
        (fname, mtype, rseqid) = iprot.readMessageBegin()
        if mtype == TMessageType.EXCEPTION:
            x = TApplicationException()
            x.read(iprot)
            iprot.readMessageEnd()
            raise x
        result = isWorkflowExistWithName_result()
        result.read(iprot)
        iprot.readMessageEnd()
        if result.success is not None:
            return result.success
        if result.ire is not None:
            raise result.ire
        if result.ace is not None:
            raise result.ace
        if result.ase is not None:
            raise result.ase
        if result.ae is not None:
            raise result.ae
        raise TApplicationException(TApplicationException.MISSING_RESULT, "isWorkflowExistWithName failed: unknown result")

    def registerDataProduct(self, authzToken, dataProductModel):
        """
        API Methods related to replica catalog


        Parameters:
         - authzToken
         - dataProductModel
        """
        self.send_registerDataProduct(authzToken, dataProductModel)
        return self.recv_registerDataProduct()

    def send_registerDataProduct(self, authzToken, dataProductModel):
        self._oprot.writeMessageBegin('registerDataProduct', TMessageType.CALL, self._seqid)
        args = registerDataProduct_args()
        args.authzToken = authzToken
        args.dataProductModel = dataProductModel
        args.write(self._oprot)
        self._oprot.writeMessageEnd()
        self._oprot.trans.flush()

    def recv_registerDataProduct(self):
        iprot = self._iprot
        (fname, mtype, rseqid) = iprot.readMessageBegin()
        if mtype == TMessageType.EXCEPTION:
            x = TApplicationException()
            x.read(iprot)
            iprot.readMessageEnd()
            raise x
        result = registerDataProduct_result()
        result.read(iprot)
        iprot.readMessageEnd()
        if result.success is not None:
            return result.success
        if result.ire is not None:
            raise result.ire
        if result.ace is not None:
            raise result.ace
        if result.ase is not None:
            raise result.ase
        if result.ae is not None:
            raise result.ae
        raise TApplicationException(TApplicationException.MISSING_RESULT, "registerDataProduct failed: unknown result")

    def getDataProduct(self, authzToken, dataProductUri):
        """
        Parameters:
         - authzToken
         - dataProductUri
        """
        self.send_getDataProduct(authzToken, dataProductUri)
        return self.recv_getDataProduct()

    def send_getDataProduct(self, authzToken, dataProductUri):
        self._oprot.writeMessageBegin('getDataProduct', TMessageType.CALL, self._seqid)
        args = getDataProduct_args()
        args.authzToken = authzToken
        args.dataProductUri = dataProductUri
        args.write(self._oprot)
        self._oprot.writeMessageEnd()
        self._oprot.trans.flush()

    def recv_getDataProduct(self):
        iprot = self._iprot
        (fname, mtype, rseqid) = iprot.readMessageBegin()
        if mtype == TMessageType.EXCEPTION:
            x = TApplicationException()
            x.read(iprot)
            iprot.readMessageEnd()
            raise x
        result = getDataProduct_result()
        result.read(iprot)
        iprot.readMessageEnd()
        if result.success is not None:
            return result.success
        if result.ire is not None:
            raise result.ire
        if result.ace is not None:
            raise result.ace
        if result.ase is not None:
            raise result.ase
        if result.ae is not None:
            raise result.ae
        raise TApplicationException(TApplicationException.MISSING_RESULT, "getDataProduct failed: unknown result")

    def registerReplicaLocation(self, authzToken, replicaLocationModel):
        """
        Parameters:
         - authzToken
         - replicaLocationModel
        """
        self.send_registerReplicaLocation(authzToken, replicaLocationModel)
        return self.recv_registerReplicaLocation()

    def send_registerReplicaLocation(self, authzToken, replicaLocationModel):
        self._oprot.writeMessageBegin('registerReplicaLocation', TMessageType.CALL, self._seqid)
        args = registerReplicaLocation_args()
        args.authzToken = authzToken
        args.replicaLocationModel = replicaLocationModel
        args.write(self._oprot)
        self._oprot.writeMessageEnd()
        self._oprot.trans.flush()

    def recv_registerReplicaLocation(self):
        iprot = self._iprot
        (fname, mtype, rseqid) = iprot.readMessageBegin()
        if mtype == TMessageType.EXCEPTION:
            x = TApplicationException()
            x.read(iprot)
            iprot.readMessageEnd()
            raise x
        result = registerReplicaLocation_result()
        result.read(iprot)
        iprot.readMessageEnd()
        if result.success is not None:
            return result.success
        if result.ire is not None:
            raise result.ire
        if result.ace is not None:
            raise result.ace
        if result.ase is not None:
            raise result.ase
        if result.ae is not None:
            raise result.ae
        raise TApplicationException(TApplicationException.MISSING_RESULT, "registerReplicaLocation failed: unknown result")

    def getParentDataProduct(self, authzToken, productUri):
        """
        Parameters:
         - authzToken
         - productUri
        """
        self.send_getParentDataProduct(authzToken, productUri)
        return self.recv_getParentDataProduct()

    def send_getParentDataProduct(self, authzToken, productUri):
        self._oprot.writeMessageBegin('getParentDataProduct', TMessageType.CALL, self._seqid)
        args = getParentDataProduct_args()
        args.authzToken = authzToken
        args.productUri = productUri
        args.write(self._oprot)
        self._oprot.writeMessageEnd()
        self._oprot.trans.flush()

    def recv_getParentDataProduct(self):
        iprot = self._iprot
        (fname, mtype, rseqid) = iprot.readMessageBegin()
        if mtype == TMessageType.EXCEPTION:
            x = TApplicationException()
            x.read(iprot)
            iprot.readMessageEnd()
            raise x
        result = getParentDataProduct_result()
        result.read(iprot)
        iprot.readMessageEnd()
        if result.success is not None:
            return result.success
        if result.ire is not None:
            raise result.ire
        if result.ace is not None:
            raise result.ace
        if result.ase is not None:
            raise result.ase
        if result.ae is not None:
            raise result.ae
        raise TApplicationException(TApplicationException.MISSING_RESULT, "getParentDataProduct failed: unknown result")

    def getChildDataProducts(self, authzToken, productUri):
        """
        Parameters:
         - authzToken
         - productUri
        """
        self.send_getChildDataProducts(authzToken, productUri)
        return self.recv_getChildDataProducts()

    def send_getChildDataProducts(self, authzToken, productUri):
        self._oprot.writeMessageBegin('getChildDataProducts', TMessageType.CALL, self._seqid)
        args = getChildDataProducts_args()
        args.authzToken = authzToken
        args.productUri = productUri
        args.write(self._oprot)
        self._oprot.writeMessageEnd()
        self._oprot.trans.flush()

    def recv_getChildDataProducts(self):
        iprot = self._iprot
        (fname, mtype, rseqid) = iprot.readMessageBegin()
        if mtype == TMessageType.EXCEPTION:
            x = TApplicationException()
            x.read(iprot)
            iprot.readMessageEnd()
            raise x
        result = getChildDataProducts_result()
        result.read(iprot)
        iprot.readMessageEnd()
        if result.success is not None:
            return result.success
        if result.ire is not None:
            raise result.ire
        if result.ace is not None:
            raise result.ace
        if result.ase is not None:
            raise result.ase
        if result.ae is not None:
            raise result.ae
        raise TApplicationException(TApplicationException.MISSING_RESULT, "getChildDataProducts failed: unknown result")

    def shareResourceWithUsers(self, authzToken, resourceId, resourceType, userPermissionList):
        """
        Group Manager and Data Sharing Related API methods


        Parameters:
         - authzToken
         - resourceId
         - resourceType
         - userPermissionList
        """
        self.send_shareResourceWithUsers(authzToken, resourceId, resourceType, userPermissionList)
        return self.recv_shareResourceWithUsers()

    def send_shareResourceWithUsers(self, authzToken, resourceId, resourceType, userPermissionList):
        self._oprot.writeMessageBegin('shareResourceWithUsers', TMessageType.CALL, self._seqid)
        args = shareResourceWithUsers_args()
        args.authzToken = authzToken
        args.resourceId = resourceId
        args.resourceType = resourceType
        args.userPermissionList = userPermissionList
        args.write(self._oprot)
        self._oprot.writeMessageEnd()
        self._oprot.trans.flush()

    def recv_shareResourceWithUsers(self):
        iprot = self._iprot
        (fname, mtype, rseqid) = iprot.readMessageBegin()
        if mtype == TMessageType.EXCEPTION:
            x = TApplicationException()
            x.read(iprot)
            iprot.readMessageEnd()
            raise x
        result = shareResourceWithUsers_result()
        result.read(iprot)
        iprot.readMessageEnd()
        if result.success is not None:
            return result.success
        if result.ire is not None:
            raise result.ire
        if result.ace is not None:
            raise result.ace
        if result.ase is not None:
            raise result.ase
        if result.ae is not None:
            raise result.ae
        raise TApplicationException(TApplicationException.MISSING_RESULT, "shareResourceWithUsers failed: unknown result")

    def revokeSharingOfResourceFromUsers(self, authzToken, resourceId, resourceType, userPermissionList):
        """
        Parameters:
         - authzToken
         - resourceId
         - resourceType
         - userPermissionList
        """
        self.send_revokeSharingOfResourceFromUsers(authzToken, resourceId, resourceType, userPermissionList)
        return self.recv_revokeSharingOfResourceFromUsers()

    def send_revokeSharingOfResourceFromUsers(self, authzToken, resourceId, resourceType, userPermissionList):
        self._oprot.writeMessageBegin('revokeSharingOfResourceFromUsers', TMessageType.CALL, self._seqid)
        args = revokeSharingOfResourceFromUsers_args()
        args.authzToken = authzToken
        args.resourceId = resourceId
        args.resourceType = resourceType
        args.userPermissionList = userPermissionList
        args.write(self._oprot)
        self._oprot.writeMessageEnd()
        self._oprot.trans.flush()

    def recv_revokeSharingOfResourceFromUsers(self):
        iprot = self._iprot
        (fname, mtype, rseqid) = iprot.readMessageBegin()
        if mtype == TMessageType.EXCEPTION:
            x = TApplicationException()
            x.read(iprot)
            iprot.readMessageEnd()
            raise x
        result = revokeSharingOfResourceFromUsers_result()
        result.read(iprot)
        iprot.readMessageEnd()
        if result.success is not None:
            return result.success
        if result.ire is not None:
            raise result.ire
        if result.ace is not None:
            raise result.ace
        if result.ase is not None:
            raise result.ase
        if result.ae is not None:
            raise result.ae
        raise TApplicationException(TApplicationException.MISSING_RESULT, "revokeSharingOfResourceFromUsers failed: unknown result")

    def getAllAccessibleUsers(self, authzToken, resourceId, resourceType, permissionType):
        """
        Parameters:
         - authzToken
         - resourceId
         - resourceType
         - permissionType
        """
        self.send_getAllAccessibleUsers(authzToken, resourceId, resourceType, permissionType)
        return self.recv_getAllAccessibleUsers()

    def send_getAllAccessibleUsers(self, authzToken, resourceId, resourceType, permissionType):
        self._oprot.writeMessageBegin('getAllAccessibleUsers', TMessageType.CALL, self._seqid)
        args = getAllAccessibleUsers_args()
        args.authzToken = authzToken
        args.resourceId = resourceId
        args.resourceType = resourceType
        args.permissionType = permissionType
        args.write(self._oprot)
        self._oprot.writeMessageEnd()
        self._oprot.trans.flush()

    def recv_getAllAccessibleUsers(self):
        iprot = self._iprot
        (fname, mtype, rseqid) = iprot.readMessageBegin()
        if mtype == TMessageType.EXCEPTION:
            x = TApplicationException()
            x.read(iprot)
            iprot.readMessageEnd()
            raise x
        result = getAllAccessibleUsers_result()
        result.read(iprot)
        iprot.readMessageEnd()
        if result.success is not None:
            return result.success
        if result.ire is not None:
            raise result.ire
        if result.ace is not None:
            raise result.ace
        if result.ase is not None:
            raise result.ase
        if result.ae is not None:
            raise result.ae
        raise TApplicationException(TApplicationException.MISSING_RESULT, "getAllAccessibleUsers failed: unknown result")

    def createGroup(self, authzToken, groupModel):
        """
        Parameters:
         - authzToken
         - groupModel
        """
        self.send_createGroup(authzToken, groupModel)
        return self.recv_createGroup()

    def send_createGroup(self, authzToken, groupModel):
        self._oprot.writeMessageBegin('createGroup', TMessageType.CALL, self._seqid)
        args = createGroup_args()
        args.authzToken = authzToken
        args.groupModel = groupModel
        args.write(self._oprot)
        self._oprot.writeMessageEnd()
        self._oprot.trans.flush()

    def recv_createGroup(self):
        iprot = self._iprot
        (fname, mtype, rseqid) = iprot.readMessageBegin()
        if mtype == TMessageType.EXCEPTION:
            x = TApplicationException()
            x.read(iprot)
            iprot.readMessageEnd()
            raise x
        result = createGroup_result()
        result.read(iprot)
        iprot.readMessageEnd()
        if result.success is not None:
            return result.success
        if result.ire is not None:
            raise result.ire
        if result.ace is not None:
            raise result.ace
        if result.ase is not None:
            raise result.ase
        if result.ae is not None:
            raise result.ae
        raise TApplicationException(TApplicationException.MISSING_RESULT, "createGroup failed: unknown result")

    def updateGroup(self, authzToken, groupModel):
        """
        Parameters:
         - authzToken
         - groupModel
        """
        self.send_updateGroup(authzToken, groupModel)
        return self.recv_updateGroup()

    def send_updateGroup(self, authzToken, groupModel):
        self._oprot.writeMessageBegin('updateGroup', TMessageType.CALL, self._seqid)
        args = updateGroup_args()
        args.authzToken = authzToken
        args.groupModel = groupModel
        args.write(self._oprot)
        self._oprot.writeMessageEnd()
        self._oprot.trans.flush()

    def recv_updateGroup(self):
        iprot = self._iprot
        (fname, mtype, rseqid) = iprot.readMessageBegin()
        if mtype == TMessageType.EXCEPTION:
            x = TApplicationException()
            x.read(iprot)
            iprot.readMessageEnd()
            raise x
        result = updateGroup_result()
        result.read(iprot)
        iprot.readMessageEnd()
        if result.success is not None:
            return result.success
        if result.ire is not None:
            raise result.ire
        if result.ace is not None:
            raise result.ace
        if result.ase is not None:
            raise result.ase
        if result.ae is not None:
            raise result.ae
        raise TApplicationException(TApplicationException.MISSING_RESULT, "updateGroup failed: unknown result")

    def deleteGroup(self, authzToken, groupId, ownerId, gatewayId):
        """
        Parameters:
         - authzToken
         - groupId
         - ownerId
         - gatewayId
        """
        self.send_deleteGroup(authzToken, groupId, ownerId, gatewayId)
        return self.recv_deleteGroup()

    def send_deleteGroup(self, authzToken, groupId, ownerId, gatewayId):
        self._oprot.writeMessageBegin('deleteGroup', TMessageType.CALL, self._seqid)
        args = deleteGroup_args()
        args.authzToken = authzToken
        args.groupId = groupId
        args.ownerId = ownerId
        args.gatewayId = gatewayId
        args.write(self._oprot)
        self._oprot.writeMessageEnd()
        self._oprot.trans.flush()

    def recv_deleteGroup(self):
        iprot = self._iprot
        (fname, mtype, rseqid) = iprot.readMessageBegin()
        if mtype == TMessageType.EXCEPTION:
            x = TApplicationException()
            x.read(iprot)
            iprot.readMessageEnd()
            raise x
        result = deleteGroup_result()
        result.read(iprot)
        iprot.readMessageEnd()
        if result.success is not None:
            return result.success
        if result.ire is not None:
            raise result.ire
        if result.ace is not None:
            raise result.ace
        if result.ase is not None:
            raise result.ase
        if result.ae is not None:
            raise result.ae
        raise TApplicationException(TApplicationException.MISSING_RESULT, "deleteGroup failed: unknown result")

    def getGroup(self, authzToken, groupId):
        """
        Parameters:
         - authzToken
         - groupId
        """
        self.send_getGroup(authzToken, groupId)
        return self.recv_getGroup()

    def send_getGroup(self, authzToken, groupId):
        self._oprot.writeMessageBegin('getGroup', TMessageType.CALL, self._seqid)
        args = getGroup_args()
        args.authzToken = authzToken
        args.groupId = groupId
        args.write(self._oprot)
        self._oprot.writeMessageEnd()
        self._oprot.trans.flush()

    def recv_getGroup(self):
        iprot = self._iprot
        (fname, mtype, rseqid) = iprot.readMessageBegin()
        if mtype == TMessageType.EXCEPTION:
            x = TApplicationException()
            x.read(iprot)
            iprot.readMessageEnd()
            raise x
        result = getGroup_result()
        result.read(iprot)
        iprot.readMessageEnd()
        if result.success is not None:
            return result.success
        if result.ire is not None:
            raise result.ire
        if result.ace is not None:
            raise result.ace
        if result.ase is not None:
            raise result.ase
        if result.ae is not None:
            raise result.ae
        raise TApplicationException(TApplicationException.MISSING_RESULT, "getGroup failed: unknown result")

    def getAllGroupsUserBelongs(self, authzToken, userName, gatewayId):
        """
        Parameters:
         - authzToken
         - userName
         - gatewayId
        """
        self.send_getAllGroupsUserBelongs(authzToken, userName, gatewayId)
        return self.recv_getAllGroupsUserBelongs()

    def send_getAllGroupsUserBelongs(self, authzToken, userName, gatewayId):
        self._oprot.writeMessageBegin('getAllGroupsUserBelongs', TMessageType.CALL, self._seqid)
        args = getAllGroupsUserBelongs_args()
        args.authzToken = authzToken
        args.userName = userName
        args.gatewayId = gatewayId
        args.write(self._oprot)
        self._oprot.writeMessageEnd()
        self._oprot.trans.flush()

    def recv_getAllGroupsUserBelongs(self):
        iprot = self._iprot
        (fname, mtype, rseqid) = iprot.readMessageBegin()
        if mtype == TMessageType.EXCEPTION:
            x = TApplicationException()
            x.read(iprot)
            iprot.readMessageEnd()
            raise x
        result = getAllGroupsUserBelongs_result()
        result.read(iprot)
        iprot.readMessageEnd()
        if result.success is not None:
            return result.success
        if result.ire is not None:
            raise result.ire
        if result.ace is not None:
            raise result.ace
        if result.ase is not None:
            raise result.ase
        if result.ae is not None:
            raise result.ae
        raise TApplicationException(TApplicationException.MISSING_RESULT, "getAllGroupsUserBelongs failed: unknown result")


class Processor(Iface, TProcessor):
    def __init__(self, handler):
        self._handler = handler
        self._processMap = {}
        self._processMap["getAPIVersion"] = Processor.process_getAPIVersion
        self._processMap["isUserExists"] = Processor.process_isUserExists
        self._processMap["addGateway"] = Processor.process_addGateway
        self._processMap["getAllUsersInGateway"] = Processor.process_getAllUsersInGateway
        self._processMap["updateGateway"] = Processor.process_updateGateway
        self._processMap["getGateway"] = Processor.process_getGateway
        self._processMap["deleteGateway"] = Processor.process_deleteGateway
        self._processMap["getAllGateways"] = Processor.process_getAllGateways
        self._processMap["isGatewayExist"] = Processor.process_isGatewayExist
        self._processMap["createNotification"] = Processor.process_createNotification
        self._processMap["updateNotification"] = Processor.process_updateNotification
        self._processMap["deleteNotification"] = Processor.process_deleteNotification
        self._processMap["getNotification"] = Processor.process_getNotification
        self._processMap["getAllNotifications"] = Processor.process_getAllNotifications
        self._processMap["generateAndRegisterSSHKeys"] = Processor.process_generateAndRegisterSSHKeys
        self._processMap["registerPwdCredential"] = Processor.process_registerPwdCredential
        self._processMap["getSSHPubKey"] = Processor.process_getSSHPubKey
        self._processMap["getAllGatewaySSHPubKeys"] = Processor.process_getAllGatewaySSHPubKeys
        self._processMap["getAllCredentialSummaryForGateway"] = Processor.process_getAllCredentialSummaryForGateway
        self._processMap["getAllCredentialSummaryForUsersInGateway"] = Processor.process_getAllCredentialSummaryForUsersInGateway
        self._processMap["getAllGatewayPWDCredentials"] = Processor.process_getAllGatewayPWDCredentials
        self._processMap["deleteSSHPubKey"] = Processor.process_deleteSSHPubKey
        self._processMap["deletePWDCredential"] = Processor.process_deletePWDCredential
        self._processMap["createProject"] = Processor.process_createProject
        self._processMap["updateProject"] = Processor.process_updateProject
        self._processMap["getProject"] = Processor.process_getProject
        self._processMap["deleteProject"] = Processor.process_deleteProject
        self._processMap["getUserProjects"] = Processor.process_getUserProjects
        self._processMap["searchProjects"] = Processor.process_searchProjects
        self._processMap["searchExperiments"] = Processor.process_searchExperiments
        self._processMap["getExperimentStatistics"] = Processor.process_getExperimentStatistics
        self._processMap["getExperimentsInProject"] = Processor.process_getExperimentsInProject
        self._processMap["getUserExperiments"] = Processor.process_getUserExperiments
        self._processMap["createExperiment"] = Processor.process_createExperiment
        self._processMap["deleteExperiment"] = Processor.process_deleteExperiment
        self._processMap["getExperiment"] = Processor.process_getExperiment
        self._processMap["getExperimentByAdmin"] = Processor.process_getExperimentByAdmin
        self._processMap["getDetailedExperimentTree"] = Processor.process_getDetailedExperimentTree
        self._processMap["updateExperiment"] = Processor.process_updateExperiment
        self._processMap["updateExperimentConfiguration"] = Processor.process_updateExperimentConfiguration
        self._processMap["updateResourceScheduleing"] = Processor.process_updateResourceScheduleing
        self._processMap["validateExperiment"] = Processor.process_validateExperiment
        self._processMap["launchExperiment"] = Processor.process_launchExperiment
        self._processMap["getExperimentStatus"] = Processor.process_getExperimentStatus
        self._processMap["getExperimentOutputs"] = Processor.process_getExperimentOutputs
        self._processMap["getIntermediateOutputs"] = Processor.process_getIntermediateOutputs
        self._processMap["getJobStatuses"] = Processor.process_getJobStatuses
        self._processMap["getJobDetails"] = Processor.process_getJobDetails
        self._processMap["cloneExperiment"] = Processor.process_cloneExperiment
        self._processMap["cloneExperimentByAdmin"] = Processor.process_cloneExperimentByAdmin
        self._processMap["terminateExperiment"] = Processor.process_terminateExperiment
        self._processMap["registerApplicationModule"] = Processor.process_registerApplicationModule
        self._processMap["getApplicationModule"] = Processor.process_getApplicationModule
        self._processMap["updateApplicationModule"] = Processor.process_updateApplicationModule
        self._processMap["getAllAppModules"] = Processor.process_getAllAppModules
        self._processMap["deleteApplicationModule"] = Processor.process_deleteApplicationModule
        self._processMap["registerApplicationDeployment"] = Processor.process_registerApplicationDeployment
        self._processMap["getApplicationDeployment"] = Processor.process_getApplicationDeployment
        self._processMap["updateApplicationDeployment"] = Processor.process_updateApplicationDeployment
        self._processMap["deleteApplicationDeployment"] = Processor.process_deleteApplicationDeployment
        self._processMap["getAllApplicationDeployments"] = Processor.process_getAllApplicationDeployments
        self._processMap["getAppModuleDeployedResources"] = Processor.process_getAppModuleDeployedResources
        self._processMap["registerApplicationInterface"] = Processor.process_registerApplicationInterface
        self._processMap["cloneApplicationInterface"] = Processor.process_cloneApplicationInterface
        self._processMap["getApplicationInterface"] = Processor.process_getApplicationInterface
        self._processMap["updateApplicationInterface"] = Processor.process_updateApplicationInterface
        self._processMap["deleteApplicationInterface"] = Processor.process_deleteApplicationInterface
        self._processMap["getAllApplicationInterfaceNames"] = Processor.process_getAllApplicationInterfaceNames
        self._processMap["getAllApplicationInterfaces"] = Processor.process_getAllApplicationInterfaces
        self._processMap["getApplicationInputs"] = Processor.process_getApplicationInputs
        self._processMap["getApplicationOutputs"] = Processor.process_getApplicationOutputs
        self._processMap["getAvailableAppInterfaceComputeResources"] = Processor.process_getAvailableAppInterfaceComputeResources
        self._processMap["registerComputeResource"] = Processor.process_registerComputeResource
        self._processMap["getComputeResource"] = Processor.process_getComputeResource
        self._processMap["getAllComputeResourceNames"] = Processor.process_getAllComputeResourceNames
        self._processMap["updateComputeResource"] = Processor.process_updateComputeResource
        self._processMap["deleteComputeResource"] = Processor.process_deleteComputeResource
        self._processMap["registerStorageResource"] = Processor.process_registerStorageResource
        self._processMap["getStorageResource"] = Processor.process_getStorageResource
        self._processMap["getAllStorageResourceNames"] = Processor.process_getAllStorageResourceNames
        self._processMap["updateStorageResource"] = Processor.process_updateStorageResource
        self._processMap["deleteStorageResource"] = Processor.process_deleteStorageResource
        self._processMap["addLocalSubmissionDetails"] = Processor.process_addLocalSubmissionDetails
        self._processMap["updateLocalSubmissionDetails"] = Processor.process_updateLocalSubmissionDetails
        self._processMap["getLocalJobSubmission"] = Processor.process_getLocalJobSubmission
        self._processMap["addSSHJobSubmissionDetails"] = Processor.process_addSSHJobSubmissionDetails
        self._processMap["addSSHForkJobSubmissionDetails"] = Processor.process_addSSHForkJobSubmissionDetails
        self._processMap["getSSHJobSubmission"] = Processor.process_getSSHJobSubmission
        self._processMap["addUNICOREJobSubmissionDetails"] = Processor.process_addUNICOREJobSubmissionDetails
        self._processMap["getUnicoreJobSubmission"] = Processor.process_getUnicoreJobSubmission
        self._processMap["addCloudJobSubmissionDetails"] = Processor.process_addCloudJobSubmissionDetails
        self._processMap["getCloudJobSubmission"] = Processor.process_getCloudJobSubmission
        self._processMap["updateSSHJobSubmissionDetails"] = Processor.process_updateSSHJobSubmissionDetails
        self._processMap["updateCloudJobSubmissionDetails"] = Processor.process_updateCloudJobSubmissionDetails
        self._processMap["updateUnicoreJobSubmissionDetails"] = Processor.process_updateUnicoreJobSubmissionDetails
        self._processMap["addLocalDataMovementDetails"] = Processor.process_addLocalDataMovementDetails
        self._processMap["updateLocalDataMovementDetails"] = Processor.process_updateLocalDataMovementDetails
        self._processMap["getLocalDataMovement"] = Processor.process_getLocalDataMovement
        self._processMap["addSCPDataMovementDetails"] = Processor.process_addSCPDataMovementDetails
        self._processMap["updateSCPDataMovementDetails"] = Processor.process_updateSCPDataMovementDetails
        self._processMap["getSCPDataMovement"] = Processor.process_getSCPDataMovement
        self._processMap["addUnicoreDataMovementDetails"] = Processor.process_addUnicoreDataMovementDetails
        self._processMap["updateUnicoreDataMovementDetails"] = Processor.process_updateUnicoreDataMovementDetails
        self._processMap["getUnicoreDataMovement"] = Processor.process_getUnicoreDataMovement
        self._processMap["addGridFTPDataMovementDetails"] = Processor.process_addGridFTPDataMovementDetails
        self._processMap["updateGridFTPDataMovementDetails"] = Processor.process_updateGridFTPDataMovementDetails
        self._processMap["getGridFTPDataMovement"] = Processor.process_getGridFTPDataMovement
        self._processMap["changeJobSubmissionPriority"] = Processor.process_changeJobSubmissionPriority
        self._processMap["changeDataMovementPriority"] = Processor.process_changeDataMovementPriority
        self._processMap["changeJobSubmissionPriorities"] = Processor.process_changeJobSubmissionPriorities
        self._processMap["changeDataMovementPriorities"] = Processor.process_changeDataMovementPriorities
        self._processMap["deleteJobSubmissionInterface"] = Processor.process_deleteJobSubmissionInterface
        self._processMap["deleteDataMovementInterface"] = Processor.process_deleteDataMovementInterface
        self._processMap["registerResourceJobManager"] = Processor.process_registerResourceJobManager
        self._processMap["updateResourceJobManager"] = Processor.process_updateResourceJobManager
        self._processMap["getResourceJobManager"] = Processor.process_getResourceJobManager
        self._processMap["deleteResourceJobManager"] = Processor.process_deleteResourceJobManager
        self._processMap["deleteBatchQueue"] = Processor.process_deleteBatchQueue
        self._processMap["registerGatewayResourceProfile"] = Processor.process_registerGatewayResourceProfile
        self._processMap["getGatewayResourceProfile"] = Processor.process_getGatewayResourceProfile
        self._processMap["updateGatewayResourceProfile"] = Processor.process_updateGatewayResourceProfile
        self._processMap["deleteGatewayResourceProfile"] = Processor.process_deleteGatewayResourceProfile
        self._processMap["addGatewayComputeResourcePreference"] = Processor.process_addGatewayComputeResourcePreference
        self._processMap["addGatewayStoragePreference"] = Processor.process_addGatewayStoragePreference
        self._processMap["getGatewayComputeResourcePreference"] = Processor.process_getGatewayComputeResourcePreference
        self._processMap["getGatewayStoragePreference"] = Processor.process_getGatewayStoragePreference
        self._processMap["getAllGatewayComputeResourcePreferences"] = Processor.process_getAllGatewayComputeResourcePreferences
        self._processMap["getAllGatewayStoragePreferences"] = Processor.process_getAllGatewayStoragePreferences
        self._processMap["getAllGatewayResourceProfiles"] = Processor.process_getAllGatewayResourceProfiles
        self._processMap["updateGatewayComputeResourcePreference"] = Processor.process_updateGatewayComputeResourcePreference
        self._processMap["updateGatewayStoragePreference"] = Processor.process_updateGatewayStoragePreference
        self._processMap["deleteGatewayComputeResourcePreference"] = Processor.process_deleteGatewayComputeResourcePreference
        self._processMap["deleteGatewayStoragePreference"] = Processor.process_deleteGatewayStoragePreference
        self._processMap["registerUserResourceProfile"] = Processor.process_registerUserResourceProfile
        self._processMap["getUserResourceProfile"] = Processor.process_getUserResourceProfile
        self._processMap["updateUserResourceProfile"] = Processor.process_updateUserResourceProfile
        self._processMap["deleteUserResourceProfile"] = Processor.process_deleteUserResourceProfile
        self._processMap["addUserComputeResourcePreference"] = Processor.process_addUserComputeResourcePreference
        self._processMap["addUserStoragePreference"] = Processor.process_addUserStoragePreference
        self._processMap["getUserComputeResourcePreference"] = Processor.process_getUserComputeResourcePreference
        self._processMap["getUserStoragePreference"] = Processor.process_getUserStoragePreference
        self._processMap["getAllUserComputeResourcePreferences"] = Processor.process_getAllUserComputeResourcePreferences
        self._processMap["getAllUserStoragePreferences"] = Processor.process_getAllUserStoragePreferences
        self._processMap["getAllUserResourceProfiles"] = Processor.process_getAllUserResourceProfiles
        self._processMap["updateUserComputeResourcePreference"] = Processor.process_updateUserComputeResourcePreference
        self._processMap["updateUserStoragePreference"] = Processor.process_updateUserStoragePreference
        self._processMap["deleteUserComputeResourcePreference"] = Processor.process_deleteUserComputeResourcePreference
        self._processMap["deleteUserStoragePreference"] = Processor.process_deleteUserStoragePreference
        self._processMap["getAllWorkflows"] = Processor.process_getAllWorkflows
        self._processMap["getLatestQueueStatuses"] = Processor.process_getLatestQueueStatuses
        self._processMap["getWorkflow"] = Processor.process_getWorkflow
        self._processMap["deleteWorkflow"] = Processor.process_deleteWorkflow
        self._processMap["registerWorkflow"] = Processor.process_registerWorkflow
        self._processMap["updateWorkflow"] = Processor.process_updateWorkflow
        self._processMap["getWorkflowTemplateId"] = Processor.process_getWorkflowTemplateId
        self._processMap["isWorkflowExistWithName"] = Processor.process_isWorkflowExistWithName
        self._processMap["registerDataProduct"] = Processor.process_registerDataProduct
        self._processMap["getDataProduct"] = Processor.process_getDataProduct
        self._processMap["registerReplicaLocation"] = Processor.process_registerReplicaLocation
        self._processMap["getParentDataProduct"] = Processor.process_getParentDataProduct
        self._processMap["getChildDataProducts"] = Processor.process_getChildDataProducts
        self._processMap["shareResourceWithUsers"] = Processor.process_shareResourceWithUsers
        self._processMap["revokeSharingOfResourceFromUsers"] = Processor.process_revokeSharingOfResourceFromUsers
        self._processMap["getAllAccessibleUsers"] = Processor.process_getAllAccessibleUsers
        self._processMap["createGroup"] = Processor.process_createGroup
        self._processMap["updateGroup"] = Processor.process_updateGroup
        self._processMap["deleteGroup"] = Processor.process_deleteGroup
        self._processMap["getGroup"] = Processor.process_getGroup
        self._processMap["getAllGroupsUserBelongs"] = Processor.process_getAllGroupsUserBelongs

    def process(self, iprot, oprot):
        (name, type, seqid) = iprot.readMessageBegin()
        if name not in self._processMap:
            iprot.skip(TType.STRUCT)
            iprot.readMessageEnd()
            x = TApplicationException(TApplicationException.UNKNOWN_METHOD, 'Unknown function %s' % (name))
            oprot.writeMessageBegin(name, TMessageType.EXCEPTION, seqid)
            x.write(oprot)
            oprot.writeMessageEnd()
            oprot.trans.flush()
            return
        else:
            self._processMap[name](self, seqid, iprot, oprot)
        return True

    def process_getAPIVersion(self, seqid, iprot, oprot):
        args = getAPIVersion_args()
        args.read(iprot)
        iprot.readMessageEnd()
        result = getAPIVersion_result()
        try:
            result.success = self._handler.getAPIVersion(args.authzToken)
            msg_type = TMessageType.REPLY
        except (TTransport.TTransportException, KeyboardInterrupt, SystemExit):
            raise
        except apache.airavata.api.error.ttypes.InvalidRequestException as ire:
            msg_type = TMessageType.REPLY
            result.ire = ire
        except apache.airavata.api.error.ttypes.AiravataClientException as ace:
            msg_type = TMessageType.REPLY
            result.ace = ace
        except apache.airavata.api.error.ttypes.AiravataSystemException as ase:
            msg_type = TMessageType.REPLY
            result.ase = ase
        except apache.airavata.api.error.ttypes.AuthorizationException as ae:
            msg_type = TMessageType.REPLY
            result.ae = ae
        except Exception as ex:
            msg_type = TMessageType.EXCEPTION
            logging.exception(ex)
            result = TApplicationException(TApplicationException.INTERNAL_ERROR, 'Internal error')
        oprot.writeMessageBegin("getAPIVersion", msg_type, seqid)
        result.write(oprot)
        oprot.writeMessageEnd()
        oprot.trans.flush()

    def process_isUserExists(self, seqid, iprot, oprot):
        args = isUserExists_args()
        args.read(iprot)
        iprot.readMessageEnd()
        result = isUserExists_result()
        try:
            result.success = self._handler.isUserExists(args.authzToken, args.gatewayId, args.userName)
            msg_type = TMessageType.REPLY
        except (TTransport.TTransportException, KeyboardInterrupt, SystemExit):
            raise
        except apache.airavata.api.error.ttypes.InvalidRequestException as ire:
            msg_type = TMessageType.REPLY
            result.ire = ire
        except apache.airavata.api.error.ttypes.AiravataClientException as ace:
            msg_type = TMessageType.REPLY
            result.ace = ace
        except apache.airavata.api.error.ttypes.AiravataSystemException as ase:
            msg_type = TMessageType.REPLY
            result.ase = ase
        except apache.airavata.api.error.ttypes.AuthorizationException as ae:
            msg_type = TMessageType.REPLY
            result.ae = ae
        except Exception as ex:
            msg_type = TMessageType.EXCEPTION
            logging.exception(ex)
            result = TApplicationException(TApplicationException.INTERNAL_ERROR, 'Internal error')
        oprot.writeMessageBegin("isUserExists", msg_type, seqid)
        result.write(oprot)
        oprot.writeMessageEnd()
        oprot.trans.flush()

    def process_addGateway(self, seqid, iprot, oprot):
        args = addGateway_args()
        args.read(iprot)
        iprot.readMessageEnd()
        result = addGateway_result()
        try:
            result.success = self._handler.addGateway(args.authzToken, args.gateway)
            msg_type = TMessageType.REPLY
        except (TTransport.TTransportException, KeyboardInterrupt, SystemExit):
            raise
        except apache.airavata.api.error.ttypes.InvalidRequestException as ire:
            msg_type = TMessageType.REPLY
            result.ire = ire
        except apache.airavata.api.error.ttypes.AiravataClientException as ace:
            msg_type = TMessageType.REPLY
            result.ace = ace
        except apache.airavata.api.error.ttypes.AiravataSystemException as ase:
            msg_type = TMessageType.REPLY
            result.ase = ase
        except apache.airavata.api.error.ttypes.AuthorizationException as ae:
            msg_type = TMessageType.REPLY
            result.ae = ae
        except Exception as ex:
            msg_type = TMessageType.EXCEPTION
            logging.exception(ex)
            result = TApplicationException(TApplicationException.INTERNAL_ERROR, 'Internal error')
        oprot.writeMessageBegin("addGateway", msg_type, seqid)
        result.write(oprot)
        oprot.writeMessageEnd()
        oprot.trans.flush()

    def process_getAllUsersInGateway(self, seqid, iprot, oprot):
        args = getAllUsersInGateway_args()
        args.read(iprot)
        iprot.readMessageEnd()
        result = getAllUsersInGateway_result()
        try:
            result.success = self._handler.getAllUsersInGateway(args.authzToken, args.gatewayId)
            msg_type = TMessageType.REPLY
        except (TTransport.TTransportException, KeyboardInterrupt, SystemExit):
            raise
        except apache.airavata.api.error.ttypes.InvalidRequestException as ire:
            msg_type = TMessageType.REPLY
            result.ire = ire
        except apache.airavata.api.error.ttypes.AiravataClientException as ace:
            msg_type = TMessageType.REPLY
            result.ace = ace
        except apache.airavata.api.error.ttypes.AiravataSystemException as ase:
            msg_type = TMessageType.REPLY
            result.ase = ase
        except apache.airavata.api.error.ttypes.AuthorizationException as ae:
            msg_type = TMessageType.REPLY
            result.ae = ae
        except Exception as ex:
            msg_type = TMessageType.EXCEPTION
            logging.exception(ex)
            result = TApplicationException(TApplicationException.INTERNAL_ERROR, 'Internal error')
        oprot.writeMessageBegin("getAllUsersInGateway", msg_type, seqid)
        result.write(oprot)
        oprot.writeMessageEnd()
        oprot.trans.flush()

    def process_updateGateway(self, seqid, iprot, oprot):
        args = updateGateway_args()
        args.read(iprot)
        iprot.readMessageEnd()
        result = updateGateway_result()
        try:
            result.success = self._handler.updateGateway(args.authzToken, args.gatewayId, args.updatedGateway)
            msg_type = TMessageType.REPLY
        except (TTransport.TTransportException, KeyboardInterrupt, SystemExit):
            raise
        except apache.airavata.api.error.ttypes.InvalidRequestException as ire:
            msg_type = TMessageType.REPLY
            result.ire = ire
        except apache.airavata.api.error.ttypes.AiravataClientException as ace:
            msg_type = TMessageType.REPLY
            result.ace = ace
        except apache.airavata.api.error.ttypes.AiravataSystemException as ase:
            msg_type = TMessageType.REPLY
            result.ase = ase
        except apache.airavata.api.error.ttypes.AuthorizationException as ae:
            msg_type = TMessageType.REPLY
            result.ae = ae
        except Exception as ex:
            msg_type = TMessageType.EXCEPTION
            logging.exception(ex)
            result = TApplicationException(TApplicationException.INTERNAL_ERROR, 'Internal error')
        oprot.writeMessageBegin("updateGateway", msg_type, seqid)
        result.write(oprot)
        oprot.writeMessageEnd()
        oprot.trans.flush()

    def process_getGateway(self, seqid, iprot, oprot):
        args = getGateway_args()
        args.read(iprot)
        iprot.readMessageEnd()
        result = getGateway_result()
        try:
            result.success = self._handler.getGateway(args.authzToken, args.gatewayId)
            msg_type = TMessageType.REPLY
        except (TTransport.TTransportException, KeyboardInterrupt, SystemExit):
            raise
        except apache.airavata.api.error.ttypes.InvalidRequestException as ire:
            msg_type = TMessageType.REPLY
            result.ire = ire
        except apache.airavata.api.error.ttypes.AiravataClientException as ace:
            msg_type = TMessageType.REPLY
            result.ace = ace
        except apache.airavata.api.error.ttypes.AiravataSystemException as ase:
            msg_type = TMessageType.REPLY
            result.ase = ase
        except apache.airavata.api.error.ttypes.AuthorizationException as ae:
            msg_type = TMessageType.REPLY
            result.ae = ae
        except Exception as ex:
            msg_type = TMessageType.EXCEPTION
            logging.exception(ex)
            result = TApplicationException(TApplicationException.INTERNAL_ERROR, 'Internal error')
        oprot.writeMessageBegin("getGateway", msg_type, seqid)
        result.write(oprot)
        oprot.writeMessageEnd()
        oprot.trans.flush()

    def process_deleteGateway(self, seqid, iprot, oprot):
        args = deleteGateway_args()
        args.read(iprot)
        iprot.readMessageEnd()
        result = deleteGateway_result()
        try:
            result.success = self._handler.deleteGateway(args.authzToken, args.gatewayId)
            msg_type = TMessageType.REPLY
        except (TTransport.TTransportException, KeyboardInterrupt, SystemExit):
            raise
        except apache.airavata.api.error.ttypes.InvalidRequestException as ire:
            msg_type = TMessageType.REPLY
            result.ire = ire
        except apache.airavata.api.error.ttypes.AiravataClientException as ace:
            msg_type = TMessageType.REPLY
            result.ace = ace
        except apache.airavata.api.error.ttypes.AiravataSystemException as ase:
            msg_type = TMessageType.REPLY
            result.ase = ase
        except apache.airavata.api.error.ttypes.AuthorizationException as ae:
            msg_type = TMessageType.REPLY
            result.ae = ae
        except Exception as ex:
            msg_type = TMessageType.EXCEPTION
            logging.exception(ex)
            result = TApplicationException(TApplicationException.INTERNAL_ERROR, 'Internal error')
        oprot.writeMessageBegin("deleteGateway", msg_type, seqid)
        result.write(oprot)
        oprot.writeMessageEnd()
        oprot.trans.flush()

    def process_getAllGateways(self, seqid, iprot, oprot):
        args = getAllGateways_args()
        args.read(iprot)
        iprot.readMessageEnd()
        result = getAllGateways_result()
        try:
            result.success = self._handler.getAllGateways(args.authzToken)
            msg_type = TMessageType.REPLY
        except (TTransport.TTransportException, KeyboardInterrupt, SystemExit):
            raise
        except apache.airavata.api.error.ttypes.InvalidRequestException as ire:
            msg_type = TMessageType.REPLY
            result.ire = ire
        except apache.airavata.api.error.ttypes.AiravataClientException as ace:
            msg_type = TMessageType.REPLY
            result.ace = ace
        except apache.airavata.api.error.ttypes.AiravataSystemException as ase:
            msg_type = TMessageType.REPLY
            result.ase = ase
        except apache.airavata.api.error.ttypes.AuthorizationException as ae:
            msg_type = TMessageType.REPLY
            result.ae = ae
        except Exception as ex:
            msg_type = TMessageType.EXCEPTION
            logging.exception(ex)
            result = TApplicationException(TApplicationException.INTERNAL_ERROR, 'Internal error')
        oprot.writeMessageBegin("getAllGateways", msg_type, seqid)
        result.write(oprot)
        oprot.writeMessageEnd()
        oprot.trans.flush()

    def process_isGatewayExist(self, seqid, iprot, oprot):
        args = isGatewayExist_args()
        args.read(iprot)
        iprot.readMessageEnd()
        result = isGatewayExist_result()
        try:
            result.success = self._handler.isGatewayExist(args.authzToken, args.gatewayId)
            msg_type = TMessageType.REPLY
        except (TTransport.TTransportException, KeyboardInterrupt, SystemExit):
            raise
        except apache.airavata.api.error.ttypes.InvalidRequestException as ire:
            msg_type = TMessageType.REPLY
            result.ire = ire
        except apache.airavata.api.error.ttypes.AiravataClientException as ace:
            msg_type = TMessageType.REPLY
            result.ace = ace
        except apache.airavata.api.error.ttypes.AiravataSystemException as ase:
            msg_type = TMessageType.REPLY
            result.ase = ase
        except apache.airavata.api.error.ttypes.AuthorizationException as ae:
            msg_type = TMessageType.REPLY
            result.ae = ae
        except Exception as ex:
            msg_type = TMessageType.EXCEPTION
            logging.exception(ex)
            result = TApplicationException(TApplicationException.INTERNAL_ERROR, 'Internal error')
        oprot.writeMessageBegin("isGatewayExist", msg_type, seqid)
        result.write(oprot)
        oprot.writeMessageEnd()
        oprot.trans.flush()

    def process_createNotification(self, seqid, iprot, oprot):
        args = createNotification_args()
        args.read(iprot)
        iprot.readMessageEnd()
        result = createNotification_result()
        try:
            result.success = self._handler.createNotification(args.authzToken, args.notification)
            msg_type = TMessageType.REPLY
        except (TTransport.TTransportException, KeyboardInterrupt, SystemExit):
            raise
        except apache.airavata.api.error.ttypes.InvalidRequestException as ire:
            msg_type = TMessageType.REPLY
            result.ire = ire
        except apache.airavata.api.error.ttypes.AiravataClientException as ace:
            msg_type = TMessageType.REPLY
            result.ace = ace
        except apache.airavata.api.error.ttypes.AiravataSystemException as ase:
            msg_type = TMessageType.REPLY
            result.ase = ase
        except apache.airavata.api.error.ttypes.AuthorizationException as ae:
            msg_type = TMessageType.REPLY
            result.ae = ae
        except Exception as ex:
            msg_type = TMessageType.EXCEPTION
            logging.exception(ex)
            result = TApplicationException(TApplicationException.INTERNAL_ERROR, 'Internal error')
        oprot.writeMessageBegin("createNotification", msg_type, seqid)
        result.write(oprot)
        oprot.writeMessageEnd()
        oprot.trans.flush()

    def process_updateNotification(self, seqid, iprot, oprot):
        args = updateNotification_args()
        args.read(iprot)
        iprot.readMessageEnd()
        result = updateNotification_result()
        try:
            result.success = self._handler.updateNotification(args.authzToken, args.notification)
            msg_type = TMessageType.REPLY
        except (TTransport.TTransportException, KeyboardInterrupt, SystemExit):
            raise
        except apache.airavata.api.error.ttypes.InvalidRequestException as ire:
            msg_type = TMessageType.REPLY
            result.ire = ire
        except apache.airavata.api.error.ttypes.AiravataClientException as ace:
            msg_type = TMessageType.REPLY
            result.ace = ace
        except apache.airavata.api.error.ttypes.AiravataSystemException as ase:
            msg_type = TMessageType.REPLY
            result.ase = ase
        except apache.airavata.api.error.ttypes.AuthorizationException as ae:
            msg_type = TMessageType.REPLY
            result.ae = ae
        except Exception as ex:
            msg_type = TMessageType.EXCEPTION
            logging.exception(ex)
            result = TApplicationException(TApplicationException.INTERNAL_ERROR, 'Internal error')
        oprot.writeMessageBegin("updateNotification", msg_type, seqid)
        result.write(oprot)
        oprot.writeMessageEnd()
        oprot.trans.flush()

    def process_deleteNotification(self, seqid, iprot, oprot):
        args = deleteNotification_args()
        args.read(iprot)
        iprot.readMessageEnd()
        result = deleteNotification_result()
        try:
            result.success = self._handler.deleteNotification(args.authzToken, args.gatewayId, args.notificationId)
            msg_type = TMessageType.REPLY
        except (TTransport.TTransportException, KeyboardInterrupt, SystemExit):
            raise
        except apache.airavata.api.error.ttypes.InvalidRequestException as ire:
            msg_type = TMessageType.REPLY
            result.ire = ire
        except apache.airavata.api.error.ttypes.AiravataClientException as ace:
            msg_type = TMessageType.REPLY
            result.ace = ace
        except apache.airavata.api.error.ttypes.AiravataSystemException as ase:
            msg_type = TMessageType.REPLY
            result.ase = ase
        except apache.airavata.api.error.ttypes.AuthorizationException as ae:
            msg_type = TMessageType.REPLY
            result.ae = ae
        except Exception as ex:
            msg_type = TMessageType.EXCEPTION
            logging.exception(ex)
            result = TApplicationException(TApplicationException.INTERNAL_ERROR, 'Internal error')
        oprot.writeMessageBegin("deleteNotification", msg_type, seqid)
        result.write(oprot)
        oprot.writeMessageEnd()
        oprot.trans.flush()

    def process_getNotification(self, seqid, iprot, oprot):
        args = getNotification_args()
        args.read(iprot)
        iprot.readMessageEnd()
        result = getNotification_result()
        try:
            result.success = self._handler.getNotification(args.authzToken, args.gatewayId, args.notificationId)
            msg_type = TMessageType.REPLY
        except (TTransport.TTransportException, KeyboardInterrupt, SystemExit):
            raise
        except apache.airavata.api.error.ttypes.InvalidRequestException as ire:
            msg_type = TMessageType.REPLY
            result.ire = ire
        except apache.airavata.api.error.ttypes.AiravataClientException as ace:
            msg_type = TMessageType.REPLY
            result.ace = ace
        except apache.airavata.api.error.ttypes.AiravataSystemException as ase:
            msg_type = TMessageType.REPLY
            result.ase = ase
        except apache.airavata.api.error.ttypes.AuthorizationException as ae:
            msg_type = TMessageType.REPLY
            result.ae = ae
        except Exception as ex:
            msg_type = TMessageType.EXCEPTION
            logging.exception(ex)
            result = TApplicationException(TApplicationException.INTERNAL_ERROR, 'Internal error')
        oprot.writeMessageBegin("getNotification", msg_type, seqid)
        result.write(oprot)
        oprot.writeMessageEnd()
        oprot.trans.flush()

    def process_getAllNotifications(self, seqid, iprot, oprot):
        args = getAllNotifications_args()
        args.read(iprot)
        iprot.readMessageEnd()
        result = getAllNotifications_result()
        try:
            result.success = self._handler.getAllNotifications(args.authzToken, args.gatewayId)
            msg_type = TMessageType.REPLY
        except (TTransport.TTransportException, KeyboardInterrupt, SystemExit):
            raise
        except apache.airavata.api.error.ttypes.InvalidRequestException as ire:
            msg_type = TMessageType.REPLY
            result.ire = ire
        except apache.airavata.api.error.ttypes.AiravataClientException as ace:
            msg_type = TMessageType.REPLY
            result.ace = ace
        except apache.airavata.api.error.ttypes.AiravataSystemException as ase:
            msg_type = TMessageType.REPLY
            result.ase = ase
        except apache.airavata.api.error.ttypes.AuthorizationException as ae:
            msg_type = TMessageType.REPLY
            result.ae = ae
        except Exception as ex:
            msg_type = TMessageType.EXCEPTION
            logging.exception(ex)
            result = TApplicationException(TApplicationException.INTERNAL_ERROR, 'Internal error')
        oprot.writeMessageBegin("getAllNotifications", msg_type, seqid)
        result.write(oprot)
        oprot.writeMessageEnd()
        oprot.trans.flush()

    def process_generateAndRegisterSSHKeys(self, seqid, iprot, oprot):
        args = generateAndRegisterSSHKeys_args()
        args.read(iprot)
        iprot.readMessageEnd()
        result = generateAndRegisterSSHKeys_result()
        try:
            result.success = self._handler.generateAndRegisterSSHKeys(args.authzToken, args.gatewayId, args.userName, args.description, args.credentialOwnerType)
            msg_type = TMessageType.REPLY
        except (TTransport.TTransportException, KeyboardInterrupt, SystemExit):
            raise
        except apache.airavata.api.error.ttypes.InvalidRequestException as ire:
            msg_type = TMessageType.REPLY
            result.ire = ire
        except apache.airavata.api.error.ttypes.AiravataClientException as ace:
            msg_type = TMessageType.REPLY
            result.ace = ace
        except apache.airavata.api.error.ttypes.AiravataSystemException as ase:
            msg_type = TMessageType.REPLY
            result.ase = ase
        except Exception as ex:
            msg_type = TMessageType.EXCEPTION
            logging.exception(ex)
            result = TApplicationException(TApplicationException.INTERNAL_ERROR, 'Internal error')
        oprot.writeMessageBegin("generateAndRegisterSSHKeys", msg_type, seqid)
        result.write(oprot)
        oprot.writeMessageEnd()
        oprot.trans.flush()

    def process_registerPwdCredential(self, seqid, iprot, oprot):
        args = registerPwdCredential_args()
        args.read(iprot)
        iprot.readMessageEnd()
        result = registerPwdCredential_result()
        try:
            result.success = self._handler.registerPwdCredential(args.authzToken, args.gatewayId, args.portalUserName, args.loginUserName, args.password, args.description)
            msg_type = TMessageType.REPLY
        except (TTransport.TTransportException, KeyboardInterrupt, SystemExit):
            raise
        except apache.airavata.api.error.ttypes.InvalidRequestException as ire:
            msg_type = TMessageType.REPLY
            result.ire = ire
        except apache.airavata.api.error.ttypes.AiravataClientException as ace:
            msg_type = TMessageType.REPLY
            result.ace = ace
        except apache.airavata.api.error.ttypes.AiravataSystemException as ase:
            msg_type = TMessageType.REPLY
            result.ase = ase
        except Exception as ex:
            msg_type = TMessageType.EXCEPTION
            logging.exception(ex)
            result = TApplicationException(TApplicationException.INTERNAL_ERROR, 'Internal error')
        oprot.writeMessageBegin("registerPwdCredential", msg_type, seqid)
        result.write(oprot)
        oprot.writeMessageEnd()
        oprot.trans.flush()

    def process_getSSHPubKey(self, seqid, iprot, oprot):
        args = getSSHPubKey_args()
        args.read(iprot)
        iprot.readMessageEnd()
        result = getSSHPubKey_result()
        try:
            result.success = self._handler.getSSHPubKey(args.authzToken, args.airavataCredStoreToken, args.gatewayId)
            msg_type = TMessageType.REPLY
        except (TTransport.TTransportException, KeyboardInterrupt, SystemExit):
            raise
        except apache.airavata.api.error.ttypes.InvalidRequestException as ire:
            msg_type = TMessageType.REPLY
            result.ire = ire
        except apache.airavata.api.error.ttypes.AiravataClientException as ace:
            msg_type = TMessageType.REPLY
            result.ace = ace
        except apache.airavata.api.error.ttypes.AiravataSystemException as ase:
            msg_type = TMessageType.REPLY
            result.ase = ase
        except Exception as ex:
            msg_type = TMessageType.EXCEPTION
            logging.exception(ex)
            result = TApplicationException(TApplicationException.INTERNAL_ERROR, 'Internal error')
        oprot.writeMessageBegin("getSSHPubKey", msg_type, seqid)
        result.write(oprot)
        oprot.writeMessageEnd()
        oprot.trans.flush()

    def process_getAllGatewaySSHPubKeys(self, seqid, iprot, oprot):
        args = getAllGatewaySSHPubKeys_args()
        args.read(iprot)
        iprot.readMessageEnd()
        result = getAllGatewaySSHPubKeys_result()
        try:
            result.success = self._handler.getAllGatewaySSHPubKeys(args.authzToken, args.gatewayId)
            msg_type = TMessageType.REPLY
        except (TTransport.TTransportException, KeyboardInterrupt, SystemExit):
            raise
        except apache.airavata.api.error.ttypes.InvalidRequestException as ire:
            msg_type = TMessageType.REPLY
            result.ire = ire
        except apache.airavata.api.error.ttypes.AiravataClientException as ace:
            msg_type = TMessageType.REPLY
            result.ace = ace
        except apache.airavata.api.error.ttypes.AiravataSystemException as ase:
            msg_type = TMessageType.REPLY
            result.ase = ase
        except Exception as ex:
            msg_type = TMessageType.EXCEPTION
            logging.exception(ex)
            result = TApplicationException(TApplicationException.INTERNAL_ERROR, 'Internal error')
        oprot.writeMessageBegin("getAllGatewaySSHPubKeys", msg_type, seqid)
        result.write(oprot)
        oprot.writeMessageEnd()
        oprot.trans.flush()

    def process_getAllCredentialSummaryForGateway(self, seqid, iprot, oprot):
        args = getAllCredentialSummaryForGateway_args()
        args.read(iprot)
        iprot.readMessageEnd()
        result = getAllCredentialSummaryForGateway_result()
        try:
            result.success = self._handler.getAllCredentialSummaryForGateway(args.authzToken, args.type, args.gatewayId)
            msg_type = TMessageType.REPLY
        except (TTransport.TTransportException, KeyboardInterrupt, SystemExit):
            raise
        except apache.airavata.api.error.ttypes.InvalidRequestException as ire:
            msg_type = TMessageType.REPLY
            result.ire = ire
        except apache.airavata.api.error.ttypes.AiravataClientException as ace:
            msg_type = TMessageType.REPLY
            result.ace = ace
        except apache.airavata.api.error.ttypes.AiravataSystemException as ase:
            msg_type = TMessageType.REPLY
            result.ase = ase
        except Exception as ex:
            msg_type = TMessageType.EXCEPTION
            logging.exception(ex)
            result = TApplicationException(TApplicationException.INTERNAL_ERROR, 'Internal error')
        oprot.writeMessageBegin("getAllCredentialSummaryForGateway", msg_type, seqid)
        result.write(oprot)
        oprot.writeMessageEnd()
        oprot.trans.flush()

    def process_getAllCredentialSummaryForUsersInGateway(self, seqid, iprot, oprot):
        args = getAllCredentialSummaryForUsersInGateway_args()
        args.read(iprot)
        iprot.readMessageEnd()
        result = getAllCredentialSummaryForUsersInGateway_result()
        try:
            result.success = self._handler.getAllCredentialSummaryForUsersInGateway(args.authzToken, args.type, args.gatewayId, args.userId)
            msg_type = TMessageType.REPLY
        except (TTransport.TTransportException, KeyboardInterrupt, SystemExit):
            raise
        except apache.airavata.api.error.ttypes.InvalidRequestException as ire:
            msg_type = TMessageType.REPLY
            result.ire = ire
        except apache.airavata.api.error.ttypes.AiravataClientException as ace:
            msg_type = TMessageType.REPLY
            result.ace = ace
        except apache.airavata.api.error.ttypes.AiravataSystemException as ase:
            msg_type = TMessageType.REPLY
            result.ase = ase
        except Exception as ex:
            msg_type = TMessageType.EXCEPTION
            logging.exception(ex)
            result = TApplicationException(TApplicationException.INTERNAL_ERROR, 'Internal error')
        oprot.writeMessageBegin("getAllCredentialSummaryForUsersInGateway", msg_type, seqid)
        result.write(oprot)
        oprot.writeMessageEnd()
        oprot.trans.flush()

    def process_getAllGatewayPWDCredentials(self, seqid, iprot, oprot):
        args = getAllGatewayPWDCredentials_args()
        args.read(iprot)
        iprot.readMessageEnd()
        result = getAllGatewayPWDCredentials_result()
        try:
            result.success = self._handler.getAllGatewayPWDCredentials(args.authzToken, args.gatewayId)
            msg_type = TMessageType.REPLY
        except (TTransport.TTransportException, KeyboardInterrupt, SystemExit):
            raise
        except apache.airavata.api.error.ttypes.InvalidRequestException as ire:
            msg_type = TMessageType.REPLY
            result.ire = ire
        except apache.airavata.api.error.ttypes.AiravataClientException as ace:
            msg_type = TMessageType.REPLY
            result.ace = ace
        except apache.airavata.api.error.ttypes.AiravataSystemException as ase:
            msg_type = TMessageType.REPLY
            result.ase = ase
        except Exception as ex:
            msg_type = TMessageType.EXCEPTION
            logging.exception(ex)
            result = TApplicationException(TApplicationException.INTERNAL_ERROR, 'Internal error')
        oprot.writeMessageBegin("getAllGatewayPWDCredentials", msg_type, seqid)
        result.write(oprot)
        oprot.writeMessageEnd()
        oprot.trans.flush()

    def process_deleteSSHPubKey(self, seqid, iprot, oprot):
        args = deleteSSHPubKey_args()
        args.read(iprot)
        iprot.readMessageEnd()
        result = deleteSSHPubKey_result()
        try:
            result.success = self._handler.deleteSSHPubKey(args.authzToken, args.airavataCredStoreToken, args.gatewayId)
            msg_type = TMessageType.REPLY
        except (TTransport.TTransportException, KeyboardInterrupt, SystemExit):
            raise
        except apache.airavata.api.error.ttypes.InvalidRequestException as ire:
            msg_type = TMessageType.REPLY
            result.ire = ire
        except apache.airavata.api.error.ttypes.AiravataClientException as ace:
            msg_type = TMessageType.REPLY
            result.ace = ace
        except apache.airavata.api.error.ttypes.AiravataSystemException as ase:
            msg_type = TMessageType.REPLY
            result.ase = ase
        except Exception as ex:
            msg_type = TMessageType.EXCEPTION
            logging.exception(ex)
            result = TApplicationException(TApplicationException.INTERNAL_ERROR, 'Internal error')
        oprot.writeMessageBegin("deleteSSHPubKey", msg_type, seqid)
        result.write(oprot)
        oprot.writeMessageEnd()
        oprot.trans.flush()

    def process_deletePWDCredential(self, seqid, iprot, oprot):
        args = deletePWDCredential_args()
        args.read(iprot)
        iprot.readMessageEnd()
        result = deletePWDCredential_result()
        try:
            result.success = self._handler.deletePWDCredential(args.authzToken, args.airavataCredStoreToken, args.gatewayId)
            msg_type = TMessageType.REPLY
        except (TTransport.TTransportException, KeyboardInterrupt, SystemExit):
            raise
        except apache.airavata.api.error.ttypes.InvalidRequestException as ire:
            msg_type = TMessageType.REPLY
            result.ire = ire
        except apache.airavata.api.error.ttypes.AiravataClientException as ace:
            msg_type = TMessageType.REPLY
            result.ace = ace
        except apache.airavata.api.error.ttypes.AiravataSystemException as ase:
            msg_type = TMessageType.REPLY
            result.ase = ase
        except Exception as ex:
            msg_type = TMessageType.EXCEPTION
            logging.exception(ex)
            result = TApplicationException(TApplicationException.INTERNAL_ERROR, 'Internal error')
        oprot.writeMessageBegin("deletePWDCredential", msg_type, seqid)
        result.write(oprot)
        oprot.writeMessageEnd()
        oprot.trans.flush()

    def process_createProject(self, seqid, iprot, oprot):
        args = createProject_args()
        args.read(iprot)
        iprot.readMessageEnd()
        result = createProject_result()
        try:
            result.success = self._handler.createProject(args.authzToken, args.gatewayId, args.project)
            msg_type = TMessageType.REPLY
        except (TTransport.TTransportException, KeyboardInterrupt, SystemExit):
            raise
        except apache.airavata.api.error.ttypes.InvalidRequestException as ire:
            msg_type = TMessageType.REPLY
            result.ire = ire
        except apache.airavata.api.error.ttypes.AiravataClientException as ace:
            msg_type = TMessageType.REPLY
            result.ace = ace
        except apache.airavata.api.error.ttypes.AiravataSystemException as ase:
            msg_type = TMessageType.REPLY
            result.ase = ase
        except apache.airavata.api.error.ttypes.AuthorizationException as ae:
            msg_type = TMessageType.REPLY
            result.ae = ae
        except Exception as ex:
            msg_type = TMessageType.EXCEPTION
            logging.exception(ex)
            result = TApplicationException(TApplicationException.INTERNAL_ERROR, 'Internal error')
        oprot.writeMessageBegin("createProject", msg_type, seqid)
        result.write(oprot)
        oprot.writeMessageEnd()
        oprot.trans.flush()

    def process_updateProject(self, seqid, iprot, oprot):
        args = updateProject_args()
        args.read(iprot)
        iprot.readMessageEnd()
        result = updateProject_result()
        try:
            self._handler.updateProject(args.authzToken, args.projectId, args.updatedProject)
            msg_type = TMessageType.REPLY
        except (TTransport.TTransportException, KeyboardInterrupt, SystemExit):
            raise
        except apache.airavata.api.error.ttypes.InvalidRequestException as ire:
            msg_type = TMessageType.REPLY
            result.ire = ire
        except apache.airavata.api.error.ttypes.AiravataClientException as ace:
            msg_type = TMessageType.REPLY
            result.ace = ace
        except apache.airavata.api.error.ttypes.AiravataSystemException as ase:
            msg_type = TMessageType.REPLY
            result.ase = ase
        except apache.airavata.api.error.ttypes.ProjectNotFoundException as pnfe:
            msg_type = TMessageType.REPLY
            result.pnfe = pnfe
        except apache.airavata.api.error.ttypes.AuthorizationException as ae:
            msg_type = TMessageType.REPLY
            result.ae = ae
        except Exception as ex:
            msg_type = TMessageType.EXCEPTION
            logging.exception(ex)
            result = TApplicationException(TApplicationException.INTERNAL_ERROR, 'Internal error')
        oprot.writeMessageBegin("updateProject", msg_type, seqid)
        result.write(oprot)
        oprot.writeMessageEnd()
        oprot.trans.flush()

    def process_getProject(self, seqid, iprot, oprot):
        args = getProject_args()
        args.read(iprot)
        iprot.readMessageEnd()
        result = getProject_result()
        try:
            result.success = self._handler.getProject(args.authzToken, args.projectId)
            msg_type = TMessageType.REPLY
        except (TTransport.TTransportException, KeyboardInterrupt, SystemExit):
            raise
        except apache.airavata.api.error.ttypes.InvalidRequestException as ire:
            msg_type = TMessageType.REPLY
            result.ire = ire
        except apache.airavata.api.error.ttypes.AiravataClientException as ace:
            msg_type = TMessageType.REPLY
            result.ace = ace
        except apache.airavata.api.error.ttypes.AiravataSystemException as ase:
            msg_type = TMessageType.REPLY
            result.ase = ase
        except apache.airavata.api.error.ttypes.ProjectNotFoundException as pnfe:
            msg_type = TMessageType.REPLY
            result.pnfe = pnfe
        except apache.airavata.api.error.ttypes.AuthorizationException as ae:
            msg_type = TMessageType.REPLY
            result.ae = ae
        except Exception as ex:
            msg_type = TMessageType.EXCEPTION
            logging.exception(ex)
            result = TApplicationException(TApplicationException.INTERNAL_ERROR, 'Internal error')
        oprot.writeMessageBegin("getProject", msg_type, seqid)
        result.write(oprot)
        oprot.writeMessageEnd()
        oprot.trans.flush()

    def process_deleteProject(self, seqid, iprot, oprot):
        args = deleteProject_args()
        args.read(iprot)
        iprot.readMessageEnd()
        result = deleteProject_result()
        try:
            result.success = self._handler.deleteProject(args.authzToken, args.projectId)
            msg_type = TMessageType.REPLY
        except (TTransport.TTransportException, KeyboardInterrupt, SystemExit):
            raise
        except apache.airavata.api.error.ttypes.InvalidRequestException as ire:
            msg_type = TMessageType.REPLY
            result.ire = ire
        except apache.airavata.api.error.ttypes.AiravataClientException as ace:
            msg_type = TMessageType.REPLY
            result.ace = ace
        except apache.airavata.api.error.ttypes.AiravataSystemException as ase:
            msg_type = TMessageType.REPLY
            result.ase = ase
        except apache.airavata.api.error.ttypes.ProjectNotFoundException as pnfe:
            msg_type = TMessageType.REPLY
            result.pnfe = pnfe
        except apache.airavata.api.error.ttypes.AuthorizationException as ae:
            msg_type = TMessageType.REPLY
            result.ae = ae
        except Exception as ex:
            msg_type = TMessageType.EXCEPTION
            logging.exception(ex)
            result = TApplicationException(TApplicationException.INTERNAL_ERROR, 'Internal error')
        oprot.writeMessageBegin("deleteProject", msg_type, seqid)
        result.write(oprot)
        oprot.writeMessageEnd()
        oprot.trans.flush()

    def process_getUserProjects(self, seqid, iprot, oprot):
        args = getUserProjects_args()
        args.read(iprot)
        iprot.readMessageEnd()
        result = getUserProjects_result()
        try:
            result.success = self._handler.getUserProjects(args.authzToken, args.gatewayId, args.userName, args.limit, args.offset)
            msg_type = TMessageType.REPLY
        except (TTransport.TTransportException, KeyboardInterrupt, SystemExit):
            raise
        except apache.airavata.api.error.ttypes.InvalidRequestException as ire:
            msg_type = TMessageType.REPLY
            result.ire = ire
        except apache.airavata.api.error.ttypes.AiravataClientException as ace:
            msg_type = TMessageType.REPLY
            result.ace = ace
        except apache.airavata.api.error.ttypes.AiravataSystemException as ase:
            msg_type = TMessageType.REPLY
            result.ase = ase
        except apache.airavata.api.error.ttypes.AuthorizationException as ae:
            msg_type = TMessageType.REPLY
            result.ae = ae
        except Exception as ex:
            msg_type = TMessageType.EXCEPTION
            logging.exception(ex)
            result = TApplicationException(TApplicationException.INTERNAL_ERROR, 'Internal error')
        oprot.writeMessageBegin("getUserProjects", msg_type, seqid)
        result.write(oprot)
        oprot.writeMessageEnd()
        oprot.trans.flush()

    def process_searchProjects(self, seqid, iprot, oprot):
        args = searchProjects_args()
        args.read(iprot)
        iprot.readMessageEnd()
        result = searchProjects_result()
        try:
            result.success = self._handler.searchProjects(args.authzToken, args.gatewayId, args.userName, args.filters, args.limit, args.offset)
            msg_type = TMessageType.REPLY
        except (TTransport.TTransportException, KeyboardInterrupt, SystemExit):
            raise
        except apache.airavata.api.error.ttypes.InvalidRequestException as ire:
            msg_type = TMessageType.REPLY
            result.ire = ire
        except apache.airavata.api.error.ttypes.AiravataClientException as ace:
            msg_type = TMessageType.REPLY
            result.ace = ace
        except apache.airavata.api.error.ttypes.AiravataSystemException as ase:
            msg_type = TMessageType.REPLY
            result.ase = ase
        except apache.airavata.api.error.ttypes.AuthorizationException as ae:
            msg_type = TMessageType.REPLY
            result.ae = ae
        except Exception as ex:
            msg_type = TMessageType.EXCEPTION
            logging.exception(ex)
            result = TApplicationException(TApplicationException.INTERNAL_ERROR, 'Internal error')
        oprot.writeMessageBegin("searchProjects", msg_type, seqid)
        result.write(oprot)
        oprot.writeMessageEnd()
        oprot.trans.flush()

    def process_searchExperiments(self, seqid, iprot, oprot):
        args = searchExperiments_args()
        args.read(iprot)
        iprot.readMessageEnd()
        result = searchExperiments_result()
        try:
            result.success = self._handler.searchExperiments(args.authzToken, args.gatewayId, args.userName, args.filters, args.limit, args.offset)
            msg_type = TMessageType.REPLY
        except (TTransport.TTransportException, KeyboardInterrupt, SystemExit):
            raise
        except apache.airavata.api.error.ttypes.InvalidRequestException as ire:
            msg_type = TMessageType.REPLY
            result.ire = ire
        except apache.airavata.api.error.ttypes.AiravataClientException as ace:
            msg_type = TMessageType.REPLY
            result.ace = ace
        except apache.airavata.api.error.ttypes.AiravataSystemException as ase:
            msg_type = TMessageType.REPLY
            result.ase = ase
        except apache.airavata.api.error.ttypes.AuthorizationException as ae:
            msg_type = TMessageType.REPLY
            result.ae = ae
        except Exception as ex:
            msg_type = TMessageType.EXCEPTION
            logging.exception(ex)
            result = TApplicationException(TApplicationException.INTERNAL_ERROR, 'Internal error')
        oprot.writeMessageBegin("searchExperiments", msg_type, seqid)
        result.write(oprot)
        oprot.writeMessageEnd()
        oprot.trans.flush()

    def process_getExperimentStatistics(self, seqid, iprot, oprot):
        args = getExperimentStatistics_args()
        args.read(iprot)
        iprot.readMessageEnd()
        result = getExperimentStatistics_result()
        try:
            result.success = self._handler.getExperimentStatistics(args.authzToken, args.gatewayId, args.fromTime, args.toTime, args.userName, args.applicationName, args.resourceHostName)
            msg_type = TMessageType.REPLY
        except (TTransport.TTransportException, KeyboardInterrupt, SystemExit):
            raise
        except apache.airavata.api.error.ttypes.InvalidRequestException as ire:
            msg_type = TMessageType.REPLY
            result.ire = ire
        except apache.airavata.api.error.ttypes.AiravataClientException as ace:
            msg_type = TMessageType.REPLY
            result.ace = ace
        except apache.airavata.api.error.ttypes.AiravataSystemException as ase:
            msg_type = TMessageType.REPLY
            result.ase = ase
        except apache.airavata.api.error.ttypes.AuthorizationException as ae:
            msg_type = TMessageType.REPLY
            result.ae = ae
        except Exception as ex:
            msg_type = TMessageType.EXCEPTION
            logging.exception(ex)
            result = TApplicationException(TApplicationException.INTERNAL_ERROR, 'Internal error')
        oprot.writeMessageBegin("getExperimentStatistics", msg_type, seqid)
        result.write(oprot)
        oprot.writeMessageEnd()
        oprot.trans.flush()

    def process_getExperimentsInProject(self, seqid, iprot, oprot):
        args = getExperimentsInProject_args()
        args.read(iprot)
        iprot.readMessageEnd()
        result = getExperimentsInProject_result()
        try:
            result.success = self._handler.getExperimentsInProject(args.authzToken, args.projectId, args.limit, args.offset)
            msg_type = TMessageType.REPLY
        except (TTransport.TTransportException, KeyboardInterrupt, SystemExit):
            raise
        except apache.airavata.api.error.ttypes.InvalidRequestException as ire:
            msg_type = TMessageType.REPLY
            result.ire = ire
        except apache.airavata.api.error.ttypes.AiravataClientException as ace:
            msg_type = TMessageType.REPLY
            result.ace = ace
        except apache.airavata.api.error.ttypes.AiravataSystemException as ase:
            msg_type = TMessageType.REPLY
            result.ase = ase
        except apache.airavata.api.error.ttypes.ProjectNotFoundException as pnfe:
            msg_type = TMessageType.REPLY
            result.pnfe = pnfe
        except apache.airavata.api.error.ttypes.AuthorizationException as ae:
            msg_type = TMessageType.REPLY
            result.ae = ae
        except Exception as ex:
            msg_type = TMessageType.EXCEPTION
            logging.exception(ex)
            result = TApplicationException(TApplicationException.INTERNAL_ERROR, 'Internal error')
        oprot.writeMessageBegin("getExperimentsInProject", msg_type, seqid)
        result.write(oprot)
        oprot.writeMessageEnd()
        oprot.trans.flush()

    def process_getUserExperiments(self, seqid, iprot, oprot):
        args = getUserExperiments_args()
        args.read(iprot)
        iprot.readMessageEnd()
        result = getUserExperiments_result()
        try:
            result.success = self._handler.getUserExperiments(args.authzToken, args.gatewayId, args.userName, args.limit, args.offset)
            msg_type = TMessageType.REPLY
        except (TTransport.TTransportException, KeyboardInterrupt, SystemExit):
            raise
        except apache.airavata.api.error.ttypes.InvalidRequestException as ire:
            msg_type = TMessageType.REPLY
            result.ire = ire
        except apache.airavata.api.error.ttypes.AiravataClientException as ace:
            msg_type = TMessageType.REPLY
            result.ace = ace
        except apache.airavata.api.error.ttypes.AiravataSystemException as ase:
            msg_type = TMessageType.REPLY
            result.ase = ase
        except apache.airavata.api.error.ttypes.AuthorizationException as ae:
            msg_type = TMessageType.REPLY
            result.ae = ae
        except Exception as ex:
            msg_type = TMessageType.EXCEPTION
            logging.exception(ex)
            result = TApplicationException(TApplicationException.INTERNAL_ERROR, 'Internal error')
        oprot.writeMessageBegin("getUserExperiments", msg_type, seqid)
        result.write(oprot)
        oprot.writeMessageEnd()
        oprot.trans.flush()

    def process_createExperiment(self, seqid, iprot, oprot):
        args = createExperiment_args()
        args.read(iprot)
        iprot.readMessageEnd()
        result = createExperiment_result()
        try:
            result.success = self._handler.createExperiment(args.authzToken, args.gatewayId, args.experiment)
            msg_type = TMessageType.REPLY
        except (TTransport.TTransportException, KeyboardInterrupt, SystemExit):
            raise
        except apache.airavata.api.error.ttypes.InvalidRequestException as ire:
            msg_type = TMessageType.REPLY
            result.ire = ire
        except apache.airavata.api.error.ttypes.AiravataClientException as ace:
            msg_type = TMessageType.REPLY
            result.ace = ace
        except apache.airavata.api.error.ttypes.AiravataSystemException as ase:
            msg_type = TMessageType.REPLY
            result.ase = ase
        except apache.airavata.api.error.ttypes.AuthorizationException as ae:
            msg_type = TMessageType.REPLY
            result.ae = ae
        except Exception as ex:
            msg_type = TMessageType.EXCEPTION
            logging.exception(ex)
            result = TApplicationException(TApplicationException.INTERNAL_ERROR, 'Internal error')
        oprot.writeMessageBegin("createExperiment", msg_type, seqid)
        result.write(oprot)
        oprot.writeMessageEnd()
        oprot.trans.flush()

    def process_deleteExperiment(self, seqid, iprot, oprot):
        args = deleteExperiment_args()
        args.read(iprot)
        iprot.readMessageEnd()
        result = deleteExperiment_result()
        try:
            result.success = self._handler.deleteExperiment(args.authzToken, args.experimentId)
            msg_type = TMessageType.REPLY
        except (TTransport.TTransportException, KeyboardInterrupt, SystemExit):
            raise
        except apache.airavata.api.error.ttypes.InvalidRequestException as ire:
            msg_type = TMessageType.REPLY
            result.ire = ire
        except apache.airavata.api.error.ttypes.AiravataClientException as ace:
            msg_type = TMessageType.REPLY
            result.ace = ace
        except apache.airavata.api.error.ttypes.AiravataSystemException as ase:
            msg_type = TMessageType.REPLY
            result.ase = ase
        except apache.airavata.api.error.ttypes.AuthorizationException as ae:
            msg_type = TMessageType.REPLY
            result.ae = ae
        except Exception as ex:
            msg_type = TMessageType.EXCEPTION
            logging.exception(ex)
            result = TApplicationException(TApplicationException.INTERNAL_ERROR, 'Internal error')
        oprot.writeMessageBegin("deleteExperiment", msg_type, seqid)
        result.write(oprot)
        oprot.writeMessageEnd()
        oprot.trans.flush()

    def process_getExperiment(self, seqid, iprot, oprot):
        args = getExperiment_args()
        args.read(iprot)
        iprot.readMessageEnd()
        result = getExperiment_result()
        try:
            result.success = self._handler.getExperiment(args.authzToken, args.airavataExperimentId)
            msg_type = TMessageType.REPLY
        except (TTransport.TTransportException, KeyboardInterrupt, SystemExit):
            raise
        except apache.airavata.api.error.ttypes.InvalidRequestException as ire:
            msg_type = TMessageType.REPLY
            result.ire = ire
        except apache.airavata.api.error.ttypes.ExperimentNotFoundException as enf:
            msg_type = TMessageType.REPLY
            result.enf = enf
        except apache.airavata.api.error.ttypes.AiravataClientException as ace:
            msg_type = TMessageType.REPLY
            result.ace = ace
        except apache.airavata.api.error.ttypes.AiravataSystemException as ase:
            msg_type = TMessageType.REPLY
            result.ase = ase
        except apache.airavata.api.error.ttypes.AuthorizationException as ae:
            msg_type = TMessageType.REPLY
            result.ae = ae
        except Exception as ex:
            msg_type = TMessageType.EXCEPTION
            logging.exception(ex)
            result = TApplicationException(TApplicationException.INTERNAL_ERROR, 'Internal error')
        oprot.writeMessageBegin("getExperiment", msg_type, seqid)
        result.write(oprot)
        oprot.writeMessageEnd()
        oprot.trans.flush()

    def process_getExperimentByAdmin(self, seqid, iprot, oprot):
        args = getExperimentByAdmin_args()
        args.read(iprot)
        iprot.readMessageEnd()
        result = getExperimentByAdmin_result()
        try:
            result.success = self._handler.getExperimentByAdmin(args.authzToken, args.airavataExperimentId)
            msg_type = TMessageType.REPLY
        except (TTransport.TTransportException, KeyboardInterrupt, SystemExit):
            raise
        except apache.airavata.api.error.ttypes.InvalidRequestException as ire:
            msg_type = TMessageType.REPLY
            result.ire = ire
        except apache.airavata.api.error.ttypes.ExperimentNotFoundException as enf:
            msg_type = TMessageType.REPLY
            result.enf = enf
        except apache.airavata.api.error.ttypes.AiravataClientException as ace:
            msg_type = TMessageType.REPLY
            result.ace = ace
        except apache.airavata.api.error.ttypes.AiravataSystemException as ase:
            msg_type = TMessageType.REPLY
            result.ase = ase
        except apache.airavata.api.error.ttypes.AuthorizationException as ae:
            msg_type = TMessageType.REPLY
            result.ae = ae
        except Exception as ex:
            msg_type = TMessageType.EXCEPTION
            logging.exception(ex)
            result = TApplicationException(TApplicationException.INTERNAL_ERROR, 'Internal error')
        oprot.writeMessageBegin("getExperimentByAdmin", msg_type, seqid)
        result.write(oprot)
        oprot.writeMessageEnd()
        oprot.trans.flush()

    def process_getDetailedExperimentTree(self, seqid, iprot, oprot):
        args = getDetailedExperimentTree_args()
        args.read(iprot)
        iprot.readMessageEnd()
        result = getDetailedExperimentTree_result()
        try:
            result.success = self._handler.getDetailedExperimentTree(args.authzToken, args.airavataExperimentId)
            msg_type = TMessageType.REPLY
        except (TTransport.TTransportException, KeyboardInterrupt, SystemExit):
            raise
        except apache.airavata.api.error.ttypes.InvalidRequestException as ire:
            msg_type = TMessageType.REPLY
            result.ire = ire
        except apache.airavata.api.error.ttypes.ExperimentNotFoundException as enf:
            msg_type = TMessageType.REPLY
            result.enf = enf
        except apache.airavata.api.error.ttypes.AiravataClientException as ace:
            msg_type = TMessageType.REPLY
            result.ace = ace
        except apache.airavata.api.error.ttypes.AiravataSystemException as ase:
            msg_type = TMessageType.REPLY
            result.ase = ase
        except apache.airavata.api.error.ttypes.AuthorizationException as ae:
            msg_type = TMessageType.REPLY
            result.ae = ae
        except Exception as ex:
            msg_type = TMessageType.EXCEPTION
            logging.exception(ex)
            result = TApplicationException(TApplicationException.INTERNAL_ERROR, 'Internal error')
        oprot.writeMessageBegin("getDetailedExperimentTree", msg_type, seqid)
        result.write(oprot)
        oprot.writeMessageEnd()
        oprot.trans.flush()

    def process_updateExperiment(self, seqid, iprot, oprot):
        args = updateExperiment_args()
        args.read(iprot)
        iprot.readMessageEnd()
        result = updateExperiment_result()
        try:
            self._handler.updateExperiment(args.authzToken, args.airavataExperimentId, args.experiment)
            msg_type = TMessageType.REPLY
        except (TTransport.TTransportException, KeyboardInterrupt, SystemExit):
            raise
        except apache.airavata.api.error.ttypes.InvalidRequestException as ire:
            msg_type = TMessageType.REPLY
            result.ire = ire
        except apache.airavata.api.error.ttypes.ExperimentNotFoundException as enf:
            msg_type = TMessageType.REPLY
            result.enf = enf
        except apache.airavata.api.error.ttypes.AiravataClientException as ace:
            msg_type = TMessageType.REPLY
            result.ace = ace
        except apache.airavata.api.error.ttypes.AiravataSystemException as ase:
            msg_type = TMessageType.REPLY
            result.ase = ase
        except apache.airavata.api.error.ttypes.AuthorizationException as ae:
            msg_type = TMessageType.REPLY
            result.ae = ae
        except Exception as ex:
            msg_type = TMessageType.EXCEPTION
            logging.exception(ex)
            result = TApplicationException(TApplicationException.INTERNAL_ERROR, 'Internal error')
        oprot.writeMessageBegin("updateExperiment", msg_type, seqid)
        result.write(oprot)
        oprot.writeMessageEnd()
        oprot.trans.flush()

    def process_updateExperimentConfiguration(self, seqid, iprot, oprot):
        args = updateExperimentConfiguration_args()
        args.read(iprot)
        iprot.readMessageEnd()
        result = updateExperimentConfiguration_result()
        try:
            self._handler.updateExperimentConfiguration(args.authzToken, args.airavataExperimentId, args.userConfiguration)
            msg_type = TMessageType.REPLY
        except (TTransport.TTransportException, KeyboardInterrupt, SystemExit):
            raise
        except apache.airavata.api.error.ttypes.AuthorizationException as ae:
            msg_type = TMessageType.REPLY
            result.ae = ae
        except Exception as ex:
            msg_type = TMessageType.EXCEPTION
            logging.exception(ex)
            result = TApplicationException(TApplicationException.INTERNAL_ERROR, 'Internal error')
        oprot.writeMessageBegin("updateExperimentConfiguration", msg_type, seqid)
        result.write(oprot)
        oprot.writeMessageEnd()
        oprot.trans.flush()

    def process_updateResourceScheduleing(self, seqid, iprot, oprot):
        args = updateResourceScheduleing_args()
        args.read(iprot)
        iprot.readMessageEnd()
        result = updateResourceScheduleing_result()
        try:
            self._handler.updateResourceScheduleing(args.authzToken, args.airavataExperimentId, args.resourceScheduling)
            msg_type = TMessageType.REPLY
        except (TTransport.TTransportException, KeyboardInterrupt, SystemExit):
            raise
        except apache.airavata.api.error.ttypes.AuthorizationException as ae:
            msg_type = TMessageType.REPLY
            result.ae = ae
        except Exception as ex:
            msg_type = TMessageType.EXCEPTION
            logging.exception(ex)
            result = TApplicationException(TApplicationException.INTERNAL_ERROR, 'Internal error')
        oprot.writeMessageBegin("updateResourceScheduleing", msg_type, seqid)
        result.write(oprot)
        oprot.writeMessageEnd()
        oprot.trans.flush()

    def process_validateExperiment(self, seqid, iprot, oprot):
        args = validateExperiment_args()
        args.read(iprot)
        iprot.readMessageEnd()
        result = validateExperiment_result()
        try:
            result.success = self._handler.validateExperiment(args.authzToken, args.airavataExperimentId)
            msg_type = TMessageType.REPLY
        except (TTransport.TTransportException, KeyboardInterrupt, SystemExit):
            raise
        except apache.airavata.api.error.ttypes.InvalidRequestException as ire:
            msg_type = TMessageType.REPLY
            result.ire = ire
        except apache.airavata.api.error.ttypes.ExperimentNotFoundException as enf:
            msg_type = TMessageType.REPLY
            result.enf = enf
        except apache.airavata.api.error.ttypes.AiravataClientException as ace:
            msg_type = TMessageType.REPLY
            result.ace = ace
        except apache.airavata.api.error.ttypes.AiravataSystemException as ase:
            msg_type = TMessageType.REPLY
            result.ase = ase
        except apache.airavata.api.error.ttypes.AuthorizationException as ae:
            msg_type = TMessageType.REPLY
            result.ae = ae
        except Exception as ex:
            msg_type = TMessageType.EXCEPTION
            logging.exception(ex)
            result = TApplicationException(TApplicationException.INTERNAL_ERROR, 'Internal error')
        oprot.writeMessageBegin("validateExperiment", msg_type, seqid)
        result.write(oprot)
        oprot.writeMessageEnd()
        oprot.trans.flush()

    def process_launchExperiment(self, seqid, iprot, oprot):
        args = launchExperiment_args()
        args.read(iprot)
        iprot.readMessageEnd()
        result = launchExperiment_result()
        try:
            self._handler.launchExperiment(args.authzToken, args.airavataExperimentId, args.gatewayId)
            msg_type = TMessageType.REPLY
        except (TTransport.TTransportException, KeyboardInterrupt, SystemExit):
            raise
        except apache.airavata.api.error.ttypes.InvalidRequestException as ire:
            msg_type = TMessageType.REPLY
            result.ire = ire
        except apache.airavata.api.error.ttypes.ExperimentNotFoundException as enf:
            msg_type = TMessageType.REPLY
            result.enf = enf
        except apache.airavata.api.error.ttypes.AiravataClientException as ace:
            msg_type = TMessageType.REPLY
            result.ace = ace
        except apache.airavata.api.error.ttypes.AiravataSystemException as ase:
            msg_type = TMessageType.REPLY
            result.ase = ase
        except apache.airavata.api.error.ttypes.AuthorizationException as ae:
            msg_type = TMessageType.REPLY
            result.ae = ae
        except Exception as ex:
            msg_type = TMessageType.EXCEPTION
            logging.exception(ex)
            result = TApplicationException(TApplicationException.INTERNAL_ERROR, 'Internal error')
        oprot.writeMessageBegin("launchExperiment", msg_type, seqid)
        result.write(oprot)
        oprot.writeMessageEnd()
        oprot.trans.flush()

    def process_getExperimentStatus(self, seqid, iprot, oprot):
        args = getExperimentStatus_args()
        args.read(iprot)
        iprot.readMessageEnd()
        result = getExperimentStatus_result()
        try:
            result.success = self._handler.getExperimentStatus(args.authzToken, args.airavataExperimentId)
            msg_type = TMessageType.REPLY
        except (TTransport.TTransportException, KeyboardInterrupt, SystemExit):
            raise
        except apache.airavata.api.error.ttypes.InvalidRequestException as ire:
            msg_type = TMessageType.REPLY
            result.ire = ire
        except apache.airavata.api.error.ttypes.ExperimentNotFoundException as enf:
            msg_type = TMessageType.REPLY
            result.enf = enf
        except apache.airavata.api.error.ttypes.AiravataClientException as ace:
            msg_type = TMessageType.REPLY
            result.ace = ace
        except apache.airavata.api.error.ttypes.AiravataSystemException as ase:
            msg_type = TMessageType.REPLY
            result.ase = ase
        except apache.airavata.api.error.ttypes.AuthorizationException as ae:
            msg_type = TMessageType.REPLY
            result.ae = ae
        except Exception as ex:
            msg_type = TMessageType.EXCEPTION
            logging.exception(ex)
            result = TApplicationException(TApplicationException.INTERNAL_ERROR, 'Internal error')
        oprot.writeMessageBegin("getExperimentStatus", msg_type, seqid)
        result.write(oprot)
        oprot.writeMessageEnd()
        oprot.trans.flush()

    def process_getExperimentOutputs(self, seqid, iprot, oprot):
        args = getExperimentOutputs_args()
        args.read(iprot)
        iprot.readMessageEnd()
        result = getExperimentOutputs_result()
        try:
            result.success = self._handler.getExperimentOutputs(args.authzToken, args.airavataExperimentId)
            msg_type = TMessageType.REPLY
        except (TTransport.TTransportException, KeyboardInterrupt, SystemExit):
            raise
        except apache.airavata.api.error.ttypes.InvalidRequestException as ire:
            msg_type = TMessageType.REPLY
            result.ire = ire
        except apache.airavata.api.error.ttypes.ExperimentNotFoundException as enf:
            msg_type = TMessageType.REPLY
            result.enf = enf
        except apache.airavata.api.error.ttypes.AiravataClientException as ace:
            msg_type = TMessageType.REPLY
            result.ace = ace
        except apache.airavata.api.error.ttypes.AiravataSystemException as ase:
            msg_type = TMessageType.REPLY
            result.ase = ase
        except apache.airavata.api.error.ttypes.AuthorizationException as ae:
            msg_type = TMessageType.REPLY
            result.ae = ae
        except Exception as ex:
            msg_type = TMessageType.EXCEPTION
            logging.exception(ex)
            result = TApplicationException(TApplicationException.INTERNAL_ERROR, 'Internal error')
        oprot.writeMessageBegin("getExperimentOutputs", msg_type, seqid)
        result.write(oprot)
        oprot.writeMessageEnd()
        oprot.trans.flush()

    def process_getIntermediateOutputs(self, seqid, iprot, oprot):
        args = getIntermediateOutputs_args()
        args.read(iprot)
        iprot.readMessageEnd()
        result = getIntermediateOutputs_result()
        try:
            result.success = self._handler.getIntermediateOutputs(args.authzToken, args.airavataExperimentId)
            msg_type = TMessageType.REPLY
        except (TTransport.TTransportException, KeyboardInterrupt, SystemExit):
            raise
        except apache.airavata.api.error.ttypes.InvalidRequestException as ire:
            msg_type = TMessageType.REPLY
            result.ire = ire
        except apache.airavata.api.error.ttypes.ExperimentNotFoundException as enf:
            msg_type = TMessageType.REPLY
            result.enf = enf
        except apache.airavata.api.error.ttypes.AiravataClientException as ace:
            msg_type = TMessageType.REPLY
            result.ace = ace
        except apache.airavata.api.error.ttypes.AiravataSystemException as ase:
            msg_type = TMessageType.REPLY
            result.ase = ase
        except apache.airavata.api.error.ttypes.AuthorizationException as ae:
            msg_type = TMessageType.REPLY
            result.ae = ae
        except Exception as ex:
            msg_type = TMessageType.EXCEPTION
            logging.exception(ex)
            result = TApplicationException(TApplicationException.INTERNAL_ERROR, 'Internal error')
        oprot.writeMessageBegin("getIntermediateOutputs", msg_type, seqid)
        result.write(oprot)
        oprot.writeMessageEnd()
        oprot.trans.flush()

    def process_getJobStatuses(self, seqid, iprot, oprot):
        args = getJobStatuses_args()
        args.read(iprot)
        iprot.readMessageEnd()
        result = getJobStatuses_result()
        try:
            result.success = self._handler.getJobStatuses(args.authzToken, args.airavataExperimentId)
            msg_type = TMessageType.REPLY
        except (TTransport.TTransportException, KeyboardInterrupt, SystemExit):
            raise
        except apache.airavata.api.error.ttypes.InvalidRequestException as ire:
            msg_type = TMessageType.REPLY
            result.ire = ire
        except apache.airavata.api.error.ttypes.ExperimentNotFoundException as enf:
            msg_type = TMessageType.REPLY
            result.enf = enf
        except apache.airavata.api.error.ttypes.AiravataClientException as ace:
            msg_type = TMessageType.REPLY
            result.ace = ace
        except apache.airavata.api.error.ttypes.AiravataSystemException as ase:
            msg_type = TMessageType.REPLY
            result.ase = ase
        except apache.airavata.api.error.ttypes.AuthorizationException as ae:
            msg_type = TMessageType.REPLY
            result.ae = ae
        except Exception as ex:
            msg_type = TMessageType.EXCEPTION
            logging.exception(ex)
            result = TApplicationException(TApplicationException.INTERNAL_ERROR, 'Internal error')
        oprot.writeMessageBegin("getJobStatuses", msg_type, seqid)
        result.write(oprot)
        oprot.writeMessageEnd()
        oprot.trans.flush()

    def process_getJobDetails(self, seqid, iprot, oprot):
        args = getJobDetails_args()
        args.read(iprot)
        iprot.readMessageEnd()
        result = getJobDetails_result()
        try:
            result.success = self._handler.getJobDetails(args.authzToken, args.airavataExperimentId)
            msg_type = TMessageType.REPLY
        except (TTransport.TTransportException, KeyboardInterrupt, SystemExit):
            raise
        except apache.airavata.api.error.ttypes.InvalidRequestException as ire:
            msg_type = TMessageType.REPLY
            result.ire = ire
        except apache.airavata.api.error.ttypes.ExperimentNotFoundException as enf:
            msg_type = TMessageType.REPLY
            result.enf = enf
        except apache.airavata.api.error.ttypes.AiravataClientException as ace:
            msg_type = TMessageType.REPLY
            result.ace = ace
        except apache.airavata.api.error.ttypes.AiravataSystemException as ase:
            msg_type = TMessageType.REPLY
            result.ase = ase
        except apache.airavata.api.error.ttypes.AuthorizationException as ae:
            msg_type = TMessageType.REPLY
            result.ae = ae
        except Exception as ex:
            msg_type = TMessageType.EXCEPTION
            logging.exception(ex)
            result = TApplicationException(TApplicationException.INTERNAL_ERROR, 'Internal error')
        oprot.writeMessageBegin("getJobDetails", msg_type, seqid)
        result.write(oprot)
        oprot.writeMessageEnd()
        oprot.trans.flush()

    def process_cloneExperiment(self, seqid, iprot, oprot):
        args = cloneExperiment_args()
        args.read(iprot)
        iprot.readMessageEnd()
        result = cloneExperiment_result()
        try:
            result.success = self._handler.cloneExperiment(args.authzToken, args.existingExperimentID, args.newExperimentName, args.newExperimentProjectId)
            msg_type = TMessageType.REPLY
        except (TTransport.TTransportException, KeyboardInterrupt, SystemExit):
            raise
        except apache.airavata.api.error.ttypes.InvalidRequestException as ire:
            msg_type = TMessageType.REPLY
            result.ire = ire
        except apache.airavata.api.error.ttypes.ExperimentNotFoundException as enf:
            msg_type = TMessageType.REPLY
            result.enf = enf
        except apache.airavata.api.error.ttypes.AiravataClientException as ace:
            msg_type = TMessageType.REPLY
            result.ace = ace
        except apache.airavata.api.error.ttypes.AiravataSystemException as ase:
            msg_type = TMessageType.REPLY
            result.ase = ase
        except apache.airavata.api.error.ttypes.AuthorizationException as ae:
            msg_type = TMessageType.REPLY
            result.ae = ae
        except apache.airavata.api.error.ttypes.ProjectNotFoundException as pnfe:
            msg_type = TMessageType.REPLY
            result.pnfe = pnfe
        except Exception as ex:
            msg_type = TMessageType.EXCEPTION
            logging.exception(ex)
            result = TApplicationException(TApplicationException.INTERNAL_ERROR, 'Internal error')
        oprot.writeMessageBegin("cloneExperiment", msg_type, seqid)
        result.write(oprot)
        oprot.writeMessageEnd()
        oprot.trans.flush()

    def process_cloneExperimentByAdmin(self, seqid, iprot, oprot):
        args = cloneExperimentByAdmin_args()
        args.read(iprot)
        iprot.readMessageEnd()
        result = cloneExperimentByAdmin_result()
        try:
            result.success = self._handler.cloneExperimentByAdmin(args.authzToken, args.existingExperimentID, args.newExperimentName, args.newExperimentProjectId)
            msg_type = TMessageType.REPLY
        except (TTransport.TTransportException, KeyboardInterrupt, SystemExit):
            raise
        except apache.airavata.api.error.ttypes.InvalidRequestException as ire:
            msg_type = TMessageType.REPLY
            result.ire = ire
        except apache.airavata.api.error.ttypes.ExperimentNotFoundException as enf:
            msg_type = TMessageType.REPLY
            result.enf = enf
        except apache.airavata.api.error.ttypes.AiravataClientException as ace:
            msg_type = TMessageType.REPLY
            result.ace = ace
        except apache.airavata.api.error.ttypes.AiravataSystemException as ase:
            msg_type = TMessageType.REPLY
            result.ase = ase
        except apache.airavata.api.error.ttypes.AuthorizationException as ae:
            msg_type = TMessageType.REPLY
            result.ae = ae
        except apache.airavata.api.error.ttypes.ProjectNotFoundException as pnfe:
            msg_type = TMessageType.REPLY
            result.pnfe = pnfe
        except Exception as ex:
            msg_type = TMessageType.EXCEPTION
            logging.exception(ex)
            result = TApplicationException(TApplicationException.INTERNAL_ERROR, 'Internal error')
        oprot.writeMessageBegin("cloneExperimentByAdmin", msg_type, seqid)
        result.write(oprot)
        oprot.writeMessageEnd()
        oprot.trans.flush()

    def process_terminateExperiment(self, seqid, iprot, oprot):
        args = terminateExperiment_args()
        args.read(iprot)
        iprot.readMessageEnd()
        result = terminateExperiment_result()
        try:
            self._handler.terminateExperiment(args.authzToken, args.airavataExperimentId, args.gatewayId)
            msg_type = TMessageType.REPLY
        except (TTransport.TTransportException, KeyboardInterrupt, SystemExit):
            raise
        except apache.airavata.api.error.ttypes.InvalidRequestException as ire:
            msg_type = TMessageType.REPLY
            result.ire = ire
        except apache.airavata.api.error.ttypes.ExperimentNotFoundException as enf:
            msg_type = TMessageType.REPLY
            result.enf = enf
        except apache.airavata.api.error.ttypes.AiravataClientException as ace:
            msg_type = TMessageType.REPLY
            result.ace = ace
        except apache.airavata.api.error.ttypes.AiravataSystemException as ase:
            msg_type = TMessageType.REPLY
            result.ase = ase
        except apache.airavata.api.error.ttypes.AuthorizationException as ae:
            msg_type = TMessageType.REPLY
            result.ae = ae
        except Exception as ex:
            msg_type = TMessageType.EXCEPTION
            logging.exception(ex)
            result = TApplicationException(TApplicationException.INTERNAL_ERROR, 'Internal error')
        oprot.writeMessageBegin("terminateExperiment", msg_type, seqid)
        result.write(oprot)
        oprot.writeMessageEnd()
        oprot.trans.flush()

    def process_registerApplicationModule(self, seqid, iprot, oprot):
        args = registerApplicationModule_args()
        args.read(iprot)
        iprot.readMessageEnd()
        result = registerApplicationModule_result()
        try:
            result.success = self._handler.registerApplicationModule(args.authzToken, args.gatewayId, args.applicationModule)
            msg_type = TMessageType.REPLY
        except (TTransport.TTransportException, KeyboardInterrupt, SystemExit):
            raise
        except apache.airavata.api.error.ttypes.InvalidRequestException as ire:
            msg_type = TMessageType.REPLY
            result.ire = ire
        except apache.airavata.api.error.ttypes.AiravataClientException as ace:
            msg_type = TMessageType.REPLY
            result.ace = ace
        except apache.airavata.api.error.ttypes.AiravataSystemException as ase:
            msg_type = TMessageType.REPLY
            result.ase = ase
        except apache.airavata.api.error.ttypes.AuthorizationException as ae:
            msg_type = TMessageType.REPLY
            result.ae = ae
        except Exception as ex:
            msg_type = TMessageType.EXCEPTION
            logging.exception(ex)
            result = TApplicationException(TApplicationException.INTERNAL_ERROR, 'Internal error')
        oprot.writeMessageBegin("registerApplicationModule", msg_type, seqid)
        result.write(oprot)
        oprot.writeMessageEnd()
        oprot.trans.flush()

    def process_getApplicationModule(self, seqid, iprot, oprot):
        args = getApplicationModule_args()
        args.read(iprot)
        iprot.readMessageEnd()
        result = getApplicationModule_result()
        try:
            result.success = self._handler.getApplicationModule(args.authzToken, args.appModuleId)
            msg_type = TMessageType.REPLY
        except (TTransport.TTransportException, KeyboardInterrupt, SystemExit):
            raise
        except apache.airavata.api.error.ttypes.InvalidRequestException as ire:
            msg_type = TMessageType.REPLY
            result.ire = ire
        except apache.airavata.api.error.ttypes.AiravataClientException as ace:
            msg_type = TMessageType.REPLY
            result.ace = ace
        except apache.airavata.api.error.ttypes.AiravataSystemException as ase:
            msg_type = TMessageType.REPLY
            result.ase = ase
        except apache.airavata.api.error.ttypes.AuthorizationException as ae:
            msg_type = TMessageType.REPLY
            result.ae = ae
        except Exception as ex:
            msg_type = TMessageType.EXCEPTION
            logging.exception(ex)
            result = TApplicationException(TApplicationException.INTERNAL_ERROR, 'Internal error')
        oprot.writeMessageBegin("getApplicationModule", msg_type, seqid)
        result.write(oprot)
        oprot.writeMessageEnd()
        oprot.trans.flush()

    def process_updateApplicationModule(self, seqid, iprot, oprot):
        args = updateApplicationModule_args()
        args.read(iprot)
        iprot.readMessageEnd()
        result = updateApplicationModule_result()
        try:
            result.success = self._handler.updateApplicationModule(args.authzToken, args.appModuleId, args.applicationModule)
            msg_type = TMessageType.REPLY
        except (TTransport.TTransportException, KeyboardInterrupt, SystemExit):
            raise
        except apache.airavata.api.error.ttypes.InvalidRequestException as ire:
            msg_type = TMessageType.REPLY
            result.ire = ire
        except apache.airavata.api.error.ttypes.AiravataClientException as ace:
            msg_type = TMessageType.REPLY
            result.ace = ace
        except apache.airavata.api.error.ttypes.AiravataSystemException as ase:
            msg_type = TMessageType.REPLY
            result.ase = ase
        except apache.airavata.api.error.ttypes.AuthorizationException as ae:
            msg_type = TMessageType.REPLY
            result.ae = ae
        except Exception as ex:
            msg_type = TMessageType.EXCEPTION
            logging.exception(ex)
            result = TApplicationException(TApplicationException.INTERNAL_ERROR, 'Internal error')
        oprot.writeMessageBegin("updateApplicationModule", msg_type, seqid)
        result.write(oprot)
        oprot.writeMessageEnd()
        oprot.trans.flush()

    def process_getAllAppModules(self, seqid, iprot, oprot):
        args = getAllAppModules_args()
        args.read(iprot)
        iprot.readMessageEnd()
        result = getAllAppModules_result()
        try:
            result.success = self._handler.getAllAppModules(args.authzToken, args.gatewayId)
            msg_type = TMessageType.REPLY
        except (TTransport.TTransportException, KeyboardInterrupt, SystemExit):
            raise
        except apache.airavata.api.error.ttypes.InvalidRequestException as ire:
            msg_type = TMessageType.REPLY
            result.ire = ire
        except apache.airavata.api.error.ttypes.AiravataClientException as ace:
            msg_type = TMessageType.REPLY
            result.ace = ace
        except apache.airavata.api.error.ttypes.AiravataSystemException as ase:
            msg_type = TMessageType.REPLY
            result.ase = ase
        except apache.airavata.api.error.ttypes.AuthorizationException as ae:
            msg_type = TMessageType.REPLY
            result.ae = ae
        except Exception as ex:
            msg_type = TMessageType.EXCEPTION
            logging.exception(ex)
            result = TApplicationException(TApplicationException.INTERNAL_ERROR, 'Internal error')
        oprot.writeMessageBegin("getAllAppModules", msg_type, seqid)
        result.write(oprot)
        oprot.writeMessageEnd()
        oprot.trans.flush()

    def process_deleteApplicationModule(self, seqid, iprot, oprot):
        args = deleteApplicationModule_args()
        args.read(iprot)
        iprot.readMessageEnd()
        result = deleteApplicationModule_result()
        try:
            result.success = self._handler.deleteApplicationModule(args.authzToken, args.appModuleId)
            msg_type = TMessageType.REPLY
        except (TTransport.TTransportException, KeyboardInterrupt, SystemExit):
            raise
        except apache.airavata.api.error.ttypes.InvalidRequestException as ire:
            msg_type = TMessageType.REPLY
            result.ire = ire
        except apache.airavata.api.error.ttypes.AiravataClientException as ace:
            msg_type = TMessageType.REPLY
            result.ace = ace
        except apache.airavata.api.error.ttypes.AiravataSystemException as ase:
            msg_type = TMessageType.REPLY
            result.ase = ase
        except apache.airavata.api.error.ttypes.AuthorizationException as ae:
            msg_type = TMessageType.REPLY
            result.ae = ae
        except Exception as ex:
            msg_type = TMessageType.EXCEPTION
            logging.exception(ex)
            result = TApplicationException(TApplicationException.INTERNAL_ERROR, 'Internal error')
        oprot.writeMessageBegin("deleteApplicationModule", msg_type, seqid)
        result.write(oprot)
        oprot.writeMessageEnd()
        oprot.trans.flush()

    def process_registerApplicationDeployment(self, seqid, iprot, oprot):
        args = registerApplicationDeployment_args()
        args.read(iprot)
        iprot.readMessageEnd()
        result = registerApplicationDeployment_result()
        try:
            result.success = self._handler.registerApplicationDeployment(args.authzToken, args.gatewayId, args.applicationDeployment)
            msg_type = TMessageType.REPLY
        except (TTransport.TTransportException, KeyboardInterrupt, SystemExit):
            raise
        except apache.airavata.api.error.ttypes.InvalidRequestException as ire:
            msg_type = TMessageType.REPLY
            result.ire = ire
        except apache.airavata.api.error.ttypes.AiravataClientException as ace:
            msg_type = TMessageType.REPLY
            result.ace = ace
        except apache.airavata.api.error.ttypes.AiravataSystemException as ase:
            msg_type = TMessageType.REPLY
            result.ase = ase
        except apache.airavata.api.error.ttypes.AuthorizationException as ae:
            msg_type = TMessageType.REPLY
            result.ae = ae
        except Exception as ex:
            msg_type = TMessageType.EXCEPTION
            logging.exception(ex)
            result = TApplicationException(TApplicationException.INTERNAL_ERROR, 'Internal error')
        oprot.writeMessageBegin("registerApplicationDeployment", msg_type, seqid)
        result.write(oprot)
        oprot.writeMessageEnd()
        oprot.trans.flush()

    def process_getApplicationDeployment(self, seqid, iprot, oprot):
        args = getApplicationDeployment_args()
        args.read(iprot)
        iprot.readMessageEnd()
        result = getApplicationDeployment_result()
        try:
            result.success = self._handler.getApplicationDeployment(args.authzToken, args.appDeploymentId)
            msg_type = TMessageType.REPLY
        except (TTransport.TTransportException, KeyboardInterrupt, SystemExit):
            raise
        except apache.airavata.api.error.ttypes.InvalidRequestException as ire:
            msg_type = TMessageType.REPLY
            result.ire = ire
        except apache.airavata.api.error.ttypes.AiravataClientException as ace:
            msg_type = TMessageType.REPLY
            result.ace = ace
        except apache.airavata.api.error.ttypes.AiravataSystemException as ase:
            msg_type = TMessageType.REPLY
            result.ase = ase
        except apache.airavata.api.error.ttypes.AuthorizationException as ae:
            msg_type = TMessageType.REPLY
            result.ae = ae
        except Exception as ex:
            msg_type = TMessageType.EXCEPTION
            logging.exception(ex)
            result = TApplicationException(TApplicationException.INTERNAL_ERROR, 'Internal error')
        oprot.writeMessageBegin("getApplicationDeployment", msg_type, seqid)
        result.write(oprot)
        oprot.writeMessageEnd()
        oprot.trans.flush()

    def process_updateApplicationDeployment(self, seqid, iprot, oprot):
        args = updateApplicationDeployment_args()
        args.read(iprot)
        iprot.readMessageEnd()
        result = updateApplicationDeployment_result()
        try:
            result.success = self._handler.updateApplicationDeployment(args.authzToken, args.appDeploymentId, args.applicationDeployment)
            msg_type = TMessageType.REPLY
        except (TTransport.TTransportException, KeyboardInterrupt, SystemExit):
            raise
        except apache.airavata.api.error.ttypes.InvalidRequestException as ire:
            msg_type = TMessageType.REPLY
            result.ire = ire
        except apache.airavata.api.error.ttypes.AiravataClientException as ace:
            msg_type = TMessageType.REPLY
            result.ace = ace
        except apache.airavata.api.error.ttypes.AiravataSystemException as ase:
            msg_type = TMessageType.REPLY
            result.ase = ase
        except apache.airavata.api.error.ttypes.AuthorizationException as ae:
            msg_type = TMessageType.REPLY
            result.ae = ae
        except Exception as ex:
            msg_type = TMessageType.EXCEPTION
            logging.exception(ex)
            result = TApplicationException(TApplicationException.INTERNAL_ERROR, 'Internal error')
        oprot.writeMessageBegin("updateApplicationDeployment", msg_type, seqid)
        result.write(oprot)
        oprot.writeMessageEnd()
        oprot.trans.flush()

    def process_deleteApplicationDeployment(self, seqid, iprot, oprot):
        args = deleteApplicationDeployment_args()
        args.read(iprot)
        iprot.readMessageEnd()
        result = deleteApplicationDeployment_result()
        try:
            result.success = self._handler.deleteApplicationDeployment(args.authzToken, args.appDeploymentId)
            msg_type = TMessageType.REPLY
        except (TTransport.TTransportException, KeyboardInterrupt, SystemExit):
            raise
        except apache.airavata.api.error.ttypes.InvalidRequestException as ire:
            msg_type = TMessageType.REPLY
            result.ire = ire
        except apache.airavata.api.error.ttypes.AiravataClientException as ace:
            msg_type = TMessageType.REPLY
            result.ace = ace
        except apache.airavata.api.error.ttypes.AiravataSystemException as ase:
            msg_type = TMessageType.REPLY
            result.ase = ase
        except apache.airavata.api.error.ttypes.AuthorizationException as ae:
            msg_type = TMessageType.REPLY
            result.ae = ae
        except Exception as ex:
            msg_type = TMessageType.EXCEPTION
            logging.exception(ex)
            result = TApplicationException(TApplicationException.INTERNAL_ERROR, 'Internal error')
        oprot.writeMessageBegin("deleteApplicationDeployment", msg_type, seqid)
        result.write(oprot)
        oprot.writeMessageEnd()
        oprot.trans.flush()

    def process_getAllApplicationDeployments(self, seqid, iprot, oprot):
        args = getAllApplicationDeployments_args()
        args.read(iprot)
        iprot.readMessageEnd()
        result = getAllApplicationDeployments_result()
        try:
            result.success = self._handler.getAllApplicationDeployments(args.authzToken, args.gatewayId)
            msg_type = TMessageType.REPLY
        except (TTransport.TTransportException, KeyboardInterrupt, SystemExit):
            raise
        except apache.airavata.api.error.ttypes.InvalidRequestException as ire:
            msg_type = TMessageType.REPLY
            result.ire = ire
        except apache.airavata.api.error.ttypes.AiravataClientException as ace:
            msg_type = TMessageType.REPLY
            result.ace = ace
        except apache.airavata.api.error.ttypes.AiravataSystemException as ase:
            msg_type = TMessageType.REPLY
            result.ase = ase
        except apache.airavata.api.error.ttypes.AuthorizationException as ae:
            msg_type = TMessageType.REPLY
            result.ae = ae
        except Exception as ex:
            msg_type = TMessageType.EXCEPTION
            logging.exception(ex)
            result = TApplicationException(TApplicationException.INTERNAL_ERROR, 'Internal error')
        oprot.writeMessageBegin("getAllApplicationDeployments", msg_type, seqid)
        result.write(oprot)
        oprot.writeMessageEnd()
        oprot.trans.flush()

    def process_getAppModuleDeployedResources(self, seqid, iprot, oprot):
        args = getAppModuleDeployedResources_args()
        args.read(iprot)
        iprot.readMessageEnd()
        result = getAppModuleDeployedResources_result()
        try:
            result.success = self._handler.getAppModuleDeployedResources(args.authzToken, args.appModuleId)
            msg_type = TMessageType.REPLY
        except (TTransport.TTransportException, KeyboardInterrupt, SystemExit):
            raise
        except apache.airavata.api.error.ttypes.InvalidRequestException as ire:
            msg_type = TMessageType.REPLY
            result.ire = ire
        except apache.airavata.api.error.ttypes.AiravataClientException as ace:
            msg_type = TMessageType.REPLY
            result.ace = ace
        except apache.airavata.api.error.ttypes.AiravataSystemException as ase:
            msg_type = TMessageType.REPLY
            result.ase = ase
        except apache.airavata.api.error.ttypes.AuthorizationException as ae:
            msg_type = TMessageType.REPLY
            result.ae = ae
        except Exception as ex:
            msg_type = TMessageType.EXCEPTION
            logging.exception(ex)
            result = TApplicationException(TApplicationException.INTERNAL_ERROR, 'Internal error')
        oprot.writeMessageBegin("getAppModuleDeployedResources", msg_type, seqid)
        result.write(oprot)
        oprot.writeMessageEnd()
        oprot.trans.flush()

    def process_registerApplicationInterface(self, seqid, iprot, oprot):
        args = registerApplicationInterface_args()
        args.read(iprot)
        iprot.readMessageEnd()
        result = registerApplicationInterface_result()
        try:
            result.success = self._handler.registerApplicationInterface(args.authzToken, args.gatewayId, args.applicationInterface)
            msg_type = TMessageType.REPLY
        except (TTransport.TTransportException, KeyboardInterrupt, SystemExit):
            raise
        except apache.airavata.api.error.ttypes.InvalidRequestException as ire:
            msg_type = TMessageType.REPLY
            result.ire = ire
        except apache.airavata.api.error.ttypes.AiravataClientException as ace:
            msg_type = TMessageType.REPLY
            result.ace = ace
        except apache.airavata.api.error.ttypes.AiravataSystemException as ase:
            msg_type = TMessageType.REPLY
            result.ase = ase
        except apache.airavata.api.error.ttypes.AuthorizationException as ae:
            msg_type = TMessageType.REPLY
            result.ae = ae
        except Exception as ex:
            msg_type = TMessageType.EXCEPTION
            logging.exception(ex)
            result = TApplicationException(TApplicationException.INTERNAL_ERROR, 'Internal error')
        oprot.writeMessageBegin("registerApplicationInterface", msg_type, seqid)
        result.write(oprot)
        oprot.writeMessageEnd()
        oprot.trans.flush()

    def process_cloneApplicationInterface(self, seqid, iprot, oprot):
        args = cloneApplicationInterface_args()
        args.read(iprot)
        iprot.readMessageEnd()
        result = cloneApplicationInterface_result()
        try:
            result.success = self._handler.cloneApplicationInterface(args.authzToken, args.existingAppInterfaceID, args.newApplicationName, args.gatewayId)
            msg_type = TMessageType.REPLY
        except (TTransport.TTransportException, KeyboardInterrupt, SystemExit):
            raise
        except apache.airavata.api.error.ttypes.InvalidRequestException as ire:
            msg_type = TMessageType.REPLY
            result.ire = ire
        except apache.airavata.api.error.ttypes.AiravataClientException as ace:
            msg_type = TMessageType.REPLY
            result.ace = ace
        except apache.airavata.api.error.ttypes.AiravataSystemException as ase:
            msg_type = TMessageType.REPLY
            result.ase = ase
        except apache.airavata.api.error.ttypes.AuthorizationException as ae:
            msg_type = TMessageType.REPLY
            result.ae = ae
        except Exception as ex:
            msg_type = TMessageType.EXCEPTION
            logging.exception(ex)
            result = TApplicationException(TApplicationException.INTERNAL_ERROR, 'Internal error')
        oprot.writeMessageBegin("cloneApplicationInterface", msg_type, seqid)
        result.write(oprot)
        oprot.writeMessageEnd()
        oprot.trans.flush()

    def process_getApplicationInterface(self, seqid, iprot, oprot):
        args = getApplicationInterface_args()
        args.read(iprot)
        iprot.readMessageEnd()
        result = getApplicationInterface_result()
        try:
            result.success = self._handler.getApplicationInterface(args.authzToken, args.appInterfaceId)
            msg_type = TMessageType.REPLY
        except (TTransport.TTransportException, KeyboardInterrupt, SystemExit):
            raise
        except apache.airavata.api.error.ttypes.InvalidRequestException as ire:
            msg_type = TMessageType.REPLY
            result.ire = ire
        except apache.airavata.api.error.ttypes.AiravataClientException as ace:
            msg_type = TMessageType.REPLY
            result.ace = ace
        except apache.airavata.api.error.ttypes.AiravataSystemException as ase:
            msg_type = TMessageType.REPLY
            result.ase = ase
        except apache.airavata.api.error.ttypes.AuthorizationException as ae:
            msg_type = TMessageType.REPLY
            result.ae = ae
        except Exception as ex:
            msg_type = TMessageType.EXCEPTION
            logging.exception(ex)
            result = TApplicationException(TApplicationException.INTERNAL_ERROR, 'Internal error')
        oprot.writeMessageBegin("getApplicationInterface", msg_type, seqid)
        result.write(oprot)
        oprot.writeMessageEnd()
        oprot.trans.flush()

    def process_updateApplicationInterface(self, seqid, iprot, oprot):
        args = updateApplicationInterface_args()
        args.read(iprot)
        iprot.readMessageEnd()
        result = updateApplicationInterface_result()
        try:
            result.success = self._handler.updateApplicationInterface(args.authzToken, args.appInterfaceId, args.applicationInterface)
            msg_type = TMessageType.REPLY
        except (TTransport.TTransportException, KeyboardInterrupt, SystemExit):
            raise
        except apache.airavata.api.error.ttypes.InvalidRequestException as ire:
            msg_type = TMessageType.REPLY
            result.ire = ire
        except apache.airavata.api.error.ttypes.AiravataClientException as ace:
            msg_type = TMessageType.REPLY
            result.ace = ace
        except apache.airavata.api.error.ttypes.AiravataSystemException as ase:
            msg_type = TMessageType.REPLY
            result.ase = ase
        except apache.airavata.api.error.ttypes.AuthorizationException as ae:
            msg_type = TMessageType.REPLY
            result.ae = ae
        except Exception as ex:
            msg_type = TMessageType.EXCEPTION
            logging.exception(ex)
            result = TApplicationException(TApplicationException.INTERNAL_ERROR, 'Internal error')
        oprot.writeMessageBegin("updateApplicationInterface", msg_type, seqid)
        result.write(oprot)
        oprot.writeMessageEnd()
        oprot.trans.flush()

    def process_deleteApplicationInterface(self, seqid, iprot, oprot):
        args = deleteApplicationInterface_args()
        args.read(iprot)
        iprot.readMessageEnd()
        result = deleteApplicationInterface_result()
        try:
            result.success = self._handler.deleteApplicationInterface(args.authzToken, args.appInterfaceId)
            msg_type = TMessageType.REPLY
        except (TTransport.TTransportException, KeyboardInterrupt, SystemExit):
            raise
        except apache.airavata.api.error.ttypes.InvalidRequestException as ire:
            msg_type = TMessageType.REPLY
            result.ire = ire
        except apache.airavata.api.error.ttypes.AiravataClientException as ace:
            msg_type = TMessageType.REPLY
            result.ace = ace
        except apache.airavata.api.error.ttypes.AiravataSystemException as ase:
            msg_type = TMessageType.REPLY
            result.ase = ase
        except apache.airavata.api.error.ttypes.AuthorizationException as ae:
            msg_type = TMessageType.REPLY
            result.ae = ae
        except Exception as ex:
            msg_type = TMessageType.EXCEPTION
            logging.exception(ex)
            result = TApplicationException(TApplicationException.INTERNAL_ERROR, 'Internal error')
        oprot.writeMessageBegin("deleteApplicationInterface", msg_type, seqid)
        result.write(oprot)
        oprot.writeMessageEnd()
        oprot.trans.flush()

    def process_getAllApplicationInterfaceNames(self, seqid, iprot, oprot):
        args = getAllApplicationInterfaceNames_args()
        args.read(iprot)
        iprot.readMessageEnd()
        result = getAllApplicationInterfaceNames_result()
        try:
            result.success = self._handler.getAllApplicationInterfaceNames(args.authzToken, args.gatewayId)
            msg_type = TMessageType.REPLY
        except (TTransport.TTransportException, KeyboardInterrupt, SystemExit):
            raise
        except apache.airavata.api.error.ttypes.InvalidRequestException as ire:
            msg_type = TMessageType.REPLY
            result.ire = ire
        except apache.airavata.api.error.ttypes.AiravataClientException as ace:
            msg_type = TMessageType.REPLY
            result.ace = ace
        except apache.airavata.api.error.ttypes.AiravataSystemException as ase:
            msg_type = TMessageType.REPLY
            result.ase = ase
        except apache.airavata.api.error.ttypes.AuthorizationException as ae:
            msg_type = TMessageType.REPLY
            result.ae = ae
        except Exception as ex:
            msg_type = TMessageType.EXCEPTION
            logging.exception(ex)
            result = TApplicationException(TApplicationException.INTERNAL_ERROR, 'Internal error')
        oprot.writeMessageBegin("getAllApplicationInterfaceNames", msg_type, seqid)
        result.write(oprot)
        oprot.writeMessageEnd()
        oprot.trans.flush()

    def process_getAllApplicationInterfaces(self, seqid, iprot, oprot):
        args = getAllApplicationInterfaces_args()
        args.read(iprot)
        iprot.readMessageEnd()
        result = getAllApplicationInterfaces_result()
        try:
            result.success = self._handler.getAllApplicationInterfaces(args.authzToken, args.gatewayId)
            msg_type = TMessageType.REPLY
        except (TTransport.TTransportException, KeyboardInterrupt, SystemExit):
            raise
        except apache.airavata.api.error.ttypes.InvalidRequestException as ire:
            msg_type = TMessageType.REPLY
            result.ire = ire
        except apache.airavata.api.error.ttypes.AiravataClientException as ace:
            msg_type = TMessageType.REPLY
            result.ace = ace
        except apache.airavata.api.error.ttypes.AiravataSystemException as ase:
            msg_type = TMessageType.REPLY
            result.ase = ase
        except apache.airavata.api.error.ttypes.AuthorizationException as ae:
            msg_type = TMessageType.REPLY
            result.ae = ae
        except Exception as ex:
            msg_type = TMessageType.EXCEPTION
            logging.exception(ex)
            result = TApplicationException(TApplicationException.INTERNAL_ERROR, 'Internal error')
        oprot.writeMessageBegin("getAllApplicationInterfaces", msg_type, seqid)
        result.write(oprot)
        oprot.writeMessageEnd()
        oprot.trans.flush()

    def process_getApplicationInputs(self, seqid, iprot, oprot):
        args = getApplicationInputs_args()
        args.read(iprot)
        iprot.readMessageEnd()
        result = getApplicationInputs_result()
        try:
            result.success = self._handler.getApplicationInputs(args.authzToken, args.appInterfaceId)
            msg_type = TMessageType.REPLY
        except (TTransport.TTransportException, KeyboardInterrupt, SystemExit):
            raise
        except apache.airavata.api.error.ttypes.InvalidRequestException as ire:
            msg_type = TMessageType.REPLY
            result.ire = ire
        except apache.airavata.api.error.ttypes.AiravataClientException as ace:
            msg_type = TMessageType.REPLY
            result.ace = ace
        except apache.airavata.api.error.ttypes.AiravataSystemException as ase:
            msg_type = TMessageType.REPLY
            result.ase = ase
        except apache.airavata.api.error.ttypes.AuthorizationException as ae:
            msg_type = TMessageType.REPLY
            result.ae = ae
        except Exception as ex:
            msg_type = TMessageType.EXCEPTION
            logging.exception(ex)
            result = TApplicationException(TApplicationException.INTERNAL_ERROR, 'Internal error')
        oprot.writeMessageBegin("getApplicationInputs", msg_type, seqid)
        result.write(oprot)
        oprot.writeMessageEnd()
        oprot.trans.flush()

    def process_getApplicationOutputs(self, seqid, iprot, oprot):
        args = getApplicationOutputs_args()
        args.read(iprot)
        iprot.readMessageEnd()
        result = getApplicationOutputs_result()
        try:
            result.success = self._handler.getApplicationOutputs(args.authzToken, args.appInterfaceId)
            msg_type = TMessageType.REPLY
        except (TTransport.TTransportException, KeyboardInterrupt, SystemExit):
            raise
        except apache.airavata.api.error.ttypes.InvalidRequestException as ire:
            msg_type = TMessageType.REPLY
            result.ire = ire
        except apache.airavata.api.error.ttypes.AiravataClientException as ace:
            msg_type = TMessageType.REPLY
            result.ace = ace
        except apache.airavata.api.error.ttypes.AiravataSystemException as ase:
            msg_type = TMessageType.REPLY
            result.ase = ase
        except apache.airavata.api.error.ttypes.AuthorizationException as ae:
            msg_type = TMessageType.REPLY
            result.ae = ae
        except Exception as ex:
            msg_type = TMessageType.EXCEPTION
            logging.exception(ex)
            result = TApplicationException(TApplicationException.INTERNAL_ERROR, 'Internal error')
        oprot.writeMessageBegin("getApplicationOutputs", msg_type, seqid)
        result.write(oprot)
        oprot.writeMessageEnd()
        oprot.trans.flush()

    def process_getAvailableAppInterfaceComputeResources(self, seqid, iprot, oprot):
        args = getAvailableAppInterfaceComputeResources_args()
        args.read(iprot)
        iprot.readMessageEnd()
        result = getAvailableAppInterfaceComputeResources_result()
        try:
            result.success = self._handler.getAvailableAppInterfaceComputeResources(args.authzToken, args.appInterfaceId)
            msg_type = TMessageType.REPLY
        except (TTransport.TTransportException, KeyboardInterrupt, SystemExit):
            raise
        except apache.airavata.api.error.ttypes.InvalidRequestException as ire:
            msg_type = TMessageType.REPLY
            result.ire = ire
        except apache.airavata.api.error.ttypes.AiravataClientException as ace:
            msg_type = TMessageType.REPLY
            result.ace = ace
        except apache.airavata.api.error.ttypes.AiravataSystemException as ase:
            msg_type = TMessageType.REPLY
            result.ase = ase
        except apache.airavata.api.error.ttypes.AuthorizationException as ae:
            msg_type = TMessageType.REPLY
            result.ae = ae
        except Exception as ex:
            msg_type = TMessageType.EXCEPTION
            logging.exception(ex)
            result = TApplicationException(TApplicationException.INTERNAL_ERROR, 'Internal error')
        oprot.writeMessageBegin("getAvailableAppInterfaceComputeResources", msg_type, seqid)
        result.write(oprot)
        oprot.writeMessageEnd()
        oprot.trans.flush()

    def process_registerComputeResource(self, seqid, iprot, oprot):
        args = registerComputeResource_args()
        args.read(iprot)
        iprot.readMessageEnd()
        result = registerComputeResource_result()
        try:
            result.success = self._handler.registerComputeResource(args.authzToken, args.computeResourceDescription)
            msg_type = TMessageType.REPLY
        except (TTransport.TTransportException, KeyboardInterrupt, SystemExit):
            raise
        except apache.airavata.api.error.ttypes.InvalidRequestException as ire:
            msg_type = TMessageType.REPLY
            result.ire = ire
        except apache.airavata.api.error.ttypes.AiravataClientException as ace:
            msg_type = TMessageType.REPLY
            result.ace = ace
        except apache.airavata.api.error.ttypes.AiravataSystemException as ase:
            msg_type = TMessageType.REPLY
            result.ase = ase
        except apache.airavata.api.error.ttypes.AuthorizationException as ae:
            msg_type = TMessageType.REPLY
            result.ae = ae
        except Exception as ex:
            msg_type = TMessageType.EXCEPTION
            logging.exception(ex)
            result = TApplicationException(TApplicationException.INTERNAL_ERROR, 'Internal error')
        oprot.writeMessageBegin("registerComputeResource", msg_type, seqid)
        result.write(oprot)
        oprot.writeMessageEnd()
        oprot.trans.flush()

    def process_getComputeResource(self, seqid, iprot, oprot):
        args = getComputeResource_args()
        args.read(iprot)
        iprot.readMessageEnd()
        result = getComputeResource_result()
        try:
            result.success = self._handler.getComputeResource(args.authzToken, args.computeResourceId)
            msg_type = TMessageType.REPLY
        except (TTransport.TTransportException, KeyboardInterrupt, SystemExit):
            raise
        except apache.airavata.api.error.ttypes.InvalidRequestException as ire:
            msg_type = TMessageType.REPLY
            result.ire = ire
        except apache.airavata.api.error.ttypes.AiravataClientException as ace:
            msg_type = TMessageType.REPLY
            result.ace = ace
        except apache.airavata.api.error.ttypes.AiravataSystemException as ase:
            msg_type = TMessageType.REPLY
            result.ase = ase
        except apache.airavata.api.error.ttypes.AuthorizationException as ae:
            msg_type = TMessageType.REPLY
            result.ae = ae
        except Exception as ex:
            msg_type = TMessageType.EXCEPTION
            logging.exception(ex)
            result = TApplicationException(TApplicationException.INTERNAL_ERROR, 'Internal error')
        oprot.writeMessageBegin("getComputeResource", msg_type, seqid)
        result.write(oprot)
        oprot.writeMessageEnd()
        oprot.trans.flush()

    def process_getAllComputeResourceNames(self, seqid, iprot, oprot):
        args = getAllComputeResourceNames_args()
        args.read(iprot)
        iprot.readMessageEnd()
        result = getAllComputeResourceNames_result()
        try:
            result.success = self._handler.getAllComputeResourceNames(args.authzToken)
            msg_type = TMessageType.REPLY
        except (TTransport.TTransportException, KeyboardInterrupt, SystemExit):
            raise
        except apache.airavata.api.error.ttypes.InvalidRequestException as ire:
            msg_type = TMessageType.REPLY
            result.ire = ire
        except apache.airavata.api.error.ttypes.AiravataClientException as ace:
            msg_type = TMessageType.REPLY
            result.ace = ace
        except apache.airavata.api.error.ttypes.AiravataSystemException as ase:
            msg_type = TMessageType.REPLY
            result.ase = ase
        except apache.airavata.api.error.ttypes.AuthorizationException as ae:
            msg_type = TMessageType.REPLY
            result.ae = ae
        except Exception as ex:
            msg_type = TMessageType.EXCEPTION
            logging.exception(ex)
            result = TApplicationException(TApplicationException.INTERNAL_ERROR, 'Internal error')
        oprot.writeMessageBegin("getAllComputeResourceNames", msg_type, seqid)
        result.write(oprot)
        oprot.writeMessageEnd()
        oprot.trans.flush()

    def process_updateComputeResource(self, seqid, iprot, oprot):
        args = updateComputeResource_args()
        args.read(iprot)
        iprot.readMessageEnd()
        result = updateComputeResource_result()
        try:
            result.success = self._handler.updateComputeResource(args.authzToken, args.computeResourceId, args.computeResourceDescription)
            msg_type = TMessageType.REPLY
        except (TTransport.TTransportException, KeyboardInterrupt, SystemExit):
            raise
        except apache.airavata.api.error.ttypes.InvalidRequestException as ire:
            msg_type = TMessageType.REPLY
            result.ire = ire
        except apache.airavata.api.error.ttypes.AiravataClientException as ace:
            msg_type = TMessageType.REPLY
            result.ace = ace
        except apache.airavata.api.error.ttypes.AiravataSystemException as ase:
            msg_type = TMessageType.REPLY
            result.ase = ase
        except apache.airavata.api.error.ttypes.AuthorizationException as ae:
            msg_type = TMessageType.REPLY
            result.ae = ae
        except Exception as ex:
            msg_type = TMessageType.EXCEPTION
            logging.exception(ex)
            result = TApplicationException(TApplicationException.INTERNAL_ERROR, 'Internal error')
        oprot.writeMessageBegin("updateComputeResource", msg_type, seqid)
        result.write(oprot)
        oprot.writeMessageEnd()
        oprot.trans.flush()

    def process_deleteComputeResource(self, seqid, iprot, oprot):
        args = deleteComputeResource_args()
        args.read(iprot)
        iprot.readMessageEnd()
        result = deleteComputeResource_result()
        try:
            result.success = self._handler.deleteComputeResource(args.authzToken, args.computeResourceId)
            msg_type = TMessageType.REPLY
        except (TTransport.TTransportException, KeyboardInterrupt, SystemExit):
            raise
        except apache.airavata.api.error.ttypes.InvalidRequestException as ire:
            msg_type = TMessageType.REPLY
            result.ire = ire
        except apache.airavata.api.error.ttypes.AiravataClientException as ace:
            msg_type = TMessageType.REPLY
            result.ace = ace
        except apache.airavata.api.error.ttypes.AiravataSystemException as ase:
            msg_type = TMessageType.REPLY
            result.ase = ase
        except apache.airavata.api.error.ttypes.AuthorizationException as ae:
            msg_type = TMessageType.REPLY
            result.ae = ae
        except Exception as ex:
            msg_type = TMessageType.EXCEPTION
            logging.exception(ex)
            result = TApplicationException(TApplicationException.INTERNAL_ERROR, 'Internal error')
        oprot.writeMessageBegin("deleteComputeResource", msg_type, seqid)
        result.write(oprot)
        oprot.writeMessageEnd()
        oprot.trans.flush()

    def process_registerStorageResource(self, seqid, iprot, oprot):
        args = registerStorageResource_args()
        args.read(iprot)
        iprot.readMessageEnd()
        result = registerStorageResource_result()
        try:
            result.success = self._handler.registerStorageResource(args.authzToken, args.storageResourceDescription)
            msg_type = TMessageType.REPLY
        except (TTransport.TTransportException, KeyboardInterrupt, SystemExit):
            raise
        except apache.airavata.api.error.ttypes.InvalidRequestException as ire:
            msg_type = TMessageType.REPLY
            result.ire = ire
        except apache.airavata.api.error.ttypes.AiravataClientException as ace:
            msg_type = TMessageType.REPLY
            result.ace = ace
        except apache.airavata.api.error.ttypes.AiravataSystemException as ase:
            msg_type = TMessageType.REPLY
            result.ase = ase
        except apache.airavata.api.error.ttypes.AuthorizationException as ae:
            msg_type = TMessageType.REPLY
            result.ae = ae
        except Exception as ex:
            msg_type = TMessageType.EXCEPTION
            logging.exception(ex)
            result = TApplicationException(TApplicationException.INTERNAL_ERROR, 'Internal error')
        oprot.writeMessageBegin("registerStorageResource", msg_type, seqid)
        result.write(oprot)
        oprot.writeMessageEnd()
        oprot.trans.flush()

    def process_getStorageResource(self, seqid, iprot, oprot):
        args = getStorageResource_args()
        args.read(iprot)
        iprot.readMessageEnd()
        result = getStorageResource_result()
        try:
            result.success = self._handler.getStorageResource(args.authzToken, args.storageResourceId)
            msg_type = TMessageType.REPLY
        except (TTransport.TTransportException, KeyboardInterrupt, SystemExit):
            raise
        except apache.airavata.api.error.ttypes.InvalidRequestException as ire:
            msg_type = TMessageType.REPLY
            result.ire = ire
        except apache.airavata.api.error.ttypes.AiravataClientException as ace:
            msg_type = TMessageType.REPLY
            result.ace = ace
        except apache.airavata.api.error.ttypes.AiravataSystemException as ase:
            msg_type = TMessageType.REPLY
            result.ase = ase
        except apache.airavata.api.error.ttypes.AuthorizationException as ae:
            msg_type = TMessageType.REPLY
            result.ae = ae
        except Exception as ex:
            msg_type = TMessageType.EXCEPTION
            logging.exception(ex)
            result = TApplicationException(TApplicationException.INTERNAL_ERROR, 'Internal error')
        oprot.writeMessageBegin("getStorageResource", msg_type, seqid)
        result.write(oprot)
        oprot.writeMessageEnd()
        oprot.trans.flush()

    def process_getAllStorageResourceNames(self, seqid, iprot, oprot):
        args = getAllStorageResourceNames_args()
        args.read(iprot)
        iprot.readMessageEnd()
        result = getAllStorageResourceNames_result()
        try:
            result.success = self._handler.getAllStorageResourceNames(args.authzToken)
            msg_type = TMessageType.REPLY
        except (TTransport.TTransportException, KeyboardInterrupt, SystemExit):
            raise
        except apache.airavata.api.error.ttypes.InvalidRequestException as ire:
            msg_type = TMessageType.REPLY
            result.ire = ire
        except apache.airavata.api.error.ttypes.AiravataClientException as ace:
            msg_type = TMessageType.REPLY
            result.ace = ace
        except apache.airavata.api.error.ttypes.AiravataSystemException as ase:
            msg_type = TMessageType.REPLY
            result.ase = ase
        except apache.airavata.api.error.ttypes.AuthorizationException as ae:
            msg_type = TMessageType.REPLY
            result.ae = ae
        except Exception as ex:
            msg_type = TMessageType.EXCEPTION
            logging.exception(ex)
            result = TApplicationException(TApplicationException.INTERNAL_ERROR, 'Internal error')
        oprot.writeMessageBegin("getAllStorageResourceNames", msg_type, seqid)
        result.write(oprot)
        oprot.writeMessageEnd()
        oprot.trans.flush()

    def process_updateStorageResource(self, seqid, iprot, oprot):
        args = updateStorageResource_args()
        args.read(iprot)
        iprot.readMessageEnd()
        result = updateStorageResource_result()
        try:
            result.success = self._handler.updateStorageResource(args.authzToken, args.storageResourceId, args.storageResourceDescription)
            msg_type = TMessageType.REPLY
        except (TTransport.TTransportException, KeyboardInterrupt, SystemExit):
            raise
        except apache.airavata.api.error.ttypes.InvalidRequestException as ire:
            msg_type = TMessageType.REPLY
            result.ire = ire
        except apache.airavata.api.error.ttypes.AiravataClientException as ace:
            msg_type = TMessageType.REPLY
            result.ace = ace
        except apache.airavata.api.error.ttypes.AiravataSystemException as ase:
            msg_type = TMessageType.REPLY
            result.ase = ase
        except apache.airavata.api.error.ttypes.AuthorizationException as ae:
            msg_type = TMessageType.REPLY
            result.ae = ae
        except Exception as ex:
            msg_type = TMessageType.EXCEPTION
            logging.exception(ex)
            result = TApplicationException(TApplicationException.INTERNAL_ERROR, 'Internal error')
        oprot.writeMessageBegin("updateStorageResource", msg_type, seqid)
        result.write(oprot)
        oprot.writeMessageEnd()
        oprot.trans.flush()

    def process_deleteStorageResource(self, seqid, iprot, oprot):
        args = deleteStorageResource_args()
        args.read(iprot)
        iprot.readMessageEnd()
        result = deleteStorageResource_result()
        try:
            result.success = self._handler.deleteStorageResource(args.authzToken, args.storageResourceId)
            msg_type = TMessageType.REPLY
        except (TTransport.TTransportException, KeyboardInterrupt, SystemExit):
            raise
        except apache.airavata.api.error.ttypes.InvalidRequestException as ire:
            msg_type = TMessageType.REPLY
            result.ire = ire
        except apache.airavata.api.error.ttypes.AiravataClientException as ace:
            msg_type = TMessageType.REPLY
            result.ace = ace
        except apache.airavata.api.error.ttypes.AiravataSystemException as ase:
            msg_type = TMessageType.REPLY
            result.ase = ase
        except apache.airavata.api.error.ttypes.AuthorizationException as ae:
            msg_type = TMessageType.REPLY
            result.ae = ae
        except Exception as ex:
            msg_type = TMessageType.EXCEPTION
            logging.exception(ex)
            result = TApplicationException(TApplicationException.INTERNAL_ERROR, 'Internal error')
        oprot.writeMessageBegin("deleteStorageResource", msg_type, seqid)
        result.write(oprot)
        oprot.writeMessageEnd()
        oprot.trans.flush()

    def process_addLocalSubmissionDetails(self, seqid, iprot, oprot):
        args = addLocalSubmissionDetails_args()
        args.read(iprot)
        iprot.readMessageEnd()
        result = addLocalSubmissionDetails_result()
        try:
            result.success = self._handler.addLocalSubmissionDetails(args.authzToken, args.computeResourceId, args.priorityOrder, args.localSubmission)
            msg_type = TMessageType.REPLY
        except (TTransport.TTransportException, KeyboardInterrupt, SystemExit):
            raise
        except apache.airavata.api.error.ttypes.InvalidRequestException as ire:
            msg_type = TMessageType.REPLY
            result.ire = ire
        except apache.airavata.api.error.ttypes.AiravataClientException as ace:
            msg_type = TMessageType.REPLY
            result.ace = ace
        except apache.airavata.api.error.ttypes.AiravataSystemException as ase:
            msg_type = TMessageType.REPLY
            result.ase = ase
        except apache.airavata.api.error.ttypes.AuthorizationException as ae:
            msg_type = TMessageType.REPLY
            result.ae = ae
        except Exception as ex:
            msg_type = TMessageType.EXCEPTION
            logging.exception(ex)
            result = TApplicationException(TApplicationException.INTERNAL_ERROR, 'Internal error')
        oprot.writeMessageBegin("addLocalSubmissionDetails", msg_type, seqid)
        result.write(oprot)
        oprot.writeMessageEnd()
        oprot.trans.flush()

    def process_updateLocalSubmissionDetails(self, seqid, iprot, oprot):
        args = updateLocalSubmissionDetails_args()
        args.read(iprot)
        iprot.readMessageEnd()
        result = updateLocalSubmissionDetails_result()
        try:
            result.success = self._handler.updateLocalSubmissionDetails(args.authzToken, args.jobSubmissionInterfaceId, args.localSubmission)
            msg_type = TMessageType.REPLY
        except (TTransport.TTransportException, KeyboardInterrupt, SystemExit):
            raise
        except apache.airavata.api.error.ttypes.InvalidRequestException as ire:
            msg_type = TMessageType.REPLY
            result.ire = ire
        except apache.airavata.api.error.ttypes.AiravataClientException as ace:
            msg_type = TMessageType.REPLY
            result.ace = ace
        except apache.airavata.api.error.ttypes.AiravataSystemException as ase:
            msg_type = TMessageType.REPLY
            result.ase = ase
        except apache.airavata.api.error.ttypes.AuthorizationException as ae:
            msg_type = TMessageType.REPLY
            result.ae = ae
        except Exception as ex:
            msg_type = TMessageType.EXCEPTION
            logging.exception(ex)
            result = TApplicationException(TApplicationException.INTERNAL_ERROR, 'Internal error')
        oprot.writeMessageBegin("updateLocalSubmissionDetails", msg_type, seqid)
        result.write(oprot)
        oprot.writeMessageEnd()
        oprot.trans.flush()

    def process_getLocalJobSubmission(self, seqid, iprot, oprot):
        args = getLocalJobSubmission_args()
        args.read(iprot)
        iprot.readMessageEnd()
        result = getLocalJobSubmission_result()
        try:
            result.success = self._handler.getLocalJobSubmission(args.authzToken, args.jobSubmissionId)
            msg_type = TMessageType.REPLY
        except (TTransport.TTransportException, KeyboardInterrupt, SystemExit):
            raise
        except apache.airavata.api.error.ttypes.InvalidRequestException as ire:
            msg_type = TMessageType.REPLY
            result.ire = ire
        except apache.airavata.api.error.ttypes.AiravataClientException as ace:
            msg_type = TMessageType.REPLY
            result.ace = ace
        except apache.airavata.api.error.ttypes.AiravataSystemException as ase:
            msg_type = TMessageType.REPLY
            result.ase = ase
        except apache.airavata.api.error.ttypes.AuthorizationException as ae:
            msg_type = TMessageType.REPLY
            result.ae = ae
        except Exception as ex:
            msg_type = TMessageType.EXCEPTION
            logging.exception(ex)
            result = TApplicationException(TApplicationException.INTERNAL_ERROR, 'Internal error')
        oprot.writeMessageBegin("getLocalJobSubmission", msg_type, seqid)
        result.write(oprot)
        oprot.writeMessageEnd()
        oprot.trans.flush()

    def process_addSSHJobSubmissionDetails(self, seqid, iprot, oprot):
        args = addSSHJobSubmissionDetails_args()
        args.read(iprot)
        iprot.readMessageEnd()
        result = addSSHJobSubmissionDetails_result()
        try:
            result.success = self._handler.addSSHJobSubmissionDetails(args.authzToken, args.computeResourceId, args.priorityOrder, args.sshJobSubmission)
            msg_type = TMessageType.REPLY
        except (TTransport.TTransportException, KeyboardInterrupt, SystemExit):
            raise
        except apache.airavata.api.error.ttypes.InvalidRequestException as ire:
            msg_type = TMessageType.REPLY
            result.ire = ire
        except apache.airavata.api.error.ttypes.AiravataClientException as ace:
            msg_type = TMessageType.REPLY
            result.ace = ace
        except apache.airavata.api.error.ttypes.AiravataSystemException as ase:
            msg_type = TMessageType.REPLY
            result.ase = ase
        except apache.airavata.api.error.ttypes.AuthorizationException as ae:
            msg_type = TMessageType.REPLY
            result.ae = ae
        except Exception as ex:
            msg_type = TMessageType.EXCEPTION
            logging.exception(ex)
            result = TApplicationException(TApplicationException.INTERNAL_ERROR, 'Internal error')
        oprot.writeMessageBegin("addSSHJobSubmissionDetails", msg_type, seqid)
        result.write(oprot)
        oprot.writeMessageEnd()
        oprot.trans.flush()

    def process_addSSHForkJobSubmissionDetails(self, seqid, iprot, oprot):
        args = addSSHForkJobSubmissionDetails_args()
        args.read(iprot)
        iprot.readMessageEnd()
        result = addSSHForkJobSubmissionDetails_result()
        try:
            result.success = self._handler.addSSHForkJobSubmissionDetails(args.authzToken, args.computeResourceId, args.priorityOrder, args.sshJobSubmission)
            msg_type = TMessageType.REPLY
        except (TTransport.TTransportException, KeyboardInterrupt, SystemExit):
            raise
        except apache.airavata.api.error.ttypes.InvalidRequestException as ire:
            msg_type = TMessageType.REPLY
            result.ire = ire
        except apache.airavata.api.error.ttypes.AiravataClientException as ace:
            msg_type = TMessageType.REPLY
            result.ace = ace
        except apache.airavata.api.error.ttypes.AiravataSystemException as ase:
            msg_type = TMessageType.REPLY
            result.ase = ase
        except apache.airavata.api.error.ttypes.AuthorizationException as ae:
            msg_type = TMessageType.REPLY
            result.ae = ae
        except Exception as ex:
            msg_type = TMessageType.EXCEPTION
            logging.exception(ex)
            result = TApplicationException(TApplicationException.INTERNAL_ERROR, 'Internal error')
        oprot.writeMessageBegin("addSSHForkJobSubmissionDetails", msg_type, seqid)
        result.write(oprot)
        oprot.writeMessageEnd()
        oprot.trans.flush()

    def process_getSSHJobSubmission(self, seqid, iprot, oprot):
        args = getSSHJobSubmission_args()
        args.read(iprot)
        iprot.readMessageEnd()
        result = getSSHJobSubmission_result()
        try:
            result.success = self._handler.getSSHJobSubmission(args.authzToken, args.jobSubmissionId)
            msg_type = TMessageType.REPLY
        except (TTransport.TTransportException, KeyboardInterrupt, SystemExit):
            raise
        except apache.airavata.api.error.ttypes.InvalidRequestException as ire:
            msg_type = TMessageType.REPLY
            result.ire = ire
        except apache.airavata.api.error.ttypes.AiravataClientException as ace:
            msg_type = TMessageType.REPLY
            result.ace = ace
        except apache.airavata.api.error.ttypes.AiravataSystemException as ase:
            msg_type = TMessageType.REPLY
            result.ase = ase
        except apache.airavata.api.error.ttypes.AuthorizationException as ae:
            msg_type = TMessageType.REPLY
            result.ae = ae
        except Exception as ex:
            msg_type = TMessageType.EXCEPTION
            logging.exception(ex)
            result = TApplicationException(TApplicationException.INTERNAL_ERROR, 'Internal error')
        oprot.writeMessageBegin("getSSHJobSubmission", msg_type, seqid)
        result.write(oprot)
        oprot.writeMessageEnd()
        oprot.trans.flush()

    def process_addUNICOREJobSubmissionDetails(self, seqid, iprot, oprot):
        args = addUNICOREJobSubmissionDetails_args()
        args.read(iprot)
        iprot.readMessageEnd()
        result = addUNICOREJobSubmissionDetails_result()
        try:
            result.success = self._handler.addUNICOREJobSubmissionDetails(args.authzToken, args.computeResourceId, args.priorityOrder, args.unicoreJobSubmission)
            msg_type = TMessageType.REPLY
        except (TTransport.TTransportException, KeyboardInterrupt, SystemExit):
            raise
        except apache.airavata.api.error.ttypes.InvalidRequestException as ire:
            msg_type = TMessageType.REPLY
            result.ire = ire
        except apache.airavata.api.error.ttypes.AiravataClientException as ace:
            msg_type = TMessageType.REPLY
            result.ace = ace
        except apache.airavata.api.error.ttypes.AiravataSystemException as ase:
            msg_type = TMessageType.REPLY
            result.ase = ase
        except apache.airavata.api.error.ttypes.AuthorizationException as ae:
            msg_type = TMessageType.REPLY
            result.ae = ae
        except Exception as ex:
            msg_type = TMessageType.EXCEPTION
            logging.exception(ex)
            result = TApplicationException(TApplicationException.INTERNAL_ERROR, 'Internal error')
        oprot.writeMessageBegin("addUNICOREJobSubmissionDetails", msg_type, seqid)
        result.write(oprot)
        oprot.writeMessageEnd()
        oprot.trans.flush()

    def process_getUnicoreJobSubmission(self, seqid, iprot, oprot):
        args = getUnicoreJobSubmission_args()
        args.read(iprot)
        iprot.readMessageEnd()
        result = getUnicoreJobSubmission_result()
        try:
            result.success = self._handler.getUnicoreJobSubmission(args.authzToken, args.jobSubmissionId)
            msg_type = TMessageType.REPLY
        except (TTransport.TTransportException, KeyboardInterrupt, SystemExit):
            raise
        except apache.airavata.api.error.ttypes.InvalidRequestException as ire:
            msg_type = TMessageType.REPLY
            result.ire = ire
        except apache.airavata.api.error.ttypes.AiravataClientException as ace:
            msg_type = TMessageType.REPLY
            result.ace = ace
        except apache.airavata.api.error.ttypes.AiravataSystemException as ase:
            msg_type = TMessageType.REPLY
            result.ase = ase
        except apache.airavata.api.error.ttypes.AuthorizationException as ae:
            msg_type = TMessageType.REPLY
            result.ae = ae
        except Exception as ex:
            msg_type = TMessageType.EXCEPTION
            logging.exception(ex)
            result = TApplicationException(TApplicationException.INTERNAL_ERROR, 'Internal error')
        oprot.writeMessageBegin("getUnicoreJobSubmission", msg_type, seqid)
        result.write(oprot)
        oprot.writeMessageEnd()
        oprot.trans.flush()

    def process_addCloudJobSubmissionDetails(self, seqid, iprot, oprot):
        args = addCloudJobSubmissionDetails_args()
        args.read(iprot)
        iprot.readMessageEnd()
        result = addCloudJobSubmissionDetails_result()
        try:
            result.success = self._handler.addCloudJobSubmissionDetails(args.authzToken, args.computeResourceId, args.priorityOrder, args.cloudSubmission)
            msg_type = TMessageType.REPLY
        except (TTransport.TTransportException, KeyboardInterrupt, SystemExit):
            raise
        except apache.airavata.api.error.ttypes.InvalidRequestException as ire:
            msg_type = TMessageType.REPLY
            result.ire = ire
        except apache.airavata.api.error.ttypes.AiravataClientException as ace:
            msg_type = TMessageType.REPLY
            result.ace = ace
        except apache.airavata.api.error.ttypes.AiravataSystemException as ase:
            msg_type = TMessageType.REPLY
            result.ase = ase
        except apache.airavata.api.error.ttypes.AuthorizationException as ae:
            msg_type = TMessageType.REPLY
            result.ae = ae
        except Exception as ex:
            msg_type = TMessageType.EXCEPTION
            logging.exception(ex)
            result = TApplicationException(TApplicationException.INTERNAL_ERROR, 'Internal error')
        oprot.writeMessageBegin("addCloudJobSubmissionDetails", msg_type, seqid)
        result.write(oprot)
        oprot.writeMessageEnd()
        oprot.trans.flush()

    def process_getCloudJobSubmission(self, seqid, iprot, oprot):
        args = getCloudJobSubmission_args()
        args.read(iprot)
        iprot.readMessageEnd()
        result = getCloudJobSubmission_result()
        try:
            result.success = self._handler.getCloudJobSubmission(args.authzToken, args.jobSubmissionId)
            msg_type = TMessageType.REPLY
        except (TTransport.TTransportException, KeyboardInterrupt, SystemExit):
            raise
        except apache.airavata.api.error.ttypes.InvalidRequestException as ire:
            msg_type = TMessageType.REPLY
            result.ire = ire
        except apache.airavata.api.error.ttypes.AiravataClientException as ace:
            msg_type = TMessageType.REPLY
            result.ace = ace
        except apache.airavata.api.error.ttypes.AiravataSystemException as ase:
            msg_type = TMessageType.REPLY
            result.ase = ase
        except apache.airavata.api.error.ttypes.AuthorizationException as ae:
            msg_type = TMessageType.REPLY
            result.ae = ae
        except Exception as ex:
            msg_type = TMessageType.EXCEPTION
            logging.exception(ex)
            result = TApplicationException(TApplicationException.INTERNAL_ERROR, 'Internal error')
        oprot.writeMessageBegin("getCloudJobSubmission", msg_type, seqid)
        result.write(oprot)
        oprot.writeMessageEnd()
        oprot.trans.flush()

    def process_updateSSHJobSubmissionDetails(self, seqid, iprot, oprot):
        args = updateSSHJobSubmissionDetails_args()
        args.read(iprot)
        iprot.readMessageEnd()
        result = updateSSHJobSubmissionDetails_result()
        try:
            result.success = self._handler.updateSSHJobSubmissionDetails(args.authzToken, args.jobSubmissionInterfaceId, args.sshJobSubmission)
            msg_type = TMessageType.REPLY
        except (TTransport.TTransportException, KeyboardInterrupt, SystemExit):
            raise
        except apache.airavata.api.error.ttypes.InvalidRequestException as ire:
            msg_type = TMessageType.REPLY
            result.ire = ire
        except apache.airavata.api.error.ttypes.AiravataClientException as ace:
            msg_type = TMessageType.REPLY
            result.ace = ace
        except apache.airavata.api.error.ttypes.AiravataSystemException as ase:
            msg_type = TMessageType.REPLY
            result.ase = ase
        except apache.airavata.api.error.ttypes.AuthorizationException as ae:
            msg_type = TMessageType.REPLY
            result.ae = ae
        except Exception as ex:
            msg_type = TMessageType.EXCEPTION
            logging.exception(ex)
            result = TApplicationException(TApplicationException.INTERNAL_ERROR, 'Internal error')
        oprot.writeMessageBegin("updateSSHJobSubmissionDetails", msg_type, seqid)
        result.write(oprot)
        oprot.writeMessageEnd()
        oprot.trans.flush()

    def process_updateCloudJobSubmissionDetails(self, seqid, iprot, oprot):
        args = updateCloudJobSubmissionDetails_args()
        args.read(iprot)
        iprot.readMessageEnd()
        result = updateCloudJobSubmissionDetails_result()
        try:
            result.success = self._handler.updateCloudJobSubmissionDetails(args.authzToken, args.jobSubmissionInterfaceId, args.sshJobSubmission)
            msg_type = TMessageType.REPLY
        except (TTransport.TTransportException, KeyboardInterrupt, SystemExit):
            raise
        except apache.airavata.api.error.ttypes.InvalidRequestException as ire:
            msg_type = TMessageType.REPLY
            result.ire = ire
        except apache.airavata.api.error.ttypes.AiravataClientException as ace:
            msg_type = TMessageType.REPLY
            result.ace = ace
        except apache.airavata.api.error.ttypes.AiravataSystemException as ase:
            msg_type = TMessageType.REPLY
            result.ase = ase
        except apache.airavata.api.error.ttypes.AuthorizationException as ae:
            msg_type = TMessageType.REPLY
            result.ae = ae
        except Exception as ex:
            msg_type = TMessageType.EXCEPTION
            logging.exception(ex)
            result = TApplicationException(TApplicationException.INTERNAL_ERROR, 'Internal error')
        oprot.writeMessageBegin("updateCloudJobSubmissionDetails", msg_type, seqid)
        result.write(oprot)
        oprot.writeMessageEnd()
        oprot.trans.flush()

    def process_updateUnicoreJobSubmissionDetails(self, seqid, iprot, oprot):
        args = updateUnicoreJobSubmissionDetails_args()
        args.read(iprot)
        iprot.readMessageEnd()
        result = updateUnicoreJobSubmissionDetails_result()
        try:
            result.success = self._handler.updateUnicoreJobSubmissionDetails(args.authzToken, args.jobSubmissionInterfaceId, args.unicoreJobSubmission)
            msg_type = TMessageType.REPLY
        except (TTransport.TTransportException, KeyboardInterrupt, SystemExit):
            raise
        except apache.airavata.api.error.ttypes.InvalidRequestException as ire:
            msg_type = TMessageType.REPLY
            result.ire = ire
        except apache.airavata.api.error.ttypes.AiravataClientException as ace:
            msg_type = TMessageType.REPLY
            result.ace = ace
        except apache.airavata.api.error.ttypes.AiravataSystemException as ase:
            msg_type = TMessageType.REPLY
            result.ase = ase
        except apache.airavata.api.error.ttypes.AuthorizationException as ae:
            msg_type = TMessageType.REPLY
            result.ae = ae
        except Exception as ex:
            msg_type = TMessageType.EXCEPTION
            logging.exception(ex)
            result = TApplicationException(TApplicationException.INTERNAL_ERROR, 'Internal error')
        oprot.writeMessageBegin("updateUnicoreJobSubmissionDetails", msg_type, seqid)
        result.write(oprot)
        oprot.writeMessageEnd()
        oprot.trans.flush()

    def process_addLocalDataMovementDetails(self, seqid, iprot, oprot):
        args = addLocalDataMovementDetails_args()
        args.read(iprot)
        iprot.readMessageEnd()
        result = addLocalDataMovementDetails_result()
        try:
            result.success = self._handler.addLocalDataMovementDetails(args.authzToken, args.productUri, args.dataMoveType, args.priorityOrder, args.localDataMovement)
            msg_type = TMessageType.REPLY
        except (TTransport.TTransportException, KeyboardInterrupt, SystemExit):
            raise
        except apache.airavata.api.error.ttypes.InvalidRequestException as ire:
            msg_type = TMessageType.REPLY
            result.ire = ire
        except apache.airavata.api.error.ttypes.AiravataClientException as ace:
            msg_type = TMessageType.REPLY
            result.ace = ace
        except apache.airavata.api.error.ttypes.AiravataSystemException as ase:
            msg_type = TMessageType.REPLY
            result.ase = ase
        except apache.airavata.api.error.ttypes.AuthorizationException as ae:
            msg_type = TMessageType.REPLY
            result.ae = ae
        except Exception as ex:
            msg_type = TMessageType.EXCEPTION
            logging.exception(ex)
            result = TApplicationException(TApplicationException.INTERNAL_ERROR, 'Internal error')
        oprot.writeMessageBegin("addLocalDataMovementDetails", msg_type, seqid)
        result.write(oprot)
        oprot.writeMessageEnd()
        oprot.trans.flush()

    def process_updateLocalDataMovementDetails(self, seqid, iprot, oprot):
        args = updateLocalDataMovementDetails_args()
        args.read(iprot)
        iprot.readMessageEnd()
        result = updateLocalDataMovementDetails_result()
        try:
            result.success = self._handler.updateLocalDataMovementDetails(args.authzToken, args.dataMovementInterfaceId, args.localDataMovement)
            msg_type = TMessageType.REPLY
        except (TTransport.TTransportException, KeyboardInterrupt, SystemExit):
            raise
        except apache.airavata.api.error.ttypes.InvalidRequestException as ire:
            msg_type = TMessageType.REPLY
            result.ire = ire
        except apache.airavata.api.error.ttypes.AiravataClientException as ace:
            msg_type = TMessageType.REPLY
            result.ace = ace
        except apache.airavata.api.error.ttypes.AiravataSystemException as ase:
            msg_type = TMessageType.REPLY
            result.ase = ase
        except apache.airavata.api.error.ttypes.AuthorizationException as ae:
            msg_type = TMessageType.REPLY
            result.ae = ae
        except Exception as ex:
            msg_type = TMessageType.EXCEPTION
            logging.exception(ex)
            result = TApplicationException(TApplicationException.INTERNAL_ERROR, 'Internal error')
        oprot.writeMessageBegin("updateLocalDataMovementDetails", msg_type, seqid)
        result.write(oprot)
        oprot.writeMessageEnd()
        oprot.trans.flush()

    def process_getLocalDataMovement(self, seqid, iprot, oprot):
        args = getLocalDataMovement_args()
        args.read(iprot)
        iprot.readMessageEnd()
        result = getLocalDataMovement_result()
        try:
            result.success = self._handler.getLocalDataMovement(args.authzToken, args.dataMovementId)
            msg_type = TMessageType.REPLY
        except (TTransport.TTransportException, KeyboardInterrupt, SystemExit):
            raise
        except apache.airavata.api.error.ttypes.InvalidRequestException as ire:
            msg_type = TMessageType.REPLY
            result.ire = ire
        except apache.airavata.api.error.ttypes.AiravataClientException as ace:
            msg_type = TMessageType.REPLY
            result.ace = ace
        except apache.airavata.api.error.ttypes.AiravataSystemException as ase:
            msg_type = TMessageType.REPLY
            result.ase = ase
        except apache.airavata.api.error.ttypes.AuthorizationException as ae:
            msg_type = TMessageType.REPLY
            result.ae = ae
        except Exception as ex:
            msg_type = TMessageType.EXCEPTION
            logging.exception(ex)
            result = TApplicationException(TApplicationException.INTERNAL_ERROR, 'Internal error')
        oprot.writeMessageBegin("getLocalDataMovement", msg_type, seqid)
        result.write(oprot)
        oprot.writeMessageEnd()
        oprot.trans.flush()

    def process_addSCPDataMovementDetails(self, seqid, iprot, oprot):
        args = addSCPDataMovementDetails_args()
        args.read(iprot)
        iprot.readMessageEnd()
        result = addSCPDataMovementDetails_result()
        try:
            result.success = self._handler.addSCPDataMovementDetails(args.authzToken, args.productUri, args.dataMoveType, args.priorityOrder, args.scpDataMovement)
            msg_type = TMessageType.REPLY
        except (TTransport.TTransportException, KeyboardInterrupt, SystemExit):
            raise
        except apache.airavata.api.error.ttypes.InvalidRequestException as ire:
            msg_type = TMessageType.REPLY
            result.ire = ire
        except apache.airavata.api.error.ttypes.AiravataClientException as ace:
            msg_type = TMessageType.REPLY
            result.ace = ace
        except apache.airavata.api.error.ttypes.AiravataSystemException as ase:
            msg_type = TMessageType.REPLY
            result.ase = ase
        except apache.airavata.api.error.ttypes.AuthorizationException as ae:
            msg_type = TMessageType.REPLY
            result.ae = ae
        except Exception as ex:
            msg_type = TMessageType.EXCEPTION
            logging.exception(ex)
            result = TApplicationException(TApplicationException.INTERNAL_ERROR, 'Internal error')
        oprot.writeMessageBegin("addSCPDataMovementDetails", msg_type, seqid)
        result.write(oprot)
        oprot.writeMessageEnd()
        oprot.trans.flush()

    def process_updateSCPDataMovementDetails(self, seqid, iprot, oprot):
        args = updateSCPDataMovementDetails_args()
        args.read(iprot)
        iprot.readMessageEnd()
        result = updateSCPDataMovementDetails_result()
        try:
            result.success = self._handler.updateSCPDataMovementDetails(args.authzToken, args.dataMovementInterfaceId, args.scpDataMovement)
            msg_type = TMessageType.REPLY
        except (TTransport.TTransportException, KeyboardInterrupt, SystemExit):
            raise
        except apache.airavata.api.error.ttypes.InvalidRequestException as ire:
            msg_type = TMessageType.REPLY
            result.ire = ire
        except apache.airavata.api.error.ttypes.AiravataClientException as ace:
            msg_type = TMessageType.REPLY
            result.ace = ace
        except apache.airavata.api.error.ttypes.AiravataSystemException as ase:
            msg_type = TMessageType.REPLY
            result.ase = ase
        except apache.airavata.api.error.ttypes.AuthorizationException as ae:
            msg_type = TMessageType.REPLY
            result.ae = ae
        except Exception as ex:
            msg_type = TMessageType.EXCEPTION
            logging.exception(ex)
            result = TApplicationException(TApplicationException.INTERNAL_ERROR, 'Internal error')
        oprot.writeMessageBegin("updateSCPDataMovementDetails", msg_type, seqid)
        result.write(oprot)
        oprot.writeMessageEnd()
        oprot.trans.flush()

    def process_getSCPDataMovement(self, seqid, iprot, oprot):
        args = getSCPDataMovement_args()
        args.read(iprot)
        iprot.readMessageEnd()
        result = getSCPDataMovement_result()
        try:
            result.success = self._handler.getSCPDataMovement(args.authzToken, args.dataMovementId)
            msg_type = TMessageType.REPLY
        except (TTransport.TTransportException, KeyboardInterrupt, SystemExit):
            raise
        except apache.airavata.api.error.ttypes.InvalidRequestException as ire:
            msg_type = TMessageType.REPLY
            result.ire = ire
        except apache.airavata.api.error.ttypes.AiravataClientException as ace:
            msg_type = TMessageType.REPLY
            result.ace = ace
        except apache.airavata.api.error.ttypes.AiravataSystemException as ase:
            msg_type = TMessageType.REPLY
            result.ase = ase
        except apache.airavata.api.error.ttypes.AuthorizationException as ae:
            msg_type = TMessageType.REPLY
            result.ae = ae
        except Exception as ex:
            msg_type = TMessageType.EXCEPTION
            logging.exception(ex)
            result = TApplicationException(TApplicationException.INTERNAL_ERROR, 'Internal error')
        oprot.writeMessageBegin("getSCPDataMovement", msg_type, seqid)
        result.write(oprot)
        oprot.writeMessageEnd()
        oprot.trans.flush()

    def process_addUnicoreDataMovementDetails(self, seqid, iprot, oprot):
        args = addUnicoreDataMovementDetails_args()
        args.read(iprot)
        iprot.readMessageEnd()
        result = addUnicoreDataMovementDetails_result()
        try:
            result.success = self._handler.addUnicoreDataMovementDetails(args.authzToken, args.productUri, args.dataMoveType, args.priorityOrder, args.unicoreDataMovement)
            msg_type = TMessageType.REPLY
        except (TTransport.TTransportException, KeyboardInterrupt, SystemExit):
            raise
        except apache.airavata.api.error.ttypes.InvalidRequestException as ire:
            msg_type = TMessageType.REPLY
            result.ire = ire
        except apache.airavata.api.error.ttypes.AiravataClientException as ace:
            msg_type = TMessageType.REPLY
            result.ace = ace
        except apache.airavata.api.error.ttypes.AiravataSystemException as ase:
            msg_type = TMessageType.REPLY
            result.ase = ase
        except apache.airavata.api.error.ttypes.AuthorizationException as ae:
            msg_type = TMessageType.REPLY
            result.ae = ae
        except Exception as ex:
            msg_type = TMessageType.EXCEPTION
            logging.exception(ex)
            result = TApplicationException(TApplicationException.INTERNAL_ERROR, 'Internal error')
        oprot.writeMessageBegin("addUnicoreDataMovementDetails", msg_type, seqid)
        result.write(oprot)
        oprot.writeMessageEnd()
        oprot.trans.flush()

    def process_updateUnicoreDataMovementDetails(self, seqid, iprot, oprot):
        args = updateUnicoreDataMovementDetails_args()
        args.read(iprot)
        iprot.readMessageEnd()
        result = updateUnicoreDataMovementDetails_result()
        try:
            result.success = self._handler.updateUnicoreDataMovementDetails(args.authzToken, args.dataMovementInterfaceId, args.unicoreDataMovement)
            msg_type = TMessageType.REPLY
        except (TTransport.TTransportException, KeyboardInterrupt, SystemExit):
            raise
        except apache.airavata.api.error.ttypes.InvalidRequestException as ire:
            msg_type = TMessageType.REPLY
            result.ire = ire
        except apache.airavata.api.error.ttypes.AiravataClientException as ace:
            msg_type = TMessageType.REPLY
            result.ace = ace
        except apache.airavata.api.error.ttypes.AiravataSystemException as ase:
            msg_type = TMessageType.REPLY
            result.ase = ase
        except apache.airavata.api.error.ttypes.AuthorizationException as ae:
            msg_type = TMessageType.REPLY
            result.ae = ae
        except Exception as ex:
            msg_type = TMessageType.EXCEPTION
            logging.exception(ex)
            result = TApplicationException(TApplicationException.INTERNAL_ERROR, 'Internal error')
        oprot.writeMessageBegin("updateUnicoreDataMovementDetails", msg_type, seqid)
        result.write(oprot)
        oprot.writeMessageEnd()
        oprot.trans.flush()

    def process_getUnicoreDataMovement(self, seqid, iprot, oprot):
        args = getUnicoreDataMovement_args()
        args.read(iprot)
        iprot.readMessageEnd()
        result = getUnicoreDataMovement_result()
        try:
            result.success = self._handler.getUnicoreDataMovement(args.authzToken, args.dataMovementId)
            msg_type = TMessageType.REPLY
        except (TTransport.TTransportException, KeyboardInterrupt, SystemExit):
            raise
        except apache.airavata.api.error.ttypes.InvalidRequestException as ire:
            msg_type = TMessageType.REPLY
            result.ire = ire
        except apache.airavata.api.error.ttypes.AiravataClientException as ace:
            msg_type = TMessageType.REPLY
            result.ace = ace
        except apache.airavata.api.error.ttypes.AiravataSystemException as ase:
            msg_type = TMessageType.REPLY
            result.ase = ase
        except apache.airavata.api.error.ttypes.AuthorizationException as ae:
            msg_type = TMessageType.REPLY
            result.ae = ae
        except Exception as ex:
            msg_type = TMessageType.EXCEPTION
            logging.exception(ex)
            result = TApplicationException(TApplicationException.INTERNAL_ERROR, 'Internal error')
        oprot.writeMessageBegin("getUnicoreDataMovement", msg_type, seqid)
        result.write(oprot)
        oprot.writeMessageEnd()
        oprot.trans.flush()

    def process_addGridFTPDataMovementDetails(self, seqid, iprot, oprot):
        args = addGridFTPDataMovementDetails_args()
        args.read(iprot)
        iprot.readMessageEnd()
        result = addGridFTPDataMovementDetails_result()
        try:
            result.success = self._handler.addGridFTPDataMovementDetails(args.authzToken, args.productUri, args.dataMoveType, args.priorityOrder, args.gridFTPDataMovement)
            msg_type = TMessageType.REPLY
        except (TTransport.TTransportException, KeyboardInterrupt, SystemExit):
            raise
        except apache.airavata.api.error.ttypes.InvalidRequestException as ire:
            msg_type = TMessageType.REPLY
            result.ire = ire
        except apache.airavata.api.error.ttypes.AiravataClientException as ace:
            msg_type = TMessageType.REPLY
            result.ace = ace
        except apache.airavata.api.error.ttypes.AiravataSystemException as ase:
            msg_type = TMessageType.REPLY
            result.ase = ase
        except apache.airavata.api.error.ttypes.AuthorizationException as ae:
            msg_type = TMessageType.REPLY
            result.ae = ae
        except Exception as ex:
            msg_type = TMessageType.EXCEPTION
            logging.exception(ex)
            result = TApplicationException(TApplicationException.INTERNAL_ERROR, 'Internal error')
        oprot.writeMessageBegin("addGridFTPDataMovementDetails", msg_type, seqid)
        result.write(oprot)
        oprot.writeMessageEnd()
        oprot.trans.flush()

    def process_updateGridFTPDataMovementDetails(self, seqid, iprot, oprot):
        args = updateGridFTPDataMovementDetails_args()
        args.read(iprot)
        iprot.readMessageEnd()
        result = updateGridFTPDataMovementDetails_result()
        try:
            result.success = self._handler.updateGridFTPDataMovementDetails(args.authzToken, args.dataMovementInterfaceId, args.gridFTPDataMovement)
            msg_type = TMessageType.REPLY
        except (TTransport.TTransportException, KeyboardInterrupt, SystemExit):
            raise
        except apache.airavata.api.error.ttypes.InvalidRequestException as ire:
            msg_type = TMessageType.REPLY
            result.ire = ire
        except apache.airavata.api.error.ttypes.AiravataClientException as ace:
            msg_type = TMessageType.REPLY
            result.ace = ace
        except apache.airavata.api.error.ttypes.AiravataSystemException as ase:
            msg_type = TMessageType.REPLY
            result.ase = ase
        except apache.airavata.api.error.ttypes.AuthorizationException as ae:
            msg_type = TMessageType.REPLY
            result.ae = ae
        except Exception as ex:
            msg_type = TMessageType.EXCEPTION
            logging.exception(ex)
            result = TApplicationException(TApplicationException.INTERNAL_ERROR, 'Internal error')
        oprot.writeMessageBegin("updateGridFTPDataMovementDetails", msg_type, seqid)
        result.write(oprot)
        oprot.writeMessageEnd()
        oprot.trans.flush()

    def process_getGridFTPDataMovement(self, seqid, iprot, oprot):
        args = getGridFTPDataMovement_args()
        args.read(iprot)
        iprot.readMessageEnd()
        result = getGridFTPDataMovement_result()
        try:
            result.success = self._handler.getGridFTPDataMovement(args.authzToken, args.dataMovementId)
            msg_type = TMessageType.REPLY
        except (TTransport.TTransportException, KeyboardInterrupt, SystemExit):
            raise
        except apache.airavata.api.error.ttypes.InvalidRequestException as ire:
            msg_type = TMessageType.REPLY
            result.ire = ire
        except apache.airavata.api.error.ttypes.AiravataClientException as ace:
            msg_type = TMessageType.REPLY
            result.ace = ace
        except apache.airavata.api.error.ttypes.AiravataSystemException as ase:
            msg_type = TMessageType.REPLY
            result.ase = ase
        except apache.airavata.api.error.ttypes.AuthorizationException as ae:
            msg_type = TMessageType.REPLY
            result.ae = ae
        except Exception as ex:
            msg_type = TMessageType.EXCEPTION
            logging.exception(ex)
            result = TApplicationException(TApplicationException.INTERNAL_ERROR, 'Internal error')
        oprot.writeMessageBegin("getGridFTPDataMovement", msg_type, seqid)
        result.write(oprot)
        oprot.writeMessageEnd()
        oprot.trans.flush()

    def process_changeJobSubmissionPriority(self, seqid, iprot, oprot):
        args = changeJobSubmissionPriority_args()
        args.read(iprot)
        iprot.readMessageEnd()
        result = changeJobSubmissionPriority_result()
        try:
            result.success = self._handler.changeJobSubmissionPriority(args.authzToken, args.jobSubmissionInterfaceId, args.newPriorityOrder)
            msg_type = TMessageType.REPLY
        except (TTransport.TTransportException, KeyboardInterrupt, SystemExit):
            raise
        except apache.airavata.api.error.ttypes.InvalidRequestException as ire:
            msg_type = TMessageType.REPLY
            result.ire = ire
        except apache.airavata.api.error.ttypes.AiravataClientException as ace:
            msg_type = TMessageType.REPLY
            result.ace = ace
        except apache.airavata.api.error.ttypes.AiravataSystemException as ase:
            msg_type = TMessageType.REPLY
            result.ase = ase
        except apache.airavata.api.error.ttypes.AuthorizationException as ae:
            msg_type = TMessageType.REPLY
            result.ae = ae
        except Exception as ex:
            msg_type = TMessageType.EXCEPTION
            logging.exception(ex)
            result = TApplicationException(TApplicationException.INTERNAL_ERROR, 'Internal error')
        oprot.writeMessageBegin("changeJobSubmissionPriority", msg_type, seqid)
        result.write(oprot)
        oprot.writeMessageEnd()
        oprot.trans.flush()

    def process_changeDataMovementPriority(self, seqid, iprot, oprot):
        args = changeDataMovementPriority_args()
        args.read(iprot)
        iprot.readMessageEnd()
        result = changeDataMovementPriority_result()
        try:
            result.success = self._handler.changeDataMovementPriority(args.authzToken, args.dataMovementInterfaceId, args.newPriorityOrder)
            msg_type = TMessageType.REPLY
        except (TTransport.TTransportException, KeyboardInterrupt, SystemExit):
            raise
        except apache.airavata.api.error.ttypes.InvalidRequestException as ire:
            msg_type = TMessageType.REPLY
            result.ire = ire
        except apache.airavata.api.error.ttypes.AiravataClientException as ace:
            msg_type = TMessageType.REPLY
            result.ace = ace
        except apache.airavata.api.error.ttypes.AiravataSystemException as ase:
            msg_type = TMessageType.REPLY
            result.ase = ase
        except apache.airavata.api.error.ttypes.AuthorizationException as ae:
            msg_type = TMessageType.REPLY
            result.ae = ae
        except Exception as ex:
            msg_type = TMessageType.EXCEPTION
            logging.exception(ex)
            result = TApplicationException(TApplicationException.INTERNAL_ERROR, 'Internal error')
        oprot.writeMessageBegin("changeDataMovementPriority", msg_type, seqid)
        result.write(oprot)
        oprot.writeMessageEnd()
        oprot.trans.flush()

    def process_changeJobSubmissionPriorities(self, seqid, iprot, oprot):
        args = changeJobSubmissionPriorities_args()
        args.read(iprot)
        iprot.readMessageEnd()
        result = changeJobSubmissionPriorities_result()
        try:
            result.success = self._handler.changeJobSubmissionPriorities(args.authzToken, args.jobSubmissionPriorityMap)
            msg_type = TMessageType.REPLY
        except (TTransport.TTransportException, KeyboardInterrupt, SystemExit):
            raise
        except apache.airavata.api.error.ttypes.InvalidRequestException as ire:
            msg_type = TMessageType.REPLY
            result.ire = ire
        except apache.airavata.api.error.ttypes.AiravataClientException as ace:
            msg_type = TMessageType.REPLY
            result.ace = ace
        except apache.airavata.api.error.ttypes.AiravataSystemException as ase:
            msg_type = TMessageType.REPLY
            result.ase = ase
        except apache.airavata.api.error.ttypes.AuthorizationException as ae:
            msg_type = TMessageType.REPLY
            result.ae = ae
        except Exception as ex:
            msg_type = TMessageType.EXCEPTION
            logging.exception(ex)
            result = TApplicationException(TApplicationException.INTERNAL_ERROR, 'Internal error')
        oprot.writeMessageBegin("changeJobSubmissionPriorities", msg_type, seqid)
        result.write(oprot)
        oprot.writeMessageEnd()
        oprot.trans.flush()

    def process_changeDataMovementPriorities(self, seqid, iprot, oprot):
        args = changeDataMovementPriorities_args()
        args.read(iprot)
        iprot.readMessageEnd()
        result = changeDataMovementPriorities_result()
        try:
            result.success = self._handler.changeDataMovementPriorities(args.authzToken, args.dataMovementPriorityMap)
            msg_type = TMessageType.REPLY
        except (TTransport.TTransportException, KeyboardInterrupt, SystemExit):
            raise
        except apache.airavata.api.error.ttypes.InvalidRequestException as ire:
            msg_type = TMessageType.REPLY
            result.ire = ire
        except apache.airavata.api.error.ttypes.AiravataClientException as ace:
            msg_type = TMessageType.REPLY
            result.ace = ace
        except apache.airavata.api.error.ttypes.AiravataSystemException as ase:
            msg_type = TMessageType.REPLY
            result.ase = ase
        except apache.airavata.api.error.ttypes.AuthorizationException as ae:
            msg_type = TMessageType.REPLY
            result.ae = ae
        except Exception as ex:
            msg_type = TMessageType.EXCEPTION
            logging.exception(ex)
            result = TApplicationException(TApplicationException.INTERNAL_ERROR, 'Internal error')
        oprot.writeMessageBegin("changeDataMovementPriorities", msg_type, seqid)
        result.write(oprot)
        oprot.writeMessageEnd()
        oprot.trans.flush()

    def process_deleteJobSubmissionInterface(self, seqid, iprot, oprot):
        args = deleteJobSubmissionInterface_args()
        args.read(iprot)
        iprot.readMessageEnd()
        result = deleteJobSubmissionInterface_result()
        try:
            result.success = self._handler.deleteJobSubmissionInterface(args.authzToken, args.computeResourceId, args.jobSubmissionInterfaceId)
            msg_type = TMessageType.REPLY
        except (TTransport.TTransportException, KeyboardInterrupt, SystemExit):
            raise
        except apache.airavata.api.error.ttypes.InvalidRequestException as ire:
            msg_type = TMessageType.REPLY
            result.ire = ire
        except apache.airavata.api.error.ttypes.AiravataClientException as ace:
            msg_type = TMessageType.REPLY
            result.ace = ace
        except apache.airavata.api.error.ttypes.AiravataSystemException as ase:
            msg_type = TMessageType.REPLY
            result.ase = ase
        except apache.airavata.api.error.ttypes.AuthorizationException as ae:
            msg_type = TMessageType.REPLY
            result.ae = ae
        except Exception as ex:
            msg_type = TMessageType.EXCEPTION
            logging.exception(ex)
            result = TApplicationException(TApplicationException.INTERNAL_ERROR, 'Internal error')
        oprot.writeMessageBegin("deleteJobSubmissionInterface", msg_type, seqid)
        result.write(oprot)
        oprot.writeMessageEnd()
        oprot.trans.flush()

    def process_deleteDataMovementInterface(self, seqid, iprot, oprot):
        args = deleteDataMovementInterface_args()
        args.read(iprot)
        iprot.readMessageEnd()
        result = deleteDataMovementInterface_result()
        try:
            result.success = self._handler.deleteDataMovementInterface(args.authzToken, args.productUri, args.dataMovementInterfaceId, args.dataMoveType)
            msg_type = TMessageType.REPLY
        except (TTransport.TTransportException, KeyboardInterrupt, SystemExit):
            raise
        except apache.airavata.api.error.ttypes.InvalidRequestException as ire:
            msg_type = TMessageType.REPLY
            result.ire = ire
        except apache.airavata.api.error.ttypes.AiravataClientException as ace:
            msg_type = TMessageType.REPLY
            result.ace = ace
        except apache.airavata.api.error.ttypes.AiravataSystemException as ase:
            msg_type = TMessageType.REPLY
            result.ase = ase
        except apache.airavata.api.error.ttypes.AuthorizationException as ae:
            msg_type = TMessageType.REPLY
            result.ae = ae
        except Exception as ex:
            msg_type = TMessageType.EXCEPTION
            logging.exception(ex)
            result = TApplicationException(TApplicationException.INTERNAL_ERROR, 'Internal error')
        oprot.writeMessageBegin("deleteDataMovementInterface", msg_type, seqid)
        result.write(oprot)
        oprot.writeMessageEnd()
        oprot.trans.flush()

    def process_registerResourceJobManager(self, seqid, iprot, oprot):
        args = registerResourceJobManager_args()
        args.read(iprot)
        iprot.readMessageEnd()
        result = registerResourceJobManager_result()
        try:
            result.success = self._handler.registerResourceJobManager(args.authzToken, args.resourceJobManager)
            msg_type = TMessageType.REPLY
        except (TTransport.TTransportException, KeyboardInterrupt, SystemExit):
            raise
        except apache.airavata.api.error.ttypes.InvalidRequestException as ire:
            msg_type = TMessageType.REPLY
            result.ire = ire
        except apache.airavata.api.error.ttypes.AiravataClientException as ace:
            msg_type = TMessageType.REPLY
            result.ace = ace
        except apache.airavata.api.error.ttypes.AiravataSystemException as ase:
            msg_type = TMessageType.REPLY
            result.ase = ase
        except apache.airavata.api.error.ttypes.AuthorizationException as ae:
            msg_type = TMessageType.REPLY
            result.ae = ae
        except Exception as ex:
            msg_type = TMessageType.EXCEPTION
            logging.exception(ex)
            result = TApplicationException(TApplicationException.INTERNAL_ERROR, 'Internal error')
        oprot.writeMessageBegin("registerResourceJobManager", msg_type, seqid)
        result.write(oprot)
        oprot.writeMessageEnd()
        oprot.trans.flush()

    def process_updateResourceJobManager(self, seqid, iprot, oprot):
        args = updateResourceJobManager_args()
        args.read(iprot)
        iprot.readMessageEnd()
        result = updateResourceJobManager_result()
        try:
            result.success = self._handler.updateResourceJobManager(args.authzToken, args.resourceJobManagerId, args.updatedResourceJobManager)
            msg_type = TMessageType.REPLY
        except (TTransport.TTransportException, KeyboardInterrupt, SystemExit):
            raise
        except apache.airavata.api.error.ttypes.InvalidRequestException as ire:
            msg_type = TMessageType.REPLY
            result.ire = ire
        except apache.airavata.api.error.ttypes.AiravataClientException as ace:
            msg_type = TMessageType.REPLY
            result.ace = ace
        except apache.airavata.api.error.ttypes.AiravataSystemException as ase:
            msg_type = TMessageType.REPLY
            result.ase = ase
        except apache.airavata.api.error.ttypes.AuthorizationException as ae:
            msg_type = TMessageType.REPLY
            result.ae = ae
        except Exception as ex:
            msg_type = TMessageType.EXCEPTION
            logging.exception(ex)
            result = TApplicationException(TApplicationException.INTERNAL_ERROR, 'Internal error')
        oprot.writeMessageBegin("updateResourceJobManager", msg_type, seqid)
        result.write(oprot)
        oprot.writeMessageEnd()
        oprot.trans.flush()

    def process_getResourceJobManager(self, seqid, iprot, oprot):
        args = getResourceJobManager_args()
        args.read(iprot)
        iprot.readMessageEnd()
        result = getResourceJobManager_result()
        try:
            result.success = self._handler.getResourceJobManager(args.authzToken, args.resourceJobManagerId)
            msg_type = TMessageType.REPLY
        except (TTransport.TTransportException, KeyboardInterrupt, SystemExit):
            raise
        except apache.airavata.api.error.ttypes.InvalidRequestException as ire:
            msg_type = TMessageType.REPLY
            result.ire = ire
        except apache.airavata.api.error.ttypes.AiravataClientException as ace:
            msg_type = TMessageType.REPLY
            result.ace = ace
        except apache.airavata.api.error.ttypes.AiravataSystemException as ase:
            msg_type = TMessageType.REPLY
            result.ase = ase
        except apache.airavata.api.error.ttypes.AuthorizationException as ae:
            msg_type = TMessageType.REPLY
            result.ae = ae
        except Exception as ex:
            msg_type = TMessageType.EXCEPTION
            logging.exception(ex)
            result = TApplicationException(TApplicationException.INTERNAL_ERROR, 'Internal error')
        oprot.writeMessageBegin("getResourceJobManager", msg_type, seqid)
        result.write(oprot)
        oprot.writeMessageEnd()
        oprot.trans.flush()

    def process_deleteResourceJobManager(self, seqid, iprot, oprot):
        args = deleteResourceJobManager_args()
        args.read(iprot)
        iprot.readMessageEnd()
        result = deleteResourceJobManager_result()
        try:
            result.success = self._handler.deleteResourceJobManager(args.authzToken, args.resourceJobManagerId)
            msg_type = TMessageType.REPLY
        except (TTransport.TTransportException, KeyboardInterrupt, SystemExit):
            raise
        except apache.airavata.api.error.ttypes.InvalidRequestException as ire:
            msg_type = TMessageType.REPLY
            result.ire = ire
        except apache.airavata.api.error.ttypes.AiravataClientException as ace:
            msg_type = TMessageType.REPLY
            result.ace = ace
        except apache.airavata.api.error.ttypes.AiravataSystemException as ase:
            msg_type = TMessageType.REPLY
            result.ase = ase
        except apache.airavata.api.error.ttypes.AuthorizationException as ae:
            msg_type = TMessageType.REPLY
            result.ae = ae
        except Exception as ex:
            msg_type = TMessageType.EXCEPTION
            logging.exception(ex)
            result = TApplicationException(TApplicationException.INTERNAL_ERROR, 'Internal error')
        oprot.writeMessageBegin("deleteResourceJobManager", msg_type, seqid)
        result.write(oprot)
        oprot.writeMessageEnd()
        oprot.trans.flush()

    def process_deleteBatchQueue(self, seqid, iprot, oprot):
        args = deleteBatchQueue_args()
        args.read(iprot)
        iprot.readMessageEnd()
        result = deleteBatchQueue_result()
        try:
            result.success = self._handler.deleteBatchQueue(args.authzToken, args.computeResourceId, args.queueName)
            msg_type = TMessageType.REPLY
        except (TTransport.TTransportException, KeyboardInterrupt, SystemExit):
            raise
        except apache.airavata.api.error.ttypes.InvalidRequestException as ire:
            msg_type = TMessageType.REPLY
            result.ire = ire
        except apache.airavata.api.error.ttypes.AiravataClientException as ace:
            msg_type = TMessageType.REPLY
            result.ace = ace
        except apache.airavata.api.error.ttypes.AiravataSystemException as ase:
            msg_type = TMessageType.REPLY
            result.ase = ase
        except apache.airavata.api.error.ttypes.AuthorizationException as ae:
            msg_type = TMessageType.REPLY
            result.ae = ae
        except Exception as ex:
            msg_type = TMessageType.EXCEPTION
            logging.exception(ex)
            result = TApplicationException(TApplicationException.INTERNAL_ERROR, 'Internal error')
        oprot.writeMessageBegin("deleteBatchQueue", msg_type, seqid)
        result.write(oprot)
        oprot.writeMessageEnd()
        oprot.trans.flush()

    def process_registerGatewayResourceProfile(self, seqid, iprot, oprot):
        args = registerGatewayResourceProfile_args()
        args.read(iprot)
        iprot.readMessageEnd()
        result = registerGatewayResourceProfile_result()
        try:
            result.success = self._handler.registerGatewayResourceProfile(args.authzToken, args.gatewayResourceProfile)
            msg_type = TMessageType.REPLY
        except (TTransport.TTransportException, KeyboardInterrupt, SystemExit):
            raise
        except apache.airavata.api.error.ttypes.InvalidRequestException as ire:
            msg_type = TMessageType.REPLY
            result.ire = ire
        except apache.airavata.api.error.ttypes.AiravataClientException as ace:
            msg_type = TMessageType.REPLY
            result.ace = ace
        except apache.airavata.api.error.ttypes.AiravataSystemException as ase:
            msg_type = TMessageType.REPLY
            result.ase = ase
        except apache.airavata.api.error.ttypes.AuthorizationException as ae:
            msg_type = TMessageType.REPLY
            result.ae = ae
        except Exception as ex:
            msg_type = TMessageType.EXCEPTION
            logging.exception(ex)
            result = TApplicationException(TApplicationException.INTERNAL_ERROR, 'Internal error')
        oprot.writeMessageBegin("registerGatewayResourceProfile", msg_type, seqid)
        result.write(oprot)
        oprot.writeMessageEnd()
        oprot.trans.flush()

    def process_getGatewayResourceProfile(self, seqid, iprot, oprot):
        args = getGatewayResourceProfile_args()
        args.read(iprot)
        iprot.readMessageEnd()
        result = getGatewayResourceProfile_result()
        try:
            result.success = self._handler.getGatewayResourceProfile(args.authzToken, args.gatewayID)
            msg_type = TMessageType.REPLY
        except (TTransport.TTransportException, KeyboardInterrupt, SystemExit):
            raise
        except apache.airavata.api.error.ttypes.InvalidRequestException as ire:
            msg_type = TMessageType.REPLY
            result.ire = ire
        except apache.airavata.api.error.ttypes.AiravataClientException as ace:
            msg_type = TMessageType.REPLY
            result.ace = ace
        except apache.airavata.api.error.ttypes.AiravataSystemException as ase:
            msg_type = TMessageType.REPLY
            result.ase = ase
        except apache.airavata.api.error.ttypes.AuthorizationException as ae:
            msg_type = TMessageType.REPLY
            result.ae = ae
        except Exception as ex:
            msg_type = TMessageType.EXCEPTION
            logging.exception(ex)
            result = TApplicationException(TApplicationException.INTERNAL_ERROR, 'Internal error')
        oprot.writeMessageBegin("getGatewayResourceProfile", msg_type, seqid)
        result.write(oprot)
        oprot.writeMessageEnd()
        oprot.trans.flush()

    def process_updateGatewayResourceProfile(self, seqid, iprot, oprot):
        args = updateGatewayResourceProfile_args()
        args.read(iprot)
        iprot.readMessageEnd()
        result = updateGatewayResourceProfile_result()
        try:
            result.success = self._handler.updateGatewayResourceProfile(args.authzToken, args.gatewayID, args.gatewayResourceProfile)
            msg_type = TMessageType.REPLY
        except (TTransport.TTransportException, KeyboardInterrupt, SystemExit):
            raise
        except apache.airavata.api.error.ttypes.InvalidRequestException as ire:
            msg_type = TMessageType.REPLY
            result.ire = ire
        except apache.airavata.api.error.ttypes.AiravataClientException as ace:
            msg_type = TMessageType.REPLY
            result.ace = ace
        except apache.airavata.api.error.ttypes.AiravataSystemException as ase:
            msg_type = TMessageType.REPLY
            result.ase = ase
        except apache.airavata.api.error.ttypes.AuthorizationException as ae:
            msg_type = TMessageType.REPLY
            result.ae = ae
        except Exception as ex:
            msg_type = TMessageType.EXCEPTION
            logging.exception(ex)
            result = TApplicationException(TApplicationException.INTERNAL_ERROR, 'Internal error')
        oprot.writeMessageBegin("updateGatewayResourceProfile", msg_type, seqid)
        result.write(oprot)
        oprot.writeMessageEnd()
        oprot.trans.flush()

    def process_deleteGatewayResourceProfile(self, seqid, iprot, oprot):
        args = deleteGatewayResourceProfile_args()
        args.read(iprot)
        iprot.readMessageEnd()
        result = deleteGatewayResourceProfile_result()
        try:
            result.success = self._handler.deleteGatewayResourceProfile(args.authzToken, args.gatewayID)
            msg_type = TMessageType.REPLY
        except (TTransport.TTransportException, KeyboardInterrupt, SystemExit):
            raise
        except apache.airavata.api.error.ttypes.InvalidRequestException as ire:
            msg_type = TMessageType.REPLY
            result.ire = ire
        except apache.airavata.api.error.ttypes.AiravataClientException as ace:
            msg_type = TMessageType.REPLY
            result.ace = ace
        except apache.airavata.api.error.ttypes.AiravataSystemException as ase:
            msg_type = TMessageType.REPLY
            result.ase = ase
        except apache.airavata.api.error.ttypes.AuthorizationException as ae:
            msg_type = TMessageType.REPLY
            result.ae = ae
        except Exception as ex:
            msg_type = TMessageType.EXCEPTION
            logging.exception(ex)
            result = TApplicationException(TApplicationException.INTERNAL_ERROR, 'Internal error')
        oprot.writeMessageBegin("deleteGatewayResourceProfile", msg_type, seqid)
        result.write(oprot)
        oprot.writeMessageEnd()
        oprot.trans.flush()

    def process_addGatewayComputeResourcePreference(self, seqid, iprot, oprot):
        args = addGatewayComputeResourcePreference_args()
        args.read(iprot)
        iprot.readMessageEnd()
        result = addGatewayComputeResourcePreference_result()
        try:
            result.success = self._handler.addGatewayComputeResourcePreference(args.authzToken, args.gatewayID, args.computeResourceId, args.computeResourcePreference)
            msg_type = TMessageType.REPLY
        except (TTransport.TTransportException, KeyboardInterrupt, SystemExit):
            raise
        except apache.airavata.api.error.ttypes.InvalidRequestException as ire:
            msg_type = TMessageType.REPLY
            result.ire = ire
        except apache.airavata.api.error.ttypes.AiravataClientException as ace:
            msg_type = TMessageType.REPLY
            result.ace = ace
        except apache.airavata.api.error.ttypes.AiravataSystemException as ase:
            msg_type = TMessageType.REPLY
            result.ase = ase
        except apache.airavata.api.error.ttypes.AuthorizationException as ae:
            msg_type = TMessageType.REPLY
            result.ae = ae
        except Exception as ex:
            msg_type = TMessageType.EXCEPTION
            logging.exception(ex)
            result = TApplicationException(TApplicationException.INTERNAL_ERROR, 'Internal error')
        oprot.writeMessageBegin("addGatewayComputeResourcePreference", msg_type, seqid)
        result.write(oprot)
        oprot.writeMessageEnd()
        oprot.trans.flush()

    def process_addGatewayStoragePreference(self, seqid, iprot, oprot):
        args = addGatewayStoragePreference_args()
        args.read(iprot)
        iprot.readMessageEnd()
        result = addGatewayStoragePreference_result()
        try:
            result.success = self._handler.addGatewayStoragePreference(args.authzToken, args.gatewayID, args.storageResourceId, args.storagePreference)
            msg_type = TMessageType.REPLY
        except (TTransport.TTransportException, KeyboardInterrupt, SystemExit):
            raise
        except apache.airavata.api.error.ttypes.InvalidRequestException as ire:
            msg_type = TMessageType.REPLY
            result.ire = ire
        except apache.airavata.api.error.ttypes.AiravataClientException as ace:
            msg_type = TMessageType.REPLY
            result.ace = ace
        except apache.airavata.api.error.ttypes.AiravataSystemException as ase:
            msg_type = TMessageType.REPLY
            result.ase = ase
        except apache.airavata.api.error.ttypes.AuthorizationException as ae:
            msg_type = TMessageType.REPLY
            result.ae = ae
        except Exception as ex:
            msg_type = TMessageType.EXCEPTION
            logging.exception(ex)
            result = TApplicationException(TApplicationException.INTERNAL_ERROR, 'Internal error')
        oprot.writeMessageBegin("addGatewayStoragePreference", msg_type, seqid)
        result.write(oprot)
        oprot.writeMessageEnd()
        oprot.trans.flush()

    def process_getGatewayComputeResourcePreference(self, seqid, iprot, oprot):
        args = getGatewayComputeResourcePreference_args()
        args.read(iprot)
        iprot.readMessageEnd()
        result = getGatewayComputeResourcePreference_result()
        try:
            result.success = self._handler.getGatewayComputeResourcePreference(args.authzToken, args.gatewayID, args.computeResourceId)
            msg_type = TMessageType.REPLY
        except (TTransport.TTransportException, KeyboardInterrupt, SystemExit):
            raise
        except apache.airavata.api.error.ttypes.InvalidRequestException as ire:
            msg_type = TMessageType.REPLY
            result.ire = ire
        except apache.airavata.api.error.ttypes.AiravataClientException as ace:
            msg_type = TMessageType.REPLY
            result.ace = ace
        except apache.airavata.api.error.ttypes.AiravataSystemException as ase:
            msg_type = TMessageType.REPLY
            result.ase = ase
        except apache.airavata.api.error.ttypes.AuthorizationException as ae:
            msg_type = TMessageType.REPLY
            result.ae = ae
        except Exception as ex:
            msg_type = TMessageType.EXCEPTION
            logging.exception(ex)
            result = TApplicationException(TApplicationException.INTERNAL_ERROR, 'Internal error')
        oprot.writeMessageBegin("getGatewayComputeResourcePreference", msg_type, seqid)
        result.write(oprot)
        oprot.writeMessageEnd()
        oprot.trans.flush()

    def process_getGatewayStoragePreference(self, seqid, iprot, oprot):
        args = getGatewayStoragePreference_args()
        args.read(iprot)
        iprot.readMessageEnd()
        result = getGatewayStoragePreference_result()
        try:
            result.success = self._handler.getGatewayStoragePreference(args.authzToken, args.gatewayID, args.storageResourceId)
            msg_type = TMessageType.REPLY
        except (TTransport.TTransportException, KeyboardInterrupt, SystemExit):
            raise
        except apache.airavata.api.error.ttypes.InvalidRequestException as ire:
            msg_type = TMessageType.REPLY
            result.ire = ire
        except apache.airavata.api.error.ttypes.AiravataClientException as ace:
            msg_type = TMessageType.REPLY
            result.ace = ace
        except apache.airavata.api.error.ttypes.AiravataSystemException as ase:
            msg_type = TMessageType.REPLY
            result.ase = ase
        except apache.airavata.api.error.ttypes.AuthorizationException as ae:
            msg_type = TMessageType.REPLY
            result.ae = ae
        except Exception as ex:
            msg_type = TMessageType.EXCEPTION
            logging.exception(ex)
            result = TApplicationException(TApplicationException.INTERNAL_ERROR, 'Internal error')
        oprot.writeMessageBegin("getGatewayStoragePreference", msg_type, seqid)
        result.write(oprot)
        oprot.writeMessageEnd()
        oprot.trans.flush()

    def process_getAllGatewayComputeResourcePreferences(self, seqid, iprot, oprot):
        args = getAllGatewayComputeResourcePreferences_args()
        args.read(iprot)
        iprot.readMessageEnd()
        result = getAllGatewayComputeResourcePreferences_result()
        try:
            result.success = self._handler.getAllGatewayComputeResourcePreferences(args.authzToken, args.gatewayID)
            msg_type = TMessageType.REPLY
        except (TTransport.TTransportException, KeyboardInterrupt, SystemExit):
            raise
        except apache.airavata.api.error.ttypes.InvalidRequestException as ire:
            msg_type = TMessageType.REPLY
            result.ire = ire
        except apache.airavata.api.error.ttypes.AiravataClientException as ace:
            msg_type = TMessageType.REPLY
            result.ace = ace
        except apache.airavata.api.error.ttypes.AiravataSystemException as ase:
            msg_type = TMessageType.REPLY
            result.ase = ase
        except apache.airavata.api.error.ttypes.AuthorizationException as ae:
            msg_type = TMessageType.REPLY
            result.ae = ae
        except Exception as ex:
            msg_type = TMessageType.EXCEPTION
            logging.exception(ex)
            result = TApplicationException(TApplicationException.INTERNAL_ERROR, 'Internal error')
        oprot.writeMessageBegin("getAllGatewayComputeResourcePreferences", msg_type, seqid)
        result.write(oprot)
        oprot.writeMessageEnd()
        oprot.trans.flush()

    def process_getAllGatewayStoragePreferences(self, seqid, iprot, oprot):
        args = getAllGatewayStoragePreferences_args()
        args.read(iprot)
        iprot.readMessageEnd()
        result = getAllGatewayStoragePreferences_result()
        try:
            result.success = self._handler.getAllGatewayStoragePreferences(args.authzToken, args.gatewayID)
            msg_type = TMessageType.REPLY
        except (TTransport.TTransportException, KeyboardInterrupt, SystemExit):
            raise
        except apache.airavata.api.error.ttypes.InvalidRequestException as ire:
            msg_type = TMessageType.REPLY
            result.ire = ire
        except apache.airavata.api.error.ttypes.AiravataClientException as ace:
            msg_type = TMessageType.REPLY
            result.ace = ace
        except apache.airavata.api.error.ttypes.AiravataSystemException as ase:
            msg_type = TMessageType.REPLY
            result.ase = ase
        except apache.airavata.api.error.ttypes.AuthorizationException as ae:
            msg_type = TMessageType.REPLY
            result.ae = ae
        except Exception as ex:
            msg_type = TMessageType.EXCEPTION
            logging.exception(ex)
            result = TApplicationException(TApplicationException.INTERNAL_ERROR, 'Internal error')
        oprot.writeMessageBegin("getAllGatewayStoragePreferences", msg_type, seqid)
        result.write(oprot)
        oprot.writeMessageEnd()
        oprot.trans.flush()

    def process_getAllGatewayResourceProfiles(self, seqid, iprot, oprot):
        args = getAllGatewayResourceProfiles_args()
        args.read(iprot)
        iprot.readMessageEnd()
        result = getAllGatewayResourceProfiles_result()
        try:
            result.success = self._handler.getAllGatewayResourceProfiles(args.authzToken)
            msg_type = TMessageType.REPLY
        except (TTransport.TTransportException, KeyboardInterrupt, SystemExit):
            raise
        except apache.airavata.api.error.ttypes.InvalidRequestException as ire:
            msg_type = TMessageType.REPLY
            result.ire = ire
        except apache.airavata.api.error.ttypes.AiravataClientException as ace:
            msg_type = TMessageType.REPLY
            result.ace = ace
        except apache.airavata.api.error.ttypes.AiravataSystemException as ase:
            msg_type = TMessageType.REPLY
            result.ase = ase
        except apache.airavata.api.error.ttypes.AuthorizationException as ae:
            msg_type = TMessageType.REPLY
            result.ae = ae
        except Exception as ex:
            msg_type = TMessageType.EXCEPTION
            logging.exception(ex)
            result = TApplicationException(TApplicationException.INTERNAL_ERROR, 'Internal error')
        oprot.writeMessageBegin("getAllGatewayResourceProfiles", msg_type, seqid)
        result.write(oprot)
        oprot.writeMessageEnd()
        oprot.trans.flush()

    def process_updateGatewayComputeResourcePreference(self, seqid, iprot, oprot):
        args = updateGatewayComputeResourcePreference_args()
        args.read(iprot)
        iprot.readMessageEnd()
        result = updateGatewayComputeResourcePreference_result()
        try:
            result.success = self._handler.updateGatewayComputeResourcePreference(args.authzToken, args.gatewayID, args.computeResourceId, args.computeResourcePreference)
            msg_type = TMessageType.REPLY
        except (TTransport.TTransportException, KeyboardInterrupt, SystemExit):
            raise
        except apache.airavata.api.error.ttypes.InvalidRequestException as ire:
            msg_type = TMessageType.REPLY
            result.ire = ire
        except apache.airavata.api.error.ttypes.AiravataClientException as ace:
            msg_type = TMessageType.REPLY
            result.ace = ace
        except apache.airavata.api.error.ttypes.AiravataSystemException as ase:
            msg_type = TMessageType.REPLY
            result.ase = ase
        except apache.airavata.api.error.ttypes.AuthorizationException as ae:
            msg_type = TMessageType.REPLY
            result.ae = ae
        except Exception as ex:
            msg_type = TMessageType.EXCEPTION
            logging.exception(ex)
            result = TApplicationException(TApplicationException.INTERNAL_ERROR, 'Internal error')
        oprot.writeMessageBegin("updateGatewayComputeResourcePreference", msg_type, seqid)
        result.write(oprot)
        oprot.writeMessageEnd()
        oprot.trans.flush()

    def process_updateGatewayStoragePreference(self, seqid, iprot, oprot):
        args = updateGatewayStoragePreference_args()
        args.read(iprot)
        iprot.readMessageEnd()
        result = updateGatewayStoragePreference_result()
        try:
            result.success = self._handler.updateGatewayStoragePreference(args.authzToken, args.gatewayID, args.storageId, args.storagePreference)
            msg_type = TMessageType.REPLY
        except (TTransport.TTransportException, KeyboardInterrupt, SystemExit):
            raise
        except apache.airavata.api.error.ttypes.InvalidRequestException as ire:
            msg_type = TMessageType.REPLY
            result.ire = ire
        except apache.airavata.api.error.ttypes.AiravataClientException as ace:
            msg_type = TMessageType.REPLY
            result.ace = ace
        except apache.airavata.api.error.ttypes.AiravataSystemException as ase:
            msg_type = TMessageType.REPLY
            result.ase = ase
        except apache.airavata.api.error.ttypes.AuthorizationException as ae:
            msg_type = TMessageType.REPLY
            result.ae = ae
        except Exception as ex:
            msg_type = TMessageType.EXCEPTION
            logging.exception(ex)
            result = TApplicationException(TApplicationException.INTERNAL_ERROR, 'Internal error')
        oprot.writeMessageBegin("updateGatewayStoragePreference", msg_type, seqid)
        result.write(oprot)
        oprot.writeMessageEnd()
        oprot.trans.flush()

    def process_deleteGatewayComputeResourcePreference(self, seqid, iprot, oprot):
        args = deleteGatewayComputeResourcePreference_args()
        args.read(iprot)
        iprot.readMessageEnd()
        result = deleteGatewayComputeResourcePreference_result()
        try:
            result.success = self._handler.deleteGatewayComputeResourcePreference(args.authzToken, args.gatewayID, args.computeResourceId)
            msg_type = TMessageType.REPLY
        except (TTransport.TTransportException, KeyboardInterrupt, SystemExit):
            raise
        except apache.airavata.api.error.ttypes.InvalidRequestException as ire:
            msg_type = TMessageType.REPLY
            result.ire = ire
        except apache.airavata.api.error.ttypes.AiravataClientException as ace:
            msg_type = TMessageType.REPLY
            result.ace = ace
        except apache.airavata.api.error.ttypes.AiravataSystemException as ase:
            msg_type = TMessageType.REPLY
            result.ase = ase
        except apache.airavata.api.error.ttypes.AuthorizationException as ae:
            msg_type = TMessageType.REPLY
            result.ae = ae
        except Exception as ex:
            msg_type = TMessageType.EXCEPTION
            logging.exception(ex)
            result = TApplicationException(TApplicationException.INTERNAL_ERROR, 'Internal error')
        oprot.writeMessageBegin("deleteGatewayComputeResourcePreference", msg_type, seqid)
        result.write(oprot)
        oprot.writeMessageEnd()
        oprot.trans.flush()

    def process_deleteGatewayStoragePreference(self, seqid, iprot, oprot):
        args = deleteGatewayStoragePreference_args()
        args.read(iprot)
        iprot.readMessageEnd()
        result = deleteGatewayStoragePreference_result()
        try:
            result.success = self._handler.deleteGatewayStoragePreference(args.authzToken, args.gatewayID, args.storageId)
            msg_type = TMessageType.REPLY
        except (TTransport.TTransportException, KeyboardInterrupt, SystemExit):
            raise
        except apache.airavata.api.error.ttypes.InvalidRequestException as ire:
            msg_type = TMessageType.REPLY
            result.ire = ire
        except apache.airavata.api.error.ttypes.AiravataClientException as ace:
            msg_type = TMessageType.REPLY
            result.ace = ace
        except apache.airavata.api.error.ttypes.AiravataSystemException as ase:
            msg_type = TMessageType.REPLY
            result.ase = ase
        except apache.airavata.api.error.ttypes.AuthorizationException as ae:
            msg_type = TMessageType.REPLY
            result.ae = ae
        except Exception as ex:
            msg_type = TMessageType.EXCEPTION
            logging.exception(ex)
            result = TApplicationException(TApplicationException.INTERNAL_ERROR, 'Internal error')
        oprot.writeMessageBegin("deleteGatewayStoragePreference", msg_type, seqid)
        result.write(oprot)
        oprot.writeMessageEnd()
        oprot.trans.flush()

    def process_registerUserResourceProfile(self, seqid, iprot, oprot):
        args = registerUserResourceProfile_args()
        args.read(iprot)
        iprot.readMessageEnd()
        result = registerUserResourceProfile_result()
        try:
            result.success = self._handler.registerUserResourceProfile(args.authzToken, args.userResourceProfile)
            msg_type = TMessageType.REPLY
        except (TTransport.TTransportException, KeyboardInterrupt, SystemExit):
            raise
        except apache.airavata.api.error.ttypes.InvalidRequestException as ire:
            msg_type = TMessageType.REPLY
            result.ire = ire
        except apache.airavata.api.error.ttypes.AiravataClientException as ace:
            msg_type = TMessageType.REPLY
            result.ace = ace
        except apache.airavata.api.error.ttypes.AiravataSystemException as ase:
            msg_type = TMessageType.REPLY
            result.ase = ase
        except apache.airavata.api.error.ttypes.AuthorizationException as ae:
            msg_type = TMessageType.REPLY
            result.ae = ae
        except Exception as ex:
            msg_type = TMessageType.EXCEPTION
            logging.exception(ex)
            result = TApplicationException(TApplicationException.INTERNAL_ERROR, 'Internal error')
        oprot.writeMessageBegin("registerUserResourceProfile", msg_type, seqid)
        result.write(oprot)
        oprot.writeMessageEnd()
        oprot.trans.flush()

    def process_getUserResourceProfile(self, seqid, iprot, oprot):
        args = getUserResourceProfile_args()
        args.read(iprot)
        iprot.readMessageEnd()
        result = getUserResourceProfile_result()
        try:
            result.success = self._handler.getUserResourceProfile(args.authzToken, args.userId, args.gatewayID)
            msg_type = TMessageType.REPLY
        except (TTransport.TTransportException, KeyboardInterrupt, SystemExit):
            raise
        except apache.airavata.api.error.ttypes.InvalidRequestException as ire:
            msg_type = TMessageType.REPLY
            result.ire = ire
        except apache.airavata.api.error.ttypes.AiravataClientException as ace:
            msg_type = TMessageType.REPLY
            result.ace = ace
        except apache.airavata.api.error.ttypes.AiravataSystemException as ase:
            msg_type = TMessageType.REPLY
            result.ase = ase
        except apache.airavata.api.error.ttypes.AuthorizationException as ae:
            msg_type = TMessageType.REPLY
            result.ae = ae
        except Exception as ex:
            msg_type = TMessageType.EXCEPTION
            logging.exception(ex)
            result = TApplicationException(TApplicationException.INTERNAL_ERROR, 'Internal error')
        oprot.writeMessageBegin("getUserResourceProfile", msg_type, seqid)
        result.write(oprot)
        oprot.writeMessageEnd()
        oprot.trans.flush()

    def process_updateUserResourceProfile(self, seqid, iprot, oprot):
        args = updateUserResourceProfile_args()
        args.read(iprot)
        iprot.readMessageEnd()
        result = updateUserResourceProfile_result()
        try:
            result.success = self._handler.updateUserResourceProfile(args.authzToken, args.userId, args.gatewayID, args.userResourceProfile)
            msg_type = TMessageType.REPLY
        except (TTransport.TTransportException, KeyboardInterrupt, SystemExit):
            raise
        except apache.airavata.api.error.ttypes.InvalidRequestException as ire:
            msg_type = TMessageType.REPLY
            result.ire = ire
        except apache.airavata.api.error.ttypes.AiravataClientException as ace:
            msg_type = TMessageType.REPLY
            result.ace = ace
        except apache.airavata.api.error.ttypes.AiravataSystemException as ase:
            msg_type = TMessageType.REPLY
            result.ase = ase
        except apache.airavata.api.error.ttypes.AuthorizationException as ae:
            msg_type = TMessageType.REPLY
            result.ae = ae
        except Exception as ex:
            msg_type = TMessageType.EXCEPTION
            logging.exception(ex)
            result = TApplicationException(TApplicationException.INTERNAL_ERROR, 'Internal error')
        oprot.writeMessageBegin("updateUserResourceProfile", msg_type, seqid)
        result.write(oprot)
        oprot.writeMessageEnd()
        oprot.trans.flush()

    def process_deleteUserResourceProfile(self, seqid, iprot, oprot):
        args = deleteUserResourceProfile_args()
        args.read(iprot)
        iprot.readMessageEnd()
        result = deleteUserResourceProfile_result()
        try:
            result.success = self._handler.deleteUserResourceProfile(args.authzToken, args.userId, args.gatewayID)
            msg_type = TMessageType.REPLY
        except (TTransport.TTransportException, KeyboardInterrupt, SystemExit):
            raise
        except apache.airavata.api.error.ttypes.InvalidRequestException as ire:
            msg_type = TMessageType.REPLY
            result.ire = ire
        except apache.airavata.api.error.ttypes.AiravataClientException as ace:
            msg_type = TMessageType.REPLY
            result.ace = ace
        except apache.airavata.api.error.ttypes.AiravataSystemException as ase:
            msg_type = TMessageType.REPLY
            result.ase = ase
        except apache.airavata.api.error.ttypes.AuthorizationException as ae:
            msg_type = TMessageType.REPLY
            result.ae = ae
        except Exception as ex:
            msg_type = TMessageType.EXCEPTION
            logging.exception(ex)
            result = TApplicationException(TApplicationException.INTERNAL_ERROR, 'Internal error')
        oprot.writeMessageBegin("deleteUserResourceProfile", msg_type, seqid)
        result.write(oprot)
        oprot.writeMessageEnd()
        oprot.trans.flush()

    def process_addUserComputeResourcePreference(self, seqid, iprot, oprot):
        args = addUserComputeResourcePreference_args()
        args.read(iprot)
        iprot.readMessageEnd()
        result = addUserComputeResourcePreference_result()
        try:
            result.success = self._handler.addUserComputeResourcePreference(args.authzToken, args.userId, args.gatewayID, args.userComputeResourceId, args.userComputeResourcePreference)
            msg_type = TMessageType.REPLY
        except (TTransport.TTransportException, KeyboardInterrupt, SystemExit):
            raise
        except apache.airavata.api.error.ttypes.InvalidRequestException as ire:
            msg_type = TMessageType.REPLY
            result.ire = ire
        except apache.airavata.api.error.ttypes.AiravataClientException as ace:
            msg_type = TMessageType.REPLY
            result.ace = ace
        except apache.airavata.api.error.ttypes.AiravataSystemException as ase:
            msg_type = TMessageType.REPLY
            result.ase = ase
        except apache.airavata.api.error.ttypes.AuthorizationException as ae:
            msg_type = TMessageType.REPLY
            result.ae = ae
        except Exception as ex:
            msg_type = TMessageType.EXCEPTION
            logging.exception(ex)
            result = TApplicationException(TApplicationException.INTERNAL_ERROR, 'Internal error')
        oprot.writeMessageBegin("addUserComputeResourcePreference", msg_type, seqid)
        result.write(oprot)
        oprot.writeMessageEnd()
        oprot.trans.flush()

    def process_addUserStoragePreference(self, seqid, iprot, oprot):
        args = addUserStoragePreference_args()
        args.read(iprot)
        iprot.readMessageEnd()
        result = addUserStoragePreference_result()
        try:
            result.success = self._handler.addUserStoragePreference(args.authzToken, args.userId, args.gatewayID, args.userStorageResourceId, args.userStoragePreference)
            msg_type = TMessageType.REPLY
        except (TTransport.TTransportException, KeyboardInterrupt, SystemExit):
            raise
        except apache.airavata.api.error.ttypes.InvalidRequestException as ire:
            msg_type = TMessageType.REPLY
            result.ire = ire
        except apache.airavata.api.error.ttypes.AiravataClientException as ace:
            msg_type = TMessageType.REPLY
            result.ace = ace
        except apache.airavata.api.error.ttypes.AiravataSystemException as ase:
            msg_type = TMessageType.REPLY
            result.ase = ase
        except apache.airavata.api.error.ttypes.AuthorizationException as ae:
            msg_type = TMessageType.REPLY
            result.ae = ae
        except Exception as ex:
            msg_type = TMessageType.EXCEPTION
            logging.exception(ex)
            result = TApplicationException(TApplicationException.INTERNAL_ERROR, 'Internal error')
        oprot.writeMessageBegin("addUserStoragePreference", msg_type, seqid)
        result.write(oprot)
        oprot.writeMessageEnd()
        oprot.trans.flush()

    def process_getUserComputeResourcePreference(self, seqid, iprot, oprot):
        args = getUserComputeResourcePreference_args()
        args.read(iprot)
        iprot.readMessageEnd()
        result = getUserComputeResourcePreference_result()
        try:
            result.success = self._handler.getUserComputeResourcePreference(args.authzToken, args.userId, args.gatewayID, args.userComputeResourceId)
            msg_type = TMessageType.REPLY
        except (TTransport.TTransportException, KeyboardInterrupt, SystemExit):
            raise
        except apache.airavata.api.error.ttypes.InvalidRequestException as ire:
            msg_type = TMessageType.REPLY
            result.ire = ire
        except apache.airavata.api.error.ttypes.AiravataClientException as ace:
            msg_type = TMessageType.REPLY
            result.ace = ace
        except apache.airavata.api.error.ttypes.AiravataSystemException as ase:
            msg_type = TMessageType.REPLY
            result.ase = ase
        except apache.airavata.api.error.ttypes.AuthorizationException as ae:
            msg_type = TMessageType.REPLY
            result.ae = ae
        except Exception as ex:
            msg_type = TMessageType.EXCEPTION
            logging.exception(ex)
            result = TApplicationException(TApplicationException.INTERNAL_ERROR, 'Internal error')
        oprot.writeMessageBegin("getUserComputeResourcePreference", msg_type, seqid)
        result.write(oprot)
        oprot.writeMessageEnd()
        oprot.trans.flush()

    def process_getUserStoragePreference(self, seqid, iprot, oprot):
        args = getUserStoragePreference_args()
        args.read(iprot)
        iprot.readMessageEnd()
        result = getUserStoragePreference_result()
        try:
            result.success = self._handler.getUserStoragePreference(args.authzToken, args.userId, args.gatewayID, args.userStorageResourceId)
            msg_type = TMessageType.REPLY
        except (TTransport.TTransportException, KeyboardInterrupt, SystemExit):
            raise
        except apache.airavata.api.error.ttypes.InvalidRequestException as ire:
            msg_type = TMessageType.REPLY
            result.ire = ire
        except apache.airavata.api.error.ttypes.AiravataClientException as ace:
            msg_type = TMessageType.REPLY
            result.ace = ace
        except apache.airavata.api.error.ttypes.AiravataSystemException as ase:
            msg_type = TMessageType.REPLY
            result.ase = ase
        except apache.airavata.api.error.ttypes.AuthorizationException as ae:
            msg_type = TMessageType.REPLY
            result.ae = ae
        except Exception as ex:
            msg_type = TMessageType.EXCEPTION
            logging.exception(ex)
            result = TApplicationException(TApplicationException.INTERNAL_ERROR, 'Internal error')
        oprot.writeMessageBegin("getUserStoragePreference", msg_type, seqid)
        result.write(oprot)
        oprot.writeMessageEnd()
        oprot.trans.flush()

    def process_getAllUserComputeResourcePreferences(self, seqid, iprot, oprot):
        args = getAllUserComputeResourcePreferences_args()
        args.read(iprot)
        iprot.readMessageEnd()
        result = getAllUserComputeResourcePreferences_result()
        try:
            result.success = self._handler.getAllUserComputeResourcePreferences(args.authzToken, args.userId, args.gatewayID)
            msg_type = TMessageType.REPLY
        except (TTransport.TTransportException, KeyboardInterrupt, SystemExit):
            raise
        except apache.airavata.api.error.ttypes.InvalidRequestException as ire:
            msg_type = TMessageType.REPLY
            result.ire = ire
        except apache.airavata.api.error.ttypes.AiravataClientException as ace:
            msg_type = TMessageType.REPLY
            result.ace = ace
        except apache.airavata.api.error.ttypes.AiravataSystemException as ase:
            msg_type = TMessageType.REPLY
            result.ase = ase
        except apache.airavata.api.error.ttypes.AuthorizationException as ae:
            msg_type = TMessageType.REPLY
            result.ae = ae
        except Exception as ex:
            msg_type = TMessageType.EXCEPTION
            logging.exception(ex)
            result = TApplicationException(TApplicationException.INTERNAL_ERROR, 'Internal error')
        oprot.writeMessageBegin("getAllUserComputeResourcePreferences", msg_type, seqid)
        result.write(oprot)
        oprot.writeMessageEnd()
        oprot.trans.flush()

    def process_getAllUserStoragePreferences(self, seqid, iprot, oprot):
        args = getAllUserStoragePreferences_args()
        args.read(iprot)
        iprot.readMessageEnd()
        result = getAllUserStoragePreferences_result()
        try:
            result.success = self._handler.getAllUserStoragePreferences(args.authzToken, args.userId, args.gatewayID)
            msg_type = TMessageType.REPLY
        except (TTransport.TTransportException, KeyboardInterrupt, SystemExit):
            raise
        except apache.airavata.api.error.ttypes.InvalidRequestException as ire:
            msg_type = TMessageType.REPLY
            result.ire = ire
        except apache.airavata.api.error.ttypes.AiravataClientException as ace:
            msg_type = TMessageType.REPLY
            result.ace = ace
        except apache.airavata.api.error.ttypes.AiravataSystemException as ase:
            msg_type = TMessageType.REPLY
            result.ase = ase
        except apache.airavata.api.error.ttypes.AuthorizationException as ae:
            msg_type = TMessageType.REPLY
            result.ae = ae
        except Exception as ex:
            msg_type = TMessageType.EXCEPTION
            logging.exception(ex)
            result = TApplicationException(TApplicationException.INTERNAL_ERROR, 'Internal error')
        oprot.writeMessageBegin("getAllUserStoragePreferences", msg_type, seqid)
        result.write(oprot)
        oprot.writeMessageEnd()
        oprot.trans.flush()

    def process_getAllUserResourceProfiles(self, seqid, iprot, oprot):
        args = getAllUserResourceProfiles_args()
        args.read(iprot)
        iprot.readMessageEnd()
        result = getAllUserResourceProfiles_result()
        try:
            result.success = self._handler.getAllUserResourceProfiles(args.authzToken)
            msg_type = TMessageType.REPLY
        except (TTransport.TTransportException, KeyboardInterrupt, SystemExit):
            raise
        except apache.airavata.api.error.ttypes.InvalidRequestException as ire:
            msg_type = TMessageType.REPLY
            result.ire = ire
        except apache.airavata.api.error.ttypes.AiravataClientException as ace:
            msg_type = TMessageType.REPLY
            result.ace = ace
        except apache.airavata.api.error.ttypes.AiravataSystemException as ase:
            msg_type = TMessageType.REPLY
            result.ase = ase
        except apache.airavata.api.error.ttypes.AuthorizationException as ae:
            msg_type = TMessageType.REPLY
            result.ae = ae
        except Exception as ex:
            msg_type = TMessageType.EXCEPTION
            logging.exception(ex)
            result = TApplicationException(TApplicationException.INTERNAL_ERROR, 'Internal error')
        oprot.writeMessageBegin("getAllUserResourceProfiles", msg_type, seqid)
        result.write(oprot)
        oprot.writeMessageEnd()
        oprot.trans.flush()

    def process_updateUserComputeResourcePreference(self, seqid, iprot, oprot):
        args = updateUserComputeResourcePreference_args()
        args.read(iprot)
        iprot.readMessageEnd()
        result = updateUserComputeResourcePreference_result()
        try:
            result.success = self._handler.updateUserComputeResourcePreference(args.authzToken, args.userId, args.gatewayID, args.userComputeResourceId, args.userComputeResourcePreference)
            msg_type = TMessageType.REPLY
        except (TTransport.TTransportException, KeyboardInterrupt, SystemExit):
            raise
        except apache.airavata.api.error.ttypes.InvalidRequestException as ire:
            msg_type = TMessageType.REPLY
            result.ire = ire
        except apache.airavata.api.error.ttypes.AiravataClientException as ace:
            msg_type = TMessageType.REPLY
            result.ace = ace
        except apache.airavata.api.error.ttypes.AiravataSystemException as ase:
            msg_type = TMessageType.REPLY
            result.ase = ase
        except apache.airavata.api.error.ttypes.AuthorizationException as ae:
            msg_type = TMessageType.REPLY
            result.ae = ae
        except Exception as ex:
            msg_type = TMessageType.EXCEPTION
            logging.exception(ex)
            result = TApplicationException(TApplicationException.INTERNAL_ERROR, 'Internal error')
        oprot.writeMessageBegin("updateUserComputeResourcePreference", msg_type, seqid)
        result.write(oprot)
        oprot.writeMessageEnd()
        oprot.trans.flush()

    def process_updateUserStoragePreference(self, seqid, iprot, oprot):
        args = updateUserStoragePreference_args()
        args.read(iprot)
        iprot.readMessageEnd()
        result = updateUserStoragePreference_result()
        try:
            result.success = self._handler.updateUserStoragePreference(args.authzToken, args.userId, args.gatewayID, args.userStorageId, args.userStoragePreference)
            msg_type = TMessageType.REPLY
        except (TTransport.TTransportException, KeyboardInterrupt, SystemExit):
            raise
        except apache.airavata.api.error.ttypes.InvalidRequestException as ire:
            msg_type = TMessageType.REPLY
            result.ire = ire
        except apache.airavata.api.error.ttypes.AiravataClientException as ace:
            msg_type = TMessageType.REPLY
            result.ace = ace
        except apache.airavata.api.error.ttypes.AiravataSystemException as ase:
            msg_type = TMessageType.REPLY
            result.ase = ase
        except apache.airavata.api.error.ttypes.AuthorizationException as ae:
            msg_type = TMessageType.REPLY
            result.ae = ae
        except Exception as ex:
            msg_type = TMessageType.EXCEPTION
            logging.exception(ex)
            result = TApplicationException(TApplicationException.INTERNAL_ERROR, 'Internal error')
        oprot.writeMessageBegin("updateUserStoragePreference", msg_type, seqid)
        result.write(oprot)
        oprot.writeMessageEnd()
        oprot.trans.flush()

    def process_deleteUserComputeResourcePreference(self, seqid, iprot, oprot):
        args = deleteUserComputeResourcePreference_args()
        args.read(iprot)
        iprot.readMessageEnd()
        result = deleteUserComputeResourcePreference_result()
        try:
            result.success = self._handler.deleteUserComputeResourcePreference(args.authzToken, args.userId, args.gatewayID, args.userComputeResourceId)
            msg_type = TMessageType.REPLY
        except (TTransport.TTransportException, KeyboardInterrupt, SystemExit):
            raise
        except apache.airavata.api.error.ttypes.InvalidRequestException as ire:
            msg_type = TMessageType.REPLY
            result.ire = ire
        except apache.airavata.api.error.ttypes.AiravataClientException as ace:
            msg_type = TMessageType.REPLY
            result.ace = ace
        except apache.airavata.api.error.ttypes.AiravataSystemException as ase:
            msg_type = TMessageType.REPLY
            result.ase = ase
        except apache.airavata.api.error.ttypes.AuthorizationException as ae:
            msg_type = TMessageType.REPLY
            result.ae = ae
        except Exception as ex:
            msg_type = TMessageType.EXCEPTION
            logging.exception(ex)
            result = TApplicationException(TApplicationException.INTERNAL_ERROR, 'Internal error')
        oprot.writeMessageBegin("deleteUserComputeResourcePreference", msg_type, seqid)
        result.write(oprot)
        oprot.writeMessageEnd()
        oprot.trans.flush()

    def process_deleteUserStoragePreference(self, seqid, iprot, oprot):
        args = deleteUserStoragePreference_args()
        args.read(iprot)
        iprot.readMessageEnd()
        result = deleteUserStoragePreference_result()
        try:
            result.success = self._handler.deleteUserStoragePreference(args.authzToken, args.userId, args.gatewayID, args.userStorageId)
            msg_type = TMessageType.REPLY
        except (TTransport.TTransportException, KeyboardInterrupt, SystemExit):
            raise
        except apache.airavata.api.error.ttypes.InvalidRequestException as ire:
            msg_type = TMessageType.REPLY
            result.ire = ire
        except apache.airavata.api.error.ttypes.AiravataClientException as ace:
            msg_type = TMessageType.REPLY
            result.ace = ace
        except apache.airavata.api.error.ttypes.AiravataSystemException as ase:
            msg_type = TMessageType.REPLY
            result.ase = ase
        except apache.airavata.api.error.ttypes.AuthorizationException as ae:
            msg_type = TMessageType.REPLY
            result.ae = ae
        except Exception as ex:
            msg_type = TMessageType.EXCEPTION
            logging.exception(ex)
            result = TApplicationException(TApplicationException.INTERNAL_ERROR, 'Internal error')
        oprot.writeMessageBegin("deleteUserStoragePreference", msg_type, seqid)
        result.write(oprot)
        oprot.writeMessageEnd()
        oprot.trans.flush()

    def process_getAllWorkflows(self, seqid, iprot, oprot):
        args = getAllWorkflows_args()
        args.read(iprot)
        iprot.readMessageEnd()
        result = getAllWorkflows_result()
        try:
            result.success = self._handler.getAllWorkflows(args.authzToken, args.gatewayId)
            msg_type = TMessageType.REPLY
        except (TTransport.TTransportException, KeyboardInterrupt, SystemExit):
            raise
        except apache.airavata.api.error.ttypes.InvalidRequestException as ire:
            msg_type = TMessageType.REPLY
            result.ire = ire
        except apache.airavata.api.error.ttypes.AiravataClientException as ace:
            msg_type = TMessageType.REPLY
            result.ace = ace
        except apache.airavata.api.error.ttypes.AiravataSystemException as ase:
            msg_type = TMessageType.REPLY
            result.ase = ase
        except apache.airavata.api.error.ttypes.AuthorizationException as ae:
            msg_type = TMessageType.REPLY
            result.ae = ae
        except Exception as ex:
            msg_type = TMessageType.EXCEPTION
            logging.exception(ex)
            result = TApplicationException(TApplicationException.INTERNAL_ERROR, 'Internal error')
        oprot.writeMessageBegin("getAllWorkflows", msg_type, seqid)
        result.write(oprot)
        oprot.writeMessageEnd()
        oprot.trans.flush()

    def process_getLatestQueueStatuses(self, seqid, iprot, oprot):
        args = getLatestQueueStatuses_args()
        args.read(iprot)
        iprot.readMessageEnd()
        result = getLatestQueueStatuses_result()
        try:
            result.success = self._handler.getLatestQueueStatuses(args.authzToken)
            msg_type = TMessageType.REPLY
        except (TTransport.TTransportException, KeyboardInterrupt, SystemExit):
            raise
        except apache.airavata.api.error.ttypes.InvalidRequestException as ire:
            msg_type = TMessageType.REPLY
            result.ire = ire
        except apache.airavata.api.error.ttypes.AiravataClientException as ace:
            msg_type = TMessageType.REPLY
            result.ace = ace
        except apache.airavata.api.error.ttypes.AiravataSystemException as ase:
            msg_type = TMessageType.REPLY
            result.ase = ase
        except apache.airavata.api.error.ttypes.AuthorizationException as ae:
            msg_type = TMessageType.REPLY
            result.ae = ae
        except Exception as ex:
            msg_type = TMessageType.EXCEPTION
            logging.exception(ex)
            result = TApplicationException(TApplicationException.INTERNAL_ERROR, 'Internal error')
        oprot.writeMessageBegin("getLatestQueueStatuses", msg_type, seqid)
        result.write(oprot)
        oprot.writeMessageEnd()
        oprot.trans.flush()

    def process_getWorkflow(self, seqid, iprot, oprot):
        args = getWorkflow_args()
        args.read(iprot)
        iprot.readMessageEnd()
        result = getWorkflow_result()
        try:
            result.success = self._handler.getWorkflow(args.authzToken, args.workflowTemplateId)
            msg_type = TMessageType.REPLY
        except (TTransport.TTransportException, KeyboardInterrupt, SystemExit):
            raise
        except apache.airavata.api.error.ttypes.InvalidRequestException as ire:
            msg_type = TMessageType.REPLY
            result.ire = ire
        except apache.airavata.api.error.ttypes.AiravataClientException as ace:
            msg_type = TMessageType.REPLY
            result.ace = ace
        except apache.airavata.api.error.ttypes.AiravataSystemException as ase:
            msg_type = TMessageType.REPLY
            result.ase = ase
        except apache.airavata.api.error.ttypes.AuthorizationException as ae:
            msg_type = TMessageType.REPLY
            result.ae = ae
        except Exception as ex:
            msg_type = TMessageType.EXCEPTION
            logging.exception(ex)
            result = TApplicationException(TApplicationException.INTERNAL_ERROR, 'Internal error')
        oprot.writeMessageBegin("getWorkflow", msg_type, seqid)
        result.write(oprot)
        oprot.writeMessageEnd()
        oprot.trans.flush()

    def process_deleteWorkflow(self, seqid, iprot, oprot):
        args = deleteWorkflow_args()
        args.read(iprot)
        iprot.readMessageEnd()
        result = deleteWorkflow_result()
        try:
            self._handler.deleteWorkflow(args.authzToken, args.workflowTemplateId)
            msg_type = TMessageType.REPLY
        except (TTransport.TTransportException, KeyboardInterrupt, SystemExit):
            raise
        except apache.airavata.api.error.ttypes.InvalidRequestException as ire:
            msg_type = TMessageType.REPLY
            result.ire = ire
        except apache.airavata.api.error.ttypes.AiravataClientException as ace:
            msg_type = TMessageType.REPLY
            result.ace = ace
        except apache.airavata.api.error.ttypes.AiravataSystemException as ase:
            msg_type = TMessageType.REPLY
            result.ase = ase
        except apache.airavata.api.error.ttypes.AuthorizationException as ae:
            msg_type = TMessageType.REPLY
            result.ae = ae
        except Exception as ex:
            msg_type = TMessageType.EXCEPTION
            logging.exception(ex)
            result = TApplicationException(TApplicationException.INTERNAL_ERROR, 'Internal error')
        oprot.writeMessageBegin("deleteWorkflow", msg_type, seqid)
        result.write(oprot)
        oprot.writeMessageEnd()
        oprot.trans.flush()

    def process_registerWorkflow(self, seqid, iprot, oprot):
        args = registerWorkflow_args()
        args.read(iprot)
        iprot.readMessageEnd()
        result = registerWorkflow_result()
        try:
            result.success = self._handler.registerWorkflow(args.authzToken, args.gatewayId, args.workflow)
            msg_type = TMessageType.REPLY
        except (TTransport.TTransportException, KeyboardInterrupt, SystemExit):
            raise
        except apache.airavata.api.error.ttypes.InvalidRequestException as ire:
            msg_type = TMessageType.REPLY
            result.ire = ire
        except apache.airavata.api.error.ttypes.AiravataClientException as ace:
            msg_type = TMessageType.REPLY
            result.ace = ace
        except apache.airavata.api.error.ttypes.AiravataSystemException as ase:
            msg_type = TMessageType.REPLY
            result.ase = ase
        except apache.airavata.api.error.ttypes.AuthorizationException as ae:
            msg_type = TMessageType.REPLY
            result.ae = ae
        except Exception as ex:
            msg_type = TMessageType.EXCEPTION
            logging.exception(ex)
            result = TApplicationException(TApplicationException.INTERNAL_ERROR, 'Internal error')
        oprot.writeMessageBegin("registerWorkflow", msg_type, seqid)
        result.write(oprot)
        oprot.writeMessageEnd()
        oprot.trans.flush()

    def process_updateWorkflow(self, seqid, iprot, oprot):
        args = updateWorkflow_args()
        args.read(iprot)
        iprot.readMessageEnd()
        result = updateWorkflow_result()
        try:
            self._handler.updateWorkflow(args.authzToken, args.workflowTemplateId, args.workflow)
            msg_type = TMessageType.REPLY
        except (TTransport.TTransportException, KeyboardInterrupt, SystemExit):
            raise
        except apache.airavata.api.error.ttypes.InvalidRequestException as ire:
            msg_type = TMessageType.REPLY
            result.ire = ire
        except apache.airavata.api.error.ttypes.AiravataClientException as ace:
            msg_type = TMessageType.REPLY
            result.ace = ace
        except apache.airavata.api.error.ttypes.AiravataSystemException as ase:
            msg_type = TMessageType.REPLY
            result.ase = ase
        except apache.airavata.api.error.ttypes.AuthorizationException as ae:
            msg_type = TMessageType.REPLY
            result.ae = ae
        except Exception as ex:
            msg_type = TMessageType.EXCEPTION
            logging.exception(ex)
            result = TApplicationException(TApplicationException.INTERNAL_ERROR, 'Internal error')
        oprot.writeMessageBegin("updateWorkflow", msg_type, seqid)
        result.write(oprot)
        oprot.writeMessageEnd()
        oprot.trans.flush()

    def process_getWorkflowTemplateId(self, seqid, iprot, oprot):
        args = getWorkflowTemplateId_args()
        args.read(iprot)
        iprot.readMessageEnd()
        result = getWorkflowTemplateId_result()
        try:
            result.success = self._handler.getWorkflowTemplateId(args.authzToken, args.workflowName)
            msg_type = TMessageType.REPLY
        except (TTransport.TTransportException, KeyboardInterrupt, SystemExit):
            raise
        except apache.airavata.api.error.ttypes.InvalidRequestException as ire:
            msg_type = TMessageType.REPLY
            result.ire = ire
        except apache.airavata.api.error.ttypes.AiravataClientException as ace:
            msg_type = TMessageType.REPLY
            result.ace = ace
        except apache.airavata.api.error.ttypes.AiravataSystemException as ase:
            msg_type = TMessageType.REPLY
            result.ase = ase
        except apache.airavata.api.error.ttypes.AuthorizationException as ae:
            msg_type = TMessageType.REPLY
            result.ae = ae
        except Exception as ex:
            msg_type = TMessageType.EXCEPTION
            logging.exception(ex)
            result = TApplicationException(TApplicationException.INTERNAL_ERROR, 'Internal error')
        oprot.writeMessageBegin("getWorkflowTemplateId", msg_type, seqid)
        result.write(oprot)
        oprot.writeMessageEnd()
        oprot.trans.flush()

    def process_isWorkflowExistWithName(self, seqid, iprot, oprot):
        args = isWorkflowExistWithName_args()
        args.read(iprot)
        iprot.readMessageEnd()
        result = isWorkflowExistWithName_result()
        try:
            result.success = self._handler.isWorkflowExistWithName(args.authzToken, args.workflowName)
            msg_type = TMessageType.REPLY
        except (TTransport.TTransportException, KeyboardInterrupt, SystemExit):
            raise
        except apache.airavata.api.error.ttypes.InvalidRequestException as ire:
            msg_type = TMessageType.REPLY
            result.ire = ire
        except apache.airavata.api.error.ttypes.AiravataClientException as ace:
            msg_type = TMessageType.REPLY
            result.ace = ace
        except apache.airavata.api.error.ttypes.AiravataSystemException as ase:
            msg_type = TMessageType.REPLY
            result.ase = ase
        except apache.airavata.api.error.ttypes.AuthorizationException as ae:
            msg_type = TMessageType.REPLY
            result.ae = ae
        except Exception as ex:
            msg_type = TMessageType.EXCEPTION
            logging.exception(ex)
            result = TApplicationException(TApplicationException.INTERNAL_ERROR, 'Internal error')
        oprot.writeMessageBegin("isWorkflowExistWithName", msg_type, seqid)
        result.write(oprot)
        oprot.writeMessageEnd()
        oprot.trans.flush()

    def process_registerDataProduct(self, seqid, iprot, oprot):
        args = registerDataProduct_args()
        args.read(iprot)
        iprot.readMessageEnd()
        result = registerDataProduct_result()
        try:
            result.success = self._handler.registerDataProduct(args.authzToken, args.dataProductModel)
            msg_type = TMessageType.REPLY
        except (TTransport.TTransportException, KeyboardInterrupt, SystemExit):
            raise
        except apache.airavata.api.error.ttypes.InvalidRequestException as ire:
            msg_type = TMessageType.REPLY
            result.ire = ire
        except apache.airavata.api.error.ttypes.AiravataClientException as ace:
            msg_type = TMessageType.REPLY
            result.ace = ace
        except apache.airavata.api.error.ttypes.AiravataSystemException as ase:
            msg_type = TMessageType.REPLY
            result.ase = ase
        except apache.airavata.api.error.ttypes.AuthorizationException as ae:
            msg_type = TMessageType.REPLY
            result.ae = ae
        except Exception as ex:
            msg_type = TMessageType.EXCEPTION
            logging.exception(ex)
            result = TApplicationException(TApplicationException.INTERNAL_ERROR, 'Internal error')
        oprot.writeMessageBegin("registerDataProduct", msg_type, seqid)
        result.write(oprot)
        oprot.writeMessageEnd()
        oprot.trans.flush()

    def process_getDataProduct(self, seqid, iprot, oprot):
        args = getDataProduct_args()
        args.read(iprot)
        iprot.readMessageEnd()
        result = getDataProduct_result()
        try:
            result.success = self._handler.getDataProduct(args.authzToken, args.dataProductUri)
            msg_type = TMessageType.REPLY
        except (TTransport.TTransportException, KeyboardInterrupt, SystemExit):
            raise
        except apache.airavata.api.error.ttypes.InvalidRequestException as ire:
            msg_type = TMessageType.REPLY
            result.ire = ire
        except apache.airavata.api.error.ttypes.AiravataClientException as ace:
            msg_type = TMessageType.REPLY
            result.ace = ace
        except apache.airavata.api.error.ttypes.AiravataSystemException as ase:
            msg_type = TMessageType.REPLY
            result.ase = ase
        except apache.airavata.api.error.ttypes.AuthorizationException as ae:
            msg_type = TMessageType.REPLY
            result.ae = ae
        except Exception as ex:
            msg_type = TMessageType.EXCEPTION
            logging.exception(ex)
            result = TApplicationException(TApplicationException.INTERNAL_ERROR, 'Internal error')
        oprot.writeMessageBegin("getDataProduct", msg_type, seqid)
        result.write(oprot)
        oprot.writeMessageEnd()
        oprot.trans.flush()

    def process_registerReplicaLocation(self, seqid, iprot, oprot):
        args = registerReplicaLocation_args()
        args.read(iprot)
        iprot.readMessageEnd()
        result = registerReplicaLocation_result()
        try:
            result.success = self._handler.registerReplicaLocation(args.authzToken, args.replicaLocationModel)
            msg_type = TMessageType.REPLY
        except (TTransport.TTransportException, KeyboardInterrupt, SystemExit):
            raise
        except apache.airavata.api.error.ttypes.InvalidRequestException as ire:
            msg_type = TMessageType.REPLY
            result.ire = ire
        except apache.airavata.api.error.ttypes.AiravataClientException as ace:
            msg_type = TMessageType.REPLY
            result.ace = ace
        except apache.airavata.api.error.ttypes.AiravataSystemException as ase:
            msg_type = TMessageType.REPLY
            result.ase = ase
        except apache.airavata.api.error.ttypes.AuthorizationException as ae:
            msg_type = TMessageType.REPLY
            result.ae = ae
        except Exception as ex:
            msg_type = TMessageType.EXCEPTION
            logging.exception(ex)
            result = TApplicationException(TApplicationException.INTERNAL_ERROR, 'Internal error')
        oprot.writeMessageBegin("registerReplicaLocation", msg_type, seqid)
        result.write(oprot)
        oprot.writeMessageEnd()
        oprot.trans.flush()

    def process_getParentDataProduct(self, seqid, iprot, oprot):
        args = getParentDataProduct_args()
        args.read(iprot)
        iprot.readMessageEnd()
        result = getParentDataProduct_result()
        try:
            result.success = self._handler.getParentDataProduct(args.authzToken, args.productUri)
            msg_type = TMessageType.REPLY
        except (TTransport.TTransportException, KeyboardInterrupt, SystemExit):
            raise
        except apache.airavata.api.error.ttypes.InvalidRequestException as ire:
            msg_type = TMessageType.REPLY
            result.ire = ire
        except apache.airavata.api.error.ttypes.AiravataClientException as ace:
            msg_type = TMessageType.REPLY
            result.ace = ace
        except apache.airavata.api.error.ttypes.AiravataSystemException as ase:
            msg_type = TMessageType.REPLY
            result.ase = ase
        except apache.airavata.api.error.ttypes.AuthorizationException as ae:
            msg_type = TMessageType.REPLY
            result.ae = ae
        except Exception as ex:
            msg_type = TMessageType.EXCEPTION
            logging.exception(ex)
            result = TApplicationException(TApplicationException.INTERNAL_ERROR, 'Internal error')
        oprot.writeMessageBegin("getParentDataProduct", msg_type, seqid)
        result.write(oprot)
        oprot.writeMessageEnd()
        oprot.trans.flush()

    def process_getChildDataProducts(self, seqid, iprot, oprot):
        args = getChildDataProducts_args()
        args.read(iprot)
        iprot.readMessageEnd()
        result = getChildDataProducts_result()
        try:
            result.success = self._handler.getChildDataProducts(args.authzToken, args.productUri)
            msg_type = TMessageType.REPLY
        except (TTransport.TTransportException, KeyboardInterrupt, SystemExit):
            raise
        except apache.airavata.api.error.ttypes.InvalidRequestException as ire:
            msg_type = TMessageType.REPLY
            result.ire = ire
        except apache.airavata.api.error.ttypes.AiravataClientException as ace:
            msg_type = TMessageType.REPLY
            result.ace = ace
        except apache.airavata.api.error.ttypes.AiravataSystemException as ase:
            msg_type = TMessageType.REPLY
            result.ase = ase
        except apache.airavata.api.error.ttypes.AuthorizationException as ae:
            msg_type = TMessageType.REPLY
            result.ae = ae
        except Exception as ex:
            msg_type = TMessageType.EXCEPTION
            logging.exception(ex)
            result = TApplicationException(TApplicationException.INTERNAL_ERROR, 'Internal error')
        oprot.writeMessageBegin("getChildDataProducts", msg_type, seqid)
        result.write(oprot)
        oprot.writeMessageEnd()
        oprot.trans.flush()

    def process_shareResourceWithUsers(self, seqid, iprot, oprot):
        args = shareResourceWithUsers_args()
        args.read(iprot)
        iprot.readMessageEnd()
        result = shareResourceWithUsers_result()
        try:
            result.success = self._handler.shareResourceWithUsers(args.authzToken, args.resourceId, args.resourceType, args.userPermissionList)
            msg_type = TMessageType.REPLY
        except (TTransport.TTransportException, KeyboardInterrupt, SystemExit):
            raise
        except apache.airavata.api.error.ttypes.InvalidRequestException as ire:
            msg_type = TMessageType.REPLY
            result.ire = ire
        except apache.airavata.api.error.ttypes.AiravataClientException as ace:
            msg_type = TMessageType.REPLY
            result.ace = ace
        except apache.airavata.api.error.ttypes.AiravataSystemException as ase:
            msg_type = TMessageType.REPLY
            result.ase = ase
        except apache.airavata.api.error.ttypes.AuthorizationException as ae:
            msg_type = TMessageType.REPLY
            result.ae = ae
        except Exception as ex:
            msg_type = TMessageType.EXCEPTION
            logging.exception(ex)
            result = TApplicationException(TApplicationException.INTERNAL_ERROR, 'Internal error')
        oprot.writeMessageBegin("shareResourceWithUsers", msg_type, seqid)
        result.write(oprot)
        oprot.writeMessageEnd()
        oprot.trans.flush()

    def process_revokeSharingOfResourceFromUsers(self, seqid, iprot, oprot):
        args = revokeSharingOfResourceFromUsers_args()
        args.read(iprot)
        iprot.readMessageEnd()
        result = revokeSharingOfResourceFromUsers_result()
        try:
            result.success = self._handler.revokeSharingOfResourceFromUsers(args.authzToken, args.resourceId, args.resourceType, args.userPermissionList)
            msg_type = TMessageType.REPLY
        except (TTransport.TTransportException, KeyboardInterrupt, SystemExit):
            raise
        except apache.airavata.api.error.ttypes.InvalidRequestException as ire:
            msg_type = TMessageType.REPLY
            result.ire = ire
        except apache.airavata.api.error.ttypes.AiravataClientException as ace:
            msg_type = TMessageType.REPLY
            result.ace = ace
        except apache.airavata.api.error.ttypes.AiravataSystemException as ase:
            msg_type = TMessageType.REPLY
            result.ase = ase
        except apache.airavata.api.error.ttypes.AuthorizationException as ae:
            msg_type = TMessageType.REPLY
            result.ae = ae
        except Exception as ex:
            msg_type = TMessageType.EXCEPTION
            logging.exception(ex)
            result = TApplicationException(TApplicationException.INTERNAL_ERROR, 'Internal error')
        oprot.writeMessageBegin("revokeSharingOfResourceFromUsers", msg_type, seqid)
        result.write(oprot)
        oprot.writeMessageEnd()
        oprot.trans.flush()

    def process_getAllAccessibleUsers(self, seqid, iprot, oprot):
        args = getAllAccessibleUsers_args()
        args.read(iprot)
        iprot.readMessageEnd()
        result = getAllAccessibleUsers_result()
        try:
            result.success = self._handler.getAllAccessibleUsers(args.authzToken, args.resourceId, args.resourceType, args.permissionType)
            msg_type = TMessageType.REPLY
        except (TTransport.TTransportException, KeyboardInterrupt, SystemExit):
            raise
        except apache.airavata.api.error.ttypes.InvalidRequestException as ire:
            msg_type = TMessageType.REPLY
            result.ire = ire
        except apache.airavata.api.error.ttypes.AiravataClientException as ace:
            msg_type = TMessageType.REPLY
            result.ace = ace
        except apache.airavata.api.error.ttypes.AiravataSystemException as ase:
            msg_type = TMessageType.REPLY
            result.ase = ase
        except apache.airavata.api.error.ttypes.AuthorizationException as ae:
            msg_type = TMessageType.REPLY
            result.ae = ae
        except Exception as ex:
            msg_type = TMessageType.EXCEPTION
            logging.exception(ex)
            result = TApplicationException(TApplicationException.INTERNAL_ERROR, 'Internal error')
        oprot.writeMessageBegin("getAllAccessibleUsers", msg_type, seqid)
        result.write(oprot)
        oprot.writeMessageEnd()
        oprot.trans.flush()

    def process_createGroup(self, seqid, iprot, oprot):
        args = createGroup_args()
        args.read(iprot)
        iprot.readMessageEnd()
        result = createGroup_result()
        try:
            result.success = self._handler.createGroup(args.authzToken, args.groupModel)
            msg_type = TMessageType.REPLY
        except (TTransport.TTransportException, KeyboardInterrupt, SystemExit):
            raise
        except apache.airavata.api.error.ttypes.InvalidRequestException as ire:
            msg_type = TMessageType.REPLY
            result.ire = ire
        except apache.airavata.api.error.ttypes.AiravataClientException as ace:
            msg_type = TMessageType.REPLY
            result.ace = ace
        except apache.airavata.api.error.ttypes.AiravataSystemException as ase:
            msg_type = TMessageType.REPLY
            result.ase = ase
        except apache.airavata.api.error.ttypes.AuthorizationException as ae:
            msg_type = TMessageType.REPLY
            result.ae = ae
        except Exception as ex:
            msg_type = TMessageType.EXCEPTION
            logging.exception(ex)
            result = TApplicationException(TApplicationException.INTERNAL_ERROR, 'Internal error')
        oprot.writeMessageBegin("createGroup", msg_type, seqid)
        result.write(oprot)
        oprot.writeMessageEnd()
        oprot.trans.flush()

    def process_updateGroup(self, seqid, iprot, oprot):
        args = updateGroup_args()
        args.read(iprot)
        iprot.readMessageEnd()
        result = updateGroup_result()
        try:
            result.success = self._handler.updateGroup(args.authzToken, args.groupModel)
            msg_type = TMessageType.REPLY
        except (TTransport.TTransportException, KeyboardInterrupt, SystemExit):
            raise
        except apache.airavata.api.error.ttypes.InvalidRequestException as ire:
            msg_type = TMessageType.REPLY
            result.ire = ire
        except apache.airavata.api.error.ttypes.AiravataClientException as ace:
            msg_type = TMessageType.REPLY
            result.ace = ace
        except apache.airavata.api.error.ttypes.AiravataSystemException as ase:
            msg_type = TMessageType.REPLY
            result.ase = ase
        except apache.airavata.api.error.ttypes.AuthorizationException as ae:
            msg_type = TMessageType.REPLY
            result.ae = ae
        except Exception as ex:
            msg_type = TMessageType.EXCEPTION
            logging.exception(ex)
            result = TApplicationException(TApplicationException.INTERNAL_ERROR, 'Internal error')
        oprot.writeMessageBegin("updateGroup", msg_type, seqid)
        result.write(oprot)
        oprot.writeMessageEnd()
        oprot.trans.flush()

    def process_deleteGroup(self, seqid, iprot, oprot):
        args = deleteGroup_args()
        args.read(iprot)
        iprot.readMessageEnd()
        result = deleteGroup_result()
        try:
            result.success = self._handler.deleteGroup(args.authzToken, args.groupId, args.ownerId, args.gatewayId)
            msg_type = TMessageType.REPLY
        except (TTransport.TTransportException, KeyboardInterrupt, SystemExit):
            raise
        except apache.airavata.api.error.ttypes.InvalidRequestException as ire:
            msg_type = TMessageType.REPLY
            result.ire = ire
        except apache.airavata.api.error.ttypes.AiravataClientException as ace:
            msg_type = TMessageType.REPLY
            result.ace = ace
        except apache.airavata.api.error.ttypes.AiravataSystemException as ase:
            msg_type = TMessageType.REPLY
            result.ase = ase
        except apache.airavata.api.error.ttypes.AuthorizationException as ae:
            msg_type = TMessageType.REPLY
            result.ae = ae
        except Exception as ex:
            msg_type = TMessageType.EXCEPTION
            logging.exception(ex)
            result = TApplicationException(TApplicationException.INTERNAL_ERROR, 'Internal error')
        oprot.writeMessageBegin("deleteGroup", msg_type, seqid)
        result.write(oprot)
        oprot.writeMessageEnd()
        oprot.trans.flush()

    def process_getGroup(self, seqid, iprot, oprot):
        args = getGroup_args()
        args.read(iprot)
        iprot.readMessageEnd()
        result = getGroup_result()
        try:
            result.success = self._handler.getGroup(args.authzToken, args.groupId)
            msg_type = TMessageType.REPLY
        except (TTransport.TTransportException, KeyboardInterrupt, SystemExit):
            raise
        except apache.airavata.api.error.ttypes.InvalidRequestException as ire:
            msg_type = TMessageType.REPLY
            result.ire = ire
        except apache.airavata.api.error.ttypes.AiravataClientException as ace:
            msg_type = TMessageType.REPLY
            result.ace = ace
        except apache.airavata.api.error.ttypes.AiravataSystemException as ase:
            msg_type = TMessageType.REPLY
            result.ase = ase
        except apache.airavata.api.error.ttypes.AuthorizationException as ae:
            msg_type = TMessageType.REPLY
            result.ae = ae
        except Exception as ex:
            msg_type = TMessageType.EXCEPTION
            logging.exception(ex)
            result = TApplicationException(TApplicationException.INTERNAL_ERROR, 'Internal error')
        oprot.writeMessageBegin("getGroup", msg_type, seqid)
        result.write(oprot)
        oprot.writeMessageEnd()
        oprot.trans.flush()

    def process_getAllGroupsUserBelongs(self, seqid, iprot, oprot):
        args = getAllGroupsUserBelongs_args()
        args.read(iprot)
        iprot.readMessageEnd()
        result = getAllGroupsUserBelongs_result()
        try:
            result.success = self._handler.getAllGroupsUserBelongs(args.authzToken, args.userName, args.gatewayId)
            msg_type = TMessageType.REPLY
        except (TTransport.TTransportException, KeyboardInterrupt, SystemExit):
            raise
        except apache.airavata.api.error.ttypes.InvalidRequestException as ire:
            msg_type = TMessageType.REPLY
            result.ire = ire
        except apache.airavata.api.error.ttypes.AiravataClientException as ace:
            msg_type = TMessageType.REPLY
            result.ace = ace
        except apache.airavata.api.error.ttypes.AiravataSystemException as ase:
            msg_type = TMessageType.REPLY
            result.ase = ase
        except apache.airavata.api.error.ttypes.AuthorizationException as ae:
            msg_type = TMessageType.REPLY
            result.ae = ae
        except Exception as ex:
            msg_type = TMessageType.EXCEPTION
            logging.exception(ex)
            result = TApplicationException(TApplicationException.INTERNAL_ERROR, 'Internal error')
        oprot.writeMessageBegin("getAllGroupsUserBelongs", msg_type, seqid)
        result.write(oprot)
        oprot.writeMessageEnd()
        oprot.trans.flush()

# HELPER FUNCTIONS AND STRUCTURES


class getAPIVersion_args(object):
    """
    Attributes:
     - authzToken
    """

    thrift_spec = (
        None,  # 0
        (1, TType.STRUCT, 'authzToken', (apache.airavata.model.security.ttypes.AuthzToken, apache.airavata.model.security.ttypes.AuthzToken.thrift_spec), None, ),  # 1
    )

    def __init__(self, authzToken=None,):
        self.authzToken = authzToken

    def read(self, iprot):
        if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None:
            iprot._fast_decode(self, iprot, (self.__class__, self.thrift_spec))
            return
        iprot.readStructBegin()
        while True:
            (fname, ftype, fid) = iprot.readFieldBegin()
            if ftype == TType.STOP:
                break
            if fid == 1:
                if ftype == TType.STRUCT:
                    self.authzToken = apache.airavata.model.security.ttypes.AuthzToken()
                    self.authzToken.read(iprot)
                else:
                    iprot.skip(ftype)
            else:
                iprot.skip(ftype)
            iprot.readFieldEnd()
        iprot.readStructEnd()

    def write(self, oprot):
        if oprot._fast_encode is not None and self.thrift_spec is not None:
            oprot.trans.write(oprot._fast_encode(self, (self.__class__, self.thrift_spec)))
            return
        oprot.writeStructBegin('getAPIVersion_args')
        if self.authzToken is not None:
            oprot.writeFieldBegin('authzToken', TType.STRUCT, 1)
            self.authzToken.write(oprot)
            oprot.writeFieldEnd()
        oprot.writeFieldStop()
        oprot.writeStructEnd()

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

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

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

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


class getAPIVersion_result(object):
    """
    Attributes:
     - success
     - ire
     - ace
     - ase
     - ae
    """

    thrift_spec = (
        (0, TType.STRING, 'success', 'UTF8', None, ),  # 0
        (1, TType.STRUCT, 'ire', (apache.airavata.api.error.ttypes.InvalidRequestException, apache.airavata.api.error.ttypes.InvalidRequestException.thrift_spec), None, ),  # 1
        (2, TType.STRUCT, 'ace', (apache.airavata.api.error.ttypes.AiravataClientException, apache.airavata.api.error.ttypes.AiravataClientException.thrift_spec), None, ),  # 2
        (3, TType.STRUCT, 'ase', (apache.airavata.api.error.ttypes.AiravataSystemException, apache.airavata.api.error.ttypes.AiravataSystemException.thrift_spec), None, ),  # 3
        (4, TType.STRUCT, 'ae', (apache.airavata.api.error.ttypes.AuthorizationException, apache.airavata.api.error.ttypes.AuthorizationException.thrift_spec), None, ),  # 4
    )

    def __init__(self, success=None, ire=None, ace=None, ase=None, ae=None,):
        self.success = success
        self.ire = ire
        self.ace = ace
        self.ase = ase
        self.ae = ae

    def read(self, iprot):
        if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None:
            iprot._fast_decode(self, iprot, (self.__class__, self.thrift_spec))
            return
        iprot.readStructBegin()
        while True:
            (fname, ftype, fid) = iprot.readFieldBegin()
            if ftype == TType.STOP:
                break
            if fid == 0:
                if ftype == TType.STRING:
                    self.success = iprot.readString().decode('utf-8') if sys.version_info[0] == 2 else iprot.readString()
                else:
                    iprot.skip(ftype)
            elif fid == 1:
                if ftype == TType.STRUCT:
                    self.ire = apache.airavata.api.error.ttypes.InvalidRequestException()
                    self.ire.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 2:
                if ftype == TType.STRUCT:
                    self.ace = apache.airavata.api.error.ttypes.AiravataClientException()
                    self.ace.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 3:
                if ftype == TType.STRUCT:
                    self.ase = apache.airavata.api.error.ttypes.AiravataSystemException()
                    self.ase.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 4:
                if ftype == TType.STRUCT:
                    self.ae = apache.airavata.api.error.ttypes.AuthorizationException()
                    self.ae.read(iprot)
                else:
                    iprot.skip(ftype)
            else:
                iprot.skip(ftype)
            iprot.readFieldEnd()
        iprot.readStructEnd()

    def write(self, oprot):
        if oprot._fast_encode is not None and self.thrift_spec is not None:
            oprot.trans.write(oprot._fast_encode(self, (self.__class__, self.thrift_spec)))
            return
        oprot.writeStructBegin('getAPIVersion_result')
        if self.success is not None:
            oprot.writeFieldBegin('success', TType.STRING, 0)
            oprot.writeString(self.success.encode('utf-8') if sys.version_info[0] == 2 else self.success)
            oprot.writeFieldEnd()
        if self.ire is not None:
            oprot.writeFieldBegin('ire', TType.STRUCT, 1)
            self.ire.write(oprot)
            oprot.writeFieldEnd()
        if self.ace is not None:
            oprot.writeFieldBegin('ace', TType.STRUCT, 2)
            self.ace.write(oprot)
            oprot.writeFieldEnd()
        if self.ase is not None:
            oprot.writeFieldBegin('ase', TType.STRUCT, 3)
            self.ase.write(oprot)
            oprot.writeFieldEnd()
        if self.ae is not None:
            oprot.writeFieldBegin('ae', TType.STRUCT, 4)
            self.ae.write(oprot)
            oprot.writeFieldEnd()
        oprot.writeFieldStop()
        oprot.writeStructEnd()

    def validate(self):
        return

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

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

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


class isUserExists_args(object):
    """
    Attributes:
     - authzToken
     - gatewayId
     - userName
    """

    thrift_spec = (
        None,  # 0
        (1, TType.STRUCT, 'authzToken', (apache.airavata.model.security.ttypes.AuthzToken, apache.airavata.model.security.ttypes.AuthzToken.thrift_spec), None, ),  # 1
        (2, TType.STRING, 'gatewayId', 'UTF8', None, ),  # 2
        (3, TType.STRING, 'userName', 'UTF8', None, ),  # 3
    )

    def __init__(self, authzToken=None, gatewayId=None, userName=None,):
        self.authzToken = authzToken
        self.gatewayId = gatewayId
        self.userName = userName

    def read(self, iprot):
        if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None:
            iprot._fast_decode(self, iprot, (self.__class__, self.thrift_spec))
            return
        iprot.readStructBegin()
        while True:
            (fname, ftype, fid) = iprot.readFieldBegin()
            if ftype == TType.STOP:
                break
            if fid == 1:
                if ftype == TType.STRUCT:
                    self.authzToken = apache.airavata.model.security.ttypes.AuthzToken()
                    self.authzToken.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 2:
                if ftype == TType.STRING:
                    self.gatewayId = iprot.readString().decode('utf-8') if sys.version_info[0] == 2 else iprot.readString()
                else:
                    iprot.skip(ftype)
            elif fid == 3:
                if ftype == TType.STRING:
                    self.userName = iprot.readString().decode('utf-8') if sys.version_info[0] == 2 else iprot.readString()
                else:
                    iprot.skip(ftype)
            else:
                iprot.skip(ftype)
            iprot.readFieldEnd()
        iprot.readStructEnd()

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

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

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

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

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


class isUserExists_result(object):
    """
    Attributes:
     - success
     - ire
     - ace
     - ase
     - ae
    """

    thrift_spec = (
        (0, TType.BOOL, 'success', None, None, ),  # 0
        (1, TType.STRUCT, 'ire', (apache.airavata.api.error.ttypes.InvalidRequestException, apache.airavata.api.error.ttypes.InvalidRequestException.thrift_spec), None, ),  # 1
        (2, TType.STRUCT, 'ace', (apache.airavata.api.error.ttypes.AiravataClientException, apache.airavata.api.error.ttypes.AiravataClientException.thrift_spec), None, ),  # 2
        (3, TType.STRUCT, 'ase', (apache.airavata.api.error.ttypes.AiravataSystemException, apache.airavata.api.error.ttypes.AiravataSystemException.thrift_spec), None, ),  # 3
        (4, TType.STRUCT, 'ae', (apache.airavata.api.error.ttypes.AuthorizationException, apache.airavata.api.error.ttypes.AuthorizationException.thrift_spec), None, ),  # 4
    )

    def __init__(self, success=None, ire=None, ace=None, ase=None, ae=None,):
        self.success = success
        self.ire = ire
        self.ace = ace
        self.ase = ase
        self.ae = ae

    def read(self, iprot):
        if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None:
            iprot._fast_decode(self, iprot, (self.__class__, self.thrift_spec))
            return
        iprot.readStructBegin()
        while True:
            (fname, ftype, fid) = iprot.readFieldBegin()
            if ftype == TType.STOP:
                break
            if fid == 0:
                if ftype == TType.BOOL:
                    self.success = iprot.readBool()
                else:
                    iprot.skip(ftype)
            elif fid == 1:
                if ftype == TType.STRUCT:
                    self.ire = apache.airavata.api.error.ttypes.InvalidRequestException()
                    self.ire.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 2:
                if ftype == TType.STRUCT:
                    self.ace = apache.airavata.api.error.ttypes.AiravataClientException()
                    self.ace.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 3:
                if ftype == TType.STRUCT:
                    self.ase = apache.airavata.api.error.ttypes.AiravataSystemException()
                    self.ase.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 4:
                if ftype == TType.STRUCT:
                    self.ae = apache.airavata.api.error.ttypes.AuthorizationException()
                    self.ae.read(iprot)
                else:
                    iprot.skip(ftype)
            else:
                iprot.skip(ftype)
            iprot.readFieldEnd()
        iprot.readStructEnd()

    def write(self, oprot):
        if oprot._fast_encode is not None and self.thrift_spec is not None:
            oprot.trans.write(oprot._fast_encode(self, (self.__class__, self.thrift_spec)))
            return
        oprot.writeStructBegin('isUserExists_result')
        if self.success is not None:
            oprot.writeFieldBegin('success', TType.BOOL, 0)
            oprot.writeBool(self.success)
            oprot.writeFieldEnd()
        if self.ire is not None:
            oprot.writeFieldBegin('ire', TType.STRUCT, 1)
            self.ire.write(oprot)
            oprot.writeFieldEnd()
        if self.ace is not None:
            oprot.writeFieldBegin('ace', TType.STRUCT, 2)
            self.ace.write(oprot)
            oprot.writeFieldEnd()
        if self.ase is not None:
            oprot.writeFieldBegin('ase', TType.STRUCT, 3)
            self.ase.write(oprot)
            oprot.writeFieldEnd()
        if self.ae is not None:
            oprot.writeFieldBegin('ae', TType.STRUCT, 4)
            self.ae.write(oprot)
            oprot.writeFieldEnd()
        oprot.writeFieldStop()
        oprot.writeStructEnd()

    def validate(self):
        return

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

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

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


class addGateway_args(object):
    """
    Attributes:
     - authzToken
     - gateway
    """

    thrift_spec = (
        None,  # 0
        (1, TType.STRUCT, 'authzToken', (apache.airavata.model.security.ttypes.AuthzToken, apache.airavata.model.security.ttypes.AuthzToken.thrift_spec), None, ),  # 1
        (2, TType.STRUCT, 'gateway', (apache.airavata.model.workspace.ttypes.Gateway, apache.airavata.model.workspace.ttypes.Gateway.thrift_spec), None, ),  # 2
    )

    def __init__(self, authzToken=None, gateway=None,):
        self.authzToken = authzToken
        self.gateway = gateway

    def read(self, iprot):
        if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None:
            iprot._fast_decode(self, iprot, (self.__class__, self.thrift_spec))
            return
        iprot.readStructBegin()
        while True:
            (fname, ftype, fid) = iprot.readFieldBegin()
            if ftype == TType.STOP:
                break
            if fid == 1:
                if ftype == TType.STRUCT:
                    self.authzToken = apache.airavata.model.security.ttypes.AuthzToken()
                    self.authzToken.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 2:
                if ftype == TType.STRUCT:
                    self.gateway = apache.airavata.model.workspace.ttypes.Gateway()
                    self.gateway.read(iprot)
                else:
                    iprot.skip(ftype)
            else:
                iprot.skip(ftype)
            iprot.readFieldEnd()
        iprot.readStructEnd()

    def write(self, oprot):
        if oprot._fast_encode is not None and self.thrift_spec is not None:
            oprot.trans.write(oprot._fast_encode(self, (self.__class__, self.thrift_spec)))
            return
        oprot.writeStructBegin('addGateway_args')
        if self.authzToken is not None:
            oprot.writeFieldBegin('authzToken', TType.STRUCT, 1)
            self.authzToken.write(oprot)
            oprot.writeFieldEnd()
        if self.gateway is not None:
            oprot.writeFieldBegin('gateway', TType.STRUCT, 2)
            self.gateway.write(oprot)
            oprot.writeFieldEnd()
        oprot.writeFieldStop()
        oprot.writeStructEnd()

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

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

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

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


class addGateway_result(object):
    """
    Attributes:
     - success
     - ire
     - ace
     - ase
     - ae
    """

    thrift_spec = (
        (0, TType.STRING, 'success', 'UTF8', None, ),  # 0
        (1, TType.STRUCT, 'ire', (apache.airavata.api.error.ttypes.InvalidRequestException, apache.airavata.api.error.ttypes.InvalidRequestException.thrift_spec), None, ),  # 1
        (2, TType.STRUCT, 'ace', (apache.airavata.api.error.ttypes.AiravataClientException, apache.airavata.api.error.ttypes.AiravataClientException.thrift_spec), None, ),  # 2
        (3, TType.STRUCT, 'ase', (apache.airavata.api.error.ttypes.AiravataSystemException, apache.airavata.api.error.ttypes.AiravataSystemException.thrift_spec), None, ),  # 3
        (4, TType.STRUCT, 'ae', (apache.airavata.api.error.ttypes.AuthorizationException, apache.airavata.api.error.ttypes.AuthorizationException.thrift_spec), None, ),  # 4
    )

    def __init__(self, success=None, ire=None, ace=None, ase=None, ae=None,):
        self.success = success
        self.ire = ire
        self.ace = ace
        self.ase = ase
        self.ae = ae

    def read(self, iprot):
        if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None:
            iprot._fast_decode(self, iprot, (self.__class__, self.thrift_spec))
            return
        iprot.readStructBegin()
        while True:
            (fname, ftype, fid) = iprot.readFieldBegin()
            if ftype == TType.STOP:
                break
            if fid == 0:
                if ftype == TType.STRING:
                    self.success = iprot.readString().decode('utf-8') if sys.version_info[0] == 2 else iprot.readString()
                else:
                    iprot.skip(ftype)
            elif fid == 1:
                if ftype == TType.STRUCT:
                    self.ire = apache.airavata.api.error.ttypes.InvalidRequestException()
                    self.ire.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 2:
                if ftype == TType.STRUCT:
                    self.ace = apache.airavata.api.error.ttypes.AiravataClientException()
                    self.ace.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 3:
                if ftype == TType.STRUCT:
                    self.ase = apache.airavata.api.error.ttypes.AiravataSystemException()
                    self.ase.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 4:
                if ftype == TType.STRUCT:
                    self.ae = apache.airavata.api.error.ttypes.AuthorizationException()
                    self.ae.read(iprot)
                else:
                    iprot.skip(ftype)
            else:
                iprot.skip(ftype)
            iprot.readFieldEnd()
        iprot.readStructEnd()

    def write(self, oprot):
        if oprot._fast_encode is not None and self.thrift_spec is not None:
            oprot.trans.write(oprot._fast_encode(self, (self.__class__, self.thrift_spec)))
            return
        oprot.writeStructBegin('addGateway_result')
        if self.success is not None:
            oprot.writeFieldBegin('success', TType.STRING, 0)
            oprot.writeString(self.success.encode('utf-8') if sys.version_info[0] == 2 else self.success)
            oprot.writeFieldEnd()
        if self.ire is not None:
            oprot.writeFieldBegin('ire', TType.STRUCT, 1)
            self.ire.write(oprot)
            oprot.writeFieldEnd()
        if self.ace is not None:
            oprot.writeFieldBegin('ace', TType.STRUCT, 2)
            self.ace.write(oprot)
            oprot.writeFieldEnd()
        if self.ase is not None:
            oprot.writeFieldBegin('ase', TType.STRUCT, 3)
            self.ase.write(oprot)
            oprot.writeFieldEnd()
        if self.ae is not None:
            oprot.writeFieldBegin('ae', TType.STRUCT, 4)
            self.ae.write(oprot)
            oprot.writeFieldEnd()
        oprot.writeFieldStop()
        oprot.writeStructEnd()

    def validate(self):
        return

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

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

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


class getAllUsersInGateway_args(object):
    """
    Attributes:
     - authzToken
     - gatewayId
    """

    thrift_spec = (
        None,  # 0
        (1, TType.STRUCT, 'authzToken', (apache.airavata.model.security.ttypes.AuthzToken, apache.airavata.model.security.ttypes.AuthzToken.thrift_spec), None, ),  # 1
        (2, TType.STRING, 'gatewayId', 'UTF8', None, ),  # 2
    )

    def __init__(self, authzToken=None, gatewayId=None,):
        self.authzToken = authzToken
        self.gatewayId = gatewayId

    def read(self, iprot):
        if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None:
            iprot._fast_decode(self, iprot, (self.__class__, self.thrift_spec))
            return
        iprot.readStructBegin()
        while True:
            (fname, ftype, fid) = iprot.readFieldBegin()
            if ftype == TType.STOP:
                break
            if fid == 1:
                if ftype == TType.STRUCT:
                    self.authzToken = apache.airavata.model.security.ttypes.AuthzToken()
                    self.authzToken.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 2:
                if ftype == TType.STRING:
                    self.gatewayId = iprot.readString().decode('utf-8') if sys.version_info[0] == 2 else iprot.readString()
                else:
                    iprot.skip(ftype)
            else:
                iprot.skip(ftype)
            iprot.readFieldEnd()
        iprot.readStructEnd()

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

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

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

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

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


class getAllUsersInGateway_result(object):
    """
    Attributes:
     - success
     - ire
     - ace
     - ase
     - ae
    """

    thrift_spec = (
        (0, TType.LIST, 'success', (TType.STRING, 'UTF8', False), None, ),  # 0
        (1, TType.STRUCT, 'ire', (apache.airavata.api.error.ttypes.InvalidRequestException, apache.airavata.api.error.ttypes.InvalidRequestException.thrift_spec), None, ),  # 1
        (2, TType.STRUCT, 'ace', (apache.airavata.api.error.ttypes.AiravataClientException, apache.airavata.api.error.ttypes.AiravataClientException.thrift_spec), None, ),  # 2
        (3, TType.STRUCT, 'ase', (apache.airavata.api.error.ttypes.AiravataSystemException, apache.airavata.api.error.ttypes.AiravataSystemException.thrift_spec), None, ),  # 3
        (4, TType.STRUCT, 'ae', (apache.airavata.api.error.ttypes.AuthorizationException, apache.airavata.api.error.ttypes.AuthorizationException.thrift_spec), None, ),  # 4
    )

    def __init__(self, success=None, ire=None, ace=None, ase=None, ae=None,):
        self.success = success
        self.ire = ire
        self.ace = ace
        self.ase = ase
        self.ae = ae

    def read(self, iprot):
        if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None:
            iprot._fast_decode(self, iprot, (self.__class__, self.thrift_spec))
            return
        iprot.readStructBegin()
        while True:
            (fname, ftype, fid) = iprot.readFieldBegin()
            if ftype == TType.STOP:
                break
            if fid == 0:
                if ftype == TType.LIST:
                    self.success = []
                    (_etype3, _size0) = iprot.readListBegin()
                    for _i4 in range(_size0):
                        _elem5 = iprot.readString().decode('utf-8') if sys.version_info[0] == 2 else iprot.readString()
                        self.success.append(_elem5)
                    iprot.readListEnd()
                else:
                    iprot.skip(ftype)
            elif fid == 1:
                if ftype == TType.STRUCT:
                    self.ire = apache.airavata.api.error.ttypes.InvalidRequestException()
                    self.ire.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 2:
                if ftype == TType.STRUCT:
                    self.ace = apache.airavata.api.error.ttypes.AiravataClientException()
                    self.ace.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 3:
                if ftype == TType.STRUCT:
                    self.ase = apache.airavata.api.error.ttypes.AiravataSystemException()
                    self.ase.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 4:
                if ftype == TType.STRUCT:
                    self.ae = apache.airavata.api.error.ttypes.AuthorizationException()
                    self.ae.read(iprot)
                else:
                    iprot.skip(ftype)
            else:
                iprot.skip(ftype)
            iprot.readFieldEnd()
        iprot.readStructEnd()

    def write(self, oprot):
        if oprot._fast_encode is not None and self.thrift_spec is not None:
            oprot.trans.write(oprot._fast_encode(self, (self.__class__, self.thrift_spec)))
            return
        oprot.writeStructBegin('getAllUsersInGateway_result')
        if self.success is not None:
            oprot.writeFieldBegin('success', TType.LIST, 0)
            oprot.writeListBegin(TType.STRING, len(self.success))
            for iter6 in self.success:
                oprot.writeString(iter6.encode('utf-8') if sys.version_info[0] == 2 else iter6)
            oprot.writeListEnd()
            oprot.writeFieldEnd()
        if self.ire is not None:
            oprot.writeFieldBegin('ire', TType.STRUCT, 1)
            self.ire.write(oprot)
            oprot.writeFieldEnd()
        if self.ace is not None:
            oprot.writeFieldBegin('ace', TType.STRUCT, 2)
            self.ace.write(oprot)
            oprot.writeFieldEnd()
        if self.ase is not None:
            oprot.writeFieldBegin('ase', TType.STRUCT, 3)
            self.ase.write(oprot)
            oprot.writeFieldEnd()
        if self.ae is not None:
            oprot.writeFieldBegin('ae', TType.STRUCT, 4)
            self.ae.write(oprot)
            oprot.writeFieldEnd()
        oprot.writeFieldStop()
        oprot.writeStructEnd()

    def validate(self):
        return

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

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

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


class updateGateway_args(object):
    """
    Attributes:
     - authzToken
     - gatewayId
     - updatedGateway
    """

    thrift_spec = (
        None,  # 0
        (1, TType.STRUCT, 'authzToken', (apache.airavata.model.security.ttypes.AuthzToken, apache.airavata.model.security.ttypes.AuthzToken.thrift_spec), None, ),  # 1
        (2, TType.STRING, 'gatewayId', 'UTF8', None, ),  # 2
        (3, TType.STRUCT, 'updatedGateway', (apache.airavata.model.workspace.ttypes.Gateway, apache.airavata.model.workspace.ttypes.Gateway.thrift_spec), None, ),  # 3
    )

    def __init__(self, authzToken=None, gatewayId=None, updatedGateway=None,):
        self.authzToken = authzToken
        self.gatewayId = gatewayId
        self.updatedGateway = updatedGateway

    def read(self, iprot):
        if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None:
            iprot._fast_decode(self, iprot, (self.__class__, self.thrift_spec))
            return
        iprot.readStructBegin()
        while True:
            (fname, ftype, fid) = iprot.readFieldBegin()
            if ftype == TType.STOP:
                break
            if fid == 1:
                if ftype == TType.STRUCT:
                    self.authzToken = apache.airavata.model.security.ttypes.AuthzToken()
                    self.authzToken.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 2:
                if ftype == TType.STRING:
                    self.gatewayId = iprot.readString().decode('utf-8') if sys.version_info[0] == 2 else iprot.readString()
                else:
                    iprot.skip(ftype)
            elif fid == 3:
                if ftype == TType.STRUCT:
                    self.updatedGateway = apache.airavata.model.workspace.ttypes.Gateway()
                    self.updatedGateway.read(iprot)
                else:
                    iprot.skip(ftype)
            else:
                iprot.skip(ftype)
            iprot.readFieldEnd()
        iprot.readStructEnd()

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

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

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

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

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


class updateGateway_result(object):
    """
    Attributes:
     - success
     - ire
     - ace
     - ase
     - ae
    """

    thrift_spec = (
        (0, TType.BOOL, 'success', None, None, ),  # 0
        (1, TType.STRUCT, 'ire', (apache.airavata.api.error.ttypes.InvalidRequestException, apache.airavata.api.error.ttypes.InvalidRequestException.thrift_spec), None, ),  # 1
        (2, TType.STRUCT, 'ace', (apache.airavata.api.error.ttypes.AiravataClientException, apache.airavata.api.error.ttypes.AiravataClientException.thrift_spec), None, ),  # 2
        (3, TType.STRUCT, 'ase', (apache.airavata.api.error.ttypes.AiravataSystemException, apache.airavata.api.error.ttypes.AiravataSystemException.thrift_spec), None, ),  # 3
        (4, TType.STRUCT, 'ae', (apache.airavata.api.error.ttypes.AuthorizationException, apache.airavata.api.error.ttypes.AuthorizationException.thrift_spec), None, ),  # 4
    )

    def __init__(self, success=None, ire=None, ace=None, ase=None, ae=None,):
        self.success = success
        self.ire = ire
        self.ace = ace
        self.ase = ase
        self.ae = ae

    def read(self, iprot):
        if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None:
            iprot._fast_decode(self, iprot, (self.__class__, self.thrift_spec))
            return
        iprot.readStructBegin()
        while True:
            (fname, ftype, fid) = iprot.readFieldBegin()
            if ftype == TType.STOP:
                break
            if fid == 0:
                if ftype == TType.BOOL:
                    self.success = iprot.readBool()
                else:
                    iprot.skip(ftype)
            elif fid == 1:
                if ftype == TType.STRUCT:
                    self.ire = apache.airavata.api.error.ttypes.InvalidRequestException()
                    self.ire.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 2:
                if ftype == TType.STRUCT:
                    self.ace = apache.airavata.api.error.ttypes.AiravataClientException()
                    self.ace.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 3:
                if ftype == TType.STRUCT:
                    self.ase = apache.airavata.api.error.ttypes.AiravataSystemException()
                    self.ase.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 4:
                if ftype == TType.STRUCT:
                    self.ae = apache.airavata.api.error.ttypes.AuthorizationException()
                    self.ae.read(iprot)
                else:
                    iprot.skip(ftype)
            else:
                iprot.skip(ftype)
            iprot.readFieldEnd()
        iprot.readStructEnd()

    def write(self, oprot):
        if oprot._fast_encode is not None and self.thrift_spec is not None:
            oprot.trans.write(oprot._fast_encode(self, (self.__class__, self.thrift_spec)))
            return
        oprot.writeStructBegin('updateGateway_result')
        if self.success is not None:
            oprot.writeFieldBegin('success', TType.BOOL, 0)
            oprot.writeBool(self.success)
            oprot.writeFieldEnd()
        if self.ire is not None:
            oprot.writeFieldBegin('ire', TType.STRUCT, 1)
            self.ire.write(oprot)
            oprot.writeFieldEnd()
        if self.ace is not None:
            oprot.writeFieldBegin('ace', TType.STRUCT, 2)
            self.ace.write(oprot)
            oprot.writeFieldEnd()
        if self.ase is not None:
            oprot.writeFieldBegin('ase', TType.STRUCT, 3)
            self.ase.write(oprot)
            oprot.writeFieldEnd()
        if self.ae is not None:
            oprot.writeFieldBegin('ae', TType.STRUCT, 4)
            self.ae.write(oprot)
            oprot.writeFieldEnd()
        oprot.writeFieldStop()
        oprot.writeStructEnd()

    def validate(self):
        return

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

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

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


class getGateway_args(object):
    """
    Attributes:
     - authzToken
     - gatewayId
    """

    thrift_spec = (
        None,  # 0
        (1, TType.STRUCT, 'authzToken', (apache.airavata.model.security.ttypes.AuthzToken, apache.airavata.model.security.ttypes.AuthzToken.thrift_spec), None, ),  # 1
        (2, TType.STRING, 'gatewayId', 'UTF8', None, ),  # 2
    )

    def __init__(self, authzToken=None, gatewayId=None,):
        self.authzToken = authzToken
        self.gatewayId = gatewayId

    def read(self, iprot):
        if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None:
            iprot._fast_decode(self, iprot, (self.__class__, self.thrift_spec))
            return
        iprot.readStructBegin()
        while True:
            (fname, ftype, fid) = iprot.readFieldBegin()
            if ftype == TType.STOP:
                break
            if fid == 1:
                if ftype == TType.STRUCT:
                    self.authzToken = apache.airavata.model.security.ttypes.AuthzToken()
                    self.authzToken.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 2:
                if ftype == TType.STRING:
                    self.gatewayId = iprot.readString().decode('utf-8') if sys.version_info[0] == 2 else iprot.readString()
                else:
                    iprot.skip(ftype)
            else:
                iprot.skip(ftype)
            iprot.readFieldEnd()
        iprot.readStructEnd()

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

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

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

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

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


class getGateway_result(object):
    """
    Attributes:
     - success
     - ire
     - ace
     - ase
     - ae
    """

    thrift_spec = (
        (0, TType.STRUCT, 'success', (apache.airavata.model.workspace.ttypes.Gateway, apache.airavata.model.workspace.ttypes.Gateway.thrift_spec), None, ),  # 0
        (1, TType.STRUCT, 'ire', (apache.airavata.api.error.ttypes.InvalidRequestException, apache.airavata.api.error.ttypes.InvalidRequestException.thrift_spec), None, ),  # 1
        (2, TType.STRUCT, 'ace', (apache.airavata.api.error.ttypes.AiravataClientException, apache.airavata.api.error.ttypes.AiravataClientException.thrift_spec), None, ),  # 2
        (3, TType.STRUCT, 'ase', (apache.airavata.api.error.ttypes.AiravataSystemException, apache.airavata.api.error.ttypes.AiravataSystemException.thrift_spec), None, ),  # 3
        (4, TType.STRUCT, 'ae', (apache.airavata.api.error.ttypes.AuthorizationException, apache.airavata.api.error.ttypes.AuthorizationException.thrift_spec), None, ),  # 4
    )

    def __init__(self, success=None, ire=None, ace=None, ase=None, ae=None,):
        self.success = success
        self.ire = ire
        self.ace = ace
        self.ase = ase
        self.ae = ae

    def read(self, iprot):
        if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None:
            iprot._fast_decode(self, iprot, (self.__class__, self.thrift_spec))
            return
        iprot.readStructBegin()
        while True:
            (fname, ftype, fid) = iprot.readFieldBegin()
            if ftype == TType.STOP:
                break
            if fid == 0:
                if ftype == TType.STRUCT:
                    self.success = apache.airavata.model.workspace.ttypes.Gateway()
                    self.success.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 1:
                if ftype == TType.STRUCT:
                    self.ire = apache.airavata.api.error.ttypes.InvalidRequestException()
                    self.ire.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 2:
                if ftype == TType.STRUCT:
                    self.ace = apache.airavata.api.error.ttypes.AiravataClientException()
                    self.ace.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 3:
                if ftype == TType.STRUCT:
                    self.ase = apache.airavata.api.error.ttypes.AiravataSystemException()
                    self.ase.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 4:
                if ftype == TType.STRUCT:
                    self.ae = apache.airavata.api.error.ttypes.AuthorizationException()
                    self.ae.read(iprot)
                else:
                    iprot.skip(ftype)
            else:
                iprot.skip(ftype)
            iprot.readFieldEnd()
        iprot.readStructEnd()

    def write(self, oprot):
        if oprot._fast_encode is not None and self.thrift_spec is not None:
            oprot.trans.write(oprot._fast_encode(self, (self.__class__, self.thrift_spec)))
            return
        oprot.writeStructBegin('getGateway_result')
        if self.success is not None:
            oprot.writeFieldBegin('success', TType.STRUCT, 0)
            self.success.write(oprot)
            oprot.writeFieldEnd()
        if self.ire is not None:
            oprot.writeFieldBegin('ire', TType.STRUCT, 1)
            self.ire.write(oprot)
            oprot.writeFieldEnd()
        if self.ace is not None:
            oprot.writeFieldBegin('ace', TType.STRUCT, 2)
            self.ace.write(oprot)
            oprot.writeFieldEnd()
        if self.ase is not None:
            oprot.writeFieldBegin('ase', TType.STRUCT, 3)
            self.ase.write(oprot)
            oprot.writeFieldEnd()
        if self.ae is not None:
            oprot.writeFieldBegin('ae', TType.STRUCT, 4)
            self.ae.write(oprot)
            oprot.writeFieldEnd()
        oprot.writeFieldStop()
        oprot.writeStructEnd()

    def validate(self):
        return

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

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

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


class deleteGateway_args(object):
    """
    Attributes:
     - authzToken
     - gatewayId
    """

    thrift_spec = (
        None,  # 0
        (1, TType.STRUCT, 'authzToken', (apache.airavata.model.security.ttypes.AuthzToken, apache.airavata.model.security.ttypes.AuthzToken.thrift_spec), None, ),  # 1
        (2, TType.STRING, 'gatewayId', 'UTF8', None, ),  # 2
    )

    def __init__(self, authzToken=None, gatewayId=None,):
        self.authzToken = authzToken
        self.gatewayId = gatewayId

    def read(self, iprot):
        if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None:
            iprot._fast_decode(self, iprot, (self.__class__, self.thrift_spec))
            return
        iprot.readStructBegin()
        while True:
            (fname, ftype, fid) = iprot.readFieldBegin()
            if ftype == TType.STOP:
                break
            if fid == 1:
                if ftype == TType.STRUCT:
                    self.authzToken = apache.airavata.model.security.ttypes.AuthzToken()
                    self.authzToken.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 2:
                if ftype == TType.STRING:
                    self.gatewayId = iprot.readString().decode('utf-8') if sys.version_info[0] == 2 else iprot.readString()
                else:
                    iprot.skip(ftype)
            else:
                iprot.skip(ftype)
            iprot.readFieldEnd()
        iprot.readStructEnd()

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

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

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

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

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


class deleteGateway_result(object):
    """
    Attributes:
     - success
     - ire
     - ace
     - ase
     - ae
    """

    thrift_spec = (
        (0, TType.BOOL, 'success', None, None, ),  # 0
        (1, TType.STRUCT, 'ire', (apache.airavata.api.error.ttypes.InvalidRequestException, apache.airavata.api.error.ttypes.InvalidRequestException.thrift_spec), None, ),  # 1
        (2, TType.STRUCT, 'ace', (apache.airavata.api.error.ttypes.AiravataClientException, apache.airavata.api.error.ttypes.AiravataClientException.thrift_spec), None, ),  # 2
        (3, TType.STRUCT, 'ase', (apache.airavata.api.error.ttypes.AiravataSystemException, apache.airavata.api.error.ttypes.AiravataSystemException.thrift_spec), None, ),  # 3
        (4, TType.STRUCT, 'ae', (apache.airavata.api.error.ttypes.AuthorizationException, apache.airavata.api.error.ttypes.AuthorizationException.thrift_spec), None, ),  # 4
    )

    def __init__(self, success=None, ire=None, ace=None, ase=None, ae=None,):
        self.success = success
        self.ire = ire
        self.ace = ace
        self.ase = ase
        self.ae = ae

    def read(self, iprot):
        if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None:
            iprot._fast_decode(self, iprot, (self.__class__, self.thrift_spec))
            return
        iprot.readStructBegin()
        while True:
            (fname, ftype, fid) = iprot.readFieldBegin()
            if ftype == TType.STOP:
                break
            if fid == 0:
                if ftype == TType.BOOL:
                    self.success = iprot.readBool()
                else:
                    iprot.skip(ftype)
            elif fid == 1:
                if ftype == TType.STRUCT:
                    self.ire = apache.airavata.api.error.ttypes.InvalidRequestException()
                    self.ire.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 2:
                if ftype == TType.STRUCT:
                    self.ace = apache.airavata.api.error.ttypes.AiravataClientException()
                    self.ace.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 3:
                if ftype == TType.STRUCT:
                    self.ase = apache.airavata.api.error.ttypes.AiravataSystemException()
                    self.ase.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 4:
                if ftype == TType.STRUCT:
                    self.ae = apache.airavata.api.error.ttypes.AuthorizationException()
                    self.ae.read(iprot)
                else:
                    iprot.skip(ftype)
            else:
                iprot.skip(ftype)
            iprot.readFieldEnd()
        iprot.readStructEnd()

    def write(self, oprot):
        if oprot._fast_encode is not None and self.thrift_spec is not None:
            oprot.trans.write(oprot._fast_encode(self, (self.__class__, self.thrift_spec)))
            return
        oprot.writeStructBegin('deleteGateway_result')
        if self.success is not None:
            oprot.writeFieldBegin('success', TType.BOOL, 0)
            oprot.writeBool(self.success)
            oprot.writeFieldEnd()
        if self.ire is not None:
            oprot.writeFieldBegin('ire', TType.STRUCT, 1)
            self.ire.write(oprot)
            oprot.writeFieldEnd()
        if self.ace is not None:
            oprot.writeFieldBegin('ace', TType.STRUCT, 2)
            self.ace.write(oprot)
            oprot.writeFieldEnd()
        if self.ase is not None:
            oprot.writeFieldBegin('ase', TType.STRUCT, 3)
            self.ase.write(oprot)
            oprot.writeFieldEnd()
        if self.ae is not None:
            oprot.writeFieldBegin('ae', TType.STRUCT, 4)
            self.ae.write(oprot)
            oprot.writeFieldEnd()
        oprot.writeFieldStop()
        oprot.writeStructEnd()

    def validate(self):
        return

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

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

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


class getAllGateways_args(object):
    """
    Attributes:
     - authzToken
    """

    thrift_spec = (
        None,  # 0
        (1, TType.STRUCT, 'authzToken', (apache.airavata.model.security.ttypes.AuthzToken, apache.airavata.model.security.ttypes.AuthzToken.thrift_spec), None, ),  # 1
    )

    def __init__(self, authzToken=None,):
        self.authzToken = authzToken

    def read(self, iprot):
        if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None:
            iprot._fast_decode(self, iprot, (self.__class__, self.thrift_spec))
            return
        iprot.readStructBegin()
        while True:
            (fname, ftype, fid) = iprot.readFieldBegin()
            if ftype == TType.STOP:
                break
            if fid == 1:
                if ftype == TType.STRUCT:
                    self.authzToken = apache.airavata.model.security.ttypes.AuthzToken()
                    self.authzToken.read(iprot)
                else:
                    iprot.skip(ftype)
            else:
                iprot.skip(ftype)
            iprot.readFieldEnd()
        iprot.readStructEnd()

    def write(self, oprot):
        if oprot._fast_encode is not None and self.thrift_spec is not None:
            oprot.trans.write(oprot._fast_encode(self, (self.__class__, self.thrift_spec)))
            return
        oprot.writeStructBegin('getAllGateways_args')
        if self.authzToken is not None:
            oprot.writeFieldBegin('authzToken', TType.STRUCT, 1)
            self.authzToken.write(oprot)
            oprot.writeFieldEnd()
        oprot.writeFieldStop()
        oprot.writeStructEnd()

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

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

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

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


class getAllGateways_result(object):
    """
    Attributes:
     - success
     - ire
     - ace
     - ase
     - ae
    """

    thrift_spec = (
        (0, TType.LIST, 'success', (TType.STRUCT, (apache.airavata.model.workspace.ttypes.Gateway, apache.airavata.model.workspace.ttypes.Gateway.thrift_spec), False), None, ),  # 0
        (1, TType.STRUCT, 'ire', (apache.airavata.api.error.ttypes.InvalidRequestException, apache.airavata.api.error.ttypes.InvalidRequestException.thrift_spec), None, ),  # 1
        (2, TType.STRUCT, 'ace', (apache.airavata.api.error.ttypes.AiravataClientException, apache.airavata.api.error.ttypes.AiravataClientException.thrift_spec), None, ),  # 2
        (3, TType.STRUCT, 'ase', (apache.airavata.api.error.ttypes.AiravataSystemException, apache.airavata.api.error.ttypes.AiravataSystemException.thrift_spec), None, ),  # 3
        (4, TType.STRUCT, 'ae', (apache.airavata.api.error.ttypes.AuthorizationException, apache.airavata.api.error.ttypes.AuthorizationException.thrift_spec), None, ),  # 4
    )

    def __init__(self, success=None, ire=None, ace=None, ase=None, ae=None,):
        self.success = success
        self.ire = ire
        self.ace = ace
        self.ase = ase
        self.ae = ae

    def read(self, iprot):
        if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None:
            iprot._fast_decode(self, iprot, (self.__class__, self.thrift_spec))
            return
        iprot.readStructBegin()
        while True:
            (fname, ftype, fid) = iprot.readFieldBegin()
            if ftype == TType.STOP:
                break
            if fid == 0:
                if ftype == TType.LIST:
                    self.success = []
                    (_etype10, _size7) = iprot.readListBegin()
                    for _i11 in range(_size7):
                        _elem12 = apache.airavata.model.workspace.ttypes.Gateway()
                        _elem12.read(iprot)
                        self.success.append(_elem12)
                    iprot.readListEnd()
                else:
                    iprot.skip(ftype)
            elif fid == 1:
                if ftype == TType.STRUCT:
                    self.ire = apache.airavata.api.error.ttypes.InvalidRequestException()
                    self.ire.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 2:
                if ftype == TType.STRUCT:
                    self.ace = apache.airavata.api.error.ttypes.AiravataClientException()
                    self.ace.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 3:
                if ftype == TType.STRUCT:
                    self.ase = apache.airavata.api.error.ttypes.AiravataSystemException()
                    self.ase.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 4:
                if ftype == TType.STRUCT:
                    self.ae = apache.airavata.api.error.ttypes.AuthorizationException()
                    self.ae.read(iprot)
                else:
                    iprot.skip(ftype)
            else:
                iprot.skip(ftype)
            iprot.readFieldEnd()
        iprot.readStructEnd()

    def write(self, oprot):
        if oprot._fast_encode is not None and self.thrift_spec is not None:
            oprot.trans.write(oprot._fast_encode(self, (self.__class__, self.thrift_spec)))
            return
        oprot.writeStructBegin('getAllGateways_result')
        if self.success is not None:
            oprot.writeFieldBegin('success', TType.LIST, 0)
            oprot.writeListBegin(TType.STRUCT, len(self.success))
            for iter13 in self.success:
                iter13.write(oprot)
            oprot.writeListEnd()
            oprot.writeFieldEnd()
        if self.ire is not None:
            oprot.writeFieldBegin('ire', TType.STRUCT, 1)
            self.ire.write(oprot)
            oprot.writeFieldEnd()
        if self.ace is not None:
            oprot.writeFieldBegin('ace', TType.STRUCT, 2)
            self.ace.write(oprot)
            oprot.writeFieldEnd()
        if self.ase is not None:
            oprot.writeFieldBegin('ase', TType.STRUCT, 3)
            self.ase.write(oprot)
            oprot.writeFieldEnd()
        if self.ae is not None:
            oprot.writeFieldBegin('ae', TType.STRUCT, 4)
            self.ae.write(oprot)
            oprot.writeFieldEnd()
        oprot.writeFieldStop()
        oprot.writeStructEnd()

    def validate(self):
        return

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

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

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


class isGatewayExist_args(object):
    """
    Attributes:
     - authzToken
     - gatewayId
    """

    thrift_spec = (
        None,  # 0
        (1, TType.STRUCT, 'authzToken', (apache.airavata.model.security.ttypes.AuthzToken, apache.airavata.model.security.ttypes.AuthzToken.thrift_spec), None, ),  # 1
        (2, TType.STRING, 'gatewayId', 'UTF8', None, ),  # 2
    )

    def __init__(self, authzToken=None, gatewayId=None,):
        self.authzToken = authzToken
        self.gatewayId = gatewayId

    def read(self, iprot):
        if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None:
            iprot._fast_decode(self, iprot, (self.__class__, self.thrift_spec))
            return
        iprot.readStructBegin()
        while True:
            (fname, ftype, fid) = iprot.readFieldBegin()
            if ftype == TType.STOP:
                break
            if fid == 1:
                if ftype == TType.STRUCT:
                    self.authzToken = apache.airavata.model.security.ttypes.AuthzToken()
                    self.authzToken.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 2:
                if ftype == TType.STRING:
                    self.gatewayId = iprot.readString().decode('utf-8') if sys.version_info[0] == 2 else iprot.readString()
                else:
                    iprot.skip(ftype)
            else:
                iprot.skip(ftype)
            iprot.readFieldEnd()
        iprot.readStructEnd()

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

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

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

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

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


class isGatewayExist_result(object):
    """
    Attributes:
     - success
     - ire
     - ace
     - ase
     - ae
    """

    thrift_spec = (
        (0, TType.BOOL, 'success', None, None, ),  # 0
        (1, TType.STRUCT, 'ire', (apache.airavata.api.error.ttypes.InvalidRequestException, apache.airavata.api.error.ttypes.InvalidRequestException.thrift_spec), None, ),  # 1
        (2, TType.STRUCT, 'ace', (apache.airavata.api.error.ttypes.AiravataClientException, apache.airavata.api.error.ttypes.AiravataClientException.thrift_spec), None, ),  # 2
        (3, TType.STRUCT, 'ase', (apache.airavata.api.error.ttypes.AiravataSystemException, apache.airavata.api.error.ttypes.AiravataSystemException.thrift_spec), None, ),  # 3
        (4, TType.STRUCT, 'ae', (apache.airavata.api.error.ttypes.AuthorizationException, apache.airavata.api.error.ttypes.AuthorizationException.thrift_spec), None, ),  # 4
    )

    def __init__(self, success=None, ire=None, ace=None, ase=None, ae=None,):
        self.success = success
        self.ire = ire
        self.ace = ace
        self.ase = ase
        self.ae = ae

    def read(self, iprot):
        if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None:
            iprot._fast_decode(self, iprot, (self.__class__, self.thrift_spec))
            return
        iprot.readStructBegin()
        while True:
            (fname, ftype, fid) = iprot.readFieldBegin()
            if ftype == TType.STOP:
                break
            if fid == 0:
                if ftype == TType.BOOL:
                    self.success = iprot.readBool()
                else:
                    iprot.skip(ftype)
            elif fid == 1:
                if ftype == TType.STRUCT:
                    self.ire = apache.airavata.api.error.ttypes.InvalidRequestException()
                    self.ire.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 2:
                if ftype == TType.STRUCT:
                    self.ace = apache.airavata.api.error.ttypes.AiravataClientException()
                    self.ace.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 3:
                if ftype == TType.STRUCT:
                    self.ase = apache.airavata.api.error.ttypes.AiravataSystemException()
                    self.ase.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 4:
                if ftype == TType.STRUCT:
                    self.ae = apache.airavata.api.error.ttypes.AuthorizationException()
                    self.ae.read(iprot)
                else:
                    iprot.skip(ftype)
            else:
                iprot.skip(ftype)
            iprot.readFieldEnd()
        iprot.readStructEnd()

    def write(self, oprot):
        if oprot._fast_encode is not None and self.thrift_spec is not None:
            oprot.trans.write(oprot._fast_encode(self, (self.__class__, self.thrift_spec)))
            return
        oprot.writeStructBegin('isGatewayExist_result')
        if self.success is not None:
            oprot.writeFieldBegin('success', TType.BOOL, 0)
            oprot.writeBool(self.success)
            oprot.writeFieldEnd()
        if self.ire is not None:
            oprot.writeFieldBegin('ire', TType.STRUCT, 1)
            self.ire.write(oprot)
            oprot.writeFieldEnd()
        if self.ace is not None:
            oprot.writeFieldBegin('ace', TType.STRUCT, 2)
            self.ace.write(oprot)
            oprot.writeFieldEnd()
        if self.ase is not None:
            oprot.writeFieldBegin('ase', TType.STRUCT, 3)
            self.ase.write(oprot)
            oprot.writeFieldEnd()
        if self.ae is not None:
            oprot.writeFieldBegin('ae', TType.STRUCT, 4)
            self.ae.write(oprot)
            oprot.writeFieldEnd()
        oprot.writeFieldStop()
        oprot.writeStructEnd()

    def validate(self):
        return

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

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

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


class createNotification_args(object):
    """
    Attributes:
     - authzToken
     - notification
    """

    thrift_spec = (
        None,  # 0
        (1, TType.STRUCT, 'authzToken', (apache.airavata.model.security.ttypes.AuthzToken, apache.airavata.model.security.ttypes.AuthzToken.thrift_spec), None, ),  # 1
        (2, TType.STRUCT, 'notification', (apache.airavata.model.workspace.ttypes.Notification, apache.airavata.model.workspace.ttypes.Notification.thrift_spec), None, ),  # 2
    )

    def __init__(self, authzToken=None, notification=None,):
        self.authzToken = authzToken
        self.notification = notification

    def read(self, iprot):
        if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None:
            iprot._fast_decode(self, iprot, (self.__class__, self.thrift_spec))
            return
        iprot.readStructBegin()
        while True:
            (fname, ftype, fid) = iprot.readFieldBegin()
            if ftype == TType.STOP:
                break
            if fid == 1:
                if ftype == TType.STRUCT:
                    self.authzToken = apache.airavata.model.security.ttypes.AuthzToken()
                    self.authzToken.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 2:
                if ftype == TType.STRUCT:
                    self.notification = apache.airavata.model.workspace.ttypes.Notification()
                    self.notification.read(iprot)
                else:
                    iprot.skip(ftype)
            else:
                iprot.skip(ftype)
            iprot.readFieldEnd()
        iprot.readStructEnd()

    def write(self, oprot):
        if oprot._fast_encode is not None and self.thrift_spec is not None:
            oprot.trans.write(oprot._fast_encode(self, (self.__class__, self.thrift_spec)))
            return
        oprot.writeStructBegin('createNotification_args')
        if self.authzToken is not None:
            oprot.writeFieldBegin('authzToken', TType.STRUCT, 1)
            self.authzToken.write(oprot)
            oprot.writeFieldEnd()
        if self.notification is not None:
            oprot.writeFieldBegin('notification', TType.STRUCT, 2)
            self.notification.write(oprot)
            oprot.writeFieldEnd()
        oprot.writeFieldStop()
        oprot.writeStructEnd()

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

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

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

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


class createNotification_result(object):
    """
    Attributes:
     - success
     - ire
     - ace
     - ase
     - ae
    """

    thrift_spec = (
        (0, TType.STRING, 'success', 'UTF8', None, ),  # 0
        (1, TType.STRUCT, 'ire', (apache.airavata.api.error.ttypes.InvalidRequestException, apache.airavata.api.error.ttypes.InvalidRequestException.thrift_spec), None, ),  # 1
        (2, TType.STRUCT, 'ace', (apache.airavata.api.error.ttypes.AiravataClientException, apache.airavata.api.error.ttypes.AiravataClientException.thrift_spec), None, ),  # 2
        (3, TType.STRUCT, 'ase', (apache.airavata.api.error.ttypes.AiravataSystemException, apache.airavata.api.error.ttypes.AiravataSystemException.thrift_spec), None, ),  # 3
        (4, TType.STRUCT, 'ae', (apache.airavata.api.error.ttypes.AuthorizationException, apache.airavata.api.error.ttypes.AuthorizationException.thrift_spec), None, ),  # 4
    )

    def __init__(self, success=None, ire=None, ace=None, ase=None, ae=None,):
        self.success = success
        self.ire = ire
        self.ace = ace
        self.ase = ase
        self.ae = ae

    def read(self, iprot):
        if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None:
            iprot._fast_decode(self, iprot, (self.__class__, self.thrift_spec))
            return
        iprot.readStructBegin()
        while True:
            (fname, ftype, fid) = iprot.readFieldBegin()
            if ftype == TType.STOP:
                break
            if fid == 0:
                if ftype == TType.STRING:
                    self.success = iprot.readString().decode('utf-8') if sys.version_info[0] == 2 else iprot.readString()
                else:
                    iprot.skip(ftype)
            elif fid == 1:
                if ftype == TType.STRUCT:
                    self.ire = apache.airavata.api.error.ttypes.InvalidRequestException()
                    self.ire.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 2:
                if ftype == TType.STRUCT:
                    self.ace = apache.airavata.api.error.ttypes.AiravataClientException()
                    self.ace.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 3:
                if ftype == TType.STRUCT:
                    self.ase = apache.airavata.api.error.ttypes.AiravataSystemException()
                    self.ase.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 4:
                if ftype == TType.STRUCT:
                    self.ae = apache.airavata.api.error.ttypes.AuthorizationException()
                    self.ae.read(iprot)
                else:
                    iprot.skip(ftype)
            else:
                iprot.skip(ftype)
            iprot.readFieldEnd()
        iprot.readStructEnd()

    def write(self, oprot):
        if oprot._fast_encode is not None and self.thrift_spec is not None:
            oprot.trans.write(oprot._fast_encode(self, (self.__class__, self.thrift_spec)))
            return
        oprot.writeStructBegin('createNotification_result')
        if self.success is not None:
            oprot.writeFieldBegin('success', TType.STRING, 0)
            oprot.writeString(self.success.encode('utf-8') if sys.version_info[0] == 2 else self.success)
            oprot.writeFieldEnd()
        if self.ire is not None:
            oprot.writeFieldBegin('ire', TType.STRUCT, 1)
            self.ire.write(oprot)
            oprot.writeFieldEnd()
        if self.ace is not None:
            oprot.writeFieldBegin('ace', TType.STRUCT, 2)
            self.ace.write(oprot)
            oprot.writeFieldEnd()
        if self.ase is not None:
            oprot.writeFieldBegin('ase', TType.STRUCT, 3)
            self.ase.write(oprot)
            oprot.writeFieldEnd()
        if self.ae is not None:
            oprot.writeFieldBegin('ae', TType.STRUCT, 4)
            self.ae.write(oprot)
            oprot.writeFieldEnd()
        oprot.writeFieldStop()
        oprot.writeStructEnd()

    def validate(self):
        return

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

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

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


class updateNotification_args(object):
    """
    Attributes:
     - authzToken
     - notification
    """

    thrift_spec = (
        None,  # 0
        (1, TType.STRUCT, 'authzToken', (apache.airavata.model.security.ttypes.AuthzToken, apache.airavata.model.security.ttypes.AuthzToken.thrift_spec), None, ),  # 1
        (2, TType.STRUCT, 'notification', (apache.airavata.model.workspace.ttypes.Notification, apache.airavata.model.workspace.ttypes.Notification.thrift_spec), None, ),  # 2
    )

    def __init__(self, authzToken=None, notification=None,):
        self.authzToken = authzToken
        self.notification = notification

    def read(self, iprot):
        if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None:
            iprot._fast_decode(self, iprot, (self.__class__, self.thrift_spec))
            return
        iprot.readStructBegin()
        while True:
            (fname, ftype, fid) = iprot.readFieldBegin()
            if ftype == TType.STOP:
                break
            if fid == 1:
                if ftype == TType.STRUCT:
                    self.authzToken = apache.airavata.model.security.ttypes.AuthzToken()
                    self.authzToken.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 2:
                if ftype == TType.STRUCT:
                    self.notification = apache.airavata.model.workspace.ttypes.Notification()
                    self.notification.read(iprot)
                else:
                    iprot.skip(ftype)
            else:
                iprot.skip(ftype)
            iprot.readFieldEnd()
        iprot.readStructEnd()

    def write(self, oprot):
        if oprot._fast_encode is not None and self.thrift_spec is not None:
            oprot.trans.write(oprot._fast_encode(self, (self.__class__, self.thrift_spec)))
            return
        oprot.writeStructBegin('updateNotification_args')
        if self.authzToken is not None:
            oprot.writeFieldBegin('authzToken', TType.STRUCT, 1)
            self.authzToken.write(oprot)
            oprot.writeFieldEnd()
        if self.notification is not None:
            oprot.writeFieldBegin('notification', TType.STRUCT, 2)
            self.notification.write(oprot)
            oprot.writeFieldEnd()
        oprot.writeFieldStop()
        oprot.writeStructEnd()

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

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

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

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


class updateNotification_result(object):
    """
    Attributes:
     - success
     - ire
     - ace
     - ase
     - ae
    """

    thrift_spec = (
        (0, TType.BOOL, 'success', None, None, ),  # 0
        (1, TType.STRUCT, 'ire', (apache.airavata.api.error.ttypes.InvalidRequestException, apache.airavata.api.error.ttypes.InvalidRequestException.thrift_spec), None, ),  # 1
        (2, TType.STRUCT, 'ace', (apache.airavata.api.error.ttypes.AiravataClientException, apache.airavata.api.error.ttypes.AiravataClientException.thrift_spec), None, ),  # 2
        (3, TType.STRUCT, 'ase', (apache.airavata.api.error.ttypes.AiravataSystemException, apache.airavata.api.error.ttypes.AiravataSystemException.thrift_spec), None, ),  # 3
        (4, TType.STRUCT, 'ae', (apache.airavata.api.error.ttypes.AuthorizationException, apache.airavata.api.error.ttypes.AuthorizationException.thrift_spec), None, ),  # 4
    )

    def __init__(self, success=None, ire=None, ace=None, ase=None, ae=None,):
        self.success = success
        self.ire = ire
        self.ace = ace
        self.ase = ase
        self.ae = ae

    def read(self, iprot):
        if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None:
            iprot._fast_decode(self, iprot, (self.__class__, self.thrift_spec))
            return
        iprot.readStructBegin()
        while True:
            (fname, ftype, fid) = iprot.readFieldBegin()
            if ftype == TType.STOP:
                break
            if fid == 0:
                if ftype == TType.BOOL:
                    self.success = iprot.readBool()
                else:
                    iprot.skip(ftype)
            elif fid == 1:
                if ftype == TType.STRUCT:
                    self.ire = apache.airavata.api.error.ttypes.InvalidRequestException()
                    self.ire.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 2:
                if ftype == TType.STRUCT:
                    self.ace = apache.airavata.api.error.ttypes.AiravataClientException()
                    self.ace.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 3:
                if ftype == TType.STRUCT:
                    self.ase = apache.airavata.api.error.ttypes.AiravataSystemException()
                    self.ase.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 4:
                if ftype == TType.STRUCT:
                    self.ae = apache.airavata.api.error.ttypes.AuthorizationException()
                    self.ae.read(iprot)
                else:
                    iprot.skip(ftype)
            else:
                iprot.skip(ftype)
            iprot.readFieldEnd()
        iprot.readStructEnd()

    def write(self, oprot):
        if oprot._fast_encode is not None and self.thrift_spec is not None:
            oprot.trans.write(oprot._fast_encode(self, (self.__class__, self.thrift_spec)))
            return
        oprot.writeStructBegin('updateNotification_result')
        if self.success is not None:
            oprot.writeFieldBegin('success', TType.BOOL, 0)
            oprot.writeBool(self.success)
            oprot.writeFieldEnd()
        if self.ire is not None:
            oprot.writeFieldBegin('ire', TType.STRUCT, 1)
            self.ire.write(oprot)
            oprot.writeFieldEnd()
        if self.ace is not None:
            oprot.writeFieldBegin('ace', TType.STRUCT, 2)
            self.ace.write(oprot)
            oprot.writeFieldEnd()
        if self.ase is not None:
            oprot.writeFieldBegin('ase', TType.STRUCT, 3)
            self.ase.write(oprot)
            oprot.writeFieldEnd()
        if self.ae is not None:
            oprot.writeFieldBegin('ae', TType.STRUCT, 4)
            self.ae.write(oprot)
            oprot.writeFieldEnd()
        oprot.writeFieldStop()
        oprot.writeStructEnd()

    def validate(self):
        return

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

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

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


class deleteNotification_args(object):
    """
    Attributes:
     - authzToken
     - gatewayId
     - notificationId
    """

    thrift_spec = (
        None,  # 0
        (1, TType.STRUCT, 'authzToken', (apache.airavata.model.security.ttypes.AuthzToken, apache.airavata.model.security.ttypes.AuthzToken.thrift_spec), None, ),  # 1
        (2, TType.STRING, 'gatewayId', 'UTF8', None, ),  # 2
        (3, TType.STRING, 'notificationId', 'UTF8', None, ),  # 3
    )

    def __init__(self, authzToken=None, gatewayId=None, notificationId=None,):
        self.authzToken = authzToken
        self.gatewayId = gatewayId
        self.notificationId = notificationId

    def read(self, iprot):
        if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None:
            iprot._fast_decode(self, iprot, (self.__class__, self.thrift_spec))
            return
        iprot.readStructBegin()
        while True:
            (fname, ftype, fid) = iprot.readFieldBegin()
            if ftype == TType.STOP:
                break
            if fid == 1:
                if ftype == TType.STRUCT:
                    self.authzToken = apache.airavata.model.security.ttypes.AuthzToken()
                    self.authzToken.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 2:
                if ftype == TType.STRING:
                    self.gatewayId = iprot.readString().decode('utf-8') if sys.version_info[0] == 2 else iprot.readString()
                else:
                    iprot.skip(ftype)
            elif fid == 3:
                if ftype == TType.STRING:
                    self.notificationId = iprot.readString().decode('utf-8') if sys.version_info[0] == 2 else iprot.readString()
                else:
                    iprot.skip(ftype)
            else:
                iprot.skip(ftype)
            iprot.readFieldEnd()
        iprot.readStructEnd()

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

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

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

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

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


class deleteNotification_result(object):
    """
    Attributes:
     - success
     - ire
     - ace
     - ase
     - ae
    """

    thrift_spec = (
        (0, TType.BOOL, 'success', None, None, ),  # 0
        (1, TType.STRUCT, 'ire', (apache.airavata.api.error.ttypes.InvalidRequestException, apache.airavata.api.error.ttypes.InvalidRequestException.thrift_spec), None, ),  # 1
        (2, TType.STRUCT, 'ace', (apache.airavata.api.error.ttypes.AiravataClientException, apache.airavata.api.error.ttypes.AiravataClientException.thrift_spec), None, ),  # 2
        (3, TType.STRUCT, 'ase', (apache.airavata.api.error.ttypes.AiravataSystemException, apache.airavata.api.error.ttypes.AiravataSystemException.thrift_spec), None, ),  # 3
        (4, TType.STRUCT, 'ae', (apache.airavata.api.error.ttypes.AuthorizationException, apache.airavata.api.error.ttypes.AuthorizationException.thrift_spec), None, ),  # 4
    )

    def __init__(self, success=None, ire=None, ace=None, ase=None, ae=None,):
        self.success = success
        self.ire = ire
        self.ace = ace
        self.ase = ase
        self.ae = ae

    def read(self, iprot):
        if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None:
            iprot._fast_decode(self, iprot, (self.__class__, self.thrift_spec))
            return
        iprot.readStructBegin()
        while True:
            (fname, ftype, fid) = iprot.readFieldBegin()
            if ftype == TType.STOP:
                break
            if fid == 0:
                if ftype == TType.BOOL:
                    self.success = iprot.readBool()
                else:
                    iprot.skip(ftype)
            elif fid == 1:
                if ftype == TType.STRUCT:
                    self.ire = apache.airavata.api.error.ttypes.InvalidRequestException()
                    self.ire.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 2:
                if ftype == TType.STRUCT:
                    self.ace = apache.airavata.api.error.ttypes.AiravataClientException()
                    self.ace.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 3:
                if ftype == TType.STRUCT:
                    self.ase = apache.airavata.api.error.ttypes.AiravataSystemException()
                    self.ase.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 4:
                if ftype == TType.STRUCT:
                    self.ae = apache.airavata.api.error.ttypes.AuthorizationException()
                    self.ae.read(iprot)
                else:
                    iprot.skip(ftype)
            else:
                iprot.skip(ftype)
            iprot.readFieldEnd()
        iprot.readStructEnd()

    def write(self, oprot):
        if oprot._fast_encode is not None and self.thrift_spec is not None:
            oprot.trans.write(oprot._fast_encode(self, (self.__class__, self.thrift_spec)))
            return
        oprot.writeStructBegin('deleteNotification_result')
        if self.success is not None:
            oprot.writeFieldBegin('success', TType.BOOL, 0)
            oprot.writeBool(self.success)
            oprot.writeFieldEnd()
        if self.ire is not None:
            oprot.writeFieldBegin('ire', TType.STRUCT, 1)
            self.ire.write(oprot)
            oprot.writeFieldEnd()
        if self.ace is not None:
            oprot.writeFieldBegin('ace', TType.STRUCT, 2)
            self.ace.write(oprot)
            oprot.writeFieldEnd()
        if self.ase is not None:
            oprot.writeFieldBegin('ase', TType.STRUCT, 3)
            self.ase.write(oprot)
            oprot.writeFieldEnd()
        if self.ae is not None:
            oprot.writeFieldBegin('ae', TType.STRUCT, 4)
            self.ae.write(oprot)
            oprot.writeFieldEnd()
        oprot.writeFieldStop()
        oprot.writeStructEnd()

    def validate(self):
        return

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

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

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


class getNotification_args(object):
    """
    Attributes:
     - authzToken
     - gatewayId
     - notificationId
    """

    thrift_spec = (
        None,  # 0
        (1, TType.STRUCT, 'authzToken', (apache.airavata.model.security.ttypes.AuthzToken, apache.airavata.model.security.ttypes.AuthzToken.thrift_spec), None, ),  # 1
        (2, TType.STRING, 'gatewayId', 'UTF8', None, ),  # 2
        (3, TType.STRING, 'notificationId', 'UTF8', None, ),  # 3
    )

    def __init__(self, authzToken=None, gatewayId=None, notificationId=None,):
        self.authzToken = authzToken
        self.gatewayId = gatewayId
        self.notificationId = notificationId

    def read(self, iprot):
        if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None:
            iprot._fast_decode(self, iprot, (self.__class__, self.thrift_spec))
            return
        iprot.readStructBegin()
        while True:
            (fname, ftype, fid) = iprot.readFieldBegin()
            if ftype == TType.STOP:
                break
            if fid == 1:
                if ftype == TType.STRUCT:
                    self.authzToken = apache.airavata.model.security.ttypes.AuthzToken()
                    self.authzToken.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 2:
                if ftype == TType.STRING:
                    self.gatewayId = iprot.readString().decode('utf-8') if sys.version_info[0] == 2 else iprot.readString()
                else:
                    iprot.skip(ftype)
            elif fid == 3:
                if ftype == TType.STRING:
                    self.notificationId = iprot.readString().decode('utf-8') if sys.version_info[0] == 2 else iprot.readString()
                else:
                    iprot.skip(ftype)
            else:
                iprot.skip(ftype)
            iprot.readFieldEnd()
        iprot.readStructEnd()

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

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

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

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

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


class getNotification_result(object):
    """
    Attributes:
     - success
     - ire
     - ace
     - ase
     - ae
    """

    thrift_spec = (
        (0, TType.STRUCT, 'success', (apache.airavata.model.workspace.ttypes.Notification, apache.airavata.model.workspace.ttypes.Notification.thrift_spec), None, ),  # 0
        (1, TType.STRUCT, 'ire', (apache.airavata.api.error.ttypes.InvalidRequestException, apache.airavata.api.error.ttypes.InvalidRequestException.thrift_spec), None, ),  # 1
        (2, TType.STRUCT, 'ace', (apache.airavata.api.error.ttypes.AiravataClientException, apache.airavata.api.error.ttypes.AiravataClientException.thrift_spec), None, ),  # 2
        (3, TType.STRUCT, 'ase', (apache.airavata.api.error.ttypes.AiravataSystemException, apache.airavata.api.error.ttypes.AiravataSystemException.thrift_spec), None, ),  # 3
        (4, TType.STRUCT, 'ae', (apache.airavata.api.error.ttypes.AuthorizationException, apache.airavata.api.error.ttypes.AuthorizationException.thrift_spec), None, ),  # 4
    )

    def __init__(self, success=None, ire=None, ace=None, ase=None, ae=None,):
        self.success = success
        self.ire = ire
        self.ace = ace
        self.ase = ase
        self.ae = ae

    def read(self, iprot):
        if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None:
            iprot._fast_decode(self, iprot, (self.__class__, self.thrift_spec))
            return
        iprot.readStructBegin()
        while True:
            (fname, ftype, fid) = iprot.readFieldBegin()
            if ftype == TType.STOP:
                break
            if fid == 0:
                if ftype == TType.STRUCT:
                    self.success = apache.airavata.model.workspace.ttypes.Notification()
                    self.success.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 1:
                if ftype == TType.STRUCT:
                    self.ire = apache.airavata.api.error.ttypes.InvalidRequestException()
                    self.ire.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 2:
                if ftype == TType.STRUCT:
                    self.ace = apache.airavata.api.error.ttypes.AiravataClientException()
                    self.ace.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 3:
                if ftype == TType.STRUCT:
                    self.ase = apache.airavata.api.error.ttypes.AiravataSystemException()
                    self.ase.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 4:
                if ftype == TType.STRUCT:
                    self.ae = apache.airavata.api.error.ttypes.AuthorizationException()
                    self.ae.read(iprot)
                else:
                    iprot.skip(ftype)
            else:
                iprot.skip(ftype)
            iprot.readFieldEnd()
        iprot.readStructEnd()

    def write(self, oprot):
        if oprot._fast_encode is not None and self.thrift_spec is not None:
            oprot.trans.write(oprot._fast_encode(self, (self.__class__, self.thrift_spec)))
            return
        oprot.writeStructBegin('getNotification_result')
        if self.success is not None:
            oprot.writeFieldBegin('success', TType.STRUCT, 0)
            self.success.write(oprot)
            oprot.writeFieldEnd()
        if self.ire is not None:
            oprot.writeFieldBegin('ire', TType.STRUCT, 1)
            self.ire.write(oprot)
            oprot.writeFieldEnd()
        if self.ace is not None:
            oprot.writeFieldBegin('ace', TType.STRUCT, 2)
            self.ace.write(oprot)
            oprot.writeFieldEnd()
        if self.ase is not None:
            oprot.writeFieldBegin('ase', TType.STRUCT, 3)
            self.ase.write(oprot)
            oprot.writeFieldEnd()
        if self.ae is not None:
            oprot.writeFieldBegin('ae', TType.STRUCT, 4)
            self.ae.write(oprot)
            oprot.writeFieldEnd()
        oprot.writeFieldStop()
        oprot.writeStructEnd()

    def validate(self):
        return

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

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

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


class getAllNotifications_args(object):
    """
    Attributes:
     - authzToken
     - gatewayId
    """

    thrift_spec = (
        None,  # 0
        (1, TType.STRUCT, 'authzToken', (apache.airavata.model.security.ttypes.AuthzToken, apache.airavata.model.security.ttypes.AuthzToken.thrift_spec), None, ),  # 1
        (2, TType.STRING, 'gatewayId', 'UTF8', None, ),  # 2
    )

    def __init__(self, authzToken=None, gatewayId=None,):
        self.authzToken = authzToken
        self.gatewayId = gatewayId

    def read(self, iprot):
        if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None:
            iprot._fast_decode(self, iprot, (self.__class__, self.thrift_spec))
            return
        iprot.readStructBegin()
        while True:
            (fname, ftype, fid) = iprot.readFieldBegin()
            if ftype == TType.STOP:
                break
            if fid == 1:
                if ftype == TType.STRUCT:
                    self.authzToken = apache.airavata.model.security.ttypes.AuthzToken()
                    self.authzToken.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 2:
                if ftype == TType.STRING:
                    self.gatewayId = iprot.readString().decode('utf-8') if sys.version_info[0] == 2 else iprot.readString()
                else:
                    iprot.skip(ftype)
            else:
                iprot.skip(ftype)
            iprot.readFieldEnd()
        iprot.readStructEnd()

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

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

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

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

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


class getAllNotifications_result(object):
    """
    Attributes:
     - success
     - ire
     - ace
     - ase
     - ae
    """

    thrift_spec = (
        (0, TType.LIST, 'success', (TType.STRUCT, (apache.airavata.model.workspace.ttypes.Notification, apache.airavata.model.workspace.ttypes.Notification.thrift_spec), False), None, ),  # 0
        (1, TType.STRUCT, 'ire', (apache.airavata.api.error.ttypes.InvalidRequestException, apache.airavata.api.error.ttypes.InvalidRequestException.thrift_spec), None, ),  # 1
        (2, TType.STRUCT, 'ace', (apache.airavata.api.error.ttypes.AiravataClientException, apache.airavata.api.error.ttypes.AiravataClientException.thrift_spec), None, ),  # 2
        (3, TType.STRUCT, 'ase', (apache.airavata.api.error.ttypes.AiravataSystemException, apache.airavata.api.error.ttypes.AiravataSystemException.thrift_spec), None, ),  # 3
        (4, TType.STRUCT, 'ae', (apache.airavata.api.error.ttypes.AuthorizationException, apache.airavata.api.error.ttypes.AuthorizationException.thrift_spec), None, ),  # 4
    )

    def __init__(self, success=None, ire=None, ace=None, ase=None, ae=None,):
        self.success = success
        self.ire = ire
        self.ace = ace
        self.ase = ase
        self.ae = ae

    def read(self, iprot):
        if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None:
            iprot._fast_decode(self, iprot, (self.__class__, self.thrift_spec))
            return
        iprot.readStructBegin()
        while True:
            (fname, ftype, fid) = iprot.readFieldBegin()
            if ftype == TType.STOP:
                break
            if fid == 0:
                if ftype == TType.LIST:
                    self.success = []
                    (_etype17, _size14) = iprot.readListBegin()
                    for _i18 in range(_size14):
                        _elem19 = apache.airavata.model.workspace.ttypes.Notification()
                        _elem19.read(iprot)
                        self.success.append(_elem19)
                    iprot.readListEnd()
                else:
                    iprot.skip(ftype)
            elif fid == 1:
                if ftype == TType.STRUCT:
                    self.ire = apache.airavata.api.error.ttypes.InvalidRequestException()
                    self.ire.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 2:
                if ftype == TType.STRUCT:
                    self.ace = apache.airavata.api.error.ttypes.AiravataClientException()
                    self.ace.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 3:
                if ftype == TType.STRUCT:
                    self.ase = apache.airavata.api.error.ttypes.AiravataSystemException()
                    self.ase.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 4:
                if ftype == TType.STRUCT:
                    self.ae = apache.airavata.api.error.ttypes.AuthorizationException()
                    self.ae.read(iprot)
                else:
                    iprot.skip(ftype)
            else:
                iprot.skip(ftype)
            iprot.readFieldEnd()
        iprot.readStructEnd()

    def write(self, oprot):
        if oprot._fast_encode is not None and self.thrift_spec is not None:
            oprot.trans.write(oprot._fast_encode(self, (self.__class__, self.thrift_spec)))
            return
        oprot.writeStructBegin('getAllNotifications_result')
        if self.success is not None:
            oprot.writeFieldBegin('success', TType.LIST, 0)
            oprot.writeListBegin(TType.STRUCT, len(self.success))
            for iter20 in self.success:
                iter20.write(oprot)
            oprot.writeListEnd()
            oprot.writeFieldEnd()
        if self.ire is not None:
            oprot.writeFieldBegin('ire', TType.STRUCT, 1)
            self.ire.write(oprot)
            oprot.writeFieldEnd()
        if self.ace is not None:
            oprot.writeFieldBegin('ace', TType.STRUCT, 2)
            self.ace.write(oprot)
            oprot.writeFieldEnd()
        if self.ase is not None:
            oprot.writeFieldBegin('ase', TType.STRUCT, 3)
            self.ase.write(oprot)
            oprot.writeFieldEnd()
        if self.ae is not None:
            oprot.writeFieldBegin('ae', TType.STRUCT, 4)
            self.ae.write(oprot)
            oprot.writeFieldEnd()
        oprot.writeFieldStop()
        oprot.writeStructEnd()

    def validate(self):
        return

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

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

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


class generateAndRegisterSSHKeys_args(object):
    """
    Attributes:
     - authzToken
     - gatewayId
     - userName
     - description
     - credentialOwnerType
    """

    thrift_spec = (
        None,  # 0
        (1, TType.STRUCT, 'authzToken', (apache.airavata.model.security.ttypes.AuthzToken, apache.airavata.model.security.ttypes.AuthzToken.thrift_spec), None, ),  # 1
        (2, TType.STRING, 'gatewayId', 'UTF8', None, ),  # 2
        (3, TType.STRING, 'userName', 'UTF8', None, ),  # 3
        (4, TType.STRING, 'description', 'UTF8', None, ),  # 4
        (5, TType.I32, 'credentialOwnerType', None, None, ),  # 5
    )

    def __init__(self, authzToken=None, gatewayId=None, userName=None, description=None, credentialOwnerType=None,):
        self.authzToken = authzToken
        self.gatewayId = gatewayId
        self.userName = userName
        self.description = description
        self.credentialOwnerType = credentialOwnerType

    def read(self, iprot):
        if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None:
            iprot._fast_decode(self, iprot, (self.__class__, self.thrift_spec))
            return
        iprot.readStructBegin()
        while True:
            (fname, ftype, fid) = iprot.readFieldBegin()
            if ftype == TType.STOP:
                break
            if fid == 1:
                if ftype == TType.STRUCT:
                    self.authzToken = apache.airavata.model.security.ttypes.AuthzToken()
                    self.authzToken.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 2:
                if ftype == TType.STRING:
                    self.gatewayId = iprot.readString().decode('utf-8') if sys.version_info[0] == 2 else iprot.readString()
                else:
                    iprot.skip(ftype)
            elif fid == 3:
                if ftype == TType.STRING:
                    self.userName = iprot.readString().decode('utf-8') if sys.version_info[0] == 2 else iprot.readString()
                else:
                    iprot.skip(ftype)
            elif fid == 4:
                if ftype == TType.STRING:
                    self.description = iprot.readString().decode('utf-8') if sys.version_info[0] == 2 else iprot.readString()
                else:
                    iprot.skip(ftype)
            elif fid == 5:
                if ftype == TType.I32:
                    self.credentialOwnerType = iprot.readI32()
                else:
                    iprot.skip(ftype)
            else:
                iprot.skip(ftype)
            iprot.readFieldEnd()
        iprot.readStructEnd()

    def write(self, oprot):
        if oprot._fast_encode is not None and self.thrift_spec is not None:
            oprot.trans.write(oprot._fast_encode(self, (self.__class__, self.thrift_spec)))
            return
        oprot.writeStructBegin('generateAndRegisterSSHKeys_args')
        if self.authzToken is not None:
            oprot.writeFieldBegin('authzToken', TType.STRUCT, 1)
            self.authzToken.write(oprot)
            oprot.writeFieldEnd()
        if self.gatewayId is not None:
            oprot.writeFieldBegin('gatewayId', TType.STRING, 2)
            oprot.writeString(self.gatewayId.encode('utf-8') if sys.version_info[0] == 2 else self.gatewayId)
            oprot.writeFieldEnd()
        if self.userName is not None:
            oprot.writeFieldBegin('userName', TType.STRING, 3)
            oprot.writeString(self.userName.encode('utf-8') if sys.version_info[0] == 2 else self.userName)
            oprot.writeFieldEnd()
        if self.description is not None:
            oprot.writeFieldBegin('description', TType.STRING, 4)
            oprot.writeString(self.description.encode('utf-8') if sys.version_info[0] == 2 else self.description)
            oprot.writeFieldEnd()
        if self.credentialOwnerType is not None:
            oprot.writeFieldBegin('credentialOwnerType', TType.I32, 5)
            oprot.writeI32(self.credentialOwnerType)
            oprot.writeFieldEnd()
        oprot.writeFieldStop()
        oprot.writeStructEnd()

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

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

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

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


class generateAndRegisterSSHKeys_result(object):
    """
    Attributes:
     - success
     - ire
     - ace
     - ase
    """

    thrift_spec = (
        (0, TType.STRING, 'success', 'UTF8', None, ),  # 0
        (1, TType.STRUCT, 'ire', (apache.airavata.api.error.ttypes.InvalidRequestException, apache.airavata.api.error.ttypes.InvalidRequestException.thrift_spec), None, ),  # 1
        (2, TType.STRUCT, 'ace', (apache.airavata.api.error.ttypes.AiravataClientException, apache.airavata.api.error.ttypes.AiravataClientException.thrift_spec), None, ),  # 2
        (3, TType.STRUCT, 'ase', (apache.airavata.api.error.ttypes.AiravataSystemException, apache.airavata.api.error.ttypes.AiravataSystemException.thrift_spec), None, ),  # 3
    )

    def __init__(self, success=None, ire=None, ace=None, ase=None,):
        self.success = success
        self.ire = ire
        self.ace = ace
        self.ase = ase

    def read(self, iprot):
        if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None:
            iprot._fast_decode(self, iprot, (self.__class__, self.thrift_spec))
            return
        iprot.readStructBegin()
        while True:
            (fname, ftype, fid) = iprot.readFieldBegin()
            if ftype == TType.STOP:
                break
            if fid == 0:
                if ftype == TType.STRING:
                    self.success = iprot.readString().decode('utf-8') if sys.version_info[0] == 2 else iprot.readString()
                else:
                    iprot.skip(ftype)
            elif fid == 1:
                if ftype == TType.STRUCT:
                    self.ire = apache.airavata.api.error.ttypes.InvalidRequestException()
                    self.ire.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 2:
                if ftype == TType.STRUCT:
                    self.ace = apache.airavata.api.error.ttypes.AiravataClientException()
                    self.ace.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 3:
                if ftype == TType.STRUCT:
                    self.ase = apache.airavata.api.error.ttypes.AiravataSystemException()
                    self.ase.read(iprot)
                else:
                    iprot.skip(ftype)
            else:
                iprot.skip(ftype)
            iprot.readFieldEnd()
        iprot.readStructEnd()

    def write(self, oprot):
        if oprot._fast_encode is not None and self.thrift_spec is not None:
            oprot.trans.write(oprot._fast_encode(self, (self.__class__, self.thrift_spec)))
            return
        oprot.writeStructBegin('generateAndRegisterSSHKeys_result')
        if self.success is not None:
            oprot.writeFieldBegin('success', TType.STRING, 0)
            oprot.writeString(self.success.encode('utf-8') if sys.version_info[0] == 2 else self.success)
            oprot.writeFieldEnd()
        if self.ire is not None:
            oprot.writeFieldBegin('ire', TType.STRUCT, 1)
            self.ire.write(oprot)
            oprot.writeFieldEnd()
        if self.ace is not None:
            oprot.writeFieldBegin('ace', TType.STRUCT, 2)
            self.ace.write(oprot)
            oprot.writeFieldEnd()
        if self.ase is not None:
            oprot.writeFieldBegin('ase', TType.STRUCT, 3)
            self.ase.write(oprot)
            oprot.writeFieldEnd()
        oprot.writeFieldStop()
        oprot.writeStructEnd()

    def validate(self):
        return

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

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

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


class registerPwdCredential_args(object):
    """
    Attributes:
     - authzToken
     - gatewayId
     - portalUserName
     - loginUserName
     - password
     - description
    """

    thrift_spec = (
        None,  # 0
        (1, TType.STRUCT, 'authzToken', (apache.airavata.model.security.ttypes.AuthzToken, apache.airavata.model.security.ttypes.AuthzToken.thrift_spec), None, ),  # 1
        (2, TType.STRING, 'gatewayId', 'UTF8', None, ),  # 2
        (3, TType.STRING, 'portalUserName', 'UTF8', None, ),  # 3
        (4, TType.STRING, 'loginUserName', 'UTF8', None, ),  # 4
        (5, TType.STRING, 'password', 'UTF8', None, ),  # 5
        (6, TType.STRING, 'description', 'UTF8', None, ),  # 6
    )

    def __init__(self, authzToken=None, gatewayId=None, portalUserName=None, loginUserName=None, password=None, description=None,):
        self.authzToken = authzToken
        self.gatewayId = gatewayId
        self.portalUserName = portalUserName
        self.loginUserName = loginUserName
        self.password = password
        self.description = description

    def read(self, iprot):
        if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None:
            iprot._fast_decode(self, iprot, (self.__class__, self.thrift_spec))
            return
        iprot.readStructBegin()
        while True:
            (fname, ftype, fid) = iprot.readFieldBegin()
            if ftype == TType.STOP:
                break
            if fid == 1:
                if ftype == TType.STRUCT:
                    self.authzToken = apache.airavata.model.security.ttypes.AuthzToken()
                    self.authzToken.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 2:
                if ftype == TType.STRING:
                    self.gatewayId = iprot.readString().decode('utf-8') if sys.version_info[0] == 2 else iprot.readString()
                else:
                    iprot.skip(ftype)
            elif fid == 3:
                if ftype == TType.STRING:
                    self.portalUserName = iprot.readString().decode('utf-8') if sys.version_info[0] == 2 else iprot.readString()
                else:
                    iprot.skip(ftype)
            elif fid == 4:
                if ftype == TType.STRING:
                    self.loginUserName = iprot.readString().decode('utf-8') if sys.version_info[0] == 2 else iprot.readString()
                else:
                    iprot.skip(ftype)
            elif fid == 5:
                if ftype == TType.STRING:
                    self.password = iprot.readString().decode('utf-8') if sys.version_info[0] == 2 else iprot.readString()
                else:
                    iprot.skip(ftype)
            elif fid == 6:
                if ftype == TType.STRING:
                    self.description = iprot.readString().decode('utf-8') if sys.version_info[0] == 2 else iprot.readString()
                else:
                    iprot.skip(ftype)
            else:
                iprot.skip(ftype)
            iprot.readFieldEnd()
        iprot.readStructEnd()

    def write(self, oprot):
        if oprot._fast_encode is not None and self.thrift_spec is not None:
            oprot.trans.write(oprot._fast_encode(self, (self.__class__, self.thrift_spec)))
            return
        oprot.writeStructBegin('registerPwdCredential_args')
        if self.authzToken is not None:
            oprot.writeFieldBegin('authzToken', TType.STRUCT, 1)
            self.authzToken.write(oprot)
            oprot.writeFieldEnd()
        if self.gatewayId is not None:
            oprot.writeFieldBegin('gatewayId', TType.STRING, 2)
            oprot.writeString(self.gatewayId.encode('utf-8') if sys.version_info[0] == 2 else self.gatewayId)
            oprot.writeFieldEnd()
        if self.portalUserName is not None:
            oprot.writeFieldBegin('portalUserName', TType.STRING, 3)
            oprot.writeString(self.portalUserName.encode('utf-8') if sys.version_info[0] == 2 else self.portalUserName)
            oprot.writeFieldEnd()
        if self.loginUserName is not None:
            oprot.writeFieldBegin('loginUserName', TType.STRING, 4)
            oprot.writeString(self.loginUserName.encode('utf-8') if sys.version_info[0] == 2 else self.loginUserName)
            oprot.writeFieldEnd()
        if self.password is not None:
            oprot.writeFieldBegin('password', TType.STRING, 5)
            oprot.writeString(self.password.encode('utf-8') if sys.version_info[0] == 2 else self.password)
            oprot.writeFieldEnd()
        if self.description is not None:
            oprot.writeFieldBegin('description', TType.STRING, 6)
            oprot.writeString(self.description.encode('utf-8') if sys.version_info[0] == 2 else self.description)
            oprot.writeFieldEnd()
        oprot.writeFieldStop()
        oprot.writeStructEnd()

    def validate(self):
        if self.authzToken is None:
            raise TProtocolException(message='Required field authzToken is unset!')
        if self.gatewayId is None:
            raise TProtocolException(message='Required field gatewayId is unset!')
        if self.portalUserName is None:
            raise TProtocolException(message='Required field portalUserName is unset!')
        if self.loginUserName is None:
            raise TProtocolException(message='Required field loginUserName is unset!')
        if self.password is None:
            raise TProtocolException(message='Required field password is unset!')
        if self.description is None:
            raise TProtocolException(message='Required field description is unset!')
        return

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

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

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


class registerPwdCredential_result(object):
    """
    Attributes:
     - success
     - ire
     - ace
     - ase
    """

    thrift_spec = (
        (0, TType.STRING, 'success', 'UTF8', None, ),  # 0
        (1, TType.STRUCT, 'ire', (apache.airavata.api.error.ttypes.InvalidRequestException, apache.airavata.api.error.ttypes.InvalidRequestException.thrift_spec), None, ),  # 1
        (2, TType.STRUCT, 'ace', (apache.airavata.api.error.ttypes.AiravataClientException, apache.airavata.api.error.ttypes.AiravataClientException.thrift_spec), None, ),  # 2
        (3, TType.STRUCT, 'ase', (apache.airavata.api.error.ttypes.AiravataSystemException, apache.airavata.api.error.ttypes.AiravataSystemException.thrift_spec), None, ),  # 3
    )

    def __init__(self, success=None, ire=None, ace=None, ase=None,):
        self.success = success
        self.ire = ire
        self.ace = ace
        self.ase = ase

    def read(self, iprot):
        if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None:
            iprot._fast_decode(self, iprot, (self.__class__, self.thrift_spec))
            return
        iprot.readStructBegin()
        while True:
            (fname, ftype, fid) = iprot.readFieldBegin()
            if ftype == TType.STOP:
                break
            if fid == 0:
                if ftype == TType.STRING:
                    self.success = iprot.readString().decode('utf-8') if sys.version_info[0] == 2 else iprot.readString()
                else:
                    iprot.skip(ftype)
            elif fid == 1:
                if ftype == TType.STRUCT:
                    self.ire = apache.airavata.api.error.ttypes.InvalidRequestException()
                    self.ire.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 2:
                if ftype == TType.STRUCT:
                    self.ace = apache.airavata.api.error.ttypes.AiravataClientException()
                    self.ace.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 3:
                if ftype == TType.STRUCT:
                    self.ase = apache.airavata.api.error.ttypes.AiravataSystemException()
                    self.ase.read(iprot)
                else:
                    iprot.skip(ftype)
            else:
                iprot.skip(ftype)
            iprot.readFieldEnd()
        iprot.readStructEnd()

    def write(self, oprot):
        if oprot._fast_encode is not None and self.thrift_spec is not None:
            oprot.trans.write(oprot._fast_encode(self, (self.__class__, self.thrift_spec)))
            return
        oprot.writeStructBegin('registerPwdCredential_result')
        if self.success is not None:
            oprot.writeFieldBegin('success', TType.STRING, 0)
            oprot.writeString(self.success.encode('utf-8') if sys.version_info[0] == 2 else self.success)
            oprot.writeFieldEnd()
        if self.ire is not None:
            oprot.writeFieldBegin('ire', TType.STRUCT, 1)
            self.ire.write(oprot)
            oprot.writeFieldEnd()
        if self.ace is not None:
            oprot.writeFieldBegin('ace', TType.STRUCT, 2)
            self.ace.write(oprot)
            oprot.writeFieldEnd()
        if self.ase is not None:
            oprot.writeFieldBegin('ase', TType.STRUCT, 3)
            self.ase.write(oprot)
            oprot.writeFieldEnd()
        oprot.writeFieldStop()
        oprot.writeStructEnd()

    def validate(self):
        return

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

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

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


class getSSHPubKey_args(object):
    """
    Attributes:
     - authzToken
     - airavataCredStoreToken
     - gatewayId
    """

    thrift_spec = (
        None,  # 0
        (1, TType.STRUCT, 'authzToken', (apache.airavata.model.security.ttypes.AuthzToken, apache.airavata.model.security.ttypes.AuthzToken.thrift_spec), None, ),  # 1
        (2, TType.STRING, 'airavataCredStoreToken', 'UTF8', None, ),  # 2
        (3, TType.STRING, 'gatewayId', 'UTF8', None, ),  # 3
    )

    def __init__(self, authzToken=None, airavataCredStoreToken=None, gatewayId=None,):
        self.authzToken = authzToken
        self.airavataCredStoreToken = airavataCredStoreToken
        self.gatewayId = gatewayId

    def read(self, iprot):
        if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None:
            iprot._fast_decode(self, iprot, (self.__class__, self.thrift_spec))
            return
        iprot.readStructBegin()
        while True:
            (fname, ftype, fid) = iprot.readFieldBegin()
            if ftype == TType.STOP:
                break
            if fid == 1:
                if ftype == TType.STRUCT:
                    self.authzToken = apache.airavata.model.security.ttypes.AuthzToken()
                    self.authzToken.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 2:
                if ftype == TType.STRING:
                    self.airavataCredStoreToken = iprot.readString().decode('utf-8') if sys.version_info[0] == 2 else iprot.readString()
                else:
                    iprot.skip(ftype)
            elif fid == 3:
                if ftype == TType.STRING:
                    self.gatewayId = iprot.readString().decode('utf-8') if sys.version_info[0] == 2 else iprot.readString()
                else:
                    iprot.skip(ftype)
            else:
                iprot.skip(ftype)
            iprot.readFieldEnd()
        iprot.readStructEnd()

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

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

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

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

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


class getSSHPubKey_result(object):
    """
    Attributes:
     - success
     - ire
     - ace
     - ase
    """

    thrift_spec = (
        (0, TType.STRING, 'success', 'UTF8', None, ),  # 0
        (1, TType.STRUCT, 'ire', (apache.airavata.api.error.ttypes.InvalidRequestException, apache.airavata.api.error.ttypes.InvalidRequestException.thrift_spec), None, ),  # 1
        (2, TType.STRUCT, 'ace', (apache.airavata.api.error.ttypes.AiravataClientException, apache.airavata.api.error.ttypes.AiravataClientException.thrift_spec), None, ),  # 2
        (3, TType.STRUCT, 'ase', (apache.airavata.api.error.ttypes.AiravataSystemException, apache.airavata.api.error.ttypes.AiravataSystemException.thrift_spec), None, ),  # 3
    )

    def __init__(self, success=None, ire=None, ace=None, ase=None,):
        self.success = success
        self.ire = ire
        self.ace = ace
        self.ase = ase

    def read(self, iprot):
        if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None:
            iprot._fast_decode(self, iprot, (self.__class__, self.thrift_spec))
            return
        iprot.readStructBegin()
        while True:
            (fname, ftype, fid) = iprot.readFieldBegin()
            if ftype == TType.STOP:
                break
            if fid == 0:
                if ftype == TType.STRING:
                    self.success = iprot.readString().decode('utf-8') if sys.version_info[0] == 2 else iprot.readString()
                else:
                    iprot.skip(ftype)
            elif fid == 1:
                if ftype == TType.STRUCT:
                    self.ire = apache.airavata.api.error.ttypes.InvalidRequestException()
                    self.ire.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 2:
                if ftype == TType.STRUCT:
                    self.ace = apache.airavata.api.error.ttypes.AiravataClientException()
                    self.ace.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 3:
                if ftype == TType.STRUCT:
                    self.ase = apache.airavata.api.error.ttypes.AiravataSystemException()
                    self.ase.read(iprot)
                else:
                    iprot.skip(ftype)
            else:
                iprot.skip(ftype)
            iprot.readFieldEnd()
        iprot.readStructEnd()

    def write(self, oprot):
        if oprot._fast_encode is not None and self.thrift_spec is not None:
            oprot.trans.write(oprot._fast_encode(self, (self.__class__, self.thrift_spec)))
            return
        oprot.writeStructBegin('getSSHPubKey_result')
        if self.success is not None:
            oprot.writeFieldBegin('success', TType.STRING, 0)
            oprot.writeString(self.success.encode('utf-8') if sys.version_info[0] == 2 else self.success)
            oprot.writeFieldEnd()
        if self.ire is not None:
            oprot.writeFieldBegin('ire', TType.STRUCT, 1)
            self.ire.write(oprot)
            oprot.writeFieldEnd()
        if self.ace is not None:
            oprot.writeFieldBegin('ace', TType.STRUCT, 2)
            self.ace.write(oprot)
            oprot.writeFieldEnd()
        if self.ase is not None:
            oprot.writeFieldBegin('ase', TType.STRUCT, 3)
            self.ase.write(oprot)
            oprot.writeFieldEnd()
        oprot.writeFieldStop()
        oprot.writeStructEnd()

    def validate(self):
        return

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

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

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


class getAllGatewaySSHPubKeys_args(object):
    """
    Attributes:
     - authzToken
     - gatewayId
    """

    thrift_spec = (
        None,  # 0
        (1, TType.STRUCT, 'authzToken', (apache.airavata.model.security.ttypes.AuthzToken, apache.airavata.model.security.ttypes.AuthzToken.thrift_spec), None, ),  # 1
        (2, TType.STRING, 'gatewayId', 'UTF8', None, ),  # 2
    )

    def __init__(self, authzToken=None, gatewayId=None,):
        self.authzToken = authzToken
        self.gatewayId = gatewayId

    def read(self, iprot):
        if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None:
            iprot._fast_decode(self, iprot, (self.__class__, self.thrift_spec))
            return
        iprot.readStructBegin()
        while True:
            (fname, ftype, fid) = iprot.readFieldBegin()
            if ftype == TType.STOP:
                break
            if fid == 1:
                if ftype == TType.STRUCT:
                    self.authzToken = apache.airavata.model.security.ttypes.AuthzToken()
                    self.authzToken.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 2:
                if ftype == TType.STRING:
                    self.gatewayId = iprot.readString().decode('utf-8') if sys.version_info[0] == 2 else iprot.readString()
                else:
                    iprot.skip(ftype)
            else:
                iprot.skip(ftype)
            iprot.readFieldEnd()
        iprot.readStructEnd()

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

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

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

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

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


class getAllGatewaySSHPubKeys_result(object):
    """
    Attributes:
     - success
     - ire
     - ace
     - ase
    """

    thrift_spec = (
        (0, TType.MAP, 'success', (TType.STRING, 'UTF8', TType.STRING, 'UTF8', False), None, ),  # 0
        (1, TType.STRUCT, 'ire', (apache.airavata.api.error.ttypes.InvalidRequestException, apache.airavata.api.error.ttypes.InvalidRequestException.thrift_spec), None, ),  # 1
        (2, TType.STRUCT, 'ace', (apache.airavata.api.error.ttypes.AiravataClientException, apache.airavata.api.error.ttypes.AiravataClientException.thrift_spec), None, ),  # 2
        (3, TType.STRUCT, 'ase', (apache.airavata.api.error.ttypes.AiravataSystemException, apache.airavata.api.error.ttypes.AiravataSystemException.thrift_spec), None, ),  # 3
    )

    def __init__(self, success=None, ire=None, ace=None, ase=None,):
        self.success = success
        self.ire = ire
        self.ace = ace
        self.ase = ase

    def read(self, iprot):
        if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None:
            iprot._fast_decode(self, iprot, (self.__class__, self.thrift_spec))
            return
        iprot.readStructBegin()
        while True:
            (fname, ftype, fid) = iprot.readFieldBegin()
            if ftype == TType.STOP:
                break
            if fid == 0:
                if ftype == TType.MAP:
                    self.success = {}
                    (_ktype22, _vtype23, _size21) = iprot.readMapBegin()
                    for _i25 in range(_size21):
                        _key26 = iprot.readString().decode('utf-8') if sys.version_info[0] == 2 else iprot.readString()
                        _val27 = iprot.readString().decode('utf-8') if sys.version_info[0] == 2 else iprot.readString()
                        self.success[_key26] = _val27
                    iprot.readMapEnd()
                else:
                    iprot.skip(ftype)
            elif fid == 1:
                if ftype == TType.STRUCT:
                    self.ire = apache.airavata.api.error.ttypes.InvalidRequestException()
                    self.ire.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 2:
                if ftype == TType.STRUCT:
                    self.ace = apache.airavata.api.error.ttypes.AiravataClientException()
                    self.ace.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 3:
                if ftype == TType.STRUCT:
                    self.ase = apache.airavata.api.error.ttypes.AiravataSystemException()
                    self.ase.read(iprot)
                else:
                    iprot.skip(ftype)
            else:
                iprot.skip(ftype)
            iprot.readFieldEnd()
        iprot.readStructEnd()

    def write(self, oprot):
        if oprot._fast_encode is not None and self.thrift_spec is not None:
            oprot.trans.write(oprot._fast_encode(self, (self.__class__, self.thrift_spec)))
            return
        oprot.writeStructBegin('getAllGatewaySSHPubKeys_result')
        if self.success is not None:
            oprot.writeFieldBegin('success', TType.MAP, 0)
            oprot.writeMapBegin(TType.STRING, TType.STRING, len(self.success))
            for kiter28, viter29 in self.success.items():
                oprot.writeString(kiter28.encode('utf-8') if sys.version_info[0] == 2 else kiter28)
                oprot.writeString(viter29.encode('utf-8') if sys.version_info[0] == 2 else viter29)
            oprot.writeMapEnd()
            oprot.writeFieldEnd()
        if self.ire is not None:
            oprot.writeFieldBegin('ire', TType.STRUCT, 1)
            self.ire.write(oprot)
            oprot.writeFieldEnd()
        if self.ace is not None:
            oprot.writeFieldBegin('ace', TType.STRUCT, 2)
            self.ace.write(oprot)
            oprot.writeFieldEnd()
        if self.ase is not None:
            oprot.writeFieldBegin('ase', TType.STRUCT, 3)
            self.ase.write(oprot)
            oprot.writeFieldEnd()
        oprot.writeFieldStop()
        oprot.writeStructEnd()

    def validate(self):
        return

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

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

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


class getAllCredentialSummaryForGateway_args(object):
    """
    Attributes:
     - authzToken
     - type
     - gatewayId
    """

    thrift_spec = (
        None,  # 0
        (1, TType.STRUCT, 'authzToken', (apache.airavata.model.security.ttypes.AuthzToken, apache.airavata.model.security.ttypes.AuthzToken.thrift_spec), None, ),  # 1
        (2, TType.I32, 'type', None, None, ),  # 2
        (3, TType.STRING, 'gatewayId', 'UTF8', None, ),  # 3
    )

    def __init__(self, authzToken=None, type=None, gatewayId=None,):
        self.authzToken = authzToken
        self.type = type
        self.gatewayId = gatewayId

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

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

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

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

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

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


class getAllCredentialSummaryForGateway_result(object):
    """
    Attributes:
     - success
     - ire
     - ace
     - ase
    """

    thrift_spec = (
        (0, TType.LIST, 'success', (TType.STRUCT, (credential_store_data_models.ttypes.CredentialSummary, credential_store_data_models.ttypes.CredentialSummary.thrift_spec), False), None, ),  # 0
        (1, TType.STRUCT, 'ire', (apache.airavata.api.error.ttypes.InvalidRequestException, apache.airavata.api.error.ttypes.InvalidRequestException.thrift_spec), None, ),  # 1
        (2, TType.STRUCT, 'ace', (apache.airavata.api.error.ttypes.AiravataClientException, apache.airavata.api.error.ttypes.AiravataClientException.thrift_spec), None, ),  # 2
        (3, TType.STRUCT, 'ase', (apache.airavata.api.error.ttypes.AiravataSystemException, apache.airavata.api.error.ttypes.AiravataSystemException.thrift_spec), None, ),  # 3
    )

    def __init__(self, success=None, ire=None, ace=None, ase=None,):
        self.success = success
        self.ire = ire
        self.ace = ace
        self.ase = ase

    def read(self, iprot):
        if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None:
            iprot._fast_decode(self, iprot, (self.__class__, self.thrift_spec))
            return
        iprot.readStructBegin()
        while True:
            (fname, ftype, fid) = iprot.readFieldBegin()
            if ftype == TType.STOP:
                break
            if fid == 0:
                if ftype == TType.LIST:
                    self.success = []
                    (_etype33, _size30) = iprot.readListBegin()
                    for _i34 in range(_size30):
                        _elem35 = credential_store_data_models.ttypes.CredentialSummary()
                        _elem35.read(iprot)
                        self.success.append(_elem35)
                    iprot.readListEnd()
                else:
                    iprot.skip(ftype)
            elif fid == 1:
                if ftype == TType.STRUCT:
                    self.ire = apache.airavata.api.error.ttypes.InvalidRequestException()
                    self.ire.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 2:
                if ftype == TType.STRUCT:
                    self.ace = apache.airavata.api.error.ttypes.AiravataClientException()
                    self.ace.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 3:
                if ftype == TType.STRUCT:
                    self.ase = apache.airavata.api.error.ttypes.AiravataSystemException()
                    self.ase.read(iprot)
                else:
                    iprot.skip(ftype)
            else:
                iprot.skip(ftype)
            iprot.readFieldEnd()
        iprot.readStructEnd()

    def write(self, oprot):
        if oprot._fast_encode is not None and self.thrift_spec is not None:
            oprot.trans.write(oprot._fast_encode(self, (self.__class__, self.thrift_spec)))
            return
        oprot.writeStructBegin('getAllCredentialSummaryForGateway_result')
        if self.success is not None:
            oprot.writeFieldBegin('success', TType.LIST, 0)
            oprot.writeListBegin(TType.STRUCT, len(self.success))
            for iter36 in self.success:
                iter36.write(oprot)
            oprot.writeListEnd()
            oprot.writeFieldEnd()
        if self.ire is not None:
            oprot.writeFieldBegin('ire', TType.STRUCT, 1)
            self.ire.write(oprot)
            oprot.writeFieldEnd()
        if self.ace is not None:
            oprot.writeFieldBegin('ace', TType.STRUCT, 2)
            self.ace.write(oprot)
            oprot.writeFieldEnd()
        if self.ase is not None:
            oprot.writeFieldBegin('ase', TType.STRUCT, 3)
            self.ase.write(oprot)
            oprot.writeFieldEnd()
        oprot.writeFieldStop()
        oprot.writeStructEnd()

    def validate(self):
        return

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

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

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


class getAllCredentialSummaryForUsersInGateway_args(object):
    """
    Attributes:
     - authzToken
     - type
     - gatewayId
     - userId
    """

    thrift_spec = (
        None,  # 0
        (1, TType.STRUCT, 'authzToken', (apache.airavata.model.security.ttypes.AuthzToken, apache.airavata.model.security.ttypes.AuthzToken.thrift_spec), None, ),  # 1
        (2, TType.I32, 'type', None, None, ),  # 2
        (3, TType.STRING, 'gatewayId', 'UTF8', None, ),  # 3
        (4, TType.STRING, 'userId', 'UTF8', None, ),  # 4
    )

    def __init__(self, authzToken=None, type=None, gatewayId=None, userId=None,):
        self.authzToken = authzToken
        self.type = type
        self.gatewayId = gatewayId
        self.userId = userId

    def read(self, iprot):
        if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None:
            iprot._fast_decode(self, iprot, (self.__class__, self.thrift_spec))
            return
        iprot.readStructBegin()
        while True:
            (fname, ftype, fid) = iprot.readFieldBegin()
            if ftype == TType.STOP:
                break
            if fid == 1:
                if ftype == TType.STRUCT:
                    self.authzToken = apache.airavata.model.security.ttypes.AuthzToken()
                    self.authzToken.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 2:
                if ftype == TType.I32:
                    self.type = iprot.readI32()
                else:
                    iprot.skip(ftype)
            elif fid == 3:
                if ftype == TType.STRING:
                    self.gatewayId = iprot.readString().decode('utf-8') if sys.version_info[0] == 2 else iprot.readString()
                else:
                    iprot.skip(ftype)
            elif fid == 4:
                if ftype == TType.STRING:
                    self.userId = iprot.readString().decode('utf-8') if sys.version_info[0] == 2 else iprot.readString()
                else:
                    iprot.skip(ftype)
            else:
                iprot.skip(ftype)
            iprot.readFieldEnd()
        iprot.readStructEnd()

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

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

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

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

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


class getAllCredentialSummaryForUsersInGateway_result(object):
    """
    Attributes:
     - success
     - ire
     - ace
     - ase
    """

    thrift_spec = (
        (0, TType.LIST, 'success', (TType.STRUCT, (credential_store_data_models.ttypes.CredentialSummary, credential_store_data_models.ttypes.CredentialSummary.thrift_spec), False), None, ),  # 0
        (1, TType.STRUCT, 'ire', (apache.airavata.api.error.ttypes.InvalidRequestException, apache.airavata.api.error.ttypes.InvalidRequestException.thrift_spec), None, ),  # 1
        (2, TType.STRUCT, 'ace', (apache.airavata.api.error.ttypes.AiravataClientException, apache.airavata.api.error.ttypes.AiravataClientException.thrift_spec), None, ),  # 2
        (3, TType.STRUCT, 'ase', (apache.airavata.api.error.ttypes.AiravataSystemException, apache.airavata.api.error.ttypes.AiravataSystemException.thrift_spec), None, ),  # 3
    )

    def __init__(self, success=None, ire=None, ace=None, ase=None,):
        self.success = success
        self.ire = ire
        self.ace = ace
        self.ase = ase

    def read(self, iprot):
        if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None:
            iprot._fast_decode(self, iprot, (self.__class__, self.thrift_spec))
            return
        iprot.readStructBegin()
        while True:
            (fname, ftype, fid) = iprot.readFieldBegin()
            if ftype == TType.STOP:
                break
            if fid == 0:
                if ftype == TType.LIST:
                    self.success = []
                    (_etype40, _size37) = iprot.readListBegin()
                    for _i41 in range(_size37):
                        _elem42 = credential_store_data_models.ttypes.CredentialSummary()
                        _elem42.read(iprot)
                        self.success.append(_elem42)
                    iprot.readListEnd()
                else:
                    iprot.skip(ftype)
            elif fid == 1:
                if ftype == TType.STRUCT:
                    self.ire = apache.airavata.api.error.ttypes.InvalidRequestException()
                    self.ire.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 2:
                if ftype == TType.STRUCT:
                    self.ace = apache.airavata.api.error.ttypes.AiravataClientException()
                    self.ace.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 3:
                if ftype == TType.STRUCT:
                    self.ase = apache.airavata.api.error.ttypes.AiravataSystemException()
                    self.ase.read(iprot)
                else:
                    iprot.skip(ftype)
            else:
                iprot.skip(ftype)
            iprot.readFieldEnd()
        iprot.readStructEnd()

    def write(self, oprot):
        if oprot._fast_encode is not None and self.thrift_spec is not None:
            oprot.trans.write(oprot._fast_encode(self, (self.__class__, self.thrift_spec)))
            return
        oprot.writeStructBegin('getAllCredentialSummaryForUsersInGateway_result')
        if self.success is not None:
            oprot.writeFieldBegin('success', TType.LIST, 0)
            oprot.writeListBegin(TType.STRUCT, len(self.success))
            for iter43 in self.success:
                iter43.write(oprot)
            oprot.writeListEnd()
            oprot.writeFieldEnd()
        if self.ire is not None:
            oprot.writeFieldBegin('ire', TType.STRUCT, 1)
            self.ire.write(oprot)
            oprot.writeFieldEnd()
        if self.ace is not None:
            oprot.writeFieldBegin('ace', TType.STRUCT, 2)
            self.ace.write(oprot)
            oprot.writeFieldEnd()
        if self.ase is not None:
            oprot.writeFieldBegin('ase', TType.STRUCT, 3)
            self.ase.write(oprot)
            oprot.writeFieldEnd()
        oprot.writeFieldStop()
        oprot.writeStructEnd()

    def validate(self):
        return

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

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

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


class getAllGatewayPWDCredentials_args(object):
    """
    Attributes:
     - authzToken
     - gatewayId
    """

    thrift_spec = (
        None,  # 0
        (1, TType.STRUCT, 'authzToken', (apache.airavata.model.security.ttypes.AuthzToken, apache.airavata.model.security.ttypes.AuthzToken.thrift_spec), None, ),  # 1
        (2, TType.STRING, 'gatewayId', 'UTF8', None, ),  # 2
    )

    def __init__(self, authzToken=None, gatewayId=None,):
        self.authzToken = authzToken
        self.gatewayId = gatewayId

    def read(self, iprot):
        if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None:
            iprot._fast_decode(self, iprot, (self.__class__, self.thrift_spec))
            return
        iprot.readStructBegin()
        while True:
            (fname, ftype, fid) = iprot.readFieldBegin()
            if ftype == TType.STOP:
                break
            if fid == 1:
                if ftype == TType.STRUCT:
                    self.authzToken = apache.airavata.model.security.ttypes.AuthzToken()
                    self.authzToken.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 2:
                if ftype == TType.STRING:
                    self.gatewayId = iprot.readString().decode('utf-8') if sys.version_info[0] == 2 else iprot.readString()
                else:
                    iprot.skip(ftype)
            else:
                iprot.skip(ftype)
            iprot.readFieldEnd()
        iprot.readStructEnd()

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

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

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

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

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


class getAllGatewayPWDCredentials_result(object):
    """
    Attributes:
     - success
     - ire
     - ace
     - ase
    """

    thrift_spec = (
        (0, TType.MAP, 'success', (TType.STRING, 'UTF8', TType.STRING, 'UTF8', False), None, ),  # 0
        (1, TType.STRUCT, 'ire', (apache.airavata.api.error.ttypes.InvalidRequestException, apache.airavata.api.error.ttypes.InvalidRequestException.thrift_spec), None, ),  # 1
        (2, TType.STRUCT, 'ace', (apache.airavata.api.error.ttypes.AiravataClientException, apache.airavata.api.error.ttypes.AiravataClientException.thrift_spec), None, ),  # 2
        (3, TType.STRUCT, 'ase', (apache.airavata.api.error.ttypes.AiravataSystemException, apache.airavata.api.error.ttypes.AiravataSystemException.thrift_spec), None, ),  # 3
    )

    def __init__(self, success=None, ire=None, ace=None, ase=None,):
        self.success = success
        self.ire = ire
        self.ace = ace
        self.ase = ase

    def read(self, iprot):
        if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None:
            iprot._fast_decode(self, iprot, (self.__class__, self.thrift_spec))
            return
        iprot.readStructBegin()
        while True:
            (fname, ftype, fid) = iprot.readFieldBegin()
            if ftype == TType.STOP:
                break
            if fid == 0:
                if ftype == TType.MAP:
                    self.success = {}
                    (_ktype45, _vtype46, _size44) = iprot.readMapBegin()
                    for _i48 in range(_size44):
                        _key49 = iprot.readString().decode('utf-8') if sys.version_info[0] == 2 else iprot.readString()
                        _val50 = iprot.readString().decode('utf-8') if sys.version_info[0] == 2 else iprot.readString()
                        self.success[_key49] = _val50
                    iprot.readMapEnd()
                else:
                    iprot.skip(ftype)
            elif fid == 1:
                if ftype == TType.STRUCT:
                    self.ire = apache.airavata.api.error.ttypes.InvalidRequestException()
                    self.ire.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 2:
                if ftype == TType.STRUCT:
                    self.ace = apache.airavata.api.error.ttypes.AiravataClientException()
                    self.ace.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 3:
                if ftype == TType.STRUCT:
                    self.ase = apache.airavata.api.error.ttypes.AiravataSystemException()
                    self.ase.read(iprot)
                else:
                    iprot.skip(ftype)
            else:
                iprot.skip(ftype)
            iprot.readFieldEnd()
        iprot.readStructEnd()

    def write(self, oprot):
        if oprot._fast_encode is not None and self.thrift_spec is not None:
            oprot.trans.write(oprot._fast_encode(self, (self.__class__, self.thrift_spec)))
            return
        oprot.writeStructBegin('getAllGatewayPWDCredentials_result')
        if self.success is not None:
            oprot.writeFieldBegin('success', TType.MAP, 0)
            oprot.writeMapBegin(TType.STRING, TType.STRING, len(self.success))
            for kiter51, viter52 in self.success.items():
                oprot.writeString(kiter51.encode('utf-8') if sys.version_info[0] == 2 else kiter51)
                oprot.writeString(viter52.encode('utf-8') if sys.version_info[0] == 2 else viter52)
            oprot.writeMapEnd()
            oprot.writeFieldEnd()
        if self.ire is not None:
            oprot.writeFieldBegin('ire', TType.STRUCT, 1)
            self.ire.write(oprot)
            oprot.writeFieldEnd()
        if self.ace is not None:
            oprot.writeFieldBegin('ace', TType.STRUCT, 2)
            self.ace.write(oprot)
            oprot.writeFieldEnd()
        if self.ase is not None:
            oprot.writeFieldBegin('ase', TType.STRUCT, 3)
            self.ase.write(oprot)
            oprot.writeFieldEnd()
        oprot.writeFieldStop()
        oprot.writeStructEnd()

    def validate(self):
        return

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

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

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


class deleteSSHPubKey_args(object):
    """
    Attributes:
     - authzToken
     - airavataCredStoreToken
     - gatewayId
    """

    thrift_spec = (
        None,  # 0
        (1, TType.STRUCT, 'authzToken', (apache.airavata.model.security.ttypes.AuthzToken, apache.airavata.model.security.ttypes.AuthzToken.thrift_spec), None, ),  # 1
        (2, TType.STRING, 'airavataCredStoreToken', 'UTF8', None, ),  # 2
        (3, TType.STRING, 'gatewayId', 'UTF8', None, ),  # 3
    )

    def __init__(self, authzToken=None, airavataCredStoreToken=None, gatewayId=None,):
        self.authzToken = authzToken
        self.airavataCredStoreToken = airavataCredStoreToken
        self.gatewayId = gatewayId

    def read(self, iprot):
        if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None:
            iprot._fast_decode(self, iprot, (self.__class__, self.thrift_spec))
            return
        iprot.readStructBegin()
        while True:
            (fname, ftype, fid) = iprot.readFieldBegin()
            if ftype == TType.STOP:
                break
            if fid == 1:
                if ftype == TType.STRUCT:
                    self.authzToken = apache.airavata.model.security.ttypes.AuthzToken()
                    self.authzToken.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 2:
                if ftype == TType.STRING:
                    self.airavataCredStoreToken = iprot.readString().decode('utf-8') if sys.version_info[0] == 2 else iprot.readString()
                else:
                    iprot.skip(ftype)
            elif fid == 3:
                if ftype == TType.STRING:
                    self.gatewayId = iprot.readString().decode('utf-8') if sys.version_info[0] == 2 else iprot.readString()
                else:
                    iprot.skip(ftype)
            else:
                iprot.skip(ftype)
            iprot.readFieldEnd()
        iprot.readStructEnd()

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

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

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

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

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


class deleteSSHPubKey_result(object):
    """
    Attributes:
     - success
     - ire
     - ace
     - ase
    """

    thrift_spec = (
        (0, TType.BOOL, 'success', None, None, ),  # 0
        (1, TType.STRUCT, 'ire', (apache.airavata.api.error.ttypes.InvalidRequestException, apache.airavata.api.error.ttypes.InvalidRequestException.thrift_spec), None, ),  # 1
        (2, TType.STRUCT, 'ace', (apache.airavata.api.error.ttypes.AiravataClientException, apache.airavata.api.error.ttypes.AiravataClientException.thrift_spec), None, ),  # 2
        (3, TType.STRUCT, 'ase', (apache.airavata.api.error.ttypes.AiravataSystemException, apache.airavata.api.error.ttypes.AiravataSystemException.thrift_spec), None, ),  # 3
    )

    def __init__(self, success=None, ire=None, ace=None, ase=None,):
        self.success = success
        self.ire = ire
        self.ace = ace
        self.ase = ase

    def read(self, iprot):
        if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None:
            iprot._fast_decode(self, iprot, (self.__class__, self.thrift_spec))
            return
        iprot.readStructBegin()
        while True:
            (fname, ftype, fid) = iprot.readFieldBegin()
            if ftype == TType.STOP:
                break
            if fid == 0:
                if ftype == TType.BOOL:
                    self.success = iprot.readBool()
                else:
                    iprot.skip(ftype)
            elif fid == 1:
                if ftype == TType.STRUCT:
                    self.ire = apache.airavata.api.error.ttypes.InvalidRequestException()
                    self.ire.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 2:
                if ftype == TType.STRUCT:
                    self.ace = apache.airavata.api.error.ttypes.AiravataClientException()
                    self.ace.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 3:
                if ftype == TType.STRUCT:
                    self.ase = apache.airavata.api.error.ttypes.AiravataSystemException()
                    self.ase.read(iprot)
                else:
                    iprot.skip(ftype)
            else:
                iprot.skip(ftype)
            iprot.readFieldEnd()
        iprot.readStructEnd()

    def write(self, oprot):
        if oprot._fast_encode is not None and self.thrift_spec is not None:
            oprot.trans.write(oprot._fast_encode(self, (self.__class__, self.thrift_spec)))
            return
        oprot.writeStructBegin('deleteSSHPubKey_result')
        if self.success is not None:
            oprot.writeFieldBegin('success', TType.BOOL, 0)
            oprot.writeBool(self.success)
            oprot.writeFieldEnd()
        if self.ire is not None:
            oprot.writeFieldBegin('ire', TType.STRUCT, 1)
            self.ire.write(oprot)
            oprot.writeFieldEnd()
        if self.ace is not None:
            oprot.writeFieldBegin('ace', TType.STRUCT, 2)
            self.ace.write(oprot)
            oprot.writeFieldEnd()
        if self.ase is not None:
            oprot.writeFieldBegin('ase', TType.STRUCT, 3)
            self.ase.write(oprot)
            oprot.writeFieldEnd()
        oprot.writeFieldStop()
        oprot.writeStructEnd()

    def validate(self):
        return

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

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

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


class deletePWDCredential_args(object):
    """
    Attributes:
     - authzToken
     - airavataCredStoreToken
     - gatewayId
    """

    thrift_spec = (
        None,  # 0
        (1, TType.STRUCT, 'authzToken', (apache.airavata.model.security.ttypes.AuthzToken, apache.airavata.model.security.ttypes.AuthzToken.thrift_spec), None, ),  # 1
        (2, TType.STRING, 'airavataCredStoreToken', 'UTF8', None, ),  # 2
        (3, TType.STRING, 'gatewayId', 'UTF8', None, ),  # 3
    )

    def __init__(self, authzToken=None, airavataCredStoreToken=None, gatewayId=None,):
        self.authzToken = authzToken
        self.airavataCredStoreToken = airavataCredStoreToken
        self.gatewayId = gatewayId

    def read(self, iprot):
        if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None:
            iprot._fast_decode(self, iprot, (self.__class__, self.thrift_spec))
            return
        iprot.readStructBegin()
        while True:
            (fname, ftype, fid) = iprot.readFieldBegin()
            if ftype == TType.STOP:
                break
            if fid == 1:
                if ftype == TType.STRUCT:
                    self.authzToken = apache.airavata.model.security.ttypes.AuthzToken()
                    self.authzToken.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 2:
                if ftype == TType.STRING:
                    self.airavataCredStoreToken = iprot.readString().decode('utf-8') if sys.version_info[0] == 2 else iprot.readString()
                else:
                    iprot.skip(ftype)
            elif fid == 3:
                if ftype == TType.STRING:
                    self.gatewayId = iprot.readString().decode('utf-8') if sys.version_info[0] == 2 else iprot.readString()
                else:
                    iprot.skip(ftype)
            else:
                iprot.skip(ftype)
            iprot.readFieldEnd()
        iprot.readStructEnd()

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

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

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

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

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


class deletePWDCredential_result(object):
    """
    Attributes:
     - success
     - ire
     - ace
     - ase
    """

    thrift_spec = (
        (0, TType.BOOL, 'success', None, None, ),  # 0
        (1, TType.STRUCT, 'ire', (apache.airavata.api.error.ttypes.InvalidRequestException, apache.airavata.api.error.ttypes.InvalidRequestException.thrift_spec), None, ),  # 1
        (2, TType.STRUCT, 'ace', (apache.airavata.api.error.ttypes.AiravataClientException, apache.airavata.api.error.ttypes.AiravataClientException.thrift_spec), None, ),  # 2
        (3, TType.STRUCT, 'ase', (apache.airavata.api.error.ttypes.AiravataSystemException, apache.airavata.api.error.ttypes.AiravataSystemException.thrift_spec), None, ),  # 3
    )

    def __init__(self, success=None, ire=None, ace=None, ase=None,):
        self.success = success
        self.ire = ire
        self.ace = ace
        self.ase = ase

    def read(self, iprot):
        if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None:
            iprot._fast_decode(self, iprot, (self.__class__, self.thrift_spec))
            return
        iprot.readStructBegin()
        while True:
            (fname, ftype, fid) = iprot.readFieldBegin()
            if ftype == TType.STOP:
                break
            if fid == 0:
                if ftype == TType.BOOL:
                    self.success = iprot.readBool()
                else:
                    iprot.skip(ftype)
            elif fid == 1:
                if ftype == TType.STRUCT:
                    self.ire = apache.airavata.api.error.ttypes.InvalidRequestException()
                    self.ire.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 2:
                if ftype == TType.STRUCT:
                    self.ace = apache.airavata.api.error.ttypes.AiravataClientException()
                    self.ace.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 3:
                if ftype == TType.STRUCT:
                    self.ase = apache.airavata.api.error.ttypes.AiravataSystemException()
                    self.ase.read(iprot)
                else:
                    iprot.skip(ftype)
            else:
                iprot.skip(ftype)
            iprot.readFieldEnd()
        iprot.readStructEnd()

    def write(self, oprot):
        if oprot._fast_encode is not None and self.thrift_spec is not None:
            oprot.trans.write(oprot._fast_encode(self, (self.__class__, self.thrift_spec)))
            return
        oprot.writeStructBegin('deletePWDCredential_result')
        if self.success is not None:
            oprot.writeFieldBegin('success', TType.BOOL, 0)
            oprot.writeBool(self.success)
            oprot.writeFieldEnd()
        if self.ire is not None:
            oprot.writeFieldBegin('ire', TType.STRUCT, 1)
            self.ire.write(oprot)
            oprot.writeFieldEnd()
        if self.ace is not None:
            oprot.writeFieldBegin('ace', TType.STRUCT, 2)
            self.ace.write(oprot)
            oprot.writeFieldEnd()
        if self.ase is not None:
            oprot.writeFieldBegin('ase', TType.STRUCT, 3)
            self.ase.write(oprot)
            oprot.writeFieldEnd()
        oprot.writeFieldStop()
        oprot.writeStructEnd()

    def validate(self):
        return

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

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

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


class createProject_args(object):
    """
    Attributes:
     - authzToken
     - gatewayId
     - project
    """

    thrift_spec = (
        None,  # 0
        (1, TType.STRUCT, 'authzToken', (apache.airavata.model.security.ttypes.AuthzToken, apache.airavata.model.security.ttypes.AuthzToken.thrift_spec), None, ),  # 1
        (2, TType.STRING, 'gatewayId', 'UTF8', None, ),  # 2
        (3, TType.STRUCT, 'project', (apache.airavata.model.workspace.ttypes.Project, apache.airavata.model.workspace.ttypes.Project.thrift_spec), None, ),  # 3
    )

    def __init__(self, authzToken=None, gatewayId=None, project=None,):
        self.authzToken = authzToken
        self.gatewayId = gatewayId
        self.project = project

    def read(self, iprot):
        if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None:
            iprot._fast_decode(self, iprot, (self.__class__, self.thrift_spec))
            return
        iprot.readStructBegin()
        while True:
            (fname, ftype, fid) = iprot.readFieldBegin()
            if ftype == TType.STOP:
                break
            if fid == 1:
                if ftype == TType.STRUCT:
                    self.authzToken = apache.airavata.model.security.ttypes.AuthzToken()
                    self.authzToken.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 2:
                if ftype == TType.STRING:
                    self.gatewayId = iprot.readString().decode('utf-8') if sys.version_info[0] == 2 else iprot.readString()
                else:
                    iprot.skip(ftype)
            elif fid == 3:
                if ftype == TType.STRUCT:
                    self.project = apache.airavata.model.workspace.ttypes.Project()
                    self.project.read(iprot)
                else:
                    iprot.skip(ftype)
            else:
                iprot.skip(ftype)
            iprot.readFieldEnd()
        iprot.readStructEnd()

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

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

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

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

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


class createProject_result(object):
    """
    Attributes:
     - success
     - ire
     - ace
     - ase
     - ae
    """

    thrift_spec = (
        (0, TType.STRING, 'success', 'UTF8', None, ),  # 0
        (1, TType.STRUCT, 'ire', (apache.airavata.api.error.ttypes.InvalidRequestException, apache.airavata.api.error.ttypes.InvalidRequestException.thrift_spec), None, ),  # 1
        (2, TType.STRUCT, 'ace', (apache.airavata.api.error.ttypes.AiravataClientException, apache.airavata.api.error.ttypes.AiravataClientException.thrift_spec), None, ),  # 2
        (3, TType.STRUCT, 'ase', (apache.airavata.api.error.ttypes.AiravataSystemException, apache.airavata.api.error.ttypes.AiravataSystemException.thrift_spec), None, ),  # 3
        (4, TType.STRUCT, 'ae', (apache.airavata.api.error.ttypes.AuthorizationException, apache.airavata.api.error.ttypes.AuthorizationException.thrift_spec), None, ),  # 4
    )

    def __init__(self, success=None, ire=None, ace=None, ase=None, ae=None,):
        self.success = success
        self.ire = ire
        self.ace = ace
        self.ase = ase
        self.ae = ae

    def read(self, iprot):
        if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None:
            iprot._fast_decode(self, iprot, (self.__class__, self.thrift_spec))
            return
        iprot.readStructBegin()
        while True:
            (fname, ftype, fid) = iprot.readFieldBegin()
            if ftype == TType.STOP:
                break
            if fid == 0:
                if ftype == TType.STRING:
                    self.success = iprot.readString().decode('utf-8') if sys.version_info[0] == 2 else iprot.readString()
                else:
                    iprot.skip(ftype)
            elif fid == 1:
                if ftype == TType.STRUCT:
                    self.ire = apache.airavata.api.error.ttypes.InvalidRequestException()
                    self.ire.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 2:
                if ftype == TType.STRUCT:
                    self.ace = apache.airavata.api.error.ttypes.AiravataClientException()
                    self.ace.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 3:
                if ftype == TType.STRUCT:
                    self.ase = apache.airavata.api.error.ttypes.AiravataSystemException()
                    self.ase.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 4:
                if ftype == TType.STRUCT:
                    self.ae = apache.airavata.api.error.ttypes.AuthorizationException()
                    self.ae.read(iprot)
                else:
                    iprot.skip(ftype)
            else:
                iprot.skip(ftype)
            iprot.readFieldEnd()
        iprot.readStructEnd()

    def write(self, oprot):
        if oprot._fast_encode is not None and self.thrift_spec is not None:
            oprot.trans.write(oprot._fast_encode(self, (self.__class__, self.thrift_spec)))
            return
        oprot.writeStructBegin('createProject_result')
        if self.success is not None:
            oprot.writeFieldBegin('success', TType.STRING, 0)
            oprot.writeString(self.success.encode('utf-8') if sys.version_info[0] == 2 else self.success)
            oprot.writeFieldEnd()
        if self.ire is not None:
            oprot.writeFieldBegin('ire', TType.STRUCT, 1)
            self.ire.write(oprot)
            oprot.writeFieldEnd()
        if self.ace is not None:
            oprot.writeFieldBegin('ace', TType.STRUCT, 2)
            self.ace.write(oprot)
            oprot.writeFieldEnd()
        if self.ase is not None:
            oprot.writeFieldBegin('ase', TType.STRUCT, 3)
            self.ase.write(oprot)
            oprot.writeFieldEnd()
        if self.ae is not None:
            oprot.writeFieldBegin('ae', TType.STRUCT, 4)
            self.ae.write(oprot)
            oprot.writeFieldEnd()
        oprot.writeFieldStop()
        oprot.writeStructEnd()

    def validate(self):
        return

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

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

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


class updateProject_args(object):
    """
    Attributes:
     - authzToken
     - projectId
     - updatedProject
    """

    thrift_spec = (
        None,  # 0
        (1, TType.STRUCT, 'authzToken', (apache.airavata.model.security.ttypes.AuthzToken, apache.airavata.model.security.ttypes.AuthzToken.thrift_spec), None, ),  # 1
        (2, TType.STRING, 'projectId', 'UTF8', None, ),  # 2
        (3, TType.STRUCT, 'updatedProject', (apache.airavata.model.workspace.ttypes.Project, apache.airavata.model.workspace.ttypes.Project.thrift_spec), None, ),  # 3
    )

    def __init__(self, authzToken=None, projectId=None, updatedProject=None,):
        self.authzToken = authzToken
        self.projectId = projectId
        self.updatedProject = updatedProject

    def read(self, iprot):
        if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None:
            iprot._fast_decode(self, iprot, (self.__class__, self.thrift_spec))
            return
        iprot.readStructBegin()
        while True:
            (fname, ftype, fid) = iprot.readFieldBegin()
            if ftype == TType.STOP:
                break
            if fid == 1:
                if ftype == TType.STRUCT:
                    self.authzToken = apache.airavata.model.security.ttypes.AuthzToken()
                    self.authzToken.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 2:
                if ftype == TType.STRING:
                    self.projectId = iprot.readString().decode('utf-8') if sys.version_info[0] == 2 else iprot.readString()
                else:
                    iprot.skip(ftype)
            elif fid == 3:
                if ftype == TType.STRUCT:
                    self.updatedProject = apache.airavata.model.workspace.ttypes.Project()
                    self.updatedProject.read(iprot)
                else:
                    iprot.skip(ftype)
            else:
                iprot.skip(ftype)
            iprot.readFieldEnd()
        iprot.readStructEnd()

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

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

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

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

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


class updateProject_result(object):
    """
    Attributes:
     - ire
     - ace
     - ase
     - pnfe
     - ae
    """

    thrift_spec = (
        None,  # 0
        (1, TType.STRUCT, 'ire', (apache.airavata.api.error.ttypes.InvalidRequestException, apache.airavata.api.error.ttypes.InvalidRequestException.thrift_spec), None, ),  # 1
        (2, TType.STRUCT, 'ace', (apache.airavata.api.error.ttypes.AiravataClientException, apache.airavata.api.error.ttypes.AiravataClientException.thrift_spec), None, ),  # 2
        (3, TType.STRUCT, 'ase', (apache.airavata.api.error.ttypes.AiravataSystemException, apache.airavata.api.error.ttypes.AiravataSystemException.thrift_spec), None, ),  # 3
        (4, TType.STRUCT, 'pnfe', (apache.airavata.api.error.ttypes.ProjectNotFoundException, apache.airavata.api.error.ttypes.ProjectNotFoundException.thrift_spec), None, ),  # 4
        (5, TType.STRUCT, 'ae', (apache.airavata.api.error.ttypes.AuthorizationException, apache.airavata.api.error.ttypes.AuthorizationException.thrift_spec), None, ),  # 5
    )

    def __init__(self, ire=None, ace=None, ase=None, pnfe=None, ae=None,):
        self.ire = ire
        self.ace = ace
        self.ase = ase
        self.pnfe = pnfe
        self.ae = ae

    def read(self, iprot):
        if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None:
            iprot._fast_decode(self, iprot, (self.__class__, self.thrift_spec))
            return
        iprot.readStructBegin()
        while True:
            (fname, ftype, fid) = iprot.readFieldBegin()
            if ftype == TType.STOP:
                break
            if fid == 1:
                if ftype == TType.STRUCT:
                    self.ire = apache.airavata.api.error.ttypes.InvalidRequestException()
                    self.ire.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 2:
                if ftype == TType.STRUCT:
                    self.ace = apache.airavata.api.error.ttypes.AiravataClientException()
                    self.ace.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 3:
                if ftype == TType.STRUCT:
                    self.ase = apache.airavata.api.error.ttypes.AiravataSystemException()
                    self.ase.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 4:
                if ftype == TType.STRUCT:
                    self.pnfe = apache.airavata.api.error.ttypes.ProjectNotFoundException()
                    self.pnfe.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 5:
                if ftype == TType.STRUCT:
                    self.ae = apache.airavata.api.error.ttypes.AuthorizationException()
                    self.ae.read(iprot)
                else:
                    iprot.skip(ftype)
            else:
                iprot.skip(ftype)
            iprot.readFieldEnd()
        iprot.readStructEnd()

    def write(self, oprot):
        if oprot._fast_encode is not None and self.thrift_spec is not None:
            oprot.trans.write(oprot._fast_encode(self, (self.__class__, self.thrift_spec)))
            return
        oprot.writeStructBegin('updateProject_result')
        if self.ire is not None:
            oprot.writeFieldBegin('ire', TType.STRUCT, 1)
            self.ire.write(oprot)
            oprot.writeFieldEnd()
        if self.ace is not None:
            oprot.writeFieldBegin('ace', TType.STRUCT, 2)
            self.ace.write(oprot)
            oprot.writeFieldEnd()
        if self.ase is not None:
            oprot.writeFieldBegin('ase', TType.STRUCT, 3)
            self.ase.write(oprot)
            oprot.writeFieldEnd()
        if self.pnfe is not None:
            oprot.writeFieldBegin('pnfe', TType.STRUCT, 4)
            self.pnfe.write(oprot)
            oprot.writeFieldEnd()
        if self.ae is not None:
            oprot.writeFieldBegin('ae', TType.STRUCT, 5)
            self.ae.write(oprot)
            oprot.writeFieldEnd()
        oprot.writeFieldStop()
        oprot.writeStructEnd()

    def validate(self):
        return

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

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

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


class getProject_args(object):
    """
    Attributes:
     - authzToken
     - projectId
    """

    thrift_spec = (
        None,  # 0
        (1, TType.STRUCT, 'authzToken', (apache.airavata.model.security.ttypes.AuthzToken, apache.airavata.model.security.ttypes.AuthzToken.thrift_spec), None, ),  # 1
        (2, TType.STRING, 'projectId', 'UTF8', None, ),  # 2
    )

    def __init__(self, authzToken=None, projectId=None,):
        self.authzToken = authzToken
        self.projectId = projectId

    def read(self, iprot):
        if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None:
            iprot._fast_decode(self, iprot, (self.__class__, self.thrift_spec))
            return
        iprot.readStructBegin()
        while True:
            (fname, ftype, fid) = iprot.readFieldBegin()
            if ftype == TType.STOP:
                break
            if fid == 1:
                if ftype == TType.STRUCT:
                    self.authzToken = apache.airavata.model.security.ttypes.AuthzToken()
                    self.authzToken.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 2:
                if ftype == TType.STRING:
                    self.projectId = iprot.readString().decode('utf-8') if sys.version_info[0] == 2 else iprot.readString()
                else:
                    iprot.skip(ftype)
            else:
                iprot.skip(ftype)
            iprot.readFieldEnd()
        iprot.readStructEnd()

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

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

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

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

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


class getProject_result(object):
    """
    Attributes:
     - success
     - ire
     - ace
     - ase
     - pnfe
     - ae
    """

    thrift_spec = (
        (0, TType.STRUCT, 'success', (apache.airavata.model.workspace.ttypes.Project, apache.airavata.model.workspace.ttypes.Project.thrift_spec), None, ),  # 0
        (1, TType.STRUCT, 'ire', (apache.airavata.api.error.ttypes.InvalidRequestException, apache.airavata.api.error.ttypes.InvalidRequestException.thrift_spec), None, ),  # 1
        (2, TType.STRUCT, 'ace', (apache.airavata.api.error.ttypes.AiravataClientException, apache.airavata.api.error.ttypes.AiravataClientException.thrift_spec), None, ),  # 2
        (3, TType.STRUCT, 'ase', (apache.airavata.api.error.ttypes.AiravataSystemException, apache.airavata.api.error.ttypes.AiravataSystemException.thrift_spec), None, ),  # 3
        (4, TType.STRUCT, 'pnfe', (apache.airavata.api.error.ttypes.ProjectNotFoundException, apache.airavata.api.error.ttypes.ProjectNotFoundException.thrift_spec), None, ),  # 4
        (5, TType.STRUCT, 'ae', (apache.airavata.api.error.ttypes.AuthorizationException, apache.airavata.api.error.ttypes.AuthorizationException.thrift_spec), None, ),  # 5
    )

    def __init__(self, success=None, ire=None, ace=None, ase=None, pnfe=None, ae=None,):
        self.success = success
        self.ire = ire
        self.ace = ace
        self.ase = ase
        self.pnfe = pnfe
        self.ae = ae

    def read(self, iprot):
        if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None:
            iprot._fast_decode(self, iprot, (self.__class__, self.thrift_spec))
            return
        iprot.readStructBegin()
        while True:
            (fname, ftype, fid) = iprot.readFieldBegin()
            if ftype == TType.STOP:
                break
            if fid == 0:
                if ftype == TType.STRUCT:
                    self.success = apache.airavata.model.workspace.ttypes.Project()
                    self.success.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 1:
                if ftype == TType.STRUCT:
                    self.ire = apache.airavata.api.error.ttypes.InvalidRequestException()
                    self.ire.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 2:
                if ftype == TType.STRUCT:
                    self.ace = apache.airavata.api.error.ttypes.AiravataClientException()
                    self.ace.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 3:
                if ftype == TType.STRUCT:
                    self.ase = apache.airavata.api.error.ttypes.AiravataSystemException()
                    self.ase.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 4:
                if ftype == TType.STRUCT:
                    self.pnfe = apache.airavata.api.error.ttypes.ProjectNotFoundException()
                    self.pnfe.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 5:
                if ftype == TType.STRUCT:
                    self.ae = apache.airavata.api.error.ttypes.AuthorizationException()
                    self.ae.read(iprot)
                else:
                    iprot.skip(ftype)
            else:
                iprot.skip(ftype)
            iprot.readFieldEnd()
        iprot.readStructEnd()

    def write(self, oprot):
        if oprot._fast_encode is not None and self.thrift_spec is not None:
            oprot.trans.write(oprot._fast_encode(self, (self.__class__, self.thrift_spec)))
            return
        oprot.writeStructBegin('getProject_result')
        if self.success is not None:
            oprot.writeFieldBegin('success', TType.STRUCT, 0)
            self.success.write(oprot)
            oprot.writeFieldEnd()
        if self.ire is not None:
            oprot.writeFieldBegin('ire', TType.STRUCT, 1)
            self.ire.write(oprot)
            oprot.writeFieldEnd()
        if self.ace is not None:
            oprot.writeFieldBegin('ace', TType.STRUCT, 2)
            self.ace.write(oprot)
            oprot.writeFieldEnd()
        if self.ase is not None:
            oprot.writeFieldBegin('ase', TType.STRUCT, 3)
            self.ase.write(oprot)
            oprot.writeFieldEnd()
        if self.pnfe is not None:
            oprot.writeFieldBegin('pnfe', TType.STRUCT, 4)
            self.pnfe.write(oprot)
            oprot.writeFieldEnd()
        if self.ae is not None:
            oprot.writeFieldBegin('ae', TType.STRUCT, 5)
            self.ae.write(oprot)
            oprot.writeFieldEnd()
        oprot.writeFieldStop()
        oprot.writeStructEnd()

    def validate(self):
        return

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

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

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


class deleteProject_args(object):
    """
    Attributes:
     - authzToken
     - projectId
    """

    thrift_spec = (
        None,  # 0
        (1, TType.STRUCT, 'authzToken', (apache.airavata.model.security.ttypes.AuthzToken, apache.airavata.model.security.ttypes.AuthzToken.thrift_spec), None, ),  # 1
        (2, TType.STRING, 'projectId', 'UTF8', None, ),  # 2
    )

    def __init__(self, authzToken=None, projectId=None,):
        self.authzToken = authzToken
        self.projectId = projectId

    def read(self, iprot):
        if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None:
            iprot._fast_decode(self, iprot, (self.__class__, self.thrift_spec))
            return
        iprot.readStructBegin()
        while True:
            (fname, ftype, fid) = iprot.readFieldBegin()
            if ftype == TType.STOP:
                break
            if fid == 1:
                if ftype == TType.STRUCT:
                    self.authzToken = apache.airavata.model.security.ttypes.AuthzToken()
                    self.authzToken.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 2:
                if ftype == TType.STRING:
                    self.projectId = iprot.readString().decode('utf-8') if sys.version_info[0] == 2 else iprot.readString()
                else:
                    iprot.skip(ftype)
            else:
                iprot.skip(ftype)
            iprot.readFieldEnd()
        iprot.readStructEnd()

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

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

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

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

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


class deleteProject_result(object):
    """
    Attributes:
     - success
     - ire
     - ace
     - ase
     - pnfe
     - ae
    """

    thrift_spec = (
        (0, TType.BOOL, 'success', None, None, ),  # 0
        (1, TType.STRUCT, 'ire', (apache.airavata.api.error.ttypes.InvalidRequestException, apache.airavata.api.error.ttypes.InvalidRequestException.thrift_spec), None, ),  # 1
        (2, TType.STRUCT, 'ace', (apache.airavata.api.error.ttypes.AiravataClientException, apache.airavata.api.error.ttypes.AiravataClientException.thrift_spec), None, ),  # 2
        (3, TType.STRUCT, 'ase', (apache.airavata.api.error.ttypes.AiravataSystemException, apache.airavata.api.error.ttypes.AiravataSystemException.thrift_spec), None, ),  # 3
        (4, TType.STRUCT, 'pnfe', (apache.airavata.api.error.ttypes.ProjectNotFoundException, apache.airavata.api.error.ttypes.ProjectNotFoundException.thrift_spec), None, ),  # 4
        (5, TType.STRUCT, 'ae', (apache.airavata.api.error.ttypes.AuthorizationException, apache.airavata.api.error.ttypes.AuthorizationException.thrift_spec), None, ),  # 5
    )

    def __init__(self, success=None, ire=None, ace=None, ase=None, pnfe=None, ae=None,):
        self.success = success
        self.ire = ire
        self.ace = ace
        self.ase = ase
        self.pnfe = pnfe
        self.ae = ae

    def read(self, iprot):
        if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None:
            iprot._fast_decode(self, iprot, (self.__class__, self.thrift_spec))
            return
        iprot.readStructBegin()
        while True:
            (fname, ftype, fid) = iprot.readFieldBegin()
            if ftype == TType.STOP:
                break
            if fid == 0:
                if ftype == TType.BOOL:
                    self.success = iprot.readBool()
                else:
                    iprot.skip(ftype)
            elif fid == 1:
                if ftype == TType.STRUCT:
                    self.ire = apache.airavata.api.error.ttypes.InvalidRequestException()
                    self.ire.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 2:
                if ftype == TType.STRUCT:
                    self.ace = apache.airavata.api.error.ttypes.AiravataClientException()
                    self.ace.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 3:
                if ftype == TType.STRUCT:
                    self.ase = apache.airavata.api.error.ttypes.AiravataSystemException()
                    self.ase.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 4:
                if ftype == TType.STRUCT:
                    self.pnfe = apache.airavata.api.error.ttypes.ProjectNotFoundException()
                    self.pnfe.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 5:
                if ftype == TType.STRUCT:
                    self.ae = apache.airavata.api.error.ttypes.AuthorizationException()
                    self.ae.read(iprot)
                else:
                    iprot.skip(ftype)
            else:
                iprot.skip(ftype)
            iprot.readFieldEnd()
        iprot.readStructEnd()

    def write(self, oprot):
        if oprot._fast_encode is not None and self.thrift_spec is not None:
            oprot.trans.write(oprot._fast_encode(self, (self.__class__, self.thrift_spec)))
            return
        oprot.writeStructBegin('deleteProject_result')
        if self.success is not None:
            oprot.writeFieldBegin('success', TType.BOOL, 0)
            oprot.writeBool(self.success)
            oprot.writeFieldEnd()
        if self.ire is not None:
            oprot.writeFieldBegin('ire', TType.STRUCT, 1)
            self.ire.write(oprot)
            oprot.writeFieldEnd()
        if self.ace is not None:
            oprot.writeFieldBegin('ace', TType.STRUCT, 2)
            self.ace.write(oprot)
            oprot.writeFieldEnd()
        if self.ase is not None:
            oprot.writeFieldBegin('ase', TType.STRUCT, 3)
            self.ase.write(oprot)
            oprot.writeFieldEnd()
        if self.pnfe is not None:
            oprot.writeFieldBegin('pnfe', TType.STRUCT, 4)
            self.pnfe.write(oprot)
            oprot.writeFieldEnd()
        if self.ae is not None:
            oprot.writeFieldBegin('ae', TType.STRUCT, 5)
            self.ae.write(oprot)
            oprot.writeFieldEnd()
        oprot.writeFieldStop()
        oprot.writeStructEnd()

    def validate(self):
        return

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

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

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


class getUserProjects_args(object):
    """
    Attributes:
     - authzToken
     - gatewayId
     - userName
     - limit
     - offset
    """

    thrift_spec = (
        None,  # 0
        (1, TType.STRUCT, 'authzToken', (apache.airavata.model.security.ttypes.AuthzToken, apache.airavata.model.security.ttypes.AuthzToken.thrift_spec), None, ),  # 1
        (2, TType.STRING, 'gatewayId', 'UTF8', None, ),  # 2
        (3, TType.STRING, 'userName', 'UTF8', None, ),  # 3
        (4, TType.I32, 'limit', None, None, ),  # 4
        (5, TType.I32, 'offset', None, None, ),  # 5
    )

    def __init__(self, authzToken=None, gatewayId=None, userName=None, limit=None, offset=None,):
        self.authzToken = authzToken
        self.gatewayId = gatewayId
        self.userName = userName
        self.limit = limit
        self.offset = offset

    def read(self, iprot):
        if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None:
            iprot._fast_decode(self, iprot, (self.__class__, self.thrift_spec))
            return
        iprot.readStructBegin()
        while True:
            (fname, ftype, fid) = iprot.readFieldBegin()
            if ftype == TType.STOP:
                break
            if fid == 1:
                if ftype == TType.STRUCT:
                    self.authzToken = apache.airavata.model.security.ttypes.AuthzToken()
                    self.authzToken.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 2:
                if ftype == TType.STRING:
                    self.gatewayId = iprot.readString().decode('utf-8') if sys.version_info[0] == 2 else iprot.readString()
                else:
                    iprot.skip(ftype)
            elif fid == 3:
                if ftype == TType.STRING:
                    self.userName = iprot.readString().decode('utf-8') if sys.version_info[0] == 2 else iprot.readString()
                else:
                    iprot.skip(ftype)
            elif fid == 4:
                if ftype == TType.I32:
                    self.limit = iprot.readI32()
                else:
                    iprot.skip(ftype)
            elif fid == 5:
                if ftype == TType.I32:
                    self.offset = iprot.readI32()
                else:
                    iprot.skip(ftype)
            else:
                iprot.skip(ftype)
            iprot.readFieldEnd()
        iprot.readStructEnd()

    def write(self, oprot):
        if oprot._fast_encode is not None and self.thrift_spec is not None:
            oprot.trans.write(oprot._fast_encode(self, (self.__class__, self.thrift_spec)))
            return
        oprot.writeStructBegin('getUserProjects_args')
        if self.authzToken is not None:
            oprot.writeFieldBegin('authzToken', TType.STRUCT, 1)
            self.authzToken.write(oprot)
            oprot.writeFieldEnd()
        if self.gatewayId is not None:
            oprot.writeFieldBegin('gatewayId', TType.STRING, 2)
            oprot.writeString(self.gatewayId.encode('utf-8') if sys.version_info[0] == 2 else self.gatewayId)
            oprot.writeFieldEnd()
        if self.userName is not None:
            oprot.writeFieldBegin('userName', TType.STRING, 3)
            oprot.writeString(self.userName.encode('utf-8') if sys.version_info[0] == 2 else self.userName)
            oprot.writeFieldEnd()
        if self.limit is not None:
            oprot.writeFieldBegin('limit', TType.I32, 4)
            oprot.writeI32(self.limit)
            oprot.writeFieldEnd()
        if self.offset is not None:
            oprot.writeFieldBegin('offset', TType.I32, 5)
            oprot.writeI32(self.offset)
            oprot.writeFieldEnd()
        oprot.writeFieldStop()
        oprot.writeStructEnd()

    def validate(self):
        if self.authzToken is None:
            raise TProtocolException(message='Required field authzToken is unset!')
        if self.gatewayId is None:
            raise TProtocolException(message='Required field gatewayId is unset!')
        if self.userName is None:
            raise TProtocolException(message='Required field userName is unset!')
        if self.limit is None:
            raise TProtocolException(message='Required field limit is unset!')
        if self.offset is None:
            raise TProtocolException(message='Required field offset is unset!')
        return

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

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

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


class getUserProjects_result(object):
    """
    Attributes:
     - success
     - ire
     - ace
     - ase
     - ae
    """

    thrift_spec = (
        (0, TType.LIST, 'success', (TType.STRUCT, (apache.airavata.model.workspace.ttypes.Project, apache.airavata.model.workspace.ttypes.Project.thrift_spec), False), None, ),  # 0
        (1, TType.STRUCT, 'ire', (apache.airavata.api.error.ttypes.InvalidRequestException, apache.airavata.api.error.ttypes.InvalidRequestException.thrift_spec), None, ),  # 1
        (2, TType.STRUCT, 'ace', (apache.airavata.api.error.ttypes.AiravataClientException, apache.airavata.api.error.ttypes.AiravataClientException.thrift_spec), None, ),  # 2
        (3, TType.STRUCT, 'ase', (apache.airavata.api.error.ttypes.AiravataSystemException, apache.airavata.api.error.ttypes.AiravataSystemException.thrift_spec), None, ),  # 3
        (4, TType.STRUCT, 'ae', (apache.airavata.api.error.ttypes.AuthorizationException, apache.airavata.api.error.ttypes.AuthorizationException.thrift_spec), None, ),  # 4
    )

    def __init__(self, success=None, ire=None, ace=None, ase=None, ae=None,):
        self.success = success
        self.ire = ire
        self.ace = ace
        self.ase = ase
        self.ae = ae

    def read(self, iprot):
        if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None:
            iprot._fast_decode(self, iprot, (self.__class__, self.thrift_spec))
            return
        iprot.readStructBegin()
        while True:
            (fname, ftype, fid) = iprot.readFieldBegin()
            if ftype == TType.STOP:
                break
            if fid == 0:
                if ftype == TType.LIST:
                    self.success = []
                    (_etype56, _size53) = iprot.readListBegin()
                    for _i57 in range(_size53):
                        _elem58 = apache.airavata.model.workspace.ttypes.Project()
                        _elem58.read(iprot)
                        self.success.append(_elem58)
                    iprot.readListEnd()
                else:
                    iprot.skip(ftype)
            elif fid == 1:
                if ftype == TType.STRUCT:
                    self.ire = apache.airavata.api.error.ttypes.InvalidRequestException()
                    self.ire.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 2:
                if ftype == TType.STRUCT:
                    self.ace = apache.airavata.api.error.ttypes.AiravataClientException()
                    self.ace.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 3:
                if ftype == TType.STRUCT:
                    self.ase = apache.airavata.api.error.ttypes.AiravataSystemException()
                    self.ase.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 4:
                if ftype == TType.STRUCT:
                    self.ae = apache.airavata.api.error.ttypes.AuthorizationException()
                    self.ae.read(iprot)
                else:
                    iprot.skip(ftype)
            else:
                iprot.skip(ftype)
            iprot.readFieldEnd()
        iprot.readStructEnd()

    def write(self, oprot):
        if oprot._fast_encode is not None and self.thrift_spec is not None:
            oprot.trans.write(oprot._fast_encode(self, (self.__class__, self.thrift_spec)))
            return
        oprot.writeStructBegin('getUserProjects_result')
        if self.success is not None:
            oprot.writeFieldBegin('success', TType.LIST, 0)
            oprot.writeListBegin(TType.STRUCT, len(self.success))
            for iter59 in self.success:
                iter59.write(oprot)
            oprot.writeListEnd()
            oprot.writeFieldEnd()
        if self.ire is not None:
            oprot.writeFieldBegin('ire', TType.STRUCT, 1)
            self.ire.write(oprot)
            oprot.writeFieldEnd()
        if self.ace is not None:
            oprot.writeFieldBegin('ace', TType.STRUCT, 2)
            self.ace.write(oprot)
            oprot.writeFieldEnd()
        if self.ase is not None:
            oprot.writeFieldBegin('ase', TType.STRUCT, 3)
            self.ase.write(oprot)
            oprot.writeFieldEnd()
        if self.ae is not None:
            oprot.writeFieldBegin('ae', TType.STRUCT, 4)
            self.ae.write(oprot)
            oprot.writeFieldEnd()
        oprot.writeFieldStop()
        oprot.writeStructEnd()

    def validate(self):
        return

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

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

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


class searchProjects_args(object):
    """
    Attributes:
     - authzToken
     - gatewayId
     - userName
     - filters
     - limit
     - offset
    """

    thrift_spec = (
        None,  # 0
        (1, TType.STRUCT, 'authzToken', (apache.airavata.model.security.ttypes.AuthzToken, apache.airavata.model.security.ttypes.AuthzToken.thrift_spec), None, ),  # 1
        (2, TType.STRING, 'gatewayId', 'UTF8', None, ),  # 2
        (3, TType.STRING, 'userName', 'UTF8', None, ),  # 3
        (4, TType.MAP, 'filters', (TType.I32, None, TType.STRING, 'UTF8', False), None, ),  # 4
        (5, TType.I32, 'limit', None, None, ),  # 5
        (6, TType.I32, 'offset', None, None, ),  # 6
    )

    def __init__(self, authzToken=None, gatewayId=None, userName=None, filters=None, limit=None, offset=None,):
        self.authzToken = authzToken
        self.gatewayId = gatewayId
        self.userName = userName
        self.filters = filters
        self.limit = limit
        self.offset = offset

    def read(self, iprot):
        if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None:
            iprot._fast_decode(self, iprot, (self.__class__, self.thrift_spec))
            return
        iprot.readStructBegin()
        while True:
            (fname, ftype, fid) = iprot.readFieldBegin()
            if ftype == TType.STOP:
                break
            if fid == 1:
                if ftype == TType.STRUCT:
                    self.authzToken = apache.airavata.model.security.ttypes.AuthzToken()
                    self.authzToken.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 2:
                if ftype == TType.STRING:
                    self.gatewayId = iprot.readString().decode('utf-8') if sys.version_info[0] == 2 else iprot.readString()
                else:
                    iprot.skip(ftype)
            elif fid == 3:
                if ftype == TType.STRING:
                    self.userName = iprot.readString().decode('utf-8') if sys.version_info[0] == 2 else iprot.readString()
                else:
                    iprot.skip(ftype)
            elif fid == 4:
                if ftype == TType.MAP:
                    self.filters = {}
                    (_ktype61, _vtype62, _size60) = iprot.readMapBegin()
                    for _i64 in range(_size60):
                        _key65 = iprot.readI32()
                        _val66 = iprot.readString().decode('utf-8') if sys.version_info[0] == 2 else iprot.readString()
                        self.filters[_key65] = _val66
                    iprot.readMapEnd()
                else:
                    iprot.skip(ftype)
            elif fid == 5:
                if ftype == TType.I32:
                    self.limit = iprot.readI32()
                else:
                    iprot.skip(ftype)
            elif fid == 6:
                if ftype == TType.I32:
                    self.offset = iprot.readI32()
                else:
                    iprot.skip(ftype)
            else:
                iprot.skip(ftype)
            iprot.readFieldEnd()
        iprot.readStructEnd()

    def write(self, oprot):
        if oprot._fast_encode is not None and self.thrift_spec is not None:
            oprot.trans.write(oprot._fast_encode(self, (self.__class__, self.thrift_spec)))
            return
        oprot.writeStructBegin('searchProjects_args')
        if self.authzToken is not None:
            oprot.writeFieldBegin('authzToken', TType.STRUCT, 1)
            self.authzToken.write(oprot)
            oprot.writeFieldEnd()
        if self.gatewayId is not None:
            oprot.writeFieldBegin('gatewayId', TType.STRING, 2)
            oprot.writeString(self.gatewayId.encode('utf-8') if sys.version_info[0] == 2 else self.gatewayId)
            oprot.writeFieldEnd()
        if self.userName is not None:
            oprot.writeFieldBegin('userName', TType.STRING, 3)
            oprot.writeString(self.userName.encode('utf-8') if sys.version_info[0] == 2 else self.userName)
            oprot.writeFieldEnd()
        if self.filters is not None:
            oprot.writeFieldBegin('filters', TType.MAP, 4)
            oprot.writeMapBegin(TType.I32, TType.STRING, len(self.filters))
            for kiter67, viter68 in self.filters.items():
                oprot.writeI32(kiter67)
                oprot.writeString(viter68.encode('utf-8') if sys.version_info[0] == 2 else viter68)
            oprot.writeMapEnd()
            oprot.writeFieldEnd()
        if self.limit is not None:
            oprot.writeFieldBegin('limit', TType.I32, 5)
            oprot.writeI32(self.limit)
            oprot.writeFieldEnd()
        if self.offset is not None:
            oprot.writeFieldBegin('offset', TType.I32, 6)
            oprot.writeI32(self.offset)
            oprot.writeFieldEnd()
        oprot.writeFieldStop()
        oprot.writeStructEnd()

    def validate(self):
        if self.authzToken is None:
            raise TProtocolException(message='Required field authzToken is unset!')
        if self.gatewayId is None:
            raise TProtocolException(message='Required field gatewayId is unset!')
        if self.userName is None:
            raise TProtocolException(message='Required field userName is unset!')
        if self.limit is None:
            raise TProtocolException(message='Required field limit is unset!')
        if self.offset is None:
            raise TProtocolException(message='Required field offset is unset!')
        return

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

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

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


class searchProjects_result(object):
    """
    Attributes:
     - success
     - ire
     - ace
     - ase
     - ae
    """

    thrift_spec = (
        (0, TType.LIST, 'success', (TType.STRUCT, (apache.airavata.model.workspace.ttypes.Project, apache.airavata.model.workspace.ttypes.Project.thrift_spec), False), None, ),  # 0
        (1, TType.STRUCT, 'ire', (apache.airavata.api.error.ttypes.InvalidRequestException, apache.airavata.api.error.ttypes.InvalidRequestException.thrift_spec), None, ),  # 1
        (2, TType.STRUCT, 'ace', (apache.airavata.api.error.ttypes.AiravataClientException, apache.airavata.api.error.ttypes.AiravataClientException.thrift_spec), None, ),  # 2
        (3, TType.STRUCT, 'ase', (apache.airavata.api.error.ttypes.AiravataSystemException, apache.airavata.api.error.ttypes.AiravataSystemException.thrift_spec), None, ),  # 3
        (4, TType.STRUCT, 'ae', (apache.airavata.api.error.ttypes.AuthorizationException, apache.airavata.api.error.ttypes.AuthorizationException.thrift_spec), None, ),  # 4
    )

    def __init__(self, success=None, ire=None, ace=None, ase=None, ae=None,):
        self.success = success
        self.ire = ire
        self.ace = ace
        self.ase = ase
        self.ae = ae

    def read(self, iprot):
        if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None:
            iprot._fast_decode(self, iprot, (self.__class__, self.thrift_spec))
            return
        iprot.readStructBegin()
        while True:
            (fname, ftype, fid) = iprot.readFieldBegin()
            if ftype == TType.STOP:
                break
            if fid == 0:
                if ftype == TType.LIST:
                    self.success = []
                    (_etype72, _size69) = iprot.readListBegin()
                    for _i73 in range(_size69):
                        _elem74 = apache.airavata.model.workspace.ttypes.Project()
                        _elem74.read(iprot)
                        self.success.append(_elem74)
                    iprot.readListEnd()
                else:
                    iprot.skip(ftype)
            elif fid == 1:
                if ftype == TType.STRUCT:
                    self.ire = apache.airavata.api.error.ttypes.InvalidRequestException()
                    self.ire.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 2:
                if ftype == TType.STRUCT:
                    self.ace = apache.airavata.api.error.ttypes.AiravataClientException()
                    self.ace.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 3:
                if ftype == TType.STRUCT:
                    self.ase = apache.airavata.api.error.ttypes.AiravataSystemException()
                    self.ase.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 4:
                if ftype == TType.STRUCT:
                    self.ae = apache.airavata.api.error.ttypes.AuthorizationException()
                    self.ae.read(iprot)
                else:
                    iprot.skip(ftype)
            else:
                iprot.skip(ftype)
            iprot.readFieldEnd()
        iprot.readStructEnd()

    def write(self, oprot):
        if oprot._fast_encode is not None and self.thrift_spec is not None:
            oprot.trans.write(oprot._fast_encode(self, (self.__class__, self.thrift_spec)))
            return
        oprot.writeStructBegin('searchProjects_result')
        if self.success is not None:
            oprot.writeFieldBegin('success', TType.LIST, 0)
            oprot.writeListBegin(TType.STRUCT, len(self.success))
            for iter75 in self.success:
                iter75.write(oprot)
            oprot.writeListEnd()
            oprot.writeFieldEnd()
        if self.ire is not None:
            oprot.writeFieldBegin('ire', TType.STRUCT, 1)
            self.ire.write(oprot)
            oprot.writeFieldEnd()
        if self.ace is not None:
            oprot.writeFieldBegin('ace', TType.STRUCT, 2)
            self.ace.write(oprot)
            oprot.writeFieldEnd()
        if self.ase is not None:
            oprot.writeFieldBegin('ase', TType.STRUCT, 3)
            self.ase.write(oprot)
            oprot.writeFieldEnd()
        if self.ae is not None:
            oprot.writeFieldBegin('ae', TType.STRUCT, 4)
            self.ae.write(oprot)
            oprot.writeFieldEnd()
        oprot.writeFieldStop()
        oprot.writeStructEnd()

    def validate(self):
        return

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

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

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


class searchExperiments_args(object):
    """
    Attributes:
     - authzToken
     - gatewayId
     - userName
     - filters
     - limit
     - offset
    """

    thrift_spec = (
        None,  # 0
        (1, TType.STRUCT, 'authzToken', (apache.airavata.model.security.ttypes.AuthzToken, apache.airavata.model.security.ttypes.AuthzToken.thrift_spec), None, ),  # 1
        (2, TType.STRING, 'gatewayId', 'UTF8', None, ),  # 2
        (3, TType.STRING, 'userName', 'UTF8', None, ),  # 3
        (4, TType.MAP, 'filters', (TType.I32, None, TType.STRING, 'UTF8', False), None, ),  # 4
        (5, TType.I32, 'limit', None, None, ),  # 5
        (6, TType.I32, 'offset', None, None, ),  # 6
    )

    def __init__(self, authzToken=None, gatewayId=None, userName=None, filters=None, limit=None, offset=None,):
        self.authzToken = authzToken
        self.gatewayId = gatewayId
        self.userName = userName
        self.filters = filters
        self.limit = limit
        self.offset = offset

    def read(self, iprot):
        if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None:
            iprot._fast_decode(self, iprot, (self.__class__, self.thrift_spec))
            return
        iprot.readStructBegin()
        while True:
            (fname, ftype, fid) = iprot.readFieldBegin()
            if ftype == TType.STOP:
                break
            if fid == 1:
                if ftype == TType.STRUCT:
                    self.authzToken = apache.airavata.model.security.ttypes.AuthzToken()
                    self.authzToken.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 2:
                if ftype == TType.STRING:
                    self.gatewayId = iprot.readString().decode('utf-8') if sys.version_info[0] == 2 else iprot.readString()
                else:
                    iprot.skip(ftype)
            elif fid == 3:
                if ftype == TType.STRING:
                    self.userName = iprot.readString().decode('utf-8') if sys.version_info[0] == 2 else iprot.readString()
                else:
                    iprot.skip(ftype)
            elif fid == 4:
                if ftype == TType.MAP:
                    self.filters = {}
                    (_ktype77, _vtype78, _size76) = iprot.readMapBegin()
                    for _i80 in range(_size76):
                        _key81 = iprot.readI32()
                        _val82 = iprot.readString().decode('utf-8') if sys.version_info[0] == 2 else iprot.readString()
                        self.filters[_key81] = _val82
                    iprot.readMapEnd()
                else:
                    iprot.skip(ftype)
            elif fid == 5:
                if ftype == TType.I32:
                    self.limit = iprot.readI32()
                else:
                    iprot.skip(ftype)
            elif fid == 6:
                if ftype == TType.I32:
                    self.offset = iprot.readI32()
                else:
                    iprot.skip(ftype)
            else:
                iprot.skip(ftype)
            iprot.readFieldEnd()
        iprot.readStructEnd()

    def write(self, oprot):
        if oprot._fast_encode is not None and self.thrift_spec is not None:
            oprot.trans.write(oprot._fast_encode(self, (self.__class__, self.thrift_spec)))
            return
        oprot.writeStructBegin('searchExperiments_args')
        if self.authzToken is not None:
            oprot.writeFieldBegin('authzToken', TType.STRUCT, 1)
            self.authzToken.write(oprot)
            oprot.writeFieldEnd()
        if self.gatewayId is not None:
            oprot.writeFieldBegin('gatewayId', TType.STRING, 2)
            oprot.writeString(self.gatewayId.encode('utf-8') if sys.version_info[0] == 2 else self.gatewayId)
            oprot.writeFieldEnd()
        if self.userName is not None:
            oprot.writeFieldBegin('userName', TType.STRING, 3)
            oprot.writeString(self.userName.encode('utf-8') if sys.version_info[0] == 2 else self.userName)
            oprot.writeFieldEnd()
        if self.filters is not None:
            oprot.writeFieldBegin('filters', TType.MAP, 4)
            oprot.writeMapBegin(TType.I32, TType.STRING, len(self.filters))
            for kiter83, viter84 in self.filters.items():
                oprot.writeI32(kiter83)
                oprot.writeString(viter84.encode('utf-8') if sys.version_info[0] == 2 else viter84)
            oprot.writeMapEnd()
            oprot.writeFieldEnd()
        if self.limit is not None:
            oprot.writeFieldBegin('limit', TType.I32, 5)
            oprot.writeI32(self.limit)
            oprot.writeFieldEnd()
        if self.offset is not None:
            oprot.writeFieldBegin('offset', TType.I32, 6)
            oprot.writeI32(self.offset)
            oprot.writeFieldEnd()
        oprot.writeFieldStop()
        oprot.writeStructEnd()

    def validate(self):
        if self.authzToken is None:
            raise TProtocolException(message='Required field authzToken is unset!')
        if self.gatewayId is None:
            raise TProtocolException(message='Required field gatewayId is unset!')
        if self.userName is None:
            raise TProtocolException(message='Required field userName is unset!')
        if self.limit is None:
            raise TProtocolException(message='Required field limit is unset!')
        if self.offset is None:
            raise TProtocolException(message='Required field offset is unset!')
        return

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

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

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


class searchExperiments_result(object):
    """
    Attributes:
     - success
     - ire
     - ace
     - ase
     - ae
    """

    thrift_spec = (
        (0, TType.LIST, 'success', (TType.STRUCT, (apache.airavata.model.experiment.ttypes.ExperimentSummaryModel, apache.airavata.model.experiment.ttypes.ExperimentSummaryModel.thrift_spec), False), None, ),  # 0
        (1, TType.STRUCT, 'ire', (apache.airavata.api.error.ttypes.InvalidRequestException, apache.airavata.api.error.ttypes.InvalidRequestException.thrift_spec), None, ),  # 1
        (2, TType.STRUCT, 'ace', (apache.airavata.api.error.ttypes.AiravataClientException, apache.airavata.api.error.ttypes.AiravataClientException.thrift_spec), None, ),  # 2
        (3, TType.STRUCT, 'ase', (apache.airavata.api.error.ttypes.AiravataSystemException, apache.airavata.api.error.ttypes.AiravataSystemException.thrift_spec), None, ),  # 3
        (4, TType.STRUCT, 'ae', (apache.airavata.api.error.ttypes.AuthorizationException, apache.airavata.api.error.ttypes.AuthorizationException.thrift_spec), None, ),  # 4
    )

    def __init__(self, success=None, ire=None, ace=None, ase=None, ae=None,):
        self.success = success
        self.ire = ire
        self.ace = ace
        self.ase = ase
        self.ae = ae

    def read(self, iprot):
        if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None:
            iprot._fast_decode(self, iprot, (self.__class__, self.thrift_spec))
            return
        iprot.readStructBegin()
        while True:
            (fname, ftype, fid) = iprot.readFieldBegin()
            if ftype == TType.STOP:
                break
            if fid == 0:
                if ftype == TType.LIST:
                    self.success = []
                    (_etype88, _size85) = iprot.readListBegin()
                    for _i89 in range(_size85):
                        _elem90 = apache.airavata.model.experiment.ttypes.ExperimentSummaryModel()
                        _elem90.read(iprot)
                        self.success.append(_elem90)
                    iprot.readListEnd()
                else:
                    iprot.skip(ftype)
            elif fid == 1:
                if ftype == TType.STRUCT:
                    self.ire = apache.airavata.api.error.ttypes.InvalidRequestException()
                    self.ire.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 2:
                if ftype == TType.STRUCT:
                    self.ace = apache.airavata.api.error.ttypes.AiravataClientException()
                    self.ace.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 3:
                if ftype == TType.STRUCT:
                    self.ase = apache.airavata.api.error.ttypes.AiravataSystemException()
                    self.ase.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 4:
                if ftype == TType.STRUCT:
                    self.ae = apache.airavata.api.error.ttypes.AuthorizationException()
                    self.ae.read(iprot)
                else:
                    iprot.skip(ftype)
            else:
                iprot.skip(ftype)
            iprot.readFieldEnd()
        iprot.readStructEnd()

    def write(self, oprot):
        if oprot._fast_encode is not None and self.thrift_spec is not None:
            oprot.trans.write(oprot._fast_encode(self, (self.__class__, self.thrift_spec)))
            return
        oprot.writeStructBegin('searchExperiments_result')
        if self.success is not None:
            oprot.writeFieldBegin('success', TType.LIST, 0)
            oprot.writeListBegin(TType.STRUCT, len(self.success))
            for iter91 in self.success:
                iter91.write(oprot)
            oprot.writeListEnd()
            oprot.writeFieldEnd()
        if self.ire is not None:
            oprot.writeFieldBegin('ire', TType.STRUCT, 1)
            self.ire.write(oprot)
            oprot.writeFieldEnd()
        if self.ace is not None:
            oprot.writeFieldBegin('ace', TType.STRUCT, 2)
            self.ace.write(oprot)
            oprot.writeFieldEnd()
        if self.ase is not None:
            oprot.writeFieldBegin('ase', TType.STRUCT, 3)
            self.ase.write(oprot)
            oprot.writeFieldEnd()
        if self.ae is not None:
            oprot.writeFieldBegin('ae', TType.STRUCT, 4)
            self.ae.write(oprot)
            oprot.writeFieldEnd()
        oprot.writeFieldStop()
        oprot.writeStructEnd()

    def validate(self):
        return

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

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

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


class getExperimentStatistics_args(object):
    """
    Attributes:
     - authzToken
     - gatewayId
     - fromTime
     - toTime
     - userName
     - applicationName
     - resourceHostName
    """

    thrift_spec = (
        None,  # 0
        (1, TType.STRUCT, 'authzToken', (apache.airavata.model.security.ttypes.AuthzToken, apache.airavata.model.security.ttypes.AuthzToken.thrift_spec), None, ),  # 1
        (2, TType.STRING, 'gatewayId', 'UTF8', None, ),  # 2
        (3, TType.I64, 'fromTime', None, None, ),  # 3
        (4, TType.I64, 'toTime', None, None, ),  # 4
        (5, TType.STRING, 'userName', 'UTF8', None, ),  # 5
        (6, TType.STRING, 'applicationName', 'UTF8', None, ),  # 6
        (7, TType.STRING, 'resourceHostName', 'UTF8', None, ),  # 7
    )

    def __init__(self, authzToken=None, gatewayId=None, fromTime=None, toTime=None, userName=None, applicationName=None, resourceHostName=None,):
        self.authzToken = authzToken
        self.gatewayId = gatewayId
        self.fromTime = fromTime
        self.toTime = toTime
        self.userName = userName
        self.applicationName = applicationName
        self.resourceHostName = resourceHostName

    def read(self, iprot):
        if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None:
            iprot._fast_decode(self, iprot, (self.__class__, self.thrift_spec))
            return
        iprot.readStructBegin()
        while True:
            (fname, ftype, fid) = iprot.readFieldBegin()
            if ftype == TType.STOP:
                break
            if fid == 1:
                if ftype == TType.STRUCT:
                    self.authzToken = apache.airavata.model.security.ttypes.AuthzToken()
                    self.authzToken.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 2:
                if ftype == TType.STRING:
                    self.gatewayId = iprot.readString().decode('utf-8') if sys.version_info[0] == 2 else iprot.readString()
                else:
                    iprot.skip(ftype)
            elif fid == 3:
                if ftype == TType.I64:
                    self.fromTime = iprot.readI64()
                else:
                    iprot.skip(ftype)
            elif fid == 4:
                if ftype == TType.I64:
                    self.toTime = iprot.readI64()
                else:
                    iprot.skip(ftype)
            elif fid == 5:
                if ftype == TType.STRING:
                    self.userName = iprot.readString().decode('utf-8') if sys.version_info[0] == 2 else iprot.readString()
                else:
                    iprot.skip(ftype)
            elif fid == 6:
                if ftype == TType.STRING:
                    self.applicationName = iprot.readString().decode('utf-8') if sys.version_info[0] == 2 else iprot.readString()
                else:
                    iprot.skip(ftype)
            elif fid == 7:
                if ftype == TType.STRING:
                    self.resourceHostName = iprot.readString().decode('utf-8') if sys.version_info[0] == 2 else iprot.readString()
                else:
                    iprot.skip(ftype)
            else:
                iprot.skip(ftype)
            iprot.readFieldEnd()
        iprot.readStructEnd()

    def write(self, oprot):
        if oprot._fast_encode is not None and self.thrift_spec is not None:
            oprot.trans.write(oprot._fast_encode(self, (self.__class__, self.thrift_spec)))
            return
        oprot.writeStructBegin('getExperimentStatistics_args')
        if self.authzToken is not None:
            oprot.writeFieldBegin('authzToken', TType.STRUCT, 1)
            self.authzToken.write(oprot)
            oprot.writeFieldEnd()
        if self.gatewayId is not None:
            oprot.writeFieldBegin('gatewayId', TType.STRING, 2)
            oprot.writeString(self.gatewayId.encode('utf-8') if sys.version_info[0] == 2 else self.gatewayId)
            oprot.writeFieldEnd()
        if self.fromTime is not None:
            oprot.writeFieldBegin('fromTime', TType.I64, 3)
            oprot.writeI64(self.fromTime)
            oprot.writeFieldEnd()
        if self.toTime is not None:
            oprot.writeFieldBegin('toTime', TType.I64, 4)
            oprot.writeI64(self.toTime)
            oprot.writeFieldEnd()
        if self.userName is not None:
            oprot.writeFieldBegin('userName', TType.STRING, 5)
            oprot.writeString(self.userName.encode('utf-8') if sys.version_info[0] == 2 else self.userName)
            oprot.writeFieldEnd()
        if self.applicationName is not None:
            oprot.writeFieldBegin('applicationName', TType.STRING, 6)
            oprot.writeString(self.applicationName.encode('utf-8') if sys.version_info[0] == 2 else self.applicationName)
            oprot.writeFieldEnd()
        if self.resourceHostName is not None:
            oprot.writeFieldBegin('resourceHostName', TType.STRING, 7)
            oprot.writeString(self.resourceHostName.encode('utf-8') if sys.version_info[0] == 2 else self.resourceHostName)
            oprot.writeFieldEnd()
        oprot.writeFieldStop()
        oprot.writeStructEnd()

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

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

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

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


class getExperimentStatistics_result(object):
    """
    Attributes:
     - success
     - ire
     - ace
     - ase
     - ae
    """

    thrift_spec = (
        (0, TType.STRUCT, 'success', (apache.airavata.model.experiment.ttypes.ExperimentStatistics, apache.airavata.model.experiment.ttypes.ExperimentStatistics.thrift_spec), None, ),  # 0
        (1, TType.STRUCT, 'ire', (apache.airavata.api.error.ttypes.InvalidRequestException, apache.airavata.api.error.ttypes.InvalidRequestException.thrift_spec), None, ),  # 1
        (2, TType.STRUCT, 'ace', (apache.airavata.api.error.ttypes.AiravataClientException, apache.airavata.api.error.ttypes.AiravataClientException.thrift_spec), None, ),  # 2
        (3, TType.STRUCT, 'ase', (apache.airavata.api.error.ttypes.AiravataSystemException, apache.airavata.api.error.ttypes.AiravataSystemException.thrift_spec), None, ),  # 3
        (4, TType.STRUCT, 'ae', (apache.airavata.api.error.ttypes.AuthorizationException, apache.airavata.api.error.ttypes.AuthorizationException.thrift_spec), None, ),  # 4
    )

    def __init__(self, success=None, ire=None, ace=None, ase=None, ae=None,):
        self.success = success
        self.ire = ire
        self.ace = ace
        self.ase = ase
        self.ae = ae

    def read(self, iprot):
        if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None:
            iprot._fast_decode(self, iprot, (self.__class__, self.thrift_spec))
            return
        iprot.readStructBegin()
        while True:
            (fname, ftype, fid) = iprot.readFieldBegin()
            if ftype == TType.STOP:
                break
            if fid == 0:
                if ftype == TType.STRUCT:
                    self.success = apache.airavata.model.experiment.ttypes.ExperimentStatistics()
                    self.success.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 1:
                if ftype == TType.STRUCT:
                    self.ire = apache.airavata.api.error.ttypes.InvalidRequestException()
                    self.ire.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 2:
                if ftype == TType.STRUCT:
                    self.ace = apache.airavata.api.error.ttypes.AiravataClientException()
                    self.ace.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 3:
                if ftype == TType.STRUCT:
                    self.ase = apache.airavata.api.error.ttypes.AiravataSystemException()
                    self.ase.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 4:
                if ftype == TType.STRUCT:
                    self.ae = apache.airavata.api.error.ttypes.AuthorizationException()
                    self.ae.read(iprot)
                else:
                    iprot.skip(ftype)
            else:
                iprot.skip(ftype)
            iprot.readFieldEnd()
        iprot.readStructEnd()

    def write(self, oprot):
        if oprot._fast_encode is not None and self.thrift_spec is not None:
            oprot.trans.write(oprot._fast_encode(self, (self.__class__, self.thrift_spec)))
            return
        oprot.writeStructBegin('getExperimentStatistics_result')
        if self.success is not None:
            oprot.writeFieldBegin('success', TType.STRUCT, 0)
            self.success.write(oprot)
            oprot.writeFieldEnd()
        if self.ire is not None:
            oprot.writeFieldBegin('ire', TType.STRUCT, 1)
            self.ire.write(oprot)
            oprot.writeFieldEnd()
        if self.ace is not None:
            oprot.writeFieldBegin('ace', TType.STRUCT, 2)
            self.ace.write(oprot)
            oprot.writeFieldEnd()
        if self.ase is not None:
            oprot.writeFieldBegin('ase', TType.STRUCT, 3)
            self.ase.write(oprot)
            oprot.writeFieldEnd()
        if self.ae is not None:
            oprot.writeFieldBegin('ae', TType.STRUCT, 4)
            self.ae.write(oprot)
            oprot.writeFieldEnd()
        oprot.writeFieldStop()
        oprot.writeStructEnd()

    def validate(self):
        return

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

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

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


class getExperimentsInProject_args(object):
    """
    Attributes:
     - authzToken
     - projectId
     - limit
     - offset
    """

    thrift_spec = (
        None,  # 0
        (1, TType.STRUCT, 'authzToken', (apache.airavata.model.security.ttypes.AuthzToken, apache.airavata.model.security.ttypes.AuthzToken.thrift_spec), None, ),  # 1
        (2, TType.STRING, 'projectId', 'UTF8', None, ),  # 2
        (3, TType.I32, 'limit', None, None, ),  # 3
        (4, TType.I32, 'offset', None, None, ),  # 4
    )

    def __init__(self, authzToken=None, projectId=None, limit=None, offset=None,):
        self.authzToken = authzToken
        self.projectId = projectId
        self.limit = limit
        self.offset = offset

    def read(self, iprot):
        if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None:
            iprot._fast_decode(self, iprot, (self.__class__, self.thrift_spec))
            return
        iprot.readStructBegin()
        while True:
            (fname, ftype, fid) = iprot.readFieldBegin()
            if ftype == TType.STOP:
                break
            if fid == 1:
                if ftype == TType.STRUCT:
                    self.authzToken = apache.airavata.model.security.ttypes.AuthzToken()
                    self.authzToken.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 2:
                if ftype == TType.STRING:
                    self.projectId = iprot.readString().decode('utf-8') if sys.version_info[0] == 2 else iprot.readString()
                else:
                    iprot.skip(ftype)
            elif fid == 3:
                if ftype == TType.I32:
                    self.limit = iprot.readI32()
                else:
                    iprot.skip(ftype)
            elif fid == 4:
                if ftype == TType.I32:
                    self.offset = iprot.readI32()
                else:
                    iprot.skip(ftype)
            else:
                iprot.skip(ftype)
            iprot.readFieldEnd()
        iprot.readStructEnd()

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

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

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

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

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


class getExperimentsInProject_result(object):
    """
    Attributes:
     - success
     - ire
     - ace
     - ase
     - pnfe
     - ae
    """

    thrift_spec = (
        (0, TType.LIST, 'success', (TType.STRUCT, (apache.airavata.model.experiment.ttypes.ExperimentModel, apache.airavata.model.experiment.ttypes.ExperimentModel.thrift_spec), False), None, ),  # 0
        (1, TType.STRUCT, 'ire', (apache.airavata.api.error.ttypes.InvalidRequestException, apache.airavata.api.error.ttypes.InvalidRequestException.thrift_spec), None, ),  # 1
        (2, TType.STRUCT, 'ace', (apache.airavata.api.error.ttypes.AiravataClientException, apache.airavata.api.error.ttypes.AiravataClientException.thrift_spec), None, ),  # 2
        (3, TType.STRUCT, 'ase', (apache.airavata.api.error.ttypes.AiravataSystemException, apache.airavata.api.error.ttypes.AiravataSystemException.thrift_spec), None, ),  # 3
        (4, TType.STRUCT, 'pnfe', (apache.airavata.api.error.ttypes.ProjectNotFoundException, apache.airavata.api.error.ttypes.ProjectNotFoundException.thrift_spec), None, ),  # 4
        (5, TType.STRUCT, 'ae', (apache.airavata.api.error.ttypes.AuthorizationException, apache.airavata.api.error.ttypes.AuthorizationException.thrift_spec), None, ),  # 5
    )

    def __init__(self, success=None, ire=None, ace=None, ase=None, pnfe=None, ae=None,):
        self.success = success
        self.ire = ire
        self.ace = ace
        self.ase = ase
        self.pnfe = pnfe
        self.ae = ae

    def read(self, iprot):
        if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None:
            iprot._fast_decode(self, iprot, (self.__class__, self.thrift_spec))
            return
        iprot.readStructBegin()
        while True:
            (fname, ftype, fid) = iprot.readFieldBegin()
            if ftype == TType.STOP:
                break
            if fid == 0:
                if ftype == TType.LIST:
                    self.success = []
                    (_etype95, _size92) = iprot.readListBegin()
                    for _i96 in range(_size92):
                        _elem97 = apache.airavata.model.experiment.ttypes.ExperimentModel()
                        _elem97.read(iprot)
                        self.success.append(_elem97)
                    iprot.readListEnd()
                else:
                    iprot.skip(ftype)
            elif fid == 1:
                if ftype == TType.STRUCT:
                    self.ire = apache.airavata.api.error.ttypes.InvalidRequestException()
                    self.ire.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 2:
                if ftype == TType.STRUCT:
                    self.ace = apache.airavata.api.error.ttypes.AiravataClientException()
                    self.ace.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 3:
                if ftype == TType.STRUCT:
                    self.ase = apache.airavata.api.error.ttypes.AiravataSystemException()
                    self.ase.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 4:
                if ftype == TType.STRUCT:
                    self.pnfe = apache.airavata.api.error.ttypes.ProjectNotFoundException()
                    self.pnfe.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 5:
                if ftype == TType.STRUCT:
                    self.ae = apache.airavata.api.error.ttypes.AuthorizationException()
                    self.ae.read(iprot)
                else:
                    iprot.skip(ftype)
            else:
                iprot.skip(ftype)
            iprot.readFieldEnd()
        iprot.readStructEnd()

    def write(self, oprot):
        if oprot._fast_encode is not None and self.thrift_spec is not None:
            oprot.trans.write(oprot._fast_encode(self, (self.__class__, self.thrift_spec)))
            return
        oprot.writeStructBegin('getExperimentsInProject_result')
        if self.success is not None:
            oprot.writeFieldBegin('success', TType.LIST, 0)
            oprot.writeListBegin(TType.STRUCT, len(self.success))
            for iter98 in self.success:
                iter98.write(oprot)
            oprot.writeListEnd()
            oprot.writeFieldEnd()
        if self.ire is not None:
            oprot.writeFieldBegin('ire', TType.STRUCT, 1)
            self.ire.write(oprot)
            oprot.writeFieldEnd()
        if self.ace is not None:
            oprot.writeFieldBegin('ace', TType.STRUCT, 2)
            self.ace.write(oprot)
            oprot.writeFieldEnd()
        if self.ase is not None:
            oprot.writeFieldBegin('ase', TType.STRUCT, 3)
            self.ase.write(oprot)
            oprot.writeFieldEnd()
        if self.pnfe is not None:
            oprot.writeFieldBegin('pnfe', TType.STRUCT, 4)
            self.pnfe.write(oprot)
            oprot.writeFieldEnd()
        if self.ae is not None:
            oprot.writeFieldBegin('ae', TType.STRUCT, 5)
            self.ae.write(oprot)
            oprot.writeFieldEnd()
        oprot.writeFieldStop()
        oprot.writeStructEnd()

    def validate(self):
        return

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

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

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


class getUserExperiments_args(object):
    """
    Attributes:
     - authzToken
     - gatewayId
     - userName
     - limit
     - offset
    """

    thrift_spec = (
        None,  # 0
        (1, TType.STRUCT, 'authzToken', (apache.airavata.model.security.ttypes.AuthzToken, apache.airavata.model.security.ttypes.AuthzToken.thrift_spec), None, ),  # 1
        (2, TType.STRING, 'gatewayId', 'UTF8', None, ),  # 2
        (3, TType.STRING, 'userName', 'UTF8', None, ),  # 3
        (4, TType.I32, 'limit', None, None, ),  # 4
        (5, TType.I32, 'offset', None, None, ),  # 5
    )

    def __init__(self, authzToken=None, gatewayId=None, userName=None, limit=None, offset=None,):
        self.authzToken = authzToken
        self.gatewayId = gatewayId
        self.userName = userName
        self.limit = limit
        self.offset = offset

    def read(self, iprot):
        if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None:
            iprot._fast_decode(self, iprot, (self.__class__, self.thrift_spec))
            return
        iprot.readStructBegin()
        while True:
            (fname, ftype, fid) = iprot.readFieldBegin()
            if ftype == TType.STOP:
                break
            if fid == 1:
                if ftype == TType.STRUCT:
                    self.authzToken = apache.airavata.model.security.ttypes.AuthzToken()
                    self.authzToken.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 2:
                if ftype == TType.STRING:
                    self.gatewayId = iprot.readString().decode('utf-8') if sys.version_info[0] == 2 else iprot.readString()
                else:
                    iprot.skip(ftype)
            elif fid == 3:
                if ftype == TType.STRING:
                    self.userName = iprot.readString().decode('utf-8') if sys.version_info[0] == 2 else iprot.readString()
                else:
                    iprot.skip(ftype)
            elif fid == 4:
                if ftype == TType.I32:
                    self.limit = iprot.readI32()
                else:
                    iprot.skip(ftype)
            elif fid == 5:
                if ftype == TType.I32:
                    self.offset = iprot.readI32()
                else:
                    iprot.skip(ftype)
            else:
                iprot.skip(ftype)
            iprot.readFieldEnd()
        iprot.readStructEnd()

    def write(self, oprot):
        if oprot._fast_encode is not None and self.thrift_spec is not None:
            oprot.trans.write(oprot._fast_encode(self, (self.__class__, self.thrift_spec)))
            return
        oprot.writeStructBegin('getUserExperiments_args')
        if self.authzToken is not None:
            oprot.writeFieldBegin('authzToken', TType.STRUCT, 1)
            self.authzToken.write(oprot)
            oprot.writeFieldEnd()
        if self.gatewayId is not None:
            oprot.writeFieldBegin('gatewayId', TType.STRING, 2)
            oprot.writeString(self.gatewayId.encode('utf-8') if sys.version_info[0] == 2 else self.gatewayId)
            oprot.writeFieldEnd()
        if self.userName is not None:
            oprot.writeFieldBegin('userName', TType.STRING, 3)
            oprot.writeString(self.userName.encode('utf-8') if sys.version_info[0] == 2 else self.userName)
            oprot.writeFieldEnd()
        if self.limit is not None:
            oprot.writeFieldBegin('limit', TType.I32, 4)
            oprot.writeI32(self.limit)
            oprot.writeFieldEnd()
        if self.offset is not None:
            oprot.writeFieldBegin('offset', TType.I32, 5)
            oprot.writeI32(self.offset)
            oprot.writeFieldEnd()
        oprot.writeFieldStop()
        oprot.writeStructEnd()

    def validate(self):
        if self.authzToken is None:
            raise TProtocolException(message='Required field authzToken is unset!')
        if self.gatewayId is None:
            raise TProtocolException(message='Required field gatewayId is unset!')
        if self.userName is None:
            raise TProtocolException(message='Required field userName is unset!')
        if self.limit is None:
            raise TProtocolException(message='Required field limit is unset!')
        if self.offset is None:
            raise TProtocolException(message='Required field offset is unset!')
        return

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

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

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


class getUserExperiments_result(object):
    """
    Attributes:
     - success
     - ire
     - ace
     - ase
     - ae
    """

    thrift_spec = (
        (0, TType.LIST, 'success', (TType.STRUCT, (apache.airavata.model.experiment.ttypes.ExperimentModel, apache.airavata.model.experiment.ttypes.ExperimentModel.thrift_spec), False), None, ),  # 0
        (1, TType.STRUCT, 'ire', (apache.airavata.api.error.ttypes.InvalidRequestException, apache.airavata.api.error.ttypes.InvalidRequestException.thrift_spec), None, ),  # 1
        (2, TType.STRUCT, 'ace', (apache.airavata.api.error.ttypes.AiravataClientException, apache.airavata.api.error.ttypes.AiravataClientException.thrift_spec), None, ),  # 2
        (3, TType.STRUCT, 'ase', (apache.airavata.api.error.ttypes.AiravataSystemException, apache.airavata.api.error.ttypes.AiravataSystemException.thrift_spec), None, ),  # 3
        (4, TType.STRUCT, 'ae', (apache.airavata.api.error.ttypes.AuthorizationException, apache.airavata.api.error.ttypes.AuthorizationException.thrift_spec), None, ),  # 4
    )

    def __init__(self, success=None, ire=None, ace=None, ase=None, ae=None,):
        self.success = success
        self.ire = ire
        self.ace = ace
        self.ase = ase
        self.ae = ae

    def read(self, iprot):
        if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None:
            iprot._fast_decode(self, iprot, (self.__class__, self.thrift_spec))
            return
        iprot.readStructBegin()
        while True:
            (fname, ftype, fid) = iprot.readFieldBegin()
            if ftype == TType.STOP:
                break
            if fid == 0:
                if ftype == TType.LIST:
                    self.success = []
                    (_etype102, _size99) = iprot.readListBegin()
                    for _i103 in range(_size99):
                        _elem104 = apache.airavata.model.experiment.ttypes.ExperimentModel()
                        _elem104.read(iprot)
                        self.success.append(_elem104)
                    iprot.readListEnd()
                else:
                    iprot.skip(ftype)
            elif fid == 1:
                if ftype == TType.STRUCT:
                    self.ire = apache.airavata.api.error.ttypes.InvalidRequestException()
                    self.ire.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 2:
                if ftype == TType.STRUCT:
                    self.ace = apache.airavata.api.error.ttypes.AiravataClientException()
                    self.ace.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 3:
                if ftype == TType.STRUCT:
                    self.ase = apache.airavata.api.error.ttypes.AiravataSystemException()
                    self.ase.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 4:
                if ftype == TType.STRUCT:
                    self.ae = apache.airavata.api.error.ttypes.AuthorizationException()
                    self.ae.read(iprot)
                else:
                    iprot.skip(ftype)
            else:
                iprot.skip(ftype)
            iprot.readFieldEnd()
        iprot.readStructEnd()

    def write(self, oprot):
        if oprot._fast_encode is not None and self.thrift_spec is not None:
            oprot.trans.write(oprot._fast_encode(self, (self.__class__, self.thrift_spec)))
            return
        oprot.writeStructBegin('getUserExperiments_result')
        if self.success is not None:
            oprot.writeFieldBegin('success', TType.LIST, 0)
            oprot.writeListBegin(TType.STRUCT, len(self.success))
            for iter105 in self.success:
                iter105.write(oprot)
            oprot.writeListEnd()
            oprot.writeFieldEnd()
        if self.ire is not None:
            oprot.writeFieldBegin('ire', TType.STRUCT, 1)
            self.ire.write(oprot)
            oprot.writeFieldEnd()
        if self.ace is not None:
            oprot.writeFieldBegin('ace', TType.STRUCT, 2)
            self.ace.write(oprot)
            oprot.writeFieldEnd()
        if self.ase is not None:
            oprot.writeFieldBegin('ase', TType.STRUCT, 3)
            self.ase.write(oprot)
            oprot.writeFieldEnd()
        if self.ae is not None:
            oprot.writeFieldBegin('ae', TType.STRUCT, 4)
            self.ae.write(oprot)
            oprot.writeFieldEnd()
        oprot.writeFieldStop()
        oprot.writeStructEnd()

    def validate(self):
        return

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

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

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


class createExperiment_args(object):
    """
    Attributes:
     - authzToken
     - gatewayId
     - experiment
    """

    thrift_spec = (
        None,  # 0
        (1, TType.STRUCT, 'authzToken', (apache.airavata.model.security.ttypes.AuthzToken, apache.airavata.model.security.ttypes.AuthzToken.thrift_spec), None, ),  # 1
        (2, TType.STRING, 'gatewayId', 'UTF8', None, ),  # 2
        (3, TType.STRUCT, 'experiment', (apache.airavata.model.experiment.ttypes.ExperimentModel, apache.airavata.model.experiment.ttypes.ExperimentModel.thrift_spec), None, ),  # 3
    )

    def __init__(self, authzToken=None, gatewayId=None, experiment=None,):
        self.authzToken = authzToken
        self.gatewayId = gatewayId
        self.experiment = experiment

    def read(self, iprot):
        if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None:
            iprot._fast_decode(self, iprot, (self.__class__, self.thrift_spec))
            return
        iprot.readStructBegin()
        while True:
            (fname, ftype, fid) = iprot.readFieldBegin()
            if ftype == TType.STOP:
                break
            if fid == 1:
                if ftype == TType.STRUCT:
                    self.authzToken = apache.airavata.model.security.ttypes.AuthzToken()
                    self.authzToken.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 2:
                if ftype == TType.STRING:
                    self.gatewayId = iprot.readString().decode('utf-8') if sys.version_info[0] == 2 else iprot.readString()
                else:
                    iprot.skip(ftype)
            elif fid == 3:
                if ftype == TType.STRUCT:
                    self.experiment = apache.airavata.model.experiment.ttypes.ExperimentModel()
                    self.experiment.read(iprot)
                else:
                    iprot.skip(ftype)
            else:
                iprot.skip(ftype)
            iprot.readFieldEnd()
        iprot.readStructEnd()

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

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

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

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

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


class createExperiment_result(object):
    """
    Attributes:
     - success
     - ire
     - ace
     - ase
     - ae
    """

    thrift_spec = (
        (0, TType.STRING, 'success', 'UTF8', None, ),  # 0
        (1, TType.STRUCT, 'ire', (apache.airavata.api.error.ttypes.InvalidRequestException, apache.airavata.api.error.ttypes.InvalidRequestException.thrift_spec), None, ),  # 1
        (2, TType.STRUCT, 'ace', (apache.airavata.api.error.ttypes.AiravataClientException, apache.airavata.api.error.ttypes.AiravataClientException.thrift_spec), None, ),  # 2
        (3, TType.STRUCT, 'ase', (apache.airavata.api.error.ttypes.AiravataSystemException, apache.airavata.api.error.ttypes.AiravataSystemException.thrift_spec), None, ),  # 3
        (4, TType.STRUCT, 'ae', (apache.airavata.api.error.ttypes.AuthorizationException, apache.airavata.api.error.ttypes.AuthorizationException.thrift_spec), None, ),  # 4
    )

    def __init__(self, success=None, ire=None, ace=None, ase=None, ae=None,):
        self.success = success
        self.ire = ire
        self.ace = ace
        self.ase = ase
        self.ae = ae

    def read(self, iprot):
        if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None:
            iprot._fast_decode(self, iprot, (self.__class__, self.thrift_spec))
            return
        iprot.readStructBegin()
        while True:
            (fname, ftype, fid) = iprot.readFieldBegin()
            if ftype == TType.STOP:
                break
            if fid == 0:
                if ftype == TType.STRING:
                    self.success = iprot.readString().decode('utf-8') if sys.version_info[0] == 2 else iprot.readString()
                else:
                    iprot.skip(ftype)
            elif fid == 1:
                if ftype == TType.STRUCT:
                    self.ire = apache.airavata.api.error.ttypes.InvalidRequestException()
                    self.ire.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 2:
                if ftype == TType.STRUCT:
                    self.ace = apache.airavata.api.error.ttypes.AiravataClientException()
                    self.ace.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 3:
                if ftype == TType.STRUCT:
                    self.ase = apache.airavata.api.error.ttypes.AiravataSystemException()
                    self.ase.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 4:
                if ftype == TType.STRUCT:
                    self.ae = apache.airavata.api.error.ttypes.AuthorizationException()
                    self.ae.read(iprot)
                else:
                    iprot.skip(ftype)
            else:
                iprot.skip(ftype)
            iprot.readFieldEnd()
        iprot.readStructEnd()

    def write(self, oprot):
        if oprot._fast_encode is not None and self.thrift_spec is not None:
            oprot.trans.write(oprot._fast_encode(self, (self.__class__, self.thrift_spec)))
            return
        oprot.writeStructBegin('createExperiment_result')
        if self.success is not None:
            oprot.writeFieldBegin('success', TType.STRING, 0)
            oprot.writeString(self.success.encode('utf-8') if sys.version_info[0] == 2 else self.success)
            oprot.writeFieldEnd()
        if self.ire is not None:
            oprot.writeFieldBegin('ire', TType.STRUCT, 1)
            self.ire.write(oprot)
            oprot.writeFieldEnd()
        if self.ace is not None:
            oprot.writeFieldBegin('ace', TType.STRUCT, 2)
            self.ace.write(oprot)
            oprot.writeFieldEnd()
        if self.ase is not None:
            oprot.writeFieldBegin('ase', TType.STRUCT, 3)
            self.ase.write(oprot)
            oprot.writeFieldEnd()
        if self.ae is not None:
            oprot.writeFieldBegin('ae', TType.STRUCT, 4)
            self.ae.write(oprot)
            oprot.writeFieldEnd()
        oprot.writeFieldStop()
        oprot.writeStructEnd()

    def validate(self):
        return

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

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

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


class deleteExperiment_args(object):
    """
    Attributes:
     - authzToken
     - experimentId
    """

    thrift_spec = (
        None,  # 0
        (1, TType.STRUCT, 'authzToken', (apache.airavata.model.security.ttypes.AuthzToken, apache.airavata.model.security.ttypes.AuthzToken.thrift_spec), None, ),  # 1
        (2, TType.STRING, 'experimentId', 'UTF8', None, ),  # 2
    )

    def __init__(self, authzToken=None, experimentId=None,):
        self.authzToken = authzToken
        self.experimentId = experimentId

    def read(self, iprot):
        if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None:
            iprot._fast_decode(self, iprot, (self.__class__, self.thrift_spec))
            return
        iprot.readStructBegin()
        while True:
            (fname, ftype, fid) = iprot.readFieldBegin()
            if ftype == TType.STOP:
                break
            if fid == 1:
                if ftype == TType.STRUCT:
                    self.authzToken = apache.airavata.model.security.ttypes.AuthzToken()
                    self.authzToken.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 2:
                if ftype == TType.STRING:
                    self.experimentId = iprot.readString().decode('utf-8') if sys.version_info[0] == 2 else iprot.readString()
                else:
                    iprot.skip(ftype)
            else:
                iprot.skip(ftype)
            iprot.readFieldEnd()
        iprot.readStructEnd()

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

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

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

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

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


class deleteExperiment_result(object):
    """
    Attributes:
     - success
     - ire
     - ace
     - ase
     - ae
    """

    thrift_spec = (
        (0, TType.BOOL, 'success', None, None, ),  # 0
        (1, TType.STRUCT, 'ire', (apache.airavata.api.error.ttypes.InvalidRequestException, apache.airavata.api.error.ttypes.InvalidRequestException.thrift_spec), None, ),  # 1
        (2, TType.STRUCT, 'ace', (apache.airavata.api.error.ttypes.AiravataClientException, apache.airavata.api.error.ttypes.AiravataClientException.thrift_spec), None, ),  # 2
        (3, TType.STRUCT, 'ase', (apache.airavata.api.error.ttypes.AiravataSystemException, apache.airavata.api.error.ttypes.AiravataSystemException.thrift_spec), None, ),  # 3
        (4, TType.STRUCT, 'ae', (apache.airavata.api.error.ttypes.AuthorizationException, apache.airavata.api.error.ttypes.AuthorizationException.thrift_spec), None, ),  # 4
    )

    def __init__(self, success=None, ire=None, ace=None, ase=None, ae=None,):
        self.success = success
        self.ire = ire
        self.ace = ace
        self.ase = ase
        self.ae = ae

    def read(self, iprot):
        if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None:
            iprot._fast_decode(self, iprot, (self.__class__, self.thrift_spec))
            return
        iprot.readStructBegin()
        while True:
            (fname, ftype, fid) = iprot.readFieldBegin()
            if ftype == TType.STOP:
                break
            if fid == 0:
                if ftype == TType.BOOL:
                    self.success = iprot.readBool()
                else:
                    iprot.skip(ftype)
            elif fid == 1:
                if ftype == TType.STRUCT:
                    self.ire = apache.airavata.api.error.ttypes.InvalidRequestException()
                    self.ire.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 2:
                if ftype == TType.STRUCT:
                    self.ace = apache.airavata.api.error.ttypes.AiravataClientException()
                    self.ace.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 3:
                if ftype == TType.STRUCT:
                    self.ase = apache.airavata.api.error.ttypes.AiravataSystemException()
                    self.ase.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 4:
                if ftype == TType.STRUCT:
                    self.ae = apache.airavata.api.error.ttypes.AuthorizationException()
                    self.ae.read(iprot)
                else:
                    iprot.skip(ftype)
            else:
                iprot.skip(ftype)
            iprot.readFieldEnd()
        iprot.readStructEnd()

    def write(self, oprot):
        if oprot._fast_encode is not None and self.thrift_spec is not None:
            oprot.trans.write(oprot._fast_encode(self, (self.__class__, self.thrift_spec)))
            return
        oprot.writeStructBegin('deleteExperiment_result')
        if self.success is not None:
            oprot.writeFieldBegin('success', TType.BOOL, 0)
            oprot.writeBool(self.success)
            oprot.writeFieldEnd()
        if self.ire is not None:
            oprot.writeFieldBegin('ire', TType.STRUCT, 1)
            self.ire.write(oprot)
            oprot.writeFieldEnd()
        if self.ace is not None:
            oprot.writeFieldBegin('ace', TType.STRUCT, 2)
            self.ace.write(oprot)
            oprot.writeFieldEnd()
        if self.ase is not None:
            oprot.writeFieldBegin('ase', TType.STRUCT, 3)
            self.ase.write(oprot)
            oprot.writeFieldEnd()
        if self.ae is not None:
            oprot.writeFieldBegin('ae', TType.STRUCT, 4)
            self.ae.write(oprot)
            oprot.writeFieldEnd()
        oprot.writeFieldStop()
        oprot.writeStructEnd()

    def validate(self):
        return

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

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

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


class getExperiment_args(object):
    """
    Attributes:
     - authzToken
     - airavataExperimentId
    """

    thrift_spec = (
        None,  # 0
        (1, TType.STRUCT, 'authzToken', (apache.airavata.model.security.ttypes.AuthzToken, apache.airavata.model.security.ttypes.AuthzToken.thrift_spec), None, ),  # 1
        (2, TType.STRING, 'airavataExperimentId', 'UTF8', None, ),  # 2
    )

    def __init__(self, authzToken=None, airavataExperimentId=None,):
        self.authzToken = authzToken
        self.airavataExperimentId = airavataExperimentId

    def read(self, iprot):
        if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None:
            iprot._fast_decode(self, iprot, (self.__class__, self.thrift_spec))
            return
        iprot.readStructBegin()
        while True:
            (fname, ftype, fid) = iprot.readFieldBegin()
            if ftype == TType.STOP:
                break
            if fid == 1:
                if ftype == TType.STRUCT:
                    self.authzToken = apache.airavata.model.security.ttypes.AuthzToken()
                    self.authzToken.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 2:
                if ftype == TType.STRING:
                    self.airavataExperimentId = iprot.readString().decode('utf-8') if sys.version_info[0] == 2 else iprot.readString()
                else:
                    iprot.skip(ftype)
            else:
                iprot.skip(ftype)
            iprot.readFieldEnd()
        iprot.readStructEnd()

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

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

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

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

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


class getExperiment_result(object):
    """
    Attributes:
     - success
     - ire
     - enf
     - ace
     - ase
     - ae
    """

    thrift_spec = (
        (0, TType.STRUCT, 'success', (apache.airavata.model.experiment.ttypes.ExperimentModel, apache.airavata.model.experiment.ttypes.ExperimentModel.thrift_spec), None, ),  # 0
        (1, TType.STRUCT, 'ire', (apache.airavata.api.error.ttypes.InvalidRequestException, apache.airavata.api.error.ttypes.InvalidRequestException.thrift_spec), None, ),  # 1
        (2, TType.STRUCT, 'enf', (apache.airavata.api.error.ttypes.ExperimentNotFoundException, apache.airavata.api.error.ttypes.ExperimentNotFoundException.thrift_spec), None, ),  # 2
        (3, TType.STRUCT, 'ace', (apache.airavata.api.error.ttypes.AiravataClientException, apache.airavata.api.error.ttypes.AiravataClientException.thrift_spec), None, ),  # 3
        (4, TType.STRUCT, 'ase', (apache.airavata.api.error.ttypes.AiravataSystemException, apache.airavata.api.error.ttypes.AiravataSystemException.thrift_spec), None, ),  # 4
        (5, TType.STRUCT, 'ae', (apache.airavata.api.error.ttypes.AuthorizationException, apache.airavata.api.error.ttypes.AuthorizationException.thrift_spec), None, ),  # 5
    )

    def __init__(self, success=None, ire=None, enf=None, ace=None, ase=None, ae=None,):
        self.success = success
        self.ire = ire
        self.enf = enf
        self.ace = ace
        self.ase = ase
        self.ae = ae

    def read(self, iprot):
        if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None:
            iprot._fast_decode(self, iprot, (self.__class__, self.thrift_spec))
            return
        iprot.readStructBegin()
        while True:
            (fname, ftype, fid) = iprot.readFieldBegin()
            if ftype == TType.STOP:
                break
            if fid == 0:
                if ftype == TType.STRUCT:
                    self.success = apache.airavata.model.experiment.ttypes.ExperimentModel()
                    self.success.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 1:
                if ftype == TType.STRUCT:
                    self.ire = apache.airavata.api.error.ttypes.InvalidRequestException()
                    self.ire.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 2:
                if ftype == TType.STRUCT:
                    self.enf = apache.airavata.api.error.ttypes.ExperimentNotFoundException()
                    self.enf.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 3:
                if ftype == TType.STRUCT:
                    self.ace = apache.airavata.api.error.ttypes.AiravataClientException()
                    self.ace.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 4:
                if ftype == TType.STRUCT:
                    self.ase = apache.airavata.api.error.ttypes.AiravataSystemException()
                    self.ase.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 5:
                if ftype == TType.STRUCT:
                    self.ae = apache.airavata.api.error.ttypes.AuthorizationException()
                    self.ae.read(iprot)
                else:
                    iprot.skip(ftype)
            else:
                iprot.skip(ftype)
            iprot.readFieldEnd()
        iprot.readStructEnd()

    def write(self, oprot):
        if oprot._fast_encode is not None and self.thrift_spec is not None:
            oprot.trans.write(oprot._fast_encode(self, (self.__class__, self.thrift_spec)))
            return
        oprot.writeStructBegin('getExperiment_result')
        if self.success is not None:
            oprot.writeFieldBegin('success', TType.STRUCT, 0)
            self.success.write(oprot)
            oprot.writeFieldEnd()
        if self.ire is not None:
            oprot.writeFieldBegin('ire', TType.STRUCT, 1)
            self.ire.write(oprot)
            oprot.writeFieldEnd()
        if self.enf is not None:
            oprot.writeFieldBegin('enf', TType.STRUCT, 2)
            self.enf.write(oprot)
            oprot.writeFieldEnd()
        if self.ace is not None:
            oprot.writeFieldBegin('ace', TType.STRUCT, 3)
            self.ace.write(oprot)
            oprot.writeFieldEnd()
        if self.ase is not None:
            oprot.writeFieldBegin('ase', TType.STRUCT, 4)
            self.ase.write(oprot)
            oprot.writeFieldEnd()
        if self.ae is not None:
            oprot.writeFieldBegin('ae', TType.STRUCT, 5)
            self.ae.write(oprot)
            oprot.writeFieldEnd()
        oprot.writeFieldStop()
        oprot.writeStructEnd()

    def validate(self):
        return

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

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

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


class getExperimentByAdmin_args(object):
    """
    Attributes:
     - authzToken
     - airavataExperimentId
    """

    thrift_spec = (
        None,  # 0
        (1, TType.STRUCT, 'authzToken', (apache.airavata.model.security.ttypes.AuthzToken, apache.airavata.model.security.ttypes.AuthzToken.thrift_spec), None, ),  # 1
        (2, TType.STRING, 'airavataExperimentId', 'UTF8', None, ),  # 2
    )

    def __init__(self, authzToken=None, airavataExperimentId=None,):
        self.authzToken = authzToken
        self.airavataExperimentId = airavataExperimentId

    def read(self, iprot):
        if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None:
            iprot._fast_decode(self, iprot, (self.__class__, self.thrift_spec))
            return
        iprot.readStructBegin()
        while True:
            (fname, ftype, fid) = iprot.readFieldBegin()
            if ftype == TType.STOP:
                break
            if fid == 1:
                if ftype == TType.STRUCT:
                    self.authzToken = apache.airavata.model.security.ttypes.AuthzToken()
                    self.authzToken.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 2:
                if ftype == TType.STRING:
                    self.airavataExperimentId = iprot.readString().decode('utf-8') if sys.version_info[0] == 2 else iprot.readString()
                else:
                    iprot.skip(ftype)
            else:
                iprot.skip(ftype)
            iprot.readFieldEnd()
        iprot.readStructEnd()

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

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

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

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

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


class getExperimentByAdmin_result(object):
    """
    Attributes:
     - success
     - ire
     - enf
     - ace
     - ase
     - ae
    """

    thrift_spec = (
        (0, TType.STRUCT, 'success', (apache.airavata.model.experiment.ttypes.ExperimentModel, apache.airavata.model.experiment.ttypes.ExperimentModel.thrift_spec), None, ),  # 0
        (1, TType.STRUCT, 'ire', (apache.airavata.api.error.ttypes.InvalidRequestException, apache.airavata.api.error.ttypes.InvalidRequestException.thrift_spec), None, ),  # 1
        (2, TType.STRUCT, 'enf', (apache.airavata.api.error.ttypes.ExperimentNotFoundException, apache.airavata.api.error.ttypes.ExperimentNotFoundException.thrift_spec), None, ),  # 2
        (3, TType.STRUCT, 'ace', (apache.airavata.api.error.ttypes.AiravataClientException, apache.airavata.api.error.ttypes.AiravataClientException.thrift_spec), None, ),  # 3
        (4, TType.STRUCT, 'ase', (apache.airavata.api.error.ttypes.AiravataSystemException, apache.airavata.api.error.ttypes.AiravataSystemException.thrift_spec), None, ),  # 4
        (5, TType.STRUCT, 'ae', (apache.airavata.api.error.ttypes.AuthorizationException, apache.airavata.api.error.ttypes.AuthorizationException.thrift_spec), None, ),  # 5
    )

    def __init__(self, success=None, ire=None, enf=None, ace=None, ase=None, ae=None,):
        self.success = success
        self.ire = ire
        self.enf = enf
        self.ace = ace
        self.ase = ase
        self.ae = ae

    def read(self, iprot):
        if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None:
            iprot._fast_decode(self, iprot, (self.__class__, self.thrift_spec))
            return
        iprot.readStructBegin()
        while True:
            (fname, ftype, fid) = iprot.readFieldBegin()
            if ftype == TType.STOP:
                break
            if fid == 0:
                if ftype == TType.STRUCT:
                    self.success = apache.airavata.model.experiment.ttypes.ExperimentModel()
                    self.success.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 1:
                if ftype == TType.STRUCT:
                    self.ire = apache.airavata.api.error.ttypes.InvalidRequestException()
                    self.ire.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 2:
                if ftype == TType.STRUCT:
                    self.enf = apache.airavata.api.error.ttypes.ExperimentNotFoundException()
                    self.enf.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 3:
                if ftype == TType.STRUCT:
                    self.ace = apache.airavata.api.error.ttypes.AiravataClientException()
                    self.ace.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 4:
                if ftype == TType.STRUCT:
                    self.ase = apache.airavata.api.error.ttypes.AiravataSystemException()
                    self.ase.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 5:
                if ftype == TType.STRUCT:
                    self.ae = apache.airavata.api.error.ttypes.AuthorizationException()
                    self.ae.read(iprot)
                else:
                    iprot.skip(ftype)
            else:
                iprot.skip(ftype)
            iprot.readFieldEnd()
        iprot.readStructEnd()

    def write(self, oprot):
        if oprot._fast_encode is not None and self.thrift_spec is not None:
            oprot.trans.write(oprot._fast_encode(self, (self.__class__, self.thrift_spec)))
            return
        oprot.writeStructBegin('getExperimentByAdmin_result')
        if self.success is not None:
            oprot.writeFieldBegin('success', TType.STRUCT, 0)
            self.success.write(oprot)
            oprot.writeFieldEnd()
        if self.ire is not None:
            oprot.writeFieldBegin('ire', TType.STRUCT, 1)
            self.ire.write(oprot)
            oprot.writeFieldEnd()
        if self.enf is not None:
            oprot.writeFieldBegin('enf', TType.STRUCT, 2)
            self.enf.write(oprot)
            oprot.writeFieldEnd()
        if self.ace is not None:
            oprot.writeFieldBegin('ace', TType.STRUCT, 3)
            self.ace.write(oprot)
            oprot.writeFieldEnd()
        if self.ase is not None:
            oprot.writeFieldBegin('ase', TType.STRUCT, 4)
            self.ase.write(oprot)
            oprot.writeFieldEnd()
        if self.ae is not None:
            oprot.writeFieldBegin('ae', TType.STRUCT, 5)
            self.ae.write(oprot)
            oprot.writeFieldEnd()
        oprot.writeFieldStop()
        oprot.writeStructEnd()

    def validate(self):
        return

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

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

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


class getDetailedExperimentTree_args(object):
    """
    Attributes:
     - authzToken
     - airavataExperimentId
    """

    thrift_spec = (
        None,  # 0
        (1, TType.STRUCT, 'authzToken', (apache.airavata.model.security.ttypes.AuthzToken, apache.airavata.model.security.ttypes.AuthzToken.thrift_spec), None, ),  # 1
        (2, TType.STRING, 'airavataExperimentId', 'UTF8', None, ),  # 2
    )

    def __init__(self, authzToken=None, airavataExperimentId=None,):
        self.authzToken = authzToken
        self.airavataExperimentId = airavataExperimentId

    def read(self, iprot):
        if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None:
            iprot._fast_decode(self, iprot, (self.__class__, self.thrift_spec))
            return
        iprot.readStructBegin()
        while True:
            (fname, ftype, fid) = iprot.readFieldBegin()
            if ftype == TType.STOP:
                break
            if fid == 1:
                if ftype == TType.STRUCT:
                    self.authzToken = apache.airavata.model.security.ttypes.AuthzToken()
                    self.authzToken.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 2:
                if ftype == TType.STRING:
                    self.airavataExperimentId = iprot.readString().decode('utf-8') if sys.version_info[0] == 2 else iprot.readString()
                else:
                    iprot.skip(ftype)
            else:
                iprot.skip(ftype)
            iprot.readFieldEnd()
        iprot.readStructEnd()

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

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

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

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

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


class getDetailedExperimentTree_result(object):
    """
    Attributes:
     - success
     - ire
     - enf
     - ace
     - ase
     - ae
    """

    thrift_spec = (
        (0, TType.STRUCT, 'success', (apache.airavata.model.experiment.ttypes.ExperimentModel, apache.airavata.model.experiment.ttypes.ExperimentModel.thrift_spec), None, ),  # 0
        (1, TType.STRUCT, 'ire', (apache.airavata.api.error.ttypes.InvalidRequestException, apache.airavata.api.error.ttypes.InvalidRequestException.thrift_spec), None, ),  # 1
        (2, TType.STRUCT, 'enf', (apache.airavata.api.error.ttypes.ExperimentNotFoundException, apache.airavata.api.error.ttypes.ExperimentNotFoundException.thrift_spec), None, ),  # 2
        (3, TType.STRUCT, 'ace', (apache.airavata.api.error.ttypes.AiravataClientException, apache.airavata.api.error.ttypes.AiravataClientException.thrift_spec), None, ),  # 3
        (4, TType.STRUCT, 'ase', (apache.airavata.api.error.ttypes.AiravataSystemException, apache.airavata.api.error.ttypes.AiravataSystemException.thrift_spec), None, ),  # 4
        (5, TType.STRUCT, 'ae', (apache.airavata.api.error.ttypes.AuthorizationException, apache.airavata.api.error.ttypes.AuthorizationException.thrift_spec), None, ),  # 5
    )

    def __init__(self, success=None, ire=None, enf=None, ace=None, ase=None, ae=None,):
        self.success = success
        self.ire = ire
        self.enf = enf
        self.ace = ace
        self.ase = ase
        self.ae = ae

    def read(self, iprot):
        if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None:
            iprot._fast_decode(self, iprot, (self.__class__, self.thrift_spec))
            return
        iprot.readStructBegin()
        while True:
            (fname, ftype, fid) = iprot.readFieldBegin()
            if ftype == TType.STOP:
                break
            if fid == 0:
                if ftype == TType.STRUCT:
                    self.success = apache.airavata.model.experiment.ttypes.ExperimentModel()
                    self.success.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 1:
                if ftype == TType.STRUCT:
                    self.ire = apache.airavata.api.error.ttypes.InvalidRequestException()
                    self.ire.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 2:
                if ftype == TType.STRUCT:
                    self.enf = apache.airavata.api.error.ttypes.ExperimentNotFoundException()
                    self.enf.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 3:
                if ftype == TType.STRUCT:
                    self.ace = apache.airavata.api.error.ttypes.AiravataClientException()
                    self.ace.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 4:
                if ftype == TType.STRUCT:
                    self.ase = apache.airavata.api.error.ttypes.AiravataSystemException()
                    self.ase.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 5:
                if ftype == TType.STRUCT:
                    self.ae = apache.airavata.api.error.ttypes.AuthorizationException()
                    self.ae.read(iprot)
                else:
                    iprot.skip(ftype)
            else:
                iprot.skip(ftype)
            iprot.readFieldEnd()
        iprot.readStructEnd()

    def write(self, oprot):
        if oprot._fast_encode is not None and self.thrift_spec is not None:
            oprot.trans.write(oprot._fast_encode(self, (self.__class__, self.thrift_spec)))
            return
        oprot.writeStructBegin('getDetailedExperimentTree_result')
        if self.success is not None:
            oprot.writeFieldBegin('success', TType.STRUCT, 0)
            self.success.write(oprot)
            oprot.writeFieldEnd()
        if self.ire is not None:
            oprot.writeFieldBegin('ire', TType.STRUCT, 1)
            self.ire.write(oprot)
            oprot.writeFieldEnd()
        if self.enf is not None:
            oprot.writeFieldBegin('enf', TType.STRUCT, 2)
            self.enf.write(oprot)
            oprot.writeFieldEnd()
        if self.ace is not None:
            oprot.writeFieldBegin('ace', TType.STRUCT, 3)
            self.ace.write(oprot)
            oprot.writeFieldEnd()
        if self.ase is not None:
            oprot.writeFieldBegin('ase', TType.STRUCT, 4)
            self.ase.write(oprot)
            oprot.writeFieldEnd()
        if self.ae is not None:
            oprot.writeFieldBegin('ae', TType.STRUCT, 5)
            self.ae.write(oprot)
            oprot.writeFieldEnd()
        oprot.writeFieldStop()
        oprot.writeStructEnd()

    def validate(self):
        return

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

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

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


class updateExperiment_args(object):
    """
    Attributes:
     - authzToken
     - airavataExperimentId
     - experiment
    """

    thrift_spec = (
        None,  # 0
        (1, TType.STRUCT, 'authzToken', (apache.airavata.model.security.ttypes.AuthzToken, apache.airavata.model.security.ttypes.AuthzToken.thrift_spec), None, ),  # 1
        (2, TType.STRING, 'airavataExperimentId', 'UTF8', None, ),  # 2
        (3, TType.STRUCT, 'experiment', (apache.airavata.model.experiment.ttypes.ExperimentModel, apache.airavata.model.experiment.ttypes.ExperimentModel.thrift_spec), None, ),  # 3
    )

    def __init__(self, authzToken=None, airavataExperimentId=None, experiment=None,):
        self.authzToken = authzToken
        self.airavataExperimentId = airavataExperimentId
        self.experiment = experiment

    def read(self, iprot):
        if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None:
            iprot._fast_decode(self, iprot, (self.__class__, self.thrift_spec))
            return
        iprot.readStructBegin()
        while True:
            (fname, ftype, fid) = iprot.readFieldBegin()
            if ftype == TType.STOP:
                break
            if fid == 1:
                if ftype == TType.STRUCT:
                    self.authzToken = apache.airavata.model.security.ttypes.AuthzToken()
                    self.authzToken.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 2:
                if ftype == TType.STRING:
                    self.airavataExperimentId = iprot.readString().decode('utf-8') if sys.version_info[0] == 2 else iprot.readString()
                else:
                    iprot.skip(ftype)
            elif fid == 3:
                if ftype == TType.STRUCT:
                    self.experiment = apache.airavata.model.experiment.ttypes.ExperimentModel()
                    self.experiment.read(iprot)
                else:
                    iprot.skip(ftype)
            else:
                iprot.skip(ftype)
            iprot.readFieldEnd()
        iprot.readStructEnd()

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

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

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

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

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


class updateExperiment_result(object):
    """
    Attributes:
     - ire
     - enf
     - ace
     - ase
     - ae
    """

    thrift_spec = (
        None,  # 0
        (1, TType.STRUCT, 'ire', (apache.airavata.api.error.ttypes.InvalidRequestException, apache.airavata.api.error.ttypes.InvalidRequestException.thrift_spec), None, ),  # 1
        (2, TType.STRUCT, 'enf', (apache.airavata.api.error.ttypes.ExperimentNotFoundException, apache.airavata.api.error.ttypes.ExperimentNotFoundException.thrift_spec), None, ),  # 2
        (3, TType.STRUCT, 'ace', (apache.airavata.api.error.ttypes.AiravataClientException, apache.airavata.api.error.ttypes.AiravataClientException.thrift_spec), None, ),  # 3
        (4, TType.STRUCT, 'ase', (apache.airavata.api.error.ttypes.AiravataSystemException, apache.airavata.api.error.ttypes.AiravataSystemException.thrift_spec), None, ),  # 4
        (5, TType.STRUCT, 'ae', (apache.airavata.api.error.ttypes.AuthorizationException, apache.airavata.api.error.ttypes.AuthorizationException.thrift_spec), None, ),  # 5
    )

    def __init__(self, ire=None, enf=None, ace=None, ase=None, ae=None,):
        self.ire = ire
        self.enf = enf
        self.ace = ace
        self.ase = ase
        self.ae = ae

    def read(self, iprot):
        if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None:
            iprot._fast_decode(self, iprot, (self.__class__, self.thrift_spec))
            return
        iprot.readStructBegin()
        while True:
            (fname, ftype, fid) = iprot.readFieldBegin()
            if ftype == TType.STOP:
                break
            if fid == 1:
                if ftype == TType.STRUCT:
                    self.ire = apache.airavata.api.error.ttypes.InvalidRequestException()
                    self.ire.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 2:
                if ftype == TType.STRUCT:
                    self.enf = apache.airavata.api.error.ttypes.ExperimentNotFoundException()
                    self.enf.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 3:
                if ftype == TType.STRUCT:
                    self.ace = apache.airavata.api.error.ttypes.AiravataClientException()
                    self.ace.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 4:
                if ftype == TType.STRUCT:
                    self.ase = apache.airavata.api.error.ttypes.AiravataSystemException()
                    self.ase.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 5:
                if ftype == TType.STRUCT:
                    self.ae = apache.airavata.api.error.ttypes.AuthorizationException()
                    self.ae.read(iprot)
                else:
                    iprot.skip(ftype)
            else:
                iprot.skip(ftype)
            iprot.readFieldEnd()
        iprot.readStructEnd()

    def write(self, oprot):
        if oprot._fast_encode is not None and self.thrift_spec is not None:
            oprot.trans.write(oprot._fast_encode(self, (self.__class__, self.thrift_spec)))
            return
        oprot.writeStructBegin('updateExperiment_result')
        if self.ire is not None:
            oprot.writeFieldBegin('ire', TType.STRUCT, 1)
            self.ire.write(oprot)
            oprot.writeFieldEnd()
        if self.enf is not None:
            oprot.writeFieldBegin('enf', TType.STRUCT, 2)
            self.enf.write(oprot)
            oprot.writeFieldEnd()
        if self.ace is not None:
            oprot.writeFieldBegin('ace', TType.STRUCT, 3)
            self.ace.write(oprot)
            oprot.writeFieldEnd()
        if self.ase is not None:
            oprot.writeFieldBegin('ase', TType.STRUCT, 4)
            self.ase.write(oprot)
            oprot.writeFieldEnd()
        if self.ae is not None:
            oprot.writeFieldBegin('ae', TType.STRUCT, 5)
            self.ae.write(oprot)
            oprot.writeFieldEnd()
        oprot.writeFieldStop()
        oprot.writeStructEnd()

    def validate(self):
        return

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

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

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


class updateExperimentConfiguration_args(object):
    """
    Attributes:
     - authzToken
     - airavataExperimentId
     - userConfiguration
    """

    thrift_spec = (
        None,  # 0
        (1, TType.STRUCT, 'authzToken', (apache.airavata.model.security.ttypes.AuthzToken, apache.airavata.model.security.ttypes.AuthzToken.thrift_spec), None, ),  # 1
        (2, TType.STRING, 'airavataExperimentId', 'UTF8', None, ),  # 2
        (3, TType.STRUCT, 'userConfiguration', (apache.airavata.model.experiment.ttypes.UserConfigurationDataModel, apache.airavata.model.experiment.ttypes.UserConfigurationDataModel.thrift_spec), None, ),  # 3
    )

    def __init__(self, authzToken=None, airavataExperimentId=None, userConfiguration=None,):
        self.authzToken = authzToken
        self.airavataExperimentId = airavataExperimentId
        self.userConfiguration = userConfiguration

    def read(self, iprot):
        if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None:
            iprot._fast_decode(self, iprot, (self.__class__, self.thrift_spec))
            return
        iprot.readStructBegin()
        while True:
            (fname, ftype, fid) = iprot.readFieldBegin()
            if ftype == TType.STOP:
                break
            if fid == 1:
                if ftype == TType.STRUCT:
                    self.authzToken = apache.airavata.model.security.ttypes.AuthzToken()
                    self.authzToken.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 2:
                if ftype == TType.STRING:
                    self.airavataExperimentId = iprot.readString().decode('utf-8') if sys.version_info[0] == 2 else iprot.readString()
                else:
                    iprot.skip(ftype)
            elif fid == 3:
                if ftype == TType.STRUCT:
                    self.userConfiguration = apache.airavata.model.experiment.ttypes.UserConfigurationDataModel()
                    self.userConfiguration.read(iprot)
                else:
                    iprot.skip(ftype)
            else:
                iprot.skip(ftype)
            iprot.readFieldEnd()
        iprot.readStructEnd()

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

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

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

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

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


class updateExperimentConfiguration_result(object):
    """
    Attributes:
     - ae
    """

    thrift_spec = (
        None,  # 0
        (1, TType.STRUCT, 'ae', (apache.airavata.api.error.ttypes.AuthorizationException, apache.airavata.api.error.ttypes.AuthorizationException.thrift_spec), None, ),  # 1
    )

    def __init__(self, ae=None,):
        self.ae = ae

    def read(self, iprot):
        if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None:
            iprot._fast_decode(self, iprot, (self.__class__, self.thrift_spec))
            return
        iprot.readStructBegin()
        while True:
            (fname, ftype, fid) = iprot.readFieldBegin()
            if ftype == TType.STOP:
                break
            if fid == 1:
                if ftype == TType.STRUCT:
                    self.ae = apache.airavata.api.error.ttypes.AuthorizationException()
                    self.ae.read(iprot)
                else:
                    iprot.skip(ftype)
            else:
                iprot.skip(ftype)
            iprot.readFieldEnd()
        iprot.readStructEnd()

    def write(self, oprot):
        if oprot._fast_encode is not None and self.thrift_spec is not None:
            oprot.trans.write(oprot._fast_encode(self, (self.__class__, self.thrift_spec)))
            return
        oprot.writeStructBegin('updateExperimentConfiguration_result')
        if self.ae is not None:
            oprot.writeFieldBegin('ae', TType.STRUCT, 1)
            self.ae.write(oprot)
            oprot.writeFieldEnd()
        oprot.writeFieldStop()
        oprot.writeStructEnd()

    def validate(self):
        return

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

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

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


class updateResourceScheduleing_args(object):
    """
    Attributes:
     - authzToken
     - airavataExperimentId
     - resourceScheduling
    """

    thrift_spec = (
        None,  # 0
        (1, TType.STRUCT, 'authzToken', (apache.airavata.model.security.ttypes.AuthzToken, apache.airavata.model.security.ttypes.AuthzToken.thrift_spec), None, ),  # 1
        (2, TType.STRING, 'airavataExperimentId', 'UTF8', None, ),  # 2
        (3, TType.STRUCT, 'resourceScheduling', (apache.airavata.model.scheduling.ttypes.ComputationalResourceSchedulingModel, apache.airavata.model.scheduling.ttypes.ComputationalResourceSchedulingModel.thrift_spec), None, ),  # 3
    )

    def __init__(self, authzToken=None, airavataExperimentId=None, resourceScheduling=None,):
        self.authzToken = authzToken
        self.airavataExperimentId = airavataExperimentId
        self.resourceScheduling = resourceScheduling

    def read(self, iprot):
        if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None:
            iprot._fast_decode(self, iprot, (self.__class__, self.thrift_spec))
            return
        iprot.readStructBegin()
        while True:
            (fname, ftype, fid) = iprot.readFieldBegin()
            if ftype == TType.STOP:
                break
            if fid == 1:
                if ftype == TType.STRUCT:
                    self.authzToken = apache.airavata.model.security.ttypes.AuthzToken()
                    self.authzToken.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 2:
                if ftype == TType.STRING:
                    self.airavataExperimentId = iprot.readString().decode('utf-8') if sys.version_info[0] == 2 else iprot.readString()
                else:
                    iprot.skip(ftype)
            elif fid == 3:
                if ftype == TType.STRUCT:
                    self.resourceScheduling = apache.airavata.model.scheduling.ttypes.ComputationalResourceSchedulingModel()
                    self.resourceScheduling.read(iprot)
                else:
                    iprot.skip(ftype)
            else:
                iprot.skip(ftype)
            iprot.readFieldEnd()
        iprot.readStructEnd()

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

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

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

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

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


class updateResourceScheduleing_result(object):
    """
    Attributes:
     - ae
    """

    thrift_spec = (
        None,  # 0
        (1, TType.STRUCT, 'ae', (apache.airavata.api.error.ttypes.AuthorizationException, apache.airavata.api.error.ttypes.AuthorizationException.thrift_spec), None, ),  # 1
    )

    def __init__(self, ae=None,):
        self.ae = ae

    def read(self, iprot):
        if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None:
            iprot._fast_decode(self, iprot, (self.__class__, self.thrift_spec))
            return
        iprot.readStructBegin()
        while True:
            (fname, ftype, fid) = iprot.readFieldBegin()
            if ftype == TType.STOP:
                break
            if fid == 1:
                if ftype == TType.STRUCT:
                    self.ae = apache.airavata.api.error.ttypes.AuthorizationException()
                    self.ae.read(iprot)
                else:
                    iprot.skip(ftype)
            else:
                iprot.skip(ftype)
            iprot.readFieldEnd()
        iprot.readStructEnd()

    def write(self, oprot):
        if oprot._fast_encode is not None and self.thrift_spec is not None:
            oprot.trans.write(oprot._fast_encode(self, (self.__class__, self.thrift_spec)))
            return
        oprot.writeStructBegin('updateResourceScheduleing_result')
        if self.ae is not None:
            oprot.writeFieldBegin('ae', TType.STRUCT, 1)
            self.ae.write(oprot)
            oprot.writeFieldEnd()
        oprot.writeFieldStop()
        oprot.writeStructEnd()

    def validate(self):
        return

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

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

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


class validateExperiment_args(object):
    """
    Attributes:
     - authzToken
     - airavataExperimentId
    """

    thrift_spec = (
        None,  # 0
        (1, TType.STRUCT, 'authzToken', (apache.airavata.model.security.ttypes.AuthzToken, apache.airavata.model.security.ttypes.AuthzToken.thrift_spec), None, ),  # 1
        (2, TType.STRING, 'airavataExperimentId', 'UTF8', None, ),  # 2
    )

    def __init__(self, authzToken=None, airavataExperimentId=None,):
        self.authzToken = authzToken
        self.airavataExperimentId = airavataExperimentId

    def read(self, iprot):
        if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None:
            iprot._fast_decode(self, iprot, (self.__class__, self.thrift_spec))
            return
        iprot.readStructBegin()
        while True:
            (fname, ftype, fid) = iprot.readFieldBegin()
            if ftype == TType.STOP:
                break
            if fid == 1:
                if ftype == TType.STRUCT:
                    self.authzToken = apache.airavata.model.security.ttypes.AuthzToken()
                    self.authzToken.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 2:
                if ftype == TType.STRING:
                    self.airavataExperimentId = iprot.readString().decode('utf-8') if sys.version_info[0] == 2 else iprot.readString()
                else:
                    iprot.skip(ftype)
            else:
                iprot.skip(ftype)
            iprot.readFieldEnd()
        iprot.readStructEnd()

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

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

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

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

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


class validateExperiment_result(object):
    """
    Attributes:
     - success
     - ire
     - enf
     - ace
     - ase
     - ae
    """

    thrift_spec = (
        (0, TType.BOOL, 'success', None, None, ),  # 0
        (1, TType.STRUCT, 'ire', (apache.airavata.api.error.ttypes.InvalidRequestException, apache.airavata.api.error.ttypes.InvalidRequestException.thrift_spec), None, ),  # 1
        (2, TType.STRUCT, 'enf', (apache.airavata.api.error.ttypes.ExperimentNotFoundException, apache.airavata.api.error.ttypes.ExperimentNotFoundException.thrift_spec), None, ),  # 2
        (3, TType.STRUCT, 'ace', (apache.airavata.api.error.ttypes.AiravataClientException, apache.airavata.api.error.ttypes.AiravataClientException.thrift_spec), None, ),  # 3
        (4, TType.STRUCT, 'ase', (apache.airavata.api.error.ttypes.AiravataSystemException, apache.airavata.api.error.ttypes.AiravataSystemException.thrift_spec), None, ),  # 4
        (5, TType.STRUCT, 'ae', (apache.airavata.api.error.ttypes.AuthorizationException, apache.airavata.api.error.ttypes.AuthorizationException.thrift_spec), None, ),  # 5
    )

    def __init__(self, success=None, ire=None, enf=None, ace=None, ase=None, ae=None,):
        self.success = success
        self.ire = ire
        self.enf = enf
        self.ace = ace
        self.ase = ase
        self.ae = ae

    def read(self, iprot):
        if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None:
            iprot._fast_decode(self, iprot, (self.__class__, self.thrift_spec))
            return
        iprot.readStructBegin()
        while True:
            (fname, ftype, fid) = iprot.readFieldBegin()
            if ftype == TType.STOP:
                break
            if fid == 0:
                if ftype == TType.BOOL:
                    self.success = iprot.readBool()
                else:
                    iprot.skip(ftype)
            elif fid == 1:
                if ftype == TType.STRUCT:
                    self.ire = apache.airavata.api.error.ttypes.InvalidRequestException()
                    self.ire.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 2:
                if ftype == TType.STRUCT:
                    self.enf = apache.airavata.api.error.ttypes.ExperimentNotFoundException()
                    self.enf.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 3:
                if ftype == TType.STRUCT:
                    self.ace = apache.airavata.api.error.ttypes.AiravataClientException()
                    self.ace.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 4:
                if ftype == TType.STRUCT:
                    self.ase = apache.airavata.api.error.ttypes.AiravataSystemException()
                    self.ase.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 5:
                if ftype == TType.STRUCT:
                    self.ae = apache.airavata.api.error.ttypes.AuthorizationException()
                    self.ae.read(iprot)
                else:
                    iprot.skip(ftype)
            else:
                iprot.skip(ftype)
            iprot.readFieldEnd()
        iprot.readStructEnd()

    def write(self, oprot):
        if oprot._fast_encode is not None and self.thrift_spec is not None:
            oprot.trans.write(oprot._fast_encode(self, (self.__class__, self.thrift_spec)))
            return
        oprot.writeStructBegin('validateExperiment_result')
        if self.success is not None:
            oprot.writeFieldBegin('success', TType.BOOL, 0)
            oprot.writeBool(self.success)
            oprot.writeFieldEnd()
        if self.ire is not None:
            oprot.writeFieldBegin('ire', TType.STRUCT, 1)
            self.ire.write(oprot)
            oprot.writeFieldEnd()
        if self.enf is not None:
            oprot.writeFieldBegin('enf', TType.STRUCT, 2)
            self.enf.write(oprot)
            oprot.writeFieldEnd()
        if self.ace is not None:
            oprot.writeFieldBegin('ace', TType.STRUCT, 3)
            self.ace.write(oprot)
            oprot.writeFieldEnd()
        if self.ase is not None:
            oprot.writeFieldBegin('ase', TType.STRUCT, 4)
            self.ase.write(oprot)
            oprot.writeFieldEnd()
        if self.ae is not None:
            oprot.writeFieldBegin('ae', TType.STRUCT, 5)
            self.ae.write(oprot)
            oprot.writeFieldEnd()
        oprot.writeFieldStop()
        oprot.writeStructEnd()

    def validate(self):
        return

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

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

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


class launchExperiment_args(object):
    """
    Attributes:
     - authzToken
     - airavataExperimentId
     - gatewayId
    """

    thrift_spec = (
        None,  # 0
        (1, TType.STRUCT, 'authzToken', (apache.airavata.model.security.ttypes.AuthzToken, apache.airavata.model.security.ttypes.AuthzToken.thrift_spec), None, ),  # 1
        (2, TType.STRING, 'airavataExperimentId', 'UTF8', None, ),  # 2
        (3, TType.STRING, 'gatewayId', 'UTF8', None, ),  # 3
    )

    def __init__(self, authzToken=None, airavataExperimentId=None, gatewayId=None,):
        self.authzToken = authzToken
        self.airavataExperimentId = airavataExperimentId
        self.gatewayId = gatewayId

    def read(self, iprot):
        if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None:
            iprot._fast_decode(self, iprot, (self.__class__, self.thrift_spec))
            return
        iprot.readStructBegin()
        while True:
            (fname, ftype, fid) = iprot.readFieldBegin()
            if ftype == TType.STOP:
                break
            if fid == 1:
                if ftype == TType.STRUCT:
                    self.authzToken = apache.airavata.model.security.ttypes.AuthzToken()
                    self.authzToken.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 2:
                if ftype == TType.STRING:
                    self.airavataExperimentId = iprot.readString().decode('utf-8') if sys.version_info[0] == 2 else iprot.readString()
                else:
                    iprot.skip(ftype)
            elif fid == 3:
                if ftype == TType.STRING:
                    self.gatewayId = iprot.readString().decode('utf-8') if sys.version_info[0] == 2 else iprot.readString()
                else:
                    iprot.skip(ftype)
            else:
                iprot.skip(ftype)
            iprot.readFieldEnd()
        iprot.readStructEnd()

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

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

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

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

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


class launchExperiment_result(object):
    """
    Attributes:
     - ire
     - enf
     - ace
     - ase
     - ae
    """

    thrift_spec = (
        None,  # 0
        (1, TType.STRUCT, 'ire', (apache.airavata.api.error.ttypes.InvalidRequestException, apache.airavata.api.error.ttypes.InvalidRequestException.thrift_spec), None, ),  # 1
        (2, TType.STRUCT, 'enf', (apache.airavata.api.error.ttypes.ExperimentNotFoundException, apache.airavata.api.error.ttypes.ExperimentNotFoundException.thrift_spec), None, ),  # 2
        (3, TType.STRUCT, 'ace', (apache.airavata.api.error.ttypes.AiravataClientException, apache.airavata.api.error.ttypes.AiravataClientException.thrift_spec), None, ),  # 3
        (4, TType.STRUCT, 'ase', (apache.airavata.api.error.ttypes.AiravataSystemException, apache.airavata.api.error.ttypes.AiravataSystemException.thrift_spec), None, ),  # 4
        (5, TType.STRUCT, 'ae', (apache.airavata.api.error.ttypes.AuthorizationException, apache.airavata.api.error.ttypes.AuthorizationException.thrift_spec), None, ),  # 5
    )

    def __init__(self, ire=None, enf=None, ace=None, ase=None, ae=None,):
        self.ire = ire
        self.enf = enf
        self.ace = ace
        self.ase = ase
        self.ae = ae

    def read(self, iprot):
        if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None:
            iprot._fast_decode(self, iprot, (self.__class__, self.thrift_spec))
            return
        iprot.readStructBegin()
        while True:
            (fname, ftype, fid) = iprot.readFieldBegin()
            if ftype == TType.STOP:
                break
            if fid == 1:
                if ftype == TType.STRUCT:
                    self.ire = apache.airavata.api.error.ttypes.InvalidRequestException()
                    self.ire.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 2:
                if ftype == TType.STRUCT:
                    self.enf = apache.airavata.api.error.ttypes.ExperimentNotFoundException()
                    self.enf.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 3:
                if ftype == TType.STRUCT:
                    self.ace = apache.airavata.api.error.ttypes.AiravataClientException()
                    self.ace.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 4:
                if ftype == TType.STRUCT:
                    self.ase = apache.airavata.api.error.ttypes.AiravataSystemException()
                    self.ase.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 5:
                if ftype == TType.STRUCT:
                    self.ae = apache.airavata.api.error.ttypes.AuthorizationException()
                    self.ae.read(iprot)
                else:
                    iprot.skip(ftype)
            else:
                iprot.skip(ftype)
            iprot.readFieldEnd()
        iprot.readStructEnd()

    def write(self, oprot):
        if oprot._fast_encode is not None and self.thrift_spec is not None:
            oprot.trans.write(oprot._fast_encode(self, (self.__class__, self.thrift_spec)))
            return
        oprot.writeStructBegin('launchExperiment_result')
        if self.ire is not None:
            oprot.writeFieldBegin('ire', TType.STRUCT, 1)
            self.ire.write(oprot)
            oprot.writeFieldEnd()
        if self.enf is not None:
            oprot.writeFieldBegin('enf', TType.STRUCT, 2)
            self.enf.write(oprot)
            oprot.writeFieldEnd()
        if self.ace is not None:
            oprot.writeFieldBegin('ace', TType.STRUCT, 3)
            self.ace.write(oprot)
            oprot.writeFieldEnd()
        if self.ase is not None:
            oprot.writeFieldBegin('ase', TType.STRUCT, 4)
            self.ase.write(oprot)
            oprot.writeFieldEnd()
        if self.ae is not None:
            oprot.writeFieldBegin('ae', TType.STRUCT, 5)
            self.ae.write(oprot)
            oprot.writeFieldEnd()
        oprot.writeFieldStop()
        oprot.writeStructEnd()

    def validate(self):
        return

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

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

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


class getExperimentStatus_args(object):
    """
    Attributes:
     - authzToken
     - airavataExperimentId
    """

    thrift_spec = (
        None,  # 0
        (1, TType.STRUCT, 'authzToken', (apache.airavata.model.security.ttypes.AuthzToken, apache.airavata.model.security.ttypes.AuthzToken.thrift_spec), None, ),  # 1
        (2, TType.STRING, 'airavataExperimentId', 'UTF8', None, ),  # 2
    )

    def __init__(self, authzToken=None, airavataExperimentId=None,):
        self.authzToken = authzToken
        self.airavataExperimentId = airavataExperimentId

    def read(self, iprot):
        if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None:
            iprot._fast_decode(self, iprot, (self.__class__, self.thrift_spec))
            return
        iprot.readStructBegin()
        while True:
            (fname, ftype, fid) = iprot.readFieldBegin()
            if ftype == TType.STOP:
                break
            if fid == 1:
                if ftype == TType.STRUCT:
                    self.authzToken = apache.airavata.model.security.ttypes.AuthzToken()
                    self.authzToken.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 2:
                if ftype == TType.STRING:
                    self.airavataExperimentId = iprot.readString().decode('utf-8') if sys.version_info[0] == 2 else iprot.readString()
                else:
                    iprot.skip(ftype)
            else:
                iprot.skip(ftype)
            iprot.readFieldEnd()
        iprot.readStructEnd()

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

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

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

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

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


class getExperimentStatus_result(object):
    """
    Attributes:
     - success
     - ire
     - enf
     - ace
     - ase
     - ae
    """

    thrift_spec = (
        (0, TType.STRUCT, 'success', (apache.airavata.model.status.ttypes.ExperimentStatus, apache.airavata.model.status.ttypes.ExperimentStatus.thrift_spec), None, ),  # 0
        (1, TType.STRUCT, 'ire', (apache.airavata.api.error.ttypes.InvalidRequestException, apache.airavata.api.error.ttypes.InvalidRequestException.thrift_spec), None, ),  # 1
        (2, TType.STRUCT, 'enf', (apache.airavata.api.error.ttypes.ExperimentNotFoundException, apache.airavata.api.error.ttypes.ExperimentNotFoundException.thrift_spec), None, ),  # 2
        (3, TType.STRUCT, 'ace', (apache.airavata.api.error.ttypes.AiravataClientException, apache.airavata.api.error.ttypes.AiravataClientException.thrift_spec), None, ),  # 3
        (4, TType.STRUCT, 'ase', (apache.airavata.api.error.ttypes.AiravataSystemException, apache.airavata.api.error.ttypes.AiravataSystemException.thrift_spec), None, ),  # 4
        (5, TType.STRUCT, 'ae', (apache.airavata.api.error.ttypes.AuthorizationException, apache.airavata.api.error.ttypes.AuthorizationException.thrift_spec), None, ),  # 5
    )

    def __init__(self, success=None, ire=None, enf=None, ace=None, ase=None, ae=None,):
        self.success = success
        self.ire = ire
        self.enf = enf
        self.ace = ace
        self.ase = ase
        self.ae = ae

    def read(self, iprot):
        if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None:
            iprot._fast_decode(self, iprot, (self.__class__, self.thrift_spec))
            return
        iprot.readStructBegin()
        while True:
            (fname, ftype, fid) = iprot.readFieldBegin()
            if ftype == TType.STOP:
                break
            if fid == 0:
                if ftype == TType.STRUCT:
                    self.success = apache.airavata.model.status.ttypes.ExperimentStatus()
                    self.success.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 1:
                if ftype == TType.STRUCT:
                    self.ire = apache.airavata.api.error.ttypes.InvalidRequestException()
                    self.ire.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 2:
                if ftype == TType.STRUCT:
                    self.enf = apache.airavata.api.error.ttypes.ExperimentNotFoundException()
                    self.enf.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 3:
                if ftype == TType.STRUCT:
                    self.ace = apache.airavata.api.error.ttypes.AiravataClientException()
                    self.ace.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 4:
                if ftype == TType.STRUCT:
                    self.ase = apache.airavata.api.error.ttypes.AiravataSystemException()
                    self.ase.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 5:
                if ftype == TType.STRUCT:
                    self.ae = apache.airavata.api.error.ttypes.AuthorizationException()
                    self.ae.read(iprot)
                else:
                    iprot.skip(ftype)
            else:
                iprot.skip(ftype)
            iprot.readFieldEnd()
        iprot.readStructEnd()

    def write(self, oprot):
        if oprot._fast_encode is not None and self.thrift_spec is not None:
            oprot.trans.write(oprot._fast_encode(self, (self.__class__, self.thrift_spec)))
            return
        oprot.writeStructBegin('getExperimentStatus_result')
        if self.success is not None:
            oprot.writeFieldBegin('success', TType.STRUCT, 0)
            self.success.write(oprot)
            oprot.writeFieldEnd()
        if self.ire is not None:
            oprot.writeFieldBegin('ire', TType.STRUCT, 1)
            self.ire.write(oprot)
            oprot.writeFieldEnd()
        if self.enf is not None:
            oprot.writeFieldBegin('enf', TType.STRUCT, 2)
            self.enf.write(oprot)
            oprot.writeFieldEnd()
        if self.ace is not None:
            oprot.writeFieldBegin('ace', TType.STRUCT, 3)
            self.ace.write(oprot)
            oprot.writeFieldEnd()
        if self.ase is not None:
            oprot.writeFieldBegin('ase', TType.STRUCT, 4)
            self.ase.write(oprot)
            oprot.writeFieldEnd()
        if self.ae is not None:
            oprot.writeFieldBegin('ae', TType.STRUCT, 5)
            self.ae.write(oprot)
            oprot.writeFieldEnd()
        oprot.writeFieldStop()
        oprot.writeStructEnd()

    def validate(self):
        return

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

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

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


class getExperimentOutputs_args(object):
    """
    Attributes:
     - authzToken
     - airavataExperimentId
    """

    thrift_spec = (
        None,  # 0
        (1, TType.STRUCT, 'authzToken', (apache.airavata.model.security.ttypes.AuthzToken, apache.airavata.model.security.ttypes.AuthzToken.thrift_spec), None, ),  # 1
        (2, TType.STRING, 'airavataExperimentId', 'UTF8', None, ),  # 2
    )

    def __init__(self, authzToken=None, airavataExperimentId=None,):
        self.authzToken = authzToken
        self.airavataExperimentId = airavataExperimentId

    def read(self, iprot):
        if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None:
            iprot._fast_decode(self, iprot, (self.__class__, self.thrift_spec))
            return
        iprot.readStructBegin()
        while True:
            (fname, ftype, fid) = iprot.readFieldBegin()
            if ftype == TType.STOP:
                break
            if fid == 1:
                if ftype == TType.STRUCT:
                    self.authzToken = apache.airavata.model.security.ttypes.AuthzToken()
                    self.authzToken.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 2:
                if ftype == TType.STRING:
                    self.airavataExperimentId = iprot.readString().decode('utf-8') if sys.version_info[0] == 2 else iprot.readString()
                else:
                    iprot.skip(ftype)
            else:
                iprot.skip(ftype)
            iprot.readFieldEnd()
        iprot.readStructEnd()

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

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

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

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

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


class getExperimentOutputs_result(object):
    """
    Attributes:
     - success
     - ire
     - enf
     - ace
     - ase
     - ae
    """

    thrift_spec = (
        (0, TType.LIST, 'success', (TType.STRUCT, (apache.airavata.model.application.io.ttypes.OutputDataObjectType, apache.airavata.model.application.io.ttypes.OutputDataObjectType.thrift_spec), False), None, ),  # 0
        (1, TType.STRUCT, 'ire', (apache.airavata.api.error.ttypes.InvalidRequestException, apache.airavata.api.error.ttypes.InvalidRequestException.thrift_spec), None, ),  # 1
        (2, TType.STRUCT, 'enf', (apache.airavata.api.error.ttypes.ExperimentNotFoundException, apache.airavata.api.error.ttypes.ExperimentNotFoundException.thrift_spec), None, ),  # 2
        (3, TType.STRUCT, 'ace', (apache.airavata.api.error.ttypes.AiravataClientException, apache.airavata.api.error.ttypes.AiravataClientException.thrift_spec), None, ),  # 3
        (4, TType.STRUCT, 'ase', (apache.airavata.api.error.ttypes.AiravataSystemException, apache.airavata.api.error.ttypes.AiravataSystemException.thrift_spec), None, ),  # 4
        (5, TType.STRUCT, 'ae', (apache.airavata.api.error.ttypes.AuthorizationException, apache.airavata.api.error.ttypes.AuthorizationException.thrift_spec), None, ),  # 5
    )

    def __init__(self, success=None, ire=None, enf=None, ace=None, ase=None, ae=None,):
        self.success = success
        self.ire = ire
        self.enf = enf
        self.ace = ace
        self.ase = ase
        self.ae = ae

    def read(self, iprot):
        if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None:
            iprot._fast_decode(self, iprot, (self.__class__, self.thrift_spec))
            return
        iprot.readStructBegin()
        while True:
            (fname, ftype, fid) = iprot.readFieldBegin()
            if ftype == TType.STOP:
                break
            if fid == 0:
                if ftype == TType.LIST:
                    self.success = []
                    (_etype109, _size106) = iprot.readListBegin()
                    for _i110 in range(_size106):
                        _elem111 = apache.airavata.model.application.io.ttypes.OutputDataObjectType()
                        _elem111.read(iprot)
                        self.success.append(_elem111)
                    iprot.readListEnd()
                else:
                    iprot.skip(ftype)
            elif fid == 1:
                if ftype == TType.STRUCT:
                    self.ire = apache.airavata.api.error.ttypes.InvalidRequestException()
                    self.ire.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 2:
                if ftype == TType.STRUCT:
                    self.enf = apache.airavata.api.error.ttypes.ExperimentNotFoundException()
                    self.enf.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 3:
                if ftype == TType.STRUCT:
                    self.ace = apache.airavata.api.error.ttypes.AiravataClientException()
                    self.ace.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 4:
                if ftype == TType.STRUCT:
                    self.ase = apache.airavata.api.error.ttypes.AiravataSystemException()
                    self.ase.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 5:
                if ftype == TType.STRUCT:
                    self.ae = apache.airavata.api.error.ttypes.AuthorizationException()
                    self.ae.read(iprot)
                else:
                    iprot.skip(ftype)
            else:
                iprot.skip(ftype)
            iprot.readFieldEnd()
        iprot.readStructEnd()

    def write(self, oprot):
        if oprot._fast_encode is not None and self.thrift_spec is not None:
            oprot.trans.write(oprot._fast_encode(self, (self.__class__, self.thrift_spec)))
            return
        oprot.writeStructBegin('getExperimentOutputs_result')
        if self.success is not None:
            oprot.writeFieldBegin('success', TType.LIST, 0)
            oprot.writeListBegin(TType.STRUCT, len(self.success))
            for iter112 in self.success:
                iter112.write(oprot)
            oprot.writeListEnd()
            oprot.writeFieldEnd()
        if self.ire is not None:
            oprot.writeFieldBegin('ire', TType.STRUCT, 1)
            self.ire.write(oprot)
            oprot.writeFieldEnd()
        if self.enf is not None:
            oprot.writeFieldBegin('enf', TType.STRUCT, 2)
            self.enf.write(oprot)
            oprot.writeFieldEnd()
        if self.ace is not None:
            oprot.writeFieldBegin('ace', TType.STRUCT, 3)
            self.ace.write(oprot)
            oprot.writeFieldEnd()
        if self.ase is not None:
            oprot.writeFieldBegin('ase', TType.STRUCT, 4)
            self.ase.write(oprot)
            oprot.writeFieldEnd()
        if self.ae is not None:
            oprot.writeFieldBegin('ae', TType.STRUCT, 5)
            self.ae.write(oprot)
            oprot.writeFieldEnd()
        oprot.writeFieldStop()
        oprot.writeStructEnd()

    def validate(self):
        return

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

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

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


class getIntermediateOutputs_args(object):
    """
    Attributes:
     - authzToken
     - airavataExperimentId
    """

    thrift_spec = (
        None,  # 0
        (1, TType.STRUCT, 'authzToken', (apache.airavata.model.security.ttypes.AuthzToken, apache.airavata.model.security.ttypes.AuthzToken.thrift_spec), None, ),  # 1
        (2, TType.STRING, 'airavataExperimentId', 'UTF8', None, ),  # 2
    )

    def __init__(self, authzToken=None, airavataExperimentId=None,):
        self.authzToken = authzToken
        self.airavataExperimentId = airavataExperimentId

    def read(self, iprot):
        if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None:
            iprot._fast_decode(self, iprot, (self.__class__, self.thrift_spec))
            return
        iprot.readStructBegin()
        while True:
            (fname, ftype, fid) = iprot.readFieldBegin()
            if ftype == TType.STOP:
                break
            if fid == 1:
                if ftype == TType.STRUCT:
                    self.authzToken = apache.airavata.model.security.ttypes.AuthzToken()
                    self.authzToken.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 2:
                if ftype == TType.STRING:
                    self.airavataExperimentId = iprot.readString().decode('utf-8') if sys.version_info[0] == 2 else iprot.readString()
                else:
                    iprot.skip(ftype)
            else:
                iprot.skip(ftype)
            iprot.readFieldEnd()
        iprot.readStructEnd()

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

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

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

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

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


class getIntermediateOutputs_result(object):
    """
    Attributes:
     - success
     - ire
     - enf
     - ace
     - ase
     - ae
    """

    thrift_spec = (
        (0, TType.LIST, 'success', (TType.STRUCT, (apache.airavata.model.application.io.ttypes.OutputDataObjectType, apache.airavata.model.application.io.ttypes.OutputDataObjectType.thrift_spec), False), None, ),  # 0
        (1, TType.STRUCT, 'ire', (apache.airavata.api.error.ttypes.InvalidRequestException, apache.airavata.api.error.ttypes.InvalidRequestException.thrift_spec), None, ),  # 1
        (2, TType.STRUCT, 'enf', (apache.airavata.api.error.ttypes.ExperimentNotFoundException, apache.airavata.api.error.ttypes.ExperimentNotFoundException.thrift_spec), None, ),  # 2
        (3, TType.STRUCT, 'ace', (apache.airavata.api.error.ttypes.AiravataClientException, apache.airavata.api.error.ttypes.AiravataClientException.thrift_spec), None, ),  # 3
        (4, TType.STRUCT, 'ase', (apache.airavata.api.error.ttypes.AiravataSystemException, apache.airavata.api.error.ttypes.AiravataSystemException.thrift_spec), None, ),  # 4
        (5, TType.STRUCT, 'ae', (apache.airavata.api.error.ttypes.AuthorizationException, apache.airavata.api.error.ttypes.AuthorizationException.thrift_spec), None, ),  # 5
    )

    def __init__(self, success=None, ire=None, enf=None, ace=None, ase=None, ae=None,):
        self.success = success
        self.ire = ire
        self.enf = enf
        self.ace = ace
        self.ase = ase
        self.ae = ae

    def read(self, iprot):
        if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None:
            iprot._fast_decode(self, iprot, (self.__class__, self.thrift_spec))
            return
        iprot.readStructBegin()
        while True:
            (fname, ftype, fid) = iprot.readFieldBegin()
            if ftype == TType.STOP:
                break
            if fid == 0:
                if ftype == TType.LIST:
                    self.success = []
                    (_etype116, _size113) = iprot.readListBegin()
                    for _i117 in range(_size113):
                        _elem118 = apache.airavata.model.application.io.ttypes.OutputDataObjectType()
                        _elem118.read(iprot)
                        self.success.append(_elem118)
                    iprot.readListEnd()
                else:
                    iprot.skip(ftype)
            elif fid == 1:
                if ftype == TType.STRUCT:
                    self.ire = apache.airavata.api.error.ttypes.InvalidRequestException()
                    self.ire.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 2:
                if ftype == TType.STRUCT:
                    self.enf = apache.airavata.api.error.ttypes.ExperimentNotFoundException()
                    self.enf.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 3:
                if ftype == TType.STRUCT:
                    self.ace = apache.airavata.api.error.ttypes.AiravataClientException()
                    self.ace.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 4:
                if ftype == TType.STRUCT:
                    self.ase = apache.airavata.api.error.ttypes.AiravataSystemException()
                    self.ase.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 5:
                if ftype == TType.STRUCT:
                    self.ae = apache.airavata.api.error.ttypes.AuthorizationException()
                    self.ae.read(iprot)
                else:
                    iprot.skip(ftype)
            else:
                iprot.skip(ftype)
            iprot.readFieldEnd()
        iprot.readStructEnd()

    def write(self, oprot):
        if oprot._fast_encode is not None and self.thrift_spec is not None:
            oprot.trans.write(oprot._fast_encode(self, (self.__class__, self.thrift_spec)))
            return
        oprot.writeStructBegin('getIntermediateOutputs_result')
        if self.success is not None:
            oprot.writeFieldBegin('success', TType.LIST, 0)
            oprot.writeListBegin(TType.STRUCT, len(self.success))
            for iter119 in self.success:
                iter119.write(oprot)
            oprot.writeListEnd()
            oprot.writeFieldEnd()
        if self.ire is not None:
            oprot.writeFieldBegin('ire', TType.STRUCT, 1)
            self.ire.write(oprot)
            oprot.writeFieldEnd()
        if self.enf is not None:
            oprot.writeFieldBegin('enf', TType.STRUCT, 2)
            self.enf.write(oprot)
            oprot.writeFieldEnd()
        if self.ace is not None:
            oprot.writeFieldBegin('ace', TType.STRUCT, 3)
            self.ace.write(oprot)
            oprot.writeFieldEnd()
        if self.ase is not None:
            oprot.writeFieldBegin('ase', TType.STRUCT, 4)
            self.ase.write(oprot)
            oprot.writeFieldEnd()
        if self.ae is not None:
            oprot.writeFieldBegin('ae', TType.STRUCT, 5)
            self.ae.write(oprot)
            oprot.writeFieldEnd()
        oprot.writeFieldStop()
        oprot.writeStructEnd()

    def validate(self):
        return

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

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

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


class getJobStatuses_args(object):
    """
    Attributes:
     - authzToken
     - airavataExperimentId
    """

    thrift_spec = (
        None,  # 0
        (1, TType.STRUCT, 'authzToken', (apache.airavata.model.security.ttypes.AuthzToken, apache.airavata.model.security.ttypes.AuthzToken.thrift_spec), None, ),  # 1
        (2, TType.STRING, 'airavataExperimentId', 'UTF8', None, ),  # 2
    )

    def __init__(self, authzToken=None, airavataExperimentId=None,):
        self.authzToken = authzToken
        self.airavataExperimentId = airavataExperimentId

    def read(self, iprot):
        if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None:
            iprot._fast_decode(self, iprot, (self.__class__, self.thrift_spec))
            return
        iprot.readStructBegin()
        while True:
            (fname, ftype, fid) = iprot.readFieldBegin()
            if ftype == TType.STOP:
                break
            if fid == 1:
                if ftype == TType.STRUCT:
                    self.authzToken = apache.airavata.model.security.ttypes.AuthzToken()
                    self.authzToken.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 2:
                if ftype == TType.STRING:
                    self.airavataExperimentId = iprot.readString().decode('utf-8') if sys.version_info[0] == 2 else iprot.readString()
                else:
                    iprot.skip(ftype)
            else:
                iprot.skip(ftype)
            iprot.readFieldEnd()
        iprot.readStructEnd()

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

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

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

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

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


class getJobStatuses_result(object):
    """
    Attributes:
     - success
     - ire
     - enf
     - ace
     - ase
     - ae
    """

    thrift_spec = (
        (0, TType.MAP, 'success', (TType.STRING, 'UTF8', TType.STRUCT, (apache.airavata.model.status.ttypes.JobStatus, apache.airavata.model.status.ttypes.JobStatus.thrift_spec), False), None, ),  # 0
        (1, TType.STRUCT, 'ire', (apache.airavata.api.error.ttypes.InvalidRequestException, apache.airavata.api.error.ttypes.InvalidRequestException.thrift_spec), None, ),  # 1
        (2, TType.STRUCT, 'enf', (apache.airavata.api.error.ttypes.ExperimentNotFoundException, apache.airavata.api.error.ttypes.ExperimentNotFoundException.thrift_spec), None, ),  # 2
        (3, TType.STRUCT, 'ace', (apache.airavata.api.error.ttypes.AiravataClientException, apache.airavata.api.error.ttypes.AiravataClientException.thrift_spec), None, ),  # 3
        (4, TType.STRUCT, 'ase', (apache.airavata.api.error.ttypes.AiravataSystemException, apache.airavata.api.error.ttypes.AiravataSystemException.thrift_spec), None, ),  # 4
        (5, TType.STRUCT, 'ae', (apache.airavata.api.error.ttypes.AuthorizationException, apache.airavata.api.error.ttypes.AuthorizationException.thrift_spec), None, ),  # 5
    )

    def __init__(self, success=None, ire=None, enf=None, ace=None, ase=None, ae=None,):
        self.success = success
        self.ire = ire
        self.enf = enf
        self.ace = ace
        self.ase = ase
        self.ae = ae

    def read(self, iprot):
        if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None:
            iprot._fast_decode(self, iprot, (self.__class__, self.thrift_spec))
            return
        iprot.readStructBegin()
        while True:
            (fname, ftype, fid) = iprot.readFieldBegin()
            if ftype == TType.STOP:
                break
            if fid == 0:
                if ftype == TType.MAP:
                    self.success = {}
                    (_ktype121, _vtype122, _size120) = iprot.readMapBegin()
                    for _i124 in range(_size120):
                        _key125 = iprot.readString().decode('utf-8') if sys.version_info[0] == 2 else iprot.readString()
                        _val126 = apache.airavata.model.status.ttypes.JobStatus()
                        _val126.read(iprot)
                        self.success[_key125] = _val126
                    iprot.readMapEnd()
                else:
                    iprot.skip(ftype)
            elif fid == 1:
                if ftype == TType.STRUCT:
                    self.ire = apache.airavata.api.error.ttypes.InvalidRequestException()
                    self.ire.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 2:
                if ftype == TType.STRUCT:
                    self.enf = apache.airavata.api.error.ttypes.ExperimentNotFoundException()
                    self.enf.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 3:
                if ftype == TType.STRUCT:
                    self.ace = apache.airavata.api.error.ttypes.AiravataClientException()
                    self.ace.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 4:
                if ftype == TType.STRUCT:
                    self.ase = apache.airavata.api.error.ttypes.AiravataSystemException()
                    self.ase.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 5:
                if ftype == TType.STRUCT:
                    self.ae = apache.airavata.api.error.ttypes.AuthorizationException()
                    self.ae.read(iprot)
                else:
                    iprot.skip(ftype)
            else:
                iprot.skip(ftype)
            iprot.readFieldEnd()
        iprot.readStructEnd()

    def write(self, oprot):
        if oprot._fast_encode is not None and self.thrift_spec is not None:
            oprot.trans.write(oprot._fast_encode(self, (self.__class__, self.thrift_spec)))
            return
        oprot.writeStructBegin('getJobStatuses_result')
        if self.success is not None:
            oprot.writeFieldBegin('success', TType.MAP, 0)
            oprot.writeMapBegin(TType.STRING, TType.STRUCT, len(self.success))
            for kiter127, viter128 in self.success.items():
                oprot.writeString(kiter127.encode('utf-8') if sys.version_info[0] == 2 else kiter127)
                viter128.write(oprot)
            oprot.writeMapEnd()
            oprot.writeFieldEnd()
        if self.ire is not None:
            oprot.writeFieldBegin('ire', TType.STRUCT, 1)
            self.ire.write(oprot)
            oprot.writeFieldEnd()
        if self.enf is not None:
            oprot.writeFieldBegin('enf', TType.STRUCT, 2)
            self.enf.write(oprot)
            oprot.writeFieldEnd()
        if self.ace is not None:
            oprot.writeFieldBegin('ace', TType.STRUCT, 3)
            self.ace.write(oprot)
            oprot.writeFieldEnd()
        if self.ase is not None:
            oprot.writeFieldBegin('ase', TType.STRUCT, 4)
            self.ase.write(oprot)
            oprot.writeFieldEnd()
        if self.ae is not None:
            oprot.writeFieldBegin('ae', TType.STRUCT, 5)
            self.ae.write(oprot)
            oprot.writeFieldEnd()
        oprot.writeFieldStop()
        oprot.writeStructEnd()

    def validate(self):
        return

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

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

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


class getJobDetails_args(object):
    """
    Attributes:
     - authzToken
     - airavataExperimentId
    """

    thrift_spec = (
        None,  # 0
        (1, TType.STRUCT, 'authzToken', (apache.airavata.model.security.ttypes.AuthzToken, apache.airavata.model.security.ttypes.AuthzToken.thrift_spec), None, ),  # 1
        (2, TType.STRING, 'airavataExperimentId', 'UTF8', None, ),  # 2
    )

    def __init__(self, authzToken=None, airavataExperimentId=None,):
        self.authzToken = authzToken
        self.airavataExperimentId = airavataExperimentId

    def read(self, iprot):
        if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None:
            iprot._fast_decode(self, iprot, (self.__class__, self.thrift_spec))
            return
        iprot.readStructBegin()
        while True:
            (fname, ftype, fid) = iprot.readFieldBegin()
            if ftype == TType.STOP:
                break
            if fid == 1:
                if ftype == TType.STRUCT:
                    self.authzToken = apache.airavata.model.security.ttypes.AuthzToken()
                    self.authzToken.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 2:
                if ftype == TType.STRING:
                    self.airavataExperimentId = iprot.readString().decode('utf-8') if sys.version_info[0] == 2 else iprot.readString()
                else:
                    iprot.skip(ftype)
            else:
                iprot.skip(ftype)
            iprot.readFieldEnd()
        iprot.readStructEnd()

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

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

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

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

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


class getJobDetails_result(object):
    """
    Attributes:
     - success
     - ire
     - enf
     - ace
     - ase
     - ae
    """

    thrift_spec = (
        (0, TType.LIST, 'success', (TType.STRUCT, (apache.airavata.model.job.ttypes.JobModel, apache.airavata.model.job.ttypes.JobModel.thrift_spec), False), None, ),  # 0
        (1, TType.STRUCT, 'ire', (apache.airavata.api.error.ttypes.InvalidRequestException, apache.airavata.api.error.ttypes.InvalidRequestException.thrift_spec), None, ),  # 1
        (2, TType.STRUCT, 'enf', (apache.airavata.api.error.ttypes.ExperimentNotFoundException, apache.airavata.api.error.ttypes.ExperimentNotFoundException.thrift_spec), None, ),  # 2
        (3, TType.STRUCT, 'ace', (apache.airavata.api.error.ttypes.AiravataClientException, apache.airavata.api.error.ttypes.AiravataClientException.thrift_spec), None, ),  # 3
        (4, TType.STRUCT, 'ase', (apache.airavata.api.error.ttypes.AiravataSystemException, apache.airavata.api.error.ttypes.AiravataSystemException.thrift_spec), None, ),  # 4
        (5, TType.STRUCT, 'ae', (apache.airavata.api.error.ttypes.AuthorizationException, apache.airavata.api.error.ttypes.AuthorizationException.thrift_spec), None, ),  # 5
    )

    def __init__(self, success=None, ire=None, enf=None, ace=None, ase=None, ae=None,):
        self.success = success
        self.ire = ire
        self.enf = enf
        self.ace = ace
        self.ase = ase
        self.ae = ae

    def read(self, iprot):
        if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None:
            iprot._fast_decode(self, iprot, (self.__class__, self.thrift_spec))
            return
        iprot.readStructBegin()
        while True:
            (fname, ftype, fid) = iprot.readFieldBegin()
            if ftype == TType.STOP:
                break
            if fid == 0:
                if ftype == TType.LIST:
                    self.success = []
                    (_etype132, _size129) = iprot.readListBegin()
                    for _i133 in range(_size129):
                        _elem134 = apache.airavata.model.job.ttypes.JobModel()
                        _elem134.read(iprot)
                        self.success.append(_elem134)
                    iprot.readListEnd()
                else:
                    iprot.skip(ftype)
            elif fid == 1:
                if ftype == TType.STRUCT:
                    self.ire = apache.airavata.api.error.ttypes.InvalidRequestException()
                    self.ire.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 2:
                if ftype == TType.STRUCT:
                    self.enf = apache.airavata.api.error.ttypes.ExperimentNotFoundException()
                    self.enf.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 3:
                if ftype == TType.STRUCT:
                    self.ace = apache.airavata.api.error.ttypes.AiravataClientException()
                    self.ace.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 4:
                if ftype == TType.STRUCT:
                    self.ase = apache.airavata.api.error.ttypes.AiravataSystemException()
                    self.ase.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 5:
                if ftype == TType.STRUCT:
                    self.ae = apache.airavata.api.error.ttypes.AuthorizationException()
                    self.ae.read(iprot)
                else:
                    iprot.skip(ftype)
            else:
                iprot.skip(ftype)
            iprot.readFieldEnd()
        iprot.readStructEnd()

    def write(self, oprot):
        if oprot._fast_encode is not None and self.thrift_spec is not None:
            oprot.trans.write(oprot._fast_encode(self, (self.__class__, self.thrift_spec)))
            return
        oprot.writeStructBegin('getJobDetails_result')
        if self.success is not None:
            oprot.writeFieldBegin('success', TType.LIST, 0)
            oprot.writeListBegin(TType.STRUCT, len(self.success))
            for iter135 in self.success:
                iter135.write(oprot)
            oprot.writeListEnd()
            oprot.writeFieldEnd()
        if self.ire is not None:
            oprot.writeFieldBegin('ire', TType.STRUCT, 1)
            self.ire.write(oprot)
            oprot.writeFieldEnd()
        if self.enf is not None:
            oprot.writeFieldBegin('enf', TType.STRUCT, 2)
            self.enf.write(oprot)
            oprot.writeFieldEnd()
        if self.ace is not None:
            oprot.writeFieldBegin('ace', TType.STRUCT, 3)
            self.ace.write(oprot)
            oprot.writeFieldEnd()
        if self.ase is not None:
            oprot.writeFieldBegin('ase', TType.STRUCT, 4)
            self.ase.write(oprot)
            oprot.writeFieldEnd()
        if self.ae is not None:
            oprot.writeFieldBegin('ae', TType.STRUCT, 5)
            self.ae.write(oprot)
            oprot.writeFieldEnd()
        oprot.writeFieldStop()
        oprot.writeStructEnd()

    def validate(self):
        return

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

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

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


class cloneExperiment_args(object):
    """
    Attributes:
     - authzToken
     - existingExperimentID
     - newExperimentName
     - newExperimentProjectId
    """

    thrift_spec = (
        None,  # 0
        (1, TType.STRUCT, 'authzToken', (apache.airavata.model.security.ttypes.AuthzToken, apache.airavata.model.security.ttypes.AuthzToken.thrift_spec), None, ),  # 1
        (2, TType.STRING, 'existingExperimentID', 'UTF8', None, ),  # 2
        (3, TType.STRING, 'newExperimentName', 'UTF8', None, ),  # 3
        (4, TType.STRING, 'newExperimentProjectId', 'UTF8', None, ),  # 4
    )

    def __init__(self, authzToken=None, existingExperimentID=None, newExperimentName=None, newExperimentProjectId=None,):
        self.authzToken = authzToken
        self.existingExperimentID = existingExperimentID
        self.newExperimentName = newExperimentName
        self.newExperimentProjectId = newExperimentProjectId

    def read(self, iprot):
        if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None:
            iprot._fast_decode(self, iprot, (self.__class__, self.thrift_spec))
            return
        iprot.readStructBegin()
        while True:
            (fname, ftype, fid) = iprot.readFieldBegin()
            if ftype == TType.STOP:
                break
            if fid == 1:
                if ftype == TType.STRUCT:
                    self.authzToken = apache.airavata.model.security.ttypes.AuthzToken()
                    self.authzToken.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 2:
                if ftype == TType.STRING:
                    self.existingExperimentID = iprot.readString().decode('utf-8') if sys.version_info[0] == 2 else iprot.readString()
                else:
                    iprot.skip(ftype)
            elif fid == 3:
                if ftype == TType.STRING:
                    self.newExperimentName = iprot.readString().decode('utf-8') if sys.version_info[0] == 2 else iprot.readString()
                else:
                    iprot.skip(ftype)
            elif fid == 4:
                if ftype == TType.STRING:
                    self.newExperimentProjectId = iprot.readString().decode('utf-8') if sys.version_info[0] == 2 else iprot.readString()
                else:
                    iprot.skip(ftype)
            else:
                iprot.skip(ftype)
            iprot.readFieldEnd()
        iprot.readStructEnd()

    def write(self, oprot):
        if oprot._fast_encode is not None and self.thrift_spec is not None:
            oprot.trans.write(oprot._fast_encode(self, (self.__class__, self.thrift_spec)))
            return
        oprot.writeStructBegin('cloneExperiment_args')
        if self.authzToken is not None:
            oprot.writeFieldBegin('authzToken', TType.STRUCT, 1)
            self.authzToken.write(oprot)
            oprot.writeFieldEnd()
        if self.existingExperimentID is not None:
            oprot.writeFieldBegin('existingExperimentID', TType.STRING, 2)
            oprot.writeString(self.existingExperimentID.encode('utf-8') if sys.version_info[0] == 2 else self.existingExperimentID)
            oprot.writeFieldEnd()
        if self.newExperimentName is not None:
            oprot.writeFieldBegin('newExperimentName', TType.STRING, 3)
            oprot.writeString(self.newExperimentName.encode('utf-8') if sys.version_info[0] == 2 else self.newExperimentName)
            oprot.writeFieldEnd()
        if self.newExperimentProjectId is not None:
            oprot.writeFieldBegin('newExperimentProjectId', TType.STRING, 4)
            oprot.writeString(self.newExperimentProjectId.encode('utf-8') if sys.version_info[0] == 2 else self.newExperimentProjectId)
            oprot.writeFieldEnd()
        oprot.writeFieldStop()
        oprot.writeStructEnd()

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

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

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

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


class cloneExperiment_result(object):
    """
    Attributes:
     - success
     - ire
     - enf
     - ace
     - ase
     - ae
     - pnfe
    """

    thrift_spec = (
        (0, TType.STRING, 'success', 'UTF8', None, ),  # 0
        (1, TType.STRUCT, 'ire', (apache.airavata.api.error.ttypes.InvalidRequestException, apache.airavata.api.error.ttypes.InvalidRequestException.thrift_spec), None, ),  # 1
        (2, TType.STRUCT, 'enf', (apache.airavata.api.error.ttypes.ExperimentNotFoundException, apache.airavata.api.error.ttypes.ExperimentNotFoundException.thrift_spec), None, ),  # 2
        (3, TType.STRUCT, 'ace', (apache.airavata.api.error.ttypes.AiravataClientException, apache.airavata.api.error.ttypes.AiravataClientException.thrift_spec), None, ),  # 3
        (4, TType.STRUCT, 'ase', (apache.airavata.api.error.ttypes.AiravataSystemException, apache.airavata.api.error.ttypes.AiravataSystemException.thrift_spec), None, ),  # 4
        (5, TType.STRUCT, 'ae', (apache.airavata.api.error.ttypes.AuthorizationException, apache.airavata.api.error.ttypes.AuthorizationException.thrift_spec), None, ),  # 5
        (6, TType.STRUCT, 'pnfe', (apache.airavata.api.error.ttypes.ProjectNotFoundException, apache.airavata.api.error.ttypes.ProjectNotFoundException.thrift_spec), None, ),  # 6
    )

    def __init__(self, success=None, ire=None, enf=None, ace=None, ase=None, ae=None, pnfe=None,):
        self.success = success
        self.ire = ire
        self.enf = enf
        self.ace = ace
        self.ase = ase
        self.ae = ae
        self.pnfe = pnfe

    def read(self, iprot):
        if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None:
            iprot._fast_decode(self, iprot, (self.__class__, self.thrift_spec))
            return
        iprot.readStructBegin()
        while True:
            (fname, ftype, fid) = iprot.readFieldBegin()
            if ftype == TType.STOP:
                break
            if fid == 0:
                if ftype == TType.STRING:
                    self.success = iprot.readString().decode('utf-8') if sys.version_info[0] == 2 else iprot.readString()
                else:
                    iprot.skip(ftype)
            elif fid == 1:
                if ftype == TType.STRUCT:
                    self.ire = apache.airavata.api.error.ttypes.InvalidRequestException()
                    self.ire.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 2:
                if ftype == TType.STRUCT:
                    self.enf = apache.airavata.api.error.ttypes.ExperimentNotFoundException()
                    self.enf.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 3:
                if ftype == TType.STRUCT:
                    self.ace = apache.airavata.api.error.ttypes.AiravataClientException()
                    self.ace.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 4:
                if ftype == TType.STRUCT:
                    self.ase = apache.airavata.api.error.ttypes.AiravataSystemException()
                    self.ase.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 5:
                if ftype == TType.STRUCT:
                    self.ae = apache.airavata.api.error.ttypes.AuthorizationException()
                    self.ae.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 6:
                if ftype == TType.STRUCT:
                    self.pnfe = apache.airavata.api.error.ttypes.ProjectNotFoundException()
                    self.pnfe.read(iprot)
                else:
                    iprot.skip(ftype)
            else:
                iprot.skip(ftype)
            iprot.readFieldEnd()
        iprot.readStructEnd()

    def write(self, oprot):
        if oprot._fast_encode is not None and self.thrift_spec is not None:
            oprot.trans.write(oprot._fast_encode(self, (self.__class__, self.thrift_spec)))
            return
        oprot.writeStructBegin('cloneExperiment_result')
        if self.success is not None:
            oprot.writeFieldBegin('success', TType.STRING, 0)
            oprot.writeString(self.success.encode('utf-8') if sys.version_info[0] == 2 else self.success)
            oprot.writeFieldEnd()
        if self.ire is not None:
            oprot.writeFieldBegin('ire', TType.STRUCT, 1)
            self.ire.write(oprot)
            oprot.writeFieldEnd()
        if self.enf is not None:
            oprot.writeFieldBegin('enf', TType.STRUCT, 2)
            self.enf.write(oprot)
            oprot.writeFieldEnd()
        if self.ace is not None:
            oprot.writeFieldBegin('ace', TType.STRUCT, 3)
            self.ace.write(oprot)
            oprot.writeFieldEnd()
        if self.ase is not None:
            oprot.writeFieldBegin('ase', TType.STRUCT, 4)
            self.ase.write(oprot)
            oprot.writeFieldEnd()
        if self.ae is not None:
            oprot.writeFieldBegin('ae', TType.STRUCT, 5)
            self.ae.write(oprot)
            oprot.writeFieldEnd()
        if self.pnfe is not None:
            oprot.writeFieldBegin('pnfe', TType.STRUCT, 6)
            self.pnfe.write(oprot)
            oprot.writeFieldEnd()
        oprot.writeFieldStop()
        oprot.writeStructEnd()

    def validate(self):
        return

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

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

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


class cloneExperimentByAdmin_args(object):
    """
    Attributes:
     - authzToken
     - existingExperimentID
     - newExperimentName
     - newExperimentProjectId
    """

    thrift_spec = (
        None,  # 0
        (1, TType.STRUCT, 'authzToken', (apache.airavata.model.security.ttypes.AuthzToken, apache.airavata.model.security.ttypes.AuthzToken.thrift_spec), None, ),  # 1
        (2, TType.STRING, 'existingExperimentID', 'UTF8', None, ),  # 2
        (3, TType.STRING, 'newExperimentName', 'UTF8', None, ),  # 3
        (4, TType.STRING, 'newExperimentProjectId', 'UTF8', None, ),  # 4
    )

    def __init__(self, authzToken=None, existingExperimentID=None, newExperimentName=None, newExperimentProjectId=None,):
        self.authzToken = authzToken
        self.existingExperimentID = existingExperimentID
        self.newExperimentName = newExperimentName
        self.newExperimentProjectId = newExperimentProjectId

    def read(self, iprot):
        if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None:
            iprot._fast_decode(self, iprot, (self.__class__, self.thrift_spec))
            return
        iprot.readStructBegin()
        while True:
            (fname, ftype, fid) = iprot.readFieldBegin()
            if ftype == TType.STOP:
                break
            if fid == 1:
                if ftype == TType.STRUCT:
                    self.authzToken = apache.airavata.model.security.ttypes.AuthzToken()
                    self.authzToken.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 2:
                if ftype == TType.STRING:
                    self.existingExperimentID = iprot.readString().decode('utf-8') if sys.version_info[0] == 2 else iprot.readString()
                else:
                    iprot.skip(ftype)
            elif fid == 3:
                if ftype == TType.STRING:
                    self.newExperimentName = iprot.readString().decode('utf-8') if sys.version_info[0] == 2 else iprot.readString()
                else:
                    iprot.skip(ftype)
            elif fid == 4:
                if ftype == TType.STRING:
                    self.newExperimentProjectId = iprot.readString().decode('utf-8') if sys.version_info[0] == 2 else iprot.readString()
                else:
                    iprot.skip(ftype)
            else:
                iprot.skip(ftype)
            iprot.readFieldEnd()
        iprot.readStructEnd()

    def write(self, oprot):
        if oprot._fast_encode is not None and self.thrift_spec is not None:
            oprot.trans.write(oprot._fast_encode(self, (self.__class__, self.thrift_spec)))
            return
        oprot.writeStructBegin('cloneExperimentByAdmin_args')
        if self.authzToken is not None:
            oprot.writeFieldBegin('authzToken', TType.STRUCT, 1)
            self.authzToken.write(oprot)
            oprot.writeFieldEnd()
        if self.existingExperimentID is not None:
            oprot.writeFieldBegin('existingExperimentID', TType.STRING, 2)
            oprot.writeString(self.existingExperimentID.encode('utf-8') if sys.version_info[0] == 2 else self.existingExperimentID)
            oprot.writeFieldEnd()
        if self.newExperimentName is not None:
            oprot.writeFieldBegin('newExperimentName', TType.STRING, 3)
            oprot.writeString(self.newExperimentName.encode('utf-8') if sys.version_info[0] == 2 else self.newExperimentName)
            oprot.writeFieldEnd()
        if self.newExperimentProjectId is not None:
            oprot.writeFieldBegin('newExperimentProjectId', TType.STRING, 4)
            oprot.writeString(self.newExperimentProjectId.encode('utf-8') if sys.version_info[0] == 2 else self.newExperimentProjectId)
            oprot.writeFieldEnd()
        oprot.writeFieldStop()
        oprot.writeStructEnd()

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

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

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

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


class cloneExperimentByAdmin_result(object):
    """
    Attributes:
     - success
     - ire
     - enf
     - ace
     - ase
     - ae
     - pnfe
    """

    thrift_spec = (
        (0, TType.STRING, 'success', 'UTF8', None, ),  # 0
        (1, TType.STRUCT, 'ire', (apache.airavata.api.error.ttypes.InvalidRequestException, apache.airavata.api.error.ttypes.InvalidRequestException.thrift_spec), None, ),  # 1
        (2, TType.STRUCT, 'enf', (apache.airavata.api.error.ttypes.ExperimentNotFoundException, apache.airavata.api.error.ttypes.ExperimentNotFoundException.thrift_spec), None, ),  # 2
        (3, TType.STRUCT, 'ace', (apache.airavata.api.error.ttypes.AiravataClientException, apache.airavata.api.error.ttypes.AiravataClientException.thrift_spec), None, ),  # 3
        (4, TType.STRUCT, 'ase', (apache.airavata.api.error.ttypes.AiravataSystemException, apache.airavata.api.error.ttypes.AiravataSystemException.thrift_spec), None, ),  # 4
        (5, TType.STRUCT, 'ae', (apache.airavata.api.error.ttypes.AuthorizationException, apache.airavata.api.error.ttypes.AuthorizationException.thrift_spec), None, ),  # 5
        (6, TType.STRUCT, 'pnfe', (apache.airavata.api.error.ttypes.ProjectNotFoundException, apache.airavata.api.error.ttypes.ProjectNotFoundException.thrift_spec), None, ),  # 6
    )

    def __init__(self, success=None, ire=None, enf=None, ace=None, ase=None, ae=None, pnfe=None,):
        self.success = success
        self.ire = ire
        self.enf = enf
        self.ace = ace
        self.ase = ase
        self.ae = ae
        self.pnfe = pnfe

    def read(self, iprot):
        if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None:
            iprot._fast_decode(self, iprot, (self.__class__, self.thrift_spec))
            return
        iprot.readStructBegin()
        while True:
            (fname, ftype, fid) = iprot.readFieldBegin()
            if ftype == TType.STOP:
                break
            if fid == 0:
                if ftype == TType.STRING:
                    self.success = iprot.readString().decode('utf-8') if sys.version_info[0] == 2 else iprot.readString()
                else:
                    iprot.skip(ftype)
            elif fid == 1:
                if ftype == TType.STRUCT:
                    self.ire = apache.airavata.api.error.ttypes.InvalidRequestException()
                    self.ire.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 2:
                if ftype == TType.STRUCT:
                    self.enf = apache.airavata.api.error.ttypes.ExperimentNotFoundException()
                    self.enf.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 3:
                if ftype == TType.STRUCT:
                    self.ace = apache.airavata.api.error.ttypes.AiravataClientException()
                    self.ace.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 4:
                if ftype == TType.STRUCT:
                    self.ase = apache.airavata.api.error.ttypes.AiravataSystemException()
                    self.ase.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 5:
                if ftype == TType.STRUCT:
                    self.ae = apache.airavata.api.error.ttypes.AuthorizationException()
                    self.ae.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 6:
                if ftype == TType.STRUCT:
                    self.pnfe = apache.airavata.api.error.ttypes.ProjectNotFoundException()
                    self.pnfe.read(iprot)
                else:
                    iprot.skip(ftype)
            else:
                iprot.skip(ftype)
            iprot.readFieldEnd()
        iprot.readStructEnd()

    def write(self, oprot):
        if oprot._fast_encode is not None and self.thrift_spec is not None:
            oprot.trans.write(oprot._fast_encode(self, (self.__class__, self.thrift_spec)))
            return
        oprot.writeStructBegin('cloneExperimentByAdmin_result')
        if self.success is not None:
            oprot.writeFieldBegin('success', TType.STRING, 0)
            oprot.writeString(self.success.encode('utf-8') if sys.version_info[0] == 2 else self.success)
            oprot.writeFieldEnd()
        if self.ire is not None:
            oprot.writeFieldBegin('ire', TType.STRUCT, 1)
            self.ire.write(oprot)
            oprot.writeFieldEnd()
        if self.enf is not None:
            oprot.writeFieldBegin('enf', TType.STRUCT, 2)
            self.enf.write(oprot)
            oprot.writeFieldEnd()
        if self.ace is not None:
            oprot.writeFieldBegin('ace', TType.STRUCT, 3)
            self.ace.write(oprot)
            oprot.writeFieldEnd()
        if self.ase is not None:
            oprot.writeFieldBegin('ase', TType.STRUCT, 4)
            self.ase.write(oprot)
            oprot.writeFieldEnd()
        if self.ae is not None:
            oprot.writeFieldBegin('ae', TType.STRUCT, 5)
            self.ae.write(oprot)
            oprot.writeFieldEnd()
        if self.pnfe is not None:
            oprot.writeFieldBegin('pnfe', TType.STRUCT, 6)
            self.pnfe.write(oprot)
            oprot.writeFieldEnd()
        oprot.writeFieldStop()
        oprot.writeStructEnd()

    def validate(self):
        return

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

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

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


class terminateExperiment_args(object):
    """
    Attributes:
     - authzToken
     - airavataExperimentId
     - gatewayId
    """

    thrift_spec = (
        None,  # 0
        (1, TType.STRUCT, 'authzToken', (apache.airavata.model.security.ttypes.AuthzToken, apache.airavata.model.security.ttypes.AuthzToken.thrift_spec), None, ),  # 1
        (2, TType.STRING, 'airavataExperimentId', 'UTF8', None, ),  # 2
        (3, TType.STRING, 'gatewayId', 'UTF8', None, ),  # 3
    )

    def __init__(self, authzToken=None, airavataExperimentId=None, gatewayId=None,):
        self.authzToken = authzToken
        self.airavataExperimentId = airavataExperimentId
        self.gatewayId = gatewayId

    def read(self, iprot):
        if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None:
            iprot._fast_decode(self, iprot, (self.__class__, self.thrift_spec))
            return
        iprot.readStructBegin()
        while True:
            (fname, ftype, fid) = iprot.readFieldBegin()
            if ftype == TType.STOP:
                break
            if fid == 1:
                if ftype == TType.STRUCT:
                    self.authzToken = apache.airavata.model.security.ttypes.AuthzToken()
                    self.authzToken.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 2:
                if ftype == TType.STRING:
                    self.airavataExperimentId = iprot.readString().decode('utf-8') if sys.version_info[0] == 2 else iprot.readString()
                else:
                    iprot.skip(ftype)
            elif fid == 3:
                if ftype == TType.STRING:
                    self.gatewayId = iprot.readString().decode('utf-8') if sys.version_info[0] == 2 else iprot.readString()
                else:
                    iprot.skip(ftype)
            else:
                iprot.skip(ftype)
            iprot.readFieldEnd()
        iprot.readStructEnd()

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

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

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

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

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


class terminateExperiment_result(object):
    """
    Attributes:
     - ire
     - enf
     - ace
     - ase
     - ae
    """

    thrift_spec = (
        None,  # 0
        (1, TType.STRUCT, 'ire', (apache.airavata.api.error.ttypes.InvalidRequestException, apache.airavata.api.error.ttypes.InvalidRequestException.thrift_spec), None, ),  # 1
        (2, TType.STRUCT, 'enf', (apache.airavata.api.error.ttypes.ExperimentNotFoundException, apache.airavata.api.error.ttypes.ExperimentNotFoundException.thrift_spec), None, ),  # 2
        (3, TType.STRUCT, 'ace', (apache.airavata.api.error.ttypes.AiravataClientException, apache.airavata.api.error.ttypes.AiravataClientException.thrift_spec), None, ),  # 3
        (4, TType.STRUCT, 'ase', (apache.airavata.api.error.ttypes.AiravataSystemException, apache.airavata.api.error.ttypes.AiravataSystemException.thrift_spec), None, ),  # 4
        (5, TType.STRUCT, 'ae', (apache.airavata.api.error.ttypes.AuthorizationException, apache.airavata.api.error.ttypes.AuthorizationException.thrift_spec), None, ),  # 5
    )

    def __init__(self, ire=None, enf=None, ace=None, ase=None, ae=None,):
        self.ire = ire
        self.enf = enf
        self.ace = ace
        self.ase = ase
        self.ae = ae

    def read(self, iprot):
        if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None:
            iprot._fast_decode(self, iprot, (self.__class__, self.thrift_spec))
            return
        iprot.readStructBegin()
        while True:
            (fname, ftype, fid) = iprot.readFieldBegin()
            if ftype == TType.STOP:
                break
            if fid == 1:
                if ftype == TType.STRUCT:
                    self.ire = apache.airavata.api.error.ttypes.InvalidRequestException()
                    self.ire.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 2:
                if ftype == TType.STRUCT:
                    self.enf = apache.airavata.api.error.ttypes.ExperimentNotFoundException()
                    self.enf.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 3:
                if ftype == TType.STRUCT:
                    self.ace = apache.airavata.api.error.ttypes.AiravataClientException()
                    self.ace.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 4:
                if ftype == TType.STRUCT:
                    self.ase = apache.airavata.api.error.ttypes.AiravataSystemException()
                    self.ase.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 5:
                if ftype == TType.STRUCT:
                    self.ae = apache.airavata.api.error.ttypes.AuthorizationException()
                    self.ae.read(iprot)
                else:
                    iprot.skip(ftype)
            else:
                iprot.skip(ftype)
            iprot.readFieldEnd()
        iprot.readStructEnd()

    def write(self, oprot):
        if oprot._fast_encode is not None and self.thrift_spec is not None:
            oprot.trans.write(oprot._fast_encode(self, (self.__class__, self.thrift_spec)))
            return
        oprot.writeStructBegin('terminateExperiment_result')
        if self.ire is not None:
            oprot.writeFieldBegin('ire', TType.STRUCT, 1)
            self.ire.write(oprot)
            oprot.writeFieldEnd()
        if self.enf is not None:
            oprot.writeFieldBegin('enf', TType.STRUCT, 2)
            self.enf.write(oprot)
            oprot.writeFieldEnd()
        if self.ace is not None:
            oprot.writeFieldBegin('ace', TType.STRUCT, 3)
            self.ace.write(oprot)
            oprot.writeFieldEnd()
        if self.ase is not None:
            oprot.writeFieldBegin('ase', TType.STRUCT, 4)
            self.ase.write(oprot)
            oprot.writeFieldEnd()
        if self.ae is not None:
            oprot.writeFieldBegin('ae', TType.STRUCT, 5)
            self.ae.write(oprot)
            oprot.writeFieldEnd()
        oprot.writeFieldStop()
        oprot.writeStructEnd()

    def validate(self):
        return

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

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

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


class registerApplicationModule_args(object):
    """
    Attributes:
     - authzToken
     - gatewayId
     - applicationModule
    """

    thrift_spec = (
        None,  # 0
        (1, TType.STRUCT, 'authzToken', (apache.airavata.model.security.ttypes.AuthzToken, apache.airavata.model.security.ttypes.AuthzToken.thrift_spec), None, ),  # 1
        (2, TType.STRING, 'gatewayId', 'UTF8', None, ),  # 2
        (3, TType.STRUCT, 'applicationModule', (apache.airavata.model.appcatalog.appdeployment.ttypes.ApplicationModule, apache.airavata.model.appcatalog.appdeployment.ttypes.ApplicationModule.thrift_spec), None, ),  # 3
    )

    def __init__(self, authzToken=None, gatewayId=None, applicationModule=None,):
        self.authzToken = authzToken
        self.gatewayId = gatewayId
        self.applicationModule = applicationModule

    def read(self, iprot):
        if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None:
            iprot._fast_decode(self, iprot, (self.__class__, self.thrift_spec))
            return
        iprot.readStructBegin()
        while True:
            (fname, ftype, fid) = iprot.readFieldBegin()
            if ftype == TType.STOP:
                break
            if fid == 1:
                if ftype == TType.STRUCT:
                    self.authzToken = apache.airavata.model.security.ttypes.AuthzToken()
                    self.authzToken.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 2:
                if ftype == TType.STRING:
                    self.gatewayId = iprot.readString().decode('utf-8') if sys.version_info[0] == 2 else iprot.readString()
                else:
                    iprot.skip(ftype)
            elif fid == 3:
                if ftype == TType.STRUCT:
                    self.applicationModule = apache.airavata.model.appcatalog.appdeployment.ttypes.ApplicationModule()
                    self.applicationModule.read(iprot)
                else:
                    iprot.skip(ftype)
            else:
                iprot.skip(ftype)
            iprot.readFieldEnd()
        iprot.readStructEnd()

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

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

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

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

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


class registerApplicationModule_result(object):
    """
    Attributes:
     - success
     - ire
     - ace
     - ase
     - ae
    """

    thrift_spec = (
        (0, TType.STRING, 'success', 'UTF8', None, ),  # 0
        (1, TType.STRUCT, 'ire', (apache.airavata.api.error.ttypes.InvalidRequestException, apache.airavata.api.error.ttypes.InvalidRequestException.thrift_spec), None, ),  # 1
        (2, TType.STRUCT, 'ace', (apache.airavata.api.error.ttypes.AiravataClientException, apache.airavata.api.error.ttypes.AiravataClientException.thrift_spec), None, ),  # 2
        (3, TType.STRUCT, 'ase', (apache.airavata.api.error.ttypes.AiravataSystemException, apache.airavata.api.error.ttypes.AiravataSystemException.thrift_spec), None, ),  # 3
        (4, TType.STRUCT, 'ae', (apache.airavata.api.error.ttypes.AuthorizationException, apache.airavata.api.error.ttypes.AuthorizationException.thrift_spec), None, ),  # 4
    )

    def __init__(self, success=None, ire=None, ace=None, ase=None, ae=None,):
        self.success = success
        self.ire = ire
        self.ace = ace
        self.ase = ase
        self.ae = ae

    def read(self, iprot):
        if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None:
            iprot._fast_decode(self, iprot, (self.__class__, self.thrift_spec))
            return
        iprot.readStructBegin()
        while True:
            (fname, ftype, fid) = iprot.readFieldBegin()
            if ftype == TType.STOP:
                break
            if fid == 0:
                if ftype == TType.STRING:
                    self.success = iprot.readString().decode('utf-8') if sys.version_info[0] == 2 else iprot.readString()
                else:
                    iprot.skip(ftype)
            elif fid == 1:
                if ftype == TType.STRUCT:
                    self.ire = apache.airavata.api.error.ttypes.InvalidRequestException()
                    self.ire.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 2:
                if ftype == TType.STRUCT:
                    self.ace = apache.airavata.api.error.ttypes.AiravataClientException()
                    self.ace.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 3:
                if ftype == TType.STRUCT:
                    self.ase = apache.airavata.api.error.ttypes.AiravataSystemException()
                    self.ase.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 4:
                if ftype == TType.STRUCT:
                    self.ae = apache.airavata.api.error.ttypes.AuthorizationException()
                    self.ae.read(iprot)
                else:
                    iprot.skip(ftype)
            else:
                iprot.skip(ftype)
            iprot.readFieldEnd()
        iprot.readStructEnd()

    def write(self, oprot):
        if oprot._fast_encode is not None and self.thrift_spec is not None:
            oprot.trans.write(oprot._fast_encode(self, (self.__class__, self.thrift_spec)))
            return
        oprot.writeStructBegin('registerApplicationModule_result')
        if self.success is not None:
            oprot.writeFieldBegin('success', TType.STRING, 0)
            oprot.writeString(self.success.encode('utf-8') if sys.version_info[0] == 2 else self.success)
            oprot.writeFieldEnd()
        if self.ire is not None:
            oprot.writeFieldBegin('ire', TType.STRUCT, 1)
            self.ire.write(oprot)
            oprot.writeFieldEnd()
        if self.ace is not None:
            oprot.writeFieldBegin('ace', TType.STRUCT, 2)
            self.ace.write(oprot)
            oprot.writeFieldEnd()
        if self.ase is not None:
            oprot.writeFieldBegin('ase', TType.STRUCT, 3)
            self.ase.write(oprot)
            oprot.writeFieldEnd()
        if self.ae is not None:
            oprot.writeFieldBegin('ae', TType.STRUCT, 4)
            self.ae.write(oprot)
            oprot.writeFieldEnd()
        oprot.writeFieldStop()
        oprot.writeStructEnd()

    def validate(self):
        return

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

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

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


class getApplicationModule_args(object):
    """
    Attributes:
     - authzToken
     - appModuleId
    """

    thrift_spec = (
        None,  # 0
        (1, TType.STRUCT, 'authzToken', (apache.airavata.model.security.ttypes.AuthzToken, apache.airavata.model.security.ttypes.AuthzToken.thrift_spec), None, ),  # 1
        (2, TType.STRING, 'appModuleId', 'UTF8', None, ),  # 2
    )

    def __init__(self, authzToken=None, appModuleId=None,):
        self.authzToken = authzToken
        self.appModuleId = appModuleId

    def read(self, iprot):
        if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None:
            iprot._fast_decode(self, iprot, (self.__class__, self.thrift_spec))
            return
        iprot.readStructBegin()
        while True:
            (fname, ftype, fid) = iprot.readFieldBegin()
            if ftype == TType.STOP:
                break
            if fid == 1:
                if ftype == TType.STRUCT:
                    self.authzToken = apache.airavata.model.security.ttypes.AuthzToken()
                    self.authzToken.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 2:
                if ftype == TType.STRING:
                    self.appModuleId = iprot.readString().decode('utf-8') if sys.version_info[0] == 2 else iprot.readString()
                else:
                    iprot.skip(ftype)
            else:
                iprot.skip(ftype)
            iprot.readFieldEnd()
        iprot.readStructEnd()

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

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

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

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

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


class getApplicationModule_result(object):
    """
    Attributes:
     - success
     - ire
     - ace
     - ase
     - ae
    """

    thrift_spec = (
        (0, TType.STRUCT, 'success', (apache.airavata.model.appcatalog.appdeployment.ttypes.ApplicationModule, apache.airavata.model.appcatalog.appdeployment.ttypes.ApplicationModule.thrift_spec), None, ),  # 0
        (1, TType.STRUCT, 'ire', (apache.airavata.api.error.ttypes.InvalidRequestException, apache.airavata.api.error.ttypes.InvalidRequestException.thrift_spec), None, ),  # 1
        (2, TType.STRUCT, 'ace', (apache.airavata.api.error.ttypes.AiravataClientException, apache.airavata.api.error.ttypes.AiravataClientException.thrift_spec), None, ),  # 2
        (3, TType.STRUCT, 'ase', (apache.airavata.api.error.ttypes.AiravataSystemException, apache.airavata.api.error.ttypes.AiravataSystemException.thrift_spec), None, ),  # 3
        (4, TType.STRUCT, 'ae', (apache.airavata.api.error.ttypes.AuthorizationException, apache.airavata.api.error.ttypes.AuthorizationException.thrift_spec), None, ),  # 4
    )

    def __init__(self, success=None, ire=None, ace=None, ase=None, ae=None,):
        self.success = success
        self.ire = ire
        self.ace = ace
        self.ase = ase
        self.ae = ae

    def read(self, iprot):
        if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None:
            iprot._fast_decode(self, iprot, (self.__class__, self.thrift_spec))
            return
        iprot.readStructBegin()
        while True:
            (fname, ftype, fid) = iprot.readFieldBegin()
            if ftype == TType.STOP:
                break
            if fid == 0:
                if ftype == TType.STRUCT:
                    self.success = apache.airavata.model.appcatalog.appdeployment.ttypes.ApplicationModule()
                    self.success.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 1:
                if ftype == TType.STRUCT:
                    self.ire = apache.airavata.api.error.ttypes.InvalidRequestException()
                    self.ire.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 2:
                if ftype == TType.STRUCT:
                    self.ace = apache.airavata.api.error.ttypes.AiravataClientException()
                    self.ace.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 3:
                if ftype == TType.STRUCT:
                    self.ase = apache.airavata.api.error.ttypes.AiravataSystemException()
                    self.ase.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 4:
                if ftype == TType.STRUCT:
                    self.ae = apache.airavata.api.error.ttypes.AuthorizationException()
                    self.ae.read(iprot)
                else:
                    iprot.skip(ftype)
            else:
                iprot.skip(ftype)
            iprot.readFieldEnd()
        iprot.readStructEnd()

    def write(self, oprot):
        if oprot._fast_encode is not None and self.thrift_spec is not None:
            oprot.trans.write(oprot._fast_encode(self, (self.__class__, self.thrift_spec)))
            return
        oprot.writeStructBegin('getApplicationModule_result')
        if self.success is not None:
            oprot.writeFieldBegin('success', TType.STRUCT, 0)
            self.success.write(oprot)
            oprot.writeFieldEnd()
        if self.ire is not None:
            oprot.writeFieldBegin('ire', TType.STRUCT, 1)
            self.ire.write(oprot)
            oprot.writeFieldEnd()
        if self.ace is not None:
            oprot.writeFieldBegin('ace', TType.STRUCT, 2)
            self.ace.write(oprot)
            oprot.writeFieldEnd()
        if self.ase is not None:
            oprot.writeFieldBegin('ase', TType.STRUCT, 3)
            self.ase.write(oprot)
            oprot.writeFieldEnd()
        if self.ae is not None:
            oprot.writeFieldBegin('ae', TType.STRUCT, 4)
            self.ae.write(oprot)
            oprot.writeFieldEnd()
        oprot.writeFieldStop()
        oprot.writeStructEnd()

    def validate(self):
        return

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

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

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


class updateApplicationModule_args(object):
    """
    Attributes:
     - authzToken
     - appModuleId
     - applicationModule
    """

    thrift_spec = (
        None,  # 0
        (1, TType.STRUCT, 'authzToken', (apache.airavata.model.security.ttypes.AuthzToken, apache.airavata.model.security.ttypes.AuthzToken.thrift_spec), None, ),  # 1
        (2, TType.STRING, 'appModuleId', 'UTF8', None, ),  # 2
        (3, TType.STRUCT, 'applicationModule', (apache.airavata.model.appcatalog.appdeployment.ttypes.ApplicationModule, apache.airavata.model.appcatalog.appdeployment.ttypes.ApplicationModule.thrift_spec), None, ),  # 3
    )

    def __init__(self, authzToken=None, appModuleId=None, applicationModule=None,):
        self.authzToken = authzToken
        self.appModuleId = appModuleId
        self.applicationModule = applicationModule

    def read(self, iprot):
        if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None:
            iprot._fast_decode(self, iprot, (self.__class__, self.thrift_spec))
            return
        iprot.readStructBegin()
        while True:
            (fname, ftype, fid) = iprot.readFieldBegin()
            if ftype == TType.STOP:
                break
            if fid == 1:
                if ftype == TType.STRUCT:
                    self.authzToken = apache.airavata.model.security.ttypes.AuthzToken()
                    self.authzToken.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 2:
                if ftype == TType.STRING:
                    self.appModuleId = iprot.readString().decode('utf-8') if sys.version_info[0] == 2 else iprot.readString()
                else:
                    iprot.skip(ftype)
            elif fid == 3:
                if ftype == TType.STRUCT:
                    self.applicationModule = apache.airavata.model.appcatalog.appdeployment.ttypes.ApplicationModule()
                    self.applicationModule.read(iprot)
                else:
                    iprot.skip(ftype)
            else:
                iprot.skip(ftype)
            iprot.readFieldEnd()
        iprot.readStructEnd()

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

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

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

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

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


class updateApplicationModule_result(object):
    """
    Attributes:
     - success
     - ire
     - ace
     - ase
     - ae
    """

    thrift_spec = (
        (0, TType.BOOL, 'success', None, None, ),  # 0
        (1, TType.STRUCT, 'ire', (apache.airavata.api.error.ttypes.InvalidRequestException, apache.airavata.api.error.ttypes.InvalidRequestException.thrift_spec), None, ),  # 1
        (2, TType.STRUCT, 'ace', (apache.airavata.api.error.ttypes.AiravataClientException, apache.airavata.api.error.ttypes.AiravataClientException.thrift_spec), None, ),  # 2
        (3, TType.STRUCT, 'ase', (apache.airavata.api.error.ttypes.AiravataSystemException, apache.airavata.api.error.ttypes.AiravataSystemException.thrift_spec), None, ),  # 3
        (4, TType.STRUCT, 'ae', (apache.airavata.api.error.ttypes.AuthorizationException, apache.airavata.api.error.ttypes.AuthorizationException.thrift_spec), None, ),  # 4
    )

    def __init__(self, success=None, ire=None, ace=None, ase=None, ae=None,):
        self.success = success
        self.ire = ire
        self.ace = ace
        self.ase = ase
        self.ae = ae

    def read(self, iprot):
        if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None:
            iprot._fast_decode(self, iprot, (self.__class__, self.thrift_spec))
            return
        iprot.readStructBegin()
        while True:
            (fname, ftype, fid) = iprot.readFieldBegin()
            if ftype == TType.STOP:
                break
            if fid == 0:
                if ftype == TType.BOOL:
                    self.success = iprot.readBool()
                else:
                    iprot.skip(ftype)
            elif fid == 1:
                if ftype == TType.STRUCT:
                    self.ire = apache.airavata.api.error.ttypes.InvalidRequestException()
                    self.ire.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 2:
                if ftype == TType.STRUCT:
                    self.ace = apache.airavata.api.error.ttypes.AiravataClientException()
                    self.ace.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 3:
                if ftype == TType.STRUCT:
                    self.ase = apache.airavata.api.error.ttypes.AiravataSystemException()
                    self.ase.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 4:
                if ftype == TType.STRUCT:
                    self.ae = apache.airavata.api.error.ttypes.AuthorizationException()
                    self.ae.read(iprot)
                else:
                    iprot.skip(ftype)
            else:
                iprot.skip(ftype)
            iprot.readFieldEnd()
        iprot.readStructEnd()

    def write(self, oprot):
        if oprot._fast_encode is not None and self.thrift_spec is not None:
            oprot.trans.write(oprot._fast_encode(self, (self.__class__, self.thrift_spec)))
            return
        oprot.writeStructBegin('updateApplicationModule_result')
        if self.success is not None:
            oprot.writeFieldBegin('success', TType.BOOL, 0)
            oprot.writeBool(self.success)
            oprot.writeFieldEnd()
        if self.ire is not None:
            oprot.writeFieldBegin('ire', TType.STRUCT, 1)
            self.ire.write(oprot)
            oprot.writeFieldEnd()
        if self.ace is not None:
            oprot.writeFieldBegin('ace', TType.STRUCT, 2)
            self.ace.write(oprot)
            oprot.writeFieldEnd()
        if self.ase is not None:
            oprot.writeFieldBegin('ase', TType.STRUCT, 3)
            self.ase.write(oprot)
            oprot.writeFieldEnd()
        if self.ae is not None:
            oprot.writeFieldBegin('ae', TType.STRUCT, 4)
            self.ae.write(oprot)
            oprot.writeFieldEnd()
        oprot.writeFieldStop()
        oprot.writeStructEnd()

    def validate(self):
        return

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

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

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


class getAllAppModules_args(object):
    """
    Attributes:
     - authzToken
     - gatewayId
    """

    thrift_spec = (
        None,  # 0
        (1, TType.STRUCT, 'authzToken', (apache.airavata.model.security.ttypes.AuthzToken, apache.airavata.model.security.ttypes.AuthzToken.thrift_spec), None, ),  # 1
        (2, TType.STRING, 'gatewayId', 'UTF8', None, ),  # 2
    )

    def __init__(self, authzToken=None, gatewayId=None,):
        self.authzToken = authzToken
        self.gatewayId = gatewayId

    def read(self, iprot):
        if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None:
            iprot._fast_decode(self, iprot, (self.__class__, self.thrift_spec))
            return
        iprot.readStructBegin()
        while True:
            (fname, ftype, fid) = iprot.readFieldBegin()
            if ftype == TType.STOP:
                break
            if fid == 1:
                if ftype == TType.STRUCT:
                    self.authzToken = apache.airavata.model.security.ttypes.AuthzToken()
                    self.authzToken.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 2:
                if ftype == TType.STRING:
                    self.gatewayId = iprot.readString().decode('utf-8') if sys.version_info[0] == 2 else iprot.readString()
                else:
                    iprot.skip(ftype)
            else:
                iprot.skip(ftype)
            iprot.readFieldEnd()
        iprot.readStructEnd()

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

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

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

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

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


class getAllAppModules_result(object):
    """
    Attributes:
     - success
     - ire
     - ace
     - ase
     - ae
    """

    thrift_spec = (
        (0, TType.LIST, 'success', (TType.STRUCT, (apache.airavata.model.appcatalog.appdeployment.ttypes.ApplicationModule, apache.airavata.model.appcatalog.appdeployment.ttypes.ApplicationModule.thrift_spec), False), None, ),  # 0
        (1, TType.STRUCT, 'ire', (apache.airavata.api.error.ttypes.InvalidRequestException, apache.airavata.api.error.ttypes.InvalidRequestException.thrift_spec), None, ),  # 1
        (2, TType.STRUCT, 'ace', (apache.airavata.api.error.ttypes.AiravataClientException, apache.airavata.api.error.ttypes.AiravataClientException.thrift_spec), None, ),  # 2
        (3, TType.STRUCT, 'ase', (apache.airavata.api.error.ttypes.AiravataSystemException, apache.airavata.api.error.ttypes.AiravataSystemException.thrift_spec), None, ),  # 3
        (4, TType.STRUCT, 'ae', (apache.airavata.api.error.ttypes.AuthorizationException, apache.airavata.api.error.ttypes.AuthorizationException.thrift_spec), None, ),  # 4
    )

    def __init__(self, success=None, ire=None, ace=None, ase=None, ae=None,):
        self.success = success
        self.ire = ire
        self.ace = ace
        self.ase = ase
        self.ae = ae

    def read(self, iprot):
        if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None:
            iprot._fast_decode(self, iprot, (self.__class__, self.thrift_spec))
            return
        iprot.readStructBegin()
        while True:
            (fname, ftype, fid) = iprot.readFieldBegin()
            if ftype == TType.STOP:
                break
            if fid == 0:
                if ftype == TType.LIST:
                    self.success = []
                    (_etype139, _size136) = iprot.readListBegin()
                    for _i140 in range(_size136):
                        _elem141 = apache.airavata.model.appcatalog.appdeployment.ttypes.ApplicationModule()
                        _elem141.read(iprot)
                        self.success.append(_elem141)
                    iprot.readListEnd()
                else:
                    iprot.skip(ftype)
            elif fid == 1:
                if ftype == TType.STRUCT:
                    self.ire = apache.airavata.api.error.ttypes.InvalidRequestException()
                    self.ire.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 2:
                if ftype == TType.STRUCT:
                    self.ace = apache.airavata.api.error.ttypes.AiravataClientException()
                    self.ace.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 3:
                if ftype == TType.STRUCT:
                    self.ase = apache.airavata.api.error.ttypes.AiravataSystemException()
                    self.ase.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 4:
                if ftype == TType.STRUCT:
                    self.ae = apache.airavata.api.error.ttypes.AuthorizationException()
                    self.ae.read(iprot)
                else:
                    iprot.skip(ftype)
            else:
                iprot.skip(ftype)
            iprot.readFieldEnd()
        iprot.readStructEnd()

    def write(self, oprot):
        if oprot._fast_encode is not None and self.thrift_spec is not None:
            oprot.trans.write(oprot._fast_encode(self, (self.__class__, self.thrift_spec)))
            return
        oprot.writeStructBegin('getAllAppModules_result')
        if self.success is not None:
            oprot.writeFieldBegin('success', TType.LIST, 0)
            oprot.writeListBegin(TType.STRUCT, len(self.success))
            for iter142 in self.success:
                iter142.write(oprot)
            oprot.writeListEnd()
            oprot.writeFieldEnd()
        if self.ire is not None:
            oprot.writeFieldBegin('ire', TType.STRUCT, 1)
            self.ire.write(oprot)
            oprot.writeFieldEnd()
        if self.ace is not None:
            oprot.writeFieldBegin('ace', TType.STRUCT, 2)
            self.ace.write(oprot)
            oprot.writeFieldEnd()
        if self.ase is not None:
            oprot.writeFieldBegin('ase', TType.STRUCT, 3)
            self.ase.write(oprot)
            oprot.writeFieldEnd()
        if self.ae is not None:
            oprot.writeFieldBegin('ae', TType.STRUCT, 4)
            self.ae.write(oprot)
            oprot.writeFieldEnd()
        oprot.writeFieldStop()
        oprot.writeStructEnd()

    def validate(self):
        return

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

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

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


class deleteApplicationModule_args(object):
    """
    Attributes:
     - authzToken
     - appModuleId
    """

    thrift_spec = (
        None,  # 0
        (1, TType.STRUCT, 'authzToken', (apache.airavata.model.security.ttypes.AuthzToken, apache.airavata.model.security.ttypes.AuthzToken.thrift_spec), None, ),  # 1
        (2, TType.STRING, 'appModuleId', 'UTF8', None, ),  # 2
    )

    def __init__(self, authzToken=None, appModuleId=None,):
        self.authzToken = authzToken
        self.appModuleId = appModuleId

    def read(self, iprot):
        if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None:
            iprot._fast_decode(self, iprot, (self.__class__, self.thrift_spec))
            return
        iprot.readStructBegin()
        while True:
            (fname, ftype, fid) = iprot.readFieldBegin()
            if ftype == TType.STOP:
                break
            if fid == 1:
                if ftype == TType.STRUCT:
                    self.authzToken = apache.airavata.model.security.ttypes.AuthzToken()
                    self.authzToken.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 2:
                if ftype == TType.STRING:
                    self.appModuleId = iprot.readString().decode('utf-8') if sys.version_info[0] == 2 else iprot.readString()
                else:
                    iprot.skip(ftype)
            else:
                iprot.skip(ftype)
            iprot.readFieldEnd()
        iprot.readStructEnd()

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

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

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

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

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


class deleteApplicationModule_result(object):
    """
    Attributes:
     - success
     - ire
     - ace
     - ase
     - ae
    """

    thrift_spec = (
        (0, TType.BOOL, 'success', None, None, ),  # 0
        (1, TType.STRUCT, 'ire', (apache.airavata.api.error.ttypes.InvalidRequestException, apache.airavata.api.error.ttypes.InvalidRequestException.thrift_spec), None, ),  # 1
        (2, TType.STRUCT, 'ace', (apache.airavata.api.error.ttypes.AiravataClientException, apache.airavata.api.error.ttypes.AiravataClientException.thrift_spec), None, ),  # 2
        (3, TType.STRUCT, 'ase', (apache.airavata.api.error.ttypes.AiravataSystemException, apache.airavata.api.error.ttypes.AiravataSystemException.thrift_spec), None, ),  # 3
        (4, TType.STRUCT, 'ae', (apache.airavata.api.error.ttypes.AuthorizationException, apache.airavata.api.error.ttypes.AuthorizationException.thrift_spec), None, ),  # 4
    )

    def __init__(self, success=None, ire=None, ace=None, ase=None, ae=None,):
        self.success = success
        self.ire = ire
        self.ace = ace
        self.ase = ase
        self.ae = ae

    def read(self, iprot):
        if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None:
            iprot._fast_decode(self, iprot, (self.__class__, self.thrift_spec))
            return
        iprot.readStructBegin()
        while True:
            (fname, ftype, fid) = iprot.readFieldBegin()
            if ftype == TType.STOP:
                break
            if fid == 0:
                if ftype == TType.BOOL:
                    self.success = iprot.readBool()
                else:
                    iprot.skip(ftype)
            elif fid == 1:
                if ftype == TType.STRUCT:
                    self.ire = apache.airavata.api.error.ttypes.InvalidRequestException()
                    self.ire.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 2:
                if ftype == TType.STRUCT:
                    self.ace = apache.airavata.api.error.ttypes.AiravataClientException()
                    self.ace.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 3:
                if ftype == TType.STRUCT:
                    self.ase = apache.airavata.api.error.ttypes.AiravataSystemException()
                    self.ase.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 4:
                if ftype == TType.STRUCT:
                    self.ae = apache.airavata.api.error.ttypes.AuthorizationException()
                    self.ae.read(iprot)
                else:
                    iprot.skip(ftype)
            else:
                iprot.skip(ftype)
            iprot.readFieldEnd()
        iprot.readStructEnd()

    def write(self, oprot):
        if oprot._fast_encode is not None and self.thrift_spec is not None:
            oprot.trans.write(oprot._fast_encode(self, (self.__class__, self.thrift_spec)))
            return
        oprot.writeStructBegin('deleteApplicationModule_result')
        if self.success is not None:
            oprot.writeFieldBegin('success', TType.BOOL, 0)
            oprot.writeBool(self.success)
            oprot.writeFieldEnd()
        if self.ire is not None:
            oprot.writeFieldBegin('ire', TType.STRUCT, 1)
            self.ire.write(oprot)
            oprot.writeFieldEnd()
        if self.ace is not None:
            oprot.writeFieldBegin('ace', TType.STRUCT, 2)
            self.ace.write(oprot)
            oprot.writeFieldEnd()
        if self.ase is not None:
            oprot.writeFieldBegin('ase', TType.STRUCT, 3)
            self.ase.write(oprot)
            oprot.writeFieldEnd()
        if self.ae is not None:
            oprot.writeFieldBegin('ae', TType.STRUCT, 4)
            self.ae.write(oprot)
            oprot.writeFieldEnd()
        oprot.writeFieldStop()
        oprot.writeStructEnd()

    def validate(self):
        return

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

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

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


class registerApplicationDeployment_args(object):
    """
    Attributes:
     - authzToken
     - gatewayId
     - applicationDeployment
    """

    thrift_spec = (
        None,  # 0
        (1, TType.STRUCT, 'authzToken', (apache.airavata.model.security.ttypes.AuthzToken, apache.airavata.model.security.ttypes.AuthzToken.thrift_spec), None, ),  # 1
        (2, TType.STRING, 'gatewayId', 'UTF8', None, ),  # 2
        (3, TType.STRUCT, 'applicationDeployment', (apache.airavata.model.appcatalog.appdeployment.ttypes.ApplicationDeploymentDescription, apache.airavata.model.appcatalog.appdeployment.ttypes.ApplicationDeploymentDescription.thrift_spec), None, ),  # 3
    )

    def __init__(self, authzToken=None, gatewayId=None, applicationDeployment=None,):
        self.authzToken = authzToken
        self.gatewayId = gatewayId
        self.applicationDeployment = applicationDeployment

    def read(self, iprot):
        if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None:
            iprot._fast_decode(self, iprot, (self.__class__, self.thrift_spec))
            return
        iprot.readStructBegin()
        while True:
            (fname, ftype, fid) = iprot.readFieldBegin()
            if ftype == TType.STOP:
                break
            if fid == 1:
                if ftype == TType.STRUCT:
                    self.authzToken = apache.airavata.model.security.ttypes.AuthzToken()
                    self.authzToken.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 2:
                if ftype == TType.STRING:
                    self.gatewayId = iprot.readString().decode('utf-8') if sys.version_info[0] == 2 else iprot.readString()
                else:
                    iprot.skip(ftype)
            elif fid == 3:
                if ftype == TType.STRUCT:
                    self.applicationDeployment = apache.airavata.model.appcatalog.appdeployment.ttypes.ApplicationDeploymentDescription()
                    self.applicationDeployment.read(iprot)
                else:
                    iprot.skip(ftype)
            else:
                iprot.skip(ftype)
            iprot.readFieldEnd()
        iprot.readStructEnd()

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

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

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

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

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


class registerApplicationDeployment_result(object):
    """
    Attributes:
     - success
     - ire
     - ace
     - ase
     - ae
    """

    thrift_spec = (
        (0, TType.STRING, 'success', 'UTF8', None, ),  # 0
        (1, TType.STRUCT, 'ire', (apache.airavata.api.error.ttypes.InvalidRequestException, apache.airavata.api.error.ttypes.InvalidRequestException.thrift_spec), None, ),  # 1
        (2, TType.STRUCT, 'ace', (apache.airavata.api.error.ttypes.AiravataClientException, apache.airavata.api.error.ttypes.AiravataClientException.thrift_spec), None, ),  # 2
        (3, TType.STRUCT, 'ase', (apache.airavata.api.error.ttypes.AiravataSystemException, apache.airavata.api.error.ttypes.AiravataSystemException.thrift_spec), None, ),  # 3
        (4, TType.STRUCT, 'ae', (apache.airavata.api.error.ttypes.AuthorizationException, apache.airavata.api.error.ttypes.AuthorizationException.thrift_spec), None, ),  # 4
    )

    def __init__(self, success=None, ire=None, ace=None, ase=None, ae=None,):
        self.success = success
        self.ire = ire
        self.ace = ace
        self.ase = ase
        self.ae = ae

    def read(self, iprot):
        if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None:
            iprot._fast_decode(self, iprot, (self.__class__, self.thrift_spec))
            return
        iprot.readStructBegin()
        while True:
            (fname, ftype, fid) = iprot.readFieldBegin()
            if ftype == TType.STOP:
                break
            if fid == 0:
                if ftype == TType.STRING:
                    self.success = iprot.readString().decode('utf-8') if sys.version_info[0] == 2 else iprot.readString()
                else:
                    iprot.skip(ftype)
            elif fid == 1:
                if ftype == TType.STRUCT:
                    self.ire = apache.airavata.api.error.ttypes.InvalidRequestException()
                    self.ire.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 2:
                if ftype == TType.STRUCT:
                    self.ace = apache.airavata.api.error.ttypes.AiravataClientException()
                    self.ace.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 3:
                if ftype == TType.STRUCT:
                    self.ase = apache.airavata.api.error.ttypes.AiravataSystemException()
                    self.ase.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 4:
                if ftype == TType.STRUCT:
                    self.ae = apache.airavata.api.error.ttypes.AuthorizationException()
                    self.ae.read(iprot)
                else:
                    iprot.skip(ftype)
            else:
                iprot.skip(ftype)
            iprot.readFieldEnd()
        iprot.readStructEnd()

    def write(self, oprot):
        if oprot._fast_encode is not None and self.thrift_spec is not None:
            oprot.trans.write(oprot._fast_encode(self, (self.__class__, self.thrift_spec)))
            return
        oprot.writeStructBegin('registerApplicationDeployment_result')
        if self.success is not None:
            oprot.writeFieldBegin('success', TType.STRING, 0)
            oprot.writeString(self.success.encode('utf-8') if sys.version_info[0] == 2 else self.success)
            oprot.writeFieldEnd()
        if self.ire is not None:
            oprot.writeFieldBegin('ire', TType.STRUCT, 1)
            self.ire.write(oprot)
            oprot.writeFieldEnd()
        if self.ace is not None:
            oprot.writeFieldBegin('ace', TType.STRUCT, 2)
            self.ace.write(oprot)
            oprot.writeFieldEnd()
        if self.ase is not None:
            oprot.writeFieldBegin('ase', TType.STRUCT, 3)
            self.ase.write(oprot)
            oprot.writeFieldEnd()
        if self.ae is not None:
            oprot.writeFieldBegin('ae', TType.STRUCT, 4)
            self.ae.write(oprot)
            oprot.writeFieldEnd()
        oprot.writeFieldStop()
        oprot.writeStructEnd()

    def validate(self):
        return

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

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

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


class getApplicationDeployment_args(object):
    """
    Attributes:
     - authzToken
     - appDeploymentId
    """

    thrift_spec = (
        None,  # 0
        (1, TType.STRUCT, 'authzToken', (apache.airavata.model.security.ttypes.AuthzToken, apache.airavata.model.security.ttypes.AuthzToken.thrift_spec), None, ),  # 1
        (2, TType.STRING, 'appDeploymentId', 'UTF8', None, ),  # 2
    )

    def __init__(self, authzToken=None, appDeploymentId=None,):
        self.authzToken = authzToken
        self.appDeploymentId = appDeploymentId

    def read(self, iprot):
        if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None:
            iprot._fast_decode(self, iprot, (self.__class__, self.thrift_spec))
            return
        iprot.readStructBegin()
        while True:
            (fname, ftype, fid) = iprot.readFieldBegin()
            if ftype == TType.STOP:
                break
            if fid == 1:
                if ftype == TType.STRUCT:
                    self.authzToken = apache.airavata.model.security.ttypes.AuthzToken()
                    self.authzToken.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 2:
                if ftype == TType.STRING:
                    self.appDeploymentId = iprot.readString().decode('utf-8') if sys.version_info[0] == 2 else iprot.readString()
                else:
                    iprot.skip(ftype)
            else:
                iprot.skip(ftype)
            iprot.readFieldEnd()
        iprot.readStructEnd()

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

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

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

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

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


class getApplicationDeployment_result(object):
    """
    Attributes:
     - success
     - ire
     - ace
     - ase
     - ae
    """

    thrift_spec = (
        (0, TType.STRUCT, 'success', (apache.airavata.model.appcatalog.appdeployment.ttypes.ApplicationDeploymentDescription, apache.airavata.model.appcatalog.appdeployment.ttypes.ApplicationDeploymentDescription.thrift_spec), None, ),  # 0
        (1, TType.STRUCT, 'ire', (apache.airavata.api.error.ttypes.InvalidRequestException, apache.airavata.api.error.ttypes.InvalidRequestException.thrift_spec), None, ),  # 1
        (2, TType.STRUCT, 'ace', (apache.airavata.api.error.ttypes.AiravataClientException, apache.airavata.api.error.ttypes.AiravataClientException.thrift_spec), None, ),  # 2
        (3, TType.STRUCT, 'ase', (apache.airavata.api.error.ttypes.AiravataSystemException, apache.airavata.api.error.ttypes.AiravataSystemException.thrift_spec), None, ),  # 3
        (4, TType.STRUCT, 'ae', (apache.airavata.api.error.ttypes.AuthorizationException, apache.airavata.api.error.ttypes.AuthorizationException.thrift_spec), None, ),  # 4
    )

    def __init__(self, success=None, ire=None, ace=None, ase=None, ae=None,):
        self.success = success
        self.ire = ire
        self.ace = ace
        self.ase = ase
        self.ae = ae

    def read(self, iprot):
        if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None:
            iprot._fast_decode(self, iprot, (self.__class__, self.thrift_spec))
            return
        iprot.readStructBegin()
        while True:
            (fname, ftype, fid) = iprot.readFieldBegin()
            if ftype == TType.STOP:
                break
            if fid == 0:
                if ftype == TType.STRUCT:
                    self.success = apache.airavata.model.appcatalog.appdeployment.ttypes.ApplicationDeploymentDescription()
                    self.success.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 1:
                if ftype == TType.STRUCT:
                    self.ire = apache.airavata.api.error.ttypes.InvalidRequestException()
                    self.ire.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 2:
                if ftype == TType.STRUCT:
                    self.ace = apache.airavata.api.error.ttypes.AiravataClientException()
                    self.ace.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 3:
                if ftype == TType.STRUCT:
                    self.ase = apache.airavata.api.error.ttypes.AiravataSystemException()
                    self.ase.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 4:
                if ftype == TType.STRUCT:
                    self.ae = apache.airavata.api.error.ttypes.AuthorizationException()
                    self.ae.read(iprot)
                else:
                    iprot.skip(ftype)
            else:
                iprot.skip(ftype)
            iprot.readFieldEnd()
        iprot.readStructEnd()

    def write(self, oprot):
        if oprot._fast_encode is not None and self.thrift_spec is not None:
            oprot.trans.write(oprot._fast_encode(self, (self.__class__, self.thrift_spec)))
            return
        oprot.writeStructBegin('getApplicationDeployment_result')
        if self.success is not None:
            oprot.writeFieldBegin('success', TType.STRUCT, 0)
            self.success.write(oprot)
            oprot.writeFieldEnd()
        if self.ire is not None:
            oprot.writeFieldBegin('ire', TType.STRUCT, 1)
            self.ire.write(oprot)
            oprot.writeFieldEnd()
        if self.ace is not None:
            oprot.writeFieldBegin('ace', TType.STRUCT, 2)
            self.ace.write(oprot)
            oprot.writeFieldEnd()
        if self.ase is not None:
            oprot.writeFieldBegin('ase', TType.STRUCT, 3)
            self.ase.write(oprot)
            oprot.writeFieldEnd()
        if self.ae is not None:
            oprot.writeFieldBegin('ae', TType.STRUCT, 4)
            self.ae.write(oprot)
            oprot.writeFieldEnd()
        oprot.writeFieldStop()
        oprot.writeStructEnd()

    def validate(self):
        return

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

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

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


class updateApplicationDeployment_args(object):
    """
    Attributes:
     - authzToken
     - appDeploymentId
     - applicationDeployment
    """

    thrift_spec = (
        None,  # 0
        (1, TType.STRUCT, 'authzToken', (apache.airavata.model.security.ttypes.AuthzToken, apache.airavata.model.security.ttypes.AuthzToken.thrift_spec), None, ),  # 1
        (2, TType.STRING, 'appDeploymentId', 'UTF8', None, ),  # 2
        (3, TType.STRUCT, 'applicationDeployment', (apache.airavata.model.appcatalog.appdeployment.ttypes.ApplicationDeploymentDescription, apache.airavata.model.appcatalog.appdeployment.ttypes.ApplicationDeploymentDescription.thrift_spec), None, ),  # 3
    )

    def __init__(self, authzToken=None, appDeploymentId=None, applicationDeployment=None,):
        self.authzToken = authzToken
        self.appDeploymentId = appDeploymentId
        self.applicationDeployment = applicationDeployment

    def read(self, iprot):
        if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None:
            iprot._fast_decode(self, iprot, (self.__class__, self.thrift_spec))
            return
        iprot.readStructBegin()
        while True:
            (fname, ftype, fid) = iprot.readFieldBegin()
            if ftype == TType.STOP:
                break
            if fid == 1:
                if ftype == TType.STRUCT:
                    self.authzToken = apache.airavata.model.security.ttypes.AuthzToken()
                    self.authzToken.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 2:
                if ftype == TType.STRING:
                    self.appDeploymentId = iprot.readString().decode('utf-8') if sys.version_info[0] == 2 else iprot.readString()
                else:
                    iprot.skip(ftype)
            elif fid == 3:
                if ftype == TType.STRUCT:
                    self.applicationDeployment = apache.airavata.model.appcatalog.appdeployment.ttypes.ApplicationDeploymentDescription()
                    self.applicationDeployment.read(iprot)
                else:
                    iprot.skip(ftype)
            else:
                iprot.skip(ftype)
            iprot.readFieldEnd()
        iprot.readStructEnd()

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

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

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

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

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


class updateApplicationDeployment_result(object):
    """
    Attributes:
     - success
     - ire
     - ace
     - ase
     - ae
    """

    thrift_spec = (
        (0, TType.BOOL, 'success', None, None, ),  # 0
        (1, TType.STRUCT, 'ire', (apache.airavata.api.error.ttypes.InvalidRequestException, apache.airavata.api.error.ttypes.InvalidRequestException.thrift_spec), None, ),  # 1
        (2, TType.STRUCT, 'ace', (apache.airavata.api.error.ttypes.AiravataClientException, apache.airavata.api.error.ttypes.AiravataClientException.thrift_spec), None, ),  # 2
        (3, TType.STRUCT, 'ase', (apache.airavata.api.error.ttypes.AiravataSystemException, apache.airavata.api.error.ttypes.AiravataSystemException.thrift_spec), None, ),  # 3
        (4, TType.STRUCT, 'ae', (apache.airavata.api.error.ttypes.AuthorizationException, apache.airavata.api.error.ttypes.AuthorizationException.thrift_spec), None, ),  # 4
    )

    def __init__(self, success=None, ire=None, ace=None, ase=None, ae=None,):
        self.success = success
        self.ire = ire
        self.ace = ace
        self.ase = ase
        self.ae = ae

    def read(self, iprot):
        if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None:
            iprot._fast_decode(self, iprot, (self.__class__, self.thrift_spec))
            return
        iprot.readStructBegin()
        while True:
            (fname, ftype, fid) = iprot.readFieldBegin()
            if ftype == TType.STOP:
                break
            if fid == 0:
                if ftype == TType.BOOL:
                    self.success = iprot.readBool()
                else:
                    iprot.skip(ftype)
            elif fid == 1:
                if ftype == TType.STRUCT:
                    self.ire = apache.airavata.api.error.ttypes.InvalidRequestException()
                    self.ire.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 2:
                if ftype == TType.STRUCT:
                    self.ace = apache.airavata.api.error.ttypes.AiravataClientException()
                    self.ace.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 3:
                if ftype == TType.STRUCT:
                    self.ase = apache.airavata.api.error.ttypes.AiravataSystemException()
                    self.ase.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 4:
                if ftype == TType.STRUCT:
                    self.ae = apache.airavata.api.error.ttypes.AuthorizationException()
                    self.ae.read(iprot)
                else:
                    iprot.skip(ftype)
            else:
                iprot.skip(ftype)
            iprot.readFieldEnd()
        iprot.readStructEnd()

    def write(self, oprot):
        if oprot._fast_encode is not None and self.thrift_spec is not None:
            oprot.trans.write(oprot._fast_encode(self, (self.__class__, self.thrift_spec)))
            return
        oprot.writeStructBegin('updateApplicationDeployment_result')
        if self.success is not None:
            oprot.writeFieldBegin('success', TType.BOOL, 0)
            oprot.writeBool(self.success)
            oprot.writeFieldEnd()
        if self.ire is not None:
            oprot.writeFieldBegin('ire', TType.STRUCT, 1)
            self.ire.write(oprot)
            oprot.writeFieldEnd()
        if self.ace is not None:
            oprot.writeFieldBegin('ace', TType.STRUCT, 2)
            self.ace.write(oprot)
            oprot.writeFieldEnd()
        if self.ase is not None:
            oprot.writeFieldBegin('ase', TType.STRUCT, 3)
            self.ase.write(oprot)
            oprot.writeFieldEnd()
        if self.ae is not None:
            oprot.writeFieldBegin('ae', TType.STRUCT, 4)
            self.ae.write(oprot)
            oprot.writeFieldEnd()
        oprot.writeFieldStop()
        oprot.writeStructEnd()

    def validate(self):
        return

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

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

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


class deleteApplicationDeployment_args(object):
    """
    Attributes:
     - authzToken
     - appDeploymentId
    """

    thrift_spec = (
        None,  # 0
        (1, TType.STRUCT, 'authzToken', (apache.airavata.model.security.ttypes.AuthzToken, apache.airavata.model.security.ttypes.AuthzToken.thrift_spec), None, ),  # 1
        (2, TType.STRING, 'appDeploymentId', 'UTF8', None, ),  # 2
    )

    def __init__(self, authzToken=None, appDeploymentId=None,):
        self.authzToken = authzToken
        self.appDeploymentId = appDeploymentId

    def read(self, iprot):
        if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None:
            iprot._fast_decode(self, iprot, (self.__class__, self.thrift_spec))
            return
        iprot.readStructBegin()
        while True:
            (fname, ftype, fid) = iprot.readFieldBegin()
            if ftype == TType.STOP:
                break
            if fid == 1:
                if ftype == TType.STRUCT:
                    self.authzToken = apache.airavata.model.security.ttypes.AuthzToken()
                    self.authzToken.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 2:
                if ftype == TType.STRING:
                    self.appDeploymentId = iprot.readString().decode('utf-8') if sys.version_info[0] == 2 else iprot.readString()
                else:
                    iprot.skip(ftype)
            else:
                iprot.skip(ftype)
            iprot.readFieldEnd()
        iprot.readStructEnd()

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

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

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

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

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


class deleteApplicationDeployment_result(object):
    """
    Attributes:
     - success
     - ire
     - ace
     - ase
     - ae
    """

    thrift_spec = (
        (0, TType.BOOL, 'success', None, None, ),  # 0
        (1, TType.STRUCT, 'ire', (apache.airavata.api.error.ttypes.InvalidRequestException, apache.airavata.api.error.ttypes.InvalidRequestException.thrift_spec), None, ),  # 1
        (2, TType.STRUCT, 'ace', (apache.airavata.api.error.ttypes.AiravataClientException, apache.airavata.api.error.ttypes.AiravataClientException.thrift_spec), None, ),  # 2
        (3, TType.STRUCT, 'ase', (apache.airavata.api.error.ttypes.AiravataSystemException, apache.airavata.api.error.ttypes.AiravataSystemException.thrift_spec), None, ),  # 3
        (4, TType.STRUCT, 'ae', (apache.airavata.api.error.ttypes.AuthorizationException, apache.airavata.api.error.ttypes.AuthorizationException.thrift_spec), None, ),  # 4
    )

    def __init__(self, success=None, ire=None, ace=None, ase=None, ae=None,):
        self.success = success
        self.ire = ire
        self.ace = ace
        self.ase = ase
        self.ae = ae

    def read(self, iprot):
        if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None:
            iprot._fast_decode(self, iprot, (self.__class__, self.thrift_spec))
            return
        iprot.readStructBegin()
        while True:
            (fname, ftype, fid) = iprot.readFieldBegin()
            if ftype == TType.STOP:
                break
            if fid == 0:
                if ftype == TType.BOOL:
                    self.success = iprot.readBool()
                else:
                    iprot.skip(ftype)
            elif fid == 1:
                if ftype == TType.STRUCT:
                    self.ire = apache.airavata.api.error.ttypes.InvalidRequestException()
                    self.ire.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 2:
                if ftype == TType.STRUCT:
                    self.ace = apache.airavata.api.error.ttypes.AiravataClientException()
                    self.ace.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 3:
                if ftype == TType.STRUCT:
                    self.ase = apache.airavata.api.error.ttypes.AiravataSystemException()
                    self.ase.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 4:
                if ftype == TType.STRUCT:
                    self.ae = apache.airavata.api.error.ttypes.AuthorizationException()
                    self.ae.read(iprot)
                else:
                    iprot.skip(ftype)
            else:
                iprot.skip(ftype)
            iprot.readFieldEnd()
        iprot.readStructEnd()

    def write(self, oprot):
        if oprot._fast_encode is not None and self.thrift_spec is not None:
            oprot.trans.write(oprot._fast_encode(self, (self.__class__, self.thrift_spec)))
            return
        oprot.writeStructBegin('deleteApplicationDeployment_result')
        if self.success is not None:
            oprot.writeFieldBegin('success', TType.BOOL, 0)
            oprot.writeBool(self.success)
            oprot.writeFieldEnd()
        if self.ire is not None:
            oprot.writeFieldBegin('ire', TType.STRUCT, 1)
            self.ire.write(oprot)
            oprot.writeFieldEnd()
        if self.ace is not None:
            oprot.writeFieldBegin('ace', TType.STRUCT, 2)
            self.ace.write(oprot)
            oprot.writeFieldEnd()
        if self.ase is not None:
            oprot.writeFieldBegin('ase', TType.STRUCT, 3)
            self.ase.write(oprot)
            oprot.writeFieldEnd()
        if self.ae is not None:
            oprot.writeFieldBegin('ae', TType.STRUCT, 4)
            self.ae.write(oprot)
            oprot.writeFieldEnd()
        oprot.writeFieldStop()
        oprot.writeStructEnd()

    def validate(self):
        return

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

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

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


class getAllApplicationDeployments_args(object):
    """
    Attributes:
     - authzToken
     - gatewayId
    """

    thrift_spec = (
        None,  # 0
        (1, TType.STRUCT, 'authzToken', (apache.airavata.model.security.ttypes.AuthzToken, apache.airavata.model.security.ttypes.AuthzToken.thrift_spec), None, ),  # 1
        (2, TType.STRING, 'gatewayId', 'UTF8', None, ),  # 2
    )

    def __init__(self, authzToken=None, gatewayId=None,):
        self.authzToken = authzToken
        self.gatewayId = gatewayId

    def read(self, iprot):
        if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None:
            iprot._fast_decode(self, iprot, (self.__class__, self.thrift_spec))
            return
        iprot.readStructBegin()
        while True:
            (fname, ftype, fid) = iprot.readFieldBegin()
            if ftype == TType.STOP:
                break
            if fid == 1:
                if ftype == TType.STRUCT:
                    self.authzToken = apache.airavata.model.security.ttypes.AuthzToken()
                    self.authzToken.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 2:
                if ftype == TType.STRING:
                    self.gatewayId = iprot.readString().decode('utf-8') if sys.version_info[0] == 2 else iprot.readString()
                else:
                    iprot.skip(ftype)
            else:
                iprot.skip(ftype)
            iprot.readFieldEnd()
        iprot.readStructEnd()

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

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

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

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

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


class getAllApplicationDeployments_result(object):
    """
    Attributes:
     - success
     - ire
     - ace
     - ase
     - ae
    """

    thrift_spec = (
        (0, TType.LIST, 'success', (TType.STRUCT, (apache.airavata.model.appcatalog.appdeployment.ttypes.ApplicationDeploymentDescription, apache.airavata.model.appcatalog.appdeployment.ttypes.ApplicationDeploymentDescription.thrift_spec), False), None, ),  # 0
        (1, TType.STRUCT, 'ire', (apache.airavata.api.error.ttypes.InvalidRequestException, apache.airavata.api.error.ttypes.InvalidRequestException.thrift_spec), None, ),  # 1
        (2, TType.STRUCT, 'ace', (apache.airavata.api.error.ttypes.AiravataClientException, apache.airavata.api.error.ttypes.AiravataClientException.thrift_spec), None, ),  # 2
        (3, TType.STRUCT, 'ase', (apache.airavata.api.error.ttypes.AiravataSystemException, apache.airavata.api.error.ttypes.AiravataSystemException.thrift_spec), None, ),  # 3
        (4, TType.STRUCT, 'ae', (apache.airavata.api.error.ttypes.AuthorizationException, apache.airavata.api.error.ttypes.AuthorizationException.thrift_spec), None, ),  # 4
    )

    def __init__(self, success=None, ire=None, ace=None, ase=None, ae=None,):
        self.success = success
        self.ire = ire
        self.ace = ace
        self.ase = ase
        self.ae = ae

    def read(self, iprot):
        if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None:
            iprot._fast_decode(self, iprot, (self.__class__, self.thrift_spec))
            return
        iprot.readStructBegin()
        while True:
            (fname, ftype, fid) = iprot.readFieldBegin()
            if ftype == TType.STOP:
                break
            if fid == 0:
                if ftype == TType.LIST:
                    self.success = []
                    (_etype146, _size143) = iprot.readListBegin()
                    for _i147 in range(_size143):
                        _elem148 = apache.airavata.model.appcatalog.appdeployment.ttypes.ApplicationDeploymentDescription()
                        _elem148.read(iprot)
                        self.success.append(_elem148)
                    iprot.readListEnd()
                else:
                    iprot.skip(ftype)
            elif fid == 1:
                if ftype == TType.STRUCT:
                    self.ire = apache.airavata.api.error.ttypes.InvalidRequestException()
                    self.ire.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 2:
                if ftype == TType.STRUCT:
                    self.ace = apache.airavata.api.error.ttypes.AiravataClientException()
                    self.ace.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 3:
                if ftype == TType.STRUCT:
                    self.ase = apache.airavata.api.error.ttypes.AiravataSystemException()
                    self.ase.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 4:
                if ftype == TType.STRUCT:
                    self.ae = apache.airavata.api.error.ttypes.AuthorizationException()
                    self.ae.read(iprot)
                else:
                    iprot.skip(ftype)
            else:
                iprot.skip(ftype)
            iprot.readFieldEnd()
        iprot.readStructEnd()

    def write(self, oprot):
        if oprot._fast_encode is not None and self.thrift_spec is not None:
            oprot.trans.write(oprot._fast_encode(self, (self.__class__, self.thrift_spec)))
            return
        oprot.writeStructBegin('getAllApplicationDeployments_result')
        if self.success is not None:
            oprot.writeFieldBegin('success', TType.LIST, 0)
            oprot.writeListBegin(TType.STRUCT, len(self.success))
            for iter149 in self.success:
                iter149.write(oprot)
            oprot.writeListEnd()
            oprot.writeFieldEnd()
        if self.ire is not None:
            oprot.writeFieldBegin('ire', TType.STRUCT, 1)
            self.ire.write(oprot)
            oprot.writeFieldEnd()
        if self.ace is not None:
            oprot.writeFieldBegin('ace', TType.STRUCT, 2)
            self.ace.write(oprot)
            oprot.writeFieldEnd()
        if self.ase is not None:
            oprot.writeFieldBegin('ase', TType.STRUCT, 3)
            self.ase.write(oprot)
            oprot.writeFieldEnd()
        if self.ae is not None:
            oprot.writeFieldBegin('ae', TType.STRUCT, 4)
            self.ae.write(oprot)
            oprot.writeFieldEnd()
        oprot.writeFieldStop()
        oprot.writeStructEnd()

    def validate(self):
        return

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

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

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


class getAppModuleDeployedResources_args(object):
    """
    Attributes:
     - authzToken
     - appModuleId
    """

    thrift_spec = (
        None,  # 0
        (1, TType.STRUCT, 'authzToken', (apache.airavata.model.security.ttypes.AuthzToken, apache.airavata.model.security.ttypes.AuthzToken.thrift_spec), None, ),  # 1
        (2, TType.STRING, 'appModuleId', 'UTF8', None, ),  # 2
    )

    def __init__(self, authzToken=None, appModuleId=None,):
        self.authzToken = authzToken
        self.appModuleId = appModuleId

    def read(self, iprot):
        if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None:
            iprot._fast_decode(self, iprot, (self.__class__, self.thrift_spec))
            return
        iprot.readStructBegin()
        while True:
            (fname, ftype, fid) = iprot.readFieldBegin()
            if ftype == TType.STOP:
                break
            if fid == 1:
                if ftype == TType.STRUCT:
                    self.authzToken = apache.airavata.model.security.ttypes.AuthzToken()
                    self.authzToken.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 2:
                if ftype == TType.STRING:
                    self.appModuleId = iprot.readString().decode('utf-8') if sys.version_info[0] == 2 else iprot.readString()
                else:
                    iprot.skip(ftype)
            else:
                iprot.skip(ftype)
            iprot.readFieldEnd()
        iprot.readStructEnd()

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

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

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

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

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


class getAppModuleDeployedResources_result(object):
    """
    Attributes:
     - success
     - ire
     - ace
     - ase
     - ae
    """

    thrift_spec = (
        (0, TType.LIST, 'success', (TType.STRING, 'UTF8', False), None, ),  # 0
        (1, TType.STRUCT, 'ire', (apache.airavata.api.error.ttypes.InvalidRequestException, apache.airavata.api.error.ttypes.InvalidRequestException.thrift_spec), None, ),  # 1
        (2, TType.STRUCT, 'ace', (apache.airavata.api.error.ttypes.AiravataClientException, apache.airavata.api.error.ttypes.AiravataClientException.thrift_spec), None, ),  # 2
        (3, TType.STRUCT, 'ase', (apache.airavata.api.error.ttypes.AiravataSystemException, apache.airavata.api.error.ttypes.AiravataSystemException.thrift_spec), None, ),  # 3
        (4, TType.STRUCT, 'ae', (apache.airavata.api.error.ttypes.AuthorizationException, apache.airavata.api.error.ttypes.AuthorizationException.thrift_spec), None, ),  # 4
    )

    def __init__(self, success=None, ire=None, ace=None, ase=None, ae=None,):
        self.success = success
        self.ire = ire
        self.ace = ace
        self.ase = ase
        self.ae = ae

    def read(self, iprot):
        if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None:
            iprot._fast_decode(self, iprot, (self.__class__, self.thrift_spec))
            return
        iprot.readStructBegin()
        while True:
            (fname, ftype, fid) = iprot.readFieldBegin()
            if ftype == TType.STOP:
                break
            if fid == 0:
                if ftype == TType.LIST:
                    self.success = []
                    (_etype153, _size150) = iprot.readListBegin()
                    for _i154 in range(_size150):
                        _elem155 = iprot.readString().decode('utf-8') if sys.version_info[0] == 2 else iprot.readString()
                        self.success.append(_elem155)
                    iprot.readListEnd()
                else:
                    iprot.skip(ftype)
            elif fid == 1:
                if ftype == TType.STRUCT:
                    self.ire = apache.airavata.api.error.ttypes.InvalidRequestException()
                    self.ire.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 2:
                if ftype == TType.STRUCT:
                    self.ace = apache.airavata.api.error.ttypes.AiravataClientException()
                    self.ace.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 3:
                if ftype == TType.STRUCT:
                    self.ase = apache.airavata.api.error.ttypes.AiravataSystemException()
                    self.ase.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 4:
                if ftype == TType.STRUCT:
                    self.ae = apache.airavata.api.error.ttypes.AuthorizationException()
                    self.ae.read(iprot)
                else:
                    iprot.skip(ftype)
            else:
                iprot.skip(ftype)
            iprot.readFieldEnd()
        iprot.readStructEnd()

    def write(self, oprot):
        if oprot._fast_encode is not None and self.thrift_spec is not None:
            oprot.trans.write(oprot._fast_encode(self, (self.__class__, self.thrift_spec)))
            return
        oprot.writeStructBegin('getAppModuleDeployedResources_result')
        if self.success is not None:
            oprot.writeFieldBegin('success', TType.LIST, 0)
            oprot.writeListBegin(TType.STRING, len(self.success))
            for iter156 in self.success:
                oprot.writeString(iter156.encode('utf-8') if sys.version_info[0] == 2 else iter156)
            oprot.writeListEnd()
            oprot.writeFieldEnd()
        if self.ire is not None:
            oprot.writeFieldBegin('ire', TType.STRUCT, 1)
            self.ire.write(oprot)
            oprot.writeFieldEnd()
        if self.ace is not None:
            oprot.writeFieldBegin('ace', TType.STRUCT, 2)
            self.ace.write(oprot)
            oprot.writeFieldEnd()
        if self.ase is not None:
            oprot.writeFieldBegin('ase', TType.STRUCT, 3)
            self.ase.write(oprot)
            oprot.writeFieldEnd()
        if self.ae is not None:
            oprot.writeFieldBegin('ae', TType.STRUCT, 4)
            self.ae.write(oprot)
            oprot.writeFieldEnd()
        oprot.writeFieldStop()
        oprot.writeStructEnd()

    def validate(self):
        return

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

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

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


class registerApplicationInterface_args(object):
    """
    Attributes:
     - authzToken
     - gatewayId
     - applicationInterface
    """

    thrift_spec = (
        None,  # 0
        (1, TType.STRUCT, 'authzToken', (apache.airavata.model.security.ttypes.AuthzToken, apache.airavata.model.security.ttypes.AuthzToken.thrift_spec), None, ),  # 1
        (2, TType.STRING, 'gatewayId', 'UTF8', None, ),  # 2
        (3, TType.STRUCT, 'applicationInterface', (apache.airavata.model.appcatalog.appinterface.ttypes.ApplicationInterfaceDescription, apache.airavata.model.appcatalog.appinterface.ttypes.ApplicationInterfaceDescription.thrift_spec), None, ),  # 3
    )

    def __init__(self, authzToken=None, gatewayId=None, applicationInterface=None,):
        self.authzToken = authzToken
        self.gatewayId = gatewayId
        self.applicationInterface = applicationInterface

    def read(self, iprot):
        if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None:
            iprot._fast_decode(self, iprot, (self.__class__, self.thrift_spec))
            return
        iprot.readStructBegin()
        while True:
            (fname, ftype, fid) = iprot.readFieldBegin()
            if ftype == TType.STOP:
                break
            if fid == 1:
                if ftype == TType.STRUCT:
                    self.authzToken = apache.airavata.model.security.ttypes.AuthzToken()
                    self.authzToken.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 2:
                if ftype == TType.STRING:
                    self.gatewayId = iprot.readString().decode('utf-8') if sys.version_info[0] == 2 else iprot.readString()
                else:
                    iprot.skip(ftype)
            elif fid == 3:
                if ftype == TType.STRUCT:
                    self.applicationInterface = apache.airavata.model.appcatalog.appinterface.ttypes.ApplicationInterfaceDescription()
                    self.applicationInterface.read(iprot)
                else:
                    iprot.skip(ftype)
            else:
                iprot.skip(ftype)
            iprot.readFieldEnd()
        iprot.readStructEnd()

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

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

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

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

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


class registerApplicationInterface_result(object):
    """
    Attributes:
     - success
     - ire
     - ace
     - ase
     - ae
    """

    thrift_spec = (
        (0, TType.STRING, 'success', 'UTF8', None, ),  # 0
        (1, TType.STRUCT, 'ire', (apache.airavata.api.error.ttypes.InvalidRequestException, apache.airavata.api.error.ttypes.InvalidRequestException.thrift_spec), None, ),  # 1
        (2, TType.STRUCT, 'ace', (apache.airavata.api.error.ttypes.AiravataClientException, apache.airavata.api.error.ttypes.AiravataClientException.thrift_spec), None, ),  # 2
        (3, TType.STRUCT, 'ase', (apache.airavata.api.error.ttypes.AiravataSystemException, apache.airavata.api.error.ttypes.AiravataSystemException.thrift_spec), None, ),  # 3
        (4, TType.STRUCT, 'ae', (apache.airavata.api.error.ttypes.AuthorizationException, apache.airavata.api.error.ttypes.AuthorizationException.thrift_spec), None, ),  # 4
    )

    def __init__(self, success=None, ire=None, ace=None, ase=None, ae=None,):
        self.success = success
        self.ire = ire
        self.ace = ace
        self.ase = ase
        self.ae = ae

    def read(self, iprot):
        if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None:
            iprot._fast_decode(self, iprot, (self.__class__, self.thrift_spec))
            return
        iprot.readStructBegin()
        while True:
            (fname, ftype, fid) = iprot.readFieldBegin()
            if ftype == TType.STOP:
                break
            if fid == 0:
                if ftype == TType.STRING:
                    self.success = iprot.readString().decode('utf-8') if sys.version_info[0] == 2 else iprot.readString()
                else:
                    iprot.skip(ftype)
            elif fid == 1:
                if ftype == TType.STRUCT:
                    self.ire = apache.airavata.api.error.ttypes.InvalidRequestException()
                    self.ire.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 2:
                if ftype == TType.STRUCT:
                    self.ace = apache.airavata.api.error.ttypes.AiravataClientException()
                    self.ace.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 3:
                if ftype == TType.STRUCT:
                    self.ase = apache.airavata.api.error.ttypes.AiravataSystemException()
                    self.ase.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 4:
                if ftype == TType.STRUCT:
                    self.ae = apache.airavata.api.error.ttypes.AuthorizationException()
                    self.ae.read(iprot)
                else:
                    iprot.skip(ftype)
            else:
                iprot.skip(ftype)
            iprot.readFieldEnd()
        iprot.readStructEnd()

    def write(self, oprot):
        if oprot._fast_encode is not None and self.thrift_spec is not None:
            oprot.trans.write(oprot._fast_encode(self, (self.__class__, self.thrift_spec)))
            return
        oprot.writeStructBegin('registerApplicationInterface_result')
        if self.success is not None:
            oprot.writeFieldBegin('success', TType.STRING, 0)
            oprot.writeString(self.success.encode('utf-8') if sys.version_info[0] == 2 else self.success)
            oprot.writeFieldEnd()
        if self.ire is not None:
            oprot.writeFieldBegin('ire', TType.STRUCT, 1)
            self.ire.write(oprot)
            oprot.writeFieldEnd()
        if self.ace is not None:
            oprot.writeFieldBegin('ace', TType.STRUCT, 2)
            self.ace.write(oprot)
            oprot.writeFieldEnd()
        if self.ase is not None:
            oprot.writeFieldBegin('ase', TType.STRUCT, 3)
            self.ase.write(oprot)
            oprot.writeFieldEnd()
        if self.ae is not None:
            oprot.writeFieldBegin('ae', TType.STRUCT, 4)
            self.ae.write(oprot)
            oprot.writeFieldEnd()
        oprot.writeFieldStop()
        oprot.writeStructEnd()

    def validate(self):
        return

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

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

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


class cloneApplicationInterface_args(object):
    """
    Attributes:
     - authzToken
     - existingAppInterfaceID
     - newApplicationName
     - gatewayId
    """

    thrift_spec = (
        None,  # 0
        (1, TType.STRUCT, 'authzToken', (apache.airavata.model.security.ttypes.AuthzToken, apache.airavata.model.security.ttypes.AuthzToken.thrift_spec), None, ),  # 1
        (2, TType.STRING, 'existingAppInterfaceID', 'UTF8', None, ),  # 2
        (3, TType.STRING, 'newApplicationName', 'UTF8', None, ),  # 3
        (4, TType.STRING, 'gatewayId', 'UTF8', None, ),  # 4
    )

    def __init__(self, authzToken=None, existingAppInterfaceID=None, newApplicationName=None, gatewayId=None,):
        self.authzToken = authzToken
        self.existingAppInterfaceID = existingAppInterfaceID
        self.newApplicationName = newApplicationName
        self.gatewayId = gatewayId

    def read(self, iprot):
        if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None:
            iprot._fast_decode(self, iprot, (self.__class__, self.thrift_spec))
            return
        iprot.readStructBegin()
        while True:
            (fname, ftype, fid) = iprot.readFieldBegin()
            if ftype == TType.STOP:
                break
            if fid == 1:
                if ftype == TType.STRUCT:
                    self.authzToken = apache.airavata.model.security.ttypes.AuthzToken()
                    self.authzToken.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 2:
                if ftype == TType.STRING:
                    self.existingAppInterfaceID = iprot.readString().decode('utf-8') if sys.version_info[0] == 2 else iprot.readString()
                else:
                    iprot.skip(ftype)
            elif fid == 3:
                if ftype == TType.STRING:
                    self.newApplicationName = iprot.readString().decode('utf-8') if sys.version_info[0] == 2 else iprot.readString()
                else:
                    iprot.skip(ftype)
            elif fid == 4:
                if ftype == TType.STRING:
                    self.gatewayId = iprot.readString().decode('utf-8') if sys.version_info[0] == 2 else iprot.readString()
                else:
                    iprot.skip(ftype)
            else:
                iprot.skip(ftype)
            iprot.readFieldEnd()
        iprot.readStructEnd()

    def write(self, oprot):
        if oprot._fast_encode is not None and self.thrift_spec is not None:
            oprot.trans.write(oprot._fast_encode(self, (self.__class__, self.thrift_spec)))
            return
        oprot.writeStructBegin('cloneApplicationInterface_args')
        if self.authzToken is not None:
            oprot.writeFieldBegin('authzToken', TType.STRUCT, 1)
            self.authzToken.write(oprot)
            oprot.writeFieldEnd()
        if self.existingAppInterfaceID is not None:
            oprot.writeFieldBegin('existingAppInterfaceID', TType.STRING, 2)
            oprot.writeString(self.existingAppInterfaceID.encode('utf-8') if sys.version_info[0] == 2 else self.existingAppInterfaceID)
            oprot.writeFieldEnd()
        if self.newApplicationName is not None:
            oprot.writeFieldBegin('newApplicationName', TType.STRING, 3)
            oprot.writeString(self.newApplicationName.encode('utf-8') if sys.version_info[0] == 2 else self.newApplicationName)
            oprot.writeFieldEnd()
        if self.gatewayId is not None:
            oprot.writeFieldBegin('gatewayId', TType.STRING, 4)
            oprot.writeString(self.gatewayId.encode('utf-8') if sys.version_info[0] == 2 else self.gatewayId)
            oprot.writeFieldEnd()
        oprot.writeFieldStop()
        oprot.writeStructEnd()

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

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

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

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


class cloneApplicationInterface_result(object):
    """
    Attributes:
     - success
     - ire
     - ace
     - ase
     - ae
    """

    thrift_spec = (
        (0, TType.STRING, 'success', 'UTF8', None, ),  # 0
        (1, TType.STRUCT, 'ire', (apache.airavata.api.error.ttypes.InvalidRequestException, apache.airavata.api.error.ttypes.InvalidRequestException.thrift_spec), None, ),  # 1
        (2, TType.STRUCT, 'ace', (apache.airavata.api.error.ttypes.AiravataClientException, apache.airavata.api.error.ttypes.AiravataClientException.thrift_spec), None, ),  # 2
        (3, TType.STRUCT, 'ase', (apache.airavata.api.error.ttypes.AiravataSystemException, apache.airavata.api.error.ttypes.AiravataSystemException.thrift_spec), None, ),  # 3
        (4, TType.STRUCT, 'ae', (apache.airavata.api.error.ttypes.AuthorizationException, apache.airavata.api.error.ttypes.AuthorizationException.thrift_spec), None, ),  # 4
    )

    def __init__(self, success=None, ire=None, ace=None, ase=None, ae=None,):
        self.success = success
        self.ire = ire
        self.ace = ace
        self.ase = ase
        self.ae = ae

    def read(self, iprot):
        if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None:
            iprot._fast_decode(self, iprot, (self.__class__, self.thrift_spec))
            return
        iprot.readStructBegin()
        while True:
            (fname, ftype, fid) = iprot.readFieldBegin()
            if ftype == TType.STOP:
                break
            if fid == 0:
                if ftype == TType.STRING:
                    self.success = iprot.readString().decode('utf-8') if sys.version_info[0] == 2 else iprot.readString()
                else:
                    iprot.skip(ftype)
            elif fid == 1:
                if ftype == TType.STRUCT:
                    self.ire = apache.airavata.api.error.ttypes.InvalidRequestException()
                    self.ire.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 2:
                if ftype == TType.STRUCT:
                    self.ace = apache.airavata.api.error.ttypes.AiravataClientException()
                    self.ace.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 3:
                if ftype == TType.STRUCT:
                    self.ase = apache.airavata.api.error.ttypes.AiravataSystemException()
                    self.ase.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 4:
                if ftype == TType.STRUCT:
                    self.ae = apache.airavata.api.error.ttypes.AuthorizationException()
                    self.ae.read(iprot)
                else:
                    iprot.skip(ftype)
            else:
                iprot.skip(ftype)
            iprot.readFieldEnd()
        iprot.readStructEnd()

    def write(self, oprot):
        if oprot._fast_encode is not None and self.thrift_spec is not None:
            oprot.trans.write(oprot._fast_encode(self, (self.__class__, self.thrift_spec)))
            return
        oprot.writeStructBegin('cloneApplicationInterface_result')
        if self.success is not None:
            oprot.writeFieldBegin('success', TType.STRING, 0)
            oprot.writeString(self.success.encode('utf-8') if sys.version_info[0] == 2 else self.success)
            oprot.writeFieldEnd()
        if self.ire is not None:
            oprot.writeFieldBegin('ire', TType.STRUCT, 1)
            self.ire.write(oprot)
            oprot.writeFieldEnd()
        if self.ace is not None:
            oprot.writeFieldBegin('ace', TType.STRUCT, 2)
            self.ace.write(oprot)
            oprot.writeFieldEnd()
        if self.ase is not None:
            oprot.writeFieldBegin('ase', TType.STRUCT, 3)
            self.ase.write(oprot)
            oprot.writeFieldEnd()
        if self.ae is not None:
            oprot.writeFieldBegin('ae', TType.STRUCT, 4)
            self.ae.write(oprot)
            oprot.writeFieldEnd()
        oprot.writeFieldStop()
        oprot.writeStructEnd()

    def validate(self):
        return

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

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

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


class getApplicationInterface_args(object):
    """
    Attributes:
     - authzToken
     - appInterfaceId
    """

    thrift_spec = (
        None,  # 0
        (1, TType.STRUCT, 'authzToken', (apache.airavata.model.security.ttypes.AuthzToken, apache.airavata.model.security.ttypes.AuthzToken.thrift_spec), None, ),  # 1
        (2, TType.STRING, 'appInterfaceId', 'UTF8', None, ),  # 2
    )

    def __init__(self, authzToken=None, appInterfaceId=None,):
        self.authzToken = authzToken
        self.appInterfaceId = appInterfaceId

    def read(self, iprot):
        if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None:
            iprot._fast_decode(self, iprot, (self.__class__, self.thrift_spec))
            return
        iprot.readStructBegin()
        while True:
            (fname, ftype, fid) = iprot.readFieldBegin()
            if ftype == TType.STOP:
                break
            if fid == 1:
                if ftype == TType.STRUCT:
                    self.authzToken = apache.airavata.model.security.ttypes.AuthzToken()
                    self.authzToken.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 2:
                if ftype == TType.STRING:
                    self.appInterfaceId = iprot.readString().decode('utf-8') if sys.version_info[0] == 2 else iprot.readString()
                else:
                    iprot.skip(ftype)
            else:
                iprot.skip(ftype)
            iprot.readFieldEnd()
        iprot.readStructEnd()

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

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

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

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

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


class getApplicationInterface_result(object):
    """
    Attributes:
     - success
     - ire
     - ace
     - ase
     - ae
    """

    thrift_spec = (
        (0, TType.STRUCT, 'success', (apache.airavata.model.appcatalog.appinterface.ttypes.ApplicationInterfaceDescription, apache.airavata.model.appcatalog.appinterface.ttypes.ApplicationInterfaceDescription.thrift_spec), None, ),  # 0
        (1, TType.STRUCT, 'ire', (apache.airavata.api.error.ttypes.InvalidRequestException, apache.airavata.api.error.ttypes.InvalidRequestException.thrift_spec), None, ),  # 1
        (2, TType.STRUCT, 'ace', (apache.airavata.api.error.ttypes.AiravataClientException, apache.airavata.api.error.ttypes.AiravataClientException.thrift_spec), None, ),  # 2
        (3, TType.STRUCT, 'ase', (apache.airavata.api.error.ttypes.AiravataSystemException, apache.airavata.api.error.ttypes.AiravataSystemException.thrift_spec), None, ),  # 3
        (4, TType.STRUCT, 'ae', (apache.airavata.api.error.ttypes.AuthorizationException, apache.airavata.api.error.ttypes.AuthorizationException.thrift_spec), None, ),  # 4
    )

    def __init__(self, success=None, ire=None, ace=None, ase=None, ae=None,):
        self.success = success
        self.ire = ire
        self.ace = ace
        self.ase = ase
        self.ae = ae

    def read(self, iprot):
        if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None:
            iprot._fast_decode(self, iprot, (self.__class__, self.thrift_spec))
            return
        iprot.readStructBegin()
        while True:
            (fname, ftype, fid) = iprot.readFieldBegin()
            if ftype == TType.STOP:
                break
            if fid == 0:
                if ftype == TType.STRUCT:
                    self.success = apache.airavata.model.appcatalog.appinterface.ttypes.ApplicationInterfaceDescription()
                    self.success.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 1:
                if ftype == TType.STRUCT:
                    self.ire = apache.airavata.api.error.ttypes.InvalidRequestException()
                    self.ire.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 2:
                if ftype == TType.STRUCT:
                    self.ace = apache.airavata.api.error.ttypes.AiravataClientException()
                    self.ace.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 3:
                if ftype == TType.STRUCT:
                    self.ase = apache.airavata.api.error.ttypes.AiravataSystemException()
                    self.ase.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 4:
                if ftype == TType.STRUCT:
                    self.ae = apache.airavata.api.error.ttypes.AuthorizationException()
                    self.ae.read(iprot)
                else:
                    iprot.skip(ftype)
            else:
                iprot.skip(ftype)
            iprot.readFieldEnd()
        iprot.readStructEnd()

    def write(self, oprot):
        if oprot._fast_encode is not None and self.thrift_spec is not None:
            oprot.trans.write(oprot._fast_encode(self, (self.__class__, self.thrift_spec)))
            return
        oprot.writeStructBegin('getApplicationInterface_result')
        if self.success is not None:
            oprot.writeFieldBegin('success', TType.STRUCT, 0)
            self.success.write(oprot)
            oprot.writeFieldEnd()
        if self.ire is not None:
            oprot.writeFieldBegin('ire', TType.STRUCT, 1)
            self.ire.write(oprot)
            oprot.writeFieldEnd()
        if self.ace is not None:
            oprot.writeFieldBegin('ace', TType.STRUCT, 2)
            self.ace.write(oprot)
            oprot.writeFieldEnd()
        if self.ase is not None:
            oprot.writeFieldBegin('ase', TType.STRUCT, 3)
            self.ase.write(oprot)
            oprot.writeFieldEnd()
        if self.ae is not None:
            oprot.writeFieldBegin('ae', TType.STRUCT, 4)
            self.ae.write(oprot)
            oprot.writeFieldEnd()
        oprot.writeFieldStop()
        oprot.writeStructEnd()

    def validate(self):
        return

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

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

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


class updateApplicationInterface_args(object):
    """
    Attributes:
     - authzToken
     - appInterfaceId
     - applicationInterface
    """

    thrift_spec = (
        None,  # 0
        (1, TType.STRUCT, 'authzToken', (apache.airavata.model.security.ttypes.AuthzToken, apache.airavata.model.security.ttypes.AuthzToken.thrift_spec), None, ),  # 1
        (2, TType.STRING, 'appInterfaceId', 'UTF8', None, ),  # 2
        (3, TType.STRUCT, 'applicationInterface', (apache.airavata.model.appcatalog.appinterface.ttypes.ApplicationInterfaceDescription, apache.airavata.model.appcatalog.appinterface.ttypes.ApplicationInterfaceDescription.thrift_spec), None, ),  # 3
    )

    def __init__(self, authzToken=None, appInterfaceId=None, applicationInterface=None,):
        self.authzToken = authzToken
        self.appInterfaceId = appInterfaceId
        self.applicationInterface = applicationInterface

    def read(self, iprot):
        if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None:
            iprot._fast_decode(self, iprot, (self.__class__, self.thrift_spec))
            return
        iprot.readStructBegin()
        while True:
            (fname, ftype, fid) = iprot.readFieldBegin()
            if ftype == TType.STOP:
                break
            if fid == 1:
                if ftype == TType.STRUCT:
                    self.authzToken = apache.airavata.model.security.ttypes.AuthzToken()
                    self.authzToken.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 2:
                if ftype == TType.STRING:
                    self.appInterfaceId = iprot.readString().decode('utf-8') if sys.version_info[0] == 2 else iprot.readString()
                else:
                    iprot.skip(ftype)
            elif fid == 3:
                if ftype == TType.STRUCT:
                    self.applicationInterface = apache.airavata.model.appcatalog.appinterface.ttypes.ApplicationInterfaceDescription()
                    self.applicationInterface.read(iprot)
                else:
                    iprot.skip(ftype)
            else:
                iprot.skip(ftype)
            iprot.readFieldEnd()
        iprot.readStructEnd()

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

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

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

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

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


class updateApplicationInterface_result(object):
    """
    Attributes:
     - success
     - ire
     - ace
     - ase
     - ae
    """

    thrift_spec = (
        (0, TType.BOOL, 'success', None, None, ),  # 0
        (1, TType.STRUCT, 'ire', (apache.airavata.api.error.ttypes.InvalidRequestException, apache.airavata.api.error.ttypes.InvalidRequestException.thrift_spec), None, ),  # 1
        (2, TType.STRUCT, 'ace', (apache.airavata.api.error.ttypes.AiravataClientException, apache.airavata.api.error.ttypes.AiravataClientException.thrift_spec), None, ),  # 2
        (3, TType.STRUCT, 'ase', (apache.airavata.api.error.ttypes.AiravataSystemException, apache.airavata.api.error.ttypes.AiravataSystemException.thrift_spec), None, ),  # 3
        (4, TType.STRUCT, 'ae', (apache.airavata.api.error.ttypes.AuthorizationException, apache.airavata.api.error.ttypes.AuthorizationException.thrift_spec), None, ),  # 4
    )

    def __init__(self, success=None, ire=None, ace=None, ase=None, ae=None,):
        self.success = success
        self.ire = ire
        self.ace = ace
        self.ase = ase
        self.ae = ae

    def read(self, iprot):
        if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None:
            iprot._fast_decode(self, iprot, (self.__class__, self.thrift_spec))
            return
        iprot.readStructBegin()
        while True:
            (fname, ftype, fid) = iprot.readFieldBegin()
            if ftype == TType.STOP:
                break
            if fid == 0:
                if ftype == TType.BOOL:
                    self.success = iprot.readBool()
                else:
                    iprot.skip(ftype)
            elif fid == 1:
                if ftype == TType.STRUCT:
                    self.ire = apache.airavata.api.error.ttypes.InvalidRequestException()
                    self.ire.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 2:
                if ftype == TType.STRUCT:
                    self.ace = apache.airavata.api.error.ttypes.AiravataClientException()
                    self.ace.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 3:
                if ftype == TType.STRUCT:
                    self.ase = apache.airavata.api.error.ttypes.AiravataSystemException()
                    self.ase.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 4:
                if ftype == TType.STRUCT:
                    self.ae = apache.airavata.api.error.ttypes.AuthorizationException()
                    self.ae.read(iprot)
                else:
                    iprot.skip(ftype)
            else:
                iprot.skip(ftype)
            iprot.readFieldEnd()
        iprot.readStructEnd()

    def write(self, oprot):
        if oprot._fast_encode is not None and self.thrift_spec is not None:
            oprot.trans.write(oprot._fast_encode(self, (self.__class__, self.thrift_spec)))
            return
        oprot.writeStructBegin('updateApplicationInterface_result')
        if self.success is not None:
            oprot.writeFieldBegin('success', TType.BOOL, 0)
            oprot.writeBool(self.success)
            oprot.writeFieldEnd()
        if self.ire is not None:
            oprot.writeFieldBegin('ire', TType.STRUCT, 1)
            self.ire.write(oprot)
            oprot.writeFieldEnd()
        if self.ace is not None:
            oprot.writeFieldBegin('ace', TType.STRUCT, 2)
            self.ace.write(oprot)
            oprot.writeFieldEnd()
        if self.ase is not None:
            oprot.writeFieldBegin('ase', TType.STRUCT, 3)
            self.ase.write(oprot)
            oprot.writeFieldEnd()
        if self.ae is not None:
            oprot.writeFieldBegin('ae', TType.STRUCT, 4)
            self.ae.write(oprot)
            oprot.writeFieldEnd()
        oprot.writeFieldStop()
        oprot.writeStructEnd()

    def validate(self):
        return

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

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

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


class deleteApplicationInterface_args(object):
    """
    Attributes:
     - authzToken
     - appInterfaceId
    """

    thrift_spec = (
        None,  # 0
        (1, TType.STRUCT, 'authzToken', (apache.airavata.model.security.ttypes.AuthzToken, apache.airavata.model.security.ttypes.AuthzToken.thrift_spec), None, ),  # 1
        (2, TType.STRING, 'appInterfaceId', 'UTF8', None, ),  # 2
    )

    def __init__(self, authzToken=None, appInterfaceId=None,):
        self.authzToken = authzToken
        self.appInterfaceId = appInterfaceId

    def read(self, iprot):
        if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None:
            iprot._fast_decode(self, iprot, (self.__class__, self.thrift_spec))
            return
        iprot.readStructBegin()
        while True:
            (fname, ftype, fid) = iprot.readFieldBegin()
            if ftype == TType.STOP:
                break
            if fid == 1:
                if ftype == TType.STRUCT:
                    self.authzToken = apache.airavata.model.security.ttypes.AuthzToken()
                    self.authzToken.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 2:
                if ftype == TType.STRING:
                    self.appInterfaceId = iprot.readString().decode('utf-8') if sys.version_info[0] == 2 else iprot.readString()
                else:
                    iprot.skip(ftype)
            else:
                iprot.skip(ftype)
            iprot.readFieldEnd()
        iprot.readStructEnd()

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

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

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

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

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


class deleteApplicationInterface_result(object):
    """
    Attributes:
     - success
     - ire
     - ace
     - ase
     - ae
    """

    thrift_spec = (
        (0, TType.BOOL, 'success', None, None, ),  # 0
        (1, TType.STRUCT, 'ire', (apache.airavata.api.error.ttypes.InvalidRequestException, apache.airavata.api.error.ttypes.InvalidRequestException.thrift_spec), None, ),  # 1
        (2, TType.STRUCT, 'ace', (apache.airavata.api.error.ttypes.AiravataClientException, apache.airavata.api.error.ttypes.AiravataClientException.thrift_spec), None, ),  # 2
        (3, TType.STRUCT, 'ase', (apache.airavata.api.error.ttypes.AiravataSystemException, apache.airavata.api.error.ttypes.AiravataSystemException.thrift_spec), None, ),  # 3
        (4, TType.STRUCT, 'ae', (apache.airavata.api.error.ttypes.AuthorizationException, apache.airavata.api.error.ttypes.AuthorizationException.thrift_spec), None, ),  # 4
    )

    def __init__(self, success=None, ire=None, ace=None, ase=None, ae=None,):
        self.success = success
        self.ire = ire
        self.ace = ace
        self.ase = ase
        self.ae = ae

    def read(self, iprot):
        if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None:
            iprot._fast_decode(self, iprot, (self.__class__, self.thrift_spec))
            return
        iprot.readStructBegin()
        while True:
            (fname, ftype, fid) = iprot.readFieldBegin()
            if ftype == TType.STOP:
                break
            if fid == 0:
                if ftype == TType.BOOL:
                    self.success = iprot.readBool()
                else:
                    iprot.skip(ftype)
            elif fid == 1:
                if ftype == TType.STRUCT:
                    self.ire = apache.airavata.api.error.ttypes.InvalidRequestException()
                    self.ire.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 2:
                if ftype == TType.STRUCT:
                    self.ace = apache.airavata.api.error.ttypes.AiravataClientException()
                    self.ace.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 3:
                if ftype == TType.STRUCT:
                    self.ase = apache.airavata.api.error.ttypes.AiravataSystemException()
                    self.ase.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 4:
                if ftype == TType.STRUCT:
                    self.ae = apache.airavata.api.error.ttypes.AuthorizationException()
                    self.ae.read(iprot)
                else:
                    iprot.skip(ftype)
            else:
                iprot.skip(ftype)
            iprot.readFieldEnd()
        iprot.readStructEnd()

    def write(self, oprot):
        if oprot._fast_encode is not None and self.thrift_spec is not None:
            oprot.trans.write(oprot._fast_encode(self, (self.__class__, self.thrift_spec)))
            return
        oprot.writeStructBegin('deleteApplicationInterface_result')
        if self.success is not None:
            oprot.writeFieldBegin('success', TType.BOOL, 0)
            oprot.writeBool(self.success)
            oprot.writeFieldEnd()
        if self.ire is not None:
            oprot.writeFieldBegin('ire', TType.STRUCT, 1)
            self.ire.write(oprot)
            oprot.writeFieldEnd()
        if self.ace is not None:
            oprot.writeFieldBegin('ace', TType.STRUCT, 2)
            self.ace.write(oprot)
            oprot.writeFieldEnd()
        if self.ase is not None:
            oprot.writeFieldBegin('ase', TType.STRUCT, 3)
            self.ase.write(oprot)
            oprot.writeFieldEnd()
        if self.ae is not None:
            oprot.writeFieldBegin('ae', TType.STRUCT, 4)
            self.ae.write(oprot)
            oprot.writeFieldEnd()
        oprot.writeFieldStop()
        oprot.writeStructEnd()

    def validate(self):
        return

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

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

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


class getAllApplicationInterfaceNames_args(object):
    """
    Attributes:
     - authzToken
     - gatewayId
    """

    thrift_spec = (
        None,  # 0
        (1, TType.STRUCT, 'authzToken', (apache.airavata.model.security.ttypes.AuthzToken, apache.airavata.model.security.ttypes.AuthzToken.thrift_spec), None, ),  # 1
        (2, TType.STRING, 'gatewayId', 'UTF8', None, ),  # 2
    )

    def __init__(self, authzToken=None, gatewayId=None,):
        self.authzToken = authzToken
        self.gatewayId = gatewayId

    def read(self, iprot):
        if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None:
            iprot._fast_decode(self, iprot, (self.__class__, self.thrift_spec))
            return
        iprot.readStructBegin()
        while True:
            (fname, ftype, fid) = iprot.readFieldBegin()
            if ftype == TType.STOP:
                break
            if fid == 1:
                if ftype == TType.STRUCT:
                    self.authzToken = apache.airavata.model.security.ttypes.AuthzToken()
                    self.authzToken.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 2:
                if ftype == TType.STRING:
                    self.gatewayId = iprot.readString().decode('utf-8') if sys.version_info[0] == 2 else iprot.readString()
                else:
                    iprot.skip(ftype)
            else:
                iprot.skip(ftype)
            iprot.readFieldEnd()
        iprot.readStructEnd()

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

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

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

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

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


class getAllApplicationInterfaceNames_result(object):
    """
    Attributes:
     - success
     - ire
     - ace
     - ase
     - ae
    """

    thrift_spec = (
        (0, TType.MAP, 'success', (TType.STRING, 'UTF8', TType.STRING, 'UTF8', False), None, ),  # 0
        (1, TType.STRUCT, 'ire', (apache.airavata.api.error.ttypes.InvalidRequestException, apache.airavata.api.error.ttypes.InvalidRequestException.thrift_spec), None, ),  # 1
        (2, TType.STRUCT, 'ace', (apache.airavata.api.error.ttypes.AiravataClientException, apache.airavata.api.error.ttypes.AiravataClientException.thrift_spec), None, ),  # 2
        (3, TType.STRUCT, 'ase', (apache.airavata.api.error.ttypes.AiravataSystemException, apache.airavata.api.error.ttypes.AiravataSystemException.thrift_spec), None, ),  # 3
        (4, TType.STRUCT, 'ae', (apache.airavata.api.error.ttypes.AuthorizationException, apache.airavata.api.error.ttypes.AuthorizationException.thrift_spec), None, ),  # 4
    )

    def __init__(self, success=None, ire=None, ace=None, ase=None, ae=None,):
        self.success = success
        self.ire = ire
        self.ace = ace
        self.ase = ase
        self.ae = ae

    def read(self, iprot):
        if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None:
            iprot._fast_decode(self, iprot, (self.__class__, self.thrift_spec))
            return
        iprot.readStructBegin()
        while True:
            (fname, ftype, fid) = iprot.readFieldBegin()
            if ftype == TType.STOP:
                break
            if fid == 0:
                if ftype == TType.MAP:
                    self.success = {}
                    (_ktype158, _vtype159, _size157) = iprot.readMapBegin()
                    for _i161 in range(_size157):
                        _key162 = iprot.readString().decode('utf-8') if sys.version_info[0] == 2 else iprot.readString()
                        _val163 = iprot.readString().decode('utf-8') if sys.version_info[0] == 2 else iprot.readString()
                        self.success[_key162] = _val163
                    iprot.readMapEnd()
                else:
                    iprot.skip(ftype)
            elif fid == 1:
                if ftype == TType.STRUCT:
                    self.ire = apache.airavata.api.error.ttypes.InvalidRequestException()
                    self.ire.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 2:
                if ftype == TType.STRUCT:
                    self.ace = apache.airavata.api.error.ttypes.AiravataClientException()
                    self.ace.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 3:
                if ftype == TType.STRUCT:
                    self.ase = apache.airavata.api.error.ttypes.AiravataSystemException()
                    self.ase.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 4:
                if ftype == TType.STRUCT:
                    self.ae = apache.airavata.api.error.ttypes.AuthorizationException()
                    self.ae.read(iprot)
                else:
                    iprot.skip(ftype)
            else:
                iprot.skip(ftype)
            iprot.readFieldEnd()
        iprot.readStructEnd()

    def write(self, oprot):
        if oprot._fast_encode is not None and self.thrift_spec is not None:
            oprot.trans.write(oprot._fast_encode(self, (self.__class__, self.thrift_spec)))
            return
        oprot.writeStructBegin('getAllApplicationInterfaceNames_result')
        if self.success is not None:
            oprot.writeFieldBegin('success', TType.MAP, 0)
            oprot.writeMapBegin(TType.STRING, TType.STRING, len(self.success))
            for kiter164, viter165 in self.success.items():
                oprot.writeString(kiter164.encode('utf-8') if sys.version_info[0] == 2 else kiter164)
                oprot.writeString(viter165.encode('utf-8') if sys.version_info[0] == 2 else viter165)
            oprot.writeMapEnd()
            oprot.writeFieldEnd()
        if self.ire is not None:
            oprot.writeFieldBegin('ire', TType.STRUCT, 1)
            self.ire.write(oprot)
            oprot.writeFieldEnd()
        if self.ace is not None:
            oprot.writeFieldBegin('ace', TType.STRUCT, 2)
            self.ace.write(oprot)
            oprot.writeFieldEnd()
        if self.ase is not None:
            oprot.writeFieldBegin('ase', TType.STRUCT, 3)
            self.ase.write(oprot)
            oprot.writeFieldEnd()
        if self.ae is not None:
            oprot.writeFieldBegin('ae', TType.STRUCT, 4)
            self.ae.write(oprot)
            oprot.writeFieldEnd()
        oprot.writeFieldStop()
        oprot.writeStructEnd()

    def validate(self):
        return

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

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

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


class getAllApplicationInterfaces_args(object):
    """
    Attributes:
     - authzToken
     - gatewayId
    """

    thrift_spec = (
        None,  # 0
        (1, TType.STRUCT, 'authzToken', (apache.airavata.model.security.ttypes.AuthzToken, apache.airavata.model.security.ttypes.AuthzToken.thrift_spec), None, ),  # 1
        (2, TType.STRING, 'gatewayId', 'UTF8', None, ),  # 2
    )

    def __init__(self, authzToken=None, gatewayId=None,):
        self.authzToken = authzToken
        self.gatewayId = gatewayId

    def read(self, iprot):
        if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None:
            iprot._fast_decode(self, iprot, (self.__class__, self.thrift_spec))
            return
        iprot.readStructBegin()
        while True:
            (fname, ftype, fid) = iprot.readFieldBegin()
            if ftype == TType.STOP:
                break
            if fid == 1:
                if ftype == TType.STRUCT:
                    self.authzToken = apache.airavata.model.security.ttypes.AuthzToken()
                    self.authzToken.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 2:
                if ftype == TType.STRING:
                    self.gatewayId = iprot.readString().decode('utf-8') if sys.version_info[0] == 2 else iprot.readString()
                else:
                    iprot.skip(ftype)
            else:
                iprot.skip(ftype)
            iprot.readFieldEnd()
        iprot.readStructEnd()

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

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

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

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

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


class getAllApplicationInterfaces_result(object):
    """
    Attributes:
     - success
     - ire
     - ace
     - ase
     - ae
    """

    thrift_spec = (
        (0, TType.LIST, 'success', (TType.STRUCT, (apache.airavata.model.appcatalog.appinterface.ttypes.ApplicationInterfaceDescription, apache.airavata.model.appcatalog.appinterface.ttypes.ApplicationInterfaceDescription.thrift_spec), False), None, ),  # 0
        (1, TType.STRUCT, 'ire', (apache.airavata.api.error.ttypes.InvalidRequestException, apache.airavata.api.error.ttypes.InvalidRequestException.thrift_spec), None, ),  # 1
        (2, TType.STRUCT, 'ace', (apache.airavata.api.error.ttypes.AiravataClientException, apache.airavata.api.error.ttypes.AiravataClientException.thrift_spec), None, ),  # 2
        (3, TType.STRUCT, 'ase', (apache.airavata.api.error.ttypes.AiravataSystemException, apache.airavata.api.error.ttypes.AiravataSystemException.thrift_spec), None, ),  # 3
        (4, TType.STRUCT, 'ae', (apache.airavata.api.error.ttypes.AuthorizationException, apache.airavata.api.error.ttypes.AuthorizationException.thrift_spec), None, ),  # 4
    )

    def __init__(self, success=None, ire=None, ace=None, ase=None, ae=None,):
        self.success = success
        self.ire = ire
        self.ace = ace
        self.ase = ase
        self.ae = ae

    def read(self, iprot):
        if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None:
            iprot._fast_decode(self, iprot, (self.__class__, self.thrift_spec))
            return
        iprot.readStructBegin()
        while True:
            (fname, ftype, fid) = iprot.readFieldBegin()
            if ftype == TType.STOP:
                break
            if fid == 0:
                if ftype == TType.LIST:
                    self.success = []
                    (_etype169, _size166) = iprot.readListBegin()
                    for _i170 in range(_size166):
                        _elem171 = apache.airavata.model.appcatalog.appinterface.ttypes.ApplicationInterfaceDescription()
                        _elem171.read(iprot)
                        self.success.append(_elem171)
                    iprot.readListEnd()
                else:
                    iprot.skip(ftype)
            elif fid == 1:
                if ftype == TType.STRUCT:
                    self.ire = apache.airavata.api.error.ttypes.InvalidRequestException()
                    self.ire.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 2:
                if ftype == TType.STRUCT:
                    self.ace = apache.airavata.api.error.ttypes.AiravataClientException()
                    self.ace.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 3:
                if ftype == TType.STRUCT:
                    self.ase = apache.airavata.api.error.ttypes.AiravataSystemException()
                    self.ase.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 4:
                if ftype == TType.STRUCT:
                    self.ae = apache.airavata.api.error.ttypes.AuthorizationException()
                    self.ae.read(iprot)
                else:
                    iprot.skip(ftype)
            else:
                iprot.skip(ftype)
            iprot.readFieldEnd()
        iprot.readStructEnd()

    def write(self, oprot):
        if oprot._fast_encode is not None and self.thrift_spec is not None:
            oprot.trans.write(oprot._fast_encode(self, (self.__class__, self.thrift_spec)))
            return
        oprot.writeStructBegin('getAllApplicationInterfaces_result')
        if self.success is not None:
            oprot.writeFieldBegin('success', TType.LIST, 0)
            oprot.writeListBegin(TType.STRUCT, len(self.success))
            for iter172 in self.success:
                iter172.write(oprot)
            oprot.writeListEnd()
            oprot.writeFieldEnd()
        if self.ire is not None:
            oprot.writeFieldBegin('ire', TType.STRUCT, 1)
            self.ire.write(oprot)
            oprot.writeFieldEnd()
        if self.ace is not None:
            oprot.writeFieldBegin('ace', TType.STRUCT, 2)
            self.ace.write(oprot)
            oprot.writeFieldEnd()
        if self.ase is not None:
            oprot.writeFieldBegin('ase', TType.STRUCT, 3)
            self.ase.write(oprot)
            oprot.writeFieldEnd()
        if self.ae is not None:
            oprot.writeFieldBegin('ae', TType.STRUCT, 4)
            self.ae.write(oprot)
            oprot.writeFieldEnd()
        oprot.writeFieldStop()
        oprot.writeStructEnd()

    def validate(self):
        return

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

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

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


class getApplicationInputs_args(object):
    """
    Attributes:
     - authzToken
     - appInterfaceId
    """

    thrift_spec = (
        None,  # 0
        (1, TType.STRUCT, 'authzToken', (apache.airavata.model.security.ttypes.AuthzToken, apache.airavata.model.security.ttypes.AuthzToken.thrift_spec), None, ),  # 1
        (2, TType.STRING, 'appInterfaceId', 'UTF8', None, ),  # 2
    )

    def __init__(self, authzToken=None, appInterfaceId=None,):
        self.authzToken = authzToken
        self.appInterfaceId = appInterfaceId

    def read(self, iprot):
        if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None:
            iprot._fast_decode(self, iprot, (self.__class__, self.thrift_spec))
            return
        iprot.readStructBegin()
        while True:
            (fname, ftype, fid) = iprot.readFieldBegin()
            if ftype == TType.STOP:
                break
            if fid == 1:
                if ftype == TType.STRUCT:
                    self.authzToken = apache.airavata.model.security.ttypes.AuthzToken()
                    self.authzToken.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 2:
                if ftype == TType.STRING:
                    self.appInterfaceId = iprot.readString().decode('utf-8') if sys.version_info[0] == 2 else iprot.readString()
                else:
                    iprot.skip(ftype)
            else:
                iprot.skip(ftype)
            iprot.readFieldEnd()
        iprot.readStructEnd()

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

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

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

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

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


class getApplicationInputs_result(object):
    """
    Attributes:
     - success
     - ire
     - ace
     - ase
     - ae
    """

    thrift_spec = (
        (0, TType.LIST, 'success', (TType.STRUCT, (apache.airavata.model.application.io.ttypes.InputDataObjectType, apache.airavata.model.application.io.ttypes.InputDataObjectType.thrift_spec), False), None, ),  # 0
        (1, TType.STRUCT, 'ire', (apache.airavata.api.error.ttypes.InvalidRequestException, apache.airavata.api.error.ttypes.InvalidRequestException.thrift_spec), None, ),  # 1
        (2, TType.STRUCT, 'ace', (apache.airavata.api.error.ttypes.AiravataClientException, apache.airavata.api.error.ttypes.AiravataClientException.thrift_spec), None, ),  # 2
        (3, TType.STRUCT, 'ase', (apache.airavata.api.error.ttypes.AiravataSystemException, apache.airavata.api.error.ttypes.AiravataSystemException.thrift_spec), None, ),  # 3
        (4, TType.STRUCT, 'ae', (apache.airavata.api.error.ttypes.AuthorizationException, apache.airavata.api.error.ttypes.AuthorizationException.thrift_spec), None, ),  # 4
    )

    def __init__(self, success=None, ire=None, ace=None, ase=None, ae=None,):
        self.success = success
        self.ire = ire
        self.ace = ace
        self.ase = ase
        self.ae = ae

    def read(self, iprot):
        if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None:
            iprot._fast_decode(self, iprot, (self.__class__, self.thrift_spec))
            return
        iprot.readStructBegin()
        while True:
            (fname, ftype, fid) = iprot.readFieldBegin()
            if ftype == TType.STOP:
                break
            if fid == 0:
                if ftype == TType.LIST:
                    self.success = []
                    (_etype176, _size173) = iprot.readListBegin()
                    for _i177 in range(_size173):
                        _elem178 = apache.airavata.model.application.io.ttypes.InputDataObjectType()
                        _elem178.read(iprot)
                        self.success.append(_elem178)
                    iprot.readListEnd()
                else:
                    iprot.skip(ftype)
            elif fid == 1:
                if ftype == TType.STRUCT:
                    self.ire = apache.airavata.api.error.ttypes.InvalidRequestException()
                    self.ire.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 2:
                if ftype == TType.STRUCT:
                    self.ace = apache.airavata.api.error.ttypes.AiravataClientException()
                    self.ace.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 3:
                if ftype == TType.STRUCT:
                    self.ase = apache.airavata.api.error.ttypes.AiravataSystemException()
                    self.ase.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 4:
                if ftype == TType.STRUCT:
                    self.ae = apache.airavata.api.error.ttypes.AuthorizationException()
                    self.ae.read(iprot)
                else:
                    iprot.skip(ftype)
            else:
                iprot.skip(ftype)
            iprot.readFieldEnd()
        iprot.readStructEnd()

    def write(self, oprot):
        if oprot._fast_encode is not None and self.thrift_spec is not None:
            oprot.trans.write(oprot._fast_encode(self, (self.__class__, self.thrift_spec)))
            return
        oprot.writeStructBegin('getApplicationInputs_result')
        if self.success is not None:
            oprot.writeFieldBegin('success', TType.LIST, 0)
            oprot.writeListBegin(TType.STRUCT, len(self.success))
            for iter179 in self.success:
                iter179.write(oprot)
            oprot.writeListEnd()
            oprot.writeFieldEnd()
        if self.ire is not None:
            oprot.writeFieldBegin('ire', TType.STRUCT, 1)
            self.ire.write(oprot)
            oprot.writeFieldEnd()
        if self.ace is not None:
            oprot.writeFieldBegin('ace', TType.STRUCT, 2)
            self.ace.write(oprot)
            oprot.writeFieldEnd()
        if self.ase is not None:
            oprot.writeFieldBegin('ase', TType.STRUCT, 3)
            self.ase.write(oprot)
            oprot.writeFieldEnd()
        if self.ae is not None:
            oprot.writeFieldBegin('ae', TType.STRUCT, 4)
            self.ae.write(oprot)
            oprot.writeFieldEnd()
        oprot.writeFieldStop()
        oprot.writeStructEnd()

    def validate(self):
        return

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

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

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


class getApplicationOutputs_args(object):
    """
    Attributes:
     - authzToken
     - appInterfaceId
    """

    thrift_spec = (
        None,  # 0
        (1, TType.STRUCT, 'authzToken', (apache.airavata.model.security.ttypes.AuthzToken, apache.airavata.model.security.ttypes.AuthzToken.thrift_spec), None, ),  # 1
        (2, TType.STRING, 'appInterfaceId', 'UTF8', None, ),  # 2
    )

    def __init__(self, authzToken=None, appInterfaceId=None,):
        self.authzToken = authzToken
        self.appInterfaceId = appInterfaceId

    def read(self, iprot):
        if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None:
            iprot._fast_decode(self, iprot, (self.__class__, self.thrift_spec))
            return
        iprot.readStructBegin()
        while True:
            (fname, ftype, fid) = iprot.readFieldBegin()
            if ftype == TType.STOP:
                break
            if fid == 1:
                if ftype == TType.STRUCT:
                    self.authzToken = apache.airavata.model.security.ttypes.AuthzToken()
                    self.authzToken.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 2:
                if ftype == TType.STRING:
                    self.appInterfaceId = iprot.readString().decode('utf-8') if sys.version_info[0] == 2 else iprot.readString()
                else:
                    iprot.skip(ftype)
            else:
                iprot.skip(ftype)
            iprot.readFieldEnd()
        iprot.readStructEnd()

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

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

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

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

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


class getApplicationOutputs_result(object):
    """
    Attributes:
     - success
     - ire
     - ace
     - ase
     - ae
    """

    thrift_spec = (
        (0, TType.LIST, 'success', (TType.STRUCT, (apache.airavata.model.application.io.ttypes.OutputDataObjectType, apache.airavata.model.application.io.ttypes.OutputDataObjectType.thrift_spec), False), None, ),  # 0
        (1, TType.STRUCT, 'ire', (apache.airavata.api.error.ttypes.InvalidRequestException, apache.airavata.api.error.ttypes.InvalidRequestException.thrift_spec), None, ),  # 1
        (2, TType.STRUCT, 'ace', (apache.airavata.api.error.ttypes.AiravataClientException, apache.airavata.api.error.ttypes.AiravataClientException.thrift_spec), None, ),  # 2
        (3, TType.STRUCT, 'ase', (apache.airavata.api.error.ttypes.AiravataSystemException, apache.airavata.api.error.ttypes.AiravataSystemException.thrift_spec), None, ),  # 3
        (4, TType.STRUCT, 'ae', (apache.airavata.api.error.ttypes.AuthorizationException, apache.airavata.api.error.ttypes.AuthorizationException.thrift_spec), None, ),  # 4
    )

    def __init__(self, success=None, ire=None, ace=None, ase=None, ae=None,):
        self.success = success
        self.ire = ire
        self.ace = ace
        self.ase = ase
        self.ae = ae

    def read(self, iprot):
        if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None:
            iprot._fast_decode(self, iprot, (self.__class__, self.thrift_spec))
            return
        iprot.readStructBegin()
        while True:
            (fname, ftype, fid) = iprot.readFieldBegin()
            if ftype == TType.STOP:
                break
            if fid == 0:
                if ftype == TType.LIST:
                    self.success = []
                    (_etype183, _size180) = iprot.readListBegin()
                    for _i184 in range(_size180):
                        _elem185 = apache.airavata.model.application.io.ttypes.OutputDataObjectType()
                        _elem185.read(iprot)
                        self.success.append(_elem185)
                    iprot.readListEnd()
                else:
                    iprot.skip(ftype)
            elif fid == 1:
                if ftype == TType.STRUCT:
                    self.ire = apache.airavata.api.error.ttypes.InvalidRequestException()
                    self.ire.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 2:
                if ftype == TType.STRUCT:
                    self.ace = apache.airavata.api.error.ttypes.AiravataClientException()
                    self.ace.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 3:
                if ftype == TType.STRUCT:
                    self.ase = apache.airavata.api.error.ttypes.AiravataSystemException()
                    self.ase.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 4:
                if ftype == TType.STRUCT:
                    self.ae = apache.airavata.api.error.ttypes.AuthorizationException()
                    self.ae.read(iprot)
                else:
                    iprot.skip(ftype)
            else:
                iprot.skip(ftype)
            iprot.readFieldEnd()
        iprot.readStructEnd()

    def write(self, oprot):
        if oprot._fast_encode is not None and self.thrift_spec is not None:
            oprot.trans.write(oprot._fast_encode(self, (self.__class__, self.thrift_spec)))
            return
        oprot.writeStructBegin('getApplicationOutputs_result')
        if self.success is not None:
            oprot.writeFieldBegin('success', TType.LIST, 0)
            oprot.writeListBegin(TType.STRUCT, len(self.success))
            for iter186 in self.success:
                iter186.write(oprot)
            oprot.writeListEnd()
            oprot.writeFieldEnd()
        if self.ire is not None:
            oprot.writeFieldBegin('ire', TType.STRUCT, 1)
            self.ire.write(oprot)
            oprot.writeFieldEnd()
        if self.ace is not None:
            oprot.writeFieldBegin('ace', TType.STRUCT, 2)
            self.ace.write(oprot)
            oprot.writeFieldEnd()
        if self.ase is not None:
            oprot.writeFieldBegin('ase', TType.STRUCT, 3)
            self.ase.write(oprot)
            oprot.writeFieldEnd()
        if self.ae is not None:
            oprot.writeFieldBegin('ae', TType.STRUCT, 4)
            self.ae.write(oprot)
            oprot.writeFieldEnd()
        oprot.writeFieldStop()
        oprot.writeStructEnd()

    def validate(self):
        return

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

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

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


class getAvailableAppInterfaceComputeResources_args(object):
    """
    Attributes:
     - authzToken
     - appInterfaceId
    """

    thrift_spec = (
        None,  # 0
        (1, TType.STRUCT, 'authzToken', (apache.airavata.model.security.ttypes.AuthzToken, apache.airavata.model.security.ttypes.AuthzToken.thrift_spec), None, ),  # 1
        (2, TType.STRING, 'appInterfaceId', 'UTF8', None, ),  # 2
    )

    def __init__(self, authzToken=None, appInterfaceId=None,):
        self.authzToken = authzToken
        self.appInterfaceId = appInterfaceId

    def read(self, iprot):
        if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None:
            iprot._fast_decode(self, iprot, (self.__class__, self.thrift_spec))
            return
        iprot.readStructBegin()
        while True:
            (fname, ftype, fid) = iprot.readFieldBegin()
            if ftype == TType.STOP:
                break
            if fid == 1:
                if ftype == TType.STRUCT:
                    self.authzToken = apache.airavata.model.security.ttypes.AuthzToken()
                    self.authzToken.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 2:
                if ftype == TType.STRING:
                    self.appInterfaceId = iprot.readString().decode('utf-8') if sys.version_info[0] == 2 else iprot.readString()
                else:
                    iprot.skip(ftype)
            else:
                iprot.skip(ftype)
            iprot.readFieldEnd()
        iprot.readStructEnd()

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

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

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

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

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


class getAvailableAppInterfaceComputeResources_result(object):
    """
    Attributes:
     - success
     - ire
     - ace
     - ase
     - ae
    """

    thrift_spec = (
        (0, TType.MAP, 'success', (TType.STRING, 'UTF8', TType.STRING, 'UTF8', False), None, ),  # 0
        (1, TType.STRUCT, 'ire', (apache.airavata.api.error.ttypes.InvalidRequestException, apache.airavata.api.error.ttypes.InvalidRequestException.thrift_spec), None, ),  # 1
        (2, TType.STRUCT, 'ace', (apache.airavata.api.error.ttypes.AiravataClientException, apache.airavata.api.error.ttypes.AiravataClientException.thrift_spec), None, ),  # 2
        (3, TType.STRUCT, 'ase', (apache.airavata.api.error.ttypes.AiravataSystemException, apache.airavata.api.error.ttypes.AiravataSystemException.thrift_spec), None, ),  # 3
        (4, TType.STRUCT, 'ae', (apache.airavata.api.error.ttypes.AuthorizationException, apache.airavata.api.error.ttypes.AuthorizationException.thrift_spec), None, ),  # 4
    )

    def __init__(self, success=None, ire=None, ace=None, ase=None, ae=None,):
        self.success = success
        self.ire = ire
        self.ace = ace
        self.ase = ase
        self.ae = ae

    def read(self, iprot):
        if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None:
            iprot._fast_decode(self, iprot, (self.__class__, self.thrift_spec))
            return
        iprot.readStructBegin()
        while True:
            (fname, ftype, fid) = iprot.readFieldBegin()
            if ftype == TType.STOP:
                break
            if fid == 0:
                if ftype == TType.MAP:
                    self.success = {}
                    (_ktype188, _vtype189, _size187) = iprot.readMapBegin()
                    for _i191 in range(_size187):
                        _key192 = iprot.readString().decode('utf-8') if sys.version_info[0] == 2 else iprot.readString()
                        _val193 = iprot.readString().decode('utf-8') if sys.version_info[0] == 2 else iprot.readString()
                        self.success[_key192] = _val193
                    iprot.readMapEnd()
                else:
                    iprot.skip(ftype)
            elif fid == 1:
                if ftype == TType.STRUCT:
                    self.ire = apache.airavata.api.error.ttypes.InvalidRequestException()
                    self.ire.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 2:
                if ftype == TType.STRUCT:
                    self.ace = apache.airavata.api.error.ttypes.AiravataClientException()
                    self.ace.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 3:
                if ftype == TType.STRUCT:
                    self.ase = apache.airavata.api.error.ttypes.AiravataSystemException()
                    self.ase.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 4:
                if ftype == TType.STRUCT:
                    self.ae = apache.airavata.api.error.ttypes.AuthorizationException()
                    self.ae.read(iprot)
                else:
                    iprot.skip(ftype)
            else:
                iprot.skip(ftype)
            iprot.readFieldEnd()
        iprot.readStructEnd()

    def write(self, oprot):
        if oprot._fast_encode is not None and self.thrift_spec is not None:
            oprot.trans.write(oprot._fast_encode(self, (self.__class__, self.thrift_spec)))
            return
        oprot.writeStructBegin('getAvailableAppInterfaceComputeResources_result')
        if self.success is not None:
            oprot.writeFieldBegin('success', TType.MAP, 0)
            oprot.writeMapBegin(TType.STRING, TType.STRING, len(self.success))
            for kiter194, viter195 in self.success.items():
                oprot.writeString(kiter194.encode('utf-8') if sys.version_info[0] == 2 else kiter194)
                oprot.writeString(viter195.encode('utf-8') if sys.version_info[0] == 2 else viter195)
            oprot.writeMapEnd()
            oprot.writeFieldEnd()
        if self.ire is not None:
            oprot.writeFieldBegin('ire', TType.STRUCT, 1)
            self.ire.write(oprot)
            oprot.writeFieldEnd()
        if self.ace is not None:
            oprot.writeFieldBegin('ace', TType.STRUCT, 2)
            self.ace.write(oprot)
            oprot.writeFieldEnd()
        if self.ase is not None:
            oprot.writeFieldBegin('ase', TType.STRUCT, 3)
            self.ase.write(oprot)
            oprot.writeFieldEnd()
        if self.ae is not None:
            oprot.writeFieldBegin('ae', TType.STRUCT, 4)
            self.ae.write(oprot)
            oprot.writeFieldEnd()
        oprot.writeFieldStop()
        oprot.writeStructEnd()

    def validate(self):
        return

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

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

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


class registerComputeResource_args(object):
    """
    Attributes:
     - authzToken
     - computeResourceDescription
    """

    thrift_spec = (
        None,  # 0
        (1, TType.STRUCT, 'authzToken', (apache.airavata.model.security.ttypes.AuthzToken, apache.airavata.model.security.ttypes.AuthzToken.thrift_spec), None, ),  # 1
        (2, TType.STRUCT, 'computeResourceDescription', (apache.airavata.model.appcatalog.computeresource.ttypes.ComputeResourceDescription, apache.airavata.model.appcatalog.computeresource.ttypes.ComputeResourceDescription.thrift_spec), None, ),  # 2
    )

    def __init__(self, authzToken=None, computeResourceDescription=None,):
        self.authzToken = authzToken
        self.computeResourceDescription = computeResourceDescription

    def read(self, iprot):
        if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None:
            iprot._fast_decode(self, iprot, (self.__class__, self.thrift_spec))
            return
        iprot.readStructBegin()
        while True:
            (fname, ftype, fid) = iprot.readFieldBegin()
            if ftype == TType.STOP:
                break
            if fid == 1:
                if ftype == TType.STRUCT:
                    self.authzToken = apache.airavata.model.security.ttypes.AuthzToken()
                    self.authzToken.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 2:
                if ftype == TType.STRUCT:
                    self.computeResourceDescription = apache.airavata.model.appcatalog.computeresource.ttypes.ComputeResourceDescription()
                    self.computeResourceDescription.read(iprot)
                else:
                    iprot.skip(ftype)
            else:
                iprot.skip(ftype)
            iprot.readFieldEnd()
        iprot.readStructEnd()

    def write(self, oprot):
        if oprot._fast_encode is not None and self.thrift_spec is not None:
            oprot.trans.write(oprot._fast_encode(self, (self.__class__, self.thrift_spec)))
            return
        oprot.writeStructBegin('registerComputeResource_args')
        if self.authzToken is not None:
            oprot.writeFieldBegin('authzToken', TType.STRUCT, 1)
            self.authzToken.write(oprot)
            oprot.writeFieldEnd()
        if self.computeResourceDescription is not None:
            oprot.writeFieldBegin('computeResourceDescription', TType.STRUCT, 2)
            self.computeResourceDescription.write(oprot)
            oprot.writeFieldEnd()
        oprot.writeFieldStop()
        oprot.writeStructEnd()

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

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

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

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


class registerComputeResource_result(object):
    """
    Attributes:
     - success
     - ire
     - ace
     - ase
     - ae
    """

    thrift_spec = (
        (0, TType.STRING, 'success', 'UTF8', None, ),  # 0
        (1, TType.STRUCT, 'ire', (apache.airavata.api.error.ttypes.InvalidRequestException, apache.airavata.api.error.ttypes.InvalidRequestException.thrift_spec), None, ),  # 1
        (2, TType.STRUCT, 'ace', (apache.airavata.api.error.ttypes.AiravataClientException, apache.airavata.api.error.ttypes.AiravataClientException.thrift_spec), None, ),  # 2
        (3, TType.STRUCT, 'ase', (apache.airavata.api.error.ttypes.AiravataSystemException, apache.airavata.api.error.ttypes.AiravataSystemException.thrift_spec), None, ),  # 3
        (4, TType.STRUCT, 'ae', (apache.airavata.api.error.ttypes.AuthorizationException, apache.airavata.api.error.ttypes.AuthorizationException.thrift_spec), None, ),  # 4
    )

    def __init__(self, success=None, ire=None, ace=None, ase=None, ae=None,):
        self.success = success
        self.ire = ire
        self.ace = ace
        self.ase = ase
        self.ae = ae

    def read(self, iprot):
        if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None:
            iprot._fast_decode(self, iprot, (self.__class__, self.thrift_spec))
            return
        iprot.readStructBegin()
        while True:
            (fname, ftype, fid) = iprot.readFieldBegin()
            if ftype == TType.STOP:
                break
            if fid == 0:
                if ftype == TType.STRING:
                    self.success = iprot.readString().decode('utf-8') if sys.version_info[0] == 2 else iprot.readString()
                else:
                    iprot.skip(ftype)
            elif fid == 1:
                if ftype == TType.STRUCT:
                    self.ire = apache.airavata.api.error.ttypes.InvalidRequestException()
                    self.ire.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 2:
                if ftype == TType.STRUCT:
                    self.ace = apache.airavata.api.error.ttypes.AiravataClientException()
                    self.ace.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 3:
                if ftype == TType.STRUCT:
                    self.ase = apache.airavata.api.error.ttypes.AiravataSystemException()
                    self.ase.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 4:
                if ftype == TType.STRUCT:
                    self.ae = apache.airavata.api.error.ttypes.AuthorizationException()
                    self.ae.read(iprot)
                else:
                    iprot.skip(ftype)
            else:
                iprot.skip(ftype)
            iprot.readFieldEnd()
        iprot.readStructEnd()

    def write(self, oprot):
        if oprot._fast_encode is not None and self.thrift_spec is not None:
            oprot.trans.write(oprot._fast_encode(self, (self.__class__, self.thrift_spec)))
            return
        oprot.writeStructBegin('registerComputeResource_result')
        if self.success is not None:
            oprot.writeFieldBegin('success', TType.STRING, 0)
            oprot.writeString(self.success.encode('utf-8') if sys.version_info[0] == 2 else self.success)
            oprot.writeFieldEnd()
        if self.ire is not None:
            oprot.writeFieldBegin('ire', TType.STRUCT, 1)
            self.ire.write(oprot)
            oprot.writeFieldEnd()
        if self.ace is not None:
            oprot.writeFieldBegin('ace', TType.STRUCT, 2)
            self.ace.write(oprot)
            oprot.writeFieldEnd()
        if self.ase is not None:
            oprot.writeFieldBegin('ase', TType.STRUCT, 3)
            self.ase.write(oprot)
            oprot.writeFieldEnd()
        if self.ae is not None:
            oprot.writeFieldBegin('ae', TType.STRUCT, 4)
            self.ae.write(oprot)
            oprot.writeFieldEnd()
        oprot.writeFieldStop()
        oprot.writeStructEnd()

    def validate(self):
        return

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

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

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


class getComputeResource_args(object):
    """
    Attributes:
     - authzToken
     - computeResourceId
    """

    thrift_spec = (
        None,  # 0
        (1, TType.STRUCT, 'authzToken', (apache.airavata.model.security.ttypes.AuthzToken, apache.airavata.model.security.ttypes.AuthzToken.thrift_spec), None, ),  # 1
        (2, TType.STRING, 'computeResourceId', 'UTF8', None, ),  # 2
    )

    def __init__(self, authzToken=None, computeResourceId=None,):
        self.authzToken = authzToken
        self.computeResourceId = computeResourceId

    def read(self, iprot):
        if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None:
            iprot._fast_decode(self, iprot, (self.__class__, self.thrift_spec))
            return
        iprot.readStructBegin()
        while True:
            (fname, ftype, fid) = iprot.readFieldBegin()
            if ftype == TType.STOP:
                break
            if fid == 1:
                if ftype == TType.STRUCT:
                    self.authzToken = apache.airavata.model.security.ttypes.AuthzToken()
                    self.authzToken.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 2:
                if ftype == TType.STRING:
                    self.computeResourceId = iprot.readString().decode('utf-8') if sys.version_info[0] == 2 else iprot.readString()
                else:
                    iprot.skip(ftype)
            else:
                iprot.skip(ftype)
            iprot.readFieldEnd()
        iprot.readStructEnd()

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

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

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

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

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


class getComputeResource_result(object):
    """
    Attributes:
     - success
     - ire
     - ace
     - ase
     - ae
    """

    thrift_spec = (
        (0, TType.STRUCT, 'success', (apache.airavata.model.appcatalog.computeresource.ttypes.ComputeResourceDescription, apache.airavata.model.appcatalog.computeresource.ttypes.ComputeResourceDescription.thrift_spec), None, ),  # 0
        (1, TType.STRUCT, 'ire', (apache.airavata.api.error.ttypes.InvalidRequestException, apache.airavata.api.error.ttypes.InvalidRequestException.thrift_spec), None, ),  # 1
        (2, TType.STRUCT, 'ace', (apache.airavata.api.error.ttypes.AiravataClientException, apache.airavata.api.error.ttypes.AiravataClientException.thrift_spec), None, ),  # 2
        (3, TType.STRUCT, 'ase', (apache.airavata.api.error.ttypes.AiravataSystemException, apache.airavata.api.error.ttypes.AiravataSystemException.thrift_spec), None, ),  # 3
        (4, TType.STRUCT, 'ae', (apache.airavata.api.error.ttypes.AuthorizationException, apache.airavata.api.error.ttypes.AuthorizationException.thrift_spec), None, ),  # 4
    )

    def __init__(self, success=None, ire=None, ace=None, ase=None, ae=None,):
        self.success = success
        self.ire = ire
        self.ace = ace
        self.ase = ase
        self.ae = ae

    def read(self, iprot):
        if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None:
            iprot._fast_decode(self, iprot, (self.__class__, self.thrift_spec))
            return
        iprot.readStructBegin()
        while True:
            (fname, ftype, fid) = iprot.readFieldBegin()
            if ftype == TType.STOP:
                break
            if fid == 0:
                if ftype == TType.STRUCT:
                    self.success = apache.airavata.model.appcatalog.computeresource.ttypes.ComputeResourceDescription()
                    self.success.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 1:
                if ftype == TType.STRUCT:
                    self.ire = apache.airavata.api.error.ttypes.InvalidRequestException()
                    self.ire.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 2:
                if ftype == TType.STRUCT:
                    self.ace = apache.airavata.api.error.ttypes.AiravataClientException()
                    self.ace.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 3:
                if ftype == TType.STRUCT:
                    self.ase = apache.airavata.api.error.ttypes.AiravataSystemException()
                    self.ase.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 4:
                if ftype == TType.STRUCT:
                    self.ae = apache.airavata.api.error.ttypes.AuthorizationException()
                    self.ae.read(iprot)
                else:
                    iprot.skip(ftype)
            else:
                iprot.skip(ftype)
            iprot.readFieldEnd()
        iprot.readStructEnd()

    def write(self, oprot):
        if oprot._fast_encode is not None and self.thrift_spec is not None:
            oprot.trans.write(oprot._fast_encode(self, (self.__class__, self.thrift_spec)))
            return
        oprot.writeStructBegin('getComputeResource_result')
        if self.success is not None:
            oprot.writeFieldBegin('success', TType.STRUCT, 0)
            self.success.write(oprot)
            oprot.writeFieldEnd()
        if self.ire is not None:
            oprot.writeFieldBegin('ire', TType.STRUCT, 1)
            self.ire.write(oprot)
            oprot.writeFieldEnd()
        if self.ace is not None:
            oprot.writeFieldBegin('ace', TType.STRUCT, 2)
            self.ace.write(oprot)
            oprot.writeFieldEnd()
        if self.ase is not None:
            oprot.writeFieldBegin('ase', TType.STRUCT, 3)
            self.ase.write(oprot)
            oprot.writeFieldEnd()
        if self.ae is not None:
            oprot.writeFieldBegin('ae', TType.STRUCT, 4)
            self.ae.write(oprot)
            oprot.writeFieldEnd()
        oprot.writeFieldStop()
        oprot.writeStructEnd()

    def validate(self):
        return

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

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

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


class getAllComputeResourceNames_args(object):
    """
    Attributes:
     - authzToken
    """

    thrift_spec = (
        None,  # 0
        (1, TType.STRUCT, 'authzToken', (apache.airavata.model.security.ttypes.AuthzToken, apache.airavata.model.security.ttypes.AuthzToken.thrift_spec), None, ),  # 1
    )

    def __init__(self, authzToken=None,):
        self.authzToken = authzToken

    def read(self, iprot):
        if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None:
            iprot._fast_decode(self, iprot, (self.__class__, self.thrift_spec))
            return
        iprot.readStructBegin()
        while True:
            (fname, ftype, fid) = iprot.readFieldBegin()
            if ftype == TType.STOP:
                break
            if fid == 1:
                if ftype == TType.STRUCT:
                    self.authzToken = apache.airavata.model.security.ttypes.AuthzToken()
                    self.authzToken.read(iprot)
                else:
                    iprot.skip(ftype)
            else:
                iprot.skip(ftype)
            iprot.readFieldEnd()
        iprot.readStructEnd()

    def write(self, oprot):
        if oprot._fast_encode is not None and self.thrift_spec is not None:
            oprot.trans.write(oprot._fast_encode(self, (self.__class__, self.thrift_spec)))
            return
        oprot.writeStructBegin('getAllComputeResourceNames_args')
        if self.authzToken is not None:
            oprot.writeFieldBegin('authzToken', TType.STRUCT, 1)
            self.authzToken.write(oprot)
            oprot.writeFieldEnd()
        oprot.writeFieldStop()
        oprot.writeStructEnd()

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

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

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

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


class getAllComputeResourceNames_result(object):
    """
    Attributes:
     - success
     - ire
     - ace
     - ase
     - ae
    """

    thrift_spec = (
        (0, TType.MAP, 'success', (TType.STRING, 'UTF8', TType.STRING, 'UTF8', False), None, ),  # 0
        (1, TType.STRUCT, 'ire', (apache.airavata.api.error.ttypes.InvalidRequestException, apache.airavata.api.error.ttypes.InvalidRequestException.thrift_spec), None, ),  # 1
        (2, TType.STRUCT, 'ace', (apache.airavata.api.error.ttypes.AiravataClientException, apache.airavata.api.error.ttypes.AiravataClientException.thrift_spec), None, ),  # 2
        (3, TType.STRUCT, 'ase', (apache.airavata.api.error.ttypes.AiravataSystemException, apache.airavata.api.error.ttypes.AiravataSystemException.thrift_spec), None, ),  # 3
        (4, TType.STRUCT, 'ae', (apache.airavata.api.error.ttypes.AuthorizationException, apache.airavata.api.error.ttypes.AuthorizationException.thrift_spec), None, ),  # 4
    )

    def __init__(self, success=None, ire=None, ace=None, ase=None, ae=None,):
        self.success = success
        self.ire = ire
        self.ace = ace
        self.ase = ase
        self.ae = ae

    def read(self, iprot):
        if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None:
            iprot._fast_decode(self, iprot, (self.__class__, self.thrift_spec))
            return
        iprot.readStructBegin()
        while True:
            (fname, ftype, fid) = iprot.readFieldBegin()
            if ftype == TType.STOP:
                break
            if fid == 0:
                if ftype == TType.MAP:
                    self.success = {}
                    (_ktype197, _vtype198, _size196) = iprot.readMapBegin()
                    for _i200 in range(_size196):
                        _key201 = iprot.readString().decode('utf-8') if sys.version_info[0] == 2 else iprot.readString()
                        _val202 = iprot.readString().decode('utf-8') if sys.version_info[0] == 2 else iprot.readString()
                        self.success[_key201] = _val202
                    iprot.readMapEnd()
                else:
                    iprot.skip(ftype)
            elif fid == 1:
                if ftype == TType.STRUCT:
                    self.ire = apache.airavata.api.error.ttypes.InvalidRequestException()
                    self.ire.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 2:
                if ftype == TType.STRUCT:
                    self.ace = apache.airavata.api.error.ttypes.AiravataClientException()
                    self.ace.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 3:
                if ftype == TType.STRUCT:
                    self.ase = apache.airavata.api.error.ttypes.AiravataSystemException()
                    self.ase.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 4:
                if ftype == TType.STRUCT:
                    self.ae = apache.airavata.api.error.ttypes.AuthorizationException()
                    self.ae.read(iprot)
                else:
                    iprot.skip(ftype)
            else:
                iprot.skip(ftype)
            iprot.readFieldEnd()
        iprot.readStructEnd()

    def write(self, oprot):
        if oprot._fast_encode is not None and self.thrift_spec is not None:
            oprot.trans.write(oprot._fast_encode(self, (self.__class__, self.thrift_spec)))
            return
        oprot.writeStructBegin('getAllComputeResourceNames_result')
        if self.success is not None:
            oprot.writeFieldBegin('success', TType.MAP, 0)
            oprot.writeMapBegin(TType.STRING, TType.STRING, len(self.success))
            for kiter203, viter204 in self.success.items():
                oprot.writeString(kiter203.encode('utf-8') if sys.version_info[0] == 2 else kiter203)
                oprot.writeString(viter204.encode('utf-8') if sys.version_info[0] == 2 else viter204)
            oprot.writeMapEnd()
            oprot.writeFieldEnd()
        if self.ire is not None:
            oprot.writeFieldBegin('ire', TType.STRUCT, 1)
            self.ire.write(oprot)
            oprot.writeFieldEnd()
        if self.ace is not None:
            oprot.writeFieldBegin('ace', TType.STRUCT, 2)
            self.ace.write(oprot)
            oprot.writeFieldEnd()
        if self.ase is not None:
            oprot.writeFieldBegin('ase', TType.STRUCT, 3)
            self.ase.write(oprot)
            oprot.writeFieldEnd()
        if self.ae is not None:
            oprot.writeFieldBegin('ae', TType.STRUCT, 4)
            self.ae.write(oprot)
            oprot.writeFieldEnd()
        oprot.writeFieldStop()
        oprot.writeStructEnd()

    def validate(self):
        return

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

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

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


class updateComputeResource_args(object):
    """
    Attributes:
     - authzToken
     - computeResourceId
     - computeResourceDescription
    """

    thrift_spec = (
        None,  # 0
        (1, TType.STRUCT, 'authzToken', (apache.airavata.model.security.ttypes.AuthzToken, apache.airavata.model.security.ttypes.AuthzToken.thrift_spec), None, ),  # 1
        (2, TType.STRING, 'computeResourceId', 'UTF8', None, ),  # 2
        (3, TType.STRUCT, 'computeResourceDescription', (apache.airavata.model.appcatalog.computeresource.ttypes.ComputeResourceDescription, apache.airavata.model.appcatalog.computeresource.ttypes.ComputeResourceDescription.thrift_spec), None, ),  # 3
    )

    def __init__(self, authzToken=None, computeResourceId=None, computeResourceDescription=None,):
        self.authzToken = authzToken
        self.computeResourceId = computeResourceId
        self.computeResourceDescription = computeResourceDescription

    def read(self, iprot):
        if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None:
            iprot._fast_decode(self, iprot, (self.__class__, self.thrift_spec))
            return
        iprot.readStructBegin()
        while True:
            (fname, ftype, fid) = iprot.readFieldBegin()
            if ftype == TType.STOP:
                break
            if fid == 1:
                if ftype == TType.STRUCT:
                    self.authzToken = apache.airavata.model.security.ttypes.AuthzToken()
                    self.authzToken.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 2:
                if ftype == TType.STRING:
                    self.computeResourceId = iprot.readString().decode('utf-8') if sys.version_info[0] == 2 else iprot.readString()
                else:
                    iprot.skip(ftype)
            elif fid == 3:
                if ftype == TType.STRUCT:
                    self.computeResourceDescription = apache.airavata.model.appcatalog.computeresource.ttypes.ComputeResourceDescription()
                    self.computeResourceDescription.read(iprot)
                else:
                    iprot.skip(ftype)
            else:
                iprot.skip(ftype)
            iprot.readFieldEnd()
        iprot.readStructEnd()

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

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

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

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

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


class updateComputeResource_result(object):
    """
    Attributes:
     - success
     - ire
     - ace
     - ase
     - ae
    """

    thrift_spec = (
        (0, TType.BOOL, 'success', None, None, ),  # 0
        (1, TType.STRUCT, 'ire', (apache.airavata.api.error.ttypes.InvalidRequestException, apache.airavata.api.error.ttypes.InvalidRequestException.thrift_spec), None, ),  # 1
        (2, TType.STRUCT, 'ace', (apache.airavata.api.error.ttypes.AiravataClientException, apache.airavata.api.error.ttypes.AiravataClientException.thrift_spec), None, ),  # 2
        (3, TType.STRUCT, 'ase', (apache.airavata.api.error.ttypes.AiravataSystemException, apache.airavata.api.error.ttypes.AiravataSystemException.thrift_spec), None, ),  # 3
        (4, TType.STRUCT, 'ae', (apache.airavata.api.error.ttypes.AuthorizationException, apache.airavata.api.error.ttypes.AuthorizationException.thrift_spec), None, ),  # 4
    )

    def __init__(self, success=None, ire=None, ace=None, ase=None, ae=None,):
        self.success = success
        self.ire = ire
        self.ace = ace
        self.ase = ase
        self.ae = ae

    def read(self, iprot):
        if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None:
            iprot._fast_decode(self, iprot, (self.__class__, self.thrift_spec))
            return
        iprot.readStructBegin()
        while True:
            (fname, ftype, fid) = iprot.readFieldBegin()
            if ftype == TType.STOP:
                break
            if fid == 0:
                if ftype == TType.BOOL:
                    self.success = iprot.readBool()
                else:
                    iprot.skip(ftype)
            elif fid == 1:
                if ftype == TType.STRUCT:
                    self.ire = apache.airavata.api.error.ttypes.InvalidRequestException()
                    self.ire.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 2:
                if ftype == TType.STRUCT:
                    self.ace = apache.airavata.api.error.ttypes.AiravataClientException()
                    self.ace.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 3:
                if ftype == TType.STRUCT:
                    self.ase = apache.airavata.api.error.ttypes.AiravataSystemException()
                    self.ase.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 4:
                if ftype == TType.STRUCT:
                    self.ae = apache.airavata.api.error.ttypes.AuthorizationException()
                    self.ae.read(iprot)
                else:
                    iprot.skip(ftype)
            else:
                iprot.skip(ftype)
            iprot.readFieldEnd()
        iprot.readStructEnd()

    def write(self, oprot):
        if oprot._fast_encode is not None and self.thrift_spec is not None:
            oprot.trans.write(oprot._fast_encode(self, (self.__class__, self.thrift_spec)))
            return
        oprot.writeStructBegin('updateComputeResource_result')
        if self.success is not None:
            oprot.writeFieldBegin('success', TType.BOOL, 0)
            oprot.writeBool(self.success)
            oprot.writeFieldEnd()
        if self.ire is not None:
            oprot.writeFieldBegin('ire', TType.STRUCT, 1)
            self.ire.write(oprot)
            oprot.writeFieldEnd()
        if self.ace is not None:
            oprot.writeFieldBegin('ace', TType.STRUCT, 2)
            self.ace.write(oprot)
            oprot.writeFieldEnd()
        if self.ase is not None:
            oprot.writeFieldBegin('ase', TType.STRUCT, 3)
            self.ase.write(oprot)
            oprot.writeFieldEnd()
        if self.ae is not None:
            oprot.writeFieldBegin('ae', TType.STRUCT, 4)
            self.ae.write(oprot)
            oprot.writeFieldEnd()
        oprot.writeFieldStop()
        oprot.writeStructEnd()

    def validate(self):
        return

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

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

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


class deleteComputeResource_args(object):
    """
    Attributes:
     - authzToken
     - computeResourceId
    """

    thrift_spec = (
        None,  # 0
        (1, TType.STRUCT, 'authzToken', (apache.airavata.model.security.ttypes.AuthzToken, apache.airavata.model.security.ttypes.AuthzToken.thrift_spec), None, ),  # 1
        (2, TType.STRING, 'computeResourceId', 'UTF8', None, ),  # 2
    )

    def __init__(self, authzToken=None, computeResourceId=None,):
        self.authzToken = authzToken
        self.computeResourceId = computeResourceId

    def read(self, iprot):
        if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None:
            iprot._fast_decode(self, iprot, (self.__class__, self.thrift_spec))
            return
        iprot.readStructBegin()
        while True:
            (fname, ftype, fid) = iprot.readFieldBegin()
            if ftype == TType.STOP:
                break
            if fid == 1:
                if ftype == TType.STRUCT:
                    self.authzToken = apache.airavata.model.security.ttypes.AuthzToken()
                    self.authzToken.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 2:
                if ftype == TType.STRING:
                    self.computeResourceId = iprot.readString().decode('utf-8') if sys.version_info[0] == 2 else iprot.readString()
                else:
                    iprot.skip(ftype)
            else:
                iprot.skip(ftype)
            iprot.readFieldEnd()
        iprot.readStructEnd()

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

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

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

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

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


class deleteComputeResource_result(object):
    """
    Attributes:
     - success
     - ire
     - ace
     - ase
     - ae
    """

    thrift_spec = (
        (0, TType.BOOL, 'success', None, None, ),  # 0
        (1, TType.STRUCT, 'ire', (apache.airavata.api.error.ttypes.InvalidRequestException, apache.airavata.api.error.ttypes.InvalidRequestException.thrift_spec), None, ),  # 1
        (2, TType.STRUCT, 'ace', (apache.airavata.api.error.ttypes.AiravataClientException, apache.airavata.api.error.ttypes.AiravataClientException.thrift_spec), None, ),  # 2
        (3, TType.STRUCT, 'ase', (apache.airavata.api.error.ttypes.AiravataSystemException, apache.airavata.api.error.ttypes.AiravataSystemException.thrift_spec), None, ),  # 3
        (4, TType.STRUCT, 'ae', (apache.airavata.api.error.ttypes.AuthorizationException, apache.airavata.api.error.ttypes.AuthorizationException.thrift_spec), None, ),  # 4
    )

    def __init__(self, success=None, ire=None, ace=None, ase=None, ae=None,):
        self.success = success
        self.ire = ire
        self.ace = ace
        self.ase = ase
        self.ae = ae

    def read(self, iprot):
        if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None:
            iprot._fast_decode(self, iprot, (self.__class__, self.thrift_spec))
            return
        iprot.readStructBegin()
        while True:
            (fname, ftype, fid) = iprot.readFieldBegin()
            if ftype == TType.STOP:
                break
            if fid == 0:
                if ftype == TType.BOOL:
                    self.success = iprot.readBool()
                else:
                    iprot.skip(ftype)
            elif fid == 1:
                if ftype == TType.STRUCT:
                    self.ire = apache.airavata.api.error.ttypes.InvalidRequestException()
                    self.ire.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 2:
                if ftype == TType.STRUCT:
                    self.ace = apache.airavata.api.error.ttypes.AiravataClientException()
                    self.ace.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 3:
                if ftype == TType.STRUCT:
                    self.ase = apache.airavata.api.error.ttypes.AiravataSystemException()
                    self.ase.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 4:
                if ftype == TType.STRUCT:
                    self.ae = apache.airavata.api.error.ttypes.AuthorizationException()
                    self.ae.read(iprot)
                else:
                    iprot.skip(ftype)
            else:
                iprot.skip(ftype)
            iprot.readFieldEnd()
        iprot.readStructEnd()

    def write(self, oprot):
        if oprot._fast_encode is not None and self.thrift_spec is not None:
            oprot.trans.write(oprot._fast_encode(self, (self.__class__, self.thrift_spec)))
            return
        oprot.writeStructBegin('deleteComputeResource_result')
        if self.success is not None:
            oprot.writeFieldBegin('success', TType.BOOL, 0)
            oprot.writeBool(self.success)
            oprot.writeFieldEnd()
        if self.ire is not None:
            oprot.writeFieldBegin('ire', TType.STRUCT, 1)
            self.ire.write(oprot)
            oprot.writeFieldEnd()
        if self.ace is not None:
            oprot.writeFieldBegin('ace', TType.STRUCT, 2)
            self.ace.write(oprot)
            oprot.writeFieldEnd()
        if self.ase is not None:
            oprot.writeFieldBegin('ase', TType.STRUCT, 3)
            self.ase.write(oprot)
            oprot.writeFieldEnd()
        if self.ae is not None:
            oprot.writeFieldBegin('ae', TType.STRUCT, 4)
            self.ae.write(oprot)
            oprot.writeFieldEnd()
        oprot.writeFieldStop()
        oprot.writeStructEnd()

    def validate(self):
        return

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

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

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


class registerStorageResource_args(object):
    """
    Attributes:
     - authzToken
     - storageResourceDescription
    """

    thrift_spec = (
        None,  # 0
        (1, TType.STRUCT, 'authzToken', (apache.airavata.model.security.ttypes.AuthzToken, apache.airavata.model.security.ttypes.AuthzToken.thrift_spec), None, ),  # 1
        (2, TType.STRUCT, 'storageResourceDescription', (apache.airavata.model.appcatalog.storageresource.ttypes.StorageResourceDescription, apache.airavata.model.appcatalog.storageresource.ttypes.StorageResourceDescription.thrift_spec), None, ),  # 2
    )

    def __init__(self, authzToken=None, storageResourceDescription=None,):
        self.authzToken = authzToken
        self.storageResourceDescription = storageResourceDescription

    def read(self, iprot):
        if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None:
            iprot._fast_decode(self, iprot, (self.__class__, self.thrift_spec))
            return
        iprot.readStructBegin()
        while True:
            (fname, ftype, fid) = iprot.readFieldBegin()
            if ftype == TType.STOP:
                break
            if fid == 1:
                if ftype == TType.STRUCT:
                    self.authzToken = apache.airavata.model.security.ttypes.AuthzToken()
                    self.authzToken.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 2:
                if ftype == TType.STRUCT:
                    self.storageResourceDescription = apache.airavata.model.appcatalog.storageresource.ttypes.StorageResourceDescription()
                    self.storageResourceDescription.read(iprot)
                else:
                    iprot.skip(ftype)
            else:
                iprot.skip(ftype)
            iprot.readFieldEnd()
        iprot.readStructEnd()

    def write(self, oprot):
        if oprot._fast_encode is not None and self.thrift_spec is not None:
            oprot.trans.write(oprot._fast_encode(self, (self.__class__, self.thrift_spec)))
            return
        oprot.writeStructBegin('registerStorageResource_args')
        if self.authzToken is not None:
            oprot.writeFieldBegin('authzToken', TType.STRUCT, 1)
            self.authzToken.write(oprot)
            oprot.writeFieldEnd()
        if self.storageResourceDescription is not None:
            oprot.writeFieldBegin('storageResourceDescription', TType.STRUCT, 2)
            self.storageResourceDescription.write(oprot)
            oprot.writeFieldEnd()
        oprot.writeFieldStop()
        oprot.writeStructEnd()

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

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

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

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


class registerStorageResource_result(object):
    """
    Attributes:
     - success
     - ire
     - ace
     - ase
     - ae
    """

    thrift_spec = (
        (0, TType.STRING, 'success', 'UTF8', None, ),  # 0
        (1, TType.STRUCT, 'ire', (apache.airavata.api.error.ttypes.InvalidRequestException, apache.airavata.api.error.ttypes.InvalidRequestException.thrift_spec), None, ),  # 1
        (2, TType.STRUCT, 'ace', (apache.airavata.api.error.ttypes.AiravataClientException, apache.airavata.api.error.ttypes.AiravataClientException.thrift_spec), None, ),  # 2
        (3, TType.STRUCT, 'ase', (apache.airavata.api.error.ttypes.AiravataSystemException, apache.airavata.api.error.ttypes.AiravataSystemException.thrift_spec), None, ),  # 3
        (4, TType.STRUCT, 'ae', (apache.airavata.api.error.ttypes.AuthorizationException, apache.airavata.api.error.ttypes.AuthorizationException.thrift_spec), None, ),  # 4
    )

    def __init__(self, success=None, ire=None, ace=None, ase=None, ae=None,):
        self.success = success
        self.ire = ire
        self.ace = ace
        self.ase = ase
        self.ae = ae

    def read(self, iprot):
        if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None:
            iprot._fast_decode(self, iprot, (self.__class__, self.thrift_spec))
            return
        iprot.readStructBegin()
        while True:
            (fname, ftype, fid) = iprot.readFieldBegin()
            if ftype == TType.STOP:
                break
            if fid == 0:
                if ftype == TType.STRING:
                    self.success = iprot.readString().decode('utf-8') if sys.version_info[0] == 2 else iprot.readString()
                else:
                    iprot.skip(ftype)
            elif fid == 1:
                if ftype == TType.STRUCT:
                    self.ire = apache.airavata.api.error.ttypes.InvalidRequestException()
                    self.ire.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 2:
                if ftype == TType.STRUCT:
                    self.ace = apache.airavata.api.error.ttypes.AiravataClientException()
                    self.ace.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 3:
                if ftype == TType.STRUCT:
                    self.ase = apache.airavata.api.error.ttypes.AiravataSystemException()
                    self.ase.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 4:
                if ftype == TType.STRUCT:
                    self.ae = apache.airavata.api.error.ttypes.AuthorizationException()
                    self.ae.read(iprot)
                else:
                    iprot.skip(ftype)
            else:
                iprot.skip(ftype)
            iprot.readFieldEnd()
        iprot.readStructEnd()

    def write(self, oprot):
        if oprot._fast_encode is not None and self.thrift_spec is not None:
            oprot.trans.write(oprot._fast_encode(self, (self.__class__, self.thrift_spec)))
            return
        oprot.writeStructBegin('registerStorageResource_result')
        if self.success is not None:
            oprot.writeFieldBegin('success', TType.STRING, 0)
            oprot.writeString(self.success.encode('utf-8') if sys.version_info[0] == 2 else self.success)
            oprot.writeFieldEnd()
        if self.ire is not None:
            oprot.writeFieldBegin('ire', TType.STRUCT, 1)
            self.ire.write(oprot)
            oprot.writeFieldEnd()
        if self.ace is not None:
            oprot.writeFieldBegin('ace', TType.STRUCT, 2)
            self.ace.write(oprot)
            oprot.writeFieldEnd()
        if self.ase is not None:
            oprot.writeFieldBegin('ase', TType.STRUCT, 3)
            self.ase.write(oprot)
            oprot.writeFieldEnd()
        if self.ae is not None:
            oprot.writeFieldBegin('ae', TType.STRUCT, 4)
            self.ae.write(oprot)
            oprot.writeFieldEnd()
        oprot.writeFieldStop()
        oprot.writeStructEnd()

    def validate(self):
        return

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

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

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


class getStorageResource_args(object):
    """
    Attributes:
     - authzToken
     - storageResourceId
    """

    thrift_spec = (
        None,  # 0
        (1, TType.STRUCT, 'authzToken', (apache.airavata.model.security.ttypes.AuthzToken, apache.airavata.model.security.ttypes.AuthzToken.thrift_spec), None, ),  # 1
        (2, TType.STRING, 'storageResourceId', 'UTF8', None, ),  # 2
    )

    def __init__(self, authzToken=None, storageResourceId=None,):
        self.authzToken = authzToken
        self.storageResourceId = storageResourceId

    def read(self, iprot):
        if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None:
            iprot._fast_decode(self, iprot, (self.__class__, self.thrift_spec))
            return
        iprot.readStructBegin()
        while True:
            (fname, ftype, fid) = iprot.readFieldBegin()
            if ftype == TType.STOP:
                break
            if fid == 1:
                if ftype == TType.STRUCT:
                    self.authzToken = apache.airavata.model.security.ttypes.AuthzToken()
                    self.authzToken.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 2:
                if ftype == TType.STRING:
                    self.storageResourceId = iprot.readString().decode('utf-8') if sys.version_info[0] == 2 else iprot.readString()
                else:
                    iprot.skip(ftype)
            else:
                iprot.skip(ftype)
            iprot.readFieldEnd()
        iprot.readStructEnd()

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

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

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

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

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


class getStorageResource_result(object):
    """
    Attributes:
     - success
     - ire
     - ace
     - ase
     - ae
    """

    thrift_spec = (
        (0, TType.STRUCT, 'success', (apache.airavata.model.appcatalog.storageresource.ttypes.StorageResourceDescription, apache.airavata.model.appcatalog.storageresource.ttypes.StorageResourceDescription.thrift_spec), None, ),  # 0
        (1, TType.STRUCT, 'ire', (apache.airavata.api.error.ttypes.InvalidRequestException, apache.airavata.api.error.ttypes.InvalidRequestException.thrift_spec), None, ),  # 1
        (2, TType.STRUCT, 'ace', (apache.airavata.api.error.ttypes.AiravataClientException, apache.airavata.api.error.ttypes.AiravataClientException.thrift_spec), None, ),  # 2
        (3, TType.STRUCT, 'ase', (apache.airavata.api.error.ttypes.AiravataSystemException, apache.airavata.api.error.ttypes.AiravataSystemException.thrift_spec), None, ),  # 3
        (4, TType.STRUCT, 'ae', (apache.airavata.api.error.ttypes.AuthorizationException, apache.airavata.api.error.ttypes.AuthorizationException.thrift_spec), None, ),  # 4
    )

    def __init__(self, success=None, ire=None, ace=None, ase=None, ae=None,):
        self.success = success
        self.ire = ire
        self.ace = ace
        self.ase = ase
        self.ae = ae

    def read(self, iprot):
        if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None:
            iprot._fast_decode(self, iprot, (self.__class__, self.thrift_spec))
            return
        iprot.readStructBegin()
        while True:
            (fname, ftype, fid) = iprot.readFieldBegin()
            if ftype == TType.STOP:
                break
            if fid == 0:
                if ftype == TType.STRUCT:
                    self.success = apache.airavata.model.appcatalog.storageresource.ttypes.StorageResourceDescription()
                    self.success.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 1:
                if ftype == TType.STRUCT:
                    self.ire = apache.airavata.api.error.ttypes.InvalidRequestException()
                    self.ire.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 2:
                if ftype == TType.STRUCT:
                    self.ace = apache.airavata.api.error.ttypes.AiravataClientException()
                    self.ace.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 3:
                if ftype == TType.STRUCT:
                    self.ase = apache.airavata.api.error.ttypes.AiravataSystemException()
                    self.ase.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 4:
                if ftype == TType.STRUCT:
                    self.ae = apache.airavata.api.error.ttypes.AuthorizationException()
                    self.ae.read(iprot)
                else:
                    iprot.skip(ftype)
            else:
                iprot.skip(ftype)
            iprot.readFieldEnd()
        iprot.readStructEnd()

    def write(self, oprot):
        if oprot._fast_encode is not None and self.thrift_spec is not None:
            oprot.trans.write(oprot._fast_encode(self, (self.__class__, self.thrift_spec)))
            return
        oprot.writeStructBegin('getStorageResource_result')
        if self.success is not None:
            oprot.writeFieldBegin('success', TType.STRUCT, 0)
            self.success.write(oprot)
            oprot.writeFieldEnd()
        if self.ire is not None:
            oprot.writeFieldBegin('ire', TType.STRUCT, 1)
            self.ire.write(oprot)
            oprot.writeFieldEnd()
        if self.ace is not None:
            oprot.writeFieldBegin('ace', TType.STRUCT, 2)
            self.ace.write(oprot)
            oprot.writeFieldEnd()
        if self.ase is not None:
            oprot.writeFieldBegin('ase', TType.STRUCT, 3)
            self.ase.write(oprot)
            oprot.writeFieldEnd()
        if self.ae is not None:
            oprot.writeFieldBegin('ae', TType.STRUCT, 4)
            self.ae.write(oprot)
            oprot.writeFieldEnd()
        oprot.writeFieldStop()
        oprot.writeStructEnd()

    def validate(self):
        return

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

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

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


class getAllStorageResourceNames_args(object):
    """
    Attributes:
     - authzToken
    """

    thrift_spec = (
        None,  # 0
        (1, TType.STRUCT, 'authzToken', (apache.airavata.model.security.ttypes.AuthzToken, apache.airavata.model.security.ttypes.AuthzToken.thrift_spec), None, ),  # 1
    )

    def __init__(self, authzToken=None,):
        self.authzToken = authzToken

    def read(self, iprot):
        if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None:
            iprot._fast_decode(self, iprot, (self.__class__, self.thrift_spec))
            return
        iprot.readStructBegin()
        while True:
            (fname, ftype, fid) = iprot.readFieldBegin()
            if ftype == TType.STOP:
                break
            if fid == 1:
                if ftype == TType.STRUCT:
                    self.authzToken = apache.airavata.model.security.ttypes.AuthzToken()
                    self.authzToken.read(iprot)
                else:
                    iprot.skip(ftype)
            else:
                iprot.skip(ftype)
            iprot.readFieldEnd()
        iprot.readStructEnd()

    def write(self, oprot):
        if oprot._fast_encode is not None and self.thrift_spec is not None:
            oprot.trans.write(oprot._fast_encode(self, (self.__class__, self.thrift_spec)))
            return
        oprot.writeStructBegin('getAllStorageResourceNames_args')
        if self.authzToken is not None:
            oprot.writeFieldBegin('authzToken', TType.STRUCT, 1)
            self.authzToken.write(oprot)
            oprot.writeFieldEnd()
        oprot.writeFieldStop()
        oprot.writeStructEnd()

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

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

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

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


class getAllStorageResourceNames_result(object):
    """
    Attributes:
     - success
     - ire
     - ace
     - ase
     - ae
    """

    thrift_spec = (
        (0, TType.MAP, 'success', (TType.STRING, 'UTF8', TType.STRING, 'UTF8', False), None, ),  # 0
        (1, TType.STRUCT, 'ire', (apache.airavata.api.error.ttypes.InvalidRequestException, apache.airavata.api.error.ttypes.InvalidRequestException.thrift_spec), None, ),  # 1
        (2, TType.STRUCT, 'ace', (apache.airavata.api.error.ttypes.AiravataClientException, apache.airavata.api.error.ttypes.AiravataClientException.thrift_spec), None, ),  # 2
        (3, TType.STRUCT, 'ase', (apache.airavata.api.error.ttypes.AiravataSystemException, apache.airavata.api.error.ttypes.AiravataSystemException.thrift_spec), None, ),  # 3
        (4, TType.STRUCT, 'ae', (apache.airavata.api.error.ttypes.AuthorizationException, apache.airavata.api.error.ttypes.AuthorizationException.thrift_spec), None, ),  # 4
    )

    def __init__(self, success=None, ire=None, ace=None, ase=None, ae=None,):
        self.success = success
        self.ire = ire
        self.ace = ace
        self.ase = ase
        self.ae = ae

    def read(self, iprot):
        if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None:
            iprot._fast_decode(self, iprot, (self.__class__, self.thrift_spec))
            return
        iprot.readStructBegin()
        while True:
            (fname, ftype, fid) = iprot.readFieldBegin()
            if ftype == TType.STOP:
                break
            if fid == 0:
                if ftype == TType.MAP:
                    self.success = {}
                    (_ktype206, _vtype207, _size205) = iprot.readMapBegin()
                    for _i209 in range(_size205):
                        _key210 = iprot.readString().decode('utf-8') if sys.version_info[0] == 2 else iprot.readString()
                        _val211 = iprot.readString().decode('utf-8') if sys.version_info[0] == 2 else iprot.readString()
                        self.success[_key210] = _val211
                    iprot.readMapEnd()
                else:
                    iprot.skip(ftype)
            elif fid == 1:
                if ftype == TType.STRUCT:
                    self.ire = apache.airavata.api.error.ttypes.InvalidRequestException()
                    self.ire.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 2:
                if ftype == TType.STRUCT:
                    self.ace = apache.airavata.api.error.ttypes.AiravataClientException()
                    self.ace.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 3:
                if ftype == TType.STRUCT:
                    self.ase = apache.airavata.api.error.ttypes.AiravataSystemException()
                    self.ase.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 4:
                if ftype == TType.STRUCT:
                    self.ae = apache.airavata.api.error.ttypes.AuthorizationException()
                    self.ae.read(iprot)
                else:
                    iprot.skip(ftype)
            else:
                iprot.skip(ftype)
            iprot.readFieldEnd()
        iprot.readStructEnd()

    def write(self, oprot):
        if oprot._fast_encode is not None and self.thrift_spec is not None:
            oprot.trans.write(oprot._fast_encode(self, (self.__class__, self.thrift_spec)))
            return
        oprot.writeStructBegin('getAllStorageResourceNames_result')
        if self.success is not None:
            oprot.writeFieldBegin('success', TType.MAP, 0)
            oprot.writeMapBegin(TType.STRING, TType.STRING, len(self.success))
            for kiter212, viter213 in self.success.items():
                oprot.writeString(kiter212.encode('utf-8') if sys.version_info[0] == 2 else kiter212)
                oprot.writeString(viter213.encode('utf-8') if sys.version_info[0] == 2 else viter213)
            oprot.writeMapEnd()
            oprot.writeFieldEnd()
        if self.ire is not None:
            oprot.writeFieldBegin('ire', TType.STRUCT, 1)
            self.ire.write(oprot)
            oprot.writeFieldEnd()
        if self.ace is not None:
            oprot.writeFieldBegin('ace', TType.STRUCT, 2)
            self.ace.write(oprot)
            oprot.writeFieldEnd()
        if self.ase is not None:
            oprot.writeFieldBegin('ase', TType.STRUCT, 3)
            self.ase.write(oprot)
            oprot.writeFieldEnd()
        if self.ae is not None:
            oprot.writeFieldBegin('ae', TType.STRUCT, 4)
            self.ae.write(oprot)
            oprot.writeFieldEnd()
        oprot.writeFieldStop()
        oprot.writeStructEnd()

    def validate(self):
        return

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

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

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


class updateStorageResource_args(object):
    """
    Attributes:
     - authzToken
     - storageResourceId
     - storageResourceDescription
    """

    thrift_spec = (
        None,  # 0
        (1, TType.STRUCT, 'authzToken', (apache.airavata.model.security.ttypes.AuthzToken, apache.airavata.model.security.ttypes.AuthzToken.thrift_spec), None, ),  # 1
        (2, TType.STRING, 'storageResourceId', 'UTF8', None, ),  # 2
        (3, TType.STRUCT, 'storageResourceDescription', (apache.airavata.model.appcatalog.storageresource.ttypes.StorageResourceDescription, apache.airavata.model.appcatalog.storageresource.ttypes.StorageResourceDescription.thrift_spec), None, ),  # 3
    )

    def __init__(self, authzToken=None, storageResourceId=None, storageResourceDescription=None,):
        self.authzToken = authzToken
        self.storageResourceId = storageResourceId
        self.storageResourceDescription = storageResourceDescription

    def read(self, iprot):
        if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None:
            iprot._fast_decode(self, iprot, (self.__class__, self.thrift_spec))
            return
        iprot.readStructBegin()
        while True:
            (fname, ftype, fid) = iprot.readFieldBegin()
            if ftype == TType.STOP:
                break
            if fid == 1:
                if ftype == TType.STRUCT:
                    self.authzToken = apache.airavata.model.security.ttypes.AuthzToken()
                    self.authzToken.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 2:
                if ftype == TType.STRING:
                    self.storageResourceId = iprot.readString().decode('utf-8') if sys.version_info[0] == 2 else iprot.readString()
                else:
                    iprot.skip(ftype)
            elif fid == 3:
                if ftype == TType.STRUCT:
                    self.storageResourceDescription = apache.airavata.model.appcatalog.storageresource.ttypes.StorageResourceDescription()
                    self.storageResourceDescription.read(iprot)
                else:
                    iprot.skip(ftype)
            else:
                iprot.skip(ftype)
            iprot.readFieldEnd()
        iprot.readStructEnd()

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

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

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

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

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


class updateStorageResource_result(object):
    """
    Attributes:
     - success
     - ire
     - ace
     - ase
     - ae
    """

    thrift_spec = (
        (0, TType.BOOL, 'success', None, None, ),  # 0
        (1, TType.STRUCT, 'ire', (apache.airavata.api.error.ttypes.InvalidRequestException, apache.airavata.api.error.ttypes.InvalidRequestException.thrift_spec), None, ),  # 1
        (2, TType.STRUCT, 'ace', (apache.airavata.api.error.ttypes.AiravataClientException, apache.airavata.api.error.ttypes.AiravataClientException.thrift_spec), None, ),  # 2
        (3, TType.STRUCT, 'ase', (apache.airavata.api.error.ttypes.AiravataSystemException, apache.airavata.api.error.ttypes.AiravataSystemException.thrift_spec), None, ),  # 3
        (4, TType.STRUCT, 'ae', (apache.airavata.api.error.ttypes.AuthorizationException, apache.airavata.api.error.ttypes.AuthorizationException.thrift_spec), None, ),  # 4
    )

    def __init__(self, success=None, ire=None, ace=None, ase=None, ae=None,):
        self.success = success
        self.ire = ire
        self.ace = ace
        self.ase = ase
        self.ae = ae

    def read(self, iprot):
        if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None:
            iprot._fast_decode(self, iprot, (self.__class__, self.thrift_spec))
            return
        iprot.readStructBegin()
        while True:
            (fname, ftype, fid) = iprot.readFieldBegin()
            if ftype == TType.STOP:
                break
            if fid == 0:
                if ftype == TType.BOOL:
                    self.success = iprot.readBool()
                else:
                    iprot.skip(ftype)
            elif fid == 1:
                if ftype == TType.STRUCT:
                    self.ire = apache.airavata.api.error.ttypes.InvalidRequestException()
                    self.ire.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 2:
                if ftype == TType.STRUCT:
                    self.ace = apache.airavata.api.error.ttypes.AiravataClientException()
                    self.ace.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 3:
                if ftype == TType.STRUCT:
                    self.ase = apache.airavata.api.error.ttypes.AiravataSystemException()
                    self.ase.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 4:
                if ftype == TType.STRUCT:
                    self.ae = apache.airavata.api.error.ttypes.AuthorizationException()
                    self.ae.read(iprot)
                else:
                    iprot.skip(ftype)
            else:
                iprot.skip(ftype)
            iprot.readFieldEnd()
        iprot.readStructEnd()

    def write(self, oprot):
        if oprot._fast_encode is not None and self.thrift_spec is not None:
            oprot.trans.write(oprot._fast_encode(self, (self.__class__, self.thrift_spec)))
            return
        oprot.writeStructBegin('updateStorageResource_result')
        if self.success is not None:
            oprot.writeFieldBegin('success', TType.BOOL, 0)
            oprot.writeBool(self.success)
            oprot.writeFieldEnd()
        if self.ire is not None:
            oprot.writeFieldBegin('ire', TType.STRUCT, 1)
            self.ire.write(oprot)
            oprot.writeFieldEnd()
        if self.ace is not None:
            oprot.writeFieldBegin('ace', TType.STRUCT, 2)
            self.ace.write(oprot)
            oprot.writeFieldEnd()
        if self.ase is not None:
            oprot.writeFieldBegin('ase', TType.STRUCT, 3)
            self.ase.write(oprot)
            oprot.writeFieldEnd()
        if self.ae is not None:
            oprot.writeFieldBegin('ae', TType.STRUCT, 4)
            self.ae.write(oprot)
            oprot.writeFieldEnd()
        oprot.writeFieldStop()
        oprot.writeStructEnd()

    def validate(self):
        return

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

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

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


class deleteStorageResource_args(object):
    """
    Attributes:
     - authzToken
     - storageResourceId
    """

    thrift_spec = (
        None,  # 0
        (1, TType.STRUCT, 'authzToken', (apache.airavata.model.security.ttypes.AuthzToken, apache.airavata.model.security.ttypes.AuthzToken.thrift_spec), None, ),  # 1
        (2, TType.STRING, 'storageResourceId', 'UTF8', None, ),  # 2
    )

    def __init__(self, authzToken=None, storageResourceId=None,):
        self.authzToken = authzToken
        self.storageResourceId = storageResourceId

    def read(self, iprot):
        if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None:
            iprot._fast_decode(self, iprot, (self.__class__, self.thrift_spec))
            return
        iprot.readStructBegin()
        while True:
            (fname, ftype, fid) = iprot.readFieldBegin()
            if ftype == TType.STOP:
                break
            if fid == 1:
                if ftype == TType.STRUCT:
                    self.authzToken = apache.airavata.model.security.ttypes.AuthzToken()
                    self.authzToken.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 2:
                if ftype == TType.STRING:
                    self.storageResourceId = iprot.readString().decode('utf-8') if sys.version_info[0] == 2 else iprot.readString()
                else:
                    iprot.skip(ftype)
            else:
                iprot.skip(ftype)
            iprot.readFieldEnd()
        iprot.readStructEnd()

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

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

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

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

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


class deleteStorageResource_result(object):
    """
    Attributes:
     - success
     - ire
     - ace
     - ase
     - ae
    """

    thrift_spec = (
        (0, TType.BOOL, 'success', None, None, ),  # 0
        (1, TType.STRUCT, 'ire', (apache.airavata.api.error.ttypes.InvalidRequestException, apache.airavata.api.error.ttypes.InvalidRequestException.thrift_spec), None, ),  # 1
        (2, TType.STRUCT, 'ace', (apache.airavata.api.error.ttypes.AiravataClientException, apache.airavata.api.error.ttypes.AiravataClientException.thrift_spec), None, ),  # 2
        (3, TType.STRUCT, 'ase', (apache.airavata.api.error.ttypes.AiravataSystemException, apache.airavata.api.error.ttypes.AiravataSystemException.thrift_spec), None, ),  # 3
        (4, TType.STRUCT, 'ae', (apache.airavata.api.error.ttypes.AuthorizationException, apache.airavata.api.error.ttypes.AuthorizationException.thrift_spec), None, ),  # 4
    )

    def __init__(self, success=None, ire=None, ace=None, ase=None, ae=None,):
        self.success = success
        self.ire = ire
        self.ace = ace
        self.ase = ase
        self.ae = ae

    def read(self, iprot):
        if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None:
            iprot._fast_decode(self, iprot, (self.__class__, self.thrift_spec))
            return
        iprot.readStructBegin()
        while True:
            (fname, ftype, fid) = iprot.readFieldBegin()
            if ftype == TType.STOP:
                break
            if fid == 0:
                if ftype == TType.BOOL:
                    self.success = iprot.readBool()
                else:
                    iprot.skip(ftype)
            elif fid == 1:
                if ftype == TType.STRUCT:
                    self.ire = apache.airavata.api.error.ttypes.InvalidRequestException()
                    self.ire.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 2:
                if ftype == TType.STRUCT:
                    self.ace = apache.airavata.api.error.ttypes.AiravataClientException()
                    self.ace.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 3:
                if ftype == TType.STRUCT:
                    self.ase = apache.airavata.api.error.ttypes.AiravataSystemException()
                    self.ase.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 4:
                if ftype == TType.STRUCT:
                    self.ae = apache.airavata.api.error.ttypes.AuthorizationException()
                    self.ae.read(iprot)
                else:
                    iprot.skip(ftype)
            else:
                iprot.skip(ftype)
            iprot.readFieldEnd()
        iprot.readStructEnd()

    def write(self, oprot):
        if oprot._fast_encode is not None and self.thrift_spec is not None:
            oprot.trans.write(oprot._fast_encode(self, (self.__class__, self.thrift_spec)))
            return
        oprot.writeStructBegin('deleteStorageResource_result')
        if self.success is not None:
            oprot.writeFieldBegin('success', TType.BOOL, 0)
            oprot.writeBool(self.success)
            oprot.writeFieldEnd()
        if self.ire is not None:
            oprot.writeFieldBegin('ire', TType.STRUCT, 1)
            self.ire.write(oprot)
            oprot.writeFieldEnd()
        if self.ace is not None:
            oprot.writeFieldBegin('ace', TType.STRUCT, 2)
            self.ace.write(oprot)
            oprot.writeFieldEnd()
        if self.ase is not None:
            oprot.writeFieldBegin('ase', TType.STRUCT, 3)
            self.ase.write(oprot)
            oprot.writeFieldEnd()
        if self.ae is not None:
            oprot.writeFieldBegin('ae', TType.STRUCT, 4)
            self.ae.write(oprot)
            oprot.writeFieldEnd()
        oprot.writeFieldStop()
        oprot.writeStructEnd()

    def validate(self):
        return

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

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

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


class addLocalSubmissionDetails_args(object):
    """
    Attributes:
     - authzToken
     - computeResourceId
     - priorityOrder
     - localSubmission
    """

    thrift_spec = (
        None,  # 0
        (1, TType.STRUCT, 'authzToken', (apache.airavata.model.security.ttypes.AuthzToken, apache.airavata.model.security.ttypes.AuthzToken.thrift_spec), None, ),  # 1
        (2, TType.STRING, 'computeResourceId', 'UTF8', None, ),  # 2
        (3, TType.I32, 'priorityOrder', None, None, ),  # 3
        (4, TType.STRUCT, 'localSubmission', (apache.airavata.model.appcatalog.computeresource.ttypes.LOCALSubmission, apache.airavata.model.appcatalog.computeresource.ttypes.LOCALSubmission.thrift_spec), None, ),  # 4
    )

    def __init__(self, authzToken=None, computeResourceId=None, priorityOrder=None, localSubmission=None,):
        self.authzToken = authzToken
        self.computeResourceId = computeResourceId
        self.priorityOrder = priorityOrder
        self.localSubmission = localSubmission

    def read(self, iprot):
        if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None:
            iprot._fast_decode(self, iprot, (self.__class__, self.thrift_spec))
            return
        iprot.readStructBegin()
        while True:
            (fname, ftype, fid) = iprot.readFieldBegin()
            if ftype == TType.STOP:
                break
            if fid == 1:
                if ftype == TType.STRUCT:
                    self.authzToken = apache.airavata.model.security.ttypes.AuthzToken()
                    self.authzToken.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 2:
                if ftype == TType.STRING:
                    self.computeResourceId = iprot.readString().decode('utf-8') if sys.version_info[0] == 2 else iprot.readString()
                else:
                    iprot.skip(ftype)
            elif fid == 3:
                if ftype == TType.I32:
                    self.priorityOrder = iprot.readI32()
                else:
                    iprot.skip(ftype)
            elif fid == 4:
                if ftype == TType.STRUCT:
                    self.localSubmission = apache.airavata.model.appcatalog.computeresource.ttypes.LOCALSubmission()
                    self.localSubmission.read(iprot)
                else:
                    iprot.skip(ftype)
            else:
                iprot.skip(ftype)
            iprot.readFieldEnd()
        iprot.readStructEnd()

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

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

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

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

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


class addLocalSubmissionDetails_result(object):
    """
    Attributes:
     - success
     - ire
     - ace
     - ase
     - ae
    """

    thrift_spec = (
        (0, TType.STRING, 'success', 'UTF8', None, ),  # 0
        (1, TType.STRUCT, 'ire', (apache.airavata.api.error.ttypes.InvalidRequestException, apache.airavata.api.error.ttypes.InvalidRequestException.thrift_spec), None, ),  # 1
        (2, TType.STRUCT, 'ace', (apache.airavata.api.error.ttypes.AiravataClientException, apache.airavata.api.error.ttypes.AiravataClientException.thrift_spec), None, ),  # 2
        (3, TType.STRUCT, 'ase', (apache.airavata.api.error.ttypes.AiravataSystemException, apache.airavata.api.error.ttypes.AiravataSystemException.thrift_spec), None, ),  # 3
        (4, TType.STRUCT, 'ae', (apache.airavata.api.error.ttypes.AuthorizationException, apache.airavata.api.error.ttypes.AuthorizationException.thrift_spec), None, ),  # 4
    )

    def __init__(self, success=None, ire=None, ace=None, ase=None, ae=None,):
        self.success = success
        self.ire = ire
        self.ace = ace
        self.ase = ase
        self.ae = ae

    def read(self, iprot):
        if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None:
            iprot._fast_decode(self, iprot, (self.__class__, self.thrift_spec))
            return
        iprot.readStructBegin()
        while True:
            (fname, ftype, fid) = iprot.readFieldBegin()
            if ftype == TType.STOP:
                break
            if fid == 0:
                if ftype == TType.STRING:
                    self.success = iprot.readString().decode('utf-8') if sys.version_info[0] == 2 else iprot.readString()
                else:
                    iprot.skip(ftype)
            elif fid == 1:
                if ftype == TType.STRUCT:
                    self.ire = apache.airavata.api.error.ttypes.InvalidRequestException()
                    self.ire.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 2:
                if ftype == TType.STRUCT:
                    self.ace = apache.airavata.api.error.ttypes.AiravataClientException()
                    self.ace.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 3:
                if ftype == TType.STRUCT:
                    self.ase = apache.airavata.api.error.ttypes.AiravataSystemException()
                    self.ase.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 4:
                if ftype == TType.STRUCT:
                    self.ae = apache.airavata.api.error.ttypes.AuthorizationException()
                    self.ae.read(iprot)
                else:
                    iprot.skip(ftype)
            else:
                iprot.skip(ftype)
            iprot.readFieldEnd()
        iprot.readStructEnd()

    def write(self, oprot):
        if oprot._fast_encode is not None and self.thrift_spec is not None:
            oprot.trans.write(oprot._fast_encode(self, (self.__class__, self.thrift_spec)))
            return
        oprot.writeStructBegin('addLocalSubmissionDetails_result')
        if self.success is not None:
            oprot.writeFieldBegin('success', TType.STRING, 0)
            oprot.writeString(self.success.encode('utf-8') if sys.version_info[0] == 2 else self.success)
            oprot.writeFieldEnd()
        if self.ire is not None:
            oprot.writeFieldBegin('ire', TType.STRUCT, 1)
            self.ire.write(oprot)
            oprot.writeFieldEnd()
        if self.ace is not None:
            oprot.writeFieldBegin('ace', TType.STRUCT, 2)
            self.ace.write(oprot)
            oprot.writeFieldEnd()
        if self.ase is not None:
            oprot.writeFieldBegin('ase', TType.STRUCT, 3)
            self.ase.write(oprot)
            oprot.writeFieldEnd()
        if self.ae is not None:
            oprot.writeFieldBegin('ae', TType.STRUCT, 4)
            self.ae.write(oprot)
            oprot.writeFieldEnd()
        oprot.writeFieldStop()
        oprot.writeStructEnd()

    def validate(self):
        return

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

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

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


class updateLocalSubmissionDetails_args(object):
    """
    Attributes:
     - authzToken
     - jobSubmissionInterfaceId
     - localSubmission
    """

    thrift_spec = (
        None,  # 0
        (1, TType.STRUCT, 'authzToken', (apache.airavata.model.security.ttypes.AuthzToken, apache.airavata.model.security.ttypes.AuthzToken.thrift_spec), None, ),  # 1
        (2, TType.STRING, 'jobSubmissionInterfaceId', 'UTF8', None, ),  # 2
        (3, TType.STRUCT, 'localSubmission', (apache.airavata.model.appcatalog.computeresource.ttypes.LOCALSubmission, apache.airavata.model.appcatalog.computeresource.ttypes.LOCALSubmission.thrift_spec), None, ),  # 3
    )

    def __init__(self, authzToken=None, jobSubmissionInterfaceId=None, localSubmission=None,):
        self.authzToken = authzToken
        self.jobSubmissionInterfaceId = jobSubmissionInterfaceId
        self.localSubmission = localSubmission

    def read(self, iprot):
        if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None:
            iprot._fast_decode(self, iprot, (self.__class__, self.thrift_spec))
            return
        iprot.readStructBegin()
        while True:
            (fname, ftype, fid) = iprot.readFieldBegin()
            if ftype == TType.STOP:
                break
            if fid == 1:
                if ftype == TType.STRUCT:
                    self.authzToken = apache.airavata.model.security.ttypes.AuthzToken()
                    self.authzToken.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 2:
                if ftype == TType.STRING:
                    self.jobSubmissionInterfaceId = iprot.readString().decode('utf-8') if sys.version_info[0] == 2 else iprot.readString()
                else:
                    iprot.skip(ftype)
            elif fid == 3:
                if ftype == TType.STRUCT:
                    self.localSubmission = apache.airavata.model.appcatalog.computeresource.ttypes.LOCALSubmission()
                    self.localSubmission.read(iprot)
                else:
                    iprot.skip(ftype)
            else:
                iprot.skip(ftype)
            iprot.readFieldEnd()
        iprot.readStructEnd()

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

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

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

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

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


class updateLocalSubmissionDetails_result(object):
    """
    Attributes:
     - success
     - ire
     - ace
     - ase
     - ae
    """

    thrift_spec = (
        (0, TType.BOOL, 'success', None, None, ),  # 0
        (1, TType.STRUCT, 'ire', (apache.airavata.api.error.ttypes.InvalidRequestException, apache.airavata.api.error.ttypes.InvalidRequestException.thrift_spec), None, ),  # 1
        (2, TType.STRUCT, 'ace', (apache.airavata.api.error.ttypes.AiravataClientException, apache.airavata.api.error.ttypes.AiravataClientException.thrift_spec), None, ),  # 2
        (3, TType.STRUCT, 'ase', (apache.airavata.api.error.ttypes.AiravataSystemException, apache.airavata.api.error.ttypes.AiravataSystemException.thrift_spec), None, ),  # 3
        (4, TType.STRUCT, 'ae', (apache.airavata.api.error.ttypes.AuthorizationException, apache.airavata.api.error.ttypes.AuthorizationException.thrift_spec), None, ),  # 4
    )

    def __init__(self, success=None, ire=None, ace=None, ase=None, ae=None,):
        self.success = success
        self.ire = ire
        self.ace = ace
        self.ase = ase
        self.ae = ae

    def read(self, iprot):
        if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None:
            iprot._fast_decode(self, iprot, (self.__class__, self.thrift_spec))
            return
        iprot.readStructBegin()
        while True:
            (fname, ftype, fid) = iprot.readFieldBegin()
            if ftype == TType.STOP:
                break
            if fid == 0:
                if ftype == TType.BOOL:
                    self.success = iprot.readBool()
                else:
                    iprot.skip(ftype)
            elif fid == 1:
                if ftype == TType.STRUCT:
                    self.ire = apache.airavata.api.error.ttypes.InvalidRequestException()
                    self.ire.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 2:
                if ftype == TType.STRUCT:
                    self.ace = apache.airavata.api.error.ttypes.AiravataClientException()
                    self.ace.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 3:
                if ftype == TType.STRUCT:
                    self.ase = apache.airavata.api.error.ttypes.AiravataSystemException()
                    self.ase.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 4:
                if ftype == TType.STRUCT:
                    self.ae = apache.airavata.api.error.ttypes.AuthorizationException()
                    self.ae.read(iprot)
                else:
                    iprot.skip(ftype)
            else:
                iprot.skip(ftype)
            iprot.readFieldEnd()
        iprot.readStructEnd()

    def write(self, oprot):
        if oprot._fast_encode is not None and self.thrift_spec is not None:
            oprot.trans.write(oprot._fast_encode(self, (self.__class__, self.thrift_spec)))
            return
        oprot.writeStructBegin('updateLocalSubmissionDetails_result')
        if self.success is not None:
            oprot.writeFieldBegin('success', TType.BOOL, 0)
            oprot.writeBool(self.success)
            oprot.writeFieldEnd()
        if self.ire is not None:
            oprot.writeFieldBegin('ire', TType.STRUCT, 1)
            self.ire.write(oprot)
            oprot.writeFieldEnd()
        if self.ace is not None:
            oprot.writeFieldBegin('ace', TType.STRUCT, 2)
            self.ace.write(oprot)
            oprot.writeFieldEnd()
        if self.ase is not None:
            oprot.writeFieldBegin('ase', TType.STRUCT, 3)
            self.ase.write(oprot)
            oprot.writeFieldEnd()
        if self.ae is not None:
            oprot.writeFieldBegin('ae', TType.STRUCT, 4)
            self.ae.write(oprot)
            oprot.writeFieldEnd()
        oprot.writeFieldStop()
        oprot.writeStructEnd()

    def validate(self):
        return

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

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

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


class getLocalJobSubmission_args(object):
    """
    Attributes:
     - authzToken
     - jobSubmissionId
    """

    thrift_spec = (
        None,  # 0
        (1, TType.STRUCT, 'authzToken', (apache.airavata.model.security.ttypes.AuthzToken, apache.airavata.model.security.ttypes.AuthzToken.thrift_spec), None, ),  # 1
        (2, TType.STRING, 'jobSubmissionId', 'UTF8', None, ),  # 2
    )

    def __init__(self, authzToken=None, jobSubmissionId=None,):
        self.authzToken = authzToken
        self.jobSubmissionId = jobSubmissionId

    def read(self, iprot):
        if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None:
            iprot._fast_decode(self, iprot, (self.__class__, self.thrift_spec))
            return
        iprot.readStructBegin()
        while True:
            (fname, ftype, fid) = iprot.readFieldBegin()
            if ftype == TType.STOP:
                break
            if fid == 1:
                if ftype == TType.STRUCT:
                    self.authzToken = apache.airavata.model.security.ttypes.AuthzToken()
                    self.authzToken.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 2:
                if ftype == TType.STRING:
                    self.jobSubmissionId = iprot.readString().decode('utf-8') if sys.version_info[0] == 2 else iprot.readString()
                else:
                    iprot.skip(ftype)
            else:
                iprot.skip(ftype)
            iprot.readFieldEnd()
        iprot.readStructEnd()

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

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

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

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

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


class getLocalJobSubmission_result(object):
    """
    Attributes:
     - success
     - ire
     - ace
     - ase
     - ae
    """

    thrift_spec = (
        (0, TType.STRUCT, 'success', (apache.airavata.model.appcatalog.computeresource.ttypes.LOCALSubmission, apache.airavata.model.appcatalog.computeresource.ttypes.LOCALSubmission.thrift_spec), None, ),  # 0
        (1, TType.STRUCT, 'ire', (apache.airavata.api.error.ttypes.InvalidRequestException, apache.airavata.api.error.ttypes.InvalidRequestException.thrift_spec), None, ),  # 1
        (2, TType.STRUCT, 'ace', (apache.airavata.api.error.ttypes.AiravataClientException, apache.airavata.api.error.ttypes.AiravataClientException.thrift_spec), None, ),  # 2
        (3, TType.STRUCT, 'ase', (apache.airavata.api.error.ttypes.AiravataSystemException, apache.airavata.api.error.ttypes.AiravataSystemException.thrift_spec), None, ),  # 3
        (4, TType.STRUCT, 'ae', (apache.airavata.api.error.ttypes.AuthorizationException, apache.airavata.api.error.ttypes.AuthorizationException.thrift_spec), None, ),  # 4
    )

    def __init__(self, success=None, ire=None, ace=None, ase=None, ae=None,):
        self.success = success
        self.ire = ire
        self.ace = ace
        self.ase = ase
        self.ae = ae

    def read(self, iprot):
        if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None:
            iprot._fast_decode(self, iprot, (self.__class__, self.thrift_spec))
            return
        iprot.readStructBegin()
        while True:
            (fname, ftype, fid) = iprot.readFieldBegin()
            if ftype == TType.STOP:
                break
            if fid == 0:
                if ftype == TType.STRUCT:
                    self.success = apache.airavata.model.appcatalog.computeresource.ttypes.LOCALSubmission()
                    self.success.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 1:
                if ftype == TType.STRUCT:
                    self.ire = apache.airavata.api.error.ttypes.InvalidRequestException()
                    self.ire.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 2:
                if ftype == TType.STRUCT:
                    self.ace = apache.airavata.api.error.ttypes.AiravataClientException()
                    self.ace.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 3:
                if ftype == TType.STRUCT:
                    self.ase = apache.airavata.api.error.ttypes.AiravataSystemException()
                    self.ase.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 4:
                if ftype == TType.STRUCT:
                    self.ae = apache.airavata.api.error.ttypes.AuthorizationException()
                    self.ae.read(iprot)
                else:
                    iprot.skip(ftype)
            else:
                iprot.skip(ftype)
            iprot.readFieldEnd()
        iprot.readStructEnd()

    def write(self, oprot):
        if oprot._fast_encode is not None and self.thrift_spec is not None:
            oprot.trans.write(oprot._fast_encode(self, (self.__class__, self.thrift_spec)))
            return
        oprot.writeStructBegin('getLocalJobSubmission_result')
        if self.success is not None:
            oprot.writeFieldBegin('success', TType.STRUCT, 0)
            self.success.write(oprot)
            oprot.writeFieldEnd()
        if self.ire is not None:
            oprot.writeFieldBegin('ire', TType.STRUCT, 1)
            self.ire.write(oprot)
            oprot.writeFieldEnd()
        if self.ace is not None:
            oprot.writeFieldBegin('ace', TType.STRUCT, 2)
            self.ace.write(oprot)
            oprot.writeFieldEnd()
        if self.ase is not None:
            oprot.writeFieldBegin('ase', TType.STRUCT, 3)
            self.ase.write(oprot)
            oprot.writeFieldEnd()
        if self.ae is not None:
            oprot.writeFieldBegin('ae', TType.STRUCT, 4)
            self.ae.write(oprot)
            oprot.writeFieldEnd()
        oprot.writeFieldStop()
        oprot.writeStructEnd()

    def validate(self):
        return

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

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

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


class addSSHJobSubmissionDetails_args(object):
    """
    Attributes:
     - authzToken
     - computeResourceId
     - priorityOrder
     - sshJobSubmission
    """

    thrift_spec = (
        None,  # 0
        (1, TType.STRUCT, 'authzToken', (apache.airavata.model.security.ttypes.AuthzToken, apache.airavata.model.security.ttypes.AuthzToken.thrift_spec), None, ),  # 1
        (2, TType.STRING, 'computeResourceId', 'UTF8', None, ),  # 2
        (3, TType.I32, 'priorityOrder', None, None, ),  # 3
        (4, TType.STRUCT, 'sshJobSubmission', (apache.airavata.model.appcatalog.computeresource.ttypes.SSHJobSubmission, apache.airavata.model.appcatalog.computeresource.ttypes.SSHJobSubmission.thrift_spec), None, ),  # 4
    )

    def __init__(self, authzToken=None, computeResourceId=None, priorityOrder=None, sshJobSubmission=None,):
        self.authzToken = authzToken
        self.computeResourceId = computeResourceId
        self.priorityOrder = priorityOrder
        self.sshJobSubmission = sshJobSubmission

    def read(self, iprot):
        if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None:
            iprot._fast_decode(self, iprot, (self.__class__, self.thrift_spec))
            return
        iprot.readStructBegin()
        while True:
            (fname, ftype, fid) = iprot.readFieldBegin()
            if ftype == TType.STOP:
                break
            if fid == 1:
                if ftype == TType.STRUCT:
                    self.authzToken = apache.airavata.model.security.ttypes.AuthzToken()
                    self.authzToken.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 2:
                if ftype == TType.STRING:
                    self.computeResourceId = iprot.readString().decode('utf-8') if sys.version_info[0] == 2 else iprot.readString()
                else:
                    iprot.skip(ftype)
            elif fid == 3:
                if ftype == TType.I32:
                    self.priorityOrder = iprot.readI32()
                else:
                    iprot.skip(ftype)
            elif fid == 4:
                if ftype == TType.STRUCT:
                    self.sshJobSubmission = apache.airavata.model.appcatalog.computeresource.ttypes.SSHJobSubmission()
                    self.sshJobSubmission.read(iprot)
                else:
                    iprot.skip(ftype)
            else:
                iprot.skip(ftype)
            iprot.readFieldEnd()
        iprot.readStructEnd()

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

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

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

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

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


class addSSHJobSubmissionDetails_result(object):
    """
    Attributes:
     - success
     - ire
     - ace
     - ase
     - ae
    """

    thrift_spec = (
        (0, TType.STRING, 'success', 'UTF8', None, ),  # 0
        (1, TType.STRUCT, 'ire', (apache.airavata.api.error.ttypes.InvalidRequestException, apache.airavata.api.error.ttypes.InvalidRequestException.thrift_spec), None, ),  # 1
        (2, TType.STRUCT, 'ace', (apache.airavata.api.error.ttypes.AiravataClientException, apache.airavata.api.error.ttypes.AiravataClientException.thrift_spec), None, ),  # 2
        (3, TType.STRUCT, 'ase', (apache.airavata.api.error.ttypes.AiravataSystemException, apache.airavata.api.error.ttypes.AiravataSystemException.thrift_spec), None, ),  # 3
        (4, TType.STRUCT, 'ae', (apache.airavata.api.error.ttypes.AuthorizationException, apache.airavata.api.error.ttypes.AuthorizationException.thrift_spec), None, ),  # 4
    )

    def __init__(self, success=None, ire=None, ace=None, ase=None, ae=None,):
        self.success = success
        self.ire = ire
        self.ace = ace
        self.ase = ase
        self.ae = ae

    def read(self, iprot):
        if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None:
            iprot._fast_decode(self, iprot, (self.__class__, self.thrift_spec))
            return
        iprot.readStructBegin()
        while True:
            (fname, ftype, fid) = iprot.readFieldBegin()
            if ftype == TType.STOP:
                break
            if fid == 0:
                if ftype == TType.STRING:
                    self.success = iprot.readString().decode('utf-8') if sys.version_info[0] == 2 else iprot.readString()
                else:
                    iprot.skip(ftype)
            elif fid == 1:
                if ftype == TType.STRUCT:
                    self.ire = apache.airavata.api.error.ttypes.InvalidRequestException()
                    self.ire.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 2:
                if ftype == TType.STRUCT:
                    self.ace = apache.airavata.api.error.ttypes.AiravataClientException()
                    self.ace.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 3:
                if ftype == TType.STRUCT:
                    self.ase = apache.airavata.api.error.ttypes.AiravataSystemException()
                    self.ase.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 4:
                if ftype == TType.STRUCT:
                    self.ae = apache.airavata.api.error.ttypes.AuthorizationException()
                    self.ae.read(iprot)
                else:
                    iprot.skip(ftype)
            else:
                iprot.skip(ftype)
            iprot.readFieldEnd()
        iprot.readStructEnd()

    def write(self, oprot):
        if oprot._fast_encode is not None and self.thrift_spec is not None:
            oprot.trans.write(oprot._fast_encode(self, (self.__class__, self.thrift_spec)))
            return
        oprot.writeStructBegin('addSSHJobSubmissionDetails_result')
        if self.success is not None:
            oprot.writeFieldBegin('success', TType.STRING, 0)
            oprot.writeString(self.success.encode('utf-8') if sys.version_info[0] == 2 else self.success)
            oprot.writeFieldEnd()
        if self.ire is not None:
            oprot.writeFieldBegin('ire', TType.STRUCT, 1)
            self.ire.write(oprot)
            oprot.writeFieldEnd()
        if self.ace is not None:
            oprot.writeFieldBegin('ace', TType.STRUCT, 2)
            self.ace.write(oprot)
            oprot.writeFieldEnd()
        if self.ase is not None:
            oprot.writeFieldBegin('ase', TType.STRUCT, 3)
            self.ase.write(oprot)
            oprot.writeFieldEnd()
        if self.ae is not None:
            oprot.writeFieldBegin('ae', TType.STRUCT, 4)
            self.ae.write(oprot)
            oprot.writeFieldEnd()
        oprot.writeFieldStop()
        oprot.writeStructEnd()

    def validate(self):
        return

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

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

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


class addSSHForkJobSubmissionDetails_args(object):
    """
    Attributes:
     - authzToken
     - computeResourceId
     - priorityOrder
     - sshJobSubmission
    """

    thrift_spec = (
        None,  # 0
        (1, TType.STRUCT, 'authzToken', (apache.airavata.model.security.ttypes.AuthzToken, apache.airavata.model.security.ttypes.AuthzToken.thrift_spec), None, ),  # 1
        (2, TType.STRING, 'computeResourceId', 'UTF8', None, ),  # 2
        (3, TType.I32, 'priorityOrder', None, None, ),  # 3
        (4, TType.STRUCT, 'sshJobSubmission', (apache.airavata.model.appcatalog.computeresource.ttypes.SSHJobSubmission, apache.airavata.model.appcatalog.computeresource.ttypes.SSHJobSubmission.thrift_spec), None, ),  # 4
    )

    def __init__(self, authzToken=None, computeResourceId=None, priorityOrder=None, sshJobSubmission=None,):
        self.authzToken = authzToken
        self.computeResourceId = computeResourceId
        self.priorityOrder = priorityOrder
        self.sshJobSubmission = sshJobSubmission

    def read(self, iprot):
        if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None:
            iprot._fast_decode(self, iprot, (self.__class__, self.thrift_spec))
            return
        iprot.readStructBegin()
        while True:
            (fname, ftype, fid) = iprot.readFieldBegin()
            if ftype == TType.STOP:
                break
            if fid == 1:
                if ftype == TType.STRUCT:
                    self.authzToken = apache.airavata.model.security.ttypes.AuthzToken()
                    self.authzToken.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 2:
                if ftype == TType.STRING:
                    self.computeResourceId = iprot.readString().decode('utf-8') if sys.version_info[0] == 2 else iprot.readString()
                else:
                    iprot.skip(ftype)
            elif fid == 3:
                if ftype == TType.I32:
                    self.priorityOrder = iprot.readI32()
                else:
                    iprot.skip(ftype)
            elif fid == 4:
                if ftype == TType.STRUCT:
                    self.sshJobSubmission = apache.airavata.model.appcatalog.computeresource.ttypes.SSHJobSubmission()
                    self.sshJobSubmission.read(iprot)
                else:
                    iprot.skip(ftype)
            else:
                iprot.skip(ftype)
            iprot.readFieldEnd()
        iprot.readStructEnd()

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

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

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

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

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


class addSSHForkJobSubmissionDetails_result(object):
    """
    Attributes:
     - success
     - ire
     - ace
     - ase
     - ae
    """

    thrift_spec = (
        (0, TType.STRING, 'success', 'UTF8', None, ),  # 0
        (1, TType.STRUCT, 'ire', (apache.airavata.api.error.ttypes.InvalidRequestException, apache.airavata.api.error.ttypes.InvalidRequestException.thrift_spec), None, ),  # 1
        (2, TType.STRUCT, 'ace', (apache.airavata.api.error.ttypes.AiravataClientException, apache.airavata.api.error.ttypes.AiravataClientException.thrift_spec), None, ),  # 2
        (3, TType.STRUCT, 'ase', (apache.airavata.api.error.ttypes.AiravataSystemException, apache.airavata.api.error.ttypes.AiravataSystemException.thrift_spec), None, ),  # 3
        (4, TType.STRUCT, 'ae', (apache.airavata.api.error.ttypes.AuthorizationException, apache.airavata.api.error.ttypes.AuthorizationException.thrift_spec), None, ),  # 4
    )

    def __init__(self, success=None, ire=None, ace=None, ase=None, ae=None,):
        self.success = success
        self.ire = ire
        self.ace = ace
        self.ase = ase
        self.ae = ae

    def read(self, iprot):
        if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None:
            iprot._fast_decode(self, iprot, (self.__class__, self.thrift_spec))
            return
        iprot.readStructBegin()
        while True:
            (fname, ftype, fid) = iprot.readFieldBegin()
            if ftype == TType.STOP:
                break
            if fid == 0:
                if ftype == TType.STRING:
                    self.success = iprot.readString().decode('utf-8') if sys.version_info[0] == 2 else iprot.readString()
                else:
                    iprot.skip(ftype)
            elif fid == 1:
                if ftype == TType.STRUCT:
                    self.ire = apache.airavata.api.error.ttypes.InvalidRequestException()
                    self.ire.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 2:
                if ftype == TType.STRUCT:
                    self.ace = apache.airavata.api.error.ttypes.AiravataClientException()
                    self.ace.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 3:
                if ftype == TType.STRUCT:
                    self.ase = apache.airavata.api.error.ttypes.AiravataSystemException()
                    self.ase.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 4:
                if ftype == TType.STRUCT:
                    self.ae = apache.airavata.api.error.ttypes.AuthorizationException()
                    self.ae.read(iprot)
                else:
                    iprot.skip(ftype)
            else:
                iprot.skip(ftype)
            iprot.readFieldEnd()
        iprot.readStructEnd()

    def write(self, oprot):
        if oprot._fast_encode is not None and self.thrift_spec is not None:
            oprot.trans.write(oprot._fast_encode(self, (self.__class__, self.thrift_spec)))
            return
        oprot.writeStructBegin('addSSHForkJobSubmissionDetails_result')
        if self.success is not None:
            oprot.writeFieldBegin('success', TType.STRING, 0)
            oprot.writeString(self.success.encode('utf-8') if sys.version_info[0] == 2 else self.success)
            oprot.writeFieldEnd()
        if self.ire is not None:
            oprot.writeFieldBegin('ire', TType.STRUCT, 1)
            self.ire.write(oprot)
            oprot.writeFieldEnd()
        if self.ace is not None:
            oprot.writeFieldBegin('ace', TType.STRUCT, 2)
            self.ace.write(oprot)
            oprot.writeFieldEnd()
        if self.ase is not None:
            oprot.writeFieldBegin('ase', TType.STRUCT, 3)
            self.ase.write(oprot)
            oprot.writeFieldEnd()
        if self.ae is not None:
            oprot.writeFieldBegin('ae', TType.STRUCT, 4)
            self.ae.write(oprot)
            oprot.writeFieldEnd()
        oprot.writeFieldStop()
        oprot.writeStructEnd()

    def validate(self):
        return

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

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

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


class getSSHJobSubmission_args(object):
    """
    Attributes:
     - authzToken
     - jobSubmissionId
    """

    thrift_spec = (
        None,  # 0
        (1, TType.STRUCT, 'authzToken', (apache.airavata.model.security.ttypes.AuthzToken, apache.airavata.model.security.ttypes.AuthzToken.thrift_spec), None, ),  # 1
        (2, TType.STRING, 'jobSubmissionId', 'UTF8', None, ),  # 2
    )

    def __init__(self, authzToken=None, jobSubmissionId=None,):
        self.authzToken = authzToken
        self.jobSubmissionId = jobSubmissionId

    def read(self, iprot):
        if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None:
            iprot._fast_decode(self, iprot, (self.__class__, self.thrift_spec))
            return
        iprot.readStructBegin()
        while True:
            (fname, ftype, fid) = iprot.readFieldBegin()
            if ftype == TType.STOP:
                break
            if fid == 1:
                if ftype == TType.STRUCT:
                    self.authzToken = apache.airavata.model.security.ttypes.AuthzToken()
                    self.authzToken.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 2:
                if ftype == TType.STRING:
                    self.jobSubmissionId = iprot.readString().decode('utf-8') if sys.version_info[0] == 2 else iprot.readString()
                else:
                    iprot.skip(ftype)
            else:
                iprot.skip(ftype)
            iprot.readFieldEnd()
        iprot.readStructEnd()

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

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

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

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

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


class getSSHJobSubmission_result(object):
    """
    Attributes:
     - success
     - ire
     - ace
     - ase
     - ae
    """

    thrift_spec = (
        (0, TType.STRUCT, 'success', (apache.airavata.model.appcatalog.computeresource.ttypes.SSHJobSubmission, apache.airavata.model.appcatalog.computeresource.ttypes.SSHJobSubmission.thrift_spec), None, ),  # 0
        (1, TType.STRUCT, 'ire', (apache.airavata.api.error.ttypes.InvalidRequestException, apache.airavata.api.error.ttypes.InvalidRequestException.thrift_spec), None, ),  # 1
        (2, TType.STRUCT, 'ace', (apache.airavata.api.error.ttypes.AiravataClientException, apache.airavata.api.error.ttypes.AiravataClientException.thrift_spec), None, ),  # 2
        (3, TType.STRUCT, 'ase', (apache.airavata.api.error.ttypes.AiravataSystemException, apache.airavata.api.error.ttypes.AiravataSystemException.thrift_spec), None, ),  # 3
        (4, TType.STRUCT, 'ae', (apache.airavata.api.error.ttypes.AuthorizationException, apache.airavata.api.error.ttypes.AuthorizationException.thrift_spec), None, ),  # 4
    )

    def __init__(self, success=None, ire=None, ace=None, ase=None, ae=None,):
        self.success = success
        self.ire = ire
        self.ace = ace
        self.ase = ase
        self.ae = ae

    def read(self, iprot):
        if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None:
            iprot._fast_decode(self, iprot, (self.__class__, self.thrift_spec))
            return
        iprot.readStructBegin()
        while True:
            (fname, ftype, fid) = iprot.readFieldBegin()
            if ftype == TType.STOP:
                break
            if fid == 0:
                if ftype == TType.STRUCT:
                    self.success = apache.airavata.model.appcatalog.computeresource.ttypes.SSHJobSubmission()
                    self.success.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 1:
                if ftype == TType.STRUCT:
                    self.ire = apache.airavata.api.error.ttypes.InvalidRequestException()
                    self.ire.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 2:
                if ftype == TType.STRUCT:
                    self.ace = apache.airavata.api.error.ttypes.AiravataClientException()
                    self.ace.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 3:
                if ftype == TType.STRUCT:
                    self.ase = apache.airavata.api.error.ttypes.AiravataSystemException()
                    self.ase.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 4:
                if ftype == TType.STRUCT:
                    self.ae = apache.airavata.api.error.ttypes.AuthorizationException()
                    self.ae.read(iprot)
                else:
                    iprot.skip(ftype)
            else:
                iprot.skip(ftype)
            iprot.readFieldEnd()
        iprot.readStructEnd()

    def write(self, oprot):
        if oprot._fast_encode is not None and self.thrift_spec is not None:
            oprot.trans.write(oprot._fast_encode(self, (self.__class__, self.thrift_spec)))
            return
        oprot.writeStructBegin('getSSHJobSubmission_result')
        if self.success is not None:
            oprot.writeFieldBegin('success', TType.STRUCT, 0)
            self.success.write(oprot)
            oprot.writeFieldEnd()
        if self.ire is not None:
            oprot.writeFieldBegin('ire', TType.STRUCT, 1)
            self.ire.write(oprot)
            oprot.writeFieldEnd()
        if self.ace is not None:
            oprot.writeFieldBegin('ace', TType.STRUCT, 2)
            self.ace.write(oprot)
            oprot.writeFieldEnd()
        if self.ase is not None:
            oprot.writeFieldBegin('ase', TType.STRUCT, 3)
            self.ase.write(oprot)
            oprot.writeFieldEnd()
        if self.ae is not None:
            oprot.writeFieldBegin('ae', TType.STRUCT, 4)
            self.ae.write(oprot)
            oprot.writeFieldEnd()
        oprot.writeFieldStop()
        oprot.writeStructEnd()

    def validate(self):
        return

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

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

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


class addUNICOREJobSubmissionDetails_args(object):
    """
    Attributes:
     - authzToken
     - computeResourceId
     - priorityOrder
     - unicoreJobSubmission
    """

    thrift_spec = (
        None,  # 0
        (1, TType.STRUCT, 'authzToken', (apache.airavata.model.security.ttypes.AuthzToken, apache.airavata.model.security.ttypes.AuthzToken.thrift_spec), None, ),  # 1
        (2, TType.STRING, 'computeResourceId', 'UTF8', None, ),  # 2
        (3, TType.I32, 'priorityOrder', None, None, ),  # 3
        (4, TType.STRUCT, 'unicoreJobSubmission', (apache.airavata.model.appcatalog.computeresource.ttypes.UnicoreJobSubmission, apache.airavata.model.appcatalog.computeresource.ttypes.UnicoreJobSubmission.thrift_spec), None, ),  # 4
    )

    def __init__(self, authzToken=None, computeResourceId=None, priorityOrder=None, unicoreJobSubmission=None,):
        self.authzToken = authzToken
        self.computeResourceId = computeResourceId
        self.priorityOrder = priorityOrder
        self.unicoreJobSubmission = unicoreJobSubmission

    def read(self, iprot):
        if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None:
            iprot._fast_decode(self, iprot, (self.__class__, self.thrift_spec))
            return
        iprot.readStructBegin()
        while True:
            (fname, ftype, fid) = iprot.readFieldBegin()
            if ftype == TType.STOP:
                break
            if fid == 1:
                if ftype == TType.STRUCT:
                    self.authzToken = apache.airavata.model.security.ttypes.AuthzToken()
                    self.authzToken.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 2:
                if ftype == TType.STRING:
                    self.computeResourceId = iprot.readString().decode('utf-8') if sys.version_info[0] == 2 else iprot.readString()
                else:
                    iprot.skip(ftype)
            elif fid == 3:
                if ftype == TType.I32:
                    self.priorityOrder = iprot.readI32()
                else:
                    iprot.skip(ftype)
            elif fid == 4:
                if ftype == TType.STRUCT:
                    self.unicoreJobSubmission = apache.airavata.model.appcatalog.computeresource.ttypes.UnicoreJobSubmission()
                    self.unicoreJobSubmission.read(iprot)
                else:
                    iprot.skip(ftype)
            else:
                iprot.skip(ftype)
            iprot.readFieldEnd()
        iprot.readStructEnd()

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

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

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

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

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


class addUNICOREJobSubmissionDetails_result(object):
    """
    Attributes:
     - success
     - ire
     - ace
     - ase
     - ae
    """

    thrift_spec = (
        (0, TType.STRING, 'success', 'UTF8', None, ),  # 0
        (1, TType.STRUCT, 'ire', (apache.airavata.api.error.ttypes.InvalidRequestException, apache.airavata.api.error.ttypes.InvalidRequestException.thrift_spec), None, ),  # 1
        (2, TType.STRUCT, 'ace', (apache.airavata.api.error.ttypes.AiravataClientException, apache.airavata.api.error.ttypes.AiravataClientException.thrift_spec), None, ),  # 2
        (3, TType.STRUCT, 'ase', (apache.airavata.api.error.ttypes.AiravataSystemException, apache.airavata.api.error.ttypes.AiravataSystemException.thrift_spec), None, ),  # 3
        (4, TType.STRUCT, 'ae', (apache.airavata.api.error.ttypes.AuthorizationException, apache.airavata.api.error.ttypes.AuthorizationException.thrift_spec), None, ),  # 4
    )

    def __init__(self, success=None, ire=None, ace=None, ase=None, ae=None,):
        self.success = success
        self.ire = ire
        self.ace = ace
        self.ase = ase
        self.ae = ae

    def read(self, iprot):
        if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None:
            iprot._fast_decode(self, iprot, (self.__class__, self.thrift_spec))
            return
        iprot.readStructBegin()
        while True:
            (fname, ftype, fid) = iprot.readFieldBegin()
            if ftype == TType.STOP:
                break
            if fid == 0:
                if ftype == TType.STRING:
                    self.success = iprot.readString().decode('utf-8') if sys.version_info[0] == 2 else iprot.readString()
                else:
                    iprot.skip(ftype)
            elif fid == 1:
                if ftype == TType.STRUCT:
                    self.ire = apache.airavata.api.error.ttypes.InvalidRequestException()
                    self.ire.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 2:
                if ftype == TType.STRUCT:
                    self.ace = apache.airavata.api.error.ttypes.AiravataClientException()
                    self.ace.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 3:
                if ftype == TType.STRUCT:
                    self.ase = apache.airavata.api.error.ttypes.AiravataSystemException()
                    self.ase.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 4:
                if ftype == TType.STRUCT:
                    self.ae = apache.airavata.api.error.ttypes.AuthorizationException()
                    self.ae.read(iprot)
                else:
                    iprot.skip(ftype)
            else:
                iprot.skip(ftype)
            iprot.readFieldEnd()
        iprot.readStructEnd()

    def write(self, oprot):
        if oprot._fast_encode is not None and self.thrift_spec is not None:
            oprot.trans.write(oprot._fast_encode(self, (self.__class__, self.thrift_spec)))
            return
        oprot.writeStructBegin('addUNICOREJobSubmissionDetails_result')
        if self.success is not None:
            oprot.writeFieldBegin('success', TType.STRING, 0)
            oprot.writeString(self.success.encode('utf-8') if sys.version_info[0] == 2 else self.success)
            oprot.writeFieldEnd()
        if self.ire is not None:
            oprot.writeFieldBegin('ire', TType.STRUCT, 1)
            self.ire.write(oprot)
            oprot.writeFieldEnd()
        if self.ace is not None:
            oprot.writeFieldBegin('ace', TType.STRUCT, 2)
            self.ace.write(oprot)
            oprot.writeFieldEnd()
        if self.ase is not None:
            oprot.writeFieldBegin('ase', TType.STRUCT, 3)
            self.ase.write(oprot)
            oprot.writeFieldEnd()
        if self.ae is not None:
            oprot.writeFieldBegin('ae', TType.STRUCT, 4)
            self.ae.write(oprot)
            oprot.writeFieldEnd()
        oprot.writeFieldStop()
        oprot.writeStructEnd()

    def validate(self):
        return

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

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

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


class getUnicoreJobSubmission_args(object):
    """
    Attributes:
     - authzToken
     - jobSubmissionId
    """

    thrift_spec = (
        None,  # 0
        (1, TType.STRUCT, 'authzToken', (apache.airavata.model.security.ttypes.AuthzToken, apache.airavata.model.security.ttypes.AuthzToken.thrift_spec), None, ),  # 1
        (2, TType.STRING, 'jobSubmissionId', 'UTF8', None, ),  # 2
    )

    def __init__(self, authzToken=None, jobSubmissionId=None,):
        self.authzToken = authzToken
        self.jobSubmissionId = jobSubmissionId

    def read(self, iprot):
        if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None:
            iprot._fast_decode(self, iprot, (self.__class__, self.thrift_spec))
            return
        iprot.readStructBegin()
        while True:
            (fname, ftype, fid) = iprot.readFieldBegin()
            if ftype == TType.STOP:
                break
            if fid == 1:
                if ftype == TType.STRUCT:
                    self.authzToken = apache.airavata.model.security.ttypes.AuthzToken()
                    self.authzToken.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 2:
                if ftype == TType.STRING:
                    self.jobSubmissionId = iprot.readString().decode('utf-8') if sys.version_info[0] == 2 else iprot.readString()
                else:
                    iprot.skip(ftype)
            else:
                iprot.skip(ftype)
            iprot.readFieldEnd()
        iprot.readStructEnd()

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

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

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

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

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


class getUnicoreJobSubmission_result(object):
    """
    Attributes:
     - success
     - ire
     - ace
     - ase
     - ae
    """

    thrift_spec = (
        (0, TType.STRUCT, 'success', (apache.airavata.model.appcatalog.computeresource.ttypes.UnicoreJobSubmission, apache.airavata.model.appcatalog.computeresource.ttypes.UnicoreJobSubmission.thrift_spec), None, ),  # 0
        (1, TType.STRUCT, 'ire', (apache.airavata.api.error.ttypes.InvalidRequestException, apache.airavata.api.error.ttypes.InvalidRequestException.thrift_spec), None, ),  # 1
        (2, TType.STRUCT, 'ace', (apache.airavata.api.error.ttypes.AiravataClientException, apache.airavata.api.error.ttypes.AiravataClientException.thrift_spec), None, ),  # 2
        (3, TType.STRUCT, 'ase', (apache.airavata.api.error.ttypes.AiravataSystemException, apache.airavata.api.error.ttypes.AiravataSystemException.thrift_spec), None, ),  # 3
        (4, TType.STRUCT, 'ae', (apache.airavata.api.error.ttypes.AuthorizationException, apache.airavata.api.error.ttypes.AuthorizationException.thrift_spec), None, ),  # 4
    )

    def __init__(self, success=None, ire=None, ace=None, ase=None, ae=None,):
        self.success = success
        self.ire = ire
        self.ace = ace
        self.ase = ase
        self.ae = ae

    def read(self, iprot):
        if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None:
            iprot._fast_decode(self, iprot, (self.__class__, self.thrift_spec))
            return
        iprot.readStructBegin()
        while True:
            (fname, ftype, fid) = iprot.readFieldBegin()
            if ftype == TType.STOP:
                break
            if fid == 0:
                if ftype == TType.STRUCT:
                    self.success = apache.airavata.model.appcatalog.computeresource.ttypes.UnicoreJobSubmission()
                    self.success.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 1:
                if ftype == TType.STRUCT:
                    self.ire = apache.airavata.api.error.ttypes.InvalidRequestException()
                    self.ire.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 2:
                if ftype == TType.STRUCT:
                    self.ace = apache.airavata.api.error.ttypes.AiravataClientException()
                    self.ace.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 3:
                if ftype == TType.STRUCT:
                    self.ase = apache.airavata.api.error.ttypes.AiravataSystemException()
                    self.ase.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 4:
                if ftype == TType.STRUCT:
                    self.ae = apache.airavata.api.error.ttypes.AuthorizationException()
                    self.ae.read(iprot)
                else:
                    iprot.skip(ftype)
            else:
                iprot.skip(ftype)
            iprot.readFieldEnd()
        iprot.readStructEnd()

    def write(self, oprot):
        if oprot._fast_encode is not None and self.thrift_spec is not None:
            oprot.trans.write(oprot._fast_encode(self, (self.__class__, self.thrift_spec)))
            return
        oprot.writeStructBegin('getUnicoreJobSubmission_result')
        if self.success is not None:
            oprot.writeFieldBegin('success', TType.STRUCT, 0)
            self.success.write(oprot)
            oprot.writeFieldEnd()
        if self.ire is not None:
            oprot.writeFieldBegin('ire', TType.STRUCT, 1)
            self.ire.write(oprot)
            oprot.writeFieldEnd()
        if self.ace is not None:
            oprot.writeFieldBegin('ace', TType.STRUCT, 2)
            self.ace.write(oprot)
            oprot.writeFieldEnd()
        if self.ase is not None:
            oprot.writeFieldBegin('ase', TType.STRUCT, 3)
            self.ase.write(oprot)
            oprot.writeFieldEnd()
        if self.ae is not None:
            oprot.writeFieldBegin('ae', TType.STRUCT, 4)
            self.ae.write(oprot)
            oprot.writeFieldEnd()
        oprot.writeFieldStop()
        oprot.writeStructEnd()

    def validate(self):
        return

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

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

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


class addCloudJobSubmissionDetails_args(object):
    """
    Attributes:
     - authzToken
     - computeResourceId
     - priorityOrder
     - cloudSubmission
    """

    thrift_spec = (
        None,  # 0
        (1, TType.STRUCT, 'authzToken', (apache.airavata.model.security.ttypes.AuthzToken, apache.airavata.model.security.ttypes.AuthzToken.thrift_spec), None, ),  # 1
        (2, TType.STRING, 'computeResourceId', 'UTF8', None, ),  # 2
        (3, TType.I32, 'priorityOrder', None, None, ),  # 3
        (4, TType.STRUCT, 'cloudSubmission', (apache.airavata.model.appcatalog.computeresource.ttypes.CloudJobSubmission, apache.airavata.model.appcatalog.computeresource.ttypes.CloudJobSubmission.thrift_spec), None, ),  # 4
    )

    def __init__(self, authzToken=None, computeResourceId=None, priorityOrder=None, cloudSubmission=None,):
        self.authzToken = authzToken
        self.computeResourceId = computeResourceId
        self.priorityOrder = priorityOrder
        self.cloudSubmission = cloudSubmission

    def read(self, iprot):
        if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None:
            iprot._fast_decode(self, iprot, (self.__class__, self.thrift_spec))
            return
        iprot.readStructBegin()
        while True:
            (fname, ftype, fid) = iprot.readFieldBegin()
            if ftype == TType.STOP:
                break
            if fid == 1:
                if ftype == TType.STRUCT:
                    self.authzToken = apache.airavata.model.security.ttypes.AuthzToken()
                    self.authzToken.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 2:
                if ftype == TType.STRING:
                    self.computeResourceId = iprot.readString().decode('utf-8') if sys.version_info[0] == 2 else iprot.readString()
                else:
                    iprot.skip(ftype)
            elif fid == 3:
                if ftype == TType.I32:
                    self.priorityOrder = iprot.readI32()
                else:
                    iprot.skip(ftype)
            elif fid == 4:
                if ftype == TType.STRUCT:
                    self.cloudSubmission = apache.airavata.model.appcatalog.computeresource.ttypes.CloudJobSubmission()
                    self.cloudSubmission.read(iprot)
                else:
                    iprot.skip(ftype)
            else:
                iprot.skip(ftype)
            iprot.readFieldEnd()
        iprot.readStructEnd()

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

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

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

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

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


class addCloudJobSubmissionDetails_result(object):
    """
    Attributes:
     - success
     - ire
     - ace
     - ase
     - ae
    """

    thrift_spec = (
        (0, TType.STRING, 'success', 'UTF8', None, ),  # 0
        (1, TType.STRUCT, 'ire', (apache.airavata.api.error.ttypes.InvalidRequestException, apache.airavata.api.error.ttypes.InvalidRequestException.thrift_spec), None, ),  # 1
        (2, TType.STRUCT, 'ace', (apache.airavata.api.error.ttypes.AiravataClientException, apache.airavata.api.error.ttypes.AiravataClientException.thrift_spec), None, ),  # 2
        (3, TType.STRUCT, 'ase', (apache.airavata.api.error.ttypes.AiravataSystemException, apache.airavata.api.error.ttypes.AiravataSystemException.thrift_spec), None, ),  # 3
        (4, TType.STRUCT, 'ae', (apache.airavata.api.error.ttypes.AuthorizationException, apache.airavata.api.error.ttypes.AuthorizationException.thrift_spec), None, ),  # 4
    )

    def __init__(self, success=None, ire=None, ace=None, ase=None, ae=None,):
        self.success = success
        self.ire = ire
        self.ace = ace
        self.ase = ase
        self.ae = ae

    def read(self, iprot):
        if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None:
            iprot._fast_decode(self, iprot, (self.__class__, self.thrift_spec))
            return
        iprot.readStructBegin()
        while True:
            (fname, ftype, fid) = iprot.readFieldBegin()
            if ftype == TType.STOP:
                break
            if fid == 0:
                if ftype == TType.STRING:
                    self.success = iprot.readString().decode('utf-8') if sys.version_info[0] == 2 else iprot.readString()
                else:
                    iprot.skip(ftype)
            elif fid == 1:
                if ftype == TType.STRUCT:
                    self.ire = apache.airavata.api.error.ttypes.InvalidRequestException()
                    self.ire.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 2:
                if ftype == TType.STRUCT:
                    self.ace = apache.airavata.api.error.ttypes.AiravataClientException()
                    self.ace.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 3:
                if ftype == TType.STRUCT:
                    self.ase = apache.airavata.api.error.ttypes.AiravataSystemException()
                    self.ase.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 4:
                if ftype == TType.STRUCT:
                    self.ae = apache.airavata.api.error.ttypes.AuthorizationException()
                    self.ae.read(iprot)
                else:
                    iprot.skip(ftype)
            else:
                iprot.skip(ftype)
            iprot.readFieldEnd()
        iprot.readStructEnd()

    def write(self, oprot):
        if oprot._fast_encode is not None and self.thrift_spec is not None:
            oprot.trans.write(oprot._fast_encode(self, (self.__class__, self.thrift_spec)))
            return
        oprot.writeStructBegin('addCloudJobSubmissionDetails_result')
        if self.success is not None:
            oprot.writeFieldBegin('success', TType.STRING, 0)
            oprot.writeString(self.success.encode('utf-8') if sys.version_info[0] == 2 else self.success)
            oprot.writeFieldEnd()
        if self.ire is not None:
            oprot.writeFieldBegin('ire', TType.STRUCT, 1)
            self.ire.write(oprot)
            oprot.writeFieldEnd()
        if self.ace is not None:
            oprot.writeFieldBegin('ace', TType.STRUCT, 2)
            self.ace.write(oprot)
            oprot.writeFieldEnd()
        if self.ase is not None:
            oprot.writeFieldBegin('ase', TType.STRUCT, 3)
            self.ase.write(oprot)
            oprot.writeFieldEnd()
        if self.ae is not None:
            oprot.writeFieldBegin('ae', TType.STRUCT, 4)
            self.ae.write(oprot)
            oprot.writeFieldEnd()
        oprot.writeFieldStop()
        oprot.writeStructEnd()

    def validate(self):
        return

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

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

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


class getCloudJobSubmission_args(object):
    """
    Attributes:
     - authzToken
     - jobSubmissionId
    """

    thrift_spec = (
        None,  # 0
        (1, TType.STRUCT, 'authzToken', (apache.airavata.model.security.ttypes.AuthzToken, apache.airavata.model.security.ttypes.AuthzToken.thrift_spec), None, ),  # 1
        (2, TType.STRING, 'jobSubmissionId', 'UTF8', None, ),  # 2
    )

    def __init__(self, authzToken=None, jobSubmissionId=None,):
        self.authzToken = authzToken
        self.jobSubmissionId = jobSubmissionId

    def read(self, iprot):
        if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None:
            iprot._fast_decode(self, iprot, (self.__class__, self.thrift_spec))
            return
        iprot.readStructBegin()
        while True:
            (fname, ftype, fid) = iprot.readFieldBegin()
            if ftype == TType.STOP:
                break
            if fid == 1:
                if ftype == TType.STRUCT:
                    self.authzToken = apache.airavata.model.security.ttypes.AuthzToken()
                    self.authzToken.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 2:
                if ftype == TType.STRING:
                    self.jobSubmissionId = iprot.readString().decode('utf-8') if sys.version_info[0] == 2 else iprot.readString()
                else:
                    iprot.skip(ftype)
            else:
                iprot.skip(ftype)
            iprot.readFieldEnd()
        iprot.readStructEnd()

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

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

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

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

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


class getCloudJobSubmission_result(object):
    """
    Attributes:
     - success
     - ire
     - ace
     - ase
     - ae
    """

    thrift_spec = (
        (0, TType.STRUCT, 'success', (apache.airavata.model.appcatalog.computeresource.ttypes.CloudJobSubmission, apache.airavata.model.appcatalog.computeresource.ttypes.CloudJobSubmission.thrift_spec), None, ),  # 0
        (1, TType.STRUCT, 'ire', (apache.airavata.api.error.ttypes.InvalidRequestException, apache.airavata.api.error.ttypes.InvalidRequestException.thrift_spec), None, ),  # 1
        (2, TType.STRUCT, 'ace', (apache.airavata.api.error.ttypes.AiravataClientException, apache.airavata.api.error.ttypes.AiravataClientException.thrift_spec), None, ),  # 2
        (3, TType.STRUCT, 'ase', (apache.airavata.api.error.ttypes.AiravataSystemException, apache.airavata.api.error.ttypes.AiravataSystemException.thrift_spec), None, ),  # 3
        (4, TType.STRUCT, 'ae', (apache.airavata.api.error.ttypes.AuthorizationException, apache.airavata.api.error.ttypes.AuthorizationException.thrift_spec), None, ),  # 4
    )

    def __init__(self, success=None, ire=None, ace=None, ase=None, ae=None,):
        self.success = success
        self.ire = ire
        self.ace = ace
        self.ase = ase
        self.ae = ae

    def read(self, iprot):
        if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None:
            iprot._fast_decode(self, iprot, (self.__class__, self.thrift_spec))
            return
        iprot.readStructBegin()
        while True:
            (fname, ftype, fid) = iprot.readFieldBegin()
            if ftype == TType.STOP:
                break
            if fid == 0:
                if ftype == TType.STRUCT:
                    self.success = apache.airavata.model.appcatalog.computeresource.ttypes.CloudJobSubmission()
                    self.success.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 1:
                if ftype == TType.STRUCT:
                    self.ire = apache.airavata.api.error.ttypes.InvalidRequestException()
                    self.ire.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 2:
                if ftype == TType.STRUCT:
                    self.ace = apache.airavata.api.error.ttypes.AiravataClientException()
                    self.ace.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 3:
                if ftype == TType.STRUCT:
                    self.ase = apache.airavata.api.error.ttypes.AiravataSystemException()
                    self.ase.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 4:
                if ftype == TType.STRUCT:
                    self.ae = apache.airavata.api.error.ttypes.AuthorizationException()
                    self.ae.read(iprot)
                else:
                    iprot.skip(ftype)
            else:
                iprot.skip(ftype)
            iprot.readFieldEnd()
        iprot.readStructEnd()

    def write(self, oprot):
        if oprot._fast_encode is not None and self.thrift_spec is not None:
            oprot.trans.write(oprot._fast_encode(self, (self.__class__, self.thrift_spec)))
            return
        oprot.writeStructBegin('getCloudJobSubmission_result')
        if self.success is not None:
            oprot.writeFieldBegin('success', TType.STRUCT, 0)
            self.success.write(oprot)
            oprot.writeFieldEnd()
        if self.ire is not None:
            oprot.writeFieldBegin('ire', TType.STRUCT, 1)
            self.ire.write(oprot)
            oprot.writeFieldEnd()
        if self.ace is not None:
            oprot.writeFieldBegin('ace', TType.STRUCT, 2)
            self.ace.write(oprot)
            oprot.writeFieldEnd()
        if self.ase is not None:
            oprot.writeFieldBegin('ase', TType.STRUCT, 3)
            self.ase.write(oprot)
            oprot.writeFieldEnd()
        if self.ae is not None:
            oprot.writeFieldBegin('ae', TType.STRUCT, 4)
            self.ae.write(oprot)
            oprot.writeFieldEnd()
        oprot.writeFieldStop()
        oprot.writeStructEnd()

    def validate(self):
        return

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

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

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


class updateSSHJobSubmissionDetails_args(object):
    """
    Attributes:
     - authzToken
     - jobSubmissionInterfaceId
     - sshJobSubmission
    """

    thrift_spec = (
        None,  # 0
        (1, TType.STRUCT, 'authzToken', (apache.airavata.model.security.ttypes.AuthzToken, apache.airavata.model.security.ttypes.AuthzToken.thrift_spec), None, ),  # 1
        (2, TType.STRING, 'jobSubmissionInterfaceId', 'UTF8', None, ),  # 2
        (3, TType.STRUCT, 'sshJobSubmission', (apache.airavata.model.appcatalog.computeresource.ttypes.SSHJobSubmission, apache.airavata.model.appcatalog.computeresource.ttypes.SSHJobSubmission.thrift_spec), None, ),  # 3
    )

    def __init__(self, authzToken=None, jobSubmissionInterfaceId=None, sshJobSubmission=None,):
        self.authzToken = authzToken
        self.jobSubmissionInterfaceId = jobSubmissionInterfaceId
        self.sshJobSubmission = sshJobSubmission

    def read(self, iprot):
        if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None:
            iprot._fast_decode(self, iprot, (self.__class__, self.thrift_spec))
            return
        iprot.readStructBegin()
        while True:
            (fname, ftype, fid) = iprot.readFieldBegin()
            if ftype == TType.STOP:
                break
            if fid == 1:
                if ftype == TType.STRUCT:
                    self.authzToken = apache.airavata.model.security.ttypes.AuthzToken()
                    self.authzToken.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 2:
                if ftype == TType.STRING:
                    self.jobSubmissionInterfaceId = iprot.readString().decode('utf-8') if sys.version_info[0] == 2 else iprot.readString()
                else:
                    iprot.skip(ftype)
            elif fid == 3:
                if ftype == TType.STRUCT:
                    self.sshJobSubmission = apache.airavata.model.appcatalog.computeresource.ttypes.SSHJobSubmission()
                    self.sshJobSubmission.read(iprot)
                else:
                    iprot.skip(ftype)
            else:
                iprot.skip(ftype)
            iprot.readFieldEnd()
        iprot.readStructEnd()

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

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

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

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

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


class updateSSHJobSubmissionDetails_result(object):
    """
    Attributes:
     - success
     - ire
     - ace
     - ase
     - ae
    """

    thrift_spec = (
        (0, TType.BOOL, 'success', None, None, ),  # 0
        (1, TType.STRUCT, 'ire', (apache.airavata.api.error.ttypes.InvalidRequestException, apache.airavata.api.error.ttypes.InvalidRequestException.thrift_spec), None, ),  # 1
        (2, TType.STRUCT, 'ace', (apache.airavata.api.error.ttypes.AiravataClientException, apache.airavata.api.error.ttypes.AiravataClientException.thrift_spec), None, ),  # 2
        (3, TType.STRUCT, 'ase', (apache.airavata.api.error.ttypes.AiravataSystemException, apache.airavata.api.error.ttypes.AiravataSystemException.thrift_spec), None, ),  # 3
        (4, TType.STRUCT, 'ae', (apache.airavata.api.error.ttypes.AuthorizationException, apache.airavata.api.error.ttypes.AuthorizationException.thrift_spec), None, ),  # 4
    )

    def __init__(self, success=None, ire=None, ace=None, ase=None, ae=None,):
        self.success = success
        self.ire = ire
        self.ace = ace
        self.ase = ase
        self.ae = ae

    def read(self, iprot):
        if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None:
            iprot._fast_decode(self, iprot, (self.__class__, self.thrift_spec))
            return
        iprot.readStructBegin()
        while True:
            (fname, ftype, fid) = iprot.readFieldBegin()
            if ftype == TType.STOP:
                break
            if fid == 0:
                if ftype == TType.BOOL:
                    self.success = iprot.readBool()
                else:
                    iprot.skip(ftype)
            elif fid == 1:
                if ftype == TType.STRUCT:
                    self.ire = apache.airavata.api.error.ttypes.InvalidRequestException()
                    self.ire.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 2:
                if ftype == TType.STRUCT:
                    self.ace = apache.airavata.api.error.ttypes.AiravataClientException()
                    self.ace.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 3:
                if ftype == TType.STRUCT:
                    self.ase = apache.airavata.api.error.ttypes.AiravataSystemException()
                    self.ase.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 4:
                if ftype == TType.STRUCT:
                    self.ae = apache.airavata.api.error.ttypes.AuthorizationException()
                    self.ae.read(iprot)
                else:
                    iprot.skip(ftype)
            else:
                iprot.skip(ftype)
            iprot.readFieldEnd()
        iprot.readStructEnd()

    def write(self, oprot):
        if oprot._fast_encode is not None and self.thrift_spec is not None:
            oprot.trans.write(oprot._fast_encode(self, (self.__class__, self.thrift_spec)))
            return
        oprot.writeStructBegin('updateSSHJobSubmissionDetails_result')
        if self.success is not None:
            oprot.writeFieldBegin('success', TType.BOOL, 0)
            oprot.writeBool(self.success)
            oprot.writeFieldEnd()
        if self.ire is not None:
            oprot.writeFieldBegin('ire', TType.STRUCT, 1)
            self.ire.write(oprot)
            oprot.writeFieldEnd()
        if self.ace is not None:
            oprot.writeFieldBegin('ace', TType.STRUCT, 2)
            self.ace.write(oprot)
            oprot.writeFieldEnd()
        if self.ase is not None:
            oprot.writeFieldBegin('ase', TType.STRUCT, 3)
            self.ase.write(oprot)
            oprot.writeFieldEnd()
        if self.ae is not None:
            oprot.writeFieldBegin('ae', TType.STRUCT, 4)
            self.ae.write(oprot)
            oprot.writeFieldEnd()
        oprot.writeFieldStop()
        oprot.writeStructEnd()

    def validate(self):
        return

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

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

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


class updateCloudJobSubmissionDetails_args(object):
    """
    Attributes:
     - authzToken
     - jobSubmissionInterfaceId
     - sshJobSubmission
    """

    thrift_spec = (
        None,  # 0
        (1, TType.STRUCT, 'authzToken', (apache.airavata.model.security.ttypes.AuthzToken, apache.airavata.model.security.ttypes.AuthzToken.thrift_spec), None, ),  # 1
        (2, TType.STRING, 'jobSubmissionInterfaceId', 'UTF8', None, ),  # 2
        (3, TType.STRUCT, 'sshJobSubmission', (apache.airavata.model.appcatalog.computeresource.ttypes.CloudJobSubmission, apache.airavata.model.appcatalog.computeresource.ttypes.CloudJobSubmission.thrift_spec), None, ),  # 3
    )

    def __init__(self, authzToken=None, jobSubmissionInterfaceId=None, sshJobSubmission=None,):
        self.authzToken = authzToken
        self.jobSubmissionInterfaceId = jobSubmissionInterfaceId
        self.sshJobSubmission = sshJobSubmission

    def read(self, iprot):
        if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None:
            iprot._fast_decode(self, iprot, (self.__class__, self.thrift_spec))
            return
        iprot.readStructBegin()
        while True:
            (fname, ftype, fid) = iprot.readFieldBegin()
            if ftype == TType.STOP:
                break
            if fid == 1:
                if ftype == TType.STRUCT:
                    self.authzToken = apache.airavata.model.security.ttypes.AuthzToken()
                    self.authzToken.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 2:
                if ftype == TType.STRING:
                    self.jobSubmissionInterfaceId = iprot.readString().decode('utf-8') if sys.version_info[0] == 2 else iprot.readString()
                else:
                    iprot.skip(ftype)
            elif fid == 3:
                if ftype == TType.STRUCT:
                    self.sshJobSubmission = apache.airavata.model.appcatalog.computeresource.ttypes.CloudJobSubmission()
                    self.sshJobSubmission.read(iprot)
                else:
                    iprot.skip(ftype)
            else:
                iprot.skip(ftype)
            iprot.readFieldEnd()
        iprot.readStructEnd()

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

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

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

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

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


class updateCloudJobSubmissionDetails_result(object):
    """
    Attributes:
     - success
     - ire
     - ace
     - ase
     - ae
    """

    thrift_spec = (
        (0, TType.BOOL, 'success', None, None, ),  # 0
        (1, TType.STRUCT, 'ire', (apache.airavata.api.error.ttypes.InvalidRequestException, apache.airavata.api.error.ttypes.InvalidRequestException.thrift_spec), None, ),  # 1
        (2, TType.STRUCT, 'ace', (apache.airavata.api.error.ttypes.AiravataClientException, apache.airavata.api.error.ttypes.AiravataClientException.thrift_spec), None, ),  # 2
        (3, TType.STRUCT, 'ase', (apache.airavata.api.error.ttypes.AiravataSystemException, apache.airavata.api.error.ttypes.AiravataSystemException.thrift_spec), None, ),  # 3
        (4, TType.STRUCT, 'ae', (apache.airavata.api.error.ttypes.AuthorizationException, apache.airavata.api.error.ttypes.AuthorizationException.thrift_spec), None, ),  # 4
    )

    def __init__(self, success=None, ire=None, ace=None, ase=None, ae=None,):
        self.success = success
        self.ire = ire
        self.ace = ace
        self.ase = ase
        self.ae = ae

    def read(self, iprot):
        if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None:
            iprot._fast_decode(self, iprot, (self.__class__, self.thrift_spec))
            return
        iprot.readStructBegin()
        while True:
            (fname, ftype, fid) = iprot.readFieldBegin()
            if ftype == TType.STOP:
                break
            if fid == 0:
                if ftype == TType.BOOL:
                    self.success = iprot.readBool()
                else:
                    iprot.skip(ftype)
            elif fid == 1:
                if ftype == TType.STRUCT:
                    self.ire = apache.airavata.api.error.ttypes.InvalidRequestException()
                    self.ire.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 2:
                if ftype == TType.STRUCT:
                    self.ace = apache.airavata.api.error.ttypes.AiravataClientException()
                    self.ace.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 3:
                if ftype == TType.STRUCT:
                    self.ase = apache.airavata.api.error.ttypes.AiravataSystemException()
                    self.ase.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 4:
                if ftype == TType.STRUCT:
                    self.ae = apache.airavata.api.error.ttypes.AuthorizationException()
                    self.ae.read(iprot)
                else:
                    iprot.skip(ftype)
            else:
                iprot.skip(ftype)
            iprot.readFieldEnd()
        iprot.readStructEnd()

    def write(self, oprot):
        if oprot._fast_encode is not None and self.thrift_spec is not None:
            oprot.trans.write(oprot._fast_encode(self, (self.__class__, self.thrift_spec)))
            return
        oprot.writeStructBegin('updateCloudJobSubmissionDetails_result')
        if self.success is not None:
            oprot.writeFieldBegin('success', TType.BOOL, 0)
            oprot.writeBool(self.success)
            oprot.writeFieldEnd()
        if self.ire is not None:
            oprot.writeFieldBegin('ire', TType.STRUCT, 1)
            self.ire.write(oprot)
            oprot.writeFieldEnd()
        if self.ace is not None:
            oprot.writeFieldBegin('ace', TType.STRUCT, 2)
            self.ace.write(oprot)
            oprot.writeFieldEnd()
        if self.ase is not None:
            oprot.writeFieldBegin('ase', TType.STRUCT, 3)
            self.ase.write(oprot)
            oprot.writeFieldEnd()
        if self.ae is not None:
            oprot.writeFieldBegin('ae', TType.STRUCT, 4)
            self.ae.write(oprot)
            oprot.writeFieldEnd()
        oprot.writeFieldStop()
        oprot.writeStructEnd()

    def validate(self):
        return

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

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

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


class updateUnicoreJobSubmissionDetails_args(object):
    """
    Attributes:
     - authzToken
     - jobSubmissionInterfaceId
     - unicoreJobSubmission
    """

    thrift_spec = (
        None,  # 0
        (1, TType.STRUCT, 'authzToken', (apache.airavata.model.security.ttypes.AuthzToken, apache.airavata.model.security.ttypes.AuthzToken.thrift_spec), None, ),  # 1
        (2, TType.STRING, 'jobSubmissionInterfaceId', 'UTF8', None, ),  # 2
        (3, TType.STRUCT, 'unicoreJobSubmission', (apache.airavata.model.appcatalog.computeresource.ttypes.UnicoreJobSubmission, apache.airavata.model.appcatalog.computeresource.ttypes.UnicoreJobSubmission.thrift_spec), None, ),  # 3
    )

    def __init__(self, authzToken=None, jobSubmissionInterfaceId=None, unicoreJobSubmission=None,):
        self.authzToken = authzToken
        self.jobSubmissionInterfaceId = jobSubmissionInterfaceId
        self.unicoreJobSubmission = unicoreJobSubmission

    def read(self, iprot):
        if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None:
            iprot._fast_decode(self, iprot, (self.__class__, self.thrift_spec))
            return
        iprot.readStructBegin()
        while True:
            (fname, ftype, fid) = iprot.readFieldBegin()
            if ftype == TType.STOP:
                break
            if fid == 1:
                if ftype == TType.STRUCT:
                    self.authzToken = apache.airavata.model.security.ttypes.AuthzToken()
                    self.authzToken.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 2:
                if ftype == TType.STRING:
                    self.jobSubmissionInterfaceId = iprot.readString().decode('utf-8') if sys.version_info[0] == 2 else iprot.readString()
                else:
                    iprot.skip(ftype)
            elif fid == 3:
                if ftype == TType.STRUCT:
                    self.unicoreJobSubmission = apache.airavata.model.appcatalog.computeresource.ttypes.UnicoreJobSubmission()
                    self.unicoreJobSubmission.read(iprot)
                else:
                    iprot.skip(ftype)
            else:
                iprot.skip(ftype)
            iprot.readFieldEnd()
        iprot.readStructEnd()

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

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

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

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

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


class updateUnicoreJobSubmissionDetails_result(object):
    """
    Attributes:
     - success
     - ire
     - ace
     - ase
     - ae
    """

    thrift_spec = (
        (0, TType.BOOL, 'success', None, None, ),  # 0
        (1, TType.STRUCT, 'ire', (apache.airavata.api.error.ttypes.InvalidRequestException, apache.airavata.api.error.ttypes.InvalidRequestException.thrift_spec), None, ),  # 1
        (2, TType.STRUCT, 'ace', (apache.airavata.api.error.ttypes.AiravataClientException, apache.airavata.api.error.ttypes.AiravataClientException.thrift_spec), None, ),  # 2
        (3, TType.STRUCT, 'ase', (apache.airavata.api.error.ttypes.AiravataSystemException, apache.airavata.api.error.ttypes.AiravataSystemException.thrift_spec), None, ),  # 3
        (4, TType.STRUCT, 'ae', (apache.airavata.api.error.ttypes.AuthorizationException, apache.airavata.api.error.ttypes.AuthorizationException.thrift_spec), None, ),  # 4
    )

    def __init__(self, success=None, ire=None, ace=None, ase=None, ae=None,):
        self.success = success
        self.ire = ire
        self.ace = ace
        self.ase = ase
        self.ae = ae

    def read(self, iprot):
        if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None:
            iprot._fast_decode(self, iprot, (self.__class__, self.thrift_spec))
            return
        iprot.readStructBegin()
        while True:
            (fname, ftype, fid) = iprot.readFieldBegin()
            if ftype == TType.STOP:
                break
            if fid == 0:
                if ftype == TType.BOOL:
                    self.success = iprot.readBool()
                else:
                    iprot.skip(ftype)
            elif fid == 1:
                if ftype == TType.STRUCT:
                    self.ire = apache.airavata.api.error.ttypes.InvalidRequestException()
                    self.ire.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 2:
                if ftype == TType.STRUCT:
                    self.ace = apache.airavata.api.error.ttypes.AiravataClientException()
                    self.ace.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 3:
                if ftype == TType.STRUCT:
                    self.ase = apache.airavata.api.error.ttypes.AiravataSystemException()
                    self.ase.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 4:
                if ftype == TType.STRUCT:
                    self.ae = apache.airavata.api.error.ttypes.AuthorizationException()
                    self.ae.read(iprot)
                else:
                    iprot.skip(ftype)
            else:
                iprot.skip(ftype)
            iprot.readFieldEnd()
        iprot.readStructEnd()

    def write(self, oprot):
        if oprot._fast_encode is not None and self.thrift_spec is not None:
            oprot.trans.write(oprot._fast_encode(self, (self.__class__, self.thrift_spec)))
            return
        oprot.writeStructBegin('updateUnicoreJobSubmissionDetails_result')
        if self.success is not None:
            oprot.writeFieldBegin('success', TType.BOOL, 0)
            oprot.writeBool(self.success)
            oprot.writeFieldEnd()
        if self.ire is not None:
            oprot.writeFieldBegin('ire', TType.STRUCT, 1)
            self.ire.write(oprot)
            oprot.writeFieldEnd()
        if self.ace is not None:
            oprot.writeFieldBegin('ace', TType.STRUCT, 2)
            self.ace.write(oprot)
            oprot.writeFieldEnd()
        if self.ase is not None:
            oprot.writeFieldBegin('ase', TType.STRUCT, 3)
            self.ase.write(oprot)
            oprot.writeFieldEnd()
        if self.ae is not None:
            oprot.writeFieldBegin('ae', TType.STRUCT, 4)
            self.ae.write(oprot)
            oprot.writeFieldEnd()
        oprot.writeFieldStop()
        oprot.writeStructEnd()

    def validate(self):
        return

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

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

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


class addLocalDataMovementDetails_args(object):
    """
    Attributes:
     - authzToken
     - productUri
     - dataMoveType
     - priorityOrder
     - localDataMovement
    """

    thrift_spec = (
        None,  # 0
        (1, TType.STRUCT, 'authzToken', (apache.airavata.model.security.ttypes.AuthzToken, apache.airavata.model.security.ttypes.AuthzToken.thrift_spec), None, ),  # 1
        (2, TType.STRING, 'productUri', 'UTF8', None, ),  # 2
        (3, TType.I32, 'dataMoveType', None, None, ),  # 3
        (4, TType.I32, 'priorityOrder', None, None, ),  # 4
        (5, TType.STRUCT, 'localDataMovement', (apache.airavata.model.data.movement.ttypes.LOCALDataMovement, apache.airavata.model.data.movement.ttypes.LOCALDataMovement.thrift_spec), None, ),  # 5
    )

    def __init__(self, authzToken=None, productUri=None, dataMoveType=None, priorityOrder=None, localDataMovement=None,):
        self.authzToken = authzToken
        self.productUri = productUri
        self.dataMoveType = dataMoveType
        self.priorityOrder = priorityOrder
        self.localDataMovement = localDataMovement

    def read(self, iprot):
        if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None:
            iprot._fast_decode(self, iprot, (self.__class__, self.thrift_spec))
            return
        iprot.readStructBegin()
        while True:
            (fname, ftype, fid) = iprot.readFieldBegin()
            if ftype == TType.STOP:
                break
            if fid == 1:
                if ftype == TType.STRUCT:
                    self.authzToken = apache.airavata.model.security.ttypes.AuthzToken()
                    self.authzToken.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 2:
                if ftype == TType.STRING:
                    self.productUri = iprot.readString().decode('utf-8') if sys.version_info[0] == 2 else iprot.readString()
                else:
                    iprot.skip(ftype)
            elif fid == 3:
                if ftype == TType.I32:
                    self.dataMoveType = iprot.readI32()
                else:
                    iprot.skip(ftype)
            elif fid == 4:
                if ftype == TType.I32:
                    self.priorityOrder = iprot.readI32()
                else:
                    iprot.skip(ftype)
            elif fid == 5:
                if ftype == TType.STRUCT:
                    self.localDataMovement = apache.airavata.model.data.movement.ttypes.LOCALDataMovement()
                    self.localDataMovement.read(iprot)
                else:
                    iprot.skip(ftype)
            else:
                iprot.skip(ftype)
            iprot.readFieldEnd()
        iprot.readStructEnd()

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

    def validate(self):
        if self.authzToken is None:
            raise TProtocolException(message='Required field authzToken is unset!')
        if self.productUri is None:
            raise TProtocolException(message='Required field productUri is unset!')
        if self.dataMoveType is None:
            raise TProtocolException(message='Required field dataMoveType is unset!')
        if self.priorityOrder is None:
            raise TProtocolException(message='Required field priorityOrder is unset!')
        if self.localDataMovement is None:
            raise TProtocolException(message='Required field localDataMovement is unset!')
        return

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

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

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


class addLocalDataMovementDetails_result(object):
    """
    Attributes:
     - success
     - ire
     - ace
     - ase
     - ae
    """

    thrift_spec = (
        (0, TType.STRING, 'success', 'UTF8', None, ),  # 0
        (1, TType.STRUCT, 'ire', (apache.airavata.api.error.ttypes.InvalidRequestException, apache.airavata.api.error.ttypes.InvalidRequestException.thrift_spec), None, ),  # 1
        (2, TType.STRUCT, 'ace', (apache.airavata.api.error.ttypes.AiravataClientException, apache.airavata.api.error.ttypes.AiravataClientException.thrift_spec), None, ),  # 2
        (3, TType.STRUCT, 'ase', (apache.airavata.api.error.ttypes.AiravataSystemException, apache.airavata.api.error.ttypes.AiravataSystemException.thrift_spec), None, ),  # 3
        (4, TType.STRUCT, 'ae', (apache.airavata.api.error.ttypes.AuthorizationException, apache.airavata.api.error.ttypes.AuthorizationException.thrift_spec), None, ),  # 4
    )

    def __init__(self, success=None, ire=None, ace=None, ase=None, ae=None,):
        self.success = success
        self.ire = ire
        self.ace = ace
        self.ase = ase
        self.ae = ae

    def read(self, iprot):
        if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None:
            iprot._fast_decode(self, iprot, (self.__class__, self.thrift_spec))
            return
        iprot.readStructBegin()
        while True:
            (fname, ftype, fid) = iprot.readFieldBegin()
            if ftype == TType.STOP:
                break
            if fid == 0:
                if ftype == TType.STRING:
                    self.success = iprot.readString().decode('utf-8') if sys.version_info[0] == 2 else iprot.readString()
                else:
                    iprot.skip(ftype)
            elif fid == 1:
                if ftype == TType.STRUCT:
                    self.ire = apache.airavata.api.error.ttypes.InvalidRequestException()
                    self.ire.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 2:
                if ftype == TType.STRUCT:
                    self.ace = apache.airavata.api.error.ttypes.AiravataClientException()
                    self.ace.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 3:
                if ftype == TType.STRUCT:
                    self.ase = apache.airavata.api.error.ttypes.AiravataSystemException()
                    self.ase.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 4:
                if ftype == TType.STRUCT:
                    self.ae = apache.airavata.api.error.ttypes.AuthorizationException()
                    self.ae.read(iprot)
                else:
                    iprot.skip(ftype)
            else:
                iprot.skip(ftype)
            iprot.readFieldEnd()
        iprot.readStructEnd()

    def write(self, oprot):
        if oprot._fast_encode is not None and self.thrift_spec is not None:
            oprot.trans.write(oprot._fast_encode(self, (self.__class__, self.thrift_spec)))
            return
        oprot.writeStructBegin('addLocalDataMovementDetails_result')
        if self.success is not None:
            oprot.writeFieldBegin('success', TType.STRING, 0)
            oprot.writeString(self.success.encode('utf-8') if sys.version_info[0] == 2 else self.success)
            oprot.writeFieldEnd()
        if self.ire is not None:
            oprot.writeFieldBegin('ire', TType.STRUCT, 1)
            self.ire.write(oprot)
            oprot.writeFieldEnd()
        if self.ace is not None:
            oprot.writeFieldBegin('ace', TType.STRUCT, 2)
            self.ace.write(oprot)
            oprot.writeFieldEnd()
        if self.ase is not None:
            oprot.writeFieldBegin('ase', TType.STRUCT, 3)
            self.ase.write(oprot)
            oprot.writeFieldEnd()
        if self.ae is not None:
            oprot.writeFieldBegin('ae', TType.STRUCT, 4)
            self.ae.write(oprot)
            oprot.writeFieldEnd()
        oprot.writeFieldStop()
        oprot.writeStructEnd()

    def validate(self):
        return

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

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

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


class updateLocalDataMovementDetails_args(object):
    """
    Attributes:
     - authzToken
     - dataMovementInterfaceId
     - localDataMovement
    """

    thrift_spec = (
        None,  # 0
        (1, TType.STRUCT, 'authzToken', (apache.airavata.model.security.ttypes.AuthzToken, apache.airavata.model.security.ttypes.AuthzToken.thrift_spec), None, ),  # 1
        (2, TType.STRING, 'dataMovementInterfaceId', 'UTF8', None, ),  # 2
        (3, TType.STRUCT, 'localDataMovement', (apache.airavata.model.data.movement.ttypes.LOCALDataMovement, apache.airavata.model.data.movement.ttypes.LOCALDataMovement.thrift_spec), None, ),  # 3
    )

    def __init__(self, authzToken=None, dataMovementInterfaceId=None, localDataMovement=None,):
        self.authzToken = authzToken
        self.dataMovementInterfaceId = dataMovementInterfaceId
        self.localDataMovement = localDataMovement

    def read(self, iprot):
        if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None:
            iprot._fast_decode(self, iprot, (self.__class__, self.thrift_spec))
            return
        iprot.readStructBegin()
        while True:
            (fname, ftype, fid) = iprot.readFieldBegin()
            if ftype == TType.STOP:
                break
            if fid == 1:
                if ftype == TType.STRUCT:
                    self.authzToken = apache.airavata.model.security.ttypes.AuthzToken()
                    self.authzToken.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 2:
                if ftype == TType.STRING:
                    self.dataMovementInterfaceId = iprot.readString().decode('utf-8') if sys.version_info[0] == 2 else iprot.readString()
                else:
                    iprot.skip(ftype)
            elif fid == 3:
                if ftype == TType.STRUCT:
                    self.localDataMovement = apache.airavata.model.data.movement.ttypes.LOCALDataMovement()
                    self.localDataMovement.read(iprot)
                else:
                    iprot.skip(ftype)
            else:
                iprot.skip(ftype)
            iprot.readFieldEnd()
        iprot.readStructEnd()

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

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

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

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

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


class updateLocalDataMovementDetails_result(object):
    """
    Attributes:
     - success
     - ire
     - ace
     - ase
     - ae
    """

    thrift_spec = (
        (0, TType.BOOL, 'success', None, None, ),  # 0
        (1, TType.STRUCT, 'ire', (apache.airavata.api.error.ttypes.InvalidRequestException, apache.airavata.api.error.ttypes.InvalidRequestException.thrift_spec), None, ),  # 1
        (2, TType.STRUCT, 'ace', (apache.airavata.api.error.ttypes.AiravataClientException, apache.airavata.api.error.ttypes.AiravataClientException.thrift_spec), None, ),  # 2
        (3, TType.STRUCT, 'ase', (apache.airavata.api.error.ttypes.AiravataSystemException, apache.airavata.api.error.ttypes.AiravataSystemException.thrift_spec), None, ),  # 3
        (4, TType.STRUCT, 'ae', (apache.airavata.api.error.ttypes.AuthorizationException, apache.airavata.api.error.ttypes.AuthorizationException.thrift_spec), None, ),  # 4
    )

    def __init__(self, success=None, ire=None, ace=None, ase=None, ae=None,):
        self.success = success
        self.ire = ire
        self.ace = ace
        self.ase = ase
        self.ae = ae

    def read(self, iprot):
        if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None:
            iprot._fast_decode(self, iprot, (self.__class__, self.thrift_spec))
            return
        iprot.readStructBegin()
        while True:
            (fname, ftype, fid) = iprot.readFieldBegin()
            if ftype == TType.STOP:
                break
            if fid == 0:
                if ftype == TType.BOOL:
                    self.success = iprot.readBool()
                else:
                    iprot.skip(ftype)
            elif fid == 1:
                if ftype == TType.STRUCT:
                    self.ire = apache.airavata.api.error.ttypes.InvalidRequestException()
                    self.ire.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 2:
                if ftype == TType.STRUCT:
                    self.ace = apache.airavata.api.error.ttypes.AiravataClientException()
                    self.ace.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 3:
                if ftype == TType.STRUCT:
                    self.ase = apache.airavata.api.error.ttypes.AiravataSystemException()
                    self.ase.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 4:
                if ftype == TType.STRUCT:
                    self.ae = apache.airavata.api.error.ttypes.AuthorizationException()
                    self.ae.read(iprot)
                else:
                    iprot.skip(ftype)
            else:
                iprot.skip(ftype)
            iprot.readFieldEnd()
        iprot.readStructEnd()

    def write(self, oprot):
        if oprot._fast_encode is not None and self.thrift_spec is not None:
            oprot.trans.write(oprot._fast_encode(self, (self.__class__, self.thrift_spec)))
            return
        oprot.writeStructBegin('updateLocalDataMovementDetails_result')
        if self.success is not None:
            oprot.writeFieldBegin('success', TType.BOOL, 0)
            oprot.writeBool(self.success)
            oprot.writeFieldEnd()
        if self.ire is not None:
            oprot.writeFieldBegin('ire', TType.STRUCT, 1)
            self.ire.write(oprot)
            oprot.writeFieldEnd()
        if self.ace is not None:
            oprot.writeFieldBegin('ace', TType.STRUCT, 2)
            self.ace.write(oprot)
            oprot.writeFieldEnd()
        if self.ase is not None:
            oprot.writeFieldBegin('ase', TType.STRUCT, 3)
            self.ase.write(oprot)
            oprot.writeFieldEnd()
        if self.ae is not None:
            oprot.writeFieldBegin('ae', TType.STRUCT, 4)
            self.ae.write(oprot)
            oprot.writeFieldEnd()
        oprot.writeFieldStop()
        oprot.writeStructEnd()

    def validate(self):
        return

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

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

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


class getLocalDataMovement_args(object):
    """
    Attributes:
     - authzToken
     - dataMovementId
    """

    thrift_spec = (
        None,  # 0
        (1, TType.STRUCT, 'authzToken', (apache.airavata.model.security.ttypes.AuthzToken, apache.airavata.model.security.ttypes.AuthzToken.thrift_spec), None, ),  # 1
        (2, TType.STRING, 'dataMovementId', 'UTF8', None, ),  # 2
    )

    def __init__(self, authzToken=None, dataMovementId=None,):
        self.authzToken = authzToken
        self.dataMovementId = dataMovementId

    def read(self, iprot):
        if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None:
            iprot._fast_decode(self, iprot, (self.__class__, self.thrift_spec))
            return
        iprot.readStructBegin()
        while True:
            (fname, ftype, fid) = iprot.readFieldBegin()
            if ftype == TType.STOP:
                break
            if fid == 1:
                if ftype == TType.STRUCT:
                    self.authzToken = apache.airavata.model.security.ttypes.AuthzToken()
                    self.authzToken.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 2:
                if ftype == TType.STRING:
                    self.dataMovementId = iprot.readString().decode('utf-8') if sys.version_info[0] == 2 else iprot.readString()
                else:
                    iprot.skip(ftype)
            else:
                iprot.skip(ftype)
            iprot.readFieldEnd()
        iprot.readStructEnd()

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

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

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

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

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


class getLocalDataMovement_result(object):
    """
    Attributes:
     - success
     - ire
     - ace
     - ase
     - ae
    """

    thrift_spec = (
        (0, TType.STRUCT, 'success', (apache.airavata.model.data.movement.ttypes.LOCALDataMovement, apache.airavata.model.data.movement.ttypes.LOCALDataMovement.thrift_spec), None, ),  # 0
        (1, TType.STRUCT, 'ire', (apache.airavata.api.error.ttypes.InvalidRequestException, apache.airavata.api.error.ttypes.InvalidRequestException.thrift_spec), None, ),  # 1
        (2, TType.STRUCT, 'ace', (apache.airavata.api.error.ttypes.AiravataClientException, apache.airavata.api.error.ttypes.AiravataClientException.thrift_spec), None, ),  # 2
        (3, TType.STRUCT, 'ase', (apache.airavata.api.error.ttypes.AiravataSystemException, apache.airavata.api.error.ttypes.AiravataSystemException.thrift_spec), None, ),  # 3
        (4, TType.STRUCT, 'ae', (apache.airavata.api.error.ttypes.AuthorizationException, apache.airavata.api.error.ttypes.AuthorizationException.thrift_spec), None, ),  # 4
    )

    def __init__(self, success=None, ire=None, ace=None, ase=None, ae=None,):
        self.success = success
        self.ire = ire
        self.ace = ace
        self.ase = ase
        self.ae = ae

    def read(self, iprot):
        if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None:
            iprot._fast_decode(self, iprot, (self.__class__, self.thrift_spec))
            return
        iprot.readStructBegin()
        while True:
            (fname, ftype, fid) = iprot.readFieldBegin()
            if ftype == TType.STOP:
                break
            if fid == 0:
                if ftype == TType.STRUCT:
                    self.success = apache.airavata.model.data.movement.ttypes.LOCALDataMovement()
                    self.success.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 1:
                if ftype == TType.STRUCT:
                    self.ire = apache.airavata.api.error.ttypes.InvalidRequestException()
                    self.ire.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 2:
                if ftype == TType.STRUCT:
                    self.ace = apache.airavata.api.error.ttypes.AiravataClientException()
                    self.ace.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 3:
                if ftype == TType.STRUCT:
                    self.ase = apache.airavata.api.error.ttypes.AiravataSystemException()
                    self.ase.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 4:
                if ftype == TType.STRUCT:
                    self.ae = apache.airavata.api.error.ttypes.AuthorizationException()
                    self.ae.read(iprot)
                else:
                    iprot.skip(ftype)
            else:
                iprot.skip(ftype)
            iprot.readFieldEnd()
        iprot.readStructEnd()

    def write(self, oprot):
        if oprot._fast_encode is not None and self.thrift_spec is not None:
            oprot.trans.write(oprot._fast_encode(self, (self.__class__, self.thrift_spec)))
            return
        oprot.writeStructBegin('getLocalDataMovement_result')
        if self.success is not None:
            oprot.writeFieldBegin('success', TType.STRUCT, 0)
            self.success.write(oprot)
            oprot.writeFieldEnd()
        if self.ire is not None:
            oprot.writeFieldBegin('ire', TType.STRUCT, 1)
            self.ire.write(oprot)
            oprot.writeFieldEnd()
        if self.ace is not None:
            oprot.writeFieldBegin('ace', TType.STRUCT, 2)
            self.ace.write(oprot)
            oprot.writeFieldEnd()
        if self.ase is not None:
            oprot.writeFieldBegin('ase', TType.STRUCT, 3)
            self.ase.write(oprot)
            oprot.writeFieldEnd()
        if self.ae is not None:
            oprot.writeFieldBegin('ae', TType.STRUCT, 4)
            self.ae.write(oprot)
            oprot.writeFieldEnd()
        oprot.writeFieldStop()
        oprot.writeStructEnd()

    def validate(self):
        return

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

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

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


class addSCPDataMovementDetails_args(object):
    """
    Attributes:
     - authzToken
     - productUri
     - dataMoveType
     - priorityOrder
     - scpDataMovement
    """

    thrift_spec = (
        None,  # 0
        (1, TType.STRUCT, 'authzToken', (apache.airavata.model.security.ttypes.AuthzToken, apache.airavata.model.security.ttypes.AuthzToken.thrift_spec), None, ),  # 1
        (2, TType.STRING, 'productUri', 'UTF8', None, ),  # 2
        (3, TType.I32, 'dataMoveType', None, None, ),  # 3
        (4, TType.I32, 'priorityOrder', None, None, ),  # 4
        (5, TType.STRUCT, 'scpDataMovement', (apache.airavata.model.data.movement.ttypes.SCPDataMovement, apache.airavata.model.data.movement.ttypes.SCPDataMovement.thrift_spec), None, ),  # 5
    )

    def __init__(self, authzToken=None, productUri=None, dataMoveType=None, priorityOrder=None, scpDataMovement=None,):
        self.authzToken = authzToken
        self.productUri = productUri
        self.dataMoveType = dataMoveType
        self.priorityOrder = priorityOrder
        self.scpDataMovement = scpDataMovement

    def read(self, iprot):
        if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None:
            iprot._fast_decode(self, iprot, (self.__class__, self.thrift_spec))
            return
        iprot.readStructBegin()
        while True:
            (fname, ftype, fid) = iprot.readFieldBegin()
            if ftype == TType.STOP:
                break
            if fid == 1:
                if ftype == TType.STRUCT:
                    self.authzToken = apache.airavata.model.security.ttypes.AuthzToken()
                    self.authzToken.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 2:
                if ftype == TType.STRING:
                    self.productUri = iprot.readString().decode('utf-8') if sys.version_info[0] == 2 else iprot.readString()
                else:
                    iprot.skip(ftype)
            elif fid == 3:
                if ftype == TType.I32:
                    self.dataMoveType = iprot.readI32()
                else:
                    iprot.skip(ftype)
            elif fid == 4:
                if ftype == TType.I32:
                    self.priorityOrder = iprot.readI32()
                else:
                    iprot.skip(ftype)
            elif fid == 5:
                if ftype == TType.STRUCT:
                    self.scpDataMovement = apache.airavata.model.data.movement.ttypes.SCPDataMovement()
                    self.scpDataMovement.read(iprot)
                else:
                    iprot.skip(ftype)
            else:
                iprot.skip(ftype)
            iprot.readFieldEnd()
        iprot.readStructEnd()

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

    def validate(self):
        if self.authzToken is None:
            raise TProtocolException(message='Required field authzToken is unset!')
        if self.productUri is None:
            raise TProtocolException(message='Required field productUri is unset!')
        if self.dataMoveType is None:
            raise TProtocolException(message='Required field dataMoveType is unset!')
        if self.priorityOrder is None:
            raise TProtocolException(message='Required field priorityOrder is unset!')
        if self.scpDataMovement is None:
            raise TProtocolException(message='Required field scpDataMovement is unset!')
        return

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

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

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


class addSCPDataMovementDetails_result(object):
    """
    Attributes:
     - success
     - ire
     - ace
     - ase
     - ae
    """

    thrift_spec = (
        (0, TType.STRING, 'success', 'UTF8', None, ),  # 0
        (1, TType.STRUCT, 'ire', (apache.airavata.api.error.ttypes.InvalidRequestException, apache.airavata.api.error.ttypes.InvalidRequestException.thrift_spec), None, ),  # 1
        (2, TType.STRUCT, 'ace', (apache.airavata.api.error.ttypes.AiravataClientException, apache.airavata.api.error.ttypes.AiravataClientException.thrift_spec), None, ),  # 2
        (3, TType.STRUCT, 'ase', (apache.airavata.api.error.ttypes.AiravataSystemException, apache.airavata.api.error.ttypes.AiravataSystemException.thrift_spec), None, ),  # 3
        (4, TType.STRUCT, 'ae', (apache.airavata.api.error.ttypes.AuthorizationException, apache.airavata.api.error.ttypes.AuthorizationException.thrift_spec), None, ),  # 4
    )

    def __init__(self, success=None, ire=None, ace=None, ase=None, ae=None,):
        self.success = success
        self.ire = ire
        self.ace = ace
        self.ase = ase
        self.ae = ae

    def read(self, iprot):
        if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None:
            iprot._fast_decode(self, iprot, (self.__class__, self.thrift_spec))
            return
        iprot.readStructBegin()
        while True:
            (fname, ftype, fid) = iprot.readFieldBegin()
            if ftype == TType.STOP:
                break
            if fid == 0:
                if ftype == TType.STRING:
                    self.success = iprot.readString().decode('utf-8') if sys.version_info[0] == 2 else iprot.readString()
                else:
                    iprot.skip(ftype)
            elif fid == 1:
                if ftype == TType.STRUCT:
                    self.ire = apache.airavata.api.error.ttypes.InvalidRequestException()
                    self.ire.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 2:
                if ftype == TType.STRUCT:
                    self.ace = apache.airavata.api.error.ttypes.AiravataClientException()
                    self.ace.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 3:
                if ftype == TType.STRUCT:
                    self.ase = apache.airavata.api.error.ttypes.AiravataSystemException()
                    self.ase.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 4:
                if ftype == TType.STRUCT:
                    self.ae = apache.airavata.api.error.ttypes.AuthorizationException()
                    self.ae.read(iprot)
                else:
                    iprot.skip(ftype)
            else:
                iprot.skip(ftype)
            iprot.readFieldEnd()
        iprot.readStructEnd()

    def write(self, oprot):
        if oprot._fast_encode is not None and self.thrift_spec is not None:
            oprot.trans.write(oprot._fast_encode(self, (self.__class__, self.thrift_spec)))
            return
        oprot.writeStructBegin('addSCPDataMovementDetails_result')
        if self.success is not None:
            oprot.writeFieldBegin('success', TType.STRING, 0)
            oprot.writeString(self.success.encode('utf-8') if sys.version_info[0] == 2 else self.success)
            oprot.writeFieldEnd()
        if self.ire is not None:
            oprot.writeFieldBegin('ire', TType.STRUCT, 1)
            self.ire.write(oprot)
            oprot.writeFieldEnd()
        if self.ace is not None:
            oprot.writeFieldBegin('ace', TType.STRUCT, 2)
            self.ace.write(oprot)
            oprot.writeFieldEnd()
        if self.ase is not None:
            oprot.writeFieldBegin('ase', TType.STRUCT, 3)
            self.ase.write(oprot)
            oprot.writeFieldEnd()
        if self.ae is not None:
            oprot.writeFieldBegin('ae', TType.STRUCT, 4)
            self.ae.write(oprot)
            oprot.writeFieldEnd()
        oprot.writeFieldStop()
        oprot.writeStructEnd()

    def validate(self):
        return

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

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

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


class updateSCPDataMovementDetails_args(object):
    """
    Attributes:
     - authzToken
     - dataMovementInterfaceId
     - scpDataMovement
    """

    thrift_spec = (
        None,  # 0
        (1, TType.STRUCT, 'authzToken', (apache.airavata.model.security.ttypes.AuthzToken, apache.airavata.model.security.ttypes.AuthzToken.thrift_spec), None, ),  # 1
        (2, TType.STRING, 'dataMovementInterfaceId', 'UTF8', None, ),  # 2
        (3, TType.STRUCT, 'scpDataMovement', (apache.airavata.model.data.movement.ttypes.SCPDataMovement, apache.airavata.model.data.movement.ttypes.SCPDataMovement.thrift_spec), None, ),  # 3
    )

    def __init__(self, authzToken=None, dataMovementInterfaceId=None, scpDataMovement=None,):
        self.authzToken = authzToken
        self.dataMovementInterfaceId = dataMovementInterfaceId
        self.scpDataMovement = scpDataMovement

    def read(self, iprot):
        if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None:
            iprot._fast_decode(self, iprot, (self.__class__, self.thrift_spec))
            return
        iprot.readStructBegin()
        while True:
            (fname, ftype, fid) = iprot.readFieldBegin()
            if ftype == TType.STOP:
                break
            if fid == 1:
                if ftype == TType.STRUCT:
                    self.authzToken = apache.airavata.model.security.ttypes.AuthzToken()
                    self.authzToken.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 2:
                if ftype == TType.STRING:
                    self.dataMovementInterfaceId = iprot.readString().decode('utf-8') if sys.version_info[0] == 2 else iprot.readString()
                else:
                    iprot.skip(ftype)
            elif fid == 3:
                if ftype == TType.STRUCT:
                    self.scpDataMovement = apache.airavata.model.data.movement.ttypes.SCPDataMovement()
                    self.scpDataMovement.read(iprot)
                else:
                    iprot.skip(ftype)
            else:
                iprot.skip(ftype)
            iprot.readFieldEnd()
        iprot.readStructEnd()

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

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

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

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

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


class updateSCPDataMovementDetails_result(object):
    """
    Attributes:
     - success
     - ire
     - ace
     - ase
     - ae
    """

    thrift_spec = (
        (0, TType.BOOL, 'success', None, None, ),  # 0
        (1, TType.STRUCT, 'ire', (apache.airavata.api.error.ttypes.InvalidRequestException, apache.airavata.api.error.ttypes.InvalidRequestException.thrift_spec), None, ),  # 1
        (2, TType.STRUCT, 'ace', (apache.airavata.api.error.ttypes.AiravataClientException, apache.airavata.api.error.ttypes.AiravataClientException.thrift_spec), None, ),  # 2
        (3, TType.STRUCT, 'ase', (apache.airavata.api.error.ttypes.AiravataSystemException, apache.airavata.api.error.ttypes.AiravataSystemException.thrift_spec), None, ),  # 3
        (4, TType.STRUCT, 'ae', (apache.airavata.api.error.ttypes.AuthorizationException, apache.airavata.api.error.ttypes.AuthorizationException.thrift_spec), None, ),  # 4
    )

    def __init__(self, success=None, ire=None, ace=None, ase=None, ae=None,):
        self.success = success
        self.ire = ire
        self.ace = ace
        self.ase = ase
        self.ae = ae

    def read(self, iprot):
        if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None:
            iprot._fast_decode(self, iprot, (self.__class__, self.thrift_spec))
            return
        iprot.readStructBegin()
        while True:
            (fname, ftype, fid) = iprot.readFieldBegin()
            if ftype == TType.STOP:
                break
            if fid == 0:
                if ftype == TType.BOOL:
                    self.success = iprot.readBool()
                else:
                    iprot.skip(ftype)
            elif fid == 1:
                if ftype == TType.STRUCT:
                    self.ire = apache.airavata.api.error.ttypes.InvalidRequestException()
                    self.ire.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 2:
                if ftype == TType.STRUCT:
                    self.ace = apache.airavata.api.error.ttypes.AiravataClientException()
                    self.ace.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 3:
                if ftype == TType.STRUCT:
                    self.ase = apache.airavata.api.error.ttypes.AiravataSystemException()
                    self.ase.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 4:
                if ftype == TType.STRUCT:
                    self.ae = apache.airavata.api.error.ttypes.AuthorizationException()
                    self.ae.read(iprot)
                else:
                    iprot.skip(ftype)
            else:
                iprot.skip(ftype)
            iprot.readFieldEnd()
        iprot.readStructEnd()

    def write(self, oprot):
        if oprot._fast_encode is not None and self.thrift_spec is not None:
            oprot.trans.write(oprot._fast_encode(self, (self.__class__, self.thrift_spec)))
            return
        oprot.writeStructBegin('updateSCPDataMovementDetails_result')
        if self.success is not None:
            oprot.writeFieldBegin('success', TType.BOOL, 0)
            oprot.writeBool(self.success)
            oprot.writeFieldEnd()
        if self.ire is not None:
            oprot.writeFieldBegin('ire', TType.STRUCT, 1)
            self.ire.write(oprot)
            oprot.writeFieldEnd()
        if self.ace is not None:
            oprot.writeFieldBegin('ace', TType.STRUCT, 2)
            self.ace.write(oprot)
            oprot.writeFieldEnd()
        if self.ase is not None:
            oprot.writeFieldBegin('ase', TType.STRUCT, 3)
            self.ase.write(oprot)
            oprot.writeFieldEnd()
        if self.ae is not None:
            oprot.writeFieldBegin('ae', TType.STRUCT, 4)
            self.ae.write(oprot)
            oprot.writeFieldEnd()
        oprot.writeFieldStop()
        oprot.writeStructEnd()

    def validate(self):
        return

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

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

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


class getSCPDataMovement_args(object):
    """
    Attributes:
     - authzToken
     - dataMovementId
    """

    thrift_spec = (
        None,  # 0
        (1, TType.STRUCT, 'authzToken', (apache.airavata.model.security.ttypes.AuthzToken, apache.airavata.model.security.ttypes.AuthzToken.thrift_spec), None, ),  # 1
        (2, TType.STRING, 'dataMovementId', 'UTF8', None, ),  # 2
    )

    def __init__(self, authzToken=None, dataMovementId=None,):
        self.authzToken = authzToken
        self.dataMovementId = dataMovementId

    def read(self, iprot):
        if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None:
            iprot._fast_decode(self, iprot, (self.__class__, self.thrift_spec))
            return
        iprot.readStructBegin()
        while True:
            (fname, ftype, fid) = iprot.readFieldBegin()
            if ftype == TType.STOP:
                break
            if fid == 1:
                if ftype == TType.STRUCT:
                    self.authzToken = apache.airavata.model.security.ttypes.AuthzToken()
                    self.authzToken.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 2:
                if ftype == TType.STRING:
                    self.dataMovementId = iprot.readString().decode('utf-8') if sys.version_info[0] == 2 else iprot.readString()
                else:
                    iprot.skip(ftype)
            else:
                iprot.skip(ftype)
            iprot.readFieldEnd()
        iprot.readStructEnd()

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

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

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

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

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


class getSCPDataMovement_result(object):
    """
    Attributes:
     - success
     - ire
     - ace
     - ase
     - ae
    """

    thrift_spec = (
        (0, TType.STRUCT, 'success', (apache.airavata.model.data.movement.ttypes.SCPDataMovement, apache.airavata.model.data.movement.ttypes.SCPDataMovement.thrift_spec), None, ),  # 0
        (1, TType.STRUCT, 'ire', (apache.airavata.api.error.ttypes.InvalidRequestException, apache.airavata.api.error.ttypes.InvalidRequestException.thrift_spec), None, ),  # 1
        (2, TType.STRUCT, 'ace', (apache.airavata.api.error.ttypes.AiravataClientException, apache.airavata.api.error.ttypes.AiravataClientException.thrift_spec), None, ),  # 2
        (3, TType.STRUCT, 'ase', (apache.airavata.api.error.ttypes.AiravataSystemException, apache.airavata.api.error.ttypes.AiravataSystemException.thrift_spec), None, ),  # 3
        (4, TType.STRUCT, 'ae', (apache.airavata.api.error.ttypes.AuthorizationException, apache.airavata.api.error.ttypes.AuthorizationException.thrift_spec), None, ),  # 4
    )

    def __init__(self, success=None, ire=None, ace=None, ase=None, ae=None,):
        self.success = success
        self.ire = ire
        self.ace = ace
        self.ase = ase
        self.ae = ae

    def read(self, iprot):
        if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None:
            iprot._fast_decode(self, iprot, (self.__class__, self.thrift_spec))
            return
        iprot.readStructBegin()
        while True:
            (fname, ftype, fid) = iprot.readFieldBegin()
            if ftype == TType.STOP:
                break
            if fid == 0:
                if ftype == TType.STRUCT:
                    self.success = apache.airavata.model.data.movement.ttypes.SCPDataMovement()
                    self.success.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 1:
                if ftype == TType.STRUCT:
                    self.ire = apache.airavata.api.error.ttypes.InvalidRequestException()
                    self.ire.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 2:
                if ftype == TType.STRUCT:
                    self.ace = apache.airavata.api.error.ttypes.AiravataClientException()
                    self.ace.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 3:
                if ftype == TType.STRUCT:
                    self.ase = apache.airavata.api.error.ttypes.AiravataSystemException()
                    self.ase.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 4:
                if ftype == TType.STRUCT:
                    self.ae = apache.airavata.api.error.ttypes.AuthorizationException()
                    self.ae.read(iprot)
                else:
                    iprot.skip(ftype)
            else:
                iprot.skip(ftype)
            iprot.readFieldEnd()
        iprot.readStructEnd()

    def write(self, oprot):
        if oprot._fast_encode is not None and self.thrift_spec is not None:
            oprot.trans.write(oprot._fast_encode(self, (self.__class__, self.thrift_spec)))
            return
        oprot.writeStructBegin('getSCPDataMovement_result')
        if self.success is not None:
            oprot.writeFieldBegin('success', TType.STRUCT, 0)
            self.success.write(oprot)
            oprot.writeFieldEnd()
        if self.ire is not None:
            oprot.writeFieldBegin('ire', TType.STRUCT, 1)
            self.ire.write(oprot)
            oprot.writeFieldEnd()
        if self.ace is not None:
            oprot.writeFieldBegin('ace', TType.STRUCT, 2)
            self.ace.write(oprot)
            oprot.writeFieldEnd()
        if self.ase is not None:
            oprot.writeFieldBegin('ase', TType.STRUCT, 3)
            self.ase.write(oprot)
            oprot.writeFieldEnd()
        if self.ae is not None:
            oprot.writeFieldBegin('ae', TType.STRUCT, 4)
            self.ae.write(oprot)
            oprot.writeFieldEnd()
        oprot.writeFieldStop()
        oprot.writeStructEnd()

    def validate(self):
        return

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

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

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


class addUnicoreDataMovementDetails_args(object):
    """
    Attributes:
     - authzToken
     - productUri
     - dataMoveType
     - priorityOrder
     - unicoreDataMovement
    """

    thrift_spec = (
        None,  # 0
        (1, TType.STRUCT, 'authzToken', (apache.airavata.model.security.ttypes.AuthzToken, apache.airavata.model.security.ttypes.AuthzToken.thrift_spec), None, ),  # 1
        (2, TType.STRING, 'productUri', 'UTF8', None, ),  # 2
        (3, TType.I32, 'dataMoveType', None, None, ),  # 3
        (4, TType.I32, 'priorityOrder', None, None, ),  # 4
        (5, TType.STRUCT, 'unicoreDataMovement', (apache.airavata.model.data.movement.ttypes.UnicoreDataMovement, apache.airavata.model.data.movement.ttypes.UnicoreDataMovement.thrift_spec), None, ),  # 5
    )

    def __init__(self, authzToken=None, productUri=None, dataMoveType=None, priorityOrder=None, unicoreDataMovement=None,):
        self.authzToken = authzToken
        self.productUri = productUri
        self.dataMoveType = dataMoveType
        self.priorityOrder = priorityOrder
        self.unicoreDataMovement = unicoreDataMovement

    def read(self, iprot):
        if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None:
            iprot._fast_decode(self, iprot, (self.__class__, self.thrift_spec))
            return
        iprot.readStructBegin()
        while True:
            (fname, ftype, fid) = iprot.readFieldBegin()
            if ftype == TType.STOP:
                break
            if fid == 1:
                if ftype == TType.STRUCT:
                    self.authzToken = apache.airavata.model.security.ttypes.AuthzToken()
                    self.authzToken.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 2:
                if ftype == TType.STRING:
                    self.productUri = iprot.readString().decode('utf-8') if sys.version_info[0] == 2 else iprot.readString()
                else:
                    iprot.skip(ftype)
            elif fid == 3:
                if ftype == TType.I32:
                    self.dataMoveType = iprot.readI32()
                else:
                    iprot.skip(ftype)
            elif fid == 4:
                if ftype == TType.I32:
                    self.priorityOrder = iprot.readI32()
                else:
                    iprot.skip(ftype)
            elif fid == 5:
                if ftype == TType.STRUCT:
                    self.unicoreDataMovement = apache.airavata.model.data.movement.ttypes.UnicoreDataMovement()
                    self.unicoreDataMovement.read(iprot)
                else:
                    iprot.skip(ftype)
            else:
                iprot.skip(ftype)
            iprot.readFieldEnd()
        iprot.readStructEnd()

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

    def validate(self):
        if self.authzToken is None:
            raise TProtocolException(message='Required field authzToken is unset!')
        if self.productUri is None:
            raise TProtocolException(message='Required field productUri is unset!')
        if self.dataMoveType is None:
            raise TProtocolException(message='Required field dataMoveType is unset!')
        if self.priorityOrder is None:
            raise TProtocolException(message='Required field priorityOrder is unset!')
        if self.unicoreDataMovement is None:
            raise TProtocolException(message='Required field unicoreDataMovement is unset!')
        return

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

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

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


class addUnicoreDataMovementDetails_result(object):
    """
    Attributes:
     - success
     - ire
     - ace
     - ase
     - ae
    """

    thrift_spec = (
        (0, TType.STRING, 'success', 'UTF8', None, ),  # 0
        (1, TType.STRUCT, 'ire', (apache.airavata.api.error.ttypes.InvalidRequestException, apache.airavata.api.error.ttypes.InvalidRequestException.thrift_spec), None, ),  # 1
        (2, TType.STRUCT, 'ace', (apache.airavata.api.error.ttypes.AiravataClientException, apache.airavata.api.error.ttypes.AiravataClientException.thrift_spec), None, ),  # 2
        (3, TType.STRUCT, 'ase', (apache.airavata.api.error.ttypes.AiravataSystemException, apache.airavata.api.error.ttypes.AiravataSystemException.thrift_spec), None, ),  # 3
        (4, TType.STRUCT, 'ae', (apache.airavata.api.error.ttypes.AuthorizationException, apache.airavata.api.error.ttypes.AuthorizationException.thrift_spec), None, ),  # 4
    )

    def __init__(self, success=None, ire=None, ace=None, ase=None, ae=None,):
        self.success = success
        self.ire = ire
        self.ace = ace
        self.ase = ase
        self.ae = ae

    def read(self, iprot):
        if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None:
            iprot._fast_decode(self, iprot, (self.__class__, self.thrift_spec))
            return
        iprot.readStructBegin()
        while True:
            (fname, ftype, fid) = iprot.readFieldBegin()
            if ftype == TType.STOP:
                break
            if fid == 0:
                if ftype == TType.STRING:
                    self.success = iprot.readString().decode('utf-8') if sys.version_info[0] == 2 else iprot.readString()
                else:
                    iprot.skip(ftype)
            elif fid == 1:
                if ftype == TType.STRUCT:
                    self.ire = apache.airavata.api.error.ttypes.InvalidRequestException()
                    self.ire.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 2:
                if ftype == TType.STRUCT:
                    self.ace = apache.airavata.api.error.ttypes.AiravataClientException()
                    self.ace.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 3:
                if ftype == TType.STRUCT:
                    self.ase = apache.airavata.api.error.ttypes.AiravataSystemException()
                    self.ase.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 4:
                if ftype == TType.STRUCT:
                    self.ae = apache.airavata.api.error.ttypes.AuthorizationException()
                    self.ae.read(iprot)
                else:
                    iprot.skip(ftype)
            else:
                iprot.skip(ftype)
            iprot.readFieldEnd()
        iprot.readStructEnd()

    def write(self, oprot):
        if oprot._fast_encode is not None and self.thrift_spec is not None:
            oprot.trans.write(oprot._fast_encode(self, (self.__class__, self.thrift_spec)))
            return
        oprot.writeStructBegin('addUnicoreDataMovementDetails_result')
        if self.success is not None:
            oprot.writeFieldBegin('success', TType.STRING, 0)
            oprot.writeString(self.success.encode('utf-8') if sys.version_info[0] == 2 else self.success)
            oprot.writeFieldEnd()
        if self.ire is not None:
            oprot.writeFieldBegin('ire', TType.STRUCT, 1)
            self.ire.write(oprot)
            oprot.writeFieldEnd()
        if self.ace is not None:
            oprot.writeFieldBegin('ace', TType.STRUCT, 2)
            self.ace.write(oprot)
            oprot.writeFieldEnd()
        if self.ase is not None:
            oprot.writeFieldBegin('ase', TType.STRUCT, 3)
            self.ase.write(oprot)
            oprot.writeFieldEnd()
        if self.ae is not None:
            oprot.writeFieldBegin('ae', TType.STRUCT, 4)
            self.ae.write(oprot)
            oprot.writeFieldEnd()
        oprot.writeFieldStop()
        oprot.writeStructEnd()

    def validate(self):
        return

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

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

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


class updateUnicoreDataMovementDetails_args(object):
    """
    Attributes:
     - authzToken
     - dataMovementInterfaceId
     - unicoreDataMovement
    """

    thrift_spec = (
        None,  # 0
        (1, TType.STRUCT, 'authzToken', (apache.airavata.model.security.ttypes.AuthzToken, apache.airavata.model.security.ttypes.AuthzToken.thrift_spec), None, ),  # 1
        (2, TType.STRING, 'dataMovementInterfaceId', 'UTF8', None, ),  # 2
        (3, TType.STRUCT, 'unicoreDataMovement', (apache.airavata.model.data.movement.ttypes.UnicoreDataMovement, apache.airavata.model.data.movement.ttypes.UnicoreDataMovement.thrift_spec), None, ),  # 3
    )

    def __init__(self, authzToken=None, dataMovementInterfaceId=None, unicoreDataMovement=None,):
        self.authzToken = authzToken
        self.dataMovementInterfaceId = dataMovementInterfaceId
        self.unicoreDataMovement = unicoreDataMovement

    def read(self, iprot):
        if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None:
            iprot._fast_decode(self, iprot, (self.__class__, self.thrift_spec))
            return
        iprot.readStructBegin()
        while True:
            (fname, ftype, fid) = iprot.readFieldBegin()
            if ftype == TType.STOP:
                break
            if fid == 1:
                if ftype == TType.STRUCT:
                    self.authzToken = apache.airavata.model.security.ttypes.AuthzToken()
                    self.authzToken.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 2:
                if ftype == TType.STRING:
                    self.dataMovementInterfaceId = iprot.readString().decode('utf-8') if sys.version_info[0] == 2 else iprot.readString()
                else:
                    iprot.skip(ftype)
            elif fid == 3:
                if ftype == TType.STRUCT:
                    self.unicoreDataMovement = apache.airavata.model.data.movement.ttypes.UnicoreDataMovement()
                    self.unicoreDataMovement.read(iprot)
                else:
                    iprot.skip(ftype)
            else:
                iprot.skip(ftype)
            iprot.readFieldEnd()
        iprot.readStructEnd()

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

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

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

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

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


class updateUnicoreDataMovementDetails_result(object):
    """
    Attributes:
     - success
     - ire
     - ace
     - ase
     - ae
    """

    thrift_spec = (
        (0, TType.BOOL, 'success', None, None, ),  # 0
        (1, TType.STRUCT, 'ire', (apache.airavata.api.error.ttypes.InvalidRequestException, apache.airavata.api.error.ttypes.InvalidRequestException.thrift_spec), None, ),  # 1
        (2, TType.STRUCT, 'ace', (apache.airavata.api.error.ttypes.AiravataClientException, apache.airavata.api.error.ttypes.AiravataClientException.thrift_spec), None, ),  # 2
        (3, TType.STRUCT, 'ase', (apache.airavata.api.error.ttypes.AiravataSystemException, apache.airavata.api.error.ttypes.AiravataSystemException.thrift_spec), None, ),  # 3
        (4, TType.STRUCT, 'ae', (apache.airavata.api.error.ttypes.AuthorizationException, apache.airavata.api.error.ttypes.AuthorizationException.thrift_spec), None, ),  # 4
    )

    def __init__(self, success=None, ire=None, ace=None, ase=None, ae=None,):
        self.success = success
        self.ire = ire
        self.ace = ace
        self.ase = ase
        self.ae = ae

    def read(self, iprot):
        if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None:
            iprot._fast_decode(self, iprot, (self.__class__, self.thrift_spec))
            return
        iprot.readStructBegin()
        while True:
            (fname, ftype, fid) = iprot.readFieldBegin()
            if ftype == TType.STOP:
                break
            if fid == 0:
                if ftype == TType.BOOL:
                    self.success = iprot.readBool()
                else:
                    iprot.skip(ftype)
            elif fid == 1:
                if ftype == TType.STRUCT:
                    self.ire = apache.airavata.api.error.ttypes.InvalidRequestException()
                    self.ire.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 2:
                if ftype == TType.STRUCT:
                    self.ace = apache.airavata.api.error.ttypes.AiravataClientException()
                    self.ace.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 3:
                if ftype == TType.STRUCT:
                    self.ase = apache.airavata.api.error.ttypes.AiravataSystemException()
                    self.ase.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 4:
                if ftype == TType.STRUCT:
                    self.ae = apache.airavata.api.error.ttypes.AuthorizationException()
                    self.ae.read(iprot)
                else:
                    iprot.skip(ftype)
            else:
                iprot.skip(ftype)
            iprot.readFieldEnd()
        iprot.readStructEnd()

    def write(self, oprot):
        if oprot._fast_encode is not None and self.thrift_spec is not None:
            oprot.trans.write(oprot._fast_encode(self, (self.__class__, self.thrift_spec)))
            return
        oprot.writeStructBegin('updateUnicoreDataMovementDetails_result')
        if self.success is not None:
            oprot.writeFieldBegin('success', TType.BOOL, 0)
            oprot.writeBool(self.success)
            oprot.writeFieldEnd()
        if self.ire is not None:
            oprot.writeFieldBegin('ire', TType.STRUCT, 1)
            self.ire.write(oprot)
            oprot.writeFieldEnd()
        if self.ace is not None:
            oprot.writeFieldBegin('ace', TType.STRUCT, 2)
            self.ace.write(oprot)
            oprot.writeFieldEnd()
        if self.ase is not None:
            oprot.writeFieldBegin('ase', TType.STRUCT, 3)
            self.ase.write(oprot)
            oprot.writeFieldEnd()
        if self.ae is not None:
            oprot.writeFieldBegin('ae', TType.STRUCT, 4)
            self.ae.write(oprot)
            oprot.writeFieldEnd()
        oprot.writeFieldStop()
        oprot.writeStructEnd()

    def validate(self):
        return

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

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

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


class getUnicoreDataMovement_args(object):
    """
    Attributes:
     - authzToken
     - dataMovementId
    """

    thrift_spec = (
        None,  # 0
        (1, TType.STRUCT, 'authzToken', (apache.airavata.model.security.ttypes.AuthzToken, apache.airavata.model.security.ttypes.AuthzToken.thrift_spec), None, ),  # 1
        (2, TType.STRING, 'dataMovementId', 'UTF8', None, ),  # 2
    )

    def __init__(self, authzToken=None, dataMovementId=None,):
        self.authzToken = authzToken
        self.dataMovementId = dataMovementId

    def read(self, iprot):
        if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None:
            iprot._fast_decode(self, iprot, (self.__class__, self.thrift_spec))
            return
        iprot.readStructBegin()
        while True:
            (fname, ftype, fid) = iprot.readFieldBegin()
            if ftype == TType.STOP:
                break
            if fid == 1:
                if ftype == TType.STRUCT:
                    self.authzToken = apache.airavata.model.security.ttypes.AuthzToken()
                    self.authzToken.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 2:
                if ftype == TType.STRING:
                    self.dataMovementId = iprot.readString().decode('utf-8') if sys.version_info[0] == 2 else iprot.readString()
                else:
                    iprot.skip(ftype)
            else:
                iprot.skip(ftype)
            iprot.readFieldEnd()
        iprot.readStructEnd()

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

    def validate(self):
        if self.authzToken is None:
            raise TProtocolException(message='Required field authzToken is unset!')
        if self.dataMovementId is None:
            raise TProtocolException(message='Required field dataMovementId is unset!')
        return

    def __repr__(self):
        L = ['%s=%r' % (key, value)
             for key, value in self.__dict__.items()]
        return '%s(%s)' % (self.__class__.__name__, ', '.join(L))

    def __eq__(self, other):
        return isinstance(other, self.__class__) and self.__dict__ == other.__dict__

    def __ne__(self, other):
        return not (self == other)


class getUnicoreDataMovement_result(object):
    """
    Attributes:
     - success
     - ire
     - ace
     - ase
     - ae
    """

    thrift_spec = (
        (0, TType.STRUCT, 'success', (apache.airavata.model.data.movement.ttypes.UnicoreDataMovement, apache.airavata.model.data.movement.ttypes.UnicoreDataMovement.thrift_spec), None, ),  # 0
        (1, TType.STRUCT, 'ire', (apache.airavata.api.error.ttypes.InvalidRequestException, apache.airavata.api.error.ttypes.InvalidRequestException.thrift_spec), None, ),  # 1
        (2, TType.STRUCT, 'ace', (apache.airavata.api.error.ttypes.AiravataClientException, apache.airavata.api.error.ttypes.AiravataClientException.thrift_spec), None, ),  # 2
        (3, TType.STRUCT, 'ase', (apache.airavata.api.error.ttypes.AiravataSystemException, apache.airavata.api.error.ttypes.AiravataSystemException.thrift_spec), None, ),  # 3
        (4, TType.STRUCT, 'ae', (apache.airavata.api.error.ttypes.AuthorizationException, apache.airavata.api.error.ttypes.AuthorizationException.thrift_spec), None, ),  # 4
    )

    def __init__(self, success=None, ire=None, ace=None, ase=None, ae=None,):
        self.success = success
        self.ire = ire
        self.ace = ace
        self.ase = ase
        self.ae = ae

    def read(self, iprot):
        if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None:
            iprot._fast_decode(self, iprot, (self.__class__, self.thrift_spec))
            return
        iprot.readStructBegin()
        while True:
            (fname, ftype, fid) = iprot.readFieldBegin()
            if ftype == TType.STOP:
                break
            if fid == 0:
                if ftype == TType.STRUCT:
                    self.success = apache.airavata.model.data.movement.ttypes.UnicoreDataMovement()
                    self.success.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 1:
                if ftype == TType.STRUCT:
                    self.ire = apache.airavata.api.error.ttypes.InvalidRequestException()
                    self.ire.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 2:
                if ftype == TType.STRUCT:
                    self.ace = apache.airavata.api.error.ttypes.AiravataClientException()
                    self.ace.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 3:
                if ftype == TType.STRUCT:
                    self.ase = apache.airavata.api.error.ttypes.AiravataSystemException()
                    self.ase.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 4:
                if ftype == TType.STRUCT:
                    self.ae = apache.airavata.api.error.ttypes.AuthorizationException()
                    self.ae.read(iprot)
                else:
                    iprot.skip(ftype)
            else:
                iprot.skip(ftype)
            iprot.readFieldEnd()
        iprot.readStructEnd()

    def write(self, oprot):
        if oprot._fast_encode is not None and self.thrift_spec is not None:
            oprot.trans.write(oprot._fast_encode(self, (self.__class__, self.thrift_spec)))
            return
        oprot.writeStructBegin('getUnicoreDataMovement_result')
        if self.success is not None:
            oprot.writeFieldBegin('success', TType.STRUCT, 0)
            self.success.write(oprot)
            oprot.writeFieldEnd()
        if self.ire is not None:
            oprot.writeFieldBegin('ire', TType.STRUCT, 1)
            self.ire.write(oprot)
            oprot.writeFieldEnd()
        if self.ace is not None:
            oprot.writeFieldBegin('ace', TType.STRUCT, 2)
            self.ace.write(oprot)
            oprot.writeFieldEnd()
        if self.ase is not None:
            oprot.writeFieldBegin('ase', TType.STRUCT, 3)
            self.ase.write(oprot)
            oprot.writeFieldEnd()
        if self.ae is not None:
            oprot.writeFieldBegin('ae', TType.STRUCT, 4)
            self.ae.write(oprot)
            oprot.writeFieldEnd()
        oprot.writeFieldStop()
        oprot.writeStructEnd()

    def validate(self):
        return

    def __repr__(self):
        L = ['%s=%r' % (key, value)
             for key, value in self.__dict__.items()]
        return '%s(%s)' % (self.__class__.__name__, ', '.join(L))

    def __eq__(self, other):
        return isinstance(other, self.__class__) and self.__dict__ == other.__dict__

    def __ne__(self, other):
        return not (self == other)


class addGridFTPDataMovementDetails_args(object):
    """
    Attributes:
     - authzToken
     - productUri
     - dataMoveType
     - priorityOrder
     - gridFTPDataMovement
    """

    thrift_spec = (
        None,  # 0
        (1, TType.STRUCT, 'authzToken', (apache.airavata.model.security.ttypes.AuthzToken, apache.airavata.model.security.ttypes.AuthzToken.thrift_spec), None, ),  # 1
        (2, TType.STRING, 'productUri', 'UTF8', None, ),  # 2
        (3, TType.I32, 'dataMoveType', None, None, ),  # 3
        (4, TType.I32, 'priorityOrder', None, None, ),  # 4
        (5, TType.STRUCT, 'gridFTPDataMovement', (apache.airavata.model.data.movement.ttypes.GridFTPDataMovement, apache.airavata.model.data.movement.ttypes.GridFTPDataMovement.thrift_spec), None, ),  # 5
    )

    def __init__(self, authzToken=None, productUri=None, dataMoveType=None, priorityOrder=None, gridFTPDataMovement=None,):
        self.authzToken = authzToken
        self.productUri = productUri
        self.dataMoveType = dataMoveType
        self.priorityOrder = priorityOrder
        self.gridFTPDataMovement = gridFTPDataMovement

    def read(self, iprot):
        if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None:
            iprot._fast_decode(self, iprot, (self.__class__, self.thrift_spec))
            return
        iprot.readStructBegin()
        while True:
            (fname, ftype, fid) = iprot.readFieldBegin()
            if ftype == TType.STOP:
                break
            if fid == 1:
                if ftype == TType.STRUCT:
                    self.authzToken = apache.airavata.model.security.ttypes.AuthzToken()
                    self.authzToken.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 2:
                if ftype == TType.STRING:
                    self.productUri = iprot.readString().decode('utf-8') if sys.version_info[0] == 2 else iprot.readString()
                else:
                    iprot.skip(ftype)
            elif fid == 3:
                if ftype == TType.I32:
                    self.dataMoveType = iprot.readI32()
                else:
                    iprot.skip(ftype)
            elif fid == 4:
                if ftype == TType.I32:
                    self.priorityOrder = iprot.readI32()
                else:
                    iprot.skip(ftype)
            elif fid == 5:
                if ftype == TType.STRUCT:
                    self.gridFTPDataMovement = apache.airavata.model.data.movement.ttypes.GridFTPDataMovement()
                    self.gridFTPDataMovement.read(iprot)
                else:
                    iprot.skip(ftype)
            else:
                iprot.skip(ftype)
            iprot.readFieldEnd()
        iprot.readStructEnd()

    def write(self, oprot):
        if oprot._fast_encode is not None and self.thrift_spec is not None:
            oprot.trans.write(oprot._fast_encode(self, (self.__class__, self.thrift_spec)))
            return
        oprot.writeStructBegin('addGridFTPDataMovementDetails_args')
        if self.authzToken is not None:
            oprot.writeFieldBegin('authzToken', TType.STRUCT, 1)
            self.authzToken.write(oprot)
            oprot.writeFieldEnd()
        if self.productUri is not None:
            oprot.writeFieldBegin('productUri', TType.STRING, 2)
            oprot.writeString(self.productUri.encode('utf-8') if sys.version_info[0] == 2 else self.productUri)
            oprot.writeFieldEnd()
        if self.dataMoveType is not None:
            oprot.writeFieldBegin('dataMoveType', TType.I32, 3)
            oprot.writeI32(self.dataMoveType)
            oprot.writeFieldEnd()
        if self.priorityOrder is not None:
            oprot.writeFieldBegin('priorityOrder', TType.I32, 4)
            oprot.writeI32(self.priorityOrder)
            oprot.writeFieldEnd()
        if self.gridFTPDataMovement is not None:
            oprot.writeFieldBegin('gridFTPDataMovement', TType.STRUCT, 5)
            self.gridFTPDataMovement.write(oprot)
            oprot.writeFieldEnd()
        oprot.writeFieldStop()
        oprot.writeStructEnd()

    def validate(self):
        if self.authzToken is None:
            raise TProtocolException(message='Required field authzToken is unset!')
        if self.productUri is None:
            raise TProtocolException(message='Required field productUri is unset!')
        if self.dataMoveType is None:
            raise TProtocolException(message='Required field dataMoveType is unset!')
        if self.priorityOrder is None:
            raise TProtocolException(message='Required field priorityOrder is unset!')
        if self.gridFTPDataMovement is None:
            raise TProtocolException(message='Required field gridFTPDataMovement is unset!')
        return

    def __repr__(self):
        L = ['%s=%r' % (key, value)
             for key, value in self.__dict__.items()]
        return '%s(%s)' % (self.__class__.__name__, ', '.join(L))

    def __eq__(self, other):
        return isinstance(other, self.__class__) and self.__dict__ == other.__dict__

    def __ne__(self, other):
        return not (self == other)


class addGridFTPDataMovementDetails_result(object):
    """
    Attributes:
     - success
     - ire
     - ace
     - ase
     - ae
    """

    thrift_spec = (
        (0, TType.STRING, 'success', 'UTF8', None, ),  # 0
        (1, TType.STRUCT, 'ire', (apache.airavata.api.error.ttypes.InvalidRequestException, apache.airavata.api.error.ttypes.InvalidRequestException.thrift_spec), None, ),  # 1
        (2, TType.STRUCT, 'ace', (apache.airavata.api.error.ttypes.AiravataClientException, apache.airavata.api.error.ttypes.AiravataClientException.thrift_spec), None, ),  # 2
        (3, TType.STRUCT, 'ase', (apache.airavata.api.error.ttypes.AiravataSystemException, apache.airavata.api.error.ttypes.AiravataSystemException.thrift_spec), None, ),  # 3
        (4, TType.STRUCT, 'ae', (apache.airavata.api.error.ttypes.AuthorizationException, apache.airavata.api.error.ttypes.AuthorizationException.thrift_spec), None, ),  # 4
    )

    def __init__(self, success=None, ire=None, ace=None, ase=None, ae=None,):
        self.success = success
        self.ire = ire
        self.ace = ace
        self.ase = ase
        self.ae = ae

    def read(self, iprot):
        if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None:
            iprot._fast_decode(self, iprot, (self.__class__, self.thrift_spec))
            return
        iprot.readStructBegin()
        while True:
            (fname, ftype, fid) = iprot.readFieldBegin()
            if ftype == TType.STOP:
                break
            if fid == 0:
                if ftype == TType.STRING:
                    self.success = iprot.readString().decode('utf-8') if sys.version_info[0] == 2 else iprot.readString()
                else:
                    iprot.skip(ftype)
            elif fid == 1:
                if ftype == TType.STRUCT:
                    self.ire = apache.airavata.api.error.ttypes.InvalidRequestException()
                    self.ire.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 2:
                if ftype == TType.STRUCT:
                    self.ace = apache.airavata.api.error.ttypes.AiravataClientException()
                    self.ace.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 3:
                if ftype == TType.STRUCT:
                    self.ase = apache.airavata.api.error.ttypes.AiravataSystemException()
                    self.ase.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 4:
                if ftype == TType.STRUCT:
                    self.ae = apache.airavata.api.error.ttypes.AuthorizationException()
                    self.ae.read(iprot)
                else:
                    iprot.skip(ftype)
            else:
                iprot.skip(ftype)
            iprot.readFieldEnd()
        iprot.readStructEnd()

    def write(self, oprot):
        if oprot._fast_encode is not None and self.thrift_spec is not None:
            oprot.trans.write(oprot._fast_encode(self, (self.__class__, self.thrift_spec)))
            return
        oprot.writeStructBegin('addGridFTPDataMovementDetails_result')
        if self.success is not None:
            oprot.writeFieldBegin('success', TType.STRING, 0)
            oprot.writeString(self.success.encode('utf-8') if sys.version_info[0] == 2 else self.success)
            oprot.writeFieldEnd()
        if self.ire is not None:
            oprot.writeFieldBegin('ire', TType.STRUCT, 1)
            self.ire.write(oprot)
            oprot.writeFieldEnd()
        if self.ace is not None:
            oprot.writeFieldBegin('ace', TType.STRUCT, 2)
            self.ace.write(oprot)
            oprot.writeFieldEnd()
        if self.ase is not None:
            oprot.writeFieldBegin('ase', TType.STRUCT, 3)
            self.ase.write(oprot)
            oprot.writeFieldEnd()
        if self.ae is not None:
            oprot.writeFieldBegin('ae', TType.STRUCT, 4)
            self.ae.write(oprot)
            oprot.writeFieldEnd()
        oprot.writeFieldStop()
        oprot.writeStructEnd()

    def validate(self):
        return

    def __repr__(self):
        L = ['%s=%r' % (key, value)
             for key, value in self.__dict__.items()]
        return '%s(%s)' % (self.__class__.__name__, ', '.join(L))

    def __eq__(self, other):
        return isinstance(other, self.__class__) and self.__dict__ == other.__dict__

    def __ne__(self, other):
        return not (self == other)


class updateGridFTPDataMovementDetails_args(object):
    """
    Attributes:
     - authzToken
     - dataMovementInterfaceId
     - gridFTPDataMovement
    """

    thrift_spec = (
        None,  # 0
        (1, TType.STRUCT, 'authzToken', (apache.airavata.model.security.ttypes.AuthzToken, apache.airavata.model.security.ttypes.AuthzToken.thrift_spec), None, ),  # 1
        (2, TType.STRING, 'dataMovementInterfaceId', 'UTF8', None, ),  # 2
        (3, TType.STRUCT, 'gridFTPDataMovement', (apache.airavata.model.data.movement.ttypes.GridFTPDataMovement, apache.airavata.model.data.movement.ttypes.GridFTPDataMovement.thrift_spec), None, ),  # 3
    )

    def __init__(self, authzToken=None, dataMovementInterfaceId=None, gridFTPDataMovement=None,):
        self.authzToken = authzToken
        self.dataMovementInterfaceId = dataMovementInterfaceId
        self.gridFTPDataMovement = gridFTPDataMovement

    def read(self, iprot):
        if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None:
            iprot._fast_decode(self, iprot, (self.__class__, self.thrift_spec))
            return
        iprot.readStructBegin()
        while True:
            (fname, ftype, fid) = iprot.readFieldBegin()
            if ftype == TType.STOP:
                break
            if fid == 1:
                if ftype == TType.STRUCT:
                    self.authzToken = apache.airavata.model.security.ttypes.AuthzToken()
                    self.authzToken.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 2:
                if ftype == TType.STRING:
                    self.dataMovementInterfaceId = iprot.readString().decode('utf-8') if sys.version_info[0] == 2 else iprot.readString()
                else:
                    iprot.skip(ftype)
            elif fid == 3:
                if ftype == TType.STRUCT:
                    self.gridFTPDataMovement = apache.airavata.model.data.movement.ttypes.GridFTPDataMovement()
                    self.gridFTPDataMovement.read(iprot)
                else:
                    iprot.skip(ftype)
            else:
                iprot.skip(ftype)
            iprot.readFieldEnd()
        iprot.readStructEnd()

    def write(self, oprot):
        if oprot._fast_encode is not None and self.thrift_spec is not None:
            oprot.trans.write(oprot._fast_encode(self, (self.__class__, self.thrift_spec)))
            return
        oprot.writeStructBegin('updateGridFTPDataMovementDetails_args')
        if self.authzToken is not None:
            oprot.writeFieldBegin('authzToken', TType.STRUCT, 1)
            self.authzToken.write(oprot)
            oprot.writeFieldEnd()
        if self.dataMovementInterfaceId is not None:
            oprot.writeFieldBegin('dataMovementInterfaceId', TType.STRING, 2)
            oprot.writeString(self.dataMovementInterfaceId.encode('utf-8') if sys.version_info[0] == 2 else self.dataMovementInterfaceId)
            oprot.writeFieldEnd()
        if self.gridFTPDataMovement is not None:
            oprot.writeFieldBegin('gridFTPDataMovement', TType.STRUCT, 3)
            self.gridFTPDataMovement.write(oprot)
            oprot.writeFieldEnd()
        oprot.writeFieldStop()
        oprot.writeStructEnd()

    def validate(self):
        if self.authzToken is None:
            raise TProtocolException(message='Required field authzToken is unset!')
        if self.dataMovementInterfaceId is None:
            raise TProtocolException(message='Required field dataMovementInterfaceId is unset!')
        if self.gridFTPDataMovement is None:
            raise TProtocolException(message='Required field gridFTPDataMovement is unset!')
        return

    def __repr__(self):
        L = ['%s=%r' % (key, value)
             for key, value in self.__dict__.items()]
        return '%s(%s)' % (self.__class__.__name__, ', '.join(L))

    def __eq__(self, other):
        return isinstance(other, self.__class__) and self.__dict__ == other.__dict__

    def __ne__(self, other):
        return not (self == other)


class updateGridFTPDataMovementDetails_result(object):
    """
    Attributes:
     - success
     - ire
     - ace
     - ase
     - ae
    """

    thrift_spec = (
        (0, TType.BOOL, 'success', None, None, ),  # 0
        (1, TType.STRUCT, 'ire', (apache.airavata.api.error.ttypes.InvalidRequestException, apache.airavata.api.error.ttypes.InvalidRequestException.thrift_spec), None, ),  # 1
        (2, TType.STRUCT, 'ace', (apache.airavata.api.error.ttypes.AiravataClientException, apache.airavata.api.error.ttypes.AiravataClientException.thrift_spec), None, ),  # 2
        (3, TType.STRUCT, 'ase', (apache.airavata.api.error.ttypes.AiravataSystemException, apache.airavata.api.error.ttypes.AiravataSystemException.thrift_spec), None, ),  # 3
        (4, TType.STRUCT, 'ae', (apache.airavata.api.error.ttypes.AuthorizationException, apache.airavata.api.error.ttypes.AuthorizationException.thrift_spec), None, ),  # 4
    )

    def __init__(self, success=None, ire=None, ace=None, ase=None, ae=None,):
        self.success = success
        self.ire = ire
        self.ace = ace
        self.ase = ase
        self.ae = ae

    def read(self, iprot):
        if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None:
            iprot._fast_decode(self, iprot, (self.__class__, self.thrift_spec))
            return
        iprot.readStructBegin()
        while True:
            (fname, ftype, fid) = iprot.readFieldBegin()
            if ftype == TType.STOP:
                break
            if fid == 0:
                if ftype == TType.BOOL:
                    self.success = iprot.readBool()
                else:
                    iprot.skip(ftype)
            elif fid == 1:
                if ftype == TType.STRUCT:
                    self.ire = apache.airavata.api.error.ttypes.InvalidRequestException()
                    self.ire.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 2:
                if ftype == TType.STRUCT:
                    self.ace = apache.airavata.api.error.ttypes.AiravataClientException()
                    self.ace.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 3:
                if ftype == TType.STRUCT:
                    self.ase = apache.airavata.api.error.ttypes.AiravataSystemException()
                    self.ase.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 4:
                if ftype == TType.STRUCT:
                    self.ae = apache.airavata.api.error.ttypes.AuthorizationException()
                    self.ae.read(iprot)
                else:
                    iprot.skip(ftype)
            else:
                iprot.skip(ftype)
            iprot.readFieldEnd()
        iprot.readStructEnd()

    def write(self, oprot):
        if oprot._fast_encode is not None and self.thrift_spec is not None:
            oprot.trans.write(oprot._fast_encode(self, (self.__class__, self.thrift_spec)))
            return
        oprot.writeStructBegin('updateGridFTPDataMovementDetails_result')
        if self.success is not None:
            oprot.writeFieldBegin('success', TType.BOOL, 0)
            oprot.writeBool(self.success)
            oprot.writeFieldEnd()
        if self.ire is not None:
            oprot.writeFieldBegin('ire', TType.STRUCT, 1)
            self.ire.write(oprot)
            oprot.writeFieldEnd()
        if self.ace is not None:
            oprot.writeFieldBegin('ace', TType.STRUCT, 2)
            self.ace.write(oprot)
            oprot.writeFieldEnd()
        if self.ase is not None:
            oprot.writeFieldBegin('ase', TType.STRUCT, 3)
            self.ase.write(oprot)
            oprot.writeFieldEnd()
        if self.ae is not None:
            oprot.writeFieldBegin('ae', TType.STRUCT, 4)
            self.ae.write(oprot)
            oprot.writeFieldEnd()
        oprot.writeFieldStop()
        oprot.writeStructEnd()

    def validate(self):
        return

    def __repr__(self):
        L = ['%s=%r' % (key, value)
             for key, value in self.__dict__.items()]
        return '%s(%s)' % (self.__class__.__name__, ', '.join(L))

    def __eq__(self, other):
        return isinstance(other, self.__class__) and self.__dict__ == other.__dict__

    def __ne__(self, other):
        return not (self == other)


class getGridFTPDataMovement_args(object):
    """
    Attributes:
     - authzToken
     - dataMovementId
    """

    thrift_spec = (
        None,  # 0
        (1, TType.STRUCT, 'authzToken', (apache.airavata.model.security.ttypes.AuthzToken, apache.airavata.model.security.ttypes.AuthzToken.thrift_spec), None, ),  # 1
        (2, TType.STRING, 'dataMovementId', 'UTF8', None, ),  # 2
    )

    def __init__(self, authzToken=None, dataMovementId=None,):
        self.authzToken = authzToken
        self.dataMovementId = dataMovementId

    def read(self, iprot):
        if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None:
            iprot._fast_decode(self, iprot, (self.__class__, self.thrift_spec))
            return
        iprot.readStructBegin()
        while True:
            (fname, ftype, fid) = iprot.readFieldBegin()
            if ftype == TType.STOP:
                break
            if fid == 1:
                if ftype == TType.STRUCT:
                    self.authzToken = apache.airavata.model.security.ttypes.AuthzToken()
                    self.authzToken.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 2:
                if ftype == TType.STRING:
                    self.dataMovementId = iprot.readString().decode('utf-8') if sys.version_info[0] == 2 else iprot.readString()
                else:
                    iprot.skip(ftype)
            else:
                iprot.skip(ftype)
            iprot.readFieldEnd()
        iprot.readStructEnd()

    def write(self, oprot):
        if oprot._fast_encode is not None and self.thrift_spec is not None:
            oprot.trans.write(oprot._fast_encode(self, (self.__class__, self.thrift_spec)))
            return
        oprot.writeStructBegin('getGridFTPDataMovement_args')
        if self.authzToken is not None:
            oprot.writeFieldBegin('authzToken', TType.STRUCT, 1)
            self.authzToken.write(oprot)
            oprot.writeFieldEnd()
        if self.dataMovementId is not None:
            oprot.writeFieldBegin('dataMovementId', TType.STRING, 2)
            oprot.writeString(self.dataMovementId.encode('utf-8') if sys.version_info[0] == 2 else self.dataMovementId)
            oprot.writeFieldEnd()
        oprot.writeFieldStop()
        oprot.writeStructEnd()

    def validate(self):
        if self.authzToken is None:
            raise TProtocolException(message='Required field authzToken is unset!')
        if self.dataMovementId is None:
            raise TProtocolException(message='Required field dataMovementId is unset!')
        return

    def __repr__(self):
        L = ['%s=%r' % (key, value)
             for key, value in self.__dict__.items()]
        return '%s(%s)' % (self.__class__.__name__, ', '.join(L))

    def __eq__(self, other):
        return isinstance(other, self.__class__) and self.__dict__ == other.__dict__

    def __ne__(self, other):
        return not (self == other)


class getGridFTPDataMovement_result(object):
    """
    Attributes:
     - success
     - ire
     - ace
     - ase
     - ae
    """

    thrift_spec = (
        (0, TType.STRUCT, 'success', (apache.airavata.model.data.movement.ttypes.GridFTPDataMovement, apache.airavata.model.data.movement.ttypes.GridFTPDataMovement.thrift_spec), None, ),  # 0
        (1, TType.STRUCT, 'ire', (apache.airavata.api.error.ttypes.InvalidRequestException, apache.airavata.api.error.ttypes.InvalidRequestException.thrift_spec), None, ),  # 1
        (2, TType.STRUCT, 'ace', (apache.airavata.api.error.ttypes.AiravataClientException, apache.airavata.api.error.ttypes.AiravataClientException.thrift_spec), None, ),  # 2
        (3, TType.STRUCT, 'ase', (apache.airavata.api.error.ttypes.AiravataSystemException, apache.airavata.api.error.ttypes.AiravataSystemException.thrift_spec), None, ),  # 3
        (4, TType.STRUCT, 'ae', (apache.airavata.api.error.ttypes.AuthorizationException, apache.airavata.api.error.ttypes.AuthorizationException.thrift_spec), None, ),  # 4
    )

    def __init__(self, success=None, ire=None, ace=None, ase=None, ae=None,):
        self.success = success
        self.ire = ire
        self.ace = ace
        self.ase = ase
        self.ae = ae

    def read(self, iprot):
        if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None:
            iprot._fast_decode(self, iprot, (self.__class__, self.thrift_spec))
            return
        iprot.readStructBegin()
        while True:
            (fname, ftype, fid) = iprot.readFieldBegin()
            if ftype == TType.STOP:
                break
            if fid == 0:
                if ftype == TType.STRUCT:
                    self.success = apache.airavata.model.data.movement.ttypes.GridFTPDataMovement()
                    self.success.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 1:
                if ftype == TType.STRUCT:
                    self.ire = apache.airavata.api.error.ttypes.InvalidRequestException()
                    self.ire.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 2:
                if ftype == TType.STRUCT:
                    self.ace = apache.airavata.api.error.ttypes.AiravataClientException()
                    self.ace.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 3:
                if ftype == TType.STRUCT:
                    self.ase = apache.airavata.api.error.ttypes.AiravataSystemException()
                    self.ase.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 4:
                if ftype == TType.STRUCT:
                    self.ae = apache.airavata.api.error.ttypes.AuthorizationException()
                    self.ae.read(iprot)
                else:
                    iprot.skip(ftype)
            else:
                iprot.skip(ftype)
            iprot.readFieldEnd()
        iprot.readStructEnd()

    def write(self, oprot):
        if oprot._fast_encode is not None and self.thrift_spec is not None:
            oprot.trans.write(oprot._fast_encode(self, (self.__class__, self.thrift_spec)))
            return
        oprot.writeStructBegin('getGridFTPDataMovement_result')
        if self.success is not None:
            oprot.writeFieldBegin('success', TType.STRUCT, 0)
            self.success.write(oprot)
            oprot.writeFieldEnd()
        if self.ire is not None:
            oprot.writeFieldBegin('ire', TType.STRUCT, 1)
            self.ire.write(oprot)
            oprot.writeFieldEnd()
        if self.ace is not None:
            oprot.writeFieldBegin('ace', TType.STRUCT, 2)
            self.ace.write(oprot)
            oprot.writeFieldEnd()
        if self.ase is not None:
            oprot.writeFieldBegin('ase', TType.STRUCT, 3)
            self.ase.write(oprot)
            oprot.writeFieldEnd()
        if self.ae is not None:
            oprot.writeFieldBegin('ae', TType.STRUCT, 4)
            self.ae.write(oprot)
            oprot.writeFieldEnd()
        oprot.writeFieldStop()
        oprot.writeStructEnd()

    def validate(self):
        return

    def __repr__(self):
        L = ['%s=%r' % (key, value)
             for key, value in self.__dict__.items()]
        return '%s(%s)' % (self.__class__.__name__, ', '.join(L))

    def __eq__(self, other):
        return isinstance(other, self.__class__) and self.__dict__ == other.__dict__

    def __ne__(self, other):
        return not (self == other)


class changeJobSubmissionPriority_args(object):
    """
    Attributes:
     - authzToken
     - jobSubmissionInterfaceId
     - newPriorityOrder
    """

    thrift_spec = (
        None,  # 0
        (1, TType.STRUCT, 'authzToken', (apache.airavata.model.security.ttypes.AuthzToken, apache.airavata.model.security.ttypes.AuthzToken.thrift_spec), None, ),  # 1
        (2, TType.STRING, 'jobSubmissionInterfaceId', 'UTF8', None, ),  # 2
        (3, TType.I32, 'newPriorityOrder', None, None, ),  # 3
    )

    def __init__(self, authzToken=None, jobSubmissionInterfaceId=None, newPriorityOrder=None,):
        self.authzToken = authzToken
        self.jobSubmissionInterfaceId = jobSubmissionInterfaceId
        self.newPriorityOrder = newPriorityOrder

    def read(self, iprot):
        if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None:
            iprot._fast_decode(self, iprot, (self.__class__, self.thrift_spec))
            return
        iprot.readStructBegin()
        while True:
            (fname, ftype, fid) = iprot.readFieldBegin()
            if ftype == TType.STOP:
                break
            if fid == 1:
                if ftype == TType.STRUCT:
                    self.authzToken = apache.airavata.model.security.ttypes.AuthzToken()
                    self.authzToken.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 2:
                if ftype == TType.STRING:
                    self.jobSubmissionInterfaceId = iprot.readString().decode('utf-8') if sys.version_info[0] == 2 else iprot.readString()
                else:
                    iprot.skip(ftype)
            elif fid == 3:
                if ftype == TType.I32:
                    self.newPriorityOrder = iprot.readI32()
                else:
                    iprot.skip(ftype)
            else:
                iprot.skip(ftype)
            iprot.readFieldEnd()
        iprot.readStructEnd()

    def write(self, oprot):
        if oprot._fast_encode is not None and self.thrift_spec is not None:
            oprot.trans.write(oprot._fast_encode(self, (self.__class__, self.thrift_spec)))
            return
        oprot.writeStructBegin('changeJobSubmissionPriority_args')
        if self.authzToken is not None:
            oprot.writeFieldBegin('authzToken', TType.STRUCT, 1)
            self.authzToken.write(oprot)
            oprot.writeFieldEnd()
        if self.jobSubmissionInterfaceId is not None:
            oprot.writeFieldBegin('jobSubmissionInterfaceId', TType.STRING, 2)
            oprot.writeString(self.jobSubmissionInterfaceId.encode('utf-8') if sys.version_info[0] == 2 else self.jobSubmissionInterfaceId)
            oprot.writeFieldEnd()
        if self.newPriorityOrder is not None:
            oprot.writeFieldBegin('newPriorityOrder', TType.I32, 3)
            oprot.writeI32(self.newPriorityOrder)
            oprot.writeFieldEnd()
        oprot.writeFieldStop()
        oprot.writeStructEnd()

    def validate(self):
        if self.authzToken is None:
            raise TProtocolException(message='Required field authzToken is unset!')
        if self.jobSubmissionInterfaceId is None:
            raise TProtocolException(message='Required field jobSubmissionInterfaceId is unset!')
        if self.newPriorityOrder is None:
            raise TProtocolException(message='Required field newPriorityOrder is unset!')
        return

    def __repr__(self):
        L = ['%s=%r' % (key, value)
             for key, value in self.__dict__.items()]
        return '%s(%s)' % (self.__class__.__name__, ', '.join(L))

    def __eq__(self, other):
        return isinstance(other, self.__class__) and self.__dict__ == other.__dict__

    def __ne__(self, other):
        return not (self == other)


class changeJobSubmissionPriority_result(object):
    """
    Attributes:
     - success
     - ire
     - ace
     - ase
     - ae
    """

    thrift_spec = (
        (0, TType.BOOL, 'success', None, None, ),  # 0
        (1, TType.STRUCT, 'ire', (apache.airavata.api.error.ttypes.InvalidRequestException, apache.airavata.api.error.ttypes.InvalidRequestException.thrift_spec), None, ),  # 1
        (2, TType.STRUCT, 'ace', (apache.airavata.api.error.ttypes.AiravataClientException, apache.airavata.api.error.ttypes.AiravataClientException.thrift_spec), None, ),  # 2
        (3, TType.STRUCT, 'ase', (apache.airavata.api.error.ttypes.AiravataSystemException, apache.airavata.api.error.ttypes.AiravataSystemException.thrift_spec), None, ),  # 3
        (4, TType.STRUCT, 'ae', (apache.airavata.api.error.ttypes.AuthorizationException, apache.airavata.api.error.ttypes.AuthorizationException.thrift_spec), None, ),  # 4
    )

    def __init__(self, success=None, ire=None, ace=None, ase=None, ae=None,):
        self.success = success
        self.ire = ire
        self.ace = ace
        self.ase = ase
        self.ae = ae

    def read(self, iprot):
        if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None:
            iprot._fast_decode(self, iprot, (self.__class__, self.thrift_spec))
            return
        iprot.readStructBegin()
        while True:
            (fname, ftype, fid) = iprot.readFieldBegin()
            if ftype == TType.STOP:
                break
            if fid == 0:
                if ftype == TType.BOOL:
                    self.success = iprot.readBool()
                else:
                    iprot.skip(ftype)
            elif fid == 1:
                if ftype == TType.STRUCT:
                    self.ire = apache.airavata.api.error.ttypes.InvalidRequestException()
                    self.ire.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 2:
                if ftype == TType.STRUCT:
                    self.ace = apache.airavata.api.error.ttypes.AiravataClientException()
                    self.ace.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 3:
                if ftype == TType.STRUCT:
                    self.ase = apache.airavata.api.error.ttypes.AiravataSystemException()
                    self.ase.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 4:
                if ftype == TType.STRUCT:
                    self.ae = apache.airavata.api.error.ttypes.AuthorizationException()
                    self.ae.read(iprot)
                else:
                    iprot.skip(ftype)
            else:
                iprot.skip(ftype)
            iprot.readFieldEnd()
        iprot.readStructEnd()

    def write(self, oprot):
        if oprot._fast_encode is not None and self.thrift_spec is not None:
            oprot.trans.write(oprot._fast_encode(self, (self.__class__, self.thrift_spec)))
            return
        oprot.writeStructBegin('changeJobSubmissionPriority_result')
        if self.success is not None:
            oprot.writeFieldBegin('success', TType.BOOL, 0)
            oprot.writeBool(self.success)
            oprot.writeFieldEnd()
        if self.ire is not None:
            oprot.writeFieldBegin('ire', TType.STRUCT, 1)
            self.ire.write(oprot)
            oprot.writeFieldEnd()
        if self.ace is not None:
            oprot.writeFieldBegin('ace', TType.STRUCT, 2)
            self.ace.write(oprot)
            oprot.writeFieldEnd()
        if self.ase is not None:
            oprot.writeFieldBegin('ase', TType.STRUCT, 3)
            self.ase.write(oprot)
            oprot.writeFieldEnd()
        if self.ae is not None:
            oprot.writeFieldBegin('ae', TType.STRUCT, 4)
            self.ae.write(oprot)
            oprot.writeFieldEnd()
        oprot.writeFieldStop()
        oprot.writeStructEnd()

    def validate(self):
        return

    def __repr__(self):
        L = ['%s=%r' % (key, value)
             for key, value in self.__dict__.items()]
        return '%s(%s)' % (self.__class__.__name__, ', '.join(L))

    def __eq__(self, other):
        return isinstance(other, self.__class__) and self.__dict__ == other.__dict__

    def __ne__(self, other):
        return not (self == other)


class changeDataMovementPriority_args(object):
    """
    Attributes:
     - authzToken
     - dataMovementInterfaceId
     - newPriorityOrder
    """

    thrift_spec = (
        None,  # 0
        (1, TType.STRUCT, 'authzToken', (apache.airavata.model.security.ttypes.AuthzToken, apache.airavata.model.security.ttypes.AuthzToken.thrift_spec), None, ),  # 1
        (2, TType.STRING, 'dataMovementInterfaceId', 'UTF8', None, ),  # 2
        (3, TType.I32, 'newPriorityOrder', None, None, ),  # 3
    )

    def __init__(self, authzToken=None, dataMovementInterfaceId=None, newPriorityOrder=None,):
        self.authzToken = authzToken
        self.dataMovementInterfaceId = dataMovementInterfaceId
        self.newPriorityOrder = newPriorityOrder

    def read(self, iprot):
        if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None:
            iprot._fast_decode(self, iprot, (self.__class__, self.thrift_spec))
            return
        iprot.readStructBegin()
        while True:
            (fname, ftype, fid) = iprot.readFieldBegin()
            if ftype == TType.STOP:
                break
            if fid == 1:
                if ftype == TType.STRUCT:
                    self.authzToken = apache.airavata.model.security.ttypes.AuthzToken()
                    self.authzToken.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 2:
                if ftype == TType.STRING:
                    self.dataMovementInterfaceId = iprot.readString().decode('utf-8') if sys.version_info[0] == 2 else iprot.readString()
                else:
                    iprot.skip(ftype)
            elif fid == 3:
                if ftype == TType.I32:
                    self.newPriorityOrder = iprot.readI32()
                else:
                    iprot.skip(ftype)
            else:
                iprot.skip(ftype)
            iprot.readFieldEnd()
        iprot.readStructEnd()

    def write(self, oprot):
        if oprot._fast_encode is not None and self.thrift_spec is not None:
            oprot.trans.write(oprot._fast_encode(self, (self.__class__, self.thrift_spec)))
            return
        oprot.writeStructBegin('changeDataMovementPriority_args')
        if self.authzToken is not None:
            oprot.writeFieldBegin('authzToken', TType.STRUCT, 1)
            self.authzToken.write(oprot)
            oprot.writeFieldEnd()
        if self.dataMovementInterfaceId is not None:
            oprot.writeFieldBegin('dataMovementInterfaceId', TType.STRING, 2)
            oprot.writeString(self.dataMovementInterfaceId.encode('utf-8') if sys.version_info[0] == 2 else self.dataMovementInterfaceId)
            oprot.writeFieldEnd()
        if self.newPriorityOrder is not None:
            oprot.writeFieldBegin('newPriorityOrder', TType.I32, 3)
            oprot.writeI32(self.newPriorityOrder)
            oprot.writeFieldEnd()
        oprot.writeFieldStop()
        oprot.writeStructEnd()

    def validate(self):
        if self.authzToken is None:
            raise TProtocolException(message='Required field authzToken is unset!')
        if self.dataMovementInterfaceId is None:
            raise TProtocolException(message='Required field dataMovementInterfaceId is unset!')
        if self.newPriorityOrder is None:
            raise TProtocolException(message='Required field newPriorityOrder is unset!')
        return

    def __repr__(self):
        L = ['%s=%r' % (key, value)
             for key, value in self.__dict__.items()]
        return '%s(%s)' % (self.__class__.__name__, ', '.join(L))

    def __eq__(self, other):
        return isinstance(other, self.__class__) and self.__dict__ == other.__dict__

    def __ne__(self, other):
        return not (self == other)


class changeDataMovementPriority_result(object):
    """
    Attributes:
     - success
     - ire
     - ace
     - ase
     - ae
    """

    thrift_spec = (
        (0, TType.BOOL, 'success', None, None, ),  # 0
        (1, TType.STRUCT, 'ire', (apache.airavata.api.error.ttypes.InvalidRequestException, apache.airavata.api.error.ttypes.InvalidRequestException.thrift_spec), None, ),  # 1
        (2, TType.STRUCT, 'ace', (apache.airavata.api.error.ttypes.AiravataClientException, apache.airavata.api.error.ttypes.AiravataClientException.thrift_spec), None, ),  # 2
        (3, TType.STRUCT, 'ase', (apache.airavata.api.error.ttypes.AiravataSystemException, apache.airavata.api.error.ttypes.AiravataSystemException.thrift_spec), None, ),  # 3
        (4, TType.STRUCT, 'ae', (apache.airavata.api.error.ttypes.AuthorizationException, apache.airavata.api.error.ttypes.AuthorizationException.thrift_spec), None, ),  # 4
    )

    def __init__(self, success=None, ire=None, ace=None, ase=None, ae=None,):
        self.success = success
        self.ire = ire
        self.ace = ace
        self.ase = ase
        self.ae = ae

    def read(self, iprot):
        if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None:
            iprot._fast_decode(self, iprot, (self.__class__, self.thrift_spec))
            return
        iprot.readStructBegin()
        while True:
            (fname, ftype, fid) = iprot.readFieldBegin()
            if ftype == TType.STOP:
                break
            if fid == 0:
                if ftype == TType.BOOL:
                    self.success = iprot.readBool()
                else:
                    iprot.skip(ftype)
            elif fid == 1:
                if ftype == TType.STRUCT:
                    self.ire = apache.airavata.api.error.ttypes.InvalidRequestException()
                    self.ire.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 2:
                if ftype == TType.STRUCT:
                    self.ace = apache.airavata.api.error.ttypes.AiravataClientException()
                    self.ace.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 3:
                if ftype == TType.STRUCT:
                    self.ase = apache.airavata.api.error.ttypes.AiravataSystemException()
                    self.ase.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 4:
                if ftype == TType.STRUCT:
                    self.ae = apache.airavata.api.error.ttypes.AuthorizationException()
                    self.ae.read(iprot)
                else:
                    iprot.skip(ftype)
            else:
                iprot.skip(ftype)
            iprot.readFieldEnd()
        iprot.readStructEnd()

    def write(self, oprot):
        if oprot._fast_encode is not None and self.thrift_spec is not None:
            oprot.trans.write(oprot._fast_encode(self, (self.__class__, self.thrift_spec)))
            return
        oprot.writeStructBegin('changeDataMovementPriority_result')
        if self.success is not None:
            oprot.writeFieldBegin('success', TType.BOOL, 0)
            oprot.writeBool(self.success)
            oprot.writeFieldEnd()
        if self.ire is not None:
            oprot.writeFieldBegin('ire', TType.STRUCT, 1)
            self.ire.write(oprot)
            oprot.writeFieldEnd()
        if self.ace is not None:
            oprot.writeFieldBegin('ace', TType.STRUCT, 2)
            self.ace.write(oprot)
            oprot.writeFieldEnd()
        if self.ase is not None:
            oprot.writeFieldBegin('ase', TType.STRUCT, 3)
            self.ase.write(oprot)
            oprot.writeFieldEnd()
        if self.ae is not None:
            oprot.writeFieldBegin('ae', TType.STRUCT, 4)
            self.ae.write(oprot)
            oprot.writeFieldEnd()
        oprot.writeFieldStop()
        oprot.writeStructEnd()

    def validate(self):
        return

    def __repr__(self):
        L = ['%s=%r' % (key, value)
             for key, value in self.__dict__.items()]
        return '%s(%s)' % (self.__class__.__name__, ', '.join(L))

    def __eq__(self, other):
        return isinstance(other, self.__class__) and self.__dict__ == other.__dict__

    def __ne__(self, other):
        return not (self == other)


class changeJobSubmissionPriorities_args(object):
    """
    Attributes:
     - authzToken
     - jobSubmissionPriorityMap
    """

    thrift_spec = (
        None,  # 0
        (1, TType.STRUCT, 'authzToken', (apache.airavata.model.security.ttypes.AuthzToken, apache.airavata.model.security.ttypes.AuthzToken.thrift_spec), None, ),  # 1
        (2, TType.MAP, 'jobSubmissionPriorityMap', (TType.STRING, 'UTF8', TType.I32, None, False), None, ),  # 2
    )

    def __init__(self, authzToken=None, jobSubmissionPriorityMap=None,):
        self.authzToken = authzToken
        self.jobSubmissionPriorityMap = jobSubmissionPriorityMap

    def read(self, iprot):
        if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None:
            iprot._fast_decode(self, iprot, (self.__class__, self.thrift_spec))
            return
        iprot.readStructBegin()
        while True:
            (fname, ftype, fid) = iprot.readFieldBegin()
            if ftype == TType.STOP:
                break
            if fid == 1:
                if ftype == TType.STRUCT:
                    self.authzToken = apache.airavata.model.security.ttypes.AuthzToken()
                    self.authzToken.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 2:
                if ftype == TType.MAP:
                    self.jobSubmissionPriorityMap = {}
                    (_ktype215, _vtype216, _size214) = iprot.readMapBegin()
                    for _i218 in range(_size214):
                        _key219 = iprot.readString().decode('utf-8') if sys.version_info[0] == 2 else iprot.readString()
                        _val220 = iprot.readI32()
                        self.jobSubmissionPriorityMap[_key219] = _val220
                    iprot.readMapEnd()
                else:
                    iprot.skip(ftype)
            else:
                iprot.skip(ftype)
            iprot.readFieldEnd()
        iprot.readStructEnd()

    def write(self, oprot):
        if oprot._fast_encode is not None and self.thrift_spec is not None:
            oprot.trans.write(oprot._fast_encode(self, (self.__class__, self.thrift_spec)))
            return
        oprot.writeStructBegin('changeJobSubmissionPriorities_args')
        if self.authzToken is not None:
            oprot.writeFieldBegin('authzToken', TType.STRUCT, 1)
            self.authzToken.write(oprot)
            oprot.writeFieldEnd()
        if self.jobSubmissionPriorityMap is not None:
            oprot.writeFieldBegin('jobSubmissionPriorityMap', TType.MAP, 2)
            oprot.writeMapBegin(TType.STRING, TType.I32, len(self.jobSubmissionPriorityMap))
            for kiter221, viter222 in self.jobSubmissionPriorityMap.items():
                oprot.writeString(kiter221.encode('utf-8') if sys.version_info[0] == 2 else kiter221)
                oprot.writeI32(viter222)
            oprot.writeMapEnd()
            oprot.writeFieldEnd()
        oprot.writeFieldStop()
        oprot.writeStructEnd()

    def validate(self):
        if self.authzToken is None:
            raise TProtocolException(message='Required field authzToken is unset!')
        if self.jobSubmissionPriorityMap is None:
            raise TProtocolException(message='Required field jobSubmissionPriorityMap is unset!')
        return

    def __repr__(self):
        L = ['%s=%r' % (key, value)
             for key, value in self.__dict__.items()]
        return '%s(%s)' % (self.__class__.__name__, ', '.join(L))

    def __eq__(self, other):
        return isinstance(other, self.__class__) and self.__dict__ == other.__dict__

    def __ne__(self, other):
        return not (self == other)


class changeJobSubmissionPriorities_result(object):
    """
    Attributes:
     - success
     - ire
     - ace
     - ase
     - ae
    """

    thrift_spec = (
        (0, TType.BOOL, 'success', None, None, ),  # 0
        (1, TType.STRUCT, 'ire', (apache.airavata.api.error.ttypes.InvalidRequestException, apache.airavata.api.error.ttypes.InvalidRequestException.thrift_spec), None, ),  # 1
        (2, TType.STRUCT, 'ace', (apache.airavata.api.error.ttypes.AiravataClientException, apache.airavata.api.error.ttypes.AiravataClientException.thrift_spec), None, ),  # 2
        (3, TType.STRUCT, 'ase', (apache.airavata.api.error.ttypes.AiravataSystemException, apache.airavata.api.error.ttypes.AiravataSystemException.thrift_spec), None, ),  # 3
        (4, TType.STRUCT, 'ae', (apache.airavata.api.error.ttypes.AuthorizationException, apache.airavata.api.error.ttypes.AuthorizationException.thrift_spec), None, ),  # 4
    )

    def __init__(self, success=None, ire=None, ace=None, ase=None, ae=None,):
        self.success = success
        self.ire = ire
        self.ace = ace
        self.ase = ase
        self.ae = ae

    def read(self, iprot):
        if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None:
            iprot._fast_decode(self, iprot, (self.__class__, self.thrift_spec))
            return
        iprot.readStructBegin()
        while True:
            (fname, ftype, fid) = iprot.readFieldBegin()
            if ftype == TType.STOP:
                break
            if fid == 0:
                if ftype == TType.BOOL:
                    self.success = iprot.readBool()
                else:
                    iprot.skip(ftype)
            elif fid == 1:
                if ftype == TType.STRUCT:
                    self.ire = apache.airavata.api.error.ttypes.InvalidRequestException()
                    self.ire.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 2:
                if ftype == TType.STRUCT:
                    self.ace = apache.airavata.api.error.ttypes.AiravataClientException()
                    self.ace.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 3:
                if ftype == TType.STRUCT:
                    self.ase = apache.airavata.api.error.ttypes.AiravataSystemException()
                    self.ase.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 4:
                if ftype == TType.STRUCT:
                    self.ae = apache.airavata.api.error.ttypes.AuthorizationException()
                    self.ae.read(iprot)
                else:
                    iprot.skip(ftype)
            else:
                iprot.skip(ftype)
            iprot.readFieldEnd()
        iprot.readStructEnd()

    def write(self, oprot):
        if oprot._fast_encode is not None and self.thrift_spec is not None:
            oprot.trans.write(oprot._fast_encode(self, (self.__class__, self.thrift_spec)))
            return
        oprot.writeStructBegin('changeJobSubmissionPriorities_result')
        if self.success is not None:
            oprot.writeFieldBegin('success', TType.BOOL, 0)
            oprot.writeBool(self.success)
            oprot.writeFieldEnd()
        if self.ire is not None:
            oprot.writeFieldBegin('ire', TType.STRUCT, 1)
            self.ire.write(oprot)
            oprot.writeFieldEnd()
        if self.ace is not None:
            oprot.writeFieldBegin('ace', TType.STRUCT, 2)
            self.ace.write(oprot)
            oprot.writeFieldEnd()
        if self.ase is not None:
            oprot.writeFieldBegin('ase', TType.STRUCT, 3)
            self.ase.write(oprot)
            oprot.writeFieldEnd()
        if self.ae is not None:
            oprot.writeFieldBegin('ae', TType.STRUCT, 4)
            self.ae.write(oprot)
            oprot.writeFieldEnd()
        oprot.writeFieldStop()
        oprot.writeStructEnd()

    def validate(self):
        return

    def __repr__(self):
        L = ['%s=%r' % (key, value)
             for key, value in self.__dict__.items()]
        return '%s(%s)' % (self.__class__.__name__, ', '.join(L))

    def __eq__(self, other):
        return isinstance(other, self.__class__) and self.__dict__ == other.__dict__

    def __ne__(self, other):
        return not (self == other)


class changeDataMovementPriorities_args(object):
    """
    Attributes:
     - authzToken
     - dataMovementPriorityMap
    """

    thrift_spec = (
        None,  # 0
        (1, TType.STRUCT, 'authzToken', (apache.airavata.model.security.ttypes.AuthzToken, apache.airavata.model.security.ttypes.AuthzToken.thrift_spec), None, ),  # 1
        (2, TType.MAP, 'dataMovementPriorityMap', (TType.STRING, 'UTF8', TType.I32, None, False), None, ),  # 2
    )

    def __init__(self, authzToken=None, dataMovementPriorityMap=None,):
        self.authzToken = authzToken
        self.dataMovementPriorityMap = dataMovementPriorityMap

    def read(self, iprot):
        if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None:
            iprot._fast_decode(self, iprot, (self.__class__, self.thrift_spec))
            return
        iprot.readStructBegin()
        while True:
            (fname, ftype, fid) = iprot.readFieldBegin()
            if ftype == TType.STOP:
                break
            if fid == 1:
                if ftype == TType.STRUCT:
                    self.authzToken = apache.airavata.model.security.ttypes.AuthzToken()
                    self.authzToken.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 2:
                if ftype == TType.MAP:
                    self.dataMovementPriorityMap = {}
                    (_ktype224, _vtype225, _size223) = iprot.readMapBegin()
                    for _i227 in range(_size223):
                        _key228 = iprot.readString().decode('utf-8') if sys.version_info[0] == 2 else iprot.readString()
                        _val229 = iprot.readI32()
                        self.dataMovementPriorityMap[_key228] = _val229
                    iprot.readMapEnd()
                else:
                    iprot.skip(ftype)
            else:
                iprot.skip(ftype)
            iprot.readFieldEnd()
        iprot.readStructEnd()

    def write(self, oprot):
        if oprot._fast_encode is not None and self.thrift_spec is not None:
            oprot.trans.write(oprot._fast_encode(self, (self.__class__, self.thrift_spec)))
            return
        oprot.writeStructBegin('changeDataMovementPriorities_args')
        if self.authzToken is not None:
            oprot.writeFieldBegin('authzToken', TType.STRUCT, 1)
            self.authzToken.write(oprot)
            oprot.writeFieldEnd()
        if self.dataMovementPriorityMap is not None:
            oprot.writeFieldBegin('dataMovementPriorityMap', TType.MAP, 2)
            oprot.writeMapBegin(TType.STRING, TType.I32, len(self.dataMovementPriorityMap))
            for kiter230, viter231 in self.dataMovementPriorityMap.items():
                oprot.writeString(kiter230.encode('utf-8') if sys.version_info[0] == 2 else kiter230)
                oprot.writeI32(viter231)
            oprot.writeMapEnd()
            oprot.writeFieldEnd()
        oprot.writeFieldStop()
        oprot.writeStructEnd()

    def validate(self):
        if self.authzToken is None:
            raise TProtocolException(message='Required field authzToken is unset!')
        if self.dataMovementPriorityMap is None:
            raise TProtocolException(message='Required field dataMovementPriorityMap is unset!')
        return

    def __repr__(self):
        L = ['%s=%r' % (key, value)
             for key, value in self.__dict__.items()]
        return '%s(%s)' % (self.__class__.__name__, ', '.join(L))

    def __eq__(self, other):
        return isinstance(other, self.__class__) and self.__dict__ == other.__dict__

    def __ne__(self, other):
        return not (self == other)


class changeDataMovementPriorities_result(object):
    """
    Attributes:
     - success
     - ire
     - ace
     - ase
     - ae
    """

    thrift_spec = (
        (0, TType.BOOL, 'success', None, None, ),  # 0
        (1, TType.STRUCT, 'ire', (apache.airavata.api.error.ttypes.InvalidRequestException, apache.airavata.api.error.ttypes.InvalidRequestException.thrift_spec), None, ),  # 1
        (2, TType.STRUCT, 'ace', (apache.airavata.api.error.ttypes.AiravataClientException, apache.airavata.api.error.ttypes.AiravataClientException.thrift_spec), None, ),  # 2
        (3, TType.STRUCT, 'ase', (apache.airavata.api.error.ttypes.AiravataSystemException, apache.airavata.api.error.ttypes.AiravataSystemException.thrift_spec), None, ),  # 3
        (4, TType.STRUCT, 'ae', (apache.airavata.api.error.ttypes.AuthorizationException, apache.airavata.api.error.ttypes.AuthorizationException.thrift_spec), None, ),  # 4
    )

    def __init__(self, success=None, ire=None, ace=None, ase=None, ae=None,):
        self.success = success
        self.ire = ire
        self.ace = ace
        self.ase = ase
        self.ae = ae

    def read(self, iprot):
        if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None:
            iprot._fast_decode(self, iprot, (self.__class__, self.thrift_spec))
            return
        iprot.readStructBegin()
        while True:
            (fname, ftype, fid) = iprot.readFieldBegin()
            if ftype == TType.STOP:
                break
            if fid == 0:
                if ftype == TType.BOOL:
                    self.success = iprot.readBool()
                else:
                    iprot.skip(ftype)
            elif fid == 1:
                if ftype == TType.STRUCT:
                    self.ire = apache.airavata.api.error.ttypes.InvalidRequestException()
                    self.ire.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 2:
                if ftype == TType.STRUCT:
                    self.ace = apache.airavata.api.error.ttypes.AiravataClientException()
                    self.ace.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 3:
                if ftype == TType.STRUCT:
                    self.ase = apache.airavata.api.error.ttypes.AiravataSystemException()
                    self.ase.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 4:
                if ftype == TType.STRUCT:
                    self.ae = apache.airavata.api.error.ttypes.AuthorizationException()
                    self.ae.read(iprot)
                else:
                    iprot.skip(ftype)
            else:
                iprot.skip(ftype)
            iprot.readFieldEnd()
        iprot.readStructEnd()

    def write(self, oprot):
        if oprot._fast_encode is not None and self.thrift_spec is not None:
            oprot.trans.write(oprot._fast_encode(self, (self.__class__, self.thrift_spec)))
            return
        oprot.writeStructBegin('changeDataMovementPriorities_result')
        if self.success is not None:
            oprot.writeFieldBegin('success', TType.BOOL, 0)
            oprot.writeBool(self.success)
            oprot.writeFieldEnd()
        if self.ire is not None:
            oprot.writeFieldBegin('ire', TType.STRUCT, 1)
            self.ire.write(oprot)
            oprot.writeFieldEnd()
        if self.ace is not None:
            oprot.writeFieldBegin('ace', TType.STRUCT, 2)
            self.ace.write(oprot)
            oprot.writeFieldEnd()
        if self.ase is not None:
            oprot.writeFieldBegin('ase', TType.STRUCT, 3)
            self.ase.write(oprot)
            oprot.writeFieldEnd()
        if self.ae is not None:
            oprot.writeFieldBegin('ae', TType.STRUCT, 4)
            self.ae.write(oprot)
            oprot.writeFieldEnd()
        oprot.writeFieldStop()
        oprot.writeStructEnd()

    def validate(self):
        return

    def __repr__(self):
        L = ['%s=%r' % (key, value)
             for key, value in self.__dict__.items()]
        return '%s(%s)' % (self.__class__.__name__, ', '.join(L))

    def __eq__(self, other):
        return isinstance(other, self.__class__) and self.__dict__ == other.__dict__

    def __ne__(self, other):
        return not (self == other)


class deleteJobSubmissionInterface_args(object):
    """
    Attributes:
     - authzToken
     - computeResourceId
     - jobSubmissionInterfaceId
    """

    thrift_spec = (
        None,  # 0
        (1, TType.STRUCT, 'authzToken', (apache.airavata.model.security.ttypes.AuthzToken, apache.airavata.model.security.ttypes.AuthzToken.thrift_spec), None, ),  # 1
        (2, TType.STRING, 'computeResourceId', 'UTF8', None, ),  # 2
        (3, TType.STRING, 'jobSubmissionInterfaceId', 'UTF8', None, ),  # 3
    )

    def __init__(self, authzToken=None, computeResourceId=None, jobSubmissionInterfaceId=None,):
        self.authzToken = authzToken
        self.computeResourceId = computeResourceId
        self.jobSubmissionInterfaceId = jobSubmissionInterfaceId

    def read(self, iprot):
        if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None:
            iprot._fast_decode(self, iprot, (self.__class__, self.thrift_spec))
            return
        iprot.readStructBegin()
        while True:
            (fname, ftype, fid) = iprot.readFieldBegin()
            if ftype == TType.STOP:
                break
            if fid == 1:
                if ftype == TType.STRUCT:
                    self.authzToken = apache.airavata.model.security.ttypes.AuthzToken()
                    self.authzToken.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 2:
                if ftype == TType.STRING:
                    self.computeResourceId = iprot.readString().decode('utf-8') if sys.version_info[0] == 2 else iprot.readString()
                else:
                    iprot.skip(ftype)
            elif fid == 3:
                if ftype == TType.STRING:
                    self.jobSubmissionInterfaceId = iprot.readString().decode('utf-8') if sys.version_info[0] == 2 else iprot.readString()
                else:
                    iprot.skip(ftype)
            else:
                iprot.skip(ftype)
            iprot.readFieldEnd()
        iprot.readStructEnd()

    def write(self, oprot):
        if oprot._fast_encode is not None and self.thrift_spec is not None:
            oprot.trans.write(oprot._fast_encode(self, (self.__class__, self.thrift_spec)))
            return
        oprot.writeStructBegin('deleteJobSubmissionInterface_args')
        if self.authzToken is not None:
            oprot.writeFieldBegin('authzToken', TType.STRUCT, 1)
            self.authzToken.write(oprot)
            oprot.writeFieldEnd()
        if self.computeResourceId is not None:
            oprot.writeFieldBegin('computeResourceId', TType.STRING, 2)
            oprot.writeString(self.computeResourceId.encode('utf-8') if sys.version_info[0] == 2 else self.computeResourceId)
            oprot.writeFieldEnd()
        if self.jobSubmissionInterfaceId is not None:
            oprot.writeFieldBegin('jobSubmissionInterfaceId', TType.STRING, 3)
            oprot.writeString(self.jobSubmissionInterfaceId.encode('utf-8') if sys.version_info[0] == 2 else self.jobSubmissionInterfaceId)
            oprot.writeFieldEnd()
        oprot.writeFieldStop()
        oprot.writeStructEnd()

    def validate(self):
        if self.authzToken is None:
            raise TProtocolException(message='Required field authzToken is unset!')
        if self.computeResourceId is None:
            raise TProtocolException(message='Required field computeResourceId is unset!')
        if self.jobSubmissionInterfaceId is None:
            raise TProtocolException(message='Required field jobSubmissionInterfaceId is unset!')
        return

    def __repr__(self):
        L = ['%s=%r' % (key, value)
             for key, value in self.__dict__.items()]
        return '%s(%s)' % (self.__class__.__name__, ', '.join(L))

    def __eq__(self, other):
        return isinstance(other, self.__class__) and self.__dict__ == other.__dict__

    def __ne__(self, other):
        return not (self == other)


class deleteJobSubmissionInterface_result(object):
    """
    Attributes:
     - success
     - ire
     - ace
     - ase
     - ae
    """

    thrift_spec = (
        (0, TType.BOOL, 'success', None, None, ),  # 0
        (1, TType.STRUCT, 'ire', (apache.airavata.api.error.ttypes.InvalidRequestException, apache.airavata.api.error.ttypes.InvalidRequestException.thrift_spec), None, ),  # 1
        (2, TType.STRUCT, 'ace', (apache.airavata.api.error.ttypes.AiravataClientException, apache.airavata.api.error.ttypes.AiravataClientException.thrift_spec), None, ),  # 2
        (3, TType.STRUCT, 'ase', (apache.airavata.api.error.ttypes.AiravataSystemException, apache.airavata.api.error.ttypes.AiravataSystemException.thrift_spec), None, ),  # 3
        (4, TType.STRUCT, 'ae', (apache.airavata.api.error.ttypes.AuthorizationException, apache.airavata.api.error.ttypes.AuthorizationException.thrift_spec), None, ),  # 4
    )

    def __init__(self, success=None, ire=None, ace=None, ase=None, ae=None,):
        self.success = success
        self.ire = ire
        self.ace = ace
        self.ase = ase
        self.ae = ae

    def read(self, iprot):
        if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None:
            iprot._fast_decode(self, iprot, (self.__class__, self.thrift_spec))
            return
        iprot.readStructBegin()
        while True:
            (fname, ftype, fid) = iprot.readFieldBegin()
            if ftype == TType.STOP:
                break
            if fid == 0:
                if ftype == TType.BOOL:
                    self.success = iprot.readBool()
                else:
                    iprot.skip(ftype)
            elif fid == 1:
                if ftype == TType.STRUCT:
                    self.ire = apache.airavata.api.error.ttypes.InvalidRequestException()
                    self.ire.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 2:
                if ftype == TType.STRUCT:
                    self.ace = apache.airavata.api.error.ttypes.AiravataClientException()
                    self.ace.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 3:
                if ftype == TType.STRUCT:
                    self.ase = apache.airavata.api.error.ttypes.AiravataSystemException()
                    self.ase.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 4:
                if ftype == TType.STRUCT:
                    self.ae = apache.airavata.api.error.ttypes.AuthorizationException()
                    self.ae.read(iprot)
                else:
                    iprot.skip(ftype)
            else:
                iprot.skip(ftype)
            iprot.readFieldEnd()
        iprot.readStructEnd()

    def write(self, oprot):
        if oprot._fast_encode is not None and self.thrift_spec is not None:
            oprot.trans.write(oprot._fast_encode(self, (self.__class__, self.thrift_spec)))
            return
        oprot.writeStructBegin('deleteJobSubmissionInterface_result')
        if self.success is not None:
            oprot.writeFieldBegin('success', TType.BOOL, 0)
            oprot.writeBool(self.success)
            oprot.writeFieldEnd()
        if self.ire is not None:
            oprot.writeFieldBegin('ire', TType.STRUCT, 1)
            self.ire.write(oprot)
            oprot.writeFieldEnd()
        if self.ace is not None:
            oprot.writeFieldBegin('ace', TType.STRUCT, 2)
            self.ace.write(oprot)
            oprot.writeFieldEnd()
        if self.ase is not None:
            oprot.writeFieldBegin('ase', TType.STRUCT, 3)
            self.ase.write(oprot)
            oprot.writeFieldEnd()
        if self.ae is not None:
            oprot.writeFieldBegin('ae', TType.STRUCT, 4)
            self.ae.write(oprot)
            oprot.writeFieldEnd()
        oprot.writeFieldStop()
        oprot.writeStructEnd()

    def validate(self):
        return

    def __repr__(self):
        L = ['%s=%r' % (key, value)
             for key, value in self.__dict__.items()]
        return '%s(%s)' % (self.__class__.__name__, ', '.join(L))

    def __eq__(self, other):
        return isinstance(other, self.__class__) and self.__dict__ == other.__dict__

    def __ne__(self, other):
        return not (self == other)


class deleteDataMovementInterface_args(object):
    """
    Attributes:
     - authzToken
     - productUri
     - dataMovementInterfaceId
     - dataMoveType
    """

    thrift_spec = (
        None,  # 0
        (1, TType.STRUCT, 'authzToken', (apache.airavata.model.security.ttypes.AuthzToken, apache.airavata.model.security.ttypes.AuthzToken.thrift_spec), None, ),  # 1
        (2, TType.STRING, 'productUri', 'UTF8', None, ),  # 2
        (3, TType.STRING, 'dataMovementInterfaceId', 'UTF8', None, ),  # 3
        (4, TType.I32, 'dataMoveType', None, None, ),  # 4
    )

    def __init__(self, authzToken=None, productUri=None, dataMovementInterfaceId=None, dataMoveType=None,):
        self.authzToken = authzToken
        self.productUri = productUri
        self.dataMovementInterfaceId = dataMovementInterfaceId
        self.dataMoveType = dataMoveType

    def read(self, iprot):
        if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None:
            iprot._fast_decode(self, iprot, (self.__class__, self.thrift_spec))
            return
        iprot.readStructBegin()
        while True:
            (fname, ftype, fid) = iprot.readFieldBegin()
            if ftype == TType.STOP:
                break
            if fid == 1:
                if ftype == TType.STRUCT:
                    self.authzToken = apache.airavata.model.security.ttypes.AuthzToken()
                    self.authzToken.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 2:
                if ftype == TType.STRING:
                    self.productUri = iprot.readString().decode('utf-8') if sys.version_info[0] == 2 else iprot.readString()
                else:
                    iprot.skip(ftype)
            elif fid == 3:
                if ftype == TType.STRING:
                    self.dataMovementInterfaceId = iprot.readString().decode('utf-8') if sys.version_info[0] == 2 else iprot.readString()
                else:
                    iprot.skip(ftype)
            elif fid == 4:
                if ftype == TType.I32:
                    self.dataMoveType = iprot.readI32()
                else:
                    iprot.skip(ftype)
            else:
                iprot.skip(ftype)
            iprot.readFieldEnd()
        iprot.readStructEnd()

    def write(self, oprot):
        if oprot._fast_encode is not None and self.thrift_spec is not None:
            oprot.trans.write(oprot._fast_encode(self, (self.__class__, self.thrift_spec)))
            return
        oprot.writeStructBegin('deleteDataMovementInterface_args')
        if self.authzToken is not None:
            oprot.writeFieldBegin('authzToken', TType.STRUCT, 1)
            self.authzToken.write(oprot)
            oprot.writeFieldEnd()
        if self.productUri is not None:
            oprot.writeFieldBegin('productUri', TType.STRING, 2)
            oprot.writeString(self.productUri.encode('utf-8') if sys.version_info[0] == 2 else self.productUri)
            oprot.writeFieldEnd()
        if self.dataMovementInterfaceId is not None:
            oprot.writeFieldBegin('dataMovementInterfaceId', TType.STRING, 3)
            oprot.writeString(self.dataMovementInterfaceId.encode('utf-8') if sys.version_info[0] == 2 else self.dataMovementInterfaceId)
            oprot.writeFieldEnd()
        if self.dataMoveType is not None:
            oprot.writeFieldBegin('dataMoveType', TType.I32, 4)
            oprot.writeI32(self.dataMoveType)
            oprot.writeFieldEnd()
        oprot.writeFieldStop()
        oprot.writeStructEnd()

    def validate(self):
        if self.authzToken is None:
            raise TProtocolException(message='Required field authzToken is unset!')
        if self.productUri is None:
            raise TProtocolException(message='Required field productUri is unset!')
        if self.dataMovementInterfaceId is None:
            raise TProtocolException(message='Required field dataMovementInterfaceId is unset!')
        if self.dataMoveType is None:
            raise TProtocolException(message='Required field dataMoveType is unset!')
        return

    def __repr__(self):
        L = ['%s=%r' % (key, value)
             for key, value in self.__dict__.items()]
        return '%s(%s)' % (self.__class__.__name__, ', '.join(L))

    def __eq__(self, other):
        return isinstance(other, self.__class__) and self.__dict__ == other.__dict__

    def __ne__(self, other):
        return not (self == other)


class deleteDataMovementInterface_result(object):
    """
    Attributes:
     - success
     - ire
     - ace
     - ase
     - ae
    """

    thrift_spec = (
        (0, TType.BOOL, 'success', None, None, ),  # 0
        (1, TType.STRUCT, 'ire', (apache.airavata.api.error.ttypes.InvalidRequestException, apache.airavata.api.error.ttypes.InvalidRequestException.thrift_spec), None, ),  # 1
        (2, TType.STRUCT, 'ace', (apache.airavata.api.error.ttypes.AiravataClientException, apache.airavata.api.error.ttypes.AiravataClientException.thrift_spec), None, ),  # 2
        (3, TType.STRUCT, 'ase', (apache.airavata.api.error.ttypes.AiravataSystemException, apache.airavata.api.error.ttypes.AiravataSystemException.thrift_spec), None, ),  # 3
        (4, TType.STRUCT, 'ae', (apache.airavata.api.error.ttypes.AuthorizationException, apache.airavata.api.error.ttypes.AuthorizationException.thrift_spec), None, ),  # 4
    )

    def __init__(self, success=None, ire=None, ace=None, ase=None, ae=None,):
        self.success = success
        self.ire = ire
        self.ace = ace
        self.ase = ase
        self.ae = ae

    def read(self, iprot):
        if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None:
            iprot._fast_decode(self, iprot, (self.__class__, self.thrift_spec))
            return
        iprot.readStructBegin()
        while True:
            (fname, ftype, fid) = iprot.readFieldBegin()
            if ftype == TType.STOP:
                break
            if fid == 0:
                if ftype == TType.BOOL:
                    self.success = iprot.readBool()
                else:
                    iprot.skip(ftype)
            elif fid == 1:
                if ftype == TType.STRUCT:
                    self.ire = apache.airavata.api.error.ttypes.InvalidRequestException()
                    self.ire.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 2:
                if ftype == TType.STRUCT:
                    self.ace = apache.airavata.api.error.ttypes.AiravataClientException()
                    self.ace.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 3:
                if ftype == TType.STRUCT:
                    self.ase = apache.airavata.api.error.ttypes.AiravataSystemException()
                    self.ase.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 4:
                if ftype == TType.STRUCT:
                    self.ae = apache.airavata.api.error.ttypes.AuthorizationException()
                    self.ae.read(iprot)
                else:
                    iprot.skip(ftype)
            else:
                iprot.skip(ftype)
            iprot.readFieldEnd()
        iprot.readStructEnd()

    def write(self, oprot):
        if oprot._fast_encode is not None and self.thrift_spec is not None:
            oprot.trans.write(oprot._fast_encode(self, (self.__class__, self.thrift_spec)))
            return
        oprot.writeStructBegin('deleteDataMovementInterface_result')
        if self.success is not None:
            oprot.writeFieldBegin('success', TType.BOOL, 0)
            oprot.writeBool(self.success)
            oprot.writeFieldEnd()
        if self.ire is not None:
            oprot.writeFieldBegin('ire', TType.STRUCT, 1)
            self.ire.write(oprot)
            oprot.writeFieldEnd()
        if self.ace is not None:
            oprot.writeFieldBegin('ace', TType.STRUCT, 2)
            self.ace.write(oprot)
            oprot.writeFieldEnd()
        if self.ase is not None:
            oprot.writeFieldBegin('ase', TType.STRUCT, 3)
            self.ase.write(oprot)
            oprot.writeFieldEnd()
        if self.ae is not None:
            oprot.writeFieldBegin('ae', TType.STRUCT, 4)
            self.ae.write(oprot)
            oprot.writeFieldEnd()
        oprot.writeFieldStop()
        oprot.writeStructEnd()

    def validate(self):
        return

    def __repr__(self):
        L = ['%s=%r' % (key, value)
             for key, value in self.__dict__.items()]
        return '%s(%s)' % (self.__class__.__name__, ', '.join(L))

    def __eq__(self, other):
        return isinstance(other, self.__class__) and self.__dict__ == other.__dict__

    def __ne__(self, other):
        return not (self == other)


class registerResourceJobManager_args(object):
    """
    Attributes:
     - authzToken
     - resourceJobManager
    """

    thrift_spec = (
        None,  # 0
        (1, TType.STRUCT, 'authzToken', (apache.airavata.model.security.ttypes.AuthzToken, apache.airavata.model.security.ttypes.AuthzToken.thrift_spec), None, ),  # 1
        (2, TType.STRUCT, 'resourceJobManager', (apache.airavata.model.appcatalog.computeresource.ttypes.ResourceJobManager, apache.airavata.model.appcatalog.computeresource.ttypes.ResourceJobManager.thrift_spec), None, ),  # 2
    )

    def __init__(self, authzToken=None, resourceJobManager=None,):
        self.authzToken = authzToken
        self.resourceJobManager = resourceJobManager

    def read(self, iprot):
        if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None:
            iprot._fast_decode(self, iprot, (self.__class__, self.thrift_spec))
            return
        iprot.readStructBegin()
        while True:
            (fname, ftype, fid) = iprot.readFieldBegin()
            if ftype == TType.STOP:
                break
            if fid == 1:
                if ftype == TType.STRUCT:
                    self.authzToken = apache.airavata.model.security.ttypes.AuthzToken()
                    self.authzToken.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 2:
                if ftype == TType.STRUCT:
                    self.resourceJobManager = apache.airavata.model.appcatalog.computeresource.ttypes.ResourceJobManager()
                    self.resourceJobManager.read(iprot)
                else:
                    iprot.skip(ftype)
            else:
                iprot.skip(ftype)
            iprot.readFieldEnd()
        iprot.readStructEnd()

    def write(self, oprot):
        if oprot._fast_encode is not None and self.thrift_spec is not None:
            oprot.trans.write(oprot._fast_encode(self, (self.__class__, self.thrift_spec)))
            return
        oprot.writeStructBegin('registerResourceJobManager_args')
        if self.authzToken is not None:
            oprot.writeFieldBegin('authzToken', TType.STRUCT, 1)
            self.authzToken.write(oprot)
            oprot.writeFieldEnd()
        if self.resourceJobManager is not None:
            oprot.writeFieldBegin('resourceJobManager', TType.STRUCT, 2)
            self.resourceJobManager.write(oprot)
            oprot.writeFieldEnd()
        oprot.writeFieldStop()
        oprot.writeStructEnd()

    def validate(self):
        if self.authzToken is None:
            raise TProtocolException(message='Required field authzToken is unset!')
        if self.resourceJobManager is None:
            raise TProtocolException(message='Required field resourceJobManager is unset!')
        return

    def __repr__(self):
        L = ['%s=%r' % (key, value)
             for key, value in self.__dict__.items()]
        return '%s(%s)' % (self.__class__.__name__, ', '.join(L))

    def __eq__(self, other):
        return isinstance(other, self.__class__) and self.__dict__ == other.__dict__

    def __ne__(self, other):
        return not (self == other)


class registerResourceJobManager_result(object):
    """
    Attributes:
     - success
     - ire
     - ace
     - ase
     - ae
    """

    thrift_spec = (
        (0, TType.STRING, 'success', 'UTF8', None, ),  # 0
        (1, TType.STRUCT, 'ire', (apache.airavata.api.error.ttypes.InvalidRequestException, apache.airavata.api.error.ttypes.InvalidRequestException.thrift_spec), None, ),  # 1
        (2, TType.STRUCT, 'ace', (apache.airavata.api.error.ttypes.AiravataClientException, apache.airavata.api.error.ttypes.AiravataClientException.thrift_spec), None, ),  # 2
        (3, TType.STRUCT, 'ase', (apache.airavata.api.error.ttypes.AiravataSystemException, apache.airavata.api.error.ttypes.AiravataSystemException.thrift_spec), None, ),  # 3
        (4, TType.STRUCT, 'ae', (apache.airavata.api.error.ttypes.AuthorizationException, apache.airavata.api.error.ttypes.AuthorizationException.thrift_spec), None, ),  # 4
    )

    def __init__(self, success=None, ire=None, ace=None, ase=None, ae=None,):
        self.success = success
        self.ire = ire
        self.ace = ace
        self.ase = ase
        self.ae = ae

    def read(self, iprot):
        if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None:
            iprot._fast_decode(self, iprot, (self.__class__, self.thrift_spec))
            return
        iprot.readStructBegin()
        while True:
            (fname, ftype, fid) = iprot.readFieldBegin()
            if ftype == TType.STOP:
                break
            if fid == 0:
                if ftype == TType.STRING:
                    self.success = iprot.readString().decode('utf-8') if sys.version_info[0] == 2 else iprot.readString()
                else:
                    iprot.skip(ftype)
            elif fid == 1:
                if ftype == TType.STRUCT:
                    self.ire = apache.airavata.api.error.ttypes.InvalidRequestException()
                    self.ire.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 2:
                if ftype == TType.STRUCT:
                    self.ace = apache.airavata.api.error.ttypes.AiravataClientException()
                    self.ace.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 3:
                if ftype == TType.STRUCT:
                    self.ase = apache.airavata.api.error.ttypes.AiravataSystemException()
                    self.ase.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 4:
                if ftype == TType.STRUCT:
                    self.ae = apache.airavata.api.error.ttypes.AuthorizationException()
                    self.ae.read(iprot)
                else:
                    iprot.skip(ftype)
            else:
                iprot.skip(ftype)
            iprot.readFieldEnd()
        iprot.readStructEnd()

    def write(self, oprot):
        if oprot._fast_encode is not None and self.thrift_spec is not None:
            oprot.trans.write(oprot._fast_encode(self, (self.__class__, self.thrift_spec)))
            return
        oprot.writeStructBegin('registerResourceJobManager_result')
        if self.success is not None:
            oprot.writeFieldBegin('success', TType.STRING, 0)
            oprot.writeString(self.success.encode('utf-8') if sys.version_info[0] == 2 else self.success)
            oprot.writeFieldEnd()
        if self.ire is not None:
            oprot.writeFieldBegin('ire', TType.STRUCT, 1)
            self.ire.write(oprot)
            oprot.writeFieldEnd()
        if self.ace is not None:
            oprot.writeFieldBegin('ace', TType.STRUCT, 2)
            self.ace.write(oprot)
            oprot.writeFieldEnd()
        if self.ase is not None:
            oprot.writeFieldBegin('ase', TType.STRUCT, 3)
            self.ase.write(oprot)
            oprot.writeFieldEnd()
        if self.ae is not None:
            oprot.writeFieldBegin('ae', TType.STRUCT, 4)
            self.ae.write(oprot)
            oprot.writeFieldEnd()
        oprot.writeFieldStop()
        oprot.writeStructEnd()

    def validate(self):
        return

    def __repr__(self):
        L = ['%s=%r' % (key, value)
             for key, value in self.__dict__.items()]
        return '%s(%s)' % (self.__class__.__name__, ', '.join(L))

    def __eq__(self, other):
        return isinstance(other, self.__class__) and self.__dict__ == other.__dict__

    def __ne__(self, other):
        return not (self == other)


class updateResourceJobManager_args(object):
    """
    Attributes:
     - authzToken
     - resourceJobManagerId
     - updatedResourceJobManager
    """

    thrift_spec = (
        None,  # 0
        (1, TType.STRUCT, 'authzToken', (apache.airavata.model.security.ttypes.AuthzToken, apache.airavata.model.security.ttypes.AuthzToken.thrift_spec), None, ),  # 1
        (2, TType.STRING, 'resourceJobManagerId', 'UTF8', None, ),  # 2
        (3, TType.STRUCT, 'updatedResourceJobManager', (apache.airavata.model.appcatalog.computeresource.ttypes.ResourceJobManager, apache.airavata.model.appcatalog.computeresource.ttypes.ResourceJobManager.thrift_spec), None, ),  # 3
    )

    def __init__(self, authzToken=None, resourceJobManagerId=None, updatedResourceJobManager=None,):
        self.authzToken = authzToken
        self.resourceJobManagerId = resourceJobManagerId
        self.updatedResourceJobManager = updatedResourceJobManager

    def read(self, iprot):
        if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None:
            iprot._fast_decode(self, iprot, (self.__class__, self.thrift_spec))
            return
        iprot.readStructBegin()
        while True:
            (fname, ftype, fid) = iprot.readFieldBegin()
            if ftype == TType.STOP:
                break
            if fid == 1:
                if ftype == TType.STRUCT:
                    self.authzToken = apache.airavata.model.security.ttypes.AuthzToken()
                    self.authzToken.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 2:
                if ftype == TType.STRING:
                    self.resourceJobManagerId = iprot.readString().decode('utf-8') if sys.version_info[0] == 2 else iprot.readString()
                else:
                    iprot.skip(ftype)
            elif fid == 3:
                if ftype == TType.STRUCT:
                    self.updatedResourceJobManager = apache.airavata.model.appcatalog.computeresource.ttypes.ResourceJobManager()
                    self.updatedResourceJobManager.read(iprot)
                else:
                    iprot.skip(ftype)
            else:
                iprot.skip(ftype)
            iprot.readFieldEnd()
        iprot.readStructEnd()

    def write(self, oprot):
        if oprot._fast_encode is not None and self.thrift_spec is not None:
            oprot.trans.write(oprot._fast_encode(self, (self.__class__, self.thrift_spec)))
            return
        oprot.writeStructBegin('updateResourceJobManager_args')
        if self.authzToken is not None:
            oprot.writeFieldBegin('authzToken', TType.STRUCT, 1)
            self.authzToken.write(oprot)
            oprot.writeFieldEnd()
        if self.resourceJobManagerId is not None:
            oprot.writeFieldBegin('resourceJobManagerId', TType.STRING, 2)
            oprot.writeString(self.resourceJobManagerId.encode('utf-8') if sys.version_info[0] == 2 else self.resourceJobManagerId)
            oprot.writeFieldEnd()
        if self.updatedResourceJobManager is not None:
            oprot.writeFieldBegin('updatedResourceJobManager', TType.STRUCT, 3)
            self.updatedResourceJobManager.write(oprot)
            oprot.writeFieldEnd()
        oprot.writeFieldStop()
        oprot.writeStructEnd()

    def validate(self):
        if self.authzToken is None:
            raise TProtocolException(message='Required field authzToken is unset!')
        if self.resourceJobManagerId is None:
            raise TProtocolException(message='Required field resourceJobManagerId is unset!')
        if self.updatedResourceJobManager is None:
            raise TProtocolException(message='Required field updatedResourceJobManager is unset!')
        return

    def __repr__(self):
        L = ['%s=%r' % (key, value)
             for key, value in self.__dict__.items()]
        return '%s(%s)' % (self.__class__.__name__, ', '.join(L))

    def __eq__(self, other):
        return isinstance(other, self.__class__) and self.__dict__ == other.__dict__

    def __ne__(self, other):
        return not (self == other)


class updateResourceJobManager_result(object):
    """
    Attributes:
     - success
     - ire
     - ace
     - ase
     - ae
    """

    thrift_spec = (
        (0, TType.BOOL, 'success', None, None, ),  # 0
        (1, TType.STRUCT, 'ire', (apache.airavata.api.error.ttypes.InvalidRequestException, apache.airavata.api.error.ttypes.InvalidRequestException.thrift_spec), None, ),  # 1
        (2, TType.STRUCT, 'ace', (apache.airavata.api.error.ttypes.AiravataClientException, apache.airavata.api.error.ttypes.AiravataClientException.thrift_spec), None, ),  # 2
        (3, TType.STRUCT, 'ase', (apache.airavata.api.error.ttypes.AiravataSystemException, apache.airavata.api.error.ttypes.AiravataSystemException.thrift_spec), None, ),  # 3
        (4, TType.STRUCT, 'ae', (apache.airavata.api.error.ttypes.AuthorizationException, apache.airavata.api.error.ttypes.AuthorizationException.thrift_spec), None, ),  # 4
    )

    def __init__(self, success=None, ire=None, ace=None, ase=None, ae=None,):
        self.success = success
        self.ire = ire
        self.ace = ace
        self.ase = ase
        self.ae = ae

    def read(self, iprot):
        if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None:
            iprot._fast_decode(self, iprot, (self.__class__, self.thrift_spec))
            return
        iprot.readStructBegin()
        while True:
            (fname, ftype, fid) = iprot.readFieldBegin()
            if ftype == TType.STOP:
                break
            if fid == 0:
                if ftype == TType.BOOL:
                    self.success = iprot.readBool()
                else:
                    iprot.skip(ftype)
            elif fid == 1:
                if ftype == TType.STRUCT:
                    self.ire = apache.airavata.api.error.ttypes.InvalidRequestException()
                    self.ire.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 2:
                if ftype == TType.STRUCT:
                    self.ace = apache.airavata.api.error.ttypes.AiravataClientException()
                    self.ace.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 3:
                if ftype == TType.STRUCT:
                    self.ase = apache.airavata.api.error.ttypes.AiravataSystemException()
                    self.ase.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 4:
                if ftype == TType.STRUCT:
                    self.ae = apache.airavata.api.error.ttypes.AuthorizationException()
                    self.ae.read(iprot)
                else:
                    iprot.skip(ftype)
            else:
                iprot.skip(ftype)
            iprot.readFieldEnd()
        iprot.readStructEnd()

    def write(self, oprot):
        if oprot._fast_encode is not None and self.thrift_spec is not None:
            oprot.trans.write(oprot._fast_encode(self, (self.__class__, self.thrift_spec)))
            return
        oprot.writeStructBegin('updateResourceJobManager_result')
        if self.success is not None:
            oprot.writeFieldBegin('success', TType.BOOL, 0)
            oprot.writeBool(self.success)
            oprot.writeFieldEnd()
        if self.ire is not None:
            oprot.writeFieldBegin('ire', TType.STRUCT, 1)
            self.ire.write(oprot)
            oprot.writeFieldEnd()
        if self.ace is not None:
            oprot.writeFieldBegin('ace', TType.STRUCT, 2)
            self.ace.write(oprot)
            oprot.writeFieldEnd()
        if self.ase is not None:
            oprot.writeFieldBegin('ase', TType.STRUCT, 3)
            self.ase.write(oprot)
            oprot.writeFieldEnd()
        if self.ae is not None:
            oprot.writeFieldBegin('ae', TType.STRUCT, 4)
            self.ae.write(oprot)
            oprot.writeFieldEnd()
        oprot.writeFieldStop()
        oprot.writeStructEnd()

    def validate(self):
        return

    def __repr__(self):
        L = ['%s=%r' % (key, value)
             for key, value in self.__dict__.items()]
        return '%s(%s)' % (self.__class__.__name__, ', '.join(L))

    def __eq__(self, other):
        return isinstance(other, self.__class__) and self.__dict__ == other.__dict__

    def __ne__(self, other):
        return not (self == other)


class getResourceJobManager_args(object):
    """
    Attributes:
     - authzToken
     - resourceJobManagerId
    """

    thrift_spec = (
        None,  # 0
        (1, TType.STRUCT, 'authzToken', (apache.airavata.model.security.ttypes.AuthzToken, apache.airavata.model.security.ttypes.AuthzToken.thrift_spec), None, ),  # 1
        (2, TType.STRING, 'resourceJobManagerId', 'UTF8', None, ),  # 2
    )

    def __init__(self, authzToken=None, resourceJobManagerId=None,):
        self.authzToken = authzToken
        self.resourceJobManagerId = resourceJobManagerId

    def read(self, iprot):
        if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None:
            iprot._fast_decode(self, iprot, (self.__class__, self.thrift_spec))
            return
        iprot.readStructBegin()
        while True:
            (fname, ftype, fid) = iprot.readFieldBegin()
            if ftype == TType.STOP:
                break
            if fid == 1:
                if ftype == TType.STRUCT:
                    self.authzToken = apache.airavata.model.security.ttypes.AuthzToken()
                    self.authzToken.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 2:
                if ftype == TType.STRING:
                    self.resourceJobManagerId = iprot.readString().decode('utf-8') if sys.version_info[0] == 2 else iprot.readString()
                else:
                    iprot.skip(ftype)
            else:
                iprot.skip(ftype)
            iprot.readFieldEnd()
        iprot.readStructEnd()

    def write(self, oprot):
        if oprot._fast_encode is not None and self.thrift_spec is not None:
            oprot.trans.write(oprot._fast_encode(self, (self.__class__, self.thrift_spec)))
            return
        oprot.writeStructBegin('getResourceJobManager_args')
        if self.authzToken is not None:
            oprot.writeFieldBegin('authzToken', TType.STRUCT, 1)
            self.authzToken.write(oprot)
            oprot.writeFieldEnd()
        if self.resourceJobManagerId is not None:
            oprot.writeFieldBegin('resourceJobManagerId', TType.STRING, 2)
            oprot.writeString(self.resourceJobManagerId.encode('utf-8') if sys.version_info[0] == 2 else self.resourceJobManagerId)
            oprot.writeFieldEnd()
        oprot.writeFieldStop()
        oprot.writeStructEnd()

    def validate(self):
        if self.authzToken is None:
            raise TProtocolException(message='Required field authzToken is unset!')
        if self.resourceJobManagerId is None:
            raise TProtocolException(message='Required field resourceJobManagerId is unset!')
        return

    def __repr__(self):
        L = ['%s=%r' % (key, value)
             for key, value in self.__dict__.items()]
        return '%s(%s)' % (self.__class__.__name__, ', '.join(L))

    def __eq__(self, other):
        return isinstance(other, self.__class__) and self.__dict__ == other.__dict__

    def __ne__(self, other):
        return not (self == other)


class getResourceJobManager_result(object):
    """
    Attributes:
     - success
     - ire
     - ace
     - ase
     - ae
    """

    thrift_spec = (
        (0, TType.STRUCT, 'success', (apache.airavata.model.appcatalog.computeresource.ttypes.ResourceJobManager, apache.airavata.model.appcatalog.computeresource.ttypes.ResourceJobManager.thrift_spec), None, ),  # 0
        (1, TType.STRUCT, 'ire', (apache.airavata.api.error.ttypes.InvalidRequestException, apache.airavata.api.error.ttypes.InvalidRequestException.thrift_spec), None, ),  # 1
        (2, TType.STRUCT, 'ace', (apache.airavata.api.error.ttypes.AiravataClientException, apache.airavata.api.error.ttypes.AiravataClientException.thrift_spec), None, ),  # 2
        (3, TType.STRUCT, 'ase', (apache.airavata.api.error.ttypes.AiravataSystemException, apache.airavata.api.error.ttypes.AiravataSystemException.thrift_spec), None, ),  # 3
        (4, TType.STRUCT, 'ae', (apache.airavata.api.error.ttypes.AuthorizationException, apache.airavata.api.error.ttypes.AuthorizationException.thrift_spec), None, ),  # 4
    )

    def __init__(self, success=None, ire=None, ace=None, ase=None, ae=None,):
        self.success = success
        self.ire = ire
        self.ace = ace
        self.ase = ase
        self.ae = ae

    def read(self, iprot):
        if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None:
            iprot._fast_decode(self, iprot, (self.__class__, self.thrift_spec))
            return
        iprot.readStructBegin()
        while True:
            (fname, ftype, fid) = iprot.readFieldBegin()
            if ftype == TType.STOP:
                break
            if fid == 0:
                if ftype == TType.STRUCT:
                    self.success = apache.airavata.model.appcatalog.computeresource.ttypes.ResourceJobManager()
                    self.success.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 1:
                if ftype == TType.STRUCT:
                    self.ire = apache.airavata.api.error.ttypes.InvalidRequestException()
                    self.ire.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 2:
                if ftype == TType.STRUCT:
                    self.ace = apache.airavata.api.error.ttypes.AiravataClientException()
                    self.ace.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 3:
                if ftype == TType.STRUCT:
                    self.ase = apache.airavata.api.error.ttypes.AiravataSystemException()
                    self.ase.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 4:
                if ftype == TType.STRUCT:
                    self.ae = apache.airavata.api.error.ttypes.AuthorizationException()
                    self.ae.read(iprot)
                else:
                    iprot.skip(ftype)
            else:
                iprot.skip(ftype)
            iprot.readFieldEnd()
        iprot.readStructEnd()

    def write(self, oprot):
        if oprot._fast_encode is not None and self.thrift_spec is not None:
            oprot.trans.write(oprot._fast_encode(self, (self.__class__, self.thrift_spec)))
            return
        oprot.writeStructBegin('getResourceJobManager_result')
        if self.success is not None:
            oprot.writeFieldBegin('success', TType.STRUCT, 0)
            self.success.write(oprot)
            oprot.writeFieldEnd()
        if self.ire is not None:
            oprot.writeFieldBegin('ire', TType.STRUCT, 1)
            self.ire.write(oprot)
            oprot.writeFieldEnd()
        if self.ace is not None:
            oprot.writeFieldBegin('ace', TType.STRUCT, 2)
            self.ace.write(oprot)
            oprot.writeFieldEnd()
        if self.ase is not None:
            oprot.writeFieldBegin('ase', TType.STRUCT, 3)
            self.ase.write(oprot)
            oprot.writeFieldEnd()
        if self.ae is not None:
            oprot.writeFieldBegin('ae', TType.STRUCT, 4)
            self.ae.write(oprot)
            oprot.writeFieldEnd()
        oprot.writeFieldStop()
        oprot.writeStructEnd()

    def validate(self):
        return

    def __repr__(self):
        L = ['%s=%r' % (key, value)
             for key, value in self.__dict__.items()]
        return '%s(%s)' % (self.__class__.__name__, ', '.join(L))

    def __eq__(self, other):
        return isinstance(other, self.__class__) and self.__dict__ == other.__dict__

    def __ne__(self, other):
        return not (self == other)


class deleteResourceJobManager_args(object):
    """
    Attributes:
     - authzToken
     - resourceJobManagerId
    """

    thrift_spec = (
        None,  # 0
        (1, TType.STRUCT, 'authzToken', (apache.airavata.model.security.ttypes.AuthzToken, apache.airavata.model.security.ttypes.AuthzToken.thrift_spec), None, ),  # 1
        (2, TType.STRING, 'resourceJobManagerId', 'UTF8', None, ),  # 2
    )

    def __init__(self, authzToken=None, resourceJobManagerId=None,):
        self.authzToken = authzToken
        self.resourceJobManagerId = resourceJobManagerId

    def read(self, iprot):
        if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None:
            iprot._fast_decode(self, iprot, (self.__class__, self.thrift_spec))
            return
        iprot.readStructBegin()
        while True:
            (fname, ftype, fid) = iprot.readFieldBegin()
            if ftype == TType.STOP:
                break
            if fid == 1:
                if ftype == TType.STRUCT:
                    self.authzToken = apache.airavata.model.security.ttypes.AuthzToken()
                    self.authzToken.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 2:
                if ftype == TType.STRING:
                    self.resourceJobManagerId = iprot.readString().decode('utf-8') if sys.version_info[0] == 2 else iprot.readString()
                else:
                    iprot.skip(ftype)
            else:
                iprot.skip(ftype)
            iprot.readFieldEnd()
        iprot.readStructEnd()

    def write(self, oprot):
        if oprot._fast_encode is not None and self.thrift_spec is not None:
            oprot.trans.write(oprot._fast_encode(self, (self.__class__, self.thrift_spec)))
            return
        oprot.writeStructBegin('deleteResourceJobManager_args')
        if self.authzToken is not None:
            oprot.writeFieldBegin('authzToken', TType.STRUCT, 1)
            self.authzToken.write(oprot)
            oprot.writeFieldEnd()
        if self.resourceJobManagerId is not None:
            oprot.writeFieldBegin('resourceJobManagerId', TType.STRING, 2)
            oprot.writeString(self.resourceJobManagerId.encode('utf-8') if sys.version_info[0] == 2 else self.resourceJobManagerId)
            oprot.writeFieldEnd()
        oprot.writeFieldStop()
        oprot.writeStructEnd()

    def validate(self):
        if self.authzToken is None:
            raise TProtocolException(message='Required field authzToken is unset!')
        if self.resourceJobManagerId is None:
            raise TProtocolException(message='Required field resourceJobManagerId is unset!')
        return

    def __repr__(self):
        L = ['%s=%r' % (key, value)
             for key, value in self.__dict__.items()]
        return '%s(%s)' % (self.__class__.__name__, ', '.join(L))

    def __eq__(self, other):
        return isinstance(other, self.__class__) and self.__dict__ == other.__dict__

    def __ne__(self, other):
        return not (self == other)


class deleteResourceJobManager_result(object):
    """
    Attributes:
     - success
     - ire
     - ace
     - ase
     - ae
    """

    thrift_spec = (
        (0, TType.BOOL, 'success', None, None, ),  # 0
        (1, TType.STRUCT, 'ire', (apache.airavata.api.error.ttypes.InvalidRequestException, apache.airavata.api.error.ttypes.InvalidRequestException.thrift_spec), None, ),  # 1
        (2, TType.STRUCT, 'ace', (apache.airavata.api.error.ttypes.AiravataClientException, apache.airavata.api.error.ttypes.AiravataClientException.thrift_spec), None, ),  # 2
        (3, TType.STRUCT, 'ase', (apache.airavata.api.error.ttypes.AiravataSystemException, apache.airavata.api.error.ttypes.AiravataSystemException.thrift_spec), None, ),  # 3
        (4, TType.STRUCT, 'ae', (apache.airavata.api.error.ttypes.AuthorizationException, apache.airavata.api.error.ttypes.AuthorizationException.thrift_spec), None, ),  # 4
    )

    def __init__(self, success=None, ire=None, ace=None, ase=None, ae=None,):
        self.success = success
        self.ire = ire
        self.ace = ace
        self.ase = ase
        self.ae = ae

    def read(self, iprot):
        if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None:
            iprot._fast_decode(self, iprot, (self.__class__, self.thrift_spec))
            return
        iprot.readStructBegin()
        while True:
            (fname, ftype, fid) = iprot.readFieldBegin()
            if ftype == TType.STOP:
                break
            if fid == 0:
                if ftype == TType.BOOL:
                    self.success = iprot.readBool()
                else:
                    iprot.skip(ftype)
            elif fid == 1:
                if ftype == TType.STRUCT:
                    self.ire = apache.airavata.api.error.ttypes.InvalidRequestException()
                    self.ire.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 2:
                if ftype == TType.STRUCT:
                    self.ace = apache.airavata.api.error.ttypes.AiravataClientException()
                    self.ace.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 3:
                if ftype == TType.STRUCT:
                    self.ase = apache.airavata.api.error.ttypes.AiravataSystemException()
                    self.ase.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 4:
                if ftype == TType.STRUCT:
                    self.ae = apache.airavata.api.error.ttypes.AuthorizationException()
                    self.ae.read(iprot)
                else:
                    iprot.skip(ftype)
            else:
                iprot.skip(ftype)
            iprot.readFieldEnd()
        iprot.readStructEnd()

    def write(self, oprot):
        if oprot._fast_encode is not None and self.thrift_spec is not None:
            oprot.trans.write(oprot._fast_encode(self, (self.__class__, self.thrift_spec)))
            return
        oprot.writeStructBegin('deleteResourceJobManager_result')
        if self.success is not None:
            oprot.writeFieldBegin('success', TType.BOOL, 0)
            oprot.writeBool(self.success)
            oprot.writeFieldEnd()
        if self.ire is not None:
            oprot.writeFieldBegin('ire', TType.STRUCT, 1)
            self.ire.write(oprot)
            oprot.writeFieldEnd()
        if self.ace is not None:
            oprot.writeFieldBegin('ace', TType.STRUCT, 2)
            self.ace.write(oprot)
            oprot.writeFieldEnd()
        if self.ase is not None:
            oprot.writeFieldBegin('ase', TType.STRUCT, 3)
            self.ase.write(oprot)
            oprot.writeFieldEnd()
        if self.ae is not None:
            oprot.writeFieldBegin('ae', TType.STRUCT, 4)
            self.ae.write(oprot)
            oprot.writeFieldEnd()
        oprot.writeFieldStop()
        oprot.writeStructEnd()

    def validate(self):
        return

    def __repr__(self):
        L = ['%s=%r' % (key, value)
             for key, value in self.__dict__.items()]
        return '%s(%s)' % (self.__class__.__name__, ', '.join(L))

    def __eq__(self, other):
        return isinstance(other, self.__class__) and self.__dict__ == other.__dict__

    def __ne__(self, other):
        return not (self == other)


class deleteBatchQueue_args(object):
    """
    Attributes:
     - authzToken
     - computeResourceId
     - queueName
    """

    thrift_spec = (
        None,  # 0
        (1, TType.STRUCT, 'authzToken', (apache.airavata.model.security.ttypes.AuthzToken, apache.airavata.model.security.ttypes.AuthzToken.thrift_spec), None, ),  # 1
        (2, TType.STRING, 'computeResourceId', 'UTF8', None, ),  # 2
        (3, TType.STRING, 'queueName', 'UTF8', None, ),  # 3
    )

    def __init__(self, authzToken=None, computeResourceId=None, queueName=None,):
        self.authzToken = authzToken
        self.computeResourceId = computeResourceId
        self.queueName = queueName

    def read(self, iprot):
        if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None:
            iprot._fast_decode(self, iprot, (self.__class__, self.thrift_spec))
            return
        iprot.readStructBegin()
        while True:
            (fname, ftype, fid) = iprot.readFieldBegin()
            if ftype == TType.STOP:
                break
            if fid == 1:
                if ftype == TType.STRUCT:
                    self.authzToken = apache.airavata.model.security.ttypes.AuthzToken()
                    self.authzToken.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 2:
                if ftype == TType.STRING:
                    self.computeResourceId = iprot.readString().decode('utf-8') if sys.version_info[0] == 2 else iprot.readString()
                else:
                    iprot.skip(ftype)
            elif fid == 3:
                if ftype == TType.STRING:
                    self.queueName = iprot.readString().decode('utf-8') if sys.version_info[0] == 2 else iprot.readString()
                else:
                    iprot.skip(ftype)
            else:
                iprot.skip(ftype)
            iprot.readFieldEnd()
        iprot.readStructEnd()

    def write(self, oprot):
        if oprot._fast_encode is not None and self.thrift_spec is not None:
            oprot.trans.write(oprot._fast_encode(self, (self.__class__, self.thrift_spec)))
            return
        oprot.writeStructBegin('deleteBatchQueue_args')
        if self.authzToken is not None:
            oprot.writeFieldBegin('authzToken', TType.STRUCT, 1)
            self.authzToken.write(oprot)
            oprot.writeFieldEnd()
        if self.computeResourceId is not None:
            oprot.writeFieldBegin('computeResourceId', TType.STRING, 2)
            oprot.writeString(self.computeResourceId.encode('utf-8') if sys.version_info[0] == 2 else self.computeResourceId)
            oprot.writeFieldEnd()
        if self.queueName is not None:
            oprot.writeFieldBegin('queueName', TType.STRING, 3)
            oprot.writeString(self.queueName.encode('utf-8') if sys.version_info[0] == 2 else self.queueName)
            oprot.writeFieldEnd()
        oprot.writeFieldStop()
        oprot.writeStructEnd()

    def validate(self):
        if self.authzToken is None:
            raise TProtocolException(message='Required field authzToken is unset!')
        if self.computeResourceId is None:
            raise TProtocolException(message='Required field computeResourceId is unset!')
        if self.queueName is None:
            raise TProtocolException(message='Required field queueName is unset!')
        return

    def __repr__(self):
        L = ['%s=%r' % (key, value)
             for key, value in self.__dict__.items()]
        return '%s(%s)' % (self.__class__.__name__, ', '.join(L))

    def __eq__(self, other):
        return isinstance(other, self.__class__) and self.__dict__ == other.__dict__

    def __ne__(self, other):
        return not (self == other)


class deleteBatchQueue_result(object):
    """
    Attributes:
     - success
     - ire
     - ace
     - ase
     - ae
    """

    thrift_spec = (
        (0, TType.BOOL, 'success', None, None, ),  # 0
        (1, TType.STRUCT, 'ire', (apache.airavata.api.error.ttypes.InvalidRequestException, apache.airavata.api.error.ttypes.InvalidRequestException.thrift_spec), None, ),  # 1
        (2, TType.STRUCT, 'ace', (apache.airavata.api.error.ttypes.AiravataClientException, apache.airavata.api.error.ttypes.AiravataClientException.thrift_spec), None, ),  # 2
        (3, TType.STRUCT, 'ase', (apache.airavata.api.error.ttypes.AiravataSystemException, apache.airavata.api.error.ttypes.AiravataSystemException.thrift_spec), None, ),  # 3
        (4, TType.STRUCT, 'ae', (apache.airavata.api.error.ttypes.AuthorizationException, apache.airavata.api.error.ttypes.AuthorizationException.thrift_spec), None, ),  # 4
    )

    def __init__(self, success=None, ire=None, ace=None, ase=None, ae=None,):
        self.success = success
        self.ire = ire
        self.ace = ace
        self.ase = ase
        self.ae = ae

    def read(self, iprot):
        if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None:
            iprot._fast_decode(self, iprot, (self.__class__, self.thrift_spec))
            return
        iprot.readStructBegin()
        while True:
            (fname, ftype, fid) = iprot.readFieldBegin()
            if ftype == TType.STOP:
                break
            if fid == 0:
                if ftype == TType.BOOL:
                    self.success = iprot.readBool()
                else:
                    iprot.skip(ftype)
            elif fid == 1:
                if ftype == TType.STRUCT:
                    self.ire = apache.airavata.api.error.ttypes.InvalidRequestException()
                    self.ire.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 2:
                if ftype == TType.STRUCT:
                    self.ace = apache.airavata.api.error.ttypes.AiravataClientException()
                    self.ace.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 3:
                if ftype == TType.STRUCT:
                    self.ase = apache.airavata.api.error.ttypes.AiravataSystemException()
                    self.ase.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 4:
                if ftype == TType.STRUCT:
                    self.ae = apache.airavata.api.error.ttypes.AuthorizationException()
                    self.ae.read(iprot)
                else:
                    iprot.skip(ftype)
            else:
                iprot.skip(ftype)
            iprot.readFieldEnd()
        iprot.readStructEnd()

    def write(self, oprot):
        if oprot._fast_encode is not None and self.thrift_spec is not None:
            oprot.trans.write(oprot._fast_encode(self, (self.__class__, self.thrift_spec)))
            return
        oprot.writeStructBegin('deleteBatchQueue_result')
        if self.success is not None:
            oprot.writeFieldBegin('success', TType.BOOL, 0)
            oprot.writeBool(self.success)
            oprot.writeFieldEnd()
        if self.ire is not None:
            oprot.writeFieldBegin('ire', TType.STRUCT, 1)
            self.ire.write(oprot)
            oprot.writeFieldEnd()
        if self.ace is not None:
            oprot.writeFieldBegin('ace', TType.STRUCT, 2)
            self.ace.write(oprot)
            oprot.writeFieldEnd()
        if self.ase is not None:
            oprot.writeFieldBegin('ase', TType.STRUCT, 3)
            self.ase.write(oprot)
            oprot.writeFieldEnd()
        if self.ae is not None:
            oprot.writeFieldBegin('ae', TType.STRUCT, 4)
            self.ae.write(oprot)
            oprot.writeFieldEnd()
        oprot.writeFieldStop()
        oprot.writeStructEnd()

    def validate(self):
        return

    def __repr__(self):
        L = ['%s=%r' % (key, value)
             for key, value in self.__dict__.items()]
        return '%s(%s)' % (self.__class__.__name__, ', '.join(L))

    def __eq__(self, other):
        return isinstance(other, self.__class__) and self.__dict__ == other.__dict__

    def __ne__(self, other):
        return not (self == other)


class registerGatewayResourceProfile_args(object):
    """
    Attributes:
     - authzToken
     - gatewayResourceProfile
    """

    thrift_spec = (
        None,  # 0
        (1, TType.STRUCT, 'authzToken', (apache.airavata.model.security.ttypes.AuthzToken, apache.airavata.model.security.ttypes.AuthzToken.thrift_spec), None, ),  # 1
        (2, TType.STRUCT, 'gatewayResourceProfile', (apache.airavata.model.appcatalog.gatewayprofile.ttypes.GatewayResourceProfile, apache.airavata.model.appcatalog.gatewayprofile.ttypes.GatewayResourceProfile.thrift_spec), None, ),  # 2
    )

    def __init__(self, authzToken=None, gatewayResourceProfile=None,):
        self.authzToken = authzToken
        self.gatewayResourceProfile = gatewayResourceProfile

    def read(self, iprot):
        if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None:
            iprot._fast_decode(self, iprot, (self.__class__, self.thrift_spec))
            return
        iprot.readStructBegin()
        while True:
            (fname, ftype, fid) = iprot.readFieldBegin()
            if ftype == TType.STOP:
                break
            if fid == 1:
                if ftype == TType.STRUCT:
                    self.authzToken = apache.airavata.model.security.ttypes.AuthzToken()
                    self.authzToken.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 2:
                if ftype == TType.STRUCT:
                    self.gatewayResourceProfile = apache.airavata.model.appcatalog.gatewayprofile.ttypes.GatewayResourceProfile()
                    self.gatewayResourceProfile.read(iprot)
                else:
                    iprot.skip(ftype)
            else:
                iprot.skip(ftype)
            iprot.readFieldEnd()
        iprot.readStructEnd()

    def write(self, oprot):
        if oprot._fast_encode is not None and self.thrift_spec is not None:
            oprot.trans.write(oprot._fast_encode(self, (self.__class__, self.thrift_spec)))
            return
        oprot.writeStructBegin('registerGatewayResourceProfile_args')
        if self.authzToken is not None:
            oprot.writeFieldBegin('authzToken', TType.STRUCT, 1)
            self.authzToken.write(oprot)
            oprot.writeFieldEnd()
        if self.gatewayResourceProfile is not None:
            oprot.writeFieldBegin('gatewayResourceProfile', TType.STRUCT, 2)
            self.gatewayResourceProfile.write(oprot)
            oprot.writeFieldEnd()
        oprot.writeFieldStop()
        oprot.writeStructEnd()

    def validate(self):
        if self.authzToken is None:
            raise TProtocolException(message='Required field authzToken is unset!')
        if self.gatewayResourceProfile is None:
            raise TProtocolException(message='Required field gatewayResourceProfile is unset!')
        return

    def __repr__(self):
        L = ['%s=%r' % (key, value)
             for key, value in self.__dict__.items()]
        return '%s(%s)' % (self.__class__.__name__, ', '.join(L))

    def __eq__(self, other):
        return isinstance(other, self.__class__) and self.__dict__ == other.__dict__

    def __ne__(self, other):
        return not (self == other)


class registerGatewayResourceProfile_result(object):
    """
    Attributes:
     - success
     - ire
     - ace
     - ase
     - ae
    """

    thrift_spec = (
        (0, TType.STRING, 'success', 'UTF8', None, ),  # 0
        (1, TType.STRUCT, 'ire', (apache.airavata.api.error.ttypes.InvalidRequestException, apache.airavata.api.error.ttypes.InvalidRequestException.thrift_spec), None, ),  # 1
        (2, TType.STRUCT, 'ace', (apache.airavata.api.error.ttypes.AiravataClientException, apache.airavata.api.error.ttypes.AiravataClientException.thrift_spec), None, ),  # 2
        (3, TType.STRUCT, 'ase', (apache.airavata.api.error.ttypes.AiravataSystemException, apache.airavata.api.error.ttypes.AiravataSystemException.thrift_spec), None, ),  # 3
        (4, TType.STRUCT, 'ae', (apache.airavata.api.error.ttypes.AuthorizationException, apache.airavata.api.error.ttypes.AuthorizationException.thrift_spec), None, ),  # 4
    )

    def __init__(self, success=None, ire=None, ace=None, ase=None, ae=None,):
        self.success = success
        self.ire = ire
        self.ace = ace
        self.ase = ase
        self.ae = ae

    def read(self, iprot):
        if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None:
            iprot._fast_decode(self, iprot, (self.__class__, self.thrift_spec))
            return
        iprot.readStructBegin()
        while True:
            (fname, ftype, fid) = iprot.readFieldBegin()
            if ftype == TType.STOP:
                break
            if fid == 0:
                if ftype == TType.STRING:
                    self.success = iprot.readString().decode('utf-8') if sys.version_info[0] == 2 else iprot.readString()
                else:
                    iprot.skip(ftype)
            elif fid == 1:
                if ftype == TType.STRUCT:
                    self.ire = apache.airavata.api.error.ttypes.InvalidRequestException()
                    self.ire.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 2:
                if ftype == TType.STRUCT:
                    self.ace = apache.airavata.api.error.ttypes.AiravataClientException()
                    self.ace.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 3:
                if ftype == TType.STRUCT:
                    self.ase = apache.airavata.api.error.ttypes.AiravataSystemException()
                    self.ase.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 4:
                if ftype == TType.STRUCT:
                    self.ae = apache.airavata.api.error.ttypes.AuthorizationException()
                    self.ae.read(iprot)
                else:
                    iprot.skip(ftype)
            else:
                iprot.skip(ftype)
            iprot.readFieldEnd()
        iprot.readStructEnd()

    def write(self, oprot):
        if oprot._fast_encode is not None and self.thrift_spec is not None:
            oprot.trans.write(oprot._fast_encode(self, (self.__class__, self.thrift_spec)))
            return
        oprot.writeStructBegin('registerGatewayResourceProfile_result')
        if self.success is not None:
            oprot.writeFieldBegin('success', TType.STRING, 0)
            oprot.writeString(self.success.encode('utf-8') if sys.version_info[0] == 2 else self.success)
            oprot.writeFieldEnd()
        if self.ire is not None:
            oprot.writeFieldBegin('ire', TType.STRUCT, 1)
            self.ire.write(oprot)
            oprot.writeFieldEnd()
        if self.ace is not None:
            oprot.writeFieldBegin('ace', TType.STRUCT, 2)
            self.ace.write(oprot)
            oprot.writeFieldEnd()
        if self.ase is not None:
            oprot.writeFieldBegin('ase', TType.STRUCT, 3)
            self.ase.write(oprot)
            oprot.writeFieldEnd()
        if self.ae is not None:
            oprot.writeFieldBegin('ae', TType.STRUCT, 4)
            self.ae.write(oprot)
            oprot.writeFieldEnd()
        oprot.writeFieldStop()
        oprot.writeStructEnd()

    def validate(self):
        return

    def __repr__(self):
        L = ['%s=%r' % (key, value)
             for key, value in self.__dict__.items()]
        return '%s(%s)' % (self.__class__.__name__, ', '.join(L))

    def __eq__(self, other):
        return isinstance(other, self.__class__) and self.__dict__ == other.__dict__

    def __ne__(self, other):
        return not (self == other)


class getGatewayResourceProfile_args(object):
    """
    Attributes:
     - authzToken
     - gatewayID
    """

    thrift_spec = (
        None,  # 0
        (1, TType.STRUCT, 'authzToken', (apache.airavata.model.security.ttypes.AuthzToken, apache.airavata.model.security.ttypes.AuthzToken.thrift_spec), None, ),  # 1
        (2, TType.STRING, 'gatewayID', 'UTF8', None, ),  # 2
    )

    def __init__(self, authzToken=None, gatewayID=None,):
        self.authzToken = authzToken
        self.gatewayID = gatewayID

    def read(self, iprot):
        if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None:
            iprot._fast_decode(self, iprot, (self.__class__, self.thrift_spec))
            return
        iprot.readStructBegin()
        while True:
            (fname, ftype, fid) = iprot.readFieldBegin()
            if ftype == TType.STOP:
                break
            if fid == 1:
                if ftype == TType.STRUCT:
                    self.authzToken = apache.airavata.model.security.ttypes.AuthzToken()
                    self.authzToken.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 2:
                if ftype == TType.STRING:
                    self.gatewayID = iprot.readString().decode('utf-8') if sys.version_info[0] == 2 else iprot.readString()
                else:
                    iprot.skip(ftype)
            else:
                iprot.skip(ftype)
            iprot.readFieldEnd()
        iprot.readStructEnd()

    def write(self, oprot):
        if oprot._fast_encode is not None and self.thrift_spec is not None:
            oprot.trans.write(oprot._fast_encode(self, (self.__class__, self.thrift_spec)))
            return
        oprot.writeStructBegin('getGatewayResourceProfile_args')
        if self.authzToken is not None:
            oprot.writeFieldBegin('authzToken', TType.STRUCT, 1)
            self.authzToken.write(oprot)
            oprot.writeFieldEnd()
        if self.gatewayID is not None:
            oprot.writeFieldBegin('gatewayID', TType.STRING, 2)
            oprot.writeString(self.gatewayID.encode('utf-8') if sys.version_info[0] == 2 else self.gatewayID)
            oprot.writeFieldEnd()
        oprot.writeFieldStop()
        oprot.writeStructEnd()

    def validate(self):
        if self.authzToken is None:
            raise TProtocolException(message='Required field authzToken is unset!')
        if self.gatewayID is None:
            raise TProtocolException(message='Required field gatewayID is unset!')
        return

    def __repr__(self):
        L = ['%s=%r' % (key, value)
             for key, value in self.__dict__.items()]
        return '%s(%s)' % (self.__class__.__name__, ', '.join(L))

    def __eq__(self, other):
        return isinstance(other, self.__class__) and self.__dict__ == other.__dict__

    def __ne__(self, other):
        return not (self == other)


class getGatewayResourceProfile_result(object):
    """
    Attributes:
     - success
     - ire
     - ace
     - ase
     - ae
    """

    thrift_spec = (
        (0, TType.STRUCT, 'success', (apache.airavata.model.appcatalog.gatewayprofile.ttypes.GatewayResourceProfile, apache.airavata.model.appcatalog.gatewayprofile.ttypes.GatewayResourceProfile.thrift_spec), None, ),  # 0
        (1, TType.STRUCT, 'ire', (apache.airavata.api.error.ttypes.InvalidRequestException, apache.airavata.api.error.ttypes.InvalidRequestException.thrift_spec), None, ),  # 1
        (2, TType.STRUCT, 'ace', (apache.airavata.api.error.ttypes.AiravataClientException, apache.airavata.api.error.ttypes.AiravataClientException.thrift_spec), None, ),  # 2
        (3, TType.STRUCT, 'ase', (apache.airavata.api.error.ttypes.AiravataSystemException, apache.airavata.api.error.ttypes.AiravataSystemException.thrift_spec), None, ),  # 3
        (4, TType.STRUCT, 'ae', (apache.airavata.api.error.ttypes.AuthorizationException, apache.airavata.api.error.ttypes.AuthorizationException.thrift_spec), None, ),  # 4
    )

    def __init__(self, success=None, ire=None, ace=None, ase=None, ae=None,):
        self.success = success
        self.ire = ire
        self.ace = ace
        self.ase = ase
        self.ae = ae

    def read(self, iprot):
        if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None:
            iprot._fast_decode(self, iprot, (self.__class__, self.thrift_spec))
            return
        iprot.readStructBegin()
        while True:
            (fname, ftype, fid) = iprot.readFieldBegin()
            if ftype == TType.STOP:
                break
            if fid == 0:
                if ftype == TType.STRUCT:
                    self.success = apache.airavata.model.appcatalog.gatewayprofile.ttypes.GatewayResourceProfile()
                    self.success.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 1:
                if ftype == TType.STRUCT:
                    self.ire = apache.airavata.api.error.ttypes.InvalidRequestException()
                    self.ire.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 2:
                if ftype == TType.STRUCT:
                    self.ace = apache.airavata.api.error.ttypes.AiravataClientException()
                    self.ace.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 3:
                if ftype == TType.STRUCT:
                    self.ase = apache.airavata.api.error.ttypes.AiravataSystemException()
                    self.ase.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 4:
                if ftype == TType.STRUCT:
                    self.ae = apache.airavata.api.error.ttypes.AuthorizationException()
                    self.ae.read(iprot)
                else:
                    iprot.skip(ftype)
            else:
                iprot.skip(ftype)
            iprot.readFieldEnd()
        iprot.readStructEnd()

    def write(self, oprot):
        if oprot._fast_encode is not None and self.thrift_spec is not None:
            oprot.trans.write(oprot._fast_encode(self, (self.__class__, self.thrift_spec)))
            return
        oprot.writeStructBegin('getGatewayResourceProfile_result')
        if self.success is not None:
            oprot.writeFieldBegin('success', TType.STRUCT, 0)
            self.success.write(oprot)
            oprot.writeFieldEnd()
        if self.ire is not None:
            oprot.writeFieldBegin('ire', TType.STRUCT, 1)
            self.ire.write(oprot)
            oprot.writeFieldEnd()
        if self.ace is not None:
            oprot.writeFieldBegin('ace', TType.STRUCT, 2)
            self.ace.write(oprot)
            oprot.writeFieldEnd()
        if self.ase is not None:
            oprot.writeFieldBegin('ase', TType.STRUCT, 3)
            self.ase.write(oprot)
            oprot.writeFieldEnd()
        if self.ae is not None:
            oprot.writeFieldBegin('ae', TType.STRUCT, 4)
            self.ae.write(oprot)
            oprot.writeFieldEnd()
        oprot.writeFieldStop()
        oprot.writeStructEnd()

    def validate(self):
        return

    def __repr__(self):
        L = ['%s=%r' % (key, value)
             for key, value in self.__dict__.items()]
        return '%s(%s)' % (self.__class__.__name__, ', '.join(L))

    def __eq__(self, other):
        return isinstance(other, self.__class__) and self.__dict__ == other.__dict__

    def __ne__(self, other):
        return not (self == other)


class updateGatewayResourceProfile_args(object):
    """
    Attributes:
     - authzToken
     - gatewayID
     - gatewayResourceProfile
    """

    thrift_spec = (
        None,  # 0
        (1, TType.STRUCT, 'authzToken', (apache.airavata.model.security.ttypes.AuthzToken, apache.airavata.model.security.ttypes.AuthzToken.thrift_spec), None, ),  # 1
        (2, TType.STRING, 'gatewayID', 'UTF8', None, ),  # 2
        (3, TType.STRUCT, 'gatewayResourceProfile', (apache.airavata.model.appcatalog.gatewayprofile.ttypes.GatewayResourceProfile, apache.airavata.model.appcatalog.gatewayprofile.ttypes.GatewayResourceProfile.thrift_spec), None, ),  # 3
    )

    def __init__(self, authzToken=None, gatewayID=None, gatewayResourceProfile=None,):
        self.authzToken = authzToken
        self.gatewayID = gatewayID
        self.gatewayResourceProfile = gatewayResourceProfile

    def read(self, iprot):
        if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None:
            iprot._fast_decode(self, iprot, (self.__class__, self.thrift_spec))
            return
        iprot.readStructBegin()
        while True:
            (fname, ftype, fid) = iprot.readFieldBegin()
            if ftype == TType.STOP:
                break
            if fid == 1:
                if ftype == TType.STRUCT:
                    self.authzToken = apache.airavata.model.security.ttypes.AuthzToken()
                    self.authzToken.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 2:
                if ftype == TType.STRING:
                    self.gatewayID = iprot.readString().decode('utf-8') if sys.version_info[0] == 2 else iprot.readString()
                else:
                    iprot.skip(ftype)
            elif fid == 3:
                if ftype == TType.STRUCT:
                    self.gatewayResourceProfile = apache.airavata.model.appcatalog.gatewayprofile.ttypes.GatewayResourceProfile()
                    self.gatewayResourceProfile.read(iprot)
                else:
                    iprot.skip(ftype)
            else:
                iprot.skip(ftype)
            iprot.readFieldEnd()
        iprot.readStructEnd()

    def write(self, oprot):
        if oprot._fast_encode is not None and self.thrift_spec is not None:
            oprot.trans.write(oprot._fast_encode(self, (self.__class__, self.thrift_spec)))
            return
        oprot.writeStructBegin('updateGatewayResourceProfile_args')
        if self.authzToken is not None:
            oprot.writeFieldBegin('authzToken', TType.STRUCT, 1)
            self.authzToken.write(oprot)
            oprot.writeFieldEnd()
        if self.gatewayID is not None:
            oprot.writeFieldBegin('gatewayID', TType.STRING, 2)
            oprot.writeString(self.gatewayID.encode('utf-8') if sys.version_info[0] == 2 else self.gatewayID)
            oprot.writeFieldEnd()
        if self.gatewayResourceProfile is not None:
            oprot.writeFieldBegin('gatewayResourceProfile', TType.STRUCT, 3)
            self.gatewayResourceProfile.write(oprot)
            oprot.writeFieldEnd()
        oprot.writeFieldStop()
        oprot.writeStructEnd()

    def validate(self):
        if self.authzToken is None:
            raise TProtocolException(message='Required field authzToken is unset!')
        if self.gatewayID is None:
            raise TProtocolException(message='Required field gatewayID is unset!')
        if self.gatewayResourceProfile is None:
            raise TProtocolException(message='Required field gatewayResourceProfile is unset!')
        return

    def __repr__(self):
        L = ['%s=%r' % (key, value)
             for key, value in self.__dict__.items()]
        return '%s(%s)' % (self.__class__.__name__, ', '.join(L))

    def __eq__(self, other):
        return isinstance(other, self.__class__) and self.__dict__ == other.__dict__

    def __ne__(self, other):
        return not (self == other)


class updateGatewayResourceProfile_result(object):
    """
    Attributes:
     - success
     - ire
     - ace
     - ase
     - ae
    """

    thrift_spec = (
        (0, TType.BOOL, 'success', None, None, ),  # 0
        (1, TType.STRUCT, 'ire', (apache.airavata.api.error.ttypes.InvalidRequestException, apache.airavata.api.error.ttypes.InvalidRequestException.thrift_spec), None, ),  # 1
        (2, TType.STRUCT, 'ace', (apache.airavata.api.error.ttypes.AiravataClientException, apache.airavata.api.error.ttypes.AiravataClientException.thrift_spec), None, ),  # 2
        (3, TType.STRUCT, 'ase', (apache.airavata.api.error.ttypes.AiravataSystemException, apache.airavata.api.error.ttypes.AiravataSystemException.thrift_spec), None, ),  # 3
        (4, TType.STRUCT, 'ae', (apache.airavata.api.error.ttypes.AuthorizationException, apache.airavata.api.error.ttypes.AuthorizationException.thrift_spec), None, ),  # 4
    )

    def __init__(self, success=None, ire=None, ace=None, ase=None, ae=None,):
        self.success = success
        self.ire = ire
        self.ace = ace
        self.ase = ase
        self.ae = ae

    def read(self, iprot):
        if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None:
            iprot._fast_decode(self, iprot, (self.__class__, self.thrift_spec))
            return
        iprot.readStructBegin()
        while True:
            (fname, ftype, fid) = iprot.readFieldBegin()
            if ftype == TType.STOP:
                break
            if fid == 0:
                if ftype == TType.BOOL:
                    self.success = iprot.readBool()
                else:
                    iprot.skip(ftype)
            elif fid == 1:
                if ftype == TType.STRUCT:
                    self.ire = apache.airavata.api.error.ttypes.InvalidRequestException()
                    self.ire.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 2:
                if ftype == TType.STRUCT:
                    self.ace = apache.airavata.api.error.ttypes.AiravataClientException()
                    self.ace.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 3:
                if ftype == TType.STRUCT:
                    self.ase = apache.airavata.api.error.ttypes.AiravataSystemException()
                    self.ase.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 4:
                if ftype == TType.STRUCT:
                    self.ae = apache.airavata.api.error.ttypes.AuthorizationException()
                    self.ae.read(iprot)
                else:
                    iprot.skip(ftype)
            else:
                iprot.skip(ftype)
            iprot.readFieldEnd()
        iprot.readStructEnd()

    def write(self, oprot):
        if oprot._fast_encode is not None and self.thrift_spec is not None:
            oprot.trans.write(oprot._fast_encode(self, (self.__class__, self.thrift_spec)))
            return
        oprot.writeStructBegin('updateGatewayResourceProfile_result')
        if self.success is not None:
            oprot.writeFieldBegin('success', TType.BOOL, 0)
            oprot.writeBool(self.success)
            oprot.writeFieldEnd()
        if self.ire is not None:
            oprot.writeFieldBegin('ire', TType.STRUCT, 1)
            self.ire.write(oprot)
            oprot.writeFieldEnd()
        if self.ace is not None:
            oprot.writeFieldBegin('ace', TType.STRUCT, 2)
            self.ace.write(oprot)
            oprot.writeFieldEnd()
        if self.ase is not None:
            oprot.writeFieldBegin('ase', TType.STRUCT, 3)
            self.ase.write(oprot)
            oprot.writeFieldEnd()
        if self.ae is not None:
            oprot.writeFieldBegin('ae', TType.STRUCT, 4)
            self.ae.write(oprot)
            oprot.writeFieldEnd()
        oprot.writeFieldStop()
        oprot.writeStructEnd()

    def validate(self):
        return

    def __repr__(self):
        L = ['%s=%r' % (key, value)
             for key, value in self.__dict__.items()]
        return '%s(%s)' % (self.__class__.__name__, ', '.join(L))

    def __eq__(self, other):
        return isinstance(other, self.__class__) and self.__dict__ == other.__dict__

    def __ne__(self, other):
        return not (self == other)


class deleteGatewayResourceProfile_args(object):
    """
    Attributes:
     - authzToken
     - gatewayID
    """

    thrift_spec = (
        None,  # 0
        (1, TType.STRUCT, 'authzToken', (apache.airavata.model.security.ttypes.AuthzToken, apache.airavata.model.security.ttypes.AuthzToken.thrift_spec), None, ),  # 1
        (2, TType.STRING, 'gatewayID', 'UTF8', None, ),  # 2
    )

    def __init__(self, authzToken=None, gatewayID=None,):
        self.authzToken = authzToken
        self.gatewayID = gatewayID

    def read(self, iprot):
        if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None:
            iprot._fast_decode(self, iprot, (self.__class__, self.thrift_spec))
            return
        iprot.readStructBegin()
        while True:
            (fname, ftype, fid) = iprot.readFieldBegin()
            if ftype == TType.STOP:
                break
            if fid == 1:
                if ftype == TType.STRUCT:
                    self.authzToken = apache.airavata.model.security.ttypes.AuthzToken()
                    self.authzToken.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 2:
                if ftype == TType.STRING:
                    self.gatewayID = iprot.readString().decode('utf-8') if sys.version_info[0] == 2 else iprot.readString()
                else:
                    iprot.skip(ftype)
            else:
                iprot.skip(ftype)
            iprot.readFieldEnd()
        iprot.readStructEnd()

    def write(self, oprot):
        if oprot._fast_encode is not None and self.thrift_spec is not None:
            oprot.trans.write(oprot._fast_encode(self, (self.__class__, self.thrift_spec)))
            return
        oprot.writeStructBegin('deleteGatewayResourceProfile_args')
        if self.authzToken is not None:
            oprot.writeFieldBegin('authzToken', TType.STRUCT, 1)
            self.authzToken.write(oprot)
            oprot.writeFieldEnd()
        if self.gatewayID is not None:
            oprot.writeFieldBegin('gatewayID', TType.STRING, 2)
            oprot.writeString(self.gatewayID.encode('utf-8') if sys.version_info[0] == 2 else self.gatewayID)
            oprot.writeFieldEnd()
        oprot.writeFieldStop()
        oprot.writeStructEnd()

    def validate(self):
        if self.authzToken is None:
            raise TProtocolException(message='Required field authzToken is unset!')
        if self.gatewayID is None:
            raise TProtocolException(message='Required field gatewayID is unset!')
        return

    def __repr__(self):
        L = ['%s=%r' % (key, value)
             for key, value in self.__dict__.items()]
        return '%s(%s)' % (self.__class__.__name__, ', '.join(L))

    def __eq__(self, other):
        return isinstance(other, self.__class__) and self.__dict__ == other.__dict__

    def __ne__(self, other):
        return not (self == other)


class deleteGatewayResourceProfile_result(object):
    """
    Attributes:
     - success
     - ire
     - ace
     - ase
     - ae
    """

    thrift_spec = (
        (0, TType.BOOL, 'success', None, None, ),  # 0
        (1, TType.STRUCT, 'ire', (apache.airavata.api.error.ttypes.InvalidRequestException, apache.airavata.api.error.ttypes.InvalidRequestException.thrift_spec), None, ),  # 1
        (2, TType.STRUCT, 'ace', (apache.airavata.api.error.ttypes.AiravataClientException, apache.airavata.api.error.ttypes.AiravataClientException.thrift_spec), None, ),  # 2
        (3, TType.STRUCT, 'ase', (apache.airavata.api.error.ttypes.AiravataSystemException, apache.airavata.api.error.ttypes.AiravataSystemException.thrift_spec), None, ),  # 3
        (4, TType.STRUCT, 'ae', (apache.airavata.api.error.ttypes.AuthorizationException, apache.airavata.api.error.ttypes.AuthorizationException.thrift_spec), None, ),  # 4
    )

    def __init__(self, success=None, ire=None, ace=None, ase=None, ae=None,):
        self.success = success
        self.ire = ire
        self.ace = ace
        self.ase = ase
        self.ae = ae

    def read(self, iprot):
        if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None:
            iprot._fast_decode(self, iprot, (self.__class__, self.thrift_spec))
            return
        iprot.readStructBegin()
        while True:
            (fname, ftype, fid) = iprot.readFieldBegin()
            if ftype == TType.STOP:
                break
            if fid == 0:
                if ftype == TType.BOOL:
                    self.success = iprot.readBool()
                else:
                    iprot.skip(ftype)
            elif fid == 1:
                if ftype == TType.STRUCT:
                    self.ire = apache.airavata.api.error.ttypes.InvalidRequestException()
                    self.ire.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 2:
                if ftype == TType.STRUCT:
                    self.ace = apache.airavata.api.error.ttypes.AiravataClientException()
                    self.ace.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 3:
                if ftype == TType.STRUCT:
                    self.ase = apache.airavata.api.error.ttypes.AiravataSystemException()
                    self.ase.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 4:
                if ftype == TType.STRUCT:
                    self.ae = apache.airavata.api.error.ttypes.AuthorizationException()
                    self.ae.read(iprot)
                else:
                    iprot.skip(ftype)
            else:
                iprot.skip(ftype)
            iprot.readFieldEnd()
        iprot.readStructEnd()

    def write(self, oprot):
        if oprot._fast_encode is not None and self.thrift_spec is not None:
            oprot.trans.write(oprot._fast_encode(self, (self.__class__, self.thrift_spec)))
            return
        oprot.writeStructBegin('deleteGatewayResourceProfile_result')
        if self.success is not None:
            oprot.writeFieldBegin('success', TType.BOOL, 0)
            oprot.writeBool(self.success)
            oprot.writeFieldEnd()
        if self.ire is not None:
            oprot.writeFieldBegin('ire', TType.STRUCT, 1)
            self.ire.write(oprot)
            oprot.writeFieldEnd()
        if self.ace is not None:
            oprot.writeFieldBegin('ace', TType.STRUCT, 2)
            self.ace.write(oprot)
            oprot.writeFieldEnd()
        if self.ase is not None:
            oprot.writeFieldBegin('ase', TType.STRUCT, 3)
            self.ase.write(oprot)
            oprot.writeFieldEnd()
        if self.ae is not None:
            oprot.writeFieldBegin('ae', TType.STRUCT, 4)
            self.ae.write(oprot)
            oprot.writeFieldEnd()
        oprot.writeFieldStop()
        oprot.writeStructEnd()

    def validate(self):
        return

    def __repr__(self):
        L = ['%s=%r' % (key, value)
             for key, value in self.__dict__.items()]
        return '%s(%s)' % (self.__class__.__name__, ', '.join(L))

    def __eq__(self, other):
        return isinstance(other, self.__class__) and self.__dict__ == other.__dict__

    def __ne__(self, other):
        return not (self == other)


class addGatewayComputeResourcePreference_args(object):
    """
    Attributes:
     - authzToken
     - gatewayID
     - computeResourceId
     - computeResourcePreference
    """

    thrift_spec = (
        None,  # 0
        (1, TType.STRUCT, 'authzToken', (apache.airavata.model.security.ttypes.AuthzToken, apache.airavata.model.security.ttypes.AuthzToken.thrift_spec), None, ),  # 1
        (2, TType.STRING, 'gatewayID', 'UTF8', None, ),  # 2
        (3, TType.STRING, 'computeResourceId', 'UTF8', None, ),  # 3
        (4, TType.STRUCT, 'computeResourcePreference', (apache.airavata.model.appcatalog.gatewayprofile.ttypes.ComputeResourcePreference, apache.airavata.model.appcatalog.gatewayprofile.ttypes.ComputeResourcePreference.thrift_spec), None, ),  # 4
    )

    def __init__(self, authzToken=None, gatewayID=None, computeResourceId=None, computeResourcePreference=None,):
        self.authzToken = authzToken
        self.gatewayID = gatewayID
        self.computeResourceId = computeResourceId
        self.computeResourcePreference = computeResourcePreference

    def read(self, iprot):
        if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None:
            iprot._fast_decode(self, iprot, (self.__class__, self.thrift_spec))
            return
        iprot.readStructBegin()
        while True:
            (fname, ftype, fid) = iprot.readFieldBegin()
            if ftype == TType.STOP:
                break
            if fid == 1:
                if ftype == TType.STRUCT:
                    self.authzToken = apache.airavata.model.security.ttypes.AuthzToken()
                    self.authzToken.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 2:
                if ftype == TType.STRING:
                    self.gatewayID = iprot.readString().decode('utf-8') if sys.version_info[0] == 2 else iprot.readString()
                else:
                    iprot.skip(ftype)
            elif fid == 3:
                if ftype == TType.STRING:
                    self.computeResourceId = iprot.readString().decode('utf-8') if sys.version_info[0] == 2 else iprot.readString()
                else:
                    iprot.skip(ftype)
            elif fid == 4:
                if ftype == TType.STRUCT:
                    self.computeResourcePreference = apache.airavata.model.appcatalog.gatewayprofile.ttypes.ComputeResourcePreference()
                    self.computeResourcePreference.read(iprot)
                else:
                    iprot.skip(ftype)
            else:
                iprot.skip(ftype)
            iprot.readFieldEnd()
        iprot.readStructEnd()

    def write(self, oprot):
        if oprot._fast_encode is not None and self.thrift_spec is not None:
            oprot.trans.write(oprot._fast_encode(self, (self.__class__, self.thrift_spec)))
            return
        oprot.writeStructBegin('addGatewayComputeResourcePreference_args')
        if self.authzToken is not None:
            oprot.writeFieldBegin('authzToken', TType.STRUCT, 1)
            self.authzToken.write(oprot)
            oprot.writeFieldEnd()
        if self.gatewayID is not None:
            oprot.writeFieldBegin('gatewayID', TType.STRING, 2)
            oprot.writeString(self.gatewayID.encode('utf-8') if sys.version_info[0] == 2 else self.gatewayID)
            oprot.writeFieldEnd()
        if self.computeResourceId is not None:
            oprot.writeFieldBegin('computeResourceId', TType.STRING, 3)
            oprot.writeString(self.computeResourceId.encode('utf-8') if sys.version_info[0] == 2 else self.computeResourceId)
            oprot.writeFieldEnd()
        if self.computeResourcePreference is not None:
            oprot.writeFieldBegin('computeResourcePreference', TType.STRUCT, 4)
            self.computeResourcePreference.write(oprot)
            oprot.writeFieldEnd()
        oprot.writeFieldStop()
        oprot.writeStructEnd()

    def validate(self):
        if self.authzToken is None:
            raise TProtocolException(message='Required field authzToken is unset!')
        if self.gatewayID is None:
            raise TProtocolException(message='Required field gatewayID is unset!')
        if self.computeResourceId is None:
            raise TProtocolException(message='Required field computeResourceId is unset!')
        if self.computeResourcePreference is None:
            raise TProtocolException(message='Required field computeResourcePreference is unset!')
        return

    def __repr__(self):
        L = ['%s=%r' % (key, value)
             for key, value in self.__dict__.items()]
        return '%s(%s)' % (self.__class__.__name__, ', '.join(L))

    def __eq__(self, other):
        return isinstance(other, self.__class__) and self.__dict__ == other.__dict__

    def __ne__(self, other):
        return not (self == other)


class addGatewayComputeResourcePreference_result(object):
    """
    Attributes:
     - success
     - ire
     - ace
     - ase
     - ae
    """

    thrift_spec = (
        (0, TType.BOOL, 'success', None, None, ),  # 0
        (1, TType.STRUCT, 'ire', (apache.airavata.api.error.ttypes.InvalidRequestException, apache.airavata.api.error.ttypes.InvalidRequestException.thrift_spec), None, ),  # 1
        (2, TType.STRUCT, 'ace', (apache.airavata.api.error.ttypes.AiravataClientException, apache.airavata.api.error.ttypes.AiravataClientException.thrift_spec), None, ),  # 2
        (3, TType.STRUCT, 'ase', (apache.airavata.api.error.ttypes.AiravataSystemException, apache.airavata.api.error.ttypes.AiravataSystemException.thrift_spec), None, ),  # 3
        (4, TType.STRUCT, 'ae', (apache.airavata.api.error.ttypes.AuthorizationException, apache.airavata.api.error.ttypes.AuthorizationException.thrift_spec), None, ),  # 4
    )

    def __init__(self, success=None, ire=None, ace=None, ase=None, ae=None,):
        self.success = success
        self.ire = ire
        self.ace = ace
        self.ase = ase
        self.ae = ae

    def read(self, iprot):
        if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None:
            iprot._fast_decode(self, iprot, (self.__class__, self.thrift_spec))
            return
        iprot.readStructBegin()
        while True:
            (fname, ftype, fid) = iprot.readFieldBegin()
            if ftype == TType.STOP:
                break
            if fid == 0:
                if ftype == TType.BOOL:
                    self.success = iprot.readBool()
                else:
                    iprot.skip(ftype)
            elif fid == 1:
                if ftype == TType.STRUCT:
                    self.ire = apache.airavata.api.error.ttypes.InvalidRequestException()
                    self.ire.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 2:
                if ftype == TType.STRUCT:
                    self.ace = apache.airavata.api.error.ttypes.AiravataClientException()
                    self.ace.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 3:
                if ftype == TType.STRUCT:
                    self.ase = apache.airavata.api.error.ttypes.AiravataSystemException()
                    self.ase.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 4:
                if ftype == TType.STRUCT:
                    self.ae = apache.airavata.api.error.ttypes.AuthorizationException()
                    self.ae.read(iprot)
                else:
                    iprot.skip(ftype)
            else:
                iprot.skip(ftype)
            iprot.readFieldEnd()
        iprot.readStructEnd()

    def write(self, oprot):
        if oprot._fast_encode is not None and self.thrift_spec is not None:
            oprot.trans.write(oprot._fast_encode(self, (self.__class__, self.thrift_spec)))
            return
        oprot.writeStructBegin('addGatewayComputeResourcePreference_result')
        if self.success is not None:
            oprot.writeFieldBegin('success', TType.BOOL, 0)
            oprot.writeBool(self.success)
            oprot.writeFieldEnd()
        if self.ire is not None:
            oprot.writeFieldBegin('ire', TType.STRUCT, 1)
            self.ire.write(oprot)
            oprot.writeFieldEnd()
        if self.ace is not None:
            oprot.writeFieldBegin('ace', TType.STRUCT, 2)
            self.ace.write(oprot)
            oprot.writeFieldEnd()
        if self.ase is not None:
            oprot.writeFieldBegin('ase', TType.STRUCT, 3)
            self.ase.write(oprot)
            oprot.writeFieldEnd()
        if self.ae is not None:
            oprot.writeFieldBegin('ae', TType.STRUCT, 4)
            self.ae.write(oprot)
            oprot.writeFieldEnd()
        oprot.writeFieldStop()
        oprot.writeStructEnd()

    def validate(self):
        return

    def __repr__(self):
        L = ['%s=%r' % (key, value)
             for key, value in self.__dict__.items()]
        return '%s(%s)' % (self.__class__.__name__, ', '.join(L))

    def __eq__(self, other):
        return isinstance(other, self.__class__) and self.__dict__ == other.__dict__

    def __ne__(self, other):
        return not (self == other)


class addGatewayStoragePreference_args(object):
    """
    Attributes:
     - authzToken
     - gatewayID
     - storageResourceId
     - storagePreference
    """

    thrift_spec = (
        None,  # 0
        (1, TType.STRUCT, 'authzToken', (apache.airavata.model.security.ttypes.AuthzToken, apache.airavata.model.security.ttypes.AuthzToken.thrift_spec), None, ),  # 1
        (2, TType.STRING, 'gatewayID', 'UTF8', None, ),  # 2
        (3, TType.STRING, 'storageResourceId', 'UTF8', None, ),  # 3
        (4, TType.STRUCT, 'storagePreference', (apache.airavata.model.appcatalog.gatewayprofile.ttypes.StoragePreference, apache.airavata.model.appcatalog.gatewayprofile.ttypes.StoragePreference.thrift_spec), None, ),  # 4
    )

    def __init__(self, authzToken=None, gatewayID=None, storageResourceId=None, storagePreference=None,):
        self.authzToken = authzToken
        self.gatewayID = gatewayID
        self.storageResourceId = storageResourceId
        self.storagePreference = storagePreference

    def read(self, iprot):
        if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None:
            iprot._fast_decode(self, iprot, (self.__class__, self.thrift_spec))
            return
        iprot.readStructBegin()
        while True:
            (fname, ftype, fid) = iprot.readFieldBegin()
            if ftype == TType.STOP:
                break
            if fid == 1:
                if ftype == TType.STRUCT:
                    self.authzToken = apache.airavata.model.security.ttypes.AuthzToken()
                    self.authzToken.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 2:
                if ftype == TType.STRING:
                    self.gatewayID = iprot.readString().decode('utf-8') if sys.version_info[0] == 2 else iprot.readString()
                else:
                    iprot.skip(ftype)
            elif fid == 3:
                if ftype == TType.STRING:
                    self.storageResourceId = iprot.readString().decode('utf-8') if sys.version_info[0] == 2 else iprot.readString()
                else:
                    iprot.skip(ftype)
            elif fid == 4:
                if ftype == TType.STRUCT:
                    self.storagePreference = apache.airavata.model.appcatalog.gatewayprofile.ttypes.StoragePreference()
                    self.storagePreference.read(iprot)
                else:
                    iprot.skip(ftype)
            else:
                iprot.skip(ftype)
            iprot.readFieldEnd()
        iprot.readStructEnd()

    def write(self, oprot):
        if oprot._fast_encode is not None and self.thrift_spec is not None:
            oprot.trans.write(oprot._fast_encode(self, (self.__class__, self.thrift_spec)))
            return
        oprot.writeStructBegin('addGatewayStoragePreference_args')
        if self.authzToken is not None:
            oprot.writeFieldBegin('authzToken', TType.STRUCT, 1)
            self.authzToken.write(oprot)
            oprot.writeFieldEnd()
        if self.gatewayID is not None:
            oprot.writeFieldBegin('gatewayID', TType.STRING, 2)
            oprot.writeString(self.gatewayID.encode('utf-8') if sys.version_info[0] == 2 else self.gatewayID)
            oprot.writeFieldEnd()
        if self.storageResourceId is not None:
            oprot.writeFieldBegin('storageResourceId', TType.STRING, 3)
            oprot.writeString(self.storageResourceId.encode('utf-8') if sys.version_info[0] == 2 else self.storageResourceId)
            oprot.writeFieldEnd()
        if self.storagePreference is not None:
            oprot.writeFieldBegin('storagePreference', TType.STRUCT, 4)
            self.storagePreference.write(oprot)
            oprot.writeFieldEnd()
        oprot.writeFieldStop()
        oprot.writeStructEnd()

    def validate(self):
        if self.authzToken is None:
            raise TProtocolException(message='Required field authzToken is unset!')
        if self.gatewayID is None:
            raise TProtocolException(message='Required field gatewayID is unset!')
        if self.storageResourceId is None:
            raise TProtocolException(message='Required field storageResourceId is unset!')
        if self.storagePreference is None:
            raise TProtocolException(message='Required field storagePreference is unset!')
        return

    def __repr__(self):
        L = ['%s=%r' % (key, value)
             for key, value in self.__dict__.items()]
        return '%s(%s)' % (self.__class__.__name__, ', '.join(L))

    def __eq__(self, other):
        return isinstance(other, self.__class__) and self.__dict__ == other.__dict__

    def __ne__(self, other):
        return not (self == other)


class addGatewayStoragePreference_result(object):
    """
    Attributes:
     - success
     - ire
     - ace
     - ase
     - ae
    """

    thrift_spec = (
        (0, TType.BOOL, 'success', None, None, ),  # 0
        (1, TType.STRUCT, 'ire', (apache.airavata.api.error.ttypes.InvalidRequestException, apache.airavata.api.error.ttypes.InvalidRequestException.thrift_spec), None, ),  # 1
        (2, TType.STRUCT, 'ace', (apache.airavata.api.error.ttypes.AiravataClientException, apache.airavata.api.error.ttypes.AiravataClientException.thrift_spec), None, ),  # 2
        (3, TType.STRUCT, 'ase', (apache.airavata.api.error.ttypes.AiravataSystemException, apache.airavata.api.error.ttypes.AiravataSystemException.thrift_spec), None, ),  # 3
        (4, TType.STRUCT, 'ae', (apache.airavata.api.error.ttypes.AuthorizationException, apache.airavata.api.error.ttypes.AuthorizationException.thrift_spec), None, ),  # 4
    )

    def __init__(self, success=None, ire=None, ace=None, ase=None, ae=None,):
        self.success = success
        self.ire = ire
        self.ace = ace
        self.ase = ase
        self.ae = ae

    def read(self, iprot):
        if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None:
            iprot._fast_decode(self, iprot, (self.__class__, self.thrift_spec))
            return
        iprot.readStructBegin()
        while True:
            (fname, ftype, fid) = iprot.readFieldBegin()
            if ftype == TType.STOP:
                break
            if fid == 0:
                if ftype == TType.BOOL:
                    self.success = iprot.readBool()
                else:
                    iprot.skip(ftype)
            elif fid == 1:
                if ftype == TType.STRUCT:
                    self.ire = apache.airavata.api.error.ttypes.InvalidRequestException()
                    self.ire.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 2:
                if ftype == TType.STRUCT:
                    self.ace = apache.airavata.api.error.ttypes.AiravataClientException()
                    self.ace.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 3:
                if ftype == TType.STRUCT:
                    self.ase = apache.airavata.api.error.ttypes.AiravataSystemException()
                    self.ase.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 4:
                if ftype == TType.STRUCT:
                    self.ae = apache.airavata.api.error.ttypes.AuthorizationException()
                    self.ae.read(iprot)
                else:
                    iprot.skip(ftype)
            else:
                iprot.skip(ftype)
            iprot.readFieldEnd()
        iprot.readStructEnd()

    def write(self, oprot):
        if oprot._fast_encode is not None and self.thrift_spec is not None:
            oprot.trans.write(oprot._fast_encode(self, (self.__class__, self.thrift_spec)))
            return
        oprot.writeStructBegin('addGatewayStoragePreference_result')
        if self.success is not None:
            oprot.writeFieldBegin('success', TType.BOOL, 0)
            oprot.writeBool(self.success)
            oprot.writeFieldEnd()
        if self.ire is not None:
            oprot.writeFieldBegin('ire', TType.STRUCT, 1)
            self.ire.write(oprot)
            oprot.writeFieldEnd()
        if self.ace is not None:
            oprot.writeFieldBegin('ace', TType.STRUCT, 2)
            self.ace.write(oprot)
            oprot.writeFieldEnd()
        if self.ase is not None:
            oprot.writeFieldBegin('ase', TType.STRUCT, 3)
            self.ase.write(oprot)
            oprot.writeFieldEnd()
        if self.ae is not None:
            oprot.writeFieldBegin('ae', TType.STRUCT, 4)
            self.ae.write(oprot)
            oprot.writeFieldEnd()
        oprot.writeFieldStop()
        oprot.writeStructEnd()

    def validate(self):
        return

    def __repr__(self):
        L = ['%s=%r' % (key, value)
             for key, value in self.__dict__.items()]
        return '%s(%s)' % (self.__class__.__name__, ', '.join(L))

    def __eq__(self, other):
        return isinstance(other, self.__class__) and self.__dict__ == other.__dict__

    def __ne__(self, other):
        return not (self == other)


class getGatewayComputeResourcePreference_args(object):
    """
    Attributes:
     - authzToken
     - gatewayID
     - computeResourceId
    """

    thrift_spec = (
        None,  # 0
        (1, TType.STRUCT, 'authzToken', (apache.airavata.model.security.ttypes.AuthzToken, apache.airavata.model.security.ttypes.AuthzToken.thrift_spec), None, ),  # 1
        (2, TType.STRING, 'gatewayID', 'UTF8', None, ),  # 2
        (3, TType.STRING, 'computeResourceId', 'UTF8', None, ),  # 3
    )

    def __init__(self, authzToken=None, gatewayID=None, computeResourceId=None,):
        self.authzToken = authzToken
        self.gatewayID = gatewayID
        self.computeResourceId = computeResourceId

    def read(self, iprot):
        if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None:
            iprot._fast_decode(self, iprot, (self.__class__, self.thrift_spec))
            return
        iprot.readStructBegin()
        while True:
            (fname, ftype, fid) = iprot.readFieldBegin()
            if ftype == TType.STOP:
                break
            if fid == 1:
                if ftype == TType.STRUCT:
                    self.authzToken = apache.airavata.model.security.ttypes.AuthzToken()
                    self.authzToken.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 2:
                if ftype == TType.STRING:
                    self.gatewayID = iprot.readString().decode('utf-8') if sys.version_info[0] == 2 else iprot.readString()
                else:
                    iprot.skip(ftype)
            elif fid == 3:
                if ftype == TType.STRING:
                    self.computeResourceId = iprot.readString().decode('utf-8') if sys.version_info[0] == 2 else iprot.readString()
                else:
                    iprot.skip(ftype)
            else:
                iprot.skip(ftype)
            iprot.readFieldEnd()
        iprot.readStructEnd()

    def write(self, oprot):
        if oprot._fast_encode is not None and self.thrift_spec is not None:
            oprot.trans.write(oprot._fast_encode(self, (self.__class__, self.thrift_spec)))
            return
        oprot.writeStructBegin('getGatewayComputeResourcePreference_args')
        if self.authzToken is not None:
            oprot.writeFieldBegin('authzToken', TType.STRUCT, 1)
            self.authzToken.write(oprot)
            oprot.writeFieldEnd()
        if self.gatewayID is not None:
            oprot.writeFieldBegin('gatewayID', TType.STRING, 2)
            oprot.writeString(self.gatewayID.encode('utf-8') if sys.version_info[0] == 2 else self.gatewayID)
            oprot.writeFieldEnd()
        if self.computeResourceId is not None:
            oprot.writeFieldBegin('computeResourceId', TType.STRING, 3)
            oprot.writeString(self.computeResourceId.encode('utf-8') if sys.version_info[0] == 2 else self.computeResourceId)
            oprot.writeFieldEnd()
        oprot.writeFieldStop()
        oprot.writeStructEnd()

    def validate(self):
        if self.authzToken is None:
            raise TProtocolException(message='Required field authzToken is unset!')
        if self.gatewayID is None:
            raise TProtocolException(message='Required field gatewayID is unset!')
        if self.computeResourceId is None:
            raise TProtocolException(message='Required field computeResourceId is unset!')
        return

    def __repr__(self):
        L = ['%s=%r' % (key, value)
             for key, value in self.__dict__.items()]
        return '%s(%s)' % (self.__class__.__name__, ', '.join(L))

    def __eq__(self, other):
        return isinstance(other, self.__class__) and self.__dict__ == other.__dict__

    def __ne__(self, other):
        return not (self == other)


class getGatewayComputeResourcePreference_result(object):
    """
    Attributes:
     - success
     - ire
     - ace
     - ase
     - ae
    """

    thrift_spec = (
        (0, TType.STRUCT, 'success', (apache.airavata.model.appcatalog.gatewayprofile.ttypes.ComputeResourcePreference, apache.airavata.model.appcatalog.gatewayprofile.ttypes.ComputeResourcePreference.thrift_spec), None, ),  # 0
        (1, TType.STRUCT, 'ire', (apache.airavata.api.error.ttypes.InvalidRequestException, apache.airavata.api.error.ttypes.InvalidRequestException.thrift_spec), None, ),  # 1
        (2, TType.STRUCT, 'ace', (apache.airavata.api.error.ttypes.AiravataClientException, apache.airavata.api.error.ttypes.AiravataClientException.thrift_spec), None, ),  # 2
        (3, TType.STRUCT, 'ase', (apache.airavata.api.error.ttypes.AiravataSystemException, apache.airavata.api.error.ttypes.AiravataSystemException.thrift_spec), None, ),  # 3
        (4, TType.STRUCT, 'ae', (apache.airavata.api.error.ttypes.AuthorizationException, apache.airavata.api.error.ttypes.AuthorizationException.thrift_spec), None, ),  # 4
    )

    def __init__(self, success=None, ire=None, ace=None, ase=None, ae=None,):
        self.success = success
        self.ire = ire
        self.ace = ace
        self.ase = ase
        self.ae = ae

    def read(self, iprot):
        if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None:
            iprot._fast_decode(self, iprot, (self.__class__, self.thrift_spec))
            return
        iprot.readStructBegin()
        while True:
            (fname, ftype, fid) = iprot.readFieldBegin()
            if ftype == TType.STOP:
                break
            if fid == 0:
                if ftype == TType.STRUCT:
                    self.success = apache.airavata.model.appcatalog.gatewayprofile.ttypes.ComputeResourcePreference()
                    self.success.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 1:
                if ftype == TType.STRUCT:
                    self.ire = apache.airavata.api.error.ttypes.InvalidRequestException()
                    self.ire.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 2:
                if ftype == TType.STRUCT:
                    self.ace = apache.airavata.api.error.ttypes.AiravataClientException()
                    self.ace.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 3:
                if ftype == TType.STRUCT:
                    self.ase = apache.airavata.api.error.ttypes.AiravataSystemException()
                    self.ase.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 4:
                if ftype == TType.STRUCT:
                    self.ae = apache.airavata.api.error.ttypes.AuthorizationException()
                    self.ae.read(iprot)
                else:
                    iprot.skip(ftype)
            else:
                iprot.skip(ftype)
            iprot.readFieldEnd()
        iprot.readStructEnd()

    def write(self, oprot):
        if oprot._fast_encode is not None and self.thrift_spec is not None:
            oprot.trans.write(oprot._fast_encode(self, (self.__class__, self.thrift_spec)))
            return
        oprot.writeStructBegin('getGatewayComputeResourcePreference_result')
        if self.success is not None:
            oprot.writeFieldBegin('success', TType.STRUCT, 0)
            self.success.write(oprot)
            oprot.writeFieldEnd()
        if self.ire is not None:
            oprot.writeFieldBegin('ire', TType.STRUCT, 1)
            self.ire.write(oprot)
            oprot.writeFieldEnd()
        if self.ace is not None:
            oprot.writeFieldBegin('ace', TType.STRUCT, 2)
            self.ace.write(oprot)
            oprot.writeFieldEnd()
        if self.ase is not None:
            oprot.writeFieldBegin('ase', TType.STRUCT, 3)
            self.ase.write(oprot)
            oprot.writeFieldEnd()
        if self.ae is not None:
            oprot.writeFieldBegin('ae', TType.STRUCT, 4)
            self.ae.write(oprot)
            oprot.writeFieldEnd()
        oprot.writeFieldStop()
        oprot.writeStructEnd()

    def validate(self):
        return

    def __repr__(self):
        L = ['%s=%r' % (key, value)
             for key, value in self.__dict__.items()]
        return '%s(%s)' % (self.__class__.__name__, ', '.join(L))

    def __eq__(self, other):
        return isinstance(other, self.__class__) and self.__dict__ == other.__dict__

    def __ne__(self, other):
        return not (self == other)


class getGatewayStoragePreference_args(object):
    """
    Attributes:
     - authzToken
     - gatewayID
     - storageResourceId
    """

    thrift_spec = (
        None,  # 0
        (1, TType.STRUCT, 'authzToken', (apache.airavata.model.security.ttypes.AuthzToken, apache.airavata.model.security.ttypes.AuthzToken.thrift_spec), None, ),  # 1
        (2, TType.STRING, 'gatewayID', 'UTF8', None, ),  # 2
        (3, TType.STRING, 'storageResourceId', 'UTF8', None, ),  # 3
    )

    def __init__(self, authzToken=None, gatewayID=None, storageResourceId=None,):
        self.authzToken = authzToken
        self.gatewayID = gatewayID
        self.storageResourceId = storageResourceId

    def read(self, iprot):
        if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None:
            iprot._fast_decode(self, iprot, (self.__class__, self.thrift_spec))
            return
        iprot.readStructBegin()
        while True:
            (fname, ftype, fid) = iprot.readFieldBegin()
            if ftype == TType.STOP:
                break
            if fid == 1:
                if ftype == TType.STRUCT:
                    self.authzToken = apache.airavata.model.security.ttypes.AuthzToken()
                    self.authzToken.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 2:
                if ftype == TType.STRING:
                    self.gatewayID = iprot.readString().decode('utf-8') if sys.version_info[0] == 2 else iprot.readString()
                else:
                    iprot.skip(ftype)
            elif fid == 3:
                if ftype == TType.STRING:
                    self.storageResourceId = iprot.readString().decode('utf-8') if sys.version_info[0] == 2 else iprot.readString()
                else:
                    iprot.skip(ftype)
            else:
                iprot.skip(ftype)
            iprot.readFieldEnd()
        iprot.readStructEnd()

    def write(self, oprot):
        if oprot._fast_encode is not None and self.thrift_spec is not None:
            oprot.trans.write(oprot._fast_encode(self, (self.__class__, self.thrift_spec)))
            return
        oprot.writeStructBegin('getGatewayStoragePreference_args')
        if self.authzToken is not None:
            oprot.writeFieldBegin('authzToken', TType.STRUCT, 1)
            self.authzToken.write(oprot)
            oprot.writeFieldEnd()
        if self.gatewayID is not None:
            oprot.writeFieldBegin('gatewayID', TType.STRING, 2)
            oprot.writeString(self.gatewayID.encode('utf-8') if sys.version_info[0] == 2 else self.gatewayID)
            oprot.writeFieldEnd()
        if self.storageResourceId is not None:
            oprot.writeFieldBegin('storageResourceId', TType.STRING, 3)
            oprot.writeString(self.storageResourceId.encode('utf-8') if sys.version_info[0] == 2 else self.storageResourceId)
            oprot.writeFieldEnd()
        oprot.writeFieldStop()
        oprot.writeStructEnd()

    def validate(self):
        if self.authzToken is None:
            raise TProtocolException(message='Required field authzToken is unset!')
        if self.gatewayID is None:
            raise TProtocolException(message='Required field gatewayID is unset!')
        if self.storageResourceId is None:
            raise TProtocolException(message='Required field storageResourceId is unset!')
        return

    def __repr__(self):
        L = ['%s=%r' % (key, value)
             for key, value in self.__dict__.items()]
        return '%s(%s)' % (self.__class__.__name__, ', '.join(L))

    def __eq__(self, other):
        return isinstance(other, self.__class__) and self.__dict__ == other.__dict__

    def __ne__(self, other):
        return not (self == other)


class getGatewayStoragePreference_result(object):
    """
    Attributes:
     - success
     - ire
     - ace
     - ase
     - ae
    """

    thrift_spec = (
        (0, TType.STRUCT, 'success', (apache.airavata.model.appcatalog.gatewayprofile.ttypes.StoragePreference, apache.airavata.model.appcatalog.gatewayprofile.ttypes.StoragePreference.thrift_spec), None, ),  # 0
        (1, TType.STRUCT, 'ire', (apache.airavata.api.error.ttypes.InvalidRequestException, apache.airavata.api.error.ttypes.InvalidRequestException.thrift_spec), None, ),  # 1
        (2, TType.STRUCT, 'ace', (apache.airavata.api.error.ttypes.AiravataClientException, apache.airavata.api.error.ttypes.AiravataClientException.thrift_spec), None, ),  # 2
        (3, TType.STRUCT, 'ase', (apache.airavata.api.error.ttypes.AiravataSystemException, apache.airavata.api.error.ttypes.AiravataSystemException.thrift_spec), None, ),  # 3
        (4, TType.STRUCT, 'ae', (apache.airavata.api.error.ttypes.AuthorizationException, apache.airavata.api.error.ttypes.AuthorizationException.thrift_spec), None, ),  # 4
    )

    def __init__(self, success=None, ire=None, ace=None, ase=None, ae=None,):
        self.success = success
        self.ire = ire
        self.ace = ace
        self.ase = ase
        self.ae = ae

    def read(self, iprot):
        if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None:
            iprot._fast_decode(self, iprot, (self.__class__, self.thrift_spec))
            return
        iprot.readStructBegin()
        while True:
            (fname, ftype, fid) = iprot.readFieldBegin()
            if ftype == TType.STOP:
                break
            if fid == 0:
                if ftype == TType.STRUCT:
                    self.success = apache.airavata.model.appcatalog.gatewayprofile.ttypes.StoragePreference()
                    self.success.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 1:
                if ftype == TType.STRUCT:
                    self.ire = apache.airavata.api.error.ttypes.InvalidRequestException()
                    self.ire.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 2:
                if ftype == TType.STRUCT:
                    self.ace = apache.airavata.api.error.ttypes.AiravataClientException()
                    self.ace.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 3:
                if ftype == TType.STRUCT:
                    self.ase = apache.airavata.api.error.ttypes.AiravataSystemException()
                    self.ase.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 4:
                if ftype == TType.STRUCT:
                    self.ae = apache.airavata.api.error.ttypes.AuthorizationException()
                    self.ae.read(iprot)
                else:
                    iprot.skip(ftype)
            else:
                iprot.skip(ftype)
            iprot.readFieldEnd()
        iprot.readStructEnd()

    def write(self, oprot):
        if oprot._fast_encode is not None and self.thrift_spec is not None:
            oprot.trans.write(oprot._fast_encode(self, (self.__class__, self.thrift_spec)))
            return
        oprot.writeStructBegin('getGatewayStoragePreference_result')
        if self.success is not None:
            oprot.writeFieldBegin('success', TType.STRUCT, 0)
            self.success.write(oprot)
            oprot.writeFieldEnd()
        if self.ire is not None:
            oprot.writeFieldBegin('ire', TType.STRUCT, 1)
            self.ire.write(oprot)
            oprot.writeFieldEnd()
        if self.ace is not None:
            oprot.writeFieldBegin('ace', TType.STRUCT, 2)
            self.ace.write(oprot)
            oprot.writeFieldEnd()
        if self.ase is not None:
            oprot.writeFieldBegin('ase', TType.STRUCT, 3)
            self.ase.write(oprot)
            oprot.writeFieldEnd()
        if self.ae is not None:
            oprot.writeFieldBegin('ae', TType.STRUCT, 4)
            self.ae.write(oprot)
            oprot.writeFieldEnd()
        oprot.writeFieldStop()
        oprot.writeStructEnd()

    def validate(self):
        return

    def __repr__(self):
        L = ['%s=%r' % (key, value)
             for key, value in self.__dict__.items()]
        return '%s(%s)' % (self.__class__.__name__, ', '.join(L))

    def __eq__(self, other):
        return isinstance(other, self.__class__) and self.__dict__ == other.__dict__

    def __ne__(self, other):
        return not (self == other)


class getAllGatewayComputeResourcePreferences_args(object):
    """
    Attributes:
     - authzToken
     - gatewayID
    """

    thrift_spec = (
        None,  # 0
        (1, TType.STRUCT, 'authzToken', (apache.airavata.model.security.ttypes.AuthzToken, apache.airavata.model.security.ttypes.AuthzToken.thrift_spec), None, ),  # 1
        (2, TType.STRING, 'gatewayID', 'UTF8', None, ),  # 2
    )

    def __init__(self, authzToken=None, gatewayID=None,):
        self.authzToken = authzToken
        self.gatewayID = gatewayID

    def read(self, iprot):
        if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None:
            iprot._fast_decode(self, iprot, (self.__class__, self.thrift_spec))
            return
        iprot.readStructBegin()
        while True:
            (fname, ftype, fid) = iprot.readFieldBegin()
            if ftype == TType.STOP:
                break
            if fid == 1:
                if ftype == TType.STRUCT:
                    self.authzToken = apache.airavata.model.security.ttypes.AuthzToken()
                    self.authzToken.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 2:
                if ftype == TType.STRING:
                    self.gatewayID = iprot.readString().decode('utf-8') if sys.version_info[0] == 2 else iprot.readString()
                else:
                    iprot.skip(ftype)
            else:
                iprot.skip(ftype)
            iprot.readFieldEnd()
        iprot.readStructEnd()

    def write(self, oprot):
        if oprot._fast_encode is not None and self.thrift_spec is not None:
            oprot.trans.write(oprot._fast_encode(self, (self.__class__, self.thrift_spec)))
            return
        oprot.writeStructBegin('getAllGatewayComputeResourcePreferences_args')
        if self.authzToken is not None:
            oprot.writeFieldBegin('authzToken', TType.STRUCT, 1)
            self.authzToken.write(oprot)
            oprot.writeFieldEnd()
        if self.gatewayID is not None:
            oprot.writeFieldBegin('gatewayID', TType.STRING, 2)
            oprot.writeString(self.gatewayID.encode('utf-8') if sys.version_info[0] == 2 else self.gatewayID)
            oprot.writeFieldEnd()
        oprot.writeFieldStop()
        oprot.writeStructEnd()

    def validate(self):
        if self.authzToken is None:
            raise TProtocolException(message='Required field authzToken is unset!')
        if self.gatewayID is None:
            raise TProtocolException(message='Required field gatewayID is unset!')
        return

    def __repr__(self):
        L = ['%s=%r' % (key, value)
             for key, value in self.__dict__.items()]
        return '%s(%s)' % (self.__class__.__name__, ', '.join(L))

    def __eq__(self, other):
        return isinstance(other, self.__class__) and self.__dict__ == other.__dict__

    def __ne__(self, other):
        return not (self == other)


class getAllGatewayComputeResourcePreferences_result(object):
    """
    Attributes:
     - success
     - ire
     - ace
     - ase
     - ae
    """

    thrift_spec = (
        (0, TType.LIST, 'success', (TType.STRUCT, (apache.airavata.model.appcatalog.gatewayprofile.ttypes.ComputeResourcePreference, apache.airavata.model.appcatalog.gatewayprofile.ttypes.ComputeResourcePreference.thrift_spec), False), None, ),  # 0
        (1, TType.STRUCT, 'ire', (apache.airavata.api.error.ttypes.InvalidRequestException, apache.airavata.api.error.ttypes.InvalidRequestException.thrift_spec), None, ),  # 1
        (2, TType.STRUCT, 'ace', (apache.airavata.api.error.ttypes.AiravataClientException, apache.airavata.api.error.ttypes.AiravataClientException.thrift_spec), None, ),  # 2
        (3, TType.STRUCT, 'ase', (apache.airavata.api.error.ttypes.AiravataSystemException, apache.airavata.api.error.ttypes.AiravataSystemException.thrift_spec), None, ),  # 3
        (4, TType.STRUCT, 'ae', (apache.airavata.api.error.ttypes.AuthorizationException, apache.airavata.api.error.ttypes.AuthorizationException.thrift_spec), None, ),  # 4
    )

    def __init__(self, success=None, ire=None, ace=None, ase=None, ae=None,):
        self.success = success
        self.ire = ire
        self.ace = ace
        self.ase = ase
        self.ae = ae

    def read(self, iprot):
        if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None:
            iprot._fast_decode(self, iprot, (self.__class__, self.thrift_spec))
            return
        iprot.readStructBegin()
        while True:
            (fname, ftype, fid) = iprot.readFieldBegin()
            if ftype == TType.STOP:
                break
            if fid == 0:
                if ftype == TType.LIST:
                    self.success = []
                    (_etype235, _size232) = iprot.readListBegin()
                    for _i236 in range(_size232):
                        _elem237 = apache.airavata.model.appcatalog.gatewayprofile.ttypes.ComputeResourcePreference()
                        _elem237.read(iprot)
                        self.success.append(_elem237)
                    iprot.readListEnd()
                else:
                    iprot.skip(ftype)
            elif fid == 1:
                if ftype == TType.STRUCT:
                    self.ire = apache.airavata.api.error.ttypes.InvalidRequestException()
                    self.ire.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 2:
                if ftype == TType.STRUCT:
                    self.ace = apache.airavata.api.error.ttypes.AiravataClientException()
                    self.ace.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 3:
                if ftype == TType.STRUCT:
                    self.ase = apache.airavata.api.error.ttypes.AiravataSystemException()
                    self.ase.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 4:
                if ftype == TType.STRUCT:
                    self.ae = apache.airavata.api.error.ttypes.AuthorizationException()
                    self.ae.read(iprot)
                else:
                    iprot.skip(ftype)
            else:
                iprot.skip(ftype)
            iprot.readFieldEnd()
        iprot.readStructEnd()

    def write(self, oprot):
        if oprot._fast_encode is not None and self.thrift_spec is not None:
            oprot.trans.write(oprot._fast_encode(self, (self.__class__, self.thrift_spec)))
            return
        oprot.writeStructBegin('getAllGatewayComputeResourcePreferences_result')
        if self.success is not None:
            oprot.writeFieldBegin('success', TType.LIST, 0)
            oprot.writeListBegin(TType.STRUCT, len(self.success))
            for iter238 in self.success:
                iter238.write(oprot)
            oprot.writeListEnd()
            oprot.writeFieldEnd()
        if self.ire is not None:
            oprot.writeFieldBegin('ire', TType.STRUCT, 1)
            self.ire.write(oprot)
            oprot.writeFieldEnd()
        if self.ace is not None:
            oprot.writeFieldBegin('ace', TType.STRUCT, 2)
            self.ace.write(oprot)
            oprot.writeFieldEnd()
        if self.ase is not None:
            oprot.writeFieldBegin('ase', TType.STRUCT, 3)
            self.ase.write(oprot)
            oprot.writeFieldEnd()
        if self.ae is not None:
            oprot.writeFieldBegin('ae', TType.STRUCT, 4)
            self.ae.write(oprot)
            oprot.writeFieldEnd()
        oprot.writeFieldStop()
        oprot.writeStructEnd()

    def validate(self):
        return

    def __repr__(self):
        L = ['%s=%r' % (key, value)
             for key, value in self.__dict__.items()]
        return '%s(%s)' % (self.__class__.__name__, ', '.join(L))

    def __eq__(self, other):
        return isinstance(other, self.__class__) and self.__dict__ == other.__dict__

    def __ne__(self, other):
        return not (self == other)


class getAllGatewayStoragePreferences_args(object):
    """
    Attributes:
     - authzToken
     - gatewayID
    """

    thrift_spec = (
        None,  # 0
        (1, TType.STRUCT, 'authzToken', (apache.airavata.model.security.ttypes.AuthzToken, apache.airavata.model.security.ttypes.AuthzToken.thrift_spec), None, ),  # 1
        (2, TType.STRING, 'gatewayID', 'UTF8', None, ),  # 2
    )

    def __init__(self, authzToken=None, gatewayID=None,):
        self.authzToken = authzToken
        self.gatewayID = gatewayID

    def read(self, iprot):
        if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None:
            iprot._fast_decode(self, iprot, (self.__class__, self.thrift_spec))
            return
        iprot.readStructBegin()
        while True:
            (fname, ftype, fid) = iprot.readFieldBegin()
            if ftype == TType.STOP:
                break
            if fid == 1:
                if ftype == TType.STRUCT:
                    self.authzToken = apache.airavata.model.security.ttypes.AuthzToken()
                    self.authzToken.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 2:
                if ftype == TType.STRING:
                    self.gatewayID = iprot.readString().decode('utf-8') if sys.version_info[0] == 2 else iprot.readString()
                else:
                    iprot.skip(ftype)
            else:
                iprot.skip(ftype)
            iprot.readFieldEnd()
        iprot.readStructEnd()

    def write(self, oprot):
        if oprot._fast_encode is not None and self.thrift_spec is not None:
            oprot.trans.write(oprot._fast_encode(self, (self.__class__, self.thrift_spec)))
            return
        oprot.writeStructBegin('getAllGatewayStoragePreferences_args')
        if self.authzToken is not None:
            oprot.writeFieldBegin('authzToken', TType.STRUCT, 1)
            self.authzToken.write(oprot)
            oprot.writeFieldEnd()
        if self.gatewayID is not None:
            oprot.writeFieldBegin('gatewayID', TType.STRING, 2)
            oprot.writeString(self.gatewayID.encode('utf-8') if sys.version_info[0] == 2 else self.gatewayID)
            oprot.writeFieldEnd()
        oprot.writeFieldStop()
        oprot.writeStructEnd()

    def validate(self):
        if self.authzToken is None:
            raise TProtocolException(message='Required field authzToken is unset!')
        if self.gatewayID is None:
            raise TProtocolException(message='Required field gatewayID is unset!')
        return

    def __repr__(self):
        L = ['%s=%r' % (key, value)
             for key, value in self.__dict__.items()]
        return '%s(%s)' % (self.__class__.__name__, ', '.join(L))

    def __eq__(self, other):
        return isinstance(other, self.__class__) and self.__dict__ == other.__dict__

    def __ne__(self, other):
        return not (self == other)


class getAllGatewayStoragePreferences_result(object):
    """
    Attributes:
     - success
     - ire
     - ace
     - ase
     - ae
    """

    thrift_spec = (
        (0, TType.LIST, 'success', (TType.STRUCT, (apache.airavata.model.appcatalog.gatewayprofile.ttypes.StoragePreference, apache.airavata.model.appcatalog.gatewayprofile.ttypes.StoragePreference.thrift_spec), False), None, ),  # 0
        (1, TType.STRUCT, 'ire', (apache.airavata.api.error.ttypes.InvalidRequestException, apache.airavata.api.error.ttypes.InvalidRequestException.thrift_spec), None, ),  # 1
        (2, TType.STRUCT, 'ace', (apache.airavata.api.error.ttypes.AiravataClientException, apache.airavata.api.error.ttypes.AiravataClientException.thrift_spec), None, ),  # 2
        (3, TType.STRUCT, 'ase', (apache.airavata.api.error.ttypes.AiravataSystemException, apache.airavata.api.error.ttypes.AiravataSystemException.thrift_spec), None, ),  # 3
        (4, TType.STRUCT, 'ae', (apache.airavata.api.error.ttypes.AuthorizationException, apache.airavata.api.error.ttypes.AuthorizationException.thrift_spec), None, ),  # 4
    )

    def __init__(self, success=None, ire=None, ace=None, ase=None, ae=None,):
        self.success = success
        self.ire = ire
        self.ace = ace
        self.ase = ase
        self.ae = ae

    def read(self, iprot):
        if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None:
            iprot._fast_decode(self, iprot, (self.__class__, self.thrift_spec))
            return
        iprot.readStructBegin()
        while True:
            (fname, ftype, fid) = iprot.readFieldBegin()
            if ftype == TType.STOP:
                break
            if fid == 0:
                if ftype == TType.LIST:
                    self.success = []
                    (_etype242, _size239) = iprot.readListBegin()
                    for _i243 in range(_size239):
                        _elem244 = apache.airavata.model.appcatalog.gatewayprofile.ttypes.StoragePreference()
                        _elem244.read(iprot)
                        self.success.append(_elem244)
                    iprot.readListEnd()
                else:
                    iprot.skip(ftype)
            elif fid == 1:
                if ftype == TType.STRUCT:
                    self.ire = apache.airavata.api.error.ttypes.InvalidRequestException()
                    self.ire.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 2:
                if ftype == TType.STRUCT:
                    self.ace = apache.airavata.api.error.ttypes.AiravataClientException()
                    self.ace.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 3:
                if ftype == TType.STRUCT:
                    self.ase = apache.airavata.api.error.ttypes.AiravataSystemException()
                    self.ase.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 4:
                if ftype == TType.STRUCT:
                    self.ae = apache.airavata.api.error.ttypes.AuthorizationException()
                    self.ae.read(iprot)
                else:
                    iprot.skip(ftype)
            else:
                iprot.skip(ftype)
            iprot.readFieldEnd()
        iprot.readStructEnd()

    def write(self, oprot):
        if oprot._fast_encode is not None and self.thrift_spec is not None:
            oprot.trans.write(oprot._fast_encode(self, (self.__class__, self.thrift_spec)))
            return
        oprot.writeStructBegin('getAllGatewayStoragePreferences_result')
        if self.success is not None:
            oprot.writeFieldBegin('success', TType.LIST, 0)
            oprot.writeListBegin(TType.STRUCT, len(self.success))
            for iter245 in self.success:
                iter245.write(oprot)
            oprot.writeListEnd()
            oprot.writeFieldEnd()
        if self.ire is not None:
            oprot.writeFieldBegin('ire', TType.STRUCT, 1)
            self.ire.write(oprot)
            oprot.writeFieldEnd()
        if self.ace is not None:
            oprot.writeFieldBegin('ace', TType.STRUCT, 2)
            self.ace.write(oprot)
            oprot.writeFieldEnd()
        if self.ase is not None:
            oprot.writeFieldBegin('ase', TType.STRUCT, 3)
            self.ase.write(oprot)
            oprot.writeFieldEnd()
        if self.ae is not None:
            oprot.writeFieldBegin('ae', TType.STRUCT, 4)
            self.ae.write(oprot)
            oprot.writeFieldEnd()
        oprot.writeFieldStop()
        oprot.writeStructEnd()

    def validate(self):
        return

    def __repr__(self):
        L = ['%s=%r' % (key, value)
             for key, value in self.__dict__.items()]
        return '%s(%s)' % (self.__class__.__name__, ', '.join(L))

    def __eq__(self, other):
        return isinstance(other, self.__class__) and self.__dict__ == other.__dict__

    def __ne__(self, other):
        return not (self == other)


class getAllGatewayResourceProfiles_args(object):
    """
    Attributes:
     - authzToken
    """

    thrift_spec = (
        None,  # 0
        (1, TType.STRUCT, 'authzToken', (apache.airavata.model.security.ttypes.AuthzToken, apache.airavata.model.security.ttypes.AuthzToken.thrift_spec), None, ),  # 1
    )

    def __init__(self, authzToken=None,):
        self.authzToken = authzToken

    def read(self, iprot):
        if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None:
            iprot._fast_decode(self, iprot, (self.__class__, self.thrift_spec))
            return
        iprot.readStructBegin()
        while True:
            (fname, ftype, fid) = iprot.readFieldBegin()
            if ftype == TType.STOP:
                break
            if fid == 1:
                if ftype == TType.STRUCT:
                    self.authzToken = apache.airavata.model.security.ttypes.AuthzToken()
                    self.authzToken.read(iprot)
                else:
                    iprot.skip(ftype)
            else:
                iprot.skip(ftype)
            iprot.readFieldEnd()
        iprot.readStructEnd()

    def write(self, oprot):
        if oprot._fast_encode is not None and self.thrift_spec is not None:
            oprot.trans.write(oprot._fast_encode(self, (self.__class__, self.thrift_spec)))
            return
        oprot.writeStructBegin('getAllGatewayResourceProfiles_args')
        if self.authzToken is not None:
            oprot.writeFieldBegin('authzToken', TType.STRUCT, 1)
            self.authzToken.write(oprot)
            oprot.writeFieldEnd()
        oprot.writeFieldStop()
        oprot.writeStructEnd()

    def validate(self):
        if self.authzToken is None:
            raise TProtocolException(message='Required field authzToken is unset!')
        return

    def __repr__(self):
        L = ['%s=%r' % (key, value)
             for key, value in self.__dict__.items()]
        return '%s(%s)' % (self.__class__.__name__, ', '.join(L))

    def __eq__(self, other):
        return isinstance(other, self.__class__) and self.__dict__ == other.__dict__

    def __ne__(self, other):
        return not (self == other)


class getAllGatewayResourceProfiles_result(object):
    """
    Attributes:
     - success
     - ire
     - ace
     - ase
     - ae
    """

    thrift_spec = (
        (0, TType.LIST, 'success', (TType.STRUCT, (apache.airavata.model.appcatalog.gatewayprofile.ttypes.GatewayResourceProfile, apache.airavata.model.appcatalog.gatewayprofile.ttypes.GatewayResourceProfile.thrift_spec), False), None, ),  # 0
        (1, TType.STRUCT, 'ire', (apache.airavata.api.error.ttypes.InvalidRequestException, apache.airavata.api.error.ttypes.InvalidRequestException.thrift_spec), None, ),  # 1
        (2, TType.STRUCT, 'ace', (apache.airavata.api.error.ttypes.AiravataClientException, apache.airavata.api.error.ttypes.AiravataClientException.thrift_spec), None, ),  # 2
        (3, TType.STRUCT, 'ase', (apache.airavata.api.error.ttypes.AiravataSystemException, apache.airavata.api.error.ttypes.AiravataSystemException.thrift_spec), None, ),  # 3
        (4, TType.STRUCT, 'ae', (apache.airavata.api.error.ttypes.AuthorizationException, apache.airavata.api.error.ttypes.AuthorizationException.thrift_spec), None, ),  # 4
    )

    def __init__(self, success=None, ire=None, ace=None, ase=None, ae=None,):
        self.success = success
        self.ire = ire
        self.ace = ace
        self.ase = ase
        self.ae = ae

    def read(self, iprot):
        if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None:
            iprot._fast_decode(self, iprot, (self.__class__, self.thrift_spec))
            return
        iprot.readStructBegin()
        while True:
            (fname, ftype, fid) = iprot.readFieldBegin()
            if ftype == TType.STOP:
                break
            if fid == 0:
                if ftype == TType.LIST:
                    self.success = []
                    (_etype249, _size246) = iprot.readListBegin()
                    for _i250 in range(_size246):
                        _elem251 = apache.airavata.model.appcatalog.gatewayprofile.ttypes.GatewayResourceProfile()
                        _elem251.read(iprot)
                        self.success.append(_elem251)
                    iprot.readListEnd()
                else:
                    iprot.skip(ftype)
            elif fid == 1:
                if ftype == TType.STRUCT:
                    self.ire = apache.airavata.api.error.ttypes.InvalidRequestException()
                    self.ire.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 2:
                if ftype == TType.STRUCT:
                    self.ace = apache.airavata.api.error.ttypes.AiravataClientException()
                    self.ace.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 3:
                if ftype == TType.STRUCT:
                    self.ase = apache.airavata.api.error.ttypes.AiravataSystemException()
                    self.ase.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 4:
                if ftype == TType.STRUCT:
                    self.ae = apache.airavata.api.error.ttypes.AuthorizationException()
                    self.ae.read(iprot)
                else:
                    iprot.skip(ftype)
            else:
                iprot.skip(ftype)
            iprot.readFieldEnd()
        iprot.readStructEnd()

    def write(self, oprot):
        if oprot._fast_encode is not None and self.thrift_spec is not None:
            oprot.trans.write(oprot._fast_encode(self, (self.__class__, self.thrift_spec)))
            return
        oprot.writeStructBegin('getAllGatewayResourceProfiles_result')
        if self.success is not None:
            oprot.writeFieldBegin('success', TType.LIST, 0)
            oprot.writeListBegin(TType.STRUCT, len(self.success))
            for iter252 in self.success:
                iter252.write(oprot)
            oprot.writeListEnd()
            oprot.writeFieldEnd()
        if self.ire is not None:
            oprot.writeFieldBegin('ire', TType.STRUCT, 1)
            self.ire.write(oprot)
            oprot.writeFieldEnd()
        if self.ace is not None:
            oprot.writeFieldBegin('ace', TType.STRUCT, 2)
            self.ace.write(oprot)
            oprot.writeFieldEnd()
        if self.ase is not None:
            oprot.writeFieldBegin('ase', TType.STRUCT, 3)
            self.ase.write(oprot)
            oprot.writeFieldEnd()
        if self.ae is not None:
            oprot.writeFieldBegin('ae', TType.STRUCT, 4)
            self.ae.write(oprot)
            oprot.writeFieldEnd()
        oprot.writeFieldStop()
        oprot.writeStructEnd()

    def validate(self):
        return

    def __repr__(self):
        L = ['%s=%r' % (key, value)
             for key, value in self.__dict__.items()]
        return '%s(%s)' % (self.__class__.__name__, ', '.join(L))

    def __eq__(self, other):
        return isinstance(other, self.__class__) and self.__dict__ == other.__dict__

    def __ne__(self, other):
        return not (self == other)


class updateGatewayComputeResourcePreference_args(object):
    """
    Attributes:
     - authzToken
     - gatewayID
     - computeResourceId
     - computeResourcePreference
    """

    thrift_spec = (
        None,  # 0
        (1, TType.STRUCT, 'authzToken', (apache.airavata.model.security.ttypes.AuthzToken, apache.airavata.model.security.ttypes.AuthzToken.thrift_spec), None, ),  # 1
        (2, TType.STRING, 'gatewayID', 'UTF8', None, ),  # 2
        (3, TType.STRING, 'computeResourceId', 'UTF8', None, ),  # 3
        (4, TType.STRUCT, 'computeResourcePreference', (apache.airavata.model.appcatalog.gatewayprofile.ttypes.ComputeResourcePreference, apache.airavata.model.appcatalog.gatewayprofile.ttypes.ComputeResourcePreference.thrift_spec), None, ),  # 4
    )

    def __init__(self, authzToken=None, gatewayID=None, computeResourceId=None, computeResourcePreference=None,):
        self.authzToken = authzToken
        self.gatewayID = gatewayID
        self.computeResourceId = computeResourceId
        self.computeResourcePreference = computeResourcePreference

    def read(self, iprot):
        if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None:
            iprot._fast_decode(self, iprot, (self.__class__, self.thrift_spec))
            return
        iprot.readStructBegin()
        while True:
            (fname, ftype, fid) = iprot.readFieldBegin()
            if ftype == TType.STOP:
                break
            if fid == 1:
                if ftype == TType.STRUCT:
                    self.authzToken = apache.airavata.model.security.ttypes.AuthzToken()
                    self.authzToken.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 2:
                if ftype == TType.STRING:
                    self.gatewayID = iprot.readString().decode('utf-8') if sys.version_info[0] == 2 else iprot.readString()
                else:
                    iprot.skip(ftype)
            elif fid == 3:
                if ftype == TType.STRING:
                    self.computeResourceId = iprot.readString().decode('utf-8') if sys.version_info[0] == 2 else iprot.readString()
                else:
                    iprot.skip(ftype)
            elif fid == 4:
                if ftype == TType.STRUCT:
                    self.computeResourcePreference = apache.airavata.model.appcatalog.gatewayprofile.ttypes.ComputeResourcePreference()
                    self.computeResourcePreference.read(iprot)
                else:
                    iprot.skip(ftype)
            else:
                iprot.skip(ftype)
            iprot.readFieldEnd()
        iprot.readStructEnd()

    def write(self, oprot):
        if oprot._fast_encode is not None and self.thrift_spec is not None:
            oprot.trans.write(oprot._fast_encode(self, (self.__class__, self.thrift_spec)))
            return
        oprot.writeStructBegin('updateGatewayComputeResourcePreference_args')
        if self.authzToken is not None:
            oprot.writeFieldBegin('authzToken', TType.STRUCT, 1)
            self.authzToken.write(oprot)
            oprot.writeFieldEnd()
        if self.gatewayID is not None:
            oprot.writeFieldBegin('gatewayID', TType.STRING, 2)
            oprot.writeString(self.gatewayID.encode('utf-8') if sys.version_info[0] == 2 else self.gatewayID)
            oprot.writeFieldEnd()
        if self.computeResourceId is not None:
            oprot.writeFieldBegin('computeResourceId', TType.STRING, 3)
            oprot.writeString(self.computeResourceId.encode('utf-8') if sys.version_info[0] == 2 else self.computeResourceId)
            oprot.writeFieldEnd()
        if self.computeResourcePreference is not None:
            oprot.writeFieldBegin('computeResourcePreference', TType.STRUCT, 4)
            self.computeResourcePreference.write(oprot)
            oprot.writeFieldEnd()
        oprot.writeFieldStop()
        oprot.writeStructEnd()

    def validate(self):
        if self.authzToken is None:
            raise TProtocolException(message='Required field authzToken is unset!')
        if self.gatewayID is None:
            raise TProtocolException(message='Required field gatewayID is unset!')
        if self.computeResourceId is None:
            raise TProtocolException(message='Required field computeResourceId is unset!')
        if self.computeResourcePreference is None:
            raise TProtocolException(message='Required field computeResourcePreference is unset!')
        return

    def __repr__(self):
        L = ['%s=%r' % (key, value)
             for key, value in self.__dict__.items()]
        return '%s(%s)' % (self.__class__.__name__, ', '.join(L))

    def __eq__(self, other):
        return isinstance(other, self.__class__) and self.__dict__ == other.__dict__

    def __ne__(self, other):
        return not (self == other)


class updateGatewayComputeResourcePreference_result(object):
    """
    Attributes:
     - success
     - ire
     - ace
     - ase
     - ae
    """

    thrift_spec = (
        (0, TType.BOOL, 'success', None, None, ),  # 0
        (1, TType.STRUCT, 'ire', (apache.airavata.api.error.ttypes.InvalidRequestException, apache.airavata.api.error.ttypes.InvalidRequestException.thrift_spec), None, ),  # 1
        (2, TType.STRUCT, 'ace', (apache.airavata.api.error.ttypes.AiravataClientException, apache.airavata.api.error.ttypes.AiravataClientException.thrift_spec), None, ),  # 2
        (3, TType.STRUCT, 'ase', (apache.airavata.api.error.ttypes.AiravataSystemException, apache.airavata.api.error.ttypes.AiravataSystemException.thrift_spec), None, ),  # 3
        (4, TType.STRUCT, 'ae', (apache.airavata.api.error.ttypes.AuthorizationException, apache.airavata.api.error.ttypes.AuthorizationException.thrift_spec), None, ),  # 4
    )

    def __init__(self, success=None, ire=None, ace=None, ase=None, ae=None,):
        self.success = success
        self.ire = ire
        self.ace = ace
        self.ase = ase
        self.ae = ae

    def read(self, iprot):
        if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None:
            iprot._fast_decode(self, iprot, (self.__class__, self.thrift_spec))
            return
        iprot.readStructBegin()
        while True:
            (fname, ftype, fid) = iprot.readFieldBegin()
            if ftype == TType.STOP:
                break
            if fid == 0:
                if ftype == TType.BOOL:
                    self.success = iprot.readBool()
                else:
                    iprot.skip(ftype)
            elif fid == 1:
                if ftype == TType.STRUCT:
                    self.ire = apache.airavata.api.error.ttypes.InvalidRequestException()
                    self.ire.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 2:
                if ftype == TType.STRUCT:
                    self.ace = apache.airavata.api.error.ttypes.AiravataClientException()
                    self.ace.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 3:
                if ftype == TType.STRUCT:
                    self.ase = apache.airavata.api.error.ttypes.AiravataSystemException()
                    self.ase.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 4:
                if ftype == TType.STRUCT:
                    self.ae = apache.airavata.api.error.ttypes.AuthorizationException()
                    self.ae.read(iprot)
                else:
                    iprot.skip(ftype)
            else:
                iprot.skip(ftype)
            iprot.readFieldEnd()
        iprot.readStructEnd()

    def write(self, oprot):
        if oprot._fast_encode is not None and self.thrift_spec is not None:
            oprot.trans.write(oprot._fast_encode(self, (self.__class__, self.thrift_spec)))
            return
        oprot.writeStructBegin('updateGatewayComputeResourcePreference_result')
        if self.success is not None:
            oprot.writeFieldBegin('success', TType.BOOL, 0)
            oprot.writeBool(self.success)
            oprot.writeFieldEnd()
        if self.ire is not None:
            oprot.writeFieldBegin('ire', TType.STRUCT, 1)
            self.ire.write(oprot)
            oprot.writeFieldEnd()
        if self.ace is not None:
            oprot.writeFieldBegin('ace', TType.STRUCT, 2)
            self.ace.write(oprot)
            oprot.writeFieldEnd()
        if self.ase is not None:
            oprot.writeFieldBegin('ase', TType.STRUCT, 3)
            self.ase.write(oprot)
            oprot.writeFieldEnd()
        if self.ae is not None:
            oprot.writeFieldBegin('ae', TType.STRUCT, 4)
            self.ae.write(oprot)
            oprot.writeFieldEnd()
        oprot.writeFieldStop()
        oprot.writeStructEnd()

    def validate(self):
        return

    def __repr__(self):
        L = ['%s=%r' % (key, value)
             for key, value in self.__dict__.items()]
        return '%s(%s)' % (self.__class__.__name__, ', '.join(L))

    def __eq__(self, other):
        return isinstance(other, self.__class__) and self.__dict__ == other.__dict__

    def __ne__(self, other):
        return not (self == other)


class updateGatewayStoragePreference_args(object):
    """
    Attributes:
     - authzToken
     - gatewayID
     - storageId
     - storagePreference
    """

    thrift_spec = (
        None,  # 0
        (1, TType.STRUCT, 'authzToken', (apache.airavata.model.security.ttypes.AuthzToken, apache.airavata.model.security.ttypes.AuthzToken.thrift_spec), None, ),  # 1
        (2, TType.STRING, 'gatewayID', 'UTF8', None, ),  # 2
        (3, TType.STRING, 'storageId', 'UTF8', None, ),  # 3
        (4, TType.STRUCT, 'storagePreference', (apache.airavata.model.appcatalog.gatewayprofile.ttypes.StoragePreference, apache.airavata.model.appcatalog.gatewayprofile.ttypes.StoragePreference.thrift_spec), None, ),  # 4
    )

    def __init__(self, authzToken=None, gatewayID=None, storageId=None, storagePreference=None,):
        self.authzToken = authzToken
        self.gatewayID = gatewayID
        self.storageId = storageId
        self.storagePreference = storagePreference

    def read(self, iprot):
        if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None:
            iprot._fast_decode(self, iprot, (self.__class__, self.thrift_spec))
            return
        iprot.readStructBegin()
        while True:
            (fname, ftype, fid) = iprot.readFieldBegin()
            if ftype == TType.STOP:
                break
            if fid == 1:
                if ftype == TType.STRUCT:
                    self.authzToken = apache.airavata.model.security.ttypes.AuthzToken()
                    self.authzToken.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 2:
                if ftype == TType.STRING:
                    self.gatewayID = iprot.readString().decode('utf-8') if sys.version_info[0] == 2 else iprot.readString()
                else:
                    iprot.skip(ftype)
            elif fid == 3:
                if ftype == TType.STRING:
                    self.storageId = iprot.readString().decode('utf-8') if sys.version_info[0] == 2 else iprot.readString()
                else:
                    iprot.skip(ftype)
            elif fid == 4:
                if ftype == TType.STRUCT:
                    self.storagePreference = apache.airavata.model.appcatalog.gatewayprofile.ttypes.StoragePreference()
                    self.storagePreference.read(iprot)
                else:
                    iprot.skip(ftype)
            else:
                iprot.skip(ftype)
            iprot.readFieldEnd()
        iprot.readStructEnd()

    def write(self, oprot):
        if oprot._fast_encode is not None and self.thrift_spec is not None:
            oprot.trans.write(oprot._fast_encode(self, (self.__class__, self.thrift_spec)))
            return
        oprot.writeStructBegin('updateGatewayStoragePreference_args')
        if self.authzToken is not None:
            oprot.writeFieldBegin('authzToken', TType.STRUCT, 1)
            self.authzToken.write(oprot)
            oprot.writeFieldEnd()
        if self.gatewayID is not None:
            oprot.writeFieldBegin('gatewayID', TType.STRING, 2)
            oprot.writeString(self.gatewayID.encode('utf-8') if sys.version_info[0] == 2 else self.gatewayID)
            oprot.writeFieldEnd()
        if self.storageId is not None:
            oprot.writeFieldBegin('storageId', TType.STRING, 3)
            oprot.writeString(self.storageId.encode('utf-8') if sys.version_info[0] == 2 else self.storageId)
            oprot.writeFieldEnd()
        if self.storagePreference is not None:
            oprot.writeFieldBegin('storagePreference', TType.STRUCT, 4)
            self.storagePreference.write(oprot)
            oprot.writeFieldEnd()
        oprot.writeFieldStop()
        oprot.writeStructEnd()

    def validate(self):
        if self.authzToken is None:
            raise TProtocolException(message='Required field authzToken is unset!')
        if self.gatewayID is None:
            raise TProtocolException(message='Required field gatewayID is unset!')
        if self.storageId is None:
            raise TProtocolException(message='Required field storageId is unset!')
        if self.storagePreference is None:
            raise TProtocolException(message='Required field storagePreference is unset!')
        return

    def __repr__(self):
        L = ['%s=%r' % (key, value)
             for key, value in self.__dict__.items()]
        return '%s(%s)' % (self.__class__.__name__, ', '.join(L))

    def __eq__(self, other):
        return isinstance(other, self.__class__) and self.__dict__ == other.__dict__

    def __ne__(self, other):
        return not (self == other)


class updateGatewayStoragePreference_result(object):
    """
    Attributes:
     - success
     - ire
     - ace
     - ase
     - ae
    """

    thrift_spec = (
        (0, TType.BOOL, 'success', None, None, ),  # 0
        (1, TType.STRUCT, 'ire', (apache.airavata.api.error.ttypes.InvalidRequestException, apache.airavata.api.error.ttypes.InvalidRequestException.thrift_spec), None, ),  # 1
        (2, TType.STRUCT, 'ace', (apache.airavata.api.error.ttypes.AiravataClientException, apache.airavata.api.error.ttypes.AiravataClientException.thrift_spec), None, ),  # 2
        (3, TType.STRUCT, 'ase', (apache.airavata.api.error.ttypes.AiravataSystemException, apache.airavata.api.error.ttypes.AiravataSystemException.thrift_spec), None, ),  # 3
        (4, TType.STRUCT, 'ae', (apache.airavata.api.error.ttypes.AuthorizationException, apache.airavata.api.error.ttypes.AuthorizationException.thrift_spec), None, ),  # 4
    )

    def __init__(self, success=None, ire=None, ace=None, ase=None, ae=None,):
        self.success = success
        self.ire = ire
        self.ace = ace
        self.ase = ase
        self.ae = ae

    def read(self, iprot):
        if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None:
            iprot._fast_decode(self, iprot, (self.__class__, self.thrift_spec))
            return
        iprot.readStructBegin()
        while True:
            (fname, ftype, fid) = iprot.readFieldBegin()
            if ftype == TType.STOP:
                break
            if fid == 0:
                if ftype == TType.BOOL:
                    self.success = iprot.readBool()
                else:
                    iprot.skip(ftype)
            elif fid == 1:
                if ftype == TType.STRUCT:
                    self.ire = apache.airavata.api.error.ttypes.InvalidRequestException()
                    self.ire.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 2:
                if ftype == TType.STRUCT:
                    self.ace = apache.airavata.api.error.ttypes.AiravataClientException()
                    self.ace.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 3:
                if ftype == TType.STRUCT:
                    self.ase = apache.airavata.api.error.ttypes.AiravataSystemException()
                    self.ase.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 4:
                if ftype == TType.STRUCT:
                    self.ae = apache.airavata.api.error.ttypes.AuthorizationException()
                    self.ae.read(iprot)
                else:
                    iprot.skip(ftype)
            else:
                iprot.skip(ftype)
            iprot.readFieldEnd()
        iprot.readStructEnd()

    def write(self, oprot):
        if oprot._fast_encode is not None and self.thrift_spec is not None:
            oprot.trans.write(oprot._fast_encode(self, (self.__class__, self.thrift_spec)))
            return
        oprot.writeStructBegin('updateGatewayStoragePreference_result')
        if self.success is not None:
            oprot.writeFieldBegin('success', TType.BOOL, 0)
            oprot.writeBool(self.success)
            oprot.writeFieldEnd()
        if self.ire is not None:
            oprot.writeFieldBegin('ire', TType.STRUCT, 1)
            self.ire.write(oprot)
            oprot.writeFieldEnd()
        if self.ace is not None:
            oprot.writeFieldBegin('ace', TType.STRUCT, 2)
            self.ace.write(oprot)
            oprot.writeFieldEnd()
        if self.ase is not None:
            oprot.writeFieldBegin('ase', TType.STRUCT, 3)
            self.ase.write(oprot)
            oprot.writeFieldEnd()
        if self.ae is not None:
            oprot.writeFieldBegin('ae', TType.STRUCT, 4)
            self.ae.write(oprot)
            oprot.writeFieldEnd()
        oprot.writeFieldStop()
        oprot.writeStructEnd()

    def validate(self):
        return

    def __repr__(self):
        L = ['%s=%r' % (key, value)
             for key, value in self.__dict__.items()]
        return '%s(%s)' % (self.__class__.__name__, ', '.join(L))

    def __eq__(self, other):
        return isinstance(other, self.__class__) and self.__dict__ == other.__dict__

    def __ne__(self, other):
        return not (self == other)


class deleteGatewayComputeResourcePreference_args(object):
    """
    Attributes:
     - authzToken
     - gatewayID
     - computeResourceId
    """

    thrift_spec = (
        None,  # 0
        (1, TType.STRUCT, 'authzToken', (apache.airavata.model.security.ttypes.AuthzToken, apache.airavata.model.security.ttypes.AuthzToken.thrift_spec), None, ),  # 1
        (2, TType.STRING, 'gatewayID', 'UTF8', None, ),  # 2
        (3, TType.STRING, 'computeResourceId', 'UTF8', None, ),  # 3
    )

    def __init__(self, authzToken=None, gatewayID=None, computeResourceId=None,):
        self.authzToken = authzToken
        self.gatewayID = gatewayID
        self.computeResourceId = computeResourceId

    def read(self, iprot):
        if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None:
            iprot._fast_decode(self, iprot, (self.__class__, self.thrift_spec))
            return
        iprot.readStructBegin()
        while True:
            (fname, ftype, fid) = iprot.readFieldBegin()
            if ftype == TType.STOP:
                break
            if fid == 1:
                if ftype == TType.STRUCT:
                    self.authzToken = apache.airavata.model.security.ttypes.AuthzToken()
                    self.authzToken.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 2:
                if ftype == TType.STRING:
                    self.gatewayID = iprot.readString().decode('utf-8') if sys.version_info[0] == 2 else iprot.readString()
                else:
                    iprot.skip(ftype)
            elif fid == 3:
                if ftype == TType.STRING:
                    self.computeResourceId = iprot.readString().decode('utf-8') if sys.version_info[0] == 2 else iprot.readString()
                else:
                    iprot.skip(ftype)
            else:
                iprot.skip(ftype)
            iprot.readFieldEnd()
        iprot.readStructEnd()

    def write(self, oprot):
        if oprot._fast_encode is not None and self.thrift_spec is not None:
            oprot.trans.write(oprot._fast_encode(self, (self.__class__, self.thrift_spec)))
            return
        oprot.writeStructBegin('deleteGatewayComputeResourcePreference_args')
        if self.authzToken is not None:
            oprot.writeFieldBegin('authzToken', TType.STRUCT, 1)
            self.authzToken.write(oprot)
            oprot.writeFieldEnd()
        if self.gatewayID is not None:
            oprot.writeFieldBegin('gatewayID', TType.STRING, 2)
            oprot.writeString(self.gatewayID.encode('utf-8') if sys.version_info[0] == 2 else self.gatewayID)
            oprot.writeFieldEnd()
        if self.computeResourceId is not None:
            oprot.writeFieldBegin('computeResourceId', TType.STRING, 3)
            oprot.writeString(self.computeResourceId.encode('utf-8') if sys.version_info[0] == 2 else self.computeResourceId)
            oprot.writeFieldEnd()
        oprot.writeFieldStop()
        oprot.writeStructEnd()

    def validate(self):
        if self.authzToken is None:
            raise TProtocolException(message='Required field authzToken is unset!')
        if self.gatewayID is None:
            raise TProtocolException(message='Required field gatewayID is unset!')
        if self.computeResourceId is None:
            raise TProtocolException(message='Required field computeResourceId is unset!')
        return

    def __repr__(self):
        L = ['%s=%r' % (key, value)
             for key, value in self.__dict__.items()]
        return '%s(%s)' % (self.__class__.__name__, ', '.join(L))

    def __eq__(self, other):
        return isinstance(other, self.__class__) and self.__dict__ == other.__dict__

    def __ne__(self, other):
        return not (self == other)


class deleteGatewayComputeResourcePreference_result(object):
    """
    Attributes:
     - success
     - ire
     - ace
     - ase
     - ae
    """

    thrift_spec = (
        (0, TType.BOOL, 'success', None, None, ),  # 0
        (1, TType.STRUCT, 'ire', (apache.airavata.api.error.ttypes.InvalidRequestException, apache.airavata.api.error.ttypes.InvalidRequestException.thrift_spec), None, ),  # 1
        (2, TType.STRUCT, 'ace', (apache.airavata.api.error.ttypes.AiravataClientException, apache.airavata.api.error.ttypes.AiravataClientException.thrift_spec), None, ),  # 2
        (3, TType.STRUCT, 'ase', (apache.airavata.api.error.ttypes.AiravataSystemException, apache.airavata.api.error.ttypes.AiravataSystemException.thrift_spec), None, ),  # 3
        (4, TType.STRUCT, 'ae', (apache.airavata.api.error.ttypes.AuthorizationException, apache.airavata.api.error.ttypes.AuthorizationException.thrift_spec), None, ),  # 4
    )

    def __init__(self, success=None, ire=None, ace=None, ase=None, ae=None,):
        self.success = success
        self.ire = ire
        self.ace = ace
        self.ase = ase
        self.ae = ae

    def read(self, iprot):
        if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None:
            iprot._fast_decode(self, iprot, (self.__class__, self.thrift_spec))
            return
        iprot.readStructBegin()
        while True:
            (fname, ftype, fid) = iprot.readFieldBegin()
            if ftype == TType.STOP:
                break
            if fid == 0:
                if ftype == TType.BOOL:
                    self.success = iprot.readBool()
                else:
                    iprot.skip(ftype)
            elif fid == 1:
                if ftype == TType.STRUCT:
                    self.ire = apache.airavata.api.error.ttypes.InvalidRequestException()
                    self.ire.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 2:
                if ftype == TType.STRUCT:
                    self.ace = apache.airavata.api.error.ttypes.AiravataClientException()
                    self.ace.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 3:
                if ftype == TType.STRUCT:
                    self.ase = apache.airavata.api.error.ttypes.AiravataSystemException()
                    self.ase.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 4:
                if ftype == TType.STRUCT:
                    self.ae = apache.airavata.api.error.ttypes.AuthorizationException()
                    self.ae.read(iprot)
                else:
                    iprot.skip(ftype)
            else:
                iprot.skip(ftype)
            iprot.readFieldEnd()
        iprot.readStructEnd()

    def write(self, oprot):
        if oprot._fast_encode is not None and self.thrift_spec is not None:
            oprot.trans.write(oprot._fast_encode(self, (self.__class__, self.thrift_spec)))
            return
        oprot.writeStructBegin('deleteGatewayComputeResourcePreference_result')
        if self.success is not None:
            oprot.writeFieldBegin('success', TType.BOOL, 0)
            oprot.writeBool(self.success)
            oprot.writeFieldEnd()
        if self.ire is not None:
            oprot.writeFieldBegin('ire', TType.STRUCT, 1)
            self.ire.write(oprot)
            oprot.writeFieldEnd()
        if self.ace is not None:
            oprot.writeFieldBegin('ace', TType.STRUCT, 2)
            self.ace.write(oprot)
            oprot.writeFieldEnd()
        if self.ase is not None:
            oprot.writeFieldBegin('ase', TType.STRUCT, 3)
            self.ase.write(oprot)
            oprot.writeFieldEnd()
        if self.ae is not None:
            oprot.writeFieldBegin('ae', TType.STRUCT, 4)
            self.ae.write(oprot)
            oprot.writeFieldEnd()
        oprot.writeFieldStop()
        oprot.writeStructEnd()

    def validate(self):
        return

    def __repr__(self):
        L = ['%s=%r' % (key, value)
             for key, value in self.__dict__.items()]
        return '%s(%s)' % (self.__class__.__name__, ', '.join(L))

    def __eq__(self, other):
        return isinstance(other, self.__class__) and self.__dict__ == other.__dict__

    def __ne__(self, other):
        return not (self == other)


class deleteGatewayStoragePreference_args(object):
    """
    Attributes:
     - authzToken
     - gatewayID
     - storageId
    """

    thrift_spec = (
        None,  # 0
        (1, TType.STRUCT, 'authzToken', (apache.airavata.model.security.ttypes.AuthzToken, apache.airavata.model.security.ttypes.AuthzToken.thrift_spec), None, ),  # 1
        (2, TType.STRING, 'gatewayID', 'UTF8', None, ),  # 2
        (3, TType.STRING, 'storageId', 'UTF8', None, ),  # 3
    )

    def __init__(self, authzToken=None, gatewayID=None, storageId=None,):
        self.authzToken = authzToken
        self.gatewayID = gatewayID
        self.storageId = storageId

    def read(self, iprot):
        if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None:
            iprot._fast_decode(self, iprot, (self.__class__, self.thrift_spec))
            return
        iprot.readStructBegin()
        while True:
            (fname, ftype, fid) = iprot.readFieldBegin()
            if ftype == TType.STOP:
                break
            if fid == 1:
                if ftype == TType.STRUCT:
                    self.authzToken = apache.airavata.model.security.ttypes.AuthzToken()
                    self.authzToken.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 2:
                if ftype == TType.STRING:
                    self.gatewayID = iprot.readString().decode('utf-8') if sys.version_info[0] == 2 else iprot.readString()
                else:
                    iprot.skip(ftype)
            elif fid == 3:
                if ftype == TType.STRING:
                    self.storageId = iprot.readString().decode('utf-8') if sys.version_info[0] == 2 else iprot.readString()
                else:
                    iprot.skip(ftype)
            else:
                iprot.skip(ftype)
            iprot.readFieldEnd()
        iprot.readStructEnd()

    def write(self, oprot):
        if oprot._fast_encode is not None and self.thrift_spec is not None:
            oprot.trans.write(oprot._fast_encode(self, (self.__class__, self.thrift_spec)))
            return
        oprot.writeStructBegin('deleteGatewayStoragePreference_args')
        if self.authzToken is not None:
            oprot.writeFieldBegin('authzToken', TType.STRUCT, 1)
            self.authzToken.write(oprot)
            oprot.writeFieldEnd()
        if self.gatewayID is not None:
            oprot.writeFieldBegin('gatewayID', TType.STRING, 2)
            oprot.writeString(self.gatewayID.encode('utf-8') if sys.version_info[0] == 2 else self.gatewayID)
            oprot.writeFieldEnd()
        if self.storageId is not None:
            oprot.writeFieldBegin('storageId', TType.STRING, 3)
            oprot.writeString(self.storageId.encode('utf-8') if sys.version_info[0] == 2 else self.storageId)
            oprot.writeFieldEnd()
        oprot.writeFieldStop()
        oprot.writeStructEnd()

    def validate(self):
        if self.authzToken is None:
            raise TProtocolException(message='Required field authzToken is unset!')
        if self.gatewayID is None:
            raise TProtocolException(message='Required field gatewayID is unset!')
        if self.storageId is None:
            raise TProtocolException(message='Required field storageId is unset!')
        return

    def __repr__(self):
        L = ['%s=%r' % (key, value)
             for key, value in self.__dict__.items()]
        return '%s(%s)' % (self.__class__.__name__, ', '.join(L))

    def __eq__(self, other):
        return isinstance(other, self.__class__) and self.__dict__ == other.__dict__

    def __ne__(self, other):
        return not (self == other)


class deleteGatewayStoragePreference_result(object):
    """
    Attributes:
     - success
     - ire
     - ace
     - ase
     - ae
    """

    thrift_spec = (
        (0, TType.BOOL, 'success', None, None, ),  # 0
        (1, TType.STRUCT, 'ire', (apache.airavata.api.error.ttypes.InvalidRequestException, apache.airavata.api.error.ttypes.InvalidRequestException.thrift_spec), None, ),  # 1
        (2, TType.STRUCT, 'ace', (apache.airavata.api.error.ttypes.AiravataClientException, apache.airavata.api.error.ttypes.AiravataClientException.thrift_spec), None, ),  # 2
        (3, TType.STRUCT, 'ase', (apache.airavata.api.error.ttypes.AiravataSystemException, apache.airavata.api.error.ttypes.AiravataSystemException.thrift_spec), None, ),  # 3
        (4, TType.STRUCT, 'ae', (apache.airavata.api.error.ttypes.AuthorizationException, apache.airavata.api.error.ttypes.AuthorizationException.thrift_spec), None, ),  # 4
    )

    def __init__(self, success=None, ire=None, ace=None, ase=None, ae=None,):
        self.success = success
        self.ire = ire
        self.ace = ace
        self.ase = ase
        self.ae = ae

    def read(self, iprot):
        if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None:
            iprot._fast_decode(self, iprot, (self.__class__, self.thrift_spec))
            return
        iprot.readStructBegin()
        while True:
            (fname, ftype, fid) = iprot.readFieldBegin()
            if ftype == TType.STOP:
                break
            if fid == 0:
                if ftype == TType.BOOL:
                    self.success = iprot.readBool()
                else:
                    iprot.skip(ftype)
            elif fid == 1:
                if ftype == TType.STRUCT:
                    self.ire = apache.airavata.api.error.ttypes.InvalidRequestException()
                    self.ire.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 2:
                if ftype == TType.STRUCT:
                    self.ace = apache.airavata.api.error.ttypes.AiravataClientException()
                    self.ace.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 3:
                if ftype == TType.STRUCT:
                    self.ase = apache.airavata.api.error.ttypes.AiravataSystemException()
                    self.ase.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 4:
                if ftype == TType.STRUCT:
                    self.ae = apache.airavata.api.error.ttypes.AuthorizationException()
                    self.ae.read(iprot)
                else:
                    iprot.skip(ftype)
            else:
                iprot.skip(ftype)
            iprot.readFieldEnd()
        iprot.readStructEnd()

    def write(self, oprot):
        if oprot._fast_encode is not None and self.thrift_spec is not None:
            oprot.trans.write(oprot._fast_encode(self, (self.__class__, self.thrift_spec)))
            return
        oprot.writeStructBegin('deleteGatewayStoragePreference_result')
        if self.success is not None:
            oprot.writeFieldBegin('success', TType.BOOL, 0)
            oprot.writeBool(self.success)
            oprot.writeFieldEnd()
        if self.ire is not None:
            oprot.writeFieldBegin('ire', TType.STRUCT, 1)
            self.ire.write(oprot)
            oprot.writeFieldEnd()
        if self.ace is not None:
            oprot.writeFieldBegin('ace', TType.STRUCT, 2)
            self.ace.write(oprot)
            oprot.writeFieldEnd()
        if self.ase is not None:
            oprot.writeFieldBegin('ase', TType.STRUCT, 3)
            self.ase.write(oprot)
            oprot.writeFieldEnd()
        if self.ae is not None:
            oprot.writeFieldBegin('ae', TType.STRUCT, 4)
            self.ae.write(oprot)
            oprot.writeFieldEnd()
        oprot.writeFieldStop()
        oprot.writeStructEnd()

    def validate(self):
        return

    def __repr__(self):
        L = ['%s=%r' % (key, value)
             for key, value in self.__dict__.items()]
        return '%s(%s)' % (self.__class__.__name__, ', '.join(L))

    def __eq__(self, other):
        return isinstance(other, self.__class__) and self.__dict__ == other.__dict__

    def __ne__(self, other):
        return not (self == other)


class registerUserResourceProfile_args(object):
    """
    Attributes:
     - authzToken
     - userResourceProfile
    """

    thrift_spec = (
        None,  # 0
        (1, TType.STRUCT, 'authzToken', (apache.airavata.model.security.ttypes.AuthzToken, apache.airavata.model.security.ttypes.AuthzToken.thrift_spec), None, ),  # 1
        (2, TType.STRUCT, 'userResourceProfile', (apache.airavata.model.appcatalog.userresourceprofile.ttypes.UserResourceProfile, apache.airavata.model.appcatalog.userresourceprofile.ttypes.UserResourceProfile.thrift_spec), None, ),  # 2
    )

    def __init__(self, authzToken=None, userResourceProfile=None,):
        self.authzToken = authzToken
        self.userResourceProfile = userResourceProfile

    def read(self, iprot):
        if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None:
            iprot._fast_decode(self, iprot, (self.__class__, self.thrift_spec))
            return
        iprot.readStructBegin()
        while True:
            (fname, ftype, fid) = iprot.readFieldBegin()
            if ftype == TType.STOP:
                break
            if fid == 1:
                if ftype == TType.STRUCT:
                    self.authzToken = apache.airavata.model.security.ttypes.AuthzToken()
                    self.authzToken.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 2:
                if ftype == TType.STRUCT:
                    self.userResourceProfile = apache.airavata.model.appcatalog.userresourceprofile.ttypes.UserResourceProfile()
                    self.userResourceProfile.read(iprot)
                else:
                    iprot.skip(ftype)
            else:
                iprot.skip(ftype)
            iprot.readFieldEnd()
        iprot.readStructEnd()

    def write(self, oprot):
        if oprot._fast_encode is not None and self.thrift_spec is not None:
            oprot.trans.write(oprot._fast_encode(self, (self.__class__, self.thrift_spec)))
            return
        oprot.writeStructBegin('registerUserResourceProfile_args')
        if self.authzToken is not None:
            oprot.writeFieldBegin('authzToken', TType.STRUCT, 1)
            self.authzToken.write(oprot)
            oprot.writeFieldEnd()
        if self.userResourceProfile is not None:
            oprot.writeFieldBegin('userResourceProfile', TType.STRUCT, 2)
            self.userResourceProfile.write(oprot)
            oprot.writeFieldEnd()
        oprot.writeFieldStop()
        oprot.writeStructEnd()

    def validate(self):
        if self.authzToken is None:
            raise TProtocolException(message='Required field authzToken is unset!')
        if self.userResourceProfile is None:
            raise TProtocolException(message='Required field userResourceProfile is unset!')
        return

    def __repr__(self):
        L = ['%s=%r' % (key, value)
             for key, value in self.__dict__.items()]
        return '%s(%s)' % (self.__class__.__name__, ', '.join(L))

    def __eq__(self, other):
        return isinstance(other, self.__class__) and self.__dict__ == other.__dict__

    def __ne__(self, other):
        return not (self == other)


class registerUserResourceProfile_result(object):
    """
    Attributes:
     - success
     - ire
     - ace
     - ase
     - ae
    """

    thrift_spec = (
        (0, TType.STRING, 'success', 'UTF8', None, ),  # 0
        (1, TType.STRUCT, 'ire', (apache.airavata.api.error.ttypes.InvalidRequestException, apache.airavata.api.error.ttypes.InvalidRequestException.thrift_spec), None, ),  # 1
        (2, TType.STRUCT, 'ace', (apache.airavata.api.error.ttypes.AiravataClientException, apache.airavata.api.error.ttypes.AiravataClientException.thrift_spec), None, ),  # 2
        (3, TType.STRUCT, 'ase', (apache.airavata.api.error.ttypes.AiravataSystemException, apache.airavata.api.error.ttypes.AiravataSystemException.thrift_spec), None, ),  # 3
        (4, TType.STRUCT, 'ae', (apache.airavata.api.error.ttypes.AuthorizationException, apache.airavata.api.error.ttypes.AuthorizationException.thrift_spec), None, ),  # 4
    )

    def __init__(self, success=None, ire=None, ace=None, ase=None, ae=None,):
        self.success = success
        self.ire = ire
        self.ace = ace
        self.ase = ase
        self.ae = ae

    def read(self, iprot):
        if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None:
            iprot._fast_decode(self, iprot, (self.__class__, self.thrift_spec))
            return
        iprot.readStructBegin()
        while True:
            (fname, ftype, fid) = iprot.readFieldBegin()
            if ftype == TType.STOP:
                break
            if fid == 0:
                if ftype == TType.STRING:
                    self.success = iprot.readString().decode('utf-8') if sys.version_info[0] == 2 else iprot.readString()
                else:
                    iprot.skip(ftype)
            elif fid == 1:
                if ftype == TType.STRUCT:
                    self.ire = apache.airavata.api.error.ttypes.InvalidRequestException()
                    self.ire.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 2:
                if ftype == TType.STRUCT:
                    self.ace = apache.airavata.api.error.ttypes.AiravataClientException()
                    self.ace.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 3:
                if ftype == TType.STRUCT:
                    self.ase = apache.airavata.api.error.ttypes.AiravataSystemException()
                    self.ase.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 4:
                if ftype == TType.STRUCT:
                    self.ae = apache.airavata.api.error.ttypes.AuthorizationException()
                    self.ae.read(iprot)
                else:
                    iprot.skip(ftype)
            else:
                iprot.skip(ftype)
            iprot.readFieldEnd()
        iprot.readStructEnd()

    def write(self, oprot):
        if oprot._fast_encode is not None and self.thrift_spec is not None:
            oprot.trans.write(oprot._fast_encode(self, (self.__class__, self.thrift_spec)))
            return
        oprot.writeStructBegin('registerUserResourceProfile_result')
        if self.success is not None:
            oprot.writeFieldBegin('success', TType.STRING, 0)
            oprot.writeString(self.success.encode('utf-8') if sys.version_info[0] == 2 else self.success)
            oprot.writeFieldEnd()
        if self.ire is not None:
            oprot.writeFieldBegin('ire', TType.STRUCT, 1)
            self.ire.write(oprot)
            oprot.writeFieldEnd()
        if self.ace is not None:
            oprot.writeFieldBegin('ace', TType.STRUCT, 2)
            self.ace.write(oprot)
            oprot.writeFieldEnd()
        if self.ase is not None:
            oprot.writeFieldBegin('ase', TType.STRUCT, 3)
            self.ase.write(oprot)
            oprot.writeFieldEnd()
        if self.ae is not None:
            oprot.writeFieldBegin('ae', TType.STRUCT, 4)
            self.ae.write(oprot)
            oprot.writeFieldEnd()
        oprot.writeFieldStop()
        oprot.writeStructEnd()

    def validate(self):
        return

    def __repr__(self):
        L = ['%s=%r' % (key, value)
             for key, value in self.__dict__.items()]
        return '%s(%s)' % (self.__class__.__name__, ', '.join(L))

    def __eq__(self, other):
        return isinstance(other, self.__class__) and self.__dict__ == other.__dict__

    def __ne__(self, other):
        return not (self == other)


class getUserResourceProfile_args(object):
    """
    Attributes:
     - authzToken
     - userId
     - gatewayID
    """

    thrift_spec = (
        None,  # 0
        (1, TType.STRUCT, 'authzToken', (apache.airavata.model.security.ttypes.AuthzToken, apache.airavata.model.security.ttypes.AuthzToken.thrift_spec), None, ),  # 1
        (2, TType.STRING, 'userId', 'UTF8', None, ),  # 2
        (3, TType.STRING, 'gatewayID', 'UTF8', None, ),  # 3
    )

    def __init__(self, authzToken=None, userId=None, gatewayID=None,):
        self.authzToken = authzToken
        self.userId = userId
        self.gatewayID = gatewayID

    def read(self, iprot):
        if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None:
            iprot._fast_decode(self, iprot, (self.__class__, self.thrift_spec))
            return
        iprot.readStructBegin()
        while True:
            (fname, ftype, fid) = iprot.readFieldBegin()
            if ftype == TType.STOP:
                break
            if fid == 1:
                if ftype == TType.STRUCT:
                    self.authzToken = apache.airavata.model.security.ttypes.AuthzToken()
                    self.authzToken.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 2:
                if ftype == TType.STRING:
                    self.userId = iprot.readString().decode('utf-8') if sys.version_info[0] == 2 else iprot.readString()
                else:
                    iprot.skip(ftype)
            elif fid == 3:
                if ftype == TType.STRING:
                    self.gatewayID = iprot.readString().decode('utf-8') if sys.version_info[0] == 2 else iprot.readString()
                else:
                    iprot.skip(ftype)
            else:
                iprot.skip(ftype)
            iprot.readFieldEnd()
        iprot.readStructEnd()

    def write(self, oprot):
        if oprot._fast_encode is not None and self.thrift_spec is not None:
            oprot.trans.write(oprot._fast_encode(self, (self.__class__, self.thrift_spec)))
            return
        oprot.writeStructBegin('getUserResourceProfile_args')
        if self.authzToken is not None:
            oprot.writeFieldBegin('authzToken', TType.STRUCT, 1)
            self.authzToken.write(oprot)
            oprot.writeFieldEnd()
        if self.userId is not None:
            oprot.writeFieldBegin('userId', TType.STRING, 2)
            oprot.writeString(self.userId.encode('utf-8') if sys.version_info[0] == 2 else self.userId)
            oprot.writeFieldEnd()
        if self.gatewayID is not None:
            oprot.writeFieldBegin('gatewayID', TType.STRING, 3)
            oprot.writeString(self.gatewayID.encode('utf-8') if sys.version_info[0] == 2 else self.gatewayID)
            oprot.writeFieldEnd()
        oprot.writeFieldStop()
        oprot.writeStructEnd()

    def validate(self):
        if self.authzToken is None:
            raise TProtocolException(message='Required field authzToken is unset!')
        if self.userId is None:
            raise TProtocolException(message='Required field userId is unset!')
        if self.gatewayID is None:
            raise TProtocolException(message='Required field gatewayID is unset!')
        return

    def __repr__(self):
        L = ['%s=%r' % (key, value)
             for key, value in self.__dict__.items()]
        return '%s(%s)' % (self.__class__.__name__, ', '.join(L))

    def __eq__(self, other):
        return isinstance(other, self.__class__) and self.__dict__ == other.__dict__

    def __ne__(self, other):
        return not (self == other)


class getUserResourceProfile_result(object):
    """
    Attributes:
     - success
     - ire
     - ace
     - ase
     - ae
    """

    thrift_spec = (
        (0, TType.STRUCT, 'success', (apache.airavata.model.appcatalog.userresourceprofile.ttypes.UserResourceProfile, apache.airavata.model.appcatalog.userresourceprofile.ttypes.UserResourceProfile.thrift_spec), None, ),  # 0
        (1, TType.STRUCT, 'ire', (apache.airavata.api.error.ttypes.InvalidRequestException, apache.airavata.api.error.ttypes.InvalidRequestException.thrift_spec), None, ),  # 1
        (2, TType.STRUCT, 'ace', (apache.airavata.api.error.ttypes.AiravataClientException, apache.airavata.api.error.ttypes.AiravataClientException.thrift_spec), None, ),  # 2
        (3, TType.STRUCT, 'ase', (apache.airavata.api.error.ttypes.AiravataSystemException, apache.airavata.api.error.ttypes.AiravataSystemException.thrift_spec), None, ),  # 3
        (4, TType.STRUCT, 'ae', (apache.airavata.api.error.ttypes.AuthorizationException, apache.airavata.api.error.ttypes.AuthorizationException.thrift_spec), None, ),  # 4
    )

    def __init__(self, success=None, ire=None, ace=None, ase=None, ae=None,):
        self.success = success
        self.ire = ire
        self.ace = ace
        self.ase = ase
        self.ae = ae

    def read(self, iprot):
        if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None:
            iprot._fast_decode(self, iprot, (self.__class__, self.thrift_spec))
            return
        iprot.readStructBegin()
        while True:
            (fname, ftype, fid) = iprot.readFieldBegin()
            if ftype == TType.STOP:
                break
            if fid == 0:
                if ftype == TType.STRUCT:
                    self.success = apache.airavata.model.appcatalog.userresourceprofile.ttypes.UserResourceProfile()
                    self.success.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 1:
                if ftype == TType.STRUCT:
                    self.ire = apache.airavata.api.error.ttypes.InvalidRequestException()
                    self.ire.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 2:
                if ftype == TType.STRUCT:
                    self.ace = apache.airavata.api.error.ttypes.AiravataClientException()
                    self.ace.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 3:
                if ftype == TType.STRUCT:
                    self.ase = apache.airavata.api.error.ttypes.AiravataSystemException()
                    self.ase.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 4:
                if ftype == TType.STRUCT:
                    self.ae = apache.airavata.api.error.ttypes.AuthorizationException()
                    self.ae.read(iprot)
                else:
                    iprot.skip(ftype)
            else:
                iprot.skip(ftype)
            iprot.readFieldEnd()
        iprot.readStructEnd()

    def write(self, oprot):
        if oprot._fast_encode is not None and self.thrift_spec is not None:
            oprot.trans.write(oprot._fast_encode(self, (self.__class__, self.thrift_spec)))
            return
        oprot.writeStructBegin('getUserResourceProfile_result')
        if self.success is not None:
            oprot.writeFieldBegin('success', TType.STRUCT, 0)
            self.success.write(oprot)
            oprot.writeFieldEnd()
        if self.ire is not None:
            oprot.writeFieldBegin('ire', TType.STRUCT, 1)
            self.ire.write(oprot)
            oprot.writeFieldEnd()
        if self.ace is not None:
            oprot.writeFieldBegin('ace', TType.STRUCT, 2)
            self.ace.write(oprot)
            oprot.writeFieldEnd()
        if self.ase is not None:
            oprot.writeFieldBegin('ase', TType.STRUCT, 3)
            self.ase.write(oprot)
            oprot.writeFieldEnd()
        if self.ae is not None:
            oprot.writeFieldBegin('ae', TType.STRUCT, 4)
            self.ae.write(oprot)
            oprot.writeFieldEnd()
        oprot.writeFieldStop()
        oprot.writeStructEnd()

    def validate(self):
        return

    def __repr__(self):
        L = ['%s=%r' % (key, value)
             for key, value in self.__dict__.items()]
        return '%s(%s)' % (self.__class__.__name__, ', '.join(L))

    def __eq__(self, other):
        return isinstance(other, self.__class__) and self.__dict__ == other.__dict__

    def __ne__(self, other):
        return not (self == other)


class updateUserResourceProfile_args(object):
    """
    Attributes:
     - authzToken
     - userId
     - gatewayID
     - userResourceProfile
    """

    thrift_spec = (
        None,  # 0
        (1, TType.STRUCT, 'authzToken', (apache.airavata.model.security.ttypes.AuthzToken, apache.airavata.model.security.ttypes.AuthzToken.thrift_spec), None, ),  # 1
        (2, TType.STRING, 'userId', 'UTF8', None, ),  # 2
        (3, TType.STRING, 'gatewayID', 'UTF8', None, ),  # 3
        (4, TType.STRUCT, 'userResourceProfile', (apache.airavata.model.appcatalog.userresourceprofile.ttypes.UserResourceProfile, apache.airavata.model.appcatalog.userresourceprofile.ttypes.UserResourceProfile.thrift_spec), None, ),  # 4
    )

    def __init__(self, authzToken=None, userId=None, gatewayID=None, userResourceProfile=None,):
        self.authzToken = authzToken
        self.userId = userId
        self.gatewayID = gatewayID
        self.userResourceProfile = userResourceProfile

    def read(self, iprot):
        if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None:
            iprot._fast_decode(self, iprot, (self.__class__, self.thrift_spec))
            return
        iprot.readStructBegin()
        while True:
            (fname, ftype, fid) = iprot.readFieldBegin()
            if ftype == TType.STOP:
                break
            if fid == 1:
                if ftype == TType.STRUCT:
                    self.authzToken = apache.airavata.model.security.ttypes.AuthzToken()
                    self.authzToken.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 2:
                if ftype == TType.STRING:
                    self.userId = iprot.readString().decode('utf-8') if sys.version_info[0] == 2 else iprot.readString()
                else:
                    iprot.skip(ftype)
            elif fid == 3:
                if ftype == TType.STRING:
                    self.gatewayID = iprot.readString().decode('utf-8') if sys.version_info[0] == 2 else iprot.readString()
                else:
                    iprot.skip(ftype)
            elif fid == 4:
                if ftype == TType.STRUCT:
                    self.userResourceProfile = apache.airavata.model.appcatalog.userresourceprofile.ttypes.UserResourceProfile()
                    self.userResourceProfile.read(iprot)
                else:
                    iprot.skip(ftype)
            else:
                iprot.skip(ftype)
            iprot.readFieldEnd()
        iprot.readStructEnd()

    def write(self, oprot):
        if oprot._fast_encode is not None and self.thrift_spec is not None:
            oprot.trans.write(oprot._fast_encode(self, (self.__class__, self.thrift_spec)))
            return
        oprot.writeStructBegin('updateUserResourceProfile_args')
        if self.authzToken is not None:
            oprot.writeFieldBegin('authzToken', TType.STRUCT, 1)
            self.authzToken.write(oprot)
            oprot.writeFieldEnd()
        if self.userId is not None:
            oprot.writeFieldBegin('userId', TType.STRING, 2)
            oprot.writeString(self.userId.encode('utf-8') if sys.version_info[0] == 2 else self.userId)
            oprot.writeFieldEnd()
        if self.gatewayID is not None:
            oprot.writeFieldBegin('gatewayID', TType.STRING, 3)
            oprot.writeString(self.gatewayID.encode('utf-8') if sys.version_info[0] == 2 else self.gatewayID)
            oprot.writeFieldEnd()
        if self.userResourceProfile is not None:
            oprot.writeFieldBegin('userResourceProfile', TType.STRUCT, 4)
            self.userResourceProfile.write(oprot)
            oprot.writeFieldEnd()
        oprot.writeFieldStop()
        oprot.writeStructEnd()

    def validate(self):
        if self.authzToken is None:
            raise TProtocolException(message='Required field authzToken is unset!')
        if self.userId is None:
            raise TProtocolException(message='Required field userId is unset!')
        if self.gatewayID is None:
            raise TProtocolException(message='Required field gatewayID is unset!')
        if self.userResourceProfile is None:
            raise TProtocolException(message='Required field userResourceProfile is unset!')
        return

    def __repr__(self):
        L = ['%s=%r' % (key, value)
             for key, value in self.__dict__.items()]
        return '%s(%s)' % (self.__class__.__name__, ', '.join(L))

    def __eq__(self, other):
        return isinstance(other, self.__class__) and self.__dict__ == other.__dict__

    def __ne__(self, other):
        return not (self == other)


class updateUserResourceProfile_result(object):
    """
    Attributes:
     - success
     - ire
     - ace
     - ase
     - ae
    """

    thrift_spec = (
        (0, TType.BOOL, 'success', None, None, ),  # 0
        (1, TType.STRUCT, 'ire', (apache.airavata.api.error.ttypes.InvalidRequestException, apache.airavata.api.error.ttypes.InvalidRequestException.thrift_spec), None, ),  # 1
        (2, TType.STRUCT, 'ace', (apache.airavata.api.error.ttypes.AiravataClientException, apache.airavata.api.error.ttypes.AiravataClientException.thrift_spec), None, ),  # 2
        (3, TType.STRUCT, 'ase', (apache.airavata.api.error.ttypes.AiravataSystemException, apache.airavata.api.error.ttypes.AiravataSystemException.thrift_spec), None, ),  # 3
        (4, TType.STRUCT, 'ae', (apache.airavata.api.error.ttypes.AuthorizationException, apache.airavata.api.error.ttypes.AuthorizationException.thrift_spec), None, ),  # 4
    )

    def __init__(self, success=None, ire=None, ace=None, ase=None, ae=None,):
        self.success = success
        self.ire = ire
        self.ace = ace
        self.ase = ase
        self.ae = ae

    def read(self, iprot):
        if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None:
            iprot._fast_decode(self, iprot, (self.__class__, self.thrift_spec))
            return
        iprot.readStructBegin()
        while True:
            (fname, ftype, fid) = iprot.readFieldBegin()
            if ftype == TType.STOP:
                break
            if fid == 0:
                if ftype == TType.BOOL:
                    self.success = iprot.readBool()
                else:
                    iprot.skip(ftype)
            elif fid == 1:
                if ftype == TType.STRUCT:
                    self.ire = apache.airavata.api.error.ttypes.InvalidRequestException()
                    self.ire.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 2:
                if ftype == TType.STRUCT:
                    self.ace = apache.airavata.api.error.ttypes.AiravataClientException()
                    self.ace.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 3:
                if ftype == TType.STRUCT:
                    self.ase = apache.airavata.api.error.ttypes.AiravataSystemException()
                    self.ase.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 4:
                if ftype == TType.STRUCT:
                    self.ae = apache.airavata.api.error.ttypes.AuthorizationException()
                    self.ae.read(iprot)
                else:
                    iprot.skip(ftype)
            else:
                iprot.skip(ftype)
            iprot.readFieldEnd()
        iprot.readStructEnd()

    def write(self, oprot):
        if oprot._fast_encode is not None and self.thrift_spec is not None:
            oprot.trans.write(oprot._fast_encode(self, (self.__class__, self.thrift_spec)))
            return
        oprot.writeStructBegin('updateUserResourceProfile_result')
        if self.success is not None:
            oprot.writeFieldBegin('success', TType.BOOL, 0)
            oprot.writeBool(self.success)
            oprot.writeFieldEnd()
        if self.ire is not None:
            oprot.writeFieldBegin('ire', TType.STRUCT, 1)
            self.ire.write(oprot)
            oprot.writeFieldEnd()
        if self.ace is not None:
            oprot.writeFieldBegin('ace', TType.STRUCT, 2)
            self.ace.write(oprot)
            oprot.writeFieldEnd()
        if self.ase is not None:
            oprot.writeFieldBegin('ase', TType.STRUCT, 3)
            self.ase.write(oprot)
            oprot.writeFieldEnd()
        if self.ae is not None:
            oprot.writeFieldBegin('ae', TType.STRUCT, 4)
            self.ae.write(oprot)
            oprot.writeFieldEnd()
        oprot.writeFieldStop()
        oprot.writeStructEnd()

    def validate(self):
        return

    def __repr__(self):
        L = ['%s=%r' % (key, value)
             for key, value in self.__dict__.items()]
        return '%s(%s)' % (self.__class__.__name__, ', '.join(L))

    def __eq__(self, other):
        return isinstance(other, self.__class__) and self.__dict__ == other.__dict__

    def __ne__(self, other):
        return not (self == other)


class deleteUserResourceProfile_args(object):
    """
    Attributes:
     - authzToken
     - userId
     - gatewayID
    """

    thrift_spec = (
        None,  # 0
        (1, TType.STRUCT, 'authzToken', (apache.airavata.model.security.ttypes.AuthzToken, apache.airavata.model.security.ttypes.AuthzToken.thrift_spec), None, ),  # 1
        (2, TType.STRING, 'userId', 'UTF8', None, ),  # 2
        (3, TType.STRING, 'gatewayID', 'UTF8', None, ),  # 3
    )

    def __init__(self, authzToken=None, userId=None, gatewayID=None,):
        self.authzToken = authzToken
        self.userId = userId
        self.gatewayID = gatewayID

    def read(self, iprot):
        if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None:
            iprot._fast_decode(self, iprot, (self.__class__, self.thrift_spec))
            return
        iprot.readStructBegin()
        while True:
            (fname, ftype, fid) = iprot.readFieldBegin()
            if ftype == TType.STOP:
                break
            if fid == 1:
                if ftype == TType.STRUCT:
                    self.authzToken = apache.airavata.model.security.ttypes.AuthzToken()
                    self.authzToken.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 2:
                if ftype == TType.STRING:
                    self.userId = iprot.readString().decode('utf-8') if sys.version_info[0] == 2 else iprot.readString()
                else:
                    iprot.skip(ftype)
            elif fid == 3:
                if ftype == TType.STRING:
                    self.gatewayID = iprot.readString().decode('utf-8') if sys.version_info[0] == 2 else iprot.readString()
                else:
                    iprot.skip(ftype)
            else:
                iprot.skip(ftype)
            iprot.readFieldEnd()
        iprot.readStructEnd()

    def write(self, oprot):
        if oprot._fast_encode is not None and self.thrift_spec is not None:
            oprot.trans.write(oprot._fast_encode(self, (self.__class__, self.thrift_spec)))
            return
        oprot.writeStructBegin('deleteUserResourceProfile_args')
        if self.authzToken is not None:
            oprot.writeFieldBegin('authzToken', TType.STRUCT, 1)
            self.authzToken.write(oprot)
            oprot.writeFieldEnd()
        if self.userId is not None:
            oprot.writeFieldBegin('userId', TType.STRING, 2)
            oprot.writeString(self.userId.encode('utf-8') if sys.version_info[0] == 2 else self.userId)
            oprot.writeFieldEnd()
        if self.gatewayID is not None:
            oprot.writeFieldBegin('gatewayID', TType.STRING, 3)
            oprot.writeString(self.gatewayID.encode('utf-8') if sys.version_info[0] == 2 else self.gatewayID)
            oprot.writeFieldEnd()
        oprot.writeFieldStop()
        oprot.writeStructEnd()

    def validate(self):
        if self.authzToken is None:
            raise TProtocolException(message='Required field authzToken is unset!')
        if self.userId is None:
            raise TProtocolException(message='Required field userId is unset!')
        if self.gatewayID is None:
            raise TProtocolException(message='Required field gatewayID is unset!')
        return

    def __repr__(self):
        L = ['%s=%r' % (key, value)
             for key, value in self.__dict__.items()]
        return '%s(%s)' % (self.__class__.__name__, ', '.join(L))

    def __eq__(self, other):
        return isinstance(other, self.__class__) and self.__dict__ == other.__dict__

    def __ne__(self, other):
        return not (self == other)


class deleteUserResourceProfile_result(object):
    """
    Attributes:
     - success
     - ire
     - ace
     - ase
     - ae
    """

    thrift_spec = (
        (0, TType.BOOL, 'success', None, None, ),  # 0
        (1, TType.STRUCT, 'ire', (apache.airavata.api.error.ttypes.InvalidRequestException, apache.airavata.api.error.ttypes.InvalidRequestException.thrift_spec), None, ),  # 1
        (2, TType.STRUCT, 'ace', (apache.airavata.api.error.ttypes.AiravataClientException, apache.airavata.api.error.ttypes.AiravataClientException.thrift_spec), None, ),  # 2
        (3, TType.STRUCT, 'ase', (apache.airavata.api.error.ttypes.AiravataSystemException, apache.airavata.api.error.ttypes.AiravataSystemException.thrift_spec), None, ),  # 3
        (4, TType.STRUCT, 'ae', (apache.airavata.api.error.ttypes.AuthorizationException, apache.airavata.api.error.ttypes.AuthorizationException.thrift_spec), None, ),  # 4
    )

    def __init__(self, success=None, ire=None, ace=None, ase=None, ae=None,):
        self.success = success
        self.ire = ire
        self.ace = ace
        self.ase = ase
        self.ae = ae

    def read(self, iprot):
        if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None:
            iprot._fast_decode(self, iprot, (self.__class__, self.thrift_spec))
            return
        iprot.readStructBegin()
        while True:
            (fname, ftype, fid) = iprot.readFieldBegin()
            if ftype == TType.STOP:
                break
            if fid == 0:
                if ftype == TType.BOOL:
                    self.success = iprot.readBool()
                else:
                    iprot.skip(ftype)
            elif fid == 1:
                if ftype == TType.STRUCT:
                    self.ire = apache.airavata.api.error.ttypes.InvalidRequestException()
                    self.ire.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 2:
                if ftype == TType.STRUCT:
                    self.ace = apache.airavata.api.error.ttypes.AiravataClientException()
                    self.ace.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 3:
                if ftype == TType.STRUCT:
                    self.ase = apache.airavata.api.error.ttypes.AiravataSystemException()
                    self.ase.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 4:
                if ftype == TType.STRUCT:
                    self.ae = apache.airavata.api.error.ttypes.AuthorizationException()
                    self.ae.read(iprot)
                else:
                    iprot.skip(ftype)
            else:
                iprot.skip(ftype)
            iprot.readFieldEnd()
        iprot.readStructEnd()

    def write(self, oprot):
        if oprot._fast_encode is not None and self.thrift_spec is not None:
            oprot.trans.write(oprot._fast_encode(self, (self.__class__, self.thrift_spec)))
            return
        oprot.writeStructBegin('deleteUserResourceProfile_result')
        if self.success is not None:
            oprot.writeFieldBegin('success', TType.BOOL, 0)
            oprot.writeBool(self.success)
            oprot.writeFieldEnd()
        if self.ire is not None:
            oprot.writeFieldBegin('ire', TType.STRUCT, 1)
            self.ire.write(oprot)
            oprot.writeFieldEnd()
        if self.ace is not None:
            oprot.writeFieldBegin('ace', TType.STRUCT, 2)
            self.ace.write(oprot)
            oprot.writeFieldEnd()
        if self.ase is not None:
            oprot.writeFieldBegin('ase', TType.STRUCT, 3)
            self.ase.write(oprot)
            oprot.writeFieldEnd()
        if self.ae is not None:
            oprot.writeFieldBegin('ae', TType.STRUCT, 4)
            self.ae.write(oprot)
            oprot.writeFieldEnd()
        oprot.writeFieldStop()
        oprot.writeStructEnd()

    def validate(self):
        return

    def __repr__(self):
        L = ['%s=%r' % (key, value)
             for key, value in self.__dict__.items()]
        return '%s(%s)' % (self.__class__.__name__, ', '.join(L))

    def __eq__(self, other):
        return isinstance(other, self.__class__) and self.__dict__ == other.__dict__

    def __ne__(self, other):
        return not (self == other)


class addUserComputeResourcePreference_args(object):
    """
    Attributes:
     - authzToken
     - userId
     - gatewayID
     - userComputeResourceId
     - userComputeResourcePreference
    """

    thrift_spec = (
        None,  # 0
        (1, TType.STRUCT, 'authzToken', (apache.airavata.model.security.ttypes.AuthzToken, apache.airavata.model.security.ttypes.AuthzToken.thrift_spec), None, ),  # 1
        (2, TType.STRING, 'userId', 'UTF8', None, ),  # 2
        (3, TType.STRING, 'gatewayID', 'UTF8', None, ),  # 3
        (4, TType.STRING, 'userComputeResourceId', 'UTF8', None, ),  # 4
        (5, TType.STRUCT, 'userComputeResourcePreference', (apache.airavata.model.appcatalog.userresourceprofile.ttypes.UserComputeResourcePreference, apache.airavata.model.appcatalog.userresourceprofile.ttypes.UserComputeResourcePreference.thrift_spec), None, ),  # 5
    )

    def __init__(self, authzToken=None, userId=None, gatewayID=None, userComputeResourceId=None, userComputeResourcePreference=None,):
        self.authzToken = authzToken
        self.userId = userId
        self.gatewayID = gatewayID
        self.userComputeResourceId = userComputeResourceId
        self.userComputeResourcePreference = userComputeResourcePreference

    def read(self, iprot):
        if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None:
            iprot._fast_decode(self, iprot, (self.__class__, self.thrift_spec))
            return
        iprot.readStructBegin()
        while True:
            (fname, ftype, fid) = iprot.readFieldBegin()
            if ftype == TType.STOP:
                break
            if fid == 1:
                if ftype == TType.STRUCT:
                    self.authzToken = apache.airavata.model.security.ttypes.AuthzToken()
                    self.authzToken.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 2:
                if ftype == TType.STRING:
                    self.userId = iprot.readString().decode('utf-8') if sys.version_info[0] == 2 else iprot.readString()
                else:
                    iprot.skip(ftype)
            elif fid == 3:
                if ftype == TType.STRING:
                    self.gatewayID = iprot.readString().decode('utf-8') if sys.version_info[0] == 2 else iprot.readString()
                else:
                    iprot.skip(ftype)
            elif fid == 4:
                if ftype == TType.STRING:
                    self.userComputeResourceId = iprot.readString().decode('utf-8') if sys.version_info[0] == 2 else iprot.readString()
                else:
                    iprot.skip(ftype)
            elif fid == 5:
                if ftype == TType.STRUCT:
                    self.userComputeResourcePreference = apache.airavata.model.appcatalog.userresourceprofile.ttypes.UserComputeResourcePreference()
                    self.userComputeResourcePreference.read(iprot)
                else:
                    iprot.skip(ftype)
            else:
                iprot.skip(ftype)
            iprot.readFieldEnd()
        iprot.readStructEnd()

    def write(self, oprot):
        if oprot._fast_encode is not None and self.thrift_spec is not None:
            oprot.trans.write(oprot._fast_encode(self, (self.__class__, self.thrift_spec)))
            return
        oprot.writeStructBegin('addUserComputeResourcePreference_args')
        if self.authzToken is not None:
            oprot.writeFieldBegin('authzToken', TType.STRUCT, 1)
            self.authzToken.write(oprot)
            oprot.writeFieldEnd()
        if self.userId is not None:
            oprot.writeFieldBegin('userId', TType.STRING, 2)
            oprot.writeString(self.userId.encode('utf-8') if sys.version_info[0] == 2 else self.userId)
            oprot.writeFieldEnd()
        if self.gatewayID is not None:
            oprot.writeFieldBegin('gatewayID', TType.STRING, 3)
            oprot.writeString(self.gatewayID.encode('utf-8') if sys.version_info[0] == 2 else self.gatewayID)
            oprot.writeFieldEnd()
        if self.userComputeResourceId is not None:
            oprot.writeFieldBegin('userComputeResourceId', TType.STRING, 4)
            oprot.writeString(self.userComputeResourceId.encode('utf-8') if sys.version_info[0] == 2 else self.userComputeResourceId)
            oprot.writeFieldEnd()
        if self.userComputeResourcePreference is not None:
            oprot.writeFieldBegin('userComputeResourcePreference', TType.STRUCT, 5)
            self.userComputeResourcePreference.write(oprot)
            oprot.writeFieldEnd()
        oprot.writeFieldStop()
        oprot.writeStructEnd()

    def validate(self):
        if self.authzToken is None:
            raise TProtocolException(message='Required field authzToken is unset!')
        if self.userId is None:
            raise TProtocolException(message='Required field userId is unset!')
        if self.gatewayID is None:
            raise TProtocolException(message='Required field gatewayID is unset!')
        if self.userComputeResourceId is None:
            raise TProtocolException(message='Required field userComputeResourceId is unset!')
        if self.userComputeResourcePreference is None:
            raise TProtocolException(message='Required field userComputeResourcePreference is unset!')
        return

    def __repr__(self):
        L = ['%s=%r' % (key, value)
             for key, value in self.__dict__.items()]
        return '%s(%s)' % (self.__class__.__name__, ', '.join(L))

    def __eq__(self, other):
        return isinstance(other, self.__class__) and self.__dict__ == other.__dict__

    def __ne__(self, other):
        return not (self == other)


class addUserComputeResourcePreference_result(object):
    """
    Attributes:
     - success
     - ire
     - ace
     - ase
     - ae
    """

    thrift_spec = (
        (0, TType.BOOL, 'success', None, None, ),  # 0
        (1, TType.STRUCT, 'ire', (apache.airavata.api.error.ttypes.InvalidRequestException, apache.airavata.api.error.ttypes.InvalidRequestException.thrift_spec), None, ),  # 1
        (2, TType.STRUCT, 'ace', (apache.airavata.api.error.ttypes.AiravataClientException, apache.airavata.api.error.ttypes.AiravataClientException.thrift_spec), None, ),  # 2
        (3, TType.STRUCT, 'ase', (apache.airavata.api.error.ttypes.AiravataSystemException, apache.airavata.api.error.ttypes.AiravataSystemException.thrift_spec), None, ),  # 3
        (4, TType.STRUCT, 'ae', (apache.airavata.api.error.ttypes.AuthorizationException, apache.airavata.api.error.ttypes.AuthorizationException.thrift_spec), None, ),  # 4
    )

    def __init__(self, success=None, ire=None, ace=None, ase=None, ae=None,):
        self.success = success
        self.ire = ire
        self.ace = ace
        self.ase = ase
        self.ae = ae

    def read(self, iprot):
        if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None:
            iprot._fast_decode(self, iprot, (self.__class__, self.thrift_spec))
            return
        iprot.readStructBegin()
        while True:
            (fname, ftype, fid) = iprot.readFieldBegin()
            if ftype == TType.STOP:
                break
            if fid == 0:
                if ftype == TType.BOOL:
                    self.success = iprot.readBool()
                else:
                    iprot.skip(ftype)
            elif fid == 1:
                if ftype == TType.STRUCT:
                    self.ire = apache.airavata.api.error.ttypes.InvalidRequestException()
                    self.ire.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 2:
                if ftype == TType.STRUCT:
                    self.ace = apache.airavata.api.error.ttypes.AiravataClientException()
                    self.ace.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 3:
                if ftype == TType.STRUCT:
                    self.ase = apache.airavata.api.error.ttypes.AiravataSystemException()
                    self.ase.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 4:
                if ftype == TType.STRUCT:
                    self.ae = apache.airavata.api.error.ttypes.AuthorizationException()
                    self.ae.read(iprot)
                else:
                    iprot.skip(ftype)
            else:
                iprot.skip(ftype)
            iprot.readFieldEnd()
        iprot.readStructEnd()

    def write(self, oprot):
        if oprot._fast_encode is not None and self.thrift_spec is not None:
            oprot.trans.write(oprot._fast_encode(self, (self.__class__, self.thrift_spec)))
            return
        oprot.writeStructBegin('addUserComputeResourcePreference_result')
        if self.success is not None:
            oprot.writeFieldBegin('success', TType.BOOL, 0)
            oprot.writeBool(self.success)
            oprot.writeFieldEnd()
        if self.ire is not None:
            oprot.writeFieldBegin('ire', TType.STRUCT, 1)
            self.ire.write(oprot)
            oprot.writeFieldEnd()
        if self.ace is not None:
            oprot.writeFieldBegin('ace', TType.STRUCT, 2)
            self.ace.write(oprot)
            oprot.writeFieldEnd()
        if self.ase is not None:
            oprot.writeFieldBegin('ase', TType.STRUCT, 3)
            self.ase.write(oprot)
            oprot.writeFieldEnd()
        if self.ae is not None:
            oprot.writeFieldBegin('ae', TType.STRUCT, 4)
            self.ae.write(oprot)
            oprot.writeFieldEnd()
        oprot.writeFieldStop()
        oprot.writeStructEnd()

    def validate(self):
        return

    def __repr__(self):
        L = ['%s=%r' % (key, value)
             for key, value in self.__dict__.items()]
        return '%s(%s)' % (self.__class__.__name__, ', '.join(L))

    def __eq__(self, other):
        return isinstance(other, self.__class__) and self.__dict__ == other.__dict__

    def __ne__(self, other):
        return not (self == other)


class addUserStoragePreference_args(object):
    """
    Attributes:
     - authzToken
     - userId
     - gatewayID
     - userStorageResourceId
     - userStoragePreference
    """

    thrift_spec = (
        None,  # 0
        (1, TType.STRUCT, 'authzToken', (apache.airavata.model.security.ttypes.AuthzToken, apache.airavata.model.security.ttypes.AuthzToken.thrift_spec), None, ),  # 1
        (2, TType.STRING, 'userId', 'UTF8', None, ),  # 2
        (3, TType.STRING, 'gatewayID', 'UTF8', None, ),  # 3
        (4, TType.STRING, 'userStorageResourceId', 'UTF8', None, ),  # 4
        (5, TType.STRUCT, 'userStoragePreference', (apache.airavata.model.appcatalog.userresourceprofile.ttypes.UserStoragePreference, apache.airavata.model.appcatalog.userresourceprofile.ttypes.UserStoragePreference.thrift_spec), None, ),  # 5
    )

    def __init__(self, authzToken=None, userId=None, gatewayID=None, userStorageResourceId=None, userStoragePreference=None,):
        self.authzToken = authzToken
        self.userId = userId
        self.gatewayID = gatewayID
        self.userStorageResourceId = userStorageResourceId
        self.userStoragePreference = userStoragePreference

    def read(self, iprot):
        if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None:
            iprot._fast_decode(self, iprot, (self.__class__, self.thrift_spec))
            return
        iprot.readStructBegin()
        while True:
            (fname, ftype, fid) = iprot.readFieldBegin()
            if ftype == TType.STOP:
                break
            if fid == 1:
                if ftype == TType.STRUCT:
                    self.authzToken = apache.airavata.model.security.ttypes.AuthzToken()
                    self.authzToken.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 2:
                if ftype == TType.STRING:
                    self.userId = iprot.readString().decode('utf-8') if sys.version_info[0] == 2 else iprot.readString()
                else:
                    iprot.skip(ftype)
            elif fid == 3:
                if ftype == TType.STRING:
                    self.gatewayID = iprot.readString().decode('utf-8') if sys.version_info[0] == 2 else iprot.readString()
                else:
                    iprot.skip(ftype)
            elif fid == 4:
                if ftype == TType.STRING:
                    self.userStorageResourceId = iprot.readString().decode('utf-8') if sys.version_info[0] == 2 else iprot.readString()
                else:
                    iprot.skip(ftype)
            elif fid == 5:
                if ftype == TType.STRUCT:
                    self.userStoragePreference = apache.airavata.model.appcatalog.userresourceprofile.ttypes.UserStoragePreference()
                    self.userStoragePreference.read(iprot)
                else:
                    iprot.skip(ftype)
            else:
                iprot.skip(ftype)
            iprot.readFieldEnd()
        iprot.readStructEnd()

    def write(self, oprot):
        if oprot._fast_encode is not None and self.thrift_spec is not None:
            oprot.trans.write(oprot._fast_encode(self, (self.__class__, self.thrift_spec)))
            return
        oprot.writeStructBegin('addUserStoragePreference_args')
        if self.authzToken is not None:
            oprot.writeFieldBegin('authzToken', TType.STRUCT, 1)
            self.authzToken.write(oprot)
            oprot.writeFieldEnd()
        if self.userId is not None:
            oprot.writeFieldBegin('userId', TType.STRING, 2)
            oprot.writeString(self.userId.encode('utf-8') if sys.version_info[0] == 2 else self.userId)
            oprot.writeFieldEnd()
        if self.gatewayID is not None:
            oprot.writeFieldBegin('gatewayID', TType.STRING, 3)
            oprot.writeString(self.gatewayID.encode('utf-8') if sys.version_info[0] == 2 else self.gatewayID)
            oprot.writeFieldEnd()
        if self.userStorageResourceId is not None:
            oprot.writeFieldBegin('userStorageResourceId', TType.STRING, 4)
            oprot.writeString(self.userStorageResourceId.encode('utf-8') if sys.version_info[0] == 2 else self.userStorageResourceId)
            oprot.writeFieldEnd()
        if self.userStoragePreference is not None:
            oprot.writeFieldBegin('userStoragePreference', TType.STRUCT, 5)
            self.userStoragePreference.write(oprot)
            oprot.writeFieldEnd()
        oprot.writeFieldStop()
        oprot.writeStructEnd()

    def validate(self):
        if self.authzToken is None:
            raise TProtocolException(message='Required field authzToken is unset!')
        if self.userId is None:
            raise TProtocolException(message='Required field userId is unset!')
        if self.gatewayID is None:
            raise TProtocolException(message='Required field gatewayID is unset!')
        if self.userStorageResourceId is None:
            raise TProtocolException(message='Required field userStorageResourceId is unset!')
        if self.userStoragePreference is None:
            raise TProtocolException(message='Required field userStoragePreference is unset!')
        return

    def __repr__(self):
        L = ['%s=%r' % (key, value)
             for key, value in self.__dict__.items()]
        return '%s(%s)' % (self.__class__.__name__, ', '.join(L))

    def __eq__(self, other):
        return isinstance(other, self.__class__) and self.__dict__ == other.__dict__

    def __ne__(self, other):
        return not (self == other)


class addUserStoragePreference_result(object):
    """
    Attributes:
     - success
     - ire
     - ace
     - ase
     - ae
    """

    thrift_spec = (
        (0, TType.BOOL, 'success', None, None, ),  # 0
        (1, TType.STRUCT, 'ire', (apache.airavata.api.error.ttypes.InvalidRequestException, apache.airavata.api.error.ttypes.InvalidRequestException.thrift_spec), None, ),  # 1
        (2, TType.STRUCT, 'ace', (apache.airavata.api.error.ttypes.AiravataClientException, apache.airavata.api.error.ttypes.AiravataClientException.thrift_spec), None, ),  # 2
        (3, TType.STRUCT, 'ase', (apache.airavata.api.error.ttypes.AiravataSystemException, apache.airavata.api.error.ttypes.AiravataSystemException.thrift_spec), None, ),  # 3
        (4, TType.STRUCT, 'ae', (apache.airavata.api.error.ttypes.AuthorizationException, apache.airavata.api.error.ttypes.AuthorizationException.thrift_spec), None, ),  # 4
    )

    def __init__(self, success=None, ire=None, ace=None, ase=None, ae=None,):
        self.success = success
        self.ire = ire
        self.ace = ace
        self.ase = ase
        self.ae = ae

    def read(self, iprot):
        if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None:
            iprot._fast_decode(self, iprot, (self.__class__, self.thrift_spec))
            return
        iprot.readStructBegin()
        while True:
            (fname, ftype, fid) = iprot.readFieldBegin()
            if ftype == TType.STOP:
                break
            if fid == 0:
                if ftype == TType.BOOL:
                    self.success = iprot.readBool()
                else:
                    iprot.skip(ftype)
            elif fid == 1:
                if ftype == TType.STRUCT:
                    self.ire = apache.airavata.api.error.ttypes.InvalidRequestException()
                    self.ire.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 2:
                if ftype == TType.STRUCT:
                    self.ace = apache.airavata.api.error.ttypes.AiravataClientException()
                    self.ace.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 3:
                if ftype == TType.STRUCT:
                    self.ase = apache.airavata.api.error.ttypes.AiravataSystemException()
                    self.ase.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 4:
                if ftype == TType.STRUCT:
                    self.ae = apache.airavata.api.error.ttypes.AuthorizationException()
                    self.ae.read(iprot)
                else:
                    iprot.skip(ftype)
            else:
                iprot.skip(ftype)
            iprot.readFieldEnd()
        iprot.readStructEnd()

    def write(self, oprot):
        if oprot._fast_encode is not None and self.thrift_spec is not None:
            oprot.trans.write(oprot._fast_encode(self, (self.__class__, self.thrift_spec)))
            return
        oprot.writeStructBegin('addUserStoragePreference_result')
        if self.success is not None:
            oprot.writeFieldBegin('success', TType.BOOL, 0)
            oprot.writeBool(self.success)
            oprot.writeFieldEnd()
        if self.ire is not None:
            oprot.writeFieldBegin('ire', TType.STRUCT, 1)
            self.ire.write(oprot)
            oprot.writeFieldEnd()
        if self.ace is not None:
            oprot.writeFieldBegin('ace', TType.STRUCT, 2)
            self.ace.write(oprot)
            oprot.writeFieldEnd()
        if self.ase is not None:
            oprot.writeFieldBegin('ase', TType.STRUCT, 3)
            self.ase.write(oprot)
            oprot.writeFieldEnd()
        if self.ae is not None:
            oprot.writeFieldBegin('ae', TType.STRUCT, 4)
            self.ae.write(oprot)
            oprot.writeFieldEnd()
        oprot.writeFieldStop()
        oprot.writeStructEnd()

    def validate(self):
        return

    def __repr__(self):
        L = ['%s=%r' % (key, value)
             for key, value in self.__dict__.items()]
        return '%s(%s)' % (self.__class__.__name__, ', '.join(L))

    def __eq__(self, other):
        return isinstance(other, self.__class__) and self.__dict__ == other.__dict__

    def __ne__(self, other):
        return not (self == other)


class getUserComputeResourcePreference_args(object):
    """
    Attributes:
     - authzToken
     - userId
     - gatewayID
     - userComputeResourceId
    """

    thrift_spec = (
        None,  # 0
        (1, TType.STRUCT, 'authzToken', (apache.airavata.model.security.ttypes.AuthzToken, apache.airavata.model.security.ttypes.AuthzToken.thrift_spec), None, ),  # 1
        (2, TType.STRING, 'userId', 'UTF8', None, ),  # 2
        (3, TType.STRING, 'gatewayID', 'UTF8', None, ),  # 3
        (4, TType.STRING, 'userComputeResourceId', 'UTF8', None, ),  # 4
    )

    def __init__(self, authzToken=None, userId=None, gatewayID=None, userComputeResourceId=None,):
        self.authzToken = authzToken
        self.userId = userId
        self.gatewayID = gatewayID
        self.userComputeResourceId = userComputeResourceId

    def read(self, iprot):
        if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None:
            iprot._fast_decode(self, iprot, (self.__class__, self.thrift_spec))
            return
        iprot.readStructBegin()
        while True:
            (fname, ftype, fid) = iprot.readFieldBegin()
            if ftype == TType.STOP:
                break
            if fid == 1:
                if ftype == TType.STRUCT:
                    self.authzToken = apache.airavata.model.security.ttypes.AuthzToken()
                    self.authzToken.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 2:
                if ftype == TType.STRING:
                    self.userId = iprot.readString().decode('utf-8') if sys.version_info[0] == 2 else iprot.readString()
                else:
                    iprot.skip(ftype)
            elif fid == 3:
                if ftype == TType.STRING:
                    self.gatewayID = iprot.readString().decode('utf-8') if sys.version_info[0] == 2 else iprot.readString()
                else:
                    iprot.skip(ftype)
            elif fid == 4:
                if ftype == TType.STRING:
                    self.userComputeResourceId = iprot.readString().decode('utf-8') if sys.version_info[0] == 2 else iprot.readString()
                else:
                    iprot.skip(ftype)
            else:
                iprot.skip(ftype)
            iprot.readFieldEnd()
        iprot.readStructEnd()

    def write(self, oprot):
        if oprot._fast_encode is not None and self.thrift_spec is not None:
            oprot.trans.write(oprot._fast_encode(self, (self.__class__, self.thrift_spec)))
            return
        oprot.writeStructBegin('getUserComputeResourcePreference_args')
        if self.authzToken is not None:
            oprot.writeFieldBegin('authzToken', TType.STRUCT, 1)
            self.authzToken.write(oprot)
            oprot.writeFieldEnd()
        if self.userId is not None:
            oprot.writeFieldBegin('userId', TType.STRING, 2)
            oprot.writeString(self.userId.encode('utf-8') if sys.version_info[0] == 2 else self.userId)
            oprot.writeFieldEnd()
        if self.gatewayID is not None:
            oprot.writeFieldBegin('gatewayID', TType.STRING, 3)
            oprot.writeString(self.gatewayID.encode('utf-8') if sys.version_info[0] == 2 else self.gatewayID)
            oprot.writeFieldEnd()
        if self.userComputeResourceId is not None:
            oprot.writeFieldBegin('userComputeResourceId', TType.STRING, 4)
            oprot.writeString(self.userComputeResourceId.encode('utf-8') if sys.version_info[0] == 2 else self.userComputeResourceId)
            oprot.writeFieldEnd()
        oprot.writeFieldStop()
        oprot.writeStructEnd()

    def validate(self):
        if self.authzToken is None:
            raise TProtocolException(message='Required field authzToken is unset!')
        if self.userId is None:
            raise TProtocolException(message='Required field userId is unset!')
        if self.gatewayID is None:
            raise TProtocolException(message='Required field gatewayID is unset!')
        if self.userComputeResourceId is None:
            raise TProtocolException(message='Required field userComputeResourceId is unset!')
        return

    def __repr__(self):
        L = ['%s=%r' % (key, value)
             for key, value in self.__dict__.items()]
        return '%s(%s)' % (self.__class__.__name__, ', '.join(L))

    def __eq__(self, other):
        return isinstance(other, self.__class__) and self.__dict__ == other.__dict__

    def __ne__(self, other):
        return not (self == other)


class getUserComputeResourcePreference_result(object):
    """
    Attributes:
     - success
     - ire
     - ace
     - ase
     - ae
    """

    thrift_spec = (
        (0, TType.STRUCT, 'success', (apache.airavata.model.appcatalog.userresourceprofile.ttypes.UserComputeResourcePreference, apache.airavata.model.appcatalog.userresourceprofile.ttypes.UserComputeResourcePreference.thrift_spec), None, ),  # 0
        (1, TType.STRUCT, 'ire', (apache.airavata.api.error.ttypes.InvalidRequestException, apache.airavata.api.error.ttypes.InvalidRequestException.thrift_spec), None, ),  # 1
        (2, TType.STRUCT, 'ace', (apache.airavata.api.error.ttypes.AiravataClientException, apache.airavata.api.error.ttypes.AiravataClientException.thrift_spec), None, ),  # 2
        (3, TType.STRUCT, 'ase', (apache.airavata.api.error.ttypes.AiravataSystemException, apache.airavata.api.error.ttypes.AiravataSystemException.thrift_spec), None, ),  # 3
        (4, TType.STRUCT, 'ae', (apache.airavata.api.error.ttypes.AuthorizationException, apache.airavata.api.error.ttypes.AuthorizationException.thrift_spec), None, ),  # 4
    )

    def __init__(self, success=None, ire=None, ace=None, ase=None, ae=None,):
        self.success = success
        self.ire = ire
        self.ace = ace
        self.ase = ase
        self.ae = ae

    def read(self, iprot):
        if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None:
            iprot._fast_decode(self, iprot, (self.__class__, self.thrift_spec))
            return
        iprot.readStructBegin()
        while True:
            (fname, ftype, fid) = iprot.readFieldBegin()
            if ftype == TType.STOP:
                break
            if fid == 0:
                if ftype == TType.STRUCT:
                    self.success = apache.airavata.model.appcatalog.userresourceprofile.ttypes.UserComputeResourcePreference()
                    self.success.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 1:
                if ftype == TType.STRUCT:
                    self.ire = apache.airavata.api.error.ttypes.InvalidRequestException()
                    self.ire.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 2:
                if ftype == TType.STRUCT:
                    self.ace = apache.airavata.api.error.ttypes.AiravataClientException()
                    self.ace.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 3:
                if ftype == TType.STRUCT:
                    self.ase = apache.airavata.api.error.ttypes.AiravataSystemException()
                    self.ase.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 4:
                if ftype == TType.STRUCT:
                    self.ae = apache.airavata.api.error.ttypes.AuthorizationException()
                    self.ae.read(iprot)
                else:
                    iprot.skip(ftype)
            else:
                iprot.skip(ftype)
            iprot.readFieldEnd()
        iprot.readStructEnd()

    def write(self, oprot):
        if oprot._fast_encode is not None and self.thrift_spec is not None:
            oprot.trans.write(oprot._fast_encode(self, (self.__class__, self.thrift_spec)))
            return
        oprot.writeStructBegin('getUserComputeResourcePreference_result')
        if self.success is not None:
            oprot.writeFieldBegin('success', TType.STRUCT, 0)
            self.success.write(oprot)
            oprot.writeFieldEnd()
        if self.ire is not None:
            oprot.writeFieldBegin('ire', TType.STRUCT, 1)
            self.ire.write(oprot)
            oprot.writeFieldEnd()
        if self.ace is not None:
            oprot.writeFieldBegin('ace', TType.STRUCT, 2)
            self.ace.write(oprot)
            oprot.writeFieldEnd()
        if self.ase is not None:
            oprot.writeFieldBegin('ase', TType.STRUCT, 3)
            self.ase.write(oprot)
            oprot.writeFieldEnd()
        if self.ae is not None:
            oprot.writeFieldBegin('ae', TType.STRUCT, 4)
            self.ae.write(oprot)
            oprot.writeFieldEnd()
        oprot.writeFieldStop()
        oprot.writeStructEnd()

    def validate(self):
        return

    def __repr__(self):
        L = ['%s=%r' % (key, value)
             for key, value in self.__dict__.items()]
        return '%s(%s)' % (self.__class__.__name__, ', '.join(L))

    def __eq__(self, other):
        return isinstance(other, self.__class__) and self.__dict__ == other.__dict__

    def __ne__(self, other):
        return not (self == other)


class getUserStoragePreference_args(object):
    """
    Attributes:
     - authzToken
     - userId
     - gatewayID
     - userStorageResourceId
    """

    thrift_spec = (
        None,  # 0
        (1, TType.STRUCT, 'authzToken', (apache.airavata.model.security.ttypes.AuthzToken, apache.airavata.model.security.ttypes.AuthzToken.thrift_spec), None, ),  # 1
        (2, TType.STRING, 'userId', 'UTF8', None, ),  # 2
        (3, TType.STRING, 'gatewayID', 'UTF8', None, ),  # 3
        (4, TType.STRING, 'userStorageResourceId', 'UTF8', None, ),  # 4
    )

    def __init__(self, authzToken=None, userId=None, gatewayID=None, userStorageResourceId=None,):
        self.authzToken = authzToken
        self.userId = userId
        self.gatewayID = gatewayID
        self.userStorageResourceId = userStorageResourceId

    def read(self, iprot):
        if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None:
            iprot._fast_decode(self, iprot, (self.__class__, self.thrift_spec))
            return
        iprot.readStructBegin()
        while True:
            (fname, ftype, fid) = iprot.readFieldBegin()
            if ftype == TType.STOP:
                break
            if fid == 1:
                if ftype == TType.STRUCT:
                    self.authzToken = apache.airavata.model.security.ttypes.AuthzToken()
                    self.authzToken.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 2:
                if ftype == TType.STRING:
                    self.userId = iprot.readString().decode('utf-8') if sys.version_info[0] == 2 else iprot.readString()
                else:
                    iprot.skip(ftype)
            elif fid == 3:
                if ftype == TType.STRING:
                    self.gatewayID = iprot.readString().decode('utf-8') if sys.version_info[0] == 2 else iprot.readString()
                else:
                    iprot.skip(ftype)
            elif fid == 4:
                if ftype == TType.STRING:
                    self.userStorageResourceId = iprot.readString().decode('utf-8') if sys.version_info[0] == 2 else iprot.readString()
                else:
                    iprot.skip(ftype)
            else:
                iprot.skip(ftype)
            iprot.readFieldEnd()
        iprot.readStructEnd()

    def write(self, oprot):
        if oprot._fast_encode is not None and self.thrift_spec is not None:
            oprot.trans.write(oprot._fast_encode(self, (self.__class__, self.thrift_spec)))
            return
        oprot.writeStructBegin('getUserStoragePreference_args')
        if self.authzToken is not None:
            oprot.writeFieldBegin('authzToken', TType.STRUCT, 1)
            self.authzToken.write(oprot)
            oprot.writeFieldEnd()
        if self.userId is not None:
            oprot.writeFieldBegin('userId', TType.STRING, 2)
            oprot.writeString(self.userId.encode('utf-8') if sys.version_info[0] == 2 else self.userId)
            oprot.writeFieldEnd()
        if self.gatewayID is not None:
            oprot.writeFieldBegin('gatewayID', TType.STRING, 3)
            oprot.writeString(self.gatewayID.encode('utf-8') if sys.version_info[0] == 2 else self.gatewayID)
            oprot.writeFieldEnd()
        if self.userStorageResourceId is not None:
            oprot.writeFieldBegin('userStorageResourceId', TType.STRING, 4)
            oprot.writeString(self.userStorageResourceId.encode('utf-8') if sys.version_info[0] == 2 else self.userStorageResourceId)
            oprot.writeFieldEnd()
        oprot.writeFieldStop()
        oprot.writeStructEnd()

    def validate(self):
        if self.authzToken is None:
            raise TProtocolException(message='Required field authzToken is unset!')
        if self.userId is None:
            raise TProtocolException(message='Required field userId is unset!')
        if self.gatewayID is None:
            raise TProtocolException(message='Required field gatewayID is unset!')
        if self.userStorageResourceId is None:
            raise TProtocolException(message='Required field userStorageResourceId is unset!')
        return

    def __repr__(self):
        L = ['%s=%r' % (key, value)
             for key, value in self.__dict__.items()]
        return '%s(%s)' % (self.__class__.__name__, ', '.join(L))

    def __eq__(self, other):
        return isinstance(other, self.__class__) and self.__dict__ == other.__dict__

    def __ne__(self, other):
        return not (self == other)


class getUserStoragePreference_result(object):
    """
    Attributes:
     - success
     - ire
     - ace
     - ase
     - ae
    """

    thrift_spec = (
        (0, TType.STRUCT, 'success', (apache.airavata.model.appcatalog.userresourceprofile.ttypes.UserStoragePreference, apache.airavata.model.appcatalog.userresourceprofile.ttypes.UserStoragePreference.thrift_spec), None, ),  # 0
        (1, TType.STRUCT, 'ire', (apache.airavata.api.error.ttypes.InvalidRequestException, apache.airavata.api.error.ttypes.InvalidRequestException.thrift_spec), None, ),  # 1
        (2, TType.STRUCT, 'ace', (apache.airavata.api.error.ttypes.AiravataClientException, apache.airavata.api.error.ttypes.AiravataClientException.thrift_spec), None, ),  # 2
        (3, TType.STRUCT, 'ase', (apache.airavata.api.error.ttypes.AiravataSystemException, apache.airavata.api.error.ttypes.AiravataSystemException.thrift_spec), None, ),  # 3
        (4, TType.STRUCT, 'ae', (apache.airavata.api.error.ttypes.AuthorizationException, apache.airavata.api.error.ttypes.AuthorizationException.thrift_spec), None, ),  # 4
    )

    def __init__(self, success=None, ire=None, ace=None, ase=None, ae=None,):
        self.success = success
        self.ire = ire
        self.ace = ace
        self.ase = ase
        self.ae = ae

    def read(self, iprot):
        if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None:
            iprot._fast_decode(self, iprot, (self.__class__, self.thrift_spec))
            return
        iprot.readStructBegin()
        while True:
            (fname, ftype, fid) = iprot.readFieldBegin()
            if ftype == TType.STOP:
                break
            if fid == 0:
                if ftype == TType.STRUCT:
                    self.success = apache.airavata.model.appcatalog.userresourceprofile.ttypes.UserStoragePreference()
                    self.success.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 1:
                if ftype == TType.STRUCT:
                    self.ire = apache.airavata.api.error.ttypes.InvalidRequestException()
                    self.ire.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 2:
                if ftype == TType.STRUCT:
                    self.ace = apache.airavata.api.error.ttypes.AiravataClientException()
                    self.ace.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 3:
                if ftype == TType.STRUCT:
                    self.ase = apache.airavata.api.error.ttypes.AiravataSystemException()
                    self.ase.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 4:
                if ftype == TType.STRUCT:
                    self.ae = apache.airavata.api.error.ttypes.AuthorizationException()
                    self.ae.read(iprot)
                else:
                    iprot.skip(ftype)
            else:
                iprot.skip(ftype)
            iprot.readFieldEnd()
        iprot.readStructEnd()

    def write(self, oprot):
        if oprot._fast_encode is not None and self.thrift_spec is not None:
            oprot.trans.write(oprot._fast_encode(self, (self.__class__, self.thrift_spec)))
            return
        oprot.writeStructBegin('getUserStoragePreference_result')
        if self.success is not None:
            oprot.writeFieldBegin('success', TType.STRUCT, 0)
            self.success.write(oprot)
            oprot.writeFieldEnd()
        if self.ire is not None:
            oprot.writeFieldBegin('ire', TType.STRUCT, 1)
            self.ire.write(oprot)
            oprot.writeFieldEnd()
        if self.ace is not None:
            oprot.writeFieldBegin('ace', TType.STRUCT, 2)
            self.ace.write(oprot)
            oprot.writeFieldEnd()
        if self.ase is not None:
            oprot.writeFieldBegin('ase', TType.STRUCT, 3)
            self.ase.write(oprot)
            oprot.writeFieldEnd()
        if self.ae is not None:
            oprot.writeFieldBegin('ae', TType.STRUCT, 4)
            self.ae.write(oprot)
            oprot.writeFieldEnd()
        oprot.writeFieldStop()
        oprot.writeStructEnd()

    def validate(self):
        return

    def __repr__(self):
        L = ['%s=%r' % (key, value)
             for key, value in self.__dict__.items()]
        return '%s(%s)' % (self.__class__.__name__, ', '.join(L))

    def __eq__(self, other):
        return isinstance(other, self.__class__) and self.__dict__ == other.__dict__

    def __ne__(self, other):
        return not (self == other)


class getAllUserComputeResourcePreferences_args(object):
    """
    Attributes:
     - authzToken
     - userId
     - gatewayID
    """

    thrift_spec = (
        None,  # 0
        (1, TType.STRUCT, 'authzToken', (apache.airavata.model.security.ttypes.AuthzToken, apache.airavata.model.security.ttypes.AuthzToken.thrift_spec), None, ),  # 1
        (2, TType.STRING, 'userId', 'UTF8', None, ),  # 2
        (3, TType.STRING, 'gatewayID', 'UTF8', None, ),  # 3
    )

    def __init__(self, authzToken=None, userId=None, gatewayID=None,):
        self.authzToken = authzToken
        self.userId = userId
        self.gatewayID = gatewayID

    def read(self, iprot):
        if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None:
            iprot._fast_decode(self, iprot, (self.__class__, self.thrift_spec))
            return
        iprot.readStructBegin()
        while True:
            (fname, ftype, fid) = iprot.readFieldBegin()
            if ftype == TType.STOP:
                break
            if fid == 1:
                if ftype == TType.STRUCT:
                    self.authzToken = apache.airavata.model.security.ttypes.AuthzToken()
                    self.authzToken.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 2:
                if ftype == TType.STRING:
                    self.userId = iprot.readString().decode('utf-8') if sys.version_info[0] == 2 else iprot.readString()
                else:
                    iprot.skip(ftype)
            elif fid == 3:
                if ftype == TType.STRING:
                    self.gatewayID = iprot.readString().decode('utf-8') if sys.version_info[0] == 2 else iprot.readString()
                else:
                    iprot.skip(ftype)
            else:
                iprot.skip(ftype)
            iprot.readFieldEnd()
        iprot.readStructEnd()

    def write(self, oprot):
        if oprot._fast_encode is not None and self.thrift_spec is not None:
            oprot.trans.write(oprot._fast_encode(self, (self.__class__, self.thrift_spec)))
            return
        oprot.writeStructBegin('getAllUserComputeResourcePreferences_args')
        if self.authzToken is not None:
            oprot.writeFieldBegin('authzToken', TType.STRUCT, 1)
            self.authzToken.write(oprot)
            oprot.writeFieldEnd()
        if self.userId is not None:
            oprot.writeFieldBegin('userId', TType.STRING, 2)
            oprot.writeString(self.userId.encode('utf-8') if sys.version_info[0] == 2 else self.userId)
            oprot.writeFieldEnd()
        if self.gatewayID is not None:
            oprot.writeFieldBegin('gatewayID', TType.STRING, 3)
            oprot.writeString(self.gatewayID.encode('utf-8') if sys.version_info[0] == 2 else self.gatewayID)
            oprot.writeFieldEnd()
        oprot.writeFieldStop()
        oprot.writeStructEnd()

    def validate(self):
        if self.authzToken is None:
            raise TProtocolException(message='Required field authzToken is unset!')
        if self.userId is None:
            raise TProtocolException(message='Required field userId is unset!')
        if self.gatewayID is None:
            raise TProtocolException(message='Required field gatewayID is unset!')
        return

    def __repr__(self):
        L = ['%s=%r' % (key, value)
             for key, value in self.__dict__.items()]
        return '%s(%s)' % (self.__class__.__name__, ', '.join(L))

    def __eq__(self, other):
        return isinstance(other, self.__class__) and self.__dict__ == other.__dict__

    def __ne__(self, other):
        return not (self == other)


class getAllUserComputeResourcePreferences_result(object):
    """
    Attributes:
     - success
     - ire
     - ace
     - ase
     - ae
    """

    thrift_spec = (
        (0, TType.LIST, 'success', (TType.STRUCT, (apache.airavata.model.appcatalog.userresourceprofile.ttypes.UserComputeResourcePreference, apache.airavata.model.appcatalog.userresourceprofile.ttypes.UserComputeResourcePreference.thrift_spec), False), None, ),  # 0
        (1, TType.STRUCT, 'ire', (apache.airavata.api.error.ttypes.InvalidRequestException, apache.airavata.api.error.ttypes.InvalidRequestException.thrift_spec), None, ),  # 1
        (2, TType.STRUCT, 'ace', (apache.airavata.api.error.ttypes.AiravataClientException, apache.airavata.api.error.ttypes.AiravataClientException.thrift_spec), None, ),  # 2
        (3, TType.STRUCT, 'ase', (apache.airavata.api.error.ttypes.AiravataSystemException, apache.airavata.api.error.ttypes.AiravataSystemException.thrift_spec), None, ),  # 3
        (4, TType.STRUCT, 'ae', (apache.airavata.api.error.ttypes.AuthorizationException, apache.airavata.api.error.ttypes.AuthorizationException.thrift_spec), None, ),  # 4
    )

    def __init__(self, success=None, ire=None, ace=None, ase=None, ae=None,):
        self.success = success
        self.ire = ire
        self.ace = ace
        self.ase = ase
        self.ae = ae

    def read(self, iprot):
        if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None:
            iprot._fast_decode(self, iprot, (self.__class__, self.thrift_spec))
            return
        iprot.readStructBegin()
        while True:
            (fname, ftype, fid) = iprot.readFieldBegin()
            if ftype == TType.STOP:
                break
            if fid == 0:
                if ftype == TType.LIST:
                    self.success = []
                    (_etype256, _size253) = iprot.readListBegin()
                    for _i257 in range(_size253):
                        _elem258 = apache.airavata.model.appcatalog.userresourceprofile.ttypes.UserComputeResourcePreference()
                        _elem258.read(iprot)
                        self.success.append(_elem258)
                    iprot.readListEnd()
                else:
                    iprot.skip(ftype)
            elif fid == 1:
                if ftype == TType.STRUCT:
                    self.ire = apache.airavata.api.error.ttypes.InvalidRequestException()
                    self.ire.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 2:
                if ftype == TType.STRUCT:
                    self.ace = apache.airavata.api.error.ttypes.AiravataClientException()
                    self.ace.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 3:
                if ftype == TType.STRUCT:
                    self.ase = apache.airavata.api.error.ttypes.AiravataSystemException()
                    self.ase.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 4:
                if ftype == TType.STRUCT:
                    self.ae = apache.airavata.api.error.ttypes.AuthorizationException()
                    self.ae.read(iprot)
                else:
                    iprot.skip(ftype)
            else:
                iprot.skip(ftype)
            iprot.readFieldEnd()
        iprot.readStructEnd()

    def write(self, oprot):
        if oprot._fast_encode is not None and self.thrift_spec is not None:
            oprot.trans.write(oprot._fast_encode(self, (self.__class__, self.thrift_spec)))
            return
        oprot.writeStructBegin('getAllUserComputeResourcePreferences_result')
        if self.success is not None:
            oprot.writeFieldBegin('success', TType.LIST, 0)
            oprot.writeListBegin(TType.STRUCT, len(self.success))
            for iter259 in self.success:
                iter259.write(oprot)
            oprot.writeListEnd()
            oprot.writeFieldEnd()
        if self.ire is not None:
            oprot.writeFieldBegin('ire', TType.STRUCT, 1)
            self.ire.write(oprot)
            oprot.writeFieldEnd()
        if self.ace is not None:
            oprot.writeFieldBegin('ace', TType.STRUCT, 2)
            self.ace.write(oprot)
            oprot.writeFieldEnd()
        if self.ase is not None:
            oprot.writeFieldBegin('ase', TType.STRUCT, 3)
            self.ase.write(oprot)
            oprot.writeFieldEnd()
        if self.ae is not None:
            oprot.writeFieldBegin('ae', TType.STRUCT, 4)
            self.ae.write(oprot)
            oprot.writeFieldEnd()
        oprot.writeFieldStop()
        oprot.writeStructEnd()

    def validate(self):
        return

    def __repr__(self):
        L = ['%s=%r' % (key, value)
             for key, value in self.__dict__.items()]
        return '%s(%s)' % (self.__class__.__name__, ', '.join(L))

    def __eq__(self, other):
        return isinstance(other, self.__class__) and self.__dict__ == other.__dict__

    def __ne__(self, other):
        return not (self == other)


class getAllUserStoragePreferences_args(object):
    """
    Attributes:
     - authzToken
     - userId
     - gatewayID
    """

    thrift_spec = (
        None,  # 0
        (1, TType.STRUCT, 'authzToken', (apache.airavata.model.security.ttypes.AuthzToken, apache.airavata.model.security.ttypes.AuthzToken.thrift_spec), None, ),  # 1
        (2, TType.STRING, 'userId', 'UTF8', None, ),  # 2
        (3, TType.STRING, 'gatewayID', 'UTF8', None, ),  # 3
    )

    def __init__(self, authzToken=None, userId=None, gatewayID=None,):
        self.authzToken = authzToken
        self.userId = userId
        self.gatewayID = gatewayID

    def read(self, iprot):
        if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None:
            iprot._fast_decode(self, iprot, (self.__class__, self.thrift_spec))
            return
        iprot.readStructBegin()
        while True:
            (fname, ftype, fid) = iprot.readFieldBegin()
            if ftype == TType.STOP:
                break
            if fid == 1:
                if ftype == TType.STRUCT:
                    self.authzToken = apache.airavata.model.security.ttypes.AuthzToken()
                    self.authzToken.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 2:
                if ftype == TType.STRING:
                    self.userId = iprot.readString().decode('utf-8') if sys.version_info[0] == 2 else iprot.readString()
                else:
                    iprot.skip(ftype)
            elif fid == 3:
                if ftype == TType.STRING:
                    self.gatewayID = iprot.readString().decode('utf-8') if sys.version_info[0] == 2 else iprot.readString()
                else:
                    iprot.skip(ftype)
            else:
                iprot.skip(ftype)
            iprot.readFieldEnd()
        iprot.readStructEnd()

    def write(self, oprot):
        if oprot._fast_encode is not None and self.thrift_spec is not None:
            oprot.trans.write(oprot._fast_encode(self, (self.__class__, self.thrift_spec)))
            return
        oprot.writeStructBegin('getAllUserStoragePreferences_args')
        if self.authzToken is not None:
            oprot.writeFieldBegin('authzToken', TType.STRUCT, 1)
            self.authzToken.write(oprot)
            oprot.writeFieldEnd()
        if self.userId is not None:
            oprot.writeFieldBegin('userId', TType.STRING, 2)
            oprot.writeString(self.userId.encode('utf-8') if sys.version_info[0] == 2 else self.userId)
            oprot.writeFieldEnd()
        if self.gatewayID is not None:
            oprot.writeFieldBegin('gatewayID', TType.STRING, 3)
            oprot.writeString(self.gatewayID.encode('utf-8') if sys.version_info[0] == 2 else self.gatewayID)
            oprot.writeFieldEnd()
        oprot.writeFieldStop()
        oprot.writeStructEnd()

    def validate(self):
        if self.authzToken is None:
            raise TProtocolException(message='Required field authzToken is unset!')
        if self.userId is None:
            raise TProtocolException(message='Required field userId is unset!')
        if self.gatewayID is None:
            raise TProtocolException(message='Required field gatewayID is unset!')
        return

    def __repr__(self):
        L = ['%s=%r' % (key, value)
             for key, value in self.__dict__.items()]
        return '%s(%s)' % (self.__class__.__name__, ', '.join(L))

    def __eq__(self, other):
        return isinstance(other, self.__class__) and self.__dict__ == other.__dict__

    def __ne__(self, other):
        return not (self == other)


class getAllUserStoragePreferences_result(object):
    """
    Attributes:
     - success
     - ire
     - ace
     - ase
     - ae
    """

    thrift_spec = (
        (0, TType.LIST, 'success', (TType.STRUCT, (apache.airavata.model.appcatalog.userresourceprofile.ttypes.UserStoragePreference, apache.airavata.model.appcatalog.userresourceprofile.ttypes.UserStoragePreference.thrift_spec), False), None, ),  # 0
        (1, TType.STRUCT, 'ire', (apache.airavata.api.error.ttypes.InvalidRequestException, apache.airavata.api.error.ttypes.InvalidRequestException.thrift_spec), None, ),  # 1
        (2, TType.STRUCT, 'ace', (apache.airavata.api.error.ttypes.AiravataClientException, apache.airavata.api.error.ttypes.AiravataClientException.thrift_spec), None, ),  # 2
        (3, TType.STRUCT, 'ase', (apache.airavata.api.error.ttypes.AiravataSystemException, apache.airavata.api.error.ttypes.AiravataSystemException.thrift_spec), None, ),  # 3
        (4, TType.STRUCT, 'ae', (apache.airavata.api.error.ttypes.AuthorizationException, apache.airavata.api.error.ttypes.AuthorizationException.thrift_spec), None, ),  # 4
    )

    def __init__(self, success=None, ire=None, ace=None, ase=None, ae=None,):
        self.success = success
        self.ire = ire
        self.ace = ace
        self.ase = ase
        self.ae = ae

    def read(self, iprot):
        if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None:
            iprot._fast_decode(self, iprot, (self.__class__, self.thrift_spec))
            return
        iprot.readStructBegin()
        while True:
            (fname, ftype, fid) = iprot.readFieldBegin()
            if ftype == TType.STOP:
                break
            if fid == 0:
                if ftype == TType.LIST:
                    self.success = []
                    (_etype263, _size260) = iprot.readListBegin()
                    for _i264 in range(_size260):
                        _elem265 = apache.airavata.model.appcatalog.userresourceprofile.ttypes.UserStoragePreference()
                        _elem265.read(iprot)
                        self.success.append(_elem265)
                    iprot.readListEnd()
                else:
                    iprot.skip(ftype)
            elif fid == 1:
                if ftype == TType.STRUCT:
                    self.ire = apache.airavata.api.error.ttypes.InvalidRequestException()
                    self.ire.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 2:
                if ftype == TType.STRUCT:
                    self.ace = apache.airavata.api.error.ttypes.AiravataClientException()
                    self.ace.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 3:
                if ftype == TType.STRUCT:
                    self.ase = apache.airavata.api.error.ttypes.AiravataSystemException()
                    self.ase.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 4:
                if ftype == TType.STRUCT:
                    self.ae = apache.airavata.api.error.ttypes.AuthorizationException()
                    self.ae.read(iprot)
                else:
                    iprot.skip(ftype)
            else:
                iprot.skip(ftype)
            iprot.readFieldEnd()
        iprot.readStructEnd()

    def write(self, oprot):
        if oprot._fast_encode is not None and self.thrift_spec is not None:
            oprot.trans.write(oprot._fast_encode(self, (self.__class__, self.thrift_spec)))
            return
        oprot.writeStructBegin('getAllUserStoragePreferences_result')
        if self.success is not None:
            oprot.writeFieldBegin('success', TType.LIST, 0)
            oprot.writeListBegin(TType.STRUCT, len(self.success))
            for iter266 in self.success:
                iter266.write(oprot)
            oprot.writeListEnd()
            oprot.writeFieldEnd()
        if self.ire is not None:
            oprot.writeFieldBegin('ire', TType.STRUCT, 1)
            self.ire.write(oprot)
            oprot.writeFieldEnd()
        if self.ace is not None:
            oprot.writeFieldBegin('ace', TType.STRUCT, 2)
            self.ace.write(oprot)
            oprot.writeFieldEnd()
        if self.ase is not None:
            oprot.writeFieldBegin('ase', TType.STRUCT, 3)
            self.ase.write(oprot)
            oprot.writeFieldEnd()
        if self.ae is not None:
            oprot.writeFieldBegin('ae', TType.STRUCT, 4)
            self.ae.write(oprot)
            oprot.writeFieldEnd()
        oprot.writeFieldStop()
        oprot.writeStructEnd()

    def validate(self):
        return

    def __repr__(self):
        L = ['%s=%r' % (key, value)
             for key, value in self.__dict__.items()]
        return '%s(%s)' % (self.__class__.__name__, ', '.join(L))

    def __eq__(self, other):
        return isinstance(other, self.__class__) and self.__dict__ == other.__dict__

    def __ne__(self, other):
        return not (self == other)


class getAllUserResourceProfiles_args(object):
    """
    Attributes:
     - authzToken
    """

    thrift_spec = (
        None,  # 0
        (1, TType.STRUCT, 'authzToken', (apache.airavata.model.security.ttypes.AuthzToken, apache.airavata.model.security.ttypes.AuthzToken.thrift_spec), None, ),  # 1
    )

    def __init__(self, authzToken=None,):
        self.authzToken = authzToken

    def read(self, iprot):
        if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None:
            iprot._fast_decode(self, iprot, (self.__class__, self.thrift_spec))
            return
        iprot.readStructBegin()
        while True:
            (fname, ftype, fid) = iprot.readFieldBegin()
            if ftype == TType.STOP:
                break
            if fid == 1:
                if ftype == TType.STRUCT:
                    self.authzToken = apache.airavata.model.security.ttypes.AuthzToken()
                    self.authzToken.read(iprot)
                else:
                    iprot.skip(ftype)
            else:
                iprot.skip(ftype)
            iprot.readFieldEnd()
        iprot.readStructEnd()

    def write(self, oprot):
        if oprot._fast_encode is not None and self.thrift_spec is not None:
            oprot.trans.write(oprot._fast_encode(self, (self.__class__, self.thrift_spec)))
            return
        oprot.writeStructBegin('getAllUserResourceProfiles_args')
        if self.authzToken is not None:
            oprot.writeFieldBegin('authzToken', TType.STRUCT, 1)
            self.authzToken.write(oprot)
            oprot.writeFieldEnd()
        oprot.writeFieldStop()
        oprot.writeStructEnd()

    def validate(self):
        if self.authzToken is None:
            raise TProtocolException(message='Required field authzToken is unset!')
        return

    def __repr__(self):
        L = ['%s=%r' % (key, value)
             for key, value in self.__dict__.items()]
        return '%s(%s)' % (self.__class__.__name__, ', '.join(L))

    def __eq__(self, other):
        return isinstance(other, self.__class__) and self.__dict__ == other.__dict__

    def __ne__(self, other):
        return not (self == other)


class getAllUserResourceProfiles_result(object):
    """
    Attributes:
     - success
     - ire
     - ace
     - ase
     - ae
    """

    thrift_spec = (
        (0, TType.LIST, 'success', (TType.STRUCT, (apache.airavata.model.appcatalog.userresourceprofile.ttypes.UserResourceProfile, apache.airavata.model.appcatalog.userresourceprofile.ttypes.UserResourceProfile.thrift_spec), False), None, ),  # 0
        (1, TType.STRUCT, 'ire', (apache.airavata.api.error.ttypes.InvalidRequestException, apache.airavata.api.error.ttypes.InvalidRequestException.thrift_spec), None, ),  # 1
        (2, TType.STRUCT, 'ace', (apache.airavata.api.error.ttypes.AiravataClientException, apache.airavata.api.error.ttypes.AiravataClientException.thrift_spec), None, ),  # 2
        (3, TType.STRUCT, 'ase', (apache.airavata.api.error.ttypes.AiravataSystemException, apache.airavata.api.error.ttypes.AiravataSystemException.thrift_spec), None, ),  # 3
        (4, TType.STRUCT, 'ae', (apache.airavata.api.error.ttypes.AuthorizationException, apache.airavata.api.error.ttypes.AuthorizationException.thrift_spec), None, ),  # 4
    )

    def __init__(self, success=None, ire=None, ace=None, ase=None, ae=None,):
        self.success = success
        self.ire = ire
        self.ace = ace
        self.ase = ase
        self.ae = ae

    def read(self, iprot):
        if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None:
            iprot._fast_decode(self, iprot, (self.__class__, self.thrift_spec))
            return
        iprot.readStructBegin()
        while True:
            (fname, ftype, fid) = iprot.readFieldBegin()
            if ftype == TType.STOP:
                break
            if fid == 0:
                if ftype == TType.LIST:
                    self.success = []
                    (_etype270, _size267) = iprot.readListBegin()
                    for _i271 in range(_size267):
                        _elem272 = apache.airavata.model.appcatalog.userresourceprofile.ttypes.UserResourceProfile()
                        _elem272.read(iprot)
                        self.success.append(_elem272)
                    iprot.readListEnd()
                else:
                    iprot.skip(ftype)
            elif fid == 1:
                if ftype == TType.STRUCT:
                    self.ire = apache.airavata.api.error.ttypes.InvalidRequestException()
                    self.ire.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 2:
                if ftype == TType.STRUCT:
                    self.ace = apache.airavata.api.error.ttypes.AiravataClientException()
                    self.ace.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 3:
                if ftype == TType.STRUCT:
                    self.ase = apache.airavata.api.error.ttypes.AiravataSystemException()
                    self.ase.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 4:
                if ftype == TType.STRUCT:
                    self.ae = apache.airavata.api.error.ttypes.AuthorizationException()
                    self.ae.read(iprot)
                else:
                    iprot.skip(ftype)
            else:
                iprot.skip(ftype)
            iprot.readFieldEnd()
        iprot.readStructEnd()

    def write(self, oprot):
        if oprot._fast_encode is not None and self.thrift_spec is not None:
            oprot.trans.write(oprot._fast_encode(self, (self.__class__, self.thrift_spec)))
            return
        oprot.writeStructBegin('getAllUserResourceProfiles_result')
        if self.success is not None:
            oprot.writeFieldBegin('success', TType.LIST, 0)
            oprot.writeListBegin(TType.STRUCT, len(self.success))
            for iter273 in self.success:
                iter273.write(oprot)
            oprot.writeListEnd()
            oprot.writeFieldEnd()
        if self.ire is not None:
            oprot.writeFieldBegin('ire', TType.STRUCT, 1)
            self.ire.write(oprot)
            oprot.writeFieldEnd()
        if self.ace is not None:
            oprot.writeFieldBegin('ace', TType.STRUCT, 2)
            self.ace.write(oprot)
            oprot.writeFieldEnd()
        if self.ase is not None:
            oprot.writeFieldBegin('ase', TType.STRUCT, 3)
            self.ase.write(oprot)
            oprot.writeFieldEnd()
        if self.ae is not None:
            oprot.writeFieldBegin('ae', TType.STRUCT, 4)
            self.ae.write(oprot)
            oprot.writeFieldEnd()
        oprot.writeFieldStop()
        oprot.writeStructEnd()

    def validate(self):
        return

    def __repr__(self):
        L = ['%s=%r' % (key, value)
             for key, value in self.__dict__.items()]
        return '%s(%s)' % (self.__class__.__name__, ', '.join(L))

    def __eq__(self, other):
        return isinstance(other, self.__class__) and self.__dict__ == other.__dict__

    def __ne__(self, other):
        return not (self == other)


class updateUserComputeResourcePreference_args(object):
    """
    Attributes:
     - authzToken
     - userId
     - gatewayID
     - userComputeResourceId
     - userComputeResourcePreference
    """

    thrift_spec = (
        None,  # 0
        (1, TType.STRUCT, 'authzToken', (apache.airavata.model.security.ttypes.AuthzToken, apache.airavata.model.security.ttypes.AuthzToken.thrift_spec), None, ),  # 1
        (2, TType.STRING, 'userId', 'UTF8', None, ),  # 2
        (3, TType.STRING, 'gatewayID', 'UTF8', None, ),  # 3
        (4, TType.STRING, 'userComputeResourceId', 'UTF8', None, ),  # 4
        (5, TType.STRUCT, 'userComputeResourcePreference', (apache.airavata.model.appcatalog.userresourceprofile.ttypes.UserComputeResourcePreference, apache.airavata.model.appcatalog.userresourceprofile.ttypes.UserComputeResourcePreference.thrift_spec), None, ),  # 5
    )

    def __init__(self, authzToken=None, userId=None, gatewayID=None, userComputeResourceId=None, userComputeResourcePreference=None,):
        self.authzToken = authzToken
        self.userId = userId
        self.gatewayID = gatewayID
        self.userComputeResourceId = userComputeResourceId
        self.userComputeResourcePreference = userComputeResourcePreference

    def read(self, iprot):
        if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None:
            iprot._fast_decode(self, iprot, (self.__class__, self.thrift_spec))
            return
        iprot.readStructBegin()
        while True:
            (fname, ftype, fid) = iprot.readFieldBegin()
            if ftype == TType.STOP:
                break
            if fid == 1:
                if ftype == TType.STRUCT:
                    self.authzToken = apache.airavata.model.security.ttypes.AuthzToken()
                    self.authzToken.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 2:
                if ftype == TType.STRING:
                    self.userId = iprot.readString().decode('utf-8') if sys.version_info[0] == 2 else iprot.readString()
                else:
                    iprot.skip(ftype)
            elif fid == 3:
                if ftype == TType.STRING:
                    self.gatewayID = iprot.readString().decode('utf-8') if sys.version_info[0] == 2 else iprot.readString()
                else:
                    iprot.skip(ftype)
            elif fid == 4:
                if ftype == TType.STRING:
                    self.userComputeResourceId = iprot.readString().decode('utf-8') if sys.version_info[0] == 2 else iprot.readString()
                else:
                    iprot.skip(ftype)
            elif fid == 5:
                if ftype == TType.STRUCT:
                    self.userComputeResourcePreference = apache.airavata.model.appcatalog.userresourceprofile.ttypes.UserComputeResourcePreference()
                    self.userComputeResourcePreference.read(iprot)
                else:
                    iprot.skip(ftype)
            else:
                iprot.skip(ftype)
            iprot.readFieldEnd()
        iprot.readStructEnd()

    def write(self, oprot):
        if oprot._fast_encode is not None and self.thrift_spec is not None:
            oprot.trans.write(oprot._fast_encode(self, (self.__class__, self.thrift_spec)))
            return
        oprot.writeStructBegin('updateUserComputeResourcePreference_args')
        if self.authzToken is not None:
            oprot.writeFieldBegin('authzToken', TType.STRUCT, 1)
            self.authzToken.write(oprot)
            oprot.writeFieldEnd()
        if self.userId is not None:
            oprot.writeFieldBegin('userId', TType.STRING, 2)
            oprot.writeString(self.userId.encode('utf-8') if sys.version_info[0] == 2 else self.userId)
            oprot.writeFieldEnd()
        if self.gatewayID is not None:
            oprot.writeFieldBegin('gatewayID', TType.STRING, 3)
            oprot.writeString(self.gatewayID.encode('utf-8') if sys.version_info[0] == 2 else self.gatewayID)
            oprot.writeFieldEnd()
        if self.userComputeResourceId is not None:
            oprot.writeFieldBegin('userComputeResourceId', TType.STRING, 4)
            oprot.writeString(self.userComputeResourceId.encode('utf-8') if sys.version_info[0] == 2 else self.userComputeResourceId)
            oprot.writeFieldEnd()
        if self.userComputeResourcePreference is not None:
            oprot.writeFieldBegin('userComputeResourcePreference', TType.STRUCT, 5)
            self.userComputeResourcePreference.write(oprot)
            oprot.writeFieldEnd()
        oprot.writeFieldStop()
        oprot.writeStructEnd()

    def validate(self):
        if self.authzToken is None:
            raise TProtocolException(message='Required field authzToken is unset!')
        if self.userId is None:
            raise TProtocolException(message='Required field userId is unset!')
        if self.gatewayID is None:
            raise TProtocolException(message='Required field gatewayID is unset!')
        if self.userComputeResourceId is None:
            raise TProtocolException(message='Required field userComputeResourceId is unset!')
        if self.userComputeResourcePreference is None:
            raise TProtocolException(message='Required field userComputeResourcePreference is unset!')
        return

    def __repr__(self):
        L = ['%s=%r' % (key, value)
             for key, value in self.__dict__.items()]
        return '%s(%s)' % (self.__class__.__name__, ', '.join(L))

    def __eq__(self, other):
        return isinstance(other, self.__class__) and self.__dict__ == other.__dict__

    def __ne__(self, other):
        return not (self == other)


class updateUserComputeResourcePreference_result(object):
    """
    Attributes:
     - success
     - ire
     - ace
     - ase
     - ae
    """

    thrift_spec = (
        (0, TType.BOOL, 'success', None, None, ),  # 0
        (1, TType.STRUCT, 'ire', (apache.airavata.api.error.ttypes.InvalidRequestException, apache.airavata.api.error.ttypes.InvalidRequestException.thrift_spec), None, ),  # 1
        (2, TType.STRUCT, 'ace', (apache.airavata.api.error.ttypes.AiravataClientException, apache.airavata.api.error.ttypes.AiravataClientException.thrift_spec), None, ),  # 2
        (3, TType.STRUCT, 'ase', (apache.airavata.api.error.ttypes.AiravataSystemException, apache.airavata.api.error.ttypes.AiravataSystemException.thrift_spec), None, ),  # 3
        (4, TType.STRUCT, 'ae', (apache.airavata.api.error.ttypes.AuthorizationException, apache.airavata.api.error.ttypes.AuthorizationException.thrift_spec), None, ),  # 4
    )

    def __init__(self, success=None, ire=None, ace=None, ase=None, ae=None,):
        self.success = success
        self.ire = ire
        self.ace = ace
        self.ase = ase
        self.ae = ae

    def read(self, iprot):
        if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None:
            iprot._fast_decode(self, iprot, (self.__class__, self.thrift_spec))
            return
        iprot.readStructBegin()
        while True:
            (fname, ftype, fid) = iprot.readFieldBegin()
            if ftype == TType.STOP:
                break
            if fid == 0:
                if ftype == TType.BOOL:
                    self.success = iprot.readBool()
                else:
                    iprot.skip(ftype)
            elif fid == 1:
                if ftype == TType.STRUCT:
                    self.ire = apache.airavata.api.error.ttypes.InvalidRequestException()
                    self.ire.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 2:
                if ftype == TType.STRUCT:
                    self.ace = apache.airavata.api.error.ttypes.AiravataClientException()
                    self.ace.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 3:
                if ftype == TType.STRUCT:
                    self.ase = apache.airavata.api.error.ttypes.AiravataSystemException()
                    self.ase.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 4:
                if ftype == TType.STRUCT:
                    self.ae = apache.airavata.api.error.ttypes.AuthorizationException()
                    self.ae.read(iprot)
                else:
                    iprot.skip(ftype)
            else:
                iprot.skip(ftype)
            iprot.readFieldEnd()
        iprot.readStructEnd()

    def write(self, oprot):
        if oprot._fast_encode is not None and self.thrift_spec is not None:
            oprot.trans.write(oprot._fast_encode(self, (self.__class__, self.thrift_spec)))
            return
        oprot.writeStructBegin('updateUserComputeResourcePreference_result')
        if self.success is not None:
            oprot.writeFieldBegin('success', TType.BOOL, 0)
            oprot.writeBool(self.success)
            oprot.writeFieldEnd()
        if self.ire is not None:
            oprot.writeFieldBegin('ire', TType.STRUCT, 1)
            self.ire.write(oprot)
            oprot.writeFieldEnd()
        if self.ace is not None:
            oprot.writeFieldBegin('ace', TType.STRUCT, 2)
            self.ace.write(oprot)
            oprot.writeFieldEnd()
        if self.ase is not None:
            oprot.writeFieldBegin('ase', TType.STRUCT, 3)
            self.ase.write(oprot)
            oprot.writeFieldEnd()
        if self.ae is not None:
            oprot.writeFieldBegin('ae', TType.STRUCT, 4)
            self.ae.write(oprot)
            oprot.writeFieldEnd()
        oprot.writeFieldStop()
        oprot.writeStructEnd()

    def validate(self):
        return

    def __repr__(self):
        L = ['%s=%r' % (key, value)
             for key, value in self.__dict__.items()]
        return '%s(%s)' % (self.__class__.__name__, ', '.join(L))

    def __eq__(self, other):
        return isinstance(other, self.__class__) and self.__dict__ == other.__dict__

    def __ne__(self, other):
        return not (self == other)


class updateUserStoragePreference_args(object):
    """
    Attributes:
     - authzToken
     - userId
     - gatewayID
     - userStorageId
     - userStoragePreference
    """

    thrift_spec = (
        None,  # 0
        (1, TType.STRUCT, 'authzToken', (apache.airavata.model.security.ttypes.AuthzToken, apache.airavata.model.security.ttypes.AuthzToken.thrift_spec), None, ),  # 1
        (2, TType.STRING, 'userId', 'UTF8', None, ),  # 2
        (3, TType.STRING, 'gatewayID', 'UTF8', None, ),  # 3
        (4, TType.STRING, 'userStorageId', 'UTF8', None, ),  # 4
        (5, TType.STRUCT, 'userStoragePreference', (apache.airavata.model.appcatalog.userresourceprofile.ttypes.UserStoragePreference, apache.airavata.model.appcatalog.userresourceprofile.ttypes.UserStoragePreference.thrift_spec), None, ),  # 5
    )

    def __init__(self, authzToken=None, userId=None, gatewayID=None, userStorageId=None, userStoragePreference=None,):
        self.authzToken = authzToken
        self.userId = userId
        self.gatewayID = gatewayID
        self.userStorageId = userStorageId
        self.userStoragePreference = userStoragePreference

    def read(self, iprot):
        if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None:
            iprot._fast_decode(self, iprot, (self.__class__, self.thrift_spec))
            return
        iprot.readStructBegin()
        while True:
            (fname, ftype, fid) = iprot.readFieldBegin()
            if ftype == TType.STOP:
                break
            if fid == 1:
                if ftype == TType.STRUCT:
                    self.authzToken = apache.airavata.model.security.ttypes.AuthzToken()
                    self.authzToken.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 2:
                if ftype == TType.STRING:
                    self.userId = iprot.readString().decode('utf-8') if sys.version_info[0] == 2 else iprot.readString()
                else:
                    iprot.skip(ftype)
            elif fid == 3:
                if ftype == TType.STRING:
                    self.gatewayID = iprot.readString().decode('utf-8') if sys.version_info[0] == 2 else iprot.readString()
                else:
                    iprot.skip(ftype)
            elif fid == 4:
                if ftype == TType.STRING:
                    self.userStorageId = iprot.readString().decode('utf-8') if sys.version_info[0] == 2 else iprot.readString()
                else:
                    iprot.skip(ftype)
            elif fid == 5:
                if ftype == TType.STRUCT:
                    self.userStoragePreference = apache.airavata.model.appcatalog.userresourceprofile.ttypes.UserStoragePreference()
                    self.userStoragePreference.read(iprot)
                else:
                    iprot.skip(ftype)
            else:
                iprot.skip(ftype)
            iprot.readFieldEnd()
        iprot.readStructEnd()

    def write(self, oprot):
        if oprot._fast_encode is not None and self.thrift_spec is not None:
            oprot.trans.write(oprot._fast_encode(self, (self.__class__, self.thrift_spec)))
            return
        oprot.writeStructBegin('updateUserStoragePreference_args')
        if self.authzToken is not None:
            oprot.writeFieldBegin('authzToken', TType.STRUCT, 1)
            self.authzToken.write(oprot)
            oprot.writeFieldEnd()
        if self.userId is not None:
            oprot.writeFieldBegin('userId', TType.STRING, 2)
            oprot.writeString(self.userId.encode('utf-8') if sys.version_info[0] == 2 else self.userId)
            oprot.writeFieldEnd()
        if self.gatewayID is not None:
            oprot.writeFieldBegin('gatewayID', TType.STRING, 3)
            oprot.writeString(self.gatewayID.encode('utf-8') if sys.version_info[0] == 2 else self.gatewayID)
            oprot.writeFieldEnd()
        if self.userStorageId is not None:
            oprot.writeFieldBegin('userStorageId', TType.STRING, 4)
            oprot.writeString(self.userStorageId.encode('utf-8') if sys.version_info[0] == 2 else self.userStorageId)
            oprot.writeFieldEnd()
        if self.userStoragePreference is not None:
            oprot.writeFieldBegin('userStoragePreference', TType.STRUCT, 5)
            self.userStoragePreference.write(oprot)
            oprot.writeFieldEnd()
        oprot.writeFieldStop()
        oprot.writeStructEnd()

    def validate(self):
        if self.authzToken is None:
            raise TProtocolException(message='Required field authzToken is unset!')
        if self.userId is None:
            raise TProtocolException(message='Required field userId is unset!')
        if self.gatewayID is None:
            raise TProtocolException(message='Required field gatewayID is unset!')
        if self.userStorageId is None:
            raise TProtocolException(message='Required field userStorageId is unset!')
        if self.userStoragePreference is None:
            raise TProtocolException(message='Required field userStoragePreference is unset!')
        return

    def __repr__(self):
        L = ['%s=%r' % (key, value)
             for key, value in self.__dict__.items()]
        return '%s(%s)' % (self.__class__.__name__, ', '.join(L))

    def __eq__(self, other):
        return isinstance(other, self.__class__) and self.__dict__ == other.__dict__

    def __ne__(self, other):
        return not (self == other)


class updateUserStoragePreference_result(object):
    """
    Attributes:
     - success
     - ire
     - ace
     - ase
     - ae
    """

    thrift_spec = (
        (0, TType.BOOL, 'success', None, None, ),  # 0
        (1, TType.STRUCT, 'ire', (apache.airavata.api.error.ttypes.InvalidRequestException, apache.airavata.api.error.ttypes.InvalidRequestException.thrift_spec), None, ),  # 1
        (2, TType.STRUCT, 'ace', (apache.airavata.api.error.ttypes.AiravataClientException, apache.airavata.api.error.ttypes.AiravataClientException.thrift_spec), None, ),  # 2
        (3, TType.STRUCT, 'ase', (apache.airavata.api.error.ttypes.AiravataSystemException, apache.airavata.api.error.ttypes.AiravataSystemException.thrift_spec), None, ),  # 3
        (4, TType.STRUCT, 'ae', (apache.airavata.api.error.ttypes.AuthorizationException, apache.airavata.api.error.ttypes.AuthorizationException.thrift_spec), None, ),  # 4
    )

    def __init__(self, success=None, ire=None, ace=None, ase=None, ae=None,):
        self.success = success
        self.ire = ire
        self.ace = ace
        self.ase = ase
        self.ae = ae

    def read(self, iprot):
        if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None:
            iprot._fast_decode(self, iprot, (self.__class__, self.thrift_spec))
            return
        iprot.readStructBegin()
        while True:
            (fname, ftype, fid) = iprot.readFieldBegin()
            if ftype == TType.STOP:
                break
            if fid == 0:
                if ftype == TType.BOOL:
                    self.success = iprot.readBool()
                else:
                    iprot.skip(ftype)
            elif fid == 1:
                if ftype == TType.STRUCT:
                    self.ire = apache.airavata.api.error.ttypes.InvalidRequestException()
                    self.ire.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 2:
                if ftype == TType.STRUCT:
                    self.ace = apache.airavata.api.error.ttypes.AiravataClientException()
                    self.ace.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 3:
                if ftype == TType.STRUCT:
                    self.ase = apache.airavata.api.error.ttypes.AiravataSystemException()
                    self.ase.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 4:
                if ftype == TType.STRUCT:
                    self.ae = apache.airavata.api.error.ttypes.AuthorizationException()
                    self.ae.read(iprot)
                else:
                    iprot.skip(ftype)
            else:
                iprot.skip(ftype)
            iprot.readFieldEnd()
        iprot.readStructEnd()

    def write(self, oprot):
        if oprot._fast_encode is not None and self.thrift_spec is not None:
            oprot.trans.write(oprot._fast_encode(self, (self.__class__, self.thrift_spec)))
            return
        oprot.writeStructBegin('updateUserStoragePreference_result')
        if self.success is not None:
            oprot.writeFieldBegin('success', TType.BOOL, 0)
            oprot.writeBool(self.success)
            oprot.writeFieldEnd()
        if self.ire is not None:
            oprot.writeFieldBegin('ire', TType.STRUCT, 1)
            self.ire.write(oprot)
            oprot.writeFieldEnd()
        if self.ace is not None:
            oprot.writeFieldBegin('ace', TType.STRUCT, 2)
            self.ace.write(oprot)
            oprot.writeFieldEnd()
        if self.ase is not None:
            oprot.writeFieldBegin('ase', TType.STRUCT, 3)
            self.ase.write(oprot)
            oprot.writeFieldEnd()
        if self.ae is not None:
            oprot.writeFieldBegin('ae', TType.STRUCT, 4)
            self.ae.write(oprot)
            oprot.writeFieldEnd()
        oprot.writeFieldStop()
        oprot.writeStructEnd()

    def validate(self):
        return

    def __repr__(self):
        L = ['%s=%r' % (key, value)
             for key, value in self.__dict__.items()]
        return '%s(%s)' % (self.__class__.__name__, ', '.join(L))

    def __eq__(self, other):
        return isinstance(other, self.__class__) and self.__dict__ == other.__dict__

    def __ne__(self, other):
        return not (self == other)


class deleteUserComputeResourcePreference_args(object):
    """
    Attributes:
     - authzToken
     - userId
     - gatewayID
     - userComputeResourceId
    """

    thrift_spec = (
        None,  # 0
        (1, TType.STRUCT, 'authzToken', (apache.airavata.model.security.ttypes.AuthzToken, apache.airavata.model.security.ttypes.AuthzToken.thrift_spec), None, ),  # 1
        (2, TType.STRING, 'userId', 'UTF8', None, ),  # 2
        (3, TType.STRING, 'gatewayID', 'UTF8', None, ),  # 3
        (4, TType.STRING, 'userComputeResourceId', 'UTF8', None, ),  # 4
    )

    def __init__(self, authzToken=None, userId=None, gatewayID=None, userComputeResourceId=None,):
        self.authzToken = authzToken
        self.userId = userId
        self.gatewayID = gatewayID
        self.userComputeResourceId = userComputeResourceId

    def read(self, iprot):
        if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None:
            iprot._fast_decode(self, iprot, (self.__class__, self.thrift_spec))
            return
        iprot.readStructBegin()
        while True:
            (fname, ftype, fid) = iprot.readFieldBegin()
            if ftype == TType.STOP:
                break
            if fid == 1:
                if ftype == TType.STRUCT:
                    self.authzToken = apache.airavata.model.security.ttypes.AuthzToken()
                    self.authzToken.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 2:
                if ftype == TType.STRING:
                    self.userId = iprot.readString().decode('utf-8') if sys.version_info[0] == 2 else iprot.readString()
                else:
                    iprot.skip(ftype)
            elif fid == 3:
                if ftype == TType.STRING:
                    self.gatewayID = iprot.readString().decode('utf-8') if sys.version_info[0] == 2 else iprot.readString()
                else:
                    iprot.skip(ftype)
            elif fid == 4:
                if ftype == TType.STRING:
                    self.userComputeResourceId = iprot.readString().decode('utf-8') if sys.version_info[0] == 2 else iprot.readString()
                else:
                    iprot.skip(ftype)
            else:
                iprot.skip(ftype)
            iprot.readFieldEnd()
        iprot.readStructEnd()

    def write(self, oprot):
        if oprot._fast_encode is not None and self.thrift_spec is not None:
            oprot.trans.write(oprot._fast_encode(self, (self.__class__, self.thrift_spec)))
            return
        oprot.writeStructBegin('deleteUserComputeResourcePreference_args')
        if self.authzToken is not None:
            oprot.writeFieldBegin('authzToken', TType.STRUCT, 1)
            self.authzToken.write(oprot)
            oprot.writeFieldEnd()
        if self.userId is not None:
            oprot.writeFieldBegin('userId', TType.STRING, 2)
            oprot.writeString(self.userId.encode('utf-8') if sys.version_info[0] == 2 else self.userId)
            oprot.writeFieldEnd()
        if self.gatewayID is not None:
            oprot.writeFieldBegin('gatewayID', TType.STRING, 3)
            oprot.writeString(self.gatewayID.encode('utf-8') if sys.version_info[0] == 2 else self.gatewayID)
            oprot.writeFieldEnd()
        if self.userComputeResourceId is not None:
            oprot.writeFieldBegin('userComputeResourceId', TType.STRING, 4)
            oprot.writeString(self.userComputeResourceId.encode('utf-8') if sys.version_info[0] == 2 else self.userComputeResourceId)
            oprot.writeFieldEnd()
        oprot.writeFieldStop()
        oprot.writeStructEnd()

    def validate(self):
        if self.authzToken is None:
            raise TProtocolException(message='Required field authzToken is unset!')
        if self.userId is None:
            raise TProtocolException(message='Required field userId is unset!')
        if self.gatewayID is None:
            raise TProtocolException(message='Required field gatewayID is unset!')
        if self.userComputeResourceId is None:
            raise TProtocolException(message='Required field userComputeResourceId is unset!')
        return

    def __repr__(self):
        L = ['%s=%r' % (key, value)
             for key, value in self.__dict__.items()]
        return '%s(%s)' % (self.__class__.__name__, ', '.join(L))

    def __eq__(self, other):
        return isinstance(other, self.__class__) and self.__dict__ == other.__dict__

    def __ne__(self, other):
        return not (self == other)


class deleteUserComputeResourcePreference_result(object):
    """
    Attributes:
     - success
     - ire
     - ace
     - ase
     - ae
    """

    thrift_spec = (
        (0, TType.BOOL, 'success', None, None, ),  # 0
        (1, TType.STRUCT, 'ire', (apache.airavata.api.error.ttypes.InvalidRequestException, apache.airavata.api.error.ttypes.InvalidRequestException.thrift_spec), None, ),  # 1
        (2, TType.STRUCT, 'ace', (apache.airavata.api.error.ttypes.AiravataClientException, apache.airavata.api.error.ttypes.AiravataClientException.thrift_spec), None, ),  # 2
        (3, TType.STRUCT, 'ase', (apache.airavata.api.error.ttypes.AiravataSystemException, apache.airavata.api.error.ttypes.AiravataSystemException.thrift_spec), None, ),  # 3
        (4, TType.STRUCT, 'ae', (apache.airavata.api.error.ttypes.AuthorizationException, apache.airavata.api.error.ttypes.AuthorizationException.thrift_spec), None, ),  # 4
    )

    def __init__(self, success=None, ire=None, ace=None, ase=None, ae=None,):
        self.success = success
        self.ire = ire
        self.ace = ace
        self.ase = ase
        self.ae = ae

    def read(self, iprot):
        if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None:
            iprot._fast_decode(self, iprot, (self.__class__, self.thrift_spec))
            return
        iprot.readStructBegin()
        while True:
            (fname, ftype, fid) = iprot.readFieldBegin()
            if ftype == TType.STOP:
                break
            if fid == 0:
                if ftype == TType.BOOL:
                    self.success = iprot.readBool()
                else:
                    iprot.skip(ftype)
            elif fid == 1:
                if ftype == TType.STRUCT:
                    self.ire = apache.airavata.api.error.ttypes.InvalidRequestException()
                    self.ire.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 2:
                if ftype == TType.STRUCT:
                    self.ace = apache.airavata.api.error.ttypes.AiravataClientException()
                    self.ace.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 3:
                if ftype == TType.STRUCT:
                    self.ase = apache.airavata.api.error.ttypes.AiravataSystemException()
                    self.ase.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 4:
                if ftype == TType.STRUCT:
                    self.ae = apache.airavata.api.error.ttypes.AuthorizationException()
                    self.ae.read(iprot)
                else:
                    iprot.skip(ftype)
            else:
                iprot.skip(ftype)
            iprot.readFieldEnd()
        iprot.readStructEnd()

    def write(self, oprot):
        if oprot._fast_encode is not None and self.thrift_spec is not None:
            oprot.trans.write(oprot._fast_encode(self, (self.__class__, self.thrift_spec)))
            return
        oprot.writeStructBegin('deleteUserComputeResourcePreference_result')
        if self.success is not None:
            oprot.writeFieldBegin('success', TType.BOOL, 0)
            oprot.writeBool(self.success)
            oprot.writeFieldEnd()
        if self.ire is not None:
            oprot.writeFieldBegin('ire', TType.STRUCT, 1)
            self.ire.write(oprot)
            oprot.writeFieldEnd()
        if self.ace is not None:
            oprot.writeFieldBegin('ace', TType.STRUCT, 2)
            self.ace.write(oprot)
            oprot.writeFieldEnd()
        if self.ase is not None:
            oprot.writeFieldBegin('ase', TType.STRUCT, 3)
            self.ase.write(oprot)
            oprot.writeFieldEnd()
        if self.ae is not None:
            oprot.writeFieldBegin('ae', TType.STRUCT, 4)
            self.ae.write(oprot)
            oprot.writeFieldEnd()
        oprot.writeFieldStop()
        oprot.writeStructEnd()

    def validate(self):
        return

    def __repr__(self):
        L = ['%s=%r' % (key, value)
             for key, value in self.__dict__.items()]
        return '%s(%s)' % (self.__class__.__name__, ', '.join(L))

    def __eq__(self, other):
        return isinstance(other, self.__class__) and self.__dict__ == other.__dict__

    def __ne__(self, other):
        return not (self == other)


class deleteUserStoragePreference_args(object):
    """
    Attributes:
     - authzToken
     - userId
     - gatewayID
     - userStorageId
    """

    thrift_spec = (
        None,  # 0
        (1, TType.STRUCT, 'authzToken', (apache.airavata.model.security.ttypes.AuthzToken, apache.airavata.model.security.ttypes.AuthzToken.thrift_spec), None, ),  # 1
        (2, TType.STRING, 'userId', 'UTF8', None, ),  # 2
        (3, TType.STRING, 'gatewayID', 'UTF8', None, ),  # 3
        (4, TType.STRING, 'userStorageId', 'UTF8', None, ),  # 4
    )

    def __init__(self, authzToken=None, userId=None, gatewayID=None, userStorageId=None,):
        self.authzToken = authzToken
        self.userId = userId
        self.gatewayID = gatewayID
        self.userStorageId = userStorageId

    def read(self, iprot):
        if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None:
            iprot._fast_decode(self, iprot, (self.__class__, self.thrift_spec))
            return
        iprot.readStructBegin()
        while True:
            (fname, ftype, fid) = iprot.readFieldBegin()
            if ftype == TType.STOP:
                break
            if fid == 1:
                if ftype == TType.STRUCT:
                    self.authzToken = apache.airavata.model.security.ttypes.AuthzToken()
                    self.authzToken.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 2:
                if ftype == TType.STRING:
                    self.userId = iprot.readString().decode('utf-8') if sys.version_info[0] == 2 else iprot.readString()
                else:
                    iprot.skip(ftype)
            elif fid == 3:
                if ftype == TType.STRING:
                    self.gatewayID = iprot.readString().decode('utf-8') if sys.version_info[0] == 2 else iprot.readString()
                else:
                    iprot.skip(ftype)
            elif fid == 4:
                if ftype == TType.STRING:
                    self.userStorageId = iprot.readString().decode('utf-8') if sys.version_info[0] == 2 else iprot.readString()
                else:
                    iprot.skip(ftype)
            else:
                iprot.skip(ftype)
            iprot.readFieldEnd()
        iprot.readStructEnd()

    def write(self, oprot):
        if oprot._fast_encode is not None and self.thrift_spec is not None:
            oprot.trans.write(oprot._fast_encode(self, (self.__class__, self.thrift_spec)))
            return
        oprot.writeStructBegin('deleteUserStoragePreference_args')
        if self.authzToken is not None:
            oprot.writeFieldBegin('authzToken', TType.STRUCT, 1)
            self.authzToken.write(oprot)
            oprot.writeFieldEnd()
        if self.userId is not None:
            oprot.writeFieldBegin('userId', TType.STRING, 2)
            oprot.writeString(self.userId.encode('utf-8') if sys.version_info[0] == 2 else self.userId)
            oprot.writeFieldEnd()
        if self.gatewayID is not None:
            oprot.writeFieldBegin('gatewayID', TType.STRING, 3)
            oprot.writeString(self.gatewayID.encode('utf-8') if sys.version_info[0] == 2 else self.gatewayID)
            oprot.writeFieldEnd()
        if self.userStorageId is not None:
            oprot.writeFieldBegin('userStorageId', TType.STRING, 4)
            oprot.writeString(self.userStorageId.encode('utf-8') if sys.version_info[0] == 2 else self.userStorageId)
            oprot.writeFieldEnd()
        oprot.writeFieldStop()
        oprot.writeStructEnd()

    def validate(self):
        if self.authzToken is None:
            raise TProtocolException(message='Required field authzToken is unset!')
        if self.userId is None:
            raise TProtocolException(message='Required field userId is unset!')
        if self.gatewayID is None:
            raise TProtocolException(message='Required field gatewayID is unset!')
        if self.userStorageId is None:
            raise TProtocolException(message='Required field userStorageId is unset!')
        return

    def __repr__(self):
        L = ['%s=%r' % (key, value)
             for key, value in self.__dict__.items()]
        return '%s(%s)' % (self.__class__.__name__, ', '.join(L))

    def __eq__(self, other):
        return isinstance(other, self.__class__) and self.__dict__ == other.__dict__

    def __ne__(self, other):
        return not (self == other)


class deleteUserStoragePreference_result(object):
    """
    Attributes:
     - success
     - ire
     - ace
     - ase
     - ae
    """

    thrift_spec = (
        (0, TType.BOOL, 'success', None, None, ),  # 0
        (1, TType.STRUCT, 'ire', (apache.airavata.api.error.ttypes.InvalidRequestException, apache.airavata.api.error.ttypes.InvalidRequestException.thrift_spec), None, ),  # 1
        (2, TType.STRUCT, 'ace', (apache.airavata.api.error.ttypes.AiravataClientException, apache.airavata.api.error.ttypes.AiravataClientException.thrift_spec), None, ),  # 2
        (3, TType.STRUCT, 'ase', (apache.airavata.api.error.ttypes.AiravataSystemException, apache.airavata.api.error.ttypes.AiravataSystemException.thrift_spec), None, ),  # 3
        (4, TType.STRUCT, 'ae', (apache.airavata.api.error.ttypes.AuthorizationException, apache.airavata.api.error.ttypes.AuthorizationException.thrift_spec), None, ),  # 4
    )

    def __init__(self, success=None, ire=None, ace=None, ase=None, ae=None,):
        self.success = success
        self.ire = ire
        self.ace = ace
        self.ase = ase
        self.ae = ae

    def read(self, iprot):
        if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None:
            iprot._fast_decode(self, iprot, (self.__class__, self.thrift_spec))
            return
        iprot.readStructBegin()
        while True:
            (fname, ftype, fid) = iprot.readFieldBegin()
            if ftype == TType.STOP:
                break
            if fid == 0:
                if ftype == TType.BOOL:
                    self.success = iprot.readBool()
                else:
                    iprot.skip(ftype)
            elif fid == 1:
                if ftype == TType.STRUCT:
                    self.ire = apache.airavata.api.error.ttypes.InvalidRequestException()
                    self.ire.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 2:
                if ftype == TType.STRUCT:
                    self.ace = apache.airavata.api.error.ttypes.AiravataClientException()
                    self.ace.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 3:
                if ftype == TType.STRUCT:
                    self.ase = apache.airavata.api.error.ttypes.AiravataSystemException()
                    self.ase.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 4:
                if ftype == TType.STRUCT:
                    self.ae = apache.airavata.api.error.ttypes.AuthorizationException()
                    self.ae.read(iprot)
                else:
                    iprot.skip(ftype)
            else:
                iprot.skip(ftype)
            iprot.readFieldEnd()
        iprot.readStructEnd()

    def write(self, oprot):
        if oprot._fast_encode is not None and self.thrift_spec is not None:
            oprot.trans.write(oprot._fast_encode(self, (self.__class__, self.thrift_spec)))
            return
        oprot.writeStructBegin('deleteUserStoragePreference_result')
        if self.success is not None:
            oprot.writeFieldBegin('success', TType.BOOL, 0)
            oprot.writeBool(self.success)
            oprot.writeFieldEnd()
        if self.ire is not None:
            oprot.writeFieldBegin('ire', TType.STRUCT, 1)
            self.ire.write(oprot)
            oprot.writeFieldEnd()
        if self.ace is not None:
            oprot.writeFieldBegin('ace', TType.STRUCT, 2)
            self.ace.write(oprot)
            oprot.writeFieldEnd()
        if self.ase is not None:
            oprot.writeFieldBegin('ase', TType.STRUCT, 3)
            self.ase.write(oprot)
            oprot.writeFieldEnd()
        if self.ae is not None:
            oprot.writeFieldBegin('ae', TType.STRUCT, 4)
            self.ae.write(oprot)
            oprot.writeFieldEnd()
        oprot.writeFieldStop()
        oprot.writeStructEnd()

    def validate(self):
        return

    def __repr__(self):
        L = ['%s=%r' % (key, value)
             for key, value in self.__dict__.items()]
        return '%s(%s)' % (self.__class__.__name__, ', '.join(L))

    def __eq__(self, other):
        return isinstance(other, self.__class__) and self.__dict__ == other.__dict__

    def __ne__(self, other):
        return not (self == other)


class getAllWorkflows_args(object):
    """
    Attributes:
     - authzToken
     - gatewayId
    """

    thrift_spec = (
        None,  # 0
        (1, TType.STRUCT, 'authzToken', (apache.airavata.model.security.ttypes.AuthzToken, apache.airavata.model.security.ttypes.AuthzToken.thrift_spec), None, ),  # 1
        (2, TType.STRING, 'gatewayId', 'UTF8', None, ),  # 2
    )

    def __init__(self, authzToken=None, gatewayId=None,):
        self.authzToken = authzToken
        self.gatewayId = gatewayId

    def read(self, iprot):
        if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None:
            iprot._fast_decode(self, iprot, (self.__class__, self.thrift_spec))
            return
        iprot.readStructBegin()
        while True:
            (fname, ftype, fid) = iprot.readFieldBegin()
            if ftype == TType.STOP:
                break
            if fid == 1:
                if ftype == TType.STRUCT:
                    self.authzToken = apache.airavata.model.security.ttypes.AuthzToken()
                    self.authzToken.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 2:
                if ftype == TType.STRING:
                    self.gatewayId = iprot.readString().decode('utf-8') if sys.version_info[0] == 2 else iprot.readString()
                else:
                    iprot.skip(ftype)
            else:
                iprot.skip(ftype)
            iprot.readFieldEnd()
        iprot.readStructEnd()

    def write(self, oprot):
        if oprot._fast_encode is not None and self.thrift_spec is not None:
            oprot.trans.write(oprot._fast_encode(self, (self.__class__, self.thrift_spec)))
            return
        oprot.writeStructBegin('getAllWorkflows_args')
        if self.authzToken is not None:
            oprot.writeFieldBegin('authzToken', TType.STRUCT, 1)
            self.authzToken.write(oprot)
            oprot.writeFieldEnd()
        if self.gatewayId is not None:
            oprot.writeFieldBegin('gatewayId', TType.STRING, 2)
            oprot.writeString(self.gatewayId.encode('utf-8') if sys.version_info[0] == 2 else self.gatewayId)
            oprot.writeFieldEnd()
        oprot.writeFieldStop()
        oprot.writeStructEnd()

    def validate(self):
        if self.authzToken is None:
            raise TProtocolException(message='Required field authzToken is unset!')
        if self.gatewayId is None:
            raise TProtocolException(message='Required field gatewayId is unset!')
        return

    def __repr__(self):
        L = ['%s=%r' % (key, value)
             for key, value in self.__dict__.items()]
        return '%s(%s)' % (self.__class__.__name__, ', '.join(L))

    def __eq__(self, other):
        return isinstance(other, self.__class__) and self.__dict__ == other.__dict__

    def __ne__(self, other):
        return not (self == other)


class getAllWorkflows_result(object):
    """
    Attributes:
     - success
     - ire
     - ace
     - ase
     - ae
    """

    thrift_spec = (
        (0, TType.LIST, 'success', (TType.STRING, 'UTF8', False), None, ),  # 0
        (1, TType.STRUCT, 'ire', (apache.airavata.api.error.ttypes.InvalidRequestException, apache.airavata.api.error.ttypes.InvalidRequestException.thrift_spec), None, ),  # 1
        (2, TType.STRUCT, 'ace', (apache.airavata.api.error.ttypes.AiravataClientException, apache.airavata.api.error.ttypes.AiravataClientException.thrift_spec), None, ),  # 2
        (3, TType.STRUCT, 'ase', (apache.airavata.api.error.ttypes.AiravataSystemException, apache.airavata.api.error.ttypes.AiravataSystemException.thrift_spec), None, ),  # 3
        (4, TType.STRUCT, 'ae', (apache.airavata.api.error.ttypes.AuthorizationException, apache.airavata.api.error.ttypes.AuthorizationException.thrift_spec), None, ),  # 4
    )

    def __init__(self, success=None, ire=None, ace=None, ase=None, ae=None,):
        self.success = success
        self.ire = ire
        self.ace = ace
        self.ase = ase
        self.ae = ae

    def read(self, iprot):
        if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None:
            iprot._fast_decode(self, iprot, (self.__class__, self.thrift_spec))
            return
        iprot.readStructBegin()
        while True:
            (fname, ftype, fid) = iprot.readFieldBegin()
            if ftype == TType.STOP:
                break
            if fid == 0:
                if ftype == TType.LIST:
                    self.success = []
                    (_etype277, _size274) = iprot.readListBegin()
                    for _i278 in range(_size274):
                        _elem279 = iprot.readString().decode('utf-8') if sys.version_info[0] == 2 else iprot.readString()
                        self.success.append(_elem279)
                    iprot.readListEnd()
                else:
                    iprot.skip(ftype)
            elif fid == 1:
                if ftype == TType.STRUCT:
                    self.ire = apache.airavata.api.error.ttypes.InvalidRequestException()
                    self.ire.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 2:
                if ftype == TType.STRUCT:
                    self.ace = apache.airavata.api.error.ttypes.AiravataClientException()
                    self.ace.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 3:
                if ftype == TType.STRUCT:
                    self.ase = apache.airavata.api.error.ttypes.AiravataSystemException()
                    self.ase.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 4:
                if ftype == TType.STRUCT:
                    self.ae = apache.airavata.api.error.ttypes.AuthorizationException()
                    self.ae.read(iprot)
                else:
                    iprot.skip(ftype)
            else:
                iprot.skip(ftype)
            iprot.readFieldEnd()
        iprot.readStructEnd()

    def write(self, oprot):
        if oprot._fast_encode is not None and self.thrift_spec is not None:
            oprot.trans.write(oprot._fast_encode(self, (self.__class__, self.thrift_spec)))
            return
        oprot.writeStructBegin('getAllWorkflows_result')
        if self.success is not None:
            oprot.writeFieldBegin('success', TType.LIST, 0)
            oprot.writeListBegin(TType.STRING, len(self.success))
            for iter280 in self.success:
                oprot.writeString(iter280.encode('utf-8') if sys.version_info[0] == 2 else iter280)
            oprot.writeListEnd()
            oprot.writeFieldEnd()
        if self.ire is not None:
            oprot.writeFieldBegin('ire', TType.STRUCT, 1)
            self.ire.write(oprot)
            oprot.writeFieldEnd()
        if self.ace is not None:
            oprot.writeFieldBegin('ace', TType.STRUCT, 2)
            self.ace.write(oprot)
            oprot.writeFieldEnd()
        if self.ase is not None:
            oprot.writeFieldBegin('ase', TType.STRUCT, 3)
            self.ase.write(oprot)
            oprot.writeFieldEnd()
        if self.ae is not None:
            oprot.writeFieldBegin('ae', TType.STRUCT, 4)
            self.ae.write(oprot)
            oprot.writeFieldEnd()
        oprot.writeFieldStop()
        oprot.writeStructEnd()

    def validate(self):
        return

    def __repr__(self):
        L = ['%s=%r' % (key, value)
             for key, value in self.__dict__.items()]
        return '%s(%s)' % (self.__class__.__name__, ', '.join(L))

    def __eq__(self, other):
        return isinstance(other, self.__class__) and self.__dict__ == other.__dict__

    def __ne__(self, other):
        return not (self == other)


class getLatestQueueStatuses_args(object):
    """
    Attributes:
     - authzToken
    """

    thrift_spec = (
        None,  # 0
        (1, TType.STRUCT, 'authzToken', (apache.airavata.model.security.ttypes.AuthzToken, apache.airavata.model.security.ttypes.AuthzToken.thrift_spec), None, ),  # 1
    )

    def __init__(self, authzToken=None,):
        self.authzToken = authzToken

    def read(self, iprot):
        if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None:
            iprot._fast_decode(self, iprot, (self.__class__, self.thrift_spec))
            return
        iprot.readStructBegin()
        while True:
            (fname, ftype, fid) = iprot.readFieldBegin()
            if ftype == TType.STOP:
                break
            if fid == 1:
                if ftype == TType.STRUCT:
                    self.authzToken = apache.airavata.model.security.ttypes.AuthzToken()
                    self.authzToken.read(iprot)
                else:
                    iprot.skip(ftype)
            else:
                iprot.skip(ftype)
            iprot.readFieldEnd()
        iprot.readStructEnd()

    def write(self, oprot):
        if oprot._fast_encode is not None and self.thrift_spec is not None:
            oprot.trans.write(oprot._fast_encode(self, (self.__class__, self.thrift_spec)))
            return
        oprot.writeStructBegin('getLatestQueueStatuses_args')
        if self.authzToken is not None:
            oprot.writeFieldBegin('authzToken', TType.STRUCT, 1)
            self.authzToken.write(oprot)
            oprot.writeFieldEnd()
        oprot.writeFieldStop()
        oprot.writeStructEnd()

    def validate(self):
        if self.authzToken is None:
            raise TProtocolException(message='Required field authzToken is unset!')
        return

    def __repr__(self):
        L = ['%s=%r' % (key, value)
             for key, value in self.__dict__.items()]
        return '%s(%s)' % (self.__class__.__name__, ', '.join(L))

    def __eq__(self, other):
        return isinstance(other, self.__class__) and self.__dict__ == other.__dict__

    def __ne__(self, other):
        return not (self == other)


class getLatestQueueStatuses_result(object):
    """
    Attributes:
     - success
     - ire
     - ace
     - ase
     - ae
    """

    thrift_spec = (
        (0, TType.LIST, 'success', (TType.STRUCT, (apache.airavata.model.status.ttypes.QueueStatusModel, apache.airavata.model.status.ttypes.QueueStatusModel.thrift_spec), False), None, ),  # 0
        (1, TType.STRUCT, 'ire', (apache.airavata.api.error.ttypes.InvalidRequestException, apache.airavata.api.error.ttypes.InvalidRequestException.thrift_spec), None, ),  # 1
        (2, TType.STRUCT, 'ace', (apache.airavata.api.error.ttypes.AiravataClientException, apache.airavata.api.error.ttypes.AiravataClientException.thrift_spec), None, ),  # 2
        (3, TType.STRUCT, 'ase', (apache.airavata.api.error.ttypes.AiravataSystemException, apache.airavata.api.error.ttypes.AiravataSystemException.thrift_spec), None, ),  # 3
        (4, TType.STRUCT, 'ae', (apache.airavata.api.error.ttypes.AuthorizationException, apache.airavata.api.error.ttypes.AuthorizationException.thrift_spec), None, ),  # 4
    )

    def __init__(self, success=None, ire=None, ace=None, ase=None, ae=None,):
        self.success = success
        self.ire = ire
        self.ace = ace
        self.ase = ase
        self.ae = ae

    def read(self, iprot):
        if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None:
            iprot._fast_decode(self, iprot, (self.__class__, self.thrift_spec))
            return
        iprot.readStructBegin()
        while True:
            (fname, ftype, fid) = iprot.readFieldBegin()
            if ftype == TType.STOP:
                break
            if fid == 0:
                if ftype == TType.LIST:
                    self.success = []
                    (_etype284, _size281) = iprot.readListBegin()
                    for _i285 in range(_size281):
                        _elem286 = apache.airavata.model.status.ttypes.QueueStatusModel()
                        _elem286.read(iprot)
                        self.success.append(_elem286)
                    iprot.readListEnd()
                else:
                    iprot.skip(ftype)
            elif fid == 1:
                if ftype == TType.STRUCT:
                    self.ire = apache.airavata.api.error.ttypes.InvalidRequestException()
                    self.ire.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 2:
                if ftype == TType.STRUCT:
                    self.ace = apache.airavata.api.error.ttypes.AiravataClientException()
                    self.ace.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 3:
                if ftype == TType.STRUCT:
                    self.ase = apache.airavata.api.error.ttypes.AiravataSystemException()
                    self.ase.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 4:
                if ftype == TType.STRUCT:
                    self.ae = apache.airavata.api.error.ttypes.AuthorizationException()
                    self.ae.read(iprot)
                else:
                    iprot.skip(ftype)
            else:
                iprot.skip(ftype)
            iprot.readFieldEnd()
        iprot.readStructEnd()

    def write(self, oprot):
        if oprot._fast_encode is not None and self.thrift_spec is not None:
            oprot.trans.write(oprot._fast_encode(self, (self.__class__, self.thrift_spec)))
            return
        oprot.writeStructBegin('getLatestQueueStatuses_result')
        if self.success is not None:
            oprot.writeFieldBegin('success', TType.LIST, 0)
            oprot.writeListBegin(TType.STRUCT, len(self.success))
            for iter287 in self.success:
                iter287.write(oprot)
            oprot.writeListEnd()
            oprot.writeFieldEnd()
        if self.ire is not None:
            oprot.writeFieldBegin('ire', TType.STRUCT, 1)
            self.ire.write(oprot)
            oprot.writeFieldEnd()
        if self.ace is not None:
            oprot.writeFieldBegin('ace', TType.STRUCT, 2)
            self.ace.write(oprot)
            oprot.writeFieldEnd()
        if self.ase is not None:
            oprot.writeFieldBegin('ase', TType.STRUCT, 3)
            self.ase.write(oprot)
            oprot.writeFieldEnd()
        if self.ae is not None:
            oprot.writeFieldBegin('ae', TType.STRUCT, 4)
            self.ae.write(oprot)
            oprot.writeFieldEnd()
        oprot.writeFieldStop()
        oprot.writeStructEnd()

    def validate(self):
        return

    def __repr__(self):
        L = ['%s=%r' % (key, value)
             for key, value in self.__dict__.items()]
        return '%s(%s)' % (self.__class__.__name__, ', '.join(L))

    def __eq__(self, other):
        return isinstance(other, self.__class__) and self.__dict__ == other.__dict__

    def __ne__(self, other):
        return not (self == other)


class getWorkflow_args(object):
    """
    Attributes:
     - authzToken
     - workflowTemplateId
    """

    thrift_spec = (
        None,  # 0
        (1, TType.STRUCT, 'authzToken', (apache.airavata.model.security.ttypes.AuthzToken, apache.airavata.model.security.ttypes.AuthzToken.thrift_spec), None, ),  # 1
        (2, TType.STRING, 'workflowTemplateId', 'UTF8', None, ),  # 2
    )

    def __init__(self, authzToken=None, workflowTemplateId=None,):
        self.authzToken = authzToken
        self.workflowTemplateId = workflowTemplateId

    def read(self, iprot):
        if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None:
            iprot._fast_decode(self, iprot, (self.__class__, self.thrift_spec))
            return
        iprot.readStructBegin()
        while True:
            (fname, ftype, fid) = iprot.readFieldBegin()
            if ftype == TType.STOP:
                break
            if fid == 1:
                if ftype == TType.STRUCT:
                    self.authzToken = apache.airavata.model.security.ttypes.AuthzToken()
                    self.authzToken.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 2:
                if ftype == TType.STRING:
                    self.workflowTemplateId = iprot.readString().decode('utf-8') if sys.version_info[0] == 2 else iprot.readString()
                else:
                    iprot.skip(ftype)
            else:
                iprot.skip(ftype)
            iprot.readFieldEnd()
        iprot.readStructEnd()

    def write(self, oprot):
        if oprot._fast_encode is not None and self.thrift_spec is not None:
            oprot.trans.write(oprot._fast_encode(self, (self.__class__, self.thrift_spec)))
            return
        oprot.writeStructBegin('getWorkflow_args')
        if self.authzToken is not None:
            oprot.writeFieldBegin('authzToken', TType.STRUCT, 1)
            self.authzToken.write(oprot)
            oprot.writeFieldEnd()
        if self.workflowTemplateId is not None:
            oprot.writeFieldBegin('workflowTemplateId', TType.STRING, 2)
            oprot.writeString(self.workflowTemplateId.encode('utf-8') if sys.version_info[0] == 2 else self.workflowTemplateId)
            oprot.writeFieldEnd()
        oprot.writeFieldStop()
        oprot.writeStructEnd()

    def validate(self):
        if self.authzToken is None:
            raise TProtocolException(message='Required field authzToken is unset!')
        if self.workflowTemplateId is None:
            raise TProtocolException(message='Required field workflowTemplateId is unset!')
        return

    def __repr__(self):
        L = ['%s=%r' % (key, value)
             for key, value in self.__dict__.items()]
        return '%s(%s)' % (self.__class__.__name__, ', '.join(L))

    def __eq__(self, other):
        return isinstance(other, self.__class__) and self.__dict__ == other.__dict__

    def __ne__(self, other):
        return not (self == other)


class getWorkflow_result(object):
    """
    Attributes:
     - success
     - ire
     - ace
     - ase
     - ae
    """

    thrift_spec = (
        (0, TType.STRUCT, 'success', (apache.airavata.model.workflow.ttypes.WorkflowModel, apache.airavata.model.workflow.ttypes.WorkflowModel.thrift_spec), None, ),  # 0
        (1, TType.STRUCT, 'ire', (apache.airavata.api.error.ttypes.InvalidRequestException, apache.airavata.api.error.ttypes.InvalidRequestException.thrift_spec), None, ),  # 1
        (2, TType.STRUCT, 'ace', (apache.airavata.api.error.ttypes.AiravataClientException, apache.airavata.api.error.ttypes.AiravataClientException.thrift_spec), None, ),  # 2
        (3, TType.STRUCT, 'ase', (apache.airavata.api.error.ttypes.AiravataSystemException, apache.airavata.api.error.ttypes.AiravataSystemException.thrift_spec), None, ),  # 3
        (4, TType.STRUCT, 'ae', (apache.airavata.api.error.ttypes.AuthorizationException, apache.airavata.api.error.ttypes.AuthorizationException.thrift_spec), None, ),  # 4
    )

    def __init__(self, success=None, ire=None, ace=None, ase=None, ae=None,):
        self.success = success
        self.ire = ire
        self.ace = ace
        self.ase = ase
        self.ae = ae

    def read(self, iprot):
        if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None:
            iprot._fast_decode(self, iprot, (self.__class__, self.thrift_spec))
            return
        iprot.readStructBegin()
        while True:
            (fname, ftype, fid) = iprot.readFieldBegin()
            if ftype == TType.STOP:
                break
            if fid == 0:
                if ftype == TType.STRUCT:
                    self.success = apache.airavata.model.workflow.ttypes.WorkflowModel()
                    self.success.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 1:
                if ftype == TType.STRUCT:
                    self.ire = apache.airavata.api.error.ttypes.InvalidRequestException()
                    self.ire.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 2:
                if ftype == TType.STRUCT:
                    self.ace = apache.airavata.api.error.ttypes.AiravataClientException()
                    self.ace.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 3:
                if ftype == TType.STRUCT:
                    self.ase = apache.airavata.api.error.ttypes.AiravataSystemException()
                    self.ase.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 4:
                if ftype == TType.STRUCT:
                    self.ae = apache.airavata.api.error.ttypes.AuthorizationException()
                    self.ae.read(iprot)
                else:
                    iprot.skip(ftype)
            else:
                iprot.skip(ftype)
            iprot.readFieldEnd()
        iprot.readStructEnd()

    def write(self, oprot):
        if oprot._fast_encode is not None and self.thrift_spec is not None:
            oprot.trans.write(oprot._fast_encode(self, (self.__class__, self.thrift_spec)))
            return
        oprot.writeStructBegin('getWorkflow_result')
        if self.success is not None:
            oprot.writeFieldBegin('success', TType.STRUCT, 0)
            self.success.write(oprot)
            oprot.writeFieldEnd()
        if self.ire is not None:
            oprot.writeFieldBegin('ire', TType.STRUCT, 1)
            self.ire.write(oprot)
            oprot.writeFieldEnd()
        if self.ace is not None:
            oprot.writeFieldBegin('ace', TType.STRUCT, 2)
            self.ace.write(oprot)
            oprot.writeFieldEnd()
        if self.ase is not None:
            oprot.writeFieldBegin('ase', TType.STRUCT, 3)
            self.ase.write(oprot)
            oprot.writeFieldEnd()
        if self.ae is not None:
            oprot.writeFieldBegin('ae', TType.STRUCT, 4)
            self.ae.write(oprot)
            oprot.writeFieldEnd()
        oprot.writeFieldStop()
        oprot.writeStructEnd()

    def validate(self):
        return

    def __repr__(self):
        L = ['%s=%r' % (key, value)
             for key, value in self.__dict__.items()]
        return '%s(%s)' % (self.__class__.__name__, ', '.join(L))

    def __eq__(self, other):
        return isinstance(other, self.__class__) and self.__dict__ == other.__dict__

    def __ne__(self, other):
        return not (self == other)


class deleteWorkflow_args(object):
    """
    Attributes:
     - authzToken
     - workflowTemplateId
    """

    thrift_spec = (
        None,  # 0
        (1, TType.STRUCT, 'authzToken', (apache.airavata.model.security.ttypes.AuthzToken, apache.airavata.model.security.ttypes.AuthzToken.thrift_spec), None, ),  # 1
        (2, TType.STRING, 'workflowTemplateId', 'UTF8', None, ),  # 2
    )

    def __init__(self, authzToken=None, workflowTemplateId=None,):
        self.authzToken = authzToken
        self.workflowTemplateId = workflowTemplateId

    def read(self, iprot):
        if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None:
            iprot._fast_decode(self, iprot, (self.__class__, self.thrift_spec))
            return
        iprot.readStructBegin()
        while True:
            (fname, ftype, fid) = iprot.readFieldBegin()
            if ftype == TType.STOP:
                break
            if fid == 1:
                if ftype == TType.STRUCT:
                    self.authzToken = apache.airavata.model.security.ttypes.AuthzToken()
                    self.authzToken.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 2:
                if ftype == TType.STRING:
                    self.workflowTemplateId = iprot.readString().decode('utf-8') if sys.version_info[0] == 2 else iprot.readString()
                else:
                    iprot.skip(ftype)
            else:
                iprot.skip(ftype)
            iprot.readFieldEnd()
        iprot.readStructEnd()

    def write(self, oprot):
        if oprot._fast_encode is not None and self.thrift_spec is not None:
            oprot.trans.write(oprot._fast_encode(self, (self.__class__, self.thrift_spec)))
            return
        oprot.writeStructBegin('deleteWorkflow_args')
        if self.authzToken is not None:
            oprot.writeFieldBegin('authzToken', TType.STRUCT, 1)
            self.authzToken.write(oprot)
            oprot.writeFieldEnd()
        if self.workflowTemplateId is not None:
            oprot.writeFieldBegin('workflowTemplateId', TType.STRING, 2)
            oprot.writeString(self.workflowTemplateId.encode('utf-8') if sys.version_info[0] == 2 else self.workflowTemplateId)
            oprot.writeFieldEnd()
        oprot.writeFieldStop()
        oprot.writeStructEnd()

    def validate(self):
        if self.authzToken is None:
            raise TProtocolException(message='Required field authzToken is unset!')
        if self.workflowTemplateId is None:
            raise TProtocolException(message='Required field workflowTemplateId is unset!')
        return

    def __repr__(self):
        L = ['%s=%r' % (key, value)
             for key, value in self.__dict__.items()]
        return '%s(%s)' % (self.__class__.__name__, ', '.join(L))

    def __eq__(self, other):
        return isinstance(other, self.__class__) and self.__dict__ == other.__dict__

    def __ne__(self, other):
        return not (self == other)


class deleteWorkflow_result(object):
    """
    Attributes:
     - ire
     - ace
     - ase
     - ae
    """

    thrift_spec = (
        None,  # 0
        (1, TType.STRUCT, 'ire', (apache.airavata.api.error.ttypes.InvalidRequestException, apache.airavata.api.error.ttypes.InvalidRequestException.thrift_spec), None, ),  # 1
        (2, TType.STRUCT, 'ace', (apache.airavata.api.error.ttypes.AiravataClientException, apache.airavata.api.error.ttypes.AiravataClientException.thrift_spec), None, ),  # 2
        (3, TType.STRUCT, 'ase', (apache.airavata.api.error.ttypes.AiravataSystemException, apache.airavata.api.error.ttypes.AiravataSystemException.thrift_spec), None, ),  # 3
        (4, TType.STRUCT, 'ae', (apache.airavata.api.error.ttypes.AuthorizationException, apache.airavata.api.error.ttypes.AuthorizationException.thrift_spec), None, ),  # 4
    )

    def __init__(self, ire=None, ace=None, ase=None, ae=None,):
        self.ire = ire
        self.ace = ace
        self.ase = ase
        self.ae = ae

    def read(self, iprot):
        if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None:
            iprot._fast_decode(self, iprot, (self.__class__, self.thrift_spec))
            return
        iprot.readStructBegin()
        while True:
            (fname, ftype, fid) = iprot.readFieldBegin()
            if ftype == TType.STOP:
                break
            if fid == 1:
                if ftype == TType.STRUCT:
                    self.ire = apache.airavata.api.error.ttypes.InvalidRequestException()
                    self.ire.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 2:
                if ftype == TType.STRUCT:
                    self.ace = apache.airavata.api.error.ttypes.AiravataClientException()
                    self.ace.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 3:
                if ftype == TType.STRUCT:
                    self.ase = apache.airavata.api.error.ttypes.AiravataSystemException()
                    self.ase.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 4:
                if ftype == TType.STRUCT:
                    self.ae = apache.airavata.api.error.ttypes.AuthorizationException()
                    self.ae.read(iprot)
                else:
                    iprot.skip(ftype)
            else:
                iprot.skip(ftype)
            iprot.readFieldEnd()
        iprot.readStructEnd()

    def write(self, oprot):
        if oprot._fast_encode is not None and self.thrift_spec is not None:
            oprot.trans.write(oprot._fast_encode(self, (self.__class__, self.thrift_spec)))
            return
        oprot.writeStructBegin('deleteWorkflow_result')
        if self.ire is not None:
            oprot.writeFieldBegin('ire', TType.STRUCT, 1)
            self.ire.write(oprot)
            oprot.writeFieldEnd()
        if self.ace is not None:
            oprot.writeFieldBegin('ace', TType.STRUCT, 2)
            self.ace.write(oprot)
            oprot.writeFieldEnd()
        if self.ase is not None:
            oprot.writeFieldBegin('ase', TType.STRUCT, 3)
            self.ase.write(oprot)
            oprot.writeFieldEnd()
        if self.ae is not None:
            oprot.writeFieldBegin('ae', TType.STRUCT, 4)
            self.ae.write(oprot)
            oprot.writeFieldEnd()
        oprot.writeFieldStop()
        oprot.writeStructEnd()

    def validate(self):
        return

    def __repr__(self):
        L = ['%s=%r' % (key, value)
             for key, value in self.__dict__.items()]
        return '%s(%s)' % (self.__class__.__name__, ', '.join(L))

    def __eq__(self, other):
        return isinstance(other, self.__class__) and self.__dict__ == other.__dict__

    def __ne__(self, other):
        return not (self == other)


class registerWorkflow_args(object):
    """
    Attributes:
     - authzToken
     - gatewayId
     - workflow
    """

    thrift_spec = (
        None,  # 0
        (1, TType.STRUCT, 'authzToken', (apache.airavata.model.security.ttypes.AuthzToken, apache.airavata.model.security.ttypes.AuthzToken.thrift_spec), None, ),  # 1
        (2, TType.STRING, 'gatewayId', 'UTF8', None, ),  # 2
        (3, TType.STRUCT, 'workflow', (apache.airavata.model.workflow.ttypes.WorkflowModel, apache.airavata.model.workflow.ttypes.WorkflowModel.thrift_spec), None, ),  # 3
    )

    def __init__(self, authzToken=None, gatewayId=None, workflow=None,):
        self.authzToken = authzToken
        self.gatewayId = gatewayId
        self.workflow = workflow

    def read(self, iprot):
        if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None:
            iprot._fast_decode(self, iprot, (self.__class__, self.thrift_spec))
            return
        iprot.readStructBegin()
        while True:
            (fname, ftype, fid) = iprot.readFieldBegin()
            if ftype == TType.STOP:
                break
            if fid == 1:
                if ftype == TType.STRUCT:
                    self.authzToken = apache.airavata.model.security.ttypes.AuthzToken()
                    self.authzToken.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 2:
                if ftype == TType.STRING:
                    self.gatewayId = iprot.readString().decode('utf-8') if sys.version_info[0] == 2 else iprot.readString()
                else:
                    iprot.skip(ftype)
            elif fid == 3:
                if ftype == TType.STRUCT:
                    self.workflow = apache.airavata.model.workflow.ttypes.WorkflowModel()
                    self.workflow.read(iprot)
                else:
                    iprot.skip(ftype)
            else:
                iprot.skip(ftype)
            iprot.readFieldEnd()
        iprot.readStructEnd()

    def write(self, oprot):
        if oprot._fast_encode is not None and self.thrift_spec is not None:
            oprot.trans.write(oprot._fast_encode(self, (self.__class__, self.thrift_spec)))
            return
        oprot.writeStructBegin('registerWorkflow_args')
        if self.authzToken is not None:
            oprot.writeFieldBegin('authzToken', TType.STRUCT, 1)
            self.authzToken.write(oprot)
            oprot.writeFieldEnd()
        if self.gatewayId is not None:
            oprot.writeFieldBegin('gatewayId', TType.STRING, 2)
            oprot.writeString(self.gatewayId.encode('utf-8') if sys.version_info[0] == 2 else self.gatewayId)
            oprot.writeFieldEnd()
        if self.workflow is not None:
            oprot.writeFieldBegin('workflow', TType.STRUCT, 3)
            self.workflow.write(oprot)
            oprot.writeFieldEnd()
        oprot.writeFieldStop()
        oprot.writeStructEnd()

    def validate(self):
        if self.authzToken is None:
            raise TProtocolException(message='Required field authzToken is unset!')
        if self.gatewayId is None:
            raise TProtocolException(message='Required field gatewayId is unset!')
        if self.workflow is None:
            raise TProtocolException(message='Required field workflow is unset!')
        return

    def __repr__(self):
        L = ['%s=%r' % (key, value)
             for key, value in self.__dict__.items()]
        return '%s(%s)' % (self.__class__.__name__, ', '.join(L))

    def __eq__(self, other):
        return isinstance(other, self.__class__) and self.__dict__ == other.__dict__

    def __ne__(self, other):
        return not (self == other)


class registerWorkflow_result(object):
    """
    Attributes:
     - success
     - ire
     - ace
     - ase
     - ae
    """

    thrift_spec = (
        (0, TType.STRING, 'success', 'UTF8', None, ),  # 0
        (1, TType.STRUCT, 'ire', (apache.airavata.api.error.ttypes.InvalidRequestException, apache.airavata.api.error.ttypes.InvalidRequestException.thrift_spec), None, ),  # 1
        (2, TType.STRUCT, 'ace', (apache.airavata.api.error.ttypes.AiravataClientException, apache.airavata.api.error.ttypes.AiravataClientException.thrift_spec), None, ),  # 2
        (3, TType.STRUCT, 'ase', (apache.airavata.api.error.ttypes.AiravataSystemException, apache.airavata.api.error.ttypes.AiravataSystemException.thrift_spec), None, ),  # 3
        (4, TType.STRUCT, 'ae', (apache.airavata.api.error.ttypes.AuthorizationException, apache.airavata.api.error.ttypes.AuthorizationException.thrift_spec), None, ),  # 4
    )

    def __init__(self, success=None, ire=None, ace=None, ase=None, ae=None,):
        self.success = success
        self.ire = ire
        self.ace = ace
        self.ase = ase
        self.ae = ae

    def read(self, iprot):
        if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None:
            iprot._fast_decode(self, iprot, (self.__class__, self.thrift_spec))
            return
        iprot.readStructBegin()
        while True:
            (fname, ftype, fid) = iprot.readFieldBegin()
            if ftype == TType.STOP:
                break
            if fid == 0:
                if ftype == TType.STRING:
                    self.success = iprot.readString().decode('utf-8') if sys.version_info[0] == 2 else iprot.readString()
                else:
                    iprot.skip(ftype)
            elif fid == 1:
                if ftype == TType.STRUCT:
                    self.ire = apache.airavata.api.error.ttypes.InvalidRequestException()
                    self.ire.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 2:
                if ftype == TType.STRUCT:
                    self.ace = apache.airavata.api.error.ttypes.AiravataClientException()
                    self.ace.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 3:
                if ftype == TType.STRUCT:
                    self.ase = apache.airavata.api.error.ttypes.AiravataSystemException()
                    self.ase.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 4:
                if ftype == TType.STRUCT:
                    self.ae = apache.airavata.api.error.ttypes.AuthorizationException()
                    self.ae.read(iprot)
                else:
                    iprot.skip(ftype)
            else:
                iprot.skip(ftype)
            iprot.readFieldEnd()
        iprot.readStructEnd()

    def write(self, oprot):
        if oprot._fast_encode is not None and self.thrift_spec is not None:
            oprot.trans.write(oprot._fast_encode(self, (self.__class__, self.thrift_spec)))
            return
        oprot.writeStructBegin('registerWorkflow_result')
        if self.success is not None:
            oprot.writeFieldBegin('success', TType.STRING, 0)
            oprot.writeString(self.success.encode('utf-8') if sys.version_info[0] == 2 else self.success)
            oprot.writeFieldEnd()
        if self.ire is not None:
            oprot.writeFieldBegin('ire', TType.STRUCT, 1)
            self.ire.write(oprot)
            oprot.writeFieldEnd()
        if self.ace is not None:
            oprot.writeFieldBegin('ace', TType.STRUCT, 2)
            self.ace.write(oprot)
            oprot.writeFieldEnd()
        if self.ase is not None:
            oprot.writeFieldBegin('ase', TType.STRUCT, 3)
            self.ase.write(oprot)
            oprot.writeFieldEnd()
        if self.ae is not None:
            oprot.writeFieldBegin('ae', TType.STRUCT, 4)
            self.ae.write(oprot)
            oprot.writeFieldEnd()
        oprot.writeFieldStop()
        oprot.writeStructEnd()

    def validate(self):
        return

    def __repr__(self):
        L = ['%s=%r' % (key, value)
             for key, value in self.__dict__.items()]
        return '%s(%s)' % (self.__class__.__name__, ', '.join(L))

    def __eq__(self, other):
        return isinstance(other, self.__class__) and self.__dict__ == other.__dict__

    def __ne__(self, other):
        return not (self == other)


class updateWorkflow_args(object):
    """
    Attributes:
     - authzToken
     - workflowTemplateId
     - workflow
    """

    thrift_spec = (
        None,  # 0
        (1, TType.STRUCT, 'authzToken', (apache.airavata.model.security.ttypes.AuthzToken, apache.airavata.model.security.ttypes.AuthzToken.thrift_spec), None, ),  # 1
        (2, TType.STRING, 'workflowTemplateId', 'UTF8', None, ),  # 2
        (3, TType.STRUCT, 'workflow', (apache.airavata.model.workflow.ttypes.WorkflowModel, apache.airavata.model.workflow.ttypes.WorkflowModel.thrift_spec), None, ),  # 3
    )

    def __init__(self, authzToken=None, workflowTemplateId=None, workflow=None,):
        self.authzToken = authzToken
        self.workflowTemplateId = workflowTemplateId
        self.workflow = workflow

    def read(self, iprot):
        if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None:
            iprot._fast_decode(self, iprot, (self.__class__, self.thrift_spec))
            return
        iprot.readStructBegin()
        while True:
            (fname, ftype, fid) = iprot.readFieldBegin()
            if ftype == TType.STOP:
                break
            if fid == 1:
                if ftype == TType.STRUCT:
                    self.authzToken = apache.airavata.model.security.ttypes.AuthzToken()
                    self.authzToken.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 2:
                if ftype == TType.STRING:
                    self.workflowTemplateId = iprot.readString().decode('utf-8') if sys.version_info[0] == 2 else iprot.readString()
                else:
                    iprot.skip(ftype)
            elif fid == 3:
                if ftype == TType.STRUCT:
                    self.workflow = apache.airavata.model.workflow.ttypes.WorkflowModel()
                    self.workflow.read(iprot)
                else:
                    iprot.skip(ftype)
            else:
                iprot.skip(ftype)
            iprot.readFieldEnd()
        iprot.readStructEnd()

    def write(self, oprot):
        if oprot._fast_encode is not None and self.thrift_spec is not None:
            oprot.trans.write(oprot._fast_encode(self, (self.__class__, self.thrift_spec)))
            return
        oprot.writeStructBegin('updateWorkflow_args')
        if self.authzToken is not None:
            oprot.writeFieldBegin('authzToken', TType.STRUCT, 1)
            self.authzToken.write(oprot)
            oprot.writeFieldEnd()
        if self.workflowTemplateId is not None:
            oprot.writeFieldBegin('workflowTemplateId', TType.STRING, 2)
            oprot.writeString(self.workflowTemplateId.encode('utf-8') if sys.version_info[0] == 2 else self.workflowTemplateId)
            oprot.writeFieldEnd()
        if self.workflow is not None:
            oprot.writeFieldBegin('workflow', TType.STRUCT, 3)
            self.workflow.write(oprot)
            oprot.writeFieldEnd()
        oprot.writeFieldStop()
        oprot.writeStructEnd()

    def validate(self):
        if self.authzToken is None:
            raise TProtocolException(message='Required field authzToken is unset!')
        if self.workflowTemplateId is None:
            raise TProtocolException(message='Required field workflowTemplateId is unset!')
        if self.workflow is None:
            raise TProtocolException(message='Required field workflow is unset!')
        return

    def __repr__(self):
        L = ['%s=%r' % (key, value)
             for key, value in self.__dict__.items()]
        return '%s(%s)' % (self.__class__.__name__, ', '.join(L))

    def __eq__(self, other):
        return isinstance(other, self.__class__) and self.__dict__ == other.__dict__

    def __ne__(self, other):
        return not (self == other)


class updateWorkflow_result(object):
    """
    Attributes:
     - ire
     - ace
     - ase
     - ae
    """

    thrift_spec = (
        None,  # 0
        (1, TType.STRUCT, 'ire', (apache.airavata.api.error.ttypes.InvalidRequestException, apache.airavata.api.error.ttypes.InvalidRequestException.thrift_spec), None, ),  # 1
        (2, TType.STRUCT, 'ace', (apache.airavata.api.error.ttypes.AiravataClientException, apache.airavata.api.error.ttypes.AiravataClientException.thrift_spec), None, ),  # 2
        (3, TType.STRUCT, 'ase', (apache.airavata.api.error.ttypes.AiravataSystemException, apache.airavata.api.error.ttypes.AiravataSystemException.thrift_spec), None, ),  # 3
        (4, TType.STRUCT, 'ae', (apache.airavata.api.error.ttypes.AuthorizationException, apache.airavata.api.error.ttypes.AuthorizationException.thrift_spec), None, ),  # 4
    )

    def __init__(self, ire=None, ace=None, ase=None, ae=None,):
        self.ire = ire
        self.ace = ace
        self.ase = ase
        self.ae = ae

    def read(self, iprot):
        if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None:
            iprot._fast_decode(self, iprot, (self.__class__, self.thrift_spec))
            return
        iprot.readStructBegin()
        while True:
            (fname, ftype, fid) = iprot.readFieldBegin()
            if ftype == TType.STOP:
                break
            if fid == 1:
                if ftype == TType.STRUCT:
                    self.ire = apache.airavata.api.error.ttypes.InvalidRequestException()
                    self.ire.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 2:
                if ftype == TType.STRUCT:
                    self.ace = apache.airavata.api.error.ttypes.AiravataClientException()
                    self.ace.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 3:
                if ftype == TType.STRUCT:
                    self.ase = apache.airavata.api.error.ttypes.AiravataSystemException()
                    self.ase.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 4:
                if ftype == TType.STRUCT:
                    self.ae = apache.airavata.api.error.ttypes.AuthorizationException()
                    self.ae.read(iprot)
                else:
                    iprot.skip(ftype)
            else:
                iprot.skip(ftype)
            iprot.readFieldEnd()
        iprot.readStructEnd()

    def write(self, oprot):
        if oprot._fast_encode is not None and self.thrift_spec is not None:
            oprot.trans.write(oprot._fast_encode(self, (self.__class__, self.thrift_spec)))
            return
        oprot.writeStructBegin('updateWorkflow_result')
        if self.ire is not None:
            oprot.writeFieldBegin('ire', TType.STRUCT, 1)
            self.ire.write(oprot)
            oprot.writeFieldEnd()
        if self.ace is not None:
            oprot.writeFieldBegin('ace', TType.STRUCT, 2)
            self.ace.write(oprot)
            oprot.writeFieldEnd()
        if self.ase is not None:
            oprot.writeFieldBegin('ase', TType.STRUCT, 3)
            self.ase.write(oprot)
            oprot.writeFieldEnd()
        if self.ae is not None:
            oprot.writeFieldBegin('ae', TType.STRUCT, 4)
            self.ae.write(oprot)
            oprot.writeFieldEnd()
        oprot.writeFieldStop()
        oprot.writeStructEnd()

    def validate(self):
        return

    def __repr__(self):
        L = ['%s=%r' % (key, value)
             for key, value in self.__dict__.items()]
        return '%s(%s)' % (self.__class__.__name__, ', '.join(L))

    def __eq__(self, other):
        return isinstance(other, self.__class__) and self.__dict__ == other.__dict__

    def __ne__(self, other):
        return not (self == other)


class getWorkflowTemplateId_args(object):
    """
    Attributes:
     - authzToken
     - workflowName
    """

    thrift_spec = (
        None,  # 0
        (1, TType.STRUCT, 'authzToken', (apache.airavata.model.security.ttypes.AuthzToken, apache.airavata.model.security.ttypes.AuthzToken.thrift_spec), None, ),  # 1
        (2, TType.STRING, 'workflowName', 'UTF8', None, ),  # 2
    )

    def __init__(self, authzToken=None, workflowName=None,):
        self.authzToken = authzToken
        self.workflowName = workflowName

    def read(self, iprot):
        if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None:
            iprot._fast_decode(self, iprot, (self.__class__, self.thrift_spec))
            return
        iprot.readStructBegin()
        while True:
            (fname, ftype, fid) = iprot.readFieldBegin()
            if ftype == TType.STOP:
                break
            if fid == 1:
                if ftype == TType.STRUCT:
                    self.authzToken = apache.airavata.model.security.ttypes.AuthzToken()
                    self.authzToken.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 2:
                if ftype == TType.STRING:
                    self.workflowName = iprot.readString().decode('utf-8') if sys.version_info[0] == 2 else iprot.readString()
                else:
                    iprot.skip(ftype)
            else:
                iprot.skip(ftype)
            iprot.readFieldEnd()
        iprot.readStructEnd()

    def write(self, oprot):
        if oprot._fast_encode is not None and self.thrift_spec is not None:
            oprot.trans.write(oprot._fast_encode(self, (self.__class__, self.thrift_spec)))
            return
        oprot.writeStructBegin('getWorkflowTemplateId_args')
        if self.authzToken is not None:
            oprot.writeFieldBegin('authzToken', TType.STRUCT, 1)
            self.authzToken.write(oprot)
            oprot.writeFieldEnd()
        if self.workflowName is not None:
            oprot.writeFieldBegin('workflowName', TType.STRING, 2)
            oprot.writeString(self.workflowName.encode('utf-8') if sys.version_info[0] == 2 else self.workflowName)
            oprot.writeFieldEnd()
        oprot.writeFieldStop()
        oprot.writeStructEnd()

    def validate(self):
        if self.authzToken is None:
            raise TProtocolException(message='Required field authzToken is unset!')
        if self.workflowName is None:
            raise TProtocolException(message='Required field workflowName is unset!')
        return

    def __repr__(self):
        L = ['%s=%r' % (key, value)
             for key, value in self.__dict__.items()]
        return '%s(%s)' % (self.__class__.__name__, ', '.join(L))

    def __eq__(self, other):
        return isinstance(other, self.__class__) and self.__dict__ == other.__dict__

    def __ne__(self, other):
        return not (self == other)


class getWorkflowTemplateId_result(object):
    """
    Attributes:
     - success
     - ire
     - ace
     - ase
     - ae
    """

    thrift_spec = (
        (0, TType.STRING, 'success', 'UTF8', None, ),  # 0
        (1, TType.STRUCT, 'ire', (apache.airavata.api.error.ttypes.InvalidRequestException, apache.airavata.api.error.ttypes.InvalidRequestException.thrift_spec), None, ),  # 1
        (2, TType.STRUCT, 'ace', (apache.airavata.api.error.ttypes.AiravataClientException, apache.airavata.api.error.ttypes.AiravataClientException.thrift_spec), None, ),  # 2
        (3, TType.STRUCT, 'ase', (apache.airavata.api.error.ttypes.AiravataSystemException, apache.airavata.api.error.ttypes.AiravataSystemException.thrift_spec), None, ),  # 3
        (4, TType.STRUCT, 'ae', (apache.airavata.api.error.ttypes.AuthorizationException, apache.airavata.api.error.ttypes.AuthorizationException.thrift_spec), None, ),  # 4
    )

    def __init__(self, success=None, ire=None, ace=None, ase=None, ae=None,):
        self.success = success
        self.ire = ire
        self.ace = ace
        self.ase = ase
        self.ae = ae

    def read(self, iprot):
        if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None:
            iprot._fast_decode(self, iprot, (self.__class__, self.thrift_spec))
            return
        iprot.readStructBegin()
        while True:
            (fname, ftype, fid) = iprot.readFieldBegin()
            if ftype == TType.STOP:
                break
            if fid == 0:
                if ftype == TType.STRING:
                    self.success = iprot.readString().decode('utf-8') if sys.version_info[0] == 2 else iprot.readString()
                else:
                    iprot.skip(ftype)
            elif fid == 1:
                if ftype == TType.STRUCT:
                    self.ire = apache.airavata.api.error.ttypes.InvalidRequestException()
                    self.ire.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 2:
                if ftype == TType.STRUCT:
                    self.ace = apache.airavata.api.error.ttypes.AiravataClientException()
                    self.ace.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 3:
                if ftype == TType.STRUCT:
                    self.ase = apache.airavata.api.error.ttypes.AiravataSystemException()
                    self.ase.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 4:
                if ftype == TType.STRUCT:
                    self.ae = apache.airavata.api.error.ttypes.AuthorizationException()
                    self.ae.read(iprot)
                else:
                    iprot.skip(ftype)
            else:
                iprot.skip(ftype)
            iprot.readFieldEnd()
        iprot.readStructEnd()

    def write(self, oprot):
        if oprot._fast_encode is not None and self.thrift_spec is not None:
            oprot.trans.write(oprot._fast_encode(self, (self.__class__, self.thrift_spec)))
            return
        oprot.writeStructBegin('getWorkflowTemplateId_result')
        if self.success is not None:
            oprot.writeFieldBegin('success', TType.STRING, 0)
            oprot.writeString(self.success.encode('utf-8') if sys.version_info[0] == 2 else self.success)
            oprot.writeFieldEnd()
        if self.ire is not None:
            oprot.writeFieldBegin('ire', TType.STRUCT, 1)
            self.ire.write(oprot)
            oprot.writeFieldEnd()
        if self.ace is not None:
            oprot.writeFieldBegin('ace', TType.STRUCT, 2)
            self.ace.write(oprot)
            oprot.writeFieldEnd()
        if self.ase is not None:
            oprot.writeFieldBegin('ase', TType.STRUCT, 3)
            self.ase.write(oprot)
            oprot.writeFieldEnd()
        if self.ae is not None:
            oprot.writeFieldBegin('ae', TType.STRUCT, 4)
            self.ae.write(oprot)
            oprot.writeFieldEnd()
        oprot.writeFieldStop()
        oprot.writeStructEnd()

    def validate(self):
        return

    def __repr__(self):
        L = ['%s=%r' % (key, value)
             for key, value in self.__dict__.items()]
        return '%s(%s)' % (self.__class__.__name__, ', '.join(L))

    def __eq__(self, other):
        return isinstance(other, self.__class__) and self.__dict__ == other.__dict__

    def __ne__(self, other):
        return not (self == other)


class isWorkflowExistWithName_args(object):
    """
    Attributes:
     - authzToken
     - workflowName
    """

    thrift_spec = (
        None,  # 0
        (1, TType.STRUCT, 'authzToken', (apache.airavata.model.security.ttypes.AuthzToken, apache.airavata.model.security.ttypes.AuthzToken.thrift_spec), None, ),  # 1
        (2, TType.STRING, 'workflowName', 'UTF8', None, ),  # 2
    )

    def __init__(self, authzToken=None, workflowName=None,):
        self.authzToken = authzToken
        self.workflowName = workflowName

    def read(self, iprot):
        if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None:
            iprot._fast_decode(self, iprot, (self.__class__, self.thrift_spec))
            return
        iprot.readStructBegin()
        while True:
            (fname, ftype, fid) = iprot.readFieldBegin()
            if ftype == TType.STOP:
                break
            if fid == 1:
                if ftype == TType.STRUCT:
                    self.authzToken = apache.airavata.model.security.ttypes.AuthzToken()
                    self.authzToken.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 2:
                if ftype == TType.STRING:
                    self.workflowName = iprot.readString().decode('utf-8') if sys.version_info[0] == 2 else iprot.readString()
                else:
                    iprot.skip(ftype)
            else:
                iprot.skip(ftype)
            iprot.readFieldEnd()
        iprot.readStructEnd()

    def write(self, oprot):
        if oprot._fast_encode is not None and self.thrift_spec is not None:
            oprot.trans.write(oprot._fast_encode(self, (self.__class__, self.thrift_spec)))
            return
        oprot.writeStructBegin('isWorkflowExistWithName_args')
        if self.authzToken is not None:
            oprot.writeFieldBegin('authzToken', TType.STRUCT, 1)
            self.authzToken.write(oprot)
            oprot.writeFieldEnd()
        if self.workflowName is not None:
            oprot.writeFieldBegin('workflowName', TType.STRING, 2)
            oprot.writeString(self.workflowName.encode('utf-8') if sys.version_info[0] == 2 else self.workflowName)
            oprot.writeFieldEnd()
        oprot.writeFieldStop()
        oprot.writeStructEnd()

    def validate(self):
        if self.authzToken is None:
            raise TProtocolException(message='Required field authzToken is unset!')
        if self.workflowName is None:
            raise TProtocolException(message='Required field workflowName is unset!')
        return

    def __repr__(self):
        L = ['%s=%r' % (key, value)
             for key, value in self.__dict__.items()]
        return '%s(%s)' % (self.__class__.__name__, ', '.join(L))

    def __eq__(self, other):
        return isinstance(other, self.__class__) and self.__dict__ == other.__dict__

    def __ne__(self, other):
        return not (self == other)


class isWorkflowExistWithName_result(object):
    """
    Attributes:
     - success
     - ire
     - ace
     - ase
     - ae
    """

    thrift_spec = (
        (0, TType.BOOL, 'success', None, None, ),  # 0
        (1, TType.STRUCT, 'ire', (apache.airavata.api.error.ttypes.InvalidRequestException, apache.airavata.api.error.ttypes.InvalidRequestException.thrift_spec), None, ),  # 1
        (2, TType.STRUCT, 'ace', (apache.airavata.api.error.ttypes.AiravataClientException, apache.airavata.api.error.ttypes.AiravataClientException.thrift_spec), None, ),  # 2
        (3, TType.STRUCT, 'ase', (apache.airavata.api.error.ttypes.AiravataSystemException, apache.airavata.api.error.ttypes.AiravataSystemException.thrift_spec), None, ),  # 3
        (4, TType.STRUCT, 'ae', (apache.airavata.api.error.ttypes.AuthorizationException, apache.airavata.api.error.ttypes.AuthorizationException.thrift_spec), None, ),  # 4
    )

    def __init__(self, success=None, ire=None, ace=None, ase=None, ae=None,):
        self.success = success
        self.ire = ire
        self.ace = ace
        self.ase = ase
        self.ae = ae

    def read(self, iprot):
        if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None:
            iprot._fast_decode(self, iprot, (self.__class__, self.thrift_spec))
            return
        iprot.readStructBegin()
        while True:
            (fname, ftype, fid) = iprot.readFieldBegin()
            if ftype == TType.STOP:
                break
            if fid == 0:
                if ftype == TType.BOOL:
                    self.success = iprot.readBool()
                else:
                    iprot.skip(ftype)
            elif fid == 1:
                if ftype == TType.STRUCT:
                    self.ire = apache.airavata.api.error.ttypes.InvalidRequestException()
                    self.ire.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 2:
                if ftype == TType.STRUCT:
                    self.ace = apache.airavata.api.error.ttypes.AiravataClientException()
                    self.ace.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 3:
                if ftype == TType.STRUCT:
                    self.ase = apache.airavata.api.error.ttypes.AiravataSystemException()
                    self.ase.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 4:
                if ftype == TType.STRUCT:
                    self.ae = apache.airavata.api.error.ttypes.AuthorizationException()
                    self.ae.read(iprot)
                else:
                    iprot.skip(ftype)
            else:
                iprot.skip(ftype)
            iprot.readFieldEnd()
        iprot.readStructEnd()

    def write(self, oprot):
        if oprot._fast_encode is not None and self.thrift_spec is not None:
            oprot.trans.write(oprot._fast_encode(self, (self.__class__, self.thrift_spec)))
            return
        oprot.writeStructBegin('isWorkflowExistWithName_result')
        if self.success is not None:
            oprot.writeFieldBegin('success', TType.BOOL, 0)
            oprot.writeBool(self.success)
            oprot.writeFieldEnd()
        if self.ire is not None:
            oprot.writeFieldBegin('ire', TType.STRUCT, 1)
            self.ire.write(oprot)
            oprot.writeFieldEnd()
        if self.ace is not None:
            oprot.writeFieldBegin('ace', TType.STRUCT, 2)
            self.ace.write(oprot)
            oprot.writeFieldEnd()
        if self.ase is not None:
            oprot.writeFieldBegin('ase', TType.STRUCT, 3)
            self.ase.write(oprot)
            oprot.writeFieldEnd()
        if self.ae is not None:
            oprot.writeFieldBegin('ae', TType.STRUCT, 4)
            self.ae.write(oprot)
            oprot.writeFieldEnd()
        oprot.writeFieldStop()
        oprot.writeStructEnd()

    def validate(self):
        return

    def __repr__(self):
        L = ['%s=%r' % (key, value)
             for key, value in self.__dict__.items()]
        return '%s(%s)' % (self.__class__.__name__, ', '.join(L))

    def __eq__(self, other):
        return isinstance(other, self.__class__) and self.__dict__ == other.__dict__

    def __ne__(self, other):
        return not (self == other)


class registerDataProduct_args(object):
    """
    Attributes:
     - authzToken
     - dataProductModel
    """

    thrift_spec = (
        None,  # 0
        (1, TType.STRUCT, 'authzToken', (apache.airavata.model.security.ttypes.AuthzToken, apache.airavata.model.security.ttypes.AuthzToken.thrift_spec), None, ),  # 1
        (2, TType.STRUCT, 'dataProductModel', (apache.airavata.model.data.replica.ttypes.DataProductModel, apache.airavata.model.data.replica.ttypes.DataProductModel.thrift_spec), None, ),  # 2
    )

    def __init__(self, authzToken=None, dataProductModel=None,):
        self.authzToken = authzToken
        self.dataProductModel = dataProductModel

    def read(self, iprot):
        if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None:
            iprot._fast_decode(self, iprot, (self.__class__, self.thrift_spec))
            return
        iprot.readStructBegin()
        while True:
            (fname, ftype, fid) = iprot.readFieldBegin()
            if ftype == TType.STOP:
                break
            if fid == 1:
                if ftype == TType.STRUCT:
                    self.authzToken = apache.airavata.model.security.ttypes.AuthzToken()
                    self.authzToken.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 2:
                if ftype == TType.STRUCT:
                    self.dataProductModel = apache.airavata.model.data.replica.ttypes.DataProductModel()
                    self.dataProductModel.read(iprot)
                else:
                    iprot.skip(ftype)
            else:
                iprot.skip(ftype)
            iprot.readFieldEnd()
        iprot.readStructEnd()

    def write(self, oprot):
        if oprot._fast_encode is not None and self.thrift_spec is not None:
            oprot.trans.write(oprot._fast_encode(self, (self.__class__, self.thrift_spec)))
            return
        oprot.writeStructBegin('registerDataProduct_args')
        if self.authzToken is not None:
            oprot.writeFieldBegin('authzToken', TType.STRUCT, 1)
            self.authzToken.write(oprot)
            oprot.writeFieldEnd()
        if self.dataProductModel is not None:
            oprot.writeFieldBegin('dataProductModel', TType.STRUCT, 2)
            self.dataProductModel.write(oprot)
            oprot.writeFieldEnd()
        oprot.writeFieldStop()
        oprot.writeStructEnd()

    def validate(self):
        if self.authzToken is None:
            raise TProtocolException(message='Required field authzToken is unset!')
        if self.dataProductModel is None:
            raise TProtocolException(message='Required field dataProductModel is unset!')
        return

    def __repr__(self):
        L = ['%s=%r' % (key, value)
             for key, value in self.__dict__.items()]
        return '%s(%s)' % (self.__class__.__name__, ', '.join(L))

    def __eq__(self, other):
        return isinstance(other, self.__class__) and self.__dict__ == other.__dict__

    def __ne__(self, other):
        return not (self == other)


class registerDataProduct_result(object):
    """
    Attributes:
     - success
     - ire
     - ace
     - ase
     - ae
    """

    thrift_spec = (
        (0, TType.STRING, 'success', 'UTF8', None, ),  # 0
        (1, TType.STRUCT, 'ire', (apache.airavata.api.error.ttypes.InvalidRequestException, apache.airavata.api.error.ttypes.InvalidRequestException.thrift_spec), None, ),  # 1
        (2, TType.STRUCT, 'ace', (apache.airavata.api.error.ttypes.AiravataClientException, apache.airavata.api.error.ttypes.AiravataClientException.thrift_spec), None, ),  # 2
        (3, TType.STRUCT, 'ase', (apache.airavata.api.error.ttypes.AiravataSystemException, apache.airavata.api.error.ttypes.AiravataSystemException.thrift_spec), None, ),  # 3
        (4, TType.STRUCT, 'ae', (apache.airavata.api.error.ttypes.AuthorizationException, apache.airavata.api.error.ttypes.AuthorizationException.thrift_spec), None, ),  # 4
    )

    def __init__(self, success=None, ire=None, ace=None, ase=None, ae=None,):
        self.success = success
        self.ire = ire
        self.ace = ace
        self.ase = ase
        self.ae = ae

    def read(self, iprot):
        if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None:
            iprot._fast_decode(self, iprot, (self.__class__, self.thrift_spec))
            return
        iprot.readStructBegin()
        while True:
            (fname, ftype, fid) = iprot.readFieldBegin()
            if ftype == TType.STOP:
                break
            if fid == 0:
                if ftype == TType.STRING:
                    self.success = iprot.readString().decode('utf-8') if sys.version_info[0] == 2 else iprot.readString()
                else:
                    iprot.skip(ftype)
            elif fid == 1:
                if ftype == TType.STRUCT:
                    self.ire = apache.airavata.api.error.ttypes.InvalidRequestException()
                    self.ire.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 2:
                if ftype == TType.STRUCT:
                    self.ace = apache.airavata.api.error.ttypes.AiravataClientException()
                    self.ace.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 3:
                if ftype == TType.STRUCT:
                    self.ase = apache.airavata.api.error.ttypes.AiravataSystemException()
                    self.ase.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 4:
                if ftype == TType.STRUCT:
                    self.ae = apache.airavata.api.error.ttypes.AuthorizationException()
                    self.ae.read(iprot)
                else:
                    iprot.skip(ftype)
            else:
                iprot.skip(ftype)
            iprot.readFieldEnd()
        iprot.readStructEnd()

    def write(self, oprot):
        if oprot._fast_encode is not None and self.thrift_spec is not None:
            oprot.trans.write(oprot._fast_encode(self, (self.__class__, self.thrift_spec)))
            return
        oprot.writeStructBegin('registerDataProduct_result')
        if self.success is not None:
            oprot.writeFieldBegin('success', TType.STRING, 0)
            oprot.writeString(self.success.encode('utf-8') if sys.version_info[0] == 2 else self.success)
            oprot.writeFieldEnd()
        if self.ire is not None:
            oprot.writeFieldBegin('ire', TType.STRUCT, 1)
            self.ire.write(oprot)
            oprot.writeFieldEnd()
        if self.ace is not None:
            oprot.writeFieldBegin('ace', TType.STRUCT, 2)
            self.ace.write(oprot)
            oprot.writeFieldEnd()
        if self.ase is not None:
            oprot.writeFieldBegin('ase', TType.STRUCT, 3)
            self.ase.write(oprot)
            oprot.writeFieldEnd()
        if self.ae is not None:
            oprot.writeFieldBegin('ae', TType.STRUCT, 4)
            self.ae.write(oprot)
            oprot.writeFieldEnd()
        oprot.writeFieldStop()
        oprot.writeStructEnd()

    def validate(self):
        return

    def __repr__(self):
        L = ['%s=%r' % (key, value)
             for key, value in self.__dict__.items()]
        return '%s(%s)' % (self.__class__.__name__, ', '.join(L))

    def __eq__(self, other):
        return isinstance(other, self.__class__) and self.__dict__ == other.__dict__

    def __ne__(self, other):
        return not (self == other)


class getDataProduct_args(object):
    """
    Attributes:
     - authzToken
     - dataProductUri
    """

    thrift_spec = (
        None,  # 0
        (1, TType.STRUCT, 'authzToken', (apache.airavata.model.security.ttypes.AuthzToken, apache.airavata.model.security.ttypes.AuthzToken.thrift_spec), None, ),  # 1
        (2, TType.STRING, 'dataProductUri', 'UTF8', None, ),  # 2
    )

    def __init__(self, authzToken=None, dataProductUri=None,):
        self.authzToken = authzToken
        self.dataProductUri = dataProductUri

    def read(self, iprot):
        if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None:
            iprot._fast_decode(self, iprot, (self.__class__, self.thrift_spec))
            return
        iprot.readStructBegin()
        while True:
            (fname, ftype, fid) = iprot.readFieldBegin()
            if ftype == TType.STOP:
                break
            if fid == 1:
                if ftype == TType.STRUCT:
                    self.authzToken = apache.airavata.model.security.ttypes.AuthzToken()
                    self.authzToken.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 2:
                if ftype == TType.STRING:
                    self.dataProductUri = iprot.readString().decode('utf-8') if sys.version_info[0] == 2 else iprot.readString()
                else:
                    iprot.skip(ftype)
            else:
                iprot.skip(ftype)
            iprot.readFieldEnd()
        iprot.readStructEnd()

    def write(self, oprot):
        if oprot._fast_encode is not None and self.thrift_spec is not None:
            oprot.trans.write(oprot._fast_encode(self, (self.__class__, self.thrift_spec)))
            return
        oprot.writeStructBegin('getDataProduct_args')
        if self.authzToken is not None:
            oprot.writeFieldBegin('authzToken', TType.STRUCT, 1)
            self.authzToken.write(oprot)
            oprot.writeFieldEnd()
        if self.dataProductUri is not None:
            oprot.writeFieldBegin('dataProductUri', TType.STRING, 2)
            oprot.writeString(self.dataProductUri.encode('utf-8') if sys.version_info[0] == 2 else self.dataProductUri)
            oprot.writeFieldEnd()
        oprot.writeFieldStop()
        oprot.writeStructEnd()

    def validate(self):
        if self.authzToken is None:
            raise TProtocolException(message='Required field authzToken is unset!')
        if self.dataProductUri is None:
            raise TProtocolException(message='Required field dataProductUri is unset!')
        return

    def __repr__(self):
        L = ['%s=%r' % (key, value)
             for key, value in self.__dict__.items()]
        return '%s(%s)' % (self.__class__.__name__, ', '.join(L))

    def __eq__(self, other):
        return isinstance(other, self.__class__) and self.__dict__ == other.__dict__

    def __ne__(self, other):
        return not (self == other)


class getDataProduct_result(object):
    """
    Attributes:
     - success
     - ire
     - ace
     - ase
     - ae
    """

    thrift_spec = (
        (0, TType.STRUCT, 'success', (apache.airavata.model.data.replica.ttypes.DataProductModel, apache.airavata.model.data.replica.ttypes.DataProductModel.thrift_spec), None, ),  # 0
        (1, TType.STRUCT, 'ire', (apache.airavata.api.error.ttypes.InvalidRequestException, apache.airavata.api.error.ttypes.InvalidRequestException.thrift_spec), None, ),  # 1
        (2, TType.STRUCT, 'ace', (apache.airavata.api.error.ttypes.AiravataClientException, apache.airavata.api.error.ttypes.AiravataClientException.thrift_spec), None, ),  # 2
        (3, TType.STRUCT, 'ase', (apache.airavata.api.error.ttypes.AiravataSystemException, apache.airavata.api.error.ttypes.AiravataSystemException.thrift_spec), None, ),  # 3
        (4, TType.STRUCT, 'ae', (apache.airavata.api.error.ttypes.AuthorizationException, apache.airavata.api.error.ttypes.AuthorizationException.thrift_spec), None, ),  # 4
    )

    def __init__(self, success=None, ire=None, ace=None, ase=None, ae=None,):
        self.success = success
        self.ire = ire
        self.ace = ace
        self.ase = ase
        self.ae = ae

    def read(self, iprot):
        if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None:
            iprot._fast_decode(self, iprot, (self.__class__, self.thrift_spec))
            return
        iprot.readStructBegin()
        while True:
            (fname, ftype, fid) = iprot.readFieldBegin()
            if ftype == TType.STOP:
                break
            if fid == 0:
                if ftype == TType.STRUCT:
                    self.success = apache.airavata.model.data.replica.ttypes.DataProductModel()
                    self.success.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 1:
                if ftype == TType.STRUCT:
                    self.ire = apache.airavata.api.error.ttypes.InvalidRequestException()
                    self.ire.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 2:
                if ftype == TType.STRUCT:
                    self.ace = apache.airavata.api.error.ttypes.AiravataClientException()
                    self.ace.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 3:
                if ftype == TType.STRUCT:
                    self.ase = apache.airavata.api.error.ttypes.AiravataSystemException()
                    self.ase.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 4:
                if ftype == TType.STRUCT:
                    self.ae = apache.airavata.api.error.ttypes.AuthorizationException()
                    self.ae.read(iprot)
                else:
                    iprot.skip(ftype)
            else:
                iprot.skip(ftype)
            iprot.readFieldEnd()
        iprot.readStructEnd()

    def write(self, oprot):
        if oprot._fast_encode is not None and self.thrift_spec is not None:
            oprot.trans.write(oprot._fast_encode(self, (self.__class__, self.thrift_spec)))
            return
        oprot.writeStructBegin('getDataProduct_result')
        if self.success is not None:
            oprot.writeFieldBegin('success', TType.STRUCT, 0)
            self.success.write(oprot)
            oprot.writeFieldEnd()
        if self.ire is not None:
            oprot.writeFieldBegin('ire', TType.STRUCT, 1)
            self.ire.write(oprot)
            oprot.writeFieldEnd()
        if self.ace is not None:
            oprot.writeFieldBegin('ace', TType.STRUCT, 2)
            self.ace.write(oprot)
            oprot.writeFieldEnd()
        if self.ase is not None:
            oprot.writeFieldBegin('ase', TType.STRUCT, 3)
            self.ase.write(oprot)
            oprot.writeFieldEnd()
        if self.ae is not None:
            oprot.writeFieldBegin('ae', TType.STRUCT, 4)
            self.ae.write(oprot)
            oprot.writeFieldEnd()
        oprot.writeFieldStop()
        oprot.writeStructEnd()

    def validate(self):
        return

    def __repr__(self):
        L = ['%s=%r' % (key, value)
             for key, value in self.__dict__.items()]
        return '%s(%s)' % (self.__class__.__name__, ', '.join(L))

    def __eq__(self, other):
        return isinstance(other, self.__class__) and self.__dict__ == other.__dict__

    def __ne__(self, other):
        return not (self == other)


class registerReplicaLocation_args(object):
    """
    Attributes:
     - authzToken
     - replicaLocationModel
    """

    thrift_spec = (
        None,  # 0
        (1, TType.STRUCT, 'authzToken', (apache.airavata.model.security.ttypes.AuthzToken, apache.airavata.model.security.ttypes.AuthzToken.thrift_spec), None, ),  # 1
        (2, TType.STRUCT, 'replicaLocationModel', (apache.airavata.model.data.replica.ttypes.DataReplicaLocationModel, apache.airavata.model.data.replica.ttypes.DataReplicaLocationModel.thrift_spec), None, ),  # 2
    )

    def __init__(self, authzToken=None, replicaLocationModel=None,):
        self.authzToken = authzToken
        self.replicaLocationModel = replicaLocationModel

    def read(self, iprot):
        if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None:
            iprot._fast_decode(self, iprot, (self.__class__, self.thrift_spec))
            return
        iprot.readStructBegin()
        while True:
            (fname, ftype, fid) = iprot.readFieldBegin()
            if ftype == TType.STOP:
                break
            if fid == 1:
                if ftype == TType.STRUCT:
                    self.authzToken = apache.airavata.model.security.ttypes.AuthzToken()
                    self.authzToken.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 2:
                if ftype == TType.STRUCT:
                    self.replicaLocationModel = apache.airavata.model.data.replica.ttypes.DataReplicaLocationModel()
                    self.replicaLocationModel.read(iprot)
                else:
                    iprot.skip(ftype)
            else:
                iprot.skip(ftype)
            iprot.readFieldEnd()
        iprot.readStructEnd()

    def write(self, oprot):
        if oprot._fast_encode is not None and self.thrift_spec is not None:
            oprot.trans.write(oprot._fast_encode(self, (self.__class__, self.thrift_spec)))
            return
        oprot.writeStructBegin('registerReplicaLocation_args')
        if self.authzToken is not None:
            oprot.writeFieldBegin('authzToken', TType.STRUCT, 1)
            self.authzToken.write(oprot)
            oprot.writeFieldEnd()
        if self.replicaLocationModel is not None:
            oprot.writeFieldBegin('replicaLocationModel', TType.STRUCT, 2)
            self.replicaLocationModel.write(oprot)
            oprot.writeFieldEnd()
        oprot.writeFieldStop()
        oprot.writeStructEnd()

    def validate(self):
        if self.authzToken is None:
            raise TProtocolException(message='Required field authzToken is unset!')
        if self.replicaLocationModel is None:
            raise TProtocolException(message='Required field replicaLocationModel is unset!')
        return

    def __repr__(self):
        L = ['%s=%r' % (key, value)
             for key, value in self.__dict__.items()]
        return '%s(%s)' % (self.__class__.__name__, ', '.join(L))

    def __eq__(self, other):
        return isinstance(other, self.__class__) and self.__dict__ == other.__dict__

    def __ne__(self, other):
        return not (self == other)


class registerReplicaLocation_result(object):
    """
    Attributes:
     - success
     - ire
     - ace
     - ase
     - ae
    """

    thrift_spec = (
        (0, TType.STRING, 'success', 'UTF8', None, ),  # 0
        (1, TType.STRUCT, 'ire', (apache.airavata.api.error.ttypes.InvalidRequestException, apache.airavata.api.error.ttypes.InvalidRequestException.thrift_spec), None, ),  # 1
        (2, TType.STRUCT, 'ace', (apache.airavata.api.error.ttypes.AiravataClientException, apache.airavata.api.error.ttypes.AiravataClientException.thrift_spec), None, ),  # 2
        (3, TType.STRUCT, 'ase', (apache.airavata.api.error.ttypes.AiravataSystemException, apache.airavata.api.error.ttypes.AiravataSystemException.thrift_spec), None, ),  # 3
        (4, TType.STRUCT, 'ae', (apache.airavata.api.error.ttypes.AuthorizationException, apache.airavata.api.error.ttypes.AuthorizationException.thrift_spec), None, ),  # 4
    )

    def __init__(self, success=None, ire=None, ace=None, ase=None, ae=None,):
        self.success = success
        self.ire = ire
        self.ace = ace
        self.ase = ase
        self.ae = ae

    def read(self, iprot):
        if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None:
            iprot._fast_decode(self, iprot, (self.__class__, self.thrift_spec))
            return
        iprot.readStructBegin()
        while True:
            (fname, ftype, fid) = iprot.readFieldBegin()
            if ftype == TType.STOP:
                break
            if fid == 0:
                if ftype == TType.STRING:
                    self.success = iprot.readString().decode('utf-8') if sys.version_info[0] == 2 else iprot.readString()
                else:
                    iprot.skip(ftype)
            elif fid == 1:
                if ftype == TType.STRUCT:
                    self.ire = apache.airavata.api.error.ttypes.InvalidRequestException()
                    self.ire.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 2:
                if ftype == TType.STRUCT:
                    self.ace = apache.airavata.api.error.ttypes.AiravataClientException()
                    self.ace.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 3:
                if ftype == TType.STRUCT:
                    self.ase = apache.airavata.api.error.ttypes.AiravataSystemException()
                    self.ase.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 4:
                if ftype == TType.STRUCT:
                    self.ae = apache.airavata.api.error.ttypes.AuthorizationException()
                    self.ae.read(iprot)
                else:
                    iprot.skip(ftype)
            else:
                iprot.skip(ftype)
            iprot.readFieldEnd()
        iprot.readStructEnd()

    def write(self, oprot):
        if oprot._fast_encode is not None and self.thrift_spec is not None:
            oprot.trans.write(oprot._fast_encode(self, (self.__class__, self.thrift_spec)))
            return
        oprot.writeStructBegin('registerReplicaLocation_result')
        if self.success is not None:
            oprot.writeFieldBegin('success', TType.STRING, 0)
            oprot.writeString(self.success.encode('utf-8') if sys.version_info[0] == 2 else self.success)
            oprot.writeFieldEnd()
        if self.ire is not None:
            oprot.writeFieldBegin('ire', TType.STRUCT, 1)
            self.ire.write(oprot)
            oprot.writeFieldEnd()
        if self.ace is not None:
            oprot.writeFieldBegin('ace', TType.STRUCT, 2)
            self.ace.write(oprot)
            oprot.writeFieldEnd()
        if self.ase is not None:
            oprot.writeFieldBegin('ase', TType.STRUCT, 3)
            self.ase.write(oprot)
            oprot.writeFieldEnd()
        if self.ae is not None:
            oprot.writeFieldBegin('ae', TType.STRUCT, 4)
            self.ae.write(oprot)
            oprot.writeFieldEnd()
        oprot.writeFieldStop()
        oprot.writeStructEnd()

    def validate(self):
        return

    def __repr__(self):
        L = ['%s=%r' % (key, value)
             for key, value in self.__dict__.items()]
        return '%s(%s)' % (self.__class__.__name__, ', '.join(L))

    def __eq__(self, other):
        return isinstance(other, self.__class__) and self.__dict__ == other.__dict__

    def __ne__(self, other):
        return not (self == other)


class getParentDataProduct_args(object):
    """
    Attributes:
     - authzToken
     - productUri
    """

    thrift_spec = (
        None,  # 0
        (1, TType.STRUCT, 'authzToken', (apache.airavata.model.security.ttypes.AuthzToken, apache.airavata.model.security.ttypes.AuthzToken.thrift_spec), None, ),  # 1
        (2, TType.STRING, 'productUri', 'UTF8', None, ),  # 2
    )

    def __init__(self, authzToken=None, productUri=None,):
        self.authzToken = authzToken
        self.productUri = productUri

    def read(self, iprot):
        if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None:
            iprot._fast_decode(self, iprot, (self.__class__, self.thrift_spec))
            return
        iprot.readStructBegin()
        while True:
            (fname, ftype, fid) = iprot.readFieldBegin()
            if ftype == TType.STOP:
                break
            if fid == 1:
                if ftype == TType.STRUCT:
                    self.authzToken = apache.airavata.model.security.ttypes.AuthzToken()
                    self.authzToken.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 2:
                if ftype == TType.STRING:
                    self.productUri = iprot.readString().decode('utf-8') if sys.version_info[0] == 2 else iprot.readString()
                else:
                    iprot.skip(ftype)
            else:
                iprot.skip(ftype)
            iprot.readFieldEnd()
        iprot.readStructEnd()

    def write(self, oprot):
        if oprot._fast_encode is not None and self.thrift_spec is not None:
            oprot.trans.write(oprot._fast_encode(self, (self.__class__, self.thrift_spec)))
            return
        oprot.writeStructBegin('getParentDataProduct_args')
        if self.authzToken is not None:
            oprot.writeFieldBegin('authzToken', TType.STRUCT, 1)
            self.authzToken.write(oprot)
            oprot.writeFieldEnd()
        if self.productUri is not None:
            oprot.writeFieldBegin('productUri', TType.STRING, 2)
            oprot.writeString(self.productUri.encode('utf-8') if sys.version_info[0] == 2 else self.productUri)
            oprot.writeFieldEnd()
        oprot.writeFieldStop()
        oprot.writeStructEnd()

    def validate(self):
        if self.authzToken is None:
            raise TProtocolException(message='Required field authzToken is unset!')
        if self.productUri is None:
            raise TProtocolException(message='Required field productUri is unset!')
        return

    def __repr__(self):
        L = ['%s=%r' % (key, value)
             for key, value in self.__dict__.items()]
        return '%s(%s)' % (self.__class__.__name__, ', '.join(L))

    def __eq__(self, other):
        return isinstance(other, self.__class__) and self.__dict__ == other.__dict__

    def __ne__(self, other):
        return not (self == other)


class getParentDataProduct_result(object):
    """
    Attributes:
     - success
     - ire
     - ace
     - ase
     - ae
    """

    thrift_spec = (
        (0, TType.STRUCT, 'success', (apache.airavata.model.data.replica.ttypes.DataProductModel, apache.airavata.model.data.replica.ttypes.DataProductModel.thrift_spec), None, ),  # 0
        (1, TType.STRUCT, 'ire', (apache.airavata.api.error.ttypes.InvalidRequestException, apache.airavata.api.error.ttypes.InvalidRequestException.thrift_spec), None, ),  # 1
        (2, TType.STRUCT, 'ace', (apache.airavata.api.error.ttypes.AiravataClientException, apache.airavata.api.error.ttypes.AiravataClientException.thrift_spec), None, ),  # 2
        (3, TType.STRUCT, 'ase', (apache.airavata.api.error.ttypes.AiravataSystemException, apache.airavata.api.error.ttypes.AiravataSystemException.thrift_spec), None, ),  # 3
        (4, TType.STRUCT, 'ae', (apache.airavata.api.error.ttypes.AuthorizationException, apache.airavata.api.error.ttypes.AuthorizationException.thrift_spec), None, ),  # 4
    )

    def __init__(self, success=None, ire=None, ace=None, ase=None, ae=None,):
        self.success = success
        self.ire = ire
        self.ace = ace
        self.ase = ase
        self.ae = ae

    def read(self, iprot):
        if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None:
            iprot._fast_decode(self, iprot, (self.__class__, self.thrift_spec))
            return
        iprot.readStructBegin()
        while True:
            (fname, ftype, fid) = iprot.readFieldBegin()
            if ftype == TType.STOP:
                break
            if fid == 0:
                if ftype == TType.STRUCT:
                    self.success = apache.airavata.model.data.replica.ttypes.DataProductModel()
                    self.success.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 1:
                if ftype == TType.STRUCT:
                    self.ire = apache.airavata.api.error.ttypes.InvalidRequestException()
                    self.ire.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 2:
                if ftype == TType.STRUCT:
                    self.ace = apache.airavata.api.error.ttypes.AiravataClientException()
                    self.ace.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 3:
                if ftype == TType.STRUCT:
                    self.ase = apache.airavata.api.error.ttypes.AiravataSystemException()
                    self.ase.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 4:
                if ftype == TType.STRUCT:
                    self.ae = apache.airavata.api.error.ttypes.AuthorizationException()
                    self.ae.read(iprot)
                else:
                    iprot.skip(ftype)
            else:
                iprot.skip(ftype)
            iprot.readFieldEnd()
        iprot.readStructEnd()

    def write(self, oprot):
        if oprot._fast_encode is not None and self.thrift_spec is not None:
            oprot.trans.write(oprot._fast_encode(self, (self.__class__, self.thrift_spec)))
            return
        oprot.writeStructBegin('getParentDataProduct_result')
        if self.success is not None:
            oprot.writeFieldBegin('success', TType.STRUCT, 0)
            self.success.write(oprot)
            oprot.writeFieldEnd()
        if self.ire is not None:
            oprot.writeFieldBegin('ire', TType.STRUCT, 1)
            self.ire.write(oprot)
            oprot.writeFieldEnd()
        if self.ace is not None:
            oprot.writeFieldBegin('ace', TType.STRUCT, 2)
            self.ace.write(oprot)
            oprot.writeFieldEnd()
        if self.ase is not None:
            oprot.writeFieldBegin('ase', TType.STRUCT, 3)
            self.ase.write(oprot)
            oprot.writeFieldEnd()
        if self.ae is not None:
            oprot.writeFieldBegin('ae', TType.STRUCT, 4)
            self.ae.write(oprot)
            oprot.writeFieldEnd()
        oprot.writeFieldStop()
        oprot.writeStructEnd()

    def validate(self):
        return

    def __repr__(self):
        L = ['%s=%r' % (key, value)
             for key, value in self.__dict__.items()]
        return '%s(%s)' % (self.__class__.__name__, ', '.join(L))

    def __eq__(self, other):
        return isinstance(other, self.__class__) and self.__dict__ == other.__dict__

    def __ne__(self, other):
        return not (self == other)


class getChildDataProducts_args(object):
    """
    Attributes:
     - authzToken
     - productUri
    """

    thrift_spec = (
        None,  # 0
        (1, TType.STRUCT, 'authzToken', (apache.airavata.model.security.ttypes.AuthzToken, apache.airavata.model.security.ttypes.AuthzToken.thrift_spec), None, ),  # 1
        (2, TType.STRING, 'productUri', 'UTF8', None, ),  # 2
    )

    def __init__(self, authzToken=None, productUri=None,):
        self.authzToken = authzToken
        self.productUri = productUri

    def read(self, iprot):
        if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None:
            iprot._fast_decode(self, iprot, (self.__class__, self.thrift_spec))
            return
        iprot.readStructBegin()
        while True:
            (fname, ftype, fid) = iprot.readFieldBegin()
            if ftype == TType.STOP:
                break
            if fid == 1:
                if ftype == TType.STRUCT:
                    self.authzToken = apache.airavata.model.security.ttypes.AuthzToken()
                    self.authzToken.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 2:
                if ftype == TType.STRING:
                    self.productUri = iprot.readString().decode('utf-8') if sys.version_info[0] == 2 else iprot.readString()
                else:
                    iprot.skip(ftype)
            else:
                iprot.skip(ftype)
            iprot.readFieldEnd()
        iprot.readStructEnd()

    def write(self, oprot):
        if oprot._fast_encode is not None and self.thrift_spec is not None:
            oprot.trans.write(oprot._fast_encode(self, (self.__class__, self.thrift_spec)))
            return
        oprot.writeStructBegin('getChildDataProducts_args')
        if self.authzToken is not None:
            oprot.writeFieldBegin('authzToken', TType.STRUCT, 1)
            self.authzToken.write(oprot)
            oprot.writeFieldEnd()
        if self.productUri is not None:
            oprot.writeFieldBegin('productUri', TType.STRING, 2)
            oprot.writeString(self.productUri.encode('utf-8') if sys.version_info[0] == 2 else self.productUri)
            oprot.writeFieldEnd()
        oprot.writeFieldStop()
        oprot.writeStructEnd()

    def validate(self):
        if self.authzToken is None:
            raise TProtocolException(message='Required field authzToken is unset!')
        if self.productUri is None:
            raise TProtocolException(message='Required field productUri is unset!')
        return

    def __repr__(self):
        L = ['%s=%r' % (key, value)
             for key, value in self.__dict__.items()]
        return '%s(%s)' % (self.__class__.__name__, ', '.join(L))

    def __eq__(self, other):
        return isinstance(other, self.__class__) and self.__dict__ == other.__dict__

    def __ne__(self, other):
        return not (self == other)


class getChildDataProducts_result(object):
    """
    Attributes:
     - success
     - ire
     - ace
     - ase
     - ae
    """

    thrift_spec = (
        (0, TType.LIST, 'success', (TType.STRUCT, (apache.airavata.model.data.replica.ttypes.DataProductModel, apache.airavata.model.data.replica.ttypes.DataProductModel.thrift_spec), False), None, ),  # 0
        (1, TType.STRUCT, 'ire', (apache.airavata.api.error.ttypes.InvalidRequestException, apache.airavata.api.error.ttypes.InvalidRequestException.thrift_spec), None, ),  # 1
        (2, TType.STRUCT, 'ace', (apache.airavata.api.error.ttypes.AiravataClientException, apache.airavata.api.error.ttypes.AiravataClientException.thrift_spec), None, ),  # 2
        (3, TType.STRUCT, 'ase', (apache.airavata.api.error.ttypes.AiravataSystemException, apache.airavata.api.error.ttypes.AiravataSystemException.thrift_spec), None, ),  # 3
        (4, TType.STRUCT, 'ae', (apache.airavata.api.error.ttypes.AuthorizationException, apache.airavata.api.error.ttypes.AuthorizationException.thrift_spec), None, ),  # 4
    )

    def __init__(self, success=None, ire=None, ace=None, ase=None, ae=None,):
        self.success = success
        self.ire = ire
        self.ace = ace
        self.ase = ase
        self.ae = ae

    def read(self, iprot):
        if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None:
            iprot._fast_decode(self, iprot, (self.__class__, self.thrift_spec))
            return
        iprot.readStructBegin()
        while True:
            (fname, ftype, fid) = iprot.readFieldBegin()
            if ftype == TType.STOP:
                break
            if fid == 0:
                if ftype == TType.LIST:
                    self.success = []
                    (_etype291, _size288) = iprot.readListBegin()
                    for _i292 in range(_size288):
                        _elem293 = apache.airavata.model.data.replica.ttypes.DataProductModel()
                        _elem293.read(iprot)
                        self.success.append(_elem293)
                    iprot.readListEnd()
                else:
                    iprot.skip(ftype)
            elif fid == 1:
                if ftype == TType.STRUCT:
                    self.ire = apache.airavata.api.error.ttypes.InvalidRequestException()
                    self.ire.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 2:
                if ftype == TType.STRUCT:
                    self.ace = apache.airavata.api.error.ttypes.AiravataClientException()
                    self.ace.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 3:
                if ftype == TType.STRUCT:
                    self.ase = apache.airavata.api.error.ttypes.AiravataSystemException()
                    self.ase.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 4:
                if ftype == TType.STRUCT:
                    self.ae = apache.airavata.api.error.ttypes.AuthorizationException()
                    self.ae.read(iprot)
                else:
                    iprot.skip(ftype)
            else:
                iprot.skip(ftype)
            iprot.readFieldEnd()
        iprot.readStructEnd()

    def write(self, oprot):
        if oprot._fast_encode is not None and self.thrift_spec is not None:
            oprot.trans.write(oprot._fast_encode(self, (self.__class__, self.thrift_spec)))
            return
        oprot.writeStructBegin('getChildDataProducts_result')
        if self.success is not None:
            oprot.writeFieldBegin('success', TType.LIST, 0)
            oprot.writeListBegin(TType.STRUCT, len(self.success))
            for iter294 in self.success:
                iter294.write(oprot)
            oprot.writeListEnd()
            oprot.writeFieldEnd()
        if self.ire is not None:
            oprot.writeFieldBegin('ire', TType.STRUCT, 1)
            self.ire.write(oprot)
            oprot.writeFieldEnd()
        if self.ace is not None:
            oprot.writeFieldBegin('ace', TType.STRUCT, 2)
            self.ace.write(oprot)
            oprot.writeFieldEnd()
        if self.ase is not None:
            oprot.writeFieldBegin('ase', TType.STRUCT, 3)
            self.ase.write(oprot)
            oprot.writeFieldEnd()
        if self.ae is not None:
            oprot.writeFieldBegin('ae', TType.STRUCT, 4)
            self.ae.write(oprot)
            oprot.writeFieldEnd()
        oprot.writeFieldStop()
        oprot.writeStructEnd()

    def validate(self):
        return

    def __repr__(self):
        L = ['%s=%r' % (key, value)
             for key, value in self.__dict__.items()]
        return '%s(%s)' % (self.__class__.__name__, ', '.join(L))

    def __eq__(self, other):
        return isinstance(other, self.__class__) and self.__dict__ == other.__dict__

    def __ne__(self, other):
        return not (self == other)


class shareResourceWithUsers_args(object):
    """
    Attributes:
     - authzToken
     - resourceId
     - resourceType
     - userPermissionList
    """

    thrift_spec = (
        None,  # 0
        (1, TType.STRUCT, 'authzToken', (apache.airavata.model.security.ttypes.AuthzToken, apache.airavata.model.security.ttypes.AuthzToken.thrift_spec), None, ),  # 1
        (2, TType.STRING, 'resourceId', 'UTF8', None, ),  # 2
        (3, TType.I32, 'resourceType', None, None, ),  # 3
        (4, TType.MAP, 'userPermissionList', (TType.STRING, 'UTF8', TType.I32, None, False), None, ),  # 4
    )

    def __init__(self, authzToken=None, resourceId=None, resourceType=None, userPermissionList=None,):
        self.authzToken = authzToken
        self.resourceId = resourceId
        self.resourceType = resourceType
        self.userPermissionList = userPermissionList

    def read(self, iprot):
        if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None:
            iprot._fast_decode(self, iprot, (self.__class__, self.thrift_spec))
            return
        iprot.readStructBegin()
        while True:
            (fname, ftype, fid) = iprot.readFieldBegin()
            if ftype == TType.STOP:
                break
            if fid == 1:
                if ftype == TType.STRUCT:
                    self.authzToken = apache.airavata.model.security.ttypes.AuthzToken()
                    self.authzToken.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 2:
                if ftype == TType.STRING:
                    self.resourceId = iprot.readString().decode('utf-8') if sys.version_info[0] == 2 else iprot.readString()
                else:
                    iprot.skip(ftype)
            elif fid == 3:
                if ftype == TType.I32:
                    self.resourceType = iprot.readI32()
                else:
                    iprot.skip(ftype)
            elif fid == 4:
                if ftype == TType.MAP:
                    self.userPermissionList = {}
                    (_ktype296, _vtype297, _size295) = iprot.readMapBegin()
                    for _i299 in range(_size295):
                        _key300 = iprot.readString().decode('utf-8') if sys.version_info[0] == 2 else iprot.readString()
                        _val301 = iprot.readI32()
                        self.userPermissionList[_key300] = _val301
                    iprot.readMapEnd()
                else:
                    iprot.skip(ftype)
            else:
                iprot.skip(ftype)
            iprot.readFieldEnd()
        iprot.readStructEnd()

    def write(self, oprot):
        if oprot._fast_encode is not None and self.thrift_spec is not None:
            oprot.trans.write(oprot._fast_encode(self, (self.__class__, self.thrift_spec)))
            return
        oprot.writeStructBegin('shareResourceWithUsers_args')
        if self.authzToken is not None:
            oprot.writeFieldBegin('authzToken', TType.STRUCT, 1)
            self.authzToken.write(oprot)
            oprot.writeFieldEnd()
        if self.resourceId is not None:
            oprot.writeFieldBegin('resourceId', TType.STRING, 2)
            oprot.writeString(self.resourceId.encode('utf-8') if sys.version_info[0] == 2 else self.resourceId)
            oprot.writeFieldEnd()
        if self.resourceType is not None:
            oprot.writeFieldBegin('resourceType', TType.I32, 3)
            oprot.writeI32(self.resourceType)
            oprot.writeFieldEnd()
        if self.userPermissionList is not None:
            oprot.writeFieldBegin('userPermissionList', TType.MAP, 4)
            oprot.writeMapBegin(TType.STRING, TType.I32, len(self.userPermissionList))
            for kiter302, viter303 in self.userPermissionList.items():
                oprot.writeString(kiter302.encode('utf-8') if sys.version_info[0] == 2 else kiter302)
                oprot.writeI32(viter303)
            oprot.writeMapEnd()
            oprot.writeFieldEnd()
        oprot.writeFieldStop()
        oprot.writeStructEnd()

    def validate(self):
        if self.authzToken is None:
            raise TProtocolException(message='Required field authzToken is unset!')
        if self.resourceId is None:
            raise TProtocolException(message='Required field resourceId is unset!')
        if self.resourceType is None:
            raise TProtocolException(message='Required field resourceType is unset!')
        return

    def __repr__(self):
        L = ['%s=%r' % (key, value)
             for key, value in self.__dict__.items()]
        return '%s(%s)' % (self.__class__.__name__, ', '.join(L))

    def __eq__(self, other):
        return isinstance(other, self.__class__) and self.__dict__ == other.__dict__

    def __ne__(self, other):
        return not (self == other)


class shareResourceWithUsers_result(object):
    """
    Attributes:
     - success
     - ire
     - ace
     - ase
     - ae
    """

    thrift_spec = (
        (0, TType.BOOL, 'success', None, None, ),  # 0
        (1, TType.STRUCT, 'ire', (apache.airavata.api.error.ttypes.InvalidRequestException, apache.airavata.api.error.ttypes.InvalidRequestException.thrift_spec), None, ),  # 1
        (2, TType.STRUCT, 'ace', (apache.airavata.api.error.ttypes.AiravataClientException, apache.airavata.api.error.ttypes.AiravataClientException.thrift_spec), None, ),  # 2
        (3, TType.STRUCT, 'ase', (apache.airavata.api.error.ttypes.AiravataSystemException, apache.airavata.api.error.ttypes.AiravataSystemException.thrift_spec), None, ),  # 3
        (4, TType.STRUCT, 'ae', (apache.airavata.api.error.ttypes.AuthorizationException, apache.airavata.api.error.ttypes.AuthorizationException.thrift_spec), None, ),  # 4
    )

    def __init__(self, success=None, ire=None, ace=None, ase=None, ae=None,):
        self.success = success
        self.ire = ire
        self.ace = ace
        self.ase = ase
        self.ae = ae

    def read(self, iprot):
        if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None:
            iprot._fast_decode(self, iprot, (self.__class__, self.thrift_spec))
            return
        iprot.readStructBegin()
        while True:
            (fname, ftype, fid) = iprot.readFieldBegin()
            if ftype == TType.STOP:
                break
            if fid == 0:
                if ftype == TType.BOOL:
                    self.success = iprot.readBool()
                else:
                    iprot.skip(ftype)
            elif fid == 1:
                if ftype == TType.STRUCT:
                    self.ire = apache.airavata.api.error.ttypes.InvalidRequestException()
                    self.ire.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 2:
                if ftype == TType.STRUCT:
                    self.ace = apache.airavata.api.error.ttypes.AiravataClientException()
                    self.ace.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 3:
                if ftype == TType.STRUCT:
                    self.ase = apache.airavata.api.error.ttypes.AiravataSystemException()
                    self.ase.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 4:
                if ftype == TType.STRUCT:
                    self.ae = apache.airavata.api.error.ttypes.AuthorizationException()
                    self.ae.read(iprot)
                else:
                    iprot.skip(ftype)
            else:
                iprot.skip(ftype)
            iprot.readFieldEnd()
        iprot.readStructEnd()

    def write(self, oprot):
        if oprot._fast_encode is not None and self.thrift_spec is not None:
            oprot.trans.write(oprot._fast_encode(self, (self.__class__, self.thrift_spec)))
            return
        oprot.writeStructBegin('shareResourceWithUsers_result')
        if self.success is not None:
            oprot.writeFieldBegin('success', TType.BOOL, 0)
            oprot.writeBool(self.success)
            oprot.writeFieldEnd()
        if self.ire is not None:
            oprot.writeFieldBegin('ire', TType.STRUCT, 1)
            self.ire.write(oprot)
            oprot.writeFieldEnd()
        if self.ace is not None:
            oprot.writeFieldBegin('ace', TType.STRUCT, 2)
            self.ace.write(oprot)
            oprot.writeFieldEnd()
        if self.ase is not None:
            oprot.writeFieldBegin('ase', TType.STRUCT, 3)
            self.ase.write(oprot)
            oprot.writeFieldEnd()
        if self.ae is not None:
            oprot.writeFieldBegin('ae', TType.STRUCT, 4)
            self.ae.write(oprot)
            oprot.writeFieldEnd()
        oprot.writeFieldStop()
        oprot.writeStructEnd()

    def validate(self):
        return

    def __repr__(self):
        L = ['%s=%r' % (key, value)
             for key, value in self.__dict__.items()]
        return '%s(%s)' % (self.__class__.__name__, ', '.join(L))

    def __eq__(self, other):
        return isinstance(other, self.__class__) and self.__dict__ == other.__dict__

    def __ne__(self, other):
        return not (self == other)


class revokeSharingOfResourceFromUsers_args(object):
    """
    Attributes:
     - authzToken
     - resourceId
     - resourceType
     - userPermissionList
    """

    thrift_spec = (
        None,  # 0
        (1, TType.STRUCT, 'authzToken', (apache.airavata.model.security.ttypes.AuthzToken, apache.airavata.model.security.ttypes.AuthzToken.thrift_spec), None, ),  # 1
        (2, TType.STRING, 'resourceId', 'UTF8', None, ),  # 2
        (3, TType.I32, 'resourceType', None, None, ),  # 3
        (4, TType.MAP, 'userPermissionList', (TType.STRING, 'UTF8', TType.I32, None, False), None, ),  # 4
    )

    def __init__(self, authzToken=None, resourceId=None, resourceType=None, userPermissionList=None,):
        self.authzToken = authzToken
        self.resourceId = resourceId
        self.resourceType = resourceType
        self.userPermissionList = userPermissionList

    def read(self, iprot):
        if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None:
            iprot._fast_decode(self, iprot, (self.__class__, self.thrift_spec))
            return
        iprot.readStructBegin()
        while True:
            (fname, ftype, fid) = iprot.readFieldBegin()
            if ftype == TType.STOP:
                break
            if fid == 1:
                if ftype == TType.STRUCT:
                    self.authzToken = apache.airavata.model.security.ttypes.AuthzToken()
                    self.authzToken.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 2:
                if ftype == TType.STRING:
                    self.resourceId = iprot.readString().decode('utf-8') if sys.version_info[0] == 2 else iprot.readString()
                else:
                    iprot.skip(ftype)
            elif fid == 3:
                if ftype == TType.I32:
                    self.resourceType = iprot.readI32()
                else:
                    iprot.skip(ftype)
            elif fid == 4:
                if ftype == TType.MAP:
                    self.userPermissionList = {}
                    (_ktype305, _vtype306, _size304) = iprot.readMapBegin()
                    for _i308 in range(_size304):
                        _key309 = iprot.readString().decode('utf-8') if sys.version_info[0] == 2 else iprot.readString()
                        _val310 = iprot.readI32()
                        self.userPermissionList[_key309] = _val310
                    iprot.readMapEnd()
                else:
                    iprot.skip(ftype)
            else:
                iprot.skip(ftype)
            iprot.readFieldEnd()
        iprot.readStructEnd()

    def write(self, oprot):
        if oprot._fast_encode is not None and self.thrift_spec is not None:
            oprot.trans.write(oprot._fast_encode(self, (self.__class__, self.thrift_spec)))
            return
        oprot.writeStructBegin('revokeSharingOfResourceFromUsers_args')
        if self.authzToken is not None:
            oprot.writeFieldBegin('authzToken', TType.STRUCT, 1)
            self.authzToken.write(oprot)
            oprot.writeFieldEnd()
        if self.resourceId is not None:
            oprot.writeFieldBegin('resourceId', TType.STRING, 2)
            oprot.writeString(self.resourceId.encode('utf-8') if sys.version_info[0] == 2 else self.resourceId)
            oprot.writeFieldEnd()
        if self.resourceType is not None:
            oprot.writeFieldBegin('resourceType', TType.I32, 3)
            oprot.writeI32(self.resourceType)
            oprot.writeFieldEnd()
        if self.userPermissionList is not None:
            oprot.writeFieldBegin('userPermissionList', TType.MAP, 4)
            oprot.writeMapBegin(TType.STRING, TType.I32, len(self.userPermissionList))
            for kiter311, viter312 in self.userPermissionList.items():
                oprot.writeString(kiter311.encode('utf-8') if sys.version_info[0] == 2 else kiter311)
                oprot.writeI32(viter312)
            oprot.writeMapEnd()
            oprot.writeFieldEnd()
        oprot.writeFieldStop()
        oprot.writeStructEnd()

    def validate(self):
        if self.authzToken is None:
            raise TProtocolException(message='Required field authzToken is unset!')
        if self.resourceId is None:
            raise TProtocolException(message='Required field resourceId is unset!')
        if self.resourceType is None:
            raise TProtocolException(message='Required field resourceType is unset!')
        return

    def __repr__(self):
        L = ['%s=%r' % (key, value)
             for key, value in self.__dict__.items()]
        return '%s(%s)' % (self.__class__.__name__, ', '.join(L))

    def __eq__(self, other):
        return isinstance(other, self.__class__) and self.__dict__ == other.__dict__

    def __ne__(self, other):
        return not (self == other)


class revokeSharingOfResourceFromUsers_result(object):
    """
    Attributes:
     - success
     - ire
     - ace
     - ase
     - ae
    """

    thrift_spec = (
        (0, TType.BOOL, 'success', None, None, ),  # 0
        (1, TType.STRUCT, 'ire', (apache.airavata.api.error.ttypes.InvalidRequestException, apache.airavata.api.error.ttypes.InvalidRequestException.thrift_spec), None, ),  # 1
        (2, TType.STRUCT, 'ace', (apache.airavata.api.error.ttypes.AiravataClientException, apache.airavata.api.error.ttypes.AiravataClientException.thrift_spec), None, ),  # 2
        (3, TType.STRUCT, 'ase', (apache.airavata.api.error.ttypes.AiravataSystemException, apache.airavata.api.error.ttypes.AiravataSystemException.thrift_spec), None, ),  # 3
        (4, TType.STRUCT, 'ae', (apache.airavata.api.error.ttypes.AuthorizationException, apache.airavata.api.error.ttypes.AuthorizationException.thrift_spec), None, ),  # 4
    )

    def __init__(self, success=None, ire=None, ace=None, ase=None, ae=None,):
        self.success = success
        self.ire = ire
        self.ace = ace
        self.ase = ase
        self.ae = ae

    def read(self, iprot):
        if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None:
            iprot._fast_decode(self, iprot, (self.__class__, self.thrift_spec))
            return
        iprot.readStructBegin()
        while True:
            (fname, ftype, fid) = iprot.readFieldBegin()
            if ftype == TType.STOP:
                break
            if fid == 0:
                if ftype == TType.BOOL:
                    self.success = iprot.readBool()
                else:
                    iprot.skip(ftype)
            elif fid == 1:
                if ftype == TType.STRUCT:
                    self.ire = apache.airavata.api.error.ttypes.InvalidRequestException()
                    self.ire.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 2:
                if ftype == TType.STRUCT:
                    self.ace = apache.airavata.api.error.ttypes.AiravataClientException()
                    self.ace.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 3:
                if ftype == TType.STRUCT:
                    self.ase = apache.airavata.api.error.ttypes.AiravataSystemException()
                    self.ase.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 4:
                if ftype == TType.STRUCT:
                    self.ae = apache.airavata.api.error.ttypes.AuthorizationException()
                    self.ae.read(iprot)
                else:
                    iprot.skip(ftype)
            else:
                iprot.skip(ftype)
            iprot.readFieldEnd()
        iprot.readStructEnd()

    def write(self, oprot):
        if oprot._fast_encode is not None and self.thrift_spec is not None:
            oprot.trans.write(oprot._fast_encode(self, (self.__class__, self.thrift_spec)))
            return
        oprot.writeStructBegin('revokeSharingOfResourceFromUsers_result')
        if self.success is not None:
            oprot.writeFieldBegin('success', TType.BOOL, 0)
            oprot.writeBool(self.success)
            oprot.writeFieldEnd()
        if self.ire is not None:
            oprot.writeFieldBegin('ire', TType.STRUCT, 1)
            self.ire.write(oprot)
            oprot.writeFieldEnd()
        if self.ace is not None:
            oprot.writeFieldBegin('ace', TType.STRUCT, 2)
            self.ace.write(oprot)
            oprot.writeFieldEnd()
        if self.ase is not None:
            oprot.writeFieldBegin('ase', TType.STRUCT, 3)
            self.ase.write(oprot)
            oprot.writeFieldEnd()
        if self.ae is not None:
            oprot.writeFieldBegin('ae', TType.STRUCT, 4)
            self.ae.write(oprot)
            oprot.writeFieldEnd()
        oprot.writeFieldStop()
        oprot.writeStructEnd()

    def validate(self):
        return

    def __repr__(self):
        L = ['%s=%r' % (key, value)
             for key, value in self.__dict__.items()]
        return '%s(%s)' % (self.__class__.__name__, ', '.join(L))

    def __eq__(self, other):
        return isinstance(other, self.__class__) and self.__dict__ == other.__dict__

    def __ne__(self, other):
        return not (self == other)


class getAllAccessibleUsers_args(object):
    """
    Attributes:
     - authzToken
     - resourceId
     - resourceType
     - permissionType
    """

    thrift_spec = (
        None,  # 0
        (1, TType.STRUCT, 'authzToken', (apache.airavata.model.security.ttypes.AuthzToken, apache.airavata.model.security.ttypes.AuthzToken.thrift_spec), None, ),  # 1
        (2, TType.STRING, 'resourceId', 'UTF8', None, ),  # 2
        (3, TType.I32, 'resourceType', None, None, ),  # 3
        (4, TType.I32, 'permissionType', None, None, ),  # 4
    )

    def __init__(self, authzToken=None, resourceId=None, resourceType=None, permissionType=None,):
        self.authzToken = authzToken
        self.resourceId = resourceId
        self.resourceType = resourceType
        self.permissionType = permissionType

    def read(self, iprot):
        if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None:
            iprot._fast_decode(self, iprot, (self.__class__, self.thrift_spec))
            return
        iprot.readStructBegin()
        while True:
            (fname, ftype, fid) = iprot.readFieldBegin()
            if ftype == TType.STOP:
                break
            if fid == 1:
                if ftype == TType.STRUCT:
                    self.authzToken = apache.airavata.model.security.ttypes.AuthzToken()
                    self.authzToken.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 2:
                if ftype == TType.STRING:
                    self.resourceId = iprot.readString().decode('utf-8') if sys.version_info[0] == 2 else iprot.readString()
                else:
                    iprot.skip(ftype)
            elif fid == 3:
                if ftype == TType.I32:
                    self.resourceType = iprot.readI32()
                else:
                    iprot.skip(ftype)
            elif fid == 4:
                if ftype == TType.I32:
                    self.permissionType = iprot.readI32()
                else:
                    iprot.skip(ftype)
            else:
                iprot.skip(ftype)
            iprot.readFieldEnd()
        iprot.readStructEnd()

    def write(self, oprot):
        if oprot._fast_encode is not None and self.thrift_spec is not None:
            oprot.trans.write(oprot._fast_encode(self, (self.__class__, self.thrift_spec)))
            return
        oprot.writeStructBegin('getAllAccessibleUsers_args')
        if self.authzToken is not None:
            oprot.writeFieldBegin('authzToken', TType.STRUCT, 1)
            self.authzToken.write(oprot)
            oprot.writeFieldEnd()
        if self.resourceId is not None:
            oprot.writeFieldBegin('resourceId', TType.STRING, 2)
            oprot.writeString(self.resourceId.encode('utf-8') if sys.version_info[0] == 2 else self.resourceId)
            oprot.writeFieldEnd()
        if self.resourceType is not None:
            oprot.writeFieldBegin('resourceType', TType.I32, 3)
            oprot.writeI32(self.resourceType)
            oprot.writeFieldEnd()
        if self.permissionType is not None:
            oprot.writeFieldBegin('permissionType', TType.I32, 4)
            oprot.writeI32(self.permissionType)
            oprot.writeFieldEnd()
        oprot.writeFieldStop()
        oprot.writeStructEnd()

    def validate(self):
        if self.authzToken is None:
            raise TProtocolException(message='Required field authzToken is unset!')
        if self.resourceId is None:
            raise TProtocolException(message='Required field resourceId is unset!')
        if self.resourceType is None:
            raise TProtocolException(message='Required field resourceType is unset!')
        if self.permissionType is None:
            raise TProtocolException(message='Required field permissionType is unset!')
        return

    def __repr__(self):
        L = ['%s=%r' % (key, value)
             for key, value in self.__dict__.items()]
        return '%s(%s)' % (self.__class__.__name__, ', '.join(L))

    def __eq__(self, other):
        return isinstance(other, self.__class__) and self.__dict__ == other.__dict__

    def __ne__(self, other):
        return not (self == other)


class getAllAccessibleUsers_result(object):
    """
    Attributes:
     - success
     - ire
     - ace
     - ase
     - ae
    """

    thrift_spec = (
        (0, TType.LIST, 'success', (TType.STRING, 'UTF8', False), None, ),  # 0
        (1, TType.STRUCT, 'ire', (apache.airavata.api.error.ttypes.InvalidRequestException, apache.airavata.api.error.ttypes.InvalidRequestException.thrift_spec), None, ),  # 1
        (2, TType.STRUCT, 'ace', (apache.airavata.api.error.ttypes.AiravataClientException, apache.airavata.api.error.ttypes.AiravataClientException.thrift_spec), None, ),  # 2
        (3, TType.STRUCT, 'ase', (apache.airavata.api.error.ttypes.AiravataSystemException, apache.airavata.api.error.ttypes.AiravataSystemException.thrift_spec), None, ),  # 3
        (4, TType.STRUCT, 'ae', (apache.airavata.api.error.ttypes.AuthorizationException, apache.airavata.api.error.ttypes.AuthorizationException.thrift_spec), None, ),  # 4
    )

    def __init__(self, success=None, ire=None, ace=None, ase=None, ae=None,):
        self.success = success
        self.ire = ire
        self.ace = ace
        self.ase = ase
        self.ae = ae

    def read(self, iprot):
        if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None:
            iprot._fast_decode(self, iprot, (self.__class__, self.thrift_spec))
            return
        iprot.readStructBegin()
        while True:
            (fname, ftype, fid) = iprot.readFieldBegin()
            if ftype == TType.STOP:
                break
            if fid == 0:
                if ftype == TType.LIST:
                    self.success = []
                    (_etype316, _size313) = iprot.readListBegin()
                    for _i317 in range(_size313):
                        _elem318 = iprot.readString().decode('utf-8') if sys.version_info[0] == 2 else iprot.readString()
                        self.success.append(_elem318)
                    iprot.readListEnd()
                else:
                    iprot.skip(ftype)
            elif fid == 1:
                if ftype == TType.STRUCT:
                    self.ire = apache.airavata.api.error.ttypes.InvalidRequestException()
                    self.ire.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 2:
                if ftype == TType.STRUCT:
                    self.ace = apache.airavata.api.error.ttypes.AiravataClientException()
                    self.ace.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 3:
                if ftype == TType.STRUCT:
                    self.ase = apache.airavata.api.error.ttypes.AiravataSystemException()
                    self.ase.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 4:
                if ftype == TType.STRUCT:
                    self.ae = apache.airavata.api.error.ttypes.AuthorizationException()
                    self.ae.read(iprot)
                else:
                    iprot.skip(ftype)
            else:
                iprot.skip(ftype)
            iprot.readFieldEnd()
        iprot.readStructEnd()

    def write(self, oprot):
        if oprot._fast_encode is not None and self.thrift_spec is not None:
            oprot.trans.write(oprot._fast_encode(self, (self.__class__, self.thrift_spec)))
            return
        oprot.writeStructBegin('getAllAccessibleUsers_result')
        if self.success is not None:
            oprot.writeFieldBegin('success', TType.LIST, 0)
            oprot.writeListBegin(TType.STRING, len(self.success))
            for iter319 in self.success:
                oprot.writeString(iter319.encode('utf-8') if sys.version_info[0] == 2 else iter319)
            oprot.writeListEnd()
            oprot.writeFieldEnd()
        if self.ire is not None:
            oprot.writeFieldBegin('ire', TType.STRUCT, 1)
            self.ire.write(oprot)
            oprot.writeFieldEnd()
        if self.ace is not None:
            oprot.writeFieldBegin('ace', TType.STRUCT, 2)
            self.ace.write(oprot)
            oprot.writeFieldEnd()
        if self.ase is not None:
            oprot.writeFieldBegin('ase', TType.STRUCT, 3)
            self.ase.write(oprot)
            oprot.writeFieldEnd()
        if self.ae is not None:
            oprot.writeFieldBegin('ae', TType.STRUCT, 4)
            self.ae.write(oprot)
            oprot.writeFieldEnd()
        oprot.writeFieldStop()
        oprot.writeStructEnd()

    def validate(self):
        return

    def __repr__(self):
        L = ['%s=%r' % (key, value)
             for key, value in self.__dict__.items()]
        return '%s(%s)' % (self.__class__.__name__, ', '.join(L))

    def __eq__(self, other):
        return isinstance(other, self.__class__) and self.__dict__ == other.__dict__

    def __ne__(self, other):
        return not (self == other)


class createGroup_args(object):
    """
    Attributes:
     - authzToken
     - groupModel
    """

    thrift_spec = (
        None,  # 0
        (1, TType.STRUCT, 'authzToken', (apache.airavata.model.security.ttypes.AuthzToken, apache.airavata.model.security.ttypes.AuthzToken.thrift_spec), None, ),  # 1
        (2, TType.STRUCT, 'groupModel', (apache.airavata.model.group.ttypes.GroupModel, apache.airavata.model.group.ttypes.GroupModel.thrift_spec), None, ),  # 2
    )

    def __init__(self, authzToken=None, groupModel=None,):
        self.authzToken = authzToken
        self.groupModel = groupModel

    def read(self, iprot):
        if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None:
            iprot._fast_decode(self, iprot, (self.__class__, self.thrift_spec))
            return
        iprot.readStructBegin()
        while True:
            (fname, ftype, fid) = iprot.readFieldBegin()
            if ftype == TType.STOP:
                break
            if fid == 1:
                if ftype == TType.STRUCT:
                    self.authzToken = apache.airavata.model.security.ttypes.AuthzToken()
                    self.authzToken.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 2:
                if ftype == TType.STRUCT:
                    self.groupModel = apache.airavata.model.group.ttypes.GroupModel()
                    self.groupModel.read(iprot)
                else:
                    iprot.skip(ftype)
            else:
                iprot.skip(ftype)
            iprot.readFieldEnd()
        iprot.readStructEnd()

    def write(self, oprot):
        if oprot._fast_encode is not None and self.thrift_spec is not None:
            oprot.trans.write(oprot._fast_encode(self, (self.__class__, self.thrift_spec)))
            return
        oprot.writeStructBegin('createGroup_args')
        if self.authzToken is not None:
            oprot.writeFieldBegin('authzToken', TType.STRUCT, 1)
            self.authzToken.write(oprot)
            oprot.writeFieldEnd()
        if self.groupModel is not None:
            oprot.writeFieldBegin('groupModel', TType.STRUCT, 2)
            self.groupModel.write(oprot)
            oprot.writeFieldEnd()
        oprot.writeFieldStop()
        oprot.writeStructEnd()

    def validate(self):
        if self.authzToken is None:
            raise TProtocolException(message='Required field authzToken is unset!')
        if self.groupModel is None:
            raise TProtocolException(message='Required field groupModel is unset!')
        return

    def __repr__(self):
        L = ['%s=%r' % (key, value)
             for key, value in self.__dict__.items()]
        return '%s(%s)' % (self.__class__.__name__, ', '.join(L))

    def __eq__(self, other):
        return isinstance(other, self.__class__) and self.__dict__ == other.__dict__

    def __ne__(self, other):
        return not (self == other)


class createGroup_result(object):
    """
    Attributes:
     - success
     - ire
     - ace
     - ase
     - ae
    """

    thrift_spec = (
        (0, TType.BOOL, 'success', None, None, ),  # 0
        (1, TType.STRUCT, 'ire', (apache.airavata.api.error.ttypes.InvalidRequestException, apache.airavata.api.error.ttypes.InvalidRequestException.thrift_spec), None, ),  # 1
        (2, TType.STRUCT, 'ace', (apache.airavata.api.error.ttypes.AiravataClientException, apache.airavata.api.error.ttypes.AiravataClientException.thrift_spec), None, ),  # 2
        (3, TType.STRUCT, 'ase', (apache.airavata.api.error.ttypes.AiravataSystemException, apache.airavata.api.error.ttypes.AiravataSystemException.thrift_spec), None, ),  # 3
        (4, TType.STRUCT, 'ae', (apache.airavata.api.error.ttypes.AuthorizationException, apache.airavata.api.error.ttypes.AuthorizationException.thrift_spec), None, ),  # 4
    )

    def __init__(self, success=None, ire=None, ace=None, ase=None, ae=None,):
        self.success = success
        self.ire = ire
        self.ace = ace
        self.ase = ase
        self.ae = ae

    def read(self, iprot):
        if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None:
            iprot._fast_decode(self, iprot, (self.__class__, self.thrift_spec))
            return
        iprot.readStructBegin()
        while True:
            (fname, ftype, fid) = iprot.readFieldBegin()
            if ftype == TType.STOP:
                break
            if fid == 0:
                if ftype == TType.BOOL:
                    self.success = iprot.readBool()
                else:
                    iprot.skip(ftype)
            elif fid == 1:
                if ftype == TType.STRUCT:
                    self.ire = apache.airavata.api.error.ttypes.InvalidRequestException()
                    self.ire.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 2:
                if ftype == TType.STRUCT:
                    self.ace = apache.airavata.api.error.ttypes.AiravataClientException()
                    self.ace.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 3:
                if ftype == TType.STRUCT:
                    self.ase = apache.airavata.api.error.ttypes.AiravataSystemException()
                    self.ase.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 4:
                if ftype == TType.STRUCT:
                    self.ae = apache.airavata.api.error.ttypes.AuthorizationException()
                    self.ae.read(iprot)
                else:
                    iprot.skip(ftype)
            else:
                iprot.skip(ftype)
            iprot.readFieldEnd()
        iprot.readStructEnd()

    def write(self, oprot):
        if oprot._fast_encode is not None and self.thrift_spec is not None:
            oprot.trans.write(oprot._fast_encode(self, (self.__class__, self.thrift_spec)))
            return
        oprot.writeStructBegin('createGroup_result')
        if self.success is not None:
            oprot.writeFieldBegin('success', TType.BOOL, 0)
            oprot.writeBool(self.success)
            oprot.writeFieldEnd()
        if self.ire is not None:
            oprot.writeFieldBegin('ire', TType.STRUCT, 1)
            self.ire.write(oprot)
            oprot.writeFieldEnd()
        if self.ace is not None:
            oprot.writeFieldBegin('ace', TType.STRUCT, 2)
            self.ace.write(oprot)
            oprot.writeFieldEnd()
        if self.ase is not None:
            oprot.writeFieldBegin('ase', TType.STRUCT, 3)
            self.ase.write(oprot)
            oprot.writeFieldEnd()
        if self.ae is not None:
            oprot.writeFieldBegin('ae', TType.STRUCT, 4)
            self.ae.write(oprot)
            oprot.writeFieldEnd()
        oprot.writeFieldStop()
        oprot.writeStructEnd()

    def validate(self):
        return

    def __repr__(self):
        L = ['%s=%r' % (key, value)
             for key, value in self.__dict__.items()]
        return '%s(%s)' % (self.__class__.__name__, ', '.join(L))

    def __eq__(self, other):
        return isinstance(other, self.__class__) and self.__dict__ == other.__dict__

    def __ne__(self, other):
        return not (self == other)


class updateGroup_args(object):
    """
    Attributes:
     - authzToken
     - groupModel
    """

    thrift_spec = (
        None,  # 0
        (1, TType.STRUCT, 'authzToken', (apache.airavata.model.security.ttypes.AuthzToken, apache.airavata.model.security.ttypes.AuthzToken.thrift_spec), None, ),  # 1
        (2, TType.STRUCT, 'groupModel', (apache.airavata.model.group.ttypes.GroupModel, apache.airavata.model.group.ttypes.GroupModel.thrift_spec), None, ),  # 2
    )

    def __init__(self, authzToken=None, groupModel=None,):
        self.authzToken = authzToken
        self.groupModel = groupModel

    def read(self, iprot):
        if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None:
            iprot._fast_decode(self, iprot, (self.__class__, self.thrift_spec))
            return
        iprot.readStructBegin()
        while True:
            (fname, ftype, fid) = iprot.readFieldBegin()
            if ftype == TType.STOP:
                break
            if fid == 1:
                if ftype == TType.STRUCT:
                    self.authzToken = apache.airavata.model.security.ttypes.AuthzToken()
                    self.authzToken.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 2:
                if ftype == TType.STRUCT:
                    self.groupModel = apache.airavata.model.group.ttypes.GroupModel()
                    self.groupModel.read(iprot)
                else:
                    iprot.skip(ftype)
            else:
                iprot.skip(ftype)
            iprot.readFieldEnd()
        iprot.readStructEnd()

    def write(self, oprot):
        if oprot._fast_encode is not None and self.thrift_spec is not None:
            oprot.trans.write(oprot._fast_encode(self, (self.__class__, self.thrift_spec)))
            return
        oprot.writeStructBegin('updateGroup_args')
        if self.authzToken is not None:
            oprot.writeFieldBegin('authzToken', TType.STRUCT, 1)
            self.authzToken.write(oprot)
            oprot.writeFieldEnd()
        if self.groupModel is not None:
            oprot.writeFieldBegin('groupModel', TType.STRUCT, 2)
            self.groupModel.write(oprot)
            oprot.writeFieldEnd()
        oprot.writeFieldStop()
        oprot.writeStructEnd()

    def validate(self):
        if self.authzToken is None:
            raise TProtocolException(message='Required field authzToken is unset!')
        if self.groupModel is None:
            raise TProtocolException(message='Required field groupModel is unset!')
        return

    def __repr__(self):
        L = ['%s=%r' % (key, value)
             for key, value in self.__dict__.items()]
        return '%s(%s)' % (self.__class__.__name__, ', '.join(L))

    def __eq__(self, other):
        return isinstance(other, self.__class__) and self.__dict__ == other.__dict__

    def __ne__(self, other):
        return not (self == other)


class updateGroup_result(object):
    """
    Attributes:
     - success
     - ire
     - ace
     - ase
     - ae
    """

    thrift_spec = (
        (0, TType.BOOL, 'success', None, None, ),  # 0
        (1, TType.STRUCT, 'ire', (apache.airavata.api.error.ttypes.InvalidRequestException, apache.airavata.api.error.ttypes.InvalidRequestException.thrift_spec), None, ),  # 1
        (2, TType.STRUCT, 'ace', (apache.airavata.api.error.ttypes.AiravataClientException, apache.airavata.api.error.ttypes.AiravataClientException.thrift_spec), None, ),  # 2
        (3, TType.STRUCT, 'ase', (apache.airavata.api.error.ttypes.AiravataSystemException, apache.airavata.api.error.ttypes.AiravataSystemException.thrift_spec), None, ),  # 3
        (4, TType.STRUCT, 'ae', (apache.airavata.api.error.ttypes.AuthorizationException, apache.airavata.api.error.ttypes.AuthorizationException.thrift_spec), None, ),  # 4
    )

    def __init__(self, success=None, ire=None, ace=None, ase=None, ae=None,):
        self.success = success
        self.ire = ire
        self.ace = ace
        self.ase = ase
        self.ae = ae

    def read(self, iprot):
        if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None:
            iprot._fast_decode(self, iprot, (self.__class__, self.thrift_spec))
            return
        iprot.readStructBegin()
        while True:
            (fname, ftype, fid) = iprot.readFieldBegin()
            if ftype == TType.STOP:
                break
            if fid == 0:
                if ftype == TType.BOOL:
                    self.success = iprot.readBool()
                else:
                    iprot.skip(ftype)
            elif fid == 1:
                if ftype == TType.STRUCT:
                    self.ire = apache.airavata.api.error.ttypes.InvalidRequestException()
                    self.ire.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 2:
                if ftype == TType.STRUCT:
                    self.ace = apache.airavata.api.error.ttypes.AiravataClientException()
                    self.ace.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 3:
                if ftype == TType.STRUCT:
                    self.ase = apache.airavata.api.error.ttypes.AiravataSystemException()
                    self.ase.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 4:
                if ftype == TType.STRUCT:
                    self.ae = apache.airavata.api.error.ttypes.AuthorizationException()
                    self.ae.read(iprot)
                else:
                    iprot.skip(ftype)
            else:
                iprot.skip(ftype)
            iprot.readFieldEnd()
        iprot.readStructEnd()

    def write(self, oprot):
        if oprot._fast_encode is not None and self.thrift_spec is not None:
            oprot.trans.write(oprot._fast_encode(self, (self.__class__, self.thrift_spec)))
            return
        oprot.writeStructBegin('updateGroup_result')
        if self.success is not None:
            oprot.writeFieldBegin('success', TType.BOOL, 0)
            oprot.writeBool(self.success)
            oprot.writeFieldEnd()
        if self.ire is not None:
            oprot.writeFieldBegin('ire', TType.STRUCT, 1)
            self.ire.write(oprot)
            oprot.writeFieldEnd()
        if self.ace is not None:
            oprot.writeFieldBegin('ace', TType.STRUCT, 2)
            self.ace.write(oprot)
            oprot.writeFieldEnd()
        if self.ase is not None:
            oprot.writeFieldBegin('ase', TType.STRUCT, 3)
            self.ase.write(oprot)
            oprot.writeFieldEnd()
        if self.ae is not None:
            oprot.writeFieldBegin('ae', TType.STRUCT, 4)
            self.ae.write(oprot)
            oprot.writeFieldEnd()
        oprot.writeFieldStop()
        oprot.writeStructEnd()

    def validate(self):
        return

    def __repr__(self):
        L = ['%s=%r' % (key, value)
             for key, value in self.__dict__.items()]
        return '%s(%s)' % (self.__class__.__name__, ', '.join(L))

    def __eq__(self, other):
        return isinstance(other, self.__class__) and self.__dict__ == other.__dict__

    def __ne__(self, other):
        return not (self == other)


class deleteGroup_args(object):
    """
    Attributes:
     - authzToken
     - groupId
     - ownerId
     - gatewayId
    """

    thrift_spec = (
        None,  # 0
        (1, TType.STRUCT, 'authzToken', (apache.airavata.model.security.ttypes.AuthzToken, apache.airavata.model.security.ttypes.AuthzToken.thrift_spec), None, ),  # 1
        (2, TType.STRING, 'groupId', 'UTF8', None, ),  # 2
        (3, TType.STRING, 'ownerId', 'UTF8', None, ),  # 3
        (4, TType.STRING, 'gatewayId', 'UTF8', None, ),  # 4
    )

    def __init__(self, authzToken=None, groupId=None, ownerId=None, gatewayId=None,):
        self.authzToken = authzToken
        self.groupId = groupId
        self.ownerId = ownerId
        self.gatewayId = gatewayId

    def read(self, iprot):
        if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None:
            iprot._fast_decode(self, iprot, (self.__class__, self.thrift_spec))
            return
        iprot.readStructBegin()
        while True:
            (fname, ftype, fid) = iprot.readFieldBegin()
            if ftype == TType.STOP:
                break
            if fid == 1:
                if ftype == TType.STRUCT:
                    self.authzToken = apache.airavata.model.security.ttypes.AuthzToken()
                    self.authzToken.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 2:
                if ftype == TType.STRING:
                    self.groupId = iprot.readString().decode('utf-8') if sys.version_info[0] == 2 else iprot.readString()
                else:
                    iprot.skip(ftype)
            elif fid == 3:
                if ftype == TType.STRING:
                    self.ownerId = iprot.readString().decode('utf-8') if sys.version_info[0] == 2 else iprot.readString()
                else:
                    iprot.skip(ftype)
            elif fid == 4:
                if ftype == TType.STRING:
                    self.gatewayId = iprot.readString().decode('utf-8') if sys.version_info[0] == 2 else iprot.readString()
                else:
                    iprot.skip(ftype)
            else:
                iprot.skip(ftype)
            iprot.readFieldEnd()
        iprot.readStructEnd()

    def write(self, oprot):
        if oprot._fast_encode is not None and self.thrift_spec is not None:
            oprot.trans.write(oprot._fast_encode(self, (self.__class__, self.thrift_spec)))
            return
        oprot.writeStructBegin('deleteGroup_args')
        if self.authzToken is not None:
            oprot.writeFieldBegin('authzToken', TType.STRUCT, 1)
            self.authzToken.write(oprot)
            oprot.writeFieldEnd()
        if self.groupId is not None:
            oprot.writeFieldBegin('groupId', TType.STRING, 2)
            oprot.writeString(self.groupId.encode('utf-8') if sys.version_info[0] == 2 else self.groupId)
            oprot.writeFieldEnd()
        if self.ownerId is not None:
            oprot.writeFieldBegin('ownerId', TType.STRING, 3)
            oprot.writeString(self.ownerId.encode('utf-8') if sys.version_info[0] == 2 else self.ownerId)
            oprot.writeFieldEnd()
        if self.gatewayId is not None:
            oprot.writeFieldBegin('gatewayId', TType.STRING, 4)
            oprot.writeString(self.gatewayId.encode('utf-8') if sys.version_info[0] == 2 else self.gatewayId)
            oprot.writeFieldEnd()
        oprot.writeFieldStop()
        oprot.writeStructEnd()

    def validate(self):
        if self.authzToken is None:
            raise TProtocolException(message='Required field authzToken is unset!')
        if self.groupId is None:
            raise TProtocolException(message='Required field groupId is unset!')
        if self.ownerId is None:
            raise TProtocolException(message='Required field ownerId is unset!')
        if self.gatewayId is None:
            raise TProtocolException(message='Required field gatewayId is unset!')
        return

    def __repr__(self):
        L = ['%s=%r' % (key, value)
             for key, value in self.__dict__.items()]
        return '%s(%s)' % (self.__class__.__name__, ', '.join(L))

    def __eq__(self, other):
        return isinstance(other, self.__class__) and self.__dict__ == other.__dict__

    def __ne__(self, other):
        return not (self == other)


class deleteGroup_result(object):
    """
    Attributes:
     - success
     - ire
     - ace
     - ase
     - ae
    """

    thrift_spec = (
        (0, TType.BOOL, 'success', None, None, ),  # 0
        (1, TType.STRUCT, 'ire', (apache.airavata.api.error.ttypes.InvalidRequestException, apache.airavata.api.error.ttypes.InvalidRequestException.thrift_spec), None, ),  # 1
        (2, TType.STRUCT, 'ace', (apache.airavata.api.error.ttypes.AiravataClientException, apache.airavata.api.error.ttypes.AiravataClientException.thrift_spec), None, ),  # 2
        (3, TType.STRUCT, 'ase', (apache.airavata.api.error.ttypes.AiravataSystemException, apache.airavata.api.error.ttypes.AiravataSystemException.thrift_spec), None, ),  # 3
        (4, TType.STRUCT, 'ae', (apache.airavata.api.error.ttypes.AuthorizationException, apache.airavata.api.error.ttypes.AuthorizationException.thrift_spec), None, ),  # 4
    )

    def __init__(self, success=None, ire=None, ace=None, ase=None, ae=None,):
        self.success = success
        self.ire = ire
        self.ace = ace
        self.ase = ase
        self.ae = ae

    def read(self, iprot):
        if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None:
            iprot._fast_decode(self, iprot, (self.__class__, self.thrift_spec))
            return
        iprot.readStructBegin()
        while True:
            (fname, ftype, fid) = iprot.readFieldBegin()
            if ftype == TType.STOP:
                break
            if fid == 0:
                if ftype == TType.BOOL:
                    self.success = iprot.readBool()
                else:
                    iprot.skip(ftype)
            elif fid == 1:
                if ftype == TType.STRUCT:
                    self.ire = apache.airavata.api.error.ttypes.InvalidRequestException()
                    self.ire.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 2:
                if ftype == TType.STRUCT:
                    self.ace = apache.airavata.api.error.ttypes.AiravataClientException()
                    self.ace.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 3:
                if ftype == TType.STRUCT:
                    self.ase = apache.airavata.api.error.ttypes.AiravataSystemException()
                    self.ase.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 4:
                if ftype == TType.STRUCT:
                    self.ae = apache.airavata.api.error.ttypes.AuthorizationException()
                    self.ae.read(iprot)
                else:
                    iprot.skip(ftype)
            else:
                iprot.skip(ftype)
            iprot.readFieldEnd()
        iprot.readStructEnd()

    def write(self, oprot):
        if oprot._fast_encode is not None and self.thrift_spec is not None:
            oprot.trans.write(oprot._fast_encode(self, (self.__class__, self.thrift_spec)))
            return
        oprot.writeStructBegin('deleteGroup_result')
        if self.success is not None:
            oprot.writeFieldBegin('success', TType.BOOL, 0)
            oprot.writeBool(self.success)
            oprot.writeFieldEnd()
        if self.ire is not None:
            oprot.writeFieldBegin('ire', TType.STRUCT, 1)
            self.ire.write(oprot)
            oprot.writeFieldEnd()
        if self.ace is not None:
            oprot.writeFieldBegin('ace', TType.STRUCT, 2)
            self.ace.write(oprot)
            oprot.writeFieldEnd()
        if self.ase is not None:
            oprot.writeFieldBegin('ase', TType.STRUCT, 3)
            self.ase.write(oprot)
            oprot.writeFieldEnd()
        if self.ae is not None:
            oprot.writeFieldBegin('ae', TType.STRUCT, 4)
            self.ae.write(oprot)
            oprot.writeFieldEnd()
        oprot.writeFieldStop()
        oprot.writeStructEnd()

    def validate(self):
        return

    def __repr__(self):
        L = ['%s=%r' % (key, value)
             for key, value in self.__dict__.items()]
        return '%s(%s)' % (self.__class__.__name__, ', '.join(L))

    def __eq__(self, other):
        return isinstance(other, self.__class__) and self.__dict__ == other.__dict__

    def __ne__(self, other):
        return not (self == other)


class getGroup_args(object):
    """
    Attributes:
     - authzToken
     - groupId
    """

    thrift_spec = (
        None,  # 0
        (1, TType.STRUCT, 'authzToken', (apache.airavata.model.security.ttypes.AuthzToken, apache.airavata.model.security.ttypes.AuthzToken.thrift_spec), None, ),  # 1
        (2, TType.STRING, 'groupId', 'UTF8', None, ),  # 2
    )

    def __init__(self, authzToken=None, groupId=None,):
        self.authzToken = authzToken
        self.groupId = groupId

    def read(self, iprot):
        if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None:
            iprot._fast_decode(self, iprot, (self.__class__, self.thrift_spec))
            return
        iprot.readStructBegin()
        while True:
            (fname, ftype, fid) = iprot.readFieldBegin()
            if ftype == TType.STOP:
                break
            if fid == 1:
                if ftype == TType.STRUCT:
                    self.authzToken = apache.airavata.model.security.ttypes.AuthzToken()
                    self.authzToken.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 2:
                if ftype == TType.STRING:
                    self.groupId = iprot.readString().decode('utf-8') if sys.version_info[0] == 2 else iprot.readString()
                else:
                    iprot.skip(ftype)
            else:
                iprot.skip(ftype)
            iprot.readFieldEnd()
        iprot.readStructEnd()

    def write(self, oprot):
        if oprot._fast_encode is not None and self.thrift_spec is not None:
            oprot.trans.write(oprot._fast_encode(self, (self.__class__, self.thrift_spec)))
            return
        oprot.writeStructBegin('getGroup_args')
        if self.authzToken is not None:
            oprot.writeFieldBegin('authzToken', TType.STRUCT, 1)
            self.authzToken.write(oprot)
            oprot.writeFieldEnd()
        if self.groupId is not None:
            oprot.writeFieldBegin('groupId', TType.STRING, 2)
            oprot.writeString(self.groupId.encode('utf-8') if sys.version_info[0] == 2 else self.groupId)
            oprot.writeFieldEnd()
        oprot.writeFieldStop()
        oprot.writeStructEnd()

    def validate(self):
        if self.authzToken is None:
            raise TProtocolException(message='Required field authzToken is unset!')
        if self.groupId is None:
            raise TProtocolException(message='Required field groupId is unset!')
        return

    def __repr__(self):
        L = ['%s=%r' % (key, value)
             for key, value in self.__dict__.items()]
        return '%s(%s)' % (self.__class__.__name__, ', '.join(L))

    def __eq__(self, other):
        return isinstance(other, self.__class__) and self.__dict__ == other.__dict__

    def __ne__(self, other):
        return not (self == other)


class getGroup_result(object):
    """
    Attributes:
     - success
     - ire
     - ace
     - ase
     - ae
    """

    thrift_spec = (
        (0, TType.STRUCT, 'success', (apache.airavata.model.group.ttypes.GroupModel, apache.airavata.model.group.ttypes.GroupModel.thrift_spec), None, ),  # 0
        (1, TType.STRUCT, 'ire', (apache.airavata.api.error.ttypes.InvalidRequestException, apache.airavata.api.error.ttypes.InvalidRequestException.thrift_spec), None, ),  # 1
        (2, TType.STRUCT, 'ace', (apache.airavata.api.error.ttypes.AiravataClientException, apache.airavata.api.error.ttypes.AiravataClientException.thrift_spec), None, ),  # 2
        (3, TType.STRUCT, 'ase', (apache.airavata.api.error.ttypes.AiravataSystemException, apache.airavata.api.error.ttypes.AiravataSystemException.thrift_spec), None, ),  # 3
        (4, TType.STRUCT, 'ae', (apache.airavata.api.error.ttypes.AuthorizationException, apache.airavata.api.error.ttypes.AuthorizationException.thrift_spec), None, ),  # 4
    )

    def __init__(self, success=None, ire=None, ace=None, ase=None, ae=None,):
        self.success = success
        self.ire = ire
        self.ace = ace
        self.ase = ase
        self.ae = ae

    def read(self, iprot):
        if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None:
            iprot._fast_decode(self, iprot, (self.__class__, self.thrift_spec))
            return
        iprot.readStructBegin()
        while True:
            (fname, ftype, fid) = iprot.readFieldBegin()
            if ftype == TType.STOP:
                break
            if fid == 0:
                if ftype == TType.STRUCT:
                    self.success = apache.airavata.model.group.ttypes.GroupModel()
                    self.success.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 1:
                if ftype == TType.STRUCT:
                    self.ire = apache.airavata.api.error.ttypes.InvalidRequestException()
                    self.ire.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 2:
                if ftype == TType.STRUCT:
                    self.ace = apache.airavata.api.error.ttypes.AiravataClientException()
                    self.ace.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 3:
                if ftype == TType.STRUCT:
                    self.ase = apache.airavata.api.error.ttypes.AiravataSystemException()
                    self.ase.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 4:
                if ftype == TType.STRUCT:
                    self.ae = apache.airavata.api.error.ttypes.AuthorizationException()
                    self.ae.read(iprot)
                else:
                    iprot.skip(ftype)
            else:
                iprot.skip(ftype)
            iprot.readFieldEnd()
        iprot.readStructEnd()

    def write(self, oprot):
        if oprot._fast_encode is not None and self.thrift_spec is not None:
            oprot.trans.write(oprot._fast_encode(self, (self.__class__, self.thrift_spec)))
            return
        oprot.writeStructBegin('getGroup_result')
        if self.success is not None:
            oprot.writeFieldBegin('success', TType.STRUCT, 0)
            self.success.write(oprot)
            oprot.writeFieldEnd()
        if self.ire is not None:
            oprot.writeFieldBegin('ire', TType.STRUCT, 1)
            self.ire.write(oprot)
            oprot.writeFieldEnd()
        if self.ace is not None:
            oprot.writeFieldBegin('ace', TType.STRUCT, 2)
            self.ace.write(oprot)
            oprot.writeFieldEnd()
        if self.ase is not None:
            oprot.writeFieldBegin('ase', TType.STRUCT, 3)
            self.ase.write(oprot)
            oprot.writeFieldEnd()
        if self.ae is not None:
            oprot.writeFieldBegin('ae', TType.STRUCT, 4)
            self.ae.write(oprot)
            oprot.writeFieldEnd()
        oprot.writeFieldStop()
        oprot.writeStructEnd()

    def validate(self):
        return

    def __repr__(self):
        L = ['%s=%r' % (key, value)
             for key, value in self.__dict__.items()]
        return '%s(%s)' % (self.__class__.__name__, ', '.join(L))

    def __eq__(self, other):
        return isinstance(other, self.__class__) and self.__dict__ == other.__dict__

    def __ne__(self, other):
        return not (self == other)


class getAllGroupsUserBelongs_args(object):
    """
    Attributes:
     - authzToken
     - userName
     - gatewayId
    """

    thrift_spec = (
        None,  # 0
        (1, TType.STRUCT, 'authzToken', (apache.airavata.model.security.ttypes.AuthzToken, apache.airavata.model.security.ttypes.AuthzToken.thrift_spec), None, ),  # 1
        (2, TType.STRING, 'userName', 'UTF8', None, ),  # 2
        (3, TType.STRING, 'gatewayId', 'UTF8', None, ),  # 3
    )

    def __init__(self, authzToken=None, userName=None, gatewayId=None,):
        self.authzToken = authzToken
        self.userName = userName
        self.gatewayId = gatewayId

    def read(self, iprot):
        if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None:
            iprot._fast_decode(self, iprot, (self.__class__, self.thrift_spec))
            return
        iprot.readStructBegin()
        while True:
            (fname, ftype, fid) = iprot.readFieldBegin()
            if ftype == TType.STOP:
                break
            if fid == 1:
                if ftype == TType.STRUCT:
                    self.authzToken = apache.airavata.model.security.ttypes.AuthzToken()
                    self.authzToken.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 2:
                if ftype == TType.STRING:
                    self.userName = iprot.readString().decode('utf-8') if sys.version_info[0] == 2 else iprot.readString()
                else:
                    iprot.skip(ftype)
            elif fid == 3:
                if ftype == TType.STRING:
                    self.gatewayId = iprot.readString().decode('utf-8') if sys.version_info[0] == 2 else iprot.readString()
                else:
                    iprot.skip(ftype)
            else:
                iprot.skip(ftype)
            iprot.readFieldEnd()
        iprot.readStructEnd()

    def write(self, oprot):
        if oprot._fast_encode is not None and self.thrift_spec is not None:
            oprot.trans.write(oprot._fast_encode(self, (self.__class__, self.thrift_spec)))
            return
        oprot.writeStructBegin('getAllGroupsUserBelongs_args')
        if self.authzToken is not None:
            oprot.writeFieldBegin('authzToken', TType.STRUCT, 1)
            self.authzToken.write(oprot)
            oprot.writeFieldEnd()
        if self.userName is not None:
            oprot.writeFieldBegin('userName', TType.STRING, 2)
            oprot.writeString(self.userName.encode('utf-8') if sys.version_info[0] == 2 else self.userName)
            oprot.writeFieldEnd()
        if self.gatewayId is not None:
            oprot.writeFieldBegin('gatewayId', TType.STRING, 3)
            oprot.writeString(self.gatewayId.encode('utf-8') if sys.version_info[0] == 2 else self.gatewayId)
            oprot.writeFieldEnd()
        oprot.writeFieldStop()
        oprot.writeStructEnd()

    def validate(self):
        if self.authzToken is None:
            raise TProtocolException(message='Required field authzToken is unset!')
        if self.userName is None:
            raise TProtocolException(message='Required field userName is unset!')
        if self.gatewayId is None:
            raise TProtocolException(message='Required field gatewayId is unset!')
        return

    def __repr__(self):
        L = ['%s=%r' % (key, value)
             for key, value in self.__dict__.items()]
        return '%s(%s)' % (self.__class__.__name__, ', '.join(L))

    def __eq__(self, other):
        return isinstance(other, self.__class__) and self.__dict__ == other.__dict__

    def __ne__(self, other):
        return not (self == other)


class getAllGroupsUserBelongs_result(object):
    """
    Attributes:
     - success
     - ire
     - ace
     - ase
     - ae
    """

    thrift_spec = (
        (0, TType.LIST, 'success', (TType.STRUCT, (apache.airavata.model.group.ttypes.GroupModel, apache.airavata.model.group.ttypes.GroupModel.thrift_spec), False), None, ),  # 0
        (1, TType.STRUCT, 'ire', (apache.airavata.api.error.ttypes.InvalidRequestException, apache.airavata.api.error.ttypes.InvalidRequestException.thrift_spec), None, ),  # 1
        (2, TType.STRUCT, 'ace', (apache.airavata.api.error.ttypes.AiravataClientException, apache.airavata.api.error.ttypes.AiravataClientException.thrift_spec), None, ),  # 2
        (3, TType.STRUCT, 'ase', (apache.airavata.api.error.ttypes.AiravataSystemException, apache.airavata.api.error.ttypes.AiravataSystemException.thrift_spec), None, ),  # 3
        (4, TType.STRUCT, 'ae', (apache.airavata.api.error.ttypes.AuthorizationException, apache.airavata.api.error.ttypes.AuthorizationException.thrift_spec), None, ),  # 4
    )

    def __init__(self, success=None, ire=None, ace=None, ase=None, ae=None,):
        self.success = success
        self.ire = ire
        self.ace = ace
        self.ase = ase
        self.ae = ae

    def read(self, iprot):
        if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None:
            iprot._fast_decode(self, iprot, (self.__class__, self.thrift_spec))
            return
        iprot.readStructBegin()
        while True:
            (fname, ftype, fid) = iprot.readFieldBegin()
            if ftype == TType.STOP:
                break
            if fid == 0:
                if ftype == TType.LIST:
                    self.success = []
                    (_etype323, _size320) = iprot.readListBegin()
                    for _i324 in range(_size320):
                        _elem325 = apache.airavata.model.group.ttypes.GroupModel()
                        _elem325.read(iprot)
                        self.success.append(_elem325)
                    iprot.readListEnd()
                else:
                    iprot.skip(ftype)
            elif fid == 1:
                if ftype == TType.STRUCT:
                    self.ire = apache.airavata.api.error.ttypes.InvalidRequestException()
                    self.ire.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 2:
                if ftype == TType.STRUCT:
                    self.ace = apache.airavata.api.error.ttypes.AiravataClientException()
                    self.ace.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 3:
                if ftype == TType.STRUCT:
                    self.ase = apache.airavata.api.error.ttypes.AiravataSystemException()
                    self.ase.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 4:
                if ftype == TType.STRUCT:
                    self.ae = apache.airavata.api.error.ttypes.AuthorizationException()
                    self.ae.read(iprot)
                else:
                    iprot.skip(ftype)
            else:
                iprot.skip(ftype)
            iprot.readFieldEnd()
        iprot.readStructEnd()

    def write(self, oprot):
        if oprot._fast_encode is not None and self.thrift_spec is not None:
            oprot.trans.write(oprot._fast_encode(self, (self.__class__, self.thrift_spec)))
            return
        oprot.writeStructBegin('getAllGroupsUserBelongs_result')
        if self.success is not None:
            oprot.writeFieldBegin('success', TType.LIST, 0)
            oprot.writeListBegin(TType.STRUCT, len(self.success))
            for iter326 in self.success:
                iter326.write(oprot)
            oprot.writeListEnd()
            oprot.writeFieldEnd()
        if self.ire is not None:
            oprot.writeFieldBegin('ire', TType.STRUCT, 1)
            self.ire.write(oprot)
            oprot.writeFieldEnd()
        if self.ace is not None:
            oprot.writeFieldBegin('ace', TType.STRUCT, 2)
            self.ace.write(oprot)
            oprot.writeFieldEnd()
        if self.ase is not None:
            oprot.writeFieldBegin('ase', TType.STRUCT, 3)
            self.ase.write(oprot)
            oprot.writeFieldEnd()
        if self.ae is not None:
            oprot.writeFieldBegin('ae', TType.STRUCT, 4)
            self.ae.write(oprot)
            oprot.writeFieldEnd()
        oprot.writeFieldStop()
        oprot.writeStructEnd()

    def validate(self):
        return

    def __repr__(self):
        L = ['%s=%r' % (key, value)
             for key, value in self.__dict__.items()]
        return '%s(%s)' % (self.__class__.__name__, ', '.join(L))

    def __eq__(self, other):
        return isinstance(other, self.__class__) and self.__dict__ == other.__dict__

    def __ne__(self, other):
        return not (self == other)
