#
# 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 airavata.base.api.BaseAPI
import logging
from .ttypes import *
from thrift.Thrift import TProcessor
from thrift.transport import TTransport


class Iface(airavata.base.api.BaseAPI.Iface):
    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, description):
        """
        Generate and Register SSH Key Pair with Airavata Credential Store.

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

        @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
         - description
        """
        pass

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

        @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
         - loginUserName
         - password
         - description
        """
        pass

    def getCredentialSummary(self, authzToken, tokenId):
        """
        Parameters:
         - authzToken
         - tokenId
        """
        pass

    def getAllCredentialSummaries(self, authzToken, type):
        """
        Parameters:
         - authzToken
         - type
        """
        pass

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

    def deletePWDCredential(self, authzToken, airavataCredStoreToken):
        """
        Parameters:
         - authzToken
         - airavataCredStoreToken
        """
        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, limit, offset):
        """

        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.

        @param limit
              Amount of results to be fetched.

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



        Parameters:
         - authzToken
         - gatewayId
         - fromTime
         - toTime
         - userName
         - applicationName
         - resourceHostName
         - limit
         - offset
        """
        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 fetchIntermediateOutputs(self, authzToken, airavataExperimentId, outputNames):
        """
        Request fetching of output files for an experiment that is still executing.
        This method results in a new Process being created for the Experiment with
        tasks for fetching each output file.

        @param authzToken

        @param airavataExperimentId
            Experiment ID of the experiment

        @param outputNames
            List of names of the experiment's outputs to fetch.


        Parameters:
         - authzToken
         - airavataExperimentId
         - outputNames
        """
        pass

    def getIntermediateOutputProcessStatus(self, authzToken, airavataExperimentId, outputNames):
        """
        Get the status of the most recent intermediate output fetching process for the given output names.

        @param authzToken

        @param airavataExperimentId
            Experiment ID of the experiment

        @param outputNames
            List of names of the experiment's outputs to fetch.


        Parameters:
         - authzToken
         - airavataExperimentId
         - outputNames
        """
        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 getAccessibleAppModules(self, authzToken, gatewayId):
        """

        Fetch all accessible Application Module Descriptions.

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

        @return list
           Returns the list of all Application Module Objects that are accessible to the user.


        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 getAccessibleApplicationDeployments(self, authzToken, gatewayId, permissionType):
        """

        Fetch all accessible Application Deployment Descriptions.

        @param gatewayId
           ID of the gateway which need to list all accessible application deployment documentation.
        @param permissionType
           ResourcePermissionType to check for this user

        @return list<applicationDeployment.
           Returns the list of all application Deployment Objects that are accessible to the user.


        Parameters:
         - authzToken
         - gatewayId
         - permissionType
        """
        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 getApplicationDeploymentsForAppModuleAndGroupResourceProfile(self, authzToken, appModuleId, groupResourceProfileId):
        """
        Fetch a list of Application Deployments that this user can use for executing the given Application Module using the given Group Resource Profile.
        The user must have at least READ access to the Group Resource Profile.

        @param appModuleId
           The identifier for the Application Module

        @param groupResourceProfileId
           The identifier for the Group Resource Profile

        @return list<ApplicationDeploymentDescription>
           Returns a list of Application Deployments

        Parameters:
         - authzToken
         - appModuleId
         - groupResourceProfileId
        """
        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 getSSHAccountProvisioners(self, authzToken):
        """
        Parameters:
         - authzToken
        """
        pass

    def doesUserHaveSSHAccount(self, authzToken, computeResourceId, userId):
        """
        Check if user has an SSH account on the given compute resource. This
        method will only work if the compute resource has an SSHAccountProvisioner configured for it.

        Parameters:
         - authzToken
         - computeResourceId
         - userId
        """
        pass

    def isSSHSetupCompleteForUserComputeResourcePreference(self, authzToken, computeResourceId, airavataCredStoreToken):
        """
        Check if SSH account setup is complete for this user on the given compute resource.

        Parameters:
         - authzToken
         - computeResourceId
         - airavataCredStoreToken
        """
        pass

    def setupUserComputeResourcePreferencesForSSH(self, authzToken, computeResourceId, userId, airavataCredStoreToken):
        """
        Setup and return a UserComputeResourcePreference object for this user to SSH into the given compute resource with
        the given SSH credential. This method will only work if the compute resource has an SSHAccountProvisioner
        configured for it. The returned UserComputeResourcePreference object is not saved; it is up to the client to
        call addUserComputeResourcePreference to persist it.

        Parameters:
         - authzToken
         - computeResourceId
         - userId
         - airavataCredStoreToken
        """
        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 isUserResourceProfileExists(self, authzToken, userId, gatewayID):
        """
        Check if User Resource Profile exists.

        @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 bool


        Parameters:
         - authzToken
         - userId
         - gatewayID
        """
        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 getLatestQueueStatuses(self, authzToken):
        """
        Parameters:
         - authzToken
        """
        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, userPermissionList):
        """
        Group Manager and Data Sharing Related API methods


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

    def shareResourceWithGroups(self, authzToken, resourceId, groupPermissionList):
        """
        Parameters:
         - authzToken
         - resourceId
         - groupPermissionList
        """
        pass

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

    def revokeSharingOfResourceFromGroups(self, authzToken, resourceId, groupPermissionList):
        """
        Parameters:
         - authzToken
         - resourceId
         - groupPermissionList
        """
        pass

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

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

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

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

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

    def createGroupResourceProfile(self, authzToken, groupResourceProfile):
        """
        Parameters:
         - authzToken
         - groupResourceProfile
        """
        pass

    def updateGroupResourceProfile(self, authzToken, groupResourceProfile):
        """
        Parameters:
         - authzToken
         - groupResourceProfile
        """
        pass

    def getGroupResourceProfile(self, authzToken, groupResourceProfileId):
        """
        Parameters:
         - authzToken
         - groupResourceProfileId
        """
        pass

    def removeGroupResourceProfile(self, authzToken, groupResourceProfileId):
        """
        Parameters:
         - authzToken
         - groupResourceProfileId
        """
        pass

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

    def removeGroupComputePrefs(self, authzToken, computeResourceId, groupResourceProfileId):
        """
        Parameters:
         - authzToken
         - computeResourceId
         - groupResourceProfileId
        """
        pass

    def removeGroupComputeResourcePolicy(self, authzToken, resourcePolicyId):
        """
        Parameters:
         - authzToken
         - resourcePolicyId
        """
        pass

    def removeGroupBatchQueueResourcePolicy(self, authzToken, resourcePolicyId):
        """
        Parameters:
         - authzToken
         - resourcePolicyId
        """
        pass

    def getGroupComputeResourcePreference(self, authzToken, computeResourceId, groupResourceProfileId):
        """
        Parameters:
         - authzToken
         - computeResourceId
         - groupResourceProfileId
        """
        pass

    def getGroupComputeResourcePolicy(self, authzToken, resourcePolicyId):
        """
        Parameters:
         - authzToken
         - resourcePolicyId
        """
        pass

    def getBatchQueueResourcePolicy(self, authzToken, resourcePolicyId):
        """
        Parameters:
         - authzToken
         - resourcePolicyId
        """
        pass

    def getGroupComputeResourcePrefList(self, authzToken, groupResourceProfileId):
        """
        Parameters:
         - authzToken
         - groupResourceProfileId
        """
        pass

    def getGroupBatchQueueResourcePolicyList(self, authzToken, groupResourceProfileId):
        """
        Parameters:
         - authzToken
         - groupResourceProfileId
        """
        pass

    def getGroupComputeResourcePolicyList(self, authzToken, groupResourceProfileId):
        """
        Parameters:
         - authzToken
         - groupResourceProfileId
        """
        pass

    def getGatewayGroups(self, authzToken):
        """
        GatewayGroups API methods

        Parameters:
         - authzToken
        """
        pass

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

    def saveParser(self, authzToken, parser):
        """
        Parameters:
         - authzToken
         - parser
        """
        pass

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

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

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

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

    def saveParsingTemplate(self, authzToken, parsingTemplate):
        """
        Parameters:
         - authzToken
         - parsingTemplate
        """
        pass

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

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


class Client(airavata.base.api.BaseAPI.Client, Iface):
    def __init__(self, iprot, oprot=None):
        airavata.base.api.BaseAPI.Client.__init__(self, iprot, oprot)

    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, description):
        """
        Generate and Register SSH Key Pair with Airavata Credential Store.

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

        @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
         - description
        """
        self.send_generateAndRegisterSSHKeys(authzToken, description)
        return self.recv_generateAndRegisterSSHKeys()

    def send_generateAndRegisterSSHKeys(self, authzToken, description):
        self._oprot.writeMessageBegin('generateAndRegisterSSHKeys', TMessageType.CALL, self._seqid)
        args = generateAndRegisterSSHKeys_args()
        args.authzToken = authzToken
        args.description = description
        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, loginUserName, password, description):
        """
        Generate and Register Username PWD Pair with Airavata Credential Store.

        @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
         - loginUserName
         - password
         - description
        """
        self.send_registerPwdCredential(authzToken, loginUserName, password, description)
        return self.recv_registerPwdCredential()

    def send_registerPwdCredential(self, authzToken, loginUserName, password, description):
        self._oprot.writeMessageBegin('registerPwdCredential', TMessageType.CALL, self._seqid)
        args = registerPwdCredential_args()
        args.authzToken = authzToken
        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 getCredentialSummary(self, authzToken, tokenId):
        """
        Parameters:
         - authzToken
         - tokenId
        """
        self.send_getCredentialSummary(authzToken, tokenId)
        return self.recv_getCredentialSummary()

    def send_getCredentialSummary(self, authzToken, tokenId):
        self._oprot.writeMessageBegin('getCredentialSummary', TMessageType.CALL, self._seqid)
        args = getCredentialSummary_args()
        args.authzToken = authzToken
        args.tokenId = tokenId
        args.write(self._oprot)
        self._oprot.writeMessageEnd()
        self._oprot.trans.flush()

    def recv_getCredentialSummary(self):
        iprot = self._iprot
        (fname, mtype, rseqid) = iprot.readMessageBegin()
        if mtype == TMessageType.EXCEPTION:
            x = TApplicationException()
            x.read(iprot)
            iprot.readMessageEnd()
            raise x
        result = getCredentialSummary_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, "getCredentialSummary failed: unknown result")

    def getAllCredentialSummaries(self, authzToken, type):
        """
        Parameters:
         - authzToken
         - type
        """
        self.send_getAllCredentialSummaries(authzToken, type)
        return self.recv_getAllCredentialSummaries()

    def send_getAllCredentialSummaries(self, authzToken, type):
        self._oprot.writeMessageBegin('getAllCredentialSummaries', TMessageType.CALL, self._seqid)
        args = getAllCredentialSummaries_args()
        args.authzToken = authzToken
        args.type = type
        args.write(self._oprot)
        self._oprot.writeMessageEnd()
        self._oprot.trans.flush()

    def recv_getAllCredentialSummaries(self):
        iprot = self._iprot
        (fname, mtype, rseqid) = iprot.readMessageBegin()
        if mtype == TMessageType.EXCEPTION:
            x = TApplicationException()
            x.read(iprot)
            iprot.readMessageEnd()
            raise x
        result = getAllCredentialSummaries_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, "getAllCredentialSummaries failed: unknown result")

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

    def send_deleteSSHPubKey(self, authzToken, airavataCredStoreToken):
        self._oprot.writeMessageBegin('deleteSSHPubKey', TMessageType.CALL, self._seqid)
        args = deleteSSHPubKey_args()
        args.authzToken = authzToken
        args.airavataCredStoreToken = airavataCredStoreToken
        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
        if result.ae is not None:
            raise result.ae
        raise TApplicationException(TApplicationException.MISSING_RESULT, "deleteSSHPubKey failed: unknown result")

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

    def send_deletePWDCredential(self, authzToken, airavataCredStoreToken):
        self._oprot.writeMessageBegin('deletePWDCredential', TMessageType.CALL, self._seqid)
        args = deletePWDCredential_args()
        args.authzToken = authzToken
        args.airavataCredStoreToken = airavataCredStoreToken
        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
        if result.ae is not None:
            raise result.ae
        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, limit, offset):
        """

        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.

        @param limit
              Amount of results to be fetched.

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



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

    def send_getExperimentStatistics(self, authzToken, gatewayId, fromTime, toTime, userName, applicationName, resourceHostName, limit, offset):
        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.limit = limit
        args.offset = offset
        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 fetchIntermediateOutputs(self, authzToken, airavataExperimentId, outputNames):
        """
        Request fetching of output files for an experiment that is still executing.
        This method results in a new Process being created for the Experiment with
        tasks for fetching each output file.

        @param authzToken

        @param airavataExperimentId
            Experiment ID of the experiment

        @param outputNames
            List of names of the experiment's outputs to fetch.


        Parameters:
         - authzToken
         - airavataExperimentId
         - outputNames
        """
        self.send_fetchIntermediateOutputs(authzToken, airavataExperimentId, outputNames)
        self.recv_fetchIntermediateOutputs()

    def send_fetchIntermediateOutputs(self, authzToken, airavataExperimentId, outputNames):
        self._oprot.writeMessageBegin('fetchIntermediateOutputs', TMessageType.CALL, self._seqid)
        args = fetchIntermediateOutputs_args()
        args.authzToken = authzToken
        args.airavataExperimentId = airavataExperimentId
        args.outputNames = outputNames
        args.write(self._oprot)
        self._oprot.writeMessageEnd()
        self._oprot.trans.flush()

    def recv_fetchIntermediateOutputs(self):
        iprot = self._iprot
        (fname, mtype, rseqid) = iprot.readMessageBegin()
        if mtype == TMessageType.EXCEPTION:
            x = TApplicationException()
            x.read(iprot)
            iprot.readMessageEnd()
            raise x
        result = fetchIntermediateOutputs_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 getIntermediateOutputProcessStatus(self, authzToken, airavataExperimentId, outputNames):
        """
        Get the status of the most recent intermediate output fetching process for the given output names.

        @param authzToken

        @param airavataExperimentId
            Experiment ID of the experiment

        @param outputNames
            List of names of the experiment's outputs to fetch.


        Parameters:
         - authzToken
         - airavataExperimentId
         - outputNames
        """
        self.send_getIntermediateOutputProcessStatus(authzToken, airavataExperimentId, outputNames)
        return self.recv_getIntermediateOutputProcessStatus()

    def send_getIntermediateOutputProcessStatus(self, authzToken, airavataExperimentId, outputNames):
        self._oprot.writeMessageBegin('getIntermediateOutputProcessStatus', TMessageType.CALL, self._seqid)
        args = getIntermediateOutputProcessStatus_args()
        args.authzToken = authzToken
        args.airavataExperimentId = airavataExperimentId
        args.outputNames = outputNames
        args.write(self._oprot)
        self._oprot.writeMessageEnd()
        self._oprot.trans.flush()

    def recv_getIntermediateOutputProcessStatus(self):
        iprot = self._iprot
        (fname, mtype, rseqid) = iprot.readMessageBegin()
        if mtype == TMessageType.EXCEPTION:
            x = TApplicationException()
            x.read(iprot)
            iprot.readMessageEnd()
            raise x
        result = getIntermediateOutputProcessStatus_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, "getIntermediateOutputProcessStatus 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 getAccessibleAppModules(self, authzToken, gatewayId):
        """

        Fetch all accessible Application Module Descriptions.

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

        @return list
           Returns the list of all Application Module Objects that are accessible to the user.


        Parameters:
         - authzToken
         - gatewayId
        """
        self.send_getAccessibleAppModules(authzToken, gatewayId)
        return self.recv_getAccessibleAppModules()

    def send_getAccessibleAppModules(self, authzToken, gatewayId):
        self._oprot.writeMessageBegin('getAccessibleAppModules', TMessageType.CALL, self._seqid)
        args = getAccessibleAppModules_args()
        args.authzToken = authzToken
        args.gatewayId = gatewayId
        args.write(self._oprot)
        self._oprot.writeMessageEnd()
        self._oprot.trans.flush()

    def recv_getAccessibleAppModules(self):
        iprot = self._iprot
        (fname, mtype, rseqid) = iprot.readMessageBegin()
        if mtype == TMessageType.EXCEPTION:
            x = TApplicationException()
            x.read(iprot)
            iprot.readMessageEnd()
            raise x
        result = getAccessibleAppModules_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, "getAccessibleAppModules 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 getAccessibleApplicationDeployments(self, authzToken, gatewayId, permissionType):
        """

        Fetch all accessible Application Deployment Descriptions.

        @param gatewayId
           ID of the gateway which need to list all accessible application deployment documentation.
        @param permissionType
           ResourcePermissionType to check for this user

        @return list<applicationDeployment.
           Returns the list of all application Deployment Objects that are accessible to the user.


        Parameters:
         - authzToken
         - gatewayId
         - permissionType
        """
        self.send_getAccessibleApplicationDeployments(authzToken, gatewayId, permissionType)
        return self.recv_getAccessibleApplicationDeployments()

    def send_getAccessibleApplicationDeployments(self, authzToken, gatewayId, permissionType):
        self._oprot.writeMessageBegin('getAccessibleApplicationDeployments', TMessageType.CALL, self._seqid)
        args = getAccessibleApplicationDeployments_args()
        args.authzToken = authzToken
        args.gatewayId = gatewayId
        args.permissionType = permissionType
        args.write(self._oprot)
        self._oprot.writeMessageEnd()
        self._oprot.trans.flush()

    def recv_getAccessibleApplicationDeployments(self):
        iprot = self._iprot
        (fname, mtype, rseqid) = iprot.readMessageBegin()
        if mtype == TMessageType.EXCEPTION:
            x = TApplicationException()
            x.read(iprot)
            iprot.readMessageEnd()
            raise x
        result = getAccessibleApplicationDeployments_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, "getAccessibleApplicationDeployments 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 getApplicationDeploymentsForAppModuleAndGroupResourceProfile(self, authzToken, appModuleId, groupResourceProfileId):
        """
        Fetch a list of Application Deployments that this user can use for executing the given Application Module using the given Group Resource Profile.
        The user must have at least READ access to the Group Resource Profile.

        @param appModuleId
           The identifier for the Application Module

        @param groupResourceProfileId
           The identifier for the Group Resource Profile

        @return list<ApplicationDeploymentDescription>
           Returns a list of Application Deployments

        Parameters:
         - authzToken
         - appModuleId
         - groupResourceProfileId
        """
        self.send_getApplicationDeploymentsForAppModuleAndGroupResourceProfile(authzToken, appModuleId, groupResourceProfileId)
        return self.recv_getApplicationDeploymentsForAppModuleAndGroupResourceProfile()

    def send_getApplicationDeploymentsForAppModuleAndGroupResourceProfile(self, authzToken, appModuleId, groupResourceProfileId):
        self._oprot.writeMessageBegin('getApplicationDeploymentsForAppModuleAndGroupResourceProfile', TMessageType.CALL, self._seqid)
        args = getApplicationDeploymentsForAppModuleAndGroupResourceProfile_args()
        args.authzToken = authzToken
        args.appModuleId = appModuleId
        args.groupResourceProfileId = groupResourceProfileId
        args.write(self._oprot)
        self._oprot.writeMessageEnd()
        self._oprot.trans.flush()

    def recv_getApplicationDeploymentsForAppModuleAndGroupResourceProfile(self):
        iprot = self._iprot
        (fname, mtype, rseqid) = iprot.readMessageBegin()
        if mtype == TMessageType.EXCEPTION:
            x = TApplicationException()
            x.read(iprot)
            iprot.readMessageEnd()
            raise x
        result = getApplicationDeploymentsForAppModuleAndGroupResourceProfile_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, "getApplicationDeploymentsForAppModuleAndGroupResourceProfile 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 getSSHAccountProvisioners(self, authzToken):
        """
        Parameters:
         - authzToken
        """
        self.send_getSSHAccountProvisioners(authzToken)
        return self.recv_getSSHAccountProvisioners()

    def send_getSSHAccountProvisioners(self, authzToken):
        self._oprot.writeMessageBegin('getSSHAccountProvisioners', TMessageType.CALL, self._seqid)
        args = getSSHAccountProvisioners_args()
        args.authzToken = authzToken
        args.write(self._oprot)
        self._oprot.writeMessageEnd()
        self._oprot.trans.flush()

    def recv_getSSHAccountProvisioners(self):
        iprot = self._iprot
        (fname, mtype, rseqid) = iprot.readMessageBegin()
        if mtype == TMessageType.EXCEPTION:
            x = TApplicationException()
            x.read(iprot)
            iprot.readMessageEnd()
            raise x
        result = getSSHAccountProvisioners_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, "getSSHAccountProvisioners failed: unknown result")

    def doesUserHaveSSHAccount(self, authzToken, computeResourceId, userId):
        """
        Check if user has an SSH account on the given compute resource. This
        method will only work if the compute resource has an SSHAccountProvisioner configured for it.

        Parameters:
         - authzToken
         - computeResourceId
         - userId
        """
        self.send_doesUserHaveSSHAccount(authzToken, computeResourceId, userId)
        return self.recv_doesUserHaveSSHAccount()

    def send_doesUserHaveSSHAccount(self, authzToken, computeResourceId, userId):
        self._oprot.writeMessageBegin('doesUserHaveSSHAccount', TMessageType.CALL, self._seqid)
        args = doesUserHaveSSHAccount_args()
        args.authzToken = authzToken
        args.computeResourceId = computeResourceId
        args.userId = userId
        args.write(self._oprot)
        self._oprot.writeMessageEnd()
        self._oprot.trans.flush()

    def recv_doesUserHaveSSHAccount(self):
        iprot = self._iprot
        (fname, mtype, rseqid) = iprot.readMessageBegin()
        if mtype == TMessageType.EXCEPTION:
            x = TApplicationException()
            x.read(iprot)
            iprot.readMessageEnd()
            raise x
        result = doesUserHaveSSHAccount_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, "doesUserHaveSSHAccount failed: unknown result")

    def isSSHSetupCompleteForUserComputeResourcePreference(self, authzToken, computeResourceId, airavataCredStoreToken):
        """
        Check if SSH account setup is complete for this user on the given compute resource.

        Parameters:
         - authzToken
         - computeResourceId
         - airavataCredStoreToken
        """
        self.send_isSSHSetupCompleteForUserComputeResourcePreference(authzToken, computeResourceId, airavataCredStoreToken)
        return self.recv_isSSHSetupCompleteForUserComputeResourcePreference()

    def send_isSSHSetupCompleteForUserComputeResourcePreference(self, authzToken, computeResourceId, airavataCredStoreToken):
        self._oprot.writeMessageBegin('isSSHSetupCompleteForUserComputeResourcePreference', TMessageType.CALL, self._seqid)
        args = isSSHSetupCompleteForUserComputeResourcePreference_args()
        args.authzToken = authzToken
        args.computeResourceId = computeResourceId
        args.airavataCredStoreToken = airavataCredStoreToken
        args.write(self._oprot)
        self._oprot.writeMessageEnd()
        self._oprot.trans.flush()

    def recv_isSSHSetupCompleteForUserComputeResourcePreference(self):
        iprot = self._iprot
        (fname, mtype, rseqid) = iprot.readMessageBegin()
        if mtype == TMessageType.EXCEPTION:
            x = TApplicationException()
            x.read(iprot)
            iprot.readMessageEnd()
            raise x
        result = isSSHSetupCompleteForUserComputeResourcePreference_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, "isSSHSetupCompleteForUserComputeResourcePreference failed: unknown result")

    def setupUserComputeResourcePreferencesForSSH(self, authzToken, computeResourceId, userId, airavataCredStoreToken):
        """
        Setup and return a UserComputeResourcePreference object for this user to SSH into the given compute resource with
        the given SSH credential. This method will only work if the compute resource has an SSHAccountProvisioner
        configured for it. The returned UserComputeResourcePreference object is not saved; it is up to the client to
        call addUserComputeResourcePreference to persist it.

        Parameters:
         - authzToken
         - computeResourceId
         - userId
         - airavataCredStoreToken
        """
        self.send_setupUserComputeResourcePreferencesForSSH(authzToken, computeResourceId, userId, airavataCredStoreToken)
        return self.recv_setupUserComputeResourcePreferencesForSSH()

    def send_setupUserComputeResourcePreferencesForSSH(self, authzToken, computeResourceId, userId, airavataCredStoreToken):
        self._oprot.writeMessageBegin('setupUserComputeResourcePreferencesForSSH', TMessageType.CALL, self._seqid)
        args = setupUserComputeResourcePreferencesForSSH_args()
        args.authzToken = authzToken
        args.computeResourceId = computeResourceId
        args.userId = userId
        args.airavataCredStoreToken = airavataCredStoreToken
        args.write(self._oprot)
        self._oprot.writeMessageEnd()
        self._oprot.trans.flush()

    def recv_setupUserComputeResourcePreferencesForSSH(self):
        iprot = self._iprot
        (fname, mtype, rseqid) = iprot.readMessageBegin()
        if mtype == TMessageType.EXCEPTION:
            x = TApplicationException()
            x.read(iprot)
            iprot.readMessageEnd()
            raise x
        result = setupUserComputeResourcePreferencesForSSH_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, "setupUserComputeResourcePreferencesForSSH 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 isUserResourceProfileExists(self, authzToken, userId, gatewayID):
        """
        Check if User Resource Profile exists.

        @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 bool


        Parameters:
         - authzToken
         - userId
         - gatewayID
        """
        self.send_isUserResourceProfileExists(authzToken, userId, gatewayID)
        return self.recv_isUserResourceProfileExists()

    def send_isUserResourceProfileExists(self, authzToken, userId, gatewayID):
        self._oprot.writeMessageBegin('isUserResourceProfileExists', TMessageType.CALL, self._seqid)
        args = isUserResourceProfileExists_args()
        args.authzToken = authzToken
        args.userId = userId
        args.gatewayID = gatewayID
        args.write(self._oprot)
        self._oprot.writeMessageEnd()
        self._oprot.trans.flush()

    def recv_isUserResourceProfileExists(self):
        iprot = self._iprot
        (fname, mtype, rseqid) = iprot.readMessageBegin()
        if mtype == TMessageType.EXCEPTION:
            x = TApplicationException()
            x.read(iprot)
            iprot.readMessageEnd()
            raise x
        result = isUserResourceProfileExists_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, "isUserResourceProfileExists 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 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 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, userPermissionList):
        """
        Group Manager and Data Sharing Related API methods


        Parameters:
         - authzToken
         - resourceId
         - userPermissionList
        """
        self.send_shareResourceWithUsers(authzToken, resourceId, userPermissionList)
        return self.recv_shareResourceWithUsers()

    def send_shareResourceWithUsers(self, authzToken, resourceId, userPermissionList):
        self._oprot.writeMessageBegin('shareResourceWithUsers', TMessageType.CALL, self._seqid)
        args = shareResourceWithUsers_args()
        args.authzToken = authzToken
        args.resourceId = resourceId
        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 shareResourceWithGroups(self, authzToken, resourceId, groupPermissionList):
        """
        Parameters:
         - authzToken
         - resourceId
         - groupPermissionList
        """
        self.send_shareResourceWithGroups(authzToken, resourceId, groupPermissionList)
        return self.recv_shareResourceWithGroups()

    def send_shareResourceWithGroups(self, authzToken, resourceId, groupPermissionList):
        self._oprot.writeMessageBegin('shareResourceWithGroups', TMessageType.CALL, self._seqid)
        args = shareResourceWithGroups_args()
        args.authzToken = authzToken
        args.resourceId = resourceId
        args.groupPermissionList = groupPermissionList
        args.write(self._oprot)
        self._oprot.writeMessageEnd()
        self._oprot.trans.flush()

    def recv_shareResourceWithGroups(self):
        iprot = self._iprot
        (fname, mtype, rseqid) = iprot.readMessageBegin()
        if mtype == TMessageType.EXCEPTION:
            x = TApplicationException()
            x.read(iprot)
            iprot.readMessageEnd()
            raise x
        result = shareResourceWithGroups_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, "shareResourceWithGroups failed: unknown result")

    def revokeSharingOfResourceFromUsers(self, authzToken, resourceId, userPermissionList):
        """
        Parameters:
         - authzToken
         - resourceId
         - userPermissionList
        """
        self.send_revokeSharingOfResourceFromUsers(authzToken, resourceId, userPermissionList)
        return self.recv_revokeSharingOfResourceFromUsers()

    def send_revokeSharingOfResourceFromUsers(self, authzToken, resourceId, userPermissionList):
        self._oprot.writeMessageBegin('revokeSharingOfResourceFromUsers', TMessageType.CALL, self._seqid)
        args = revokeSharingOfResourceFromUsers_args()
        args.authzToken = authzToken
        args.resourceId = resourceId
        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 revokeSharingOfResourceFromGroups(self, authzToken, resourceId, groupPermissionList):
        """
        Parameters:
         - authzToken
         - resourceId
         - groupPermissionList
        """
        self.send_revokeSharingOfResourceFromGroups(authzToken, resourceId, groupPermissionList)
        return self.recv_revokeSharingOfResourceFromGroups()

    def send_revokeSharingOfResourceFromGroups(self, authzToken, resourceId, groupPermissionList):
        self._oprot.writeMessageBegin('revokeSharingOfResourceFromGroups', TMessageType.CALL, self._seqid)
        args = revokeSharingOfResourceFromGroups_args()
        args.authzToken = authzToken
        args.resourceId = resourceId
        args.groupPermissionList = groupPermissionList
        args.write(self._oprot)
        self._oprot.writeMessageEnd()
        self._oprot.trans.flush()

    def recv_revokeSharingOfResourceFromGroups(self):
        iprot = self._iprot
        (fname, mtype, rseqid) = iprot.readMessageBegin()
        if mtype == TMessageType.EXCEPTION:
            x = TApplicationException()
            x.read(iprot)
            iprot.readMessageEnd()
            raise x
        result = revokeSharingOfResourceFromGroups_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, "revokeSharingOfResourceFromGroups failed: unknown result")

    def getAllAccessibleUsers(self, authzToken, resourceId, permissionType):
        """
        Parameters:
         - authzToken
         - resourceId
         - permissionType
        """
        self.send_getAllAccessibleUsers(authzToken, resourceId, permissionType)
        return self.recv_getAllAccessibleUsers()

    def send_getAllAccessibleUsers(self, authzToken, resourceId, permissionType):
        self._oprot.writeMessageBegin('getAllAccessibleUsers', TMessageType.CALL, self._seqid)
        args = getAllAccessibleUsers_args()
        args.authzToken = authzToken
        args.resourceId = resourceId
        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 getAllAccessibleGroups(self, authzToken, resourceId, permissionType):
        """
        Parameters:
         - authzToken
         - resourceId
         - permissionType
        """
        self.send_getAllAccessibleGroups(authzToken, resourceId, permissionType)
        return self.recv_getAllAccessibleGroups()

    def send_getAllAccessibleGroups(self, authzToken, resourceId, permissionType):
        self._oprot.writeMessageBegin('getAllAccessibleGroups', TMessageType.CALL, self._seqid)
        args = getAllAccessibleGroups_args()
        args.authzToken = authzToken
        args.resourceId = resourceId
        args.permissionType = permissionType
        args.write(self._oprot)
        self._oprot.writeMessageEnd()
        self._oprot.trans.flush()

    def recv_getAllAccessibleGroups(self):
        iprot = self._iprot
        (fname, mtype, rseqid) = iprot.readMessageBegin()
        if mtype == TMessageType.EXCEPTION:
            x = TApplicationException()
            x.read(iprot)
            iprot.readMessageEnd()
            raise x
        result = getAllAccessibleGroups_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, "getAllAccessibleGroups failed: unknown result")

    def getAllDirectlyAccessibleUsers(self, authzToken, resourceId, permissionType):
        """
        Parameters:
         - authzToken
         - resourceId
         - permissionType
        """
        self.send_getAllDirectlyAccessibleUsers(authzToken, resourceId, permissionType)
        return self.recv_getAllDirectlyAccessibleUsers()

    def send_getAllDirectlyAccessibleUsers(self, authzToken, resourceId, permissionType):
        self._oprot.writeMessageBegin('getAllDirectlyAccessibleUsers', TMessageType.CALL, self._seqid)
        args = getAllDirectlyAccessibleUsers_args()
        args.authzToken = authzToken
        args.resourceId = resourceId
        args.permissionType = permissionType
        args.write(self._oprot)
        self._oprot.writeMessageEnd()
        self._oprot.trans.flush()

    def recv_getAllDirectlyAccessibleUsers(self):
        iprot = self._iprot
        (fname, mtype, rseqid) = iprot.readMessageBegin()
        if mtype == TMessageType.EXCEPTION:
            x = TApplicationException()
            x.read(iprot)
            iprot.readMessageEnd()
            raise x
        result = getAllDirectlyAccessibleUsers_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, "getAllDirectlyAccessibleUsers failed: unknown result")

    def getAllDirectlyAccessibleGroups(self, authzToken, resourceId, permissionType):
        """
        Parameters:
         - authzToken
         - resourceId
         - permissionType
        """
        self.send_getAllDirectlyAccessibleGroups(authzToken, resourceId, permissionType)
        return self.recv_getAllDirectlyAccessibleGroups()

    def send_getAllDirectlyAccessibleGroups(self, authzToken, resourceId, permissionType):
        self._oprot.writeMessageBegin('getAllDirectlyAccessibleGroups', TMessageType.CALL, self._seqid)
        args = getAllDirectlyAccessibleGroups_args()
        args.authzToken = authzToken
        args.resourceId = resourceId
        args.permissionType = permissionType
        args.write(self._oprot)
        self._oprot.writeMessageEnd()
        self._oprot.trans.flush()

    def recv_getAllDirectlyAccessibleGroups(self):
        iprot = self._iprot
        (fname, mtype, rseqid) = iprot.readMessageBegin()
        if mtype == TMessageType.EXCEPTION:
            x = TApplicationException()
            x.read(iprot)
            iprot.readMessageEnd()
            raise x
        result = getAllDirectlyAccessibleGroups_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, "getAllDirectlyAccessibleGroups failed: unknown result")

    def userHasAccess(self, authzToken, resourceId, permissionType):
        """
        Parameters:
         - authzToken
         - resourceId
         - permissionType
        """
        self.send_userHasAccess(authzToken, resourceId, permissionType)
        return self.recv_userHasAccess()

    def send_userHasAccess(self, authzToken, resourceId, permissionType):
        self._oprot.writeMessageBegin('userHasAccess', TMessageType.CALL, self._seqid)
        args = userHasAccess_args()
        args.authzToken = authzToken
        args.resourceId = resourceId
        args.permissionType = permissionType
        args.write(self._oprot)
        self._oprot.writeMessageEnd()
        self._oprot.trans.flush()

    def recv_userHasAccess(self):
        iprot = self._iprot
        (fname, mtype, rseqid) = iprot.readMessageBegin()
        if mtype == TMessageType.EXCEPTION:
            x = TApplicationException()
            x.read(iprot)
            iprot.readMessageEnd()
            raise x
        result = userHasAccess_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, "userHasAccess failed: unknown result")

    def createGroupResourceProfile(self, authzToken, groupResourceProfile):
        """
        Parameters:
         - authzToken
         - groupResourceProfile
        """
        self.send_createGroupResourceProfile(authzToken, groupResourceProfile)
        return self.recv_createGroupResourceProfile()

    def send_createGroupResourceProfile(self, authzToken, groupResourceProfile):
        self._oprot.writeMessageBegin('createGroupResourceProfile', TMessageType.CALL, self._seqid)
        args = createGroupResourceProfile_args()
        args.authzToken = authzToken
        args.groupResourceProfile = groupResourceProfile
        args.write(self._oprot)
        self._oprot.writeMessageEnd()
        self._oprot.trans.flush()

    def recv_createGroupResourceProfile(self):
        iprot = self._iprot
        (fname, mtype, rseqid) = iprot.readMessageBegin()
        if mtype == TMessageType.EXCEPTION:
            x = TApplicationException()
            x.read(iprot)
            iprot.readMessageEnd()
            raise x
        result = createGroupResourceProfile_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, "createGroupResourceProfile failed: unknown result")

    def updateGroupResourceProfile(self, authzToken, groupResourceProfile):
        """
        Parameters:
         - authzToken
         - groupResourceProfile
        """
        self.send_updateGroupResourceProfile(authzToken, groupResourceProfile)
        self.recv_updateGroupResourceProfile()

    def send_updateGroupResourceProfile(self, authzToken, groupResourceProfile):
        self._oprot.writeMessageBegin('updateGroupResourceProfile', TMessageType.CALL, self._seqid)
        args = updateGroupResourceProfile_args()
        args.authzToken = authzToken
        args.groupResourceProfile = groupResourceProfile
        args.write(self._oprot)
        self._oprot.writeMessageEnd()
        self._oprot.trans.flush()

    def recv_updateGroupResourceProfile(self):
        iprot = self._iprot
        (fname, mtype, rseqid) = iprot.readMessageBegin()
        if mtype == TMessageType.EXCEPTION:
            x = TApplicationException()
            x.read(iprot)
            iprot.readMessageEnd()
            raise x
        result = updateGroupResourceProfile_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 getGroupResourceProfile(self, authzToken, groupResourceProfileId):
        """
        Parameters:
         - authzToken
         - groupResourceProfileId
        """
        self.send_getGroupResourceProfile(authzToken, groupResourceProfileId)
        return self.recv_getGroupResourceProfile()

    def send_getGroupResourceProfile(self, authzToken, groupResourceProfileId):
        self._oprot.writeMessageBegin('getGroupResourceProfile', TMessageType.CALL, self._seqid)
        args = getGroupResourceProfile_args()
        args.authzToken = authzToken
        args.groupResourceProfileId = groupResourceProfileId
        args.write(self._oprot)
        self._oprot.writeMessageEnd()
        self._oprot.trans.flush()

    def recv_getGroupResourceProfile(self):
        iprot = self._iprot
        (fname, mtype, rseqid) = iprot.readMessageBegin()
        if mtype == TMessageType.EXCEPTION:
            x = TApplicationException()
            x.read(iprot)
            iprot.readMessageEnd()
            raise x
        result = getGroupResourceProfile_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, "getGroupResourceProfile failed: unknown result")

    def removeGroupResourceProfile(self, authzToken, groupResourceProfileId):
        """
        Parameters:
         - authzToken
         - groupResourceProfileId
        """
        self.send_removeGroupResourceProfile(authzToken, groupResourceProfileId)
        return self.recv_removeGroupResourceProfile()

    def send_removeGroupResourceProfile(self, authzToken, groupResourceProfileId):
        self._oprot.writeMessageBegin('removeGroupResourceProfile', TMessageType.CALL, self._seqid)
        args = removeGroupResourceProfile_args()
        args.authzToken = authzToken
        args.groupResourceProfileId = groupResourceProfileId
        args.write(self._oprot)
        self._oprot.writeMessageEnd()
        self._oprot.trans.flush()

    def recv_removeGroupResourceProfile(self):
        iprot = self._iprot
        (fname, mtype, rseqid) = iprot.readMessageBegin()
        if mtype == TMessageType.EXCEPTION:
            x = TApplicationException()
            x.read(iprot)
            iprot.readMessageEnd()
            raise x
        result = removeGroupResourceProfile_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, "removeGroupResourceProfile failed: unknown result")

    def getGroupResourceList(self, authzToken, gatewayId):
        """
        Parameters:
         - authzToken
         - gatewayId
        """
        self.send_getGroupResourceList(authzToken, gatewayId)
        return self.recv_getGroupResourceList()

    def send_getGroupResourceList(self, authzToken, gatewayId):
        self._oprot.writeMessageBegin('getGroupResourceList', TMessageType.CALL, self._seqid)
        args = getGroupResourceList_args()
        args.authzToken = authzToken
        args.gatewayId = gatewayId
        args.write(self._oprot)
        self._oprot.writeMessageEnd()
        self._oprot.trans.flush()

    def recv_getGroupResourceList(self):
        iprot = self._iprot
        (fname, mtype, rseqid) = iprot.readMessageBegin()
        if mtype == TMessageType.EXCEPTION:
            x = TApplicationException()
            x.read(iprot)
            iprot.readMessageEnd()
            raise x
        result = getGroupResourceList_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, "getGroupResourceList failed: unknown result")

    def removeGroupComputePrefs(self, authzToken, computeResourceId, groupResourceProfileId):
        """
        Parameters:
         - authzToken
         - computeResourceId
         - groupResourceProfileId
        """
        self.send_removeGroupComputePrefs(authzToken, computeResourceId, groupResourceProfileId)
        return self.recv_removeGroupComputePrefs()

    def send_removeGroupComputePrefs(self, authzToken, computeResourceId, groupResourceProfileId):
        self._oprot.writeMessageBegin('removeGroupComputePrefs', TMessageType.CALL, self._seqid)
        args = removeGroupComputePrefs_args()
        args.authzToken = authzToken
        args.computeResourceId = computeResourceId
        args.groupResourceProfileId = groupResourceProfileId
        args.write(self._oprot)
        self._oprot.writeMessageEnd()
        self._oprot.trans.flush()

    def recv_removeGroupComputePrefs(self):
        iprot = self._iprot
        (fname, mtype, rseqid) = iprot.readMessageBegin()
        if mtype == TMessageType.EXCEPTION:
            x = TApplicationException()
            x.read(iprot)
            iprot.readMessageEnd()
            raise x
        result = removeGroupComputePrefs_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, "removeGroupComputePrefs failed: unknown result")

    def removeGroupComputeResourcePolicy(self, authzToken, resourcePolicyId):
        """
        Parameters:
         - authzToken
         - resourcePolicyId
        """
        self.send_removeGroupComputeResourcePolicy(authzToken, resourcePolicyId)
        return self.recv_removeGroupComputeResourcePolicy()

    def send_removeGroupComputeResourcePolicy(self, authzToken, resourcePolicyId):
        self._oprot.writeMessageBegin('removeGroupComputeResourcePolicy', TMessageType.CALL, self._seqid)
        args = removeGroupComputeResourcePolicy_args()
        args.authzToken = authzToken
        args.resourcePolicyId = resourcePolicyId
        args.write(self._oprot)
        self._oprot.writeMessageEnd()
        self._oprot.trans.flush()

    def recv_removeGroupComputeResourcePolicy(self):
        iprot = self._iprot
        (fname, mtype, rseqid) = iprot.readMessageBegin()
        if mtype == TMessageType.EXCEPTION:
            x = TApplicationException()
            x.read(iprot)
            iprot.readMessageEnd()
            raise x
        result = removeGroupComputeResourcePolicy_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, "removeGroupComputeResourcePolicy failed: unknown result")

    def removeGroupBatchQueueResourcePolicy(self, authzToken, resourcePolicyId):
        """
        Parameters:
         - authzToken
         - resourcePolicyId
        """
        self.send_removeGroupBatchQueueResourcePolicy(authzToken, resourcePolicyId)
        return self.recv_removeGroupBatchQueueResourcePolicy()

    def send_removeGroupBatchQueueResourcePolicy(self, authzToken, resourcePolicyId):
        self._oprot.writeMessageBegin('removeGroupBatchQueueResourcePolicy', TMessageType.CALL, self._seqid)
        args = removeGroupBatchQueueResourcePolicy_args()
        args.authzToken = authzToken
        args.resourcePolicyId = resourcePolicyId
        args.write(self._oprot)
        self._oprot.writeMessageEnd()
        self._oprot.trans.flush()

    def recv_removeGroupBatchQueueResourcePolicy(self):
        iprot = self._iprot
        (fname, mtype, rseqid) = iprot.readMessageBegin()
        if mtype == TMessageType.EXCEPTION:
            x = TApplicationException()
            x.read(iprot)
            iprot.readMessageEnd()
            raise x
        result = removeGroupBatchQueueResourcePolicy_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, "removeGroupBatchQueueResourcePolicy failed: unknown result")

    def getGroupComputeResourcePreference(self, authzToken, computeResourceId, groupResourceProfileId):
        """
        Parameters:
         - authzToken
         - computeResourceId
         - groupResourceProfileId
        """
        self.send_getGroupComputeResourcePreference(authzToken, computeResourceId, groupResourceProfileId)
        return self.recv_getGroupComputeResourcePreference()

    def send_getGroupComputeResourcePreference(self, authzToken, computeResourceId, groupResourceProfileId):
        self._oprot.writeMessageBegin('getGroupComputeResourcePreference', TMessageType.CALL, self._seqid)
        args = getGroupComputeResourcePreference_args()
        args.authzToken = authzToken
        args.computeResourceId = computeResourceId
        args.groupResourceProfileId = groupResourceProfileId
        args.write(self._oprot)
        self._oprot.writeMessageEnd()
        self._oprot.trans.flush()

    def recv_getGroupComputeResourcePreference(self):
        iprot = self._iprot
        (fname, mtype, rseqid) = iprot.readMessageBegin()
        if mtype == TMessageType.EXCEPTION:
            x = TApplicationException()
            x.read(iprot)
            iprot.readMessageEnd()
            raise x
        result = getGroupComputeResourcePreference_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, "getGroupComputeResourcePreference failed: unknown result")

    def getGroupComputeResourcePolicy(self, authzToken, resourcePolicyId):
        """
        Parameters:
         - authzToken
         - resourcePolicyId
        """
        self.send_getGroupComputeResourcePolicy(authzToken, resourcePolicyId)
        return self.recv_getGroupComputeResourcePolicy()

    def send_getGroupComputeResourcePolicy(self, authzToken, resourcePolicyId):
        self._oprot.writeMessageBegin('getGroupComputeResourcePolicy', TMessageType.CALL, self._seqid)
        args = getGroupComputeResourcePolicy_args()
        args.authzToken = authzToken
        args.resourcePolicyId = resourcePolicyId
        args.write(self._oprot)
        self._oprot.writeMessageEnd()
        self._oprot.trans.flush()

    def recv_getGroupComputeResourcePolicy(self):
        iprot = self._iprot
        (fname, mtype, rseqid) = iprot.readMessageBegin()
        if mtype == TMessageType.EXCEPTION:
            x = TApplicationException()
            x.read(iprot)
            iprot.readMessageEnd()
            raise x
        result = getGroupComputeResourcePolicy_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, "getGroupComputeResourcePolicy failed: unknown result")

    def getBatchQueueResourcePolicy(self, authzToken, resourcePolicyId):
        """
        Parameters:
         - authzToken
         - resourcePolicyId
        """
        self.send_getBatchQueueResourcePolicy(authzToken, resourcePolicyId)
        return self.recv_getBatchQueueResourcePolicy()

    def send_getBatchQueueResourcePolicy(self, authzToken, resourcePolicyId):
        self._oprot.writeMessageBegin('getBatchQueueResourcePolicy', TMessageType.CALL, self._seqid)
        args = getBatchQueueResourcePolicy_args()
        args.authzToken = authzToken
        args.resourcePolicyId = resourcePolicyId
        args.write(self._oprot)
        self._oprot.writeMessageEnd()
        self._oprot.trans.flush()

    def recv_getBatchQueueResourcePolicy(self):
        iprot = self._iprot
        (fname, mtype, rseqid) = iprot.readMessageBegin()
        if mtype == TMessageType.EXCEPTION:
            x = TApplicationException()
            x.read(iprot)
            iprot.readMessageEnd()
            raise x
        result = getBatchQueueResourcePolicy_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, "getBatchQueueResourcePolicy failed: unknown result")

    def getGroupComputeResourcePrefList(self, authzToken, groupResourceProfileId):
        """
        Parameters:
         - authzToken
         - groupResourceProfileId
        """
        self.send_getGroupComputeResourcePrefList(authzToken, groupResourceProfileId)
        return self.recv_getGroupComputeResourcePrefList()

    def send_getGroupComputeResourcePrefList(self, authzToken, groupResourceProfileId):
        self._oprot.writeMessageBegin('getGroupComputeResourcePrefList', TMessageType.CALL, self._seqid)
        args = getGroupComputeResourcePrefList_args()
        args.authzToken = authzToken
        args.groupResourceProfileId = groupResourceProfileId
        args.write(self._oprot)
        self._oprot.writeMessageEnd()
        self._oprot.trans.flush()

    def recv_getGroupComputeResourcePrefList(self):
        iprot = self._iprot
        (fname, mtype, rseqid) = iprot.readMessageBegin()
        if mtype == TMessageType.EXCEPTION:
            x = TApplicationException()
            x.read(iprot)
            iprot.readMessageEnd()
            raise x
        result = getGroupComputeResourcePrefList_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, "getGroupComputeResourcePrefList failed: unknown result")

    def getGroupBatchQueueResourcePolicyList(self, authzToken, groupResourceProfileId):
        """
        Parameters:
         - authzToken
         - groupResourceProfileId
        """
        self.send_getGroupBatchQueueResourcePolicyList(authzToken, groupResourceProfileId)
        return self.recv_getGroupBatchQueueResourcePolicyList()

    def send_getGroupBatchQueueResourcePolicyList(self, authzToken, groupResourceProfileId):
        self._oprot.writeMessageBegin('getGroupBatchQueueResourcePolicyList', TMessageType.CALL, self._seqid)
        args = getGroupBatchQueueResourcePolicyList_args()
        args.authzToken = authzToken
        args.groupResourceProfileId = groupResourceProfileId
        args.write(self._oprot)
        self._oprot.writeMessageEnd()
        self._oprot.trans.flush()

    def recv_getGroupBatchQueueResourcePolicyList(self):
        iprot = self._iprot
        (fname, mtype, rseqid) = iprot.readMessageBegin()
        if mtype == TMessageType.EXCEPTION:
            x = TApplicationException()
            x.read(iprot)
            iprot.readMessageEnd()
            raise x
        result = getGroupBatchQueueResourcePolicyList_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, "getGroupBatchQueueResourcePolicyList failed: unknown result")

    def getGroupComputeResourcePolicyList(self, authzToken, groupResourceProfileId):
        """
        Parameters:
         - authzToken
         - groupResourceProfileId
        """
        self.send_getGroupComputeResourcePolicyList(authzToken, groupResourceProfileId)
        return self.recv_getGroupComputeResourcePolicyList()

    def send_getGroupComputeResourcePolicyList(self, authzToken, groupResourceProfileId):
        self._oprot.writeMessageBegin('getGroupComputeResourcePolicyList', TMessageType.CALL, self._seqid)
        args = getGroupComputeResourcePolicyList_args()
        args.authzToken = authzToken
        args.groupResourceProfileId = groupResourceProfileId
        args.write(self._oprot)
        self._oprot.writeMessageEnd()
        self._oprot.trans.flush()

    def recv_getGroupComputeResourcePolicyList(self):
        iprot = self._iprot
        (fname, mtype, rseqid) = iprot.readMessageBegin()
        if mtype == TMessageType.EXCEPTION:
            x = TApplicationException()
            x.read(iprot)
            iprot.readMessageEnd()
            raise x
        result = getGroupComputeResourcePolicyList_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, "getGroupComputeResourcePolicyList failed: unknown result")

    def getGatewayGroups(self, authzToken):
        """
        GatewayGroups API methods

        Parameters:
         - authzToken
        """
        self.send_getGatewayGroups(authzToken)
        return self.recv_getGatewayGroups()

    def send_getGatewayGroups(self, authzToken):
        self._oprot.writeMessageBegin('getGatewayGroups', TMessageType.CALL, self._seqid)
        args = getGatewayGroups_args()
        args.authzToken = authzToken
        args.write(self._oprot)
        self._oprot.writeMessageEnd()
        self._oprot.trans.flush()

    def recv_getGatewayGroups(self):
        iprot = self._iprot
        (fname, mtype, rseqid) = iprot.readMessageBegin()
        if mtype == TMessageType.EXCEPTION:
            x = TApplicationException()
            x.read(iprot)
            iprot.readMessageEnd()
            raise x
        result = getGatewayGroups_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, "getGatewayGroups failed: unknown result")

    def getParser(self, authzToken, parserId, gatewayId):
        """
        Parameters:
         - authzToken
         - parserId
         - gatewayId
        """
        self.send_getParser(authzToken, parserId, gatewayId)
        return self.recv_getParser()

    def send_getParser(self, authzToken, parserId, gatewayId):
        self._oprot.writeMessageBegin('getParser', TMessageType.CALL, self._seqid)
        args = getParser_args()
        args.authzToken = authzToken
        args.parserId = parserId
        args.gatewayId = gatewayId
        args.write(self._oprot)
        self._oprot.writeMessageEnd()
        self._oprot.trans.flush()

    def recv_getParser(self):
        iprot = self._iprot
        (fname, mtype, rseqid) = iprot.readMessageBegin()
        if mtype == TMessageType.EXCEPTION:
            x = TApplicationException()
            x.read(iprot)
            iprot.readMessageEnd()
            raise x
        result = getParser_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, "getParser failed: unknown result")

    def saveParser(self, authzToken, parser):
        """
        Parameters:
         - authzToken
         - parser
        """
        self.send_saveParser(authzToken, parser)
        return self.recv_saveParser()

    def send_saveParser(self, authzToken, parser):
        self._oprot.writeMessageBegin('saveParser', TMessageType.CALL, self._seqid)
        args = saveParser_args()
        args.authzToken = authzToken
        args.parser = parser
        args.write(self._oprot)
        self._oprot.writeMessageEnd()
        self._oprot.trans.flush()

    def recv_saveParser(self):
        iprot = self._iprot
        (fname, mtype, rseqid) = iprot.readMessageBegin()
        if mtype == TMessageType.EXCEPTION:
            x = TApplicationException()
            x.read(iprot)
            iprot.readMessageEnd()
            raise x
        result = saveParser_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, "saveParser failed: unknown result")

    def listAllParsers(self, authzToken, gatewayId):
        """
        Parameters:
         - authzToken
         - gatewayId
        """
        self.send_listAllParsers(authzToken, gatewayId)
        return self.recv_listAllParsers()

    def send_listAllParsers(self, authzToken, gatewayId):
        self._oprot.writeMessageBegin('listAllParsers', TMessageType.CALL, self._seqid)
        args = listAllParsers_args()
        args.authzToken = authzToken
        args.gatewayId = gatewayId
        args.write(self._oprot)
        self._oprot.writeMessageEnd()
        self._oprot.trans.flush()

    def recv_listAllParsers(self):
        iprot = self._iprot
        (fname, mtype, rseqid) = iprot.readMessageBegin()
        if mtype == TMessageType.EXCEPTION:
            x = TApplicationException()
            x.read(iprot)
            iprot.readMessageEnd()
            raise x
        result = listAllParsers_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, "listAllParsers failed: unknown result")

    def removeParser(self, authzToken, parserId, gatewayId):
        """
        Parameters:
         - authzToken
         - parserId
         - gatewayId
        """
        self.send_removeParser(authzToken, parserId, gatewayId)
        return self.recv_removeParser()

    def send_removeParser(self, authzToken, parserId, gatewayId):
        self._oprot.writeMessageBegin('removeParser', TMessageType.CALL, self._seqid)
        args = removeParser_args()
        args.authzToken = authzToken
        args.parserId = parserId
        args.gatewayId = gatewayId
        args.write(self._oprot)
        self._oprot.writeMessageEnd()
        self._oprot.trans.flush()

    def recv_removeParser(self):
        iprot = self._iprot
        (fname, mtype, rseqid) = iprot.readMessageBegin()
        if mtype == TMessageType.EXCEPTION:
            x = TApplicationException()
            x.read(iprot)
            iprot.readMessageEnd()
            raise x
        result = removeParser_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, "removeParser failed: unknown result")

    def getParsingTemplate(self, authzToken, templateId, gatewayId):
        """
        Parameters:
         - authzToken
         - templateId
         - gatewayId
        """
        self.send_getParsingTemplate(authzToken, templateId, gatewayId)
        return self.recv_getParsingTemplate()

    def send_getParsingTemplate(self, authzToken, templateId, gatewayId):
        self._oprot.writeMessageBegin('getParsingTemplate', TMessageType.CALL, self._seqid)
        args = getParsingTemplate_args()
        args.authzToken = authzToken
        args.templateId = templateId
        args.gatewayId = gatewayId
        args.write(self._oprot)
        self._oprot.writeMessageEnd()
        self._oprot.trans.flush()

    def recv_getParsingTemplate(self):
        iprot = self._iprot
        (fname, mtype, rseqid) = iprot.readMessageBegin()
        if mtype == TMessageType.EXCEPTION:
            x = TApplicationException()
            x.read(iprot)
            iprot.readMessageEnd()
            raise x
        result = getParsingTemplate_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, "getParsingTemplate failed: unknown result")

    def getParsingTemplatesForExperiment(self, authzToken, experimentId, gatewayId):
        """
        Parameters:
         - authzToken
         - experimentId
         - gatewayId
        """
        self.send_getParsingTemplatesForExperiment(authzToken, experimentId, gatewayId)
        return self.recv_getParsingTemplatesForExperiment()

    def send_getParsingTemplatesForExperiment(self, authzToken, experimentId, gatewayId):
        self._oprot.writeMessageBegin('getParsingTemplatesForExperiment', TMessageType.CALL, self._seqid)
        args = getParsingTemplatesForExperiment_args()
        args.authzToken = authzToken
        args.experimentId = experimentId
        args.gatewayId = gatewayId
        args.write(self._oprot)
        self._oprot.writeMessageEnd()
        self._oprot.trans.flush()

    def recv_getParsingTemplatesForExperiment(self):
        iprot = self._iprot
        (fname, mtype, rseqid) = iprot.readMessageBegin()
        if mtype == TMessageType.EXCEPTION:
            x = TApplicationException()
            x.read(iprot)
            iprot.readMessageEnd()
            raise x
        result = getParsingTemplatesForExperiment_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, "getParsingTemplatesForExperiment failed: unknown result")

    def saveParsingTemplate(self, authzToken, parsingTemplate):
        """
        Parameters:
         - authzToken
         - parsingTemplate
        """
        self.send_saveParsingTemplate(authzToken, parsingTemplate)
        return self.recv_saveParsingTemplate()

    def send_saveParsingTemplate(self, authzToken, parsingTemplate):
        self._oprot.writeMessageBegin('saveParsingTemplate', TMessageType.CALL, self._seqid)
        args = saveParsingTemplate_args()
        args.authzToken = authzToken
        args.parsingTemplate = parsingTemplate
        args.write(self._oprot)
        self._oprot.writeMessageEnd()
        self._oprot.trans.flush()

    def recv_saveParsingTemplate(self):
        iprot = self._iprot
        (fname, mtype, rseqid) = iprot.readMessageBegin()
        if mtype == TMessageType.EXCEPTION:
            x = TApplicationException()
            x.read(iprot)
            iprot.readMessageEnd()
            raise x
        result = saveParsingTemplate_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, "saveParsingTemplate failed: unknown result")

    def removeParsingTemplate(self, authzToken, templateId, gatewayId):
        """
        Parameters:
         - authzToken
         - templateId
         - gatewayId
        """
        self.send_removeParsingTemplate(authzToken, templateId, gatewayId)
        return self.recv_removeParsingTemplate()

    def send_removeParsingTemplate(self, authzToken, templateId, gatewayId):
        self._oprot.writeMessageBegin('removeParsingTemplate', TMessageType.CALL, self._seqid)
        args = removeParsingTemplate_args()
        args.authzToken = authzToken
        args.templateId = templateId
        args.gatewayId = gatewayId
        args.write(self._oprot)
        self._oprot.writeMessageEnd()
        self._oprot.trans.flush()

    def recv_removeParsingTemplate(self):
        iprot = self._iprot
        (fname, mtype, rseqid) = iprot.readMessageBegin()
        if mtype == TMessageType.EXCEPTION:
            x = TApplicationException()
            x.read(iprot)
            iprot.readMessageEnd()
            raise x
        result = removeParsingTemplate_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, "removeParsingTemplate failed: unknown result")

    def listAllParsingTemplates(self, authzToken, gatewayId):
        """
        Parameters:
         - authzToken
         - gatewayId
        """
        self.send_listAllParsingTemplates(authzToken, gatewayId)
        return self.recv_listAllParsingTemplates()

    def send_listAllParsingTemplates(self, authzToken, gatewayId):
        self._oprot.writeMessageBegin('listAllParsingTemplates', TMessageType.CALL, self._seqid)
        args = listAllParsingTemplates_args()
        args.authzToken = authzToken
        args.gatewayId = gatewayId
        args.write(self._oprot)
        self._oprot.writeMessageEnd()
        self._oprot.trans.flush()

    def recv_listAllParsingTemplates(self):
        iprot = self._iprot
        (fname, mtype, rseqid) = iprot.readMessageBegin()
        if mtype == TMessageType.EXCEPTION:
            x = TApplicationException()
            x.read(iprot)
            iprot.readMessageEnd()
            raise x
        result = listAllParsingTemplates_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, "listAllParsingTemplates failed: unknown result")


class Processor(airavata.base.api.BaseAPI.Processor, Iface, TProcessor):
    def __init__(self, handler):
        airavata.base.api.BaseAPI.Processor.__init__(self, handler)
        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["getCredentialSummary"] = Processor.process_getCredentialSummary
        self._processMap["getAllCredentialSummaries"] = Processor.process_getAllCredentialSummaries
        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["fetchIntermediateOutputs"] = Processor.process_fetchIntermediateOutputs
        self._processMap["getIntermediateOutputProcessStatus"] = Processor.process_getIntermediateOutputProcessStatus
        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["getAccessibleAppModules"] = Processor.process_getAccessibleAppModules
        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["getAccessibleApplicationDeployments"] = Processor.process_getAccessibleApplicationDeployments
        self._processMap["getAppModuleDeployedResources"] = Processor.process_getAppModuleDeployedResources
        self._processMap["getApplicationDeploymentsForAppModuleAndGroupResourceProfile"] = Processor.process_getApplicationDeploymentsForAppModuleAndGroupResourceProfile
        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["getSSHAccountProvisioners"] = Processor.process_getSSHAccountProvisioners
        self._processMap["doesUserHaveSSHAccount"] = Processor.process_doesUserHaveSSHAccount
        self._processMap["isSSHSetupCompleteForUserComputeResourcePreference"] = Processor.process_isSSHSetupCompleteForUserComputeResourcePreference
        self._processMap["setupUserComputeResourcePreferencesForSSH"] = Processor.process_setupUserComputeResourcePreferencesForSSH
        self._processMap["registerUserResourceProfile"] = Processor.process_registerUserResourceProfile
        self._processMap["isUserResourceProfileExists"] = Processor.process_isUserResourceProfileExists
        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["getLatestQueueStatuses"] = Processor.process_getLatestQueueStatuses
        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["shareResourceWithGroups"] = Processor.process_shareResourceWithGroups
        self._processMap["revokeSharingOfResourceFromUsers"] = Processor.process_revokeSharingOfResourceFromUsers
        self._processMap["revokeSharingOfResourceFromGroups"] = Processor.process_revokeSharingOfResourceFromGroups
        self._processMap["getAllAccessibleUsers"] = Processor.process_getAllAccessibleUsers
        self._processMap["getAllAccessibleGroups"] = Processor.process_getAllAccessibleGroups
        self._processMap["getAllDirectlyAccessibleUsers"] = Processor.process_getAllDirectlyAccessibleUsers
        self._processMap["getAllDirectlyAccessibleGroups"] = Processor.process_getAllDirectlyAccessibleGroups
        self._processMap["userHasAccess"] = Processor.process_userHasAccess
        self._processMap["createGroupResourceProfile"] = Processor.process_createGroupResourceProfile
        self._processMap["updateGroupResourceProfile"] = Processor.process_updateGroupResourceProfile
        self._processMap["getGroupResourceProfile"] = Processor.process_getGroupResourceProfile
        self._processMap["removeGroupResourceProfile"] = Processor.process_removeGroupResourceProfile
        self._processMap["getGroupResourceList"] = Processor.process_getGroupResourceList
        self._processMap["removeGroupComputePrefs"] = Processor.process_removeGroupComputePrefs
        self._processMap["removeGroupComputeResourcePolicy"] = Processor.process_removeGroupComputeResourcePolicy
        self._processMap["removeGroupBatchQueueResourcePolicy"] = Processor.process_removeGroupBatchQueueResourcePolicy
        self._processMap["getGroupComputeResourcePreference"] = Processor.process_getGroupComputeResourcePreference
        self._processMap["getGroupComputeResourcePolicy"] = Processor.process_getGroupComputeResourcePolicy
        self._processMap["getBatchQueueResourcePolicy"] = Processor.process_getBatchQueueResourcePolicy
        self._processMap["getGroupComputeResourcePrefList"] = Processor.process_getGroupComputeResourcePrefList
        self._processMap["getGroupBatchQueueResourcePolicyList"] = Processor.process_getGroupBatchQueueResourcePolicyList
        self._processMap["getGroupComputeResourcePolicyList"] = Processor.process_getGroupComputeResourcePolicyList
        self._processMap["getGatewayGroups"] = Processor.process_getGatewayGroups
        self._processMap["getParser"] = Processor.process_getParser
        self._processMap["saveParser"] = Processor.process_saveParser
        self._processMap["listAllParsers"] = Processor.process_listAllParsers
        self._processMap["removeParser"] = Processor.process_removeParser
        self._processMap["getParsingTemplate"] = Processor.process_getParsingTemplate
        self._processMap["getParsingTemplatesForExperiment"] = Processor.process_getParsingTemplatesForExperiment
        self._processMap["saveParsingTemplate"] = Processor.process_saveParsingTemplate
        self._processMap["removeParsingTemplate"] = Processor.process_removeParsingTemplate
        self._processMap["listAllParsingTemplates"] = Processor.process_listAllParsingTemplates

    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_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 airavata.api.error.ttypes.InvalidRequestException as ire:
            msg_type = TMessageType.REPLY
            result.ire = ire
        except airavata.api.error.ttypes.AiravataClientException as ace:
            msg_type = TMessageType.REPLY
            result.ace = ace
        except airavata.api.error.ttypes.AiravataSystemException as ase:
            msg_type = TMessageType.REPLY
            result.ase = ase
        except 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 airavata.api.error.ttypes.InvalidRequestException as ire:
            msg_type = TMessageType.REPLY
            result.ire = ire
        except airavata.api.error.ttypes.AiravataClientException as ace:
            msg_type = TMessageType.REPLY
            result.ace = ace
        except airavata.api.error.ttypes.AiravataSystemException as ase:
            msg_type = TMessageType.REPLY
            result.ase = ase
        except 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 airavata.api.error.ttypes.InvalidRequestException as ire:
            msg_type = TMessageType.REPLY
            result.ire = ire
        except airavata.api.error.ttypes.AiravataClientException as ace:
            msg_type = TMessageType.REPLY
            result.ace = ace
        except airavata.api.error.ttypes.AiravataSystemException as ase:
            msg_type = TMessageType.REPLY
            result.ase = ase
        except 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 airavata.api.error.ttypes.InvalidRequestException as ire:
            msg_type = TMessageType.REPLY
            result.ire = ire
        except airavata.api.error.ttypes.AiravataClientException as ace:
            msg_type = TMessageType.REPLY
            result.ace = ace
        except airavata.api.error.ttypes.AiravataSystemException as ase:
            msg_type = TMessageType.REPLY
            result.ase = ase
        except 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 airavata.api.error.ttypes.InvalidRequestException as ire:
            msg_type = TMessageType.REPLY
            result.ire = ire
        except airavata.api.error.ttypes.AiravataClientException as ace:
            msg_type = TMessageType.REPLY
            result.ace = ace
        except airavata.api.error.ttypes.AiravataSystemException as ase:
            msg_type = TMessageType.REPLY
            result.ase = ase
        except 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 airavata.api.error.ttypes.InvalidRequestException as ire:
            msg_type = TMessageType.REPLY
            result.ire = ire
        except airavata.api.error.ttypes.AiravataClientException as ace:
            msg_type = TMessageType.REPLY
            result.ace = ace
        except airavata.api.error.ttypes.AiravataSystemException as ase:
            msg_type = TMessageType.REPLY
            result.ase = ase
        except 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 airavata.api.error.ttypes.InvalidRequestException as ire:
            msg_type = TMessageType.REPLY
            result.ire = ire
        except airavata.api.error.ttypes.AiravataClientException as ace:
            msg_type = TMessageType.REPLY
            result.ace = ace
        except airavata.api.error.ttypes.AiravataSystemException as ase:
            msg_type = TMessageType.REPLY
            result.ase = ase
        except 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 airavata.api.error.ttypes.InvalidRequestException as ire:
            msg_type = TMessageType.REPLY
            result.ire = ire
        except airavata.api.error.ttypes.AiravataClientException as ace:
            msg_type = TMessageType.REPLY
            result.ace = ace
        except airavata.api.error.ttypes.AiravataSystemException as ase:
            msg_type = TMessageType.REPLY
            result.ase = ase
        except 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 airavata.api.error.ttypes.InvalidRequestException as ire:
            msg_type = TMessageType.REPLY
            result.ire = ire
        except airavata.api.error.ttypes.AiravataClientException as ace:
            msg_type = TMessageType.REPLY
            result.ace = ace
        except airavata.api.error.ttypes.AiravataSystemException as ase:
            msg_type = TMessageType.REPLY
            result.ase = ase
        except 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 airavata.api.error.ttypes.InvalidRequestException as ire:
            msg_type = TMessageType.REPLY
            result.ire = ire
        except airavata.api.error.ttypes.AiravataClientException as ace:
            msg_type = TMessageType.REPLY
            result.ace = ace
        except airavata.api.error.ttypes.AiravataSystemException as ase:
            msg_type = TMessageType.REPLY
            result.ase = ase
        except 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 airavata.api.error.ttypes.InvalidRequestException as ire:
            msg_type = TMessageType.REPLY
            result.ire = ire
        except airavata.api.error.ttypes.AiravataClientException as ace:
            msg_type = TMessageType.REPLY
            result.ace = ace
        except airavata.api.error.ttypes.AiravataSystemException as ase:
            msg_type = TMessageType.REPLY
            result.ase = ase
        except 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 airavata.api.error.ttypes.InvalidRequestException as ire:
            msg_type = TMessageType.REPLY
            result.ire = ire
        except airavata.api.error.ttypes.AiravataClientException as ace:
            msg_type = TMessageType.REPLY
            result.ace = ace
        except airavata.api.error.ttypes.AiravataSystemException as ase:
            msg_type = TMessageType.REPLY
            result.ase = ase
        except 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 airavata.api.error.ttypes.InvalidRequestException as ire:
            msg_type = TMessageType.REPLY
            result.ire = ire
        except airavata.api.error.ttypes.AiravataClientException as ace:
            msg_type = TMessageType.REPLY
            result.ace = ace
        except airavata.api.error.ttypes.AiravataSystemException as ase:
            msg_type = TMessageType.REPLY
            result.ase = ase
        except 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.description)
            msg_type = TMessageType.REPLY
        except (TTransport.TTransportException, KeyboardInterrupt, SystemExit):
            raise
        except airavata.api.error.ttypes.InvalidRequestException as ire:
            msg_type = TMessageType.REPLY
            result.ire = ire
        except airavata.api.error.ttypes.AiravataClientException as ace:
            msg_type = TMessageType.REPLY
            result.ace = ace
        except 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.loginUserName, args.password, args.description)
            msg_type = TMessageType.REPLY
        except (TTransport.TTransportException, KeyboardInterrupt, SystemExit):
            raise
        except airavata.api.error.ttypes.InvalidRequestException as ire:
            msg_type = TMessageType.REPLY
            result.ire = ire
        except airavata.api.error.ttypes.AiravataClientException as ace:
            msg_type = TMessageType.REPLY
            result.ace = ace
        except 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_getCredentialSummary(self, seqid, iprot, oprot):
        args = getCredentialSummary_args()
        args.read(iprot)
        iprot.readMessageEnd()
        result = getCredentialSummary_result()
        try:
            result.success = self._handler.getCredentialSummary(args.authzToken, args.tokenId)
            msg_type = TMessageType.REPLY
        except (TTransport.TTransportException, KeyboardInterrupt, SystemExit):
            raise
        except airavata.api.error.ttypes.InvalidRequestException as ire:
            msg_type = TMessageType.REPLY
            result.ire = ire
        except airavata.api.error.ttypes.AiravataClientException as ace:
            msg_type = TMessageType.REPLY
            result.ace = ace
        except airavata.api.error.ttypes.AiravataSystemException as ase:
            msg_type = TMessageType.REPLY
            result.ase = ase
        except 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("getCredentialSummary", msg_type, seqid)
        result.write(oprot)
        oprot.writeMessageEnd()
        oprot.trans.flush()

    def process_getAllCredentialSummaries(self, seqid, iprot, oprot):
        args = getAllCredentialSummaries_args()
        args.read(iprot)
        iprot.readMessageEnd()
        result = getAllCredentialSummaries_result()
        try:
            result.success = self._handler.getAllCredentialSummaries(args.authzToken, args.type)
            msg_type = TMessageType.REPLY
        except (TTransport.TTransportException, KeyboardInterrupt, SystemExit):
            raise
        except airavata.api.error.ttypes.InvalidRequestException as ire:
            msg_type = TMessageType.REPLY
            result.ire = ire
        except airavata.api.error.ttypes.AiravataClientException as ace:
            msg_type = TMessageType.REPLY
            result.ace = ace
        except 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("getAllCredentialSummaries", 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)
            msg_type = TMessageType.REPLY
        except (TTransport.TTransportException, KeyboardInterrupt, SystemExit):
            raise
        except airavata.api.error.ttypes.InvalidRequestException as ire:
            msg_type = TMessageType.REPLY
            result.ire = ire
        except airavata.api.error.ttypes.AiravataClientException as ace:
            msg_type = TMessageType.REPLY
            result.ace = ace
        except airavata.api.error.ttypes.AiravataSystemException as ase:
            msg_type = TMessageType.REPLY
            result.ase = ase
        except 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("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)
            msg_type = TMessageType.REPLY
        except (TTransport.TTransportException, KeyboardInterrupt, SystemExit):
            raise
        except airavata.api.error.ttypes.InvalidRequestException as ire:
            msg_type = TMessageType.REPLY
            result.ire = ire
        except airavata.api.error.ttypes.AiravataClientException as ace:
            msg_type = TMessageType.REPLY
            result.ace = ace
        except airavata.api.error.ttypes.AiravataSystemException as ase:
            msg_type = TMessageType.REPLY
            result.ase = ase
        except 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("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 airavata.api.error.ttypes.InvalidRequestException as ire:
            msg_type = TMessageType.REPLY
            result.ire = ire
        except airavata.api.error.ttypes.AiravataClientException as ace:
            msg_type = TMessageType.REPLY
            result.ace = ace
        except airavata.api.error.ttypes.AiravataSystemException as ase:
            msg_type = TMessageType.REPLY
            result.ase = ase
        except 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 airavata.api.error.ttypes.InvalidRequestException as ire:
            msg_type = TMessageType.REPLY
            result.ire = ire
        except airavata.api.error.ttypes.AiravataClientException as ace:
            msg_type = TMessageType.REPLY
            result.ace = ace
        except airavata.api.error.ttypes.AiravataSystemException as ase:
            msg_type = TMessageType.REPLY
            result.ase = ase
        except airavata.api.error.ttypes.ProjectNotFoundException as pnfe:
            msg_type = TMessageType.REPLY
            result.pnfe = pnfe
        except 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 airavata.api.error.ttypes.InvalidRequestException as ire:
            msg_type = TMessageType.REPLY
            result.ire = ire
        except airavata.api.error.ttypes.AiravataClientException as ace:
            msg_type = TMessageType.REPLY
            result.ace = ace
        except airavata.api.error.ttypes.AiravataSystemException as ase:
            msg_type = TMessageType.REPLY
            result.ase = ase
        except airavata.api.error.ttypes.ProjectNotFoundException as pnfe:
            msg_type = TMessageType.REPLY
            result.pnfe = pnfe
        except 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 airavata.api.error.ttypes.InvalidRequestException as ire:
            msg_type = TMessageType.REPLY
            result.ire = ire
        except airavata.api.error.ttypes.AiravataClientException as ace:
            msg_type = TMessageType.REPLY
            result.ace = ace
        except airavata.api.error.ttypes.AiravataSystemException as ase:
            msg_type = TMessageType.REPLY
            result.ase = ase
        except airavata.api.error.ttypes.ProjectNotFoundException as pnfe:
            msg_type = TMessageType.REPLY
            result.pnfe = pnfe
        except 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 airavata.api.error.ttypes.InvalidRequestException as ire:
            msg_type = TMessageType.REPLY
            result.ire = ire
        except airavata.api.error.ttypes.AiravataClientException as ace:
            msg_type = TMessageType.REPLY
            result.ace = ace
        except airavata.api.error.ttypes.AiravataSystemException as ase:
            msg_type = TMessageType.REPLY
            result.ase = ase
        except 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 airavata.api.error.ttypes.InvalidRequestException as ire:
            msg_type = TMessageType.REPLY
            result.ire = ire
        except airavata.api.error.ttypes.AiravataClientException as ace:
            msg_type = TMessageType.REPLY
            result.ace = ace
        except airavata.api.error.ttypes.AiravataSystemException as ase:
            msg_type = TMessageType.REPLY
            result.ase = ase
        except 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 airavata.api.error.ttypes.InvalidRequestException as ire:
            msg_type = TMessageType.REPLY
            result.ire = ire
        except airavata.api.error.ttypes.AiravataClientException as ace:
            msg_type = TMessageType.REPLY
            result.ace = ace
        except airavata.api.error.ttypes.AiravataSystemException as ase:
            msg_type = TMessageType.REPLY
            result.ase = ase
        except 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, args.limit, args.offset)
            msg_type = TMessageType.REPLY
        except (TTransport.TTransportException, KeyboardInterrupt, SystemExit):
            raise
        except airavata.api.error.ttypes.InvalidRequestException as ire:
            msg_type = TMessageType.REPLY
            result.ire = ire
        except airavata.api.error.ttypes.AiravataClientException as ace:
            msg_type = TMessageType.REPLY
            result.ace = ace
        except airavata.api.error.ttypes.AiravataSystemException as ase:
            msg_type = TMessageType.REPLY
            result.ase = ase
        except 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 airavata.api.error.ttypes.InvalidRequestException as ire:
            msg_type = TMessageType.REPLY
            result.ire = ire
        except airavata.api.error.ttypes.AiravataClientException as ace:
            msg_type = TMessageType.REPLY
            result.ace = ace
        except airavata.api.error.ttypes.AiravataSystemException as ase:
            msg_type = TMessageType.REPLY
            result.ase = ase
        except airavata.api.error.ttypes.ProjectNotFoundException as pnfe:
            msg_type = TMessageType.REPLY
            result.pnfe = pnfe
        except 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 airavata.api.error.ttypes.InvalidRequestException as ire:
            msg_type = TMessageType.REPLY
            result.ire = ire
        except airavata.api.error.ttypes.AiravataClientException as ace:
            msg_type = TMessageType.REPLY
            result.ace = ace
        except airavata.api.error.ttypes.AiravataSystemException as ase:
            msg_type = TMessageType.REPLY
            result.ase = ase
        except 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 airavata.api.error.ttypes.InvalidRequestException as ire:
            msg_type = TMessageType.REPLY
            result.ire = ire
        except airavata.api.error.ttypes.AiravataClientException as ace:
            msg_type = TMessageType.REPLY
            result.ace = ace
        except airavata.api.error.ttypes.AiravataSystemException as ase:
            msg_type = TMessageType.REPLY
            result.ase = ase
        except 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 airavata.api.error.ttypes.InvalidRequestException as ire:
            msg_type = TMessageType.REPLY
            result.ire = ire
        except airavata.api.error.ttypes.AiravataClientException as ace:
            msg_type = TMessageType.REPLY
            result.ace = ace
        except airavata.api.error.ttypes.AiravataSystemException as ase:
            msg_type = TMessageType.REPLY
            result.ase = ase
        except 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 airavata.api.error.ttypes.InvalidRequestException as ire:
            msg_type = TMessageType.REPLY
            result.ire = ire
        except airavata.api.error.ttypes.ExperimentNotFoundException as enf:
            msg_type = TMessageType.REPLY
            result.enf = enf
        except airavata.api.error.ttypes.AiravataClientException as ace:
            msg_type = TMessageType.REPLY
            result.ace = ace
        except airavata.api.error.ttypes.AiravataSystemException as ase:
            msg_type = TMessageType.REPLY
            result.ase = ase
        except 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 airavata.api.error.ttypes.InvalidRequestException as ire:
            msg_type = TMessageType.REPLY
            result.ire = ire
        except airavata.api.error.ttypes.ExperimentNotFoundException as enf:
            msg_type = TMessageType.REPLY
            result.enf = enf
        except airavata.api.error.ttypes.AiravataClientException as ace:
            msg_type = TMessageType.REPLY
            result.ace = ace
        except airavata.api.error.ttypes.AiravataSystemException as ase:
            msg_type = TMessageType.REPLY
            result.ase = ase
        except 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 airavata.api.error.ttypes.InvalidRequestException as ire:
            msg_type = TMessageType.REPLY
            result.ire = ire
        except airavata.api.error.ttypes.ExperimentNotFoundException as enf:
            msg_type = TMessageType.REPLY
            result.enf = enf
        except airavata.api.error.ttypes.AiravataClientException as ace:
            msg_type = TMessageType.REPLY
            result.ace = ace
        except airavata.api.error.ttypes.AiravataSystemException as ase:
            msg_type = TMessageType.REPLY
            result.ase = ase
        except 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 airavata.api.error.ttypes.InvalidRequestException as ire:
            msg_type = TMessageType.REPLY
            result.ire = ire
        except airavata.api.error.ttypes.ExperimentNotFoundException as enf:
            msg_type = TMessageType.REPLY
            result.enf = enf
        except airavata.api.error.ttypes.AiravataClientException as ace:
            msg_type = TMessageType.REPLY
            result.ace = ace
        except airavata.api.error.ttypes.AiravataSystemException as ase:
            msg_type = TMessageType.REPLY
            result.ase = ase
        except 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 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 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 airavata.api.error.ttypes.InvalidRequestException as ire:
            msg_type = TMessageType.REPLY
            result.ire = ire
        except airavata.api.error.ttypes.ExperimentNotFoundException as enf:
            msg_type = TMessageType.REPLY
            result.enf = enf
        except airavata.api.error.ttypes.AiravataClientException as ace:
            msg_type = TMessageType.REPLY
            result.ace = ace
        except airavata.api.error.ttypes.AiravataSystemException as ase:
            msg_type = TMessageType.REPLY
            result.ase = ase
        except 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 airavata.api.error.ttypes.InvalidRequestException as ire:
            msg_type = TMessageType.REPLY
            result.ire = ire
        except airavata.api.error.ttypes.ExperimentNotFoundException as enf:
            msg_type = TMessageType.REPLY
            result.enf = enf
        except airavata.api.error.ttypes.AiravataClientException as ace:
            msg_type = TMessageType.REPLY
            result.ace = ace
        except airavata.api.error.ttypes.AiravataSystemException as ase:
            msg_type = TMessageType.REPLY
            result.ase = ase
        except 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 airavata.api.error.ttypes.InvalidRequestException as ire:
            msg_type = TMessageType.REPLY
            result.ire = ire
        except airavata.api.error.ttypes.ExperimentNotFoundException as enf:
            msg_type = TMessageType.REPLY
            result.enf = enf
        except airavata.api.error.ttypes.AiravataClientException as ace:
            msg_type = TMessageType.REPLY
            result.ace = ace
        except airavata.api.error.ttypes.AiravataSystemException as ase:
            msg_type = TMessageType.REPLY
            result.ase = ase
        except 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 airavata.api.error.ttypes.InvalidRequestException as ire:
            msg_type = TMessageType.REPLY
            result.ire = ire
        except airavata.api.error.ttypes.ExperimentNotFoundException as enf:
            msg_type = TMessageType.REPLY
            result.enf = enf
        except airavata.api.error.ttypes.AiravataClientException as ace:
            msg_type = TMessageType.REPLY
            result.ace = ace
        except airavata.api.error.ttypes.AiravataSystemException as ase:
            msg_type = TMessageType.REPLY
            result.ase = ase
        except 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 airavata.api.error.ttypes.InvalidRequestException as ire:
            msg_type = TMessageType.REPLY
            result.ire = ire
        except airavata.api.error.ttypes.ExperimentNotFoundException as enf:
            msg_type = TMessageType.REPLY
            result.enf = enf
        except airavata.api.error.ttypes.AiravataClientException as ace:
            msg_type = TMessageType.REPLY
            result.ace = ace
        except airavata.api.error.ttypes.AiravataSystemException as ase:
            msg_type = TMessageType.REPLY
            result.ase = ase
        except 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_fetchIntermediateOutputs(self, seqid, iprot, oprot):
        args = fetchIntermediateOutputs_args()
        args.read(iprot)
        iprot.readMessageEnd()
        result = fetchIntermediateOutputs_result()
        try:
            self._handler.fetchIntermediateOutputs(args.authzToken, args.airavataExperimentId, args.outputNames)
            msg_type = TMessageType.REPLY
        except (TTransport.TTransportException, KeyboardInterrupt, SystemExit):
            raise
        except airavata.api.error.ttypes.InvalidRequestException as ire:
            msg_type = TMessageType.REPLY
            result.ire = ire
        except airavata.api.error.ttypes.ExperimentNotFoundException as enf:
            msg_type = TMessageType.REPLY
            result.enf = enf
        except airavata.api.error.ttypes.AiravataClientException as ace:
            msg_type = TMessageType.REPLY
            result.ace = ace
        except airavata.api.error.ttypes.AiravataSystemException as ase:
            msg_type = TMessageType.REPLY
            result.ase = ase
        except 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("fetchIntermediateOutputs", msg_type, seqid)
        result.write(oprot)
        oprot.writeMessageEnd()
        oprot.trans.flush()

    def process_getIntermediateOutputProcessStatus(self, seqid, iprot, oprot):
        args = getIntermediateOutputProcessStatus_args()
        args.read(iprot)
        iprot.readMessageEnd()
        result = getIntermediateOutputProcessStatus_result()
        try:
            result.success = self._handler.getIntermediateOutputProcessStatus(args.authzToken, args.airavataExperimentId, args.outputNames)
            msg_type = TMessageType.REPLY
        except (TTransport.TTransportException, KeyboardInterrupt, SystemExit):
            raise
        except airavata.api.error.ttypes.InvalidRequestException as ire:
            msg_type = TMessageType.REPLY
            result.ire = ire
        except airavata.api.error.ttypes.ExperimentNotFoundException as enf:
            msg_type = TMessageType.REPLY
            result.enf = enf
        except airavata.api.error.ttypes.AiravataClientException as ace:
            msg_type = TMessageType.REPLY
            result.ace = ace
        except airavata.api.error.ttypes.AiravataSystemException as ase:
            msg_type = TMessageType.REPLY
            result.ase = ase
        except 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("getIntermediateOutputProcessStatus", 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 airavata.api.error.ttypes.InvalidRequestException as ire:
            msg_type = TMessageType.REPLY
            result.ire = ire
        except airavata.api.error.ttypes.ExperimentNotFoundException as enf:
            msg_type = TMessageType.REPLY
            result.enf = enf
        except airavata.api.error.ttypes.AiravataClientException as ace:
            msg_type = TMessageType.REPLY
            result.ace = ace
        except airavata.api.error.ttypes.AiravataSystemException as ase:
            msg_type = TMessageType.REPLY
            result.ase = ase
        except 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 airavata.api.error.ttypes.InvalidRequestException as ire:
            msg_type = TMessageType.REPLY
            result.ire = ire
        except airavata.api.error.ttypes.ExperimentNotFoundException as enf:
            msg_type = TMessageType.REPLY
            result.enf = enf
        except airavata.api.error.ttypes.AiravataClientException as ace:
            msg_type = TMessageType.REPLY
            result.ace = ace
        except airavata.api.error.ttypes.AiravataSystemException as ase:
            msg_type = TMessageType.REPLY
            result.ase = ase
        except 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 airavata.api.error.ttypes.InvalidRequestException as ire:
            msg_type = TMessageType.REPLY
            result.ire = ire
        except airavata.api.error.ttypes.ExperimentNotFoundException as enf:
            msg_type = TMessageType.REPLY
            result.enf = enf
        except airavata.api.error.ttypes.AiravataClientException as ace:
            msg_type = TMessageType.REPLY
            result.ace = ace
        except airavata.api.error.ttypes.AiravataSystemException as ase:
            msg_type = TMessageType.REPLY
            result.ase = ase
        except airavata.api.error.ttypes.AuthorizationException as ae:
            msg_type = TMessageType.REPLY
            result.ae = ae
        except 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 airavata.api.error.ttypes.InvalidRequestException as ire:
            msg_type = TMessageType.REPLY
            result.ire = ire
        except airavata.api.error.ttypes.ExperimentNotFoundException as enf:
            msg_type = TMessageType.REPLY
            result.enf = enf
        except airavata.api.error.ttypes.AiravataClientException as ace:
            msg_type = TMessageType.REPLY
            result.ace = ace
        except airavata.api.error.ttypes.AiravataSystemException as ase:
            msg_type = TMessageType.REPLY
            result.ase = ase
        except airavata.api.error.ttypes.AuthorizationException as ae:
            msg_type = TMessageType.REPLY
            result.ae = ae
        except 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 airavata.api.error.ttypes.InvalidRequestException as ire:
            msg_type = TMessageType.REPLY
            result.ire = ire
        except airavata.api.error.ttypes.ExperimentNotFoundException as enf:
            msg_type = TMessageType.REPLY
            result.enf = enf
        except airavata.api.error.ttypes.AiravataClientException as ace:
            msg_type = TMessageType.REPLY
            result.ace = ace
        except airavata.api.error.ttypes.AiravataSystemException as ase:
            msg_type = TMessageType.REPLY
            result.ase = ase
        except 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 airavata.api.error.ttypes.InvalidRequestException as ire:
            msg_type = TMessageType.REPLY
            result.ire = ire
        except airavata.api.error.ttypes.AiravataClientException as ace:
            msg_type = TMessageType.REPLY
            result.ace = ace
        except airavata.api.error.ttypes.AiravataSystemException as ase:
            msg_type = TMessageType.REPLY
            result.ase = ase
        except 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 airavata.api.error.ttypes.InvalidRequestException as ire:
            msg_type = TMessageType.REPLY
            result.ire = ire
        except airavata.api.error.ttypes.AiravataClientException as ace:
            msg_type = TMessageType.REPLY
            result.ace = ace
        except airavata.api.error.ttypes.AiravataSystemException as ase:
            msg_type = TMessageType.REPLY
            result.ase = ase
        except 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 airavata.api.error.ttypes.InvalidRequestException as ire:
            msg_type = TMessageType.REPLY
            result.ire = ire
        except airavata.api.error.ttypes.AiravataClientException as ace:
            msg_type = TMessageType.REPLY
            result.ace = ace
        except airavata.api.error.ttypes.AiravataSystemException as ase:
            msg_type = TMessageType.REPLY
            result.ase = ase
        except 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 airavata.api.error.ttypes.InvalidRequestException as ire:
            msg_type = TMessageType.REPLY
            result.ire = ire
        except airavata.api.error.ttypes.AiravataClientException as ace:
            msg_type = TMessageType.REPLY
            result.ace = ace
        except airavata.api.error.ttypes.AiravataSystemException as ase:
            msg_type = TMessageType.REPLY
            result.ase = ase
        except 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_getAccessibleAppModules(self, seqid, iprot, oprot):
        args = getAccessibleAppModules_args()
        args.read(iprot)
        iprot.readMessageEnd()
        result = getAccessibleAppModules_result()
        try:
            result.success = self._handler.getAccessibleAppModules(args.authzToken, args.gatewayId)
            msg_type = TMessageType.REPLY
        except (TTransport.TTransportException, KeyboardInterrupt, SystemExit):
            raise
        except airavata.api.error.ttypes.InvalidRequestException as ire:
            msg_type = TMessageType.REPLY
            result.ire = ire
        except airavata.api.error.ttypes.AiravataClientException as ace:
            msg_type = TMessageType.REPLY
            result.ace = ace
        except airavata.api.error.ttypes.AiravataSystemException as ase:
            msg_type = TMessageType.REPLY
            result.ase = ase
        except 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("getAccessibleAppModules", 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 airavata.api.error.ttypes.InvalidRequestException as ire:
            msg_type = TMessageType.REPLY
            result.ire = ire
        except airavata.api.error.ttypes.AiravataClientException as ace:
            msg_type = TMessageType.REPLY
            result.ace = ace
        except airavata.api.error.ttypes.AiravataSystemException as ase:
            msg_type = TMessageType.REPLY
            result.ase = ase
        except 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 airavata.api.error.ttypes.InvalidRequestException as ire:
            msg_type = TMessageType.REPLY
            result.ire = ire
        except airavata.api.error.ttypes.AiravataClientException as ace:
            msg_type = TMessageType.REPLY
            result.ace = ace
        except airavata.api.error.ttypes.AiravataSystemException as ase:
            msg_type = TMessageType.REPLY
            result.ase = ase
        except 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 airavata.api.error.ttypes.InvalidRequestException as ire:
            msg_type = TMessageType.REPLY
            result.ire = ire
        except airavata.api.error.ttypes.AiravataClientException as ace:
            msg_type = TMessageType.REPLY
            result.ace = ace
        except airavata.api.error.ttypes.AiravataSystemException as ase:
            msg_type = TMessageType.REPLY
            result.ase = ase
        except 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 airavata.api.error.ttypes.InvalidRequestException as ire:
            msg_type = TMessageType.REPLY
            result.ire = ire
        except airavata.api.error.ttypes.AiravataClientException as ace:
            msg_type = TMessageType.REPLY
            result.ace = ace
        except airavata.api.error.ttypes.AiravataSystemException as ase:
            msg_type = TMessageType.REPLY
            result.ase = ase
        except 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 airavata.api.error.ttypes.InvalidRequestException as ire:
            msg_type = TMessageType.REPLY
            result.ire = ire
        except airavata.api.error.ttypes.AiravataClientException as ace:
            msg_type = TMessageType.REPLY
            result.ace = ace
        except airavata.api.error.ttypes.AiravataSystemException as ase:
            msg_type = TMessageType.REPLY
            result.ase = ase
        except 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 airavata.api.error.ttypes.InvalidRequestException as ire:
            msg_type = TMessageType.REPLY
            result.ire = ire
        except airavata.api.error.ttypes.AiravataClientException as ace:
            msg_type = TMessageType.REPLY
            result.ace = ace
        except airavata.api.error.ttypes.AiravataSystemException as ase:
            msg_type = TMessageType.REPLY
            result.ase = ase
        except 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_getAccessibleApplicationDeployments(self, seqid, iprot, oprot):
        args = getAccessibleApplicationDeployments_args()
        args.read(iprot)
        iprot.readMessageEnd()
        result = getAccessibleApplicationDeployments_result()
        try:
            result.success = self._handler.getAccessibleApplicationDeployments(args.authzToken, args.gatewayId, args.permissionType)
            msg_type = TMessageType.REPLY
        except (TTransport.TTransportException, KeyboardInterrupt, SystemExit):
            raise
        except airavata.api.error.ttypes.InvalidRequestException as ire:
            msg_type = TMessageType.REPLY
            result.ire = ire
        except airavata.api.error.ttypes.AiravataClientException as ace:
            msg_type = TMessageType.REPLY
            result.ace = ace
        except airavata.api.error.ttypes.AiravataSystemException as ase:
            msg_type = TMessageType.REPLY
            result.ase = ase
        except 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("getAccessibleApplicationDeployments", 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 airavata.api.error.ttypes.InvalidRequestException as ire:
            msg_type = TMessageType.REPLY
            result.ire = ire
        except airavata.api.error.ttypes.AiravataClientException as ace:
            msg_type = TMessageType.REPLY
            result.ace = ace
        except airavata.api.error.ttypes.AiravataSystemException as ase:
            msg_type = TMessageType.REPLY
            result.ase = ase
        except 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_getApplicationDeploymentsForAppModuleAndGroupResourceProfile(self, seqid, iprot, oprot):
        args = getApplicationDeploymentsForAppModuleAndGroupResourceProfile_args()
        args.read(iprot)
        iprot.readMessageEnd()
        result = getApplicationDeploymentsForAppModuleAndGroupResourceProfile_result()
        try:
            result.success = self._handler.getApplicationDeploymentsForAppModuleAndGroupResourceProfile(args.authzToken, args.appModuleId, args.groupResourceProfileId)
            msg_type = TMessageType.REPLY
        except (TTransport.TTransportException, KeyboardInterrupt, SystemExit):
            raise
        except airavata.api.error.ttypes.InvalidRequestException as ire:
            msg_type = TMessageType.REPLY
            result.ire = ire
        except airavata.api.error.ttypes.AiravataClientException as ace:
            msg_type = TMessageType.REPLY
            result.ace = ace
        except airavata.api.error.ttypes.AiravataSystemException as ase:
            msg_type = TMessageType.REPLY
            result.ase = ase
        except 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("getApplicationDeploymentsForAppModuleAndGroupResourceProfile", 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 airavata.api.error.ttypes.InvalidRequestException as ire:
            msg_type = TMessageType.REPLY
            result.ire = ire
        except airavata.api.error.ttypes.AiravataClientException as ace:
            msg_type = TMessageType.REPLY
            result.ace = ace
        except airavata.api.error.ttypes.AiravataSystemException as ase:
            msg_type = TMessageType.REPLY
            result.ase = ase
        except 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 airavata.api.error.ttypes.InvalidRequestException as ire:
            msg_type = TMessageType.REPLY
            result.ire = ire
        except airavata.api.error.ttypes.AiravataClientException as ace:
            msg_type = TMessageType.REPLY
            result.ace = ace
        except airavata.api.error.ttypes.AiravataSystemException as ase:
            msg_type = TMessageType.REPLY
            result.ase = ase
        except 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 airavata.api.error.ttypes.InvalidRequestException as ire:
            msg_type = TMessageType.REPLY
            result.ire = ire
        except airavata.api.error.ttypes.AiravataClientException as ace:
            msg_type = TMessageType.REPLY
            result.ace = ace
        except airavata.api.error.ttypes.AiravataSystemException as ase:
            msg_type = TMessageType.REPLY
            result.ase = ase
        except 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 airavata.api.error.ttypes.InvalidRequestException as ire:
            msg_type = TMessageType.REPLY
            result.ire = ire
        except airavata.api.error.ttypes.AiravataClientException as ace:
            msg_type = TMessageType.REPLY
            result.ace = ace
        except airavata.api.error.ttypes.AiravataSystemException as ase:
            msg_type = TMessageType.REPLY
            result.ase = ase
        except 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 airavata.api.error.ttypes.InvalidRequestException as ire:
            msg_type = TMessageType.REPLY
            result.ire = ire
        except airavata.api.error.ttypes.AiravataClientException as ace:
            msg_type = TMessageType.REPLY
            result.ace = ace
        except airavata.api.error.ttypes.AiravataSystemException as ase:
            msg_type = TMessageType.REPLY
            result.ase = ase
        except 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 airavata.api.error.ttypes.InvalidRequestException as ire:
            msg_type = TMessageType.REPLY
            result.ire = ire
        except airavata.api.error.ttypes.AiravataClientException as ace:
            msg_type = TMessageType.REPLY
            result.ace = ace
        except airavata.api.error.ttypes.AiravataSystemException as ase:
            msg_type = TMessageType.REPLY
            result.ase = ase
        except 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 airavata.api.error.ttypes.InvalidRequestException as ire:
            msg_type = TMessageType.REPLY
            result.ire = ire
        except airavata.api.error.ttypes.AiravataClientException as ace:
            msg_type = TMessageType.REPLY
            result.ace = ace
        except airavata.api.error.ttypes.AiravataSystemException as ase:
            msg_type = TMessageType.REPLY
            result.ase = ase
        except 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 airavata.api.error.ttypes.InvalidRequestException as ire:
            msg_type = TMessageType.REPLY
            result.ire = ire
        except airavata.api.error.ttypes.AiravataClientException as ace:
            msg_type = TMessageType.REPLY
            result.ace = ace
        except airavata.api.error.ttypes.AiravataSystemException as ase:
            msg_type = TMessageType.REPLY
            result.ase = ase
        except 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 airavata.api.error.ttypes.InvalidRequestException as ire:
            msg_type = TMessageType.REPLY
            result.ire = ire
        except airavata.api.error.ttypes.AiravataClientException as ace:
            msg_type = TMessageType.REPLY
            result.ace = ace
        except airavata.api.error.ttypes.AiravataSystemException as ase:
            msg_type = TMessageType.REPLY
            result.ase = ase
        except 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 airavata.api.error.ttypes.InvalidRequestException as ire:
            msg_type = TMessageType.REPLY
            result.ire = ire
        except airavata.api.error.ttypes.AiravataClientException as ace:
            msg_type = TMessageType.REPLY
            result.ace = ace
        except airavata.api.error.ttypes.AiravataSystemException as ase:
            msg_type = TMessageType.REPLY
            result.ase = ase
        except 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 airavata.api.error.ttypes.InvalidRequestException as ire:
            msg_type = TMessageType.REPLY
            result.ire = ire
        except airavata.api.error.ttypes.AiravataClientException as ace:
            msg_type = TMessageType.REPLY
            result.ace = ace
        except airavata.api.error.ttypes.AiravataSystemException as ase:
            msg_type = TMessageType.REPLY
            result.ase = ase
        except 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 airavata.api.error.ttypes.InvalidRequestException as ire:
            msg_type = TMessageType.REPLY
            result.ire = ire
        except airavata.api.error.ttypes.AiravataClientException as ace:
            msg_type = TMessageType.REPLY
            result.ace = ace
        except airavata.api.error.ttypes.AiravataSystemException as ase:
            msg_type = TMessageType.REPLY
            result.ase = ase
        except 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 airavata.api.error.ttypes.InvalidRequestException as ire:
            msg_type = TMessageType.REPLY
            result.ire = ire
        except airavata.api.error.ttypes.AiravataClientException as ace:
            msg_type = TMessageType.REPLY
            result.ace = ace
        except airavata.api.error.ttypes.AiravataSystemException as ase:
            msg_type = TMessageType.REPLY
            result.ase = ase
        except 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 airavata.api.error.ttypes.InvalidRequestException as ire:
            msg_type = TMessageType.REPLY
            result.ire = ire
        except airavata.api.error.ttypes.AiravataClientException as ace:
            msg_type = TMessageType.REPLY
            result.ace = ace
        except airavata.api.error.ttypes.AiravataSystemException as ase:
            msg_type = TMessageType.REPLY
            result.ase = ase
        except 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 airavata.api.error.ttypes.InvalidRequestException as ire:
            msg_type = TMessageType.REPLY
            result.ire = ire
        except airavata.api.error.ttypes.AiravataClientException as ace:
            msg_type = TMessageType.REPLY
            result.ace = ace
        except airavata.api.error.ttypes.AiravataSystemException as ase:
            msg_type = TMessageType.REPLY
            result.ase = ase
        except 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 airavata.api.error.ttypes.InvalidRequestException as ire:
            msg_type = TMessageType.REPLY
            result.ire = ire
        except airavata.api.error.ttypes.AiravataClientException as ace:
            msg_type = TMessageType.REPLY
            result.ace = ace
        except airavata.api.error.ttypes.AiravataSystemException as ase:
            msg_type = TMessageType.REPLY
            result.ase = ase
        except 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 airavata.api.error.ttypes.InvalidRequestException as ire:
            msg_type = TMessageType.REPLY
            result.ire = ire
        except airavata.api.error.ttypes.AiravataClientException as ace:
            msg_type = TMessageType.REPLY
            result.ace = ace
        except airavata.api.error.ttypes.AiravataSystemException as ase:
            msg_type = TMessageType.REPLY
            result.ase = ase
        except 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 airavata.api.error.ttypes.InvalidRequestException as ire:
            msg_type = TMessageType.REPLY
            result.ire = ire
        except airavata.api.error.ttypes.AiravataClientException as ace:
            msg_type = TMessageType.REPLY
            result.ace = ace
        except airavata.api.error.ttypes.AiravataSystemException as ase:
            msg_type = TMessageType.REPLY
            result.ase = ase
        except 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 airavata.api.error.ttypes.InvalidRequestException as ire:
            msg_type = TMessageType.REPLY
            result.ire = ire
        except airavata.api.error.ttypes.AiravataClientException as ace:
            msg_type = TMessageType.REPLY
            result.ace = ace
        except airavata.api.error.ttypes.AiravataSystemException as ase:
            msg_type = TMessageType.REPLY
            result.ase = ase
        except 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 airavata.api.error.ttypes.InvalidRequestException as ire:
            msg_type = TMessageType.REPLY
            result.ire = ire
        except airavata.api.error.ttypes.AiravataClientException as ace:
            msg_type = TMessageType.REPLY
            result.ace = ace
        except airavata.api.error.ttypes.AiravataSystemException as ase:
            msg_type = TMessageType.REPLY
            result.ase = ase
        except 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 airavata.api.error.ttypes.InvalidRequestException as ire:
            msg_type = TMessageType.REPLY
            result.ire = ire
        except airavata.api.error.ttypes.AiravataClientException as ace:
            msg_type = TMessageType.REPLY
            result.ace = ace
        except airavata.api.error.ttypes.AiravataSystemException as ase:
            msg_type = TMessageType.REPLY
            result.ase = ase
        except 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 airavata.api.error.ttypes.InvalidRequestException as ire:
            msg_type = TMessageType.REPLY
            result.ire = ire
        except airavata.api.error.ttypes.AiravataClientException as ace:
            msg_type = TMessageType.REPLY
            result.ace = ace
        except airavata.api.error.ttypes.AiravataSystemException as ase:
            msg_type = TMessageType.REPLY
            result.ase = ase
        except 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 airavata.api.error.ttypes.InvalidRequestException as ire:
            msg_type = TMessageType.REPLY
            result.ire = ire
        except airavata.api.error.ttypes.AiravataClientException as ace:
            msg_type = TMessageType.REPLY
            result.ace = ace
        except airavata.api.error.ttypes.AiravataSystemException as ase:
            msg_type = TMessageType.REPLY
            result.ase = ase
        except 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 airavata.api.error.ttypes.InvalidRequestException as ire:
            msg_type = TMessageType.REPLY
            result.ire = ire
        except airavata.api.error.ttypes.AiravataClientException as ace:
            msg_type = TMessageType.REPLY
            result.ace = ace
        except airavata.api.error.ttypes.AiravataSystemException as ase:
            msg_type = TMessageType.REPLY
            result.ase = ase
        except 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 airavata.api.error.ttypes.InvalidRequestException as ire:
            msg_type = TMessageType.REPLY
            result.ire = ire
        except airavata.api.error.ttypes.AiravataClientException as ace:
            msg_type = TMessageType.REPLY
            result.ace = ace
        except airavata.api.error.ttypes.AiravataSystemException as ase:
            msg_type = TMessageType.REPLY
            result.ase = ase
        except 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 airavata.api.error.ttypes.InvalidRequestException as ire:
            msg_type = TMessageType.REPLY
            result.ire = ire
        except airavata.api.error.ttypes.AiravataClientException as ace:
            msg_type = TMessageType.REPLY
            result.ace = ace
        except airavata.api.error.ttypes.AiravataSystemException as ase:
            msg_type = TMessageType.REPLY
            result.ase = ase
        except 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 airavata.api.error.ttypes.InvalidRequestException as ire:
            msg_type = TMessageType.REPLY
            result.ire = ire
        except airavata.api.error.ttypes.AiravataClientException as ace:
            msg_type = TMessageType.REPLY
            result.ace = ace
        except airavata.api.error.ttypes.AiravataSystemException as ase:
            msg_type = TMessageType.REPLY
            result.ase = ase
        except 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 airavata.api.error.ttypes.InvalidRequestException as ire:
            msg_type = TMessageType.REPLY
            result.ire = ire
        except airavata.api.error.ttypes.AiravataClientException as ace:
            msg_type = TMessageType.REPLY
            result.ace = ace
        except airavata.api.error.ttypes.AiravataSystemException as ase:
            msg_type = TMessageType.REPLY
            result.ase = ase
        except 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 airavata.api.error.ttypes.InvalidRequestException as ire:
            msg_type = TMessageType.REPLY
            result.ire = ire
        except airavata.api.error.ttypes.AiravataClientException as ace:
            msg_type = TMessageType.REPLY
            result.ace = ace
        except airavata.api.error.ttypes.AiravataSystemException as ase:
            msg_type = TMessageType.REPLY
            result.ase = ase
        except 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 airavata.api.error.ttypes.InvalidRequestException as ire:
            msg_type = TMessageType.REPLY
            result.ire = ire
        except airavata.api.error.ttypes.AiravataClientException as ace:
            msg_type = TMessageType.REPLY
            result.ace = ace
        except airavata.api.error.ttypes.AiravataSystemException as ase:
            msg_type = TMessageType.REPLY
            result.ase = ase
        except 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 airavata.api.error.ttypes.InvalidRequestException as ire:
            msg_type = TMessageType.REPLY
            result.ire = ire
        except airavata.api.error.ttypes.AiravataClientException as ace:
            msg_type = TMessageType.REPLY
            result.ace = ace
        except airavata.api.error.ttypes.AiravataSystemException as ase:
            msg_type = TMessageType.REPLY
            result.ase = ase
        except 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 airavata.api.error.ttypes.InvalidRequestException as ire:
            msg_type = TMessageType.REPLY
            result.ire = ire
        except airavata.api.error.ttypes.AiravataClientException as ace:
            msg_type = TMessageType.REPLY
            result.ace = ace
        except airavata.api.error.ttypes.AiravataSystemException as ase:
            msg_type = TMessageType.REPLY
            result.ase = ase
        except 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 airavata.api.error.ttypes.InvalidRequestException as ire:
            msg_type = TMessageType.REPLY
            result.ire = ire
        except airavata.api.error.ttypes.AiravataClientException as ace:
            msg_type = TMessageType.REPLY
            result.ace = ace
        except airavata.api.error.ttypes.AiravataSystemException as ase:
            msg_type = TMessageType.REPLY
            result.ase = ase
        except 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 airavata.api.error.ttypes.InvalidRequestException as ire:
            msg_type = TMessageType.REPLY
            result.ire = ire
        except airavata.api.error.ttypes.AiravataClientException as ace:
            msg_type = TMessageType.REPLY
            result.ace = ace
        except airavata.api.error.ttypes.AiravataSystemException as ase:
            msg_type = TMessageType.REPLY
            result.ase = ase
        except 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 airavata.api.error.ttypes.InvalidRequestException as ire:
            msg_type = TMessageType.REPLY
            result.ire = ire
        except airavata.api.error.ttypes.AiravataClientException as ace:
            msg_type = TMessageType.REPLY
            result.ace = ace
        except airavata.api.error.ttypes.AiravataSystemException as ase:
            msg_type = TMessageType.REPLY
            result.ase = ase
        except 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 airavata.api.error.ttypes.InvalidRequestException as ire:
            msg_type = TMessageType.REPLY
            result.ire = ire
        except airavata.api.error.ttypes.AiravataClientException as ace:
            msg_type = TMessageType.REPLY
            result.ace = ace
        except airavata.api.error.ttypes.AiravataSystemException as ase:
            msg_type = TMessageType.REPLY
            result.ase = ase
        except 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 airavata.api.error.ttypes.InvalidRequestException as ire:
            msg_type = TMessageType.REPLY
            result.ire = ire
        except airavata.api.error.ttypes.AiravataClientException as ace:
            msg_type = TMessageType.REPLY
            result.ace = ace
        except airavata.api.error.ttypes.AiravataSystemException as ase:
            msg_type = TMessageType.REPLY
            result.ase = ase
        except 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 airavata.api.error.ttypes.InvalidRequestException as ire:
            msg_type = TMessageType.REPLY
            result.ire = ire
        except airavata.api.error.ttypes.AiravataClientException as ace:
            msg_type = TMessageType.REPLY
            result.ace = ace
        except airavata.api.error.ttypes.AiravataSystemException as ase:
            msg_type = TMessageType.REPLY
            result.ase = ase
        except 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 airavata.api.error.ttypes.InvalidRequestException as ire:
            msg_type = TMessageType.REPLY
            result.ire = ire
        except airavata.api.error.ttypes.AiravataClientException as ace:
            msg_type = TMessageType.REPLY
            result.ace = ace
        except airavata.api.error.ttypes.AiravataSystemException as ase:
            msg_type = TMessageType.REPLY
            result.ase = ase
        except 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 airavata.api.error.ttypes.InvalidRequestException as ire:
            msg_type = TMessageType.REPLY
            result.ire = ire
        except airavata.api.error.ttypes.AiravataClientException as ace:
            msg_type = TMessageType.REPLY
            result.ace = ace
        except airavata.api.error.ttypes.AiravataSystemException as ase:
            msg_type = TMessageType.REPLY
            result.ase = ase
        except 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 airavata.api.error.ttypes.InvalidRequestException as ire:
            msg_type = TMessageType.REPLY
            result.ire = ire
        except airavata.api.error.ttypes.AiravataClientException as ace:
            msg_type = TMessageType.REPLY
            result.ace = ace
        except airavata.api.error.ttypes.AiravataSystemException as ase:
            msg_type = TMessageType.REPLY
            result.ase = ase
        except 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 airavata.api.error.ttypes.InvalidRequestException as ire:
            msg_type = TMessageType.REPLY
            result.ire = ire
        except airavata.api.error.ttypes.AiravataClientException as ace:
            msg_type = TMessageType.REPLY
            result.ace = ace
        except airavata.api.error.ttypes.AiravataSystemException as ase:
            msg_type = TMessageType.REPLY
            result.ase = ase
        except 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 airavata.api.error.ttypes.InvalidRequestException as ire:
            msg_type = TMessageType.REPLY
            result.ire = ire
        except airavata.api.error.ttypes.AiravataClientException as ace:
            msg_type = TMessageType.REPLY
            result.ace = ace
        except airavata.api.error.ttypes.AiravataSystemException as ase:
            msg_type = TMessageType.REPLY
            result.ase = ase
        except 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 airavata.api.error.ttypes.InvalidRequestException as ire:
            msg_type = TMessageType.REPLY
            result.ire = ire
        except airavata.api.error.ttypes.AiravataClientException as ace:
            msg_type = TMessageType.REPLY
            result.ace = ace
        except airavata.api.error.ttypes.AiravataSystemException as ase:
            msg_type = TMessageType.REPLY
            result.ase = ase
        except 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 airavata.api.error.ttypes.InvalidRequestException as ire:
            msg_type = TMessageType.REPLY
            result.ire = ire
        except airavata.api.error.ttypes.AiravataClientException as ace:
            msg_type = TMessageType.REPLY
            result.ace = ace
        except airavata.api.error.ttypes.AiravataSystemException as ase:
            msg_type = TMessageType.REPLY
            result.ase = ase
        except 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 airavata.api.error.ttypes.InvalidRequestException as ire:
            msg_type = TMessageType.REPLY
            result.ire = ire
        except airavata.api.error.ttypes.AiravataClientException as ace:
            msg_type = TMessageType.REPLY
            result.ace = ace
        except airavata.api.error.ttypes.AiravataSystemException as ase:
            msg_type = TMessageType.REPLY
            result.ase = ase
        except 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 airavata.api.error.ttypes.InvalidRequestException as ire:
            msg_type = TMessageType.REPLY
            result.ire = ire
        except airavata.api.error.ttypes.AiravataClientException as ace:
            msg_type = TMessageType.REPLY
            result.ace = ace
        except airavata.api.error.ttypes.AiravataSystemException as ase:
            msg_type = TMessageType.REPLY
            result.ase = ase
        except 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 airavata.api.error.ttypes.InvalidRequestException as ire:
            msg_type = TMessageType.REPLY
            result.ire = ire
        except airavata.api.error.ttypes.AiravataClientException as ace:
            msg_type = TMessageType.REPLY
            result.ace = ace
        except airavata.api.error.ttypes.AiravataSystemException as ase:
            msg_type = TMessageType.REPLY
            result.ase = ase
        except 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 airavata.api.error.ttypes.InvalidRequestException as ire:
            msg_type = TMessageType.REPLY
            result.ire = ire
        except airavata.api.error.ttypes.AiravataClientException as ace:
            msg_type = TMessageType.REPLY
            result.ace = ace
        except airavata.api.error.ttypes.AiravataSystemException as ase:
            msg_type = TMessageType.REPLY
            result.ase = ase
        except 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 airavata.api.error.ttypes.InvalidRequestException as ire:
            msg_type = TMessageType.REPLY
            result.ire = ire
        except airavata.api.error.ttypes.AiravataClientException as ace:
            msg_type = TMessageType.REPLY
            result.ace = ace
        except airavata.api.error.ttypes.AiravataSystemException as ase:
            msg_type = TMessageType.REPLY
            result.ase = ase
        except 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 airavata.api.error.ttypes.InvalidRequestException as ire:
            msg_type = TMessageType.REPLY
            result.ire = ire
        except airavata.api.error.ttypes.AiravataClientException as ace:
            msg_type = TMessageType.REPLY
            result.ace = ace
        except airavata.api.error.ttypes.AiravataSystemException as ase:
            msg_type = TMessageType.REPLY
            result.ase = ase
        except 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 airavata.api.error.ttypes.InvalidRequestException as ire:
            msg_type = TMessageType.REPLY
            result.ire = ire
        except airavata.api.error.ttypes.AiravataClientException as ace:
            msg_type = TMessageType.REPLY
            result.ace = ace
        except airavata.api.error.ttypes.AiravataSystemException as ase:
            msg_type = TMessageType.REPLY
            result.ase = ase
        except 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 airavata.api.error.ttypes.InvalidRequestException as ire:
            msg_type = TMessageType.REPLY
            result.ire = ire
        except airavata.api.error.ttypes.AiravataClientException as ace:
            msg_type = TMessageType.REPLY
            result.ace = ace
        except airavata.api.error.ttypes.AiravataSystemException as ase:
            msg_type = TMessageType.REPLY
            result.ase = ase
        except 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 airavata.api.error.ttypes.InvalidRequestException as ire:
            msg_type = TMessageType.REPLY
            result.ire = ire
        except airavata.api.error.ttypes.AiravataClientException as ace:
            msg_type = TMessageType.REPLY
            result.ace = ace
        except airavata.api.error.ttypes.AiravataSystemException as ase:
            msg_type = TMessageType.REPLY
            result.ase = ase
        except 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 airavata.api.error.ttypes.InvalidRequestException as ire:
            msg_type = TMessageType.REPLY
            result.ire = ire
        except airavata.api.error.ttypes.AiravataClientException as ace:
            msg_type = TMessageType.REPLY
            result.ace = ace
        except airavata.api.error.ttypes.AiravataSystemException as ase:
            msg_type = TMessageType.REPLY
            result.ase = ase
        except 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 airavata.api.error.ttypes.InvalidRequestException as ire:
            msg_type = TMessageType.REPLY
            result.ire = ire
        except airavata.api.error.ttypes.AiravataClientException as ace:
            msg_type = TMessageType.REPLY
            result.ace = ace
        except airavata.api.error.ttypes.AiravataSystemException as ase:
            msg_type = TMessageType.REPLY
            result.ase = ase
        except 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 airavata.api.error.ttypes.InvalidRequestException as ire:
            msg_type = TMessageType.REPLY
            result.ire = ire
        except airavata.api.error.ttypes.AiravataClientException as ace:
            msg_type = TMessageType.REPLY
            result.ace = ace
        except airavata.api.error.ttypes.AiravataSystemException as ase:
            msg_type = TMessageType.REPLY
            result.ase = ase
        except 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 airavata.api.error.ttypes.InvalidRequestException as ire:
            msg_type = TMessageType.REPLY
            result.ire = ire
        except airavata.api.error.ttypes.AiravataClientException as ace:
            msg_type = TMessageType.REPLY
            result.ace = ace
        except airavata.api.error.ttypes.AiravataSystemException as ase:
            msg_type = TMessageType.REPLY
            result.ase = ase
        except 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 airavata.api.error.ttypes.InvalidRequestException as ire:
            msg_type = TMessageType.REPLY
            result.ire = ire
        except airavata.api.error.ttypes.AiravataClientException as ace:
            msg_type = TMessageType.REPLY
            result.ace = ace
        except airavata.api.error.ttypes.AiravataSystemException as ase:
            msg_type = TMessageType.REPLY
            result.ase = ase
        except 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 airavata.api.error.ttypes.InvalidRequestException as ire:
            msg_type = TMessageType.REPLY
            result.ire = ire
        except airavata.api.error.ttypes.AiravataClientException as ace:
            msg_type = TMessageType.REPLY
            result.ace = ace
        except airavata.api.error.ttypes.AiravataSystemException as ase:
            msg_type = TMessageType.REPLY
            result.ase = ase
        except 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 airavata.api.error.ttypes.InvalidRequestException as ire:
            msg_type = TMessageType.REPLY
            result.ire = ire
        except airavata.api.error.ttypes.AiravataClientException as ace:
            msg_type = TMessageType.REPLY
            result.ace = ace
        except airavata.api.error.ttypes.AiravataSystemException as ase:
            msg_type = TMessageType.REPLY
            result.ase = ase
        except 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 airavata.api.error.ttypes.InvalidRequestException as ire:
            msg_type = TMessageType.REPLY
            result.ire = ire
        except airavata.api.error.ttypes.AiravataClientException as ace:
            msg_type = TMessageType.REPLY
            result.ace = ace
        except airavata.api.error.ttypes.AiravataSystemException as ase:
            msg_type = TMessageType.REPLY
            result.ase = ase
        except 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 airavata.api.error.ttypes.InvalidRequestException as ire:
            msg_type = TMessageType.REPLY
            result.ire = ire
        except airavata.api.error.ttypes.AiravataClientException as ace:
            msg_type = TMessageType.REPLY
            result.ace = ace
        except airavata.api.error.ttypes.AiravataSystemException as ase:
            msg_type = TMessageType.REPLY
            result.ase = ase
        except 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 airavata.api.error.ttypes.InvalidRequestException as ire:
            msg_type = TMessageType.REPLY
            result.ire = ire
        except airavata.api.error.ttypes.AiravataClientException as ace:
            msg_type = TMessageType.REPLY
            result.ace = ace
        except airavata.api.error.ttypes.AiravataSystemException as ase:
            msg_type = TMessageType.REPLY
            result.ase = ase
        except 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 airavata.api.error.ttypes.InvalidRequestException as ire:
            msg_type = TMessageType.REPLY
            result.ire = ire
        except airavata.api.error.ttypes.AiravataClientException as ace:
            msg_type = TMessageType.REPLY
            result.ace = ace
        except airavata.api.error.ttypes.AiravataSystemException as ase:
            msg_type = TMessageType.REPLY
            result.ase = ase
        except 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 airavata.api.error.ttypes.InvalidRequestException as ire:
            msg_type = TMessageType.REPLY
            result.ire = ire
        except airavata.api.error.ttypes.AiravataClientException as ace:
            msg_type = TMessageType.REPLY
            result.ace = ace
        except airavata.api.error.ttypes.AiravataSystemException as ase:
            msg_type = TMessageType.REPLY
            result.ase = ase
        except 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 airavata.api.error.ttypes.InvalidRequestException as ire:
            msg_type = TMessageType.REPLY
            result.ire = ire
        except airavata.api.error.ttypes.AiravataClientException as ace:
            msg_type = TMessageType.REPLY
            result.ace = ace
        except airavata.api.error.ttypes.AiravataSystemException as ase:
            msg_type = TMessageType.REPLY
            result.ase = ase
        except 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 airavata.api.error.ttypes.InvalidRequestException as ire:
            msg_type = TMessageType.REPLY
            result.ire = ire
        except airavata.api.error.ttypes.AiravataClientException as ace:
            msg_type = TMessageType.REPLY
            result.ace = ace
        except airavata.api.error.ttypes.AiravataSystemException as ase:
            msg_type = TMessageType.REPLY
            result.ase = ase
        except 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 airavata.api.error.ttypes.InvalidRequestException as ire:
            msg_type = TMessageType.REPLY
            result.ire = ire
        except airavata.api.error.ttypes.AiravataClientException as ace:
            msg_type = TMessageType.REPLY
            result.ace = ace
        except airavata.api.error.ttypes.AiravataSystemException as ase:
            msg_type = TMessageType.REPLY
            result.ase = ase
        except 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 airavata.api.error.ttypes.InvalidRequestException as ire:
            msg_type = TMessageType.REPLY
            result.ire = ire
        except airavata.api.error.ttypes.AiravataClientException as ace:
            msg_type = TMessageType.REPLY
            result.ace = ace
        except airavata.api.error.ttypes.AiravataSystemException as ase:
            msg_type = TMessageType.REPLY
            result.ase = ase
        except 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 airavata.api.error.ttypes.InvalidRequestException as ire:
            msg_type = TMessageType.REPLY
            result.ire = ire
        except airavata.api.error.ttypes.AiravataClientException as ace:
            msg_type = TMessageType.REPLY
            result.ace = ace
        except airavata.api.error.ttypes.AiravataSystemException as ase:
            msg_type = TMessageType.REPLY
            result.ase = ase
        except 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_getSSHAccountProvisioners(self, seqid, iprot, oprot):
        args = getSSHAccountProvisioners_args()
        args.read(iprot)
        iprot.readMessageEnd()
        result = getSSHAccountProvisioners_result()
        try:
            result.success = self._handler.getSSHAccountProvisioners(args.authzToken)
            msg_type = TMessageType.REPLY
        except (TTransport.TTransportException, KeyboardInterrupt, SystemExit):
            raise
        except airavata.api.error.ttypes.InvalidRequestException as ire:
            msg_type = TMessageType.REPLY
            result.ire = ire
        except airavata.api.error.ttypes.AiravataClientException as ace:
            msg_type = TMessageType.REPLY
            result.ace = ace
        except airavata.api.error.ttypes.AiravataSystemException as ase:
            msg_type = TMessageType.REPLY
            result.ase = ase
        except 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("getSSHAccountProvisioners", msg_type, seqid)
        result.write(oprot)
        oprot.writeMessageEnd()
        oprot.trans.flush()

    def process_doesUserHaveSSHAccount(self, seqid, iprot, oprot):
        args = doesUserHaveSSHAccount_args()
        args.read(iprot)
        iprot.readMessageEnd()
        result = doesUserHaveSSHAccount_result()
        try:
            result.success = self._handler.doesUserHaveSSHAccount(args.authzToken, args.computeResourceId, args.userId)
            msg_type = TMessageType.REPLY
        except (TTransport.TTransportException, KeyboardInterrupt, SystemExit):
            raise
        except airavata.api.error.ttypes.InvalidRequestException as ire:
            msg_type = TMessageType.REPLY
            result.ire = ire
        except airavata.api.error.ttypes.AiravataClientException as ace:
            msg_type = TMessageType.REPLY
            result.ace = ace
        except airavata.api.error.ttypes.AiravataSystemException as ase:
            msg_type = TMessageType.REPLY
            result.ase = ase
        except 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("doesUserHaveSSHAccount", msg_type, seqid)
        result.write(oprot)
        oprot.writeMessageEnd()
        oprot.trans.flush()

    def process_isSSHSetupCompleteForUserComputeResourcePreference(self, seqid, iprot, oprot):
        args = isSSHSetupCompleteForUserComputeResourcePreference_args()
        args.read(iprot)
        iprot.readMessageEnd()
        result = isSSHSetupCompleteForUserComputeResourcePreference_result()
        try:
            result.success = self._handler.isSSHSetupCompleteForUserComputeResourcePreference(args.authzToken, args.computeResourceId, args.airavataCredStoreToken)
            msg_type = TMessageType.REPLY
        except (TTransport.TTransportException, KeyboardInterrupt, SystemExit):
            raise
        except airavata.api.error.ttypes.InvalidRequestException as ire:
            msg_type = TMessageType.REPLY
            result.ire = ire
        except airavata.api.error.ttypes.AiravataClientException as ace:
            msg_type = TMessageType.REPLY
            result.ace = ace
        except airavata.api.error.ttypes.AiravataSystemException as ase:
            msg_type = TMessageType.REPLY
            result.ase = ase
        except 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("isSSHSetupCompleteForUserComputeResourcePreference", msg_type, seqid)
        result.write(oprot)
        oprot.writeMessageEnd()
        oprot.trans.flush()

    def process_setupUserComputeResourcePreferencesForSSH(self, seqid, iprot, oprot):
        args = setupUserComputeResourcePreferencesForSSH_args()
        args.read(iprot)
        iprot.readMessageEnd()
        result = setupUserComputeResourcePreferencesForSSH_result()
        try:
            result.success = self._handler.setupUserComputeResourcePreferencesForSSH(args.authzToken, args.computeResourceId, args.userId, args.airavataCredStoreToken)
            msg_type = TMessageType.REPLY
        except (TTransport.TTransportException, KeyboardInterrupt, SystemExit):
            raise
        except airavata.api.error.ttypes.InvalidRequestException as ire:
            msg_type = TMessageType.REPLY
            result.ire = ire
        except airavata.api.error.ttypes.AiravataClientException as ace:
            msg_type = TMessageType.REPLY
            result.ace = ace
        except airavata.api.error.ttypes.AiravataSystemException as ase:
            msg_type = TMessageType.REPLY
            result.ase = ase
        except 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("setupUserComputeResourcePreferencesForSSH", 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 airavata.api.error.ttypes.InvalidRequestException as ire:
            msg_type = TMessageType.REPLY
            result.ire = ire
        except airavata.api.error.ttypes.AiravataClientException as ace:
            msg_type = TMessageType.REPLY
            result.ace = ace
        except airavata.api.error.ttypes.AiravataSystemException as ase:
            msg_type = TMessageType.REPLY
            result.ase = ase
        except 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_isUserResourceProfileExists(self, seqid, iprot, oprot):
        args = isUserResourceProfileExists_args()
        args.read(iprot)
        iprot.readMessageEnd()
        result = isUserResourceProfileExists_result()
        try:
            result.success = self._handler.isUserResourceProfileExists(args.authzToken, args.userId, args.gatewayID)
            msg_type = TMessageType.REPLY
        except (TTransport.TTransportException, KeyboardInterrupt, SystemExit):
            raise
        except airavata.api.error.ttypes.InvalidRequestException as ire:
            msg_type = TMessageType.REPLY
            result.ire = ire
        except airavata.api.error.ttypes.AiravataClientException as ace:
            msg_type = TMessageType.REPLY
            result.ace = ace
        except airavata.api.error.ttypes.AiravataSystemException as ase:
            msg_type = TMessageType.REPLY
            result.ase = ase
        except 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("isUserResourceProfileExists", 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 airavata.api.error.ttypes.InvalidRequestException as ire:
            msg_type = TMessageType.REPLY
            result.ire = ire
        except airavata.api.error.ttypes.AiravataClientException as ace:
            msg_type = TMessageType.REPLY
            result.ace = ace
        except airavata.api.error.ttypes.AiravataSystemException as ase:
            msg_type = TMessageType.REPLY
            result.ase = ase
        except 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 airavata.api.error.ttypes.InvalidRequestException as ire:
            msg_type = TMessageType.REPLY
            result.ire = ire
        except airavata.api.error.ttypes.AiravataClientException as ace:
            msg_type = TMessageType.REPLY
            result.ace = ace
        except airavata.api.error.ttypes.AiravataSystemException as ase:
            msg_type = TMessageType.REPLY
            result.ase = ase
        except 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 airavata.api.error.ttypes.InvalidRequestException as ire:
            msg_type = TMessageType.REPLY
            result.ire = ire
        except airavata.api.error.ttypes.AiravataClientException as ace:
            msg_type = TMessageType.REPLY
            result.ace = ace
        except airavata.api.error.ttypes.AiravataSystemException as ase:
            msg_type = TMessageType.REPLY
            result.ase = ase
        except 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 airavata.api.error.ttypes.InvalidRequestException as ire:
            msg_type = TMessageType.REPLY
            result.ire = ire
        except airavata.api.error.ttypes.AiravataClientException as ace:
            msg_type = TMessageType.REPLY
            result.ace = ace
        except airavata.api.error.ttypes.AiravataSystemException as ase:
            msg_type = TMessageType.REPLY
            result.ase = ase
        except 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 airavata.api.error.ttypes.InvalidRequestException as ire:
            msg_type = TMessageType.REPLY
            result.ire = ire
        except airavata.api.error.ttypes.AiravataClientException as ace:
            msg_type = TMessageType.REPLY
            result.ace = ace
        except airavata.api.error.ttypes.AiravataSystemException as ase:
            msg_type = TMessageType.REPLY
            result.ase = ase
        except 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 airavata.api.error.ttypes.InvalidRequestException as ire:
            msg_type = TMessageType.REPLY
            result.ire = ire
        except airavata.api.error.ttypes.AiravataClientException as ace:
            msg_type = TMessageType.REPLY
            result.ace = ace
        except airavata.api.error.ttypes.AiravataSystemException as ase:
            msg_type = TMessageType.REPLY
            result.ase = ase
        except 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 airavata.api.error.ttypes.InvalidRequestException as ire:
            msg_type = TMessageType.REPLY
            result.ire = ire
        except airavata.api.error.ttypes.AiravataClientException as ace:
            msg_type = TMessageType.REPLY
            result.ace = ace
        except airavata.api.error.ttypes.AiravataSystemException as ase:
            msg_type = TMessageType.REPLY
            result.ase = ase
        except 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 airavata.api.error.ttypes.InvalidRequestException as ire:
            msg_type = TMessageType.REPLY
            result.ire = ire
        except airavata.api.error.ttypes.AiravataClientException as ace:
            msg_type = TMessageType.REPLY
            result.ace = ace
        except airavata.api.error.ttypes.AiravataSystemException as ase:
            msg_type = TMessageType.REPLY
            result.ase = ase
        except 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 airavata.api.error.ttypes.InvalidRequestException as ire:
            msg_type = TMessageType.REPLY
            result.ire = ire
        except airavata.api.error.ttypes.AiravataClientException as ace:
            msg_type = TMessageType.REPLY
            result.ace = ace
        except airavata.api.error.ttypes.AiravataSystemException as ase:
            msg_type = TMessageType.REPLY
            result.ase = ase
        except 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 airavata.api.error.ttypes.InvalidRequestException as ire:
            msg_type = TMessageType.REPLY
            result.ire = ire
        except airavata.api.error.ttypes.AiravataClientException as ace:
            msg_type = TMessageType.REPLY
            result.ace = ace
        except airavata.api.error.ttypes.AiravataSystemException as ase:
            msg_type = TMessageType.REPLY
            result.ase = ase
        except 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 airavata.api.error.ttypes.InvalidRequestException as ire:
            msg_type = TMessageType.REPLY
            result.ire = ire
        except airavata.api.error.ttypes.AiravataClientException as ace:
            msg_type = TMessageType.REPLY
            result.ace = ace
        except airavata.api.error.ttypes.AiravataSystemException as ase:
            msg_type = TMessageType.REPLY
            result.ase = ase
        except 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 airavata.api.error.ttypes.InvalidRequestException as ire:
            msg_type = TMessageType.REPLY
            result.ire = ire
        except airavata.api.error.ttypes.AiravataClientException as ace:
            msg_type = TMessageType.REPLY
            result.ace = ace
        except airavata.api.error.ttypes.AiravataSystemException as ase:
            msg_type = TMessageType.REPLY
            result.ase = ase
        except 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 airavata.api.error.ttypes.InvalidRequestException as ire:
            msg_type = TMessageType.REPLY
            result.ire = ire
        except airavata.api.error.ttypes.AiravataClientException as ace:
            msg_type = TMessageType.REPLY
            result.ace = ace
        except airavata.api.error.ttypes.AiravataSystemException as ase:
            msg_type = TMessageType.REPLY
            result.ase = ase
        except 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 airavata.api.error.ttypes.InvalidRequestException as ire:
            msg_type = TMessageType.REPLY
            result.ire = ire
        except airavata.api.error.ttypes.AiravataClientException as ace:
            msg_type = TMessageType.REPLY
            result.ace = ace
        except airavata.api.error.ttypes.AiravataSystemException as ase:
            msg_type = TMessageType.REPLY
            result.ase = ase
        except 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_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 airavata.api.error.ttypes.InvalidRequestException as ire:
            msg_type = TMessageType.REPLY
            result.ire = ire
        except airavata.api.error.ttypes.AiravataClientException as ace:
            msg_type = TMessageType.REPLY
            result.ace = ace
        except airavata.api.error.ttypes.AiravataSystemException as ase:
            msg_type = TMessageType.REPLY
            result.ase = ase
        except 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_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 airavata.api.error.ttypes.InvalidRequestException as ire:
            msg_type = TMessageType.REPLY
            result.ire = ire
        except airavata.api.error.ttypes.AiravataClientException as ace:
            msg_type = TMessageType.REPLY
            result.ace = ace
        except airavata.api.error.ttypes.AiravataSystemException as ase:
            msg_type = TMessageType.REPLY
            result.ase = ase
        except 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 airavata.api.error.ttypes.InvalidRequestException as ire:
            msg_type = TMessageType.REPLY
            result.ire = ire
        except airavata.api.error.ttypes.AiravataClientException as ace:
            msg_type = TMessageType.REPLY
            result.ace = ace
        except airavata.api.error.ttypes.AiravataSystemException as ase:
            msg_type = TMessageType.REPLY
            result.ase = ase
        except 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 airavata.api.error.ttypes.InvalidRequestException as ire:
            msg_type = TMessageType.REPLY
            result.ire = ire
        except airavata.api.error.ttypes.AiravataClientException as ace:
            msg_type = TMessageType.REPLY
            result.ace = ace
        except airavata.api.error.ttypes.AiravataSystemException as ase:
            msg_type = TMessageType.REPLY
            result.ase = ase
        except 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 airavata.api.error.ttypes.InvalidRequestException as ire:
            msg_type = TMessageType.REPLY
            result.ire = ire
        except airavata.api.error.ttypes.AiravataClientException as ace:
            msg_type = TMessageType.REPLY
            result.ace = ace
        except airavata.api.error.ttypes.AiravataSystemException as ase:
            msg_type = TMessageType.REPLY
            result.ase = ase
        except 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 airavata.api.error.ttypes.InvalidRequestException as ire:
            msg_type = TMessageType.REPLY
            result.ire = ire
        except airavata.api.error.ttypes.AiravataClientException as ace:
            msg_type = TMessageType.REPLY
            result.ace = ace
        except airavata.api.error.ttypes.AiravataSystemException as ase:
            msg_type = TMessageType.REPLY
            result.ase = ase
        except 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.userPermissionList)
            msg_type = TMessageType.REPLY
        except (TTransport.TTransportException, KeyboardInterrupt, SystemExit):
            raise
        except airavata.api.error.ttypes.InvalidRequestException as ire:
            msg_type = TMessageType.REPLY
            result.ire = ire
        except airavata.api.error.ttypes.AiravataClientException as ace:
            msg_type = TMessageType.REPLY
            result.ace = ace
        except airavata.api.error.ttypes.AiravataSystemException as ase:
            msg_type = TMessageType.REPLY
            result.ase = ase
        except 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_shareResourceWithGroups(self, seqid, iprot, oprot):
        args = shareResourceWithGroups_args()
        args.read(iprot)
        iprot.readMessageEnd()
        result = shareResourceWithGroups_result()
        try:
            result.success = self._handler.shareResourceWithGroups(args.authzToken, args.resourceId, args.groupPermissionList)
            msg_type = TMessageType.REPLY
        except (TTransport.TTransportException, KeyboardInterrupt, SystemExit):
            raise
        except airavata.api.error.ttypes.InvalidRequestException as ire:
            msg_type = TMessageType.REPLY
            result.ire = ire
        except airavata.api.error.ttypes.AiravataClientException as ace:
            msg_type = TMessageType.REPLY
            result.ace = ace
        except airavata.api.error.ttypes.AiravataSystemException as ase:
            msg_type = TMessageType.REPLY
            result.ase = ase
        except 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("shareResourceWithGroups", 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.userPermissionList)
            msg_type = TMessageType.REPLY
        except (TTransport.TTransportException, KeyboardInterrupt, SystemExit):
            raise
        except airavata.api.error.ttypes.InvalidRequestException as ire:
            msg_type = TMessageType.REPLY
            result.ire = ire
        except airavata.api.error.ttypes.AiravataClientException as ace:
            msg_type = TMessageType.REPLY
            result.ace = ace
        except airavata.api.error.ttypes.AiravataSystemException as ase:
            msg_type = TMessageType.REPLY
            result.ase = ase
        except 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_revokeSharingOfResourceFromGroups(self, seqid, iprot, oprot):
        args = revokeSharingOfResourceFromGroups_args()
        args.read(iprot)
        iprot.readMessageEnd()
        result = revokeSharingOfResourceFromGroups_result()
        try:
            result.success = self._handler.revokeSharingOfResourceFromGroups(args.authzToken, args.resourceId, args.groupPermissionList)
            msg_type = TMessageType.REPLY
        except (TTransport.TTransportException, KeyboardInterrupt, SystemExit):
            raise
        except airavata.api.error.ttypes.InvalidRequestException as ire:
            msg_type = TMessageType.REPLY
            result.ire = ire
        except airavata.api.error.ttypes.AiravataClientException as ace:
            msg_type = TMessageType.REPLY
            result.ace = ace
        except airavata.api.error.ttypes.AiravataSystemException as ase:
            msg_type = TMessageType.REPLY
            result.ase = ase
        except 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("revokeSharingOfResourceFromGroups", 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.permissionType)
            msg_type = TMessageType.REPLY
        except (TTransport.TTransportException, KeyboardInterrupt, SystemExit):
            raise
        except airavata.api.error.ttypes.InvalidRequestException as ire:
            msg_type = TMessageType.REPLY
            result.ire = ire
        except airavata.api.error.ttypes.AiravataClientException as ace:
            msg_type = TMessageType.REPLY
            result.ace = ace
        except airavata.api.error.ttypes.AiravataSystemException as ase:
            msg_type = TMessageType.REPLY
            result.ase = ase
        except 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_getAllAccessibleGroups(self, seqid, iprot, oprot):
        args = getAllAccessibleGroups_args()
        args.read(iprot)
        iprot.readMessageEnd()
        result = getAllAccessibleGroups_result()
        try:
            result.success = self._handler.getAllAccessibleGroups(args.authzToken, args.resourceId, args.permissionType)
            msg_type = TMessageType.REPLY
        except (TTransport.TTransportException, KeyboardInterrupt, SystemExit):
            raise
        except airavata.api.error.ttypes.InvalidRequestException as ire:
            msg_type = TMessageType.REPLY
            result.ire = ire
        except airavata.api.error.ttypes.AiravataClientException as ace:
            msg_type = TMessageType.REPLY
            result.ace = ace
        except airavata.api.error.ttypes.AiravataSystemException as ase:
            msg_type = TMessageType.REPLY
            result.ase = ase
        except 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("getAllAccessibleGroups", msg_type, seqid)
        result.write(oprot)
        oprot.writeMessageEnd()
        oprot.trans.flush()

    def process_getAllDirectlyAccessibleUsers(self, seqid, iprot, oprot):
        args = getAllDirectlyAccessibleUsers_args()
        args.read(iprot)
        iprot.readMessageEnd()
        result = getAllDirectlyAccessibleUsers_result()
        try:
            result.success = self._handler.getAllDirectlyAccessibleUsers(args.authzToken, args.resourceId, args.permissionType)
            msg_type = TMessageType.REPLY
        except (TTransport.TTransportException, KeyboardInterrupt, SystemExit):
            raise
        except airavata.api.error.ttypes.InvalidRequestException as ire:
            msg_type = TMessageType.REPLY
            result.ire = ire
        except airavata.api.error.ttypes.AiravataClientException as ace:
            msg_type = TMessageType.REPLY
            result.ace = ace
        except airavata.api.error.ttypes.AiravataSystemException as ase:
            msg_type = TMessageType.REPLY
            result.ase = ase
        except 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("getAllDirectlyAccessibleUsers", msg_type, seqid)
        result.write(oprot)
        oprot.writeMessageEnd()
        oprot.trans.flush()

    def process_getAllDirectlyAccessibleGroups(self, seqid, iprot, oprot):
        args = getAllDirectlyAccessibleGroups_args()
        args.read(iprot)
        iprot.readMessageEnd()
        result = getAllDirectlyAccessibleGroups_result()
        try:
            result.success = self._handler.getAllDirectlyAccessibleGroups(args.authzToken, args.resourceId, args.permissionType)
            msg_type = TMessageType.REPLY
        except (TTransport.TTransportException, KeyboardInterrupt, SystemExit):
            raise
        except airavata.api.error.ttypes.InvalidRequestException as ire:
            msg_type = TMessageType.REPLY
            result.ire = ire
        except airavata.api.error.ttypes.AiravataClientException as ace:
            msg_type = TMessageType.REPLY
            result.ace = ace
        except airavata.api.error.ttypes.AiravataSystemException as ase:
            msg_type = TMessageType.REPLY
            result.ase = ase
        except 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("getAllDirectlyAccessibleGroups", msg_type, seqid)
        result.write(oprot)
        oprot.writeMessageEnd()
        oprot.trans.flush()

    def process_userHasAccess(self, seqid, iprot, oprot):
        args = userHasAccess_args()
        args.read(iprot)
        iprot.readMessageEnd()
        result = userHasAccess_result()
        try:
            result.success = self._handler.userHasAccess(args.authzToken, args.resourceId, args.permissionType)
            msg_type = TMessageType.REPLY
        except (TTransport.TTransportException, KeyboardInterrupt, SystemExit):
            raise
        except airavata.api.error.ttypes.InvalidRequestException as ire:
            msg_type = TMessageType.REPLY
            result.ire = ire
        except airavata.api.error.ttypes.AiravataClientException as ace:
            msg_type = TMessageType.REPLY
            result.ace = ace
        except airavata.api.error.ttypes.AiravataSystemException as ase:
            msg_type = TMessageType.REPLY
            result.ase = ase
        except 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("userHasAccess", msg_type, seqid)
        result.write(oprot)
        oprot.writeMessageEnd()
        oprot.trans.flush()

    def process_createGroupResourceProfile(self, seqid, iprot, oprot):
        args = createGroupResourceProfile_args()
        args.read(iprot)
        iprot.readMessageEnd()
        result = createGroupResourceProfile_result()
        try:
            result.success = self._handler.createGroupResourceProfile(args.authzToken, args.groupResourceProfile)
            msg_type = TMessageType.REPLY
        except (TTransport.TTransportException, KeyboardInterrupt, SystemExit):
            raise
        except airavata.api.error.ttypes.InvalidRequestException as ire:
            msg_type = TMessageType.REPLY
            result.ire = ire
        except airavata.api.error.ttypes.AiravataClientException as ace:
            msg_type = TMessageType.REPLY
            result.ace = ace
        except airavata.api.error.ttypes.AiravataSystemException as ase:
            msg_type = TMessageType.REPLY
            result.ase = ase
        except 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("createGroupResourceProfile", msg_type, seqid)
        result.write(oprot)
        oprot.writeMessageEnd()
        oprot.trans.flush()

    def process_updateGroupResourceProfile(self, seqid, iprot, oprot):
        args = updateGroupResourceProfile_args()
        args.read(iprot)
        iprot.readMessageEnd()
        result = updateGroupResourceProfile_result()
        try:
            self._handler.updateGroupResourceProfile(args.authzToken, args.groupResourceProfile)
            msg_type = TMessageType.REPLY
        except (TTransport.TTransportException, KeyboardInterrupt, SystemExit):
            raise
        except airavata.api.error.ttypes.InvalidRequestException as ire:
            msg_type = TMessageType.REPLY
            result.ire = ire
        except airavata.api.error.ttypes.AiravataClientException as ace:
            msg_type = TMessageType.REPLY
            result.ace = ace
        except airavata.api.error.ttypes.AiravataSystemException as ase:
            msg_type = TMessageType.REPLY
            result.ase = ase
        except 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("updateGroupResourceProfile", msg_type, seqid)
        result.write(oprot)
        oprot.writeMessageEnd()
        oprot.trans.flush()

    def process_getGroupResourceProfile(self, seqid, iprot, oprot):
        args = getGroupResourceProfile_args()
        args.read(iprot)
        iprot.readMessageEnd()
        result = getGroupResourceProfile_result()
        try:
            result.success = self._handler.getGroupResourceProfile(args.authzToken, args.groupResourceProfileId)
            msg_type = TMessageType.REPLY
        except (TTransport.TTransportException, KeyboardInterrupt, SystemExit):
            raise
        except airavata.api.error.ttypes.InvalidRequestException as ire:
            msg_type = TMessageType.REPLY
            result.ire = ire
        except airavata.api.error.ttypes.AiravataClientException as ace:
            msg_type = TMessageType.REPLY
            result.ace = ace
        except airavata.api.error.ttypes.AiravataSystemException as ase:
            msg_type = TMessageType.REPLY
            result.ase = ase
        except 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("getGroupResourceProfile", msg_type, seqid)
        result.write(oprot)
        oprot.writeMessageEnd()
        oprot.trans.flush()

    def process_removeGroupResourceProfile(self, seqid, iprot, oprot):
        args = removeGroupResourceProfile_args()
        args.read(iprot)
        iprot.readMessageEnd()
        result = removeGroupResourceProfile_result()
        try:
            result.success = self._handler.removeGroupResourceProfile(args.authzToken, args.groupResourceProfileId)
            msg_type = TMessageType.REPLY
        except (TTransport.TTransportException, KeyboardInterrupt, SystemExit):
            raise
        except airavata.api.error.ttypes.InvalidRequestException as ire:
            msg_type = TMessageType.REPLY
            result.ire = ire
        except airavata.api.error.ttypes.AiravataClientException as ace:
            msg_type = TMessageType.REPLY
            result.ace = ace
        except airavata.api.error.ttypes.AiravataSystemException as ase:
            msg_type = TMessageType.REPLY
            result.ase = ase
        except 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("removeGroupResourceProfile", msg_type, seqid)
        result.write(oprot)
        oprot.writeMessageEnd()
        oprot.trans.flush()

    def process_getGroupResourceList(self, seqid, iprot, oprot):
        args = getGroupResourceList_args()
        args.read(iprot)
        iprot.readMessageEnd()
        result = getGroupResourceList_result()
        try:
            result.success = self._handler.getGroupResourceList(args.authzToken, args.gatewayId)
            msg_type = TMessageType.REPLY
        except (TTransport.TTransportException, KeyboardInterrupt, SystemExit):
            raise
        except airavata.api.error.ttypes.InvalidRequestException as ire:
            msg_type = TMessageType.REPLY
            result.ire = ire
        except airavata.api.error.ttypes.AiravataClientException as ace:
            msg_type = TMessageType.REPLY
            result.ace = ace
        except airavata.api.error.ttypes.AiravataSystemException as ase:
            msg_type = TMessageType.REPLY
            result.ase = ase
        except 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("getGroupResourceList", msg_type, seqid)
        result.write(oprot)
        oprot.writeMessageEnd()
        oprot.trans.flush()

    def process_removeGroupComputePrefs(self, seqid, iprot, oprot):
        args = removeGroupComputePrefs_args()
        args.read(iprot)
        iprot.readMessageEnd()
        result = removeGroupComputePrefs_result()
        try:
            result.success = self._handler.removeGroupComputePrefs(args.authzToken, args.computeResourceId, args.groupResourceProfileId)
            msg_type = TMessageType.REPLY
        except (TTransport.TTransportException, KeyboardInterrupt, SystemExit):
            raise
        except airavata.api.error.ttypes.InvalidRequestException as ire:
            msg_type = TMessageType.REPLY
            result.ire = ire
        except airavata.api.error.ttypes.AiravataClientException as ace:
            msg_type = TMessageType.REPLY
            result.ace = ace
        except airavata.api.error.ttypes.AiravataSystemException as ase:
            msg_type = TMessageType.REPLY
            result.ase = ase
        except 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("removeGroupComputePrefs", msg_type, seqid)
        result.write(oprot)
        oprot.writeMessageEnd()
        oprot.trans.flush()

    def process_removeGroupComputeResourcePolicy(self, seqid, iprot, oprot):
        args = removeGroupComputeResourcePolicy_args()
        args.read(iprot)
        iprot.readMessageEnd()
        result = removeGroupComputeResourcePolicy_result()
        try:
            result.success = self._handler.removeGroupComputeResourcePolicy(args.authzToken, args.resourcePolicyId)
            msg_type = TMessageType.REPLY
        except (TTransport.TTransportException, KeyboardInterrupt, SystemExit):
            raise
        except airavata.api.error.ttypes.InvalidRequestException as ire:
            msg_type = TMessageType.REPLY
            result.ire = ire
        except airavata.api.error.ttypes.AiravataClientException as ace:
            msg_type = TMessageType.REPLY
            result.ace = ace
        except airavata.api.error.ttypes.AiravataSystemException as ase:
            msg_type = TMessageType.REPLY
            result.ase = ase
        except 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("removeGroupComputeResourcePolicy", msg_type, seqid)
        result.write(oprot)
        oprot.writeMessageEnd()
        oprot.trans.flush()

    def process_removeGroupBatchQueueResourcePolicy(self, seqid, iprot, oprot):
        args = removeGroupBatchQueueResourcePolicy_args()
        args.read(iprot)
        iprot.readMessageEnd()
        result = removeGroupBatchQueueResourcePolicy_result()
        try:
            result.success = self._handler.removeGroupBatchQueueResourcePolicy(args.authzToken, args.resourcePolicyId)
            msg_type = TMessageType.REPLY
        except (TTransport.TTransportException, KeyboardInterrupt, SystemExit):
            raise
        except airavata.api.error.ttypes.InvalidRequestException as ire:
            msg_type = TMessageType.REPLY
            result.ire = ire
        except airavata.api.error.ttypes.AiravataClientException as ace:
            msg_type = TMessageType.REPLY
            result.ace = ace
        except airavata.api.error.ttypes.AiravataSystemException as ase:
            msg_type = TMessageType.REPLY
            result.ase = ase
        except 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("removeGroupBatchQueueResourcePolicy", msg_type, seqid)
        result.write(oprot)
        oprot.writeMessageEnd()
        oprot.trans.flush()

    def process_getGroupComputeResourcePreference(self, seqid, iprot, oprot):
        args = getGroupComputeResourcePreference_args()
        args.read(iprot)
        iprot.readMessageEnd()
        result = getGroupComputeResourcePreference_result()
        try:
            result.success = self._handler.getGroupComputeResourcePreference(args.authzToken, args.computeResourceId, args.groupResourceProfileId)
            msg_type = TMessageType.REPLY
        except (TTransport.TTransportException, KeyboardInterrupt, SystemExit):
            raise
        except airavata.api.error.ttypes.InvalidRequestException as ire:
            msg_type = TMessageType.REPLY
            result.ire = ire
        except airavata.api.error.ttypes.AiravataClientException as ace:
            msg_type = TMessageType.REPLY
            result.ace = ace
        except airavata.api.error.ttypes.AiravataSystemException as ase:
            msg_type = TMessageType.REPLY
            result.ase = ase
        except 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("getGroupComputeResourcePreference", msg_type, seqid)
        result.write(oprot)
        oprot.writeMessageEnd()
        oprot.trans.flush()

    def process_getGroupComputeResourcePolicy(self, seqid, iprot, oprot):
        args = getGroupComputeResourcePolicy_args()
        args.read(iprot)
        iprot.readMessageEnd()
        result = getGroupComputeResourcePolicy_result()
        try:
            result.success = self._handler.getGroupComputeResourcePolicy(args.authzToken, args.resourcePolicyId)
            msg_type = TMessageType.REPLY
        except (TTransport.TTransportException, KeyboardInterrupt, SystemExit):
            raise
        except airavata.api.error.ttypes.InvalidRequestException as ire:
            msg_type = TMessageType.REPLY
            result.ire = ire
        except airavata.api.error.ttypes.AiravataClientException as ace:
            msg_type = TMessageType.REPLY
            result.ace = ace
        except airavata.api.error.ttypes.AiravataSystemException as ase:
            msg_type = TMessageType.REPLY
            result.ase = ase
        except 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("getGroupComputeResourcePolicy", msg_type, seqid)
        result.write(oprot)
        oprot.writeMessageEnd()
        oprot.trans.flush()

    def process_getBatchQueueResourcePolicy(self, seqid, iprot, oprot):
        args = getBatchQueueResourcePolicy_args()
        args.read(iprot)
        iprot.readMessageEnd()
        result = getBatchQueueResourcePolicy_result()
        try:
            result.success = self._handler.getBatchQueueResourcePolicy(args.authzToken, args.resourcePolicyId)
            msg_type = TMessageType.REPLY
        except (TTransport.TTransportException, KeyboardInterrupt, SystemExit):
            raise
        except airavata.api.error.ttypes.InvalidRequestException as ire:
            msg_type = TMessageType.REPLY
            result.ire = ire
        except airavata.api.error.ttypes.AiravataClientException as ace:
            msg_type = TMessageType.REPLY
            result.ace = ace
        except airavata.api.error.ttypes.AiravataSystemException as ase:
            msg_type = TMessageType.REPLY
            result.ase = ase
        except 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("getBatchQueueResourcePolicy", msg_type, seqid)
        result.write(oprot)
        oprot.writeMessageEnd()
        oprot.trans.flush()

    def process_getGroupComputeResourcePrefList(self, seqid, iprot, oprot):
        args = getGroupComputeResourcePrefList_args()
        args.read(iprot)
        iprot.readMessageEnd()
        result = getGroupComputeResourcePrefList_result()
        try:
            result.success = self._handler.getGroupComputeResourcePrefList(args.authzToken, args.groupResourceProfileId)
            msg_type = TMessageType.REPLY
        except (TTransport.TTransportException, KeyboardInterrupt, SystemExit):
            raise
        except airavata.api.error.ttypes.InvalidRequestException as ire:
            msg_type = TMessageType.REPLY
            result.ire = ire
        except airavata.api.error.ttypes.AiravataClientException as ace:
            msg_type = TMessageType.REPLY
            result.ace = ace
        except airavata.api.error.ttypes.AiravataSystemException as ase:
            msg_type = TMessageType.REPLY
            result.ase = ase
        except 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("getGroupComputeResourcePrefList", msg_type, seqid)
        result.write(oprot)
        oprot.writeMessageEnd()
        oprot.trans.flush()

    def process_getGroupBatchQueueResourcePolicyList(self, seqid, iprot, oprot):
        args = getGroupBatchQueueResourcePolicyList_args()
        args.read(iprot)
        iprot.readMessageEnd()
        result = getGroupBatchQueueResourcePolicyList_result()
        try:
            result.success = self._handler.getGroupBatchQueueResourcePolicyList(args.authzToken, args.groupResourceProfileId)
            msg_type = TMessageType.REPLY
        except (TTransport.TTransportException, KeyboardInterrupt, SystemExit):
            raise
        except airavata.api.error.ttypes.InvalidRequestException as ire:
            msg_type = TMessageType.REPLY
            result.ire = ire
        except airavata.api.error.ttypes.AiravataClientException as ace:
            msg_type = TMessageType.REPLY
            result.ace = ace
        except airavata.api.error.ttypes.AiravataSystemException as ase:
            msg_type = TMessageType.REPLY
            result.ase = ase
        except 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("getGroupBatchQueueResourcePolicyList", msg_type, seqid)
        result.write(oprot)
        oprot.writeMessageEnd()
        oprot.trans.flush()

    def process_getGroupComputeResourcePolicyList(self, seqid, iprot, oprot):
        args = getGroupComputeResourcePolicyList_args()
        args.read(iprot)
        iprot.readMessageEnd()
        result = getGroupComputeResourcePolicyList_result()
        try:
            result.success = self._handler.getGroupComputeResourcePolicyList(args.authzToken, args.groupResourceProfileId)
            msg_type = TMessageType.REPLY
        except (TTransport.TTransportException, KeyboardInterrupt, SystemExit):
            raise
        except airavata.api.error.ttypes.InvalidRequestException as ire:
            msg_type = TMessageType.REPLY
            result.ire = ire
        except airavata.api.error.ttypes.AiravataClientException as ace:
            msg_type = TMessageType.REPLY
            result.ace = ace
        except airavata.api.error.ttypes.AiravataSystemException as ase:
            msg_type = TMessageType.REPLY
            result.ase = ase
        except 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("getGroupComputeResourcePolicyList", msg_type, seqid)
        result.write(oprot)
        oprot.writeMessageEnd()
        oprot.trans.flush()

    def process_getGatewayGroups(self, seqid, iprot, oprot):
        args = getGatewayGroups_args()
        args.read(iprot)
        iprot.readMessageEnd()
        result = getGatewayGroups_result()
        try:
            result.success = self._handler.getGatewayGroups(args.authzToken)
            msg_type = TMessageType.REPLY
        except (TTransport.TTransportException, KeyboardInterrupt, SystemExit):
            raise
        except airavata.api.error.ttypes.InvalidRequestException as ire:
            msg_type = TMessageType.REPLY
            result.ire = ire
        except airavata.api.error.ttypes.AiravataClientException as ace:
            msg_type = TMessageType.REPLY
            result.ace = ace
        except airavata.api.error.ttypes.AiravataSystemException as ase:
            msg_type = TMessageType.REPLY
            result.ase = ase
        except 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("getGatewayGroups", msg_type, seqid)
        result.write(oprot)
        oprot.writeMessageEnd()
        oprot.trans.flush()

    def process_getParser(self, seqid, iprot, oprot):
        args = getParser_args()
        args.read(iprot)
        iprot.readMessageEnd()
        result = getParser_result()
        try:
            result.success = self._handler.getParser(args.authzToken, args.parserId, args.gatewayId)
            msg_type = TMessageType.REPLY
        except (TTransport.TTransportException, KeyboardInterrupt, SystemExit):
            raise
        except airavata.api.error.ttypes.InvalidRequestException as ire:
            msg_type = TMessageType.REPLY
            result.ire = ire
        except airavata.api.error.ttypes.AiravataClientException as ace:
            msg_type = TMessageType.REPLY
            result.ace = ace
        except airavata.api.error.ttypes.AiravataSystemException as ase:
            msg_type = TMessageType.REPLY
            result.ase = ase
        except 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("getParser", msg_type, seqid)
        result.write(oprot)
        oprot.writeMessageEnd()
        oprot.trans.flush()

    def process_saveParser(self, seqid, iprot, oprot):
        args = saveParser_args()
        args.read(iprot)
        iprot.readMessageEnd()
        result = saveParser_result()
        try:
            result.success = self._handler.saveParser(args.authzToken, args.parser)
            msg_type = TMessageType.REPLY
        except (TTransport.TTransportException, KeyboardInterrupt, SystemExit):
            raise
        except airavata.api.error.ttypes.InvalidRequestException as ire:
            msg_type = TMessageType.REPLY
            result.ire = ire
        except airavata.api.error.ttypes.AiravataClientException as ace:
            msg_type = TMessageType.REPLY
            result.ace = ace
        except airavata.api.error.ttypes.AiravataSystemException as ase:
            msg_type = TMessageType.REPLY
            result.ase = ase
        except 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("saveParser", msg_type, seqid)
        result.write(oprot)
        oprot.writeMessageEnd()
        oprot.trans.flush()

    def process_listAllParsers(self, seqid, iprot, oprot):
        args = listAllParsers_args()
        args.read(iprot)
        iprot.readMessageEnd()
        result = listAllParsers_result()
        try:
            result.success = self._handler.listAllParsers(args.authzToken, args.gatewayId)
            msg_type = TMessageType.REPLY
        except (TTransport.TTransportException, KeyboardInterrupt, SystemExit):
            raise
        except airavata.api.error.ttypes.InvalidRequestException as ire:
            msg_type = TMessageType.REPLY
            result.ire = ire
        except airavata.api.error.ttypes.AiravataClientException as ace:
            msg_type = TMessageType.REPLY
            result.ace = ace
        except airavata.api.error.ttypes.AiravataSystemException as ase:
            msg_type = TMessageType.REPLY
            result.ase = ase
        except 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("listAllParsers", msg_type, seqid)
        result.write(oprot)
        oprot.writeMessageEnd()
        oprot.trans.flush()

    def process_removeParser(self, seqid, iprot, oprot):
        args = removeParser_args()
        args.read(iprot)
        iprot.readMessageEnd()
        result = removeParser_result()
        try:
            result.success = self._handler.removeParser(args.authzToken, args.parserId, args.gatewayId)
            msg_type = TMessageType.REPLY
        except (TTransport.TTransportException, KeyboardInterrupt, SystemExit):
            raise
        except airavata.api.error.ttypes.InvalidRequestException as ire:
            msg_type = TMessageType.REPLY
            result.ire = ire
        except airavata.api.error.ttypes.AiravataClientException as ace:
            msg_type = TMessageType.REPLY
            result.ace = ace
        except airavata.api.error.ttypes.AiravataSystemException as ase:
            msg_type = TMessageType.REPLY
            result.ase = ase
        except 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("removeParser", msg_type, seqid)
        result.write(oprot)
        oprot.writeMessageEnd()
        oprot.trans.flush()

    def process_getParsingTemplate(self, seqid, iprot, oprot):
        args = getParsingTemplate_args()
        args.read(iprot)
        iprot.readMessageEnd()
        result = getParsingTemplate_result()
        try:
            result.success = self._handler.getParsingTemplate(args.authzToken, args.templateId, args.gatewayId)
            msg_type = TMessageType.REPLY
        except (TTransport.TTransportException, KeyboardInterrupt, SystemExit):
            raise
        except airavata.api.error.ttypes.InvalidRequestException as ire:
            msg_type = TMessageType.REPLY
            result.ire = ire
        except airavata.api.error.ttypes.AiravataClientException as ace:
            msg_type = TMessageType.REPLY
            result.ace = ace
        except airavata.api.error.ttypes.AiravataSystemException as ase:
            msg_type = TMessageType.REPLY
            result.ase = ase
        except 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("getParsingTemplate", msg_type, seqid)
        result.write(oprot)
        oprot.writeMessageEnd()
        oprot.trans.flush()

    def process_getParsingTemplatesForExperiment(self, seqid, iprot, oprot):
        args = getParsingTemplatesForExperiment_args()
        args.read(iprot)
        iprot.readMessageEnd()
        result = getParsingTemplatesForExperiment_result()
        try:
            result.success = self._handler.getParsingTemplatesForExperiment(args.authzToken, args.experimentId, args.gatewayId)
            msg_type = TMessageType.REPLY
        except (TTransport.TTransportException, KeyboardInterrupt, SystemExit):
            raise
        except airavata.api.error.ttypes.InvalidRequestException as ire:
            msg_type = TMessageType.REPLY
            result.ire = ire
        except airavata.api.error.ttypes.AiravataClientException as ace:
            msg_type = TMessageType.REPLY
            result.ace = ace
        except airavata.api.error.ttypes.AiravataSystemException as ase:
            msg_type = TMessageType.REPLY
            result.ase = ase
        except 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("getParsingTemplatesForExperiment", msg_type, seqid)
        result.write(oprot)
        oprot.writeMessageEnd()
        oprot.trans.flush()

    def process_saveParsingTemplate(self, seqid, iprot, oprot):
        args = saveParsingTemplate_args()
        args.read(iprot)
        iprot.readMessageEnd()
        result = saveParsingTemplate_result()
        try:
            result.success = self._handler.saveParsingTemplate(args.authzToken, args.parsingTemplate)
            msg_type = TMessageType.REPLY
        except (TTransport.TTransportException, KeyboardInterrupt, SystemExit):
            raise
        except airavata.api.error.ttypes.InvalidRequestException as ire:
            msg_type = TMessageType.REPLY
            result.ire = ire
        except airavata.api.error.ttypes.AiravataClientException as ace:
            msg_type = TMessageType.REPLY
            result.ace = ace
        except airavata.api.error.ttypes.AiravataSystemException as ase:
            msg_type = TMessageType.REPLY
            result.ase = ase
        except 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("saveParsingTemplate", msg_type, seqid)
        result.write(oprot)
        oprot.writeMessageEnd()
        oprot.trans.flush()

    def process_removeParsingTemplate(self, seqid, iprot, oprot):
        args = removeParsingTemplate_args()
        args.read(iprot)
        iprot.readMessageEnd()
        result = removeParsingTemplate_result()
        try:
            result.success = self._handler.removeParsingTemplate(args.authzToken, args.templateId, args.gatewayId)
            msg_type = TMessageType.REPLY
        except (TTransport.TTransportException, KeyboardInterrupt, SystemExit):
            raise
        except airavata.api.error.ttypes.InvalidRequestException as ire:
            msg_type = TMessageType.REPLY
            result.ire = ire
        except airavata.api.error.ttypes.AiravataClientException as ace:
            msg_type = TMessageType.REPLY
            result.ace = ace
        except airavata.api.error.ttypes.AiravataSystemException as ase:
            msg_type = TMessageType.REPLY
            result.ase = ase
        except 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("removeParsingTemplate", msg_type, seqid)
        result.write(oprot)
        oprot.writeMessageEnd()
        oprot.trans.flush()

    def process_listAllParsingTemplates(self, seqid, iprot, oprot):
        args = listAllParsingTemplates_args()
        args.read(iprot)
        iprot.readMessageEnd()
        result = listAllParsingTemplates_result()
        try:
            result.success = self._handler.listAllParsingTemplates(args.authzToken, args.gatewayId)
            msg_type = TMessageType.REPLY
        except (TTransport.TTransportException, KeyboardInterrupt, SystemExit):
            raise
        except airavata.api.error.ttypes.InvalidRequestException as ire:
            msg_type = TMessageType.REPLY
            result.ire = ire
        except airavata.api.error.ttypes.AiravataClientException as ace:
            msg_type = TMessageType.REPLY
            result.ace = ace
        except airavata.api.error.ttypes.AiravataSystemException as ase:
            msg_type = TMessageType.REPLY
            result.ase = ase
        except 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("listAllParsingTemplates", msg_type, seqid)
        result.write(oprot)
        oprot.writeMessageEnd()
        oprot.trans.flush()

# HELPER FUNCTIONS AND STRUCTURES


class isUserExists_args(object):
    """
    Attributes:
     - authzToken
     - gatewayId
     - userName
    """

    thrift_spec = (
        None,  # 0
        (1, TType.STRUCT, 'authzToken', (airavata.model.security.ttypes.AuthzToken, 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 = 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', (airavata.api.error.ttypes.InvalidRequestException, airavata.api.error.ttypes.InvalidRequestException.thrift_spec), None, ),  # 1
        (2, TType.STRUCT, 'ace', (airavata.api.error.ttypes.AiravataClientException, airavata.api.error.ttypes.AiravataClientException.thrift_spec), None, ),  # 2
        (3, TType.STRUCT, 'ase', (airavata.api.error.ttypes.AiravataSystemException, airavata.api.error.ttypes.AiravataSystemException.thrift_spec), None, ),  # 3
        (4, TType.STRUCT, 'ae', (airavata.api.error.ttypes.AuthorizationException, 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 = airavata.api.error.ttypes.InvalidRequestException()
                    self.ire.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 2:
                if ftype == TType.STRUCT:
                    self.ace = airavata.api.error.ttypes.AiravataClientException()
                    self.ace.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 3:
                if ftype == TType.STRUCT:
                    self.ase = airavata.api.error.ttypes.AiravataSystemException()
                    self.ase.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 4:
                if ftype == TType.STRUCT:
                    self.ae = 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', (airavata.model.security.ttypes.AuthzToken, airavata.model.security.ttypes.AuthzToken.thrift_spec), None, ),  # 1
        (2, TType.STRUCT, 'gateway', (airavata.model.workspace.ttypes.Gateway, 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 = airavata.model.security.ttypes.AuthzToken()
                    self.authzToken.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 2:
                if ftype == TType.STRUCT:
                    self.gateway = 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', (airavata.api.error.ttypes.InvalidRequestException, airavata.api.error.ttypes.InvalidRequestException.thrift_spec), None, ),  # 1
        (2, TType.STRUCT, 'ace', (airavata.api.error.ttypes.AiravataClientException, airavata.api.error.ttypes.AiravataClientException.thrift_spec), None, ),  # 2
        (3, TType.STRUCT, 'ase', (airavata.api.error.ttypes.AiravataSystemException, airavata.api.error.ttypes.AiravataSystemException.thrift_spec), None, ),  # 3
        (4, TType.STRUCT, 'ae', (airavata.api.error.ttypes.AuthorizationException, 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 = airavata.api.error.ttypes.InvalidRequestException()
                    self.ire.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 2:
                if ftype == TType.STRUCT:
                    self.ace = airavata.api.error.ttypes.AiravataClientException()
                    self.ace.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 3:
                if ftype == TType.STRUCT:
                    self.ase = airavata.api.error.ttypes.AiravataSystemException()
                    self.ase.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 4:
                if ftype == TType.STRUCT:
                    self.ae = 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', (airavata.model.security.ttypes.AuthzToken, 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 = 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', (airavata.api.error.ttypes.InvalidRequestException, airavata.api.error.ttypes.InvalidRequestException.thrift_spec), None, ),  # 1
        (2, TType.STRUCT, 'ace', (airavata.api.error.ttypes.AiravataClientException, airavata.api.error.ttypes.AiravataClientException.thrift_spec), None, ),  # 2
        (3, TType.STRUCT, 'ase', (airavata.api.error.ttypes.AiravataSystemException, airavata.api.error.ttypes.AiravataSystemException.thrift_spec), None, ),  # 3
        (4, TType.STRUCT, 'ae', (airavata.api.error.ttypes.AuthorizationException, 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 = airavata.api.error.ttypes.InvalidRequestException()
                    self.ire.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 2:
                if ftype == TType.STRUCT:
                    self.ace = airavata.api.error.ttypes.AiravataClientException()
                    self.ace.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 3:
                if ftype == TType.STRUCT:
                    self.ase = airavata.api.error.ttypes.AiravataSystemException()
                    self.ase.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 4:
                if ftype == TType.STRUCT:
                    self.ae = 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', (airavata.model.security.ttypes.AuthzToken, airavata.model.security.ttypes.AuthzToken.thrift_spec), None, ),  # 1
        (2, TType.STRING, 'gatewayId', 'UTF8', None, ),  # 2
        (3, TType.STRUCT, 'updatedGateway', (airavata.model.workspace.ttypes.Gateway, 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 = 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 = 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', (airavata.api.error.ttypes.InvalidRequestException, airavata.api.error.ttypes.InvalidRequestException.thrift_spec), None, ),  # 1
        (2, TType.STRUCT, 'ace', (airavata.api.error.ttypes.AiravataClientException, airavata.api.error.ttypes.AiravataClientException.thrift_spec), None, ),  # 2
        (3, TType.STRUCT, 'ase', (airavata.api.error.ttypes.AiravataSystemException, airavata.api.error.ttypes.AiravataSystemException.thrift_spec), None, ),  # 3
        (4, TType.STRUCT, 'ae', (airavata.api.error.ttypes.AuthorizationException, 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 = airavata.api.error.ttypes.InvalidRequestException()
                    self.ire.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 2:
                if ftype == TType.STRUCT:
                    self.ace = airavata.api.error.ttypes.AiravataClientException()
                    self.ace.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 3:
                if ftype == TType.STRUCT:
                    self.ase = airavata.api.error.ttypes.AiravataSystemException()
                    self.ase.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 4:
                if ftype == TType.STRUCT:
                    self.ae = 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', (airavata.model.security.ttypes.AuthzToken, 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 = 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', (airavata.model.workspace.ttypes.Gateway, airavata.model.workspace.ttypes.Gateway.thrift_spec), None, ),  # 0
        (1, TType.STRUCT, 'ire', (airavata.api.error.ttypes.InvalidRequestException, airavata.api.error.ttypes.InvalidRequestException.thrift_spec), None, ),  # 1
        (2, TType.STRUCT, 'ace', (airavata.api.error.ttypes.AiravataClientException, airavata.api.error.ttypes.AiravataClientException.thrift_spec), None, ),  # 2
        (3, TType.STRUCT, 'ase', (airavata.api.error.ttypes.AiravataSystemException, airavata.api.error.ttypes.AiravataSystemException.thrift_spec), None, ),  # 3
        (4, TType.STRUCT, 'ae', (airavata.api.error.ttypes.AuthorizationException, 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 = airavata.model.workspace.ttypes.Gateway()
                    self.success.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 1:
                if ftype == TType.STRUCT:
                    self.ire = airavata.api.error.ttypes.InvalidRequestException()
                    self.ire.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 2:
                if ftype == TType.STRUCT:
                    self.ace = airavata.api.error.ttypes.AiravataClientException()
                    self.ace.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 3:
                if ftype == TType.STRUCT:
                    self.ase = airavata.api.error.ttypes.AiravataSystemException()
                    self.ase.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 4:
                if ftype == TType.STRUCT:
                    self.ae = 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', (airavata.model.security.ttypes.AuthzToken, 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 = 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', (airavata.api.error.ttypes.InvalidRequestException, airavata.api.error.ttypes.InvalidRequestException.thrift_spec), None, ),  # 1
        (2, TType.STRUCT, 'ace', (airavata.api.error.ttypes.AiravataClientException, airavata.api.error.ttypes.AiravataClientException.thrift_spec), None, ),  # 2
        (3, TType.STRUCT, 'ase', (airavata.api.error.ttypes.AiravataSystemException, airavata.api.error.ttypes.AiravataSystemException.thrift_spec), None, ),  # 3
        (4, TType.STRUCT, 'ae', (airavata.api.error.ttypes.AuthorizationException, 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 = airavata.api.error.ttypes.InvalidRequestException()
                    self.ire.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 2:
                if ftype == TType.STRUCT:
                    self.ace = airavata.api.error.ttypes.AiravataClientException()
                    self.ace.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 3:
                if ftype == TType.STRUCT:
                    self.ase = airavata.api.error.ttypes.AiravataSystemException()
                    self.ase.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 4:
                if ftype == TType.STRUCT:
                    self.ae = 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', (airavata.model.security.ttypes.AuthzToken, 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 = 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, (airavata.model.workspace.ttypes.Gateway, airavata.model.workspace.ttypes.Gateway.thrift_spec), False), None, ),  # 0
        (1, TType.STRUCT, 'ire', (airavata.api.error.ttypes.InvalidRequestException, airavata.api.error.ttypes.InvalidRequestException.thrift_spec), None, ),  # 1
        (2, TType.STRUCT, 'ace', (airavata.api.error.ttypes.AiravataClientException, airavata.api.error.ttypes.AiravataClientException.thrift_spec), None, ),  # 2
        (3, TType.STRUCT, 'ase', (airavata.api.error.ttypes.AiravataSystemException, airavata.api.error.ttypes.AiravataSystemException.thrift_spec), None, ),  # 3
        (4, TType.STRUCT, 'ae', (airavata.api.error.ttypes.AuthorizationException, 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 = 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 = airavata.api.error.ttypes.InvalidRequestException()
                    self.ire.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 2:
                if ftype == TType.STRUCT:
                    self.ace = airavata.api.error.ttypes.AiravataClientException()
                    self.ace.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 3:
                if ftype == TType.STRUCT:
                    self.ase = airavata.api.error.ttypes.AiravataSystemException()
                    self.ase.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 4:
                if ftype == TType.STRUCT:
                    self.ae = 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', (airavata.model.security.ttypes.AuthzToken, 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 = 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', (airavata.api.error.ttypes.InvalidRequestException, airavata.api.error.ttypes.InvalidRequestException.thrift_spec), None, ),  # 1
        (2, TType.STRUCT, 'ace', (airavata.api.error.ttypes.AiravataClientException, airavata.api.error.ttypes.AiravataClientException.thrift_spec), None, ),  # 2
        (3, TType.STRUCT, 'ase', (airavata.api.error.ttypes.AiravataSystemException, airavata.api.error.ttypes.AiravataSystemException.thrift_spec), None, ),  # 3
        (4, TType.STRUCT, 'ae', (airavata.api.error.ttypes.AuthorizationException, 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 = airavata.api.error.ttypes.InvalidRequestException()
                    self.ire.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 2:
                if ftype == TType.STRUCT:
                    self.ace = airavata.api.error.ttypes.AiravataClientException()
                    self.ace.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 3:
                if ftype == TType.STRUCT:
                    self.ase = airavata.api.error.ttypes.AiravataSystemException()
                    self.ase.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 4:
                if ftype == TType.STRUCT:
                    self.ae = 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', (airavata.model.security.ttypes.AuthzToken, airavata.model.security.ttypes.AuthzToken.thrift_spec), None, ),  # 1
        (2, TType.STRUCT, 'notification', (airavata.model.workspace.ttypes.Notification, 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 = airavata.model.security.ttypes.AuthzToken()
                    self.authzToken.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 2:
                if ftype == TType.STRUCT:
                    self.notification = 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', (airavata.api.error.ttypes.InvalidRequestException, airavata.api.error.ttypes.InvalidRequestException.thrift_spec), None, ),  # 1
        (2, TType.STRUCT, 'ace', (airavata.api.error.ttypes.AiravataClientException, airavata.api.error.ttypes.AiravataClientException.thrift_spec), None, ),  # 2
        (3, TType.STRUCT, 'ase', (airavata.api.error.ttypes.AiravataSystemException, airavata.api.error.ttypes.AiravataSystemException.thrift_spec), None, ),  # 3
        (4, TType.STRUCT, 'ae', (airavata.api.error.ttypes.AuthorizationException, 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 = airavata.api.error.ttypes.InvalidRequestException()
                    self.ire.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 2:
                if ftype == TType.STRUCT:
                    self.ace = airavata.api.error.ttypes.AiravataClientException()
                    self.ace.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 3:
                if ftype == TType.STRUCT:
                    self.ase = airavata.api.error.ttypes.AiravataSystemException()
                    self.ase.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 4:
                if ftype == TType.STRUCT:
                    self.ae = 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', (airavata.model.security.ttypes.AuthzToken, airavata.model.security.ttypes.AuthzToken.thrift_spec), None, ),  # 1
        (2, TType.STRUCT, 'notification', (airavata.model.workspace.ttypes.Notification, 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 = airavata.model.security.ttypes.AuthzToken()
                    self.authzToken.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 2:
                if ftype == TType.STRUCT:
                    self.notification = 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', (airavata.api.error.ttypes.InvalidRequestException, airavata.api.error.ttypes.InvalidRequestException.thrift_spec), None, ),  # 1
        (2, TType.STRUCT, 'ace', (airavata.api.error.ttypes.AiravataClientException, airavata.api.error.ttypes.AiravataClientException.thrift_spec), None, ),  # 2
        (3, TType.STRUCT, 'ase', (airavata.api.error.ttypes.AiravataSystemException, airavata.api.error.ttypes.AiravataSystemException.thrift_spec), None, ),  # 3
        (4, TType.STRUCT, 'ae', (airavata.api.error.ttypes.AuthorizationException, 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 = airavata.api.error.ttypes.InvalidRequestException()
                    self.ire.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 2:
                if ftype == TType.STRUCT:
                    self.ace = airavata.api.error.ttypes.AiravataClientException()
                    self.ace.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 3:
                if ftype == TType.STRUCT:
                    self.ase = airavata.api.error.ttypes.AiravataSystemException()
                    self.ase.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 4:
                if ftype == TType.STRUCT:
                    self.ae = 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', (airavata.model.security.ttypes.AuthzToken, 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 = 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', (airavata.api.error.ttypes.InvalidRequestException, airavata.api.error.ttypes.InvalidRequestException.thrift_spec), None, ),  # 1
        (2, TType.STRUCT, 'ace', (airavata.api.error.ttypes.AiravataClientException, airavata.api.error.ttypes.AiravataClientException.thrift_spec), None, ),  # 2
        (3, TType.STRUCT, 'ase', (airavata.api.error.ttypes.AiravataSystemException, airavata.api.error.ttypes.AiravataSystemException.thrift_spec), None, ),  # 3
        (4, TType.STRUCT, 'ae', (airavata.api.error.ttypes.AuthorizationException, 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 = airavata.api.error.ttypes.InvalidRequestException()
                    self.ire.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 2:
                if ftype == TType.STRUCT:
                    self.ace = airavata.api.error.ttypes.AiravataClientException()
                    self.ace.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 3:
                if ftype == TType.STRUCT:
                    self.ase = airavata.api.error.ttypes.AiravataSystemException()
                    self.ase.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 4:
                if ftype == TType.STRUCT:
                    self.ae = 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', (airavata.model.security.ttypes.AuthzToken, 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 = 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', (airavata.model.workspace.ttypes.Notification, airavata.model.workspace.ttypes.Notification.thrift_spec), None, ),  # 0
        (1, TType.STRUCT, 'ire', (airavata.api.error.ttypes.InvalidRequestException, airavata.api.error.ttypes.InvalidRequestException.thrift_spec), None, ),  # 1
        (2, TType.STRUCT, 'ace', (airavata.api.error.ttypes.AiravataClientException, airavata.api.error.ttypes.AiravataClientException.thrift_spec), None, ),  # 2
        (3, TType.STRUCT, 'ase', (airavata.api.error.ttypes.AiravataSystemException, airavata.api.error.ttypes.AiravataSystemException.thrift_spec), None, ),  # 3
        (4, TType.STRUCT, 'ae', (airavata.api.error.ttypes.AuthorizationException, 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 = airavata.model.workspace.ttypes.Notification()
                    self.success.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 1:
                if ftype == TType.STRUCT:
                    self.ire = airavata.api.error.ttypes.InvalidRequestException()
                    self.ire.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 2:
                if ftype == TType.STRUCT:
                    self.ace = airavata.api.error.ttypes.AiravataClientException()
                    self.ace.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 3:
                if ftype == TType.STRUCT:
                    self.ase = airavata.api.error.ttypes.AiravataSystemException()
                    self.ase.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 4:
                if ftype == TType.STRUCT:
                    self.ae = 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', (airavata.model.security.ttypes.AuthzToken, 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 = 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, (airavata.model.workspace.ttypes.Notification, airavata.model.workspace.ttypes.Notification.thrift_spec), False), None, ),  # 0
        (1, TType.STRUCT, 'ire', (airavata.api.error.ttypes.InvalidRequestException, airavata.api.error.ttypes.InvalidRequestException.thrift_spec), None, ),  # 1
        (2, TType.STRUCT, 'ace', (airavata.api.error.ttypes.AiravataClientException, airavata.api.error.ttypes.AiravataClientException.thrift_spec), None, ),  # 2
        (3, TType.STRUCT, 'ase', (airavata.api.error.ttypes.AiravataSystemException, airavata.api.error.ttypes.AiravataSystemException.thrift_spec), None, ),  # 3
        (4, TType.STRUCT, 'ae', (airavata.api.error.ttypes.AuthorizationException, 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 = 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 = airavata.api.error.ttypes.InvalidRequestException()
                    self.ire.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 2:
                if ftype == TType.STRUCT:
                    self.ace = airavata.api.error.ttypes.AiravataClientException()
                    self.ace.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 3:
                if ftype == TType.STRUCT:
                    self.ase = airavata.api.error.ttypes.AiravataSystemException()
                    self.ase.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 4:
                if ftype == TType.STRUCT:
                    self.ae = 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
     - description
    """

    thrift_spec = (
        None,  # 0
        (1, TType.STRUCT, 'authzToken', (airavata.model.security.ttypes.AuthzToken, airavata.model.security.ttypes.AuthzToken.thrift_spec), None, ),  # 1
        None,  # 2
        None,  # 3
        (4, TType.STRING, 'description', 'UTF8', None, ),  # 4
    )

    def __init__(self, authzToken=None, description=None,):
        self.authzToken = authzToken
        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 = airavata.model.security.ttypes.AuthzToken()
                    self.authzToken.read(iprot)
                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)
            else:
                iprot.skip(ftype)
            iprot.readFieldEnd()
        iprot.readStructEnd()

    def write(self, oprot):
        if oprot._fast_encode is 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.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()
        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 generateAndRegisterSSHKeys_result(object):
    """
    Attributes:
     - success
     - ire
     - ace
     - ase
    """

    thrift_spec = (
        (0, TType.STRING, 'success', 'UTF8', None, ),  # 0
        (1, TType.STRUCT, 'ire', (airavata.api.error.ttypes.InvalidRequestException, airavata.api.error.ttypes.InvalidRequestException.thrift_spec), None, ),  # 1
        (2, TType.STRUCT, 'ace', (airavata.api.error.ttypes.AiravataClientException, airavata.api.error.ttypes.AiravataClientException.thrift_spec), None, ),  # 2
        (3, TType.STRUCT, 'ase', (airavata.api.error.ttypes.AiravataSystemException, 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 = airavata.api.error.ttypes.InvalidRequestException()
                    self.ire.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 2:
                if ftype == TType.STRUCT:
                    self.ace = airavata.api.error.ttypes.AiravataClientException()
                    self.ace.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 3:
                if ftype == TType.STRUCT:
                    self.ase = 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
     - loginUserName
     - password
     - description
    """

    thrift_spec = (
        None,  # 0
        (1, TType.STRUCT, 'authzToken', (airavata.model.security.ttypes.AuthzToken, airavata.model.security.ttypes.AuthzToken.thrift_spec), None, ),  # 1
        None,  # 2
        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, loginUserName=None, password=None, description=None,):
        self.authzToken = authzToken
        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 = airavata.model.security.ttypes.AuthzToken()
                    self.authzToken.read(iprot)
                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.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.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', (airavata.api.error.ttypes.InvalidRequestException, airavata.api.error.ttypes.InvalidRequestException.thrift_spec), None, ),  # 1
        (2, TType.STRUCT, 'ace', (airavata.api.error.ttypes.AiravataClientException, airavata.api.error.ttypes.AiravataClientException.thrift_spec), None, ),  # 2
        (3, TType.STRUCT, 'ase', (airavata.api.error.ttypes.AiravataSystemException, 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 = airavata.api.error.ttypes.InvalidRequestException()
                    self.ire.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 2:
                if ftype == TType.STRUCT:
                    self.ace = airavata.api.error.ttypes.AiravataClientException()
                    self.ace.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 3:
                if ftype == TType.STRUCT:
                    self.ase = 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 getCredentialSummary_args(object):
    """
    Attributes:
     - authzToken
     - tokenId
    """

    thrift_spec = (
        None,  # 0
        (1, TType.STRUCT, 'authzToken', (airavata.model.security.ttypes.AuthzToken, airavata.model.security.ttypes.AuthzToken.thrift_spec), None, ),  # 1
        (2, TType.STRING, 'tokenId', 'UTF8', None, ),  # 2
    )

    def __init__(self, authzToken=None, tokenId=None,):
        self.authzToken = authzToken
        self.tokenId = tokenId

    def read(self, iprot):
        if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None:
            iprot._fast_decode(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 = airavata.model.security.ttypes.AuthzToken()
                    self.authzToken.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 2:
                if ftype == TType.STRING:
                    self.tokenId = 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('getCredentialSummary_args')
        if self.authzToken is not None:
            oprot.writeFieldBegin('authzToken', TType.STRUCT, 1)
            self.authzToken.write(oprot)
            oprot.writeFieldEnd()
        if self.tokenId is not None:
            oprot.writeFieldBegin('tokenId', TType.STRING, 2)
            oprot.writeString(self.tokenId.encode('utf-8') if sys.version_info[0] == 2 else self.tokenId)
            oprot.writeFieldEnd()
        oprot.writeFieldStop()
        oprot.writeStructEnd()

    def validate(self):
        if self.authzToken is None:
            raise TProtocolException(message='Required field authzToken is unset!')
        if self.tokenId is None:
            raise TProtocolException(message='Required field tokenId 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 getCredentialSummary_result(object):
    """
    Attributes:
     - success
     - ire
     - ace
     - ase
     - ae
    """

    thrift_spec = (
        (0, TType.STRUCT, 'success', (airavata.model.credential.store.ttypes.CredentialSummary, airavata.model.credential.store.ttypes.CredentialSummary.thrift_spec), None, ),  # 0
        (1, TType.STRUCT, 'ire', (airavata.api.error.ttypes.InvalidRequestException, airavata.api.error.ttypes.InvalidRequestException.thrift_spec), None, ),  # 1
        (2, TType.STRUCT, 'ace', (airavata.api.error.ttypes.AiravataClientException, airavata.api.error.ttypes.AiravataClientException.thrift_spec), None, ),  # 2
        (3, TType.STRUCT, 'ase', (airavata.api.error.ttypes.AiravataSystemException, airavata.api.error.ttypes.AiravataSystemException.thrift_spec), None, ),  # 3
        (4, TType.STRUCT, 'ae', (airavata.api.error.ttypes.AuthorizationException, 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 = airavata.model.credential.store.ttypes.CredentialSummary()
                    self.success.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 1:
                if ftype == TType.STRUCT:
                    self.ire = airavata.api.error.ttypes.InvalidRequestException()
                    self.ire.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 2:
                if ftype == TType.STRUCT:
                    self.ace = airavata.api.error.ttypes.AiravataClientException()
                    self.ace.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 3:
                if ftype == TType.STRUCT:
                    self.ase = airavata.api.error.ttypes.AiravataSystemException()
                    self.ase.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 4:
                if ftype == TType.STRUCT:
                    self.ae = 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('getCredentialSummary_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 getAllCredentialSummaries_args(object):
    """
    Attributes:
     - authzToken
     - type
    """

    thrift_spec = (
        None,  # 0
        (1, TType.STRUCT, 'authzToken', (airavata.model.security.ttypes.AuthzToken, airavata.model.security.ttypes.AuthzToken.thrift_spec), None, ),  # 1
        (2, TType.I32, 'type', None, None, ),  # 2
    )

    def __init__(self, authzToken=None, type=None,):
        self.authzToken = authzToken
        self.type = type

    def read(self, iprot):
        if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None:
            iprot._fast_decode(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 = 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)
            else:
                iprot.skip(ftype)
            iprot.readFieldEnd()
        iprot.readStructEnd()

    def write(self, oprot):
        if oprot._fast_encode is not None and self.thrift_spec is not None:
            oprot.trans.write(oprot._fast_encode(self, (self.__class__, self.thrift_spec)))
            return
        oprot.writeStructBegin('getAllCredentialSummaries_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()
        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!')
        return

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

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

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


class getAllCredentialSummaries_result(object):
    """
    Attributes:
     - success
     - ire
     - ace
     - ase
    """

    thrift_spec = (
        (0, TType.LIST, 'success', (TType.STRUCT, (airavata.model.credential.store.ttypes.CredentialSummary, airavata.model.credential.store.ttypes.CredentialSummary.thrift_spec), False), None, ),  # 0
        (1, TType.STRUCT, 'ire', (airavata.api.error.ttypes.InvalidRequestException, airavata.api.error.ttypes.InvalidRequestException.thrift_spec), None, ),  # 1
        (2, TType.STRUCT, 'ace', (airavata.api.error.ttypes.AiravataClientException, airavata.api.error.ttypes.AiravataClientException.thrift_spec), None, ),  # 2
        (3, TType.STRUCT, 'ase', (airavata.api.error.ttypes.AiravataSystemException, 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 = []
                    (_etype24, _size21) = iprot.readListBegin()
                    for _i25 in range(_size21):
                        _elem26 = airavata.model.credential.store.ttypes.CredentialSummary()
                        _elem26.read(iprot)
                        self.success.append(_elem26)
                    iprot.readListEnd()
                else:
                    iprot.skip(ftype)
            elif fid == 1:
                if ftype == TType.STRUCT:
                    self.ire = airavata.api.error.ttypes.InvalidRequestException()
                    self.ire.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 2:
                if ftype == TType.STRUCT:
                    self.ace = airavata.api.error.ttypes.AiravataClientException()
                    self.ace.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 3:
                if ftype == TType.STRUCT:
                    self.ase = 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('getAllCredentialSummaries_result')
        if self.success is not None:
            oprot.writeFieldBegin('success', TType.LIST, 0)
            oprot.writeListBegin(TType.STRUCT, len(self.success))
            for iter27 in self.success:
                iter27.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 deleteSSHPubKey_args(object):
    """
    Attributes:
     - authzToken
     - airavataCredStoreToken
    """

    thrift_spec = (
        None,  # 0
        (1, TType.STRUCT, 'authzToken', (airavata.model.security.ttypes.AuthzToken, airavata.model.security.ttypes.AuthzToken.thrift_spec), None, ),  # 1
        (2, TType.STRING, 'airavataCredStoreToken', 'UTF8', None, ),  # 2
    )

    def __init__(self, authzToken=None, airavataCredStoreToken=None,):
        self.authzToken = authzToken
        self.airavataCredStoreToken = airavataCredStoreToken

    def read(self, iprot):
        if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None:
            iprot._fast_decode(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 = 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)
            else:
                iprot.skip(ftype)
            iprot.readFieldEnd()
        iprot.readStructEnd()

    def write(self, oprot):
        if oprot._fast_encode is 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()
        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!')
        return

    def __repr__(self):
        L = ['%s=%r' % (key, value)
             for key, value in self.__dict__.items()]
        return '%s(%s)' % (self.__class__.__name__, ', '.join(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
     - ae
    """

    thrift_spec = (
        (0, TType.BOOL, 'success', None, None, ),  # 0
        (1, TType.STRUCT, 'ire', (airavata.api.error.ttypes.InvalidRequestException, airavata.api.error.ttypes.InvalidRequestException.thrift_spec), None, ),  # 1
        (2, TType.STRUCT, 'ace', (airavata.api.error.ttypes.AiravataClientException, airavata.api.error.ttypes.AiravataClientException.thrift_spec), None, ),  # 2
        (3, TType.STRUCT, 'ase', (airavata.api.error.ttypes.AiravataSystemException, airavata.api.error.ttypes.AiravataSystemException.thrift_spec), None, ),  # 3
        (4, TType.STRUCT, 'ae', (airavata.api.error.ttypes.AuthorizationException, 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 = airavata.api.error.ttypes.InvalidRequestException()
                    self.ire.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 2:
                if ftype == TType.STRUCT:
                    self.ace = airavata.api.error.ttypes.AiravataClientException()
                    self.ace.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 3:
                if ftype == TType.STRUCT:
                    self.ase = airavata.api.error.ttypes.AiravataSystemException()
                    self.ase.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 4:
                if ftype == TType.STRUCT:
                    self.ae = 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('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()
        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 deletePWDCredential_args(object):
    """
    Attributes:
     - authzToken
     - airavataCredStoreToken
    """

    thrift_spec = (
        None,  # 0
        (1, TType.STRUCT, 'authzToken', (airavata.model.security.ttypes.AuthzToken, airavata.model.security.ttypes.AuthzToken.thrift_spec), None, ),  # 1
        (2, TType.STRING, 'airavataCredStoreToken', 'UTF8', None, ),  # 2
    )

    def __init__(self, authzToken=None, airavataCredStoreToken=None,):
        self.authzToken = authzToken
        self.airavataCredStoreToken = airavataCredStoreToken

    def read(self, iprot):
        if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None:
            iprot._fast_decode(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 = 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)
            else:
                iprot.skip(ftype)
            iprot.readFieldEnd()
        iprot.readStructEnd()

    def write(self, oprot):
        if oprot._fast_encode is 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()
        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!')
        return

    def __repr__(self):
        L = ['%s=%r' % (key, value)
             for key, value in self.__dict__.items()]
        return '%s(%s)' % (self.__class__.__name__, ', '.join(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
     - ae
    """

    thrift_spec = (
        (0, TType.BOOL, 'success', None, None, ),  # 0
        (1, TType.STRUCT, 'ire', (airavata.api.error.ttypes.InvalidRequestException, airavata.api.error.ttypes.InvalidRequestException.thrift_spec), None, ),  # 1
        (2, TType.STRUCT, 'ace', (airavata.api.error.ttypes.AiravataClientException, airavata.api.error.ttypes.AiravataClientException.thrift_spec), None, ),  # 2
        (3, TType.STRUCT, 'ase', (airavata.api.error.ttypes.AiravataSystemException, airavata.api.error.ttypes.AiravataSystemException.thrift_spec), None, ),  # 3
        (4, TType.STRUCT, 'ae', (airavata.api.error.ttypes.AuthorizationException, 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 = airavata.api.error.ttypes.InvalidRequestException()
                    self.ire.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 2:
                if ftype == TType.STRUCT:
                    self.ace = airavata.api.error.ttypes.AiravataClientException()
                    self.ace.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 3:
                if ftype == TType.STRUCT:
                    self.ase = airavata.api.error.ttypes.AiravataSystemException()
                    self.ase.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 4:
                if ftype == TType.STRUCT:
                    self.ae = 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('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()
        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 createProject_args(object):
    """
    Attributes:
     - authzToken
     - gatewayId
     - project
    """

    thrift_spec = (
        None,  # 0
        (1, TType.STRUCT, 'authzToken', (airavata.model.security.ttypes.AuthzToken, airavata.model.security.ttypes.AuthzToken.thrift_spec), None, ),  # 1
        (2, TType.STRING, 'gatewayId', 'UTF8', None, ),  # 2
        (3, TType.STRUCT, 'project', (airavata.model.workspace.ttypes.Project, 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 = 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 = 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', (airavata.api.error.ttypes.InvalidRequestException, airavata.api.error.ttypes.InvalidRequestException.thrift_spec), None, ),  # 1
        (2, TType.STRUCT, 'ace', (airavata.api.error.ttypes.AiravataClientException, airavata.api.error.ttypes.AiravataClientException.thrift_spec), None, ),  # 2
        (3, TType.STRUCT, 'ase', (airavata.api.error.ttypes.AiravataSystemException, airavata.api.error.ttypes.AiravataSystemException.thrift_spec), None, ),  # 3
        (4, TType.STRUCT, 'ae', (airavata.api.error.ttypes.AuthorizationException, 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 = airavata.api.error.ttypes.InvalidRequestException()
                    self.ire.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 2:
                if ftype == TType.STRUCT:
                    self.ace = airavata.api.error.ttypes.AiravataClientException()
                    self.ace.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 3:
                if ftype == TType.STRUCT:
                    self.ase = airavata.api.error.ttypes.AiravataSystemException()
                    self.ase.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 4:
                if ftype == TType.STRUCT:
                    self.ae = 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', (airavata.model.security.ttypes.AuthzToken, airavata.model.security.ttypes.AuthzToken.thrift_spec), None, ),  # 1
        (2, TType.STRING, 'projectId', 'UTF8', None, ),  # 2
        (3, TType.STRUCT, 'updatedProject', (airavata.model.workspace.ttypes.Project, 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 = 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 = 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', (airavata.api.error.ttypes.InvalidRequestException, airavata.api.error.ttypes.InvalidRequestException.thrift_spec), None, ),  # 1
        (2, TType.STRUCT, 'ace', (airavata.api.error.ttypes.AiravataClientException, airavata.api.error.ttypes.AiravataClientException.thrift_spec), None, ),  # 2
        (3, TType.STRUCT, 'ase', (airavata.api.error.ttypes.AiravataSystemException, airavata.api.error.ttypes.AiravataSystemException.thrift_spec), None, ),  # 3
        (4, TType.STRUCT, 'pnfe', (airavata.api.error.ttypes.ProjectNotFoundException, airavata.api.error.ttypes.ProjectNotFoundException.thrift_spec), None, ),  # 4
        (5, TType.STRUCT, 'ae', (airavata.api.error.ttypes.AuthorizationException, 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 = airavata.api.error.ttypes.InvalidRequestException()
                    self.ire.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 2:
                if ftype == TType.STRUCT:
                    self.ace = airavata.api.error.ttypes.AiravataClientException()
                    self.ace.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 3:
                if ftype == TType.STRUCT:
                    self.ase = airavata.api.error.ttypes.AiravataSystemException()
                    self.ase.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 4:
                if ftype == TType.STRUCT:
                    self.pnfe = airavata.api.error.ttypes.ProjectNotFoundException()
                    self.pnfe.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 5:
                if ftype == TType.STRUCT:
                    self.ae = 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', (airavata.model.security.ttypes.AuthzToken, 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 = 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', (airavata.model.workspace.ttypes.Project, airavata.model.workspace.ttypes.Project.thrift_spec), None, ),  # 0
        (1, TType.STRUCT, 'ire', (airavata.api.error.ttypes.InvalidRequestException, airavata.api.error.ttypes.InvalidRequestException.thrift_spec), None, ),  # 1
        (2, TType.STRUCT, 'ace', (airavata.api.error.ttypes.AiravataClientException, airavata.api.error.ttypes.AiravataClientException.thrift_spec), None, ),  # 2
        (3, TType.STRUCT, 'ase', (airavata.api.error.ttypes.AiravataSystemException, airavata.api.error.ttypes.AiravataSystemException.thrift_spec), None, ),  # 3
        (4, TType.STRUCT, 'pnfe', (airavata.api.error.ttypes.ProjectNotFoundException, airavata.api.error.ttypes.ProjectNotFoundException.thrift_spec), None, ),  # 4
        (5, TType.STRUCT, 'ae', (airavata.api.error.ttypes.AuthorizationException, 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 = airavata.model.workspace.ttypes.Project()
                    self.success.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 1:
                if ftype == TType.STRUCT:
                    self.ire = airavata.api.error.ttypes.InvalidRequestException()
                    self.ire.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 2:
                if ftype == TType.STRUCT:
                    self.ace = airavata.api.error.ttypes.AiravataClientException()
                    self.ace.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 3:
                if ftype == TType.STRUCT:
                    self.ase = airavata.api.error.ttypes.AiravataSystemException()
                    self.ase.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 4:
                if ftype == TType.STRUCT:
                    self.pnfe = airavata.api.error.ttypes.ProjectNotFoundException()
                    self.pnfe.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 5:
                if ftype == TType.STRUCT:
                    self.ae = 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', (airavata.model.security.ttypes.AuthzToken, 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 = 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', (airavata.api.error.ttypes.InvalidRequestException, airavata.api.error.ttypes.InvalidRequestException.thrift_spec), None, ),  # 1
        (2, TType.STRUCT, 'ace', (airavata.api.error.ttypes.AiravataClientException, airavata.api.error.ttypes.AiravataClientException.thrift_spec), None, ),  # 2
        (3, TType.STRUCT, 'ase', (airavata.api.error.ttypes.AiravataSystemException, airavata.api.error.ttypes.AiravataSystemException.thrift_spec), None, ),  # 3
        (4, TType.STRUCT, 'pnfe', (airavata.api.error.ttypes.ProjectNotFoundException, airavata.api.error.ttypes.ProjectNotFoundException.thrift_spec), None, ),  # 4
        (5, TType.STRUCT, 'ae', (airavata.api.error.ttypes.AuthorizationException, 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 = airavata.api.error.ttypes.InvalidRequestException()
                    self.ire.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 2:
                if ftype == TType.STRUCT:
                    self.ace = airavata.api.error.ttypes.AiravataClientException()
                    self.ace.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 3:
                if ftype == TType.STRUCT:
                    self.ase = airavata.api.error.ttypes.AiravataSystemException()
                    self.ase.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 4:
                if ftype == TType.STRUCT:
                    self.pnfe = airavata.api.error.ttypes.ProjectNotFoundException()
                    self.pnfe.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 5:
                if ftype == TType.STRUCT:
                    self.ae = 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', (airavata.model.security.ttypes.AuthzToken, 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 = 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, (airavata.model.workspace.ttypes.Project, airavata.model.workspace.ttypes.Project.thrift_spec), False), None, ),  # 0
        (1, TType.STRUCT, 'ire', (airavata.api.error.ttypes.InvalidRequestException, airavata.api.error.ttypes.InvalidRequestException.thrift_spec), None, ),  # 1
        (2, TType.STRUCT, 'ace', (airavata.api.error.ttypes.AiravataClientException, airavata.api.error.ttypes.AiravataClientException.thrift_spec), None, ),  # 2
        (3, TType.STRUCT, 'ase', (airavata.api.error.ttypes.AiravataSystemException, airavata.api.error.ttypes.AiravataSystemException.thrift_spec), None, ),  # 3
        (4, TType.STRUCT, 'ae', (airavata.api.error.ttypes.AuthorizationException, 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 = []
                    (_etype31, _size28) = iprot.readListBegin()
                    for _i32 in range(_size28):
                        _elem33 = airavata.model.workspace.ttypes.Project()
                        _elem33.read(iprot)
                        self.success.append(_elem33)
                    iprot.readListEnd()
                else:
                    iprot.skip(ftype)
            elif fid == 1:
                if ftype == TType.STRUCT:
                    self.ire = airavata.api.error.ttypes.InvalidRequestException()
                    self.ire.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 2:
                if ftype == TType.STRUCT:
                    self.ace = airavata.api.error.ttypes.AiravataClientException()
                    self.ace.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 3:
                if ftype == TType.STRUCT:
                    self.ase = airavata.api.error.ttypes.AiravataSystemException()
                    self.ase.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 4:
                if ftype == TType.STRUCT:
                    self.ae = 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 iter34 in self.success:
                iter34.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', (airavata.model.security.ttypes.AuthzToken, 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 = 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 = {}
                    (_ktype36, _vtype37, _size35) = iprot.readMapBegin()
                    for _i39 in range(_size35):
                        _key40 = iprot.readI32()
                        _val41 = iprot.readString().decode('utf-8') if sys.version_info[0] == 2 else iprot.readString()
                        self.filters[_key40] = _val41
                    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 kiter42, viter43 in self.filters.items():
                oprot.writeI32(kiter42)
                oprot.writeString(viter43.encode('utf-8') if sys.version_info[0] == 2 else viter43)
            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, (airavata.model.workspace.ttypes.Project, airavata.model.workspace.ttypes.Project.thrift_spec), False), None, ),  # 0
        (1, TType.STRUCT, 'ire', (airavata.api.error.ttypes.InvalidRequestException, airavata.api.error.ttypes.InvalidRequestException.thrift_spec), None, ),  # 1
        (2, TType.STRUCT, 'ace', (airavata.api.error.ttypes.AiravataClientException, airavata.api.error.ttypes.AiravataClientException.thrift_spec), None, ),  # 2
        (3, TType.STRUCT, 'ase', (airavata.api.error.ttypes.AiravataSystemException, airavata.api.error.ttypes.AiravataSystemException.thrift_spec), None, ),  # 3
        (4, TType.STRUCT, 'ae', (airavata.api.error.ttypes.AuthorizationException, 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 = []
                    (_etype47, _size44) = iprot.readListBegin()
                    for _i48 in range(_size44):
                        _elem49 = airavata.model.workspace.ttypes.Project()
                        _elem49.read(iprot)
                        self.success.append(_elem49)
                    iprot.readListEnd()
                else:
                    iprot.skip(ftype)
            elif fid == 1:
                if ftype == TType.STRUCT:
                    self.ire = airavata.api.error.ttypes.InvalidRequestException()
                    self.ire.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 2:
                if ftype == TType.STRUCT:
                    self.ace = airavata.api.error.ttypes.AiravataClientException()
                    self.ace.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 3:
                if ftype == TType.STRUCT:
                    self.ase = airavata.api.error.ttypes.AiravataSystemException()
                    self.ase.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 4:
                if ftype == TType.STRUCT:
                    self.ae = 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 iter50 in self.success:
                iter50.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', (airavata.model.security.ttypes.AuthzToken, 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 = 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 = {}
                    (_ktype52, _vtype53, _size51) = iprot.readMapBegin()
                    for _i55 in range(_size51):
                        _key56 = iprot.readI32()
                        _val57 = iprot.readString().decode('utf-8') if sys.version_info[0] == 2 else iprot.readString()
                        self.filters[_key56] = _val57
                    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 kiter58, viter59 in self.filters.items():
                oprot.writeI32(kiter58)
                oprot.writeString(viter59.encode('utf-8') if sys.version_info[0] == 2 else viter59)
            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, (airavata.model.experiment.ttypes.ExperimentSummaryModel, airavata.model.experiment.ttypes.ExperimentSummaryModel.thrift_spec), False), None, ),  # 0
        (1, TType.STRUCT, 'ire', (airavata.api.error.ttypes.InvalidRequestException, airavata.api.error.ttypes.InvalidRequestException.thrift_spec), None, ),  # 1
        (2, TType.STRUCT, 'ace', (airavata.api.error.ttypes.AiravataClientException, airavata.api.error.ttypes.AiravataClientException.thrift_spec), None, ),  # 2
        (3, TType.STRUCT, 'ase', (airavata.api.error.ttypes.AiravataSystemException, airavata.api.error.ttypes.AiravataSystemException.thrift_spec), None, ),  # 3
        (4, TType.STRUCT, 'ae', (airavata.api.error.ttypes.AuthorizationException, 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 = []
                    (_etype63, _size60) = iprot.readListBegin()
                    for _i64 in range(_size60):
                        _elem65 = airavata.model.experiment.ttypes.ExperimentSummaryModel()
                        _elem65.read(iprot)
                        self.success.append(_elem65)
                    iprot.readListEnd()
                else:
                    iprot.skip(ftype)
            elif fid == 1:
                if ftype == TType.STRUCT:
                    self.ire = airavata.api.error.ttypes.InvalidRequestException()
                    self.ire.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 2:
                if ftype == TType.STRUCT:
                    self.ace = airavata.api.error.ttypes.AiravataClientException()
                    self.ace.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 3:
                if ftype == TType.STRUCT:
                    self.ase = airavata.api.error.ttypes.AiravataSystemException()
                    self.ase.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 4:
                if ftype == TType.STRUCT:
                    self.ae = 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 iter66 in self.success:
                iter66.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
     - limit
     - offset
    """

    thrift_spec = (
        None,  # 0
        (1, TType.STRUCT, 'authzToken', (airavata.model.security.ttypes.AuthzToken, 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
        (8, TType.I32, 'limit', None, 50, ),  # 8
        (9, TType.I32, 'offset', None, 0, ),  # 9
    )

    def __init__(self, authzToken=None, gatewayId=None, fromTime=None, toTime=None, userName=None, applicationName=None, resourceHostName=None, limit=thrift_spec[8][4], offset=thrift_spec[9][4],):
        self.authzToken = authzToken
        self.gatewayId = gatewayId
        self.fromTime = fromTime
        self.toTime = toTime
        self.userName = userName
        self.applicationName = applicationName
        self.resourceHostName = resourceHostName
        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 = 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)
            elif fid == 8:
                if ftype == TType.I32:
                    self.limit = iprot.readI32()
                else:
                    iprot.skip(ftype)
            elif fid == 9:
                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('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()
        if self.limit is not None:
            oprot.writeFieldBegin('limit', TType.I32, 8)
            oprot.writeI32(self.limit)
            oprot.writeFieldEnd()
        if self.offset is not None:
            oprot.writeFieldBegin('offset', TType.I32, 9)
            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.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', (airavata.model.experiment.ttypes.ExperimentStatistics, airavata.model.experiment.ttypes.ExperimentStatistics.thrift_spec), None, ),  # 0
        (1, TType.STRUCT, 'ire', (airavata.api.error.ttypes.InvalidRequestException, airavata.api.error.ttypes.InvalidRequestException.thrift_spec), None, ),  # 1
        (2, TType.STRUCT, 'ace', (airavata.api.error.ttypes.AiravataClientException, airavata.api.error.ttypes.AiravataClientException.thrift_spec), None, ),  # 2
        (3, TType.STRUCT, 'ase', (airavata.api.error.ttypes.AiravataSystemException, airavata.api.error.ttypes.AiravataSystemException.thrift_spec), None, ),  # 3
        (4, TType.STRUCT, 'ae', (airavata.api.error.ttypes.AuthorizationException, 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 = airavata.model.experiment.ttypes.ExperimentStatistics()
                    self.success.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 1:
                if ftype == TType.STRUCT:
                    self.ire = airavata.api.error.ttypes.InvalidRequestException()
                    self.ire.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 2:
                if ftype == TType.STRUCT:
                    self.ace = airavata.api.error.ttypes.AiravataClientException()
                    self.ace.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 3:
                if ftype == TType.STRUCT:
                    self.ase = airavata.api.error.ttypes.AiravataSystemException()
                    self.ase.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 4:
                if ftype == TType.STRUCT:
                    self.ae = 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', (airavata.model.security.ttypes.AuthzToken, 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 = 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, (airavata.model.experiment.ttypes.ExperimentModel, airavata.model.experiment.ttypes.ExperimentModel.thrift_spec), False), None, ),  # 0
        (1, TType.STRUCT, 'ire', (airavata.api.error.ttypes.InvalidRequestException, airavata.api.error.ttypes.InvalidRequestException.thrift_spec), None, ),  # 1
        (2, TType.STRUCT, 'ace', (airavata.api.error.ttypes.AiravataClientException, airavata.api.error.ttypes.AiravataClientException.thrift_spec), None, ),  # 2
        (3, TType.STRUCT, 'ase', (airavata.api.error.ttypes.AiravataSystemException, airavata.api.error.ttypes.AiravataSystemException.thrift_spec), None, ),  # 3
        (4, TType.STRUCT, 'pnfe', (airavata.api.error.ttypes.ProjectNotFoundException, airavata.api.error.ttypes.ProjectNotFoundException.thrift_spec), None, ),  # 4
        (5, TType.STRUCT, 'ae', (airavata.api.error.ttypes.AuthorizationException, 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 = []
                    (_etype70, _size67) = iprot.readListBegin()
                    for _i71 in range(_size67):
                        _elem72 = airavata.model.experiment.ttypes.ExperimentModel()
                        _elem72.read(iprot)
                        self.success.append(_elem72)
                    iprot.readListEnd()
                else:
                    iprot.skip(ftype)
            elif fid == 1:
                if ftype == TType.STRUCT:
                    self.ire = airavata.api.error.ttypes.InvalidRequestException()
                    self.ire.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 2:
                if ftype == TType.STRUCT:
                    self.ace = airavata.api.error.ttypes.AiravataClientException()
                    self.ace.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 3:
                if ftype == TType.STRUCT:
                    self.ase = airavata.api.error.ttypes.AiravataSystemException()
                    self.ase.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 4:
                if ftype == TType.STRUCT:
                    self.pnfe = airavata.api.error.ttypes.ProjectNotFoundException()
                    self.pnfe.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 5:
                if ftype == TType.STRUCT:
                    self.ae = 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 iter73 in self.success:
                iter73.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', (airavata.model.security.ttypes.AuthzToken, 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 = 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, (airavata.model.experiment.ttypes.ExperimentModel, airavata.model.experiment.ttypes.ExperimentModel.thrift_spec), False), None, ),  # 0
        (1, TType.STRUCT, 'ire', (airavata.api.error.ttypes.InvalidRequestException, airavata.api.error.ttypes.InvalidRequestException.thrift_spec), None, ),  # 1
        (2, TType.STRUCT, 'ace', (airavata.api.error.ttypes.AiravataClientException, airavata.api.error.ttypes.AiravataClientException.thrift_spec), None, ),  # 2
        (3, TType.STRUCT, 'ase', (airavata.api.error.ttypes.AiravataSystemException, airavata.api.error.ttypes.AiravataSystemException.thrift_spec), None, ),  # 3
        (4, TType.STRUCT, 'ae', (airavata.api.error.ttypes.AuthorizationException, 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 = []
                    (_etype77, _size74) = iprot.readListBegin()
                    for _i78 in range(_size74):
                        _elem79 = airavata.model.experiment.ttypes.ExperimentModel()
                        _elem79.read(iprot)
                        self.success.append(_elem79)
                    iprot.readListEnd()
                else:
                    iprot.skip(ftype)
            elif fid == 1:
                if ftype == TType.STRUCT:
                    self.ire = airavata.api.error.ttypes.InvalidRequestException()
                    self.ire.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 2:
                if ftype == TType.STRUCT:
                    self.ace = airavata.api.error.ttypes.AiravataClientException()
                    self.ace.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 3:
                if ftype == TType.STRUCT:
                    self.ase = airavata.api.error.ttypes.AiravataSystemException()
                    self.ase.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 4:
                if ftype == TType.STRUCT:
                    self.ae = 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 iter80 in self.success:
                iter80.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', (airavata.model.security.ttypes.AuthzToken, airavata.model.security.ttypes.AuthzToken.thrift_spec), None, ),  # 1
        (2, TType.STRING, 'gatewayId', 'UTF8', None, ),  # 2
        (3, TType.STRUCT, 'experiment', (airavata.model.experiment.ttypes.ExperimentModel, 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 = 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 = 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', (airavata.api.error.ttypes.InvalidRequestException, airavata.api.error.ttypes.InvalidRequestException.thrift_spec), None, ),  # 1
        (2, TType.STRUCT, 'ace', (airavata.api.error.ttypes.AiravataClientException, airavata.api.error.ttypes.AiravataClientException.thrift_spec), None, ),  # 2
        (3, TType.STRUCT, 'ase', (airavata.api.error.ttypes.AiravataSystemException, airavata.api.error.ttypes.AiravataSystemException.thrift_spec), None, ),  # 3
        (4, TType.STRUCT, 'ae', (airavata.api.error.ttypes.AuthorizationException, 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 = airavata.api.error.ttypes.InvalidRequestException()
                    self.ire.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 2:
                if ftype == TType.STRUCT:
                    self.ace = airavata.api.error.ttypes.AiravataClientException()
                    self.ace.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 3:
                if ftype == TType.STRUCT:
                    self.ase = airavata.api.error.ttypes.AiravataSystemException()
                    self.ase.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 4:
                if ftype == TType.STRUCT:
                    self.ae = 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', (airavata.model.security.ttypes.AuthzToken, 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 = 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', (airavata.api.error.ttypes.InvalidRequestException, airavata.api.error.ttypes.InvalidRequestException.thrift_spec), None, ),  # 1
        (2, TType.STRUCT, 'ace', (airavata.api.error.ttypes.AiravataClientException, airavata.api.error.ttypes.AiravataClientException.thrift_spec), None, ),  # 2
        (3, TType.STRUCT, 'ase', (airavata.api.error.ttypes.AiravataSystemException, airavata.api.error.ttypes.AiravataSystemException.thrift_spec), None, ),  # 3
        (4, TType.STRUCT, 'ae', (airavata.api.error.ttypes.AuthorizationException, 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 = airavata.api.error.ttypes.InvalidRequestException()
                    self.ire.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 2:
                if ftype == TType.STRUCT:
                    self.ace = airavata.api.error.ttypes.AiravataClientException()
                    self.ace.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 3:
                if ftype == TType.STRUCT:
                    self.ase = airavata.api.error.ttypes.AiravataSystemException()
                    self.ase.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 4:
                if ftype == TType.STRUCT:
                    self.ae = 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', (airavata.model.security.ttypes.AuthzToken, 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 = 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', (airavata.model.experiment.ttypes.ExperimentModel, airavata.model.experiment.ttypes.ExperimentModel.thrift_spec), None, ),  # 0
        (1, TType.STRUCT, 'ire', (airavata.api.error.ttypes.InvalidRequestException, airavata.api.error.ttypes.InvalidRequestException.thrift_spec), None, ),  # 1
        (2, TType.STRUCT, 'enf', (airavata.api.error.ttypes.ExperimentNotFoundException, airavata.api.error.ttypes.ExperimentNotFoundException.thrift_spec), None, ),  # 2
        (3, TType.STRUCT, 'ace', (airavata.api.error.ttypes.AiravataClientException, airavata.api.error.ttypes.AiravataClientException.thrift_spec), None, ),  # 3
        (4, TType.STRUCT, 'ase', (airavata.api.error.ttypes.AiravataSystemException, airavata.api.error.ttypes.AiravataSystemException.thrift_spec), None, ),  # 4
        (5, TType.STRUCT, 'ae', (airavata.api.error.ttypes.AuthorizationException, 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 = airavata.model.experiment.ttypes.ExperimentModel()
                    self.success.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 1:
                if ftype == TType.STRUCT:
                    self.ire = airavata.api.error.ttypes.InvalidRequestException()
                    self.ire.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 2:
                if ftype == TType.STRUCT:
                    self.enf = airavata.api.error.ttypes.ExperimentNotFoundException()
                    self.enf.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 3:
                if ftype == TType.STRUCT:
                    self.ace = airavata.api.error.ttypes.AiravataClientException()
                    self.ace.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 4:
                if ftype == TType.STRUCT:
                    self.ase = airavata.api.error.ttypes.AiravataSystemException()
                    self.ase.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 5:
                if ftype == TType.STRUCT:
                    self.ae = 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', (airavata.model.security.ttypes.AuthzToken, 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 = 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', (airavata.model.experiment.ttypes.ExperimentModel, airavata.model.experiment.ttypes.ExperimentModel.thrift_spec), None, ),  # 0
        (1, TType.STRUCT, 'ire', (airavata.api.error.ttypes.InvalidRequestException, airavata.api.error.ttypes.InvalidRequestException.thrift_spec), None, ),  # 1
        (2, TType.STRUCT, 'enf', (airavata.api.error.ttypes.ExperimentNotFoundException, airavata.api.error.ttypes.ExperimentNotFoundException.thrift_spec), None, ),  # 2
        (3, TType.STRUCT, 'ace', (airavata.api.error.ttypes.AiravataClientException, airavata.api.error.ttypes.AiravataClientException.thrift_spec), None, ),  # 3
        (4, TType.STRUCT, 'ase', (airavata.api.error.ttypes.AiravataSystemException, airavata.api.error.ttypes.AiravataSystemException.thrift_spec), None, ),  # 4
        (5, TType.STRUCT, 'ae', (airavata.api.error.ttypes.AuthorizationException, 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 = airavata.model.experiment.ttypes.ExperimentModel()
                    self.success.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 1:
                if ftype == TType.STRUCT:
                    self.ire = airavata.api.error.ttypes.InvalidRequestException()
                    self.ire.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 2:
                if ftype == TType.STRUCT:
                    self.enf = airavata.api.error.ttypes.ExperimentNotFoundException()
                    self.enf.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 3:
                if ftype == TType.STRUCT:
                    self.ace = airavata.api.error.ttypes.AiravataClientException()
                    self.ace.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 4:
                if ftype == TType.STRUCT:
                    self.ase = airavata.api.error.ttypes.AiravataSystemException()
                    self.ase.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 5:
                if ftype == TType.STRUCT:
                    self.ae = 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', (airavata.model.security.ttypes.AuthzToken, 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 = 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', (airavata.model.experiment.ttypes.ExperimentModel, airavata.model.experiment.ttypes.ExperimentModel.thrift_spec), None, ),  # 0
        (1, TType.STRUCT, 'ire', (airavata.api.error.ttypes.InvalidRequestException, airavata.api.error.ttypes.InvalidRequestException.thrift_spec), None, ),  # 1
        (2, TType.STRUCT, 'enf', (airavata.api.error.ttypes.ExperimentNotFoundException, airavata.api.error.ttypes.ExperimentNotFoundException.thrift_spec), None, ),  # 2
        (3, TType.STRUCT, 'ace', (airavata.api.error.ttypes.AiravataClientException, airavata.api.error.ttypes.AiravataClientException.thrift_spec), None, ),  # 3
        (4, TType.STRUCT, 'ase', (airavata.api.error.ttypes.AiravataSystemException, airavata.api.error.ttypes.AiravataSystemException.thrift_spec), None, ),  # 4
        (5, TType.STRUCT, 'ae', (airavata.api.error.ttypes.AuthorizationException, 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 = airavata.model.experiment.ttypes.ExperimentModel()
                    self.success.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 1:
                if ftype == TType.STRUCT:
                    self.ire = airavata.api.error.ttypes.InvalidRequestException()
                    self.ire.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 2:
                if ftype == TType.STRUCT:
                    self.enf = airavata.api.error.ttypes.ExperimentNotFoundException()
                    self.enf.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 3:
                if ftype == TType.STRUCT:
                    self.ace = airavata.api.error.ttypes.AiravataClientException()
                    self.ace.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 4:
                if ftype == TType.STRUCT:
                    self.ase = airavata.api.error.ttypes.AiravataSystemException()
                    self.ase.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 5:
                if ftype == TType.STRUCT:
                    self.ae = 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', (airavata.model.security.ttypes.AuthzToken, airavata.model.security.ttypes.AuthzToken.thrift_spec), None, ),  # 1
        (2, TType.STRING, 'airavataExperimentId', 'UTF8', None, ),  # 2
        (3, TType.STRUCT, 'experiment', (airavata.model.experiment.ttypes.ExperimentModel, 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 = 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 = 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', (airavata.api.error.ttypes.InvalidRequestException, airavata.api.error.ttypes.InvalidRequestException.thrift_spec), None, ),  # 1
        (2, TType.STRUCT, 'enf', (airavata.api.error.ttypes.ExperimentNotFoundException, airavata.api.error.ttypes.ExperimentNotFoundException.thrift_spec), None, ),  # 2
        (3, TType.STRUCT, 'ace', (airavata.api.error.ttypes.AiravataClientException, airavata.api.error.ttypes.AiravataClientException.thrift_spec), None, ),  # 3
        (4, TType.STRUCT, 'ase', (airavata.api.error.ttypes.AiravataSystemException, airavata.api.error.ttypes.AiravataSystemException.thrift_spec), None, ),  # 4
        (5, TType.STRUCT, 'ae', (airavata.api.error.ttypes.AuthorizationException, 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 = airavata.api.error.ttypes.InvalidRequestException()
                    self.ire.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 2:
                if ftype == TType.STRUCT:
                    self.enf = airavata.api.error.ttypes.ExperimentNotFoundException()
                    self.enf.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 3:
                if ftype == TType.STRUCT:
                    self.ace = airavata.api.error.ttypes.AiravataClientException()
                    self.ace.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 4:
                if ftype == TType.STRUCT:
                    self.ase = airavata.api.error.ttypes.AiravataSystemException()
                    self.ase.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 5:
                if ftype == TType.STRUCT:
                    self.ae = 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', (airavata.model.security.ttypes.AuthzToken, airavata.model.security.ttypes.AuthzToken.thrift_spec), None, ),  # 1
        (2, TType.STRING, 'airavataExperimentId', 'UTF8', None, ),  # 2
        (3, TType.STRUCT, 'userConfiguration', (airavata.model.experiment.ttypes.UserConfigurationDataModel, 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 = 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 = 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', (airavata.api.error.ttypes.AuthorizationException, 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 = 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', (airavata.model.security.ttypes.AuthzToken, airavata.model.security.ttypes.AuthzToken.thrift_spec), None, ),  # 1
        (2, TType.STRING, 'airavataExperimentId', 'UTF8', None, ),  # 2
        (3, TType.STRUCT, 'resourceScheduling', (airavata.model.scheduling.ttypes.ComputationalResourceSchedulingModel, 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 = 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 = 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', (airavata.api.error.ttypes.AuthorizationException, 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 = 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', (airavata.model.security.ttypes.AuthzToken, 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 = 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', (airavata.api.error.ttypes.InvalidRequestException, airavata.api.error.ttypes.InvalidRequestException.thrift_spec), None, ),  # 1
        (2, TType.STRUCT, 'enf', (airavata.api.error.ttypes.ExperimentNotFoundException, airavata.api.error.ttypes.ExperimentNotFoundException.thrift_spec), None, ),  # 2
        (3, TType.STRUCT, 'ace', (airavata.api.error.ttypes.AiravataClientException, airavata.api.error.ttypes.AiravataClientException.thrift_spec), None, ),  # 3
        (4, TType.STRUCT, 'ase', (airavata.api.error.ttypes.AiravataSystemException, airavata.api.error.ttypes.AiravataSystemException.thrift_spec), None, ),  # 4
        (5, TType.STRUCT, 'ae', (airavata.api.error.ttypes.AuthorizationException, 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 = airavata.api.error.ttypes.InvalidRequestException()
                    self.ire.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 2:
                if ftype == TType.STRUCT:
                    self.enf = airavata.api.error.ttypes.ExperimentNotFoundException()
                    self.enf.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 3:
                if ftype == TType.STRUCT:
                    self.ace = airavata.api.error.ttypes.AiravataClientException()
                    self.ace.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 4:
                if ftype == TType.STRUCT:
                    self.ase = airavata.api.error.ttypes.AiravataSystemException()
                    self.ase.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 5:
                if ftype == TType.STRUCT:
                    self.ae = 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', (airavata.model.security.ttypes.AuthzToken, 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 = 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', (airavata.api.error.ttypes.InvalidRequestException, airavata.api.error.ttypes.InvalidRequestException.thrift_spec), None, ),  # 1
        (2, TType.STRUCT, 'enf', (airavata.api.error.ttypes.ExperimentNotFoundException, airavata.api.error.ttypes.ExperimentNotFoundException.thrift_spec), None, ),  # 2
        (3, TType.STRUCT, 'ace', (airavata.api.error.ttypes.AiravataClientException, airavata.api.error.ttypes.AiravataClientException.thrift_spec), None, ),  # 3
        (4, TType.STRUCT, 'ase', (airavata.api.error.ttypes.AiravataSystemException, airavata.api.error.ttypes.AiravataSystemException.thrift_spec), None, ),  # 4
        (5, TType.STRUCT, 'ae', (airavata.api.error.ttypes.AuthorizationException, 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 = airavata.api.error.ttypes.InvalidRequestException()
                    self.ire.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 2:
                if ftype == TType.STRUCT:
                    self.enf = airavata.api.error.ttypes.ExperimentNotFoundException()
                    self.enf.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 3:
                if ftype == TType.STRUCT:
                    self.ace = airavata.api.error.ttypes.AiravataClientException()
                    self.ace.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 4:
                if ftype == TType.STRUCT:
                    self.ase = airavata.api.error.ttypes.AiravataSystemException()
                    self.ase.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 5:
                if ftype == TType.STRUCT:
                    self.ae = 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', (airavata.model.security.ttypes.AuthzToken, 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 = 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', (airavata.model.status.ttypes.ExperimentStatus, airavata.model.status.ttypes.ExperimentStatus.thrift_spec), None, ),  # 0
        (1, TType.STRUCT, 'ire', (airavata.api.error.ttypes.InvalidRequestException, airavata.api.error.ttypes.InvalidRequestException.thrift_spec), None, ),  # 1
        (2, TType.STRUCT, 'enf', (airavata.api.error.ttypes.ExperimentNotFoundException, airavata.api.error.ttypes.ExperimentNotFoundException.thrift_spec), None, ),  # 2
        (3, TType.STRUCT, 'ace', (airavata.api.error.ttypes.AiravataClientException, airavata.api.error.ttypes.AiravataClientException.thrift_spec), None, ),  # 3
        (4, TType.STRUCT, 'ase', (airavata.api.error.ttypes.AiravataSystemException, airavata.api.error.ttypes.AiravataSystemException.thrift_spec), None, ),  # 4
        (5, TType.STRUCT, 'ae', (airavata.api.error.ttypes.AuthorizationException, 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 = airavata.model.status.ttypes.ExperimentStatus()
                    self.success.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 1:
                if ftype == TType.STRUCT:
                    self.ire = airavata.api.error.ttypes.InvalidRequestException()
                    self.ire.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 2:
                if ftype == TType.STRUCT:
                    self.enf = airavata.api.error.ttypes.ExperimentNotFoundException()
                    self.enf.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 3:
                if ftype == TType.STRUCT:
                    self.ace = airavata.api.error.ttypes.AiravataClientException()
                    self.ace.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 4:
                if ftype == TType.STRUCT:
                    self.ase = airavata.api.error.ttypes.AiravataSystemException()
                    self.ase.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 5:
                if ftype == TType.STRUCT:
                    self.ae = 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', (airavata.model.security.ttypes.AuthzToken, 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 = 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, (airavata.model.application.io.ttypes.OutputDataObjectType, airavata.model.application.io.ttypes.OutputDataObjectType.thrift_spec), False), None, ),  # 0
        (1, TType.STRUCT, 'ire', (airavata.api.error.ttypes.InvalidRequestException, airavata.api.error.ttypes.InvalidRequestException.thrift_spec), None, ),  # 1
        (2, TType.STRUCT, 'enf', (airavata.api.error.ttypes.ExperimentNotFoundException, airavata.api.error.ttypes.ExperimentNotFoundException.thrift_spec), None, ),  # 2
        (3, TType.STRUCT, 'ace', (airavata.api.error.ttypes.AiravataClientException, airavata.api.error.ttypes.AiravataClientException.thrift_spec), None, ),  # 3
        (4, TType.STRUCT, 'ase', (airavata.api.error.ttypes.AiravataSystemException, airavata.api.error.ttypes.AiravataSystemException.thrift_spec), None, ),  # 4
        (5, TType.STRUCT, 'ae', (airavata.api.error.ttypes.AuthorizationException, 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 = []
                    (_etype84, _size81) = iprot.readListBegin()
                    for _i85 in range(_size81):
                        _elem86 = airavata.model.application.io.ttypes.OutputDataObjectType()
                        _elem86.read(iprot)
                        self.success.append(_elem86)
                    iprot.readListEnd()
                else:
                    iprot.skip(ftype)
            elif fid == 1:
                if ftype == TType.STRUCT:
                    self.ire = airavata.api.error.ttypes.InvalidRequestException()
                    self.ire.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 2:
                if ftype == TType.STRUCT:
                    self.enf = airavata.api.error.ttypes.ExperimentNotFoundException()
                    self.enf.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 3:
                if ftype == TType.STRUCT:
                    self.ace = airavata.api.error.ttypes.AiravataClientException()
                    self.ace.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 4:
                if ftype == TType.STRUCT:
                    self.ase = airavata.api.error.ttypes.AiravataSystemException()
                    self.ase.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 5:
                if ftype == TType.STRUCT:
                    self.ae = 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 iter87 in self.success:
                iter87.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', (airavata.model.security.ttypes.AuthzToken, 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 = 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, (airavata.model.application.io.ttypes.OutputDataObjectType, airavata.model.application.io.ttypes.OutputDataObjectType.thrift_spec), False), None, ),  # 0
        (1, TType.STRUCT, 'ire', (airavata.api.error.ttypes.InvalidRequestException, airavata.api.error.ttypes.InvalidRequestException.thrift_spec), None, ),  # 1
        (2, TType.STRUCT, 'enf', (airavata.api.error.ttypes.ExperimentNotFoundException, airavata.api.error.ttypes.ExperimentNotFoundException.thrift_spec), None, ),  # 2
        (3, TType.STRUCT, 'ace', (airavata.api.error.ttypes.AiravataClientException, airavata.api.error.ttypes.AiravataClientException.thrift_spec), None, ),  # 3
        (4, TType.STRUCT, 'ase', (airavata.api.error.ttypes.AiravataSystemException, airavata.api.error.ttypes.AiravataSystemException.thrift_spec), None, ),  # 4
        (5, TType.STRUCT, 'ae', (airavata.api.error.ttypes.AuthorizationException, 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 = []
                    (_etype91, _size88) = iprot.readListBegin()
                    for _i92 in range(_size88):
                        _elem93 = airavata.model.application.io.ttypes.OutputDataObjectType()
                        _elem93.read(iprot)
                        self.success.append(_elem93)
                    iprot.readListEnd()
                else:
                    iprot.skip(ftype)
            elif fid == 1:
                if ftype == TType.STRUCT:
                    self.ire = airavata.api.error.ttypes.InvalidRequestException()
                    self.ire.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 2:
                if ftype == TType.STRUCT:
                    self.enf = airavata.api.error.ttypes.ExperimentNotFoundException()
                    self.enf.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 3:
                if ftype == TType.STRUCT:
                    self.ace = airavata.api.error.ttypes.AiravataClientException()
                    self.ace.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 4:
                if ftype == TType.STRUCT:
                    self.ase = airavata.api.error.ttypes.AiravataSystemException()
                    self.ase.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 5:
                if ftype == TType.STRUCT:
                    self.ae = 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 iter94 in self.success:
                iter94.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 fetchIntermediateOutputs_args(object):
    """
    Attributes:
     - authzToken
     - airavataExperimentId
     - outputNames
    """

    thrift_spec = (
        None,  # 0
        (1, TType.STRUCT, 'authzToken', (airavata.model.security.ttypes.AuthzToken, airavata.model.security.ttypes.AuthzToken.thrift_spec), None, ),  # 1
        (2, TType.STRING, 'airavataExperimentId', 'UTF8', None, ),  # 2
        (3, TType.LIST, 'outputNames', (TType.STRING, 'UTF8', False), None, ),  # 3
    )

    def __init__(self, authzToken=None, airavataExperimentId=None, outputNames=None,):
        self.authzToken = authzToken
        self.airavataExperimentId = airavataExperimentId
        self.outputNames = outputNames

    def read(self, iprot):
        if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None:
            iprot._fast_decode(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 = 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.LIST:
                    self.outputNames = []
                    (_etype98, _size95) = iprot.readListBegin()
                    for _i99 in range(_size95):
                        _elem100 = iprot.readString().decode('utf-8') if sys.version_info[0] == 2 else iprot.readString()
                        self.outputNames.append(_elem100)
                    iprot.readListEnd()
                else:
                    iprot.skip(ftype)
            else:
                iprot.skip(ftype)
            iprot.readFieldEnd()
        iprot.readStructEnd()

    def write(self, oprot):
        if oprot._fast_encode is not None and self.thrift_spec is not None:
            oprot.trans.write(oprot._fast_encode(self, (self.__class__, self.thrift_spec)))
            return
        oprot.writeStructBegin('fetchIntermediateOutputs_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.outputNames is not None:
            oprot.writeFieldBegin('outputNames', TType.LIST, 3)
            oprot.writeListBegin(TType.STRING, len(self.outputNames))
            for iter101 in self.outputNames:
                oprot.writeString(iter101.encode('utf-8') if sys.version_info[0] == 2 else iter101)
            oprot.writeListEnd()
            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.outputNames is None:
            raise TProtocolException(message='Required field outputNames 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 fetchIntermediateOutputs_result(object):
    """
    Attributes:
     - ire
     - enf
     - ace
     - ase
     - ae
    """

    thrift_spec = (
        None,  # 0
        (1, TType.STRUCT, 'ire', (airavata.api.error.ttypes.InvalidRequestException, airavata.api.error.ttypes.InvalidRequestException.thrift_spec), None, ),  # 1
        (2, TType.STRUCT, 'enf', (airavata.api.error.ttypes.ExperimentNotFoundException, airavata.api.error.ttypes.ExperimentNotFoundException.thrift_spec), None, ),  # 2
        (3, TType.STRUCT, 'ace', (airavata.api.error.ttypes.AiravataClientException, airavata.api.error.ttypes.AiravataClientException.thrift_spec), None, ),  # 3
        (4, TType.STRUCT, 'ase', (airavata.api.error.ttypes.AiravataSystemException, airavata.api.error.ttypes.AiravataSystemException.thrift_spec), None, ),  # 4
        (5, TType.STRUCT, 'ae', (airavata.api.error.ttypes.AuthorizationException, 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 = airavata.api.error.ttypes.InvalidRequestException()
                    self.ire.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 2:
                if ftype == TType.STRUCT:
                    self.enf = airavata.api.error.ttypes.ExperimentNotFoundException()
                    self.enf.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 3:
                if ftype == TType.STRUCT:
                    self.ace = airavata.api.error.ttypes.AiravataClientException()
                    self.ace.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 4:
                if ftype == TType.STRUCT:
                    self.ase = airavata.api.error.ttypes.AiravataSystemException()
                    self.ase.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 5:
                if ftype == TType.STRUCT:
                    self.ae = 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('fetchIntermediateOutputs_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 getIntermediateOutputProcessStatus_args(object):
    """
    Attributes:
     - authzToken
     - airavataExperimentId
     - outputNames
    """

    thrift_spec = (
        None,  # 0
        (1, TType.STRUCT, 'authzToken', (airavata.model.security.ttypes.AuthzToken, airavata.model.security.ttypes.AuthzToken.thrift_spec), None, ),  # 1
        (2, TType.STRING, 'airavataExperimentId', 'UTF8', None, ),  # 2
        (3, TType.LIST, 'outputNames', (TType.STRING, 'UTF8', False), None, ),  # 3
    )

    def __init__(self, authzToken=None, airavataExperimentId=None, outputNames=None,):
        self.authzToken = authzToken
        self.airavataExperimentId = airavataExperimentId
        self.outputNames = outputNames

    def read(self, iprot):
        if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None:
            iprot._fast_decode(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 = 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.LIST:
                    self.outputNames = []
                    (_etype105, _size102) = iprot.readListBegin()
                    for _i106 in range(_size102):
                        _elem107 = iprot.readString().decode('utf-8') if sys.version_info[0] == 2 else iprot.readString()
                        self.outputNames.append(_elem107)
                    iprot.readListEnd()
                else:
                    iprot.skip(ftype)
            else:
                iprot.skip(ftype)
            iprot.readFieldEnd()
        iprot.readStructEnd()

    def write(self, oprot):
        if oprot._fast_encode is not None and self.thrift_spec is not None:
            oprot.trans.write(oprot._fast_encode(self, (self.__class__, self.thrift_spec)))
            return
        oprot.writeStructBegin('getIntermediateOutputProcessStatus_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.outputNames is not None:
            oprot.writeFieldBegin('outputNames', TType.LIST, 3)
            oprot.writeListBegin(TType.STRING, len(self.outputNames))
            for iter108 in self.outputNames:
                oprot.writeString(iter108.encode('utf-8') if sys.version_info[0] == 2 else iter108)
            oprot.writeListEnd()
            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.outputNames is None:
            raise TProtocolException(message='Required field outputNames 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 getIntermediateOutputProcessStatus_result(object):
    """
    Attributes:
     - success
     - ire
     - enf
     - ace
     - ase
     - ae
    """

    thrift_spec = (
        (0, TType.STRUCT, 'success', (airavata.model.status.ttypes.ProcessStatus, airavata.model.status.ttypes.ProcessStatus.thrift_spec), None, ),  # 0
        (1, TType.STRUCT, 'ire', (airavata.api.error.ttypes.InvalidRequestException, airavata.api.error.ttypes.InvalidRequestException.thrift_spec), None, ),  # 1
        (2, TType.STRUCT, 'enf', (airavata.api.error.ttypes.ExperimentNotFoundException, airavata.api.error.ttypes.ExperimentNotFoundException.thrift_spec), None, ),  # 2
        (3, TType.STRUCT, 'ace', (airavata.api.error.ttypes.AiravataClientException, airavata.api.error.ttypes.AiravataClientException.thrift_spec), None, ),  # 3
        (4, TType.STRUCT, 'ase', (airavata.api.error.ttypes.AiravataSystemException, airavata.api.error.ttypes.AiravataSystemException.thrift_spec), None, ),  # 4
        (5, TType.STRUCT, 'ae', (airavata.api.error.ttypes.AuthorizationException, 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 = airavata.model.status.ttypes.ProcessStatus()
                    self.success.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 1:
                if ftype == TType.STRUCT:
                    self.ire = airavata.api.error.ttypes.InvalidRequestException()
                    self.ire.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 2:
                if ftype == TType.STRUCT:
                    self.enf = airavata.api.error.ttypes.ExperimentNotFoundException()
                    self.enf.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 3:
                if ftype == TType.STRUCT:
                    self.ace = airavata.api.error.ttypes.AiravataClientException()
                    self.ace.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 4:
                if ftype == TType.STRUCT:
                    self.ase = airavata.api.error.ttypes.AiravataSystemException()
                    self.ase.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 5:
                if ftype == TType.STRUCT:
                    self.ae = 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('getIntermediateOutputProcessStatus_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 getJobStatuses_args(object):
    """
    Attributes:
     - authzToken
     - airavataExperimentId
    """

    thrift_spec = (
        None,  # 0
        (1, TType.STRUCT, 'authzToken', (airavata.model.security.ttypes.AuthzToken, 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 = 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, (airavata.model.status.ttypes.JobStatus, airavata.model.status.ttypes.JobStatus.thrift_spec), False), None, ),  # 0
        (1, TType.STRUCT, 'ire', (airavata.api.error.ttypes.InvalidRequestException, airavata.api.error.ttypes.InvalidRequestException.thrift_spec), None, ),  # 1
        (2, TType.STRUCT, 'enf', (airavata.api.error.ttypes.ExperimentNotFoundException, airavata.api.error.ttypes.ExperimentNotFoundException.thrift_spec), None, ),  # 2
        (3, TType.STRUCT, 'ace', (airavata.api.error.ttypes.AiravataClientException, airavata.api.error.ttypes.AiravataClientException.thrift_spec), None, ),  # 3
        (4, TType.STRUCT, 'ase', (airavata.api.error.ttypes.AiravataSystemException, airavata.api.error.ttypes.AiravataSystemException.thrift_spec), None, ),  # 4
        (5, TType.STRUCT, 'ae', (airavata.api.error.ttypes.AuthorizationException, 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 = {}
                    (_ktype110, _vtype111, _size109) = iprot.readMapBegin()
                    for _i113 in range(_size109):
                        _key114 = iprot.readString().decode('utf-8') if sys.version_info[0] == 2 else iprot.readString()
                        _val115 = airavata.model.status.ttypes.JobStatus()
                        _val115.read(iprot)
                        self.success[_key114] = _val115
                    iprot.readMapEnd()
                else:
                    iprot.skip(ftype)
            elif fid == 1:
                if ftype == TType.STRUCT:
                    self.ire = airavata.api.error.ttypes.InvalidRequestException()
                    self.ire.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 2:
                if ftype == TType.STRUCT:
                    self.enf = airavata.api.error.ttypes.ExperimentNotFoundException()
                    self.enf.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 3:
                if ftype == TType.STRUCT:
                    self.ace = airavata.api.error.ttypes.AiravataClientException()
                    self.ace.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 4:
                if ftype == TType.STRUCT:
                    self.ase = airavata.api.error.ttypes.AiravataSystemException()
                    self.ase.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 5:
                if ftype == TType.STRUCT:
                    self.ae = 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 kiter116, viter117 in self.success.items():
                oprot.writeString(kiter116.encode('utf-8') if sys.version_info[0] == 2 else kiter116)
                viter117.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', (airavata.model.security.ttypes.AuthzToken, 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 = 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, (airavata.model.job.ttypes.JobModel, airavata.model.job.ttypes.JobModel.thrift_spec), False), None, ),  # 0
        (1, TType.STRUCT, 'ire', (airavata.api.error.ttypes.InvalidRequestException, airavata.api.error.ttypes.InvalidRequestException.thrift_spec), None, ),  # 1
        (2, TType.STRUCT, 'enf', (airavata.api.error.ttypes.ExperimentNotFoundException, airavata.api.error.ttypes.ExperimentNotFoundException.thrift_spec), None, ),  # 2
        (3, TType.STRUCT, 'ace', (airavata.api.error.ttypes.AiravataClientException, airavata.api.error.ttypes.AiravataClientException.thrift_spec), None, ),  # 3
        (4, TType.STRUCT, 'ase', (airavata.api.error.ttypes.AiravataSystemException, airavata.api.error.ttypes.AiravataSystemException.thrift_spec), None, ),  # 4
        (5, TType.STRUCT, 'ae', (airavata.api.error.ttypes.AuthorizationException, 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 = []
                    (_etype121, _size118) = iprot.readListBegin()
                    for _i122 in range(_size118):
                        _elem123 = airavata.model.job.ttypes.JobModel()
                        _elem123.read(iprot)
                        self.success.append(_elem123)
                    iprot.readListEnd()
                else:
                    iprot.skip(ftype)
            elif fid == 1:
                if ftype == TType.STRUCT:
                    self.ire = airavata.api.error.ttypes.InvalidRequestException()
                    self.ire.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 2:
                if ftype == TType.STRUCT:
                    self.enf = airavata.api.error.ttypes.ExperimentNotFoundException()
                    self.enf.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 3:
                if ftype == TType.STRUCT:
                    self.ace = airavata.api.error.ttypes.AiravataClientException()
                    self.ace.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 4:
                if ftype == TType.STRUCT:
                    self.ase = airavata.api.error.ttypes.AiravataSystemException()
                    self.ase.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 5:
                if ftype == TType.STRUCT:
                    self.ae = 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 iter124 in self.success:
                iter124.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', (airavata.model.security.ttypes.AuthzToken, 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 = 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', (airavata.api.error.ttypes.InvalidRequestException, airavata.api.error.ttypes.InvalidRequestException.thrift_spec), None, ),  # 1
        (2, TType.STRUCT, 'enf', (airavata.api.error.ttypes.ExperimentNotFoundException, airavata.api.error.ttypes.ExperimentNotFoundException.thrift_spec), None, ),  # 2
        (3, TType.STRUCT, 'ace', (airavata.api.error.ttypes.AiravataClientException, airavata.api.error.ttypes.AiravataClientException.thrift_spec), None, ),  # 3
        (4, TType.STRUCT, 'ase', (airavata.api.error.ttypes.AiravataSystemException, airavata.api.error.ttypes.AiravataSystemException.thrift_spec), None, ),  # 4
        (5, TType.STRUCT, 'ae', (airavata.api.error.ttypes.AuthorizationException, airavata.api.error.ttypes.AuthorizationException.thrift_spec), None, ),  # 5
        (6, TType.STRUCT, 'pnfe', (airavata.api.error.ttypes.ProjectNotFoundException, 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 = airavata.api.error.ttypes.InvalidRequestException()
                    self.ire.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 2:
                if ftype == TType.STRUCT:
                    self.enf = airavata.api.error.ttypes.ExperimentNotFoundException()
                    self.enf.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 3:
                if ftype == TType.STRUCT:
                    self.ace = airavata.api.error.ttypes.AiravataClientException()
                    self.ace.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 4:
                if ftype == TType.STRUCT:
                    self.ase = airavata.api.error.ttypes.AiravataSystemException()
                    self.ase.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 5:
                if ftype == TType.STRUCT:
                    self.ae = airavata.api.error.ttypes.AuthorizationException()
                    self.ae.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 6:
                if ftype == TType.STRUCT:
                    self.pnfe = 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', (airavata.model.security.ttypes.AuthzToken, 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 = 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', (airavata.api.error.ttypes.InvalidRequestException, airavata.api.error.ttypes.InvalidRequestException.thrift_spec), None, ),  # 1
        (2, TType.STRUCT, 'enf', (airavata.api.error.ttypes.ExperimentNotFoundException, airavata.api.error.ttypes.ExperimentNotFoundException.thrift_spec), None, ),  # 2
        (3, TType.STRUCT, 'ace', (airavata.api.error.ttypes.AiravataClientException, airavata.api.error.ttypes.AiravataClientException.thrift_spec), None, ),  # 3
        (4, TType.STRUCT, 'ase', (airavata.api.error.ttypes.AiravataSystemException, airavata.api.error.ttypes.AiravataSystemException.thrift_spec), None, ),  # 4
        (5, TType.STRUCT, 'ae', (airavata.api.error.ttypes.AuthorizationException, airavata.api.error.ttypes.AuthorizationException.thrift_spec), None, ),  # 5
        (6, TType.STRUCT, 'pnfe', (airavata.api.error.ttypes.ProjectNotFoundException, 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 = airavata.api.error.ttypes.InvalidRequestException()
                    self.ire.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 2:
                if ftype == TType.STRUCT:
                    self.enf = airavata.api.error.ttypes.ExperimentNotFoundException()
                    self.enf.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 3:
                if ftype == TType.STRUCT:
                    self.ace = airavata.api.error.ttypes.AiravataClientException()
                    self.ace.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 4:
                if ftype == TType.STRUCT:
                    self.ase = airavata.api.error.ttypes.AiravataSystemException()
                    self.ase.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 5:
                if ftype == TType.STRUCT:
                    self.ae = airavata.api.error.ttypes.AuthorizationException()
                    self.ae.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 6:
                if ftype == TType.STRUCT:
                    self.pnfe = 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', (airavata.model.security.ttypes.AuthzToken, 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 = 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', (airavata.api.error.ttypes.InvalidRequestException, airavata.api.error.ttypes.InvalidRequestException.thrift_spec), None, ),  # 1
        (2, TType.STRUCT, 'enf', (airavata.api.error.ttypes.ExperimentNotFoundException, airavata.api.error.ttypes.ExperimentNotFoundException.thrift_spec), None, ),  # 2
        (3, TType.STRUCT, 'ace', (airavata.api.error.ttypes.AiravataClientException, airavata.api.error.ttypes.AiravataClientException.thrift_spec), None, ),  # 3
        (4, TType.STRUCT, 'ase', (airavata.api.error.ttypes.AiravataSystemException, airavata.api.error.ttypes.AiravataSystemException.thrift_spec), None, ),  # 4
        (5, TType.STRUCT, 'ae', (airavata.api.error.ttypes.AuthorizationException, 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 = airavata.api.error.ttypes.InvalidRequestException()
                    self.ire.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 2:
                if ftype == TType.STRUCT:
                    self.enf = airavata.api.error.ttypes.ExperimentNotFoundException()
                    self.enf.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 3:
                if ftype == TType.STRUCT:
                    self.ace = airavata.api.error.ttypes.AiravataClientException()
                    self.ace.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 4:
                if ftype == TType.STRUCT:
                    self.ase = airavata.api.error.ttypes.AiravataSystemException()
                    self.ase.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 5:
                if ftype == TType.STRUCT:
                    self.ae = 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', (airavata.model.security.ttypes.AuthzToken, airavata.model.security.ttypes.AuthzToken.thrift_spec), None, ),  # 1
        (2, TType.STRING, 'gatewayId', 'UTF8', None, ),  # 2
        (3, TType.STRUCT, 'applicationModule', (airavata.model.appcatalog.appdeployment.ttypes.ApplicationModule, 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 = 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 = 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', (airavata.api.error.ttypes.InvalidRequestException, airavata.api.error.ttypes.InvalidRequestException.thrift_spec), None, ),  # 1
        (2, TType.STRUCT, 'ace', (airavata.api.error.ttypes.AiravataClientException, airavata.api.error.ttypes.AiravataClientException.thrift_spec), None, ),  # 2
        (3, TType.STRUCT, 'ase', (airavata.api.error.ttypes.AiravataSystemException, airavata.api.error.ttypes.AiravataSystemException.thrift_spec), None, ),  # 3
        (4, TType.STRUCT, 'ae', (airavata.api.error.ttypes.AuthorizationException, 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 = airavata.api.error.ttypes.InvalidRequestException()
                    self.ire.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 2:
                if ftype == TType.STRUCT:
                    self.ace = airavata.api.error.ttypes.AiravataClientException()
                    self.ace.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 3:
                if ftype == TType.STRUCT:
                    self.ase = airavata.api.error.ttypes.AiravataSystemException()
                    self.ase.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 4:
                if ftype == TType.STRUCT:
                    self.ae = 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', (airavata.model.security.ttypes.AuthzToken, 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 = 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', (airavata.model.appcatalog.appdeployment.ttypes.ApplicationModule, airavata.model.appcatalog.appdeployment.ttypes.ApplicationModule.thrift_spec), None, ),  # 0
        (1, TType.STRUCT, 'ire', (airavata.api.error.ttypes.InvalidRequestException, airavata.api.error.ttypes.InvalidRequestException.thrift_spec), None, ),  # 1
        (2, TType.STRUCT, 'ace', (airavata.api.error.ttypes.AiravataClientException, airavata.api.error.ttypes.AiravataClientException.thrift_spec), None, ),  # 2
        (3, TType.STRUCT, 'ase', (airavata.api.error.ttypes.AiravataSystemException, airavata.api.error.ttypes.AiravataSystemException.thrift_spec), None, ),  # 3
        (4, TType.STRUCT, 'ae', (airavata.api.error.ttypes.AuthorizationException, 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 = airavata.model.appcatalog.appdeployment.ttypes.ApplicationModule()
                    self.success.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 1:
                if ftype == TType.STRUCT:
                    self.ire = airavata.api.error.ttypes.InvalidRequestException()
                    self.ire.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 2:
                if ftype == TType.STRUCT:
                    self.ace = airavata.api.error.ttypes.AiravataClientException()
                    self.ace.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 3:
                if ftype == TType.STRUCT:
                    self.ase = airavata.api.error.ttypes.AiravataSystemException()
                    self.ase.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 4:
                if ftype == TType.STRUCT:
                    self.ae = 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', (airavata.model.security.ttypes.AuthzToken, airavata.model.security.ttypes.AuthzToken.thrift_spec), None, ),  # 1
        (2, TType.STRING, 'appModuleId', 'UTF8', None, ),  # 2
        (3, TType.STRUCT, 'applicationModule', (airavata.model.appcatalog.appdeployment.ttypes.ApplicationModule, 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 = 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 = 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', (airavata.api.error.ttypes.InvalidRequestException, airavata.api.error.ttypes.InvalidRequestException.thrift_spec), None, ),  # 1
        (2, TType.STRUCT, 'ace', (airavata.api.error.ttypes.AiravataClientException, airavata.api.error.ttypes.AiravataClientException.thrift_spec), None, ),  # 2
        (3, TType.STRUCT, 'ase', (airavata.api.error.ttypes.AiravataSystemException, airavata.api.error.ttypes.AiravataSystemException.thrift_spec), None, ),  # 3
        (4, TType.STRUCT, 'ae', (airavata.api.error.ttypes.AuthorizationException, 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 = airavata.api.error.ttypes.InvalidRequestException()
                    self.ire.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 2:
                if ftype == TType.STRUCT:
                    self.ace = airavata.api.error.ttypes.AiravataClientException()
                    self.ace.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 3:
                if ftype == TType.STRUCT:
                    self.ase = airavata.api.error.ttypes.AiravataSystemException()
                    self.ase.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 4:
                if ftype == TType.STRUCT:
                    self.ae = 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', (airavata.model.security.ttypes.AuthzToken, 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 = 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, (airavata.model.appcatalog.appdeployment.ttypes.ApplicationModule, airavata.model.appcatalog.appdeployment.ttypes.ApplicationModule.thrift_spec), False), None, ),  # 0
        (1, TType.STRUCT, 'ire', (airavata.api.error.ttypes.InvalidRequestException, airavata.api.error.ttypes.InvalidRequestException.thrift_spec), None, ),  # 1
        (2, TType.STRUCT, 'ace', (airavata.api.error.ttypes.AiravataClientException, airavata.api.error.ttypes.AiravataClientException.thrift_spec), None, ),  # 2
        (3, TType.STRUCT, 'ase', (airavata.api.error.ttypes.AiravataSystemException, airavata.api.error.ttypes.AiravataSystemException.thrift_spec), None, ),  # 3
        (4, TType.STRUCT, 'ae', (airavata.api.error.ttypes.AuthorizationException, 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 = []
                    (_etype128, _size125) = iprot.readListBegin()
                    for _i129 in range(_size125):
                        _elem130 = airavata.model.appcatalog.appdeployment.ttypes.ApplicationModule()
                        _elem130.read(iprot)
                        self.success.append(_elem130)
                    iprot.readListEnd()
                else:
                    iprot.skip(ftype)
            elif fid == 1:
                if ftype == TType.STRUCT:
                    self.ire = airavata.api.error.ttypes.InvalidRequestException()
                    self.ire.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 2:
                if ftype == TType.STRUCT:
                    self.ace = airavata.api.error.ttypes.AiravataClientException()
                    self.ace.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 3:
                if ftype == TType.STRUCT:
                    self.ase = airavata.api.error.ttypes.AiravataSystemException()
                    self.ase.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 4:
                if ftype == TType.STRUCT:
                    self.ae = 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 iter131 in self.success:
                iter131.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 getAccessibleAppModules_args(object):
    """
    Attributes:
     - authzToken
     - gatewayId
    """

    thrift_spec = (
        None,  # 0
        (1, TType.STRUCT, 'authzToken', (airavata.model.security.ttypes.AuthzToken, 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 = 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('getAccessibleAppModules_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 getAccessibleAppModules_result(object):
    """
    Attributes:
     - success
     - ire
     - ace
     - ase
     - ae
    """

    thrift_spec = (
        (0, TType.LIST, 'success', (TType.STRUCT, (airavata.model.appcatalog.appdeployment.ttypes.ApplicationModule, airavata.model.appcatalog.appdeployment.ttypes.ApplicationModule.thrift_spec), False), None, ),  # 0
        (1, TType.STRUCT, 'ire', (airavata.api.error.ttypes.InvalidRequestException, airavata.api.error.ttypes.InvalidRequestException.thrift_spec), None, ),  # 1
        (2, TType.STRUCT, 'ace', (airavata.api.error.ttypes.AiravataClientException, airavata.api.error.ttypes.AiravataClientException.thrift_spec), None, ),  # 2
        (3, TType.STRUCT, 'ase', (airavata.api.error.ttypes.AiravataSystemException, airavata.api.error.ttypes.AiravataSystemException.thrift_spec), None, ),  # 3
        (4, TType.STRUCT, 'ae', (airavata.api.error.ttypes.AuthorizationException, 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 = []
                    (_etype135, _size132) = iprot.readListBegin()
                    for _i136 in range(_size132):
                        _elem137 = airavata.model.appcatalog.appdeployment.ttypes.ApplicationModule()
                        _elem137.read(iprot)
                        self.success.append(_elem137)
                    iprot.readListEnd()
                else:
                    iprot.skip(ftype)
            elif fid == 1:
                if ftype == TType.STRUCT:
                    self.ire = airavata.api.error.ttypes.InvalidRequestException()
                    self.ire.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 2:
                if ftype == TType.STRUCT:
                    self.ace = airavata.api.error.ttypes.AiravataClientException()
                    self.ace.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 3:
                if ftype == TType.STRUCT:
                    self.ase = airavata.api.error.ttypes.AiravataSystemException()
                    self.ase.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 4:
                if ftype == TType.STRUCT:
                    self.ae = 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('getAccessibleAppModules_result')
        if self.success is not None:
            oprot.writeFieldBegin('success', TType.LIST, 0)
            oprot.writeListBegin(TType.STRUCT, len(self.success))
            for iter138 in self.success:
                iter138.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', (airavata.model.security.ttypes.AuthzToken, 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 = 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', (airavata.api.error.ttypes.InvalidRequestException, airavata.api.error.ttypes.InvalidRequestException.thrift_spec), None, ),  # 1
        (2, TType.STRUCT, 'ace', (airavata.api.error.ttypes.AiravataClientException, airavata.api.error.ttypes.AiravataClientException.thrift_spec), None, ),  # 2
        (3, TType.STRUCT, 'ase', (airavata.api.error.ttypes.AiravataSystemException, airavata.api.error.ttypes.AiravataSystemException.thrift_spec), None, ),  # 3
        (4, TType.STRUCT, 'ae', (airavata.api.error.ttypes.AuthorizationException, 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 = airavata.api.error.ttypes.InvalidRequestException()
                    self.ire.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 2:
                if ftype == TType.STRUCT:
                    self.ace = airavata.api.error.ttypes.AiravataClientException()
                    self.ace.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 3:
                if ftype == TType.STRUCT:
                    self.ase = airavata.api.error.ttypes.AiravataSystemException()
                    self.ase.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 4:
                if ftype == TType.STRUCT:
                    self.ae = 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', (airavata.model.security.ttypes.AuthzToken, airavata.model.security.ttypes.AuthzToken.thrift_spec), None, ),  # 1
        (2, TType.STRING, 'gatewayId', 'UTF8', None, ),  # 2
        (3, TType.STRUCT, 'applicationDeployment', (airavata.model.appcatalog.appdeployment.ttypes.ApplicationDeploymentDescription, 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 = 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 = 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', (airavata.api.error.ttypes.InvalidRequestException, airavata.api.error.ttypes.InvalidRequestException.thrift_spec), None, ),  # 1
        (2, TType.STRUCT, 'ace', (airavata.api.error.ttypes.AiravataClientException, airavata.api.error.ttypes.AiravataClientException.thrift_spec), None, ),  # 2
        (3, TType.STRUCT, 'ase', (airavata.api.error.ttypes.AiravataSystemException, airavata.api.error.ttypes.AiravataSystemException.thrift_spec), None, ),  # 3
        (4, TType.STRUCT, 'ae', (airavata.api.error.ttypes.AuthorizationException, 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 = airavata.api.error.ttypes.InvalidRequestException()
                    self.ire.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 2:
                if ftype == TType.STRUCT:
                    self.ace = airavata.api.error.ttypes.AiravataClientException()
                    self.ace.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 3:
                if ftype == TType.STRUCT:
                    self.ase = airavata.api.error.ttypes.AiravataSystemException()
                    self.ase.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 4:
                if ftype == TType.STRUCT:
                    self.ae = 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', (airavata.model.security.ttypes.AuthzToken, 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 = 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', (airavata.model.appcatalog.appdeployment.ttypes.ApplicationDeploymentDescription, airavata.model.appcatalog.appdeployment.ttypes.ApplicationDeploymentDescription.thrift_spec), None, ),  # 0
        (1, TType.STRUCT, 'ire', (airavata.api.error.ttypes.InvalidRequestException, airavata.api.error.ttypes.InvalidRequestException.thrift_spec), None, ),  # 1
        (2, TType.STRUCT, 'ace', (airavata.api.error.ttypes.AiravataClientException, airavata.api.error.ttypes.AiravataClientException.thrift_spec), None, ),  # 2
        (3, TType.STRUCT, 'ase', (airavata.api.error.ttypes.AiravataSystemException, airavata.api.error.ttypes.AiravataSystemException.thrift_spec), None, ),  # 3
        (4, TType.STRUCT, 'ae', (airavata.api.error.ttypes.AuthorizationException, 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 = airavata.model.appcatalog.appdeployment.ttypes.ApplicationDeploymentDescription()
                    self.success.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 1:
                if ftype == TType.STRUCT:
                    self.ire = airavata.api.error.ttypes.InvalidRequestException()
                    self.ire.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 2:
                if ftype == TType.STRUCT:
                    self.ace = airavata.api.error.ttypes.AiravataClientException()
                    self.ace.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 3:
                if ftype == TType.STRUCT:
                    self.ase = airavata.api.error.ttypes.AiravataSystemException()
                    self.ase.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 4:
                if ftype == TType.STRUCT:
                    self.ae = 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', (airavata.model.security.ttypes.AuthzToken, airavata.model.security.ttypes.AuthzToken.thrift_spec), None, ),  # 1
        (2, TType.STRING, 'appDeploymentId', 'UTF8', None, ),  # 2
        (3, TType.STRUCT, 'applicationDeployment', (airavata.model.appcatalog.appdeployment.ttypes.ApplicationDeploymentDescription, 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 = 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 = 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', (airavata.api.error.ttypes.InvalidRequestException, airavata.api.error.ttypes.InvalidRequestException.thrift_spec), None, ),  # 1
        (2, TType.STRUCT, 'ace', (airavata.api.error.ttypes.AiravataClientException, airavata.api.error.ttypes.AiravataClientException.thrift_spec), None, ),  # 2
        (3, TType.STRUCT, 'ase', (airavata.api.error.ttypes.AiravataSystemException, airavata.api.error.ttypes.AiravataSystemException.thrift_spec), None, ),  # 3
        (4, TType.STRUCT, 'ae', (airavata.api.error.ttypes.AuthorizationException, 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 = airavata.api.error.ttypes.InvalidRequestException()
                    self.ire.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 2:
                if ftype == TType.STRUCT:
                    self.ace = airavata.api.error.ttypes.AiravataClientException()
                    self.ace.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 3:
                if ftype == TType.STRUCT:
                    self.ase = airavata.api.error.ttypes.AiravataSystemException()
                    self.ase.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 4:
                if ftype == TType.STRUCT:
                    self.ae = 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', (airavata.model.security.ttypes.AuthzToken, 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 = 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', (airavata.api.error.ttypes.InvalidRequestException, airavata.api.error.ttypes.InvalidRequestException.thrift_spec), None, ),  # 1
        (2, TType.STRUCT, 'ace', (airavata.api.error.ttypes.AiravataClientException, airavata.api.error.ttypes.AiravataClientException.thrift_spec), None, ),  # 2
        (3, TType.STRUCT, 'ase', (airavata.api.error.ttypes.AiravataSystemException, airavata.api.error.ttypes.AiravataSystemException.thrift_spec), None, ),  # 3
        (4, TType.STRUCT, 'ae', (airavata.api.error.ttypes.AuthorizationException, 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 = airavata.api.error.ttypes.InvalidRequestException()
                    self.ire.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 2:
                if ftype == TType.STRUCT:
                    self.ace = airavata.api.error.ttypes.AiravataClientException()
                    self.ace.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 3:
                if ftype == TType.STRUCT:
                    self.ase = airavata.api.error.ttypes.AiravataSystemException()
                    self.ase.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 4:
                if ftype == TType.STRUCT:
                    self.ae = 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', (airavata.model.security.ttypes.AuthzToken, 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 = 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, (airavata.model.appcatalog.appdeployment.ttypes.ApplicationDeploymentDescription, airavata.model.appcatalog.appdeployment.ttypes.ApplicationDeploymentDescription.thrift_spec), False), None, ),  # 0
        (1, TType.STRUCT, 'ire', (airavata.api.error.ttypes.InvalidRequestException, airavata.api.error.ttypes.InvalidRequestException.thrift_spec), None, ),  # 1
        (2, TType.STRUCT, 'ace', (airavata.api.error.ttypes.AiravataClientException, airavata.api.error.ttypes.AiravataClientException.thrift_spec), None, ),  # 2
        (3, TType.STRUCT, 'ase', (airavata.api.error.ttypes.AiravataSystemException, airavata.api.error.ttypes.AiravataSystemException.thrift_spec), None, ),  # 3
        (4, TType.STRUCT, 'ae', (airavata.api.error.ttypes.AuthorizationException, 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 = []
                    (_etype142, _size139) = iprot.readListBegin()
                    for _i143 in range(_size139):
                        _elem144 = airavata.model.appcatalog.appdeployment.ttypes.ApplicationDeploymentDescription()
                        _elem144.read(iprot)
                        self.success.append(_elem144)
                    iprot.readListEnd()
                else:
                    iprot.skip(ftype)
            elif fid == 1:
                if ftype == TType.STRUCT:
                    self.ire = airavata.api.error.ttypes.InvalidRequestException()
                    self.ire.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 2:
                if ftype == TType.STRUCT:
                    self.ace = airavata.api.error.ttypes.AiravataClientException()
                    self.ace.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 3:
                if ftype == TType.STRUCT:
                    self.ase = airavata.api.error.ttypes.AiravataSystemException()
                    self.ase.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 4:
                if ftype == TType.STRUCT:
                    self.ae = 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 iter145 in self.success:
                iter145.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 getAccessibleApplicationDeployments_args(object):
    """
    Attributes:
     - authzToken
     - gatewayId
     - permissionType
    """

    thrift_spec = (
        None,  # 0
        (1, TType.STRUCT, 'authzToken', (airavata.model.security.ttypes.AuthzToken, airavata.model.security.ttypes.AuthzToken.thrift_spec), None, ),  # 1
        (2, TType.STRING, 'gatewayId', 'UTF8', None, ),  # 2
        (3, TType.I32, 'permissionType', None, None, ),  # 3
    )

    def __init__(self, authzToken=None, gatewayId=None, permissionType=None,):
        self.authzToken = authzToken
        self.gatewayId = gatewayId
        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 = 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.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('getAccessibleApplicationDeployments_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.permissionType is not None:
            oprot.writeFieldBegin('permissionType', TType.I32, 3)
            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.gatewayId is None:
            raise TProtocolException(message='Required field gatewayId 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 getAccessibleApplicationDeployments_result(object):
    """
    Attributes:
     - success
     - ire
     - ace
     - ase
     - ae
    """

    thrift_spec = (
        (0, TType.LIST, 'success', (TType.STRUCT, (airavata.model.appcatalog.appdeployment.ttypes.ApplicationDeploymentDescription, airavata.model.appcatalog.appdeployment.ttypes.ApplicationDeploymentDescription.thrift_spec), False), None, ),  # 0
        (1, TType.STRUCT, 'ire', (airavata.api.error.ttypes.InvalidRequestException, airavata.api.error.ttypes.InvalidRequestException.thrift_spec), None, ),  # 1
        (2, TType.STRUCT, 'ace', (airavata.api.error.ttypes.AiravataClientException, airavata.api.error.ttypes.AiravataClientException.thrift_spec), None, ),  # 2
        (3, TType.STRUCT, 'ase', (airavata.api.error.ttypes.AiravataSystemException, airavata.api.error.ttypes.AiravataSystemException.thrift_spec), None, ),  # 3
        (4, TType.STRUCT, 'ae', (airavata.api.error.ttypes.AuthorizationException, 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 = []
                    (_etype149, _size146) = iprot.readListBegin()
                    for _i150 in range(_size146):
                        _elem151 = airavata.model.appcatalog.appdeployment.ttypes.ApplicationDeploymentDescription()
                        _elem151.read(iprot)
                        self.success.append(_elem151)
                    iprot.readListEnd()
                else:
                    iprot.skip(ftype)
            elif fid == 1:
                if ftype == TType.STRUCT:
                    self.ire = airavata.api.error.ttypes.InvalidRequestException()
                    self.ire.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 2:
                if ftype == TType.STRUCT:
                    self.ace = airavata.api.error.ttypes.AiravataClientException()
                    self.ace.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 3:
                if ftype == TType.STRUCT:
                    self.ase = airavata.api.error.ttypes.AiravataSystemException()
                    self.ase.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 4:
                if ftype == TType.STRUCT:
                    self.ae = 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('getAccessibleApplicationDeployments_result')
        if self.success is not None:
            oprot.writeFieldBegin('success', TType.LIST, 0)
            oprot.writeListBegin(TType.STRUCT, len(self.success))
            for iter152 in self.success:
                iter152.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', (airavata.model.security.ttypes.AuthzToken, 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 = 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', (airavata.api.error.ttypes.InvalidRequestException, airavata.api.error.ttypes.InvalidRequestException.thrift_spec), None, ),  # 1
        (2, TType.STRUCT, 'ace', (airavata.api.error.ttypes.AiravataClientException, airavata.api.error.ttypes.AiravataClientException.thrift_spec), None, ),  # 2
        (3, TType.STRUCT, 'ase', (airavata.api.error.ttypes.AiravataSystemException, airavata.api.error.ttypes.AiravataSystemException.thrift_spec), None, ),  # 3
        (4, TType.STRUCT, 'ae', (airavata.api.error.ttypes.AuthorizationException, 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 = []
                    (_etype156, _size153) = iprot.readListBegin()
                    for _i157 in range(_size153):
                        _elem158 = iprot.readString().decode('utf-8') if sys.version_info[0] == 2 else iprot.readString()
                        self.success.append(_elem158)
                    iprot.readListEnd()
                else:
                    iprot.skip(ftype)
            elif fid == 1:
                if ftype == TType.STRUCT:
                    self.ire = airavata.api.error.ttypes.InvalidRequestException()
                    self.ire.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 2:
                if ftype == TType.STRUCT:
                    self.ace = airavata.api.error.ttypes.AiravataClientException()
                    self.ace.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 3:
                if ftype == TType.STRUCT:
                    self.ase = airavata.api.error.ttypes.AiravataSystemException()
                    self.ase.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 4:
                if ftype == TType.STRUCT:
                    self.ae = 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 iter159 in self.success:
                oprot.writeString(iter159.encode('utf-8') if sys.version_info[0] == 2 else iter159)
            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 getApplicationDeploymentsForAppModuleAndGroupResourceProfile_args(object):
    """
    Attributes:
     - authzToken
     - appModuleId
     - groupResourceProfileId
    """

    thrift_spec = (
        None,  # 0
        (1, TType.STRUCT, 'authzToken', (airavata.model.security.ttypes.AuthzToken, airavata.model.security.ttypes.AuthzToken.thrift_spec), None, ),  # 1
        (2, TType.STRING, 'appModuleId', 'UTF8', None, ),  # 2
        (3, TType.STRING, 'groupResourceProfileId', 'UTF8', None, ),  # 3
    )

    def __init__(self, authzToken=None, appModuleId=None, groupResourceProfileId=None,):
        self.authzToken = authzToken
        self.appModuleId = appModuleId
        self.groupResourceProfileId = groupResourceProfileId

    def read(self, iprot):
        if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None:
            iprot._fast_decode(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 = 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.STRING:
                    self.groupResourceProfileId = 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('getApplicationDeploymentsForAppModuleAndGroupResourceProfile_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.groupResourceProfileId is not None:
            oprot.writeFieldBegin('groupResourceProfileId', TType.STRING, 3)
            oprot.writeString(self.groupResourceProfileId.encode('utf-8') if sys.version_info[0] == 2 else self.groupResourceProfileId)
            oprot.writeFieldEnd()
        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.groupResourceProfileId is None:
            raise TProtocolException(message='Required field groupResourceProfileId is unset!')
        return

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

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

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


class getApplicationDeploymentsForAppModuleAndGroupResourceProfile_result(object):
    """
    Attributes:
     - success
     - ire
     - ace
     - ase
     - ae
    """

    thrift_spec = (
        (0, TType.LIST, 'success', (TType.STRUCT, (airavata.model.appcatalog.appdeployment.ttypes.ApplicationDeploymentDescription, airavata.model.appcatalog.appdeployment.ttypes.ApplicationDeploymentDescription.thrift_spec), False), None, ),  # 0
        (1, TType.STRUCT, 'ire', (airavata.api.error.ttypes.InvalidRequestException, airavata.api.error.ttypes.InvalidRequestException.thrift_spec), None, ),  # 1
        (2, TType.STRUCT, 'ace', (airavata.api.error.ttypes.AiravataClientException, airavata.api.error.ttypes.AiravataClientException.thrift_spec), None, ),  # 2
        (3, TType.STRUCT, 'ase', (airavata.api.error.ttypes.AiravataSystemException, airavata.api.error.ttypes.AiravataSystemException.thrift_spec), None, ),  # 3
        (4, TType.STRUCT, 'ae', (airavata.api.error.ttypes.AuthorizationException, 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 = []
                    (_etype163, _size160) = iprot.readListBegin()
                    for _i164 in range(_size160):
                        _elem165 = airavata.model.appcatalog.appdeployment.ttypes.ApplicationDeploymentDescription()
                        _elem165.read(iprot)
                        self.success.append(_elem165)
                    iprot.readListEnd()
                else:
                    iprot.skip(ftype)
            elif fid == 1:
                if ftype == TType.STRUCT:
                    self.ire = airavata.api.error.ttypes.InvalidRequestException()
                    self.ire.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 2:
                if ftype == TType.STRUCT:
                    self.ace = airavata.api.error.ttypes.AiravataClientException()
                    self.ace.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 3:
                if ftype == TType.STRUCT:
                    self.ase = airavata.api.error.ttypes.AiravataSystemException()
                    self.ase.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 4:
                if ftype == TType.STRUCT:
                    self.ae = 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('getApplicationDeploymentsForAppModuleAndGroupResourceProfile_result')
        if self.success is not None:
            oprot.writeFieldBegin('success', TType.LIST, 0)
            oprot.writeListBegin(TType.STRUCT, len(self.success))
            for iter166 in self.success:
                iter166.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 registerApplicationInterface_args(object):
    """
    Attributes:
     - authzToken
     - gatewayId
     - applicationInterface
    """

    thrift_spec = (
        None,  # 0
        (1, TType.STRUCT, 'authzToken', (airavata.model.security.ttypes.AuthzToken, airavata.model.security.ttypes.AuthzToken.thrift_spec), None, ),  # 1
        (2, TType.STRING, 'gatewayId', 'UTF8', None, ),  # 2
        (3, TType.STRUCT, 'applicationInterface', (airavata.model.appcatalog.appinterface.ttypes.ApplicationInterfaceDescription, 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 = 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 = 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', (airavata.api.error.ttypes.InvalidRequestException, airavata.api.error.ttypes.InvalidRequestException.thrift_spec), None, ),  # 1
        (2, TType.STRUCT, 'ace', (airavata.api.error.ttypes.AiravataClientException, airavata.api.error.ttypes.AiravataClientException.thrift_spec), None, ),  # 2
        (3, TType.STRUCT, 'ase', (airavata.api.error.ttypes.AiravataSystemException, airavata.api.error.ttypes.AiravataSystemException.thrift_spec), None, ),  # 3
        (4, TType.STRUCT, 'ae', (airavata.api.error.ttypes.AuthorizationException, 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 = airavata.api.error.ttypes.InvalidRequestException()
                    self.ire.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 2:
                if ftype == TType.STRUCT:
                    self.ace = airavata.api.error.ttypes.AiravataClientException()
                    self.ace.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 3:
                if ftype == TType.STRUCT:
                    self.ase = airavata.api.error.ttypes.AiravataSystemException()
                    self.ase.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 4:
                if ftype == TType.STRUCT:
                    self.ae = 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', (airavata.model.security.ttypes.AuthzToken, 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 = 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', (airavata.api.error.ttypes.InvalidRequestException, airavata.api.error.ttypes.InvalidRequestException.thrift_spec), None, ),  # 1
        (2, TType.STRUCT, 'ace', (airavata.api.error.ttypes.AiravataClientException, airavata.api.error.ttypes.AiravataClientException.thrift_spec), None, ),  # 2
        (3, TType.STRUCT, 'ase', (airavata.api.error.ttypes.AiravataSystemException, airavata.api.error.ttypes.AiravataSystemException.thrift_spec), None, ),  # 3
        (4, TType.STRUCT, 'ae', (airavata.api.error.ttypes.AuthorizationException, 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 = airavata.api.error.ttypes.InvalidRequestException()
                    self.ire.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 2:
                if ftype == TType.STRUCT:
                    self.ace = airavata.api.error.ttypes.AiravataClientException()
                    self.ace.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 3:
                if ftype == TType.STRUCT:
                    self.ase = airavata.api.error.ttypes.AiravataSystemException()
                    self.ase.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 4:
                if ftype == TType.STRUCT:
                    self.ae = 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', (airavata.model.security.ttypes.AuthzToken, 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 = 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', (airavata.model.appcatalog.appinterface.ttypes.ApplicationInterfaceDescription, airavata.model.appcatalog.appinterface.ttypes.ApplicationInterfaceDescription.thrift_spec), None, ),  # 0
        (1, TType.STRUCT, 'ire', (airavata.api.error.ttypes.InvalidRequestException, airavata.api.error.ttypes.InvalidRequestException.thrift_spec), None, ),  # 1
        (2, TType.STRUCT, 'ace', (airavata.api.error.ttypes.AiravataClientException, airavata.api.error.ttypes.AiravataClientException.thrift_spec), None, ),  # 2
        (3, TType.STRUCT, 'ase', (airavata.api.error.ttypes.AiravataSystemException, airavata.api.error.ttypes.AiravataSystemException.thrift_spec), None, ),  # 3
        (4, TType.STRUCT, 'ae', (airavata.api.error.ttypes.AuthorizationException, 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 = airavata.model.appcatalog.appinterface.ttypes.ApplicationInterfaceDescription()
                    self.success.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 1:
                if ftype == TType.STRUCT:
                    self.ire = airavata.api.error.ttypes.InvalidRequestException()
                    self.ire.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 2:
                if ftype == TType.STRUCT:
                    self.ace = airavata.api.error.ttypes.AiravataClientException()
                    self.ace.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 3:
                if ftype == TType.STRUCT:
                    self.ase = airavata.api.error.ttypes.AiravataSystemException()
                    self.ase.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 4:
                if ftype == TType.STRUCT:
                    self.ae = 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', (airavata.model.security.ttypes.AuthzToken, airavata.model.security.ttypes.AuthzToken.thrift_spec), None, ),  # 1
        (2, TType.STRING, 'appInterfaceId', 'UTF8', None, ),  # 2
        (3, TType.STRUCT, 'applicationInterface', (airavata.model.appcatalog.appinterface.ttypes.ApplicationInterfaceDescription, 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 = 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 = 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', (airavata.api.error.ttypes.InvalidRequestException, airavata.api.error.ttypes.InvalidRequestException.thrift_spec), None, ),  # 1
        (2, TType.STRUCT, 'ace', (airavata.api.error.ttypes.AiravataClientException, airavata.api.error.ttypes.AiravataClientException.thrift_spec), None, ),  # 2
        (3, TType.STRUCT, 'ase', (airavata.api.error.ttypes.AiravataSystemException, airavata.api.error.ttypes.AiravataSystemException.thrift_spec), None, ),  # 3
        (4, TType.STRUCT, 'ae', (airavata.api.error.ttypes.AuthorizationException, 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 = airavata.api.error.ttypes.InvalidRequestException()
                    self.ire.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 2:
                if ftype == TType.STRUCT:
                    self.ace = airavata.api.error.ttypes.AiravataClientException()
                    self.ace.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 3:
                if ftype == TType.STRUCT:
                    self.ase = airavata.api.error.ttypes.AiravataSystemException()
                    self.ase.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 4:
                if ftype == TType.STRUCT:
                    self.ae = 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', (airavata.model.security.ttypes.AuthzToken, 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 = 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', (airavata.api.error.ttypes.InvalidRequestException, airavata.api.error.ttypes.InvalidRequestException.thrift_spec), None, ),  # 1
        (2, TType.STRUCT, 'ace', (airavata.api.error.ttypes.AiravataClientException, airavata.api.error.ttypes.AiravataClientException.thrift_spec), None, ),  # 2
        (3, TType.STRUCT, 'ase', (airavata.api.error.ttypes.AiravataSystemException, airavata.api.error.ttypes.AiravataSystemException.thrift_spec), None, ),  # 3
        (4, TType.STRUCT, 'ae', (airavata.api.error.ttypes.AuthorizationException, 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 = airavata.api.error.ttypes.InvalidRequestException()
                    self.ire.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 2:
                if ftype == TType.STRUCT:
                    self.ace = airavata.api.error.ttypes.AiravataClientException()
                    self.ace.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 3:
                if ftype == TType.STRUCT:
                    self.ase = airavata.api.error.ttypes.AiravataSystemException()
                    self.ase.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 4:
                if ftype == TType.STRUCT:
                    self.ae = 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', (airavata.model.security.ttypes.AuthzToken, 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 = 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', (airavata.api.error.ttypes.InvalidRequestException, airavata.api.error.ttypes.InvalidRequestException.thrift_spec), None, ),  # 1
        (2, TType.STRUCT, 'ace', (airavata.api.error.ttypes.AiravataClientException, airavata.api.error.ttypes.AiravataClientException.thrift_spec), None, ),  # 2
        (3, TType.STRUCT, 'ase', (airavata.api.error.ttypes.AiravataSystemException, airavata.api.error.ttypes.AiravataSystemException.thrift_spec), None, ),  # 3
        (4, TType.STRUCT, 'ae', (airavata.api.error.ttypes.AuthorizationException, 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 = {}
                    (_ktype168, _vtype169, _size167) = iprot.readMapBegin()
                    for _i171 in range(_size167):
                        _key172 = iprot.readString().decode('utf-8') if sys.version_info[0] == 2 else iprot.readString()
                        _val173 = iprot.readString().decode('utf-8') if sys.version_info[0] == 2 else iprot.readString()
                        self.success[_key172] = _val173
                    iprot.readMapEnd()
                else:
                    iprot.skip(ftype)
            elif fid == 1:
                if ftype == TType.STRUCT:
                    self.ire = airavata.api.error.ttypes.InvalidRequestException()
                    self.ire.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 2:
                if ftype == TType.STRUCT:
                    self.ace = airavata.api.error.ttypes.AiravataClientException()
                    self.ace.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 3:
                if ftype == TType.STRUCT:
                    self.ase = airavata.api.error.ttypes.AiravataSystemException()
                    self.ase.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 4:
                if ftype == TType.STRUCT:
                    self.ae = 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 kiter174, viter175 in self.success.items():
                oprot.writeString(kiter174.encode('utf-8') if sys.version_info[0] == 2 else kiter174)
                oprot.writeString(viter175.encode('utf-8') if sys.version_info[0] == 2 else viter175)
            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', (airavata.model.security.ttypes.AuthzToken, 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 = 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, (airavata.model.appcatalog.appinterface.ttypes.ApplicationInterfaceDescription, airavata.model.appcatalog.appinterface.ttypes.ApplicationInterfaceDescription.thrift_spec), False), None, ),  # 0
        (1, TType.STRUCT, 'ire', (airavata.api.error.ttypes.InvalidRequestException, airavata.api.error.ttypes.InvalidRequestException.thrift_spec), None, ),  # 1
        (2, TType.STRUCT, 'ace', (airavata.api.error.ttypes.AiravataClientException, airavata.api.error.ttypes.AiravataClientException.thrift_spec), None, ),  # 2
        (3, TType.STRUCT, 'ase', (airavata.api.error.ttypes.AiravataSystemException, airavata.api.error.ttypes.AiravataSystemException.thrift_spec), None, ),  # 3
        (4, TType.STRUCT, 'ae', (airavata.api.error.ttypes.AuthorizationException, 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 = []
                    (_etype179, _size176) = iprot.readListBegin()
                    for _i180 in range(_size176):
                        _elem181 = airavata.model.appcatalog.appinterface.ttypes.ApplicationInterfaceDescription()
                        _elem181.read(iprot)
                        self.success.append(_elem181)
                    iprot.readListEnd()
                else:
                    iprot.skip(ftype)
            elif fid == 1:
                if ftype == TType.STRUCT:
                    self.ire = airavata.api.error.ttypes.InvalidRequestException()
                    self.ire.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 2:
                if ftype == TType.STRUCT:
                    self.ace = airavata.api.error.ttypes.AiravataClientException()
                    self.ace.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 3:
                if ftype == TType.STRUCT:
                    self.ase = airavata.api.error.ttypes.AiravataSystemException()
                    self.ase.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 4:
                if ftype == TType.STRUCT:
                    self.ae = 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 iter182 in self.success:
                iter182.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', (airavata.model.security.ttypes.AuthzToken, 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 = 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, (airavata.model.application.io.ttypes.InputDataObjectType, airavata.model.application.io.ttypes.InputDataObjectType.thrift_spec), False), None, ),  # 0
        (1, TType.STRUCT, 'ire', (airavata.api.error.ttypes.InvalidRequestException, airavata.api.error.ttypes.InvalidRequestException.thrift_spec), None, ),  # 1
        (2, TType.STRUCT, 'ace', (airavata.api.error.ttypes.AiravataClientException, airavata.api.error.ttypes.AiravataClientException.thrift_spec), None, ),  # 2
        (3, TType.STRUCT, 'ase', (airavata.api.error.ttypes.AiravataSystemException, airavata.api.error.ttypes.AiravataSystemException.thrift_spec), None, ),  # 3
        (4, TType.STRUCT, 'ae', (airavata.api.error.ttypes.AuthorizationException, 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 = []
                    (_etype186, _size183) = iprot.readListBegin()
                    for _i187 in range(_size183):
                        _elem188 = airavata.model.application.io.ttypes.InputDataObjectType()
                        _elem188.read(iprot)
                        self.success.append(_elem188)
                    iprot.readListEnd()
                else:
                    iprot.skip(ftype)
            elif fid == 1:
                if ftype == TType.STRUCT:
                    self.ire = airavata.api.error.ttypes.InvalidRequestException()
                    self.ire.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 2:
                if ftype == TType.STRUCT:
                    self.ace = airavata.api.error.ttypes.AiravataClientException()
                    self.ace.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 3:
                if ftype == TType.STRUCT:
                    self.ase = airavata.api.error.ttypes.AiravataSystemException()
                    self.ase.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 4:
                if ftype == TType.STRUCT:
                    self.ae = 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 iter189 in self.success:
                iter189.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', (airavata.model.security.ttypes.AuthzToken, 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 = 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, (airavata.model.application.io.ttypes.OutputDataObjectType, airavata.model.application.io.ttypes.OutputDataObjectType.thrift_spec), False), None, ),  # 0
        (1, TType.STRUCT, 'ire', (airavata.api.error.ttypes.InvalidRequestException, airavata.api.error.ttypes.InvalidRequestException.thrift_spec), None, ),  # 1
        (2, TType.STRUCT, 'ace', (airavata.api.error.ttypes.AiravataClientException, airavata.api.error.ttypes.AiravataClientException.thrift_spec), None, ),  # 2
        (3, TType.STRUCT, 'ase', (airavata.api.error.ttypes.AiravataSystemException, airavata.api.error.ttypes.AiravataSystemException.thrift_spec), None, ),  # 3
        (4, TType.STRUCT, 'ae', (airavata.api.error.ttypes.AuthorizationException, 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 = []
                    (_etype193, _size190) = iprot.readListBegin()
                    for _i194 in range(_size190):
                        _elem195 = airavata.model.application.io.ttypes.OutputDataObjectType()
                        _elem195.read(iprot)
                        self.success.append(_elem195)
                    iprot.readListEnd()
                else:
                    iprot.skip(ftype)
            elif fid == 1:
                if ftype == TType.STRUCT:
                    self.ire = airavata.api.error.ttypes.InvalidRequestException()
                    self.ire.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 2:
                if ftype == TType.STRUCT:
                    self.ace = airavata.api.error.ttypes.AiravataClientException()
                    self.ace.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 3:
                if ftype == TType.STRUCT:
                    self.ase = airavata.api.error.ttypes.AiravataSystemException()
                    self.ase.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 4:
                if ftype == TType.STRUCT:
                    self.ae = 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 iter196 in self.success:
                iter196.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', (airavata.model.security.ttypes.AuthzToken, 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 = 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', (airavata.api.error.ttypes.InvalidRequestException, airavata.api.error.ttypes.InvalidRequestException.thrift_spec), None, ),  # 1
        (2, TType.STRUCT, 'ace', (airavata.api.error.ttypes.AiravataClientException, airavata.api.error.ttypes.AiravataClientException.thrift_spec), None, ),  # 2
        (3, TType.STRUCT, 'ase', (airavata.api.error.ttypes.AiravataSystemException, airavata.api.error.ttypes.AiravataSystemException.thrift_spec), None, ),  # 3
        (4, TType.STRUCT, 'ae', (airavata.api.error.ttypes.AuthorizationException, 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 = {}
                    (_ktype198, _vtype199, _size197) = iprot.readMapBegin()
                    for _i201 in range(_size197):
                        _key202 = iprot.readString().decode('utf-8') if sys.version_info[0] == 2 else iprot.readString()
                        _val203 = iprot.readString().decode('utf-8') if sys.version_info[0] == 2 else iprot.readString()
                        self.success[_key202] = _val203
                    iprot.readMapEnd()
                else:
                    iprot.skip(ftype)
            elif fid == 1:
                if ftype == TType.STRUCT:
                    self.ire = airavata.api.error.ttypes.InvalidRequestException()
                    self.ire.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 2:
                if ftype == TType.STRUCT:
                    self.ace = airavata.api.error.ttypes.AiravataClientException()
                    self.ace.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 3:
                if ftype == TType.STRUCT:
                    self.ase = airavata.api.error.ttypes.AiravataSystemException()
                    self.ase.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 4:
                if ftype == TType.STRUCT:
                    self.ae = 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 kiter204, viter205 in self.success.items():
                oprot.writeString(kiter204.encode('utf-8') if sys.version_info[0] == 2 else kiter204)
                oprot.writeString(viter205.encode('utf-8') if sys.version_info[0] == 2 else viter205)
            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', (airavata.model.security.ttypes.AuthzToken, airavata.model.security.ttypes.AuthzToken.thrift_spec), None, ),  # 1
        (2, TType.STRUCT, 'computeResourceDescription', (airavata.model.appcatalog.computeresource.ttypes.ComputeResourceDescription, 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 = airavata.model.security.ttypes.AuthzToken()
                    self.authzToken.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 2:
                if ftype == TType.STRUCT:
                    self.computeResourceDescription = 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', (airavata.api.error.ttypes.InvalidRequestException, airavata.api.error.ttypes.InvalidRequestException.thrift_spec), None, ),  # 1
        (2, TType.STRUCT, 'ace', (airavata.api.error.ttypes.AiravataClientException, airavata.api.error.ttypes.AiravataClientException.thrift_spec), None, ),  # 2
        (3, TType.STRUCT, 'ase', (airavata.api.error.ttypes.AiravataSystemException, airavata.api.error.ttypes.AiravataSystemException.thrift_spec), None, ),  # 3
        (4, TType.STRUCT, 'ae', (airavata.api.error.ttypes.AuthorizationException, 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 = airavata.api.error.ttypes.InvalidRequestException()
                    self.ire.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 2:
                if ftype == TType.STRUCT:
                    self.ace = airavata.api.error.ttypes.AiravataClientException()
                    self.ace.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 3:
                if ftype == TType.STRUCT:
                    self.ase = airavata.api.error.ttypes.AiravataSystemException()
                    self.ase.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 4:
                if ftype == TType.STRUCT:
                    self.ae = 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', (airavata.model.security.ttypes.AuthzToken, 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 = 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', (airavata.model.appcatalog.computeresource.ttypes.ComputeResourceDescription, airavata.model.appcatalog.computeresource.ttypes.ComputeResourceDescription.thrift_spec), None, ),  # 0
        (1, TType.STRUCT, 'ire', (airavata.api.error.ttypes.InvalidRequestException, airavata.api.error.ttypes.InvalidRequestException.thrift_spec), None, ),  # 1
        (2, TType.STRUCT, 'ace', (airavata.api.error.ttypes.AiravataClientException, airavata.api.error.ttypes.AiravataClientException.thrift_spec), None, ),  # 2
        (3, TType.STRUCT, 'ase', (airavata.api.error.ttypes.AiravataSystemException, airavata.api.error.ttypes.AiravataSystemException.thrift_spec), None, ),  # 3
        (4, TType.STRUCT, 'ae', (airavata.api.error.ttypes.AuthorizationException, 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 = airavata.model.appcatalog.computeresource.ttypes.ComputeResourceDescription()
                    self.success.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 1:
                if ftype == TType.STRUCT:
                    self.ire = airavata.api.error.ttypes.InvalidRequestException()
                    self.ire.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 2:
                if ftype == TType.STRUCT:
                    self.ace = airavata.api.error.ttypes.AiravataClientException()
                    self.ace.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 3:
                if ftype == TType.STRUCT:
                    self.ase = airavata.api.error.ttypes.AiravataSystemException()
                    self.ase.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 4:
                if ftype == TType.STRUCT:
                    self.ae = 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', (airavata.model.security.ttypes.AuthzToken, 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 = 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', (airavata.api.error.ttypes.InvalidRequestException, airavata.api.error.ttypes.InvalidRequestException.thrift_spec), None, ),  # 1
        (2, TType.STRUCT, 'ace', (airavata.api.error.ttypes.AiravataClientException, airavata.api.error.ttypes.AiravataClientException.thrift_spec), None, ),  # 2
        (3, TType.STRUCT, 'ase', (airavata.api.error.ttypes.AiravataSystemException, airavata.api.error.ttypes.AiravataSystemException.thrift_spec), None, ),  # 3
        (4, TType.STRUCT, 'ae', (airavata.api.error.ttypes.AuthorizationException, 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 = {}
                    (_ktype207, _vtype208, _size206) = iprot.readMapBegin()
                    for _i210 in range(_size206):
                        _key211 = iprot.readString().decode('utf-8') if sys.version_info[0] == 2 else iprot.readString()
                        _val212 = iprot.readString().decode('utf-8') if sys.version_info[0] == 2 else iprot.readString()
                        self.success[_key211] = _val212
                    iprot.readMapEnd()
                else:
                    iprot.skip(ftype)
            elif fid == 1:
                if ftype == TType.STRUCT:
                    self.ire = airavata.api.error.ttypes.InvalidRequestException()
                    self.ire.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 2:
                if ftype == TType.STRUCT:
                    self.ace = airavata.api.error.ttypes.AiravataClientException()
                    self.ace.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 3:
                if ftype == TType.STRUCT:
                    self.ase = airavata.api.error.ttypes.AiravataSystemException()
                    self.ase.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 4:
                if ftype == TType.STRUCT:
                    self.ae = 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 kiter213, viter214 in self.success.items():
                oprot.writeString(kiter213.encode('utf-8') if sys.version_info[0] == 2 else kiter213)
                oprot.writeString(viter214.encode('utf-8') if sys.version_info[0] == 2 else viter214)
            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', (airavata.model.security.ttypes.AuthzToken, airavata.model.security.ttypes.AuthzToken.thrift_spec), None, ),  # 1
        (2, TType.STRING, 'computeResourceId', 'UTF8', None, ),  # 2
        (3, TType.STRUCT, 'computeResourceDescription', (airavata.model.appcatalog.computeresource.ttypes.ComputeResourceDescription, 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 = 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 = 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', (airavata.api.error.ttypes.InvalidRequestException, airavata.api.error.ttypes.InvalidRequestException.thrift_spec), None, ),  # 1
        (2, TType.STRUCT, 'ace', (airavata.api.error.ttypes.AiravataClientException, airavata.api.error.ttypes.AiravataClientException.thrift_spec), None, ),  # 2
        (3, TType.STRUCT, 'ase', (airavata.api.error.ttypes.AiravataSystemException, airavata.api.error.ttypes.AiravataSystemException.thrift_spec), None, ),  # 3
        (4, TType.STRUCT, 'ae', (airavata.api.error.ttypes.AuthorizationException, 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 = airavata.api.error.ttypes.InvalidRequestException()
                    self.ire.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 2:
                if ftype == TType.STRUCT:
                    self.ace = airavata.api.error.ttypes.AiravataClientException()
                    self.ace.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 3:
                if ftype == TType.STRUCT:
                    self.ase = airavata.api.error.ttypes.AiravataSystemException()
                    self.ase.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 4:
                if ftype == TType.STRUCT:
                    self.ae = 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', (airavata.model.security.ttypes.AuthzToken, 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 = 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', (airavata.api.error.ttypes.InvalidRequestException, airavata.api.error.ttypes.InvalidRequestException.thrift_spec), None, ),  # 1
        (2, TType.STRUCT, 'ace', (airavata.api.error.ttypes.AiravataClientException, airavata.api.error.ttypes.AiravataClientException.thrift_spec), None, ),  # 2
        (3, TType.STRUCT, 'ase', (airavata.api.error.ttypes.AiravataSystemException, airavata.api.error.ttypes.AiravataSystemException.thrift_spec), None, ),  # 3
        (4, TType.STRUCT, 'ae', (airavata.api.error.ttypes.AuthorizationException, 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 = airavata.api.error.ttypes.InvalidRequestException()
                    self.ire.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 2:
                if ftype == TType.STRUCT:
                    self.ace = airavata.api.error.ttypes.AiravataClientException()
                    self.ace.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 3:
                if ftype == TType.STRUCT:
                    self.ase = airavata.api.error.ttypes.AiravataSystemException()
                    self.ase.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 4:
                if ftype == TType.STRUCT:
                    self.ae = 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', (airavata.model.security.ttypes.AuthzToken, airavata.model.security.ttypes.AuthzToken.thrift_spec), None, ),  # 1
        (2, TType.STRUCT, 'storageResourceDescription', (airavata.model.appcatalog.storageresource.ttypes.StorageResourceDescription, 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 = airavata.model.security.ttypes.AuthzToken()
                    self.authzToken.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 2:
                if ftype == TType.STRUCT:
                    self.storageResourceDescription = 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', (airavata.api.error.ttypes.InvalidRequestException, airavata.api.error.ttypes.InvalidRequestException.thrift_spec), None, ),  # 1
        (2, TType.STRUCT, 'ace', (airavata.api.error.ttypes.AiravataClientException, airavata.api.error.ttypes.AiravataClientException.thrift_spec), None, ),  # 2
        (3, TType.STRUCT, 'ase', (airavata.api.error.ttypes.AiravataSystemException, airavata.api.error.ttypes.AiravataSystemException.thrift_spec), None, ),  # 3
        (4, TType.STRUCT, 'ae', (airavata.api.error.ttypes.AuthorizationException, 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 = airavata.api.error.ttypes.InvalidRequestException()
                    self.ire.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 2:
                if ftype == TType.STRUCT:
                    self.ace = airavata.api.error.ttypes.AiravataClientException()
                    self.ace.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 3:
                if ftype == TType.STRUCT:
                    self.ase = airavata.api.error.ttypes.AiravataSystemException()
                    self.ase.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 4:
                if ftype == TType.STRUCT:
                    self.ae = 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', (airavata.model.security.ttypes.AuthzToken, 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 = 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', (airavata.model.appcatalog.storageresource.ttypes.StorageResourceDescription, airavata.model.appcatalog.storageresource.ttypes.StorageResourceDescription.thrift_spec), None, ),  # 0
        (1, TType.STRUCT, 'ire', (airavata.api.error.ttypes.InvalidRequestException, airavata.api.error.ttypes.InvalidRequestException.thrift_spec), None, ),  # 1
        (2, TType.STRUCT, 'ace', (airavata.api.error.ttypes.AiravataClientException, airavata.api.error.ttypes.AiravataClientException.thrift_spec), None, ),  # 2
        (3, TType.STRUCT, 'ase', (airavata.api.error.ttypes.AiravataSystemException, airavata.api.error.ttypes.AiravataSystemException.thrift_spec), None, ),  # 3
        (4, TType.STRUCT, 'ae', (airavata.api.error.ttypes.AuthorizationException, 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 = airavata.model.appcatalog.storageresource.ttypes.StorageResourceDescription()
                    self.success.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 1:
                if ftype == TType.STRUCT:
                    self.ire = airavata.api.error.ttypes.InvalidRequestException()
                    self.ire.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 2:
                if ftype == TType.STRUCT:
                    self.ace = airavata.api.error.ttypes.AiravataClientException()
                    self.ace.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 3:
                if ftype == TType.STRUCT:
                    self.ase = airavata.api.error.ttypes.AiravataSystemException()
                    self.ase.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 4:
                if ftype == TType.STRUCT:
                    self.ae = 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', (airavata.model.security.ttypes.AuthzToken, 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 = 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', (airavata.api.error.ttypes.InvalidRequestException, airavata.api.error.ttypes.InvalidRequestException.thrift_spec), None, ),  # 1
        (2, TType.STRUCT, 'ace', (airavata.api.error.ttypes.AiravataClientException, airavata.api.error.ttypes.AiravataClientException.thrift_spec), None, ),  # 2
        (3, TType.STRUCT, 'ase', (airavata.api.error.ttypes.AiravataSystemException, airavata.api.error.ttypes.AiravataSystemException.thrift_spec), None, ),  # 3
        (4, TType.STRUCT, 'ae', (airavata.api.error.ttypes.AuthorizationException, 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 = {}
                    (_ktype216, _vtype217, _size215) = iprot.readMapBegin()
                    for _i219 in range(_size215):
                        _key220 = iprot.readString().decode('utf-8') if sys.version_info[0] == 2 else iprot.readString()
                        _val221 = iprot.readString().decode('utf-8') if sys.version_info[0] == 2 else iprot.readString()
                        self.success[_key220] = _val221
                    iprot.readMapEnd()
                else:
                    iprot.skip(ftype)
            elif fid == 1:
                if ftype == TType.STRUCT:
                    self.ire = airavata.api.error.ttypes.InvalidRequestException()
                    self.ire.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 2:
                if ftype == TType.STRUCT:
                    self.ace = airavata.api.error.ttypes.AiravataClientException()
                    self.ace.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 3:
                if ftype == TType.STRUCT:
                    self.ase = airavata.api.error.ttypes.AiravataSystemException()
                    self.ase.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 4:
                if ftype == TType.STRUCT:
                    self.ae = 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 kiter222, viter223 in self.success.items():
                oprot.writeString(kiter222.encode('utf-8') if sys.version_info[0] == 2 else kiter222)
                oprot.writeString(viter223.encode('utf-8') if sys.version_info[0] == 2 else viter223)
            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', (airavata.model.security.ttypes.AuthzToken, airavata.model.security.ttypes.AuthzToken.thrift_spec), None, ),  # 1
        (2, TType.STRING, 'storageResourceId', 'UTF8', None, ),  # 2
        (3, TType.STRUCT, 'storageResourceDescription', (airavata.model.appcatalog.storageresource.ttypes.StorageResourceDescription, 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 = 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 = 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', (airavata.api.error.ttypes.InvalidRequestException, airavata.api.error.ttypes.InvalidRequestException.thrift_spec), None, ),  # 1
        (2, TType.STRUCT, 'ace', (airavata.api.error.ttypes.AiravataClientException, airavata.api.error.ttypes.AiravataClientException.thrift_spec), None, ),  # 2
        (3, TType.STRUCT, 'ase', (airavata.api.error.ttypes.AiravataSystemException, airavata.api.error.ttypes.AiravataSystemException.thrift_spec), None, ),  # 3
        (4, TType.STRUCT, 'ae', (airavata.api.error.ttypes.AuthorizationException, 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 = airavata.api.error.ttypes.InvalidRequestException()
                    self.ire.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 2:
                if ftype == TType.STRUCT:
                    self.ace = airavata.api.error.ttypes.AiravataClientException()
                    self.ace.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 3:
                if ftype == TType.STRUCT:
                    self.ase = airavata.api.error.ttypes.AiravataSystemException()
                    self.ase.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 4:
                if ftype == TType.STRUCT:
                    self.ae = 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', (airavata.model.security.ttypes.AuthzToken, 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 = 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', (airavata.api.error.ttypes.InvalidRequestException, airavata.api.error.ttypes.InvalidRequestException.thrift_spec), None, ),  # 1
        (2, TType.STRUCT, 'ace', (airavata.api.error.ttypes.AiravataClientException, airavata.api.error.ttypes.AiravataClientException.thrift_spec), None, ),  # 2
        (3, TType.STRUCT, 'ase', (airavata.api.error.ttypes.AiravataSystemException, airavata.api.error.ttypes.AiravataSystemException.thrift_spec), None, ),  # 3
        (4, TType.STRUCT, 'ae', (airavata.api.error.ttypes.AuthorizationException, 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 = airavata.api.error.ttypes.InvalidRequestException()
                    self.ire.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 2:
                if ftype == TType.STRUCT:
                    self.ace = airavata.api.error.ttypes.AiravataClientException()
                    self.ace.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 3:
                if ftype == TType.STRUCT:
                    self.ase = airavata.api.error.ttypes.AiravataSystemException()
                    self.ase.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 4:
                if ftype == TType.STRUCT:
                    self.ae = 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', (airavata.model.security.ttypes.AuthzToken, 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', (airavata.model.appcatalog.computeresource.ttypes.LOCALSubmission, 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 = 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 = 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', (airavata.api.error.ttypes.InvalidRequestException, airavata.api.error.ttypes.InvalidRequestException.thrift_spec), None, ),  # 1
        (2, TType.STRUCT, 'ace', (airavata.api.error.ttypes.AiravataClientException, airavata.api.error.ttypes.AiravataClientException.thrift_spec), None, ),  # 2
        (3, TType.STRUCT, 'ase', (airavata.api.error.ttypes.AiravataSystemException, airavata.api.error.ttypes.AiravataSystemException.thrift_spec), None, ),  # 3
        (4, TType.STRUCT, 'ae', (airavata.api.error.ttypes.AuthorizationException, 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 = airavata.api.error.ttypes.InvalidRequestException()
                    self.ire.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 2:
                if ftype == TType.STRUCT:
                    self.ace = airavata.api.error.ttypes.AiravataClientException()
                    self.ace.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 3:
                if ftype == TType.STRUCT:
                    self.ase = airavata.api.error.ttypes.AiravataSystemException()
                    self.ase.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 4:
                if ftype == TType.STRUCT:
                    self.ae = 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', (airavata.model.security.ttypes.AuthzToken, airavata.model.security.ttypes.AuthzToken.thrift_spec), None, ),  # 1
        (2, TType.STRING, 'jobSubmissionInterfaceId', 'UTF8', None, ),  # 2
        (3, TType.STRUCT, 'localSubmission', (airavata.model.appcatalog.computeresource.ttypes.LOCALSubmission, 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 = 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 = 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', (airavata.api.error.ttypes.InvalidRequestException, airavata.api.error.ttypes.InvalidRequestException.thrift_spec), None, ),  # 1
        (2, TType.STRUCT, 'ace', (airavata.api.error.ttypes.AiravataClientException, airavata.api.error.ttypes.AiravataClientException.thrift_spec), None, ),  # 2
        (3, TType.STRUCT, 'ase', (airavata.api.error.ttypes.AiravataSystemException, airavata.api.error.ttypes.AiravataSystemException.thrift_spec), None, ),  # 3
        (4, TType.STRUCT, 'ae', (airavata.api.error.ttypes.AuthorizationException, 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 = airavata.api.error.ttypes.InvalidRequestException()
                    self.ire.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 2:
                if ftype == TType.STRUCT:
                    self.ace = airavata.api.error.ttypes.AiravataClientException()
                    self.ace.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 3:
                if ftype == TType.STRUCT:
                    self.ase = airavata.api.error.ttypes.AiravataSystemException()
                    self.ase.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 4:
                if ftype == TType.STRUCT:
                    self.ae = 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', (airavata.model.security.ttypes.AuthzToken, 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 = 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', (airavata.model.appcatalog.computeresource.ttypes.LOCALSubmission, airavata.model.appcatalog.computeresource.ttypes.LOCALSubmission.thrift_spec), None, ),  # 0
        (1, TType.STRUCT, 'ire', (airavata.api.error.ttypes.InvalidRequestException, airavata.api.error.ttypes.InvalidRequestException.thrift_spec), None, ),  # 1
        (2, TType.STRUCT, 'ace', (airavata.api.error.ttypes.AiravataClientException, airavata.api.error.ttypes.AiravataClientException.thrift_spec), None, ),  # 2
        (3, TType.STRUCT, 'ase', (airavata.api.error.ttypes.AiravataSystemException, airavata.api.error.ttypes.AiravataSystemException.thrift_spec), None, ),  # 3
        (4, TType.STRUCT, 'ae', (airavata.api.error.ttypes.AuthorizationException, 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 = airavata.model.appcatalog.computeresource.ttypes.LOCALSubmission()
                    self.success.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 1:
                if ftype == TType.STRUCT:
                    self.ire = airavata.api.error.ttypes.InvalidRequestException()
                    self.ire.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 2:
                if ftype == TType.STRUCT:
                    self.ace = airavata.api.error.ttypes.AiravataClientException()
                    self.ace.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 3:
                if ftype == TType.STRUCT:
                    self.ase = airavata.api.error.ttypes.AiravataSystemException()
                    self.ase.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 4:
                if ftype == TType.STRUCT:
                    self.ae = 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', (airavata.model.security.ttypes.AuthzToken, 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', (airavata.model.appcatalog.computeresource.ttypes.SSHJobSubmission, 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 = 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 = 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', (airavata.api.error.ttypes.InvalidRequestException, airavata.api.error.ttypes.InvalidRequestException.thrift_spec), None, ),  # 1
        (2, TType.STRUCT, 'ace', (airavata.api.error.ttypes.AiravataClientException, airavata.api.error.ttypes.AiravataClientException.thrift_spec), None, ),  # 2
        (3, TType.STRUCT, 'ase', (airavata.api.error.ttypes.AiravataSystemException, airavata.api.error.ttypes.AiravataSystemException.thrift_spec), None, ),  # 3
        (4, TType.STRUCT, 'ae', (airavata.api.error.ttypes.AuthorizationException, 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 = airavata.api.error.ttypes.InvalidRequestException()
                    self.ire.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 2:
                if ftype == TType.STRUCT:
                    self.ace = airavata.api.error.ttypes.AiravataClientException()
                    self.ace.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 3:
                if ftype == TType.STRUCT:
                    self.ase = airavata.api.error.ttypes.AiravataSystemException()
                    self.ase.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 4:
                if ftype == TType.STRUCT:
                    self.ae = 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', (airavata.model.security.ttypes.AuthzToken, 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', (airavata.model.appcatalog.computeresource.ttypes.SSHJobSubmission, 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 = 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 = 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', (airavata.api.error.ttypes.InvalidRequestException, airavata.api.error.ttypes.InvalidRequestException.thrift_spec), None, ),  # 1
        (2, TType.STRUCT, 'ace', (airavata.api.error.ttypes.AiravataClientException, airavata.api.error.ttypes.AiravataClientException.thrift_spec), None, ),  # 2
        (3, TType.STRUCT, 'ase', (airavata.api.error.ttypes.AiravataSystemException, airavata.api.error.ttypes.AiravataSystemException.thrift_spec), None, ),  # 3
        (4, TType.STRUCT, 'ae', (airavata.api.error.ttypes.AuthorizationException, 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 = airavata.api.error.ttypes.InvalidRequestException()
                    self.ire.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 2:
                if ftype == TType.STRUCT:
                    self.ace = airavata.api.error.ttypes.AiravataClientException()
                    self.ace.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 3:
                if ftype == TType.STRUCT:
                    self.ase = airavata.api.error.ttypes.AiravataSystemException()
                    self.ase.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 4:
                if ftype == TType.STRUCT:
                    self.ae = 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', (airavata.model.security.ttypes.AuthzToken, 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 = 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', (airavata.model.appcatalog.computeresource.ttypes.SSHJobSubmission, airavata.model.appcatalog.computeresource.ttypes.SSHJobSubmission.thrift_spec), None, ),  # 0
        (1, TType.STRUCT, 'ire', (airavata.api.error.ttypes.InvalidRequestException, airavata.api.error.ttypes.InvalidRequestException.thrift_spec), None, ),  # 1
        (2, TType.STRUCT, 'ace', (airavata.api.error.ttypes.AiravataClientException, airavata.api.error.ttypes.AiravataClientException.thrift_spec), None, ),  # 2
        (3, TType.STRUCT, 'ase', (airavata.api.error.ttypes.AiravataSystemException, airavata.api.error.ttypes.AiravataSystemException.thrift_spec), None, ),  # 3
        (4, TType.STRUCT, 'ae', (airavata.api.error.ttypes.AuthorizationException, 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 = airavata.model.appcatalog.computeresource.ttypes.SSHJobSubmission()
                    self.success.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 1:
                if ftype == TType.STRUCT:
                    self.ire = airavata.api.error.ttypes.InvalidRequestException()
                    self.ire.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 2:
                if ftype == TType.STRUCT:
                    self.ace = airavata.api.error.ttypes.AiravataClientException()
                    self.ace.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 3:
                if ftype == TType.STRUCT:
                    self.ase = airavata.api.error.ttypes.AiravataSystemException()
                    self.ase.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 4:
                if ftype == TType.STRUCT:
                    self.ae = 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', (airavata.model.security.ttypes.AuthzToken, 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', (airavata.model.appcatalog.computeresource.ttypes.UnicoreJobSubmission, 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 = 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 = 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', (airavata.api.error.ttypes.InvalidRequestException, airavata.api.error.ttypes.InvalidRequestException.thrift_spec), None, ),  # 1
        (2, TType.STRUCT, 'ace', (airavata.api.error.ttypes.AiravataClientException, airavata.api.error.ttypes.AiravataClientException.thrift_spec), None, ),  # 2
        (3, TType.STRUCT, 'ase', (airavata.api.error.ttypes.AiravataSystemException, airavata.api.error.ttypes.AiravataSystemException.thrift_spec), None, ),  # 3
        (4, TType.STRUCT, 'ae', (airavata.api.error.ttypes.AuthorizationException, 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 = airavata.api.error.ttypes.InvalidRequestException()
                    self.ire.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 2:
                if ftype == TType.STRUCT:
                    self.ace = airavata.api.error.ttypes.AiravataClientException()
                    self.ace.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 3:
                if ftype == TType.STRUCT:
                    self.ase = airavata.api.error.ttypes.AiravataSystemException()
                    self.ase.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 4:
                if ftype == TType.STRUCT:
                    self.ae = 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', (airavata.model.security.ttypes.AuthzToken, 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 = 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', (airavata.model.appcatalog.computeresource.ttypes.UnicoreJobSubmission, airavata.model.appcatalog.computeresource.ttypes.UnicoreJobSubmission.thrift_spec), None, ),  # 0
        (1, TType.STRUCT, 'ire', (airavata.api.error.ttypes.InvalidRequestException, airavata.api.error.ttypes.InvalidRequestException.thrift_spec), None, ),  # 1
        (2, TType.STRUCT, 'ace', (airavata.api.error.ttypes.AiravataClientException, airavata.api.error.ttypes.AiravataClientException.thrift_spec), None, ),  # 2
        (3, TType.STRUCT, 'ase', (airavata.api.error.ttypes.AiravataSystemException, airavata.api.error.ttypes.AiravataSystemException.thrift_spec), None, ),  # 3
        (4, TType.STRUCT, 'ae', (airavata.api.error.ttypes.AuthorizationException, 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 = airavata.model.appcatalog.computeresource.ttypes.UnicoreJobSubmission()
                    self.success.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 1:
                if ftype == TType.STRUCT:
                    self.ire = airavata.api.error.ttypes.InvalidRequestException()
                    self.ire.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 2:
                if ftype == TType.STRUCT:
                    self.ace = airavata.api.error.ttypes.AiravataClientException()
                    self.ace.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 3:
                if ftype == TType.STRUCT:
                    self.ase = airavata.api.error.ttypes.AiravataSystemException()
                    self.ase.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 4:
                if ftype == TType.STRUCT:
                    self.ae = 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', (airavata.model.security.ttypes.AuthzToken, 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', (airavata.model.appcatalog.computeresource.ttypes.CloudJobSubmission, 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 = 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 = 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', (airavata.api.error.ttypes.InvalidRequestException, airavata.api.error.ttypes.InvalidRequestException.thrift_spec), None, ),  # 1
        (2, TType.STRUCT, 'ace', (airavata.api.error.ttypes.AiravataClientException, airavata.api.error.ttypes.AiravataClientException.thrift_spec), None, ),  # 2
        (3, TType.STRUCT, 'ase', (airavata.api.error.ttypes.AiravataSystemException, airavata.api.error.ttypes.AiravataSystemException.thrift_spec), None, ),  # 3
        (4, TType.STRUCT, 'ae', (airavata.api.error.ttypes.AuthorizationException, 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 = airavata.api.error.ttypes.InvalidRequestException()
                    self.ire.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 2:
                if ftype == TType.STRUCT:
                    self.ace = airavata.api.error.ttypes.AiravataClientException()
                    self.ace.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 3:
                if ftype == TType.STRUCT:
                    self.ase = airavata.api.error.ttypes.AiravataSystemException()
                    self.ase.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 4:
                if ftype == TType.STRUCT:
                    self.ae = 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', (airavata.model.security.ttypes.AuthzToken, 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 = 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', (airavata.model.appcatalog.computeresource.ttypes.CloudJobSubmission, airavata.model.appcatalog.computeresource.ttypes.CloudJobSubmission.thrift_spec), None, ),  # 0
        (1, TType.STRUCT, 'ire', (airavata.api.error.ttypes.InvalidRequestException, airavata.api.error.ttypes.InvalidRequestException.thrift_spec), None, ),  # 1
        (2, TType.STRUCT, 'ace', (airavata.api.error.ttypes.AiravataClientException, airavata.api.error.ttypes.AiravataClientException.thrift_spec), None, ),  # 2
        (3, TType.STRUCT, 'ase', (airavata.api.error.ttypes.AiravataSystemException, airavata.api.error.ttypes.AiravataSystemException.thrift_spec), None, ),  # 3
        (4, TType.STRUCT, 'ae', (airavata.api.error.ttypes.AuthorizationException, 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 = airavata.model.appcatalog.computeresource.ttypes.CloudJobSubmission()
                    self.success.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 1:
                if ftype == TType.STRUCT:
                    self.ire = airavata.api.error.ttypes.InvalidRequestException()
                    self.ire.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 2:
                if ftype == TType.STRUCT:
                    self.ace = airavata.api.error.ttypes.AiravataClientException()
                    self.ace.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 3:
                if ftype == TType.STRUCT:
                    self.ase = airavata.api.error.ttypes.AiravataSystemException()
                    self.ase.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 4:
                if ftype == TType.STRUCT:
                    self.ae = 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', (airavata.model.security.ttypes.AuthzToken, airavata.model.security.ttypes.AuthzToken.thrift_spec), None, ),  # 1
        (2, TType.STRING, 'jobSubmissionInterfaceId', 'UTF8', None, ),  # 2
        (3, TType.STRUCT, 'sshJobSubmission', (airavata.model.appcatalog.computeresource.ttypes.SSHJobSubmission, 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 = 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 = 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', (airavata.api.error.ttypes.InvalidRequestException, airavata.api.error.ttypes.InvalidRequestException.thrift_spec), None, ),  # 1
        (2, TType.STRUCT, 'ace', (airavata.api.error.ttypes.AiravataClientException, airavata.api.error.ttypes.AiravataClientException.thrift_spec), None, ),  # 2
        (3, TType.STRUCT, 'ase', (airavata.api.error.ttypes.AiravataSystemException, airavata.api.error.ttypes.AiravataSystemException.thrift_spec), None, ),  # 3
        (4, TType.STRUCT, 'ae', (airavata.api.error.ttypes.AuthorizationException, 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 = airavata.api.error.ttypes.InvalidRequestException()
                    self.ire.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 2:
                if ftype == TType.STRUCT:
                    self.ace = airavata.api.error.ttypes.AiravataClientException()
                    self.ace.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 3:
                if ftype == TType.STRUCT:
                    self.ase = airavata.api.error.ttypes.AiravataSystemException()
                    self.ase.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 4:
                if ftype == TType.STRUCT:
                    self.ae = 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', (airavata.model.security.ttypes.AuthzToken, airavata.model.security.ttypes.AuthzToken.thrift_spec), None, ),  # 1
        (2, TType.STRING, 'jobSubmissionInterfaceId', 'UTF8', None, ),  # 2
        (3, TType.STRUCT, 'sshJobSubmission', (airavata.model.appcatalog.computeresource.ttypes.CloudJobSubmission, 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 = 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 = 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', (airavata.api.error.ttypes.InvalidRequestException, airavata.api.error.ttypes.InvalidRequestException.thrift_spec), None, ),  # 1
        (2, TType.STRUCT, 'ace', (airavata.api.error.ttypes.AiravataClientException, airavata.api.error.ttypes.AiravataClientException.thrift_spec), None, ),  # 2
        (3, TType.STRUCT, 'ase', (airavata.api.error.ttypes.AiravataSystemException, airavata.api.error.ttypes.AiravataSystemException.thrift_spec), None, ),  # 3
        (4, TType.STRUCT, 'ae', (airavata.api.error.ttypes.AuthorizationException, 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 = airavata.api.error.ttypes.InvalidRequestException()
                    self.ire.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 2:
                if ftype == TType.STRUCT:
                    self.ace = airavata.api.error.ttypes.AiravataClientException()
                    self.ace.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 3:
                if ftype == TType.STRUCT:
                    self.ase = airavata.api.error.ttypes.AiravataSystemException()
                    self.ase.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 4:
                if ftype == TType.STRUCT:
                    self.ae = 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', (airavata.model.security.ttypes.AuthzToken, airavata.model.security.ttypes.AuthzToken.thrift_spec), None, ),  # 1
        (2, TType.STRING, 'jobSubmissionInterfaceId', 'UTF8', None, ),  # 2
        (3, TType.STRUCT, 'unicoreJobSubmission', (airavata.model.appcatalog.computeresource.ttypes.UnicoreJobSubmission, 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 = 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 = 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', (airavata.api.error.ttypes.InvalidRequestException, airavata.api.error.ttypes.InvalidRequestException.thrift_spec), None, ),  # 1
        (2, TType.STRUCT, 'ace', (airavata.api.error.ttypes.AiravataClientException, airavata.api.error.ttypes.AiravataClientException.thrift_spec), None, ),  # 2
        (3, TType.STRUCT, 'ase', (airavata.api.error.ttypes.AiravataSystemException, airavata.api.error.ttypes.AiravataSystemException.thrift_spec), None, ),  # 3
        (4, TType.STRUCT, 'ae', (airavata.api.error.ttypes.AuthorizationException, 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 = airavata.api.error.ttypes.InvalidRequestException()
                    self.ire.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 2:
                if ftype == TType.STRUCT:
                    self.ace = airavata.api.error.ttypes.AiravataClientException()
                    self.ace.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 3:
                if ftype == TType.STRUCT:
                    self.ase = airavata.api.error.ttypes.AiravataSystemException()
                    self.ase.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 4:
                if ftype == TType.STRUCT:
                    self.ae = 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', (airavata.model.security.ttypes.AuthzToken, 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', (airavata.model.data.movement.ttypes.LOCALDataMovement, 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 = 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 = 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', (airavata.api.error.ttypes.InvalidRequestException, airavata.api.error.ttypes.InvalidRequestException.thrift_spec), None, ),  # 1
        (2, TType.STRUCT, 'ace', (airavata.api.error.ttypes.AiravataClientException, airavata.api.error.ttypes.AiravataClientException.thrift_spec), None, ),  # 2
        (3, TType.STRUCT, 'ase', (airavata.api.error.ttypes.AiravataSystemException, airavata.api.error.ttypes.AiravataSystemException.thrift_spec), None, ),  # 3
        (4, TType.STRUCT, 'ae', (airavata.api.error.ttypes.AuthorizationException, 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 = airavata.api.error.ttypes.InvalidRequestException()
                    self.ire.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 2:
                if ftype == TType.STRUCT:
                    self.ace = airavata.api.error.ttypes.AiravataClientException()
                    self.ace.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 3:
                if ftype == TType.STRUCT:
                    self.ase = airavata.api.error.ttypes.AiravataSystemException()
                    self.ase.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 4:
                if ftype == TType.STRUCT:
                    self.ae = 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', (airavata.model.security.ttypes.AuthzToken, airavata.model.security.ttypes.AuthzToken.thrift_spec), None, ),  # 1
        (2, TType.STRING, 'dataMovementInterfaceId', 'UTF8', None, ),  # 2
        (3, TType.STRUCT, 'localDataMovement', (airavata.model.data.movement.ttypes.LOCALDataMovement, 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 = 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 = 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', (airavata.api.error.ttypes.InvalidRequestException, airavata.api.error.ttypes.InvalidRequestException.thrift_spec), None, ),  # 1
        (2, TType.STRUCT, 'ace', (airavata.api.error.ttypes.AiravataClientException, airavata.api.error.ttypes.AiravataClientException.thrift_spec), None, ),  # 2
        (3, TType.STRUCT, 'ase', (airavata.api.error.ttypes.AiravataSystemException, airavata.api.error.ttypes.AiravataSystemException.thrift_spec), None, ),  # 3
        (4, TType.STRUCT, 'ae', (airavata.api.error.ttypes.AuthorizationException, 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 = airavata.api.error.ttypes.InvalidRequestException()
                    self.ire.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 2:
                if ftype == TType.STRUCT:
                    self.ace = airavata.api.error.ttypes.AiravataClientException()
                    self.ace.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 3:
                if ftype == TType.STRUCT:
                    self.ase = airavata.api.error.ttypes.AiravataSystemException()
                    self.ase.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 4:
                if ftype == TType.STRUCT:
                    self.ae = 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', (airavata.model.security.ttypes.AuthzToken, 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 = 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', (airavata.model.data.movement.ttypes.LOCALDataMovement, airavata.model.data.movement.ttypes.LOCALDataMovement.thrift_spec), None, ),  # 0
        (1, TType.STRUCT, 'ire', (airavata.api.error.ttypes.InvalidRequestException, airavata.api.error.ttypes.InvalidRequestException.thrift_spec), None, ),  # 1
        (2, TType.STRUCT, 'ace', (airavata.api.error.ttypes.AiravataClientException, airavata.api.error.ttypes.AiravataClientException.thrift_spec), None, ),  # 2
        (3, TType.STRUCT, 'ase', (airavata.api.error.ttypes.AiravataSystemException, airavata.api.error.ttypes.AiravataSystemException.thrift_spec), None, ),  # 3
        (4, TType.STRUCT, 'ae', (airavata.api.error.ttypes.AuthorizationException, 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 = airavata.model.data.movement.ttypes.LOCALDataMovement()
                    self.success.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 1:
                if ftype == TType.STRUCT:
                    self.ire = airavata.api.error.ttypes.InvalidRequestException()
                    self.ire.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 2:
                if ftype == TType.STRUCT:
                    self.ace = airavata.api.error.ttypes.AiravataClientException()
                    self.ace.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 3:
                if ftype == TType.STRUCT:
                    self.ase = airavata.api.error.ttypes.AiravataSystemException()
                    self.ase.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 4:
                if ftype == TType.STRUCT:
                    self.ae = 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', (airavata.model.security.ttypes.AuthzToken, 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', (airavata.model.data.movement.ttypes.SCPDataMovement, 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 = 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 = 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', (airavata.api.error.ttypes.InvalidRequestException, airavata.api.error.ttypes.InvalidRequestException.thrift_spec), None, ),  # 1
        (2, TType.STRUCT, 'ace', (airavata.api.error.ttypes.AiravataClientException, airavata.api.error.ttypes.AiravataClientException.thrift_spec), None, ),  # 2
        (3, TType.STRUCT, 'ase', (airavata.api.error.ttypes.AiravataSystemException, airavata.api.error.ttypes.AiravataSystemException.thrift_spec), None, ),  # 3
        (4, TType.STRUCT, 'ae', (airavata.api.error.ttypes.AuthorizationException, 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 = airavata.api.error.ttypes.InvalidRequestException()
                    self.ire.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 2:
                if ftype == TType.STRUCT:
                    self.ace = airavata.api.error.ttypes.AiravataClientException()
                    self.ace.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 3:
                if ftype == TType.STRUCT:
                    self.ase = airavata.api.error.ttypes.AiravataSystemException()
                    self.ase.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 4:
                if ftype == TType.STRUCT:
                    self.ae = 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', (airavata.model.security.ttypes.AuthzToken, airavata.model.security.ttypes.AuthzToken.thrift_spec), None, ),  # 1
        (2, TType.STRING, 'dataMovementInterfaceId', 'UTF8', None, ),  # 2
        (3, TType.STRUCT, 'scpDataMovement', (airavata.model.data.movement.ttypes.SCPDataMovement, 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 = 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 = 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', (airavata.api.error.ttypes.InvalidRequestException, airavata.api.error.ttypes.InvalidRequestException.thrift_spec), None, ),  # 1
        (2, TType.STRUCT, 'ace', (airavata.api.error.ttypes.AiravataClientException, airavata.api.error.ttypes.AiravataClientException.thrift_spec), None, ),  # 2
        (3, TType.STRUCT, 'ase', (airavata.api.error.ttypes.AiravataSystemException, airavata.api.error.ttypes.AiravataSystemException.thrift_spec), None, ),  # 3
        (4, TType.STRUCT, 'ae', (airavata.api.error.ttypes.AuthorizationException, 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 = airavata.api.error.ttypes.InvalidRequestException()
                    self.ire.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 2:
                if ftype == TType.STRUCT:
                    self.ace = airavata.api.error.ttypes.AiravataClientException()
                    self.ace.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 3:
                if ftype == TType.STRUCT:
                    self.ase = airavata.api.error.ttypes.AiravataSystemException()
                    self.ase.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 4:
                if ftype == TType.STRUCT:
                    self.ae = 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', (airavata.model.security.ttypes.AuthzToken, 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 = 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', (airavata.model.data.movement.ttypes.SCPDataMovement, airavata.model.data.movement.ttypes.SCPDataMovement.thrift_spec), None, ),  # 0
        (1, TType.STRUCT, 'ire', (airavata.api.error.ttypes.InvalidRequestException, airavata.api.error.ttypes.InvalidRequestException.thrift_spec), None, ),  # 1
        (2, TType.STRUCT, 'ace', (airavata.api.error.ttypes.AiravataClientException, airavata.api.error.ttypes.AiravataClientException.thrift_spec), None, ),  # 2
        (3, TType.STRUCT, 'ase', (airavata.api.error.ttypes.AiravataSystemException, airavata.api.error.ttypes.AiravataSystemException.thrift_spec), None, ),  # 3
        (4, TType.STRUCT, 'ae', (airavata.api.error.ttypes.AuthorizationException, 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 = airavata.model.data.movement.ttypes.SCPDataMovement()
                    self.success.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 1:
                if ftype == TType.STRUCT:
                    self.ire = airavata.api.error.ttypes.InvalidRequestException()
                    self.ire.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 2:
                if ftype == TType.STRUCT:
                    self.ace = airavata.api.error.ttypes.AiravataClientException()
                    self.ace.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 3:
                if ftype == TType.STRUCT:
                    self.ase = airavata.api.error.ttypes.AiravataSystemException()
                    self.ase.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 4:
                if ftype == TType.STRUCT:
                    self.ae = 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', (airavata.model.security.ttypes.AuthzToken, 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', (airavata.model.data.movement.ttypes.UnicoreDataMovement, 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 = 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 = 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', (airavata.api.error.ttypes.InvalidRequestException, airavata.api.error.ttypes.InvalidRequestException.thrift_spec), None, ),  # 1
        (2, TType.STRUCT, 'ace', (airavata.api.error.ttypes.AiravataClientException, airavata.api.error.ttypes.AiravataClientException.thrift_spec), None, ),  # 2
        (3, TType.STRUCT, 'ase', (airavata.api.error.ttypes.AiravataSystemException, airavata.api.error.ttypes.AiravataSystemException.thrift_spec), None, ),  # 3
        (4, TType.STRUCT, 'ae', (airavata.api.error.ttypes.AuthorizationException, 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 = airavata.api.error.ttypes.InvalidRequestException()
                    self.ire.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 2:
                if ftype == TType.STRUCT:
                    self.ace = airavata.api.error.ttypes.AiravataClientException()
                    self.ace.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 3:
                if ftype == TType.STRUCT:
                    self.ase = airavata.api.error.ttypes.AiravataSystemException()
                    self.ase.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 4:
                if ftype == TType.STRUCT:
                    self.ae = 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', (airavata.model.security.ttypes.AuthzToken, airavata.model.security.ttypes.AuthzToken.thrift_spec), None, ),  # 1
        (2, TType.STRING, 'dataMovementInterfaceId', 'UTF8', None, ),  # 2
        (3, TType.STRUCT, 'unicoreDataMovement', (airavata.model.data.movement.ttypes.UnicoreDataMovement, 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 = 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 = 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', (airavata.api.error.ttypes.InvalidRequestException, airavata.api.error.ttypes.InvalidRequestException.thrift_spec), None, ),  # 1
        (2, TType.STRUCT, 'ace', (airavata.api.error.ttypes.AiravataClientException, airavata.api.error.ttypes.AiravataClientException.thrift_spec), None, ),  # 2
        (3, TType.STRUCT, 'ase', (airavata.api.error.ttypes.AiravataSystemException, airavata.api.error.ttypes.AiravataSystemException.thrift_spec), None, ),  # 3
        (4, TType.STRUCT, 'ae', (airavata.api.error.ttypes.AuthorizationException, 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 = airavata.api.error.ttypes.InvalidRequestException()
                    self.ire.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 2:
                if ftype == TType.STRUCT:
                    self.ace = airavata.api.error.ttypes.AiravataClientException()
                    self.ace.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 3:
                if ftype == TType.STRUCT:
                    self.ase = airavata.api.error.ttypes.AiravataSystemException()
                    self.ase.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 4:
                if ftype == TType.STRUCT:
                    self.ae = 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', (airavata.model.security.ttypes.AuthzToken, 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 = 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', (airavata.model.data.movement.ttypes.UnicoreDataMovement, airavata.model.data.movement.ttypes.UnicoreDataMovement.thrift_spec), None, ),  # 0
        (1, TType.STRUCT, 'ire', (airavata.api.error.ttypes.InvalidRequestException, airavata.api.error.ttypes.InvalidRequestException.thrift_spec), None, ),  # 1
        (2, TType.STRUCT, 'ace', (airavata.api.error.ttypes.AiravataClientException, airavata.api.error.ttypes.AiravataClientException.thrift_spec), None, ),  # 2
        (3, TType.STRUCT, 'ase', (airavata.api.error.ttypes.AiravataSystemException, airavata.api.error.ttypes.AiravataSystemException.thrift_spec), None, ),  # 3
        (4, TType.STRUCT, 'ae', (airavata.api.error.ttypes.AuthorizationException, 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 = airavata.model.data.movement.ttypes.UnicoreDataMovement()
                    self.success.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 1:
                if ftype == TType.STRUCT:
                    self.ire = airavata.api.error.ttypes.InvalidRequestException()
                    self.ire.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 2:
                if ftype == TType.STRUCT:
                    self.ace = airavata.api.error.ttypes.AiravataClientException()
                    self.ace.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 3:
                if ftype == TType.STRUCT:
                    self.ase = airavata.api.error.ttypes.AiravataSystemException()
                    self.ase.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 4:
                if ftype == TType.STRUCT:
                    self.ae = 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', (airavata.model.security.ttypes.AuthzToken, 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', (airavata.model.data.movement.ttypes.GridFTPDataMovement, 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 = 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 = 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', (airavata.api.error.ttypes.InvalidRequestException, airavata.api.error.ttypes.InvalidRequestException.thrift_spec), None, ),  # 1
        (2, TType.STRUCT, 'ace', (airavata.api.error.ttypes.AiravataClientException, airavata.api.error.ttypes.AiravataClientException.thrift_spec), None, ),  # 2
        (3, TType.STRUCT, 'ase', (airavata.api.error.ttypes.AiravataSystemException, airavata.api.error.ttypes.AiravataSystemException.thrift_spec), None, ),  # 3
        (4, TType.STRUCT, 'ae', (airavata.api.error.ttypes.AuthorizationException, 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 = airavata.api.error.ttypes.InvalidRequestException()
                    self.ire.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 2:
                if ftype == TType.STRUCT:
                    self.ace = airavata.api.error.ttypes.AiravataClientException()
                    self.ace.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 3:
                if ftype == TType.STRUCT:
                    self.ase = airavata.api.error.ttypes.AiravataSystemException()
                    self.ase.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 4:
                if ftype == TType.STRUCT:
                    self.ae = 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', (airavata.model.security.ttypes.AuthzToken, airavata.model.security.ttypes.AuthzToken.thrift_spec), None, ),  # 1
        (2, TType.STRING, 'dataMovementInterfaceId', 'UTF8', None, ),  # 2
        (3, TType.STRUCT, 'gridFTPDataMovement', (airavata.model.data.movement.ttypes.GridFTPDataMovement, 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 = 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 = 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', (airavata.api.error.ttypes.InvalidRequestException, airavata.api.error.ttypes.InvalidRequestException.thrift_spec), None, ),  # 1
        (2, TType.STRUCT, 'ace', (airavata.api.error.ttypes.AiravataClientException, airavata.api.error.ttypes.AiravataClientException.thrift_spec), None, ),  # 2
        (3, TType.STRUCT, 'ase', (airavata.api.error.ttypes.AiravataSystemException, airavata.api.error.ttypes.AiravataSystemException.thrift_spec), None, ),  # 3
        (4, TType.STRUCT, 'ae', (airavata.api.error.ttypes.AuthorizationException, 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 = airavata.api.error.ttypes.InvalidRequestException()
                    self.ire.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 2:
                if ftype == TType.STRUCT:
                    self.ace = airavata.api.error.ttypes.AiravataClientException()
                    self.ace.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 3:
                if ftype == TType.STRUCT:
                    self.ase = airavata.api.error.ttypes.AiravataSystemException()
                    self.ase.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 4:
                if ftype == TType.STRUCT:
                    self.ae = 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', (airavata.model.security.ttypes.AuthzToken, 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 = 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', (airavata.model.data.movement.ttypes.GridFTPDataMovement, airavata.model.data.movement.ttypes.GridFTPDataMovement.thrift_spec), None, ),  # 0
        (1, TType.STRUCT, 'ire', (airavata.api.error.ttypes.InvalidRequestException, airavata.api.error.ttypes.InvalidRequestException.thrift_spec), None, ),  # 1
        (2, TType.STRUCT, 'ace', (airavata.api.error.ttypes.AiravataClientException, airavata.api.error.ttypes.AiravataClientException.thrift_spec), None, ),  # 2
        (3, TType.STRUCT, 'ase', (airavata.api.error.ttypes.AiravataSystemException, airavata.api.error.ttypes.AiravataSystemException.thrift_spec), None, ),  # 3
        (4, TType.STRUCT, 'ae', (airavata.api.error.ttypes.AuthorizationException, 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 = airavata.model.data.movement.ttypes.GridFTPDataMovement()
                    self.success.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 1:
                if ftype == TType.STRUCT:
                    self.ire = airavata.api.error.ttypes.InvalidRequestException()
                    self.ire.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 2:
                if ftype == TType.STRUCT:
                    self.ace = airavata.api.error.ttypes.AiravataClientException()
                    self.ace.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 3:
                if ftype == TType.STRUCT:
                    self.ase = airavata.api.error.ttypes.AiravataSystemException()
                    self.ase.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 4:
                if ftype == TType.STRUCT:
                    self.ae = 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', (airavata.model.security.ttypes.AuthzToken, 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 = 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', (airavata.api.error.ttypes.InvalidRequestException, airavata.api.error.ttypes.InvalidRequestException.thrift_spec), None, ),  # 1
        (2, TType.STRUCT, 'ace', (airavata.api.error.ttypes.AiravataClientException, airavata.api.error.ttypes.AiravataClientException.thrift_spec), None, ),  # 2
        (3, TType.STRUCT, 'ase', (airavata.api.error.ttypes.AiravataSystemException, airavata.api.error.ttypes.AiravataSystemException.thrift_spec), None, ),  # 3
        (4, TType.STRUCT, 'ae', (airavata.api.error.ttypes.AuthorizationException, 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 = airavata.api.error.ttypes.InvalidRequestException()
                    self.ire.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 2:
                if ftype == TType.STRUCT:
                    self.ace = airavata.api.error.ttypes.AiravataClientException()
                    self.ace.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 3:
                if ftype == TType.STRUCT:
                    self.ase = airavata.api.error.ttypes.AiravataSystemException()
                    self.ase.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 4:
                if ftype == TType.STRUCT:
                    self.ae = 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', (airavata.model.security.ttypes.AuthzToken, 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 = 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', (airavata.api.error.ttypes.InvalidRequestException, airavata.api.error.ttypes.InvalidRequestException.thrift_spec), None, ),  # 1
        (2, TType.STRUCT, 'ace', (airavata.api.error.ttypes.AiravataClientException, airavata.api.error.ttypes.AiravataClientException.thrift_spec), None, ),  # 2
        (3, TType.STRUCT, 'ase', (airavata.api.error.ttypes.AiravataSystemException, airavata.api.error.ttypes.AiravataSystemException.thrift_spec), None, ),  # 3
        (4, TType.STRUCT, 'ae', (airavata.api.error.ttypes.AuthorizationException, 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 = airavata.api.error.ttypes.InvalidRequestException()
                    self.ire.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 2:
                if ftype == TType.STRUCT:
                    self.ace = airavata.api.error.ttypes.AiravataClientException()
                    self.ace.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 3:
                if ftype == TType.STRUCT:
                    self.ase = airavata.api.error.ttypes.AiravataSystemException()
                    self.ase.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 4:
                if ftype == TType.STRUCT:
                    self.ae = 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', (airavata.model.security.ttypes.AuthzToken, 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 = airavata.model.security.ttypes.AuthzToken()
                    self.authzToken.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 2:
                if ftype == TType.MAP:
                    self.jobSubmissionPriorityMap = {}
                    (_ktype225, _vtype226, _size224) = iprot.readMapBegin()
                    for _i228 in range(_size224):
                        _key229 = iprot.readString().decode('utf-8') if sys.version_info[0] == 2 else iprot.readString()
                        _val230 = iprot.readI32()
                        self.jobSubmissionPriorityMap[_key229] = _val230
                    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 kiter231, viter232 in self.jobSubmissionPriorityMap.items():
                oprot.writeString(kiter231.encode('utf-8') if sys.version_info[0] == 2 else kiter231)
                oprot.writeI32(viter232)
            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', (airavata.api.error.ttypes.InvalidRequestException, airavata.api.error.ttypes.InvalidRequestException.thrift_spec), None, ),  # 1
        (2, TType.STRUCT, 'ace', (airavata.api.error.ttypes.AiravataClientException, airavata.api.error.ttypes.AiravataClientException.thrift_spec), None, ),  # 2
        (3, TType.STRUCT, 'ase', (airavata.api.error.ttypes.AiravataSystemException, airavata.api.error.ttypes.AiravataSystemException.thrift_spec), None, ),  # 3
        (4, TType.STRUCT, 'ae', (airavata.api.error.ttypes.AuthorizationException, 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 = airavata.api.error.ttypes.InvalidRequestException()
                    self.ire.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 2:
                if ftype == TType.STRUCT:
                    self.ace = airavata.api.error.ttypes.AiravataClientException()
                    self.ace.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 3:
                if ftype == TType.STRUCT:
                    self.ase = airavata.api.error.ttypes.AiravataSystemException()
                    self.ase.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 4:
                if ftype == TType.STRUCT:
                    self.ae = 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', (airavata.model.security.ttypes.AuthzToken, 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 = airavata.model.security.ttypes.AuthzToken()
                    self.authzToken.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 2:
                if ftype == TType.MAP:
                    self.dataMovementPriorityMap = {}
                    (_ktype234, _vtype235, _size233) = iprot.readMapBegin()
                    for _i237 in range(_size233):
                        _key238 = iprot.readString().decode('utf-8') if sys.version_info[0] == 2 else iprot.readString()
                        _val239 = iprot.readI32()
                        self.dataMovementPriorityMap[_key238] = _val239
                    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 kiter240, viter241 in self.dataMovementPriorityMap.items():
                oprot.writeString(kiter240.encode('utf-8') if sys.version_info[0] == 2 else kiter240)
                oprot.writeI32(viter241)
            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', (airavata.api.error.ttypes.InvalidRequestException, airavata.api.error.ttypes.InvalidRequestException.thrift_spec), None, ),  # 1
        (2, TType.STRUCT, 'ace', (airavata.api.error.ttypes.AiravataClientException, airavata.api.error.ttypes.AiravataClientException.thrift_spec), None, ),  # 2
        (3, TType.STRUCT, 'ase', (airavata.api.error.ttypes.AiravataSystemException, airavata.api.error.ttypes.AiravataSystemException.thrift_spec), None, ),  # 3
        (4, TType.STRUCT, 'ae', (airavata.api.error.ttypes.AuthorizationException, 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 = airavata.api.error.ttypes.InvalidRequestException()
                    self.ire.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 2:
                if ftype == TType.STRUCT:
                    self.ace = airavata.api.error.ttypes.AiravataClientException()
                    self.ace.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 3:
                if ftype == TType.STRUCT:
                    self.ase = airavata.api.error.ttypes.AiravataSystemException()
                    self.ase.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 4:
                if ftype == TType.STRUCT:
                    self.ae = 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', (airavata.model.security.ttypes.AuthzToken, 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 = 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', (airavata.api.error.ttypes.InvalidRequestException, airavata.api.error.ttypes.InvalidRequestException.thrift_spec), None, ),  # 1
        (2, TType.STRUCT, 'ace', (airavata.api.error.ttypes.AiravataClientException, airavata.api.error.ttypes.AiravataClientException.thrift_spec), None, ),  # 2
        (3, TType.STRUCT, 'ase', (airavata.api.error.ttypes.AiravataSystemException, airavata.api.error.ttypes.AiravataSystemException.thrift_spec), None, ),  # 3
        (4, TType.STRUCT, 'ae', (airavata.api.error.ttypes.AuthorizationException, 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 = airavata.api.error.ttypes.InvalidRequestException()
                    self.ire.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 2:
                if ftype == TType.STRUCT:
                    self.ace = airavata.api.error.ttypes.AiravataClientException()
                    self.ace.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 3:
                if ftype == TType.STRUCT:
                    self.ase = airavata.api.error.ttypes.AiravataSystemException()
                    self.ase.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 4:
                if ftype == TType.STRUCT:
                    self.ae = 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', (airavata.model.security.ttypes.AuthzToken, 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 = 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', (airavata.api.error.ttypes.InvalidRequestException, airavata.api.error.ttypes.InvalidRequestException.thrift_spec), None, ),  # 1
        (2, TType.STRUCT, 'ace', (airavata.api.error.ttypes.AiravataClientException, airavata.api.error.ttypes.AiravataClientException.thrift_spec), None, ),  # 2
        (3, TType.STRUCT, 'ase', (airavata.api.error.ttypes.AiravataSystemException, airavata.api.error.ttypes.AiravataSystemException.thrift_spec), None, ),  # 3
        (4, TType.STRUCT, 'ae', (airavata.api.error.ttypes.AuthorizationException, 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 = airavata.api.error.ttypes.InvalidRequestException()
                    self.ire.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 2:
                if ftype == TType.STRUCT:
                    self.ace = airavata.api.error.ttypes.AiravataClientException()
                    self.ace.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 3:
                if ftype == TType.STRUCT:
                    self.ase = airavata.api.error.ttypes.AiravataSystemException()
                    self.ase.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 4:
                if ftype == TType.STRUCT:
                    self.ae = 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', (airavata.model.security.ttypes.AuthzToken, airavata.model.security.ttypes.AuthzToken.thrift_spec), None, ),  # 1
        (2, TType.STRUCT, 'resourceJobManager', (airavata.model.appcatalog.computeresource.ttypes.ResourceJobManager, 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 = airavata.model.security.ttypes.AuthzToken()
                    self.authzToken.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 2:
                if ftype == TType.STRUCT:
                    self.resourceJobManager = 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', (airavata.api.error.ttypes.InvalidRequestException, airavata.api.error.ttypes.InvalidRequestException.thrift_spec), None, ),  # 1
        (2, TType.STRUCT, 'ace', (airavata.api.error.ttypes.AiravataClientException, airavata.api.error.ttypes.AiravataClientException.thrift_spec), None, ),  # 2
        (3, TType.STRUCT, 'ase', (airavata.api.error.ttypes.AiravataSystemException, airavata.api.error.ttypes.AiravataSystemException.thrift_spec), None, ),  # 3
        (4, TType.STRUCT, 'ae', (airavata.api.error.ttypes.AuthorizationException, 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 = airavata.api.error.ttypes.InvalidRequestException()
                    self.ire.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 2:
                if ftype == TType.STRUCT:
                    self.ace = airavata.api.error.ttypes.AiravataClientException()
                    self.ace.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 3:
                if ftype == TType.STRUCT:
                    self.ase = airavata.api.error.ttypes.AiravataSystemException()
                    self.ase.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 4:
                if ftype == TType.STRUCT:
                    self.ae = 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', (airavata.model.security.ttypes.AuthzToken, airavata.model.security.ttypes.AuthzToken.thrift_spec), None, ),  # 1
        (2, TType.STRING, 'resourceJobManagerId', 'UTF8', None, ),  # 2
        (3, TType.STRUCT, 'updatedResourceJobManager', (airavata.model.appcatalog.computeresource.ttypes.ResourceJobManager, 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 = 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 = 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', (airavata.api.error.ttypes.InvalidRequestException, airavata.api.error.ttypes.InvalidRequestException.thrift_spec), None, ),  # 1
        (2, TType.STRUCT, 'ace', (airavata.api.error.ttypes.AiravataClientException, airavata.api.error.ttypes.AiravataClientException.thrift_spec), None, ),  # 2
        (3, TType.STRUCT, 'ase', (airavata.api.error.ttypes.AiravataSystemException, airavata.api.error.ttypes.AiravataSystemException.thrift_spec), None, ),  # 3
        (4, TType.STRUCT, 'ae', (airavata.api.error.ttypes.AuthorizationException, 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 = airavata.api.error.ttypes.InvalidRequestException()
                    self.ire.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 2:
                if ftype == TType.STRUCT:
                    self.ace = airavata.api.error.ttypes.AiravataClientException()
                    self.ace.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 3:
                if ftype == TType.STRUCT:
                    self.ase = airavata.api.error.ttypes.AiravataSystemException()
                    self.ase.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 4:
                if ftype == TType.STRUCT:
                    self.ae = 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', (airavata.model.security.ttypes.AuthzToken, 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 = 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', (airavata.model.appcatalog.computeresource.ttypes.ResourceJobManager, airavata.model.appcatalog.computeresource.ttypes.ResourceJobManager.thrift_spec), None, ),  # 0
        (1, TType.STRUCT, 'ire', (airavata.api.error.ttypes.InvalidRequestException, airavata.api.error.ttypes.InvalidRequestException.thrift_spec), None, ),  # 1
        (2, TType.STRUCT, 'ace', (airavata.api.error.ttypes.AiravataClientException, airavata.api.error.ttypes.AiravataClientException.thrift_spec), None, ),  # 2
        (3, TType.STRUCT, 'ase', (airavata.api.error.ttypes.AiravataSystemException, airavata.api.error.ttypes.AiravataSystemException.thrift_spec), None, ),  # 3
        (4, TType.STRUCT, 'ae', (airavata.api.error.ttypes.AuthorizationException, 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 = airavata.model.appcatalog.computeresource.ttypes.ResourceJobManager()
                    self.success.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 1:
                if ftype == TType.STRUCT:
                    self.ire = airavata.api.error.ttypes.InvalidRequestException()
                    self.ire.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 2:
                if ftype == TType.STRUCT:
                    self.ace = airavata.api.error.ttypes.AiravataClientException()
                    self.ace.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 3:
                if ftype == TType.STRUCT:
                    self.ase = airavata.api.error.ttypes.AiravataSystemException()
                    self.ase.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 4:
                if ftype == TType.STRUCT:
                    self.ae = 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', (airavata.model.security.ttypes.AuthzToken, 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 = 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', (airavata.api.error.ttypes.InvalidRequestException, airavata.api.error.ttypes.InvalidRequestException.thrift_spec), None, ),  # 1
        (2, TType.STRUCT, 'ace', (airavata.api.error.ttypes.AiravataClientException, airavata.api.error.ttypes.AiravataClientException.thrift_spec), None, ),  # 2
        (3, TType.STRUCT, 'ase', (airavata.api.error.ttypes.AiravataSystemException, airavata.api.error.ttypes.AiravataSystemException.thrift_spec), None, ),  # 3
        (4, TType.STRUCT, 'ae', (airavata.api.error.ttypes.AuthorizationException, 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 = airavata.api.error.ttypes.InvalidRequestException()
                    self.ire.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 2:
                if ftype == TType.STRUCT:
                    self.ace = airavata.api.error.ttypes.AiravataClientException()
                    self.ace.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 3:
                if ftype == TType.STRUCT:
                    self.ase = airavata.api.error.ttypes.AiravataSystemException()
                    self.ase.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 4:
                if ftype == TType.STRUCT:
                    self.ae = 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', (airavata.model.security.ttypes.AuthzToken, 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 = 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', (airavata.api.error.ttypes.InvalidRequestException, airavata.api.error.ttypes.InvalidRequestException.thrift_spec), None, ),  # 1
        (2, TType.STRUCT, 'ace', (airavata.api.error.ttypes.AiravataClientException, airavata.api.error.ttypes.AiravataClientException.thrift_spec), None, ),  # 2
        (3, TType.STRUCT, 'ase', (airavata.api.error.ttypes.AiravataSystemException, airavata.api.error.ttypes.AiravataSystemException.thrift_spec), None, ),  # 3
        (4, TType.STRUCT, 'ae', (airavata.api.error.ttypes.AuthorizationException, 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 = airavata.api.error.ttypes.InvalidRequestException()
                    self.ire.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 2:
                if ftype == TType.STRUCT:
                    self.ace = airavata.api.error.ttypes.AiravataClientException()
                    self.ace.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 3:
                if ftype == TType.STRUCT:
                    self.ase = airavata.api.error.ttypes.AiravataSystemException()
                    self.ase.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 4:
                if ftype == TType.STRUCT:
                    self.ae = 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', (airavata.model.security.ttypes.AuthzToken, airavata.model.security.ttypes.AuthzToken.thrift_spec), None, ),  # 1
        (2, TType.STRUCT, 'gatewayResourceProfile', (airavata.model.appcatalog.gatewayprofile.ttypes.GatewayResourceProfile, 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 = airavata.model.security.ttypes.AuthzToken()
                    self.authzToken.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 2:
                if ftype == TType.STRUCT:
                    self.gatewayResourceProfile = 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', (airavata.api.error.ttypes.InvalidRequestException, airavata.api.error.ttypes.InvalidRequestException.thrift_spec), None, ),  # 1
        (2, TType.STRUCT, 'ace', (airavata.api.error.ttypes.AiravataClientException, airavata.api.error.ttypes.AiravataClientException.thrift_spec), None, ),  # 2
        (3, TType.STRUCT, 'ase', (airavata.api.error.ttypes.AiravataSystemException, airavata.api.error.ttypes.AiravataSystemException.thrift_spec), None, ),  # 3
        (4, TType.STRUCT, 'ae', (airavata.api.error.ttypes.AuthorizationException, 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 = airavata.api.error.ttypes.InvalidRequestException()
                    self.ire.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 2:
                if ftype == TType.STRUCT:
                    self.ace = airavata.api.error.ttypes.AiravataClientException()
                    self.ace.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 3:
                if ftype == TType.STRUCT:
                    self.ase = airavata.api.error.ttypes.AiravataSystemException()
                    self.ase.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 4:
                if ftype == TType.STRUCT:
                    self.ae = 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', (airavata.model.security.ttypes.AuthzToken, 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 = 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', (airavata.model.appcatalog.gatewayprofile.ttypes.GatewayResourceProfile, airavata.model.appcatalog.gatewayprofile.ttypes.GatewayResourceProfile.thrift_spec), None, ),  # 0
        (1, TType.STRUCT, 'ire', (airavata.api.error.ttypes.InvalidRequestException, airavata.api.error.ttypes.InvalidRequestException.thrift_spec), None, ),  # 1
        (2, TType.STRUCT, 'ace', (airavata.api.error.ttypes.AiravataClientException, airavata.api.error.ttypes.AiravataClientException.thrift_spec), None, ),  # 2
        (3, TType.STRUCT, 'ase', (airavata.api.error.ttypes.AiravataSystemException, airavata.api.error.ttypes.AiravataSystemException.thrift_spec), None, ),  # 3
        (4, TType.STRUCT, 'ae', (airavata.api.error.ttypes.AuthorizationException, 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 = airavata.model.appcatalog.gatewayprofile.ttypes.GatewayResourceProfile()
                    self.success.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 1:
                if ftype == TType.STRUCT:
                    self.ire = airavata.api.error.ttypes.InvalidRequestException()
                    self.ire.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 2:
                if ftype == TType.STRUCT:
                    self.ace = airavata.api.error.ttypes.AiravataClientException()
                    self.ace.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 3:
                if ftype == TType.STRUCT:
                    self.ase = airavata.api.error.ttypes.AiravataSystemException()
                    self.ase.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 4:
                if ftype == TType.STRUCT:
                    self.ae = 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', (airavata.model.security.ttypes.AuthzToken, airavata.model.security.ttypes.AuthzToken.thrift_spec), None, ),  # 1
        (2, TType.STRING, 'gatewayID', 'UTF8', None, ),  # 2
        (3, TType.STRUCT, 'gatewayResourceProfile', (airavata.model.appcatalog.gatewayprofile.ttypes.GatewayResourceProfile, 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 = 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 = 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', (airavata.api.error.ttypes.InvalidRequestException, airavata.api.error.ttypes.InvalidRequestException.thrift_spec), None, ),  # 1
        (2, TType.STRUCT, 'ace', (airavata.api.error.ttypes.AiravataClientException, airavata.api.error.ttypes.AiravataClientException.thrift_spec), None, ),  # 2
        (3, TType.STRUCT, 'ase', (airavata.api.error.ttypes.AiravataSystemException, airavata.api.error.ttypes.AiravataSystemException.thrift_spec), None, ),  # 3
        (4, TType.STRUCT, 'ae', (airavata.api.error.ttypes.AuthorizationException, 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 = airavata.api.error.ttypes.InvalidRequestException()
                    self.ire.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 2:
                if ftype == TType.STRUCT:
                    self.ace = airavata.api.error.ttypes.AiravataClientException()
                    self.ace.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 3:
                if ftype == TType.STRUCT:
                    self.ase = airavata.api.error.ttypes.AiravataSystemException()
                    self.ase.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 4:
                if ftype == TType.STRUCT:
                    self.ae = 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', (airavata.model.security.ttypes.AuthzToken, 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 = 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', (airavata.api.error.ttypes.InvalidRequestException, airavata.api.error.ttypes.InvalidRequestException.thrift_spec), None, ),  # 1
        (2, TType.STRUCT, 'ace', (airavata.api.error.ttypes.AiravataClientException, airavata.api.error.ttypes.AiravataClientException.thrift_spec), None, ),  # 2
        (3, TType.STRUCT, 'ase', (airavata.api.error.ttypes.AiravataSystemException, airavata.api.error.ttypes.AiravataSystemException.thrift_spec), None, ),  # 3
        (4, TType.STRUCT, 'ae', (airavata.api.error.ttypes.AuthorizationException, 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 = airavata.api.error.ttypes.InvalidRequestException()
                    self.ire.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 2:
                if ftype == TType.STRUCT:
                    self.ace = airavata.api.error.ttypes.AiravataClientException()
                    self.ace.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 3:
                if ftype == TType.STRUCT:
                    self.ase = airavata.api.error.ttypes.AiravataSystemException()
                    self.ase.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 4:
                if ftype == TType.STRUCT:
                    self.ae = 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', (airavata.model.security.ttypes.AuthzToken, 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', (airavata.model.appcatalog.gatewayprofile.ttypes.ComputeResourcePreference, 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 = 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 = 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', (airavata.api.error.ttypes.InvalidRequestException, airavata.api.error.ttypes.InvalidRequestException.thrift_spec), None, ),  # 1
        (2, TType.STRUCT, 'ace', (airavata.api.error.ttypes.AiravataClientException, airavata.api.error.ttypes.AiravataClientException.thrift_spec), None, ),  # 2
        (3, TType.STRUCT, 'ase', (airavata.api.error.ttypes.AiravataSystemException, airavata.api.error.ttypes.AiravataSystemException.thrift_spec), None, ),  # 3
        (4, TType.STRUCT, 'ae', (airavata.api.error.ttypes.AuthorizationException, 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 = airavata.api.error.ttypes.InvalidRequestException()
                    self.ire.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 2:
                if ftype == TType.STRUCT:
                    self.ace = airavata.api.error.ttypes.AiravataClientException()
                    self.ace.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 3:
                if ftype == TType.STRUCT:
                    self.ase = airavata.api.error.ttypes.AiravataSystemException()
                    self.ase.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 4:
                if ftype == TType.STRUCT:
                    self.ae = 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', (airavata.model.security.ttypes.AuthzToken, 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', (airavata.model.appcatalog.gatewayprofile.ttypes.StoragePreference, 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 = 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 = 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', (airavata.api.error.ttypes.InvalidRequestException, airavata.api.error.ttypes.InvalidRequestException.thrift_spec), None, ),  # 1
        (2, TType.STRUCT, 'ace', (airavata.api.error.ttypes.AiravataClientException, airavata.api.error.ttypes.AiravataClientException.thrift_spec), None, ),  # 2
        (3, TType.STRUCT, 'ase', (airavata.api.error.ttypes.AiravataSystemException, airavata.api.error.ttypes.AiravataSystemException.thrift_spec), None, ),  # 3
        (4, TType.STRUCT, 'ae', (airavata.api.error.ttypes.AuthorizationException, 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 = airavata.api.error.ttypes.InvalidRequestException()
                    self.ire.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 2:
                if ftype == TType.STRUCT:
                    self.ace = airavata.api.error.ttypes.AiravataClientException()
                    self.ace.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 3:
                if ftype == TType.STRUCT:
                    self.ase = airavata.api.error.ttypes.AiravataSystemException()
                    self.ase.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 4:
                if ftype == TType.STRUCT:
                    self.ae = 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', (airavata.model.security.ttypes.AuthzToken, 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 = 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', (airavata.model.appcatalog.gatewayprofile.ttypes.ComputeResourcePreference, airavata.model.appcatalog.gatewayprofile.ttypes.ComputeResourcePreference.thrift_spec), None, ),  # 0
        (1, TType.STRUCT, 'ire', (airavata.api.error.ttypes.InvalidRequestException, airavata.api.error.ttypes.InvalidRequestException.thrift_spec), None, ),  # 1
        (2, TType.STRUCT, 'ace', (airavata.api.error.ttypes.AiravataClientException, airavata.api.error.ttypes.AiravataClientException.thrift_spec), None, ),  # 2
        (3, TType.STRUCT, 'ase', (airavata.api.error.ttypes.AiravataSystemException, airavata.api.error.ttypes.AiravataSystemException.thrift_spec), None, ),  # 3
        (4, TType.STRUCT, 'ae', (airavata.api.error.ttypes.AuthorizationException, 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 = airavata.model.appcatalog.gatewayprofile.ttypes.ComputeResourcePreference()
                    self.success.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 1:
                if ftype == TType.STRUCT:
                    self.ire = airavata.api.error.ttypes.InvalidRequestException()
                    self.ire.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 2:
                if ftype == TType.STRUCT:
                    self.ace = airavata.api.error.ttypes.AiravataClientException()
                    self.ace.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 3:
                if ftype == TType.STRUCT:
                    self.ase = airavata.api.error.ttypes.AiravataSystemException()
                    self.ase.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 4:
                if ftype == TType.STRUCT:
                    self.ae = 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', (airavata.model.security.ttypes.AuthzToken, 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 = 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', (airavata.model.appcatalog.gatewayprofile.ttypes.StoragePreference, airavata.model.appcatalog.gatewayprofile.ttypes.StoragePreference.thrift_spec), None, ),  # 0
        (1, TType.STRUCT, 'ire', (airavata.api.error.ttypes.InvalidRequestException, airavata.api.error.ttypes.InvalidRequestException.thrift_spec), None, ),  # 1
        (2, TType.STRUCT, 'ace', (airavata.api.error.ttypes.AiravataClientException, airavata.api.error.ttypes.AiravataClientException.thrift_spec), None, ),  # 2
        (3, TType.STRUCT, 'ase', (airavata.api.error.ttypes.AiravataSystemException, airavata.api.error.ttypes.AiravataSystemException.thrift_spec), None, ),  # 3
        (4, TType.STRUCT, 'ae', (airavata.api.error.ttypes.AuthorizationException, 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 = airavata.model.appcatalog.gatewayprofile.ttypes.StoragePreference()
                    self.success.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 1:
                if ftype == TType.STRUCT:
                    self.ire = airavata.api.error.ttypes.InvalidRequestException()
                    self.ire.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 2:
                if ftype == TType.STRUCT:
                    self.ace = airavata.api.error.ttypes.AiravataClientException()
                    self.ace.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 3:
                if ftype == TType.STRUCT:
                    self.ase = airavata.api.error.ttypes.AiravataSystemException()
                    self.ase.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 4:
                if ftype == TType.STRUCT:
                    self.ae = 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', (airavata.model.security.ttypes.AuthzToken, 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 = 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, (airavata.model.appcatalog.gatewayprofile.ttypes.ComputeResourcePreference, airavata.model.appcatalog.gatewayprofile.ttypes.ComputeResourcePreference.thrift_spec), False), None, ),  # 0
        (1, TType.STRUCT, 'ire', (airavata.api.error.ttypes.InvalidRequestException, airavata.api.error.ttypes.InvalidRequestException.thrift_spec), None, ),  # 1
        (2, TType.STRUCT, 'ace', (airavata.api.error.ttypes.AiravataClientException, airavata.api.error.ttypes.AiravataClientException.thrift_spec), None, ),  # 2
        (3, TType.STRUCT, 'ase', (airavata.api.error.ttypes.AiravataSystemException, airavata.api.error.ttypes.AiravataSystemException.thrift_spec), None, ),  # 3
        (4, TType.STRUCT, 'ae', (airavata.api.error.ttypes.AuthorizationException, 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 = []
                    (_etype245, _size242) = iprot.readListBegin()
                    for _i246 in range(_size242):
                        _elem247 = airavata.model.appcatalog.gatewayprofile.ttypes.ComputeResourcePreference()
                        _elem247.read(iprot)
                        self.success.append(_elem247)
                    iprot.readListEnd()
                else:
                    iprot.skip(ftype)
            elif fid == 1:
                if ftype == TType.STRUCT:
                    self.ire = airavata.api.error.ttypes.InvalidRequestException()
                    self.ire.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 2:
                if ftype == TType.STRUCT:
                    self.ace = airavata.api.error.ttypes.AiravataClientException()
                    self.ace.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 3:
                if ftype == TType.STRUCT:
                    self.ase = airavata.api.error.ttypes.AiravataSystemException()
                    self.ase.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 4:
                if ftype == TType.STRUCT:
                    self.ae = 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 iter248 in self.success:
                iter248.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', (airavata.model.security.ttypes.AuthzToken, 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 = 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, (airavata.model.appcatalog.gatewayprofile.ttypes.StoragePreference, airavata.model.appcatalog.gatewayprofile.ttypes.StoragePreference.thrift_spec), False), None, ),  # 0
        (1, TType.STRUCT, 'ire', (airavata.api.error.ttypes.InvalidRequestException, airavata.api.error.ttypes.InvalidRequestException.thrift_spec), None, ),  # 1
        (2, TType.STRUCT, 'ace', (airavata.api.error.ttypes.AiravataClientException, airavata.api.error.ttypes.AiravataClientException.thrift_spec), None, ),  # 2
        (3, TType.STRUCT, 'ase', (airavata.api.error.ttypes.AiravataSystemException, airavata.api.error.ttypes.AiravataSystemException.thrift_spec), None, ),  # 3
        (4, TType.STRUCT, 'ae', (airavata.api.error.ttypes.AuthorizationException, 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 = []
                    (_etype252, _size249) = iprot.readListBegin()
                    for _i253 in range(_size249):
                        _elem254 = airavata.model.appcatalog.gatewayprofile.ttypes.StoragePreference()
                        _elem254.read(iprot)
                        self.success.append(_elem254)
                    iprot.readListEnd()
                else:
                    iprot.skip(ftype)
            elif fid == 1:
                if ftype == TType.STRUCT:
                    self.ire = airavata.api.error.ttypes.InvalidRequestException()
                    self.ire.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 2:
                if ftype == TType.STRUCT:
                    self.ace = airavata.api.error.ttypes.AiravataClientException()
                    self.ace.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 3:
                if ftype == TType.STRUCT:
                    self.ase = airavata.api.error.ttypes.AiravataSystemException()
                    self.ase.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 4:
                if ftype == TType.STRUCT:
                    self.ae = 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 iter255 in self.success:
                iter255.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', (airavata.model.security.ttypes.AuthzToken, 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 = 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, (airavata.model.appcatalog.gatewayprofile.ttypes.GatewayResourceProfile, airavata.model.appcatalog.gatewayprofile.ttypes.GatewayResourceProfile.thrift_spec), False), None, ),  # 0
        (1, TType.STRUCT, 'ire', (airavata.api.error.ttypes.InvalidRequestException, airavata.api.error.ttypes.InvalidRequestException.thrift_spec), None, ),  # 1
        (2, TType.STRUCT, 'ace', (airavata.api.error.ttypes.AiravataClientException, airavata.api.error.ttypes.AiravataClientException.thrift_spec), None, ),  # 2
        (3, TType.STRUCT, 'ase', (airavata.api.error.ttypes.AiravataSystemException, airavata.api.error.ttypes.AiravataSystemException.thrift_spec), None, ),  # 3
        (4, TType.STRUCT, 'ae', (airavata.api.error.ttypes.AuthorizationException, 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 = []
                    (_etype259, _size256) = iprot.readListBegin()
                    for _i260 in range(_size256):
                        _elem261 = airavata.model.appcatalog.gatewayprofile.ttypes.GatewayResourceProfile()
                        _elem261.read(iprot)
                        self.success.append(_elem261)
                    iprot.readListEnd()
                else:
                    iprot.skip(ftype)
            elif fid == 1:
                if ftype == TType.STRUCT:
                    self.ire = airavata.api.error.ttypes.InvalidRequestException()
                    self.ire.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 2:
                if ftype == TType.STRUCT:
                    self.ace = airavata.api.error.ttypes.AiravataClientException()
                    self.ace.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 3:
                if ftype == TType.STRUCT:
                    self.ase = airavata.api.error.ttypes.AiravataSystemException()
                    self.ase.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 4:
                if ftype == TType.STRUCT:
                    self.ae = 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 iter262 in self.success:
                iter262.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', (airavata.model.security.ttypes.AuthzToken, 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', (airavata.model.appcatalog.gatewayprofile.ttypes.ComputeResourcePreference, 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 = 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 = 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', (airavata.api.error.ttypes.InvalidRequestException, airavata.api.error.ttypes.InvalidRequestException.thrift_spec), None, ),  # 1
        (2, TType.STRUCT, 'ace', (airavata.api.error.ttypes.AiravataClientException, airavata.api.error.ttypes.AiravataClientException.thrift_spec), None, ),  # 2
        (3, TType.STRUCT, 'ase', (airavata.api.error.ttypes.AiravataSystemException, airavata.api.error.ttypes.AiravataSystemException.thrift_spec), None, ),  # 3
        (4, TType.STRUCT, 'ae', (airavata.api.error.ttypes.AuthorizationException, 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 = airavata.api.error.ttypes.InvalidRequestException()
                    self.ire.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 2:
                if ftype == TType.STRUCT:
                    self.ace = airavata.api.error.ttypes.AiravataClientException()
                    self.ace.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 3:
                if ftype == TType.STRUCT:
                    self.ase = airavata.api.error.ttypes.AiravataSystemException()
                    self.ase.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 4:
                if ftype == TType.STRUCT:
                    self.ae = 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', (airavata.model.security.ttypes.AuthzToken, 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', (airavata.model.appcatalog.gatewayprofile.ttypes.StoragePreference, 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 = 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 = 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', (airavata.api.error.ttypes.InvalidRequestException, airavata.api.error.ttypes.InvalidRequestException.thrift_spec), None, ),  # 1
        (2, TType.STRUCT, 'ace', (airavata.api.error.ttypes.AiravataClientException, airavata.api.error.ttypes.AiravataClientException.thrift_spec), None, ),  # 2
        (3, TType.STRUCT, 'ase', (airavata.api.error.ttypes.AiravataSystemException, airavata.api.error.ttypes.AiravataSystemException.thrift_spec), None, ),  # 3
        (4, TType.STRUCT, 'ae', (airavata.api.error.ttypes.AuthorizationException, 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 = airavata.api.error.ttypes.InvalidRequestException()
                    self.ire.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 2:
                if ftype == TType.STRUCT:
                    self.ace = airavata.api.error.ttypes.AiravataClientException()
                    self.ace.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 3:
                if ftype == TType.STRUCT:
                    self.ase = airavata.api.error.ttypes.AiravataSystemException()
                    self.ase.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 4:
                if ftype == TType.STRUCT:
                    self.ae = 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', (airavata.model.security.ttypes.AuthzToken, 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 = 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', (airavata.api.error.ttypes.InvalidRequestException, airavata.api.error.ttypes.InvalidRequestException.thrift_spec), None, ),  # 1
        (2, TType.STRUCT, 'ace', (airavata.api.error.ttypes.AiravataClientException, airavata.api.error.ttypes.AiravataClientException.thrift_spec), None, ),  # 2
        (3, TType.STRUCT, 'ase', (airavata.api.error.ttypes.AiravataSystemException, airavata.api.error.ttypes.AiravataSystemException.thrift_spec), None, ),  # 3
        (4, TType.STRUCT, 'ae', (airavata.api.error.ttypes.AuthorizationException, 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 = airavata.api.error.ttypes.InvalidRequestException()
                    self.ire.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 2:
                if ftype == TType.STRUCT:
                    self.ace = airavata.api.error.ttypes.AiravataClientException()
                    self.ace.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 3:
                if ftype == TType.STRUCT:
                    self.ase = airavata.api.error.ttypes.AiravataSystemException()
                    self.ase.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 4:
                if ftype == TType.STRUCT:
                    self.ae = 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', (airavata.model.security.ttypes.AuthzToken, 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 = 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', (airavata.api.error.ttypes.InvalidRequestException, airavata.api.error.ttypes.InvalidRequestException.thrift_spec), None, ),  # 1
        (2, TType.STRUCT, 'ace', (airavata.api.error.ttypes.AiravataClientException, airavata.api.error.ttypes.AiravataClientException.thrift_spec), None, ),  # 2
        (3, TType.STRUCT, 'ase', (airavata.api.error.ttypes.AiravataSystemException, airavata.api.error.ttypes.AiravataSystemException.thrift_spec), None, ),  # 3
        (4, TType.STRUCT, 'ae', (airavata.api.error.ttypes.AuthorizationException, 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 = airavata.api.error.ttypes.InvalidRequestException()
                    self.ire.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 2:
                if ftype == TType.STRUCT:
                    self.ace = airavata.api.error.ttypes.AiravataClientException()
                    self.ace.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 3:
                if ftype == TType.STRUCT:
                    self.ase = airavata.api.error.ttypes.AiravataSystemException()
                    self.ase.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 4:
                if ftype == TType.STRUCT:
                    self.ae = 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 getSSHAccountProvisioners_args(object):
    """
    Attributes:
     - authzToken
    """

    thrift_spec = (
        None,  # 0
        (1, TType.STRUCT, 'authzToken', (airavata.model.security.ttypes.AuthzToken, 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 = 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('getSSHAccountProvisioners_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 getSSHAccountProvisioners_result(object):
    """
    Attributes:
     - success
     - ire
     - ace
     - ase
     - ae
    """

    thrift_spec = (
        (0, TType.LIST, 'success', (TType.STRUCT, (airavata.model.appcatalog.accountprovisioning.ttypes.SSHAccountProvisioner, airavata.model.appcatalog.accountprovisioning.ttypes.SSHAccountProvisioner.thrift_spec), False), None, ),  # 0
        (1, TType.STRUCT, 'ire', (airavata.api.error.ttypes.InvalidRequestException, airavata.api.error.ttypes.InvalidRequestException.thrift_spec), None, ),  # 1
        (2, TType.STRUCT, 'ace', (airavata.api.error.ttypes.AiravataClientException, airavata.api.error.ttypes.AiravataClientException.thrift_spec), None, ),  # 2
        (3, TType.STRUCT, 'ase', (airavata.api.error.ttypes.AiravataSystemException, airavata.api.error.ttypes.AiravataSystemException.thrift_spec), None, ),  # 3
        (4, TType.STRUCT, 'ae', (airavata.api.error.ttypes.AuthorizationException, 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 = []
                    (_etype266, _size263) = iprot.readListBegin()
                    for _i267 in range(_size263):
                        _elem268 = airavata.model.appcatalog.accountprovisioning.ttypes.SSHAccountProvisioner()
                        _elem268.read(iprot)
                        self.success.append(_elem268)
                    iprot.readListEnd()
                else:
                    iprot.skip(ftype)
            elif fid == 1:
                if ftype == TType.STRUCT:
                    self.ire = airavata.api.error.ttypes.InvalidRequestException()
                    self.ire.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 2:
                if ftype == TType.STRUCT:
                    self.ace = airavata.api.error.ttypes.AiravataClientException()
                    self.ace.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 3:
                if ftype == TType.STRUCT:
                    self.ase = airavata.api.error.ttypes.AiravataSystemException()
                    self.ase.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 4:
                if ftype == TType.STRUCT:
                    self.ae = 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('getSSHAccountProvisioners_result')
        if self.success is not None:
            oprot.writeFieldBegin('success', TType.LIST, 0)
            oprot.writeListBegin(TType.STRUCT, len(self.success))
            for iter269 in self.success:
                iter269.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 doesUserHaveSSHAccount_args(object):
    """
    Attributes:
     - authzToken
     - computeResourceId
     - userId
    """

    thrift_spec = (
        None,  # 0
        (1, TType.STRUCT, 'authzToken', (airavata.model.security.ttypes.AuthzToken, airavata.model.security.ttypes.AuthzToken.thrift_spec), None, ),  # 1
        (2, TType.STRING, 'computeResourceId', 'UTF8', None, ),  # 2
        (3, TType.STRING, 'userId', 'UTF8', None, ),  # 3
    )

    def __init__(self, authzToken=None, computeResourceId=None, userId=None,):
        self.authzToken = authzToken
        self.computeResourceId = computeResourceId
        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 = 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.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('doesUserHaveSSHAccount_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.userId is not None:
            oprot.writeFieldBegin('userId', TType.STRING, 3)
            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.computeResourceId is None:
            raise TProtocolException(message='Required field computeResourceId 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 doesUserHaveSSHAccount_result(object):
    """
    Attributes:
     - success
     - ire
     - ace
     - ase
     - ae
    """

    thrift_spec = (
        (0, TType.BOOL, 'success', None, None, ),  # 0
        (1, TType.STRUCT, 'ire', (airavata.api.error.ttypes.InvalidRequestException, airavata.api.error.ttypes.InvalidRequestException.thrift_spec), None, ),  # 1
        (2, TType.STRUCT, 'ace', (airavata.api.error.ttypes.AiravataClientException, airavata.api.error.ttypes.AiravataClientException.thrift_spec), None, ),  # 2
        (3, TType.STRUCT, 'ase', (airavata.api.error.ttypes.AiravataSystemException, airavata.api.error.ttypes.AiravataSystemException.thrift_spec), None, ),  # 3
        (4, TType.STRUCT, 'ae', (airavata.api.error.ttypes.AuthorizationException, 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 = airavata.api.error.ttypes.InvalidRequestException()
                    self.ire.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 2:
                if ftype == TType.STRUCT:
                    self.ace = airavata.api.error.ttypes.AiravataClientException()
                    self.ace.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 3:
                if ftype == TType.STRUCT:
                    self.ase = airavata.api.error.ttypes.AiravataSystemException()
                    self.ase.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 4:
                if ftype == TType.STRUCT:
                    self.ae = 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('doesUserHaveSSHAccount_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 isSSHSetupCompleteForUserComputeResourcePreference_args(object):
    """
    Attributes:
     - authzToken
     - computeResourceId
     - airavataCredStoreToken
    """

    thrift_spec = (
        None,  # 0
        (1, TType.STRUCT, 'authzToken', (airavata.model.security.ttypes.AuthzToken, airavata.model.security.ttypes.AuthzToken.thrift_spec), None, ),  # 1
        (2, TType.STRING, 'computeResourceId', 'UTF8', None, ),  # 2
        (3, TType.STRING, 'airavataCredStoreToken', 'UTF8', None, ),  # 3
    )

    def __init__(self, authzToken=None, computeResourceId=None, airavataCredStoreToken=None,):
        self.authzToken = authzToken
        self.computeResourceId = computeResourceId
        self.airavataCredStoreToken = airavataCredStoreToken

    def read(self, iprot):
        if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None:
            iprot._fast_decode(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 = 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.airavataCredStoreToken = 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('isSSHSetupCompleteForUserComputeResourcePreference_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.airavataCredStoreToken is not None:
            oprot.writeFieldBegin('airavataCredStoreToken', TType.STRING, 3)
            oprot.writeString(self.airavataCredStoreToken.encode('utf-8') if sys.version_info[0] == 2 else self.airavataCredStoreToken)
            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.airavataCredStoreToken is None:
            raise TProtocolException(message='Required field airavataCredStoreToken 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 isSSHSetupCompleteForUserComputeResourcePreference_result(object):
    """
    Attributes:
     - success
     - ire
     - ace
     - ase
     - ae
    """

    thrift_spec = (
        (0, TType.BOOL, 'success', None, None, ),  # 0
        (1, TType.STRUCT, 'ire', (airavata.api.error.ttypes.InvalidRequestException, airavata.api.error.ttypes.InvalidRequestException.thrift_spec), None, ),  # 1
        (2, TType.STRUCT, 'ace', (airavata.api.error.ttypes.AiravataClientException, airavata.api.error.ttypes.AiravataClientException.thrift_spec), None, ),  # 2
        (3, TType.STRUCT, 'ase', (airavata.api.error.ttypes.AiravataSystemException, airavata.api.error.ttypes.AiravataSystemException.thrift_spec), None, ),  # 3
        (4, TType.STRUCT, 'ae', (airavata.api.error.ttypes.AuthorizationException, 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 = airavata.api.error.ttypes.InvalidRequestException()
                    self.ire.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 2:
                if ftype == TType.STRUCT:
                    self.ace = airavata.api.error.ttypes.AiravataClientException()
                    self.ace.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 3:
                if ftype == TType.STRUCT:
                    self.ase = airavata.api.error.ttypes.AiravataSystemException()
                    self.ase.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 4:
                if ftype == TType.STRUCT:
                    self.ae = 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('isSSHSetupCompleteForUserComputeResourcePreference_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 setupUserComputeResourcePreferencesForSSH_args(object):
    """
    Attributes:
     - authzToken
     - computeResourceId
     - userId
     - airavataCredStoreToken
    """

    thrift_spec = (
        None,  # 0
        (1, TType.STRUCT, 'authzToken', (airavata.model.security.ttypes.AuthzToken, airavata.model.security.ttypes.AuthzToken.thrift_spec), None, ),  # 1
        (2, TType.STRING, 'computeResourceId', 'UTF8', None, ),  # 2
        (3, TType.STRING, 'userId', 'UTF8', None, ),  # 3
        (4, TType.STRING, 'airavataCredStoreToken', 'UTF8', None, ),  # 4
    )

    def __init__(self, authzToken=None, computeResourceId=None, userId=None, airavataCredStoreToken=None,):
        self.authzToken = authzToken
        self.computeResourceId = computeResourceId
        self.userId = userId
        self.airavataCredStoreToken = airavataCredStoreToken

    def read(self, iprot):
        if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None:
            iprot._fast_decode(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 = 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.userId = 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.airavataCredStoreToken = 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('setupUserComputeResourcePreferencesForSSH_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.userId is not None:
            oprot.writeFieldBegin('userId', TType.STRING, 3)
            oprot.writeString(self.userId.encode('utf-8') if sys.version_info[0] == 2 else self.userId)
            oprot.writeFieldEnd()
        if self.airavataCredStoreToken is not None:
            oprot.writeFieldBegin('airavataCredStoreToken', TType.STRING, 4)
            oprot.writeString(self.airavataCredStoreToken.encode('utf-8') if sys.version_info[0] == 2 else self.airavataCredStoreToken)
            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.userId is None:
            raise TProtocolException(message='Required field userId is unset!')
        if self.airavataCredStoreToken is None:
            raise TProtocolException(message='Required field airavataCredStoreToken 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 setupUserComputeResourcePreferencesForSSH_result(object):
    """
    Attributes:
     - success
     - ire
     - ace
     - ase
     - ae
    """

    thrift_spec = (
        (0, TType.STRUCT, 'success', (airavata.model.appcatalog.userresourceprofile.ttypes.UserComputeResourcePreference, airavata.model.appcatalog.userresourceprofile.ttypes.UserComputeResourcePreference.thrift_spec), None, ),  # 0
        (1, TType.STRUCT, 'ire', (airavata.api.error.ttypes.InvalidRequestException, airavata.api.error.ttypes.InvalidRequestException.thrift_spec), None, ),  # 1
        (2, TType.STRUCT, 'ace', (airavata.api.error.ttypes.AiravataClientException, airavata.api.error.ttypes.AiravataClientException.thrift_spec), None, ),  # 2
        (3, TType.STRUCT, 'ase', (airavata.api.error.ttypes.AiravataSystemException, airavata.api.error.ttypes.AiravataSystemException.thrift_spec), None, ),  # 3
        (4, TType.STRUCT, 'ae', (airavata.api.error.ttypes.AuthorizationException, 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 = airavata.model.appcatalog.userresourceprofile.ttypes.UserComputeResourcePreference()
                    self.success.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 1:
                if ftype == TType.STRUCT:
                    self.ire = airavata.api.error.ttypes.InvalidRequestException()
                    self.ire.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 2:
                if ftype == TType.STRUCT:
                    self.ace = airavata.api.error.ttypes.AiravataClientException()
                    self.ace.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 3:
                if ftype == TType.STRUCT:
                    self.ase = airavata.api.error.ttypes.AiravataSystemException()
                    self.ase.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 4:
                if ftype == TType.STRUCT:
                    self.ae = 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('setupUserComputeResourcePreferencesForSSH_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 registerUserResourceProfile_args(object):
    """
    Attributes:
     - authzToken
     - userResourceProfile
    """

    thrift_spec = (
        None,  # 0
        (1, TType.STRUCT, 'authzToken', (airavata.model.security.ttypes.AuthzToken, airavata.model.security.ttypes.AuthzToken.thrift_spec), None, ),  # 1
        (2, TType.STRUCT, 'userResourceProfile', (airavata.model.appcatalog.userresourceprofile.ttypes.UserResourceProfile, 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 = airavata.model.security.ttypes.AuthzToken()
                    self.authzToken.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 2:
                if ftype == TType.STRUCT:
                    self.userResourceProfile = 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', (airavata.api.error.ttypes.InvalidRequestException, airavata.api.error.ttypes.InvalidRequestException.thrift_spec), None, ),  # 1
        (2, TType.STRUCT, 'ace', (airavata.api.error.ttypes.AiravataClientException, airavata.api.error.ttypes.AiravataClientException.thrift_spec), None, ),  # 2
        (3, TType.STRUCT, 'ase', (airavata.api.error.ttypes.AiravataSystemException, airavata.api.error.ttypes.AiravataSystemException.thrift_spec), None, ),  # 3
        (4, TType.STRUCT, 'ae', (airavata.api.error.ttypes.AuthorizationException, 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 = airavata.api.error.ttypes.InvalidRequestException()
                    self.ire.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 2:
                if ftype == TType.STRUCT:
                    self.ace = airavata.api.error.ttypes.AiravataClientException()
                    self.ace.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 3:
                if ftype == TType.STRUCT:
                    self.ase = airavata.api.error.ttypes.AiravataSystemException()
                    self.ase.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 4:
                if ftype == TType.STRUCT:
                    self.ae = 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 isUserResourceProfileExists_args(object):
    """
    Attributes:
     - authzToken
     - userId
     - gatewayID
    """

    thrift_spec = (
        None,  # 0
        (1, TType.STRUCT, 'authzToken', (airavata.model.security.ttypes.AuthzToken, 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 = 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('isUserResourceProfileExists_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 isUserResourceProfileExists_result(object):
    """
    Attributes:
     - success
     - ire
     - ace
     - ase
     - ae
    """

    thrift_spec = (
        (0, TType.BOOL, 'success', None, None, ),  # 0
        (1, TType.STRUCT, 'ire', (airavata.api.error.ttypes.InvalidRequestException, airavata.api.error.ttypes.InvalidRequestException.thrift_spec), None, ),  # 1
        (2, TType.STRUCT, 'ace', (airavata.api.error.ttypes.AiravataClientException, airavata.api.error.ttypes.AiravataClientException.thrift_spec), None, ),  # 2
        (3, TType.STRUCT, 'ase', (airavata.api.error.ttypes.AiravataSystemException, airavata.api.error.ttypes.AiravataSystemException.thrift_spec), None, ),  # 3
        (4, TType.STRUCT, 'ae', (airavata.api.error.ttypes.AuthorizationException, 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 = airavata.api.error.ttypes.InvalidRequestException()
                    self.ire.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 2:
                if ftype == TType.STRUCT:
                    self.ace = airavata.api.error.ttypes.AiravataClientException()
                    self.ace.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 3:
                if ftype == TType.STRUCT:
                    self.ase = airavata.api.error.ttypes.AiravataSystemException()
                    self.ase.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 4:
                if ftype == TType.STRUCT:
                    self.ae = 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('isUserResourceProfileExists_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 getUserResourceProfile_args(object):
    """
    Attributes:
     - authzToken
     - userId
     - gatewayID
    """

    thrift_spec = (
        None,  # 0
        (1, TType.STRUCT, 'authzToken', (airavata.model.security.ttypes.AuthzToken, 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 = 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', (airavata.model.appcatalog.userresourceprofile.ttypes.UserResourceProfile, airavata.model.appcatalog.userresourceprofile.ttypes.UserResourceProfile.thrift_spec), None, ),  # 0
        (1, TType.STRUCT, 'ire', (airavata.api.error.ttypes.InvalidRequestException, airavata.api.error.ttypes.InvalidRequestException.thrift_spec), None, ),  # 1
        (2, TType.STRUCT, 'ace', (airavata.api.error.ttypes.AiravataClientException, airavata.api.error.ttypes.AiravataClientException.thrift_spec), None, ),  # 2
        (3, TType.STRUCT, 'ase', (airavata.api.error.ttypes.AiravataSystemException, airavata.api.error.ttypes.AiravataSystemException.thrift_spec), None, ),  # 3
        (4, TType.STRUCT, 'ae', (airavata.api.error.ttypes.AuthorizationException, 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 = airavata.model.appcatalog.userresourceprofile.ttypes.UserResourceProfile()
                    self.success.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 1:
                if ftype == TType.STRUCT:
                    self.ire = airavata.api.error.ttypes.InvalidRequestException()
                    self.ire.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 2:
                if ftype == TType.STRUCT:
                    self.ace = airavata.api.error.ttypes.AiravataClientException()
                    self.ace.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 3:
                if ftype == TType.STRUCT:
                    self.ase = airavata.api.error.ttypes.AiravataSystemException()
                    self.ase.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 4:
                if ftype == TType.STRUCT:
                    self.ae = 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', (airavata.model.security.ttypes.AuthzToken, 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', (airavata.model.appcatalog.userresourceprofile.ttypes.UserResourceProfile, 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 = 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 = 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', (airavata.api.error.ttypes.InvalidRequestException, airavata.api.error.ttypes.InvalidRequestException.thrift_spec), None, ),  # 1
        (2, TType.STRUCT, 'ace', (airavata.api.error.ttypes.AiravataClientException, airavata.api.error.ttypes.AiravataClientException.thrift_spec), None, ),  # 2
        (3, TType.STRUCT, 'ase', (airavata.api.error.ttypes.AiravataSystemException, airavata.api.error.ttypes.AiravataSystemException.thrift_spec), None, ),  # 3
        (4, TType.STRUCT, 'ae', (airavata.api.error.ttypes.AuthorizationException, 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 = airavata.api.error.ttypes.InvalidRequestException()
                    self.ire.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 2:
                if ftype == TType.STRUCT:
                    self.ace = airavata.api.error.ttypes.AiravataClientException()
                    self.ace.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 3:
                if ftype == TType.STRUCT:
                    self.ase = airavata.api.error.ttypes.AiravataSystemException()
                    self.ase.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 4:
                if ftype == TType.STRUCT:
                    self.ae = 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', (airavata.model.security.ttypes.AuthzToken, 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 = 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', (airavata.api.error.ttypes.InvalidRequestException, airavata.api.error.ttypes.InvalidRequestException.thrift_spec), None, ),  # 1
        (2, TType.STRUCT, 'ace', (airavata.api.error.ttypes.AiravataClientException, airavata.api.error.ttypes.AiravataClientException.thrift_spec), None, ),  # 2
        (3, TType.STRUCT, 'ase', (airavata.api.error.ttypes.AiravataSystemException, airavata.api.error.ttypes.AiravataSystemException.thrift_spec), None, ),  # 3
        (4, TType.STRUCT, 'ae', (airavata.api.error.ttypes.AuthorizationException, 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 = airavata.api.error.ttypes.InvalidRequestException()
                    self.ire.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 2:
                if ftype == TType.STRUCT:
                    self.ace = airavata.api.error.ttypes.AiravataClientException()
                    self.ace.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 3:
                if ftype == TType.STRUCT:
                    self.ase = airavata.api.error.ttypes.AiravataSystemException()
                    self.ase.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 4:
                if ftype == TType.STRUCT:
                    self.ae = 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', (airavata.model.security.ttypes.AuthzToken, 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', (airavata.model.appcatalog.userresourceprofile.ttypes.UserComputeResourcePreference, 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 = 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 = 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', (airavata.api.error.ttypes.InvalidRequestException, airavata.api.error.ttypes.InvalidRequestException.thrift_spec), None, ),  # 1
        (2, TType.STRUCT, 'ace', (airavata.api.error.ttypes.AiravataClientException, airavata.api.error.ttypes.AiravataClientException.thrift_spec), None, ),  # 2
        (3, TType.STRUCT, 'ase', (airavata.api.error.ttypes.AiravataSystemException, airavata.api.error.ttypes.AiravataSystemException.thrift_spec), None, ),  # 3
        (4, TType.STRUCT, 'ae', (airavata.api.error.ttypes.AuthorizationException, 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 = airavata.api.error.ttypes.InvalidRequestException()
                    self.ire.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 2:
                if ftype == TType.STRUCT:
                    self.ace = airavata.api.error.ttypes.AiravataClientException()
                    self.ace.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 3:
                if ftype == TType.STRUCT:
                    self.ase = airavata.api.error.ttypes.AiravataSystemException()
                    self.ase.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 4:
                if ftype == TType.STRUCT:
                    self.ae = 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', (airavata.model.security.ttypes.AuthzToken, 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', (airavata.model.appcatalog.userresourceprofile.ttypes.UserStoragePreference, 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 = 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 = 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', (airavata.api.error.ttypes.InvalidRequestException, airavata.api.error.ttypes.InvalidRequestException.thrift_spec), None, ),  # 1
        (2, TType.STRUCT, 'ace', (airavata.api.error.ttypes.AiravataClientException, airavata.api.error.ttypes.AiravataClientException.thrift_spec), None, ),  # 2
        (3, TType.STRUCT, 'ase', (airavata.api.error.ttypes.AiravataSystemException, airavata.api.error.ttypes.AiravataSystemException.thrift_spec), None, ),  # 3
        (4, TType.STRUCT, 'ae', (airavata.api.error.ttypes.AuthorizationException, 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 = airavata.api.error.ttypes.InvalidRequestException()
                    self.ire.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 2:
                if ftype == TType.STRUCT:
                    self.ace = airavata.api.error.ttypes.AiravataClientException()
                    self.ace.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 3:
                if ftype == TType.STRUCT:
                    self.ase = airavata.api.error.ttypes.AiravataSystemException()
                    self.ase.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 4:
                if ftype == TType.STRUCT:
                    self.ae = 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', (airavata.model.security.ttypes.AuthzToken, 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 = 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', (airavata.model.appcatalog.userresourceprofile.ttypes.UserComputeResourcePreference, airavata.model.appcatalog.userresourceprofile.ttypes.UserComputeResourcePreference.thrift_spec), None, ),  # 0
        (1, TType.STRUCT, 'ire', (airavata.api.error.ttypes.InvalidRequestException, airavata.api.error.ttypes.InvalidRequestException.thrift_spec), None, ),  # 1
        (2, TType.STRUCT, 'ace', (airavata.api.error.ttypes.AiravataClientException, airavata.api.error.ttypes.AiravataClientException.thrift_spec), None, ),  # 2
        (3, TType.STRUCT, 'ase', (airavata.api.error.ttypes.AiravataSystemException, airavata.api.error.ttypes.AiravataSystemException.thrift_spec), None, ),  # 3
        (4, TType.STRUCT, 'ae', (airavata.api.error.ttypes.AuthorizationException, 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 = airavata.model.appcatalog.userresourceprofile.ttypes.UserComputeResourcePreference()
                    self.success.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 1:
                if ftype == TType.STRUCT:
                    self.ire = airavata.api.error.ttypes.InvalidRequestException()
                    self.ire.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 2:
                if ftype == TType.STRUCT:
                    self.ace = airavata.api.error.ttypes.AiravataClientException()
                    self.ace.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 3:
                if ftype == TType.STRUCT:
                    self.ase = airavata.api.error.ttypes.AiravataSystemException()
                    self.ase.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 4:
                if ftype == TType.STRUCT:
                    self.ae = 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', (airavata.model.security.ttypes.AuthzToken, 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 = 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', (airavata.model.appcatalog.userresourceprofile.ttypes.UserStoragePreference, airavata.model.appcatalog.userresourceprofile.ttypes.UserStoragePreference.thrift_spec), None, ),  # 0
        (1, TType.STRUCT, 'ire', (airavata.api.error.ttypes.InvalidRequestException, airavata.api.error.ttypes.InvalidRequestException.thrift_spec), None, ),  # 1
        (2, TType.STRUCT, 'ace', (airavata.api.error.ttypes.AiravataClientException, airavata.api.error.ttypes.AiravataClientException.thrift_spec), None, ),  # 2
        (3, TType.STRUCT, 'ase', (airavata.api.error.ttypes.AiravataSystemException, airavata.api.error.ttypes.AiravataSystemException.thrift_spec), None, ),  # 3
        (4, TType.STRUCT, 'ae', (airavata.api.error.ttypes.AuthorizationException, 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 = airavata.model.appcatalog.userresourceprofile.ttypes.UserStoragePreference()
                    self.success.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 1:
                if ftype == TType.STRUCT:
                    self.ire = airavata.api.error.ttypes.InvalidRequestException()
                    self.ire.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 2:
                if ftype == TType.STRUCT:
                    self.ace = airavata.api.error.ttypes.AiravataClientException()
                    self.ace.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 3:
                if ftype == TType.STRUCT:
                    self.ase = airavata.api.error.ttypes.AiravataSystemException()
                    self.ase.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 4:
                if ftype == TType.STRUCT:
                    self.ae = 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', (airavata.model.security.ttypes.AuthzToken, 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 = 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, (airavata.model.appcatalog.userresourceprofile.ttypes.UserComputeResourcePreference, airavata.model.appcatalog.userresourceprofile.ttypes.UserComputeResourcePreference.thrift_spec), False), None, ),  # 0
        (1, TType.STRUCT, 'ire', (airavata.api.error.ttypes.InvalidRequestException, airavata.api.error.ttypes.InvalidRequestException.thrift_spec), None, ),  # 1
        (2, TType.STRUCT, 'ace', (airavata.api.error.ttypes.AiravataClientException, airavata.api.error.ttypes.AiravataClientException.thrift_spec), None, ),  # 2
        (3, TType.STRUCT, 'ase', (airavata.api.error.ttypes.AiravataSystemException, airavata.api.error.ttypes.AiravataSystemException.thrift_spec), None, ),  # 3
        (4, TType.STRUCT, 'ae', (airavata.api.error.ttypes.AuthorizationException, 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 = []
                    (_etype273, _size270) = iprot.readListBegin()
                    for _i274 in range(_size270):
                        _elem275 = airavata.model.appcatalog.userresourceprofile.ttypes.UserComputeResourcePreference()
                        _elem275.read(iprot)
                        self.success.append(_elem275)
                    iprot.readListEnd()
                else:
                    iprot.skip(ftype)
            elif fid == 1:
                if ftype == TType.STRUCT:
                    self.ire = airavata.api.error.ttypes.InvalidRequestException()
                    self.ire.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 2:
                if ftype == TType.STRUCT:
                    self.ace = airavata.api.error.ttypes.AiravataClientException()
                    self.ace.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 3:
                if ftype == TType.STRUCT:
                    self.ase = airavata.api.error.ttypes.AiravataSystemException()
                    self.ase.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 4:
                if ftype == TType.STRUCT:
                    self.ae = 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 iter276 in self.success:
                iter276.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', (airavata.model.security.ttypes.AuthzToken, 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 = 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, (airavata.model.appcatalog.userresourceprofile.ttypes.UserStoragePreference, airavata.model.appcatalog.userresourceprofile.ttypes.UserStoragePreference.thrift_spec), False), None, ),  # 0
        (1, TType.STRUCT, 'ire', (airavata.api.error.ttypes.InvalidRequestException, airavata.api.error.ttypes.InvalidRequestException.thrift_spec), None, ),  # 1
        (2, TType.STRUCT, 'ace', (airavata.api.error.ttypes.AiravataClientException, airavata.api.error.ttypes.AiravataClientException.thrift_spec), None, ),  # 2
        (3, TType.STRUCT, 'ase', (airavata.api.error.ttypes.AiravataSystemException, airavata.api.error.ttypes.AiravataSystemException.thrift_spec), None, ),  # 3
        (4, TType.STRUCT, 'ae', (airavata.api.error.ttypes.AuthorizationException, 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 = []
                    (_etype280, _size277) = iprot.readListBegin()
                    for _i281 in range(_size277):
                        _elem282 = airavata.model.appcatalog.userresourceprofile.ttypes.UserStoragePreference()
                        _elem282.read(iprot)
                        self.success.append(_elem282)
                    iprot.readListEnd()
                else:
                    iprot.skip(ftype)
            elif fid == 1:
                if ftype == TType.STRUCT:
                    self.ire = airavata.api.error.ttypes.InvalidRequestException()
                    self.ire.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 2:
                if ftype == TType.STRUCT:
                    self.ace = airavata.api.error.ttypes.AiravataClientException()
                    self.ace.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 3:
                if ftype == TType.STRUCT:
                    self.ase = airavata.api.error.ttypes.AiravataSystemException()
                    self.ase.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 4:
                if ftype == TType.STRUCT:
                    self.ae = 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 iter283 in self.success:
                iter283.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', (airavata.model.security.ttypes.AuthzToken, 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 = 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, (airavata.model.appcatalog.userresourceprofile.ttypes.UserResourceProfile, airavata.model.appcatalog.userresourceprofile.ttypes.UserResourceProfile.thrift_spec), False), None, ),  # 0
        (1, TType.STRUCT, 'ire', (airavata.api.error.ttypes.InvalidRequestException, airavata.api.error.ttypes.InvalidRequestException.thrift_spec), None, ),  # 1
        (2, TType.STRUCT, 'ace', (airavata.api.error.ttypes.AiravataClientException, airavata.api.error.ttypes.AiravataClientException.thrift_spec), None, ),  # 2
        (3, TType.STRUCT, 'ase', (airavata.api.error.ttypes.AiravataSystemException, airavata.api.error.ttypes.AiravataSystemException.thrift_spec), None, ),  # 3
        (4, TType.STRUCT, 'ae', (airavata.api.error.ttypes.AuthorizationException, 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 = []
                    (_etype287, _size284) = iprot.readListBegin()
                    for _i288 in range(_size284):
                        _elem289 = airavata.model.appcatalog.userresourceprofile.ttypes.UserResourceProfile()
                        _elem289.read(iprot)
                        self.success.append(_elem289)
                    iprot.readListEnd()
                else:
                    iprot.skip(ftype)
            elif fid == 1:
                if ftype == TType.STRUCT:
                    self.ire = airavata.api.error.ttypes.InvalidRequestException()
                    self.ire.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 2:
                if ftype == TType.STRUCT:
                    self.ace = airavata.api.error.ttypes.AiravataClientException()
                    self.ace.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 3:
                if ftype == TType.STRUCT:
                    self.ase = airavata.api.error.ttypes.AiravataSystemException()
                    self.ase.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 4:
                if ftype == TType.STRUCT:
                    self.ae = 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 iter290 in self.success:
                iter290.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', (airavata.model.security.ttypes.AuthzToken, 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', (airavata.model.appcatalog.userresourceprofile.ttypes.UserComputeResourcePreference, 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 = 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 = 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', (airavata.api.error.ttypes.InvalidRequestException, airavata.api.error.ttypes.InvalidRequestException.thrift_spec), None, ),  # 1
        (2, TType.STRUCT, 'ace', (airavata.api.error.ttypes.AiravataClientException, airavata.api.error.ttypes.AiravataClientException.thrift_spec), None, ),  # 2
        (3, TType.STRUCT, 'ase', (airavata.api.error.ttypes.AiravataSystemException, airavata.api.error.ttypes.AiravataSystemException.thrift_spec), None, ),  # 3
        (4, TType.STRUCT, 'ae', (airavata.api.error.ttypes.AuthorizationException, 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 = airavata.api.error.ttypes.InvalidRequestException()
                    self.ire.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 2:
                if ftype == TType.STRUCT:
                    self.ace = airavata.api.error.ttypes.AiravataClientException()
                    self.ace.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 3:
                if ftype == TType.STRUCT:
                    self.ase = airavata.api.error.ttypes.AiravataSystemException()
                    self.ase.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 4:
                if ftype == TType.STRUCT:
                    self.ae = 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', (airavata.model.security.ttypes.AuthzToken, 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', (airavata.model.appcatalog.userresourceprofile.ttypes.UserStoragePreference, 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 = 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 = 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', (airavata.api.error.ttypes.InvalidRequestException, airavata.api.error.ttypes.InvalidRequestException.thrift_spec), None, ),  # 1
        (2, TType.STRUCT, 'ace', (airavata.api.error.ttypes.AiravataClientException, airavata.api.error.ttypes.AiravataClientException.thrift_spec), None, ),  # 2
        (3, TType.STRUCT, 'ase', (airavata.api.error.ttypes.AiravataSystemException, airavata.api.error.ttypes.AiravataSystemException.thrift_spec), None, ),  # 3
        (4, TType.STRUCT, 'ae', (airavata.api.error.ttypes.AuthorizationException, 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 = airavata.api.error.ttypes.InvalidRequestException()
                    self.ire.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 2:
                if ftype == TType.STRUCT:
                    self.ace = airavata.api.error.ttypes.AiravataClientException()
                    self.ace.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 3:
                if ftype == TType.STRUCT:
                    self.ase = airavata.api.error.ttypes.AiravataSystemException()
                    self.ase.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 4:
                if ftype == TType.STRUCT:
                    self.ae = 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', (airavata.model.security.ttypes.AuthzToken, 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 = 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', (airavata.api.error.ttypes.InvalidRequestException, airavata.api.error.ttypes.InvalidRequestException.thrift_spec), None, ),  # 1
        (2, TType.STRUCT, 'ace', (airavata.api.error.ttypes.AiravataClientException, airavata.api.error.ttypes.AiravataClientException.thrift_spec), None, ),  # 2
        (3, TType.STRUCT, 'ase', (airavata.api.error.ttypes.AiravataSystemException, airavata.api.error.ttypes.AiravataSystemException.thrift_spec), None, ),  # 3
        (4, TType.STRUCT, 'ae', (airavata.api.error.ttypes.AuthorizationException, 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 = airavata.api.error.ttypes.InvalidRequestException()
                    self.ire.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 2:
                if ftype == TType.STRUCT:
                    self.ace = airavata.api.error.ttypes.AiravataClientException()
                    self.ace.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 3:
                if ftype == TType.STRUCT:
                    self.ase = airavata.api.error.ttypes.AiravataSystemException()
                    self.ase.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 4:
                if ftype == TType.STRUCT:
                    self.ae = 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', (airavata.model.security.ttypes.AuthzToken, 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 = 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', (airavata.api.error.ttypes.InvalidRequestException, airavata.api.error.ttypes.InvalidRequestException.thrift_spec), None, ),  # 1
        (2, TType.STRUCT, 'ace', (airavata.api.error.ttypes.AiravataClientException, airavata.api.error.ttypes.AiravataClientException.thrift_spec), None, ),  # 2
        (3, TType.STRUCT, 'ase', (airavata.api.error.ttypes.AiravataSystemException, airavata.api.error.ttypes.AiravataSystemException.thrift_spec), None, ),  # 3
        (4, TType.STRUCT, 'ae', (airavata.api.error.ttypes.AuthorizationException, 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 = airavata.api.error.ttypes.InvalidRequestException()
                    self.ire.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 2:
                if ftype == TType.STRUCT:
                    self.ace = airavata.api.error.ttypes.AiravataClientException()
                    self.ace.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 3:
                if ftype == TType.STRUCT:
                    self.ase = airavata.api.error.ttypes.AiravataSystemException()
                    self.ase.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 4:
                if ftype == TType.STRUCT:
                    self.ae = 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 getLatestQueueStatuses_args(object):
    """
    Attributes:
     - authzToken
    """

    thrift_spec = (
        None,  # 0
        (1, TType.STRUCT, 'authzToken', (airavata.model.security.ttypes.AuthzToken, 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 = 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, (airavata.model.status.ttypes.QueueStatusModel, airavata.model.status.ttypes.QueueStatusModel.thrift_spec), False), None, ),  # 0
        (1, TType.STRUCT, 'ire', (airavata.api.error.ttypes.InvalidRequestException, airavata.api.error.ttypes.InvalidRequestException.thrift_spec), None, ),  # 1
        (2, TType.STRUCT, 'ace', (airavata.api.error.ttypes.AiravataClientException, airavata.api.error.ttypes.AiravataClientException.thrift_spec), None, ),  # 2
        (3, TType.STRUCT, 'ase', (airavata.api.error.ttypes.AiravataSystemException, airavata.api.error.ttypes.AiravataSystemException.thrift_spec), None, ),  # 3
        (4, TType.STRUCT, 'ae', (airavata.api.error.ttypes.AuthorizationException, 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 = []
                    (_etype294, _size291) = iprot.readListBegin()
                    for _i295 in range(_size291):
                        _elem296 = airavata.model.status.ttypes.QueueStatusModel()
                        _elem296.read(iprot)
                        self.success.append(_elem296)
                    iprot.readListEnd()
                else:
                    iprot.skip(ftype)
            elif fid == 1:
                if ftype == TType.STRUCT:
                    self.ire = airavata.api.error.ttypes.InvalidRequestException()
                    self.ire.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 2:
                if ftype == TType.STRUCT:
                    self.ace = airavata.api.error.ttypes.AiravataClientException()
                    self.ace.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 3:
                if ftype == TType.STRUCT:
                    self.ase = airavata.api.error.ttypes.AiravataSystemException()
                    self.ase.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 4:
                if ftype == TType.STRUCT:
                    self.ae = 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 iter297 in self.success:
                iter297.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 registerDataProduct_args(object):
    """
    Attributes:
     - authzToken
     - dataProductModel
    """

    thrift_spec = (
        None,  # 0
        (1, TType.STRUCT, 'authzToken', (airavata.model.security.ttypes.AuthzToken, airavata.model.security.ttypes.AuthzToken.thrift_spec), None, ),  # 1
        (2, TType.STRUCT, 'dataProductModel', (airavata.model.data.replica.ttypes.DataProductModel, 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 = airavata.model.security.ttypes.AuthzToken()
                    self.authzToken.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 2:
                if ftype == TType.STRUCT:
                    self.dataProductModel = 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', (airavata.api.error.ttypes.InvalidRequestException, airavata.api.error.ttypes.InvalidRequestException.thrift_spec), None, ),  # 1
        (2, TType.STRUCT, 'ace', (airavata.api.error.ttypes.AiravataClientException, airavata.api.error.ttypes.AiravataClientException.thrift_spec), None, ),  # 2
        (3, TType.STRUCT, 'ase', (airavata.api.error.ttypes.AiravataSystemException, airavata.api.error.ttypes.AiravataSystemException.thrift_spec), None, ),  # 3
        (4, TType.STRUCT, 'ae', (airavata.api.error.ttypes.AuthorizationException, 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 = airavata.api.error.ttypes.InvalidRequestException()
                    self.ire.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 2:
                if ftype == TType.STRUCT:
                    self.ace = airavata.api.error.ttypes.AiravataClientException()
                    self.ace.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 3:
                if ftype == TType.STRUCT:
                    self.ase = airavata.api.error.ttypes.AiravataSystemException()
                    self.ase.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 4:
                if ftype == TType.STRUCT:
                    self.ae = 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', (airavata.model.security.ttypes.AuthzToken, 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 = 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', (airavata.model.data.replica.ttypes.DataProductModel, airavata.model.data.replica.ttypes.DataProductModel.thrift_spec), None, ),  # 0
        (1, TType.STRUCT, 'ire', (airavata.api.error.ttypes.InvalidRequestException, airavata.api.error.ttypes.InvalidRequestException.thrift_spec), None, ),  # 1
        (2, TType.STRUCT, 'ace', (airavata.api.error.ttypes.AiravataClientException, airavata.api.error.ttypes.AiravataClientException.thrift_spec), None, ),  # 2
        (3, TType.STRUCT, 'ase', (airavata.api.error.ttypes.AiravataSystemException, airavata.api.error.ttypes.AiravataSystemException.thrift_spec), None, ),  # 3
        (4, TType.STRUCT, 'ae', (airavata.api.error.ttypes.AuthorizationException, 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 = airavata.model.data.replica.ttypes.DataProductModel()
                    self.success.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 1:
                if ftype == TType.STRUCT:
                    self.ire = airavata.api.error.ttypes.InvalidRequestException()
                    self.ire.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 2:
                if ftype == TType.STRUCT:
                    self.ace = airavata.api.error.ttypes.AiravataClientException()
                    self.ace.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 3:
                if ftype == TType.STRUCT:
                    self.ase = airavata.api.error.ttypes.AiravataSystemException()
                    self.ase.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 4:
                if ftype == TType.STRUCT:
                    self.ae = 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', (airavata.model.security.ttypes.AuthzToken, airavata.model.security.ttypes.AuthzToken.thrift_spec), None, ),  # 1
        (2, TType.STRUCT, 'replicaLocationModel', (airavata.model.data.replica.ttypes.DataReplicaLocationModel, 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 = airavata.model.security.ttypes.AuthzToken()
                    self.authzToken.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 2:
                if ftype == TType.STRUCT:
                    self.replicaLocationModel = 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', (airavata.api.error.ttypes.InvalidRequestException, airavata.api.error.ttypes.InvalidRequestException.thrift_spec), None, ),  # 1
        (2, TType.STRUCT, 'ace', (airavata.api.error.ttypes.AiravataClientException, airavata.api.error.ttypes.AiravataClientException.thrift_spec), None, ),  # 2
        (3, TType.STRUCT, 'ase', (airavata.api.error.ttypes.AiravataSystemException, airavata.api.error.ttypes.AiravataSystemException.thrift_spec), None, ),  # 3
        (4, TType.STRUCT, 'ae', (airavata.api.error.ttypes.AuthorizationException, 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 = airavata.api.error.ttypes.InvalidRequestException()
                    self.ire.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 2:
                if ftype == TType.STRUCT:
                    self.ace = airavata.api.error.ttypes.AiravataClientException()
                    self.ace.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 3:
                if ftype == TType.STRUCT:
                    self.ase = airavata.api.error.ttypes.AiravataSystemException()
                    self.ase.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 4:
                if ftype == TType.STRUCT:
                    self.ae = 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', (airavata.model.security.ttypes.AuthzToken, 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 = 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', (airavata.model.data.replica.ttypes.DataProductModel, airavata.model.data.replica.ttypes.DataProductModel.thrift_spec), None, ),  # 0
        (1, TType.STRUCT, 'ire', (airavata.api.error.ttypes.InvalidRequestException, airavata.api.error.ttypes.InvalidRequestException.thrift_spec), None, ),  # 1
        (2, TType.STRUCT, 'ace', (airavata.api.error.ttypes.AiravataClientException, airavata.api.error.ttypes.AiravataClientException.thrift_spec), None, ),  # 2
        (3, TType.STRUCT, 'ase', (airavata.api.error.ttypes.AiravataSystemException, airavata.api.error.ttypes.AiravataSystemException.thrift_spec), None, ),  # 3
        (4, TType.STRUCT, 'ae', (airavata.api.error.ttypes.AuthorizationException, 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 = airavata.model.data.replica.ttypes.DataProductModel()
                    self.success.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 1:
                if ftype == TType.STRUCT:
                    self.ire = airavata.api.error.ttypes.InvalidRequestException()
                    self.ire.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 2:
                if ftype == TType.STRUCT:
                    self.ace = airavata.api.error.ttypes.AiravataClientException()
                    self.ace.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 3:
                if ftype == TType.STRUCT:
                    self.ase = airavata.api.error.ttypes.AiravataSystemException()
                    self.ase.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 4:
                if ftype == TType.STRUCT:
                    self.ae = 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', (airavata.model.security.ttypes.AuthzToken, 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 = 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, (airavata.model.data.replica.ttypes.DataProductModel, airavata.model.data.replica.ttypes.DataProductModel.thrift_spec), False), None, ),  # 0
        (1, TType.STRUCT, 'ire', (airavata.api.error.ttypes.InvalidRequestException, airavata.api.error.ttypes.InvalidRequestException.thrift_spec), None, ),  # 1
        (2, TType.STRUCT, 'ace', (airavata.api.error.ttypes.AiravataClientException, airavata.api.error.ttypes.AiravataClientException.thrift_spec), None, ),  # 2
        (3, TType.STRUCT, 'ase', (airavata.api.error.ttypes.AiravataSystemException, airavata.api.error.ttypes.AiravataSystemException.thrift_spec), None, ),  # 3
        (4, TType.STRUCT, 'ae', (airavata.api.error.ttypes.AuthorizationException, 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 = []
                    (_etype301, _size298) = iprot.readListBegin()
                    for _i302 in range(_size298):
                        _elem303 = airavata.model.data.replica.ttypes.DataProductModel()
                        _elem303.read(iprot)
                        self.success.append(_elem303)
                    iprot.readListEnd()
                else:
                    iprot.skip(ftype)
            elif fid == 1:
                if ftype == TType.STRUCT:
                    self.ire = airavata.api.error.ttypes.InvalidRequestException()
                    self.ire.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 2:
                if ftype == TType.STRUCT:
                    self.ace = airavata.api.error.ttypes.AiravataClientException()
                    self.ace.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 3:
                if ftype == TType.STRUCT:
                    self.ase = airavata.api.error.ttypes.AiravataSystemException()
                    self.ase.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 4:
                if ftype == TType.STRUCT:
                    self.ae = 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 iter304 in self.success:
                iter304.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
     - userPermissionList
    """

    thrift_spec = (
        None,  # 0
        (1, TType.STRUCT, 'authzToken', (airavata.model.security.ttypes.AuthzToken, airavata.model.security.ttypes.AuthzToken.thrift_spec), None, ),  # 1
        (2, TType.STRING, 'resourceId', 'UTF8', None, ),  # 2
        None,  # 3
        (4, TType.MAP, 'userPermissionList', (TType.STRING, 'UTF8', TType.I32, None, False), None, ),  # 4
    )

    def __init__(self, authzToken=None, resourceId=None, userPermissionList=None,):
        self.authzToken = authzToken
        self.resourceId = resourceId
        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 = 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 == 4:
                if ftype == TType.MAP:
                    self.userPermissionList = {}
                    (_ktype306, _vtype307, _size305) = iprot.readMapBegin()
                    for _i309 in range(_size305):
                        _key310 = iprot.readString().decode('utf-8') if sys.version_info[0] == 2 else iprot.readString()
                        _val311 = iprot.readI32()
                        self.userPermissionList[_key310] = _val311
                    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.userPermissionList is not None:
            oprot.writeFieldBegin('userPermissionList', TType.MAP, 4)
            oprot.writeMapBegin(TType.STRING, TType.I32, len(self.userPermissionList))
            for kiter312, viter313 in self.userPermissionList.items():
                oprot.writeString(kiter312.encode('utf-8') if sys.version_info[0] == 2 else kiter312)
                oprot.writeI32(viter313)
            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!')
        return

    def __repr__(self):
        L = ['%s=%r' % (key, value)
             for key, value in self.__dict__.items()]
        return '%s(%s)' % (self.__class__.__name__, ', '.join(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', (airavata.api.error.ttypes.InvalidRequestException, airavata.api.error.ttypes.InvalidRequestException.thrift_spec), None, ),  # 1
        (2, TType.STRUCT, 'ace', (airavata.api.error.ttypes.AiravataClientException, airavata.api.error.ttypes.AiravataClientException.thrift_spec), None, ),  # 2
        (3, TType.STRUCT, 'ase', (airavata.api.error.ttypes.AiravataSystemException, airavata.api.error.ttypes.AiravataSystemException.thrift_spec), None, ),  # 3
        (4, TType.STRUCT, 'ae', (airavata.api.error.ttypes.AuthorizationException, 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 = airavata.api.error.ttypes.InvalidRequestException()
                    self.ire.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 2:
                if ftype == TType.STRUCT:
                    self.ace = airavata.api.error.ttypes.AiravataClientException()
                    self.ace.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 3:
                if ftype == TType.STRUCT:
                    self.ase = airavata.api.error.ttypes.AiravataSystemException()
                    self.ase.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 4:
                if ftype == TType.STRUCT:
                    self.ae = 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 shareResourceWithGroups_args(object):
    """
    Attributes:
     - authzToken
     - resourceId
     - groupPermissionList
    """

    thrift_spec = (
        None,  # 0
        (1, TType.STRUCT, 'authzToken', (airavata.model.security.ttypes.AuthzToken, airavata.model.security.ttypes.AuthzToken.thrift_spec), None, ),  # 1
        (2, TType.STRING, 'resourceId', 'UTF8', None, ),  # 2
        None,  # 3
        (4, TType.MAP, 'groupPermissionList', (TType.STRING, 'UTF8', TType.I32, None, False), None, ),  # 4
    )

    def __init__(self, authzToken=None, resourceId=None, groupPermissionList=None,):
        self.authzToken = authzToken
        self.resourceId = resourceId
        self.groupPermissionList = groupPermissionList

    def read(self, iprot):
        if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None:
            iprot._fast_decode(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 = 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 == 4:
                if ftype == TType.MAP:
                    self.groupPermissionList = {}
                    (_ktype315, _vtype316, _size314) = iprot.readMapBegin()
                    for _i318 in range(_size314):
                        _key319 = iprot.readString().decode('utf-8') if sys.version_info[0] == 2 else iprot.readString()
                        _val320 = iprot.readI32()
                        self.groupPermissionList[_key319] = _val320
                    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('shareResourceWithGroups_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.groupPermissionList is not None:
            oprot.writeFieldBegin('groupPermissionList', TType.MAP, 4)
            oprot.writeMapBegin(TType.STRING, TType.I32, len(self.groupPermissionList))
            for kiter321, viter322 in self.groupPermissionList.items():
                oprot.writeString(kiter321.encode('utf-8') if sys.version_info[0] == 2 else kiter321)
                oprot.writeI32(viter322)
            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!')
        return

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

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

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


class shareResourceWithGroups_result(object):
    """
    Attributes:
     - success
     - ire
     - ace
     - ase
     - ae
    """

    thrift_spec = (
        (0, TType.BOOL, 'success', None, None, ),  # 0
        (1, TType.STRUCT, 'ire', (airavata.api.error.ttypes.InvalidRequestException, airavata.api.error.ttypes.InvalidRequestException.thrift_spec), None, ),  # 1
        (2, TType.STRUCT, 'ace', (airavata.api.error.ttypes.AiravataClientException, airavata.api.error.ttypes.AiravataClientException.thrift_spec), None, ),  # 2
        (3, TType.STRUCT, 'ase', (airavata.api.error.ttypes.AiravataSystemException, airavata.api.error.ttypes.AiravataSystemException.thrift_spec), None, ),  # 3
        (4, TType.STRUCT, 'ae', (airavata.api.error.ttypes.AuthorizationException, 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 = airavata.api.error.ttypes.InvalidRequestException()
                    self.ire.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 2:
                if ftype == TType.STRUCT:
                    self.ace = airavata.api.error.ttypes.AiravataClientException()
                    self.ace.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 3:
                if ftype == TType.STRUCT:
                    self.ase = airavata.api.error.ttypes.AiravataSystemException()
                    self.ase.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 4:
                if ftype == TType.STRUCT:
                    self.ae = 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('shareResourceWithGroups_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
     - userPermissionList
    """

    thrift_spec = (
        None,  # 0
        (1, TType.STRUCT, 'authzToken', (airavata.model.security.ttypes.AuthzToken, airavata.model.security.ttypes.AuthzToken.thrift_spec), None, ),  # 1
        (2, TType.STRING, 'resourceId', 'UTF8', None, ),  # 2
        None,  # 3
        (4, TType.MAP, 'userPermissionList', (TType.STRING, 'UTF8', TType.I32, None, False), None, ),  # 4
    )

    def __init__(self, authzToken=None, resourceId=None, userPermissionList=None,):
        self.authzToken = authzToken
        self.resourceId = resourceId
        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 = 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 == 4:
                if ftype == TType.MAP:
                    self.userPermissionList = {}
                    (_ktype324, _vtype325, _size323) = iprot.readMapBegin()
                    for _i327 in range(_size323):
                        _key328 = iprot.readString().decode('utf-8') if sys.version_info[0] == 2 else iprot.readString()
                        _val329 = iprot.readI32()
                        self.userPermissionList[_key328] = _val329
                    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.userPermissionList is not None:
            oprot.writeFieldBegin('userPermissionList', TType.MAP, 4)
            oprot.writeMapBegin(TType.STRING, TType.I32, len(self.userPermissionList))
            for kiter330, viter331 in self.userPermissionList.items():
                oprot.writeString(kiter330.encode('utf-8') if sys.version_info[0] == 2 else kiter330)
                oprot.writeI32(viter331)
            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!')
        return

    def __repr__(self):
        L = ['%s=%r' % (key, value)
             for key, value in self.__dict__.items()]
        return '%s(%s)' % (self.__class__.__name__, ', '.join(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', (airavata.api.error.ttypes.InvalidRequestException, airavata.api.error.ttypes.InvalidRequestException.thrift_spec), None, ),  # 1
        (2, TType.STRUCT, 'ace', (airavata.api.error.ttypes.AiravataClientException, airavata.api.error.ttypes.AiravataClientException.thrift_spec), None, ),  # 2
        (3, TType.STRUCT, 'ase', (airavata.api.error.ttypes.AiravataSystemException, airavata.api.error.ttypes.AiravataSystemException.thrift_spec), None, ),  # 3
        (4, TType.STRUCT, 'ae', (airavata.api.error.ttypes.AuthorizationException, 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 = airavata.api.error.ttypes.InvalidRequestException()
                    self.ire.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 2:
                if ftype == TType.STRUCT:
                    self.ace = airavata.api.error.ttypes.AiravataClientException()
                    self.ace.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 3:
                if ftype == TType.STRUCT:
                    self.ase = airavata.api.error.ttypes.AiravataSystemException()
                    self.ase.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 4:
                if ftype == TType.STRUCT:
                    self.ae = 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 revokeSharingOfResourceFromGroups_args(object):
    """
    Attributes:
     - authzToken
     - resourceId
     - groupPermissionList
    """

    thrift_spec = (
        None,  # 0
        (1, TType.STRUCT, 'authzToken', (airavata.model.security.ttypes.AuthzToken, airavata.model.security.ttypes.AuthzToken.thrift_spec), None, ),  # 1
        (2, TType.STRING, 'resourceId', 'UTF8', None, ),  # 2
        None,  # 3
        (4, TType.MAP, 'groupPermissionList', (TType.STRING, 'UTF8', TType.I32, None, False), None, ),  # 4
    )

    def __init__(self, authzToken=None, resourceId=None, groupPermissionList=None,):
        self.authzToken = authzToken
        self.resourceId = resourceId
        self.groupPermissionList = groupPermissionList

    def read(self, iprot):
        if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None:
            iprot._fast_decode(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 = 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 == 4:
                if ftype == TType.MAP:
                    self.groupPermissionList = {}
                    (_ktype333, _vtype334, _size332) = iprot.readMapBegin()
                    for _i336 in range(_size332):
                        _key337 = iprot.readString().decode('utf-8') if sys.version_info[0] == 2 else iprot.readString()
                        _val338 = iprot.readI32()
                        self.groupPermissionList[_key337] = _val338
                    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('revokeSharingOfResourceFromGroups_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.groupPermissionList is not None:
            oprot.writeFieldBegin('groupPermissionList', TType.MAP, 4)
            oprot.writeMapBegin(TType.STRING, TType.I32, len(self.groupPermissionList))
            for kiter339, viter340 in self.groupPermissionList.items():
                oprot.writeString(kiter339.encode('utf-8') if sys.version_info[0] == 2 else kiter339)
                oprot.writeI32(viter340)
            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!')
        return

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

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

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


class revokeSharingOfResourceFromGroups_result(object):
    """
    Attributes:
     - success
     - ire
     - ace
     - ase
     - ae
    """

    thrift_spec = (
        (0, TType.BOOL, 'success', None, None, ),  # 0
        (1, TType.STRUCT, 'ire', (airavata.api.error.ttypes.InvalidRequestException, airavata.api.error.ttypes.InvalidRequestException.thrift_spec), None, ),  # 1
        (2, TType.STRUCT, 'ace', (airavata.api.error.ttypes.AiravataClientException, airavata.api.error.ttypes.AiravataClientException.thrift_spec), None, ),  # 2
        (3, TType.STRUCT, 'ase', (airavata.api.error.ttypes.AiravataSystemException, airavata.api.error.ttypes.AiravataSystemException.thrift_spec), None, ),  # 3
        (4, TType.STRUCT, 'ae', (airavata.api.error.ttypes.AuthorizationException, 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 = airavata.api.error.ttypes.InvalidRequestException()
                    self.ire.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 2:
                if ftype == TType.STRUCT:
                    self.ace = airavata.api.error.ttypes.AiravataClientException()
                    self.ace.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 3:
                if ftype == TType.STRUCT:
                    self.ase = airavata.api.error.ttypes.AiravataSystemException()
                    self.ase.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 4:
                if ftype == TType.STRUCT:
                    self.ae = 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('revokeSharingOfResourceFromGroups_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
     - permissionType
    """

    thrift_spec = (
        None,  # 0
        (1, TType.STRUCT, 'authzToken', (airavata.model.security.ttypes.AuthzToken, airavata.model.security.ttypes.AuthzToken.thrift_spec), None, ),  # 1
        (2, TType.STRING, 'resourceId', 'UTF8', None, ),  # 2
        None,  # 3
        (4, TType.I32, 'permissionType', None, None, ),  # 4
    )

    def __init__(self, authzToken=None, resourceId=None, permissionType=None,):
        self.authzToken = authzToken
        self.resourceId = resourceId
        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 = 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 == 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.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.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', (airavata.api.error.ttypes.InvalidRequestException, airavata.api.error.ttypes.InvalidRequestException.thrift_spec), None, ),  # 1
        (2, TType.STRUCT, 'ace', (airavata.api.error.ttypes.AiravataClientException, airavata.api.error.ttypes.AiravataClientException.thrift_spec), None, ),  # 2
        (3, TType.STRUCT, 'ase', (airavata.api.error.ttypes.AiravataSystemException, airavata.api.error.ttypes.AiravataSystemException.thrift_spec), None, ),  # 3
        (4, TType.STRUCT, 'ae', (airavata.api.error.ttypes.AuthorizationException, 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 = []
                    (_etype344, _size341) = iprot.readListBegin()
                    for _i345 in range(_size341):
                        _elem346 = iprot.readString().decode('utf-8') if sys.version_info[0] == 2 else iprot.readString()
                        self.success.append(_elem346)
                    iprot.readListEnd()
                else:
                    iprot.skip(ftype)
            elif fid == 1:
                if ftype == TType.STRUCT:
                    self.ire = airavata.api.error.ttypes.InvalidRequestException()
                    self.ire.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 2:
                if ftype == TType.STRUCT:
                    self.ace = airavata.api.error.ttypes.AiravataClientException()
                    self.ace.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 3:
                if ftype == TType.STRUCT:
                    self.ase = airavata.api.error.ttypes.AiravataSystemException()
                    self.ase.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 4:
                if ftype == TType.STRUCT:
                    self.ae = 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 iter347 in self.success:
                oprot.writeString(iter347.encode('utf-8') if sys.version_info[0] == 2 else iter347)
            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 getAllAccessibleGroups_args(object):
    """
    Attributes:
     - authzToken
     - resourceId
     - permissionType
    """

    thrift_spec = (
        None,  # 0
        (1, TType.STRUCT, 'authzToken', (airavata.model.security.ttypes.AuthzToken, airavata.model.security.ttypes.AuthzToken.thrift_spec), None, ),  # 1
        (2, TType.STRING, 'resourceId', 'UTF8', None, ),  # 2
        None,  # 3
        (4, TType.I32, 'permissionType', None, None, ),  # 4
    )

    def __init__(self, authzToken=None, resourceId=None, permissionType=None,):
        self.authzToken = authzToken
        self.resourceId = resourceId
        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 = 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 == 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('getAllAccessibleGroups_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.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.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 getAllAccessibleGroups_result(object):
    """
    Attributes:
     - success
     - ire
     - ace
     - ase
     - ae
    """

    thrift_spec = (
        (0, TType.LIST, 'success', (TType.STRING, 'UTF8', False), None, ),  # 0
        (1, TType.STRUCT, 'ire', (airavata.api.error.ttypes.InvalidRequestException, airavata.api.error.ttypes.InvalidRequestException.thrift_spec), None, ),  # 1
        (2, TType.STRUCT, 'ace', (airavata.api.error.ttypes.AiravataClientException, airavata.api.error.ttypes.AiravataClientException.thrift_spec), None, ),  # 2
        (3, TType.STRUCT, 'ase', (airavata.api.error.ttypes.AiravataSystemException, airavata.api.error.ttypes.AiravataSystemException.thrift_spec), None, ),  # 3
        (4, TType.STRUCT, 'ae', (airavata.api.error.ttypes.AuthorizationException, 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 = []
                    (_etype351, _size348) = iprot.readListBegin()
                    for _i352 in range(_size348):
                        _elem353 = iprot.readString().decode('utf-8') if sys.version_info[0] == 2 else iprot.readString()
                        self.success.append(_elem353)
                    iprot.readListEnd()
                else:
                    iprot.skip(ftype)
            elif fid == 1:
                if ftype == TType.STRUCT:
                    self.ire = airavata.api.error.ttypes.InvalidRequestException()
                    self.ire.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 2:
                if ftype == TType.STRUCT:
                    self.ace = airavata.api.error.ttypes.AiravataClientException()
                    self.ace.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 3:
                if ftype == TType.STRUCT:
                    self.ase = airavata.api.error.ttypes.AiravataSystemException()
                    self.ase.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 4:
                if ftype == TType.STRUCT:
                    self.ae = 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('getAllAccessibleGroups_result')
        if self.success is not None:
            oprot.writeFieldBegin('success', TType.LIST, 0)
            oprot.writeListBegin(TType.STRING, len(self.success))
            for iter354 in self.success:
                oprot.writeString(iter354.encode('utf-8') if sys.version_info[0] == 2 else iter354)
            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 getAllDirectlyAccessibleUsers_args(object):
    """
    Attributes:
     - authzToken
     - resourceId
     - permissionType
    """

    thrift_spec = (
        None,  # 0
        (1, TType.STRUCT, 'authzToken', (airavata.model.security.ttypes.AuthzToken, airavata.model.security.ttypes.AuthzToken.thrift_spec), None, ),  # 1
        (2, TType.STRING, 'resourceId', 'UTF8', None, ),  # 2
        None,  # 3
        (4, TType.I32, 'permissionType', None, None, ),  # 4
    )

    def __init__(self, authzToken=None, resourceId=None, permissionType=None,):
        self.authzToken = authzToken
        self.resourceId = resourceId
        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 = 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 == 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('getAllDirectlyAccessibleUsers_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.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.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 getAllDirectlyAccessibleUsers_result(object):
    """
    Attributes:
     - success
     - ire
     - ace
     - ase
     - ae
    """

    thrift_spec = (
        (0, TType.LIST, 'success', (TType.STRING, 'UTF8', False), None, ),  # 0
        (1, TType.STRUCT, 'ire', (airavata.api.error.ttypes.InvalidRequestException, airavata.api.error.ttypes.InvalidRequestException.thrift_spec), None, ),  # 1
        (2, TType.STRUCT, 'ace', (airavata.api.error.ttypes.AiravataClientException, airavata.api.error.ttypes.AiravataClientException.thrift_spec), None, ),  # 2
        (3, TType.STRUCT, 'ase', (airavata.api.error.ttypes.AiravataSystemException, airavata.api.error.ttypes.AiravataSystemException.thrift_spec), None, ),  # 3
        (4, TType.STRUCT, 'ae', (airavata.api.error.ttypes.AuthorizationException, 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 = []
                    (_etype358, _size355) = iprot.readListBegin()
                    for _i359 in range(_size355):
                        _elem360 = iprot.readString().decode('utf-8') if sys.version_info[0] == 2 else iprot.readString()
                        self.success.append(_elem360)
                    iprot.readListEnd()
                else:
                    iprot.skip(ftype)
            elif fid == 1:
                if ftype == TType.STRUCT:
                    self.ire = airavata.api.error.ttypes.InvalidRequestException()
                    self.ire.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 2:
                if ftype == TType.STRUCT:
                    self.ace = airavata.api.error.ttypes.AiravataClientException()
                    self.ace.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 3:
                if ftype == TType.STRUCT:
                    self.ase = airavata.api.error.ttypes.AiravataSystemException()
                    self.ase.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 4:
                if ftype == TType.STRUCT:
                    self.ae = 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('getAllDirectlyAccessibleUsers_result')
        if self.success is not None:
            oprot.writeFieldBegin('success', TType.LIST, 0)
            oprot.writeListBegin(TType.STRING, len(self.success))
            for iter361 in self.success:
                oprot.writeString(iter361.encode('utf-8') if sys.version_info[0] == 2 else iter361)
            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 getAllDirectlyAccessibleGroups_args(object):
    """
    Attributes:
     - authzToken
     - resourceId
     - permissionType
    """

    thrift_spec = (
        None,  # 0
        (1, TType.STRUCT, 'authzToken', (airavata.model.security.ttypes.AuthzToken, airavata.model.security.ttypes.AuthzToken.thrift_spec), None, ),  # 1
        (2, TType.STRING, 'resourceId', 'UTF8', None, ),  # 2
        None,  # 3
        (4, TType.I32, 'permissionType', None, None, ),  # 4
    )

    def __init__(self, authzToken=None, resourceId=None, permissionType=None,):
        self.authzToken = authzToken
        self.resourceId = resourceId
        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 = 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 == 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('getAllDirectlyAccessibleGroups_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.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.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 getAllDirectlyAccessibleGroups_result(object):
    """
    Attributes:
     - success
     - ire
     - ace
     - ase
     - ae
    """

    thrift_spec = (
        (0, TType.LIST, 'success', (TType.STRING, 'UTF8', False), None, ),  # 0
        (1, TType.STRUCT, 'ire', (airavata.api.error.ttypes.InvalidRequestException, airavata.api.error.ttypes.InvalidRequestException.thrift_spec), None, ),  # 1
        (2, TType.STRUCT, 'ace', (airavata.api.error.ttypes.AiravataClientException, airavata.api.error.ttypes.AiravataClientException.thrift_spec), None, ),  # 2
        (3, TType.STRUCT, 'ase', (airavata.api.error.ttypes.AiravataSystemException, airavata.api.error.ttypes.AiravataSystemException.thrift_spec), None, ),  # 3
        (4, TType.STRUCT, 'ae', (airavata.api.error.ttypes.AuthorizationException, 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 = []
                    (_etype365, _size362) = iprot.readListBegin()
                    for _i366 in range(_size362):
                        _elem367 = iprot.readString().decode('utf-8') if sys.version_info[0] == 2 else iprot.readString()
                        self.success.append(_elem367)
                    iprot.readListEnd()
                else:
                    iprot.skip(ftype)
            elif fid == 1:
                if ftype == TType.STRUCT:
                    self.ire = airavata.api.error.ttypes.InvalidRequestException()
                    self.ire.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 2:
                if ftype == TType.STRUCT:
                    self.ace = airavata.api.error.ttypes.AiravataClientException()
                    self.ace.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 3:
                if ftype == TType.STRUCT:
                    self.ase = airavata.api.error.ttypes.AiravataSystemException()
                    self.ase.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 4:
                if ftype == TType.STRUCT:
                    self.ae = 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('getAllDirectlyAccessibleGroups_result')
        if self.success is not None:
            oprot.writeFieldBegin('success', TType.LIST, 0)
            oprot.writeListBegin(TType.STRING, len(self.success))
            for iter368 in self.success:
                oprot.writeString(iter368.encode('utf-8') if sys.version_info[0] == 2 else iter368)
            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 userHasAccess_args(object):
    """
    Attributes:
     - authzToken
     - resourceId
     - permissionType
    """

    thrift_spec = (
        None,  # 0
        (1, TType.STRUCT, 'authzToken', (airavata.model.security.ttypes.AuthzToken, airavata.model.security.ttypes.AuthzToken.thrift_spec), None, ),  # 1
        (2, TType.STRING, 'resourceId', 'UTF8', None, ),  # 2
        (3, TType.I32, 'permissionType', None, None, ),  # 3
    )

    def __init__(self, authzToken=None, resourceId=None, permissionType=None,):
        self.authzToken = authzToken
        self.resourceId = resourceId
        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 = 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.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('userHasAccess_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.permissionType is not None:
            oprot.writeFieldBegin('permissionType', TType.I32, 3)
            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.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 userHasAccess_result(object):
    """
    Attributes:
     - success
     - ire
     - ace
     - ase
     - ae
    """

    thrift_spec = (
        (0, TType.BOOL, 'success', None, None, ),  # 0
        (1, TType.STRUCT, 'ire', (airavata.api.error.ttypes.InvalidRequestException, airavata.api.error.ttypes.InvalidRequestException.thrift_spec), None, ),  # 1
        (2, TType.STRUCT, 'ace', (airavata.api.error.ttypes.AiravataClientException, airavata.api.error.ttypes.AiravataClientException.thrift_spec), None, ),  # 2
        (3, TType.STRUCT, 'ase', (airavata.api.error.ttypes.AiravataSystemException, airavata.api.error.ttypes.AiravataSystemException.thrift_spec), None, ),  # 3
        (4, TType.STRUCT, 'ae', (airavata.api.error.ttypes.AuthorizationException, 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 = airavata.api.error.ttypes.InvalidRequestException()
                    self.ire.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 2:
                if ftype == TType.STRUCT:
                    self.ace = airavata.api.error.ttypes.AiravataClientException()
                    self.ace.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 3:
                if ftype == TType.STRUCT:
                    self.ase = airavata.api.error.ttypes.AiravataSystemException()
                    self.ase.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 4:
                if ftype == TType.STRUCT:
                    self.ae = 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('userHasAccess_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 createGroupResourceProfile_args(object):
    """
    Attributes:
     - authzToken
     - groupResourceProfile
    """

    thrift_spec = (
        None,  # 0
        (1, TType.STRUCT, 'authzToken', (airavata.model.security.ttypes.AuthzToken, airavata.model.security.ttypes.AuthzToken.thrift_spec), None, ),  # 1
        (2, TType.STRUCT, 'groupResourceProfile', (airavata.model.appcatalog.groupresourceprofile.ttypes.GroupResourceProfile, airavata.model.appcatalog.groupresourceprofile.ttypes.GroupResourceProfile.thrift_spec), None, ),  # 2
    )

    def __init__(self, authzToken=None, groupResourceProfile=None,):
        self.authzToken = authzToken
        self.groupResourceProfile = groupResourceProfile

    def read(self, iprot):
        if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None:
            iprot._fast_decode(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 = airavata.model.security.ttypes.AuthzToken()
                    self.authzToken.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 2:
                if ftype == TType.STRUCT:
                    self.groupResourceProfile = airavata.model.appcatalog.groupresourceprofile.ttypes.GroupResourceProfile()
                    self.groupResourceProfile.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('createGroupResourceProfile_args')
        if self.authzToken is not None:
            oprot.writeFieldBegin('authzToken', TType.STRUCT, 1)
            self.authzToken.write(oprot)
            oprot.writeFieldEnd()
        if self.groupResourceProfile is not None:
            oprot.writeFieldBegin('groupResourceProfile', TType.STRUCT, 2)
            self.groupResourceProfile.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.groupResourceProfile is None:
            raise TProtocolException(message='Required field groupResourceProfile 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 createGroupResourceProfile_result(object):
    """
    Attributes:
     - success
     - ire
     - ace
     - ase
     - ae
    """

    thrift_spec = (
        (0, TType.STRING, 'success', 'UTF8', None, ),  # 0
        (1, TType.STRUCT, 'ire', (airavata.api.error.ttypes.InvalidRequestException, airavata.api.error.ttypes.InvalidRequestException.thrift_spec), None, ),  # 1
        (2, TType.STRUCT, 'ace', (airavata.api.error.ttypes.AiravataClientException, airavata.api.error.ttypes.AiravataClientException.thrift_spec), None, ),  # 2
        (3, TType.STRUCT, 'ase', (airavata.api.error.ttypes.AiravataSystemException, airavata.api.error.ttypes.AiravataSystemException.thrift_spec), None, ),  # 3
        (4, TType.STRUCT, 'ae', (airavata.api.error.ttypes.AuthorizationException, 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 = airavata.api.error.ttypes.InvalidRequestException()
                    self.ire.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 2:
                if ftype == TType.STRUCT:
                    self.ace = airavata.api.error.ttypes.AiravataClientException()
                    self.ace.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 3:
                if ftype == TType.STRUCT:
                    self.ase = airavata.api.error.ttypes.AiravataSystemException()
                    self.ase.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 4:
                if ftype == TType.STRUCT:
                    self.ae = 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('createGroupResourceProfile_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 updateGroupResourceProfile_args(object):
    """
    Attributes:
     - authzToken
     - groupResourceProfile
    """

    thrift_spec = (
        None,  # 0
        (1, TType.STRUCT, 'authzToken', (airavata.model.security.ttypes.AuthzToken, airavata.model.security.ttypes.AuthzToken.thrift_spec), None, ),  # 1
        (2, TType.STRUCT, 'groupResourceProfile', (airavata.model.appcatalog.groupresourceprofile.ttypes.GroupResourceProfile, airavata.model.appcatalog.groupresourceprofile.ttypes.GroupResourceProfile.thrift_spec), None, ),  # 2
    )

    def __init__(self, authzToken=None, groupResourceProfile=None,):
        self.authzToken = authzToken
        self.groupResourceProfile = groupResourceProfile

    def read(self, iprot):
        if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None:
            iprot._fast_decode(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 = airavata.model.security.ttypes.AuthzToken()
                    self.authzToken.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 2:
                if ftype == TType.STRUCT:
                    self.groupResourceProfile = airavata.model.appcatalog.groupresourceprofile.ttypes.GroupResourceProfile()
                    self.groupResourceProfile.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('updateGroupResourceProfile_args')
        if self.authzToken is not None:
            oprot.writeFieldBegin('authzToken', TType.STRUCT, 1)
            self.authzToken.write(oprot)
            oprot.writeFieldEnd()
        if self.groupResourceProfile is not None:
            oprot.writeFieldBegin('groupResourceProfile', TType.STRUCT, 2)
            self.groupResourceProfile.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.groupResourceProfile is None:
            raise TProtocolException(message='Required field groupResourceProfile 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 updateGroupResourceProfile_result(object):
    """
    Attributes:
     - ire
     - ace
     - ase
     - ae
    """

    thrift_spec = (
        None,  # 0
        (1, TType.STRUCT, 'ire', (airavata.api.error.ttypes.InvalidRequestException, airavata.api.error.ttypes.InvalidRequestException.thrift_spec), None, ),  # 1
        (2, TType.STRUCT, 'ace', (airavata.api.error.ttypes.AiravataClientException, airavata.api.error.ttypes.AiravataClientException.thrift_spec), None, ),  # 2
        (3, TType.STRUCT, 'ase', (airavata.api.error.ttypes.AiravataSystemException, airavata.api.error.ttypes.AiravataSystemException.thrift_spec), None, ),  # 3
        (4, TType.STRUCT, 'ae', (airavata.api.error.ttypes.AuthorizationException, 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 = airavata.api.error.ttypes.InvalidRequestException()
                    self.ire.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 2:
                if ftype == TType.STRUCT:
                    self.ace = airavata.api.error.ttypes.AiravataClientException()
                    self.ace.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 3:
                if ftype == TType.STRUCT:
                    self.ase = airavata.api.error.ttypes.AiravataSystemException()
                    self.ase.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 4:
                if ftype == TType.STRUCT:
                    self.ae = 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('updateGroupResourceProfile_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 getGroupResourceProfile_args(object):
    """
    Attributes:
     - authzToken
     - groupResourceProfileId
    """

    thrift_spec = (
        None,  # 0
        (1, TType.STRUCT, 'authzToken', (airavata.model.security.ttypes.AuthzToken, airavata.model.security.ttypes.AuthzToken.thrift_spec), None, ),  # 1
        (2, TType.STRING, 'groupResourceProfileId', 'UTF8', None, ),  # 2
    )

    def __init__(self, authzToken=None, groupResourceProfileId=None,):
        self.authzToken = authzToken
        self.groupResourceProfileId = groupResourceProfileId

    def read(self, iprot):
        if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None:
            iprot._fast_decode(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 = airavata.model.security.ttypes.AuthzToken()
                    self.authzToken.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 2:
                if ftype == TType.STRING:
                    self.groupResourceProfileId = 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('getGroupResourceProfile_args')
        if self.authzToken is not None:
            oprot.writeFieldBegin('authzToken', TType.STRUCT, 1)
            self.authzToken.write(oprot)
            oprot.writeFieldEnd()
        if self.groupResourceProfileId is not None:
            oprot.writeFieldBegin('groupResourceProfileId', TType.STRING, 2)
            oprot.writeString(self.groupResourceProfileId.encode('utf-8') if sys.version_info[0] == 2 else self.groupResourceProfileId)
            oprot.writeFieldEnd()
        oprot.writeFieldStop()
        oprot.writeStructEnd()

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

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

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

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


class getGroupResourceProfile_result(object):
    """
    Attributes:
     - success
     - ire
     - ace
     - ase
     - ae
    """

    thrift_spec = (
        (0, TType.STRUCT, 'success', (airavata.model.appcatalog.groupresourceprofile.ttypes.GroupResourceProfile, airavata.model.appcatalog.groupresourceprofile.ttypes.GroupResourceProfile.thrift_spec), None, ),  # 0
        (1, TType.STRUCT, 'ire', (airavata.api.error.ttypes.InvalidRequestException, airavata.api.error.ttypes.InvalidRequestException.thrift_spec), None, ),  # 1
        (2, TType.STRUCT, 'ace', (airavata.api.error.ttypes.AiravataClientException, airavata.api.error.ttypes.AiravataClientException.thrift_spec), None, ),  # 2
        (3, TType.STRUCT, 'ase', (airavata.api.error.ttypes.AiravataSystemException, airavata.api.error.ttypes.AiravataSystemException.thrift_spec), None, ),  # 3
        (4, TType.STRUCT, 'ae', (airavata.api.error.ttypes.AuthorizationException, 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 = airavata.model.appcatalog.groupresourceprofile.ttypes.GroupResourceProfile()
                    self.success.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 1:
                if ftype == TType.STRUCT:
                    self.ire = airavata.api.error.ttypes.InvalidRequestException()
                    self.ire.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 2:
                if ftype == TType.STRUCT:
                    self.ace = airavata.api.error.ttypes.AiravataClientException()
                    self.ace.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 3:
                if ftype == TType.STRUCT:
                    self.ase = airavata.api.error.ttypes.AiravataSystemException()
                    self.ase.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 4:
                if ftype == TType.STRUCT:
                    self.ae = 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('getGroupResourceProfile_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 removeGroupResourceProfile_args(object):
    """
    Attributes:
     - authzToken
     - groupResourceProfileId
    """

    thrift_spec = (
        None,  # 0
        (1, TType.STRUCT, 'authzToken', (airavata.model.security.ttypes.AuthzToken, airavata.model.security.ttypes.AuthzToken.thrift_spec), None, ),  # 1
        (2, TType.STRING, 'groupResourceProfileId', 'UTF8', None, ),  # 2
    )

    def __init__(self, authzToken=None, groupResourceProfileId=None,):
        self.authzToken = authzToken
        self.groupResourceProfileId = groupResourceProfileId

    def read(self, iprot):
        if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None:
            iprot._fast_decode(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 = airavata.model.security.ttypes.AuthzToken()
                    self.authzToken.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 2:
                if ftype == TType.STRING:
                    self.groupResourceProfileId = 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('removeGroupResourceProfile_args')
        if self.authzToken is not None:
            oprot.writeFieldBegin('authzToken', TType.STRUCT, 1)
            self.authzToken.write(oprot)
            oprot.writeFieldEnd()
        if self.groupResourceProfileId is not None:
            oprot.writeFieldBegin('groupResourceProfileId', TType.STRING, 2)
            oprot.writeString(self.groupResourceProfileId.encode('utf-8') if sys.version_info[0] == 2 else self.groupResourceProfileId)
            oprot.writeFieldEnd()
        oprot.writeFieldStop()
        oprot.writeStructEnd()

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

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

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

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


class removeGroupResourceProfile_result(object):
    """
    Attributes:
     - success
     - ire
     - ace
     - ase
     - ae
    """

    thrift_spec = (
        (0, TType.BOOL, 'success', None, None, ),  # 0
        (1, TType.STRUCT, 'ire', (airavata.api.error.ttypes.InvalidRequestException, airavata.api.error.ttypes.InvalidRequestException.thrift_spec), None, ),  # 1
        (2, TType.STRUCT, 'ace', (airavata.api.error.ttypes.AiravataClientException, airavata.api.error.ttypes.AiravataClientException.thrift_spec), None, ),  # 2
        (3, TType.STRUCT, 'ase', (airavata.api.error.ttypes.AiravataSystemException, airavata.api.error.ttypes.AiravataSystemException.thrift_spec), None, ),  # 3
        (4, TType.STRUCT, 'ae', (airavata.api.error.ttypes.AuthorizationException, 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 = airavata.api.error.ttypes.InvalidRequestException()
                    self.ire.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 2:
                if ftype == TType.STRUCT:
                    self.ace = airavata.api.error.ttypes.AiravataClientException()
                    self.ace.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 3:
                if ftype == TType.STRUCT:
                    self.ase = airavata.api.error.ttypes.AiravataSystemException()
                    self.ase.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 4:
                if ftype == TType.STRUCT:
                    self.ae = 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('removeGroupResourceProfile_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 getGroupResourceList_args(object):
    """
    Attributes:
     - authzToken
     - gatewayId
    """

    thrift_spec = (
        None,  # 0
        (1, TType.STRUCT, 'authzToken', (airavata.model.security.ttypes.AuthzToken, 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 = 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('getGroupResourceList_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 getGroupResourceList_result(object):
    """
    Attributes:
     - success
     - ire
     - ace
     - ase
     - ae
    """

    thrift_spec = (
        (0, TType.LIST, 'success', (TType.STRUCT, (airavata.model.appcatalog.groupresourceprofile.ttypes.GroupResourceProfile, airavata.model.appcatalog.groupresourceprofile.ttypes.GroupResourceProfile.thrift_spec), False), None, ),  # 0
        (1, TType.STRUCT, 'ire', (airavata.api.error.ttypes.InvalidRequestException, airavata.api.error.ttypes.InvalidRequestException.thrift_spec), None, ),  # 1
        (2, TType.STRUCT, 'ace', (airavata.api.error.ttypes.AiravataClientException, airavata.api.error.ttypes.AiravataClientException.thrift_spec), None, ),  # 2
        (3, TType.STRUCT, 'ase', (airavata.api.error.ttypes.AiravataSystemException, airavata.api.error.ttypes.AiravataSystemException.thrift_spec), None, ),  # 3
        (4, TType.STRUCT, 'ae', (airavata.api.error.ttypes.AuthorizationException, 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 = []
                    (_etype372, _size369) = iprot.readListBegin()
                    for _i373 in range(_size369):
                        _elem374 = airavata.model.appcatalog.groupresourceprofile.ttypes.GroupResourceProfile()
                        _elem374.read(iprot)
                        self.success.append(_elem374)
                    iprot.readListEnd()
                else:
                    iprot.skip(ftype)
            elif fid == 1:
                if ftype == TType.STRUCT:
                    self.ire = airavata.api.error.ttypes.InvalidRequestException()
                    self.ire.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 2:
                if ftype == TType.STRUCT:
                    self.ace = airavata.api.error.ttypes.AiravataClientException()
                    self.ace.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 3:
                if ftype == TType.STRUCT:
                    self.ase = airavata.api.error.ttypes.AiravataSystemException()
                    self.ase.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 4:
                if ftype == TType.STRUCT:
                    self.ae = 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('getGroupResourceList_result')
        if self.success is not None:
            oprot.writeFieldBegin('success', TType.LIST, 0)
            oprot.writeListBegin(TType.STRUCT, len(self.success))
            for iter375 in self.success:
                iter375.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 removeGroupComputePrefs_args(object):
    """
    Attributes:
     - authzToken
     - computeResourceId
     - groupResourceProfileId
    """

    thrift_spec = (
        None,  # 0
        (1, TType.STRUCT, 'authzToken', (airavata.model.security.ttypes.AuthzToken, airavata.model.security.ttypes.AuthzToken.thrift_spec), None, ),  # 1
        (2, TType.STRING, 'computeResourceId', 'UTF8', None, ),  # 2
        (3, TType.STRING, 'groupResourceProfileId', 'UTF8', None, ),  # 3
    )

    def __init__(self, authzToken=None, computeResourceId=None, groupResourceProfileId=None,):
        self.authzToken = authzToken
        self.computeResourceId = computeResourceId
        self.groupResourceProfileId = groupResourceProfileId

    def read(self, iprot):
        if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None:
            iprot._fast_decode(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 = 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.groupResourceProfileId = 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('removeGroupComputePrefs_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.groupResourceProfileId is not None:
            oprot.writeFieldBegin('groupResourceProfileId', TType.STRING, 3)
            oprot.writeString(self.groupResourceProfileId.encode('utf-8') if sys.version_info[0] == 2 else self.groupResourceProfileId)
            oprot.writeFieldEnd()
        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.groupResourceProfileId is None:
            raise TProtocolException(message='Required field groupResourceProfileId is unset!')
        return

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

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

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


class removeGroupComputePrefs_result(object):
    """
    Attributes:
     - success
     - ire
     - ace
     - ase
     - ae
    """

    thrift_spec = (
        (0, TType.BOOL, 'success', None, None, ),  # 0
        (1, TType.STRUCT, 'ire', (airavata.api.error.ttypes.InvalidRequestException, airavata.api.error.ttypes.InvalidRequestException.thrift_spec), None, ),  # 1
        (2, TType.STRUCT, 'ace', (airavata.api.error.ttypes.AiravataClientException, airavata.api.error.ttypes.AiravataClientException.thrift_spec), None, ),  # 2
        (3, TType.STRUCT, 'ase', (airavata.api.error.ttypes.AiravataSystemException, airavata.api.error.ttypes.AiravataSystemException.thrift_spec), None, ),  # 3
        (4, TType.STRUCT, 'ae', (airavata.api.error.ttypes.AuthorizationException, 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 = airavata.api.error.ttypes.InvalidRequestException()
                    self.ire.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 2:
                if ftype == TType.STRUCT:
                    self.ace = airavata.api.error.ttypes.AiravataClientException()
                    self.ace.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 3:
                if ftype == TType.STRUCT:
                    self.ase = airavata.api.error.ttypes.AiravataSystemException()
                    self.ase.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 4:
                if ftype == TType.STRUCT:
                    self.ae = 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('removeGroupComputePrefs_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 removeGroupComputeResourcePolicy_args(object):
    """
    Attributes:
     - authzToken
     - resourcePolicyId
    """

    thrift_spec = (
        None,  # 0
        (1, TType.STRUCT, 'authzToken', (airavata.model.security.ttypes.AuthzToken, airavata.model.security.ttypes.AuthzToken.thrift_spec), None, ),  # 1
        (2, TType.STRING, 'resourcePolicyId', 'UTF8', None, ),  # 2
    )

    def __init__(self, authzToken=None, resourcePolicyId=None,):
        self.authzToken = authzToken
        self.resourcePolicyId = resourcePolicyId

    def read(self, iprot):
        if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None:
            iprot._fast_decode(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 = airavata.model.security.ttypes.AuthzToken()
                    self.authzToken.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 2:
                if ftype == TType.STRING:
                    self.resourcePolicyId = 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('removeGroupComputeResourcePolicy_args')
        if self.authzToken is not None:
            oprot.writeFieldBegin('authzToken', TType.STRUCT, 1)
            self.authzToken.write(oprot)
            oprot.writeFieldEnd()
        if self.resourcePolicyId is not None:
            oprot.writeFieldBegin('resourcePolicyId', TType.STRING, 2)
            oprot.writeString(self.resourcePolicyId.encode('utf-8') if sys.version_info[0] == 2 else self.resourcePolicyId)
            oprot.writeFieldEnd()
        oprot.writeFieldStop()
        oprot.writeStructEnd()

    def validate(self):
        if self.authzToken is None:
            raise TProtocolException(message='Required field authzToken is unset!')
        if self.resourcePolicyId is None:
            raise TProtocolException(message='Required field resourcePolicyId 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 removeGroupComputeResourcePolicy_result(object):
    """
    Attributes:
     - success
     - ire
     - ace
     - ase
     - ae
    """

    thrift_spec = (
        (0, TType.BOOL, 'success', None, None, ),  # 0
        (1, TType.STRUCT, 'ire', (airavata.api.error.ttypes.InvalidRequestException, airavata.api.error.ttypes.InvalidRequestException.thrift_spec), None, ),  # 1
        (2, TType.STRUCT, 'ace', (airavata.api.error.ttypes.AiravataClientException, airavata.api.error.ttypes.AiravataClientException.thrift_spec), None, ),  # 2
        (3, TType.STRUCT, 'ase', (airavata.api.error.ttypes.AiravataSystemException, airavata.api.error.ttypes.AiravataSystemException.thrift_spec), None, ),  # 3
        (4, TType.STRUCT, 'ae', (airavata.api.error.ttypes.AuthorizationException, 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 = airavata.api.error.ttypes.InvalidRequestException()
                    self.ire.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 2:
                if ftype == TType.STRUCT:
                    self.ace = airavata.api.error.ttypes.AiravataClientException()
                    self.ace.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 3:
                if ftype == TType.STRUCT:
                    self.ase = airavata.api.error.ttypes.AiravataSystemException()
                    self.ase.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 4:
                if ftype == TType.STRUCT:
                    self.ae = 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('removeGroupComputeResourcePolicy_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 removeGroupBatchQueueResourcePolicy_args(object):
    """
    Attributes:
     - authzToken
     - resourcePolicyId
    """

    thrift_spec = (
        None,  # 0
        (1, TType.STRUCT, 'authzToken', (airavata.model.security.ttypes.AuthzToken, airavata.model.security.ttypes.AuthzToken.thrift_spec), None, ),  # 1
        (2, TType.STRING, 'resourcePolicyId', 'UTF8', None, ),  # 2
    )

    def __init__(self, authzToken=None, resourcePolicyId=None,):
        self.authzToken = authzToken
        self.resourcePolicyId = resourcePolicyId

    def read(self, iprot):
        if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None:
            iprot._fast_decode(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 = airavata.model.security.ttypes.AuthzToken()
                    self.authzToken.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 2:
                if ftype == TType.STRING:
                    self.resourcePolicyId = 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('removeGroupBatchQueueResourcePolicy_args')
        if self.authzToken is not None:
            oprot.writeFieldBegin('authzToken', TType.STRUCT, 1)
            self.authzToken.write(oprot)
            oprot.writeFieldEnd()
        if self.resourcePolicyId is not None:
            oprot.writeFieldBegin('resourcePolicyId', TType.STRING, 2)
            oprot.writeString(self.resourcePolicyId.encode('utf-8') if sys.version_info[0] == 2 else self.resourcePolicyId)
            oprot.writeFieldEnd()
        oprot.writeFieldStop()
        oprot.writeStructEnd()

    def validate(self):
        if self.authzToken is None:
            raise TProtocolException(message='Required field authzToken is unset!')
        if self.resourcePolicyId is None:
            raise TProtocolException(message='Required field resourcePolicyId 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 removeGroupBatchQueueResourcePolicy_result(object):
    """
    Attributes:
     - success
     - ire
     - ace
     - ase
     - ae
    """

    thrift_spec = (
        (0, TType.BOOL, 'success', None, None, ),  # 0
        (1, TType.STRUCT, 'ire', (airavata.api.error.ttypes.InvalidRequestException, airavata.api.error.ttypes.InvalidRequestException.thrift_spec), None, ),  # 1
        (2, TType.STRUCT, 'ace', (airavata.api.error.ttypes.AiravataClientException, airavata.api.error.ttypes.AiravataClientException.thrift_spec), None, ),  # 2
        (3, TType.STRUCT, 'ase', (airavata.api.error.ttypes.AiravataSystemException, airavata.api.error.ttypes.AiravataSystemException.thrift_spec), None, ),  # 3
        (4, TType.STRUCT, 'ae', (airavata.api.error.ttypes.AuthorizationException, 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 = airavata.api.error.ttypes.InvalidRequestException()
                    self.ire.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 2:
                if ftype == TType.STRUCT:
                    self.ace = airavata.api.error.ttypes.AiravataClientException()
                    self.ace.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 3:
                if ftype == TType.STRUCT:
                    self.ase = airavata.api.error.ttypes.AiravataSystemException()
                    self.ase.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 4:
                if ftype == TType.STRUCT:
                    self.ae = 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('removeGroupBatchQueueResourcePolicy_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 getGroupComputeResourcePreference_args(object):
    """
    Attributes:
     - authzToken
     - computeResourceId
     - groupResourceProfileId
    """

    thrift_spec = (
        None,  # 0
        (1, TType.STRUCT, 'authzToken', (airavata.model.security.ttypes.AuthzToken, airavata.model.security.ttypes.AuthzToken.thrift_spec), None, ),  # 1
        (2, TType.STRING, 'computeResourceId', 'UTF8', None, ),  # 2
        (3, TType.STRING, 'groupResourceProfileId', 'UTF8', None, ),  # 3
    )

    def __init__(self, authzToken=None, computeResourceId=None, groupResourceProfileId=None,):
        self.authzToken = authzToken
        self.computeResourceId = computeResourceId
        self.groupResourceProfileId = groupResourceProfileId

    def read(self, iprot):
        if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None:
            iprot._fast_decode(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 = 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.groupResourceProfileId = 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('getGroupComputeResourcePreference_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.groupResourceProfileId is not None:
            oprot.writeFieldBegin('groupResourceProfileId', TType.STRING, 3)
            oprot.writeString(self.groupResourceProfileId.encode('utf-8') if sys.version_info[0] == 2 else self.groupResourceProfileId)
            oprot.writeFieldEnd()
        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.groupResourceProfileId is None:
            raise TProtocolException(message='Required field groupResourceProfileId is unset!')
        return

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

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

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


class getGroupComputeResourcePreference_result(object):
    """
    Attributes:
     - success
     - ire
     - ace
     - ase
     - ae
    """

    thrift_spec = (
        (0, TType.STRUCT, 'success', (airavata.model.appcatalog.groupresourceprofile.ttypes.GroupComputeResourcePreference, airavata.model.appcatalog.groupresourceprofile.ttypes.GroupComputeResourcePreference.thrift_spec), None, ),  # 0
        (1, TType.STRUCT, 'ire', (airavata.api.error.ttypes.InvalidRequestException, airavata.api.error.ttypes.InvalidRequestException.thrift_spec), None, ),  # 1
        (2, TType.STRUCT, 'ace', (airavata.api.error.ttypes.AiravataClientException, airavata.api.error.ttypes.AiravataClientException.thrift_spec), None, ),  # 2
        (3, TType.STRUCT, 'ase', (airavata.api.error.ttypes.AiravataSystemException, airavata.api.error.ttypes.AiravataSystemException.thrift_spec), None, ),  # 3
        (4, TType.STRUCT, 'ae', (airavata.api.error.ttypes.AuthorizationException, 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 = airavata.model.appcatalog.groupresourceprofile.ttypes.GroupComputeResourcePreference()
                    self.success.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 1:
                if ftype == TType.STRUCT:
                    self.ire = airavata.api.error.ttypes.InvalidRequestException()
                    self.ire.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 2:
                if ftype == TType.STRUCT:
                    self.ace = airavata.api.error.ttypes.AiravataClientException()
                    self.ace.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 3:
                if ftype == TType.STRUCT:
                    self.ase = airavata.api.error.ttypes.AiravataSystemException()
                    self.ase.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 4:
                if ftype == TType.STRUCT:
                    self.ae = 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('getGroupComputeResourcePreference_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 getGroupComputeResourcePolicy_args(object):
    """
    Attributes:
     - authzToken
     - resourcePolicyId
    """

    thrift_spec = (
        None,  # 0
        (1, TType.STRUCT, 'authzToken', (airavata.model.security.ttypes.AuthzToken, airavata.model.security.ttypes.AuthzToken.thrift_spec), None, ),  # 1
        (2, TType.STRING, 'resourcePolicyId', 'UTF8', None, ),  # 2
    )

    def __init__(self, authzToken=None, resourcePolicyId=None,):
        self.authzToken = authzToken
        self.resourcePolicyId = resourcePolicyId

    def read(self, iprot):
        if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None:
            iprot._fast_decode(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 = airavata.model.security.ttypes.AuthzToken()
                    self.authzToken.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 2:
                if ftype == TType.STRING:
                    self.resourcePolicyId = 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('getGroupComputeResourcePolicy_args')
        if self.authzToken is not None:
            oprot.writeFieldBegin('authzToken', TType.STRUCT, 1)
            self.authzToken.write(oprot)
            oprot.writeFieldEnd()
        if self.resourcePolicyId is not None:
            oprot.writeFieldBegin('resourcePolicyId', TType.STRING, 2)
            oprot.writeString(self.resourcePolicyId.encode('utf-8') if sys.version_info[0] == 2 else self.resourcePolicyId)
            oprot.writeFieldEnd()
        oprot.writeFieldStop()
        oprot.writeStructEnd()

    def validate(self):
        if self.authzToken is None:
            raise TProtocolException(message='Required field authzToken is unset!')
        if self.resourcePolicyId is None:
            raise TProtocolException(message='Required field resourcePolicyId 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 getGroupComputeResourcePolicy_result(object):
    """
    Attributes:
     - success
     - ire
     - ace
     - ase
     - ae
    """

    thrift_spec = (
        (0, TType.STRUCT, 'success', (airavata.model.appcatalog.groupresourceprofile.ttypes.ComputeResourcePolicy, airavata.model.appcatalog.groupresourceprofile.ttypes.ComputeResourcePolicy.thrift_spec), None, ),  # 0
        (1, TType.STRUCT, 'ire', (airavata.api.error.ttypes.InvalidRequestException, airavata.api.error.ttypes.InvalidRequestException.thrift_spec), None, ),  # 1
        (2, TType.STRUCT, 'ace', (airavata.api.error.ttypes.AiravataClientException, airavata.api.error.ttypes.AiravataClientException.thrift_spec), None, ),  # 2
        (3, TType.STRUCT, 'ase', (airavata.api.error.ttypes.AiravataSystemException, airavata.api.error.ttypes.AiravataSystemException.thrift_spec), None, ),  # 3
        (4, TType.STRUCT, 'ae', (airavata.api.error.ttypes.AuthorizationException, 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 = airavata.model.appcatalog.groupresourceprofile.ttypes.ComputeResourcePolicy()
                    self.success.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 1:
                if ftype == TType.STRUCT:
                    self.ire = airavata.api.error.ttypes.InvalidRequestException()
                    self.ire.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 2:
                if ftype == TType.STRUCT:
                    self.ace = airavata.api.error.ttypes.AiravataClientException()
                    self.ace.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 3:
                if ftype == TType.STRUCT:
                    self.ase = airavata.api.error.ttypes.AiravataSystemException()
                    self.ase.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 4:
                if ftype == TType.STRUCT:
                    self.ae = 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('getGroupComputeResourcePolicy_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 getBatchQueueResourcePolicy_args(object):
    """
    Attributes:
     - authzToken
     - resourcePolicyId
    """

    thrift_spec = (
        None,  # 0
        (1, TType.STRUCT, 'authzToken', (airavata.model.security.ttypes.AuthzToken, airavata.model.security.ttypes.AuthzToken.thrift_spec), None, ),  # 1
        (2, TType.STRING, 'resourcePolicyId', 'UTF8', None, ),  # 2
    )

    def __init__(self, authzToken=None, resourcePolicyId=None,):
        self.authzToken = authzToken
        self.resourcePolicyId = resourcePolicyId

    def read(self, iprot):
        if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None:
            iprot._fast_decode(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 = airavata.model.security.ttypes.AuthzToken()
                    self.authzToken.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 2:
                if ftype == TType.STRING:
                    self.resourcePolicyId = 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('getBatchQueueResourcePolicy_args')
        if self.authzToken is not None:
            oprot.writeFieldBegin('authzToken', TType.STRUCT, 1)
            self.authzToken.write(oprot)
            oprot.writeFieldEnd()
        if self.resourcePolicyId is not None:
            oprot.writeFieldBegin('resourcePolicyId', TType.STRING, 2)
            oprot.writeString(self.resourcePolicyId.encode('utf-8') if sys.version_info[0] == 2 else self.resourcePolicyId)
            oprot.writeFieldEnd()
        oprot.writeFieldStop()
        oprot.writeStructEnd()

    def validate(self):
        if self.authzToken is None:
            raise TProtocolException(message='Required field authzToken is unset!')
        if self.resourcePolicyId is None:
            raise TProtocolException(message='Required field resourcePolicyId 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 getBatchQueueResourcePolicy_result(object):
    """
    Attributes:
     - success
     - ire
     - ace
     - ase
     - ae
    """

    thrift_spec = (
        (0, TType.STRUCT, 'success', (airavata.model.appcatalog.groupresourceprofile.ttypes.BatchQueueResourcePolicy, airavata.model.appcatalog.groupresourceprofile.ttypes.BatchQueueResourcePolicy.thrift_spec), None, ),  # 0
        (1, TType.STRUCT, 'ire', (airavata.api.error.ttypes.InvalidRequestException, airavata.api.error.ttypes.InvalidRequestException.thrift_spec), None, ),  # 1
        (2, TType.STRUCT, 'ace', (airavata.api.error.ttypes.AiravataClientException, airavata.api.error.ttypes.AiravataClientException.thrift_spec), None, ),  # 2
        (3, TType.STRUCT, 'ase', (airavata.api.error.ttypes.AiravataSystemException, airavata.api.error.ttypes.AiravataSystemException.thrift_spec), None, ),  # 3
        (4, TType.STRUCT, 'ae', (airavata.api.error.ttypes.AuthorizationException, 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 = airavata.model.appcatalog.groupresourceprofile.ttypes.BatchQueueResourcePolicy()
                    self.success.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 1:
                if ftype == TType.STRUCT:
                    self.ire = airavata.api.error.ttypes.InvalidRequestException()
                    self.ire.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 2:
                if ftype == TType.STRUCT:
                    self.ace = airavata.api.error.ttypes.AiravataClientException()
                    self.ace.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 3:
                if ftype == TType.STRUCT:
                    self.ase = airavata.api.error.ttypes.AiravataSystemException()
                    self.ase.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 4:
                if ftype == TType.STRUCT:
                    self.ae = 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('getBatchQueueResourcePolicy_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 getGroupComputeResourcePrefList_args(object):
    """
    Attributes:
     - authzToken
     - groupResourceProfileId
    """

    thrift_spec = (
        None,  # 0
        (1, TType.STRUCT, 'authzToken', (airavata.model.security.ttypes.AuthzToken, airavata.model.security.ttypes.AuthzToken.thrift_spec), None, ),  # 1
        (2, TType.STRING, 'groupResourceProfileId', 'UTF8', None, ),  # 2
    )

    def __init__(self, authzToken=None, groupResourceProfileId=None,):
        self.authzToken = authzToken
        self.groupResourceProfileId = groupResourceProfileId

    def read(self, iprot):
        if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None:
            iprot._fast_decode(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 = airavata.model.security.ttypes.AuthzToken()
                    self.authzToken.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 2:
                if ftype == TType.STRING:
                    self.groupResourceProfileId = 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('getGroupComputeResourcePrefList_args')
        if self.authzToken is not None:
            oprot.writeFieldBegin('authzToken', TType.STRUCT, 1)
            self.authzToken.write(oprot)
            oprot.writeFieldEnd()
        if self.groupResourceProfileId is not None:
            oprot.writeFieldBegin('groupResourceProfileId', TType.STRING, 2)
            oprot.writeString(self.groupResourceProfileId.encode('utf-8') if sys.version_info[0] == 2 else self.groupResourceProfileId)
            oprot.writeFieldEnd()
        oprot.writeFieldStop()
        oprot.writeStructEnd()

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

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

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

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


class getGroupComputeResourcePrefList_result(object):
    """
    Attributes:
     - success
     - ire
     - ace
     - ase
     - ae
    """

    thrift_spec = (
        (0, TType.LIST, 'success', (TType.STRUCT, (airavata.model.appcatalog.groupresourceprofile.ttypes.GroupComputeResourcePreference, airavata.model.appcatalog.groupresourceprofile.ttypes.GroupComputeResourcePreference.thrift_spec), False), None, ),  # 0
        (1, TType.STRUCT, 'ire', (airavata.api.error.ttypes.InvalidRequestException, airavata.api.error.ttypes.InvalidRequestException.thrift_spec), None, ),  # 1
        (2, TType.STRUCT, 'ace', (airavata.api.error.ttypes.AiravataClientException, airavata.api.error.ttypes.AiravataClientException.thrift_spec), None, ),  # 2
        (3, TType.STRUCT, 'ase', (airavata.api.error.ttypes.AiravataSystemException, airavata.api.error.ttypes.AiravataSystemException.thrift_spec), None, ),  # 3
        (4, TType.STRUCT, 'ae', (airavata.api.error.ttypes.AuthorizationException, 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 = []
                    (_etype379, _size376) = iprot.readListBegin()
                    for _i380 in range(_size376):
                        _elem381 = airavata.model.appcatalog.groupresourceprofile.ttypes.GroupComputeResourcePreference()
                        _elem381.read(iprot)
                        self.success.append(_elem381)
                    iprot.readListEnd()
                else:
                    iprot.skip(ftype)
            elif fid == 1:
                if ftype == TType.STRUCT:
                    self.ire = airavata.api.error.ttypes.InvalidRequestException()
                    self.ire.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 2:
                if ftype == TType.STRUCT:
                    self.ace = airavata.api.error.ttypes.AiravataClientException()
                    self.ace.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 3:
                if ftype == TType.STRUCT:
                    self.ase = airavata.api.error.ttypes.AiravataSystemException()
                    self.ase.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 4:
                if ftype == TType.STRUCT:
                    self.ae = 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('getGroupComputeResourcePrefList_result')
        if self.success is not None:
            oprot.writeFieldBegin('success', TType.LIST, 0)
            oprot.writeListBegin(TType.STRUCT, len(self.success))
            for iter382 in self.success:
                iter382.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 getGroupBatchQueueResourcePolicyList_args(object):
    """
    Attributes:
     - authzToken
     - groupResourceProfileId
    """

    thrift_spec = (
        None,  # 0
        (1, TType.STRUCT, 'authzToken', (airavata.model.security.ttypes.AuthzToken, airavata.model.security.ttypes.AuthzToken.thrift_spec), None, ),  # 1
        (2, TType.STRING, 'groupResourceProfileId', 'UTF8', None, ),  # 2
    )

    def __init__(self, authzToken=None, groupResourceProfileId=None,):
        self.authzToken = authzToken
        self.groupResourceProfileId = groupResourceProfileId

    def read(self, iprot):
        if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None:
            iprot._fast_decode(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 = airavata.model.security.ttypes.AuthzToken()
                    self.authzToken.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 2:
                if ftype == TType.STRING:
                    self.groupResourceProfileId = 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('getGroupBatchQueueResourcePolicyList_args')
        if self.authzToken is not None:
            oprot.writeFieldBegin('authzToken', TType.STRUCT, 1)
            self.authzToken.write(oprot)
            oprot.writeFieldEnd()
        if self.groupResourceProfileId is not None:
            oprot.writeFieldBegin('groupResourceProfileId', TType.STRING, 2)
            oprot.writeString(self.groupResourceProfileId.encode('utf-8') if sys.version_info[0] == 2 else self.groupResourceProfileId)
            oprot.writeFieldEnd()
        oprot.writeFieldStop()
        oprot.writeStructEnd()

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

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

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

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


class getGroupBatchQueueResourcePolicyList_result(object):
    """
    Attributes:
     - success
     - ire
     - ace
     - ase
     - ae
    """

    thrift_spec = (
        (0, TType.LIST, 'success', (TType.STRUCT, (airavata.model.appcatalog.groupresourceprofile.ttypes.BatchQueueResourcePolicy, airavata.model.appcatalog.groupresourceprofile.ttypes.BatchQueueResourcePolicy.thrift_spec), False), None, ),  # 0
        (1, TType.STRUCT, 'ire', (airavata.api.error.ttypes.InvalidRequestException, airavata.api.error.ttypes.InvalidRequestException.thrift_spec), None, ),  # 1
        (2, TType.STRUCT, 'ace', (airavata.api.error.ttypes.AiravataClientException, airavata.api.error.ttypes.AiravataClientException.thrift_spec), None, ),  # 2
        (3, TType.STRUCT, 'ase', (airavata.api.error.ttypes.AiravataSystemException, airavata.api.error.ttypes.AiravataSystemException.thrift_spec), None, ),  # 3
        (4, TType.STRUCT, 'ae', (airavata.api.error.ttypes.AuthorizationException, 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 = []
                    (_etype386, _size383) = iprot.readListBegin()
                    for _i387 in range(_size383):
                        _elem388 = airavata.model.appcatalog.groupresourceprofile.ttypes.BatchQueueResourcePolicy()
                        _elem388.read(iprot)
                        self.success.append(_elem388)
                    iprot.readListEnd()
                else:
                    iprot.skip(ftype)
            elif fid == 1:
                if ftype == TType.STRUCT:
                    self.ire = airavata.api.error.ttypes.InvalidRequestException()
                    self.ire.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 2:
                if ftype == TType.STRUCT:
                    self.ace = airavata.api.error.ttypes.AiravataClientException()
                    self.ace.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 3:
                if ftype == TType.STRUCT:
                    self.ase = airavata.api.error.ttypes.AiravataSystemException()
                    self.ase.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 4:
                if ftype == TType.STRUCT:
                    self.ae = 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('getGroupBatchQueueResourcePolicyList_result')
        if self.success is not None:
            oprot.writeFieldBegin('success', TType.LIST, 0)
            oprot.writeListBegin(TType.STRUCT, len(self.success))
            for iter389 in self.success:
                iter389.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 getGroupComputeResourcePolicyList_args(object):
    """
    Attributes:
     - authzToken
     - groupResourceProfileId
    """

    thrift_spec = (
        None,  # 0
        (1, TType.STRUCT, 'authzToken', (airavata.model.security.ttypes.AuthzToken, airavata.model.security.ttypes.AuthzToken.thrift_spec), None, ),  # 1
        (2, TType.STRING, 'groupResourceProfileId', 'UTF8', None, ),  # 2
    )

    def __init__(self, authzToken=None, groupResourceProfileId=None,):
        self.authzToken = authzToken
        self.groupResourceProfileId = groupResourceProfileId

    def read(self, iprot):
        if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None:
            iprot._fast_decode(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 = airavata.model.security.ttypes.AuthzToken()
                    self.authzToken.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 2:
                if ftype == TType.STRING:
                    self.groupResourceProfileId = 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('getGroupComputeResourcePolicyList_args')
        if self.authzToken is not None:
            oprot.writeFieldBegin('authzToken', TType.STRUCT, 1)
            self.authzToken.write(oprot)
            oprot.writeFieldEnd()
        if self.groupResourceProfileId is not None:
            oprot.writeFieldBegin('groupResourceProfileId', TType.STRING, 2)
            oprot.writeString(self.groupResourceProfileId.encode('utf-8') if sys.version_info[0] == 2 else self.groupResourceProfileId)
            oprot.writeFieldEnd()
        oprot.writeFieldStop()
        oprot.writeStructEnd()

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

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

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

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


class getGroupComputeResourcePolicyList_result(object):
    """
    Attributes:
     - success
     - ire
     - ace
     - ase
     - ae
    """

    thrift_spec = (
        (0, TType.LIST, 'success', (TType.STRUCT, (airavata.model.appcatalog.groupresourceprofile.ttypes.ComputeResourcePolicy, airavata.model.appcatalog.groupresourceprofile.ttypes.ComputeResourcePolicy.thrift_spec), False), None, ),  # 0
        (1, TType.STRUCT, 'ire', (airavata.api.error.ttypes.InvalidRequestException, airavata.api.error.ttypes.InvalidRequestException.thrift_spec), None, ),  # 1
        (2, TType.STRUCT, 'ace', (airavata.api.error.ttypes.AiravataClientException, airavata.api.error.ttypes.AiravataClientException.thrift_spec), None, ),  # 2
        (3, TType.STRUCT, 'ase', (airavata.api.error.ttypes.AiravataSystemException, airavata.api.error.ttypes.AiravataSystemException.thrift_spec), None, ),  # 3
        (4, TType.STRUCT, 'ae', (airavata.api.error.ttypes.AuthorizationException, 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 = []
                    (_etype393, _size390) = iprot.readListBegin()
                    for _i394 in range(_size390):
                        _elem395 = airavata.model.appcatalog.groupresourceprofile.ttypes.ComputeResourcePolicy()
                        _elem395.read(iprot)
                        self.success.append(_elem395)
                    iprot.readListEnd()
                else:
                    iprot.skip(ftype)
            elif fid == 1:
                if ftype == TType.STRUCT:
                    self.ire = airavata.api.error.ttypes.InvalidRequestException()
                    self.ire.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 2:
                if ftype == TType.STRUCT:
                    self.ace = airavata.api.error.ttypes.AiravataClientException()
                    self.ace.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 3:
                if ftype == TType.STRUCT:
                    self.ase = airavata.api.error.ttypes.AiravataSystemException()
                    self.ase.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 4:
                if ftype == TType.STRUCT:
                    self.ae = 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('getGroupComputeResourcePolicyList_result')
        if self.success is not None:
            oprot.writeFieldBegin('success', TType.LIST, 0)
            oprot.writeListBegin(TType.STRUCT, len(self.success))
            for iter396 in self.success:
                iter396.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 getGatewayGroups_args(object):
    """
    Attributes:
     - authzToken
    """

    thrift_spec = (
        None,  # 0
        (1, TType.STRUCT, 'authzToken', (airavata.model.security.ttypes.AuthzToken, 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 = 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('getGatewayGroups_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 getGatewayGroups_result(object):
    """
    Attributes:
     - success
     - ire
     - ace
     - ase
     - ae
    """

    thrift_spec = (
        (0, TType.STRUCT, 'success', (airavata.model.appcatalog.gatewaygroups.ttypes.GatewayGroups, airavata.model.appcatalog.gatewaygroups.ttypes.GatewayGroups.thrift_spec), None, ),  # 0
        (1, TType.STRUCT, 'ire', (airavata.api.error.ttypes.InvalidRequestException, airavata.api.error.ttypes.InvalidRequestException.thrift_spec), None, ),  # 1
        (2, TType.STRUCT, 'ace', (airavata.api.error.ttypes.AiravataClientException, airavata.api.error.ttypes.AiravataClientException.thrift_spec), None, ),  # 2
        (3, TType.STRUCT, 'ase', (airavata.api.error.ttypes.AiravataSystemException, airavata.api.error.ttypes.AiravataSystemException.thrift_spec), None, ),  # 3
        (4, TType.STRUCT, 'ae', (airavata.api.error.ttypes.AuthorizationException, 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 = airavata.model.appcatalog.gatewaygroups.ttypes.GatewayGroups()
                    self.success.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 1:
                if ftype == TType.STRUCT:
                    self.ire = airavata.api.error.ttypes.InvalidRequestException()
                    self.ire.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 2:
                if ftype == TType.STRUCT:
                    self.ace = airavata.api.error.ttypes.AiravataClientException()
                    self.ace.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 3:
                if ftype == TType.STRUCT:
                    self.ase = airavata.api.error.ttypes.AiravataSystemException()
                    self.ase.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 4:
                if ftype == TType.STRUCT:
                    self.ae = 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('getGatewayGroups_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 getParser_args(object):
    """
    Attributes:
     - authzToken
     - parserId
     - gatewayId
    """

    thrift_spec = (
        None,  # 0
        (1, TType.STRUCT, 'authzToken', (airavata.model.security.ttypes.AuthzToken, airavata.model.security.ttypes.AuthzToken.thrift_spec), None, ),  # 1
        (2, TType.STRING, 'parserId', 'UTF8', None, ),  # 2
        (3, TType.STRING, 'gatewayId', 'UTF8', None, ),  # 3
    )

    def __init__(self, authzToken=None, parserId=None, gatewayId=None,):
        self.authzToken = authzToken
        self.parserId = parserId
        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 = airavata.model.security.ttypes.AuthzToken()
                    self.authzToken.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 2:
                if ftype == TType.STRING:
                    self.parserId = 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('getParser_args')
        if self.authzToken is not None:
            oprot.writeFieldBegin('authzToken', TType.STRUCT, 1)
            self.authzToken.write(oprot)
            oprot.writeFieldEnd()
        if self.parserId is not None:
            oprot.writeFieldBegin('parserId', TType.STRING, 2)
            oprot.writeString(self.parserId.encode('utf-8') if sys.version_info[0] == 2 else self.parserId)
            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.parserId is None:
            raise TProtocolException(message='Required field parserId 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 getParser_result(object):
    """
    Attributes:
     - success
     - ire
     - ace
     - ase
     - ae
    """

    thrift_spec = (
        (0, TType.STRUCT, 'success', (airavata.model.appcatalog.parser.ttypes.Parser, airavata.model.appcatalog.parser.ttypes.Parser.thrift_spec), None, ),  # 0
        (1, TType.STRUCT, 'ire', (airavata.api.error.ttypes.InvalidRequestException, airavata.api.error.ttypes.InvalidRequestException.thrift_spec), None, ),  # 1
        (2, TType.STRUCT, 'ace', (airavata.api.error.ttypes.AiravataClientException, airavata.api.error.ttypes.AiravataClientException.thrift_spec), None, ),  # 2
        (3, TType.STRUCT, 'ase', (airavata.api.error.ttypes.AiravataSystemException, airavata.api.error.ttypes.AiravataSystemException.thrift_spec), None, ),  # 3
        (4, TType.STRUCT, 'ae', (airavata.api.error.ttypes.AuthorizationException, 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 = airavata.model.appcatalog.parser.ttypes.Parser()
                    self.success.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 1:
                if ftype == TType.STRUCT:
                    self.ire = airavata.api.error.ttypes.InvalidRequestException()
                    self.ire.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 2:
                if ftype == TType.STRUCT:
                    self.ace = airavata.api.error.ttypes.AiravataClientException()
                    self.ace.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 3:
                if ftype == TType.STRUCT:
                    self.ase = airavata.api.error.ttypes.AiravataSystemException()
                    self.ase.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 4:
                if ftype == TType.STRUCT:
                    self.ae = 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('getParser_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 saveParser_args(object):
    """
    Attributes:
     - authzToken
     - parser
    """

    thrift_spec = (
        None,  # 0
        (1, TType.STRUCT, 'authzToken', (airavata.model.security.ttypes.AuthzToken, airavata.model.security.ttypes.AuthzToken.thrift_spec), None, ),  # 1
        (2, TType.STRUCT, 'parser', (airavata.model.appcatalog.parser.ttypes.Parser, airavata.model.appcatalog.parser.ttypes.Parser.thrift_spec), None, ),  # 2
    )

    def __init__(self, authzToken=None, parser=None,):
        self.authzToken = authzToken
        self.parser = parser

    def read(self, iprot):
        if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None:
            iprot._fast_decode(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 = airavata.model.security.ttypes.AuthzToken()
                    self.authzToken.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 2:
                if ftype == TType.STRUCT:
                    self.parser = airavata.model.appcatalog.parser.ttypes.Parser()
                    self.parser.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('saveParser_args')
        if self.authzToken is not None:
            oprot.writeFieldBegin('authzToken', TType.STRUCT, 1)
            self.authzToken.write(oprot)
            oprot.writeFieldEnd()
        if self.parser is not None:
            oprot.writeFieldBegin('parser', TType.STRUCT, 2)
            self.parser.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.parser is None:
            raise TProtocolException(message='Required field parser 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 saveParser_result(object):
    """
    Attributes:
     - success
     - ire
     - ace
     - ase
     - ae
    """

    thrift_spec = (
        (0, TType.STRING, 'success', 'UTF8', None, ),  # 0
        (1, TType.STRUCT, 'ire', (airavata.api.error.ttypes.InvalidRequestException, airavata.api.error.ttypes.InvalidRequestException.thrift_spec), None, ),  # 1
        (2, TType.STRUCT, 'ace', (airavata.api.error.ttypes.AiravataClientException, airavata.api.error.ttypes.AiravataClientException.thrift_spec), None, ),  # 2
        (3, TType.STRUCT, 'ase', (airavata.api.error.ttypes.AiravataSystemException, airavata.api.error.ttypes.AiravataSystemException.thrift_spec), None, ),  # 3
        (4, TType.STRUCT, 'ae', (airavata.api.error.ttypes.AuthorizationException, 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 = airavata.api.error.ttypes.InvalidRequestException()
                    self.ire.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 2:
                if ftype == TType.STRUCT:
                    self.ace = airavata.api.error.ttypes.AiravataClientException()
                    self.ace.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 3:
                if ftype == TType.STRUCT:
                    self.ase = airavata.api.error.ttypes.AiravataSystemException()
                    self.ase.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 4:
                if ftype == TType.STRUCT:
                    self.ae = 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('saveParser_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 listAllParsers_args(object):
    """
    Attributes:
     - authzToken
     - gatewayId
    """

    thrift_spec = (
        None,  # 0
        (1, TType.STRUCT, 'authzToken', (airavata.model.security.ttypes.AuthzToken, 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 = 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('listAllParsers_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 listAllParsers_result(object):
    """
    Attributes:
     - success
     - ire
     - ace
     - ase
     - ae
    """

    thrift_spec = (
        (0, TType.LIST, 'success', (TType.STRUCT, (airavata.model.appcatalog.parser.ttypes.Parser, airavata.model.appcatalog.parser.ttypes.Parser.thrift_spec), False), None, ),  # 0
        (1, TType.STRUCT, 'ire', (airavata.api.error.ttypes.InvalidRequestException, airavata.api.error.ttypes.InvalidRequestException.thrift_spec), None, ),  # 1
        (2, TType.STRUCT, 'ace', (airavata.api.error.ttypes.AiravataClientException, airavata.api.error.ttypes.AiravataClientException.thrift_spec), None, ),  # 2
        (3, TType.STRUCT, 'ase', (airavata.api.error.ttypes.AiravataSystemException, airavata.api.error.ttypes.AiravataSystemException.thrift_spec), None, ),  # 3
        (4, TType.STRUCT, 'ae', (airavata.api.error.ttypes.AuthorizationException, 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 = []
                    (_etype400, _size397) = iprot.readListBegin()
                    for _i401 in range(_size397):
                        _elem402 = airavata.model.appcatalog.parser.ttypes.Parser()
                        _elem402.read(iprot)
                        self.success.append(_elem402)
                    iprot.readListEnd()
                else:
                    iprot.skip(ftype)
            elif fid == 1:
                if ftype == TType.STRUCT:
                    self.ire = airavata.api.error.ttypes.InvalidRequestException()
                    self.ire.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 2:
                if ftype == TType.STRUCT:
                    self.ace = airavata.api.error.ttypes.AiravataClientException()
                    self.ace.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 3:
                if ftype == TType.STRUCT:
                    self.ase = airavata.api.error.ttypes.AiravataSystemException()
                    self.ase.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 4:
                if ftype == TType.STRUCT:
                    self.ae = 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('listAllParsers_result')
        if self.success is not None:
            oprot.writeFieldBegin('success', TType.LIST, 0)
            oprot.writeListBegin(TType.STRUCT, len(self.success))
            for iter403 in self.success:
                iter403.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 removeParser_args(object):
    """
    Attributes:
     - authzToken
     - parserId
     - gatewayId
    """

    thrift_spec = (
        None,  # 0
        (1, TType.STRUCT, 'authzToken', (airavata.model.security.ttypes.AuthzToken, airavata.model.security.ttypes.AuthzToken.thrift_spec), None, ),  # 1
        (2, TType.STRING, 'parserId', 'UTF8', None, ),  # 2
        (3, TType.STRING, 'gatewayId', 'UTF8', None, ),  # 3
    )

    def __init__(self, authzToken=None, parserId=None, gatewayId=None,):
        self.authzToken = authzToken
        self.parserId = parserId
        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 = airavata.model.security.ttypes.AuthzToken()
                    self.authzToken.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 2:
                if ftype == TType.STRING:
                    self.parserId = 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('removeParser_args')
        if self.authzToken is not None:
            oprot.writeFieldBegin('authzToken', TType.STRUCT, 1)
            self.authzToken.write(oprot)
            oprot.writeFieldEnd()
        if self.parserId is not None:
            oprot.writeFieldBegin('parserId', TType.STRING, 2)
            oprot.writeString(self.parserId.encode('utf-8') if sys.version_info[0] == 2 else self.parserId)
            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.parserId is None:
            raise TProtocolException(message='Required field parserId 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 removeParser_result(object):
    """
    Attributes:
     - success
     - ire
     - ace
     - ase
     - ae
    """

    thrift_spec = (
        (0, TType.BOOL, 'success', None, None, ),  # 0
        (1, TType.STRUCT, 'ire', (airavata.api.error.ttypes.InvalidRequestException, airavata.api.error.ttypes.InvalidRequestException.thrift_spec), None, ),  # 1
        (2, TType.STRUCT, 'ace', (airavata.api.error.ttypes.AiravataClientException, airavata.api.error.ttypes.AiravataClientException.thrift_spec), None, ),  # 2
        (3, TType.STRUCT, 'ase', (airavata.api.error.ttypes.AiravataSystemException, airavata.api.error.ttypes.AiravataSystemException.thrift_spec), None, ),  # 3
        (4, TType.STRUCT, 'ae', (airavata.api.error.ttypes.AuthorizationException, 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 = airavata.api.error.ttypes.InvalidRequestException()
                    self.ire.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 2:
                if ftype == TType.STRUCT:
                    self.ace = airavata.api.error.ttypes.AiravataClientException()
                    self.ace.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 3:
                if ftype == TType.STRUCT:
                    self.ase = airavata.api.error.ttypes.AiravataSystemException()
                    self.ase.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 4:
                if ftype == TType.STRUCT:
                    self.ae = 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('removeParser_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 getParsingTemplate_args(object):
    """
    Attributes:
     - authzToken
     - templateId
     - gatewayId
    """

    thrift_spec = (
        None,  # 0
        (1, TType.STRUCT, 'authzToken', (airavata.model.security.ttypes.AuthzToken, airavata.model.security.ttypes.AuthzToken.thrift_spec), None, ),  # 1
        (2, TType.STRING, 'templateId', 'UTF8', None, ),  # 2
        (3, TType.STRING, 'gatewayId', 'UTF8', None, ),  # 3
    )

    def __init__(self, authzToken=None, templateId=None, gatewayId=None,):
        self.authzToken = authzToken
        self.templateId = templateId
        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 = airavata.model.security.ttypes.AuthzToken()
                    self.authzToken.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 2:
                if ftype == TType.STRING:
                    self.templateId = 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('getParsingTemplate_args')
        if self.authzToken is not None:
            oprot.writeFieldBegin('authzToken', TType.STRUCT, 1)
            self.authzToken.write(oprot)
            oprot.writeFieldEnd()
        if self.templateId is not None:
            oprot.writeFieldBegin('templateId', TType.STRING, 2)
            oprot.writeString(self.templateId.encode('utf-8') if sys.version_info[0] == 2 else self.templateId)
            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.templateId is None:
            raise TProtocolException(message='Required field templateId 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 getParsingTemplate_result(object):
    """
    Attributes:
     - success
     - ire
     - ace
     - ase
     - ae
    """

    thrift_spec = (
        (0, TType.STRUCT, 'success', (airavata.model.appcatalog.parser.ttypes.ParsingTemplate, airavata.model.appcatalog.parser.ttypes.ParsingTemplate.thrift_spec), None, ),  # 0
        (1, TType.STRUCT, 'ire', (airavata.api.error.ttypes.InvalidRequestException, airavata.api.error.ttypes.InvalidRequestException.thrift_spec), None, ),  # 1
        (2, TType.STRUCT, 'ace', (airavata.api.error.ttypes.AiravataClientException, airavata.api.error.ttypes.AiravataClientException.thrift_spec), None, ),  # 2
        (3, TType.STRUCT, 'ase', (airavata.api.error.ttypes.AiravataSystemException, airavata.api.error.ttypes.AiravataSystemException.thrift_spec), None, ),  # 3
        (4, TType.STRUCT, 'ae', (airavata.api.error.ttypes.AuthorizationException, 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 = airavata.model.appcatalog.parser.ttypes.ParsingTemplate()
                    self.success.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 1:
                if ftype == TType.STRUCT:
                    self.ire = airavata.api.error.ttypes.InvalidRequestException()
                    self.ire.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 2:
                if ftype == TType.STRUCT:
                    self.ace = airavata.api.error.ttypes.AiravataClientException()
                    self.ace.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 3:
                if ftype == TType.STRUCT:
                    self.ase = airavata.api.error.ttypes.AiravataSystemException()
                    self.ase.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 4:
                if ftype == TType.STRUCT:
                    self.ae = 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('getParsingTemplate_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 getParsingTemplatesForExperiment_args(object):
    """
    Attributes:
     - authzToken
     - experimentId
     - gatewayId
    """

    thrift_spec = (
        None,  # 0
        (1, TType.STRUCT, 'authzToken', (airavata.model.security.ttypes.AuthzToken, airavata.model.security.ttypes.AuthzToken.thrift_spec), None, ),  # 1
        (2, TType.STRING, 'experimentId', 'UTF8', None, ),  # 2
        (3, TType.STRING, 'gatewayId', 'UTF8', None, ),  # 3
    )

    def __init__(self, authzToken=None, experimentId=None, gatewayId=None,):
        self.authzToken = authzToken
        self.experimentId = experimentId
        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 = 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)
            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('getParsingTemplatesForExperiment_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()
        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.experimentId is None:
            raise TProtocolException(message='Required field experimentId 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 getParsingTemplatesForExperiment_result(object):
    """
    Attributes:
     - success
     - ire
     - ace
     - ase
     - ae
    """

    thrift_spec = (
        (0, TType.LIST, 'success', (TType.STRUCT, (airavata.model.appcatalog.parser.ttypes.ParsingTemplate, airavata.model.appcatalog.parser.ttypes.ParsingTemplate.thrift_spec), False), None, ),  # 0
        (1, TType.STRUCT, 'ire', (airavata.api.error.ttypes.InvalidRequestException, airavata.api.error.ttypes.InvalidRequestException.thrift_spec), None, ),  # 1
        (2, TType.STRUCT, 'ace', (airavata.api.error.ttypes.AiravataClientException, airavata.api.error.ttypes.AiravataClientException.thrift_spec), None, ),  # 2
        (3, TType.STRUCT, 'ase', (airavata.api.error.ttypes.AiravataSystemException, airavata.api.error.ttypes.AiravataSystemException.thrift_spec), None, ),  # 3
        (4, TType.STRUCT, 'ae', (airavata.api.error.ttypes.AuthorizationException, 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 = []
                    (_etype407, _size404) = iprot.readListBegin()
                    for _i408 in range(_size404):
                        _elem409 = airavata.model.appcatalog.parser.ttypes.ParsingTemplate()
                        _elem409.read(iprot)
                        self.success.append(_elem409)
                    iprot.readListEnd()
                else:
                    iprot.skip(ftype)
            elif fid == 1:
                if ftype == TType.STRUCT:
                    self.ire = airavata.api.error.ttypes.InvalidRequestException()
                    self.ire.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 2:
                if ftype == TType.STRUCT:
                    self.ace = airavata.api.error.ttypes.AiravataClientException()
                    self.ace.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 3:
                if ftype == TType.STRUCT:
                    self.ase = airavata.api.error.ttypes.AiravataSystemException()
                    self.ase.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 4:
                if ftype == TType.STRUCT:
                    self.ae = 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('getParsingTemplatesForExperiment_result')
        if self.success is not None:
            oprot.writeFieldBegin('success', TType.LIST, 0)
            oprot.writeListBegin(TType.STRUCT, len(self.success))
            for iter410 in self.success:
                iter410.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 saveParsingTemplate_args(object):
    """
    Attributes:
     - authzToken
     - parsingTemplate
    """

    thrift_spec = (
        None,  # 0
        (1, TType.STRUCT, 'authzToken', (airavata.model.security.ttypes.AuthzToken, airavata.model.security.ttypes.AuthzToken.thrift_spec), None, ),  # 1
        (2, TType.STRUCT, 'parsingTemplate', (airavata.model.appcatalog.parser.ttypes.ParsingTemplate, airavata.model.appcatalog.parser.ttypes.ParsingTemplate.thrift_spec), None, ),  # 2
    )

    def __init__(self, authzToken=None, parsingTemplate=None,):
        self.authzToken = authzToken
        self.parsingTemplate = parsingTemplate

    def read(self, iprot):
        if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None:
            iprot._fast_decode(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 = airavata.model.security.ttypes.AuthzToken()
                    self.authzToken.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 2:
                if ftype == TType.STRUCT:
                    self.parsingTemplate = airavata.model.appcatalog.parser.ttypes.ParsingTemplate()
                    self.parsingTemplate.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('saveParsingTemplate_args')
        if self.authzToken is not None:
            oprot.writeFieldBegin('authzToken', TType.STRUCT, 1)
            self.authzToken.write(oprot)
            oprot.writeFieldEnd()
        if self.parsingTemplate is not None:
            oprot.writeFieldBegin('parsingTemplate', TType.STRUCT, 2)
            self.parsingTemplate.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.parsingTemplate is None:
            raise TProtocolException(message='Required field parsingTemplate 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 saveParsingTemplate_result(object):
    """
    Attributes:
     - success
     - ire
     - ace
     - ase
     - ae
    """

    thrift_spec = (
        (0, TType.STRING, 'success', 'UTF8', None, ),  # 0
        (1, TType.STRUCT, 'ire', (airavata.api.error.ttypes.InvalidRequestException, airavata.api.error.ttypes.InvalidRequestException.thrift_spec), None, ),  # 1
        (2, TType.STRUCT, 'ace', (airavata.api.error.ttypes.AiravataClientException, airavata.api.error.ttypes.AiravataClientException.thrift_spec), None, ),  # 2
        (3, TType.STRUCT, 'ase', (airavata.api.error.ttypes.AiravataSystemException, airavata.api.error.ttypes.AiravataSystemException.thrift_spec), None, ),  # 3
        (4, TType.STRUCT, 'ae', (airavata.api.error.ttypes.AuthorizationException, 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 = airavata.api.error.ttypes.InvalidRequestException()
                    self.ire.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 2:
                if ftype == TType.STRUCT:
                    self.ace = airavata.api.error.ttypes.AiravataClientException()
                    self.ace.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 3:
                if ftype == TType.STRUCT:
                    self.ase = airavata.api.error.ttypes.AiravataSystemException()
                    self.ase.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 4:
                if ftype == TType.STRUCT:
                    self.ae = 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('saveParsingTemplate_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 removeParsingTemplate_args(object):
    """
    Attributes:
     - authzToken
     - templateId
     - gatewayId
    """

    thrift_spec = (
        None,  # 0
        (1, TType.STRUCT, 'authzToken', (airavata.model.security.ttypes.AuthzToken, airavata.model.security.ttypes.AuthzToken.thrift_spec), None, ),  # 1
        (2, TType.STRING, 'templateId', 'UTF8', None, ),  # 2
        (3, TType.STRING, 'gatewayId', 'UTF8', None, ),  # 3
    )

    def __init__(self, authzToken=None, templateId=None, gatewayId=None,):
        self.authzToken = authzToken
        self.templateId = templateId
        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 = airavata.model.security.ttypes.AuthzToken()
                    self.authzToken.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 2:
                if ftype == TType.STRING:
                    self.templateId = 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('removeParsingTemplate_args')
        if self.authzToken is not None:
            oprot.writeFieldBegin('authzToken', TType.STRUCT, 1)
            self.authzToken.write(oprot)
            oprot.writeFieldEnd()
        if self.templateId is not None:
            oprot.writeFieldBegin('templateId', TType.STRING, 2)
            oprot.writeString(self.templateId.encode('utf-8') if sys.version_info[0] == 2 else self.templateId)
            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.templateId is None:
            raise TProtocolException(message='Required field templateId 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 removeParsingTemplate_result(object):
    """
    Attributes:
     - success
     - ire
     - ace
     - ase
     - ae
    """

    thrift_spec = (
        (0, TType.BOOL, 'success', None, None, ),  # 0
        (1, TType.STRUCT, 'ire', (airavata.api.error.ttypes.InvalidRequestException, airavata.api.error.ttypes.InvalidRequestException.thrift_spec), None, ),  # 1
        (2, TType.STRUCT, 'ace', (airavata.api.error.ttypes.AiravataClientException, airavata.api.error.ttypes.AiravataClientException.thrift_spec), None, ),  # 2
        (3, TType.STRUCT, 'ase', (airavata.api.error.ttypes.AiravataSystemException, airavata.api.error.ttypes.AiravataSystemException.thrift_spec), None, ),  # 3
        (4, TType.STRUCT, 'ae', (airavata.api.error.ttypes.AuthorizationException, 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 = airavata.api.error.ttypes.InvalidRequestException()
                    self.ire.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 2:
                if ftype == TType.STRUCT:
                    self.ace = airavata.api.error.ttypes.AiravataClientException()
                    self.ace.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 3:
                if ftype == TType.STRUCT:
                    self.ase = airavata.api.error.ttypes.AiravataSystemException()
                    self.ase.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 4:
                if ftype == TType.STRUCT:
                    self.ae = 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('removeParsingTemplate_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 listAllParsingTemplates_args(object):
    """
    Attributes:
     - authzToken
     - gatewayId
    """

    thrift_spec = (
        None,  # 0
        (1, TType.STRUCT, 'authzToken', (airavata.model.security.ttypes.AuthzToken, 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 = 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('listAllParsingTemplates_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 listAllParsingTemplates_result(object):
    """
    Attributes:
     - success
     - ire
     - ace
     - ase
     - ae
    """

    thrift_spec = (
        (0, TType.LIST, 'success', (TType.STRUCT, (airavata.model.appcatalog.parser.ttypes.ParsingTemplate, airavata.model.appcatalog.parser.ttypes.ParsingTemplate.thrift_spec), False), None, ),  # 0
        (1, TType.STRUCT, 'ire', (airavata.api.error.ttypes.InvalidRequestException, airavata.api.error.ttypes.InvalidRequestException.thrift_spec), None, ),  # 1
        (2, TType.STRUCT, 'ace', (airavata.api.error.ttypes.AiravataClientException, airavata.api.error.ttypes.AiravataClientException.thrift_spec), None, ),  # 2
        (3, TType.STRUCT, 'ase', (airavata.api.error.ttypes.AiravataSystemException, airavata.api.error.ttypes.AiravataSystemException.thrift_spec), None, ),  # 3
        (4, TType.STRUCT, 'ae', (airavata.api.error.ttypes.AuthorizationException, 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 = []
                    (_etype414, _size411) = iprot.readListBegin()
                    for _i415 in range(_size411):
                        _elem416 = airavata.model.appcatalog.parser.ttypes.ParsingTemplate()
                        _elem416.read(iprot)
                        self.success.append(_elem416)
                    iprot.readListEnd()
                else:
                    iprot.skip(ftype)
            elif fid == 1:
                if ftype == TType.STRUCT:
                    self.ire = airavata.api.error.ttypes.InvalidRequestException()
                    self.ire.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 2:
                if ftype == TType.STRUCT:
                    self.ace = airavata.api.error.ttypes.AiravataClientException()
                    self.ace.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 3:
                if ftype == TType.STRUCT:
                    self.ase = airavata.api.error.ttypes.AiravataSystemException()
                    self.ase.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 4:
                if ftype == TType.STRUCT:
                    self.ae = 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('listAllParsingTemplates_result')
        if self.success is not None:
            oprot.writeFieldBegin('success', TType.LIST, 0)
            oprot.writeListBegin(TType.STRUCT, len(self.success))
            for iter417 in self.success:
                iter417.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)
