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

from thrift.Thrift import TType, TMessageType, TFrozenDict, TException, TApplicationException
from thrift.protocol.TProtocol import TProtocolException
from thrift.TRecursive import fix_spec

import sys
import airavata.base.api.BaseAPI
import logging
from .ttypes import *
from thrift.Thrift import TProcessor
from thrift.transport import TTransport
all_structs = []


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
        self._on_message_begin = None

    def on_message_begin(self, func):
        self._on_message_begin = func

    def process(self, iprot, oprot):
        (name, type, seqid) = iprot.readMessageBegin()
        if self._on_message_begin:
            self._on_message_begin(name, type, seqid)
        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:
            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 TApplicationException as ex:
            logging.exception('TApplication exception in handler')
            msg_type = TMessageType.EXCEPTION
            result = ex
        except Exception:
            logging.exception('Unexpected exception in handler')
            msg_type = TMessageType.EXCEPTION
            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:
            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 TApplicationException as ex:
            logging.exception('TApplication exception in handler')
            msg_type = TMessageType.EXCEPTION
            result = ex
        except Exception:
            logging.exception('Unexpected exception in handler')
            msg_type = TMessageType.EXCEPTION
            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:
            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 TApplicationException as ex:
            logging.exception('TApplication exception in handler')
            msg_type = TMessageType.EXCEPTION
            result = ex
        except Exception:
            logging.exception('Unexpected exception in handler')
            msg_type = TMessageType.EXCEPTION
            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:
            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 TApplicationException as ex:
            logging.exception('TApplication exception in handler')
            msg_type = TMessageType.EXCEPTION
            result = ex
        except Exception:
            logging.exception('Unexpected exception in handler')
            msg_type = TMessageType.EXCEPTION
            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:
            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 TApplicationException as ex:
            logging.exception('TApplication exception in handler')
            msg_type = TMessageType.EXCEPTION
            result = ex
        except Exception:
            logging.exception('Unexpected exception in handler')
            msg_type = TMessageType.EXCEPTION
            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:
            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 TApplicationException as ex:
            logging.exception('TApplication exception in handler')
            msg_type = TMessageType.EXCEPTION
            result = ex
        except Exception:
            logging.exception('Unexpected exception in handler')
            msg_type = TMessageType.EXCEPTION
            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:
            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 TApplicationException as ex:
            logging.exception('TApplication exception in handler')
            msg_type = TMessageType.EXCEPTION
            result = ex
        except Exception:
            logging.exception('Unexpected exception in handler')
            msg_type = TMessageType.EXCEPTION
            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:
            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 TApplicationException as ex:
            logging.exception('TApplication exception in handler')
            msg_type = TMessageType.EXCEPTION
            result = ex
        except Exception:
            logging.exception('Unexpected exception in handler')
            msg_type = TMessageType.EXCEPTION
            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:
            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 TApplicationException as ex:
            logging.exception('TApplication exception in handler')
            msg_type = TMessageType.EXCEPTION
            result = ex
        except Exception:
            logging.exception('Unexpected exception in handler')
            msg_type = TMessageType.EXCEPTION
            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:
            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 TApplicationException as ex:
            logging.exception('TApplication exception in handler')
            msg_type = TMessageType.EXCEPTION
            result = ex
        except Exception:
            logging.exception('Unexpected exception in handler')
            msg_type = TMessageType.EXCEPTION
            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:
            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 TApplicationException as ex:
            logging.exception('TApplication exception in handler')
            msg_type = TMessageType.EXCEPTION
            result = ex
        except Exception:
            logging.exception('Unexpected exception in handler')
            msg_type = TMessageType.EXCEPTION
            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:
            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 TApplicationException as ex:
            logging.exception('TApplication exception in handler')
            msg_type = TMessageType.EXCEPTION
            result = ex
        except Exception:
            logging.exception('Unexpected exception in handler')
            msg_type = TMessageType.EXCEPTION
            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:
            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 TApplicationException as ex:
            logging.exception('TApplication exception in handler')
            msg_type = TMessageType.EXCEPTION
            result = ex
        except Exception:
            logging.exception('Unexpected exception in handler')
            msg_type = TMessageType.EXCEPTION
            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:
            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 TApplicationException as ex:
            logging.exception('TApplication exception in handler')
            msg_type = TMessageType.EXCEPTION
            result = ex
        except Exception:
            logging.exception('Unexpected exception in handler')
            msg_type = TMessageType.EXCEPTION
            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:
            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 TApplicationException as ex:
            logging.exception('TApplication exception in handler')
            msg_type = TMessageType.EXCEPTION
            result = ex
        except Exception:
            logging.exception('Unexpected exception in handler')
            msg_type = TMessageType.EXCEPTION
            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:
            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 TApplicationException as ex:
            logging.exception('TApplication exception in handler')
            msg_type = TMessageType.EXCEPTION
            result = ex
        except Exception:
            logging.exception('Unexpected exception in handler')
            msg_type = TMessageType.EXCEPTION
            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:
            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 TApplicationException as ex:
            logging.exception('TApplication exception in handler')
            msg_type = TMessageType.EXCEPTION
            result = ex
        except Exception:
            logging.exception('Unexpected exception in handler')
            msg_type = TMessageType.EXCEPTION
            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:
            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 TApplicationException as ex:
            logging.exception('TApplication exception in handler')
            msg_type = TMessageType.EXCEPTION
            result = ex
        except Exception:
            logging.exception('Unexpected exception in handler')
            msg_type = TMessageType.EXCEPTION
            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:
            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 TApplicationException as ex:
            logging.exception('TApplication exception in handler')
            msg_type = TMessageType.EXCEPTION
            result = ex
        except Exception:
            logging.exception('Unexpected exception in handler')
            msg_type = TMessageType.EXCEPTION
            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:
            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 TApplicationException as ex:
            logging.exception('TApplication exception in handler')
            msg_type = TMessageType.EXCEPTION
            result = ex
        except Exception:
            logging.exception('Unexpected exception in handler')
            msg_type = TMessageType.EXCEPTION
            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:
            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 TApplicationException as ex:
            logging.exception('TApplication exception in handler')
            msg_type = TMessageType.EXCEPTION
            result = ex
        except Exception:
            logging.exception('Unexpected exception in handler')
            msg_type = TMessageType.EXCEPTION
            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:
            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 TApplicationException as ex:
            logging.exception('TApplication exception in handler')
            msg_type = TMessageType.EXCEPTION
            result = ex
        except Exception:
            logging.exception('Unexpected exception in handler')
            msg_type = TMessageType.EXCEPTION
            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:
            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 TApplicationException as ex:
            logging.exception('TApplication exception in handler')
            msg_type = TMessageType.EXCEPTION
            result = ex
        except Exception:
            logging.exception('Unexpected exception in handler')
            msg_type = TMessageType.EXCEPTION
            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:
            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 TApplicationException as ex:
            logging.exception('TApplication exception in handler')
            msg_type = TMessageType.EXCEPTION
            result = ex
        except Exception:
            logging.exception('Unexpected exception in handler')
            msg_type = TMessageType.EXCEPTION
            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:
            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 TApplicationException as ex:
            logging.exception('TApplication exception in handler')
            msg_type = TMessageType.EXCEPTION
            result = ex
        except Exception:
            logging.exception('Unexpected exception in handler')
            msg_type = TMessageType.EXCEPTION
            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:
            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 TApplicationException as ex:
            logging.exception('TApplication exception in handler')
            msg_type = TMessageType.EXCEPTION
            result = ex
        except Exception:
            logging.exception('Unexpected exception in handler')
            msg_type = TMessageType.EXCEPTION
            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:
            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 TApplicationException as ex:
            logging.exception('TApplication exception in handler')
            msg_type = TMessageType.EXCEPTION
            result = ex
        except Exception:
            logging.exception('Unexpected exception in handler')
            msg_type = TMessageType.EXCEPTION
            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:
            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 TApplicationException as ex:
            logging.exception('TApplication exception in handler')
            msg_type = TMessageType.EXCEPTION
            result = ex
        except Exception:
            logging.exception('Unexpected exception in handler')
            msg_type = TMessageType.EXCEPTION
            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:
            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 TApplicationException as ex:
            logging.exception('TApplication exception in handler')
            msg_type = TMessageType.EXCEPTION
            result = ex
        except Exception:
            logging.exception('Unexpected exception in handler')
            msg_type = TMessageType.EXCEPTION
            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:
            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 TApplicationException as ex:
            logging.exception('TApplication exception in handler')
            msg_type = TMessageType.EXCEPTION
            result = ex
        except Exception:
            logging.exception('Unexpected exception in handler')
            msg_type = TMessageType.EXCEPTION
            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:
            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 TApplicationException as ex:
            logging.exception('TApplication exception in handler')
            msg_type = TMessageType.EXCEPTION
            result = ex
        except Exception:
            logging.exception('Unexpected exception in handler')
            msg_type = TMessageType.EXCEPTION
            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:
            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 TApplicationException as ex:
            logging.exception('TApplication exception in handler')
            msg_type = TMessageType.EXCEPTION
            result = ex
        except Exception:
            logging.exception('Unexpected exception in handler')
            msg_type = TMessageType.EXCEPTION
            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:
            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 TApplicationException as ex:
            logging.exception('TApplication exception in handler')
            msg_type = TMessageType.EXCEPTION
            result = ex
        except Exception:
            logging.exception('Unexpected exception in handler')
            msg_type = TMessageType.EXCEPTION
            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:
            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 TApplicationException as ex:
            logging.exception('TApplication exception in handler')
            msg_type = TMessageType.EXCEPTION
            result = ex
        except Exception:
            logging.exception('Unexpected exception in handler')
            msg_type = TMessageType.EXCEPTION
            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:
            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 TApplicationException as ex:
            logging.exception('TApplication exception in handler')
            msg_type = TMessageType.EXCEPTION
            result = ex
        except Exception:
            logging.exception('Unexpected exception in handler')
            msg_type = TMessageType.EXCEPTION
            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:
            raise
        except airavata.api.error.ttypes.AuthorizationException as ae:
            msg_type = TMessageType.REPLY
            result.ae = ae
        except TApplicationException as ex:
            logging.exception('TApplication exception in handler')
            msg_type = TMessageType.EXCEPTION
            result = ex
        except Exception:
            logging.exception('Unexpected exception in handler')
            msg_type = TMessageType.EXCEPTION
            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:
            raise
        except airavata.api.error.ttypes.AuthorizationException as ae:
            msg_type = TMessageType.REPLY
            result.ae = ae
        except TApplicationException as ex:
            logging.exception('TApplication exception in handler')
            msg_type = TMessageType.EXCEPTION
            result = ex
        except Exception:
            logging.exception('Unexpected exception in handler')
            msg_type = TMessageType.EXCEPTION
            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:
            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 TApplicationException as ex:
            logging.exception('TApplication exception in handler')
            msg_type = TMessageType.EXCEPTION
            result = ex
        except Exception:
            logging.exception('Unexpected exception in handler')
            msg_type = TMessageType.EXCEPTION
            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:
            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 TApplicationException as ex:
            logging.exception('TApplication exception in handler')
            msg_type = TMessageType.EXCEPTION
            result = ex
        except Exception:
            logging.exception('Unexpected exception in handler')
            msg_type = TMessageType.EXCEPTION
            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:
            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 TApplicationException as ex:
            logging.exception('TApplication exception in handler')
            msg_type = TMessageType.EXCEPTION
            result = ex
        except Exception:
            logging.exception('Unexpected exception in handler')
            msg_type = TMessageType.EXCEPTION
            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:
            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 TApplicationException as ex:
            logging.exception('TApplication exception in handler')
            msg_type = TMessageType.EXCEPTION
            result = ex
        except Exception:
            logging.exception('Unexpected exception in handler')
            msg_type = TMessageType.EXCEPTION
            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:
            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 TApplicationException as ex:
            logging.exception('TApplication exception in handler')
            msg_type = TMessageType.EXCEPTION
            result = ex
        except Exception:
            logging.exception('Unexpected exception in handler')
            msg_type = TMessageType.EXCEPTION
            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:
            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 TApplicationException as ex:
            logging.exception('TApplication exception in handler')
            msg_type = TMessageType.EXCEPTION
            result = ex
        except Exception:
            logging.exception('Unexpected exception in handler')
            msg_type = TMessageType.EXCEPTION
            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:
            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 TApplicationException as ex:
            logging.exception('TApplication exception in handler')
            msg_type = TMessageType.EXCEPTION
            result = ex
        except Exception:
            logging.exception('Unexpected exception in handler')
            msg_type = TMessageType.EXCEPTION
            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:
            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 TApplicationException as ex:
            logging.exception('TApplication exception in handler')
            msg_type = TMessageType.EXCEPTION
            result = ex
        except Exception:
            logging.exception('Unexpected exception in handler')
            msg_type = TMessageType.EXCEPTION
            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:
            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 TApplicationException as ex:
            logging.exception('TApplication exception in handler')
            msg_type = TMessageType.EXCEPTION
            result = ex
        except Exception:
            logging.exception('Unexpected exception in handler')
            msg_type = TMessageType.EXCEPTION
            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:
            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 TApplicationException as ex:
            logging.exception('TApplication exception in handler')
            msg_type = TMessageType.EXCEPTION
            result = ex
        except Exception:
            logging.exception('Unexpected exception in handler')
            msg_type = TMessageType.EXCEPTION
            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:
            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 TApplicationException as ex:
            logging.exception('TApplication exception in handler')
            msg_type = TMessageType.EXCEPTION
            result = ex
        except Exception:
            logging.exception('Unexpected exception in handler')
            msg_type = TMessageType.EXCEPTION
            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:
            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 TApplicationException as ex:
            logging.exception('TApplication exception in handler')
            msg_type = TMessageType.EXCEPTION
            result = ex
        except Exception:
            logging.exception('Unexpected exception in handler')
            msg_type = TMessageType.EXCEPTION
            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:
            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 TApplicationException as ex:
            logging.exception('TApplication exception in handler')
            msg_type = TMessageType.EXCEPTION
            result = ex
        except Exception:
            logging.exception('Unexpected exception in handler')
            msg_type = TMessageType.EXCEPTION
            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:
            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 TApplicationException as ex:
            logging.exception('TApplication exception in handler')
            msg_type = TMessageType.EXCEPTION
            result = ex
        except Exception:
            logging.exception('Unexpected exception in handler')
            msg_type = TMessageType.EXCEPTION
            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:
            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 TApplicationException as ex:
            logging.exception('TApplication exception in handler')
            msg_type = TMessageType.EXCEPTION
            result = ex
        except Exception:
            logging.exception('Unexpected exception in handler')
            msg_type = TMessageType.EXCEPTION
            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:
            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 TApplicationException as ex:
            logging.exception('TApplication exception in handler')
            msg_type = TMessageType.EXCEPTION
            result = ex
        except Exception:
            logging.exception('Unexpected exception in handler')
            msg_type = TMessageType.EXCEPTION
            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:
            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 TApplicationException as ex:
            logging.exception('TApplication exception in handler')
            msg_type = TMessageType.EXCEPTION
            result = ex
        except Exception:
            logging.exception('Unexpected exception in handler')
            msg_type = TMessageType.EXCEPTION
            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:
            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 TApplicationException as ex:
            logging.exception('TApplication exception in handler')
            msg_type = TMessageType.EXCEPTION
            result = ex
        except Exception:
            logging.exception('Unexpected exception in handler')
            msg_type = TMessageType.EXCEPTION
            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:
            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 TApplicationException as ex:
            logging.exception('TApplication exception in handler')
            msg_type = TMessageType.EXCEPTION
            result = ex
        except Exception:
            logging.exception('Unexpected exception in handler')
            msg_type = TMessageType.EXCEPTION
            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:
            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 TApplicationException as ex:
            logging.exception('TApplication exception in handler')
            msg_type = TMessageType.EXCEPTION
            result = ex
        except Exception:
            logging.exception('Unexpected exception in handler')
            msg_type = TMessageType.EXCEPTION
            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:
            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 TApplicationException as ex:
            logging.exception('TApplication exception in handler')
            msg_type = TMessageType.EXCEPTION
            result = ex
        except Exception:
            logging.exception('Unexpected exception in handler')
            msg_type = TMessageType.EXCEPTION
            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:
            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 TApplicationException as ex:
            logging.exception('TApplication exception in handler')
            msg_type = TMessageType.EXCEPTION
            result = ex
        except Exception:
            logging.exception('Unexpected exception in handler')
            msg_type = TMessageType.EXCEPTION
            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:
            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 TApplicationException as ex:
            logging.exception('TApplication exception in handler')
            msg_type = TMessageType.EXCEPTION
            result = ex
        except Exception:
            logging.exception('Unexpected exception in handler')
            msg_type = TMessageType.EXCEPTION
            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:
            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 TApplicationException as ex:
            logging.exception('TApplication exception in handler')
            msg_type = TMessageType.EXCEPTION
            result = ex
        except Exception:
            logging.exception('Unexpected exception in handler')
            msg_type = TMessageType.EXCEPTION
            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:
            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 TApplicationException as ex:
            logging.exception('TApplication exception in handler')
            msg_type = TMessageType.EXCEPTION
            result = ex
        except Exception:
            logging.exception('Unexpected exception in handler')
            msg_type = TMessageType.EXCEPTION
            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:
            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 TApplicationException as ex:
            logging.exception('TApplication exception in handler')
            msg_type = TMessageType.EXCEPTION
            result = ex
        except Exception:
            logging.exception('Unexpected exception in handler')
            msg_type = TMessageType.EXCEPTION
            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:
            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 TApplicationException as ex:
            logging.exception('TApplication exception in handler')
            msg_type = TMessageType.EXCEPTION
            result = ex
        except Exception:
            logging.exception('Unexpected exception in handler')
            msg_type = TMessageType.EXCEPTION
            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:
            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 TApplicationException as ex:
            logging.exception('TApplication exception in handler')
            msg_type = TMessageType.EXCEPTION
            result = ex
        except Exception:
            logging.exception('Unexpected exception in handler')
            msg_type = TMessageType.EXCEPTION
            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:
            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 TApplicationException as ex:
            logging.exception('TApplication exception in handler')
            msg_type = TMessageType.EXCEPTION
            result = ex
        except Exception:
            logging.exception('Unexpected exception in handler')
            msg_type = TMessageType.EXCEPTION
            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:
            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 TApplicationException as ex:
            logging.exception('TApplication exception in handler')
            msg_type = TMessageType.EXCEPTION
            result = ex
        except Exception:
            logging.exception('Unexpected exception in handler')
            msg_type = TMessageType.EXCEPTION
            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:
            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 TApplicationException as ex:
            logging.exception('TApplication exception in handler')
            msg_type = TMessageType.EXCEPTION
            result = ex
        except Exception:
            logging.exception('Unexpected exception in handler')
            msg_type = TMessageType.EXCEPTION
            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:
            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 TApplicationException as ex:
            logging.exception('TApplication exception in handler')
            msg_type = TMessageType.EXCEPTION
            result = ex
        except Exception:
            logging.exception('Unexpected exception in handler')
            msg_type = TMessageType.EXCEPTION
            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:
            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 TApplicationException as ex:
            logging.exception('TApplication exception in handler')
            msg_type = TMessageType.EXCEPTION
            result = ex
        except Exception:
            logging.exception('Unexpected exception in handler')
            msg_type = TMessageType.EXCEPTION
            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:
            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 TApplicationException as ex:
            logging.exception('TApplication exception in handler')
            msg_type = TMessageType.EXCEPTION
            result = ex
        except Exception:
            logging.exception('Unexpected exception in handler')
            msg_type = TMessageType.EXCEPTION
            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:
            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 TApplicationException as ex:
            logging.exception('TApplication exception in handler')
            msg_type = TMessageType.EXCEPTION
            result = ex
        except Exception:
            logging.exception('Unexpected exception in handler')
            msg_type = TMessageType.EXCEPTION
            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:
            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 TApplicationException as ex:
            logging.exception('TApplication exception in handler')
            msg_type = TMessageType.EXCEPTION
            result = ex
        except Exception:
            logging.exception('Unexpected exception in handler')
            msg_type = TMessageType.EXCEPTION
            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:
            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 TApplicationException as ex:
            logging.exception('TApplication exception in handler')
            msg_type = TMessageType.EXCEPTION
            result = ex
        except Exception:
            logging.exception('Unexpected exception in handler')
            msg_type = TMessageType.EXCEPTION
            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:
            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 TApplicationException as ex:
            logging.exception('TApplication exception in handler')
            msg_type = TMessageType.EXCEPTION
            result = ex
        except Exception:
            logging.exception('Unexpected exception in handler')
            msg_type = TMessageType.EXCEPTION
            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:
            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 TApplicationException as ex:
            logging.exception('TApplication exception in handler')
            msg_type = TMessageType.EXCEPTION
            result = ex
        except Exception:
            logging.exception('Unexpected exception in handler')
            msg_type = TMessageType.EXCEPTION
            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:
            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 TApplicationException as ex:
            logging.exception('TApplication exception in handler')
            msg_type = TMessageType.EXCEPTION
            result = ex
        except Exception:
            logging.exception('Unexpected exception in handler')
            msg_type = TMessageType.EXCEPTION
            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:
            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 TApplicationException as ex:
            logging.exception('TApplication exception in handler')
            msg_type = TMessageType.EXCEPTION
            result = ex
        except Exception:
            logging.exception('Unexpected exception in handler')
            msg_type = TMessageType.EXCEPTION
            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:
            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 TApplicationException as ex:
            logging.exception('TApplication exception in handler')
            msg_type = TMessageType.EXCEPTION
            result = ex
        except Exception:
            logging.exception('Unexpected exception in handler')
            msg_type = TMessageType.EXCEPTION
            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:
            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 TApplicationException as ex:
            logging.exception('TApplication exception in handler')
            msg_type = TMessageType.EXCEPTION
            result = ex
        except Exception:
            logging.exception('Unexpected exception in handler')
            msg_type = TMessageType.EXCEPTION
            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:
            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 TApplicationException as ex:
            logging.exception('TApplication exception in handler')
            msg_type = TMessageType.EXCEPTION
            result = ex
        except Exception:
            logging.exception('Unexpected exception in handler')
            msg_type = TMessageType.EXCEPTION
            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:
            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 TApplicationException as ex:
            logging.exception('TApplication exception in handler')
            msg_type = TMessageType.EXCEPTION
            result = ex
        except Exception:
            logging.exception('Unexpected exception in handler')
            msg_type = TMessageType.EXCEPTION
            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:
            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 TApplicationException as ex:
            logging.exception('TApplication exception in handler')
            msg_type = TMessageType.EXCEPTION
            result = ex
        except Exception:
            logging.exception('Unexpected exception in handler')
            msg_type = TMessageType.EXCEPTION
            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:
            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 TApplicationException as ex:
            logging.exception('TApplication exception in handler')
            msg_type = TMessageType.EXCEPTION
            result = ex
        except Exception:
            logging.exception('Unexpected exception in handler')
            msg_type = TMessageType.EXCEPTION
            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:
            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 TApplicationException as ex:
            logging.exception('TApplication exception in handler')
            msg_type = TMessageType.EXCEPTION
            result = ex
        except Exception:
            logging.exception('Unexpected exception in handler')
            msg_type = TMessageType.EXCEPTION
            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:
            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 TApplicationException as ex:
            logging.exception('TApplication exception in handler')
            msg_type = TMessageType.EXCEPTION
            result = ex
        except Exception:
            logging.exception('Unexpected exception in handler')
            msg_type = TMessageType.EXCEPTION
            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:
            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 TApplicationException as ex:
            logging.exception('TApplication exception in handler')
            msg_type = TMessageType.EXCEPTION
            result = ex
        except Exception:
            logging.exception('Unexpected exception in handler')
            msg_type = TMessageType.EXCEPTION
            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:
            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 TApplicationException as ex:
            logging.exception('TApplication exception in handler')
            msg_type = TMessageType.EXCEPTION
            result = ex
        except Exception:
            logging.exception('Unexpected exception in handler')
            msg_type = TMessageType.EXCEPTION
            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:
            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 TApplicationException as ex:
            logging.exception('TApplication exception in handler')
            msg_type = TMessageType.EXCEPTION
            result = ex
        except Exception:
            logging.exception('Unexpected exception in handler')
            msg_type = TMessageType.EXCEPTION
            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:
            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 TApplicationException as ex:
            logging.exception('TApplication exception in handler')
            msg_type = TMessageType.EXCEPTION
            result = ex
        except Exception:
            logging.exception('Unexpected exception in handler')
            msg_type = TMessageType.EXCEPTION
            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:
            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 TApplicationException as ex:
            logging.exception('TApplication exception in handler')
            msg_type = TMessageType.EXCEPTION
            result = ex
        except Exception:
            logging.exception('Unexpected exception in handler')
            msg_type = TMessageType.EXCEPTION
            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:
            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 TApplicationException as ex:
            logging.exception('TApplication exception in handler')
            msg_type = TMessageType.EXCEPTION
            result = ex
        except Exception:
            logging.exception('Unexpected exception in handler')
            msg_type = TMessageType.EXCEPTION
            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:
            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 TApplicationException as ex:
            logging.exception('TApplication exception in handler')
            msg_type = TMessageType.EXCEPTION
            result = ex
        except Exception:
            logging.exception('Unexpected exception in handler')
            msg_type = TMessageType.EXCEPTION
            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:
            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 TApplicationException as ex:
            logging.exception('TApplication exception in handler')
            msg_type = TMessageType.EXCEPTION
            result = ex
        except Exception:
            logging.exception('Unexpected exception in handler')
            msg_type = TMessageType.EXCEPTION
            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:
            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 TApplicationException as ex:
            logging.exception('TApplication exception in handler')
            msg_type = TMessageType.EXCEPTION
            result = ex
        except Exception:
            logging.exception('Unexpected exception in handler')
            msg_type = TMessageType.EXCEPTION
            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:
            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 TApplicationException as ex:
            logging.exception('TApplication exception in handler')
            msg_type = TMessageType.EXCEPTION
            result = ex
        except Exception:
            logging.exception('Unexpected exception in handler')
            msg_type = TMessageType.EXCEPTION
            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:
            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 TApplicationException as ex:
            logging.exception('TApplication exception in handler')
            msg_type = TMessageType.EXCEPTION
            result = ex
        except Exception:
            logging.exception('Unexpected exception in handler')
            msg_type = TMessageType.EXCEPTION
            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:
            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 TApplicationException as ex:
            logging.exception('TApplication exception in handler')
            msg_type = TMessageType.EXCEPTION
            result = ex
        except Exception:
            logging.exception('Unexpected exception in handler')
            msg_type = TMessageType.EXCEPTION
            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:
            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 TApplicationException as ex:
            logging.exception('TApplication exception in handler')
            msg_type = TMessageType.EXCEPTION
            result = ex
        except Exception:
            logging.exception('Unexpected exception in handler')
            msg_type = TMessageType.EXCEPTION
            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:
            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 TApplicationException as ex:
            logging.exception('TApplication exception in handler')
            msg_type = TMessageType.EXCEPTION
            result = ex
        except Exception:
            logging.exception('Unexpected exception in handler')
            msg_type = TMessageType.EXCEPTION
            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:
            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 TApplicationException as ex:
            logging.exception('TApplication exception in handler')
            msg_type = TMessageType.EXCEPTION
            result = ex
        except Exception:
            logging.exception('Unexpected exception in handler')
            msg_type = TMessageType.EXCEPTION
            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:
            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 TApplicationException as ex:
            logging.exception('TApplication exception in handler')
            msg_type = TMessageType.EXCEPTION
            result = ex
        except Exception:
            logging.exception('Unexpected exception in handler')
            msg_type = TMessageType.EXCEPTION
            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:
            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 TApplicationException as ex:
            logging.exception('TApplication exception in handler')
            msg_type = TMessageType.EXCEPTION
            result = ex
        except Exception:
            logging.exception('Unexpected exception in handler')
            msg_type = TMessageType.EXCEPTION
            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:
            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 TApplicationException as ex:
            logging.exception('TApplication exception in handler')
            msg_type = TMessageType.EXCEPTION
            result = ex
        except Exception:
            logging.exception('Unexpected exception in handler')
            msg_type = TMessageType.EXCEPTION
            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:
            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 TApplicationException as ex:
            logging.exception('TApplication exception in handler')
            msg_type = TMessageType.EXCEPTION
            result = ex
        except Exception:
            logging.exception('Unexpected exception in handler')
            msg_type = TMessageType.EXCEPTION
            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:
            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 TApplicationException as ex:
            logging.exception('TApplication exception in handler')
            msg_type = TMessageType.EXCEPTION
            result = ex
        except Exception:
            logging.exception('Unexpected exception in handler')
            msg_type = TMessageType.EXCEPTION
            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:
            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 TApplicationException as ex:
            logging.exception('TApplication exception in handler')
            msg_type = TMessageType.EXCEPTION
            result = ex
        except Exception:
            logging.exception('Unexpected exception in handler')
            msg_type = TMessageType.EXCEPTION
            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:
            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 TApplicationException as ex:
            logging.exception('TApplication exception in handler')
            msg_type = TMessageType.EXCEPTION
            result = ex
        except Exception:
            logging.exception('Unexpected exception in handler')
            msg_type = TMessageType.EXCEPTION
            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:
            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 TApplicationException as ex:
            logging.exception('TApplication exception in handler')
            msg_type = TMessageType.EXCEPTION
            result = ex
        except Exception:
            logging.exception('Unexpected exception in handler')
            msg_type = TMessageType.EXCEPTION
            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:
            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 TApplicationException as ex:
            logging.exception('TApplication exception in handler')
            msg_type = TMessageType.EXCEPTION
            result = ex
        except Exception:
            logging.exception('Unexpected exception in handler')
            msg_type = TMessageType.EXCEPTION
            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:
            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 TApplicationException as ex:
            logging.exception('TApplication exception in handler')
            msg_type = TMessageType.EXCEPTION
            result = ex
        except Exception:
            logging.exception('Unexpected exception in handler')
            msg_type = TMessageType.EXCEPTION
            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:
            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 TApplicationException as ex:
            logging.exception('TApplication exception in handler')
            msg_type = TMessageType.EXCEPTION
            result = ex
        except Exception:
            logging.exception('Unexpected exception in handler')
            msg_type = TMessageType.EXCEPTION
            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:
            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 TApplicationException as ex:
            logging.exception('TApplication exception in handler')
            msg_type = TMessageType.EXCEPTION
            result = ex
        except Exception:
            logging.exception('Unexpected exception in handler')
            msg_type = TMessageType.EXCEPTION
            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:
            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 TApplicationException as ex:
            logging.exception('TApplication exception in handler')
            msg_type = TMessageType.EXCEPTION
            result = ex
        except Exception:
            logging.exception('Unexpected exception in handler')
            msg_type = TMessageType.EXCEPTION
            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:
            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 TApplicationException as ex:
            logging.exception('TApplication exception in handler')
            msg_type = TMessageType.EXCEPTION
            result = ex
        except Exception:
            logging.exception('Unexpected exception in handler')
            msg_type = TMessageType.EXCEPTION
            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:
            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 TApplicationException as ex:
            logging.exception('TApplication exception in handler')
            msg_type = TMessageType.EXCEPTION
            result = ex
        except Exception:
            logging.exception('Unexpected exception in handler')
            msg_type = TMessageType.EXCEPTION
            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:
            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 TApplicationException as ex:
            logging.exception('TApplication exception in handler')
            msg_type = TMessageType.EXCEPTION
            result = ex
        except Exception:
            logging.exception('Unexpected exception in handler')
            msg_type = TMessageType.EXCEPTION
            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:
            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 TApplicationException as ex:
            logging.exception('TApplication exception in handler')
            msg_type = TMessageType.EXCEPTION
            result = ex
        except Exception:
            logging.exception('Unexpected exception in handler')
            msg_type = TMessageType.EXCEPTION
            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:
            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 TApplicationException as ex:
            logging.exception('TApplication exception in handler')
            msg_type = TMessageType.EXCEPTION
            result = ex
        except Exception:
            logging.exception('Unexpected exception in handler')
            msg_type = TMessageType.EXCEPTION
            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:
            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 TApplicationException as ex:
            logging.exception('TApplication exception in handler')
            msg_type = TMessageType.EXCEPTION
            result = ex
        except Exception:
            logging.exception('Unexpected exception in handler')
            msg_type = TMessageType.EXCEPTION
            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:
            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 TApplicationException as ex:
            logging.exception('TApplication exception in handler')
            msg_type = TMessageType.EXCEPTION
            result = ex
        except Exception:
            logging.exception('Unexpected exception in handler')
            msg_type = TMessageType.EXCEPTION
            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:
            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 TApplicationException as ex:
            logging.exception('TApplication exception in handler')
            msg_type = TMessageType.EXCEPTION
            result = ex
        except Exception:
            logging.exception('Unexpected exception in handler')
            msg_type = TMessageType.EXCEPTION
            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:
            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 TApplicationException as ex:
            logging.exception('TApplication exception in handler')
            msg_type = TMessageType.EXCEPTION
            result = ex
        except Exception:
            logging.exception('Unexpected exception in handler')
            msg_type = TMessageType.EXCEPTION
            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:
            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 TApplicationException as ex:
            logging.exception('TApplication exception in handler')
            msg_type = TMessageType.EXCEPTION
            result = ex
        except Exception:
            logging.exception('Unexpected exception in handler')
            msg_type = TMessageType.EXCEPTION
            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:
            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 TApplicationException as ex:
            logging.exception('TApplication exception in handler')
            msg_type = TMessageType.EXCEPTION
            result = ex
        except Exception:
            logging.exception('Unexpected exception in handler')
            msg_type = TMessageType.EXCEPTION
            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:
            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 TApplicationException as ex:
            logging.exception('TApplication exception in handler')
            msg_type = TMessageType.EXCEPTION
            result = ex
        except Exception:
            logging.exception('Unexpected exception in handler')
            msg_type = TMessageType.EXCEPTION
            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:
            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 TApplicationException as ex:
            logging.exception('TApplication exception in handler')
            msg_type = TMessageType.EXCEPTION
            result = ex
        except Exception:
            logging.exception('Unexpected exception in handler')
            msg_type = TMessageType.EXCEPTION
            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:
            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 TApplicationException as ex:
            logging.exception('TApplication exception in handler')
            msg_type = TMessageType.EXCEPTION
            result = ex
        except Exception:
            logging.exception('Unexpected exception in handler')
            msg_type = TMessageType.EXCEPTION
            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:
            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 TApplicationException as ex:
            logging.exception('TApplication exception in handler')
            msg_type = TMessageType.EXCEPTION
            result = ex
        except Exception:
            logging.exception('Unexpected exception in handler')
            msg_type = TMessageType.EXCEPTION
            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:
            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 TApplicationException as ex:
            logging.exception('TApplication exception in handler')
            msg_type = TMessageType.EXCEPTION
            result = ex
        except Exception:
            logging.exception('Unexpected exception in handler')
            msg_type = TMessageType.EXCEPTION
            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:
            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 TApplicationException as ex:
            logging.exception('TApplication exception in handler')
            msg_type = TMessageType.EXCEPTION
            result = ex
        except Exception:
            logging.exception('Unexpected exception in handler')
            msg_type = TMessageType.EXCEPTION
            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:
            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 TApplicationException as ex:
            logging.exception('TApplication exception in handler')
            msg_type = TMessageType.EXCEPTION
            result = ex
        except Exception:
            logging.exception('Unexpected exception in handler')
            msg_type = TMessageType.EXCEPTION
            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:
            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 TApplicationException as ex:
            logging.exception('TApplication exception in handler')
            msg_type = TMessageType.EXCEPTION
            result = ex
        except Exception:
            logging.exception('Unexpected exception in handler')
            msg_type = TMessageType.EXCEPTION
            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:
            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 TApplicationException as ex:
            logging.exception('TApplication exception in handler')
            msg_type = TMessageType.EXCEPTION
            result = ex
        except Exception:
            logging.exception('Unexpected exception in handler')
            msg_type = TMessageType.EXCEPTION
            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:
            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 TApplicationException as ex:
            logging.exception('TApplication exception in handler')
            msg_type = TMessageType.EXCEPTION
            result = ex
        except Exception:
            logging.exception('Unexpected exception in handler')
            msg_type = TMessageType.EXCEPTION
            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:
            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 TApplicationException as ex:
            logging.exception('TApplication exception in handler')
            msg_type = TMessageType.EXCEPTION
            result = ex
        except Exception:
            logging.exception('Unexpected exception in handler')
            msg_type = TMessageType.EXCEPTION
            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:
            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 TApplicationException as ex:
            logging.exception('TApplication exception in handler')
            msg_type = TMessageType.EXCEPTION
            result = ex
        except Exception:
            logging.exception('Unexpected exception in handler')
            msg_type = TMessageType.EXCEPTION
            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:
            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 TApplicationException as ex:
            logging.exception('TApplication exception in handler')
            msg_type = TMessageType.EXCEPTION
            result = ex
        except Exception:
            logging.exception('Unexpected exception in handler')
            msg_type = TMessageType.EXCEPTION
            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:
            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 TApplicationException as ex:
            logging.exception('TApplication exception in handler')
            msg_type = TMessageType.EXCEPTION
            result = ex
        except Exception:
            logging.exception('Unexpected exception in handler')
            msg_type = TMessageType.EXCEPTION
            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:
            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 TApplicationException as ex:
            logging.exception('TApplication exception in handler')
            msg_type = TMessageType.EXCEPTION
            result = ex
        except Exception:
            logging.exception('Unexpected exception in handler')
            msg_type = TMessageType.EXCEPTION
            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:
            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 TApplicationException as ex:
            logging.exception('TApplication exception in handler')
            msg_type = TMessageType.EXCEPTION
            result = ex
        except Exception:
            logging.exception('Unexpected exception in handler')
            msg_type = TMessageType.EXCEPTION
            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:
            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 TApplicationException as ex:
            logging.exception('TApplication exception in handler')
            msg_type = TMessageType.EXCEPTION
            result = ex
        except Exception:
            logging.exception('Unexpected exception in handler')
            msg_type = TMessageType.EXCEPTION
            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:
            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 TApplicationException as ex:
            logging.exception('TApplication exception in handler')
            msg_type = TMessageType.EXCEPTION
            result = ex
        except Exception:
            logging.exception('Unexpected exception in handler')
            msg_type = TMessageType.EXCEPTION
            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:
            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 TApplicationException as ex:
            logging.exception('TApplication exception in handler')
            msg_type = TMessageType.EXCEPTION
            result = ex
        except Exception:
            logging.exception('Unexpected exception in handler')
            msg_type = TMessageType.EXCEPTION
            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:
            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 TApplicationException as ex:
            logging.exception('TApplication exception in handler')
            msg_type = TMessageType.EXCEPTION
            result = ex
        except Exception:
            logging.exception('Unexpected exception in handler')
            msg_type = TMessageType.EXCEPTION
            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:
            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 TApplicationException as ex:
            logging.exception('TApplication exception in handler')
            msg_type = TMessageType.EXCEPTION
            result = ex
        except Exception:
            logging.exception('Unexpected exception in handler')
            msg_type = TMessageType.EXCEPTION
            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:
            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 TApplicationException as ex:
            logging.exception('TApplication exception in handler')
            msg_type = TMessageType.EXCEPTION
            result = ex
        except Exception:
            logging.exception('Unexpected exception in handler')
            msg_type = TMessageType.EXCEPTION
            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:
            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 TApplicationException as ex:
            logging.exception('TApplication exception in handler')
            msg_type = TMessageType.EXCEPTION
            result = ex
        except Exception:
            logging.exception('Unexpected exception in handler')
            msg_type = TMessageType.EXCEPTION
            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:
            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 TApplicationException as ex:
            logging.exception('TApplication exception in handler')
            msg_type = TMessageType.EXCEPTION
            result = ex
        except Exception:
            logging.exception('Unexpected exception in handler')
            msg_type = TMessageType.EXCEPTION
            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:
            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 TApplicationException as ex:
            logging.exception('TApplication exception in handler')
            msg_type = TMessageType.EXCEPTION
            result = ex
        except Exception:
            logging.exception('Unexpected exception in handler')
            msg_type = TMessageType.EXCEPTION
            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:
            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 TApplicationException as ex:
            logging.exception('TApplication exception in handler')
            msg_type = TMessageType.EXCEPTION
            result = ex
        except Exception:
            logging.exception('Unexpected exception in handler')
            msg_type = TMessageType.EXCEPTION
            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:
            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 TApplicationException as ex:
            logging.exception('TApplication exception in handler')
            msg_type = TMessageType.EXCEPTION
            result = ex
        except Exception:
            logging.exception('Unexpected exception in handler')
            msg_type = TMessageType.EXCEPTION
            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:
            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 TApplicationException as ex:
            logging.exception('TApplication exception in handler')
            msg_type = TMessageType.EXCEPTION
            result = ex
        except Exception:
            logging.exception('Unexpected exception in handler')
            msg_type = TMessageType.EXCEPTION
            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:
            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 TApplicationException as ex:
            logging.exception('TApplication exception in handler')
            msg_type = TMessageType.EXCEPTION
            result = ex
        except Exception:
            logging.exception('Unexpected exception in handler')
            msg_type = TMessageType.EXCEPTION
            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:
            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 TApplicationException as ex:
            logging.exception('TApplication exception in handler')
            msg_type = TMessageType.EXCEPTION
            result = ex
        except Exception:
            logging.exception('Unexpected exception in handler')
            msg_type = TMessageType.EXCEPTION
            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:
            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 TApplicationException as ex:
            logging.exception('TApplication exception in handler')
            msg_type = TMessageType.EXCEPTION
            result = ex
        except Exception:
            logging.exception('Unexpected exception in handler')
            msg_type = TMessageType.EXCEPTION
            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:
            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 TApplicationException as ex:
            logging.exception('TApplication exception in handler')
            msg_type = TMessageType.EXCEPTION
            result = ex
        except Exception:
            logging.exception('Unexpected exception in handler')
            msg_type = TMessageType.EXCEPTION
            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:
            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 TApplicationException as ex:
            logging.exception('TApplication exception in handler')
            msg_type = TMessageType.EXCEPTION
            result = ex
        except Exception:
            logging.exception('Unexpected exception in handler')
            msg_type = TMessageType.EXCEPTION
            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:
            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 TApplicationException as ex:
            logging.exception('TApplication exception in handler')
            msg_type = TMessageType.EXCEPTION
            result = ex
        except Exception:
            logging.exception('Unexpected exception in handler')
            msg_type = TMessageType.EXCEPTION
            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:
            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 TApplicationException as ex:
            logging.exception('TApplication exception in handler')
            msg_type = TMessageType.EXCEPTION
            result = ex
        except Exception:
            logging.exception('Unexpected exception in handler')
            msg_type = TMessageType.EXCEPTION
            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:
            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 TApplicationException as ex:
            logging.exception('TApplication exception in handler')
            msg_type = TMessageType.EXCEPTION
            result = ex
        except Exception:
            logging.exception('Unexpected exception in handler')
            msg_type = TMessageType.EXCEPTION
            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:
            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 TApplicationException as ex:
            logging.exception('TApplication exception in handler')
            msg_type = TMessageType.EXCEPTION
            result = ex
        except Exception:
            logging.exception('Unexpected exception in handler')
            msg_type = TMessageType.EXCEPTION
            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:
            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 TApplicationException as ex:
            logging.exception('TApplication exception in handler')
            msg_type = TMessageType.EXCEPTION
            result = ex
        except Exception:
            logging.exception('Unexpected exception in handler')
            msg_type = TMessageType.EXCEPTION
            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:
            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 TApplicationException as ex:
            logging.exception('TApplication exception in handler')
            msg_type = TMessageType.EXCEPTION
            result = ex
        except Exception:
            logging.exception('Unexpected exception in handler')
            msg_type = TMessageType.EXCEPTION
            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:
            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 TApplicationException as ex:
            logging.exception('TApplication exception in handler')
            msg_type = TMessageType.EXCEPTION
            result = ex
        except Exception:
            logging.exception('Unexpected exception in handler')
            msg_type = TMessageType.EXCEPTION
            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:
            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 TApplicationException as ex:
            logging.exception('TApplication exception in handler')
            msg_type = TMessageType.EXCEPTION
            result = ex
        except Exception:
            logging.exception('Unexpected exception in handler')
            msg_type = TMessageType.EXCEPTION
            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:
            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 TApplicationException as ex:
            logging.exception('TApplication exception in handler')
            msg_type = TMessageType.EXCEPTION
            result = ex
        except Exception:
            logging.exception('Unexpected exception in handler')
            msg_type = TMessageType.EXCEPTION
            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:
            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 TApplicationException as ex:
            logging.exception('TApplication exception in handler')
            msg_type = TMessageType.EXCEPTION
            result = ex
        except Exception:
            logging.exception('Unexpected exception in handler')
            msg_type = TMessageType.EXCEPTION
            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:
            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 TApplicationException as ex:
            logging.exception('TApplication exception in handler')
            msg_type = TMessageType.EXCEPTION
            result = ex
        except Exception:
            logging.exception('Unexpected exception in handler')
            msg_type = TMessageType.EXCEPTION
            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:
            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 TApplicationException as ex:
            logging.exception('TApplication exception in handler')
            msg_type = TMessageType.EXCEPTION
            result = ex
        except Exception:
            logging.exception('Unexpected exception in handler')
            msg_type = TMessageType.EXCEPTION
            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:
            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 TApplicationException as ex:
            logging.exception('TApplication exception in handler')
            msg_type = TMessageType.EXCEPTION
            result = ex
        except Exception:
            logging.exception('Unexpected exception in handler')
            msg_type = TMessageType.EXCEPTION
            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:
            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 TApplicationException as ex:
            logging.exception('TApplication exception in handler')
            msg_type = TMessageType.EXCEPTION
            result = ex
        except Exception:
            logging.exception('Unexpected exception in handler')
            msg_type = TMessageType.EXCEPTION
            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:
            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 TApplicationException as ex:
            logging.exception('TApplication exception in handler')
            msg_type = TMessageType.EXCEPTION
            result = ex
        except Exception:
            logging.exception('Unexpected exception in handler')
            msg_type = TMessageType.EXCEPTION
            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:
            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 TApplicationException as ex:
            logging.exception('TApplication exception in handler')
            msg_type = TMessageType.EXCEPTION
            result = ex
        except Exception:
            logging.exception('Unexpected exception in handler')
            msg_type = TMessageType.EXCEPTION
            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:
            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 TApplicationException as ex:
            logging.exception('TApplication exception in handler')
            msg_type = TMessageType.EXCEPTION
            result = ex
        except Exception:
            logging.exception('Unexpected exception in handler')
            msg_type = TMessageType.EXCEPTION
            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:
            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 TApplicationException as ex:
            logging.exception('TApplication exception in handler')
            msg_type = TMessageType.EXCEPTION
            result = ex
        except Exception:
            logging.exception('Unexpected exception in handler')
            msg_type = TMessageType.EXCEPTION
            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:
            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 TApplicationException as ex:
            logging.exception('TApplication exception in handler')
            msg_type = TMessageType.EXCEPTION
            result = ex
        except Exception:
            logging.exception('Unexpected exception in handler')
            msg_type = TMessageType.EXCEPTION
            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:
            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 TApplicationException as ex:
            logging.exception('TApplication exception in handler')
            msg_type = TMessageType.EXCEPTION
            result = ex
        except Exception:
            logging.exception('Unexpected exception in handler')
            msg_type = TMessageType.EXCEPTION
            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:
            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 TApplicationException as ex:
            logging.exception('TApplication exception in handler')
            msg_type = TMessageType.EXCEPTION
            result = ex
        except Exception:
            logging.exception('Unexpected exception in handler')
            msg_type = TMessageType.EXCEPTION
            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:
            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 TApplicationException as ex:
            logging.exception('TApplication exception in handler')
            msg_type = TMessageType.EXCEPTION
            result = ex
        except Exception:
            logging.exception('Unexpected exception in handler')
            msg_type = TMessageType.EXCEPTION
            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:
            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 TApplicationException as ex:
            logging.exception('TApplication exception in handler')
            msg_type = TMessageType.EXCEPTION
            result = ex
        except Exception:
            logging.exception('Unexpected exception in handler')
            msg_type = TMessageType.EXCEPTION
            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:
            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 TApplicationException as ex:
            logging.exception('TApplication exception in handler')
            msg_type = TMessageType.EXCEPTION
            result = ex
        except Exception:
            logging.exception('Unexpected exception in handler')
            msg_type = TMessageType.EXCEPTION
            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:
            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 TApplicationException as ex:
            logging.exception('TApplication exception in handler')
            msg_type = TMessageType.EXCEPTION
            result = ex
        except Exception:
            logging.exception('Unexpected exception in handler')
            msg_type = TMessageType.EXCEPTION
            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:
            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 TApplicationException as ex:
            logging.exception('TApplication exception in handler')
            msg_type = TMessageType.EXCEPTION
            result = ex
        except Exception:
            logging.exception('Unexpected exception in handler')
            msg_type = TMessageType.EXCEPTION
            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:
            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 TApplicationException as ex:
            logging.exception('TApplication exception in handler')
            msg_type = TMessageType.EXCEPTION
            result = ex
        except Exception:
            logging.exception('Unexpected exception in handler')
            msg_type = TMessageType.EXCEPTION
            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:
            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 TApplicationException as ex:
            logging.exception('TApplication exception in handler')
            msg_type = TMessageType.EXCEPTION
            result = ex
        except Exception:
            logging.exception('Unexpected exception in handler')
            msg_type = TMessageType.EXCEPTION
            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:
            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 TApplicationException as ex:
            logging.exception('TApplication exception in handler')
            msg_type = TMessageType.EXCEPTION
            result = ex
        except Exception:
            logging.exception('Unexpected exception in handler')
            msg_type = TMessageType.EXCEPTION
            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:
            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 TApplicationException as ex:
            logging.exception('TApplication exception in handler')
            msg_type = TMessageType.EXCEPTION
            result = ex
        except Exception:
            logging.exception('Unexpected exception in handler')
            msg_type = TMessageType.EXCEPTION
            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:
            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 TApplicationException as ex:
            logging.exception('TApplication exception in handler')
            msg_type = TMessageType.EXCEPTION
            result = ex
        except Exception:
            logging.exception('Unexpected exception in handler')
            msg_type = TMessageType.EXCEPTION
            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:
            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 TApplicationException as ex:
            logging.exception('TApplication exception in handler')
            msg_type = TMessageType.EXCEPTION
            result = ex
        except Exception:
            logging.exception('Unexpected exception in handler')
            msg_type = TMessageType.EXCEPTION
            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:
            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 TApplicationException as ex:
            logging.exception('TApplication exception in handler')
            msg_type = TMessageType.EXCEPTION
            result = ex
        except Exception:
            logging.exception('Unexpected exception in handler')
            msg_type = TMessageType.EXCEPTION
            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:
            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 TApplicationException as ex:
            logging.exception('TApplication exception in handler')
            msg_type = TMessageType.EXCEPTION
            result = ex
        except Exception:
            logging.exception('Unexpected exception in handler')
            msg_type = TMessageType.EXCEPTION
            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:
            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 TApplicationException as ex:
            logging.exception('TApplication exception in handler')
            msg_type = TMessageType.EXCEPTION
            result = ex
        except Exception:
            logging.exception('Unexpected exception in handler')
            msg_type = TMessageType.EXCEPTION
            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

    """


    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', errors='replace') 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', errors='replace') if sys.version_info[0] == 2 else iprot.readString()
                else:
                    iprot.skip(ftype)
            else:
                iprot.skip(ftype)
            iprot.readFieldEnd()
        iprot.readStructEnd()

    def write(self, oprot):
        if oprot._fast_encode is not None and self.thrift_spec is not None:
            oprot.trans.write(oprot._fast_encode(self, [self.__class__, self.thrift_spec]))
            return
        oprot.writeStructBegin('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)
all_structs.append(isUserExists_args)
isUserExists_args.thrift_spec = (
    None,  # 0
    (1, TType.STRUCT, 'authzToken', [airavata.model.security.ttypes.AuthzToken, None], None, ),  # 1
    (2, TType.STRING, 'gatewayId', 'UTF8', None, ),  # 2
    (3, TType.STRING, 'userName', 'UTF8', None, ),  # 3
)


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

    """


    def __init__(self, success=None, ire=None, ace=None, ase=None, ae=None,):
        self.success = success
        self.ire = ire
        self.ace = ace
        self.ase = ase
        self.ae = ae

    def read(self, iprot):
        if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None:
            iprot._fast_decode(self, iprot, [self.__class__, 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.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 2:
                if ftype == TType.STRUCT:
                    self.ace = airavata.api.error.ttypes.AiravataClientException.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 3:
                if ftype == TType.STRUCT:
                    self.ase = airavata.api.error.ttypes.AiravataSystemException.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 4:
                if ftype == TType.STRUCT:
                    self.ae = airavata.api.error.ttypes.AuthorizationException.read(iprot)
                else:
                    iprot.skip(ftype)
            else:
                iprot.skip(ftype)
            iprot.readFieldEnd()
        iprot.readStructEnd()

    def write(self, oprot):
        if oprot._fast_encode is 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)
all_structs.append(isUserExists_result)
isUserExists_result.thrift_spec = (
    (0, TType.BOOL, 'success', None, None, ),  # 0
    (1, TType.STRUCT, 'ire', [airavata.api.error.ttypes.InvalidRequestException, None], None, ),  # 1
    (2, TType.STRUCT, 'ace', [airavata.api.error.ttypes.AiravataClientException, None], None, ),  # 2
    (3, TType.STRUCT, 'ase', [airavata.api.error.ttypes.AiravataSystemException, None], None, ),  # 3
    (4, TType.STRUCT, 'ae', [airavata.api.error.ttypes.AuthorizationException, None], None, ),  # 4
)


class addGateway_args(object):
    """
    Attributes:
     - authzToken
     - gateway

    """


    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)
all_structs.append(addGateway_args)
addGateway_args.thrift_spec = (
    None,  # 0
    (1, TType.STRUCT, 'authzToken', [airavata.model.security.ttypes.AuthzToken, None], None, ),  # 1
    (2, TType.STRUCT, 'gateway', [airavata.model.workspace.ttypes.Gateway, None], None, ),  # 2
)


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

    """


    def __init__(self, success=None, ire=None, ace=None, ase=None, ae=None,):
        self.success = success
        self.ire = ire
        self.ace = ace
        self.ase = ase
        self.ae = ae

    def read(self, iprot):
        if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None:
            iprot._fast_decode(self, iprot, [self.__class__, 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', errors='replace') 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.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 2:
                if ftype == TType.STRUCT:
                    self.ace = airavata.api.error.ttypes.AiravataClientException.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 3:
                if ftype == TType.STRUCT:
                    self.ase = airavata.api.error.ttypes.AiravataSystemException.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 4:
                if ftype == TType.STRUCT:
                    self.ae = airavata.api.error.ttypes.AuthorizationException.read(iprot)
                else:
                    iprot.skip(ftype)
            else:
                iprot.skip(ftype)
            iprot.readFieldEnd()
        iprot.readStructEnd()

    def write(self, oprot):
        if oprot._fast_encode is 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)
all_structs.append(addGateway_result)
addGateway_result.thrift_spec = (
    (0, TType.STRING, 'success', 'UTF8', None, ),  # 0
    (1, TType.STRUCT, 'ire', [airavata.api.error.ttypes.InvalidRequestException, None], None, ),  # 1
    (2, TType.STRUCT, 'ace', [airavata.api.error.ttypes.AiravataClientException, None], None, ),  # 2
    (3, TType.STRUCT, 'ase', [airavata.api.error.ttypes.AiravataSystemException, None], None, ),  # 3
    (4, TType.STRUCT, 'ae', [airavata.api.error.ttypes.AuthorizationException, None], None, ),  # 4
)


class getAllUsersInGateway_args(object):
    """
    Attributes:
     - authzToken
     - gatewayId

    """


    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', errors='replace') if sys.version_info[0] == 2 else iprot.readString()
                else:
                    iprot.skip(ftype)
            else:
                iprot.skip(ftype)
            iprot.readFieldEnd()
        iprot.readStructEnd()

    def write(self, oprot):
        if oprot._fast_encode is not None and self.thrift_spec is not None:
            oprot.trans.write(oprot._fast_encode(self, [self.__class__, self.thrift_spec]))
            return
        oprot.writeStructBegin('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)
all_structs.append(getAllUsersInGateway_args)
getAllUsersInGateway_args.thrift_spec = (
    None,  # 0
    (1, TType.STRUCT, 'authzToken', [airavata.model.security.ttypes.AuthzToken, None], None, ),  # 1
    (2, TType.STRING, 'gatewayId', 'UTF8', None, ),  # 2
)


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

    """


    def __init__(self, success=None, ire=None, ace=None, ase=None, ae=None,):
        self.success = success
        self.ire = ire
        self.ace = ace
        self.ase = ase
        self.ae = ae

    def read(self, iprot):
        if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None:
            iprot._fast_decode(self, iprot, [self.__class__, 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', errors='replace') 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.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 2:
                if ftype == TType.STRUCT:
                    self.ace = airavata.api.error.ttypes.AiravataClientException.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 3:
                if ftype == TType.STRUCT:
                    self.ase = airavata.api.error.ttypes.AiravataSystemException.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 4:
                if ftype == TType.STRUCT:
                    self.ae = airavata.api.error.ttypes.AuthorizationException.read(iprot)
                else:
                    iprot.skip(ftype)
            else:
                iprot.skip(ftype)
            iprot.readFieldEnd()
        iprot.readStructEnd()

    def write(self, oprot):
        if oprot._fast_encode is 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)
all_structs.append(getAllUsersInGateway_result)
getAllUsersInGateway_result.thrift_spec = (
    (0, TType.LIST, 'success', (TType.STRING, 'UTF8', False), None, ),  # 0
    (1, TType.STRUCT, 'ire', [airavata.api.error.ttypes.InvalidRequestException, None], None, ),  # 1
    (2, TType.STRUCT, 'ace', [airavata.api.error.ttypes.AiravataClientException, None], None, ),  # 2
    (3, TType.STRUCT, 'ase', [airavata.api.error.ttypes.AiravataSystemException, None], None, ),  # 3
    (4, TType.STRUCT, 'ae', [airavata.api.error.ttypes.AuthorizationException, None], None, ),  # 4
)


class updateGateway_args(object):
    """
    Attributes:
     - authzToken
     - gatewayId
     - updatedGateway

    """


    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', errors='replace') 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)
all_structs.append(updateGateway_args)
updateGateway_args.thrift_spec = (
    None,  # 0
    (1, TType.STRUCT, 'authzToken', [airavata.model.security.ttypes.AuthzToken, None], None, ),  # 1
    (2, TType.STRING, 'gatewayId', 'UTF8', None, ),  # 2
    (3, TType.STRUCT, 'updatedGateway', [airavata.model.workspace.ttypes.Gateway, None], None, ),  # 3
)


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

    """


    def __init__(self, success=None, ire=None, ace=None, ase=None, ae=None,):
        self.success = success
        self.ire = ire
        self.ace = ace
        self.ase = ase
        self.ae = ae

    def read(self, iprot):
        if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None:
            iprot._fast_decode(self, iprot, [self.__class__, 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.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 2:
                if ftype == TType.STRUCT:
                    self.ace = airavata.api.error.ttypes.AiravataClientException.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 3:
                if ftype == TType.STRUCT:
                    self.ase = airavata.api.error.ttypes.AiravataSystemException.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 4:
                if ftype == TType.STRUCT:
                    self.ae = airavata.api.error.ttypes.AuthorizationException.read(iprot)
                else:
                    iprot.skip(ftype)
            else:
                iprot.skip(ftype)
            iprot.readFieldEnd()
        iprot.readStructEnd()

    def write(self, oprot):
        if oprot._fast_encode is 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)
all_structs.append(updateGateway_result)
updateGateway_result.thrift_spec = (
    (0, TType.BOOL, 'success', None, None, ),  # 0
    (1, TType.STRUCT, 'ire', [airavata.api.error.ttypes.InvalidRequestException, None], None, ),  # 1
    (2, TType.STRUCT, 'ace', [airavata.api.error.ttypes.AiravataClientException, None], None, ),  # 2
    (3, TType.STRUCT, 'ase', [airavata.api.error.ttypes.AiravataSystemException, None], None, ),  # 3
    (4, TType.STRUCT, 'ae', [airavata.api.error.ttypes.AuthorizationException, None], None, ),  # 4
)


class getGateway_args(object):
    """
    Attributes:
     - authzToken
     - gatewayId

    """


    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', errors='replace') if sys.version_info[0] == 2 else iprot.readString()
                else:
                    iprot.skip(ftype)
            else:
                iprot.skip(ftype)
            iprot.readFieldEnd()
        iprot.readStructEnd()

    def write(self, oprot):
        if oprot._fast_encode is not None and self.thrift_spec is not None:
            oprot.trans.write(oprot._fast_encode(self, [self.__class__, self.thrift_spec]))
            return
        oprot.writeStructBegin('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)
all_structs.append(getGateway_args)
getGateway_args.thrift_spec = (
    None,  # 0
    (1, TType.STRUCT, 'authzToken', [airavata.model.security.ttypes.AuthzToken, None], None, ),  # 1
    (2, TType.STRING, 'gatewayId', 'UTF8', None, ),  # 2
)


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

    """


    def __init__(self, success=None, ire=None, ace=None, ase=None, ae=None,):
        self.success = success
        self.ire = ire
        self.ace = ace
        self.ase = ase
        self.ae = ae

    def read(self, iprot):
        if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None:
            iprot._fast_decode(self, iprot, [self.__class__, 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.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 2:
                if ftype == TType.STRUCT:
                    self.ace = airavata.api.error.ttypes.AiravataClientException.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 3:
                if ftype == TType.STRUCT:
                    self.ase = airavata.api.error.ttypes.AiravataSystemException.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 4:
                if ftype == TType.STRUCT:
                    self.ae = airavata.api.error.ttypes.AuthorizationException.read(iprot)
                else:
                    iprot.skip(ftype)
            else:
                iprot.skip(ftype)
            iprot.readFieldEnd()
        iprot.readStructEnd()

    def write(self, oprot):
        if oprot._fast_encode is 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)
all_structs.append(getGateway_result)
getGateway_result.thrift_spec = (
    (0, TType.STRUCT, 'success', [airavata.model.workspace.ttypes.Gateway, None], None, ),  # 0
    (1, TType.STRUCT, 'ire', [airavata.api.error.ttypes.InvalidRequestException, None], None, ),  # 1
    (2, TType.STRUCT, 'ace', [airavata.api.error.ttypes.AiravataClientException, None], None, ),  # 2
    (3, TType.STRUCT, 'ase', [airavata.api.error.ttypes.AiravataSystemException, None], None, ),  # 3
    (4, TType.STRUCT, 'ae', [airavata.api.error.ttypes.AuthorizationException, None], None, ),  # 4
)


class deleteGateway_args(object):
    """
    Attributes:
     - authzToken
     - gatewayId

    """


    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', errors='replace') if sys.version_info[0] == 2 else iprot.readString()
                else:
                    iprot.skip(ftype)
            else:
                iprot.skip(ftype)
            iprot.readFieldEnd()
        iprot.readStructEnd()

    def write(self, oprot):
        if oprot._fast_encode is not None and self.thrift_spec is not None:
            oprot.trans.write(oprot._fast_encode(self, [self.__class__, self.thrift_spec]))
            return
        oprot.writeStructBegin('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)
all_structs.append(deleteGateway_args)
deleteGateway_args.thrift_spec = (
    None,  # 0
    (1, TType.STRUCT, 'authzToken', [airavata.model.security.ttypes.AuthzToken, None], None, ),  # 1
    (2, TType.STRING, 'gatewayId', 'UTF8', None, ),  # 2
)


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

    """


    def __init__(self, success=None, ire=None, ace=None, ase=None, ae=None,):
        self.success = success
        self.ire = ire
        self.ace = ace
        self.ase = ase
        self.ae = ae

    def read(self, iprot):
        if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None:
            iprot._fast_decode(self, iprot, [self.__class__, 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.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 2:
                if ftype == TType.STRUCT:
                    self.ace = airavata.api.error.ttypes.AiravataClientException.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 3:
                if ftype == TType.STRUCT:
                    self.ase = airavata.api.error.ttypes.AiravataSystemException.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 4:
                if ftype == TType.STRUCT:
                    self.ae = airavata.api.error.ttypes.AuthorizationException.read(iprot)
                else:
                    iprot.skip(ftype)
            else:
                iprot.skip(ftype)
            iprot.readFieldEnd()
        iprot.readStructEnd()

    def write(self, oprot):
        if oprot._fast_encode is 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)
all_structs.append(deleteGateway_result)
deleteGateway_result.thrift_spec = (
    (0, TType.BOOL, 'success', None, None, ),  # 0
    (1, TType.STRUCT, 'ire', [airavata.api.error.ttypes.InvalidRequestException, None], None, ),  # 1
    (2, TType.STRUCT, 'ace', [airavata.api.error.ttypes.AiravataClientException, None], None, ),  # 2
    (3, TType.STRUCT, 'ase', [airavata.api.error.ttypes.AiravataSystemException, None], None, ),  # 3
    (4, TType.STRUCT, 'ae', [airavata.api.error.ttypes.AuthorizationException, None], None, ),  # 4
)


class getAllGateways_args(object):
    """
    Attributes:
     - authzToken

    """


    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)
all_structs.append(getAllGateways_args)
getAllGateways_args.thrift_spec = (
    None,  # 0
    (1, TType.STRUCT, 'authzToken', [airavata.model.security.ttypes.AuthzToken, None], None, ),  # 1
)


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

    """


    def __init__(self, success=None, ire=None, ace=None, ase=None, ae=None,):
        self.success = success
        self.ire = ire
        self.ace = ace
        self.ase = ase
        self.ae = ae

    def read(self, iprot):
        if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None:
            iprot._fast_decode(self, iprot, [self.__class__, 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.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 2:
                if ftype == TType.STRUCT:
                    self.ace = airavata.api.error.ttypes.AiravataClientException.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 3:
                if ftype == TType.STRUCT:
                    self.ase = airavata.api.error.ttypes.AiravataSystemException.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 4:
                if ftype == TType.STRUCT:
                    self.ae = airavata.api.error.ttypes.AuthorizationException.read(iprot)
                else:
                    iprot.skip(ftype)
            else:
                iprot.skip(ftype)
            iprot.readFieldEnd()
        iprot.readStructEnd()

    def write(self, oprot):
        if oprot._fast_encode is 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)
all_structs.append(getAllGateways_result)
getAllGateways_result.thrift_spec = (
    (0, TType.LIST, 'success', (TType.STRUCT, [airavata.model.workspace.ttypes.Gateway, None], False), None, ),  # 0
    (1, TType.STRUCT, 'ire', [airavata.api.error.ttypes.InvalidRequestException, None], None, ),  # 1
    (2, TType.STRUCT, 'ace', [airavata.api.error.ttypes.AiravataClientException, None], None, ),  # 2
    (3, TType.STRUCT, 'ase', [airavata.api.error.ttypes.AiravataSystemException, None], None, ),  # 3
    (4, TType.STRUCT, 'ae', [airavata.api.error.ttypes.AuthorizationException, None], None, ),  # 4
)


class isGatewayExist_args(object):
    """
    Attributes:
     - authzToken
     - gatewayId

    """


    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', errors='replace') if sys.version_info[0] == 2 else iprot.readString()
                else:
                    iprot.skip(ftype)
            else:
                iprot.skip(ftype)
            iprot.readFieldEnd()
        iprot.readStructEnd()

    def write(self, oprot):
        if oprot._fast_encode is not None and self.thrift_spec is not None:
            oprot.trans.write(oprot._fast_encode(self, [self.__class__, self.thrift_spec]))
            return
        oprot.writeStructBegin('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)
all_structs.append(isGatewayExist_args)
isGatewayExist_args.thrift_spec = (
    None,  # 0
    (1, TType.STRUCT, 'authzToken', [airavata.model.security.ttypes.AuthzToken, None], None, ),  # 1
    (2, TType.STRING, 'gatewayId', 'UTF8', None, ),  # 2
)


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

    """


    def __init__(self, success=None, ire=None, ace=None, ase=None, ae=None,):
        self.success = success
        self.ire = ire
        self.ace = ace
        self.ase = ase
        self.ae = ae

    def read(self, iprot):
        if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None:
            iprot._fast_decode(self, iprot, [self.__class__, 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.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 2:
                if ftype == TType.STRUCT:
                    self.ace = airavata.api.error.ttypes.AiravataClientException.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 3:
                if ftype == TType.STRUCT:
                    self.ase = airavata.api.error.ttypes.AiravataSystemException.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 4:
                if ftype == TType.STRUCT:
                    self.ae = airavata.api.error.ttypes.AuthorizationException.read(iprot)
                else:
                    iprot.skip(ftype)
            else:
                iprot.skip(ftype)
            iprot.readFieldEnd()
        iprot.readStructEnd()

    def write(self, oprot):
        if oprot._fast_encode is 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)
all_structs.append(isGatewayExist_result)
isGatewayExist_result.thrift_spec = (
    (0, TType.BOOL, 'success', None, None, ),  # 0
    (1, TType.STRUCT, 'ire', [airavata.api.error.ttypes.InvalidRequestException, None], None, ),  # 1
    (2, TType.STRUCT, 'ace', [airavata.api.error.ttypes.AiravataClientException, None], None, ),  # 2
    (3, TType.STRUCT, 'ase', [airavata.api.error.ttypes.AiravataSystemException, None], None, ),  # 3
    (4, TType.STRUCT, 'ae', [airavata.api.error.ttypes.AuthorizationException, None], None, ),  # 4
)


class createNotification_args(object):
    """
    Attributes:
     - authzToken
     - notification

    """


    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)
all_structs.append(createNotification_args)
createNotification_args.thrift_spec = (
    None,  # 0
    (1, TType.STRUCT, 'authzToken', [airavata.model.security.ttypes.AuthzToken, None], None, ),  # 1
    (2, TType.STRUCT, 'notification', [airavata.model.workspace.ttypes.Notification, None], None, ),  # 2
)


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

    """


    def __init__(self, success=None, ire=None, ace=None, ase=None, ae=None,):
        self.success = success
        self.ire = ire
        self.ace = ace
        self.ase = ase
        self.ae = ae

    def read(self, iprot):
        if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None:
            iprot._fast_decode(self, iprot, [self.__class__, 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', errors='replace') 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.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 2:
                if ftype == TType.STRUCT:
                    self.ace = airavata.api.error.ttypes.AiravataClientException.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 3:
                if ftype == TType.STRUCT:
                    self.ase = airavata.api.error.ttypes.AiravataSystemException.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 4:
                if ftype == TType.STRUCT:
                    self.ae = airavata.api.error.ttypes.AuthorizationException.read(iprot)
                else:
                    iprot.skip(ftype)
            else:
                iprot.skip(ftype)
            iprot.readFieldEnd()
        iprot.readStructEnd()

    def write(self, oprot):
        if oprot._fast_encode is 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)
all_structs.append(createNotification_result)
createNotification_result.thrift_spec = (
    (0, TType.STRING, 'success', 'UTF8', None, ),  # 0
    (1, TType.STRUCT, 'ire', [airavata.api.error.ttypes.InvalidRequestException, None], None, ),  # 1
    (2, TType.STRUCT, 'ace', [airavata.api.error.ttypes.AiravataClientException, None], None, ),  # 2
    (3, TType.STRUCT, 'ase', [airavata.api.error.ttypes.AiravataSystemException, None], None, ),  # 3
    (4, TType.STRUCT, 'ae', [airavata.api.error.ttypes.AuthorizationException, None], None, ),  # 4
)


class updateNotification_args(object):
    """
    Attributes:
     - authzToken
     - notification

    """


    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)
all_structs.append(updateNotification_args)
updateNotification_args.thrift_spec = (
    None,  # 0
    (1, TType.STRUCT, 'authzToken', [airavata.model.security.ttypes.AuthzToken, None], None, ),  # 1
    (2, TType.STRUCT, 'notification', [airavata.model.workspace.ttypes.Notification, None], None, ),  # 2
)


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

    """


    def __init__(self, success=None, ire=None, ace=None, ase=None, ae=None,):
        self.success = success
        self.ire = ire
        self.ace = ace
        self.ase = ase
        self.ae = ae

    def read(self, iprot):
        if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None:
            iprot._fast_decode(self, iprot, [self.__class__, 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.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 2:
                if ftype == TType.STRUCT:
                    self.ace = airavata.api.error.ttypes.AiravataClientException.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 3:
                if ftype == TType.STRUCT:
                    self.ase = airavata.api.error.ttypes.AiravataSystemException.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 4:
                if ftype == TType.STRUCT:
                    self.ae = airavata.api.error.ttypes.AuthorizationException.read(iprot)
                else:
                    iprot.skip(ftype)
            else:
                iprot.skip(ftype)
            iprot.readFieldEnd()
        iprot.readStructEnd()

    def write(self, oprot):
        if oprot._fast_encode is 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)
all_structs.append(updateNotification_result)
updateNotification_result.thrift_spec = (
    (0, TType.BOOL, 'success', None, None, ),  # 0
    (1, TType.STRUCT, 'ire', [airavata.api.error.ttypes.InvalidRequestException, None], None, ),  # 1
    (2, TType.STRUCT, 'ace', [airavata.api.error.ttypes.AiravataClientException, None], None, ),  # 2
    (3, TType.STRUCT, 'ase', [airavata.api.error.ttypes.AiravataSystemException, None], None, ),  # 3
    (4, TType.STRUCT, 'ae', [airavata.api.error.ttypes.AuthorizationException, None], None, ),  # 4
)


class deleteNotification_args(object):
    """
    Attributes:
     - authzToken
     - gatewayId
     - notificationId

    """


    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', errors='replace') 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', errors='replace') if sys.version_info[0] == 2 else iprot.readString()
                else:
                    iprot.skip(ftype)
            else:
                iprot.skip(ftype)
            iprot.readFieldEnd()
        iprot.readStructEnd()

    def write(self, oprot):
        if oprot._fast_encode is not None and self.thrift_spec is not None:
            oprot.trans.write(oprot._fast_encode(self, [self.__class__, self.thrift_spec]))
            return
        oprot.writeStructBegin('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)
all_structs.append(deleteNotification_args)
deleteNotification_args.thrift_spec = (
    None,  # 0
    (1, TType.STRUCT, 'authzToken', [airavata.model.security.ttypes.AuthzToken, None], None, ),  # 1
    (2, TType.STRING, 'gatewayId', 'UTF8', None, ),  # 2
    (3, TType.STRING, 'notificationId', 'UTF8', None, ),  # 3
)


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

    """


    def __init__(self, success=None, ire=None, ace=None, ase=None, ae=None,):
        self.success = success
        self.ire = ire
        self.ace = ace
        self.ase = ase
        self.ae = ae

    def read(self, iprot):
        if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None:
            iprot._fast_decode(self, iprot, [self.__class__, 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.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 2:
                if ftype == TType.STRUCT:
                    self.ace = airavata.api.error.ttypes.AiravataClientException.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 3:
                if ftype == TType.STRUCT:
                    self.ase = airavata.api.error.ttypes.AiravataSystemException.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 4:
                if ftype == TType.STRUCT:
                    self.ae = airavata.api.error.ttypes.AuthorizationException.read(iprot)
                else:
                    iprot.skip(ftype)
            else:
                iprot.skip(ftype)
            iprot.readFieldEnd()
        iprot.readStructEnd()

    def write(self, oprot):
        if oprot._fast_encode is 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)
all_structs.append(deleteNotification_result)
deleteNotification_result.thrift_spec = (
    (0, TType.BOOL, 'success', None, None, ),  # 0
    (1, TType.STRUCT, 'ire', [airavata.api.error.ttypes.InvalidRequestException, None], None, ),  # 1
    (2, TType.STRUCT, 'ace', [airavata.api.error.ttypes.AiravataClientException, None], None, ),  # 2
    (3, TType.STRUCT, 'ase', [airavata.api.error.ttypes.AiravataSystemException, None], None, ),  # 3
    (4, TType.STRUCT, 'ae', [airavata.api.error.ttypes.AuthorizationException, None], None, ),  # 4
)


class getNotification_args(object):
    """
    Attributes:
     - authzToken
     - gatewayId
     - notificationId

    """


    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', errors='replace') 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', errors='replace') if sys.version_info[0] == 2 else iprot.readString()
                else:
                    iprot.skip(ftype)
            else:
                iprot.skip(ftype)
            iprot.readFieldEnd()
        iprot.readStructEnd()

    def write(self, oprot):
        if oprot._fast_encode is not None and self.thrift_spec is not None:
            oprot.trans.write(oprot._fast_encode(self, [self.__class__, self.thrift_spec]))
            return
        oprot.writeStructBegin('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)
all_structs.append(getNotification_args)
getNotification_args.thrift_spec = (
    None,  # 0
    (1, TType.STRUCT, 'authzToken', [airavata.model.security.ttypes.AuthzToken, None], None, ),  # 1
    (2, TType.STRING, 'gatewayId', 'UTF8', None, ),  # 2
    (3, TType.STRING, 'notificationId', 'UTF8', None, ),  # 3
)


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

    """


    def __init__(self, success=None, ire=None, ace=None, ase=None, ae=None,):
        self.success = success
        self.ire = ire
        self.ace = ace
        self.ase = ase
        self.ae = ae

    def read(self, iprot):
        if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None:
            iprot._fast_decode(self, iprot, [self.__class__, 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.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 2:
                if ftype == TType.STRUCT:
                    self.ace = airavata.api.error.ttypes.AiravataClientException.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 3:
                if ftype == TType.STRUCT:
                    self.ase = airavata.api.error.ttypes.AiravataSystemException.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 4:
                if ftype == TType.STRUCT:
                    self.ae = airavata.api.error.ttypes.AuthorizationException.read(iprot)
                else:
                    iprot.skip(ftype)
            else:
                iprot.skip(ftype)
            iprot.readFieldEnd()
        iprot.readStructEnd()

    def write(self, oprot):
        if oprot._fast_encode is 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)
all_structs.append(getNotification_result)
getNotification_result.thrift_spec = (
    (0, TType.STRUCT, 'success', [airavata.model.workspace.ttypes.Notification, None], None, ),  # 0
    (1, TType.STRUCT, 'ire', [airavata.api.error.ttypes.InvalidRequestException, None], None, ),  # 1
    (2, TType.STRUCT, 'ace', [airavata.api.error.ttypes.AiravataClientException, None], None, ),  # 2
    (3, TType.STRUCT, 'ase', [airavata.api.error.ttypes.AiravataSystemException, None], None, ),  # 3
    (4, TType.STRUCT, 'ae', [airavata.api.error.ttypes.AuthorizationException, None], None, ),  # 4
)


class getAllNotifications_args(object):
    """
    Attributes:
     - authzToken
     - gatewayId

    """


    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', errors='replace') if sys.version_info[0] == 2 else iprot.readString()
                else:
                    iprot.skip(ftype)
            else:
                iprot.skip(ftype)
            iprot.readFieldEnd()
        iprot.readStructEnd()

    def write(self, oprot):
        if oprot._fast_encode is not None and self.thrift_spec is not None:
            oprot.trans.write(oprot._fast_encode(self, [self.__class__, self.thrift_spec]))
            return
        oprot.writeStructBegin('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)
all_structs.append(getAllNotifications_args)
getAllNotifications_args.thrift_spec = (
    None,  # 0
    (1, TType.STRUCT, 'authzToken', [airavata.model.security.ttypes.AuthzToken, None], None, ),  # 1
    (2, TType.STRING, 'gatewayId', 'UTF8', None, ),  # 2
)


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

    """


    def __init__(self, success=None, ire=None, ace=None, ase=None, ae=None,):
        self.success = success
        self.ire = ire
        self.ace = ace
        self.ase = ase
        self.ae = ae

    def read(self, iprot):
        if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None:
            iprot._fast_decode(self, iprot, [self.__class__, 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.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 2:
                if ftype == TType.STRUCT:
                    self.ace = airavata.api.error.ttypes.AiravataClientException.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 3:
                if ftype == TType.STRUCT:
                    self.ase = airavata.api.error.ttypes.AiravataSystemException.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 4:
                if ftype == TType.STRUCT:
                    self.ae = airavata.api.error.ttypes.AuthorizationException.read(iprot)
                else:
                    iprot.skip(ftype)
            else:
                iprot.skip(ftype)
            iprot.readFieldEnd()
        iprot.readStructEnd()

    def write(self, oprot):
        if oprot._fast_encode is 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)
all_structs.append(getAllNotifications_result)
getAllNotifications_result.thrift_spec = (
    (0, TType.LIST, 'success', (TType.STRUCT, [airavata.model.workspace.ttypes.Notification, None], False), None, ),  # 0
    (1, TType.STRUCT, 'ire', [airavata.api.error.ttypes.InvalidRequestException, None], None, ),  # 1
    (2, TType.STRUCT, 'ace', [airavata.api.error.ttypes.AiravataClientException, None], None, ),  # 2
    (3, TType.STRUCT, 'ase', [airavata.api.error.ttypes.AiravataSystemException, None], None, ),  # 3
    (4, TType.STRUCT, 'ae', [airavata.api.error.ttypes.AuthorizationException, None], None, ),  # 4
)


class generateAndRegisterSSHKeys_args(object):
    """
    Attributes:
     - authzToken
     - description

    """


    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', errors='replace') if sys.version_info[0] == 2 else iprot.readString()
                else:
                    iprot.skip(ftype)
            else:
                iprot.skip(ftype)
            iprot.readFieldEnd()
        iprot.readStructEnd()

    def write(self, oprot):
        if oprot._fast_encode is not None and self.thrift_spec is not None:
            oprot.trans.write(oprot._fast_encode(self, [self.__class__, self.thrift_spec]))
            return
        oprot.writeStructBegin('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)
all_structs.append(generateAndRegisterSSHKeys_args)
generateAndRegisterSSHKeys_args.thrift_spec = (
    None,  # 0
    (1, TType.STRUCT, 'authzToken', [airavata.model.security.ttypes.AuthzToken, None], None, ),  # 1
    None,  # 2
    None,  # 3
    (4, TType.STRING, 'description', 'UTF8', None, ),  # 4
)


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

    """


    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', errors='replace') 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.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 2:
                if ftype == TType.STRUCT:
                    self.ace = airavata.api.error.ttypes.AiravataClientException.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 3:
                if ftype == TType.STRUCT:
                    self.ase = airavata.api.error.ttypes.AiravataSystemException.read(iprot)
                else:
                    iprot.skip(ftype)
            else:
                iprot.skip(ftype)
            iprot.readFieldEnd()
        iprot.readStructEnd()

    def write(self, oprot):
        if oprot._fast_encode is 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)
all_structs.append(generateAndRegisterSSHKeys_result)
generateAndRegisterSSHKeys_result.thrift_spec = (
    (0, TType.STRING, 'success', 'UTF8', None, ),  # 0
    (1, TType.STRUCT, 'ire', [airavata.api.error.ttypes.InvalidRequestException, None], None, ),  # 1
    (2, TType.STRUCT, 'ace', [airavata.api.error.ttypes.AiravataClientException, None], None, ),  # 2
    (3, TType.STRUCT, 'ase', [airavata.api.error.ttypes.AiravataSystemException, None], None, ),  # 3
)


class registerPwdCredential_args(object):
    """
    Attributes:
     - authzToken
     - loginUserName
     - password
     - description

    """


    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', errors='replace') 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', errors='replace') 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', errors='replace') if sys.version_info[0] == 2 else iprot.readString()
                else:
                    iprot.skip(ftype)
            else:
                iprot.skip(ftype)
            iprot.readFieldEnd()
        iprot.readStructEnd()

    def write(self, oprot):
        if oprot._fast_encode is not None and self.thrift_spec is not None:
            oprot.trans.write(oprot._fast_encode(self, [self.__class__, self.thrift_spec]))
            return
        oprot.writeStructBegin('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)
all_structs.append(registerPwdCredential_args)
registerPwdCredential_args.thrift_spec = (
    None,  # 0
    (1, TType.STRUCT, 'authzToken', [airavata.model.security.ttypes.AuthzToken, None], 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
)


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

    """


    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', errors='replace') 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.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 2:
                if ftype == TType.STRUCT:
                    self.ace = airavata.api.error.ttypes.AiravataClientException.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 3:
                if ftype == TType.STRUCT:
                    self.ase = airavata.api.error.ttypes.AiravataSystemException.read(iprot)
                else:
                    iprot.skip(ftype)
            else:
                iprot.skip(ftype)
            iprot.readFieldEnd()
        iprot.readStructEnd()

    def write(self, oprot):
        if oprot._fast_encode is 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)
all_structs.append(registerPwdCredential_result)
registerPwdCredential_result.thrift_spec = (
    (0, TType.STRING, 'success', 'UTF8', None, ),  # 0
    (1, TType.STRUCT, 'ire', [airavata.api.error.ttypes.InvalidRequestException, None], None, ),  # 1
    (2, TType.STRUCT, 'ace', [airavata.api.error.ttypes.AiravataClientException, None], None, ),  # 2
    (3, TType.STRUCT, 'ase', [airavata.api.error.ttypes.AiravataSystemException, None], None, ),  # 3
)


class getCredentialSummary_args(object):
    """
    Attributes:
     - authzToken
     - tokenId

    """


    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', errors='replace') if sys.version_info[0] == 2 else iprot.readString()
                else:
                    iprot.skip(ftype)
            else:
                iprot.skip(ftype)
            iprot.readFieldEnd()
        iprot.readStructEnd()

    def write(self, oprot):
        if oprot._fast_encode is not None and self.thrift_spec is not None:
            oprot.trans.write(oprot._fast_encode(self, [self.__class__, self.thrift_spec]))
            return
        oprot.writeStructBegin('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)
all_structs.append(getCredentialSummary_args)
getCredentialSummary_args.thrift_spec = (
    None,  # 0
    (1, TType.STRUCT, 'authzToken', [airavata.model.security.ttypes.AuthzToken, None], None, ),  # 1
    (2, TType.STRING, 'tokenId', 'UTF8', None, ),  # 2
)


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

    """


    def __init__(self, success=None, ire=None, ace=None, ase=None, ae=None,):
        self.success = success
        self.ire = ire
        self.ace = ace
        self.ase = ase
        self.ae = ae

    def read(self, iprot):
        if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None:
            iprot._fast_decode(self, iprot, [self.__class__, 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.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 2:
                if ftype == TType.STRUCT:
                    self.ace = airavata.api.error.ttypes.AiravataClientException.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 3:
                if ftype == TType.STRUCT:
                    self.ase = airavata.api.error.ttypes.AiravataSystemException.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 4:
                if ftype == TType.STRUCT:
                    self.ae = airavata.api.error.ttypes.AuthorizationException.read(iprot)
                else:
                    iprot.skip(ftype)
            else:
                iprot.skip(ftype)
            iprot.readFieldEnd()
        iprot.readStructEnd()

    def write(self, oprot):
        if oprot._fast_encode is 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)
all_structs.append(getCredentialSummary_result)
getCredentialSummary_result.thrift_spec = (
    (0, TType.STRUCT, 'success', [airavata.model.credential.store.ttypes.CredentialSummary, None], None, ),  # 0
    (1, TType.STRUCT, 'ire', [airavata.api.error.ttypes.InvalidRequestException, None], None, ),  # 1
    (2, TType.STRUCT, 'ace', [airavata.api.error.ttypes.AiravataClientException, None], None, ),  # 2
    (3, TType.STRUCT, 'ase', [airavata.api.error.ttypes.AiravataSystemException, None], None, ),  # 3
    (4, TType.STRUCT, 'ae', [airavata.api.error.ttypes.AuthorizationException, None], None, ),  # 4
)


class getAllCredentialSummaries_args(object):
    """
    Attributes:
     - authzToken
     - type

    """


    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)
all_structs.append(getAllCredentialSummaries_args)
getAllCredentialSummaries_args.thrift_spec = (
    None,  # 0
    (1, TType.STRUCT, 'authzToken', [airavata.model.security.ttypes.AuthzToken, None], None, ),  # 1
    (2, TType.I32, 'type', None, None, ),  # 2
)


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

    """


    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.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 2:
                if ftype == TType.STRUCT:
                    self.ace = airavata.api.error.ttypes.AiravataClientException.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 3:
                if ftype == TType.STRUCT:
                    self.ase = airavata.api.error.ttypes.AiravataSystemException.read(iprot)
                else:
                    iprot.skip(ftype)
            else:
                iprot.skip(ftype)
            iprot.readFieldEnd()
        iprot.readStructEnd()

    def write(self, oprot):
        if oprot._fast_encode is 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)
all_structs.append(getAllCredentialSummaries_result)
getAllCredentialSummaries_result.thrift_spec = (
    (0, TType.LIST, 'success', (TType.STRUCT, [airavata.model.credential.store.ttypes.CredentialSummary, None], False), None, ),  # 0
    (1, TType.STRUCT, 'ire', [airavata.api.error.ttypes.InvalidRequestException, None], None, ),  # 1
    (2, TType.STRUCT, 'ace', [airavata.api.error.ttypes.AiravataClientException, None], None, ),  # 2
    (3, TType.STRUCT, 'ase', [airavata.api.error.ttypes.AiravataSystemException, None], None, ),  # 3
)


class deleteSSHPubKey_args(object):
    """
    Attributes:
     - authzToken
     - airavataCredStoreToken

    """


    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', errors='replace') if sys.version_info[0] == 2 else iprot.readString()
                else:
                    iprot.skip(ftype)
            else:
                iprot.skip(ftype)
            iprot.readFieldEnd()
        iprot.readStructEnd()

    def write(self, oprot):
        if oprot._fast_encode is not None and self.thrift_spec is not None:
            oprot.trans.write(oprot._fast_encode(self, [self.__class__, self.thrift_spec]))
            return
        oprot.writeStructBegin('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)
all_structs.append(deleteSSHPubKey_args)
deleteSSHPubKey_args.thrift_spec = (
    None,  # 0
    (1, TType.STRUCT, 'authzToken', [airavata.model.security.ttypes.AuthzToken, None], None, ),  # 1
    (2, TType.STRING, 'airavataCredStoreToken', 'UTF8', None, ),  # 2
)


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

    """


    def __init__(self, success=None, ire=None, ace=None, ase=None, ae=None,):
        self.success = success
        self.ire = ire
        self.ace = ace
        self.ase = ase
        self.ae = ae

    def read(self, iprot):
        if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None:
            iprot._fast_decode(self, iprot, [self.__class__, 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.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 2:
                if ftype == TType.STRUCT:
                    self.ace = airavata.api.error.ttypes.AiravataClientException.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 3:
                if ftype == TType.STRUCT:
                    self.ase = airavata.api.error.ttypes.AiravataSystemException.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 4:
                if ftype == TType.STRUCT:
                    self.ae = airavata.api.error.ttypes.AuthorizationException.read(iprot)
                else:
                    iprot.skip(ftype)
            else:
                iprot.skip(ftype)
            iprot.readFieldEnd()
        iprot.readStructEnd()

    def write(self, oprot):
        if oprot._fast_encode is 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)
all_structs.append(deleteSSHPubKey_result)
deleteSSHPubKey_result.thrift_spec = (
    (0, TType.BOOL, 'success', None, None, ),  # 0
    (1, TType.STRUCT, 'ire', [airavata.api.error.ttypes.InvalidRequestException, None], None, ),  # 1
    (2, TType.STRUCT, 'ace', [airavata.api.error.ttypes.AiravataClientException, None], None, ),  # 2
    (3, TType.STRUCT, 'ase', [airavata.api.error.ttypes.AiravataSystemException, None], None, ),  # 3
    (4, TType.STRUCT, 'ae', [airavata.api.error.ttypes.AuthorizationException, None], None, ),  # 4
)


class deletePWDCredential_args(object):
    """
    Attributes:
     - authzToken
     - airavataCredStoreToken

    """


    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', errors='replace') if sys.version_info[0] == 2 else iprot.readString()
                else:
                    iprot.skip(ftype)
            else:
                iprot.skip(ftype)
            iprot.readFieldEnd()
        iprot.readStructEnd()

    def write(self, oprot):
        if oprot._fast_encode is not None and self.thrift_spec is not None:
            oprot.trans.write(oprot._fast_encode(self, [self.__class__, self.thrift_spec]))
            return
        oprot.writeStructBegin('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)
all_structs.append(deletePWDCredential_args)
deletePWDCredential_args.thrift_spec = (
    None,  # 0
    (1, TType.STRUCT, 'authzToken', [airavata.model.security.ttypes.AuthzToken, None], None, ),  # 1
    (2, TType.STRING, 'airavataCredStoreToken', 'UTF8', None, ),  # 2
)


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

    """


    def __init__(self, success=None, ire=None, ace=None, ase=None, ae=None,):
        self.success = success
        self.ire = ire
        self.ace = ace
        self.ase = ase
        self.ae = ae

    def read(self, iprot):
        if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None:
            iprot._fast_decode(self, iprot, [self.__class__, 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.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 2:
                if ftype == TType.STRUCT:
                    self.ace = airavata.api.error.ttypes.AiravataClientException.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 3:
                if ftype == TType.STRUCT:
                    self.ase = airavata.api.error.ttypes.AiravataSystemException.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 4:
                if ftype == TType.STRUCT:
                    self.ae = airavata.api.error.ttypes.AuthorizationException.read(iprot)
                else:
                    iprot.skip(ftype)
            else:
                iprot.skip(ftype)
            iprot.readFieldEnd()
        iprot.readStructEnd()

    def write(self, oprot):
        if oprot._fast_encode is 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)
all_structs.append(deletePWDCredential_result)
deletePWDCredential_result.thrift_spec = (
    (0, TType.BOOL, 'success', None, None, ),  # 0
    (1, TType.STRUCT, 'ire', [airavata.api.error.ttypes.InvalidRequestException, None], None, ),  # 1
    (2, TType.STRUCT, 'ace', [airavata.api.error.ttypes.AiravataClientException, None], None, ),  # 2
    (3, TType.STRUCT, 'ase', [airavata.api.error.ttypes.AiravataSystemException, None], None, ),  # 3
    (4, TType.STRUCT, 'ae', [airavata.api.error.ttypes.AuthorizationException, None], None, ),  # 4
)


class createProject_args(object):
    """
    Attributes:
     - authzToken
     - gatewayId
     - project

    """


    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', errors='replace') 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)
all_structs.append(createProject_args)
createProject_args.thrift_spec = (
    None,  # 0
    (1, TType.STRUCT, 'authzToken', [airavata.model.security.ttypes.AuthzToken, None], None, ),  # 1
    (2, TType.STRING, 'gatewayId', 'UTF8', None, ),  # 2
    (3, TType.STRUCT, 'project', [airavata.model.workspace.ttypes.Project, None], None, ),  # 3
)


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

    """


    def __init__(self, success=None, ire=None, ace=None, ase=None, ae=None,):
        self.success = success
        self.ire = ire
        self.ace = ace
        self.ase = ase
        self.ae = ae

    def read(self, iprot):
        if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None:
            iprot._fast_decode(self, iprot, [self.__class__, 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', errors='replace') 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.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 2:
                if ftype == TType.STRUCT:
                    self.ace = airavata.api.error.ttypes.AiravataClientException.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 3:
                if ftype == TType.STRUCT:
                    self.ase = airavata.api.error.ttypes.AiravataSystemException.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 4:
                if ftype == TType.STRUCT:
                    self.ae = airavata.api.error.ttypes.AuthorizationException.read(iprot)
                else:
                    iprot.skip(ftype)
            else:
                iprot.skip(ftype)
            iprot.readFieldEnd()
        iprot.readStructEnd()

    def write(self, oprot):
        if oprot._fast_encode is 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)
all_structs.append(createProject_result)
createProject_result.thrift_spec = (
    (0, TType.STRING, 'success', 'UTF8', None, ),  # 0
    (1, TType.STRUCT, 'ire', [airavata.api.error.ttypes.InvalidRequestException, None], None, ),  # 1
    (2, TType.STRUCT, 'ace', [airavata.api.error.ttypes.AiravataClientException, None], None, ),  # 2
    (3, TType.STRUCT, 'ase', [airavata.api.error.ttypes.AiravataSystemException, None], None, ),  # 3
    (4, TType.STRUCT, 'ae', [airavata.api.error.ttypes.AuthorizationException, None], None, ),  # 4
)


class updateProject_args(object):
    """
    Attributes:
     - authzToken
     - projectId
     - updatedProject

    """


    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', errors='replace') 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)
all_structs.append(updateProject_args)
updateProject_args.thrift_spec = (
    None,  # 0
    (1, TType.STRUCT, 'authzToken', [airavata.model.security.ttypes.AuthzToken, None], None, ),  # 1
    (2, TType.STRING, 'projectId', 'UTF8', None, ),  # 2
    (3, TType.STRUCT, 'updatedProject', [airavata.model.workspace.ttypes.Project, None], None, ),  # 3
)


class updateProject_result(object):
    """
    Attributes:
     - ire
     - ace
     - ase
     - pnfe
     - ae

    """


    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.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 2:
                if ftype == TType.STRUCT:
                    self.ace = airavata.api.error.ttypes.AiravataClientException.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 3:
                if ftype == TType.STRUCT:
                    self.ase = airavata.api.error.ttypes.AiravataSystemException.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 4:
                if ftype == TType.STRUCT:
                    self.pnfe = airavata.api.error.ttypes.ProjectNotFoundException.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 5:
                if ftype == TType.STRUCT:
                    self.ae = airavata.api.error.ttypes.AuthorizationException.read(iprot)
                else:
                    iprot.skip(ftype)
            else:
                iprot.skip(ftype)
            iprot.readFieldEnd()
        iprot.readStructEnd()

    def write(self, oprot):
        if oprot._fast_encode is 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)
all_structs.append(updateProject_result)
updateProject_result.thrift_spec = (
    None,  # 0
    (1, TType.STRUCT, 'ire', [airavata.api.error.ttypes.InvalidRequestException, None], None, ),  # 1
    (2, TType.STRUCT, 'ace', [airavata.api.error.ttypes.AiravataClientException, None], None, ),  # 2
    (3, TType.STRUCT, 'ase', [airavata.api.error.ttypes.AiravataSystemException, None], None, ),  # 3
    (4, TType.STRUCT, 'pnfe', [airavata.api.error.ttypes.ProjectNotFoundException, None], None, ),  # 4
    (5, TType.STRUCT, 'ae', [airavata.api.error.ttypes.AuthorizationException, None], None, ),  # 5
)


class getProject_args(object):
    """
    Attributes:
     - authzToken
     - projectId

    """


    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', errors='replace') if sys.version_info[0] == 2 else iprot.readString()
                else:
                    iprot.skip(ftype)
            else:
                iprot.skip(ftype)
            iprot.readFieldEnd()
        iprot.readStructEnd()

    def write(self, oprot):
        if oprot._fast_encode is not None and self.thrift_spec is not None:
            oprot.trans.write(oprot._fast_encode(self, [self.__class__, self.thrift_spec]))
            return
        oprot.writeStructBegin('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)
all_structs.append(getProject_args)
getProject_args.thrift_spec = (
    None,  # 0
    (1, TType.STRUCT, 'authzToken', [airavata.model.security.ttypes.AuthzToken, None], None, ),  # 1
    (2, TType.STRING, 'projectId', 'UTF8', None, ),  # 2
)


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

    """


    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.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 2:
                if ftype == TType.STRUCT:
                    self.ace = airavata.api.error.ttypes.AiravataClientException.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 3:
                if ftype == TType.STRUCT:
                    self.ase = airavata.api.error.ttypes.AiravataSystemException.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 4:
                if ftype == TType.STRUCT:
                    self.pnfe = airavata.api.error.ttypes.ProjectNotFoundException.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 5:
                if ftype == TType.STRUCT:
                    self.ae = airavata.api.error.ttypes.AuthorizationException.read(iprot)
                else:
                    iprot.skip(ftype)
            else:
                iprot.skip(ftype)
            iprot.readFieldEnd()
        iprot.readStructEnd()

    def write(self, oprot):
        if oprot._fast_encode is 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)
all_structs.append(getProject_result)
getProject_result.thrift_spec = (
    (0, TType.STRUCT, 'success', [airavata.model.workspace.ttypes.Project, None], None, ),  # 0
    (1, TType.STRUCT, 'ire', [airavata.api.error.ttypes.InvalidRequestException, None], None, ),  # 1
    (2, TType.STRUCT, 'ace', [airavata.api.error.ttypes.AiravataClientException, None], None, ),  # 2
    (3, TType.STRUCT, 'ase', [airavata.api.error.ttypes.AiravataSystemException, None], None, ),  # 3
    (4, TType.STRUCT, 'pnfe', [airavata.api.error.ttypes.ProjectNotFoundException, None], None, ),  # 4
    (5, TType.STRUCT, 'ae', [airavata.api.error.ttypes.AuthorizationException, None], None, ),  # 5
)


class deleteProject_args(object):
    """
    Attributes:
     - authzToken
     - projectId

    """


    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', errors='replace') if sys.version_info[0] == 2 else iprot.readString()
                else:
                    iprot.skip(ftype)
            else:
                iprot.skip(ftype)
            iprot.readFieldEnd()
        iprot.readStructEnd()

    def write(self, oprot):
        if oprot._fast_encode is not None and self.thrift_spec is not None:
            oprot.trans.write(oprot._fast_encode(self, [self.__class__, self.thrift_spec]))
            return
        oprot.writeStructBegin('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)
all_structs.append(deleteProject_args)
deleteProject_args.thrift_spec = (
    None,  # 0
    (1, TType.STRUCT, 'authzToken', [airavata.model.security.ttypes.AuthzToken, None], None, ),  # 1
    (2, TType.STRING, 'projectId', 'UTF8', None, ),  # 2
)


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

    """


    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.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 2:
                if ftype == TType.STRUCT:
                    self.ace = airavata.api.error.ttypes.AiravataClientException.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 3:
                if ftype == TType.STRUCT:
                    self.ase = airavata.api.error.ttypes.AiravataSystemException.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 4:
                if ftype == TType.STRUCT:
                    self.pnfe = airavata.api.error.ttypes.ProjectNotFoundException.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 5:
                if ftype == TType.STRUCT:
                    self.ae = airavata.api.error.ttypes.AuthorizationException.read(iprot)
                else:
                    iprot.skip(ftype)
            else:
                iprot.skip(ftype)
            iprot.readFieldEnd()
        iprot.readStructEnd()

    def write(self, oprot):
        if oprot._fast_encode is 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)
all_structs.append(deleteProject_result)
deleteProject_result.thrift_spec = (
    (0, TType.BOOL, 'success', None, None, ),  # 0
    (1, TType.STRUCT, 'ire', [airavata.api.error.ttypes.InvalidRequestException, None], None, ),  # 1
    (2, TType.STRUCT, 'ace', [airavata.api.error.ttypes.AiravataClientException, None], None, ),  # 2
    (3, TType.STRUCT, 'ase', [airavata.api.error.ttypes.AiravataSystemException, None], None, ),  # 3
    (4, TType.STRUCT, 'pnfe', [airavata.api.error.ttypes.ProjectNotFoundException, None], None, ),  # 4
    (5, TType.STRUCT, 'ae', [airavata.api.error.ttypes.AuthorizationException, None], None, ),  # 5
)


class getUserProjects_args(object):
    """
    Attributes:
     - authzToken
     - gatewayId
     - userName
     - limit
     - offset

    """


    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', errors='replace') 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', errors='replace') 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)
all_structs.append(getUserProjects_args)
getUserProjects_args.thrift_spec = (
    None,  # 0
    (1, TType.STRUCT, 'authzToken', [airavata.model.security.ttypes.AuthzToken, None], 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
)


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

    """


    def __init__(self, success=None, ire=None, ace=None, ase=None, ae=None,):
        self.success = success
        self.ire = ire
        self.ace = ace
        self.ase = ase
        self.ae = ae

    def read(self, iprot):
        if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None:
            iprot._fast_decode(self, iprot, [self.__class__, 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.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 2:
                if ftype == TType.STRUCT:
                    self.ace = airavata.api.error.ttypes.AiravataClientException.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 3:
                if ftype == TType.STRUCT:
                    self.ase = airavata.api.error.ttypes.AiravataSystemException.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 4:
                if ftype == TType.STRUCT:
                    self.ae = airavata.api.error.ttypes.AuthorizationException.read(iprot)
                else:
                    iprot.skip(ftype)
            else:
                iprot.skip(ftype)
            iprot.readFieldEnd()
        iprot.readStructEnd()

    def write(self, oprot):
        if oprot._fast_encode is 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)
all_structs.append(getUserProjects_result)
getUserProjects_result.thrift_spec = (
    (0, TType.LIST, 'success', (TType.STRUCT, [airavata.model.workspace.ttypes.Project, None], False), None, ),  # 0
    (1, TType.STRUCT, 'ire', [airavata.api.error.ttypes.InvalidRequestException, None], None, ),  # 1
    (2, TType.STRUCT, 'ace', [airavata.api.error.ttypes.AiravataClientException, None], None, ),  # 2
    (3, TType.STRUCT, 'ase', [airavata.api.error.ttypes.AiravataSystemException, None], None, ),  # 3
    (4, TType.STRUCT, 'ae', [airavata.api.error.ttypes.AuthorizationException, None], None, ),  # 4
)


class searchProjects_args(object):
    """
    Attributes:
     - authzToken
     - gatewayId
     - userName
     - filters
     - limit
     - offset

    """


    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', errors='replace') 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', errors='replace') 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', errors='replace') 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)
all_structs.append(searchProjects_args)
searchProjects_args.thrift_spec = (
    None,  # 0
    (1, TType.STRUCT, 'authzToken', [airavata.model.security.ttypes.AuthzToken, None], 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
)


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

    """


    def __init__(self, success=None, ire=None, ace=None, ase=None, ae=None,):
        self.success = success
        self.ire = ire
        self.ace = ace
        self.ase = ase
        self.ae = ae

    def read(self, iprot):
        if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None:
            iprot._fast_decode(self, iprot, [self.__class__, 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.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 2:
                if ftype == TType.STRUCT:
                    self.ace = airavata.api.error.ttypes.AiravataClientException.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 3:
                if ftype == TType.STRUCT:
                    self.ase = airavata.api.error.ttypes.AiravataSystemException.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 4:
                if ftype == TType.STRUCT:
                    self.ae = airavata.api.error.ttypes.AuthorizationException.read(iprot)
                else:
                    iprot.skip(ftype)
            else:
                iprot.skip(ftype)
            iprot.readFieldEnd()
        iprot.readStructEnd()

    def write(self, oprot):
        if oprot._fast_encode is 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)
all_structs.append(searchProjects_result)
searchProjects_result.thrift_spec = (
    (0, TType.LIST, 'success', (TType.STRUCT, [airavata.model.workspace.ttypes.Project, None], False), None, ),  # 0
    (1, TType.STRUCT, 'ire', [airavata.api.error.ttypes.InvalidRequestException, None], None, ),  # 1
    (2, TType.STRUCT, 'ace', [airavata.api.error.ttypes.AiravataClientException, None], None, ),  # 2
    (3, TType.STRUCT, 'ase', [airavata.api.error.ttypes.AiravataSystemException, None], None, ),  # 3
    (4, TType.STRUCT, 'ae', [airavata.api.error.ttypes.AuthorizationException, None], None, ),  # 4
)


class searchExperiments_args(object):
    """
    Attributes:
     - authzToken
     - gatewayId
     - userName
     - filters
     - limit
     - offset

    """


    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', errors='replace') 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', errors='replace') 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', errors='replace') 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)
all_structs.append(searchExperiments_args)
searchExperiments_args.thrift_spec = (
    None,  # 0
    (1, TType.STRUCT, 'authzToken', [airavata.model.security.ttypes.AuthzToken, None], 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
)


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

    """


    def __init__(self, success=None, ire=None, ace=None, ase=None, ae=None,):
        self.success = success
        self.ire = ire
        self.ace = ace
        self.ase = ase
        self.ae = ae

    def read(self, iprot):
        if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None:
            iprot._fast_decode(self, iprot, [self.__class__, 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.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 2:
                if ftype == TType.STRUCT:
                    self.ace = airavata.api.error.ttypes.AiravataClientException.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 3:
                if ftype == TType.STRUCT:
                    self.ase = airavata.api.error.ttypes.AiravataSystemException.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 4:
                if ftype == TType.STRUCT:
                    self.ae = airavata.api.error.ttypes.AuthorizationException.read(iprot)
                else:
                    iprot.skip(ftype)
            else:
                iprot.skip(ftype)
            iprot.readFieldEnd()
        iprot.readStructEnd()

    def write(self, oprot):
        if oprot._fast_encode is 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)
all_structs.append(searchExperiments_result)
searchExperiments_result.thrift_spec = (
    (0, TType.LIST, 'success', (TType.STRUCT, [airavata.model.experiment.ttypes.ExperimentSummaryModel, None], False), None, ),  # 0
    (1, TType.STRUCT, 'ire', [airavata.api.error.ttypes.InvalidRequestException, None], None, ),  # 1
    (2, TType.STRUCT, 'ace', [airavata.api.error.ttypes.AiravataClientException, None], None, ),  # 2
    (3, TType.STRUCT, 'ase', [airavata.api.error.ttypes.AiravataSystemException, None], None, ),  # 3
    (4, TType.STRUCT, 'ae', [airavata.api.error.ttypes.AuthorizationException, None], None, ),  # 4
)


class getExperimentStatistics_args(object):
    """
    Attributes:
     - authzToken
     - gatewayId
     - fromTime
     - toTime
     - userName
     - applicationName
     - resourceHostName
     - limit
     - offset

    """


    def __init__(self, authzToken=None, gatewayId=None, fromTime=None, toTime=None, userName=None, applicationName=None, resourceHostName=None, limit=50, offset=0,):
        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', errors='replace') 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', errors='replace') 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', errors='replace') 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', errors='replace') 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)
all_structs.append(getExperimentStatistics_args)
getExperimentStatistics_args.thrift_spec = (
    None,  # 0
    (1, TType.STRUCT, 'authzToken', [airavata.model.security.ttypes.AuthzToken, None], 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
)


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

    """


    def __init__(self, success=None, ire=None, ace=None, ase=None, ae=None,):
        self.success = success
        self.ire = ire
        self.ace = ace
        self.ase = ase
        self.ae = ae

    def read(self, iprot):
        if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None:
            iprot._fast_decode(self, iprot, [self.__class__, 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.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 2:
                if ftype == TType.STRUCT:
                    self.ace = airavata.api.error.ttypes.AiravataClientException.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 3:
                if ftype == TType.STRUCT:
                    self.ase = airavata.api.error.ttypes.AiravataSystemException.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 4:
                if ftype == TType.STRUCT:
                    self.ae = airavata.api.error.ttypes.AuthorizationException.read(iprot)
                else:
                    iprot.skip(ftype)
            else:
                iprot.skip(ftype)
            iprot.readFieldEnd()
        iprot.readStructEnd()

    def write(self, oprot):
        if oprot._fast_encode is 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)
all_structs.append(getExperimentStatistics_result)
getExperimentStatistics_result.thrift_spec = (
    (0, TType.STRUCT, 'success', [airavata.model.experiment.ttypes.ExperimentStatistics, None], None, ),  # 0
    (1, TType.STRUCT, 'ire', [airavata.api.error.ttypes.InvalidRequestException, None], None, ),  # 1
    (2, TType.STRUCT, 'ace', [airavata.api.error.ttypes.AiravataClientException, None], None, ),  # 2
    (3, TType.STRUCT, 'ase', [airavata.api.error.ttypes.AiravataSystemException, None], None, ),  # 3
    (4, TType.STRUCT, 'ae', [airavata.api.error.ttypes.AuthorizationException, None], None, ),  # 4
)


class getExperimentsInProject_args(object):
    """
    Attributes:
     - authzToken
     - projectId
     - limit
     - offset

    """


    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', errors='replace') 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)
all_structs.append(getExperimentsInProject_args)
getExperimentsInProject_args.thrift_spec = (
    None,  # 0
    (1, TType.STRUCT, 'authzToken', [airavata.model.security.ttypes.AuthzToken, None], None, ),  # 1
    (2, TType.STRING, 'projectId', 'UTF8', None, ),  # 2
    (3, TType.I32, 'limit', None, None, ),  # 3
    (4, TType.I32, 'offset', None, None, ),  # 4
)


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

    """


    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.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 2:
                if ftype == TType.STRUCT:
                    self.ace = airavata.api.error.ttypes.AiravataClientException.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 3:
                if ftype == TType.STRUCT:
                    self.ase = airavata.api.error.ttypes.AiravataSystemException.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 4:
                if ftype == TType.STRUCT:
                    self.pnfe = airavata.api.error.ttypes.ProjectNotFoundException.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 5:
                if ftype == TType.STRUCT:
                    self.ae = airavata.api.error.ttypes.AuthorizationException.read(iprot)
                else:
                    iprot.skip(ftype)
            else:
                iprot.skip(ftype)
            iprot.readFieldEnd()
        iprot.readStructEnd()

    def write(self, oprot):
        if oprot._fast_encode is 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)
all_structs.append(getExperimentsInProject_result)
getExperimentsInProject_result.thrift_spec = (
    (0, TType.LIST, 'success', (TType.STRUCT, [airavata.model.experiment.ttypes.ExperimentModel, None], False), None, ),  # 0
    (1, TType.STRUCT, 'ire', [airavata.api.error.ttypes.InvalidRequestException, None], None, ),  # 1
    (2, TType.STRUCT, 'ace', [airavata.api.error.ttypes.AiravataClientException, None], None, ),  # 2
    (3, TType.STRUCT, 'ase', [airavata.api.error.ttypes.AiravataSystemException, None], None, ),  # 3
    (4, TType.STRUCT, 'pnfe', [airavata.api.error.ttypes.ProjectNotFoundException, None], None, ),  # 4
    (5, TType.STRUCT, 'ae', [airavata.api.error.ttypes.AuthorizationException, None], None, ),  # 5
)


class getUserExperiments_args(object):
    """
    Attributes:
     - authzToken
     - gatewayId
     - userName
     - limit
     - offset

    """


    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', errors='replace') 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', errors='replace') 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)
all_structs.append(getUserExperiments_args)
getUserExperiments_args.thrift_spec = (
    None,  # 0
    (1, TType.STRUCT, 'authzToken', [airavata.model.security.ttypes.AuthzToken, None], 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
)


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

    """


    def __init__(self, success=None, ire=None, ace=None, ase=None, ae=None,):
        self.success = success
        self.ire = ire
        self.ace = ace
        self.ase = ase
        self.ae = ae

    def read(self, iprot):
        if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None:
            iprot._fast_decode(self, iprot, [self.__class__, 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.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 2:
                if ftype == TType.STRUCT:
                    self.ace = airavata.api.error.ttypes.AiravataClientException.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 3:
                if ftype == TType.STRUCT:
                    self.ase = airavata.api.error.ttypes.AiravataSystemException.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 4:
                if ftype == TType.STRUCT:
                    self.ae = airavata.api.error.ttypes.AuthorizationException.read(iprot)
                else:
                    iprot.skip(ftype)
            else:
                iprot.skip(ftype)
            iprot.readFieldEnd()
        iprot.readStructEnd()

    def write(self, oprot):
        if oprot._fast_encode is 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)
all_structs.append(getUserExperiments_result)
getUserExperiments_result.thrift_spec = (
    (0, TType.LIST, 'success', (TType.STRUCT, [airavata.model.experiment.ttypes.ExperimentModel, None], False), None, ),  # 0
    (1, TType.STRUCT, 'ire', [airavata.api.error.ttypes.InvalidRequestException, None], None, ),  # 1
    (2, TType.STRUCT, 'ace', [airavata.api.error.ttypes.AiravataClientException, None], None, ),  # 2
    (3, TType.STRUCT, 'ase', [airavata.api.error.ttypes.AiravataSystemException, None], None, ),  # 3
    (4, TType.STRUCT, 'ae', [airavata.api.error.ttypes.AuthorizationException, None], None, ),  # 4
)


class createExperiment_args(object):
    """
    Attributes:
     - authzToken
     - gatewayId
     - experiment

    """


    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', errors='replace') 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)
all_structs.append(createExperiment_args)
createExperiment_args.thrift_spec = (
    None,  # 0
    (1, TType.STRUCT, 'authzToken', [airavata.model.security.ttypes.AuthzToken, None], None, ),  # 1
    (2, TType.STRING, 'gatewayId', 'UTF8', None, ),  # 2
    (3, TType.STRUCT, 'experiment', [airavata.model.experiment.ttypes.ExperimentModel, None], None, ),  # 3
)


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

    """


    def __init__(self, success=None, ire=None, ace=None, ase=None, ae=None,):
        self.success = success
        self.ire = ire
        self.ace = ace
        self.ase = ase
        self.ae = ae

    def read(self, iprot):
        if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None:
            iprot._fast_decode(self, iprot, [self.__class__, 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', errors='replace') 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.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 2:
                if ftype == TType.STRUCT:
                    self.ace = airavata.api.error.ttypes.AiravataClientException.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 3:
                if ftype == TType.STRUCT:
                    self.ase = airavata.api.error.ttypes.AiravataSystemException.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 4:
                if ftype == TType.STRUCT:
                    self.ae = airavata.api.error.ttypes.AuthorizationException.read(iprot)
                else:
                    iprot.skip(ftype)
            else:
                iprot.skip(ftype)
            iprot.readFieldEnd()
        iprot.readStructEnd()

    def write(self, oprot):
        if oprot._fast_encode is 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)
all_structs.append(createExperiment_result)
createExperiment_result.thrift_spec = (
    (0, TType.STRING, 'success', 'UTF8', None, ),  # 0
    (1, TType.STRUCT, 'ire', [airavata.api.error.ttypes.InvalidRequestException, None], None, ),  # 1
    (2, TType.STRUCT, 'ace', [airavata.api.error.ttypes.AiravataClientException, None], None, ),  # 2
    (3, TType.STRUCT, 'ase', [airavata.api.error.ttypes.AiravataSystemException, None], None, ),  # 3
    (4, TType.STRUCT, 'ae', [airavata.api.error.ttypes.AuthorizationException, None], None, ),  # 4
)


class deleteExperiment_args(object):
    """
    Attributes:
     - authzToken
     - experimentId

    """


    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', errors='replace') if sys.version_info[0] == 2 else iprot.readString()
                else:
                    iprot.skip(ftype)
            else:
                iprot.skip(ftype)
            iprot.readFieldEnd()
        iprot.readStructEnd()

    def write(self, oprot):
        if oprot._fast_encode is not None and self.thrift_spec is not None:
            oprot.trans.write(oprot._fast_encode(self, [self.__class__, self.thrift_spec]))
            return
        oprot.writeStructBegin('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)
all_structs.append(deleteExperiment_args)
deleteExperiment_args.thrift_spec = (
    None,  # 0
    (1, TType.STRUCT, 'authzToken', [airavata.model.security.ttypes.AuthzToken, None], None, ),  # 1
    (2, TType.STRING, 'experimentId', 'UTF8', None, ),  # 2
)


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

    """


    def __init__(self, success=None, ire=None, ace=None, ase=None, ae=None,):
        self.success = success
        self.ire = ire
        self.ace = ace
        self.ase = ase
        self.ae = ae

    def read(self, iprot):
        if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None:
            iprot._fast_decode(self, iprot, [self.__class__, 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.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 2:
                if ftype == TType.STRUCT:
                    self.ace = airavata.api.error.ttypes.AiravataClientException.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 3:
                if ftype == TType.STRUCT:
                    self.ase = airavata.api.error.ttypes.AiravataSystemException.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 4:
                if ftype == TType.STRUCT:
                    self.ae = airavata.api.error.ttypes.AuthorizationException.read(iprot)
                else:
                    iprot.skip(ftype)
            else:
                iprot.skip(ftype)
            iprot.readFieldEnd()
        iprot.readStructEnd()

    def write(self, oprot):
        if oprot._fast_encode is 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)
all_structs.append(deleteExperiment_result)
deleteExperiment_result.thrift_spec = (
    (0, TType.BOOL, 'success', None, None, ),  # 0
    (1, TType.STRUCT, 'ire', [airavata.api.error.ttypes.InvalidRequestException, None], None, ),  # 1
    (2, TType.STRUCT, 'ace', [airavata.api.error.ttypes.AiravataClientException, None], None, ),  # 2
    (3, TType.STRUCT, 'ase', [airavata.api.error.ttypes.AiravataSystemException, None], None, ),  # 3
    (4, TType.STRUCT, 'ae', [airavata.api.error.ttypes.AuthorizationException, None], None, ),  # 4
)


class getExperiment_args(object):
    """
    Attributes:
     - authzToken
     - airavataExperimentId

    """


    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', errors='replace') if sys.version_info[0] == 2 else iprot.readString()
                else:
                    iprot.skip(ftype)
            else:
                iprot.skip(ftype)
            iprot.readFieldEnd()
        iprot.readStructEnd()

    def write(self, oprot):
        if oprot._fast_encode is not None and self.thrift_spec is not None:
            oprot.trans.write(oprot._fast_encode(self, [self.__class__, self.thrift_spec]))
            return
        oprot.writeStructBegin('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)
all_structs.append(getExperiment_args)
getExperiment_args.thrift_spec = (
    None,  # 0
    (1, TType.STRUCT, 'authzToken', [airavata.model.security.ttypes.AuthzToken, None], None, ),  # 1
    (2, TType.STRING, 'airavataExperimentId', 'UTF8', None, ),  # 2
)


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

    """


    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.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 2:
                if ftype == TType.STRUCT:
                    self.enf = airavata.api.error.ttypes.ExperimentNotFoundException.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 3:
                if ftype == TType.STRUCT:
                    self.ace = airavata.api.error.ttypes.AiravataClientException.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 4:
                if ftype == TType.STRUCT:
                    self.ase = airavata.api.error.ttypes.AiravataSystemException.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 5:
                if ftype == TType.STRUCT:
                    self.ae = airavata.api.error.ttypes.AuthorizationException.read(iprot)
                else:
                    iprot.skip(ftype)
            else:
                iprot.skip(ftype)
            iprot.readFieldEnd()
        iprot.readStructEnd()

    def write(self, oprot):
        if oprot._fast_encode is 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)
all_structs.append(getExperiment_result)
getExperiment_result.thrift_spec = (
    (0, TType.STRUCT, 'success', [airavata.model.experiment.ttypes.ExperimentModel, None], None, ),  # 0
    (1, TType.STRUCT, 'ire', [airavata.api.error.ttypes.InvalidRequestException, None], None, ),  # 1
    (2, TType.STRUCT, 'enf', [airavata.api.error.ttypes.ExperimentNotFoundException, None], None, ),  # 2
    (3, TType.STRUCT, 'ace', [airavata.api.error.ttypes.AiravataClientException, None], None, ),  # 3
    (4, TType.STRUCT, 'ase', [airavata.api.error.ttypes.AiravataSystemException, None], None, ),  # 4
    (5, TType.STRUCT, 'ae', [airavata.api.error.ttypes.AuthorizationException, None], None, ),  # 5
)


class getExperimentByAdmin_args(object):
    """
    Attributes:
     - authzToken
     - airavataExperimentId

    """


    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', errors='replace') if sys.version_info[0] == 2 else iprot.readString()
                else:
                    iprot.skip(ftype)
            else:
                iprot.skip(ftype)
            iprot.readFieldEnd()
        iprot.readStructEnd()

    def write(self, oprot):
        if oprot._fast_encode is not None and self.thrift_spec is not None:
            oprot.trans.write(oprot._fast_encode(self, [self.__class__, self.thrift_spec]))
            return
        oprot.writeStructBegin('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)
all_structs.append(getExperimentByAdmin_args)
getExperimentByAdmin_args.thrift_spec = (
    None,  # 0
    (1, TType.STRUCT, 'authzToken', [airavata.model.security.ttypes.AuthzToken, None], None, ),  # 1
    (2, TType.STRING, 'airavataExperimentId', 'UTF8', None, ),  # 2
)


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

    """


    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.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 2:
                if ftype == TType.STRUCT:
                    self.enf = airavata.api.error.ttypes.ExperimentNotFoundException.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 3:
                if ftype == TType.STRUCT:
                    self.ace = airavata.api.error.ttypes.AiravataClientException.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 4:
                if ftype == TType.STRUCT:
                    self.ase = airavata.api.error.ttypes.AiravataSystemException.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 5:
                if ftype == TType.STRUCT:
                    self.ae = airavata.api.error.ttypes.AuthorizationException.read(iprot)
                else:
                    iprot.skip(ftype)
            else:
                iprot.skip(ftype)
            iprot.readFieldEnd()
        iprot.readStructEnd()

    def write(self, oprot):
        if oprot._fast_encode is 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)
all_structs.append(getExperimentByAdmin_result)
getExperimentByAdmin_result.thrift_spec = (
    (0, TType.STRUCT, 'success', [airavata.model.experiment.ttypes.ExperimentModel, None], None, ),  # 0
    (1, TType.STRUCT, 'ire', [airavata.api.error.ttypes.InvalidRequestException, None], None, ),  # 1
    (2, TType.STRUCT, 'enf', [airavata.api.error.ttypes.ExperimentNotFoundException, None], None, ),  # 2
    (3, TType.STRUCT, 'ace', [airavata.api.error.ttypes.AiravataClientException, None], None, ),  # 3
    (4, TType.STRUCT, 'ase', [airavata.api.error.ttypes.AiravataSystemException, None], None, ),  # 4
    (5, TType.STRUCT, 'ae', [airavata.api.error.ttypes.AuthorizationException, None], None, ),  # 5
)


class getDetailedExperimentTree_args(object):
    """
    Attributes:
     - authzToken
     - airavataExperimentId

    """


    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', errors='replace') if sys.version_info[0] == 2 else iprot.readString()
                else:
                    iprot.skip(ftype)
            else:
                iprot.skip(ftype)
            iprot.readFieldEnd()
        iprot.readStructEnd()

    def write(self, oprot):
        if oprot._fast_encode is not None and self.thrift_spec is not None:
            oprot.trans.write(oprot._fast_encode(self, [self.__class__, self.thrift_spec]))
            return
        oprot.writeStructBegin('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)
all_structs.append(getDetailedExperimentTree_args)
getDetailedExperimentTree_args.thrift_spec = (
    None,  # 0
    (1, TType.STRUCT, 'authzToken', [airavata.model.security.ttypes.AuthzToken, None], None, ),  # 1
    (2, TType.STRING, 'airavataExperimentId', 'UTF8', None, ),  # 2
)


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

    """


    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.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 2:
                if ftype == TType.STRUCT:
                    self.enf = airavata.api.error.ttypes.ExperimentNotFoundException.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 3:
                if ftype == TType.STRUCT:
                    self.ace = airavata.api.error.ttypes.AiravataClientException.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 4:
                if ftype == TType.STRUCT:
                    self.ase = airavata.api.error.ttypes.AiravataSystemException.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 5:
                if ftype == TType.STRUCT:
                    self.ae = airavata.api.error.ttypes.AuthorizationException.read(iprot)
                else:
                    iprot.skip(ftype)
            else:
                iprot.skip(ftype)
            iprot.readFieldEnd()
        iprot.readStructEnd()

    def write(self, oprot):
        if oprot._fast_encode is 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)
all_structs.append(getDetailedExperimentTree_result)
getDetailedExperimentTree_result.thrift_spec = (
    (0, TType.STRUCT, 'success', [airavata.model.experiment.ttypes.ExperimentModel, None], None, ),  # 0
    (1, TType.STRUCT, 'ire', [airavata.api.error.ttypes.InvalidRequestException, None], None, ),  # 1
    (2, TType.STRUCT, 'enf', [airavata.api.error.ttypes.ExperimentNotFoundException, None], None, ),  # 2
    (3, TType.STRUCT, 'ace', [airavata.api.error.ttypes.AiravataClientException, None], None, ),  # 3
    (4, TType.STRUCT, 'ase', [airavata.api.error.ttypes.AiravataSystemException, None], None, ),  # 4
    (5, TType.STRUCT, 'ae', [airavata.api.error.ttypes.AuthorizationException, None], None, ),  # 5
)


class updateExperiment_args(object):
    """
    Attributes:
     - authzToken
     - airavataExperimentId
     - experiment

    """


    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', errors='replace') 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)
all_structs.append(updateExperiment_args)
updateExperiment_args.thrift_spec = (
    None,  # 0
    (1, TType.STRUCT, 'authzToken', [airavata.model.security.ttypes.AuthzToken, None], None, ),  # 1
    (2, TType.STRING, 'airavataExperimentId', 'UTF8', None, ),  # 2
    (3, TType.STRUCT, 'experiment', [airavata.model.experiment.ttypes.ExperimentModel, None], None, ),  # 3
)


class updateExperiment_result(object):
    """
    Attributes:
     - ire
     - enf
     - ace
     - ase
     - ae

    """


    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.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 2:
                if ftype == TType.STRUCT:
                    self.enf = airavata.api.error.ttypes.ExperimentNotFoundException.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 3:
                if ftype == TType.STRUCT:
                    self.ace = airavata.api.error.ttypes.AiravataClientException.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 4:
                if ftype == TType.STRUCT:
                    self.ase = airavata.api.error.ttypes.AiravataSystemException.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 5:
                if ftype == TType.STRUCT:
                    self.ae = airavata.api.error.ttypes.AuthorizationException.read(iprot)
                else:
                    iprot.skip(ftype)
            else:
                iprot.skip(ftype)
            iprot.readFieldEnd()
        iprot.readStructEnd()

    def write(self, oprot):
        if oprot._fast_encode is 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)
all_structs.append(updateExperiment_result)
updateExperiment_result.thrift_spec = (
    None,  # 0
    (1, TType.STRUCT, 'ire', [airavata.api.error.ttypes.InvalidRequestException, None], None, ),  # 1
    (2, TType.STRUCT, 'enf', [airavata.api.error.ttypes.ExperimentNotFoundException, None], None, ),  # 2
    (3, TType.STRUCT, 'ace', [airavata.api.error.ttypes.AiravataClientException, None], None, ),  # 3
    (4, TType.STRUCT, 'ase', [airavata.api.error.ttypes.AiravataSystemException, None], None, ),  # 4
    (5, TType.STRUCT, 'ae', [airavata.api.error.ttypes.AuthorizationException, None], None, ),  # 5
)


class updateExperimentConfiguration_args(object):
    """
    Attributes:
     - authzToken
     - airavataExperimentId
     - userConfiguration

    """


    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', errors='replace') 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)
all_structs.append(updateExperimentConfiguration_args)
updateExperimentConfiguration_args.thrift_spec = (
    None,  # 0
    (1, TType.STRUCT, 'authzToken', [airavata.model.security.ttypes.AuthzToken, None], None, ),  # 1
    (2, TType.STRING, 'airavataExperimentId', 'UTF8', None, ),  # 2
    (3, TType.STRUCT, 'userConfiguration', [airavata.model.experiment.ttypes.UserConfigurationDataModel, None], None, ),  # 3
)


class updateExperimentConfiguration_result(object):
    """
    Attributes:
     - ae

    """


    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.read(iprot)
                else:
                    iprot.skip(ftype)
            else:
                iprot.skip(ftype)
            iprot.readFieldEnd()
        iprot.readStructEnd()

    def write(self, oprot):
        if oprot._fast_encode is 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)
all_structs.append(updateExperimentConfiguration_result)
updateExperimentConfiguration_result.thrift_spec = (
    None,  # 0
    (1, TType.STRUCT, 'ae', [airavata.api.error.ttypes.AuthorizationException, None], None, ),  # 1
)


class updateResourceScheduleing_args(object):
    """
    Attributes:
     - authzToken
     - airavataExperimentId
     - resourceScheduling

    """


    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', errors='replace') 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)
all_structs.append(updateResourceScheduleing_args)
updateResourceScheduleing_args.thrift_spec = (
    None,  # 0
    (1, TType.STRUCT, 'authzToken', [airavata.model.security.ttypes.AuthzToken, None], None, ),  # 1
    (2, TType.STRING, 'airavataExperimentId', 'UTF8', None, ),  # 2
    (3, TType.STRUCT, 'resourceScheduling', [airavata.model.scheduling.ttypes.ComputationalResourceSchedulingModel, None], None, ),  # 3
)


class updateResourceScheduleing_result(object):
    """
    Attributes:
     - ae

    """


    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.read(iprot)
                else:
                    iprot.skip(ftype)
            else:
                iprot.skip(ftype)
            iprot.readFieldEnd()
        iprot.readStructEnd()

    def write(self, oprot):
        if oprot._fast_encode is 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)
all_structs.append(updateResourceScheduleing_result)
updateResourceScheduleing_result.thrift_spec = (
    None,  # 0
    (1, TType.STRUCT, 'ae', [airavata.api.error.ttypes.AuthorizationException, None], None, ),  # 1
)


class validateExperiment_args(object):
    """
    Attributes:
     - authzToken
     - airavataExperimentId

    """


    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', errors='replace') if sys.version_info[0] == 2 else iprot.readString()
                else:
                    iprot.skip(ftype)
            else:
                iprot.skip(ftype)
            iprot.readFieldEnd()
        iprot.readStructEnd()

    def write(self, oprot):
        if oprot._fast_encode is not None and self.thrift_spec is not None:
            oprot.trans.write(oprot._fast_encode(self, [self.__class__, self.thrift_spec]))
            return
        oprot.writeStructBegin('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)
all_structs.append(validateExperiment_args)
validateExperiment_args.thrift_spec = (
    None,  # 0
    (1, TType.STRUCT, 'authzToken', [airavata.model.security.ttypes.AuthzToken, None], None, ),  # 1
    (2, TType.STRING, 'airavataExperimentId', 'UTF8', None, ),  # 2
)


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

    """


    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.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 2:
                if ftype == TType.STRUCT:
                    self.enf = airavata.api.error.ttypes.ExperimentNotFoundException.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 3:
                if ftype == TType.STRUCT:
                    self.ace = airavata.api.error.ttypes.AiravataClientException.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 4:
                if ftype == TType.STRUCT:
                    self.ase = airavata.api.error.ttypes.AiravataSystemException.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 5:
                if ftype == TType.STRUCT:
                    self.ae = airavata.api.error.ttypes.AuthorizationException.read(iprot)
                else:
                    iprot.skip(ftype)
            else:
                iprot.skip(ftype)
            iprot.readFieldEnd()
        iprot.readStructEnd()

    def write(self, oprot):
        if oprot._fast_encode is 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)
all_structs.append(validateExperiment_result)
validateExperiment_result.thrift_spec = (
    (0, TType.BOOL, 'success', None, None, ),  # 0
    (1, TType.STRUCT, 'ire', [airavata.api.error.ttypes.InvalidRequestException, None], None, ),  # 1
    (2, TType.STRUCT, 'enf', [airavata.api.error.ttypes.ExperimentNotFoundException, None], None, ),  # 2
    (3, TType.STRUCT, 'ace', [airavata.api.error.ttypes.AiravataClientException, None], None, ),  # 3
    (4, TType.STRUCT, 'ase', [airavata.api.error.ttypes.AiravataSystemException, None], None, ),  # 4
    (5, TType.STRUCT, 'ae', [airavata.api.error.ttypes.AuthorizationException, None], None, ),  # 5
)


class launchExperiment_args(object):
    """
    Attributes:
     - authzToken
     - airavataExperimentId
     - gatewayId

    """


    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', errors='replace') 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', errors='replace') if sys.version_info[0] == 2 else iprot.readString()
                else:
                    iprot.skip(ftype)
            else:
                iprot.skip(ftype)
            iprot.readFieldEnd()
        iprot.readStructEnd()

    def write(self, oprot):
        if oprot._fast_encode is not None and self.thrift_spec is not None:
            oprot.trans.write(oprot._fast_encode(self, [self.__class__, self.thrift_spec]))
            return
        oprot.writeStructBegin('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)
all_structs.append(launchExperiment_args)
launchExperiment_args.thrift_spec = (
    None,  # 0
    (1, TType.STRUCT, 'authzToken', [airavata.model.security.ttypes.AuthzToken, None], None, ),  # 1
    (2, TType.STRING, 'airavataExperimentId', 'UTF8', None, ),  # 2
    (3, TType.STRING, 'gatewayId', 'UTF8', None, ),  # 3
)


class launchExperiment_result(object):
    """
    Attributes:
     - ire
     - enf
     - ace
     - ase
     - ae

    """


    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.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 2:
                if ftype == TType.STRUCT:
                    self.enf = airavata.api.error.ttypes.ExperimentNotFoundException.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 3:
                if ftype == TType.STRUCT:
                    self.ace = airavata.api.error.ttypes.AiravataClientException.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 4:
                if ftype == TType.STRUCT:
                    self.ase = airavata.api.error.ttypes.AiravataSystemException.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 5:
                if ftype == TType.STRUCT:
                    self.ae = airavata.api.error.ttypes.AuthorizationException.read(iprot)
                else:
                    iprot.skip(ftype)
            else:
                iprot.skip(ftype)
            iprot.readFieldEnd()
        iprot.readStructEnd()

    def write(self, oprot):
        if oprot._fast_encode is 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)
all_structs.append(launchExperiment_result)
launchExperiment_result.thrift_spec = (
    None,  # 0
    (1, TType.STRUCT, 'ire', [airavata.api.error.ttypes.InvalidRequestException, None], None, ),  # 1
    (2, TType.STRUCT, 'enf', [airavata.api.error.ttypes.ExperimentNotFoundException, None], None, ),  # 2
    (3, TType.STRUCT, 'ace', [airavata.api.error.ttypes.AiravataClientException, None], None, ),  # 3
    (4, TType.STRUCT, 'ase', [airavata.api.error.ttypes.AiravataSystemException, None], None, ),  # 4
    (5, TType.STRUCT, 'ae', [airavata.api.error.ttypes.AuthorizationException, None], None, ),  # 5
)


class getExperimentStatus_args(object):
    """
    Attributes:
     - authzToken
     - airavataExperimentId

    """


    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', errors='replace') if sys.version_info[0] == 2 else iprot.readString()
                else:
                    iprot.skip(ftype)
            else:
                iprot.skip(ftype)
            iprot.readFieldEnd()
        iprot.readStructEnd()

    def write(self, oprot):
        if oprot._fast_encode is not None and self.thrift_spec is not None:
            oprot.trans.write(oprot._fast_encode(self, [self.__class__, self.thrift_spec]))
            return
        oprot.writeStructBegin('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)
all_structs.append(getExperimentStatus_args)
getExperimentStatus_args.thrift_spec = (
    None,  # 0
    (1, TType.STRUCT, 'authzToken', [airavata.model.security.ttypes.AuthzToken, None], None, ),  # 1
    (2, TType.STRING, 'airavataExperimentId', 'UTF8', None, ),  # 2
)


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

    """


    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.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 2:
                if ftype == TType.STRUCT:
                    self.enf = airavata.api.error.ttypes.ExperimentNotFoundException.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 3:
                if ftype == TType.STRUCT:
                    self.ace = airavata.api.error.ttypes.AiravataClientException.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 4:
                if ftype == TType.STRUCT:
                    self.ase = airavata.api.error.ttypes.AiravataSystemException.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 5:
                if ftype == TType.STRUCT:
                    self.ae = airavata.api.error.ttypes.AuthorizationException.read(iprot)
                else:
                    iprot.skip(ftype)
            else:
                iprot.skip(ftype)
            iprot.readFieldEnd()
        iprot.readStructEnd()

    def write(self, oprot):
        if oprot._fast_encode is 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)
all_structs.append(getExperimentStatus_result)
getExperimentStatus_result.thrift_spec = (
    (0, TType.STRUCT, 'success', [airavata.model.status.ttypes.ExperimentStatus, None], None, ),  # 0
    (1, TType.STRUCT, 'ire', [airavata.api.error.ttypes.InvalidRequestException, None], None, ),  # 1
    (2, TType.STRUCT, 'enf', [airavata.api.error.ttypes.ExperimentNotFoundException, None], None, ),  # 2
    (3, TType.STRUCT, 'ace', [airavata.api.error.ttypes.AiravataClientException, None], None, ),  # 3
    (4, TType.STRUCT, 'ase', [airavata.api.error.ttypes.AiravataSystemException, None], None, ),  # 4
    (5, TType.STRUCT, 'ae', [airavata.api.error.ttypes.AuthorizationException, None], None, ),  # 5
)


class getExperimentOutputs_args(object):
    """
    Attributes:
     - authzToken
     - airavataExperimentId

    """


    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', errors='replace') if sys.version_info[0] == 2 else iprot.readString()
                else:
                    iprot.skip(ftype)
            else:
                iprot.skip(ftype)
            iprot.readFieldEnd()
        iprot.readStructEnd()

    def write(self, oprot):
        if oprot._fast_encode is not None and self.thrift_spec is not None:
            oprot.trans.write(oprot._fast_encode(self, [self.__class__, self.thrift_spec]))
            return
        oprot.writeStructBegin('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)
all_structs.append(getExperimentOutputs_args)
getExperimentOutputs_args.thrift_spec = (
    None,  # 0
    (1, TType.STRUCT, 'authzToken', [airavata.model.security.ttypes.AuthzToken, None], None, ),  # 1
    (2, TType.STRING, 'airavataExperimentId', 'UTF8', None, ),  # 2
)


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

    """


    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.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 2:
                if ftype == TType.STRUCT:
                    self.enf = airavata.api.error.ttypes.ExperimentNotFoundException.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 3:
                if ftype == TType.STRUCT:
                    self.ace = airavata.api.error.ttypes.AiravataClientException.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 4:
                if ftype == TType.STRUCT:
                    self.ase = airavata.api.error.ttypes.AiravataSystemException.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 5:
                if ftype == TType.STRUCT:
                    self.ae = airavata.api.error.ttypes.AuthorizationException.read(iprot)
                else:
                    iprot.skip(ftype)
            else:
                iprot.skip(ftype)
            iprot.readFieldEnd()
        iprot.readStructEnd()

    def write(self, oprot):
        if oprot._fast_encode is 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)
all_structs.append(getExperimentOutputs_result)
getExperimentOutputs_result.thrift_spec = (
    (0, TType.LIST, 'success', (TType.STRUCT, [airavata.model.application.io.ttypes.OutputDataObjectType, None], False), None, ),  # 0
    (1, TType.STRUCT, 'ire', [airavata.api.error.ttypes.InvalidRequestException, None], None, ),  # 1
    (2, TType.STRUCT, 'enf', [airavata.api.error.ttypes.ExperimentNotFoundException, None], None, ),  # 2
    (3, TType.STRUCT, 'ace', [airavata.api.error.ttypes.AiravataClientException, None], None, ),  # 3
    (4, TType.STRUCT, 'ase', [airavata.api.error.ttypes.AiravataSystemException, None], None, ),  # 4
    (5, TType.STRUCT, 'ae', [airavata.api.error.ttypes.AuthorizationException, None], None, ),  # 5
)


class getIntermediateOutputs_args(object):
    """
    Attributes:
     - authzToken
     - airavataExperimentId

    """


    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', errors='replace') if sys.version_info[0] == 2 else iprot.readString()
                else:
                    iprot.skip(ftype)
            else:
                iprot.skip(ftype)
            iprot.readFieldEnd()
        iprot.readStructEnd()

    def write(self, oprot):
        if oprot._fast_encode is not None and self.thrift_spec is not None:
            oprot.trans.write(oprot._fast_encode(self, [self.__class__, self.thrift_spec]))
            return
        oprot.writeStructBegin('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)
all_structs.append(getIntermediateOutputs_args)
getIntermediateOutputs_args.thrift_spec = (
    None,  # 0
    (1, TType.STRUCT, 'authzToken', [airavata.model.security.ttypes.AuthzToken, None], None, ),  # 1
    (2, TType.STRING, 'airavataExperimentId', 'UTF8', None, ),  # 2
)


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

    """


    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.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 2:
                if ftype == TType.STRUCT:
                    self.enf = airavata.api.error.ttypes.ExperimentNotFoundException.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 3:
                if ftype == TType.STRUCT:
                    self.ace = airavata.api.error.ttypes.AiravataClientException.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 4:
                if ftype == TType.STRUCT:
                    self.ase = airavata.api.error.ttypes.AiravataSystemException.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 5:
                if ftype == TType.STRUCT:
                    self.ae = airavata.api.error.ttypes.AuthorizationException.read(iprot)
                else:
                    iprot.skip(ftype)
            else:
                iprot.skip(ftype)
            iprot.readFieldEnd()
        iprot.readStructEnd()

    def write(self, oprot):
        if oprot._fast_encode is 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)
all_structs.append(getIntermediateOutputs_result)
getIntermediateOutputs_result.thrift_spec = (
    (0, TType.LIST, 'success', (TType.STRUCT, [airavata.model.application.io.ttypes.OutputDataObjectType, None], False), None, ),  # 0
    (1, TType.STRUCT, 'ire', [airavata.api.error.ttypes.InvalidRequestException, None], None, ),  # 1
    (2, TType.STRUCT, 'enf', [airavata.api.error.ttypes.ExperimentNotFoundException, None], None, ),  # 2
    (3, TType.STRUCT, 'ace', [airavata.api.error.ttypes.AiravataClientException, None], None, ),  # 3
    (4, TType.STRUCT, 'ase', [airavata.api.error.ttypes.AiravataSystemException, None], None, ),  # 4
    (5, TType.STRUCT, 'ae', [airavata.api.error.ttypes.AuthorizationException, None], None, ),  # 5
)


class fetchIntermediateOutputs_args(object):
    """
    Attributes:
     - authzToken
     - airavataExperimentId
     - outputNames

    """


    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', errors='replace') 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', errors='replace') 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)
all_structs.append(fetchIntermediateOutputs_args)
fetchIntermediateOutputs_args.thrift_spec = (
    None,  # 0
    (1, TType.STRUCT, 'authzToken', [airavata.model.security.ttypes.AuthzToken, None], None, ),  # 1
    (2, TType.STRING, 'airavataExperimentId', 'UTF8', None, ),  # 2
    (3, TType.LIST, 'outputNames', (TType.STRING, 'UTF8', False), None, ),  # 3
)


class fetchIntermediateOutputs_result(object):
    """
    Attributes:
     - ire
     - enf
     - ace
     - ase
     - ae

    """


    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.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 2:
                if ftype == TType.STRUCT:
                    self.enf = airavata.api.error.ttypes.ExperimentNotFoundException.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 3:
                if ftype == TType.STRUCT:
                    self.ace = airavata.api.error.ttypes.AiravataClientException.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 4:
                if ftype == TType.STRUCT:
                    self.ase = airavata.api.error.ttypes.AiravataSystemException.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 5:
                if ftype == TType.STRUCT:
                    self.ae = airavata.api.error.ttypes.AuthorizationException.read(iprot)
                else:
                    iprot.skip(ftype)
            else:
                iprot.skip(ftype)
            iprot.readFieldEnd()
        iprot.readStructEnd()

    def write(self, oprot):
        if oprot._fast_encode is 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)
all_structs.append(fetchIntermediateOutputs_result)
fetchIntermediateOutputs_result.thrift_spec = (
    None,  # 0
    (1, TType.STRUCT, 'ire', [airavata.api.error.ttypes.InvalidRequestException, None], None, ),  # 1
    (2, TType.STRUCT, 'enf', [airavata.api.error.ttypes.ExperimentNotFoundException, None], None, ),  # 2
    (3, TType.STRUCT, 'ace', [airavata.api.error.ttypes.AiravataClientException, None], None, ),  # 3
    (4, TType.STRUCT, 'ase', [airavata.api.error.ttypes.AiravataSystemException, None], None, ),  # 4
    (5, TType.STRUCT, 'ae', [airavata.api.error.ttypes.AuthorizationException, None], None, ),  # 5
)


class getIntermediateOutputProcessStatus_args(object):
    """
    Attributes:
     - authzToken
     - airavataExperimentId
     - outputNames

    """


    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', errors='replace') 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', errors='replace') 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)
all_structs.append(getIntermediateOutputProcessStatus_args)
getIntermediateOutputProcessStatus_args.thrift_spec = (
    None,  # 0
    (1, TType.STRUCT, 'authzToken', [airavata.model.security.ttypes.AuthzToken, None], None, ),  # 1
    (2, TType.STRING, 'airavataExperimentId', 'UTF8', None, ),  # 2
    (3, TType.LIST, 'outputNames', (TType.STRING, 'UTF8', False), None, ),  # 3
)


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

    """


    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.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 2:
                if ftype == TType.STRUCT:
                    self.enf = airavata.api.error.ttypes.ExperimentNotFoundException.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 3:
                if ftype == TType.STRUCT:
                    self.ace = airavata.api.error.ttypes.AiravataClientException.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 4:
                if ftype == TType.STRUCT:
                    self.ase = airavata.api.error.ttypes.AiravataSystemException.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 5:
                if ftype == TType.STRUCT:
                    self.ae = airavata.api.error.ttypes.AuthorizationException.read(iprot)
                else:
                    iprot.skip(ftype)
            else:
                iprot.skip(ftype)
            iprot.readFieldEnd()
        iprot.readStructEnd()

    def write(self, oprot):
        if oprot._fast_encode is 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)
all_structs.append(getIntermediateOutputProcessStatus_result)
getIntermediateOutputProcessStatus_result.thrift_spec = (
    (0, TType.STRUCT, 'success', [airavata.model.status.ttypes.ProcessStatus, None], None, ),  # 0
    (1, TType.STRUCT, 'ire', [airavata.api.error.ttypes.InvalidRequestException, None], None, ),  # 1
    (2, TType.STRUCT, 'enf', [airavata.api.error.ttypes.ExperimentNotFoundException, None], None, ),  # 2
    (3, TType.STRUCT, 'ace', [airavata.api.error.ttypes.AiravataClientException, None], None, ),  # 3
    (4, TType.STRUCT, 'ase', [airavata.api.error.ttypes.AiravataSystemException, None], None, ),  # 4
    (5, TType.STRUCT, 'ae', [airavata.api.error.ttypes.AuthorizationException, None], None, ),  # 5
)


class getJobStatuses_args(object):
    """
    Attributes:
     - authzToken
     - airavataExperimentId

    """


    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', errors='replace') if sys.version_info[0] == 2 else iprot.readString()
                else:
                    iprot.skip(ftype)
            else:
                iprot.skip(ftype)
            iprot.readFieldEnd()
        iprot.readStructEnd()

    def write(self, oprot):
        if oprot._fast_encode is not None and self.thrift_spec is not None:
            oprot.trans.write(oprot._fast_encode(self, [self.__class__, self.thrift_spec]))
            return
        oprot.writeStructBegin('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)
all_structs.append(getJobStatuses_args)
getJobStatuses_args.thrift_spec = (
    None,  # 0
    (1, TType.STRUCT, 'authzToken', [airavata.model.security.ttypes.AuthzToken, None], None, ),  # 1
    (2, TType.STRING, 'airavataExperimentId', 'UTF8', None, ),  # 2
)


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

    """


    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', errors='replace') 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.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 2:
                if ftype == TType.STRUCT:
                    self.enf = airavata.api.error.ttypes.ExperimentNotFoundException.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 3:
                if ftype == TType.STRUCT:
                    self.ace = airavata.api.error.ttypes.AiravataClientException.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 4:
                if ftype == TType.STRUCT:
                    self.ase = airavata.api.error.ttypes.AiravataSystemException.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 5:
                if ftype == TType.STRUCT:
                    self.ae = airavata.api.error.ttypes.AuthorizationException.read(iprot)
                else:
                    iprot.skip(ftype)
            else:
                iprot.skip(ftype)
            iprot.readFieldEnd()
        iprot.readStructEnd()

    def write(self, oprot):
        if oprot._fast_encode is 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)
all_structs.append(getJobStatuses_result)
getJobStatuses_result.thrift_spec = (
    (0, TType.MAP, 'success', (TType.STRING, 'UTF8', TType.STRUCT, [airavata.model.status.ttypes.JobStatus, None], False), None, ),  # 0
    (1, TType.STRUCT, 'ire', [airavata.api.error.ttypes.InvalidRequestException, None], None, ),  # 1
    (2, TType.STRUCT, 'enf', [airavata.api.error.ttypes.ExperimentNotFoundException, None], None, ),  # 2
    (3, TType.STRUCT, 'ace', [airavata.api.error.ttypes.AiravataClientException, None], None, ),  # 3
    (4, TType.STRUCT, 'ase', [airavata.api.error.ttypes.AiravataSystemException, None], None, ),  # 4
    (5, TType.STRUCT, 'ae', [airavata.api.error.ttypes.AuthorizationException, None], None, ),  # 5
)


class getJobDetails_args(object):
    """
    Attributes:
     - authzToken
     - airavataExperimentId

    """


    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', errors='replace') if sys.version_info[0] == 2 else iprot.readString()
                else:
                    iprot.skip(ftype)
            else:
                iprot.skip(ftype)
            iprot.readFieldEnd()
        iprot.readStructEnd()

    def write(self, oprot):
        if oprot._fast_encode is not None and self.thrift_spec is not None:
            oprot.trans.write(oprot._fast_encode(self, [self.__class__, self.thrift_spec]))
            return
        oprot.writeStructBegin('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)
all_structs.append(getJobDetails_args)
getJobDetails_args.thrift_spec = (
    None,  # 0
    (1, TType.STRUCT, 'authzToken', [airavata.model.security.ttypes.AuthzToken, None], None, ),  # 1
    (2, TType.STRING, 'airavataExperimentId', 'UTF8', None, ),  # 2
)


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

    """


    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.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 2:
                if ftype == TType.STRUCT:
                    self.enf = airavata.api.error.ttypes.ExperimentNotFoundException.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 3:
                if ftype == TType.STRUCT:
                    self.ace = airavata.api.error.ttypes.AiravataClientException.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 4:
                if ftype == TType.STRUCT:
                    self.ase = airavata.api.error.ttypes.AiravataSystemException.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 5:
                if ftype == TType.STRUCT:
                    self.ae = airavata.api.error.ttypes.AuthorizationException.read(iprot)
                else:
                    iprot.skip(ftype)
            else:
                iprot.skip(ftype)
            iprot.readFieldEnd()
        iprot.readStructEnd()

    def write(self, oprot):
        if oprot._fast_encode is 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)
all_structs.append(getJobDetails_result)
getJobDetails_result.thrift_spec = (
    (0, TType.LIST, 'success', (TType.STRUCT, [airavata.model.job.ttypes.JobModel, None], False), None, ),  # 0
    (1, TType.STRUCT, 'ire', [airavata.api.error.ttypes.InvalidRequestException, None], None, ),  # 1
    (2, TType.STRUCT, 'enf', [airavata.api.error.ttypes.ExperimentNotFoundException, None], None, ),  # 2
    (3, TType.STRUCT, 'ace', [airavata.api.error.ttypes.AiravataClientException, None], None, ),  # 3
    (4, TType.STRUCT, 'ase', [airavata.api.error.ttypes.AiravataSystemException, None], None, ),  # 4
    (5, TType.STRUCT, 'ae', [airavata.api.error.ttypes.AuthorizationException, None], None, ),  # 5
)


class cloneExperiment_args(object):
    """
    Attributes:
     - authzToken
     - existingExperimentID
     - newExperimentName
     - newExperimentProjectId

    """


    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', errors='replace') 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', errors='replace') 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', errors='replace') if sys.version_info[0] == 2 else iprot.readString()
                else:
                    iprot.skip(ftype)
            else:
                iprot.skip(ftype)
            iprot.readFieldEnd()
        iprot.readStructEnd()

    def write(self, oprot):
        if oprot._fast_encode is not None and self.thrift_spec is not None:
            oprot.trans.write(oprot._fast_encode(self, [self.__class__, self.thrift_spec]))
            return
        oprot.writeStructBegin('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)
all_structs.append(cloneExperiment_args)
cloneExperiment_args.thrift_spec = (
    None,  # 0
    (1, TType.STRUCT, 'authzToken', [airavata.model.security.ttypes.AuthzToken, None], None, ),  # 1
    (2, TType.STRING, 'existingExperimentID', 'UTF8', None, ),  # 2
    (3, TType.STRING, 'newExperimentName', 'UTF8', None, ),  # 3
    (4, TType.STRING, 'newExperimentProjectId', 'UTF8', None, ),  # 4
)


class cloneExperiment_result(object):
    """
    Attributes:
     - success
     - ire
     - enf
     - ace
     - ase
     - ae
     - pnfe

    """


    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', errors='replace') 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.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 2:
                if ftype == TType.STRUCT:
                    self.enf = airavata.api.error.ttypes.ExperimentNotFoundException.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 3:
                if ftype == TType.STRUCT:
                    self.ace = airavata.api.error.ttypes.AiravataClientException.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 4:
                if ftype == TType.STRUCT:
                    self.ase = airavata.api.error.ttypes.AiravataSystemException.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 5:
                if ftype == TType.STRUCT:
                    self.ae = airavata.api.error.ttypes.AuthorizationException.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 6:
                if ftype == TType.STRUCT:
                    self.pnfe = airavata.api.error.ttypes.ProjectNotFoundException.read(iprot)
                else:
                    iprot.skip(ftype)
            else:
                iprot.skip(ftype)
            iprot.readFieldEnd()
        iprot.readStructEnd()

    def write(self, oprot):
        if oprot._fast_encode is 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)
all_structs.append(cloneExperiment_result)
cloneExperiment_result.thrift_spec = (
    (0, TType.STRING, 'success', 'UTF8', None, ),  # 0
    (1, TType.STRUCT, 'ire', [airavata.api.error.ttypes.InvalidRequestException, None], None, ),  # 1
    (2, TType.STRUCT, 'enf', [airavata.api.error.ttypes.ExperimentNotFoundException, None], None, ),  # 2
    (3, TType.STRUCT, 'ace', [airavata.api.error.ttypes.AiravataClientException, None], None, ),  # 3
    (4, TType.STRUCT, 'ase', [airavata.api.error.ttypes.AiravataSystemException, None], None, ),  # 4
    (5, TType.STRUCT, 'ae', [airavata.api.error.ttypes.AuthorizationException, None], None, ),  # 5
    (6, TType.STRUCT, 'pnfe', [airavata.api.error.ttypes.ProjectNotFoundException, None], None, ),  # 6
)


class cloneExperimentByAdmin_args(object):
    """
    Attributes:
     - authzToken
     - existingExperimentID
     - newExperimentName
     - newExperimentProjectId

    """


    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', errors='replace') 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', errors='replace') 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', errors='replace') if sys.version_info[0] == 2 else iprot.readString()
                else:
                    iprot.skip(ftype)
            else:
                iprot.skip(ftype)
            iprot.readFieldEnd()
        iprot.readStructEnd()

    def write(self, oprot):
        if oprot._fast_encode is not None and self.thrift_spec is not None:
            oprot.trans.write(oprot._fast_encode(self, [self.__class__, self.thrift_spec]))
            return
        oprot.writeStructBegin('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)
all_structs.append(cloneExperimentByAdmin_args)
cloneExperimentByAdmin_args.thrift_spec = (
    None,  # 0
    (1, TType.STRUCT, 'authzToken', [airavata.model.security.ttypes.AuthzToken, None], None, ),  # 1
    (2, TType.STRING, 'existingExperimentID', 'UTF8', None, ),  # 2
    (3, TType.STRING, 'newExperimentName', 'UTF8', None, ),  # 3
    (4, TType.STRING, 'newExperimentProjectId', 'UTF8', None, ),  # 4
)


class cloneExperimentByAdmin_result(object):
    """
    Attributes:
     - success
     - ire
     - enf
     - ace
     - ase
     - ae
     - pnfe

    """


    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', errors='replace') 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.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 2:
                if ftype == TType.STRUCT:
                    self.enf = airavata.api.error.ttypes.ExperimentNotFoundException.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 3:
                if ftype == TType.STRUCT:
                    self.ace = airavata.api.error.ttypes.AiravataClientException.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 4:
                if ftype == TType.STRUCT:
                    self.ase = airavata.api.error.ttypes.AiravataSystemException.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 5:
                if ftype == TType.STRUCT:
                    self.ae = airavata.api.error.ttypes.AuthorizationException.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 6:
                if ftype == TType.STRUCT:
                    self.pnfe = airavata.api.error.ttypes.ProjectNotFoundException.read(iprot)
                else:
                    iprot.skip(ftype)
            else:
                iprot.skip(ftype)
            iprot.readFieldEnd()
        iprot.readStructEnd()

    def write(self, oprot):
        if oprot._fast_encode is 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)
all_structs.append(cloneExperimentByAdmin_result)
cloneExperimentByAdmin_result.thrift_spec = (
    (0, TType.STRING, 'success', 'UTF8', None, ),  # 0
    (1, TType.STRUCT, 'ire', [airavata.api.error.ttypes.InvalidRequestException, None], None, ),  # 1
    (2, TType.STRUCT, 'enf', [airavata.api.error.ttypes.ExperimentNotFoundException, None], None, ),  # 2
    (3, TType.STRUCT, 'ace', [airavata.api.error.ttypes.AiravataClientException, None], None, ),  # 3
    (4, TType.STRUCT, 'ase', [airavata.api.error.ttypes.AiravataSystemException, None], None, ),  # 4
    (5, TType.STRUCT, 'ae', [airavata.api.error.ttypes.AuthorizationException, None], None, ),  # 5
    (6, TType.STRUCT, 'pnfe', [airavata.api.error.ttypes.ProjectNotFoundException, None], None, ),  # 6
)


class terminateExperiment_args(object):
    """
    Attributes:
     - authzToken
     - airavataExperimentId
     - gatewayId

    """


    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', errors='replace') 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', errors='replace') if sys.version_info[0] == 2 else iprot.readString()
                else:
                    iprot.skip(ftype)
            else:
                iprot.skip(ftype)
            iprot.readFieldEnd()
        iprot.readStructEnd()

    def write(self, oprot):
        if oprot._fast_encode is not None and self.thrift_spec is not None:
            oprot.trans.write(oprot._fast_encode(self, [self.__class__, self.thrift_spec]))
            return
        oprot.writeStructBegin('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)
all_structs.append(terminateExperiment_args)
terminateExperiment_args.thrift_spec = (
    None,  # 0
    (1, TType.STRUCT, 'authzToken', [airavata.model.security.ttypes.AuthzToken, None], None, ),  # 1
    (2, TType.STRING, 'airavataExperimentId', 'UTF8', None, ),  # 2
    (3, TType.STRING, 'gatewayId', 'UTF8', None, ),  # 3
)


class terminateExperiment_result(object):
    """
    Attributes:
     - ire
     - enf
     - ace
     - ase
     - ae

    """


    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.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 2:
                if ftype == TType.STRUCT:
                    self.enf = airavata.api.error.ttypes.ExperimentNotFoundException.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 3:
                if ftype == TType.STRUCT:
                    self.ace = airavata.api.error.ttypes.AiravataClientException.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 4:
                if ftype == TType.STRUCT:
                    self.ase = airavata.api.error.ttypes.AiravataSystemException.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 5:
                if ftype == TType.STRUCT:
                    self.ae = airavata.api.error.ttypes.AuthorizationException.read(iprot)
                else:
                    iprot.skip(ftype)
            else:
                iprot.skip(ftype)
            iprot.readFieldEnd()
        iprot.readStructEnd()

    def write(self, oprot):
        if oprot._fast_encode is 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)
all_structs.append(terminateExperiment_result)
terminateExperiment_result.thrift_spec = (
    None,  # 0
    (1, TType.STRUCT, 'ire', [airavata.api.error.ttypes.InvalidRequestException, None], None, ),  # 1
    (2, TType.STRUCT, 'enf', [airavata.api.error.ttypes.ExperimentNotFoundException, None], None, ),  # 2
    (3, TType.STRUCT, 'ace', [airavata.api.error.ttypes.AiravataClientException, None], None, ),  # 3
    (4, TType.STRUCT, 'ase', [airavata.api.error.ttypes.AiravataSystemException, None], None, ),  # 4
    (5, TType.STRUCT, 'ae', [airavata.api.error.ttypes.AuthorizationException, None], None, ),  # 5
)


class registerApplicationModule_args(object):
    """
    Attributes:
     - authzToken
     - gatewayId
     - applicationModule

    """


    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', errors='replace') 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)
all_structs.append(registerApplicationModule_args)
registerApplicationModule_args.thrift_spec = (
    None,  # 0
    (1, TType.STRUCT, 'authzToken', [airavata.model.security.ttypes.AuthzToken, None], None, ),  # 1
    (2, TType.STRING, 'gatewayId', 'UTF8', None, ),  # 2
    (3, TType.STRUCT, 'applicationModule', [airavata.model.appcatalog.appdeployment.ttypes.ApplicationModule, None], None, ),  # 3
)


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

    """


    def __init__(self, success=None, ire=None, ace=None, ase=None, ae=None,):
        self.success = success
        self.ire = ire
        self.ace = ace
        self.ase = ase
        self.ae = ae

    def read(self, iprot):
        if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None:
            iprot._fast_decode(self, iprot, [self.__class__, 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', errors='replace') 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.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 2:
                if ftype == TType.STRUCT:
                    self.ace = airavata.api.error.ttypes.AiravataClientException.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 3:
                if ftype == TType.STRUCT:
                    self.ase = airavata.api.error.ttypes.AiravataSystemException.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 4:
                if ftype == TType.STRUCT:
                    self.ae = airavata.api.error.ttypes.AuthorizationException.read(iprot)
                else:
                    iprot.skip(ftype)
            else:
                iprot.skip(ftype)
            iprot.readFieldEnd()
        iprot.readStructEnd()

    def write(self, oprot):
        if oprot._fast_encode is 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)
all_structs.append(registerApplicationModule_result)
registerApplicationModule_result.thrift_spec = (
    (0, TType.STRING, 'success', 'UTF8', None, ),  # 0
    (1, TType.STRUCT, 'ire', [airavata.api.error.ttypes.InvalidRequestException, None], None, ),  # 1
    (2, TType.STRUCT, 'ace', [airavata.api.error.ttypes.AiravataClientException, None], None, ),  # 2
    (3, TType.STRUCT, 'ase', [airavata.api.error.ttypes.AiravataSystemException, None], None, ),  # 3
    (4, TType.STRUCT, 'ae', [airavata.api.error.ttypes.AuthorizationException, None], None, ),  # 4
)


class getApplicationModule_args(object):
    """
    Attributes:
     - authzToken
     - appModuleId

    """


    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', errors='replace') if sys.version_info[0] == 2 else iprot.readString()
                else:
                    iprot.skip(ftype)
            else:
                iprot.skip(ftype)
            iprot.readFieldEnd()
        iprot.readStructEnd()

    def write(self, oprot):
        if oprot._fast_encode is not None and self.thrift_spec is not None:
            oprot.trans.write(oprot._fast_encode(self, [self.__class__, self.thrift_spec]))
            return
        oprot.writeStructBegin('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)
all_structs.append(getApplicationModule_args)
getApplicationModule_args.thrift_spec = (
    None,  # 0
    (1, TType.STRUCT, 'authzToken', [airavata.model.security.ttypes.AuthzToken, None], None, ),  # 1
    (2, TType.STRING, 'appModuleId', 'UTF8', None, ),  # 2
)


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

    """


    def __init__(self, success=None, ire=None, ace=None, ase=None, ae=None,):
        self.success = success
        self.ire = ire
        self.ace = ace
        self.ase = ase
        self.ae = ae

    def read(self, iprot):
        if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None:
            iprot._fast_decode(self, iprot, [self.__class__, 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.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 2:
                if ftype == TType.STRUCT:
                    self.ace = airavata.api.error.ttypes.AiravataClientException.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 3:
                if ftype == TType.STRUCT:
                    self.ase = airavata.api.error.ttypes.AiravataSystemException.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 4:
                if ftype == TType.STRUCT:
                    self.ae = airavata.api.error.ttypes.AuthorizationException.read(iprot)
                else:
                    iprot.skip(ftype)
            else:
                iprot.skip(ftype)
            iprot.readFieldEnd()
        iprot.readStructEnd()

    def write(self, oprot):
        if oprot._fast_encode is 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)
all_structs.append(getApplicationModule_result)
getApplicationModule_result.thrift_spec = (
    (0, TType.STRUCT, 'success', [airavata.model.appcatalog.appdeployment.ttypes.ApplicationModule, None], None, ),  # 0
    (1, TType.STRUCT, 'ire', [airavata.api.error.ttypes.InvalidRequestException, None], None, ),  # 1
    (2, TType.STRUCT, 'ace', [airavata.api.error.ttypes.AiravataClientException, None], None, ),  # 2
    (3, TType.STRUCT, 'ase', [airavata.api.error.ttypes.AiravataSystemException, None], None, ),  # 3
    (4, TType.STRUCT, 'ae', [airavata.api.error.ttypes.AuthorizationException, None], None, ),  # 4
)


class updateApplicationModule_args(object):
    """
    Attributes:
     - authzToken
     - appModuleId
     - applicationModule

    """


    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', errors='replace') 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)
all_structs.append(updateApplicationModule_args)
updateApplicationModule_args.thrift_spec = (
    None,  # 0
    (1, TType.STRUCT, 'authzToken', [airavata.model.security.ttypes.AuthzToken, None], None, ),  # 1
    (2, TType.STRING, 'appModuleId', 'UTF8', None, ),  # 2
    (3, TType.STRUCT, 'applicationModule', [airavata.model.appcatalog.appdeployment.ttypes.ApplicationModule, None], None, ),  # 3
)


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

    """


    def __init__(self, success=None, ire=None, ace=None, ase=None, ae=None,):
        self.success = success
        self.ire = ire
        self.ace = ace
        self.ase = ase
        self.ae = ae

    def read(self, iprot):
        if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None:
            iprot._fast_decode(self, iprot, [self.__class__, 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.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 2:
                if ftype == TType.STRUCT:
                    self.ace = airavata.api.error.ttypes.AiravataClientException.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 3:
                if ftype == TType.STRUCT:
                    self.ase = airavata.api.error.ttypes.AiravataSystemException.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 4:
                if ftype == TType.STRUCT:
                    self.ae = airavata.api.error.ttypes.AuthorizationException.read(iprot)
                else:
                    iprot.skip(ftype)
            else:
                iprot.skip(ftype)
            iprot.readFieldEnd()
        iprot.readStructEnd()

    def write(self, oprot):
        if oprot._fast_encode is 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)
all_structs.append(updateApplicationModule_result)
updateApplicationModule_result.thrift_spec = (
    (0, TType.BOOL, 'success', None, None, ),  # 0
    (1, TType.STRUCT, 'ire', [airavata.api.error.ttypes.InvalidRequestException, None], None, ),  # 1
    (2, TType.STRUCT, 'ace', [airavata.api.error.ttypes.AiravataClientException, None], None, ),  # 2
    (3, TType.STRUCT, 'ase', [airavata.api.error.ttypes.AiravataSystemException, None], None, ),  # 3
    (4, TType.STRUCT, 'ae', [airavata.api.error.ttypes.AuthorizationException, None], None, ),  # 4
)


class getAllAppModules_args(object):
    """
    Attributes:
     - authzToken
     - gatewayId

    """


    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', errors='replace') if sys.version_info[0] == 2 else iprot.readString()
                else:
                    iprot.skip(ftype)
            else:
                iprot.skip(ftype)
            iprot.readFieldEnd()
        iprot.readStructEnd()

    def write(self, oprot):
        if oprot._fast_encode is not None and self.thrift_spec is not None:
            oprot.trans.write(oprot._fast_encode(self, [self.__class__, self.thrift_spec]))
            return
        oprot.writeStructBegin('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)
all_structs.append(getAllAppModules_args)
getAllAppModules_args.thrift_spec = (
    None,  # 0
    (1, TType.STRUCT, 'authzToken', [airavata.model.security.ttypes.AuthzToken, None], None, ),  # 1
    (2, TType.STRING, 'gatewayId', 'UTF8', None, ),  # 2
)


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

    """


    def __init__(self, success=None, ire=None, ace=None, ase=None, ae=None,):
        self.success = success
        self.ire = ire
        self.ace = ace
        self.ase = ase
        self.ae = ae

    def read(self, iprot):
        if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None:
            iprot._fast_decode(self, iprot, [self.__class__, 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.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 2:
                if ftype == TType.STRUCT:
                    self.ace = airavata.api.error.ttypes.AiravataClientException.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 3:
                if ftype == TType.STRUCT:
                    self.ase = airavata.api.error.ttypes.AiravataSystemException.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 4:
                if ftype == TType.STRUCT:
                    self.ae = airavata.api.error.ttypes.AuthorizationException.read(iprot)
                else:
                    iprot.skip(ftype)
            else:
                iprot.skip(ftype)
            iprot.readFieldEnd()
        iprot.readStructEnd()

    def write(self, oprot):
        if oprot._fast_encode is 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)
all_structs.append(getAllAppModules_result)
getAllAppModules_result.thrift_spec = (
    (0, TType.LIST, 'success', (TType.STRUCT, [airavata.model.appcatalog.appdeployment.ttypes.ApplicationModule, None], False), None, ),  # 0
    (1, TType.STRUCT, 'ire', [airavata.api.error.ttypes.InvalidRequestException, None], None, ),  # 1
    (2, TType.STRUCT, 'ace', [airavata.api.error.ttypes.AiravataClientException, None], None, ),  # 2
    (3, TType.STRUCT, 'ase', [airavata.api.error.ttypes.AiravataSystemException, None], None, ),  # 3
    (4, TType.STRUCT, 'ae', [airavata.api.error.ttypes.AuthorizationException, None], None, ),  # 4
)


class getAccessibleAppModules_args(object):
    """
    Attributes:
     - authzToken
     - gatewayId

    """


    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', errors='replace') if sys.version_info[0] == 2 else iprot.readString()
                else:
                    iprot.skip(ftype)
            else:
                iprot.skip(ftype)
            iprot.readFieldEnd()
        iprot.readStructEnd()

    def write(self, oprot):
        if oprot._fast_encode is not None and self.thrift_spec is not None:
            oprot.trans.write(oprot._fast_encode(self, [self.__class__, self.thrift_spec]))
            return
        oprot.writeStructBegin('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)
all_structs.append(getAccessibleAppModules_args)
getAccessibleAppModules_args.thrift_spec = (
    None,  # 0
    (1, TType.STRUCT, 'authzToken', [airavata.model.security.ttypes.AuthzToken, None], None, ),  # 1
    (2, TType.STRING, 'gatewayId', 'UTF8', None, ),  # 2
)


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

    """


    def __init__(self, success=None, ire=None, ace=None, ase=None, ae=None,):
        self.success = success
        self.ire = ire
        self.ace = ace
        self.ase = ase
        self.ae = ae

    def read(self, iprot):
        if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None:
            iprot._fast_decode(self, iprot, [self.__class__, 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.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 2:
                if ftype == TType.STRUCT:
                    self.ace = airavata.api.error.ttypes.AiravataClientException.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 3:
                if ftype == TType.STRUCT:
                    self.ase = airavata.api.error.ttypes.AiravataSystemException.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 4:
                if ftype == TType.STRUCT:
                    self.ae = airavata.api.error.ttypes.AuthorizationException.read(iprot)
                else:
                    iprot.skip(ftype)
            else:
                iprot.skip(ftype)
            iprot.readFieldEnd()
        iprot.readStructEnd()

    def write(self, oprot):
        if oprot._fast_encode is 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)
all_structs.append(getAccessibleAppModules_result)
getAccessibleAppModules_result.thrift_spec = (
    (0, TType.LIST, 'success', (TType.STRUCT, [airavata.model.appcatalog.appdeployment.ttypes.ApplicationModule, None], False), None, ),  # 0
    (1, TType.STRUCT, 'ire', [airavata.api.error.ttypes.InvalidRequestException, None], None, ),  # 1
    (2, TType.STRUCT, 'ace', [airavata.api.error.ttypes.AiravataClientException, None], None, ),  # 2
    (3, TType.STRUCT, 'ase', [airavata.api.error.ttypes.AiravataSystemException, None], None, ),  # 3
    (4, TType.STRUCT, 'ae', [airavata.api.error.ttypes.AuthorizationException, None], None, ),  # 4
)


class deleteApplicationModule_args(object):
    """
    Attributes:
     - authzToken
     - appModuleId

    """


    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', errors='replace') if sys.version_info[0] == 2 else iprot.readString()
                else:
                    iprot.skip(ftype)
            else:
                iprot.skip(ftype)
            iprot.readFieldEnd()
        iprot.readStructEnd()

    def write(self, oprot):
        if oprot._fast_encode is not None and self.thrift_spec is not None:
            oprot.trans.write(oprot._fast_encode(self, [self.__class__, self.thrift_spec]))
            return
        oprot.writeStructBegin('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)
all_structs.append(deleteApplicationModule_args)
deleteApplicationModule_args.thrift_spec = (
    None,  # 0
    (1, TType.STRUCT, 'authzToken', [airavata.model.security.ttypes.AuthzToken, None], None, ),  # 1
    (2, TType.STRING, 'appModuleId', 'UTF8', None, ),  # 2
)


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

    """


    def __init__(self, success=None, ire=None, ace=None, ase=None, ae=None,):
        self.success = success
        self.ire = ire
        self.ace = ace
        self.ase = ase
        self.ae = ae

    def read(self, iprot):
        if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None:
            iprot._fast_decode(self, iprot, [self.__class__, 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.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 2:
                if ftype == TType.STRUCT:
                    self.ace = airavata.api.error.ttypes.AiravataClientException.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 3:
                if ftype == TType.STRUCT:
                    self.ase = airavata.api.error.ttypes.AiravataSystemException.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 4:
                if ftype == TType.STRUCT:
                    self.ae = airavata.api.error.ttypes.AuthorizationException.read(iprot)
                else:
                    iprot.skip(ftype)
            else:
                iprot.skip(ftype)
            iprot.readFieldEnd()
        iprot.readStructEnd()

    def write(self, oprot):
        if oprot._fast_encode is 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)
all_structs.append(deleteApplicationModule_result)
deleteApplicationModule_result.thrift_spec = (
    (0, TType.BOOL, 'success', None, None, ),  # 0
    (1, TType.STRUCT, 'ire', [airavata.api.error.ttypes.InvalidRequestException, None], None, ),  # 1
    (2, TType.STRUCT, 'ace', [airavata.api.error.ttypes.AiravataClientException, None], None, ),  # 2
    (3, TType.STRUCT, 'ase', [airavata.api.error.ttypes.AiravataSystemException, None], None, ),  # 3
    (4, TType.STRUCT, 'ae', [airavata.api.error.ttypes.AuthorizationException, None], None, ),  # 4
)


class registerApplicationDeployment_args(object):
    """
    Attributes:
     - authzToken
     - gatewayId
     - applicationDeployment

    """


    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', errors='replace') 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)
all_structs.append(registerApplicationDeployment_args)
registerApplicationDeployment_args.thrift_spec = (
    None,  # 0
    (1, TType.STRUCT, 'authzToken', [airavata.model.security.ttypes.AuthzToken, None], None, ),  # 1
    (2, TType.STRING, 'gatewayId', 'UTF8', None, ),  # 2
    (3, TType.STRUCT, 'applicationDeployment', [airavata.model.appcatalog.appdeployment.ttypes.ApplicationDeploymentDescription, None], None, ),  # 3
)


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

    """


    def __init__(self, success=None, ire=None, ace=None, ase=None, ae=None,):
        self.success = success
        self.ire = ire
        self.ace = ace
        self.ase = ase
        self.ae = ae

    def read(self, iprot):
        if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None:
            iprot._fast_decode(self, iprot, [self.__class__, 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', errors='replace') 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.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 2:
                if ftype == TType.STRUCT:
                    self.ace = airavata.api.error.ttypes.AiravataClientException.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 3:
                if ftype == TType.STRUCT:
                    self.ase = airavata.api.error.ttypes.AiravataSystemException.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 4:
                if ftype == TType.STRUCT:
                    self.ae = airavata.api.error.ttypes.AuthorizationException.read(iprot)
                else:
                    iprot.skip(ftype)
            else:
                iprot.skip(ftype)
            iprot.readFieldEnd()
        iprot.readStructEnd()

    def write(self, oprot):
        if oprot._fast_encode is 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)
all_structs.append(registerApplicationDeployment_result)
registerApplicationDeployment_result.thrift_spec = (
    (0, TType.STRING, 'success', 'UTF8', None, ),  # 0
    (1, TType.STRUCT, 'ire', [airavata.api.error.ttypes.InvalidRequestException, None], None, ),  # 1
    (2, TType.STRUCT, 'ace', [airavata.api.error.ttypes.AiravataClientException, None], None, ),  # 2
    (3, TType.STRUCT, 'ase', [airavata.api.error.ttypes.AiravataSystemException, None], None, ),  # 3
    (4, TType.STRUCT, 'ae', [airavata.api.error.ttypes.AuthorizationException, None], None, ),  # 4
)


class getApplicationDeployment_args(object):
    """
    Attributes:
     - authzToken
     - appDeploymentId

    """


    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', errors='replace') if sys.version_info[0] == 2 else iprot.readString()
                else:
                    iprot.skip(ftype)
            else:
                iprot.skip(ftype)
            iprot.readFieldEnd()
        iprot.readStructEnd()

    def write(self, oprot):
        if oprot._fast_encode is not None and self.thrift_spec is not None:
            oprot.trans.write(oprot._fast_encode(self, [self.__class__, self.thrift_spec]))
            return
        oprot.writeStructBegin('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)
all_structs.append(getApplicationDeployment_args)
getApplicationDeployment_args.thrift_spec = (
    None,  # 0
    (1, TType.STRUCT, 'authzToken', [airavata.model.security.ttypes.AuthzToken, None], None, ),  # 1
    (2, TType.STRING, 'appDeploymentId', 'UTF8', None, ),  # 2
)


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

    """


    def __init__(self, success=None, ire=None, ace=None, ase=None, ae=None,):
        self.success = success
        self.ire = ire
        self.ace = ace
        self.ase = ase
        self.ae = ae

    def read(self, iprot):
        if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None:
            iprot._fast_decode(self, iprot, [self.__class__, 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.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 2:
                if ftype == TType.STRUCT:
                    self.ace = airavata.api.error.ttypes.AiravataClientException.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 3:
                if ftype == TType.STRUCT:
                    self.ase = airavata.api.error.ttypes.AiravataSystemException.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 4:
                if ftype == TType.STRUCT:
                    self.ae = airavata.api.error.ttypes.AuthorizationException.read(iprot)
                else:
                    iprot.skip(ftype)
            else:
                iprot.skip(ftype)
            iprot.readFieldEnd()
        iprot.readStructEnd()

    def write(self, oprot):
        if oprot._fast_encode is 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)
all_structs.append(getApplicationDeployment_result)
getApplicationDeployment_result.thrift_spec = (
    (0, TType.STRUCT, 'success', [airavata.model.appcatalog.appdeployment.ttypes.ApplicationDeploymentDescription, None], None, ),  # 0
    (1, TType.STRUCT, 'ire', [airavata.api.error.ttypes.InvalidRequestException, None], None, ),  # 1
    (2, TType.STRUCT, 'ace', [airavata.api.error.ttypes.AiravataClientException, None], None, ),  # 2
    (3, TType.STRUCT, 'ase', [airavata.api.error.ttypes.AiravataSystemException, None], None, ),  # 3
    (4, TType.STRUCT, 'ae', [airavata.api.error.ttypes.AuthorizationException, None], None, ),  # 4
)


class updateApplicationDeployment_args(object):
    """
    Attributes:
     - authzToken
     - appDeploymentId
     - applicationDeployment

    """


    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', errors='replace') 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)
all_structs.append(updateApplicationDeployment_args)
updateApplicationDeployment_args.thrift_spec = (
    None,  # 0
    (1, TType.STRUCT, 'authzToken', [airavata.model.security.ttypes.AuthzToken, None], None, ),  # 1
    (2, TType.STRING, 'appDeploymentId', 'UTF8', None, ),  # 2
    (3, TType.STRUCT, 'applicationDeployment', [airavata.model.appcatalog.appdeployment.ttypes.ApplicationDeploymentDescription, None], None, ),  # 3
)


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

    """


    def __init__(self, success=None, ire=None, ace=None, ase=None, ae=None,):
        self.success = success
        self.ire = ire
        self.ace = ace
        self.ase = ase
        self.ae = ae

    def read(self, iprot):
        if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None:
            iprot._fast_decode(self, iprot, [self.__class__, 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.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 2:
                if ftype == TType.STRUCT:
                    self.ace = airavata.api.error.ttypes.AiravataClientException.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 3:
                if ftype == TType.STRUCT:
                    self.ase = airavata.api.error.ttypes.AiravataSystemException.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 4:
                if ftype == TType.STRUCT:
                    self.ae = airavata.api.error.ttypes.AuthorizationException.read(iprot)
                else:
                    iprot.skip(ftype)
            else:
                iprot.skip(ftype)
            iprot.readFieldEnd()
        iprot.readStructEnd()

    def write(self, oprot):
        if oprot._fast_encode is 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)
all_structs.append(updateApplicationDeployment_result)
updateApplicationDeployment_result.thrift_spec = (
    (0, TType.BOOL, 'success', None, None, ),  # 0
    (1, TType.STRUCT, 'ire', [airavata.api.error.ttypes.InvalidRequestException, None], None, ),  # 1
    (2, TType.STRUCT, 'ace', [airavata.api.error.ttypes.AiravataClientException, None], None, ),  # 2
    (3, TType.STRUCT, 'ase', [airavata.api.error.ttypes.AiravataSystemException, None], None, ),  # 3
    (4, TType.STRUCT, 'ae', [airavata.api.error.ttypes.AuthorizationException, None], None, ),  # 4
)


class deleteApplicationDeployment_args(object):
    """
    Attributes:
     - authzToken
     - appDeploymentId

    """


    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', errors='replace') if sys.version_info[0] == 2 else iprot.readString()
                else:
                    iprot.skip(ftype)
            else:
                iprot.skip(ftype)
            iprot.readFieldEnd()
        iprot.readStructEnd()

    def write(self, oprot):
        if oprot._fast_encode is not None and self.thrift_spec is not None:
            oprot.trans.write(oprot._fast_encode(self, [self.__class__, self.thrift_spec]))
            return
        oprot.writeStructBegin('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)
all_structs.append(deleteApplicationDeployment_args)
deleteApplicationDeployment_args.thrift_spec = (
    None,  # 0
    (1, TType.STRUCT, 'authzToken', [airavata.model.security.ttypes.AuthzToken, None], None, ),  # 1
    (2, TType.STRING, 'appDeploymentId', 'UTF8', None, ),  # 2
)


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

    """


    def __init__(self, success=None, ire=None, ace=None, ase=None, ae=None,):
        self.success = success
        self.ire = ire
        self.ace = ace
        self.ase = ase
        self.ae = ae

    def read(self, iprot):
        if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None:
            iprot._fast_decode(self, iprot, [self.__class__, 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.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 2:
                if ftype == TType.STRUCT:
                    self.ace = airavata.api.error.ttypes.AiravataClientException.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 3:
                if ftype == TType.STRUCT:
                    self.ase = airavata.api.error.ttypes.AiravataSystemException.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 4:
                if ftype == TType.STRUCT:
                    self.ae = airavata.api.error.ttypes.AuthorizationException.read(iprot)
                else:
                    iprot.skip(ftype)
            else:
                iprot.skip(ftype)
            iprot.readFieldEnd()
        iprot.readStructEnd()

    def write(self, oprot):
        if oprot._fast_encode is 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)
all_structs.append(deleteApplicationDeployment_result)
deleteApplicationDeployment_result.thrift_spec = (
    (0, TType.BOOL, 'success', None, None, ),  # 0
    (1, TType.STRUCT, 'ire', [airavata.api.error.ttypes.InvalidRequestException, None], None, ),  # 1
    (2, TType.STRUCT, 'ace', [airavata.api.error.ttypes.AiravataClientException, None], None, ),  # 2
    (3, TType.STRUCT, 'ase', [airavata.api.error.ttypes.AiravataSystemException, None], None, ),  # 3
    (4, TType.STRUCT, 'ae', [airavata.api.error.ttypes.AuthorizationException, None], None, ),  # 4
)


class getAllApplicationDeployments_args(object):
    """
    Attributes:
     - authzToken
     - gatewayId

    """


    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', errors='replace') if sys.version_info[0] == 2 else iprot.readString()
                else:
                    iprot.skip(ftype)
            else:
                iprot.skip(ftype)
            iprot.readFieldEnd()
        iprot.readStructEnd()

    def write(self, oprot):
        if oprot._fast_encode is not None and self.thrift_spec is not None:
            oprot.trans.write(oprot._fast_encode(self, [self.__class__, self.thrift_spec]))
            return
        oprot.writeStructBegin('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)
all_structs.append(getAllApplicationDeployments_args)
getAllApplicationDeployments_args.thrift_spec = (
    None,  # 0
    (1, TType.STRUCT, 'authzToken', [airavata.model.security.ttypes.AuthzToken, None], None, ),  # 1
    (2, TType.STRING, 'gatewayId', 'UTF8', None, ),  # 2
)


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

    """


    def __init__(self, success=None, ire=None, ace=None, ase=None, ae=None,):
        self.success = success
        self.ire = ire
        self.ace = ace
        self.ase = ase
        self.ae = ae

    def read(self, iprot):
        if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None:
            iprot._fast_decode(self, iprot, [self.__class__, 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.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 2:
                if ftype == TType.STRUCT:
                    self.ace = airavata.api.error.ttypes.AiravataClientException.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 3:
                if ftype == TType.STRUCT:
                    self.ase = airavata.api.error.ttypes.AiravataSystemException.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 4:
                if ftype == TType.STRUCT:
                    self.ae = airavata.api.error.ttypes.AuthorizationException.read(iprot)
                else:
                    iprot.skip(ftype)
            else:
                iprot.skip(ftype)
            iprot.readFieldEnd()
        iprot.readStructEnd()

    def write(self, oprot):
        if oprot._fast_encode is 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)
all_structs.append(getAllApplicationDeployments_result)
getAllApplicationDeployments_result.thrift_spec = (
    (0, TType.LIST, 'success', (TType.STRUCT, [airavata.model.appcatalog.appdeployment.ttypes.ApplicationDeploymentDescription, None], False), None, ),  # 0
    (1, TType.STRUCT, 'ire', [airavata.api.error.ttypes.InvalidRequestException, None], None, ),  # 1
    (2, TType.STRUCT, 'ace', [airavata.api.error.ttypes.AiravataClientException, None], None, ),  # 2
    (3, TType.STRUCT, 'ase', [airavata.api.error.ttypes.AiravataSystemException, None], None, ),  # 3
    (4, TType.STRUCT, 'ae', [airavata.api.error.ttypes.AuthorizationException, None], None, ),  # 4
)


class getAccessibleApplicationDeployments_args(object):
    """
    Attributes:
     - authzToken
     - gatewayId
     - permissionType

    """


    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', errors='replace') 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)
all_structs.append(getAccessibleApplicationDeployments_args)
getAccessibleApplicationDeployments_args.thrift_spec = (
    None,  # 0
    (1, TType.STRUCT, 'authzToken', [airavata.model.security.ttypes.AuthzToken, None], None, ),  # 1
    (2, TType.STRING, 'gatewayId', 'UTF8', None, ),  # 2
    (3, TType.I32, 'permissionType', None, None, ),  # 3
)


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

    """


    def __init__(self, success=None, ire=None, ace=None, ase=None, ae=None,):
        self.success = success
        self.ire = ire
        self.ace = ace
        self.ase = ase
        self.ae = ae

    def read(self, iprot):
        if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None:
            iprot._fast_decode(self, iprot, [self.__class__, 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.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 2:
                if ftype == TType.STRUCT:
                    self.ace = airavata.api.error.ttypes.AiravataClientException.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 3:
                if ftype == TType.STRUCT:
                    self.ase = airavata.api.error.ttypes.AiravataSystemException.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 4:
                if ftype == TType.STRUCT:
                    self.ae = airavata.api.error.ttypes.AuthorizationException.read(iprot)
                else:
                    iprot.skip(ftype)
            else:
                iprot.skip(ftype)
            iprot.readFieldEnd()
        iprot.readStructEnd()

    def write(self, oprot):
        if oprot._fast_encode is 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)
all_structs.append(getAccessibleApplicationDeployments_result)
getAccessibleApplicationDeployments_result.thrift_spec = (
    (0, TType.LIST, 'success', (TType.STRUCT, [airavata.model.appcatalog.appdeployment.ttypes.ApplicationDeploymentDescription, None], False), None, ),  # 0
    (1, TType.STRUCT, 'ire', [airavata.api.error.ttypes.InvalidRequestException, None], None, ),  # 1
    (2, TType.STRUCT, 'ace', [airavata.api.error.ttypes.AiravataClientException, None], None, ),  # 2
    (3, TType.STRUCT, 'ase', [airavata.api.error.ttypes.AiravataSystemException, None], None, ),  # 3
    (4, TType.STRUCT, 'ae', [airavata.api.error.ttypes.AuthorizationException, None], None, ),  # 4
)


class getAppModuleDeployedResources_args(object):
    """
    Attributes:
     - authzToken
     - appModuleId

    """


    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', errors='replace') if sys.version_info[0] == 2 else iprot.readString()
                else:
                    iprot.skip(ftype)
            else:
                iprot.skip(ftype)
            iprot.readFieldEnd()
        iprot.readStructEnd()

    def write(self, oprot):
        if oprot._fast_encode is not None and self.thrift_spec is not None:
            oprot.trans.write(oprot._fast_encode(self, [self.__class__, self.thrift_spec]))
            return
        oprot.writeStructBegin('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)
all_structs.append(getAppModuleDeployedResources_args)
getAppModuleDeployedResources_args.thrift_spec = (
    None,  # 0
    (1, TType.STRUCT, 'authzToken', [airavata.model.security.ttypes.AuthzToken, None], None, ),  # 1
    (2, TType.STRING, 'appModuleId', 'UTF8', None, ),  # 2
)


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

    """


    def __init__(self, success=None, ire=None, ace=None, ase=None, ae=None,):
        self.success = success
        self.ire = ire
        self.ace = ace
        self.ase = ase
        self.ae = ae

    def read(self, iprot):
        if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None:
            iprot._fast_decode(self, iprot, [self.__class__, 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', errors='replace') 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.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 2:
                if ftype == TType.STRUCT:
                    self.ace = airavata.api.error.ttypes.AiravataClientException.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 3:
                if ftype == TType.STRUCT:
                    self.ase = airavata.api.error.ttypes.AiravataSystemException.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 4:
                if ftype == TType.STRUCT:
                    self.ae = airavata.api.error.ttypes.AuthorizationException.read(iprot)
                else:
                    iprot.skip(ftype)
            else:
                iprot.skip(ftype)
            iprot.readFieldEnd()
        iprot.readStructEnd()

    def write(self, oprot):
        if oprot._fast_encode is 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)
all_structs.append(getAppModuleDeployedResources_result)
getAppModuleDeployedResources_result.thrift_spec = (
    (0, TType.LIST, 'success', (TType.STRING, 'UTF8', False), None, ),  # 0
    (1, TType.STRUCT, 'ire', [airavata.api.error.ttypes.InvalidRequestException, None], None, ),  # 1
    (2, TType.STRUCT, 'ace', [airavata.api.error.ttypes.AiravataClientException, None], None, ),  # 2
    (3, TType.STRUCT, 'ase', [airavata.api.error.ttypes.AiravataSystemException, None], None, ),  # 3
    (4, TType.STRUCT, 'ae', [airavata.api.error.ttypes.AuthorizationException, None], None, ),  # 4
)


class getApplicationDeploymentsForAppModuleAndGroupResourceProfile_args(object):
    """
    Attributes:
     - authzToken
     - appModuleId
     - groupResourceProfileId

    """


    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', errors='replace') if sys.version_info[0] == 2 else iprot.readString()
                else:
                    iprot.skip(ftype)
            elif fid == 3:
                if ftype == TType.STRING:
                    self.groupResourceProfileId = iprot.readString().decode('utf-8', errors='replace') if sys.version_info[0] == 2 else iprot.readString()
                else:
                    iprot.skip(ftype)
            else:
                iprot.skip(ftype)
            iprot.readFieldEnd()
        iprot.readStructEnd()

    def write(self, oprot):
        if oprot._fast_encode is 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)
all_structs.append(getApplicationDeploymentsForAppModuleAndGroupResourceProfile_args)
getApplicationDeploymentsForAppModuleAndGroupResourceProfile_args.thrift_spec = (
    None,  # 0
    (1, TType.STRUCT, 'authzToken', [airavata.model.security.ttypes.AuthzToken, None], None, ),  # 1
    (2, TType.STRING, 'appModuleId', 'UTF8', None, ),  # 2
    (3, TType.STRING, 'groupResourceProfileId', 'UTF8', None, ),  # 3
)


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

    """


    def __init__(self, success=None, ire=None, ace=None, ase=None, ae=None,):
        self.success = success
        self.ire = ire
        self.ace = ace
        self.ase = ase
        self.ae = ae

    def read(self, iprot):
        if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None:
            iprot._fast_decode(self, iprot, [self.__class__, 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.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 2:
                if ftype == TType.STRUCT:
                    self.ace = airavata.api.error.ttypes.AiravataClientException.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 3:
                if ftype == TType.STRUCT:
                    self.ase = airavata.api.error.ttypes.AiravataSystemException.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 4:
                if ftype == TType.STRUCT:
                    self.ae = airavata.api.error.ttypes.AuthorizationException.read(iprot)
                else:
                    iprot.skip(ftype)
            else:
                iprot.skip(ftype)
            iprot.readFieldEnd()
        iprot.readStructEnd()

    def write(self, oprot):
        if oprot._fast_encode is 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)
all_structs.append(getApplicationDeploymentsForAppModuleAndGroupResourceProfile_result)
getApplicationDeploymentsForAppModuleAndGroupResourceProfile_result.thrift_spec = (
    (0, TType.LIST, 'success', (TType.STRUCT, [airavata.model.appcatalog.appdeployment.ttypes.ApplicationDeploymentDescription, None], False), None, ),  # 0
    (1, TType.STRUCT, 'ire', [airavata.api.error.ttypes.InvalidRequestException, None], None, ),  # 1
    (2, TType.STRUCT, 'ace', [airavata.api.error.ttypes.AiravataClientException, None], None, ),  # 2
    (3, TType.STRUCT, 'ase', [airavata.api.error.ttypes.AiravataSystemException, None], None, ),  # 3
    (4, TType.STRUCT, 'ae', [airavata.api.error.ttypes.AuthorizationException, None], None, ),  # 4
)


class registerApplicationInterface_args(object):
    """
    Attributes:
     - authzToken
     - gatewayId
     - applicationInterface

    """


    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', errors='replace') 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)
all_structs.append(registerApplicationInterface_args)
registerApplicationInterface_args.thrift_spec = (
    None,  # 0
    (1, TType.STRUCT, 'authzToken', [airavata.model.security.ttypes.AuthzToken, None], None, ),  # 1
    (2, TType.STRING, 'gatewayId', 'UTF8', None, ),  # 2
    (3, TType.STRUCT, 'applicationInterface', [airavata.model.appcatalog.appinterface.ttypes.ApplicationInterfaceDescription, None], None, ),  # 3
)


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

    """


    def __init__(self, success=None, ire=None, ace=None, ase=None, ae=None,):
        self.success = success
        self.ire = ire
        self.ace = ace
        self.ase = ase
        self.ae = ae

    def read(self, iprot):
        if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None:
            iprot._fast_decode(self, iprot, [self.__class__, 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', errors='replace') 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.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 2:
                if ftype == TType.STRUCT:
                    self.ace = airavata.api.error.ttypes.AiravataClientException.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 3:
                if ftype == TType.STRUCT:
                    self.ase = airavata.api.error.ttypes.AiravataSystemException.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 4:
                if ftype == TType.STRUCT:
                    self.ae = airavata.api.error.ttypes.AuthorizationException.read(iprot)
                else:
                    iprot.skip(ftype)
            else:
                iprot.skip(ftype)
            iprot.readFieldEnd()
        iprot.readStructEnd()

    def write(self, oprot):
        if oprot._fast_encode is 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)
all_structs.append(registerApplicationInterface_result)
registerApplicationInterface_result.thrift_spec = (
    (0, TType.STRING, 'success', 'UTF8', None, ),  # 0
    (1, TType.STRUCT, 'ire', [airavata.api.error.ttypes.InvalidRequestException, None], None, ),  # 1
    (2, TType.STRUCT, 'ace', [airavata.api.error.ttypes.AiravataClientException, None], None, ),  # 2
    (3, TType.STRUCT, 'ase', [airavata.api.error.ttypes.AiravataSystemException, None], None, ),  # 3
    (4, TType.STRUCT, 'ae', [airavata.api.error.ttypes.AuthorizationException, None], None, ),  # 4
)


class cloneApplicationInterface_args(object):
    """
    Attributes:
     - authzToken
     - existingAppInterfaceID
     - newApplicationName
     - gatewayId

    """


    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', errors='replace') 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', errors='replace') 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', errors='replace') if sys.version_info[0] == 2 else iprot.readString()
                else:
                    iprot.skip(ftype)
            else:
                iprot.skip(ftype)
            iprot.readFieldEnd()
        iprot.readStructEnd()

    def write(self, oprot):
        if oprot._fast_encode is not None and self.thrift_spec is not None:
            oprot.trans.write(oprot._fast_encode(self, [self.__class__, self.thrift_spec]))
            return
        oprot.writeStructBegin('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)
all_structs.append(cloneApplicationInterface_args)
cloneApplicationInterface_args.thrift_spec = (
    None,  # 0
    (1, TType.STRUCT, 'authzToken', [airavata.model.security.ttypes.AuthzToken, None], None, ),  # 1
    (2, TType.STRING, 'existingAppInterfaceID', 'UTF8', None, ),  # 2
    (3, TType.STRING, 'newApplicationName', 'UTF8', None, ),  # 3
    (4, TType.STRING, 'gatewayId', 'UTF8', None, ),  # 4
)


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

    """


    def __init__(self, success=None, ire=None, ace=None, ase=None, ae=None,):
        self.success = success
        self.ire = ire
        self.ace = ace
        self.ase = ase
        self.ae = ae

    def read(self, iprot):
        if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None:
            iprot._fast_decode(self, iprot, [self.__class__, 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', errors='replace') 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.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 2:
                if ftype == TType.STRUCT:
                    self.ace = airavata.api.error.ttypes.AiravataClientException.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 3:
                if ftype == TType.STRUCT:
                    self.ase = airavata.api.error.ttypes.AiravataSystemException.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 4:
                if ftype == TType.STRUCT:
                    self.ae = airavata.api.error.ttypes.AuthorizationException.read(iprot)
                else:
                    iprot.skip(ftype)
            else:
                iprot.skip(ftype)
            iprot.readFieldEnd()
        iprot.readStructEnd()

    def write(self, oprot):
        if oprot._fast_encode is 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)
all_structs.append(cloneApplicationInterface_result)
cloneApplicationInterface_result.thrift_spec = (
    (0, TType.STRING, 'success', 'UTF8', None, ),  # 0
    (1, TType.STRUCT, 'ire', [airavata.api.error.ttypes.InvalidRequestException, None], None, ),  # 1
    (2, TType.STRUCT, 'ace', [airavata.api.error.ttypes.AiravataClientException, None], None, ),  # 2
    (3, TType.STRUCT, 'ase', [airavata.api.error.ttypes.AiravataSystemException, None], None, ),  # 3
    (4, TType.STRUCT, 'ae', [airavata.api.error.ttypes.AuthorizationException, None], None, ),  # 4
)


class getApplicationInterface_args(object):
    """
    Attributes:
     - authzToken
     - appInterfaceId

    """


    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', errors='replace') if sys.version_info[0] == 2 else iprot.readString()
                else:
                    iprot.skip(ftype)
            else:
                iprot.skip(ftype)
            iprot.readFieldEnd()
        iprot.readStructEnd()

    def write(self, oprot):
        if oprot._fast_encode is not None and self.thrift_spec is not None:
            oprot.trans.write(oprot._fast_encode(self, [self.__class__, self.thrift_spec]))
            return
        oprot.writeStructBegin('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)
all_structs.append(getApplicationInterface_args)
getApplicationInterface_args.thrift_spec = (
    None,  # 0
    (1, TType.STRUCT, 'authzToken', [airavata.model.security.ttypes.AuthzToken, None], None, ),  # 1
    (2, TType.STRING, 'appInterfaceId', 'UTF8', None, ),  # 2
)


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

    """


    def __init__(self, success=None, ire=None, ace=None, ase=None, ae=None,):
        self.success = success
        self.ire = ire
        self.ace = ace
        self.ase = ase
        self.ae = ae

    def read(self, iprot):
        if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None:
            iprot._fast_decode(self, iprot, [self.__class__, 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.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 2:
                if ftype == TType.STRUCT:
                    self.ace = airavata.api.error.ttypes.AiravataClientException.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 3:
                if ftype == TType.STRUCT:
                    self.ase = airavata.api.error.ttypes.AiravataSystemException.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 4:
                if ftype == TType.STRUCT:
                    self.ae = airavata.api.error.ttypes.AuthorizationException.read(iprot)
                else:
                    iprot.skip(ftype)
            else:
                iprot.skip(ftype)
            iprot.readFieldEnd()
        iprot.readStructEnd()

    def write(self, oprot):
        if oprot._fast_encode is 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)
all_structs.append(getApplicationInterface_result)
getApplicationInterface_result.thrift_spec = (
    (0, TType.STRUCT, 'success', [airavata.model.appcatalog.appinterface.ttypes.ApplicationInterfaceDescription, None], None, ),  # 0
    (1, TType.STRUCT, 'ire', [airavata.api.error.ttypes.InvalidRequestException, None], None, ),  # 1
    (2, TType.STRUCT, 'ace', [airavata.api.error.ttypes.AiravataClientException, None], None, ),  # 2
    (3, TType.STRUCT, 'ase', [airavata.api.error.ttypes.AiravataSystemException, None], None, ),  # 3
    (4, TType.STRUCT, 'ae', [airavata.api.error.ttypes.AuthorizationException, None], None, ),  # 4
)


class updateApplicationInterface_args(object):
    """
    Attributes:
     - authzToken
     - appInterfaceId
     - applicationInterface

    """


    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', errors='replace') 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)
all_structs.append(updateApplicationInterface_args)
updateApplicationInterface_args.thrift_spec = (
    None,  # 0
    (1, TType.STRUCT, 'authzToken', [airavata.model.security.ttypes.AuthzToken, None], None, ),  # 1
    (2, TType.STRING, 'appInterfaceId', 'UTF8', None, ),  # 2
    (3, TType.STRUCT, 'applicationInterface', [airavata.model.appcatalog.appinterface.ttypes.ApplicationInterfaceDescription, None], None, ),  # 3
)


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

    """


    def __init__(self, success=None, ire=None, ace=None, ase=None, ae=None,):
        self.success = success
        self.ire = ire
        self.ace = ace
        self.ase = ase
        self.ae = ae

    def read(self, iprot):
        if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None:
            iprot._fast_decode(self, iprot, [self.__class__, 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.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 2:
                if ftype == TType.STRUCT:
                    self.ace = airavata.api.error.ttypes.AiravataClientException.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 3:
                if ftype == TType.STRUCT:
                    self.ase = airavata.api.error.ttypes.AiravataSystemException.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 4:
                if ftype == TType.STRUCT:
                    self.ae = airavata.api.error.ttypes.AuthorizationException.read(iprot)
                else:
                    iprot.skip(ftype)
            else:
                iprot.skip(ftype)
            iprot.readFieldEnd()
        iprot.readStructEnd()

    def write(self, oprot):
        if oprot._fast_encode is 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)
all_structs.append(updateApplicationInterface_result)
updateApplicationInterface_result.thrift_spec = (
    (0, TType.BOOL, 'success', None, None, ),  # 0
    (1, TType.STRUCT, 'ire', [airavata.api.error.ttypes.InvalidRequestException, None], None, ),  # 1
    (2, TType.STRUCT, 'ace', [airavata.api.error.ttypes.AiravataClientException, None], None, ),  # 2
    (3, TType.STRUCT, 'ase', [airavata.api.error.ttypes.AiravataSystemException, None], None, ),  # 3
    (4, TType.STRUCT, 'ae', [airavata.api.error.ttypes.AuthorizationException, None], None, ),  # 4
)


class deleteApplicationInterface_args(object):
    """
    Attributes:
     - authzToken
     - appInterfaceId

    """


    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', errors='replace') if sys.version_info[0] == 2 else iprot.readString()
                else:
                    iprot.skip(ftype)
            else:
                iprot.skip(ftype)
            iprot.readFieldEnd()
        iprot.readStructEnd()

    def write(self, oprot):
        if oprot._fast_encode is not None and self.thrift_spec is not None:
            oprot.trans.write(oprot._fast_encode(self, [self.__class__, self.thrift_spec]))
            return
        oprot.writeStructBegin('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)
all_structs.append(deleteApplicationInterface_args)
deleteApplicationInterface_args.thrift_spec = (
    None,  # 0
    (1, TType.STRUCT, 'authzToken', [airavata.model.security.ttypes.AuthzToken, None], None, ),  # 1
    (2, TType.STRING, 'appInterfaceId', 'UTF8', None, ),  # 2
)


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

    """


    def __init__(self, success=None, ire=None, ace=None, ase=None, ae=None,):
        self.success = success
        self.ire = ire
        self.ace = ace
        self.ase = ase
        self.ae = ae

    def read(self, iprot):
        if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None:
            iprot._fast_decode(self, iprot, [self.__class__, 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.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 2:
                if ftype == TType.STRUCT:
                    self.ace = airavata.api.error.ttypes.AiravataClientException.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 3:
                if ftype == TType.STRUCT:
                    self.ase = airavata.api.error.ttypes.AiravataSystemException.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 4:
                if ftype == TType.STRUCT:
                    self.ae = airavata.api.error.ttypes.AuthorizationException.read(iprot)
                else:
                    iprot.skip(ftype)
            else:
                iprot.skip(ftype)
            iprot.readFieldEnd()
        iprot.readStructEnd()

    def write(self, oprot):
        if oprot._fast_encode is 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)
all_structs.append(deleteApplicationInterface_result)
deleteApplicationInterface_result.thrift_spec = (
    (0, TType.BOOL, 'success', None, None, ),  # 0
    (1, TType.STRUCT, 'ire', [airavata.api.error.ttypes.InvalidRequestException, None], None, ),  # 1
    (2, TType.STRUCT, 'ace', [airavata.api.error.ttypes.AiravataClientException, None], None, ),  # 2
    (3, TType.STRUCT, 'ase', [airavata.api.error.ttypes.AiravataSystemException, None], None, ),  # 3
    (4, TType.STRUCT, 'ae', [airavata.api.error.ttypes.AuthorizationException, None], None, ),  # 4
)


class getAllApplicationInterfaceNames_args(object):
    """
    Attributes:
     - authzToken
     - gatewayId

    """


    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', errors='replace') if sys.version_info[0] == 2 else iprot.readString()
                else:
                    iprot.skip(ftype)
            else:
                iprot.skip(ftype)
            iprot.readFieldEnd()
        iprot.readStructEnd()

    def write(self, oprot):
        if oprot._fast_encode is not None and self.thrift_spec is not None:
            oprot.trans.write(oprot._fast_encode(self, [self.__class__, self.thrift_spec]))
            return
        oprot.writeStructBegin('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)
all_structs.append(getAllApplicationInterfaceNames_args)
getAllApplicationInterfaceNames_args.thrift_spec = (
    None,  # 0
    (1, TType.STRUCT, 'authzToken', [airavata.model.security.ttypes.AuthzToken, None], None, ),  # 1
    (2, TType.STRING, 'gatewayId', 'UTF8', None, ),  # 2
)


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

    """


    def __init__(self, success=None, ire=None, ace=None, ase=None, ae=None,):
        self.success = success
        self.ire = ire
        self.ace = ace
        self.ase = ase
        self.ae = ae

    def read(self, iprot):
        if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None:
            iprot._fast_decode(self, iprot, [self.__class__, 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', errors='replace') if sys.version_info[0] == 2 else iprot.readString()
                        _val173 = iprot.readString().decode('utf-8', errors='replace') 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.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 2:
                if ftype == TType.STRUCT:
                    self.ace = airavata.api.error.ttypes.AiravataClientException.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 3:
                if ftype == TType.STRUCT:
                    self.ase = airavata.api.error.ttypes.AiravataSystemException.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 4:
                if ftype == TType.STRUCT:
                    self.ae = airavata.api.error.ttypes.AuthorizationException.read(iprot)
                else:
                    iprot.skip(ftype)
            else:
                iprot.skip(ftype)
            iprot.readFieldEnd()
        iprot.readStructEnd()

    def write(self, oprot):
        if oprot._fast_encode is 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)
all_structs.append(getAllApplicationInterfaceNames_result)
getAllApplicationInterfaceNames_result.thrift_spec = (
    (0, TType.MAP, 'success', (TType.STRING, 'UTF8', TType.STRING, 'UTF8', False), None, ),  # 0
    (1, TType.STRUCT, 'ire', [airavata.api.error.ttypes.InvalidRequestException, None], None, ),  # 1
    (2, TType.STRUCT, 'ace', [airavata.api.error.ttypes.AiravataClientException, None], None, ),  # 2
    (3, TType.STRUCT, 'ase', [airavata.api.error.ttypes.AiravataSystemException, None], None, ),  # 3
    (4, TType.STRUCT, 'ae', [airavata.api.error.ttypes.AuthorizationException, None], None, ),  # 4
)


class getAllApplicationInterfaces_args(object):
    """
    Attributes:
     - authzToken
     - gatewayId

    """


    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', errors='replace') if sys.version_info[0] == 2 else iprot.readString()
                else:
                    iprot.skip(ftype)
            else:
                iprot.skip(ftype)
            iprot.readFieldEnd()
        iprot.readStructEnd()

    def write(self, oprot):
        if oprot._fast_encode is not None and self.thrift_spec is not None:
            oprot.trans.write(oprot._fast_encode(self, [self.__class__, self.thrift_spec]))
            return
        oprot.writeStructBegin('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)
all_structs.append(getAllApplicationInterfaces_args)
getAllApplicationInterfaces_args.thrift_spec = (
    None,  # 0
    (1, TType.STRUCT, 'authzToken', [airavata.model.security.ttypes.AuthzToken, None], None, ),  # 1
    (2, TType.STRING, 'gatewayId', 'UTF8', None, ),  # 2
)


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

    """


    def __init__(self, success=None, ire=None, ace=None, ase=None, ae=None,):
        self.success = success
        self.ire = ire
        self.ace = ace
        self.ase = ase
        self.ae = ae

    def read(self, iprot):
        if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None:
            iprot._fast_decode(self, iprot, [self.__class__, 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.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 2:
                if ftype == TType.STRUCT:
                    self.ace = airavata.api.error.ttypes.AiravataClientException.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 3:
                if ftype == TType.STRUCT:
                    self.ase = airavata.api.error.ttypes.AiravataSystemException.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 4:
                if ftype == TType.STRUCT:
                    self.ae = airavata.api.error.ttypes.AuthorizationException.read(iprot)
                else:
                    iprot.skip(ftype)
            else:
                iprot.skip(ftype)
            iprot.readFieldEnd()
        iprot.readStructEnd()

    def write(self, oprot):
        if oprot._fast_encode is 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)
all_structs.append(getAllApplicationInterfaces_result)
getAllApplicationInterfaces_result.thrift_spec = (
    (0, TType.LIST, 'success', (TType.STRUCT, [airavata.model.appcatalog.appinterface.ttypes.ApplicationInterfaceDescription, None], False), None, ),  # 0
    (1, TType.STRUCT, 'ire', [airavata.api.error.ttypes.InvalidRequestException, None], None, ),  # 1
    (2, TType.STRUCT, 'ace', [airavata.api.error.ttypes.AiravataClientException, None], None, ),  # 2
    (3, TType.STRUCT, 'ase', [airavata.api.error.ttypes.AiravataSystemException, None], None, ),  # 3
    (4, TType.STRUCT, 'ae', [airavata.api.error.ttypes.AuthorizationException, None], None, ),  # 4
)


class getApplicationInputs_args(object):
    """
    Attributes:
     - authzToken
     - appInterfaceId

    """


    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', errors='replace') if sys.version_info[0] == 2 else iprot.readString()
                else:
                    iprot.skip(ftype)
            else:
                iprot.skip(ftype)
            iprot.readFieldEnd()
        iprot.readStructEnd()

    def write(self, oprot):
        if oprot._fast_encode is not None and self.thrift_spec is not None:
            oprot.trans.write(oprot._fast_encode(self, [self.__class__, self.thrift_spec]))
            return
        oprot.writeStructBegin('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)
all_structs.append(getApplicationInputs_args)
getApplicationInputs_args.thrift_spec = (
    None,  # 0
    (1, TType.STRUCT, 'authzToken', [airavata.model.security.ttypes.AuthzToken, None], None, ),  # 1
    (2, TType.STRING, 'appInterfaceId', 'UTF8', None, ),  # 2
)


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

    """


    def __init__(self, success=None, ire=None, ace=None, ase=None, ae=None,):
        self.success = success
        self.ire = ire
        self.ace = ace
        self.ase = ase
        self.ae = ae

    def read(self, iprot):
        if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None:
            iprot._fast_decode(self, iprot, [self.__class__, 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.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 2:
                if ftype == TType.STRUCT:
                    self.ace = airavata.api.error.ttypes.AiravataClientException.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 3:
                if ftype == TType.STRUCT:
                    self.ase = airavata.api.error.ttypes.AiravataSystemException.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 4:
                if ftype == TType.STRUCT:
                    self.ae = airavata.api.error.ttypes.AuthorizationException.read(iprot)
                else:
                    iprot.skip(ftype)
            else:
                iprot.skip(ftype)
            iprot.readFieldEnd()
        iprot.readStructEnd()

    def write(self, oprot):
        if oprot._fast_encode is 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)
all_structs.append(getApplicationInputs_result)
getApplicationInputs_result.thrift_spec = (
    (0, TType.LIST, 'success', (TType.STRUCT, [airavata.model.application.io.ttypes.InputDataObjectType, None], False), None, ),  # 0
    (1, TType.STRUCT, 'ire', [airavata.api.error.ttypes.InvalidRequestException, None], None, ),  # 1
    (2, TType.STRUCT, 'ace', [airavata.api.error.ttypes.AiravataClientException, None], None, ),  # 2
    (3, TType.STRUCT, 'ase', [airavata.api.error.ttypes.AiravataSystemException, None], None, ),  # 3
    (4, TType.STRUCT, 'ae', [airavata.api.error.ttypes.AuthorizationException, None], None, ),  # 4
)


class getApplicationOutputs_args(object):
    """
    Attributes:
     - authzToken
     - appInterfaceId

    """


    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', errors='replace') if sys.version_info[0] == 2 else iprot.readString()
                else:
                    iprot.skip(ftype)
            else:
                iprot.skip(ftype)
            iprot.readFieldEnd()
        iprot.readStructEnd()

    def write(self, oprot):
        if oprot._fast_encode is not None and self.thrift_spec is not None:
            oprot.trans.write(oprot._fast_encode(self, [self.__class__, self.thrift_spec]))
            return
        oprot.writeStructBegin('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)
all_structs.append(getApplicationOutputs_args)
getApplicationOutputs_args.thrift_spec = (
    None,  # 0
    (1, TType.STRUCT, 'authzToken', [airavata.model.security.ttypes.AuthzToken, None], None, ),  # 1
    (2, TType.STRING, 'appInterfaceId', 'UTF8', None, ),  # 2
)


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

    """


    def __init__(self, success=None, ire=None, ace=None, ase=None, ae=None,):
        self.success = success
        self.ire = ire
        self.ace = ace
        self.ase = ase
        self.ae = ae

    def read(self, iprot):
        if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None:
            iprot._fast_decode(self, iprot, [self.__class__, 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.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 2:
                if ftype == TType.STRUCT:
                    self.ace = airavata.api.error.ttypes.AiravataClientException.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 3:
                if ftype == TType.STRUCT:
                    self.ase = airavata.api.error.ttypes.AiravataSystemException.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 4:
                if ftype == TType.STRUCT:
                    self.ae = airavata.api.error.ttypes.AuthorizationException.read(iprot)
                else:
                    iprot.skip(ftype)
            else:
                iprot.skip(ftype)
            iprot.readFieldEnd()
        iprot.readStructEnd()

    def write(self, oprot):
        if oprot._fast_encode is 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)
all_structs.append(getApplicationOutputs_result)
getApplicationOutputs_result.thrift_spec = (
    (0, TType.LIST, 'success', (TType.STRUCT, [airavata.model.application.io.ttypes.OutputDataObjectType, None], False), None, ),  # 0
    (1, TType.STRUCT, 'ire', [airavata.api.error.ttypes.InvalidRequestException, None], None, ),  # 1
    (2, TType.STRUCT, 'ace', [airavata.api.error.ttypes.AiravataClientException, None], None, ),  # 2
    (3, TType.STRUCT, 'ase', [airavata.api.error.ttypes.AiravataSystemException, None], None, ),  # 3
    (4, TType.STRUCT, 'ae', [airavata.api.error.ttypes.AuthorizationException, None], None, ),  # 4
)


class getAvailableAppInterfaceComputeResources_args(object):
    """
    Attributes:
     - authzToken
     - appInterfaceId

    """


    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', errors='replace') if sys.version_info[0] == 2 else iprot.readString()
                else:
                    iprot.skip(ftype)
            else:
                iprot.skip(ftype)
            iprot.readFieldEnd()
        iprot.readStructEnd()

    def write(self, oprot):
        if oprot._fast_encode is not None and self.thrift_spec is not None:
            oprot.trans.write(oprot._fast_encode(self, [self.__class__, self.thrift_spec]))
            return
        oprot.writeStructBegin('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)
all_structs.append(getAvailableAppInterfaceComputeResources_args)
getAvailableAppInterfaceComputeResources_args.thrift_spec = (
    None,  # 0
    (1, TType.STRUCT, 'authzToken', [airavata.model.security.ttypes.AuthzToken, None], None, ),  # 1
    (2, TType.STRING, 'appInterfaceId', 'UTF8', None, ),  # 2
)


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

    """


    def __init__(self, success=None, ire=None, ace=None, ase=None, ae=None,):
        self.success = success
        self.ire = ire
        self.ace = ace
        self.ase = ase
        self.ae = ae

    def read(self, iprot):
        if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None:
            iprot._fast_decode(self, iprot, [self.__class__, 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', errors='replace') if sys.version_info[0] == 2 else iprot.readString()
                        _val203 = iprot.readString().decode('utf-8', errors='replace') 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.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 2:
                if ftype == TType.STRUCT:
                    self.ace = airavata.api.error.ttypes.AiravataClientException.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 3:
                if ftype == TType.STRUCT:
                    self.ase = airavata.api.error.ttypes.AiravataSystemException.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 4:
                if ftype == TType.STRUCT:
                    self.ae = airavata.api.error.ttypes.AuthorizationException.read(iprot)
                else:
                    iprot.skip(ftype)
            else:
                iprot.skip(ftype)
            iprot.readFieldEnd()
        iprot.readStructEnd()

    def write(self, oprot):
        if oprot._fast_encode is 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)
all_structs.append(getAvailableAppInterfaceComputeResources_result)
getAvailableAppInterfaceComputeResources_result.thrift_spec = (
    (0, TType.MAP, 'success', (TType.STRING, 'UTF8', TType.STRING, 'UTF8', False), None, ),  # 0
    (1, TType.STRUCT, 'ire', [airavata.api.error.ttypes.InvalidRequestException, None], None, ),  # 1
    (2, TType.STRUCT, 'ace', [airavata.api.error.ttypes.AiravataClientException, None], None, ),  # 2
    (3, TType.STRUCT, 'ase', [airavata.api.error.ttypes.AiravataSystemException, None], None, ),  # 3
    (4, TType.STRUCT, 'ae', [airavata.api.error.ttypes.AuthorizationException, None], None, ),  # 4
)


class registerComputeResource_args(object):
    """
    Attributes:
     - authzToken
     - computeResourceDescription

    """


    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)
all_structs.append(registerComputeResource_args)
registerComputeResource_args.thrift_spec = (
    None,  # 0
    (1, TType.STRUCT, 'authzToken', [airavata.model.security.ttypes.AuthzToken, None], None, ),  # 1
    (2, TType.STRUCT, 'computeResourceDescription', [airavata.model.appcatalog.computeresource.ttypes.ComputeResourceDescription, None], None, ),  # 2
)


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

    """


    def __init__(self, success=None, ire=None, ace=None, ase=None, ae=None,):
        self.success = success
        self.ire = ire
        self.ace = ace
        self.ase = ase
        self.ae = ae

    def read(self, iprot):
        if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None:
            iprot._fast_decode(self, iprot, [self.__class__, 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', errors='replace') 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.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 2:
                if ftype == TType.STRUCT:
                    self.ace = airavata.api.error.ttypes.AiravataClientException.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 3:
                if ftype == TType.STRUCT:
                    self.ase = airavata.api.error.ttypes.AiravataSystemException.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 4:
                if ftype == TType.STRUCT:
                    self.ae = airavata.api.error.ttypes.AuthorizationException.read(iprot)
                else:
                    iprot.skip(ftype)
            else:
                iprot.skip(ftype)
            iprot.readFieldEnd()
        iprot.readStructEnd()

    def write(self, oprot):
        if oprot._fast_encode is 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)
all_structs.append(registerComputeResource_result)
registerComputeResource_result.thrift_spec = (
    (0, TType.STRING, 'success', 'UTF8', None, ),  # 0
    (1, TType.STRUCT, 'ire', [airavata.api.error.ttypes.InvalidRequestException, None], None, ),  # 1
    (2, TType.STRUCT, 'ace', [airavata.api.error.ttypes.AiravataClientException, None], None, ),  # 2
    (3, TType.STRUCT, 'ase', [airavata.api.error.ttypes.AiravataSystemException, None], None, ),  # 3
    (4, TType.STRUCT, 'ae', [airavata.api.error.ttypes.AuthorizationException, None], None, ),  # 4
)


class getComputeResource_args(object):
    """
    Attributes:
     - authzToken
     - computeResourceId

    """


    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', errors='replace') if sys.version_info[0] == 2 else iprot.readString()
                else:
                    iprot.skip(ftype)
            else:
                iprot.skip(ftype)
            iprot.readFieldEnd()
        iprot.readStructEnd()

    def write(self, oprot):
        if oprot._fast_encode is not None and self.thrift_spec is not None:
            oprot.trans.write(oprot._fast_encode(self, [self.__class__, self.thrift_spec]))
            return
        oprot.writeStructBegin('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)
all_structs.append(getComputeResource_args)
getComputeResource_args.thrift_spec = (
    None,  # 0
    (1, TType.STRUCT, 'authzToken', [airavata.model.security.ttypes.AuthzToken, None], None, ),  # 1
    (2, TType.STRING, 'computeResourceId', 'UTF8', None, ),  # 2
)


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

    """


    def __init__(self, success=None, ire=None, ace=None, ase=None, ae=None,):
        self.success = success
        self.ire = ire
        self.ace = ace
        self.ase = ase
        self.ae = ae

    def read(self, iprot):
        if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None:
            iprot._fast_decode(self, iprot, [self.__class__, 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.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 2:
                if ftype == TType.STRUCT:
                    self.ace = airavata.api.error.ttypes.AiravataClientException.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 3:
                if ftype == TType.STRUCT:
                    self.ase = airavata.api.error.ttypes.AiravataSystemException.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 4:
                if ftype == TType.STRUCT:
                    self.ae = airavata.api.error.ttypes.AuthorizationException.read(iprot)
                else:
                    iprot.skip(ftype)
            else:
                iprot.skip(ftype)
            iprot.readFieldEnd()
        iprot.readStructEnd()

    def write(self, oprot):
        if oprot._fast_encode is 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)
all_structs.append(getComputeResource_result)
getComputeResource_result.thrift_spec = (
    (0, TType.STRUCT, 'success', [airavata.model.appcatalog.computeresource.ttypes.ComputeResourceDescription, None], None, ),  # 0
    (1, TType.STRUCT, 'ire', [airavata.api.error.ttypes.InvalidRequestException, None], None, ),  # 1
    (2, TType.STRUCT, 'ace', [airavata.api.error.ttypes.AiravataClientException, None], None, ),  # 2
    (3, TType.STRUCT, 'ase', [airavata.api.error.ttypes.AiravataSystemException, None], None, ),  # 3
    (4, TType.STRUCT, 'ae', [airavata.api.error.ttypes.AuthorizationException, None], None, ),  # 4
)


class getAllComputeResourceNames_args(object):
    """
    Attributes:
     - authzToken

    """


    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)
all_structs.append(getAllComputeResourceNames_args)
getAllComputeResourceNames_args.thrift_spec = (
    None,  # 0
    (1, TType.STRUCT, 'authzToken', [airavata.model.security.ttypes.AuthzToken, None], None, ),  # 1
)


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

    """


    def __init__(self, success=None, ire=None, ace=None, ase=None, ae=None,):
        self.success = success
        self.ire = ire
        self.ace = ace
        self.ase = ase
        self.ae = ae

    def read(self, iprot):
        if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None:
            iprot._fast_decode(self, iprot, [self.__class__, 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', errors='replace') if sys.version_info[0] == 2 else iprot.readString()
                        _val212 = iprot.readString().decode('utf-8', errors='replace') 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.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 2:
                if ftype == TType.STRUCT:
                    self.ace = airavata.api.error.ttypes.AiravataClientException.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 3:
                if ftype == TType.STRUCT:
                    self.ase = airavata.api.error.ttypes.AiravataSystemException.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 4:
                if ftype == TType.STRUCT:
                    self.ae = airavata.api.error.ttypes.AuthorizationException.read(iprot)
                else:
                    iprot.skip(ftype)
            else:
                iprot.skip(ftype)
            iprot.readFieldEnd()
        iprot.readStructEnd()

    def write(self, oprot):
        if oprot._fast_encode is 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)
all_structs.append(getAllComputeResourceNames_result)
getAllComputeResourceNames_result.thrift_spec = (
    (0, TType.MAP, 'success', (TType.STRING, 'UTF8', TType.STRING, 'UTF8', False), None, ),  # 0
    (1, TType.STRUCT, 'ire', [airavata.api.error.ttypes.InvalidRequestException, None], None, ),  # 1
    (2, TType.STRUCT, 'ace', [airavata.api.error.ttypes.AiravataClientException, None], None, ),  # 2
    (3, TType.STRUCT, 'ase', [airavata.api.error.ttypes.AiravataSystemException, None], None, ),  # 3
    (4, TType.STRUCT, 'ae', [airavata.api.error.ttypes.AuthorizationException, None], None, ),  # 4
)


class updateComputeResource_args(object):
    """
    Attributes:
     - authzToken
     - computeResourceId
     - computeResourceDescription

    """


    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', errors='replace') 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)
all_structs.append(updateComputeResource_args)
updateComputeResource_args.thrift_spec = (
    None,  # 0
    (1, TType.STRUCT, 'authzToken', [airavata.model.security.ttypes.AuthzToken, None], None, ),  # 1
    (2, TType.STRING, 'computeResourceId', 'UTF8', None, ),  # 2
    (3, TType.STRUCT, 'computeResourceDescription', [airavata.model.appcatalog.computeresource.ttypes.ComputeResourceDescription, None], None, ),  # 3
)


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

    """


    def __init__(self, success=None, ire=None, ace=None, ase=None, ae=None,):
        self.success = success
        self.ire = ire
        self.ace = ace
        self.ase = ase
        self.ae = ae

    def read(self, iprot):
        if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None:
            iprot._fast_decode(self, iprot, [self.__class__, 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.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 2:
                if ftype == TType.STRUCT:
                    self.ace = airavata.api.error.ttypes.AiravataClientException.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 3:
                if ftype == TType.STRUCT:
                    self.ase = airavata.api.error.ttypes.AiravataSystemException.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 4:
                if ftype == TType.STRUCT:
                    self.ae = airavata.api.error.ttypes.AuthorizationException.read(iprot)
                else:
                    iprot.skip(ftype)
            else:
                iprot.skip(ftype)
            iprot.readFieldEnd()
        iprot.readStructEnd()

    def write(self, oprot):
        if oprot._fast_encode is 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)
all_structs.append(updateComputeResource_result)
updateComputeResource_result.thrift_spec = (
    (0, TType.BOOL, 'success', None, None, ),  # 0
    (1, TType.STRUCT, 'ire', [airavata.api.error.ttypes.InvalidRequestException, None], None, ),  # 1
    (2, TType.STRUCT, 'ace', [airavata.api.error.ttypes.AiravataClientException, None], None, ),  # 2
    (3, TType.STRUCT, 'ase', [airavata.api.error.ttypes.AiravataSystemException, None], None, ),  # 3
    (4, TType.STRUCT, 'ae', [airavata.api.error.ttypes.AuthorizationException, None], None, ),  # 4
)


class deleteComputeResource_args(object):
    """
    Attributes:
     - authzToken
     - computeResourceId

    """


    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', errors='replace') if sys.version_info[0] == 2 else iprot.readString()
                else:
                    iprot.skip(ftype)
            else:
                iprot.skip(ftype)
            iprot.readFieldEnd()
        iprot.readStructEnd()

    def write(self, oprot):
        if oprot._fast_encode is not None and self.thrift_spec is not None:
            oprot.trans.write(oprot._fast_encode(self, [self.__class__, self.thrift_spec]))
            return
        oprot.writeStructBegin('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)
all_structs.append(deleteComputeResource_args)
deleteComputeResource_args.thrift_spec = (
    None,  # 0
    (1, TType.STRUCT, 'authzToken', [airavata.model.security.ttypes.AuthzToken, None], None, ),  # 1
    (2, TType.STRING, 'computeResourceId', 'UTF8', None, ),  # 2
)


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

    """


    def __init__(self, success=None, ire=None, ace=None, ase=None, ae=None,):
        self.success = success
        self.ire = ire
        self.ace = ace
        self.ase = ase
        self.ae = ae

    def read(self, iprot):
        if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None:
            iprot._fast_decode(self, iprot, [self.__class__, 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.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 2:
                if ftype == TType.STRUCT:
                    self.ace = airavata.api.error.ttypes.AiravataClientException.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 3:
                if ftype == TType.STRUCT:
                    self.ase = airavata.api.error.ttypes.AiravataSystemException.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 4:
                if ftype == TType.STRUCT:
                    self.ae = airavata.api.error.ttypes.AuthorizationException.read(iprot)
                else:
                    iprot.skip(ftype)
            else:
                iprot.skip(ftype)
            iprot.readFieldEnd()
        iprot.readStructEnd()

    def write(self, oprot):
        if oprot._fast_encode is 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)
all_structs.append(deleteComputeResource_result)
deleteComputeResource_result.thrift_spec = (
    (0, TType.BOOL, 'success', None, None, ),  # 0
    (1, TType.STRUCT, 'ire', [airavata.api.error.ttypes.InvalidRequestException, None], None, ),  # 1
    (2, TType.STRUCT, 'ace', [airavata.api.error.ttypes.AiravataClientException, None], None, ),  # 2
    (3, TType.STRUCT, 'ase', [airavata.api.error.ttypes.AiravataSystemException, None], None, ),  # 3
    (4, TType.STRUCT, 'ae', [airavata.api.error.ttypes.AuthorizationException, None], None, ),  # 4
)


class registerStorageResource_args(object):
    """
    Attributes:
     - authzToken
     - storageResourceDescription

    """


    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)
all_structs.append(registerStorageResource_args)
registerStorageResource_args.thrift_spec = (
    None,  # 0
    (1, TType.STRUCT, 'authzToken', [airavata.model.security.ttypes.AuthzToken, None], None, ),  # 1
    (2, TType.STRUCT, 'storageResourceDescription', [airavata.model.appcatalog.storageresource.ttypes.StorageResourceDescription, None], None, ),  # 2
)


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

    """


    def __init__(self, success=None, ire=None, ace=None, ase=None, ae=None,):
        self.success = success
        self.ire = ire
        self.ace = ace
        self.ase = ase
        self.ae = ae

    def read(self, iprot):
        if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None:
            iprot._fast_decode(self, iprot, [self.__class__, 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', errors='replace') 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.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 2:
                if ftype == TType.STRUCT:
                    self.ace = airavata.api.error.ttypes.AiravataClientException.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 3:
                if ftype == TType.STRUCT:
                    self.ase = airavata.api.error.ttypes.AiravataSystemException.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 4:
                if ftype == TType.STRUCT:
                    self.ae = airavata.api.error.ttypes.AuthorizationException.read(iprot)
                else:
                    iprot.skip(ftype)
            else:
                iprot.skip(ftype)
            iprot.readFieldEnd()
        iprot.readStructEnd()

    def write(self, oprot):
        if oprot._fast_encode is 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)
all_structs.append(registerStorageResource_result)
registerStorageResource_result.thrift_spec = (
    (0, TType.STRING, 'success', 'UTF8', None, ),  # 0
    (1, TType.STRUCT, 'ire', [airavata.api.error.ttypes.InvalidRequestException, None], None, ),  # 1
    (2, TType.STRUCT, 'ace', [airavata.api.error.ttypes.AiravataClientException, None], None, ),  # 2
    (3, TType.STRUCT, 'ase', [airavata.api.error.ttypes.AiravataSystemException, None], None, ),  # 3
    (4, TType.STRUCT, 'ae', [airavata.api.error.ttypes.AuthorizationException, None], None, ),  # 4
)


class getStorageResource_args(object):
    """
    Attributes:
     - authzToken
     - storageResourceId

    """


    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', errors='replace') if sys.version_info[0] == 2 else iprot.readString()
                else:
                    iprot.skip(ftype)
            else:
                iprot.skip(ftype)
            iprot.readFieldEnd()
        iprot.readStructEnd()

    def write(self, oprot):
        if oprot._fast_encode is not None and self.thrift_spec is not None:
            oprot.trans.write(oprot._fast_encode(self, [self.__class__, self.thrift_spec]))
            return
        oprot.writeStructBegin('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)
all_structs.append(getStorageResource_args)
getStorageResource_args.thrift_spec = (
    None,  # 0
    (1, TType.STRUCT, 'authzToken', [airavata.model.security.ttypes.AuthzToken, None], None, ),  # 1
    (2, TType.STRING, 'storageResourceId', 'UTF8', None, ),  # 2
)


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

    """


    def __init__(self, success=None, ire=None, ace=None, ase=None, ae=None,):
        self.success = success
        self.ire = ire
        self.ace = ace
        self.ase = ase
        self.ae = ae

    def read(self, iprot):
        if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None:
            iprot._fast_decode(self, iprot, [self.__class__, 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.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 2:
                if ftype == TType.STRUCT:
                    self.ace = airavata.api.error.ttypes.AiravataClientException.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 3:
                if ftype == TType.STRUCT:
                    self.ase = airavata.api.error.ttypes.AiravataSystemException.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 4:
                if ftype == TType.STRUCT:
                    self.ae = airavata.api.error.ttypes.AuthorizationException.read(iprot)
                else:
                    iprot.skip(ftype)
            else:
                iprot.skip(ftype)
            iprot.readFieldEnd()
        iprot.readStructEnd()

    def write(self, oprot):
        if oprot._fast_encode is 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)
all_structs.append(getStorageResource_result)
getStorageResource_result.thrift_spec = (
    (0, TType.STRUCT, 'success', [airavata.model.appcatalog.storageresource.ttypes.StorageResourceDescription, None], None, ),  # 0
    (1, TType.STRUCT, 'ire', [airavata.api.error.ttypes.InvalidRequestException, None], None, ),  # 1
    (2, TType.STRUCT, 'ace', [airavata.api.error.ttypes.AiravataClientException, None], None, ),  # 2
    (3, TType.STRUCT, 'ase', [airavata.api.error.ttypes.AiravataSystemException, None], None, ),  # 3
    (4, TType.STRUCT, 'ae', [airavata.api.error.ttypes.AuthorizationException, None], None, ),  # 4
)


class getAllStorageResourceNames_args(object):
    """
    Attributes:
     - authzToken

    """


    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)
all_structs.append(getAllStorageResourceNames_args)
getAllStorageResourceNames_args.thrift_spec = (
    None,  # 0
    (1, TType.STRUCT, 'authzToken', [airavata.model.security.ttypes.AuthzToken, None], None, ),  # 1
)


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

    """


    def __init__(self, success=None, ire=None, ace=None, ase=None, ae=None,):
        self.success = success
        self.ire = ire
        self.ace = ace
        self.ase = ase
        self.ae = ae

    def read(self, iprot):
        if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None:
            iprot._fast_decode(self, iprot, [self.__class__, 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', errors='replace') if sys.version_info[0] == 2 else iprot.readString()
                        _val221 = iprot.readString().decode('utf-8', errors='replace') 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.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 2:
                if ftype == TType.STRUCT:
                    self.ace = airavata.api.error.ttypes.AiravataClientException.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 3:
                if ftype == TType.STRUCT:
                    self.ase = airavata.api.error.ttypes.AiravataSystemException.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 4:
                if ftype == TType.STRUCT:
                    self.ae = airavata.api.error.ttypes.AuthorizationException.read(iprot)
                else:
                    iprot.skip(ftype)
            else:
                iprot.skip(ftype)
            iprot.readFieldEnd()
        iprot.readStructEnd()

    def write(self, oprot):
        if oprot._fast_encode is 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)
all_structs.append(getAllStorageResourceNames_result)
getAllStorageResourceNames_result.thrift_spec = (
    (0, TType.MAP, 'success', (TType.STRING, 'UTF8', TType.STRING, 'UTF8', False), None, ),  # 0
    (1, TType.STRUCT, 'ire', [airavata.api.error.ttypes.InvalidRequestException, None], None, ),  # 1
    (2, TType.STRUCT, 'ace', [airavata.api.error.ttypes.AiravataClientException, None], None, ),  # 2
    (3, TType.STRUCT, 'ase', [airavata.api.error.ttypes.AiravataSystemException, None], None, ),  # 3
    (4, TType.STRUCT, 'ae', [airavata.api.error.ttypes.AuthorizationException, None], None, ),  # 4
)


class updateStorageResource_args(object):
    """
    Attributes:
     - authzToken
     - storageResourceId
     - storageResourceDescription

    """


    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', errors='replace') 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)
all_structs.append(updateStorageResource_args)
updateStorageResource_args.thrift_spec = (
    None,  # 0
    (1, TType.STRUCT, 'authzToken', [airavata.model.security.ttypes.AuthzToken, None], None, ),  # 1
    (2, TType.STRING, 'storageResourceId', 'UTF8', None, ),  # 2
    (3, TType.STRUCT, 'storageResourceDescription', [airavata.model.appcatalog.storageresource.ttypes.StorageResourceDescription, None], None, ),  # 3
)


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

    """


    def __init__(self, success=None, ire=None, ace=None, ase=None, ae=None,):
        self.success = success
        self.ire = ire
        self.ace = ace
        self.ase = ase
        self.ae = ae

    def read(self, iprot):
        if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None:
            iprot._fast_decode(self, iprot, [self.__class__, 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.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 2:
                if ftype == TType.STRUCT:
                    self.ace = airavata.api.error.ttypes.AiravataClientException.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 3:
                if ftype == TType.STRUCT:
                    self.ase = airavata.api.error.ttypes.AiravataSystemException.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 4:
                if ftype == TType.STRUCT:
                    self.ae = airavata.api.error.ttypes.AuthorizationException.read(iprot)
                else:
                    iprot.skip(ftype)
            else:
                iprot.skip(ftype)
            iprot.readFieldEnd()
        iprot.readStructEnd()

    def write(self, oprot):
        if oprot._fast_encode is 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)
all_structs.append(updateStorageResource_result)
updateStorageResource_result.thrift_spec = (
    (0, TType.BOOL, 'success', None, None, ),  # 0
    (1, TType.STRUCT, 'ire', [airavata.api.error.ttypes.InvalidRequestException, None], None, ),  # 1
    (2, TType.STRUCT, 'ace', [airavata.api.error.ttypes.AiravataClientException, None], None, ),  # 2
    (3, TType.STRUCT, 'ase', [airavata.api.error.ttypes.AiravataSystemException, None], None, ),  # 3
    (4, TType.STRUCT, 'ae', [airavata.api.error.ttypes.AuthorizationException, None], None, ),  # 4
)


class deleteStorageResource_args(object):
    """
    Attributes:
     - authzToken
     - storageResourceId

    """


    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', errors='replace') if sys.version_info[0] == 2 else iprot.readString()
                else:
                    iprot.skip(ftype)
            else:
                iprot.skip(ftype)
            iprot.readFieldEnd()
        iprot.readStructEnd()

    def write(self, oprot):
        if oprot._fast_encode is not None and self.thrift_spec is not None:
            oprot.trans.write(oprot._fast_encode(self, [self.__class__, self.thrift_spec]))
            return
        oprot.writeStructBegin('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)
all_structs.append(deleteStorageResource_args)
deleteStorageResource_args.thrift_spec = (
    None,  # 0
    (1, TType.STRUCT, 'authzToken', [airavata.model.security.ttypes.AuthzToken, None], None, ),  # 1
    (2, TType.STRING, 'storageResourceId', 'UTF8', None, ),  # 2
)


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

    """


    def __init__(self, success=None, ire=None, ace=None, ase=None, ae=None,):
        self.success = success
        self.ire = ire
        self.ace = ace
        self.ase = ase
        self.ae = ae

    def read(self, iprot):
        if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None:
            iprot._fast_decode(self, iprot, [self.__class__, 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.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 2:
                if ftype == TType.STRUCT:
                    self.ace = airavata.api.error.ttypes.AiravataClientException.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 3:
                if ftype == TType.STRUCT:
                    self.ase = airavata.api.error.ttypes.AiravataSystemException.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 4:
                if ftype == TType.STRUCT:
                    self.ae = airavata.api.error.ttypes.AuthorizationException.read(iprot)
                else:
                    iprot.skip(ftype)
            else:
                iprot.skip(ftype)
            iprot.readFieldEnd()
        iprot.readStructEnd()

    def write(self, oprot):
        if oprot._fast_encode is 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)
all_structs.append(deleteStorageResource_result)
deleteStorageResource_result.thrift_spec = (
    (0, TType.BOOL, 'success', None, None, ),  # 0
    (1, TType.STRUCT, 'ire', [airavata.api.error.ttypes.InvalidRequestException, None], None, ),  # 1
    (2, TType.STRUCT, 'ace', [airavata.api.error.ttypes.AiravataClientException, None], None, ),  # 2
    (3, TType.STRUCT, 'ase', [airavata.api.error.ttypes.AiravataSystemException, None], None, ),  # 3
    (4, TType.STRUCT, 'ae', [airavata.api.error.ttypes.AuthorizationException, None], None, ),  # 4
)


class addLocalSubmissionDetails_args(object):
    """
    Attributes:
     - authzToken
     - computeResourceId
     - priorityOrder
     - localSubmission

    """


    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', errors='replace') 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)
all_structs.append(addLocalSubmissionDetails_args)
addLocalSubmissionDetails_args.thrift_spec = (
    None,  # 0
    (1, TType.STRUCT, 'authzToken', [airavata.model.security.ttypes.AuthzToken, None], 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, None], None, ),  # 4
)


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

    """


    def __init__(self, success=None, ire=None, ace=None, ase=None, ae=None,):
        self.success = success
        self.ire = ire
        self.ace = ace
        self.ase = ase
        self.ae = ae

    def read(self, iprot):
        if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None:
            iprot._fast_decode(self, iprot, [self.__class__, 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', errors='replace') 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.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 2:
                if ftype == TType.STRUCT:
                    self.ace = airavata.api.error.ttypes.AiravataClientException.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 3:
                if ftype == TType.STRUCT:
                    self.ase = airavata.api.error.ttypes.AiravataSystemException.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 4:
                if ftype == TType.STRUCT:
                    self.ae = airavata.api.error.ttypes.AuthorizationException.read(iprot)
                else:
                    iprot.skip(ftype)
            else:
                iprot.skip(ftype)
            iprot.readFieldEnd()
        iprot.readStructEnd()

    def write(self, oprot):
        if oprot._fast_encode is 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)
all_structs.append(addLocalSubmissionDetails_result)
addLocalSubmissionDetails_result.thrift_spec = (
    (0, TType.STRING, 'success', 'UTF8', None, ),  # 0
    (1, TType.STRUCT, 'ire', [airavata.api.error.ttypes.InvalidRequestException, None], None, ),  # 1
    (2, TType.STRUCT, 'ace', [airavata.api.error.ttypes.AiravataClientException, None], None, ),  # 2
    (3, TType.STRUCT, 'ase', [airavata.api.error.ttypes.AiravataSystemException, None], None, ),  # 3
    (4, TType.STRUCT, 'ae', [airavata.api.error.ttypes.AuthorizationException, None], None, ),  # 4
)


class updateLocalSubmissionDetails_args(object):
    """
    Attributes:
     - authzToken
     - jobSubmissionInterfaceId
     - localSubmission

    """


    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', errors='replace') 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)
all_structs.append(updateLocalSubmissionDetails_args)
updateLocalSubmissionDetails_args.thrift_spec = (
    None,  # 0
    (1, TType.STRUCT, 'authzToken', [airavata.model.security.ttypes.AuthzToken, None], None, ),  # 1
    (2, TType.STRING, 'jobSubmissionInterfaceId', 'UTF8', None, ),  # 2
    (3, TType.STRUCT, 'localSubmission', [airavata.model.appcatalog.computeresource.ttypes.LOCALSubmission, None], None, ),  # 3
)


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

    """


    def __init__(self, success=None, ire=None, ace=None, ase=None, ae=None,):
        self.success = success
        self.ire = ire
        self.ace = ace
        self.ase = ase
        self.ae = ae

    def read(self, iprot):
        if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None:
            iprot._fast_decode(self, iprot, [self.__class__, 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.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 2:
                if ftype == TType.STRUCT:
                    self.ace = airavata.api.error.ttypes.AiravataClientException.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 3:
                if ftype == TType.STRUCT:
                    self.ase = airavata.api.error.ttypes.AiravataSystemException.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 4:
                if ftype == TType.STRUCT:
                    self.ae = airavata.api.error.ttypes.AuthorizationException.read(iprot)
                else:
                    iprot.skip(ftype)
            else:
                iprot.skip(ftype)
            iprot.readFieldEnd()
        iprot.readStructEnd()

    def write(self, oprot):
        if oprot._fast_encode is 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)
all_structs.append(updateLocalSubmissionDetails_result)
updateLocalSubmissionDetails_result.thrift_spec = (
    (0, TType.BOOL, 'success', None, None, ),  # 0
    (1, TType.STRUCT, 'ire', [airavata.api.error.ttypes.InvalidRequestException, None], None, ),  # 1
    (2, TType.STRUCT, 'ace', [airavata.api.error.ttypes.AiravataClientException, None], None, ),  # 2
    (3, TType.STRUCT, 'ase', [airavata.api.error.ttypes.AiravataSystemException, None], None, ),  # 3
    (4, TType.STRUCT, 'ae', [airavata.api.error.ttypes.AuthorizationException, None], None, ),  # 4
)


class getLocalJobSubmission_args(object):
    """
    Attributes:
     - authzToken
     - jobSubmissionId

    """


    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', errors='replace') if sys.version_info[0] == 2 else iprot.readString()
                else:
                    iprot.skip(ftype)
            else:
                iprot.skip(ftype)
            iprot.readFieldEnd()
        iprot.readStructEnd()

    def write(self, oprot):
        if oprot._fast_encode is not None and self.thrift_spec is not None:
            oprot.trans.write(oprot._fast_encode(self, [self.__class__, self.thrift_spec]))
            return
        oprot.writeStructBegin('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)
all_structs.append(getLocalJobSubmission_args)
getLocalJobSubmission_args.thrift_spec = (
    None,  # 0
    (1, TType.STRUCT, 'authzToken', [airavata.model.security.ttypes.AuthzToken, None], None, ),  # 1
    (2, TType.STRING, 'jobSubmissionId', 'UTF8', None, ),  # 2
)


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

    """


    def __init__(self, success=None, ire=None, ace=None, ase=None, ae=None,):
        self.success = success
        self.ire = ire
        self.ace = ace
        self.ase = ase
        self.ae = ae

    def read(self, iprot):
        if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None:
            iprot._fast_decode(self, iprot, [self.__class__, 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.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 2:
                if ftype == TType.STRUCT:
                    self.ace = airavata.api.error.ttypes.AiravataClientException.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 3:
                if ftype == TType.STRUCT:
                    self.ase = airavata.api.error.ttypes.AiravataSystemException.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 4:
                if ftype == TType.STRUCT:
                    self.ae = airavata.api.error.ttypes.AuthorizationException.read(iprot)
                else:
                    iprot.skip(ftype)
            else:
                iprot.skip(ftype)
            iprot.readFieldEnd()
        iprot.readStructEnd()

    def write(self, oprot):
        if oprot._fast_encode is 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)
all_structs.append(getLocalJobSubmission_result)
getLocalJobSubmission_result.thrift_spec = (
    (0, TType.STRUCT, 'success', [airavata.model.appcatalog.computeresource.ttypes.LOCALSubmission, None], None, ),  # 0
    (1, TType.STRUCT, 'ire', [airavata.api.error.ttypes.InvalidRequestException, None], None, ),  # 1
    (2, TType.STRUCT, 'ace', [airavata.api.error.ttypes.AiravataClientException, None], None, ),  # 2
    (3, TType.STRUCT, 'ase', [airavata.api.error.ttypes.AiravataSystemException, None], None, ),  # 3
    (4, TType.STRUCT, 'ae', [airavata.api.error.ttypes.AuthorizationException, None], None, ),  # 4
)


class addSSHJobSubmissionDetails_args(object):
    """
    Attributes:
     - authzToken
     - computeResourceId
     - priorityOrder
     - sshJobSubmission

    """


    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', errors='replace') 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)
all_structs.append(addSSHJobSubmissionDetails_args)
addSSHJobSubmissionDetails_args.thrift_spec = (
    None,  # 0
    (1, TType.STRUCT, 'authzToken', [airavata.model.security.ttypes.AuthzToken, None], 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, None], None, ),  # 4
)


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

    """


    def __init__(self, success=None, ire=None, ace=None, ase=None, ae=None,):
        self.success = success
        self.ire = ire
        self.ace = ace
        self.ase = ase
        self.ae = ae

    def read(self, iprot):
        if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None:
            iprot._fast_decode(self, iprot, [self.__class__, 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', errors='replace') 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.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 2:
                if ftype == TType.STRUCT:
                    self.ace = airavata.api.error.ttypes.AiravataClientException.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 3:
                if ftype == TType.STRUCT:
                    self.ase = airavata.api.error.ttypes.AiravataSystemException.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 4:
                if ftype == TType.STRUCT:
                    self.ae = airavata.api.error.ttypes.AuthorizationException.read(iprot)
                else:
                    iprot.skip(ftype)
            else:
                iprot.skip(ftype)
            iprot.readFieldEnd()
        iprot.readStructEnd()

    def write(self, oprot):
        if oprot._fast_encode is 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)
all_structs.append(addSSHJobSubmissionDetails_result)
addSSHJobSubmissionDetails_result.thrift_spec = (
    (0, TType.STRING, 'success', 'UTF8', None, ),  # 0
    (1, TType.STRUCT, 'ire', [airavata.api.error.ttypes.InvalidRequestException, None], None, ),  # 1
    (2, TType.STRUCT, 'ace', [airavata.api.error.ttypes.AiravataClientException, None], None, ),  # 2
    (3, TType.STRUCT, 'ase', [airavata.api.error.ttypes.AiravataSystemException, None], None, ),  # 3
    (4, TType.STRUCT, 'ae', [airavata.api.error.ttypes.AuthorizationException, None], None, ),  # 4
)


class addSSHForkJobSubmissionDetails_args(object):
    """
    Attributes:
     - authzToken
     - computeResourceId
     - priorityOrder
     - sshJobSubmission

    """


    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', errors='replace') 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)
all_structs.append(addSSHForkJobSubmissionDetails_args)
addSSHForkJobSubmissionDetails_args.thrift_spec = (
    None,  # 0
    (1, TType.STRUCT, 'authzToken', [airavata.model.security.ttypes.AuthzToken, None], 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, None], None, ),  # 4
)


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

    """


    def __init__(self, success=None, ire=None, ace=None, ase=None, ae=None,):
        self.success = success
        self.ire = ire
        self.ace = ace
        self.ase = ase
        self.ae = ae

    def read(self, iprot):
        if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None:
            iprot._fast_decode(self, iprot, [self.__class__, 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', errors='replace') 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.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 2:
                if ftype == TType.STRUCT:
                    self.ace = airavata.api.error.ttypes.AiravataClientException.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 3:
                if ftype == TType.STRUCT:
                    self.ase = airavata.api.error.ttypes.AiravataSystemException.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 4:
                if ftype == TType.STRUCT:
                    self.ae = airavata.api.error.ttypes.AuthorizationException.read(iprot)
                else:
                    iprot.skip(ftype)
            else:
                iprot.skip(ftype)
            iprot.readFieldEnd()
        iprot.readStructEnd()

    def write(self, oprot):
        if oprot._fast_encode is 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)
all_structs.append(addSSHForkJobSubmissionDetails_result)
addSSHForkJobSubmissionDetails_result.thrift_spec = (
    (0, TType.STRING, 'success', 'UTF8', None, ),  # 0
    (1, TType.STRUCT, 'ire', [airavata.api.error.ttypes.InvalidRequestException, None], None, ),  # 1
    (2, TType.STRUCT, 'ace', [airavata.api.error.ttypes.AiravataClientException, None], None, ),  # 2
    (3, TType.STRUCT, 'ase', [airavata.api.error.ttypes.AiravataSystemException, None], None, ),  # 3
    (4, TType.STRUCT, 'ae', [airavata.api.error.ttypes.AuthorizationException, None], None, ),  # 4
)


class getSSHJobSubmission_args(object):
    """
    Attributes:
     - authzToken
     - jobSubmissionId

    """


    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', errors='replace') if sys.version_info[0] == 2 else iprot.readString()
                else:
                    iprot.skip(ftype)
            else:
                iprot.skip(ftype)
            iprot.readFieldEnd()
        iprot.readStructEnd()

    def write(self, oprot):
        if oprot._fast_encode is not None and self.thrift_spec is not None:
            oprot.trans.write(oprot._fast_encode(self, [self.__class__, self.thrift_spec]))
            return
        oprot.writeStructBegin('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)
all_structs.append(getSSHJobSubmission_args)
getSSHJobSubmission_args.thrift_spec = (
    None,  # 0
    (1, TType.STRUCT, 'authzToken', [airavata.model.security.ttypes.AuthzToken, None], None, ),  # 1
    (2, TType.STRING, 'jobSubmissionId', 'UTF8', None, ),  # 2
)


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

    """


    def __init__(self, success=None, ire=None, ace=None, ase=None, ae=None,):
        self.success = success
        self.ire = ire
        self.ace = ace
        self.ase = ase
        self.ae = ae

    def read(self, iprot):
        if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None:
            iprot._fast_decode(self, iprot, [self.__class__, 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.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 2:
                if ftype == TType.STRUCT:
                    self.ace = airavata.api.error.ttypes.AiravataClientException.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 3:
                if ftype == TType.STRUCT:
                    self.ase = airavata.api.error.ttypes.AiravataSystemException.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 4:
                if ftype == TType.STRUCT:
                    self.ae = airavata.api.error.ttypes.AuthorizationException.read(iprot)
                else:
                    iprot.skip(ftype)
            else:
                iprot.skip(ftype)
            iprot.readFieldEnd()
        iprot.readStructEnd()

    def write(self, oprot):
        if oprot._fast_encode is 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)
all_structs.append(getSSHJobSubmission_result)
getSSHJobSubmission_result.thrift_spec = (
    (0, TType.STRUCT, 'success', [airavata.model.appcatalog.computeresource.ttypes.SSHJobSubmission, None], None, ),  # 0
    (1, TType.STRUCT, 'ire', [airavata.api.error.ttypes.InvalidRequestException, None], None, ),  # 1
    (2, TType.STRUCT, 'ace', [airavata.api.error.ttypes.AiravataClientException, None], None, ),  # 2
    (3, TType.STRUCT, 'ase', [airavata.api.error.ttypes.AiravataSystemException, None], None, ),  # 3
    (4, TType.STRUCT, 'ae', [airavata.api.error.ttypes.AuthorizationException, None], None, ),  # 4
)


class addUNICOREJobSubmissionDetails_args(object):
    """
    Attributes:
     - authzToken
     - computeResourceId
     - priorityOrder
     - unicoreJobSubmission

    """


    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', errors='replace') 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)
all_structs.append(addUNICOREJobSubmissionDetails_args)
addUNICOREJobSubmissionDetails_args.thrift_spec = (
    None,  # 0
    (1, TType.STRUCT, 'authzToken', [airavata.model.security.ttypes.AuthzToken, None], 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, None], None, ),  # 4
)


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

    """


    def __init__(self, success=None, ire=None, ace=None, ase=None, ae=None,):
        self.success = success
        self.ire = ire
        self.ace = ace
        self.ase = ase
        self.ae = ae

    def read(self, iprot):
        if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None:
            iprot._fast_decode(self, iprot, [self.__class__, 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', errors='replace') 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.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 2:
                if ftype == TType.STRUCT:
                    self.ace = airavata.api.error.ttypes.AiravataClientException.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 3:
                if ftype == TType.STRUCT:
                    self.ase = airavata.api.error.ttypes.AiravataSystemException.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 4:
                if ftype == TType.STRUCT:
                    self.ae = airavata.api.error.ttypes.AuthorizationException.read(iprot)
                else:
                    iprot.skip(ftype)
            else:
                iprot.skip(ftype)
            iprot.readFieldEnd()
        iprot.readStructEnd()

    def write(self, oprot):
        if oprot._fast_encode is 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)
all_structs.append(addUNICOREJobSubmissionDetails_result)
addUNICOREJobSubmissionDetails_result.thrift_spec = (
    (0, TType.STRING, 'success', 'UTF8', None, ),  # 0
    (1, TType.STRUCT, 'ire', [airavata.api.error.ttypes.InvalidRequestException, None], None, ),  # 1
    (2, TType.STRUCT, 'ace', [airavata.api.error.ttypes.AiravataClientException, None], None, ),  # 2
    (3, TType.STRUCT, 'ase', [airavata.api.error.ttypes.AiravataSystemException, None], None, ),  # 3
    (4, TType.STRUCT, 'ae', [airavata.api.error.ttypes.AuthorizationException, None], None, ),  # 4
)


class getUnicoreJobSubmission_args(object):
    """
    Attributes:
     - authzToken
     - jobSubmissionId

    """


    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', errors='replace') if sys.version_info[0] == 2 else iprot.readString()
                else:
                    iprot.skip(ftype)
            else:
                iprot.skip(ftype)
            iprot.readFieldEnd()
        iprot.readStructEnd()

    def write(self, oprot):
        if oprot._fast_encode is not None and self.thrift_spec is not None:
            oprot.trans.write(oprot._fast_encode(self, [self.__class__, self.thrift_spec]))
            return
        oprot.writeStructBegin('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)
all_structs.append(getUnicoreJobSubmission_args)
getUnicoreJobSubmission_args.thrift_spec = (
    None,  # 0
    (1, TType.STRUCT, 'authzToken', [airavata.model.security.ttypes.AuthzToken, None], None, ),  # 1
    (2, TType.STRING, 'jobSubmissionId', 'UTF8', None, ),  # 2
)


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

    """


    def __init__(self, success=None, ire=None, ace=None, ase=None, ae=None,):
        self.success = success
        self.ire = ire
        self.ace = ace
        self.ase = ase
        self.ae = ae

    def read(self, iprot):
        if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None:
            iprot._fast_decode(self, iprot, [self.__class__, 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.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 2:
                if ftype == TType.STRUCT:
                    self.ace = airavata.api.error.ttypes.AiravataClientException.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 3:
                if ftype == TType.STRUCT:
                    self.ase = airavata.api.error.ttypes.AiravataSystemException.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 4:
                if ftype == TType.STRUCT:
                    self.ae = airavata.api.error.ttypes.AuthorizationException.read(iprot)
                else:
                    iprot.skip(ftype)
            else:
                iprot.skip(ftype)
            iprot.readFieldEnd()
        iprot.readStructEnd()

    def write(self, oprot):
        if oprot._fast_encode is 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)
all_structs.append(getUnicoreJobSubmission_result)
getUnicoreJobSubmission_result.thrift_spec = (
    (0, TType.STRUCT, 'success', [airavata.model.appcatalog.computeresource.ttypes.UnicoreJobSubmission, None], None, ),  # 0
    (1, TType.STRUCT, 'ire', [airavata.api.error.ttypes.InvalidRequestException, None], None, ),  # 1
    (2, TType.STRUCT, 'ace', [airavata.api.error.ttypes.AiravataClientException, None], None, ),  # 2
    (3, TType.STRUCT, 'ase', [airavata.api.error.ttypes.AiravataSystemException, None], None, ),  # 3
    (4, TType.STRUCT, 'ae', [airavata.api.error.ttypes.AuthorizationException, None], None, ),  # 4
)


class addCloudJobSubmissionDetails_args(object):
    """
    Attributes:
     - authzToken
     - computeResourceId
     - priorityOrder
     - cloudSubmission

    """


    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', errors='replace') 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)
all_structs.append(addCloudJobSubmissionDetails_args)
addCloudJobSubmissionDetails_args.thrift_spec = (
    None,  # 0
    (1, TType.STRUCT, 'authzToken', [airavata.model.security.ttypes.AuthzToken, None], 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, None], None, ),  # 4
)


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

    """


    def __init__(self, success=None, ire=None, ace=None, ase=None, ae=None,):
        self.success = success
        self.ire = ire
        self.ace = ace
        self.ase = ase
        self.ae = ae

    def read(self, iprot):
        if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None:
            iprot._fast_decode(self, iprot, [self.__class__, 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', errors='replace') 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.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 2:
                if ftype == TType.STRUCT:
                    self.ace = airavata.api.error.ttypes.AiravataClientException.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 3:
                if ftype == TType.STRUCT:
                    self.ase = airavata.api.error.ttypes.AiravataSystemException.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 4:
                if ftype == TType.STRUCT:
                    self.ae = airavata.api.error.ttypes.AuthorizationException.read(iprot)
                else:
                    iprot.skip(ftype)
            else:
                iprot.skip(ftype)
            iprot.readFieldEnd()
        iprot.readStructEnd()

    def write(self, oprot):
        if oprot._fast_encode is 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)
all_structs.append(addCloudJobSubmissionDetails_result)
addCloudJobSubmissionDetails_result.thrift_spec = (
    (0, TType.STRING, 'success', 'UTF8', None, ),  # 0
    (1, TType.STRUCT, 'ire', [airavata.api.error.ttypes.InvalidRequestException, None], None, ),  # 1
    (2, TType.STRUCT, 'ace', [airavata.api.error.ttypes.AiravataClientException, None], None, ),  # 2
    (3, TType.STRUCT, 'ase', [airavata.api.error.ttypes.AiravataSystemException, None], None, ),  # 3
    (4, TType.STRUCT, 'ae', [airavata.api.error.ttypes.AuthorizationException, None], None, ),  # 4
)


class getCloudJobSubmission_args(object):
    """
    Attributes:
     - authzToken
     - jobSubmissionId

    """


    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', errors='replace') if sys.version_info[0] == 2 else iprot.readString()
                else:
                    iprot.skip(ftype)
            else:
                iprot.skip(ftype)
            iprot.readFieldEnd()
        iprot.readStructEnd()

    def write(self, oprot):
        if oprot._fast_encode is not None and self.thrift_spec is not None:
            oprot.trans.write(oprot._fast_encode(self, [self.__class__, self.thrift_spec]))
            return
        oprot.writeStructBegin('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)
all_structs.append(getCloudJobSubmission_args)
getCloudJobSubmission_args.thrift_spec = (
    None,  # 0
    (1, TType.STRUCT, 'authzToken', [airavata.model.security.ttypes.AuthzToken, None], None, ),  # 1
    (2, TType.STRING, 'jobSubmissionId', 'UTF8', None, ),  # 2
)


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

    """


    def __init__(self, success=None, ire=None, ace=None, ase=None, ae=None,):
        self.success = success
        self.ire = ire
        self.ace = ace
        self.ase = ase
        self.ae = ae

    def read(self, iprot):
        if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None:
            iprot._fast_decode(self, iprot, [self.__class__, 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.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 2:
                if ftype == TType.STRUCT:
                    self.ace = airavata.api.error.ttypes.AiravataClientException.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 3:
                if ftype == TType.STRUCT:
                    self.ase = airavata.api.error.ttypes.AiravataSystemException.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 4:
                if ftype == TType.STRUCT:
                    self.ae = airavata.api.error.ttypes.AuthorizationException.read(iprot)
                else:
                    iprot.skip(ftype)
            else:
                iprot.skip(ftype)
            iprot.readFieldEnd()
        iprot.readStructEnd()

    def write(self, oprot):
        if oprot._fast_encode is 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)
all_structs.append(getCloudJobSubmission_result)
getCloudJobSubmission_result.thrift_spec = (
    (0, TType.STRUCT, 'success', [airavata.model.appcatalog.computeresource.ttypes.CloudJobSubmission, None], None, ),  # 0
    (1, TType.STRUCT, 'ire', [airavata.api.error.ttypes.InvalidRequestException, None], None, ),  # 1
    (2, TType.STRUCT, 'ace', [airavata.api.error.ttypes.AiravataClientException, None], None, ),  # 2
    (3, TType.STRUCT, 'ase', [airavata.api.error.ttypes.AiravataSystemException, None], None, ),  # 3
    (4, TType.STRUCT, 'ae', [airavata.api.error.ttypes.AuthorizationException, None], None, ),  # 4
)


class updateSSHJobSubmissionDetails_args(object):
    """
    Attributes:
     - authzToken
     - jobSubmissionInterfaceId
     - sshJobSubmission

    """


    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', errors='replace') 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)
all_structs.append(updateSSHJobSubmissionDetails_args)
updateSSHJobSubmissionDetails_args.thrift_spec = (
    None,  # 0
    (1, TType.STRUCT, 'authzToken', [airavata.model.security.ttypes.AuthzToken, None], None, ),  # 1
    (2, TType.STRING, 'jobSubmissionInterfaceId', 'UTF8', None, ),  # 2
    (3, TType.STRUCT, 'sshJobSubmission', [airavata.model.appcatalog.computeresource.ttypes.SSHJobSubmission, None], None, ),  # 3
)


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

    """


    def __init__(self, success=None, ire=None, ace=None, ase=None, ae=None,):
        self.success = success
        self.ire = ire
        self.ace = ace
        self.ase = ase
        self.ae = ae

    def read(self, iprot):
        if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None:
            iprot._fast_decode(self, iprot, [self.__class__, 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.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 2:
                if ftype == TType.STRUCT:
                    self.ace = airavata.api.error.ttypes.AiravataClientException.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 3:
                if ftype == TType.STRUCT:
                    self.ase = airavata.api.error.ttypes.AiravataSystemException.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 4:
                if ftype == TType.STRUCT:
                    self.ae = airavata.api.error.ttypes.AuthorizationException.read(iprot)
                else:
                    iprot.skip(ftype)
            else:
                iprot.skip(ftype)
            iprot.readFieldEnd()
        iprot.readStructEnd()

    def write(self, oprot):
        if oprot._fast_encode is 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)
all_structs.append(updateSSHJobSubmissionDetails_result)
updateSSHJobSubmissionDetails_result.thrift_spec = (
    (0, TType.BOOL, 'success', None, None, ),  # 0
    (1, TType.STRUCT, 'ire', [airavata.api.error.ttypes.InvalidRequestException, None], None, ),  # 1
    (2, TType.STRUCT, 'ace', [airavata.api.error.ttypes.AiravataClientException, None], None, ),  # 2
    (3, TType.STRUCT, 'ase', [airavata.api.error.ttypes.AiravataSystemException, None], None, ),  # 3
    (4, TType.STRUCT, 'ae', [airavata.api.error.ttypes.AuthorizationException, None], None, ),  # 4
)


class updateCloudJobSubmissionDetails_args(object):
    """
    Attributes:
     - authzToken
     - jobSubmissionInterfaceId
     - sshJobSubmission

    """


    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', errors='replace') 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)
all_structs.append(updateCloudJobSubmissionDetails_args)
updateCloudJobSubmissionDetails_args.thrift_spec = (
    None,  # 0
    (1, TType.STRUCT, 'authzToken', [airavata.model.security.ttypes.AuthzToken, None], None, ),  # 1
    (2, TType.STRING, 'jobSubmissionInterfaceId', 'UTF8', None, ),  # 2
    (3, TType.STRUCT, 'sshJobSubmission', [airavata.model.appcatalog.computeresource.ttypes.CloudJobSubmission, None], None, ),  # 3
)


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

    """


    def __init__(self, success=None, ire=None, ace=None, ase=None, ae=None,):
        self.success = success
        self.ire = ire
        self.ace = ace
        self.ase = ase
        self.ae = ae

    def read(self, iprot):
        if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None:
            iprot._fast_decode(self, iprot, [self.__class__, 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.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 2:
                if ftype == TType.STRUCT:
                    self.ace = airavata.api.error.ttypes.AiravataClientException.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 3:
                if ftype == TType.STRUCT:
                    self.ase = airavata.api.error.ttypes.AiravataSystemException.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 4:
                if ftype == TType.STRUCT:
                    self.ae = airavata.api.error.ttypes.AuthorizationException.read(iprot)
                else:
                    iprot.skip(ftype)
            else:
                iprot.skip(ftype)
            iprot.readFieldEnd()
        iprot.readStructEnd()

    def write(self, oprot):
        if oprot._fast_encode is 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)
all_structs.append(updateCloudJobSubmissionDetails_result)
updateCloudJobSubmissionDetails_result.thrift_spec = (
    (0, TType.BOOL, 'success', None, None, ),  # 0
    (1, TType.STRUCT, 'ire', [airavata.api.error.ttypes.InvalidRequestException, None], None, ),  # 1
    (2, TType.STRUCT, 'ace', [airavata.api.error.ttypes.AiravataClientException, None], None, ),  # 2
    (3, TType.STRUCT, 'ase', [airavata.api.error.ttypes.AiravataSystemException, None], None, ),  # 3
    (4, TType.STRUCT, 'ae', [airavata.api.error.ttypes.AuthorizationException, None], None, ),  # 4
)


class updateUnicoreJobSubmissionDetails_args(object):
    """
    Attributes:
     - authzToken
     - jobSubmissionInterfaceId
     - unicoreJobSubmission

    """


    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', errors='replace') 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)
all_structs.append(updateUnicoreJobSubmissionDetails_args)
updateUnicoreJobSubmissionDetails_args.thrift_spec = (
    None,  # 0
    (1, TType.STRUCT, 'authzToken', [airavata.model.security.ttypes.AuthzToken, None], None, ),  # 1
    (2, TType.STRING, 'jobSubmissionInterfaceId', 'UTF8', None, ),  # 2
    (3, TType.STRUCT, 'unicoreJobSubmission', [airavata.model.appcatalog.computeresource.ttypes.UnicoreJobSubmission, None], None, ),  # 3
)


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

    """


    def __init__(self, success=None, ire=None, ace=None, ase=None, ae=None,):
        self.success = success
        self.ire = ire
        self.ace = ace
        self.ase = ase
        self.ae = ae

    def read(self, iprot):
        if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None:
            iprot._fast_decode(self, iprot, [self.__class__, 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.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 2:
                if ftype == TType.STRUCT:
                    self.ace = airavata.api.error.ttypes.AiravataClientException.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 3:
                if ftype == TType.STRUCT:
                    self.ase = airavata.api.error.ttypes.AiravataSystemException.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 4:
                if ftype == TType.STRUCT:
                    self.ae = airavata.api.error.ttypes.AuthorizationException.read(iprot)
                else:
                    iprot.skip(ftype)
            else:
                iprot.skip(ftype)
            iprot.readFieldEnd()
        iprot.readStructEnd()

    def write(self, oprot):
        if oprot._fast_encode is 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)
all_structs.append(updateUnicoreJobSubmissionDetails_result)
updateUnicoreJobSubmissionDetails_result.thrift_spec = (
    (0, TType.BOOL, 'success', None, None, ),  # 0
    (1, TType.STRUCT, 'ire', [airavata.api.error.ttypes.InvalidRequestException, None], None, ),  # 1
    (2, TType.STRUCT, 'ace', [airavata.api.error.ttypes.AiravataClientException, None], None, ),  # 2
    (3, TType.STRUCT, 'ase', [airavata.api.error.ttypes.AiravataSystemException, None], None, ),  # 3
    (4, TType.STRUCT, 'ae', [airavata.api.error.ttypes.AuthorizationException, None], None, ),  # 4
)


class addLocalDataMovementDetails_args(object):
    """
    Attributes:
     - authzToken
     - productUri
     - dataMoveType
     - priorityOrder
     - localDataMovement

    """


    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', errors='replace') 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)
all_structs.append(addLocalDataMovementDetails_args)
addLocalDataMovementDetails_args.thrift_spec = (
    None,  # 0
    (1, TType.STRUCT, 'authzToken', [airavata.model.security.ttypes.AuthzToken, None], 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, None], None, ),  # 5
)


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

    """


    def __init__(self, success=None, ire=None, ace=None, ase=None, ae=None,):
        self.success = success
        self.ire = ire
        self.ace = ace
        self.ase = ase
        self.ae = ae

    def read(self, iprot):
        if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None:
            iprot._fast_decode(self, iprot, [self.__class__, 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', errors='replace') 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.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 2:
                if ftype == TType.STRUCT:
                    self.ace = airavata.api.error.ttypes.AiravataClientException.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 3:
                if ftype == TType.STRUCT:
                    self.ase = airavata.api.error.ttypes.AiravataSystemException.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 4:
                if ftype == TType.STRUCT:
                    self.ae = airavata.api.error.ttypes.AuthorizationException.read(iprot)
                else:
                    iprot.skip(ftype)
            else:
                iprot.skip(ftype)
            iprot.readFieldEnd()
        iprot.readStructEnd()

    def write(self, oprot):
        if oprot._fast_encode is 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)
all_structs.append(addLocalDataMovementDetails_result)
addLocalDataMovementDetails_result.thrift_spec = (
    (0, TType.STRING, 'success', 'UTF8', None, ),  # 0
    (1, TType.STRUCT, 'ire', [airavata.api.error.ttypes.InvalidRequestException, None], None, ),  # 1
    (2, TType.STRUCT, 'ace', [airavata.api.error.ttypes.AiravataClientException, None], None, ),  # 2
    (3, TType.STRUCT, 'ase', [airavata.api.error.ttypes.AiravataSystemException, None], None, ),  # 3
    (4, TType.STRUCT, 'ae', [airavata.api.error.ttypes.AuthorizationException, None], None, ),  # 4
)


class updateLocalDataMovementDetails_args(object):
    """
    Attributes:
     - authzToken
     - dataMovementInterfaceId
     - localDataMovement

    """


    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', errors='replace') 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)
all_structs.append(updateLocalDataMovementDetails_args)
updateLocalDataMovementDetails_args.thrift_spec = (
    None,  # 0
    (1, TType.STRUCT, 'authzToken', [airavata.model.security.ttypes.AuthzToken, None], None, ),  # 1
    (2, TType.STRING, 'dataMovementInterfaceId', 'UTF8', None, ),  # 2
    (3, TType.STRUCT, 'localDataMovement', [airavata.model.data.movement.ttypes.LOCALDataMovement, None], None, ),  # 3
)


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

    """


    def __init__(self, success=None, ire=None, ace=None, ase=None, ae=None,):
        self.success = success
        self.ire = ire
        self.ace = ace
        self.ase = ase
        self.ae = ae

    def read(self, iprot):
        if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None:
            iprot._fast_decode(self, iprot, [self.__class__, 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.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 2:
                if ftype == TType.STRUCT:
                    self.ace = airavata.api.error.ttypes.AiravataClientException.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 3:
                if ftype == TType.STRUCT:
                    self.ase = airavata.api.error.ttypes.AiravataSystemException.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 4:
                if ftype == TType.STRUCT:
                    self.ae = airavata.api.error.ttypes.AuthorizationException.read(iprot)
                else:
                    iprot.skip(ftype)
            else:
                iprot.skip(ftype)
            iprot.readFieldEnd()
        iprot.readStructEnd()

    def write(self, oprot):
        if oprot._fast_encode is 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)
all_structs.append(updateLocalDataMovementDetails_result)
updateLocalDataMovementDetails_result.thrift_spec = (
    (0, TType.BOOL, 'success', None, None, ),  # 0
    (1, TType.STRUCT, 'ire', [airavata.api.error.ttypes.InvalidRequestException, None], None, ),  # 1
    (2, TType.STRUCT, 'ace', [airavata.api.error.ttypes.AiravataClientException, None], None, ),  # 2
    (3, TType.STRUCT, 'ase', [airavata.api.error.ttypes.AiravataSystemException, None], None, ),  # 3
    (4, TType.STRUCT, 'ae', [airavata.api.error.ttypes.AuthorizationException, None], None, ),  # 4
)


class getLocalDataMovement_args(object):
    """
    Attributes:
     - authzToken
     - dataMovementId

    """


    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', errors='replace') if sys.version_info[0] == 2 else iprot.readString()
                else:
                    iprot.skip(ftype)
            else:
                iprot.skip(ftype)
            iprot.readFieldEnd()
        iprot.readStructEnd()

    def write(self, oprot):
        if oprot._fast_encode is not None and self.thrift_spec is not None:
            oprot.trans.write(oprot._fast_encode(self, [self.__class__, self.thrift_spec]))
            return
        oprot.writeStructBegin('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)
all_structs.append(getLocalDataMovement_args)
getLocalDataMovement_args.thrift_spec = (
    None,  # 0
    (1, TType.STRUCT, 'authzToken', [airavata.model.security.ttypes.AuthzToken, None], None, ),  # 1
    (2, TType.STRING, 'dataMovementId', 'UTF8', None, ),  # 2
)


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

    """


    def __init__(self, success=None, ire=None, ace=None, ase=None, ae=None,):
        self.success = success
        self.ire = ire
        self.ace = ace
        self.ase = ase
        self.ae = ae

    def read(self, iprot):
        if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None:
            iprot._fast_decode(self, iprot, [self.__class__, 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.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 2:
                if ftype == TType.STRUCT:
                    self.ace = airavata.api.error.ttypes.AiravataClientException.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 3:
                if ftype == TType.STRUCT:
                    self.ase = airavata.api.error.ttypes.AiravataSystemException.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 4:
                if ftype == TType.STRUCT:
                    self.ae = airavata.api.error.ttypes.AuthorizationException.read(iprot)
                else:
                    iprot.skip(ftype)
            else:
                iprot.skip(ftype)
            iprot.readFieldEnd()
        iprot.readStructEnd()

    def write(self, oprot):
        if oprot._fast_encode is 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)
all_structs.append(getLocalDataMovement_result)
getLocalDataMovement_result.thrift_spec = (
    (0, TType.STRUCT, 'success', [airavata.model.data.movement.ttypes.LOCALDataMovement, None], None, ),  # 0
    (1, TType.STRUCT, 'ire', [airavata.api.error.ttypes.InvalidRequestException, None], None, ),  # 1
    (2, TType.STRUCT, 'ace', [airavata.api.error.ttypes.AiravataClientException, None], None, ),  # 2
    (3, TType.STRUCT, 'ase', [airavata.api.error.ttypes.AiravataSystemException, None], None, ),  # 3
    (4, TType.STRUCT, 'ae', [airavata.api.error.ttypes.AuthorizationException, None], None, ),  # 4
)


class addSCPDataMovementDetails_args(object):
    """
    Attributes:
     - authzToken
     - productUri
     - dataMoveType
     - priorityOrder
     - scpDataMovement

    """


    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', errors='replace') 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)
all_structs.append(addSCPDataMovementDetails_args)
addSCPDataMovementDetails_args.thrift_spec = (
    None,  # 0
    (1, TType.STRUCT, 'authzToken', [airavata.model.security.ttypes.AuthzToken, None], 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, None], None, ),  # 5
)


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

    """


    def __init__(self, success=None, ire=None, ace=None, ase=None, ae=None,):
        self.success = success
        self.ire = ire
        self.ace = ace
        self.ase = ase
        self.ae = ae

    def read(self, iprot):
        if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None:
            iprot._fast_decode(self, iprot, [self.__class__, 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', errors='replace') 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.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 2:
                if ftype == TType.STRUCT:
                    self.ace = airavata.api.error.ttypes.AiravataClientException.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 3:
                if ftype == TType.STRUCT:
                    self.ase = airavata.api.error.ttypes.AiravataSystemException.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 4:
                if ftype == TType.STRUCT:
                    self.ae = airavata.api.error.ttypes.AuthorizationException.read(iprot)
                else:
                    iprot.skip(ftype)
            else:
                iprot.skip(ftype)
            iprot.readFieldEnd()
        iprot.readStructEnd()

    def write(self, oprot):
        if oprot._fast_encode is 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)
all_structs.append(addSCPDataMovementDetails_result)
addSCPDataMovementDetails_result.thrift_spec = (
    (0, TType.STRING, 'success', 'UTF8', None, ),  # 0
    (1, TType.STRUCT, 'ire', [airavata.api.error.ttypes.InvalidRequestException, None], None, ),  # 1
    (2, TType.STRUCT, 'ace', [airavata.api.error.ttypes.AiravataClientException, None], None, ),  # 2
    (3, TType.STRUCT, 'ase', [airavata.api.error.ttypes.AiravataSystemException, None], None, ),  # 3
    (4, TType.STRUCT, 'ae', [airavata.api.error.ttypes.AuthorizationException, None], None, ),  # 4
)


class updateSCPDataMovementDetails_args(object):
    """
    Attributes:
     - authzToken
     - dataMovementInterfaceId
     - scpDataMovement

    """


    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', errors='replace') 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)
all_structs.append(updateSCPDataMovementDetails_args)
updateSCPDataMovementDetails_args.thrift_spec = (
    None,  # 0
    (1, TType.STRUCT, 'authzToken', [airavata.model.security.ttypes.AuthzToken, None], None, ),  # 1
    (2, TType.STRING, 'dataMovementInterfaceId', 'UTF8', None, ),  # 2
    (3, TType.STRUCT, 'scpDataMovement', [airavata.model.data.movement.ttypes.SCPDataMovement, None], None, ),  # 3
)


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

    """


    def __init__(self, success=None, ire=None, ace=None, ase=None, ae=None,):
        self.success = success
        self.ire = ire
        self.ace = ace
        self.ase = ase
        self.ae = ae

    def read(self, iprot):
        if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None:
            iprot._fast_decode(self, iprot, [self.__class__, 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.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 2:
                if ftype == TType.STRUCT:
                    self.ace = airavata.api.error.ttypes.AiravataClientException.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 3:
                if ftype == TType.STRUCT:
                    self.ase = airavata.api.error.ttypes.AiravataSystemException.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 4:
                if ftype == TType.STRUCT:
                    self.ae = airavata.api.error.ttypes.AuthorizationException.read(iprot)
                else:
                    iprot.skip(ftype)
            else:
                iprot.skip(ftype)
            iprot.readFieldEnd()
        iprot.readStructEnd()

    def write(self, oprot):
        if oprot._fast_encode is 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)
all_structs.append(updateSCPDataMovementDetails_result)
updateSCPDataMovementDetails_result.thrift_spec = (
    (0, TType.BOOL, 'success', None, None, ),  # 0
    (1, TType.STRUCT, 'ire', [airavata.api.error.ttypes.InvalidRequestException, None], None, ),  # 1
    (2, TType.STRUCT, 'ace', [airavata.api.error.ttypes.AiravataClientException, None], None, ),  # 2
    (3, TType.STRUCT, 'ase', [airavata.api.error.ttypes.AiravataSystemException, None], None, ),  # 3
    (4, TType.STRUCT, 'ae', [airavata.api.error.ttypes.AuthorizationException, None], None, ),  # 4
)


class getSCPDataMovement_args(object):
    """
    Attributes:
     - authzToken
     - dataMovementId

    """


    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', errors='replace') if sys.version_info[0] == 2 else iprot.readString()
                else:
                    iprot.skip(ftype)
            else:
                iprot.skip(ftype)
            iprot.readFieldEnd()
        iprot.readStructEnd()

    def write(self, oprot):
        if oprot._fast_encode is not None and self.thrift_spec is not None:
            oprot.trans.write(oprot._fast_encode(self, [self.__class__, self.thrift_spec]))
            return
        oprot.writeStructBegin('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)
all_structs.append(getSCPDataMovement_args)
getSCPDataMovement_args.thrift_spec = (
    None,  # 0
    (1, TType.STRUCT, 'authzToken', [airavata.model.security.ttypes.AuthzToken, None], None, ),  # 1
    (2, TType.STRING, 'dataMovementId', 'UTF8', None, ),  # 2
)


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

    """


    def __init__(self, success=None, ire=None, ace=None, ase=None, ae=None,):
        self.success = success
        self.ire = ire
        self.ace = ace
        self.ase = ase
        self.ae = ae

    def read(self, iprot):
        if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None:
            iprot._fast_decode(self, iprot, [self.__class__, 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.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 2:
                if ftype == TType.STRUCT:
                    self.ace = airavata.api.error.ttypes.AiravataClientException.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 3:
                if ftype == TType.STRUCT:
                    self.ase = airavata.api.error.ttypes.AiravataSystemException.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 4:
                if ftype == TType.STRUCT:
                    self.ae = airavata.api.error.ttypes.AuthorizationException.read(iprot)
                else:
                    iprot.skip(ftype)
            else:
                iprot.skip(ftype)
            iprot.readFieldEnd()
        iprot.readStructEnd()

    def write(self, oprot):
        if oprot._fast_encode is 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)
all_structs.append(getSCPDataMovement_result)
getSCPDataMovement_result.thrift_spec = (
    (0, TType.STRUCT, 'success', [airavata.model.data.movement.ttypes.SCPDataMovement, None], None, ),  # 0
    (1, TType.STRUCT, 'ire', [airavata.api.error.ttypes.InvalidRequestException, None], None, ),  # 1
    (2, TType.STRUCT, 'ace', [airavata.api.error.ttypes.AiravataClientException, None], None, ),  # 2
    (3, TType.STRUCT, 'ase', [airavata.api.error.ttypes.AiravataSystemException, None], None, ),  # 3
    (4, TType.STRUCT, 'ae', [airavata.api.error.ttypes.AuthorizationException, None], None, ),  # 4
)


class addUnicoreDataMovementDetails_args(object):
    """
    Attributes:
     - authzToken
     - productUri
     - dataMoveType
     - priorityOrder
     - unicoreDataMovement

    """


    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', errors='replace') 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)
all_structs.append(addUnicoreDataMovementDetails_args)
addUnicoreDataMovementDetails_args.thrift_spec = (
    None,  # 0
    (1, TType.STRUCT, 'authzToken', [airavata.model.security.ttypes.AuthzToken, None], 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, None], None, ),  # 5
)


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

    """


    def __init__(self, success=None, ire=None, ace=None, ase=None, ae=None,):
        self.success = success
        self.ire = ire
        self.ace = ace
        self.ase = ase
        self.ae = ae

    def read(self, iprot):
        if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None:
            iprot._fast_decode(self, iprot, [self.__class__, 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', errors='replace') 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.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 2:
                if ftype == TType.STRUCT:
                    self.ace = airavata.api.error.ttypes.AiravataClientException.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 3:
                if ftype == TType.STRUCT:
                    self.ase = airavata.api.error.ttypes.AiravataSystemException.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 4:
                if ftype == TType.STRUCT:
                    self.ae = airavata.api.error.ttypes.AuthorizationException.read(iprot)
                else:
                    iprot.skip(ftype)
            else:
                iprot.skip(ftype)
            iprot.readFieldEnd()
        iprot.readStructEnd()

    def write(self, oprot):
        if oprot._fast_encode is 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)
all_structs.append(addUnicoreDataMovementDetails_result)
addUnicoreDataMovementDetails_result.thrift_spec = (
    (0, TType.STRING, 'success', 'UTF8', None, ),  # 0
    (1, TType.STRUCT, 'ire', [airavata.api.error.ttypes.InvalidRequestException, None], None, ),  # 1
    (2, TType.STRUCT, 'ace', [airavata.api.error.ttypes.AiravataClientException, None], None, ),  # 2
    (3, TType.STRUCT, 'ase', [airavata.api.error.ttypes.AiravataSystemException, None], None, ),  # 3
    (4, TType.STRUCT, 'ae', [airavata.api.error.ttypes.AuthorizationException, None], None, ),  # 4
)


class updateUnicoreDataMovementDetails_args(object):
    """
    Attributes:
     - authzToken
     - dataMovementInterfaceId
     - unicoreDataMovement

    """


    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', errors='replace') 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)
all_structs.append(updateUnicoreDataMovementDetails_args)
updateUnicoreDataMovementDetails_args.thrift_spec = (
    None,  # 0
    (1, TType.STRUCT, 'authzToken', [airavata.model.security.ttypes.AuthzToken, None], None, ),  # 1
    (2, TType.STRING, 'dataMovementInterfaceId', 'UTF8', None, ),  # 2
    (3, TType.STRUCT, 'unicoreDataMovement', [airavata.model.data.movement.ttypes.UnicoreDataMovement, None], None, ),  # 3
)


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

    """


    def __init__(self, success=None, ire=None, ace=None, ase=None, ae=None,):
        self.success = success
        self.ire = ire
        self.ace = ace
        self.ase = ase
        self.ae = ae

    def read(self, iprot):
        if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None:
            iprot._fast_decode(self, iprot, [self.__class__, 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.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 2:
                if ftype == TType.STRUCT:
                    self.ace = airavata.api.error.ttypes.AiravataClientException.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 3:
                if ftype == TType.STRUCT:
                    self.ase = airavata.api.error.ttypes.AiravataSystemException.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 4:
                if ftype == TType.STRUCT:
                    self.ae = airavata.api.error.ttypes.AuthorizationException.read(iprot)
                else:
                    iprot.skip(ftype)
            else:
                iprot.skip(ftype)
            iprot.readFieldEnd()
        iprot.readStructEnd()

    def write(self, oprot):
        if oprot._fast_encode is 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)
all_structs.append(updateUnicoreDataMovementDetails_result)
updateUnicoreDataMovementDetails_result.thrift_spec = (
    (0, TType.BOOL, 'success', None, None, ),  # 0
    (1, TType.STRUCT, 'ire', [airavata.api.error.ttypes.InvalidRequestException, None], None, ),  # 1
    (2, TType.STRUCT, 'ace', [airavata.api.error.ttypes.AiravataClientException, None], None, ),  # 2
    (3, TType.STRUCT, 'ase', [airavata.api.error.ttypes.AiravataSystemException, None], None, ),  # 3
    (4, TType.STRUCT, 'ae', [airavata.api.error.ttypes.AuthorizationException, None], None, ),  # 4
)


class getUnicoreDataMovement_args(object):
    """
    Attributes:
     - authzToken
     - dataMovementId

    """


    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', errors='replace') if sys.version_info[0] == 2 else iprot.readString()
                else:
                    iprot.skip(ftype)
            else:
                iprot.skip(ftype)
            iprot.readFieldEnd()
        iprot.readStructEnd()

    def write(self, oprot):
        if oprot._fast_encode is not None and self.thrift_spec is not None:
            oprot.trans.write(oprot._fast_encode(self, [self.__class__, self.thrift_spec]))
            return
        oprot.writeStructBegin('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)
all_structs.append(getUnicoreDataMovement_args)
getUnicoreDataMovement_args.thrift_spec = (
    None,  # 0
    (1, TType.STRUCT, 'authzToken', [airavata.model.security.ttypes.AuthzToken, None], None, ),  # 1
    (2, TType.STRING, 'dataMovementId', 'UTF8', None, ),  # 2
)


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

    """


    def __init__(self, success=None, ire=None, ace=None, ase=None, ae=None,):
        self.success = success
        self.ire = ire
        self.ace = ace
        self.ase = ase
        self.ae = ae

    def read(self, iprot):
        if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None:
            iprot._fast_decode(self, iprot, [self.__class__, 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.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 2:
                if ftype == TType.STRUCT:
                    self.ace = airavata.api.error.ttypes.AiravataClientException.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 3:
                if ftype == TType.STRUCT:
                    self.ase = airavata.api.error.ttypes.AiravataSystemException.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 4:
                if ftype == TType.STRUCT:
                    self.ae = airavata.api.error.ttypes.AuthorizationException.read(iprot)
                else:
                    iprot.skip(ftype)
            else:
                iprot.skip(ftype)
            iprot.readFieldEnd()
        iprot.readStructEnd()

    def write(self, oprot):
        if oprot._fast_encode is 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)
all_structs.append(getUnicoreDataMovement_result)
getUnicoreDataMovement_result.thrift_spec = (
    (0, TType.STRUCT, 'success', [airavata.model.data.movement.ttypes.UnicoreDataMovement, None], None, ),  # 0
    (1, TType.STRUCT, 'ire', [airavata.api.error.ttypes.InvalidRequestException, None], None, ),  # 1
    (2, TType.STRUCT, 'ace', [airavata.api.error.ttypes.AiravataClientException, None], None, ),  # 2
    (3, TType.STRUCT, 'ase', [airavata.api.error.ttypes.AiravataSystemException, None], None, ),  # 3
    (4, TType.STRUCT, 'ae', [airavata.api.error.ttypes.AuthorizationException, None], None, ),  # 4
)


class addGridFTPDataMovementDetails_args(object):
    """
    Attributes:
     - authzToken
     - productUri
     - dataMoveType
     - priorityOrder
     - gridFTPDataMovement

    """


    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', errors='replace') 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)
all_structs.append(addGridFTPDataMovementDetails_args)
addGridFTPDataMovementDetails_args.thrift_spec = (
    None,  # 0
    (1, TType.STRUCT, 'authzToken', [airavata.model.security.ttypes.AuthzToken, None], 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, None], None, ),  # 5
)


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

    """


    def __init__(self, success=None, ire=None, ace=None, ase=None, ae=None,):
        self.success = success
        self.ire = ire
        self.ace = ace
        self.ase = ase
        self.ae = ae

    def read(self, iprot):
        if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None:
            iprot._fast_decode(self, iprot, [self.__class__, 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', errors='replace') 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.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 2:
                if ftype == TType.STRUCT:
                    self.ace = airavata.api.error.ttypes.AiravataClientException.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 3:
                if ftype == TType.STRUCT:
                    self.ase = airavata.api.error.ttypes.AiravataSystemException.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 4:
                if ftype == TType.STRUCT:
                    self.ae = airavata.api.error.ttypes.AuthorizationException.read(iprot)
                else:
                    iprot.skip(ftype)
            else:
                iprot.skip(ftype)
            iprot.readFieldEnd()
        iprot.readStructEnd()

    def write(self, oprot):
        if oprot._fast_encode is 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)
all_structs.append(addGridFTPDataMovementDetails_result)
addGridFTPDataMovementDetails_result.thrift_spec = (
    (0, TType.STRING, 'success', 'UTF8', None, ),  # 0
    (1, TType.STRUCT, 'ire', [airavata.api.error.ttypes.InvalidRequestException, None], None, ),  # 1
    (2, TType.STRUCT, 'ace', [airavata.api.error.ttypes.AiravataClientException, None], None, ),  # 2
    (3, TType.STRUCT, 'ase', [airavata.api.error.ttypes.AiravataSystemException, None], None, ),  # 3
    (4, TType.STRUCT, 'ae', [airavata.api.error.ttypes.AuthorizationException, None], None, ),  # 4
)


class updateGridFTPDataMovementDetails_args(object):
    """
    Attributes:
     - authzToken
     - dataMovementInterfaceId
     - gridFTPDataMovement

    """


    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', errors='replace') 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)
all_structs.append(updateGridFTPDataMovementDetails_args)
updateGridFTPDataMovementDetails_args.thrift_spec = (
    None,  # 0
    (1, TType.STRUCT, 'authzToken', [airavata.model.security.ttypes.AuthzToken, None], None, ),  # 1
    (2, TType.STRING, 'dataMovementInterfaceId', 'UTF8', None, ),  # 2
    (3, TType.STRUCT, 'gridFTPDataMovement', [airavata.model.data.movement.ttypes.GridFTPDataMovement, None], None, ),  # 3
)


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

    """


    def __init__(self, success=None, ire=None, ace=None, ase=None, ae=None,):
        self.success = success
        self.ire = ire
        self.ace = ace
        self.ase = ase
        self.ae = ae

    def read(self, iprot):
        if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None:
            iprot._fast_decode(self, iprot, [self.__class__, 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.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 2:
                if ftype == TType.STRUCT:
                    self.ace = airavata.api.error.ttypes.AiravataClientException.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 3:
                if ftype == TType.STRUCT:
                    self.ase = airavata.api.error.ttypes.AiravataSystemException.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 4:
                if ftype == TType.STRUCT:
                    self.ae = airavata.api.error.ttypes.AuthorizationException.read(iprot)
                else:
                    iprot.skip(ftype)
            else:
                iprot.skip(ftype)
            iprot.readFieldEnd()
        iprot.readStructEnd()

    def write(self, oprot):
        if oprot._fast_encode is 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)
all_structs.append(updateGridFTPDataMovementDetails_result)
updateGridFTPDataMovementDetails_result.thrift_spec = (
    (0, TType.BOOL, 'success', None, None, ),  # 0
    (1, TType.STRUCT, 'ire', [airavata.api.error.ttypes.InvalidRequestException, None], None, ),  # 1
    (2, TType.STRUCT, 'ace', [airavata.api.error.ttypes.AiravataClientException, None], None, ),  # 2
    (3, TType.STRUCT, 'ase', [airavata.api.error.ttypes.AiravataSystemException, None], None, ),  # 3
    (4, TType.STRUCT, 'ae', [airavata.api.error.ttypes.AuthorizationException, None], None, ),  # 4
)


class getGridFTPDataMovement_args(object):
    """
    Attributes:
     - authzToken
     - dataMovementId

    """


    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', errors='replace') if sys.version_info[0] == 2 else iprot.readString()
                else:
                    iprot.skip(ftype)
            else:
                iprot.skip(ftype)
            iprot.readFieldEnd()
        iprot.readStructEnd()

    def write(self, oprot):
        if oprot._fast_encode is not None and self.thrift_spec is not None:
            oprot.trans.write(oprot._fast_encode(self, [self.__class__, self.thrift_spec]))
            return
        oprot.writeStructBegin('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)
all_structs.append(getGridFTPDataMovement_args)
getGridFTPDataMovement_args.thrift_spec = (
    None,  # 0
    (1, TType.STRUCT, 'authzToken', [airavata.model.security.ttypes.AuthzToken, None], None, ),  # 1
    (2, TType.STRING, 'dataMovementId', 'UTF8', None, ),  # 2
)


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

    """


    def __init__(self, success=None, ire=None, ace=None, ase=None, ae=None,):
        self.success = success
        self.ire = ire
        self.ace = ace
        self.ase = ase
        self.ae = ae

    def read(self, iprot):
        if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None:
            iprot._fast_decode(self, iprot, [self.__class__, 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.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 2:
                if ftype == TType.STRUCT:
                    self.ace = airavata.api.error.ttypes.AiravataClientException.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 3:
                if ftype == TType.STRUCT:
                    self.ase = airavata.api.error.ttypes.AiravataSystemException.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 4:
                if ftype == TType.STRUCT:
                    self.ae = airavata.api.error.ttypes.AuthorizationException.read(iprot)
                else:
                    iprot.skip(ftype)
            else:
                iprot.skip(ftype)
            iprot.readFieldEnd()
        iprot.readStructEnd()

    def write(self, oprot):
        if oprot._fast_encode is 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)
all_structs.append(getGridFTPDataMovement_result)
getGridFTPDataMovement_result.thrift_spec = (
    (0, TType.STRUCT, 'success', [airavata.model.data.movement.ttypes.GridFTPDataMovement, None], None, ),  # 0
    (1, TType.STRUCT, 'ire', [airavata.api.error.ttypes.InvalidRequestException, None], None, ),  # 1
    (2, TType.STRUCT, 'ace', [airavata.api.error.ttypes.AiravataClientException, None], None, ),  # 2
    (3, TType.STRUCT, 'ase', [airavata.api.error.ttypes.AiravataSystemException, None], None, ),  # 3
    (4, TType.STRUCT, 'ae', [airavata.api.error.ttypes.AuthorizationException, None], None, ),  # 4
)


class changeJobSubmissionPriority_args(object):
    """
    Attributes:
     - authzToken
     - jobSubmissionInterfaceId
     - newPriorityOrder

    """


    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', errors='replace') 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)
all_structs.append(changeJobSubmissionPriority_args)
changeJobSubmissionPriority_args.thrift_spec = (
    None,  # 0
    (1, TType.STRUCT, 'authzToken', [airavata.model.security.ttypes.AuthzToken, None], None, ),  # 1
    (2, TType.STRING, 'jobSubmissionInterfaceId', 'UTF8', None, ),  # 2
    (3, TType.I32, 'newPriorityOrder', None, None, ),  # 3
)


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

    """


    def __init__(self, success=None, ire=None, ace=None, ase=None, ae=None,):
        self.success = success
        self.ire = ire
        self.ace = ace
        self.ase = ase
        self.ae = ae

    def read(self, iprot):
        if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None:
            iprot._fast_decode(self, iprot, [self.__class__, 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.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 2:
                if ftype == TType.STRUCT:
                    self.ace = airavata.api.error.ttypes.AiravataClientException.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 3:
                if ftype == TType.STRUCT:
                    self.ase = airavata.api.error.ttypes.AiravataSystemException.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 4:
                if ftype == TType.STRUCT:
                    self.ae = airavata.api.error.ttypes.AuthorizationException.read(iprot)
                else:
                    iprot.skip(ftype)
            else:
                iprot.skip(ftype)
            iprot.readFieldEnd()
        iprot.readStructEnd()

    def write(self, oprot):
        if oprot._fast_encode is 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)
all_structs.append(changeJobSubmissionPriority_result)
changeJobSubmissionPriority_result.thrift_spec = (
    (0, TType.BOOL, 'success', None, None, ),  # 0
    (1, TType.STRUCT, 'ire', [airavata.api.error.ttypes.InvalidRequestException, None], None, ),  # 1
    (2, TType.STRUCT, 'ace', [airavata.api.error.ttypes.AiravataClientException, None], None, ),  # 2
    (3, TType.STRUCT, 'ase', [airavata.api.error.ttypes.AiravataSystemException, None], None, ),  # 3
    (4, TType.STRUCT, 'ae', [airavata.api.error.ttypes.AuthorizationException, None], None, ),  # 4
)


class changeDataMovementPriority_args(object):
    """
    Attributes:
     - authzToken
     - dataMovementInterfaceId
     - newPriorityOrder

    """


    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', errors='replace') 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)
all_structs.append(changeDataMovementPriority_args)
changeDataMovementPriority_args.thrift_spec = (
    None,  # 0
    (1, TType.STRUCT, 'authzToken', [airavata.model.security.ttypes.AuthzToken, None], None, ),  # 1
    (2, TType.STRING, 'dataMovementInterfaceId', 'UTF8', None, ),  # 2
    (3, TType.I32, 'newPriorityOrder', None, None, ),  # 3
)


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

    """


    def __init__(self, success=None, ire=None, ace=None, ase=None, ae=None,):
        self.success = success
        self.ire = ire
        self.ace = ace
        self.ase = ase
        self.ae = ae

    def read(self, iprot):
        if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None:
            iprot._fast_decode(self, iprot, [self.__class__, 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.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 2:
                if ftype == TType.STRUCT:
                    self.ace = airavata.api.error.ttypes.AiravataClientException.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 3:
                if ftype == TType.STRUCT:
                    self.ase = airavata.api.error.ttypes.AiravataSystemException.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 4:
                if ftype == TType.STRUCT:
                    self.ae = airavata.api.error.ttypes.AuthorizationException.read(iprot)
                else:
                    iprot.skip(ftype)
            else:
                iprot.skip(ftype)
            iprot.readFieldEnd()
        iprot.readStructEnd()

    def write(self, oprot):
        if oprot._fast_encode is 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)
all_structs.append(changeDataMovementPriority_result)
changeDataMovementPriority_result.thrift_spec = (
    (0, TType.BOOL, 'success', None, None, ),  # 0
    (1, TType.STRUCT, 'ire', [airavata.api.error.ttypes.InvalidRequestException, None], None, ),  # 1
    (2, TType.STRUCT, 'ace', [airavata.api.error.ttypes.AiravataClientException, None], None, ),  # 2
    (3, TType.STRUCT, 'ase', [airavata.api.error.ttypes.AiravataSystemException, None], None, ),  # 3
    (4, TType.STRUCT, 'ae', [airavata.api.error.ttypes.AuthorizationException, None], None, ),  # 4
)


class changeJobSubmissionPriorities_args(object):
    """
    Attributes:
     - authzToken
     - jobSubmissionPriorityMap

    """


    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', errors='replace') 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)
all_structs.append(changeJobSubmissionPriorities_args)
changeJobSubmissionPriorities_args.thrift_spec = (
    None,  # 0
    (1, TType.STRUCT, 'authzToken', [airavata.model.security.ttypes.AuthzToken, None], None, ),  # 1
    (2, TType.MAP, 'jobSubmissionPriorityMap', (TType.STRING, 'UTF8', TType.I32, None, False), None, ),  # 2
)


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

    """


    def __init__(self, success=None, ire=None, ace=None, ase=None, ae=None,):
        self.success = success
        self.ire = ire
        self.ace = ace
        self.ase = ase
        self.ae = ae

    def read(self, iprot):
        if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None:
            iprot._fast_decode(self, iprot, [self.__class__, 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.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 2:
                if ftype == TType.STRUCT:
                    self.ace = airavata.api.error.ttypes.AiravataClientException.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 3:
                if ftype == TType.STRUCT:
                    self.ase = airavata.api.error.ttypes.AiravataSystemException.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 4:
                if ftype == TType.STRUCT:
                    self.ae = airavata.api.error.ttypes.AuthorizationException.read(iprot)
                else:
                    iprot.skip(ftype)
            else:
                iprot.skip(ftype)
            iprot.readFieldEnd()
        iprot.readStructEnd()

    def write(self, oprot):
        if oprot._fast_encode is 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)
all_structs.append(changeJobSubmissionPriorities_result)
changeJobSubmissionPriorities_result.thrift_spec = (
    (0, TType.BOOL, 'success', None, None, ),  # 0
    (1, TType.STRUCT, 'ire', [airavata.api.error.ttypes.InvalidRequestException, None], None, ),  # 1
    (2, TType.STRUCT, 'ace', [airavata.api.error.ttypes.AiravataClientException, None], None, ),  # 2
    (3, TType.STRUCT, 'ase', [airavata.api.error.ttypes.AiravataSystemException, None], None, ),  # 3
    (4, TType.STRUCT, 'ae', [airavata.api.error.ttypes.AuthorizationException, None], None, ),  # 4
)


class changeDataMovementPriorities_args(object):
    """
    Attributes:
     - authzToken
     - dataMovementPriorityMap

    """


    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', errors='replace') 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)
all_structs.append(changeDataMovementPriorities_args)
changeDataMovementPriorities_args.thrift_spec = (
    None,  # 0
    (1, TType.STRUCT, 'authzToken', [airavata.model.security.ttypes.AuthzToken, None], None, ),  # 1
    (2, TType.MAP, 'dataMovementPriorityMap', (TType.STRING, 'UTF8', TType.I32, None, False), None, ),  # 2
)


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

    """


    def __init__(self, success=None, ire=None, ace=None, ase=None, ae=None,):
        self.success = success
        self.ire = ire
        self.ace = ace
        self.ase = ase
        self.ae = ae

    def read(self, iprot):
        if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None:
            iprot._fast_decode(self, iprot, [self.__class__, 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.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 2:
                if ftype == TType.STRUCT:
                    self.ace = airavata.api.error.ttypes.AiravataClientException.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 3:
                if ftype == TType.STRUCT:
                    self.ase = airavata.api.error.ttypes.AiravataSystemException.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 4:
                if ftype == TType.STRUCT:
                    self.ae = airavata.api.error.ttypes.AuthorizationException.read(iprot)
                else:
                    iprot.skip(ftype)
            else:
                iprot.skip(ftype)
            iprot.readFieldEnd()
        iprot.readStructEnd()

    def write(self, oprot):
        if oprot._fast_encode is 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)
all_structs.append(changeDataMovementPriorities_result)
changeDataMovementPriorities_result.thrift_spec = (
    (0, TType.BOOL, 'success', None, None, ),  # 0
    (1, TType.STRUCT, 'ire', [airavata.api.error.ttypes.InvalidRequestException, None], None, ),  # 1
    (2, TType.STRUCT, 'ace', [airavata.api.error.ttypes.AiravataClientException, None], None, ),  # 2
    (3, TType.STRUCT, 'ase', [airavata.api.error.ttypes.AiravataSystemException, None], None, ),  # 3
    (4, TType.STRUCT, 'ae', [airavata.api.error.ttypes.AuthorizationException, None], None, ),  # 4
)


class deleteJobSubmissionInterface_args(object):
    """
    Attributes:
     - authzToken
     - computeResourceId
     - jobSubmissionInterfaceId

    """


    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', errors='replace') 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', errors='replace') if sys.version_info[0] == 2 else iprot.readString()
                else:
                    iprot.skip(ftype)
            else:
                iprot.skip(ftype)
            iprot.readFieldEnd()
        iprot.readStructEnd()

    def write(self, oprot):
        if oprot._fast_encode is not None and self.thrift_spec is not None:
            oprot.trans.write(oprot._fast_encode(self, [self.__class__, self.thrift_spec]))
            return
        oprot.writeStructBegin('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)
all_structs.append(deleteJobSubmissionInterface_args)
deleteJobSubmissionInterface_args.thrift_spec = (
    None,  # 0
    (1, TType.STRUCT, 'authzToken', [airavata.model.security.ttypes.AuthzToken, None], None, ),  # 1
    (2, TType.STRING, 'computeResourceId', 'UTF8', None, ),  # 2
    (3, TType.STRING, 'jobSubmissionInterfaceId', 'UTF8', None, ),  # 3
)


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

    """


    def __init__(self, success=None, ire=None, ace=None, ase=None, ae=None,):
        self.success = success
        self.ire = ire
        self.ace = ace
        self.ase = ase
        self.ae = ae

    def read(self, iprot):
        if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None:
            iprot._fast_decode(self, iprot, [self.__class__, 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.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 2:
                if ftype == TType.STRUCT:
                    self.ace = airavata.api.error.ttypes.AiravataClientException.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 3:
                if ftype == TType.STRUCT:
                    self.ase = airavata.api.error.ttypes.AiravataSystemException.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 4:
                if ftype == TType.STRUCT:
                    self.ae = airavata.api.error.ttypes.AuthorizationException.read(iprot)
                else:
                    iprot.skip(ftype)
            else:
                iprot.skip(ftype)
            iprot.readFieldEnd()
        iprot.readStructEnd()

    def write(self, oprot):
        if oprot._fast_encode is 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)
all_structs.append(deleteJobSubmissionInterface_result)
deleteJobSubmissionInterface_result.thrift_spec = (
    (0, TType.BOOL, 'success', None, None, ),  # 0
    (1, TType.STRUCT, 'ire', [airavata.api.error.ttypes.InvalidRequestException, None], None, ),  # 1
    (2, TType.STRUCT, 'ace', [airavata.api.error.ttypes.AiravataClientException, None], None, ),  # 2
    (3, TType.STRUCT, 'ase', [airavata.api.error.ttypes.AiravataSystemException, None], None, ),  # 3
    (4, TType.STRUCT, 'ae', [airavata.api.error.ttypes.AuthorizationException, None], None, ),  # 4
)


class deleteDataMovementInterface_args(object):
    """
    Attributes:
     - authzToken
     - productUri
     - dataMovementInterfaceId
     - dataMoveType

    """


    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', errors='replace') 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', errors='replace') 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)
all_structs.append(deleteDataMovementInterface_args)
deleteDataMovementInterface_args.thrift_spec = (
    None,  # 0
    (1, TType.STRUCT, 'authzToken', [airavata.model.security.ttypes.AuthzToken, None], None, ),  # 1
    (2, TType.STRING, 'productUri', 'UTF8', None, ),  # 2
    (3, TType.STRING, 'dataMovementInterfaceId', 'UTF8', None, ),  # 3
    (4, TType.I32, 'dataMoveType', None, None, ),  # 4
)


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

    """


    def __init__(self, success=None, ire=None, ace=None, ase=None, ae=None,):
        self.success = success
        self.ire = ire
        self.ace = ace
        self.ase = ase
        self.ae = ae

    def read(self, iprot):
        if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None:
            iprot._fast_decode(self, iprot, [self.__class__, 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.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 2:
                if ftype == TType.STRUCT:
                    self.ace = airavata.api.error.ttypes.AiravataClientException.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 3:
                if ftype == TType.STRUCT:
                    self.ase = airavata.api.error.ttypes.AiravataSystemException.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 4:
                if ftype == TType.STRUCT:
                    self.ae = airavata.api.error.ttypes.AuthorizationException.read(iprot)
                else:
                    iprot.skip(ftype)
            else:
                iprot.skip(ftype)
            iprot.readFieldEnd()
        iprot.readStructEnd()

    def write(self, oprot):
        if oprot._fast_encode is 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)
all_structs.append(deleteDataMovementInterface_result)
deleteDataMovementInterface_result.thrift_spec = (
    (0, TType.BOOL, 'success', None, None, ),  # 0
    (1, TType.STRUCT, 'ire', [airavata.api.error.ttypes.InvalidRequestException, None], None, ),  # 1
    (2, TType.STRUCT, 'ace', [airavata.api.error.ttypes.AiravataClientException, None], None, ),  # 2
    (3, TType.STRUCT, 'ase', [airavata.api.error.ttypes.AiravataSystemException, None], None, ),  # 3
    (4, TType.STRUCT, 'ae', [airavata.api.error.ttypes.AuthorizationException, None], None, ),  # 4
)


class registerResourceJobManager_args(object):
    """
    Attributes:
     - authzToken
     - resourceJobManager

    """


    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)
all_structs.append(registerResourceJobManager_args)
registerResourceJobManager_args.thrift_spec = (
    None,  # 0
    (1, TType.STRUCT, 'authzToken', [airavata.model.security.ttypes.AuthzToken, None], None, ),  # 1
    (2, TType.STRUCT, 'resourceJobManager', [airavata.model.appcatalog.computeresource.ttypes.ResourceJobManager, None], None, ),  # 2
)


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

    """


    def __init__(self, success=None, ire=None, ace=None, ase=None, ae=None,):
        self.success = success
        self.ire = ire
        self.ace = ace
        self.ase = ase
        self.ae = ae

    def read(self, iprot):
        if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None:
            iprot._fast_decode(self, iprot, [self.__class__, 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', errors='replace') 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.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 2:
                if ftype == TType.STRUCT:
                    self.ace = airavata.api.error.ttypes.AiravataClientException.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 3:
                if ftype == TType.STRUCT:
                    self.ase = airavata.api.error.ttypes.AiravataSystemException.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 4:
                if ftype == TType.STRUCT:
                    self.ae = airavata.api.error.ttypes.AuthorizationException.read(iprot)
                else:
                    iprot.skip(ftype)
            else:
                iprot.skip(ftype)
            iprot.readFieldEnd()
        iprot.readStructEnd()

    def write(self, oprot):
        if oprot._fast_encode is 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)
all_structs.append(registerResourceJobManager_result)
registerResourceJobManager_result.thrift_spec = (
    (0, TType.STRING, 'success', 'UTF8', None, ),  # 0
    (1, TType.STRUCT, 'ire', [airavata.api.error.ttypes.InvalidRequestException, None], None, ),  # 1
    (2, TType.STRUCT, 'ace', [airavata.api.error.ttypes.AiravataClientException, None], None, ),  # 2
    (3, TType.STRUCT, 'ase', [airavata.api.error.ttypes.AiravataSystemException, None], None, ),  # 3
    (4, TType.STRUCT, 'ae', [airavata.api.error.ttypes.AuthorizationException, None], None, ),  # 4
)


class updateResourceJobManager_args(object):
    """
    Attributes:
     - authzToken
     - resourceJobManagerId
     - updatedResourceJobManager

    """


    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', errors='replace') 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)
all_structs.append(updateResourceJobManager_args)
updateResourceJobManager_args.thrift_spec = (
    None,  # 0
    (1, TType.STRUCT, 'authzToken', [airavata.model.security.ttypes.AuthzToken, None], None, ),  # 1
    (2, TType.STRING, 'resourceJobManagerId', 'UTF8', None, ),  # 2
    (3, TType.STRUCT, 'updatedResourceJobManager', [airavata.model.appcatalog.computeresource.ttypes.ResourceJobManager, None], None, ),  # 3
)


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

    """


    def __init__(self, success=None, ire=None, ace=None, ase=None, ae=None,):
        self.success = success
        self.ire = ire
        self.ace = ace
        self.ase = ase
        self.ae = ae

    def read(self, iprot):
        if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None:
            iprot._fast_decode(self, iprot, [self.__class__, 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.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 2:
                if ftype == TType.STRUCT:
                    self.ace = airavata.api.error.ttypes.AiravataClientException.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 3:
                if ftype == TType.STRUCT:
                    self.ase = airavata.api.error.ttypes.AiravataSystemException.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 4:
                if ftype == TType.STRUCT:
                    self.ae = airavata.api.error.ttypes.AuthorizationException.read(iprot)
                else:
                    iprot.skip(ftype)
            else:
                iprot.skip(ftype)
            iprot.readFieldEnd()
        iprot.readStructEnd()

    def write(self, oprot):
        if oprot._fast_encode is 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)
all_structs.append(updateResourceJobManager_result)
updateResourceJobManager_result.thrift_spec = (
    (0, TType.BOOL, 'success', None, None, ),  # 0
    (1, TType.STRUCT, 'ire', [airavata.api.error.ttypes.InvalidRequestException, None], None, ),  # 1
    (2, TType.STRUCT, 'ace', [airavata.api.error.ttypes.AiravataClientException, None], None, ),  # 2
    (3, TType.STRUCT, 'ase', [airavata.api.error.ttypes.AiravataSystemException, None], None, ),  # 3
    (4, TType.STRUCT, 'ae', [airavata.api.error.ttypes.AuthorizationException, None], None, ),  # 4
)


class getResourceJobManager_args(object):
    """
    Attributes:
     - authzToken
     - resourceJobManagerId

    """


    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', errors='replace') if sys.version_info[0] == 2 else iprot.readString()
                else:
                    iprot.skip(ftype)
            else:
                iprot.skip(ftype)
            iprot.readFieldEnd()
        iprot.readStructEnd()

    def write(self, oprot):
        if oprot._fast_encode is not None and self.thrift_spec is not None:
            oprot.trans.write(oprot._fast_encode(self, [self.__class__, self.thrift_spec]))
            return
        oprot.writeStructBegin('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)
all_structs.append(getResourceJobManager_args)
getResourceJobManager_args.thrift_spec = (
    None,  # 0
    (1, TType.STRUCT, 'authzToken', [airavata.model.security.ttypes.AuthzToken, None], None, ),  # 1
    (2, TType.STRING, 'resourceJobManagerId', 'UTF8', None, ),  # 2
)


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

    """


    def __init__(self, success=None, ire=None, ace=None, ase=None, ae=None,):
        self.success = success
        self.ire = ire
        self.ace = ace
        self.ase = ase
        self.ae = ae

    def read(self, iprot):
        if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None:
            iprot._fast_decode(self, iprot, [self.__class__, 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.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 2:
                if ftype == TType.STRUCT:
                    self.ace = airavata.api.error.ttypes.AiravataClientException.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 3:
                if ftype == TType.STRUCT:
                    self.ase = airavata.api.error.ttypes.AiravataSystemException.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 4:
                if ftype == TType.STRUCT:
                    self.ae = airavata.api.error.ttypes.AuthorizationException.read(iprot)
                else:
                    iprot.skip(ftype)
            else:
                iprot.skip(ftype)
            iprot.readFieldEnd()
        iprot.readStructEnd()

    def write(self, oprot):
        if oprot._fast_encode is 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)
all_structs.append(getResourceJobManager_result)
getResourceJobManager_result.thrift_spec = (
    (0, TType.STRUCT, 'success', [airavata.model.appcatalog.computeresource.ttypes.ResourceJobManager, None], None, ),  # 0
    (1, TType.STRUCT, 'ire', [airavata.api.error.ttypes.InvalidRequestException, None], None, ),  # 1
    (2, TType.STRUCT, 'ace', [airavata.api.error.ttypes.AiravataClientException, None], None, ),  # 2
    (3, TType.STRUCT, 'ase', [airavata.api.error.ttypes.AiravataSystemException, None], None, ),  # 3
    (4, TType.STRUCT, 'ae', [airavata.api.error.ttypes.AuthorizationException, None], None, ),  # 4
)


class deleteResourceJobManager_args(object):
    """
    Attributes:
     - authzToken
     - resourceJobManagerId

    """


    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', errors='replace') if sys.version_info[0] == 2 else iprot.readString()
                else:
                    iprot.skip(ftype)
            else:
                iprot.skip(ftype)
            iprot.readFieldEnd()
        iprot.readStructEnd()

    def write(self, oprot):
        if oprot._fast_encode is not None and self.thrift_spec is not None:
            oprot.trans.write(oprot._fast_encode(self, [self.__class__, self.thrift_spec]))
            return
        oprot.writeStructBegin('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)
all_structs.append(deleteResourceJobManager_args)
deleteResourceJobManager_args.thrift_spec = (
    None,  # 0
    (1, TType.STRUCT, 'authzToken', [airavata.model.security.ttypes.AuthzToken, None], None, ),  # 1
    (2, TType.STRING, 'resourceJobManagerId', 'UTF8', None, ),  # 2
)


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

    """


    def __init__(self, success=None, ire=None, ace=None, ase=None, ae=None,):
        self.success = success
        self.ire = ire
        self.ace = ace
        self.ase = ase
        self.ae = ae

    def read(self, iprot):
        if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None:
            iprot._fast_decode(self, iprot, [self.__class__, 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.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 2:
                if ftype == TType.STRUCT:
                    self.ace = airavata.api.error.ttypes.AiravataClientException.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 3:
                if ftype == TType.STRUCT:
                    self.ase = airavata.api.error.ttypes.AiravataSystemException.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 4:
                if ftype == TType.STRUCT:
                    self.ae = airavata.api.error.ttypes.AuthorizationException.read(iprot)
                else:
                    iprot.skip(ftype)
            else:
                iprot.skip(ftype)
            iprot.readFieldEnd()
        iprot.readStructEnd()

    def write(self, oprot):
        if oprot._fast_encode is 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)
all_structs.append(deleteResourceJobManager_result)
deleteResourceJobManager_result.thrift_spec = (
    (0, TType.BOOL, 'success', None, None, ),  # 0
    (1, TType.STRUCT, 'ire', [airavata.api.error.ttypes.InvalidRequestException, None], None, ),  # 1
    (2, TType.STRUCT, 'ace', [airavata.api.error.ttypes.AiravataClientException, None], None, ),  # 2
    (3, TType.STRUCT, 'ase', [airavata.api.error.ttypes.AiravataSystemException, None], None, ),  # 3
    (4, TType.STRUCT, 'ae', [airavata.api.error.ttypes.AuthorizationException, None], None, ),  # 4
)


class deleteBatchQueue_args(object):
    """
    Attributes:
     - authzToken
     - computeResourceId
     - queueName

    """


    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', errors='replace') 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', errors='replace') if sys.version_info[0] == 2 else iprot.readString()
                else:
                    iprot.skip(ftype)
            else:
                iprot.skip(ftype)
            iprot.readFieldEnd()
        iprot.readStructEnd()

    def write(self, oprot):
        if oprot._fast_encode is not None and self.thrift_spec is not None:
            oprot.trans.write(oprot._fast_encode(self, [self.__class__, self.thrift_spec]))
            return
        oprot.writeStructBegin('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)
all_structs.append(deleteBatchQueue_args)
deleteBatchQueue_args.thrift_spec = (
    None,  # 0
    (1, TType.STRUCT, 'authzToken', [airavata.model.security.ttypes.AuthzToken, None], None, ),  # 1
    (2, TType.STRING, 'computeResourceId', 'UTF8', None, ),  # 2
    (3, TType.STRING, 'queueName', 'UTF8', None, ),  # 3
)


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

    """


    def __init__(self, success=None, ire=None, ace=None, ase=None, ae=None,):
        self.success = success
        self.ire = ire
        self.ace = ace
        self.ase = ase
        self.ae = ae

    def read(self, iprot):
        if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None:
            iprot._fast_decode(self, iprot, [self.__class__, 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.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 2:
                if ftype == TType.STRUCT:
                    self.ace = airavata.api.error.ttypes.AiravataClientException.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 3:
                if ftype == TType.STRUCT:
                    self.ase = airavata.api.error.ttypes.AiravataSystemException.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 4:
                if ftype == TType.STRUCT:
                    self.ae = airavata.api.error.ttypes.AuthorizationException.read(iprot)
                else:
                    iprot.skip(ftype)
            else:
                iprot.skip(ftype)
            iprot.readFieldEnd()
        iprot.readStructEnd()

    def write(self, oprot):
        if oprot._fast_encode is 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)
all_structs.append(deleteBatchQueue_result)
deleteBatchQueue_result.thrift_spec = (
    (0, TType.BOOL, 'success', None, None, ),  # 0
    (1, TType.STRUCT, 'ire', [airavata.api.error.ttypes.InvalidRequestException, None], None, ),  # 1
    (2, TType.STRUCT, 'ace', [airavata.api.error.ttypes.AiravataClientException, None], None, ),  # 2
    (3, TType.STRUCT, 'ase', [airavata.api.error.ttypes.AiravataSystemException, None], None, ),  # 3
    (4, TType.STRUCT, 'ae', [airavata.api.error.ttypes.AuthorizationException, None], None, ),  # 4
)


class registerGatewayResourceProfile_args(object):
    """
    Attributes:
     - authzToken
     - gatewayResourceProfile

    """


    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)
all_structs.append(registerGatewayResourceProfile_args)
registerGatewayResourceProfile_args.thrift_spec = (
    None,  # 0
    (1, TType.STRUCT, 'authzToken', [airavata.model.security.ttypes.AuthzToken, None], None, ),  # 1
    (2, TType.STRUCT, 'gatewayResourceProfile', [airavata.model.appcatalog.gatewayprofile.ttypes.GatewayResourceProfile, None], None, ),  # 2
)


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

    """


    def __init__(self, success=None, ire=None, ace=None, ase=None, ae=None,):
        self.success = success
        self.ire = ire
        self.ace = ace
        self.ase = ase
        self.ae = ae

    def read(self, iprot):
        if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None:
            iprot._fast_decode(self, iprot, [self.__class__, 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', errors='replace') 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.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 2:
                if ftype == TType.STRUCT:
                    self.ace = airavata.api.error.ttypes.AiravataClientException.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 3:
                if ftype == TType.STRUCT:
                    self.ase = airavata.api.error.ttypes.AiravataSystemException.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 4:
                if ftype == TType.STRUCT:
                    self.ae = airavata.api.error.ttypes.AuthorizationException.read(iprot)
                else:
                    iprot.skip(ftype)
            else:
                iprot.skip(ftype)
            iprot.readFieldEnd()
        iprot.readStructEnd()

    def write(self, oprot):
        if oprot._fast_encode is 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)
all_structs.append(registerGatewayResourceProfile_result)
registerGatewayResourceProfile_result.thrift_spec = (
    (0, TType.STRING, 'success', 'UTF8', None, ),  # 0
    (1, TType.STRUCT, 'ire', [airavata.api.error.ttypes.InvalidRequestException, None], None, ),  # 1
    (2, TType.STRUCT, 'ace', [airavata.api.error.ttypes.AiravataClientException, None], None, ),  # 2
    (3, TType.STRUCT, 'ase', [airavata.api.error.ttypes.AiravataSystemException, None], None, ),  # 3
    (4, TType.STRUCT, 'ae', [airavata.api.error.ttypes.AuthorizationException, None], None, ),  # 4
)


class getGatewayResourceProfile_args(object):
    """
    Attributes:
     - authzToken
     - gatewayID

    """


    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', errors='replace') if sys.version_info[0] == 2 else iprot.readString()
                else:
                    iprot.skip(ftype)
            else:
                iprot.skip(ftype)
            iprot.readFieldEnd()
        iprot.readStructEnd()

    def write(self, oprot):
        if oprot._fast_encode is not None and self.thrift_spec is not None:
            oprot.trans.write(oprot._fast_encode(self, [self.__class__, self.thrift_spec]))
            return
        oprot.writeStructBegin('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)
all_structs.append(getGatewayResourceProfile_args)
getGatewayResourceProfile_args.thrift_spec = (
    None,  # 0
    (1, TType.STRUCT, 'authzToken', [airavata.model.security.ttypes.AuthzToken, None], None, ),  # 1
    (2, TType.STRING, 'gatewayID', 'UTF8', None, ),  # 2
)


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

    """


    def __init__(self, success=None, ire=None, ace=None, ase=None, ae=None,):
        self.success = success
        self.ire = ire
        self.ace = ace
        self.ase = ase
        self.ae = ae

    def read(self, iprot):
        if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None:
            iprot._fast_decode(self, iprot, [self.__class__, 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.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 2:
                if ftype == TType.STRUCT:
                    self.ace = airavata.api.error.ttypes.AiravataClientException.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 3:
                if ftype == TType.STRUCT:
                    self.ase = airavata.api.error.ttypes.AiravataSystemException.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 4:
                if ftype == TType.STRUCT:
                    self.ae = airavata.api.error.ttypes.AuthorizationException.read(iprot)
                else:
                    iprot.skip(ftype)
            else:
                iprot.skip(ftype)
            iprot.readFieldEnd()
        iprot.readStructEnd()

    def write(self, oprot):
        if oprot._fast_encode is 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)
all_structs.append(getGatewayResourceProfile_result)
getGatewayResourceProfile_result.thrift_spec = (
    (0, TType.STRUCT, 'success', [airavata.model.appcatalog.gatewayprofile.ttypes.GatewayResourceProfile, None], None, ),  # 0
    (1, TType.STRUCT, 'ire', [airavata.api.error.ttypes.InvalidRequestException, None], None, ),  # 1
    (2, TType.STRUCT, 'ace', [airavata.api.error.ttypes.AiravataClientException, None], None, ),  # 2
    (3, TType.STRUCT, 'ase', [airavata.api.error.ttypes.AiravataSystemException, None], None, ),  # 3
    (4, TType.STRUCT, 'ae', [airavata.api.error.ttypes.AuthorizationException, None], None, ),  # 4
)


class updateGatewayResourceProfile_args(object):
    """
    Attributes:
     - authzToken
     - gatewayID
     - gatewayResourceProfile

    """


    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', errors='replace') 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)
all_structs.append(updateGatewayResourceProfile_args)
updateGatewayResourceProfile_args.thrift_spec = (
    None,  # 0
    (1, TType.STRUCT, 'authzToken', [airavata.model.security.ttypes.AuthzToken, None], None, ),  # 1
    (2, TType.STRING, 'gatewayID', 'UTF8', None, ),  # 2
    (3, TType.STRUCT, 'gatewayResourceProfile', [airavata.model.appcatalog.gatewayprofile.ttypes.GatewayResourceProfile, None], None, ),  # 3
)


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

    """


    def __init__(self, success=None, ire=None, ace=None, ase=None, ae=None,):
        self.success = success
        self.ire = ire
        self.ace = ace
        self.ase = ase
        self.ae = ae

    def read(self, iprot):
        if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None:
            iprot._fast_decode(self, iprot, [self.__class__, 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.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 2:
                if ftype == TType.STRUCT:
                    self.ace = airavata.api.error.ttypes.AiravataClientException.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 3:
                if ftype == TType.STRUCT:
                    self.ase = airavata.api.error.ttypes.AiravataSystemException.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 4:
                if ftype == TType.STRUCT:
                    self.ae = airavata.api.error.ttypes.AuthorizationException.read(iprot)
                else:
                    iprot.skip(ftype)
            else:
                iprot.skip(ftype)
            iprot.readFieldEnd()
        iprot.readStructEnd()

    def write(self, oprot):
        if oprot._fast_encode is 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)
all_structs.append(updateGatewayResourceProfile_result)
updateGatewayResourceProfile_result.thrift_spec = (
    (0, TType.BOOL, 'success', None, None, ),  # 0
    (1, TType.STRUCT, 'ire', [airavata.api.error.ttypes.InvalidRequestException, None], None, ),  # 1
    (2, TType.STRUCT, 'ace', [airavata.api.error.ttypes.AiravataClientException, None], None, ),  # 2
    (3, TType.STRUCT, 'ase', [airavata.api.error.ttypes.AiravataSystemException, None], None, ),  # 3
    (4, TType.STRUCT, 'ae', [airavata.api.error.ttypes.AuthorizationException, None], None, ),  # 4
)


class deleteGatewayResourceProfile_args(object):
    """
    Attributes:
     - authzToken
     - gatewayID

    """


    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', errors='replace') if sys.version_info[0] == 2 else iprot.readString()
                else:
                    iprot.skip(ftype)
            else:
                iprot.skip(ftype)
            iprot.readFieldEnd()
        iprot.readStructEnd()

    def write(self, oprot):
        if oprot._fast_encode is not None and self.thrift_spec is not None:
            oprot.trans.write(oprot._fast_encode(self, [self.__class__, self.thrift_spec]))
            return
        oprot.writeStructBegin('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)
all_structs.append(deleteGatewayResourceProfile_args)
deleteGatewayResourceProfile_args.thrift_spec = (
    None,  # 0
    (1, TType.STRUCT, 'authzToken', [airavata.model.security.ttypes.AuthzToken, None], None, ),  # 1
    (2, TType.STRING, 'gatewayID', 'UTF8', None, ),  # 2
)


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

    """


    def __init__(self, success=None, ire=None, ace=None, ase=None, ae=None,):
        self.success = success
        self.ire = ire
        self.ace = ace
        self.ase = ase
        self.ae = ae

    def read(self, iprot):
        if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None:
            iprot._fast_decode(self, iprot, [self.__class__, 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.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 2:
                if ftype == TType.STRUCT:
                    self.ace = airavata.api.error.ttypes.AiravataClientException.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 3:
                if ftype == TType.STRUCT:
                    self.ase = airavata.api.error.ttypes.AiravataSystemException.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 4:
                if ftype == TType.STRUCT:
                    self.ae = airavata.api.error.ttypes.AuthorizationException.read(iprot)
                else:
                    iprot.skip(ftype)
            else:
                iprot.skip(ftype)
            iprot.readFieldEnd()
        iprot.readStructEnd()

    def write(self, oprot):
        if oprot._fast_encode is 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)
all_structs.append(deleteGatewayResourceProfile_result)
deleteGatewayResourceProfile_result.thrift_spec = (
    (0, TType.BOOL, 'success', None, None, ),  # 0
    (1, TType.STRUCT, 'ire', [airavata.api.error.ttypes.InvalidRequestException, None], None, ),  # 1
    (2, TType.STRUCT, 'ace', [airavata.api.error.ttypes.AiravataClientException, None], None, ),  # 2
    (3, TType.STRUCT, 'ase', [airavata.api.error.ttypes.AiravataSystemException, None], None, ),  # 3
    (4, TType.STRUCT, 'ae', [airavata.api.error.ttypes.AuthorizationException, None], None, ),  # 4
)


class addGatewayComputeResourcePreference_args(object):
    """
    Attributes:
     - authzToken
     - gatewayID
     - computeResourceId
     - computeResourcePreference

    """


    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', errors='replace') 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', errors='replace') 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)
all_structs.append(addGatewayComputeResourcePreference_args)
addGatewayComputeResourcePreference_args.thrift_spec = (
    None,  # 0
    (1, TType.STRUCT, 'authzToken', [airavata.model.security.ttypes.AuthzToken, None], 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, None], None, ),  # 4
)


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

    """


    def __init__(self, success=None, ire=None, ace=None, ase=None, ae=None,):
        self.success = success
        self.ire = ire
        self.ace = ace
        self.ase = ase
        self.ae = ae

    def read(self, iprot):
        if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None:
            iprot._fast_decode(self, iprot, [self.__class__, 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.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 2:
                if ftype == TType.STRUCT:
                    self.ace = airavata.api.error.ttypes.AiravataClientException.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 3:
                if ftype == TType.STRUCT:
                    self.ase = airavata.api.error.ttypes.AiravataSystemException.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 4:
                if ftype == TType.STRUCT:
                    self.ae = airavata.api.error.ttypes.AuthorizationException.read(iprot)
                else:
                    iprot.skip(ftype)
            else:
                iprot.skip(ftype)
            iprot.readFieldEnd()
        iprot.readStructEnd()

    def write(self, oprot):
        if oprot._fast_encode is 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)
all_structs.append(addGatewayComputeResourcePreference_result)
addGatewayComputeResourcePreference_result.thrift_spec = (
    (0, TType.BOOL, 'success', None, None, ),  # 0
    (1, TType.STRUCT, 'ire', [airavata.api.error.ttypes.InvalidRequestException, None], None, ),  # 1
    (2, TType.STRUCT, 'ace', [airavata.api.error.ttypes.AiravataClientException, None], None, ),  # 2
    (3, TType.STRUCT, 'ase', [airavata.api.error.ttypes.AiravataSystemException, None], None, ),  # 3
    (4, TType.STRUCT, 'ae', [airavata.api.error.ttypes.AuthorizationException, None], None, ),  # 4
)


class addGatewayStoragePreference_args(object):
    """
    Attributes:
     - authzToken
     - gatewayID
     - storageResourceId
     - storagePreference

    """


    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', errors='replace') 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', errors='replace') 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)
all_structs.append(addGatewayStoragePreference_args)
addGatewayStoragePreference_args.thrift_spec = (
    None,  # 0
    (1, TType.STRUCT, 'authzToken', [airavata.model.security.ttypes.AuthzToken, None], 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, None], None, ),  # 4
)


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

    """


    def __init__(self, success=None, ire=None, ace=None, ase=None, ae=None,):
        self.success = success
        self.ire = ire
        self.ace = ace
        self.ase = ase
        self.ae = ae

    def read(self, iprot):
        if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None:
            iprot._fast_decode(self, iprot, [self.__class__, 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.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 2:
                if ftype == TType.STRUCT:
                    self.ace = airavata.api.error.ttypes.AiravataClientException.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 3:
                if ftype == TType.STRUCT:
                    self.ase = airavata.api.error.ttypes.AiravataSystemException.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 4:
                if ftype == TType.STRUCT:
                    self.ae = airavata.api.error.ttypes.AuthorizationException.read(iprot)
                else:
                    iprot.skip(ftype)
            else:
                iprot.skip(ftype)
            iprot.readFieldEnd()
        iprot.readStructEnd()

    def write(self, oprot):
        if oprot._fast_encode is 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)
all_structs.append(addGatewayStoragePreference_result)
addGatewayStoragePreference_result.thrift_spec = (
    (0, TType.BOOL, 'success', None, None, ),  # 0
    (1, TType.STRUCT, 'ire', [airavata.api.error.ttypes.InvalidRequestException, None], None, ),  # 1
    (2, TType.STRUCT, 'ace', [airavata.api.error.ttypes.AiravataClientException, None], None, ),  # 2
    (3, TType.STRUCT, 'ase', [airavata.api.error.ttypes.AiravataSystemException, None], None, ),  # 3
    (4, TType.STRUCT, 'ae', [airavata.api.error.ttypes.AuthorizationException, None], None, ),  # 4
)


class getGatewayComputeResourcePreference_args(object):
    """
    Attributes:
     - authzToken
     - gatewayID
     - computeResourceId

    """


    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', errors='replace') 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', errors='replace') if sys.version_info[0] == 2 else iprot.readString()
                else:
                    iprot.skip(ftype)
            else:
                iprot.skip(ftype)
            iprot.readFieldEnd()
        iprot.readStructEnd()

    def write(self, oprot):
        if oprot._fast_encode is not None and self.thrift_spec is not None:
            oprot.trans.write(oprot._fast_encode(self, [self.__class__, self.thrift_spec]))
            return
        oprot.writeStructBegin('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)
all_structs.append(getGatewayComputeResourcePreference_args)
getGatewayComputeResourcePreference_args.thrift_spec = (
    None,  # 0
    (1, TType.STRUCT, 'authzToken', [airavata.model.security.ttypes.AuthzToken, None], None, ),  # 1
    (2, TType.STRING, 'gatewayID', 'UTF8', None, ),  # 2
    (3, TType.STRING, 'computeResourceId', 'UTF8', None, ),  # 3
)


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

    """


    def __init__(self, success=None, ire=None, ace=None, ase=None, ae=None,):
        self.success = success
        self.ire = ire
        self.ace = ace
        self.ase = ase
        self.ae = ae

    def read(self, iprot):
        if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None:
            iprot._fast_decode(self, iprot, [self.__class__, 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.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 2:
                if ftype == TType.STRUCT:
                    self.ace = airavata.api.error.ttypes.AiravataClientException.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 3:
                if ftype == TType.STRUCT:
                    self.ase = airavata.api.error.ttypes.AiravataSystemException.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 4:
                if ftype == TType.STRUCT:
                    self.ae = airavata.api.error.ttypes.AuthorizationException.read(iprot)
                else:
                    iprot.skip(ftype)
            else:
                iprot.skip(ftype)
            iprot.readFieldEnd()
        iprot.readStructEnd()

    def write(self, oprot):
        if oprot._fast_encode is 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)
all_structs.append(getGatewayComputeResourcePreference_result)
getGatewayComputeResourcePreference_result.thrift_spec = (
    (0, TType.STRUCT, 'success', [airavata.model.appcatalog.gatewayprofile.ttypes.ComputeResourcePreference, None], None, ),  # 0
    (1, TType.STRUCT, 'ire', [airavata.api.error.ttypes.InvalidRequestException, None], None, ),  # 1
    (2, TType.STRUCT, 'ace', [airavata.api.error.ttypes.AiravataClientException, None], None, ),  # 2
    (3, TType.STRUCT, 'ase', [airavata.api.error.ttypes.AiravataSystemException, None], None, ),  # 3
    (4, TType.STRUCT, 'ae', [airavata.api.error.ttypes.AuthorizationException, None], None, ),  # 4
)


class getGatewayStoragePreference_args(object):
    """
    Attributes:
     - authzToken
     - gatewayID
     - storageResourceId

    """


    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', errors='replace') 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', errors='replace') if sys.version_info[0] == 2 else iprot.readString()
                else:
                    iprot.skip(ftype)
            else:
                iprot.skip(ftype)
            iprot.readFieldEnd()
        iprot.readStructEnd()

    def write(self, oprot):
        if oprot._fast_encode is not None and self.thrift_spec is not None:
            oprot.trans.write(oprot._fast_encode(self, [self.__class__, self.thrift_spec]))
            return
        oprot.writeStructBegin('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)
all_structs.append(getGatewayStoragePreference_args)
getGatewayStoragePreference_args.thrift_spec = (
    None,  # 0
    (1, TType.STRUCT, 'authzToken', [airavata.model.security.ttypes.AuthzToken, None], None, ),  # 1
    (2, TType.STRING, 'gatewayID', 'UTF8', None, ),  # 2
    (3, TType.STRING, 'storageResourceId', 'UTF8', None, ),  # 3
)


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

    """


    def __init__(self, success=None, ire=None, ace=None, ase=None, ae=None,):
        self.success = success
        self.ire = ire
        self.ace = ace
        self.ase = ase
        self.ae = ae

    def read(self, iprot):
        if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None:
            iprot._fast_decode(self, iprot, [self.__class__, 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.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 2:
                if ftype == TType.STRUCT:
                    self.ace = airavata.api.error.ttypes.AiravataClientException.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 3:
                if ftype == TType.STRUCT:
                    self.ase = airavata.api.error.ttypes.AiravataSystemException.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 4:
                if ftype == TType.STRUCT:
                    self.ae = airavata.api.error.ttypes.AuthorizationException.read(iprot)
                else:
                    iprot.skip(ftype)
            else:
                iprot.skip(ftype)
            iprot.readFieldEnd()
        iprot.readStructEnd()

    def write(self, oprot):
        if oprot._fast_encode is 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)
all_structs.append(getGatewayStoragePreference_result)
getGatewayStoragePreference_result.thrift_spec = (
    (0, TType.STRUCT, 'success', [airavata.model.appcatalog.gatewayprofile.ttypes.StoragePreference, None], None, ),  # 0
    (1, TType.STRUCT, 'ire', [airavata.api.error.ttypes.InvalidRequestException, None], None, ),  # 1
    (2, TType.STRUCT, 'ace', [airavata.api.error.ttypes.AiravataClientException, None], None, ),  # 2
    (3, TType.STRUCT, 'ase', [airavata.api.error.ttypes.AiravataSystemException, None], None, ),  # 3
    (4, TType.STRUCT, 'ae', [airavata.api.error.ttypes.AuthorizationException, None], None, ),  # 4
)


class getAllGatewayComputeResourcePreferences_args(object):
    """
    Attributes:
     - authzToken
     - gatewayID

    """


    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', errors='replace') if sys.version_info[0] == 2 else iprot.readString()
                else:
                    iprot.skip(ftype)
            else:
                iprot.skip(ftype)
            iprot.readFieldEnd()
        iprot.readStructEnd()

    def write(self, oprot):
        if oprot._fast_encode is not None and self.thrift_spec is not None:
            oprot.trans.write(oprot._fast_encode(self, [self.__class__, self.thrift_spec]))
            return
        oprot.writeStructBegin('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)
all_structs.append(getAllGatewayComputeResourcePreferences_args)
getAllGatewayComputeResourcePreferences_args.thrift_spec = (
    None,  # 0
    (1, TType.STRUCT, 'authzToken', [airavata.model.security.ttypes.AuthzToken, None], None, ),  # 1
    (2, TType.STRING, 'gatewayID', 'UTF8', None, ),  # 2
)


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

    """


    def __init__(self, success=None, ire=None, ace=None, ase=None, ae=None,):
        self.success = success
        self.ire = ire
        self.ace = ace
        self.ase = ase
        self.ae = ae

    def read(self, iprot):
        if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None:
            iprot._fast_decode(self, iprot, [self.__class__, 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.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 2:
                if ftype == TType.STRUCT:
                    self.ace = airavata.api.error.ttypes.AiravataClientException.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 3:
                if ftype == TType.STRUCT:
                    self.ase = airavata.api.error.ttypes.AiravataSystemException.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 4:
                if ftype == TType.STRUCT:
                    self.ae = airavata.api.error.ttypes.AuthorizationException.read(iprot)
                else:
                    iprot.skip(ftype)
            else:
                iprot.skip(ftype)
            iprot.readFieldEnd()
        iprot.readStructEnd()

    def write(self, oprot):
        if oprot._fast_encode is 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)
all_structs.append(getAllGatewayComputeResourcePreferences_result)
getAllGatewayComputeResourcePreferences_result.thrift_spec = (
    (0, TType.LIST, 'success', (TType.STRUCT, [airavata.model.appcatalog.gatewayprofile.ttypes.ComputeResourcePreference, None], False), None, ),  # 0
    (1, TType.STRUCT, 'ire', [airavata.api.error.ttypes.InvalidRequestException, None], None, ),  # 1
    (2, TType.STRUCT, 'ace', [airavata.api.error.ttypes.AiravataClientException, None], None, ),  # 2
    (3, TType.STRUCT, 'ase', [airavata.api.error.ttypes.AiravataSystemException, None], None, ),  # 3
    (4, TType.STRUCT, 'ae', [airavata.api.error.ttypes.AuthorizationException, None], None, ),  # 4
)


class getAllGatewayStoragePreferences_args(object):
    """
    Attributes:
     - authzToken
     - gatewayID

    """


    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', errors='replace') if sys.version_info[0] == 2 else iprot.readString()
                else:
                    iprot.skip(ftype)
            else:
                iprot.skip(ftype)
            iprot.readFieldEnd()
        iprot.readStructEnd()

    def write(self, oprot):
        if oprot._fast_encode is not None and self.thrift_spec is not None:
            oprot.trans.write(oprot._fast_encode(self, [self.__class__, self.thrift_spec]))
            return
        oprot.writeStructBegin('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)
all_structs.append(getAllGatewayStoragePreferences_args)
getAllGatewayStoragePreferences_args.thrift_spec = (
    None,  # 0
    (1, TType.STRUCT, 'authzToken', [airavata.model.security.ttypes.AuthzToken, None], None, ),  # 1
    (2, TType.STRING, 'gatewayID', 'UTF8', None, ),  # 2
)


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

    """


    def __init__(self, success=None, ire=None, ace=None, ase=None, ae=None,):
        self.success = success
        self.ire = ire
        self.ace = ace
        self.ase = ase
        self.ae = ae

    def read(self, iprot):
        if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None:
            iprot._fast_decode(self, iprot, [self.__class__, 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.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 2:
                if ftype == TType.STRUCT:
                    self.ace = airavata.api.error.ttypes.AiravataClientException.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 3:
                if ftype == TType.STRUCT:
                    self.ase = airavata.api.error.ttypes.AiravataSystemException.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 4:
                if ftype == TType.STRUCT:
                    self.ae = airavata.api.error.ttypes.AuthorizationException.read(iprot)
                else:
                    iprot.skip(ftype)
            else:
                iprot.skip(ftype)
            iprot.readFieldEnd()
        iprot.readStructEnd()

    def write(self, oprot):
        if oprot._fast_encode is 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)
all_structs.append(getAllGatewayStoragePreferences_result)
getAllGatewayStoragePreferences_result.thrift_spec = (
    (0, TType.LIST, 'success', (TType.STRUCT, [airavata.model.appcatalog.gatewayprofile.ttypes.StoragePreference, None], False), None, ),  # 0
    (1, TType.STRUCT, 'ire', [airavata.api.error.ttypes.InvalidRequestException, None], None, ),  # 1
    (2, TType.STRUCT, 'ace', [airavata.api.error.ttypes.AiravataClientException, None], None, ),  # 2
    (3, TType.STRUCT, 'ase', [airavata.api.error.ttypes.AiravataSystemException, None], None, ),  # 3
    (4, TType.STRUCT, 'ae', [airavata.api.error.ttypes.AuthorizationException, None], None, ),  # 4
)


class getAllGatewayResourceProfiles_args(object):
    """
    Attributes:
     - authzToken

    """


    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)
all_structs.append(getAllGatewayResourceProfiles_args)
getAllGatewayResourceProfiles_args.thrift_spec = (
    None,  # 0
    (1, TType.STRUCT, 'authzToken', [airavata.model.security.ttypes.AuthzToken, None], None, ),  # 1
)


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

    """


    def __init__(self, success=None, ire=None, ace=None, ase=None, ae=None,):
        self.success = success
        self.ire = ire
        self.ace = ace
        self.ase = ase
        self.ae = ae

    def read(self, iprot):
        if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None:
            iprot._fast_decode(self, iprot, [self.__class__, 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.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 2:
                if ftype == TType.STRUCT:
                    self.ace = airavata.api.error.ttypes.AiravataClientException.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 3:
                if ftype == TType.STRUCT:
                    self.ase = airavata.api.error.ttypes.AiravataSystemException.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 4:
                if ftype == TType.STRUCT:
                    self.ae = airavata.api.error.ttypes.AuthorizationException.read(iprot)
                else:
                    iprot.skip(ftype)
            else:
                iprot.skip(ftype)
            iprot.readFieldEnd()
        iprot.readStructEnd()

    def write(self, oprot):
        if oprot._fast_encode is 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)
all_structs.append(getAllGatewayResourceProfiles_result)
getAllGatewayResourceProfiles_result.thrift_spec = (
    (0, TType.LIST, 'success', (TType.STRUCT, [airavata.model.appcatalog.gatewayprofile.ttypes.GatewayResourceProfile, None], False), None, ),  # 0
    (1, TType.STRUCT, 'ire', [airavata.api.error.ttypes.InvalidRequestException, None], None, ),  # 1
    (2, TType.STRUCT, 'ace', [airavata.api.error.ttypes.AiravataClientException, None], None, ),  # 2
    (3, TType.STRUCT, 'ase', [airavata.api.error.ttypes.AiravataSystemException, None], None, ),  # 3
    (4, TType.STRUCT, 'ae', [airavata.api.error.ttypes.AuthorizationException, None], None, ),  # 4
)


class updateGatewayComputeResourcePreference_args(object):
    """
    Attributes:
     - authzToken
     - gatewayID
     - computeResourceId
     - computeResourcePreference

    """


    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', errors='replace') 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', errors='replace') 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)
all_structs.append(updateGatewayComputeResourcePreference_args)
updateGatewayComputeResourcePreference_args.thrift_spec = (
    None,  # 0
    (1, TType.STRUCT, 'authzToken', [airavata.model.security.ttypes.AuthzToken, None], 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, None], None, ),  # 4
)


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

    """


    def __init__(self, success=None, ire=None, ace=None, ase=None, ae=None,):
        self.success = success
        self.ire = ire
        self.ace = ace
        self.ase = ase
        self.ae = ae

    def read(self, iprot):
        if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None:
            iprot._fast_decode(self, iprot, [self.__class__, 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.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 2:
                if ftype == TType.STRUCT:
                    self.ace = airavata.api.error.ttypes.AiravataClientException.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 3:
                if ftype == TType.STRUCT:
                    self.ase = airavata.api.error.ttypes.AiravataSystemException.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 4:
                if ftype == TType.STRUCT:
                    self.ae = airavata.api.error.ttypes.AuthorizationException.read(iprot)
                else:
                    iprot.skip(ftype)
            else:
                iprot.skip(ftype)
            iprot.readFieldEnd()
        iprot.readStructEnd()

    def write(self, oprot):
        if oprot._fast_encode is 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)
all_structs.append(updateGatewayComputeResourcePreference_result)
updateGatewayComputeResourcePreference_result.thrift_spec = (
    (0, TType.BOOL, 'success', None, None, ),  # 0
    (1, TType.STRUCT, 'ire', [airavata.api.error.ttypes.InvalidRequestException, None], None, ),  # 1
    (2, TType.STRUCT, 'ace', [airavata.api.error.ttypes.AiravataClientException, None], None, ),  # 2
    (3, TType.STRUCT, 'ase', [airavata.api.error.ttypes.AiravataSystemException, None], None, ),  # 3
    (4, TType.STRUCT, 'ae', [airavata.api.error.ttypes.AuthorizationException, None], None, ),  # 4
)


class updateGatewayStoragePreference_args(object):
    """
    Attributes:
     - authzToken
     - gatewayID
     - storageId
     - storagePreference

    """


    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', errors='replace') 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', errors='replace') 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)
all_structs.append(updateGatewayStoragePreference_args)
updateGatewayStoragePreference_args.thrift_spec = (
    None,  # 0
    (1, TType.STRUCT, 'authzToken', [airavata.model.security.ttypes.AuthzToken, None], 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, None], None, ),  # 4
)


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

    """


    def __init__(self, success=None, ire=None, ace=None, ase=None, ae=None,):
        self.success = success
        self.ire = ire
        self.ace = ace
        self.ase = ase
        self.ae = ae

    def read(self, iprot):
        if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None:
            iprot._fast_decode(self, iprot, [self.__class__, 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.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 2:
                if ftype == TType.STRUCT:
                    self.ace = airavata.api.error.ttypes.AiravataClientException.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 3:
                if ftype == TType.STRUCT:
                    self.ase = airavata.api.error.ttypes.AiravataSystemException.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 4:
                if ftype == TType.STRUCT:
                    self.ae = airavata.api.error.ttypes.AuthorizationException.read(iprot)
                else:
                    iprot.skip(ftype)
            else:
                iprot.skip(ftype)
            iprot.readFieldEnd()
        iprot.readStructEnd()

    def write(self, oprot):
        if oprot._fast_encode is 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)
all_structs.append(updateGatewayStoragePreference_result)
updateGatewayStoragePreference_result.thrift_spec = (
    (0, TType.BOOL, 'success', None, None, ),  # 0
    (1, TType.STRUCT, 'ire', [airavata.api.error.ttypes.InvalidRequestException, None], None, ),  # 1
    (2, TType.STRUCT, 'ace', [airavata.api.error.ttypes.AiravataClientException, None], None, ),  # 2
    (3, TType.STRUCT, 'ase', [airavata.api.error.ttypes.AiravataSystemException, None], None, ),  # 3
    (4, TType.STRUCT, 'ae', [airavata.api.error.ttypes.AuthorizationException, None], None, ),  # 4
)


class deleteGatewayComputeResourcePreference_args(object):
    """
    Attributes:
     - authzToken
     - gatewayID
     - computeResourceId

    """


    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', errors='replace') 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', errors='replace') if sys.version_info[0] == 2 else iprot.readString()
                else:
                    iprot.skip(ftype)
            else:
                iprot.skip(ftype)
            iprot.readFieldEnd()
        iprot.readStructEnd()

    def write(self, oprot):
        if oprot._fast_encode is not None and self.thrift_spec is not None:
            oprot.trans.write(oprot._fast_encode(self, [self.__class__, self.thrift_spec]))
            return
        oprot.writeStructBegin('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)
all_structs.append(deleteGatewayComputeResourcePreference_args)
deleteGatewayComputeResourcePreference_args.thrift_spec = (
    None,  # 0
    (1, TType.STRUCT, 'authzToken', [airavata.model.security.ttypes.AuthzToken, None], None, ),  # 1
    (2, TType.STRING, 'gatewayID', 'UTF8', None, ),  # 2
    (3, TType.STRING, 'computeResourceId', 'UTF8', None, ),  # 3
)


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

    """


    def __init__(self, success=None, ire=None, ace=None, ase=None, ae=None,):
        self.success = success
        self.ire = ire
        self.ace = ace
        self.ase = ase
        self.ae = ae

    def read(self, iprot):
        if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None:
            iprot._fast_decode(self, iprot, [self.__class__, 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.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 2:
                if ftype == TType.STRUCT:
                    self.ace = airavata.api.error.ttypes.AiravataClientException.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 3:
                if ftype == TType.STRUCT:
                    self.ase = airavata.api.error.ttypes.AiravataSystemException.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 4:
                if ftype == TType.STRUCT:
                    self.ae = airavata.api.error.ttypes.AuthorizationException.read(iprot)
                else:
                    iprot.skip(ftype)
            else:
                iprot.skip(ftype)
            iprot.readFieldEnd()
        iprot.readStructEnd()

    def write(self, oprot):
        if oprot._fast_encode is 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)
all_structs.append(deleteGatewayComputeResourcePreference_result)
deleteGatewayComputeResourcePreference_result.thrift_spec = (
    (0, TType.BOOL, 'success', None, None, ),  # 0
    (1, TType.STRUCT, 'ire', [airavata.api.error.ttypes.InvalidRequestException, None], None, ),  # 1
    (2, TType.STRUCT, 'ace', [airavata.api.error.ttypes.AiravataClientException, None], None, ),  # 2
    (3, TType.STRUCT, 'ase', [airavata.api.error.ttypes.AiravataSystemException, None], None, ),  # 3
    (4, TType.STRUCT, 'ae', [airavata.api.error.ttypes.AuthorizationException, None], None, ),  # 4
)


class deleteGatewayStoragePreference_args(object):
    """
    Attributes:
     - authzToken
     - gatewayID
     - storageId

    """


    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', errors='replace') 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', errors='replace') if sys.version_info[0] == 2 else iprot.readString()
                else:
                    iprot.skip(ftype)
            else:
                iprot.skip(ftype)
            iprot.readFieldEnd()
        iprot.readStructEnd()

    def write(self, oprot):
        if oprot._fast_encode is not None and self.thrift_spec is not None:
            oprot.trans.write(oprot._fast_encode(self, [self.__class__, self.thrift_spec]))
            return
        oprot.writeStructBegin('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)
all_structs.append(deleteGatewayStoragePreference_args)
deleteGatewayStoragePreference_args.thrift_spec = (
    None,  # 0
    (1, TType.STRUCT, 'authzToken', [airavata.model.security.ttypes.AuthzToken, None], None, ),  # 1
    (2, TType.STRING, 'gatewayID', 'UTF8', None, ),  # 2
    (3, TType.STRING, 'storageId', 'UTF8', None, ),  # 3
)


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

    """


    def __init__(self, success=None, ire=None, ace=None, ase=None, ae=None,):
        self.success = success
        self.ire = ire
        self.ace = ace
        self.ase = ase
        self.ae = ae

    def read(self, iprot):
        if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None:
            iprot._fast_decode(self, iprot, [self.__class__, 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.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 2:
                if ftype == TType.STRUCT:
                    self.ace = airavata.api.error.ttypes.AiravataClientException.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 3:
                if ftype == TType.STRUCT:
                    self.ase = airavata.api.error.ttypes.AiravataSystemException.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 4:
                if ftype == TType.STRUCT:
                    self.ae = airavata.api.error.ttypes.AuthorizationException.read(iprot)
                else:
                    iprot.skip(ftype)
            else:
                iprot.skip(ftype)
            iprot.readFieldEnd()
        iprot.readStructEnd()

    def write(self, oprot):
        if oprot._fast_encode is 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)
all_structs.append(deleteGatewayStoragePreference_result)
deleteGatewayStoragePreference_result.thrift_spec = (
    (0, TType.BOOL, 'success', None, None, ),  # 0
    (1, TType.STRUCT, 'ire', [airavata.api.error.ttypes.InvalidRequestException, None], None, ),  # 1
    (2, TType.STRUCT, 'ace', [airavata.api.error.ttypes.AiravataClientException, None], None, ),  # 2
    (3, TType.STRUCT, 'ase', [airavata.api.error.ttypes.AiravataSystemException, None], None, ),  # 3
    (4, TType.STRUCT, 'ae', [airavata.api.error.ttypes.AuthorizationException, None], None, ),  # 4
)


class getSSHAccountProvisioners_args(object):
    """
    Attributes:
     - authzToken

    """


    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)
all_structs.append(getSSHAccountProvisioners_args)
getSSHAccountProvisioners_args.thrift_spec = (
    None,  # 0
    (1, TType.STRUCT, 'authzToken', [airavata.model.security.ttypes.AuthzToken, None], None, ),  # 1
)


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

    """


    def __init__(self, success=None, ire=None, ace=None, ase=None, ae=None,):
        self.success = success
        self.ire = ire
        self.ace = ace
        self.ase = ase
        self.ae = ae

    def read(self, iprot):
        if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None:
            iprot._fast_decode(self, iprot, [self.__class__, 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.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 2:
                if ftype == TType.STRUCT:
                    self.ace = airavata.api.error.ttypes.AiravataClientException.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 3:
                if ftype == TType.STRUCT:
                    self.ase = airavata.api.error.ttypes.AiravataSystemException.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 4:
                if ftype == TType.STRUCT:
                    self.ae = airavata.api.error.ttypes.AuthorizationException.read(iprot)
                else:
                    iprot.skip(ftype)
            else:
                iprot.skip(ftype)
            iprot.readFieldEnd()
        iprot.readStructEnd()

    def write(self, oprot):
        if oprot._fast_encode is 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)
all_structs.append(getSSHAccountProvisioners_result)
getSSHAccountProvisioners_result.thrift_spec = (
    (0, TType.LIST, 'success', (TType.STRUCT, [airavata.model.appcatalog.accountprovisioning.ttypes.SSHAccountProvisioner, None], False), None, ),  # 0
    (1, TType.STRUCT, 'ire', [airavata.api.error.ttypes.InvalidRequestException, None], None, ),  # 1
    (2, TType.STRUCT, 'ace', [airavata.api.error.ttypes.AiravataClientException, None], None, ),  # 2
    (3, TType.STRUCT, 'ase', [airavata.api.error.ttypes.AiravataSystemException, None], None, ),  # 3
    (4, TType.STRUCT, 'ae', [airavata.api.error.ttypes.AuthorizationException, None], None, ),  # 4
)


class doesUserHaveSSHAccount_args(object):
    """
    Attributes:
     - authzToken
     - computeResourceId
     - userId

    """


    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', errors='replace') 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', errors='replace') if sys.version_info[0] == 2 else iprot.readString()
                else:
                    iprot.skip(ftype)
            else:
                iprot.skip(ftype)
            iprot.readFieldEnd()
        iprot.readStructEnd()

    def write(self, oprot):
        if oprot._fast_encode is not None and self.thrift_spec is not None:
            oprot.trans.write(oprot._fast_encode(self, [self.__class__, self.thrift_spec]))
            return
        oprot.writeStructBegin('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)
all_structs.append(doesUserHaveSSHAccount_args)
doesUserHaveSSHAccount_args.thrift_spec = (
    None,  # 0
    (1, TType.STRUCT, 'authzToken', [airavata.model.security.ttypes.AuthzToken, None], None, ),  # 1
    (2, TType.STRING, 'computeResourceId', 'UTF8', None, ),  # 2
    (3, TType.STRING, 'userId', 'UTF8', None, ),  # 3
)


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

    """


    def __init__(self, success=None, ire=None, ace=None, ase=None, ae=None,):
        self.success = success
        self.ire = ire
        self.ace = ace
        self.ase = ase
        self.ae = ae

    def read(self, iprot):
        if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None:
            iprot._fast_decode(self, iprot, [self.__class__, 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.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 2:
                if ftype == TType.STRUCT:
                    self.ace = airavata.api.error.ttypes.AiravataClientException.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 3:
                if ftype == TType.STRUCT:
                    self.ase = airavata.api.error.ttypes.AiravataSystemException.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 4:
                if ftype == TType.STRUCT:
                    self.ae = airavata.api.error.ttypes.AuthorizationException.read(iprot)
                else:
                    iprot.skip(ftype)
            else:
                iprot.skip(ftype)
            iprot.readFieldEnd()
        iprot.readStructEnd()

    def write(self, oprot):
        if oprot._fast_encode is 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)
all_structs.append(doesUserHaveSSHAccount_result)
doesUserHaveSSHAccount_result.thrift_spec = (
    (0, TType.BOOL, 'success', None, None, ),  # 0
    (1, TType.STRUCT, 'ire', [airavata.api.error.ttypes.InvalidRequestException, None], None, ),  # 1
    (2, TType.STRUCT, 'ace', [airavata.api.error.ttypes.AiravataClientException, None], None, ),  # 2
    (3, TType.STRUCT, 'ase', [airavata.api.error.ttypes.AiravataSystemException, None], None, ),  # 3
    (4, TType.STRUCT, 'ae', [airavata.api.error.ttypes.AuthorizationException, None], None, ),  # 4
)


class isSSHSetupCompleteForUserComputeResourcePreference_args(object):
    """
    Attributes:
     - authzToken
     - computeResourceId
     - airavataCredStoreToken

    """


    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', errors='replace') 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', errors='replace') if sys.version_info[0] == 2 else iprot.readString()
                else:
                    iprot.skip(ftype)
            else:
                iprot.skip(ftype)
            iprot.readFieldEnd()
        iprot.readStructEnd()

    def write(self, oprot):
        if oprot._fast_encode is not None and self.thrift_spec is not None:
            oprot.trans.write(oprot._fast_encode(self, [self.__class__, self.thrift_spec]))
            return
        oprot.writeStructBegin('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)
all_structs.append(isSSHSetupCompleteForUserComputeResourcePreference_args)
isSSHSetupCompleteForUserComputeResourcePreference_args.thrift_spec = (
    None,  # 0
    (1, TType.STRUCT, 'authzToken', [airavata.model.security.ttypes.AuthzToken, None], None, ),  # 1
    (2, TType.STRING, 'computeResourceId', 'UTF8', None, ),  # 2
    (3, TType.STRING, 'airavataCredStoreToken', 'UTF8', None, ),  # 3
)


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

    """


    def __init__(self, success=None, ire=None, ace=None, ase=None, ae=None,):
        self.success = success
        self.ire = ire
        self.ace = ace
        self.ase = ase
        self.ae = ae

    def read(self, iprot):
        if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None:
            iprot._fast_decode(self, iprot, [self.__class__, 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.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 2:
                if ftype == TType.STRUCT:
                    self.ace = airavata.api.error.ttypes.AiravataClientException.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 3:
                if ftype == TType.STRUCT:
                    self.ase = airavata.api.error.ttypes.AiravataSystemException.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 4:
                if ftype == TType.STRUCT:
                    self.ae = airavata.api.error.ttypes.AuthorizationException.read(iprot)
                else:
                    iprot.skip(ftype)
            else:
                iprot.skip(ftype)
            iprot.readFieldEnd()
        iprot.readStructEnd()

    def write(self, oprot):
        if oprot._fast_encode is 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)
all_structs.append(isSSHSetupCompleteForUserComputeResourcePreference_result)
isSSHSetupCompleteForUserComputeResourcePreference_result.thrift_spec = (
    (0, TType.BOOL, 'success', None, None, ),  # 0
    (1, TType.STRUCT, 'ire', [airavata.api.error.ttypes.InvalidRequestException, None], None, ),  # 1
    (2, TType.STRUCT, 'ace', [airavata.api.error.ttypes.AiravataClientException, None], None, ),  # 2
    (3, TType.STRUCT, 'ase', [airavata.api.error.ttypes.AiravataSystemException, None], None, ),  # 3
    (4, TType.STRUCT, 'ae', [airavata.api.error.ttypes.AuthorizationException, None], None, ),  # 4
)


class setupUserComputeResourcePreferencesForSSH_args(object):
    """
    Attributes:
     - authzToken
     - computeResourceId
     - userId
     - airavataCredStoreToken

    """


    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', errors='replace') 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', errors='replace') 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', errors='replace') if sys.version_info[0] == 2 else iprot.readString()
                else:
                    iprot.skip(ftype)
            else:
                iprot.skip(ftype)
            iprot.readFieldEnd()
        iprot.readStructEnd()

    def write(self, oprot):
        if oprot._fast_encode is not None and self.thrift_spec is not None:
            oprot.trans.write(oprot._fast_encode(self, [self.__class__, self.thrift_spec]))
            return
        oprot.writeStructBegin('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)
all_structs.append(setupUserComputeResourcePreferencesForSSH_args)
setupUserComputeResourcePreferencesForSSH_args.thrift_spec = (
    None,  # 0
    (1, TType.STRUCT, 'authzToken', [airavata.model.security.ttypes.AuthzToken, None], None, ),  # 1
    (2, TType.STRING, 'computeResourceId', 'UTF8', None, ),  # 2
    (3, TType.STRING, 'userId', 'UTF8', None, ),  # 3
    (4, TType.STRING, 'airavataCredStoreToken', 'UTF8', None, ),  # 4
)


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

    """


    def __init__(self, success=None, ire=None, ace=None, ase=None, ae=None,):
        self.success = success
        self.ire = ire
        self.ace = ace
        self.ase = ase
        self.ae = ae

    def read(self, iprot):
        if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None:
            iprot._fast_decode(self, iprot, [self.__class__, 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.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 2:
                if ftype == TType.STRUCT:
                    self.ace = airavata.api.error.ttypes.AiravataClientException.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 3:
                if ftype == TType.STRUCT:
                    self.ase = airavata.api.error.ttypes.AiravataSystemException.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 4:
                if ftype == TType.STRUCT:
                    self.ae = airavata.api.error.ttypes.AuthorizationException.read(iprot)
                else:
                    iprot.skip(ftype)
            else:
                iprot.skip(ftype)
            iprot.readFieldEnd()
        iprot.readStructEnd()

    def write(self, oprot):
        if oprot._fast_encode is 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)
all_structs.append(setupUserComputeResourcePreferencesForSSH_result)
setupUserComputeResourcePreferencesForSSH_result.thrift_spec = (
    (0, TType.STRUCT, 'success', [airavata.model.appcatalog.userresourceprofile.ttypes.UserComputeResourcePreference, None], None, ),  # 0
    (1, TType.STRUCT, 'ire', [airavata.api.error.ttypes.InvalidRequestException, None], None, ),  # 1
    (2, TType.STRUCT, 'ace', [airavata.api.error.ttypes.AiravataClientException, None], None, ),  # 2
    (3, TType.STRUCT, 'ase', [airavata.api.error.ttypes.AiravataSystemException, None], None, ),  # 3
    (4, TType.STRUCT, 'ae', [airavata.api.error.ttypes.AuthorizationException, None], None, ),  # 4
)


class registerUserResourceProfile_args(object):
    """
    Attributes:
     - authzToken
     - userResourceProfile

    """


    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)
all_structs.append(registerUserResourceProfile_args)
registerUserResourceProfile_args.thrift_spec = (
    None,  # 0
    (1, TType.STRUCT, 'authzToken', [airavata.model.security.ttypes.AuthzToken, None], None, ),  # 1
    (2, TType.STRUCT, 'userResourceProfile', [airavata.model.appcatalog.userresourceprofile.ttypes.UserResourceProfile, None], None, ),  # 2
)


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

    """


    def __init__(self, success=None, ire=None, ace=None, ase=None, ae=None,):
        self.success = success
        self.ire = ire
        self.ace = ace
        self.ase = ase
        self.ae = ae

    def read(self, iprot):
        if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None:
            iprot._fast_decode(self, iprot, [self.__class__, 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', errors='replace') 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.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 2:
                if ftype == TType.STRUCT:
                    self.ace = airavata.api.error.ttypes.AiravataClientException.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 3:
                if ftype == TType.STRUCT:
                    self.ase = airavata.api.error.ttypes.AiravataSystemException.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 4:
                if ftype == TType.STRUCT:
                    self.ae = airavata.api.error.ttypes.AuthorizationException.read(iprot)
                else:
                    iprot.skip(ftype)
            else:
                iprot.skip(ftype)
            iprot.readFieldEnd()
        iprot.readStructEnd()

    def write(self, oprot):
        if oprot._fast_encode is 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)
all_structs.append(registerUserResourceProfile_result)
registerUserResourceProfile_result.thrift_spec = (
    (0, TType.STRING, 'success', 'UTF8', None, ),  # 0
    (1, TType.STRUCT, 'ire', [airavata.api.error.ttypes.InvalidRequestException, None], None, ),  # 1
    (2, TType.STRUCT, 'ace', [airavata.api.error.ttypes.AiravataClientException, None], None, ),  # 2
    (3, TType.STRUCT, 'ase', [airavata.api.error.ttypes.AiravataSystemException, None], None, ),  # 3
    (4, TType.STRUCT, 'ae', [airavata.api.error.ttypes.AuthorizationException, None], None, ),  # 4
)


class isUserResourceProfileExists_args(object):
    """
    Attributes:
     - authzToken
     - userId
     - gatewayID

    """


    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', errors='replace') 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', errors='replace') if sys.version_info[0] == 2 else iprot.readString()
                else:
                    iprot.skip(ftype)
            else:
                iprot.skip(ftype)
            iprot.readFieldEnd()
        iprot.readStructEnd()

    def write(self, oprot):
        if oprot._fast_encode is not None and self.thrift_spec is not None:
            oprot.trans.write(oprot._fast_encode(self, [self.__class__, self.thrift_spec]))
            return
        oprot.writeStructBegin('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)
all_structs.append(isUserResourceProfileExists_args)
isUserResourceProfileExists_args.thrift_spec = (
    None,  # 0
    (1, TType.STRUCT, 'authzToken', [airavata.model.security.ttypes.AuthzToken, None], None, ),  # 1
    (2, TType.STRING, 'userId', 'UTF8', None, ),  # 2
    (3, TType.STRING, 'gatewayID', 'UTF8', None, ),  # 3
)


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

    """


    def __init__(self, success=None, ire=None, ace=None, ase=None, ae=None,):
        self.success = success
        self.ire = ire
        self.ace = ace
        self.ase = ase
        self.ae = ae

    def read(self, iprot):
        if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None:
            iprot._fast_decode(self, iprot, [self.__class__, 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.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 2:
                if ftype == TType.STRUCT:
                    self.ace = airavata.api.error.ttypes.AiravataClientException.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 3:
                if ftype == TType.STRUCT:
                    self.ase = airavata.api.error.ttypes.AiravataSystemException.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 4:
                if ftype == TType.STRUCT:
                    self.ae = airavata.api.error.ttypes.AuthorizationException.read(iprot)
                else:
                    iprot.skip(ftype)
            else:
                iprot.skip(ftype)
            iprot.readFieldEnd()
        iprot.readStructEnd()

    def write(self, oprot):
        if oprot._fast_encode is 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)
all_structs.append(isUserResourceProfileExists_result)
isUserResourceProfileExists_result.thrift_spec = (
    (0, TType.BOOL, 'success', None, None, ),  # 0
    (1, TType.STRUCT, 'ire', [airavata.api.error.ttypes.InvalidRequestException, None], None, ),  # 1
    (2, TType.STRUCT, 'ace', [airavata.api.error.ttypes.AiravataClientException, None], None, ),  # 2
    (3, TType.STRUCT, 'ase', [airavata.api.error.ttypes.AiravataSystemException, None], None, ),  # 3
    (4, TType.STRUCT, 'ae', [airavata.api.error.ttypes.AuthorizationException, None], None, ),  # 4
)


class getUserResourceProfile_args(object):
    """
    Attributes:
     - authzToken
     - userId
     - gatewayID

    """


    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', errors='replace') 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', errors='replace') if sys.version_info[0] == 2 else iprot.readString()
                else:
                    iprot.skip(ftype)
            else:
                iprot.skip(ftype)
            iprot.readFieldEnd()
        iprot.readStructEnd()

    def write(self, oprot):
        if oprot._fast_encode is not None and self.thrift_spec is not None:
            oprot.trans.write(oprot._fast_encode(self, [self.__class__, self.thrift_spec]))
            return
        oprot.writeStructBegin('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)
all_structs.append(getUserResourceProfile_args)
getUserResourceProfile_args.thrift_spec = (
    None,  # 0
    (1, TType.STRUCT, 'authzToken', [airavata.model.security.ttypes.AuthzToken, None], None, ),  # 1
    (2, TType.STRING, 'userId', 'UTF8', None, ),  # 2
    (3, TType.STRING, 'gatewayID', 'UTF8', None, ),  # 3
)


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

    """


    def __init__(self, success=None, ire=None, ace=None, ase=None, ae=None,):
        self.success = success
        self.ire = ire
        self.ace = ace
        self.ase = ase
        self.ae = ae

    def read(self, iprot):
        if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None:
            iprot._fast_decode(self, iprot, [self.__class__, 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.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 2:
                if ftype == TType.STRUCT:
                    self.ace = airavata.api.error.ttypes.AiravataClientException.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 3:
                if ftype == TType.STRUCT:
                    self.ase = airavata.api.error.ttypes.AiravataSystemException.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 4:
                if ftype == TType.STRUCT:
                    self.ae = airavata.api.error.ttypes.AuthorizationException.read(iprot)
                else:
                    iprot.skip(ftype)
            else:
                iprot.skip(ftype)
            iprot.readFieldEnd()
        iprot.readStructEnd()

    def write(self, oprot):
        if oprot._fast_encode is 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)
all_structs.append(getUserResourceProfile_result)
getUserResourceProfile_result.thrift_spec = (
    (0, TType.STRUCT, 'success', [airavata.model.appcatalog.userresourceprofile.ttypes.UserResourceProfile, None], None, ),  # 0
    (1, TType.STRUCT, 'ire', [airavata.api.error.ttypes.InvalidRequestException, None], None, ),  # 1
    (2, TType.STRUCT, 'ace', [airavata.api.error.ttypes.AiravataClientException, None], None, ),  # 2
    (3, TType.STRUCT, 'ase', [airavata.api.error.ttypes.AiravataSystemException, None], None, ),  # 3
    (4, TType.STRUCT, 'ae', [airavata.api.error.ttypes.AuthorizationException, None], None, ),  # 4
)


class updateUserResourceProfile_args(object):
    """
    Attributes:
     - authzToken
     - userId
     - gatewayID
     - userResourceProfile

    """


    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', errors='replace') 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', errors='replace') 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)
all_structs.append(updateUserResourceProfile_args)
updateUserResourceProfile_args.thrift_spec = (
    None,  # 0
    (1, TType.STRUCT, 'authzToken', [airavata.model.security.ttypes.AuthzToken, None], 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, None], None, ),  # 4
)


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

    """


    def __init__(self, success=None, ire=None, ace=None, ase=None, ae=None,):
        self.success = success
        self.ire = ire
        self.ace = ace
        self.ase = ase
        self.ae = ae

    def read(self, iprot):
        if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None:
            iprot._fast_decode(self, iprot, [self.__class__, 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.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 2:
                if ftype == TType.STRUCT:
                    self.ace = airavata.api.error.ttypes.AiravataClientException.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 3:
                if ftype == TType.STRUCT:
                    self.ase = airavata.api.error.ttypes.AiravataSystemException.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 4:
                if ftype == TType.STRUCT:
                    self.ae = airavata.api.error.ttypes.AuthorizationException.read(iprot)
                else:
                    iprot.skip(ftype)
            else:
                iprot.skip(ftype)
            iprot.readFieldEnd()
        iprot.readStructEnd()

    def write(self, oprot):
        if oprot._fast_encode is 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)
all_structs.append(updateUserResourceProfile_result)
updateUserResourceProfile_result.thrift_spec = (
    (0, TType.BOOL, 'success', None, None, ),  # 0
    (1, TType.STRUCT, 'ire', [airavata.api.error.ttypes.InvalidRequestException, None], None, ),  # 1
    (2, TType.STRUCT, 'ace', [airavata.api.error.ttypes.AiravataClientException, None], None, ),  # 2
    (3, TType.STRUCT, 'ase', [airavata.api.error.ttypes.AiravataSystemException, None], None, ),  # 3
    (4, TType.STRUCT, 'ae', [airavata.api.error.ttypes.AuthorizationException, None], None, ),  # 4
)


class deleteUserResourceProfile_args(object):
    """
    Attributes:
     - authzToken
     - userId
     - gatewayID

    """


    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', errors='replace') 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', errors='replace') if sys.version_info[0] == 2 else iprot.readString()
                else:
                    iprot.skip(ftype)
            else:
                iprot.skip(ftype)
            iprot.readFieldEnd()
        iprot.readStructEnd()

    def write(self, oprot):
        if oprot._fast_encode is not None and self.thrift_spec is not None:
            oprot.trans.write(oprot._fast_encode(self, [self.__class__, self.thrift_spec]))
            return
        oprot.writeStructBegin('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)
all_structs.append(deleteUserResourceProfile_args)
deleteUserResourceProfile_args.thrift_spec = (
    None,  # 0
    (1, TType.STRUCT, 'authzToken', [airavata.model.security.ttypes.AuthzToken, None], None, ),  # 1
    (2, TType.STRING, 'userId', 'UTF8', None, ),  # 2
    (3, TType.STRING, 'gatewayID', 'UTF8', None, ),  # 3
)


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

    """


    def __init__(self, success=None, ire=None, ace=None, ase=None, ae=None,):
        self.success = success
        self.ire = ire
        self.ace = ace
        self.ase = ase
        self.ae = ae

    def read(self, iprot):
        if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None:
            iprot._fast_decode(self, iprot, [self.__class__, 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.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 2:
                if ftype == TType.STRUCT:
                    self.ace = airavata.api.error.ttypes.AiravataClientException.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 3:
                if ftype == TType.STRUCT:
                    self.ase = airavata.api.error.ttypes.AiravataSystemException.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 4:
                if ftype == TType.STRUCT:
                    self.ae = airavata.api.error.ttypes.AuthorizationException.read(iprot)
                else:
                    iprot.skip(ftype)
            else:
                iprot.skip(ftype)
            iprot.readFieldEnd()
        iprot.readStructEnd()

    def write(self, oprot):
        if oprot._fast_encode is 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)
all_structs.append(deleteUserResourceProfile_result)
deleteUserResourceProfile_result.thrift_spec = (
    (0, TType.BOOL, 'success', None, None, ),  # 0
    (1, TType.STRUCT, 'ire', [airavata.api.error.ttypes.InvalidRequestException, None], None, ),  # 1
    (2, TType.STRUCT, 'ace', [airavata.api.error.ttypes.AiravataClientException, None], None, ),  # 2
    (3, TType.STRUCT, 'ase', [airavata.api.error.ttypes.AiravataSystemException, None], None, ),  # 3
    (4, TType.STRUCT, 'ae', [airavata.api.error.ttypes.AuthorizationException, None], None, ),  # 4
)


class addUserComputeResourcePreference_args(object):
    """
    Attributes:
     - authzToken
     - userId
     - gatewayID
     - userComputeResourceId
     - userComputeResourcePreference

    """


    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', errors='replace') 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', errors='replace') 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', errors='replace') 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)
all_structs.append(addUserComputeResourcePreference_args)
addUserComputeResourcePreference_args.thrift_spec = (
    None,  # 0
    (1, TType.STRUCT, 'authzToken', [airavata.model.security.ttypes.AuthzToken, None], 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, None], None, ),  # 5
)


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

    """


    def __init__(self, success=None, ire=None, ace=None, ase=None, ae=None,):
        self.success = success
        self.ire = ire
        self.ace = ace
        self.ase = ase
        self.ae = ae

    def read(self, iprot):
        if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None:
            iprot._fast_decode(self, iprot, [self.__class__, 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.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 2:
                if ftype == TType.STRUCT:
                    self.ace = airavata.api.error.ttypes.AiravataClientException.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 3:
                if ftype == TType.STRUCT:
                    self.ase = airavata.api.error.ttypes.AiravataSystemException.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 4:
                if ftype == TType.STRUCT:
                    self.ae = airavata.api.error.ttypes.AuthorizationException.read(iprot)
                else:
                    iprot.skip(ftype)
            else:
                iprot.skip(ftype)
            iprot.readFieldEnd()
        iprot.readStructEnd()

    def write(self, oprot):
        if oprot._fast_encode is 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)
all_structs.append(addUserComputeResourcePreference_result)
addUserComputeResourcePreference_result.thrift_spec = (
    (0, TType.BOOL, 'success', None, None, ),  # 0
    (1, TType.STRUCT, 'ire', [airavata.api.error.ttypes.InvalidRequestException, None], None, ),  # 1
    (2, TType.STRUCT, 'ace', [airavata.api.error.ttypes.AiravataClientException, None], None, ),  # 2
    (3, TType.STRUCT, 'ase', [airavata.api.error.ttypes.AiravataSystemException, None], None, ),  # 3
    (4, TType.STRUCT, 'ae', [airavata.api.error.ttypes.AuthorizationException, None], None, ),  # 4
)


class addUserStoragePreference_args(object):
    """
    Attributes:
     - authzToken
     - userId
     - gatewayID
     - userStorageResourceId
     - userStoragePreference

    """


    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', errors='replace') 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', errors='replace') 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', errors='replace') 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)
all_structs.append(addUserStoragePreference_args)
addUserStoragePreference_args.thrift_spec = (
    None,  # 0
    (1, TType.STRUCT, 'authzToken', [airavata.model.security.ttypes.AuthzToken, None], 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, None], None, ),  # 5
)


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

    """


    def __init__(self, success=None, ire=None, ace=None, ase=None, ae=None,):
        self.success = success
        self.ire = ire
        self.ace = ace
        self.ase = ase
        self.ae = ae

    def read(self, iprot):
        if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None:
            iprot._fast_decode(self, iprot, [self.__class__, 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.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 2:
                if ftype == TType.STRUCT:
                    self.ace = airavata.api.error.ttypes.AiravataClientException.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 3:
                if ftype == TType.STRUCT:
                    self.ase = airavata.api.error.ttypes.AiravataSystemException.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 4:
                if ftype == TType.STRUCT:
                    self.ae = airavata.api.error.ttypes.AuthorizationException.read(iprot)
                else:
                    iprot.skip(ftype)
            else:
                iprot.skip(ftype)
            iprot.readFieldEnd()
        iprot.readStructEnd()

    def write(self, oprot):
        if oprot._fast_encode is 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)
all_structs.append(addUserStoragePreference_result)
addUserStoragePreference_result.thrift_spec = (
    (0, TType.BOOL, 'success', None, None, ),  # 0
    (1, TType.STRUCT, 'ire', [airavata.api.error.ttypes.InvalidRequestException, None], None, ),  # 1
    (2, TType.STRUCT, 'ace', [airavata.api.error.ttypes.AiravataClientException, None], None, ),  # 2
    (3, TType.STRUCT, 'ase', [airavata.api.error.ttypes.AiravataSystemException, None], None, ),  # 3
    (4, TType.STRUCT, 'ae', [airavata.api.error.ttypes.AuthorizationException, None], None, ),  # 4
)


class getUserComputeResourcePreference_args(object):
    """
    Attributes:
     - authzToken
     - userId
     - gatewayID
     - userComputeResourceId

    """


    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', errors='replace') 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', errors='replace') 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', errors='replace') if sys.version_info[0] == 2 else iprot.readString()
                else:
                    iprot.skip(ftype)
            else:
                iprot.skip(ftype)
            iprot.readFieldEnd()
        iprot.readStructEnd()

    def write(self, oprot):
        if oprot._fast_encode is not None and self.thrift_spec is not None:
            oprot.trans.write(oprot._fast_encode(self, [self.__class__, self.thrift_spec]))
            return
        oprot.writeStructBegin('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)
all_structs.append(getUserComputeResourcePreference_args)
getUserComputeResourcePreference_args.thrift_spec = (
    None,  # 0
    (1, TType.STRUCT, 'authzToken', [airavata.model.security.ttypes.AuthzToken, None], None, ),  # 1
    (2, TType.STRING, 'userId', 'UTF8', None, ),  # 2
    (3, TType.STRING, 'gatewayID', 'UTF8', None, ),  # 3
    (4, TType.STRING, 'userComputeResourceId', 'UTF8', None, ),  # 4
)


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

    """


    def __init__(self, success=None, ire=None, ace=None, ase=None, ae=None,):
        self.success = success
        self.ire = ire
        self.ace = ace
        self.ase = ase
        self.ae = ae

    def read(self, iprot):
        if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None:
            iprot._fast_decode(self, iprot, [self.__class__, 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.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 2:
                if ftype == TType.STRUCT:
                    self.ace = airavata.api.error.ttypes.AiravataClientException.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 3:
                if ftype == TType.STRUCT:
                    self.ase = airavata.api.error.ttypes.AiravataSystemException.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 4:
                if ftype == TType.STRUCT:
                    self.ae = airavata.api.error.ttypes.AuthorizationException.read(iprot)
                else:
                    iprot.skip(ftype)
            else:
                iprot.skip(ftype)
            iprot.readFieldEnd()
        iprot.readStructEnd()

    def write(self, oprot):
        if oprot._fast_encode is 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)
all_structs.append(getUserComputeResourcePreference_result)
getUserComputeResourcePreference_result.thrift_spec = (
    (0, TType.STRUCT, 'success', [airavata.model.appcatalog.userresourceprofile.ttypes.UserComputeResourcePreference, None], None, ),  # 0
    (1, TType.STRUCT, 'ire', [airavata.api.error.ttypes.InvalidRequestException, None], None, ),  # 1
    (2, TType.STRUCT, 'ace', [airavata.api.error.ttypes.AiravataClientException, None], None, ),  # 2
    (3, TType.STRUCT, 'ase', [airavata.api.error.ttypes.AiravataSystemException, None], None, ),  # 3
    (4, TType.STRUCT, 'ae', [airavata.api.error.ttypes.AuthorizationException, None], None, ),  # 4
)


class getUserStoragePreference_args(object):
    """
    Attributes:
     - authzToken
     - userId
     - gatewayID
     - userStorageResourceId

    """


    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', errors='replace') 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', errors='replace') 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', errors='replace') if sys.version_info[0] == 2 else iprot.readString()
                else:
                    iprot.skip(ftype)
            else:
                iprot.skip(ftype)
            iprot.readFieldEnd()
        iprot.readStructEnd()

    def write(self, oprot):
        if oprot._fast_encode is not None and self.thrift_spec is not None:
            oprot.trans.write(oprot._fast_encode(self, [self.__class__, self.thrift_spec]))
            return
        oprot.writeStructBegin('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)
all_structs.append(getUserStoragePreference_args)
getUserStoragePreference_args.thrift_spec = (
    None,  # 0
    (1, TType.STRUCT, 'authzToken', [airavata.model.security.ttypes.AuthzToken, None], None, ),  # 1
    (2, TType.STRING, 'userId', 'UTF8', None, ),  # 2
    (3, TType.STRING, 'gatewayID', 'UTF8', None, ),  # 3
    (4, TType.STRING, 'userStorageResourceId', 'UTF8', None, ),  # 4
)


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

    """


    def __init__(self, success=None, ire=None, ace=None, ase=None, ae=None,):
        self.success = success
        self.ire = ire
        self.ace = ace
        self.ase = ase
        self.ae = ae

    def read(self, iprot):
        if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None:
            iprot._fast_decode(self, iprot, [self.__class__, 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.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 2:
                if ftype == TType.STRUCT:
                    self.ace = airavata.api.error.ttypes.AiravataClientException.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 3:
                if ftype == TType.STRUCT:
                    self.ase = airavata.api.error.ttypes.AiravataSystemException.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 4:
                if ftype == TType.STRUCT:
                    self.ae = airavata.api.error.ttypes.AuthorizationException.read(iprot)
                else:
                    iprot.skip(ftype)
            else:
                iprot.skip(ftype)
            iprot.readFieldEnd()
        iprot.readStructEnd()

    def write(self, oprot):
        if oprot._fast_encode is 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)
all_structs.append(getUserStoragePreference_result)
getUserStoragePreference_result.thrift_spec = (
    (0, TType.STRUCT, 'success', [airavata.model.appcatalog.userresourceprofile.ttypes.UserStoragePreference, None], None, ),  # 0
    (1, TType.STRUCT, 'ire', [airavata.api.error.ttypes.InvalidRequestException, None], None, ),  # 1
    (2, TType.STRUCT, 'ace', [airavata.api.error.ttypes.AiravataClientException, None], None, ),  # 2
    (3, TType.STRUCT, 'ase', [airavata.api.error.ttypes.AiravataSystemException, None], None, ),  # 3
    (4, TType.STRUCT, 'ae', [airavata.api.error.ttypes.AuthorizationException, None], None, ),  # 4
)


class getAllUserComputeResourcePreferences_args(object):
    """
    Attributes:
     - authzToken
     - userId
     - gatewayID

    """


    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', errors='replace') 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', errors='replace') if sys.version_info[0] == 2 else iprot.readString()
                else:
                    iprot.skip(ftype)
            else:
                iprot.skip(ftype)
            iprot.readFieldEnd()
        iprot.readStructEnd()

    def write(self, oprot):
        if oprot._fast_encode is not None and self.thrift_spec is not None:
            oprot.trans.write(oprot._fast_encode(self, [self.__class__, self.thrift_spec]))
            return
        oprot.writeStructBegin('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)
all_structs.append(getAllUserComputeResourcePreferences_args)
getAllUserComputeResourcePreferences_args.thrift_spec = (
    None,  # 0
    (1, TType.STRUCT, 'authzToken', [airavata.model.security.ttypes.AuthzToken, None], None, ),  # 1
    (2, TType.STRING, 'userId', 'UTF8', None, ),  # 2
    (3, TType.STRING, 'gatewayID', 'UTF8', None, ),  # 3
)


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

    """


    def __init__(self, success=None, ire=None, ace=None, ase=None, ae=None,):
        self.success = success
        self.ire = ire
        self.ace = ace
        self.ase = ase
        self.ae = ae

    def read(self, iprot):
        if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None:
            iprot._fast_decode(self, iprot, [self.__class__, 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.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 2:
                if ftype == TType.STRUCT:
                    self.ace = airavata.api.error.ttypes.AiravataClientException.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 3:
                if ftype == TType.STRUCT:
                    self.ase = airavata.api.error.ttypes.AiravataSystemException.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 4:
                if ftype == TType.STRUCT:
                    self.ae = airavata.api.error.ttypes.AuthorizationException.read(iprot)
                else:
                    iprot.skip(ftype)
            else:
                iprot.skip(ftype)
            iprot.readFieldEnd()
        iprot.readStructEnd()

    def write(self, oprot):
        if oprot._fast_encode is 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)
all_structs.append(getAllUserComputeResourcePreferences_result)
getAllUserComputeResourcePreferences_result.thrift_spec = (
    (0, TType.LIST, 'success', (TType.STRUCT, [airavata.model.appcatalog.userresourceprofile.ttypes.UserComputeResourcePreference, None], False), None, ),  # 0
    (1, TType.STRUCT, 'ire', [airavata.api.error.ttypes.InvalidRequestException, None], None, ),  # 1
    (2, TType.STRUCT, 'ace', [airavata.api.error.ttypes.AiravataClientException, None], None, ),  # 2
    (3, TType.STRUCT, 'ase', [airavata.api.error.ttypes.AiravataSystemException, None], None, ),  # 3
    (4, TType.STRUCT, 'ae', [airavata.api.error.ttypes.AuthorizationException, None], None, ),  # 4
)


class getAllUserStoragePreferences_args(object):
    """
    Attributes:
     - authzToken
     - userId
     - gatewayID

    """


    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', errors='replace') 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', errors='replace') if sys.version_info[0] == 2 else iprot.readString()
                else:
                    iprot.skip(ftype)
            else:
                iprot.skip(ftype)
            iprot.readFieldEnd()
        iprot.readStructEnd()

    def write(self, oprot):
        if oprot._fast_encode is not None and self.thrift_spec is not None:
            oprot.trans.write(oprot._fast_encode(self, [self.__class__, self.thrift_spec]))
            return
        oprot.writeStructBegin('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)
all_structs.append(getAllUserStoragePreferences_args)
getAllUserStoragePreferences_args.thrift_spec = (
    None,  # 0
    (1, TType.STRUCT, 'authzToken', [airavata.model.security.ttypes.AuthzToken, None], None, ),  # 1
    (2, TType.STRING, 'userId', 'UTF8', None, ),  # 2
    (3, TType.STRING, 'gatewayID', 'UTF8', None, ),  # 3
)


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

    """


    def __init__(self, success=None, ire=None, ace=None, ase=None, ae=None,):
        self.success = success
        self.ire = ire
        self.ace = ace
        self.ase = ase
        self.ae = ae

    def read(self, iprot):
        if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None:
            iprot._fast_decode(self, iprot, [self.__class__, 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.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 2:
                if ftype == TType.STRUCT:
                    self.ace = airavata.api.error.ttypes.AiravataClientException.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 3:
                if ftype == TType.STRUCT:
                    self.ase = airavata.api.error.ttypes.AiravataSystemException.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 4:
                if ftype == TType.STRUCT:
                    self.ae = airavata.api.error.ttypes.AuthorizationException.read(iprot)
                else:
                    iprot.skip(ftype)
            else:
                iprot.skip(ftype)
            iprot.readFieldEnd()
        iprot.readStructEnd()

    def write(self, oprot):
        if oprot._fast_encode is 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)
all_structs.append(getAllUserStoragePreferences_result)
getAllUserStoragePreferences_result.thrift_spec = (
    (0, TType.LIST, 'success', (TType.STRUCT, [airavata.model.appcatalog.userresourceprofile.ttypes.UserStoragePreference, None], False), None, ),  # 0
    (1, TType.STRUCT, 'ire', [airavata.api.error.ttypes.InvalidRequestException, None], None, ),  # 1
    (2, TType.STRUCT, 'ace', [airavata.api.error.ttypes.AiravataClientException, None], None, ),  # 2
    (3, TType.STRUCT, 'ase', [airavata.api.error.ttypes.AiravataSystemException, None], None, ),  # 3
    (4, TType.STRUCT, 'ae', [airavata.api.error.ttypes.AuthorizationException, None], None, ),  # 4
)


class getAllUserResourceProfiles_args(object):
    """
    Attributes:
     - authzToken

    """


    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)
all_structs.append(getAllUserResourceProfiles_args)
getAllUserResourceProfiles_args.thrift_spec = (
    None,  # 0
    (1, TType.STRUCT, 'authzToken', [airavata.model.security.ttypes.AuthzToken, None], None, ),  # 1
)


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

    """


    def __init__(self, success=None, ire=None, ace=None, ase=None, ae=None,):
        self.success = success
        self.ire = ire
        self.ace = ace
        self.ase = ase
        self.ae = ae

    def read(self, iprot):
        if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None:
            iprot._fast_decode(self, iprot, [self.__class__, 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.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 2:
                if ftype == TType.STRUCT:
                    self.ace = airavata.api.error.ttypes.AiravataClientException.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 3:
                if ftype == TType.STRUCT:
                    self.ase = airavata.api.error.ttypes.AiravataSystemException.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 4:
                if ftype == TType.STRUCT:
                    self.ae = airavata.api.error.ttypes.AuthorizationException.read(iprot)
                else:
                    iprot.skip(ftype)
            else:
                iprot.skip(ftype)
            iprot.readFieldEnd()
        iprot.readStructEnd()

    def write(self, oprot):
        if oprot._fast_encode is 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)
all_structs.append(getAllUserResourceProfiles_result)
getAllUserResourceProfiles_result.thrift_spec = (
    (0, TType.LIST, 'success', (TType.STRUCT, [airavata.model.appcatalog.userresourceprofile.ttypes.UserResourceProfile, None], False), None, ),  # 0
    (1, TType.STRUCT, 'ire', [airavata.api.error.ttypes.InvalidRequestException, None], None, ),  # 1
    (2, TType.STRUCT, 'ace', [airavata.api.error.ttypes.AiravataClientException, None], None, ),  # 2
    (3, TType.STRUCT, 'ase', [airavata.api.error.ttypes.AiravataSystemException, None], None, ),  # 3
    (4, TType.STRUCT, 'ae', [airavata.api.error.ttypes.AuthorizationException, None], None, ),  # 4
)


class updateUserComputeResourcePreference_args(object):
    """
    Attributes:
     - authzToken
     - userId
     - gatewayID
     - userComputeResourceId
     - userComputeResourcePreference

    """


    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', errors='replace') 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', errors='replace') 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', errors='replace') 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)
all_structs.append(updateUserComputeResourcePreference_args)
updateUserComputeResourcePreference_args.thrift_spec = (
    None,  # 0
    (1, TType.STRUCT, 'authzToken', [airavata.model.security.ttypes.AuthzToken, None], 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, None], None, ),  # 5
)


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

    """


    def __init__(self, success=None, ire=None, ace=None, ase=None, ae=None,):
        self.success = success
        self.ire = ire
        self.ace = ace
        self.ase = ase
        self.ae = ae

    def read(self, iprot):
        if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None:
            iprot._fast_decode(self, iprot, [self.__class__, 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.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 2:
                if ftype == TType.STRUCT:
                    self.ace = airavata.api.error.ttypes.AiravataClientException.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 3:
                if ftype == TType.STRUCT:
                    self.ase = airavata.api.error.ttypes.AiravataSystemException.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 4:
                if ftype == TType.STRUCT:
                    self.ae = airavata.api.error.ttypes.AuthorizationException.read(iprot)
                else:
                    iprot.skip(ftype)
            else:
                iprot.skip(ftype)
            iprot.readFieldEnd()
        iprot.readStructEnd()

    def write(self, oprot):
        if oprot._fast_encode is 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)
all_structs.append(updateUserComputeResourcePreference_result)
updateUserComputeResourcePreference_result.thrift_spec = (
    (0, TType.BOOL, 'success', None, None, ),  # 0
    (1, TType.STRUCT, 'ire', [airavata.api.error.ttypes.InvalidRequestException, None], None, ),  # 1
    (2, TType.STRUCT, 'ace', [airavata.api.error.ttypes.AiravataClientException, None], None, ),  # 2
    (3, TType.STRUCT, 'ase', [airavata.api.error.ttypes.AiravataSystemException, None], None, ),  # 3
    (4, TType.STRUCT, 'ae', [airavata.api.error.ttypes.AuthorizationException, None], None, ),  # 4
)


class updateUserStoragePreference_args(object):
    """
    Attributes:
     - authzToken
     - userId
     - gatewayID
     - userStorageId
     - userStoragePreference

    """


    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', errors='replace') 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', errors='replace') 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', errors='replace') 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)
all_structs.append(updateUserStoragePreference_args)
updateUserStoragePreference_args.thrift_spec = (
    None,  # 0
    (1, TType.STRUCT, 'authzToken', [airavata.model.security.ttypes.AuthzToken, None], 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, None], None, ),  # 5
)


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

    """


    def __init__(self, success=None, ire=None, ace=None, ase=None, ae=None,):
        self.success = success
        self.ire = ire
        self.ace = ace
        self.ase = ase
        self.ae = ae

    def read(self, iprot):
        if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None:
            iprot._fast_decode(self, iprot, [self.__class__, 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.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 2:
                if ftype == TType.STRUCT:
                    self.ace = airavata.api.error.ttypes.AiravataClientException.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 3:
                if ftype == TType.STRUCT:
                    self.ase = airavata.api.error.ttypes.AiravataSystemException.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 4:
                if ftype == TType.STRUCT:
                    self.ae = airavata.api.error.ttypes.AuthorizationException.read(iprot)
                else:
                    iprot.skip(ftype)
            else:
                iprot.skip(ftype)
            iprot.readFieldEnd()
        iprot.readStructEnd()

    def write(self, oprot):
        if oprot._fast_encode is 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)
all_structs.append(updateUserStoragePreference_result)
updateUserStoragePreference_result.thrift_spec = (
    (0, TType.BOOL, 'success', None, None, ),  # 0
    (1, TType.STRUCT, 'ire', [airavata.api.error.ttypes.InvalidRequestException, None], None, ),  # 1
    (2, TType.STRUCT, 'ace', [airavata.api.error.ttypes.AiravataClientException, None], None, ),  # 2
    (3, TType.STRUCT, 'ase', [airavata.api.error.ttypes.AiravataSystemException, None], None, ),  # 3
    (4, TType.STRUCT, 'ae', [airavata.api.error.ttypes.AuthorizationException, None], None, ),  # 4
)


class deleteUserComputeResourcePreference_args(object):
    """
    Attributes:
     - authzToken
     - userId
     - gatewayID
     - userComputeResourceId

    """


    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', errors='replace') 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', errors='replace') 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', errors='replace') if sys.version_info[0] == 2 else iprot.readString()
                else:
                    iprot.skip(ftype)
            else:
                iprot.skip(ftype)
            iprot.readFieldEnd()
        iprot.readStructEnd()

    def write(self, oprot):
        if oprot._fast_encode is not None and self.thrift_spec is not None:
            oprot.trans.write(oprot._fast_encode(self, [self.__class__, self.thrift_spec]))
            return
        oprot.writeStructBegin('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)
all_structs.append(deleteUserComputeResourcePreference_args)
deleteUserComputeResourcePreference_args.thrift_spec = (
    None,  # 0
    (1, TType.STRUCT, 'authzToken', [airavata.model.security.ttypes.AuthzToken, None], None, ),  # 1
    (2, TType.STRING, 'userId', 'UTF8', None, ),  # 2
    (3, TType.STRING, 'gatewayID', 'UTF8', None, ),  # 3
    (4, TType.STRING, 'userComputeResourceId', 'UTF8', None, ),  # 4
)


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

    """


    def __init__(self, success=None, ire=None, ace=None, ase=None, ae=None,):
        self.success = success
        self.ire = ire
        self.ace = ace
        self.ase = ase
        self.ae = ae

    def read(self, iprot):
        if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None:
            iprot._fast_decode(self, iprot, [self.__class__, 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.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 2:
                if ftype == TType.STRUCT:
                    self.ace = airavata.api.error.ttypes.AiravataClientException.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 3:
                if ftype == TType.STRUCT:
                    self.ase = airavata.api.error.ttypes.AiravataSystemException.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 4:
                if ftype == TType.STRUCT:
                    self.ae = airavata.api.error.ttypes.AuthorizationException.read(iprot)
                else:
                    iprot.skip(ftype)
            else:
                iprot.skip(ftype)
            iprot.readFieldEnd()
        iprot.readStructEnd()

    def write(self, oprot):
        if oprot._fast_encode is 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)
all_structs.append(deleteUserComputeResourcePreference_result)
deleteUserComputeResourcePreference_result.thrift_spec = (
    (0, TType.BOOL, 'success', None, None, ),  # 0
    (1, TType.STRUCT, 'ire', [airavata.api.error.ttypes.InvalidRequestException, None], None, ),  # 1
    (2, TType.STRUCT, 'ace', [airavata.api.error.ttypes.AiravataClientException, None], None, ),  # 2
    (3, TType.STRUCT, 'ase', [airavata.api.error.ttypes.AiravataSystemException, None], None, ),  # 3
    (4, TType.STRUCT, 'ae', [airavata.api.error.ttypes.AuthorizationException, None], None, ),  # 4
)


class deleteUserStoragePreference_args(object):
    """
    Attributes:
     - authzToken
     - userId
     - gatewayID
     - userStorageId

    """


    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', errors='replace') 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', errors='replace') 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', errors='replace') if sys.version_info[0] == 2 else iprot.readString()
                else:
                    iprot.skip(ftype)
            else:
                iprot.skip(ftype)
            iprot.readFieldEnd()
        iprot.readStructEnd()

    def write(self, oprot):
        if oprot._fast_encode is not None and self.thrift_spec is not None:
            oprot.trans.write(oprot._fast_encode(self, [self.__class__, self.thrift_spec]))
            return
        oprot.writeStructBegin('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)
all_structs.append(deleteUserStoragePreference_args)
deleteUserStoragePreference_args.thrift_spec = (
    None,  # 0
    (1, TType.STRUCT, 'authzToken', [airavata.model.security.ttypes.AuthzToken, None], None, ),  # 1
    (2, TType.STRING, 'userId', 'UTF8', None, ),  # 2
    (3, TType.STRING, 'gatewayID', 'UTF8', None, ),  # 3
    (4, TType.STRING, 'userStorageId', 'UTF8', None, ),  # 4
)


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

    """


    def __init__(self, success=None, ire=None, ace=None, ase=None, ae=None,):
        self.success = success
        self.ire = ire
        self.ace = ace
        self.ase = ase
        self.ae = ae

    def read(self, iprot):
        if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None:
            iprot._fast_decode(self, iprot, [self.__class__, 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.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 2:
                if ftype == TType.STRUCT:
                    self.ace = airavata.api.error.ttypes.AiravataClientException.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 3:
                if ftype == TType.STRUCT:
                    self.ase = airavata.api.error.ttypes.AiravataSystemException.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 4:
                if ftype == TType.STRUCT:
                    self.ae = airavata.api.error.ttypes.AuthorizationException.read(iprot)
                else:
                    iprot.skip(ftype)
            else:
                iprot.skip(ftype)
            iprot.readFieldEnd()
        iprot.readStructEnd()

    def write(self, oprot):
        if oprot._fast_encode is 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)
all_structs.append(deleteUserStoragePreference_result)
deleteUserStoragePreference_result.thrift_spec = (
    (0, TType.BOOL, 'success', None, None, ),  # 0
    (1, TType.STRUCT, 'ire', [airavata.api.error.ttypes.InvalidRequestException, None], None, ),  # 1
    (2, TType.STRUCT, 'ace', [airavata.api.error.ttypes.AiravataClientException, None], None, ),  # 2
    (3, TType.STRUCT, 'ase', [airavata.api.error.ttypes.AiravataSystemException, None], None, ),  # 3
    (4, TType.STRUCT, 'ae', [airavata.api.error.ttypes.AuthorizationException, None], None, ),  # 4
)


class getLatestQueueStatuses_args(object):
    """
    Attributes:
     - authzToken

    """


    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)
all_structs.append(getLatestQueueStatuses_args)
getLatestQueueStatuses_args.thrift_spec = (
    None,  # 0
    (1, TType.STRUCT, 'authzToken', [airavata.model.security.ttypes.AuthzToken, None], None, ),  # 1
)


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

    """


    def __init__(self, success=None, ire=None, ace=None, ase=None, ae=None,):
        self.success = success
        self.ire = ire
        self.ace = ace
        self.ase = ase
        self.ae = ae

    def read(self, iprot):
        if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None:
            iprot._fast_decode(self, iprot, [self.__class__, 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.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 2:
                if ftype == TType.STRUCT:
                    self.ace = airavata.api.error.ttypes.AiravataClientException.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 3:
                if ftype == TType.STRUCT:
                    self.ase = airavata.api.error.ttypes.AiravataSystemException.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 4:
                if ftype == TType.STRUCT:
                    self.ae = airavata.api.error.ttypes.AuthorizationException.read(iprot)
                else:
                    iprot.skip(ftype)
            else:
                iprot.skip(ftype)
            iprot.readFieldEnd()
        iprot.readStructEnd()

    def write(self, oprot):
        if oprot._fast_encode is 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)
all_structs.append(getLatestQueueStatuses_result)
getLatestQueueStatuses_result.thrift_spec = (
    (0, TType.LIST, 'success', (TType.STRUCT, [airavata.model.status.ttypes.QueueStatusModel, None], False), None, ),  # 0
    (1, TType.STRUCT, 'ire', [airavata.api.error.ttypes.InvalidRequestException, None], None, ),  # 1
    (2, TType.STRUCT, 'ace', [airavata.api.error.ttypes.AiravataClientException, None], None, ),  # 2
    (3, TType.STRUCT, 'ase', [airavata.api.error.ttypes.AiravataSystemException, None], None, ),  # 3
    (4, TType.STRUCT, 'ae', [airavata.api.error.ttypes.AuthorizationException, None], None, ),  # 4
)


class registerDataProduct_args(object):
    """
    Attributes:
     - authzToken
     - dataProductModel

    """


    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)
all_structs.append(registerDataProduct_args)
registerDataProduct_args.thrift_spec = (
    None,  # 0
    (1, TType.STRUCT, 'authzToken', [airavata.model.security.ttypes.AuthzToken, None], None, ),  # 1
    (2, TType.STRUCT, 'dataProductModel', [airavata.model.data.replica.ttypes.DataProductModel, None], None, ),  # 2
)


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

    """


    def __init__(self, success=None, ire=None, ace=None, ase=None, ae=None,):
        self.success = success
        self.ire = ire
        self.ace = ace
        self.ase = ase
        self.ae = ae

    def read(self, iprot):
        if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None:
            iprot._fast_decode(self, iprot, [self.__class__, 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', errors='replace') 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.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 2:
                if ftype == TType.STRUCT:
                    self.ace = airavata.api.error.ttypes.AiravataClientException.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 3:
                if ftype == TType.STRUCT:
                    self.ase = airavata.api.error.ttypes.AiravataSystemException.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 4:
                if ftype == TType.STRUCT:
                    self.ae = airavata.api.error.ttypes.AuthorizationException.read(iprot)
                else:
                    iprot.skip(ftype)
            else:
                iprot.skip(ftype)
            iprot.readFieldEnd()
        iprot.readStructEnd()

    def write(self, oprot):
        if oprot._fast_encode is 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)
all_structs.append(registerDataProduct_result)
registerDataProduct_result.thrift_spec = (
    (0, TType.STRING, 'success', 'UTF8', None, ),  # 0
    (1, TType.STRUCT, 'ire', [airavata.api.error.ttypes.InvalidRequestException, None], None, ),  # 1
    (2, TType.STRUCT, 'ace', [airavata.api.error.ttypes.AiravataClientException, None], None, ),  # 2
    (3, TType.STRUCT, 'ase', [airavata.api.error.ttypes.AiravataSystemException, None], None, ),  # 3
    (4, TType.STRUCT, 'ae', [airavata.api.error.ttypes.AuthorizationException, None], None, ),  # 4
)


class getDataProduct_args(object):
    """
    Attributes:
     - authzToken
     - dataProductUri

    """


    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', errors='replace') if sys.version_info[0] == 2 else iprot.readString()
                else:
                    iprot.skip(ftype)
            else:
                iprot.skip(ftype)
            iprot.readFieldEnd()
        iprot.readStructEnd()

    def write(self, oprot):
        if oprot._fast_encode is not None and self.thrift_spec is not None:
            oprot.trans.write(oprot._fast_encode(self, [self.__class__, self.thrift_spec]))
            return
        oprot.writeStructBegin('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)
all_structs.append(getDataProduct_args)
getDataProduct_args.thrift_spec = (
    None,  # 0
    (1, TType.STRUCT, 'authzToken', [airavata.model.security.ttypes.AuthzToken, None], None, ),  # 1
    (2, TType.STRING, 'dataProductUri', 'UTF8', None, ),  # 2
)


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

    """


    def __init__(self, success=None, ire=None, ace=None, ase=None, ae=None,):
        self.success = success
        self.ire = ire
        self.ace = ace
        self.ase = ase
        self.ae = ae

    def read(self, iprot):
        if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None:
            iprot._fast_decode(self, iprot, [self.__class__, 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.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 2:
                if ftype == TType.STRUCT:
                    self.ace = airavata.api.error.ttypes.AiravataClientException.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 3:
                if ftype == TType.STRUCT:
                    self.ase = airavata.api.error.ttypes.AiravataSystemException.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 4:
                if ftype == TType.STRUCT:
                    self.ae = airavata.api.error.ttypes.AuthorizationException.read(iprot)
                else:
                    iprot.skip(ftype)
            else:
                iprot.skip(ftype)
            iprot.readFieldEnd()
        iprot.readStructEnd()

    def write(self, oprot):
        if oprot._fast_encode is 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)
all_structs.append(getDataProduct_result)
getDataProduct_result.thrift_spec = (
    (0, TType.STRUCT, 'success', [airavata.model.data.replica.ttypes.DataProductModel, None], None, ),  # 0
    (1, TType.STRUCT, 'ire', [airavata.api.error.ttypes.InvalidRequestException, None], None, ),  # 1
    (2, TType.STRUCT, 'ace', [airavata.api.error.ttypes.AiravataClientException, None], None, ),  # 2
    (3, TType.STRUCT, 'ase', [airavata.api.error.ttypes.AiravataSystemException, None], None, ),  # 3
    (4, TType.STRUCT, 'ae', [airavata.api.error.ttypes.AuthorizationException, None], None, ),  # 4
)


class registerReplicaLocation_args(object):
    """
    Attributes:
     - authzToken
     - replicaLocationModel

    """


    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)
all_structs.append(registerReplicaLocation_args)
registerReplicaLocation_args.thrift_spec = (
    None,  # 0
    (1, TType.STRUCT, 'authzToken', [airavata.model.security.ttypes.AuthzToken, None], None, ),  # 1
    (2, TType.STRUCT, 'replicaLocationModel', [airavata.model.data.replica.ttypes.DataReplicaLocationModel, None], None, ),  # 2
)


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

    """


    def __init__(self, success=None, ire=None, ace=None, ase=None, ae=None,):
        self.success = success
        self.ire = ire
        self.ace = ace
        self.ase = ase
        self.ae = ae

    def read(self, iprot):
        if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None:
            iprot._fast_decode(self, iprot, [self.__class__, 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', errors='replace') 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.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 2:
                if ftype == TType.STRUCT:
                    self.ace = airavata.api.error.ttypes.AiravataClientException.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 3:
                if ftype == TType.STRUCT:
                    self.ase = airavata.api.error.ttypes.AiravataSystemException.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 4:
                if ftype == TType.STRUCT:
                    self.ae = airavata.api.error.ttypes.AuthorizationException.read(iprot)
                else:
                    iprot.skip(ftype)
            else:
                iprot.skip(ftype)
            iprot.readFieldEnd()
        iprot.readStructEnd()

    def write(self, oprot):
        if oprot._fast_encode is 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)
all_structs.append(registerReplicaLocation_result)
registerReplicaLocation_result.thrift_spec = (
    (0, TType.STRING, 'success', 'UTF8', None, ),  # 0
    (1, TType.STRUCT, 'ire', [airavata.api.error.ttypes.InvalidRequestException, None], None, ),  # 1
    (2, TType.STRUCT, 'ace', [airavata.api.error.ttypes.AiravataClientException, None], None, ),  # 2
    (3, TType.STRUCT, 'ase', [airavata.api.error.ttypes.AiravataSystemException, None], None, ),  # 3
    (4, TType.STRUCT, 'ae', [airavata.api.error.ttypes.AuthorizationException, None], None, ),  # 4
)


class getParentDataProduct_args(object):
    """
    Attributes:
     - authzToken
     - productUri

    """


    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', errors='replace') if sys.version_info[0] == 2 else iprot.readString()
                else:
                    iprot.skip(ftype)
            else:
                iprot.skip(ftype)
            iprot.readFieldEnd()
        iprot.readStructEnd()

    def write(self, oprot):
        if oprot._fast_encode is not None and self.thrift_spec is not None:
            oprot.trans.write(oprot._fast_encode(self, [self.__class__, self.thrift_spec]))
            return
        oprot.writeStructBegin('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)
all_structs.append(getParentDataProduct_args)
getParentDataProduct_args.thrift_spec = (
    None,  # 0
    (1, TType.STRUCT, 'authzToken', [airavata.model.security.ttypes.AuthzToken, None], None, ),  # 1
    (2, TType.STRING, 'productUri', 'UTF8', None, ),  # 2
)


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

    """


    def __init__(self, success=None, ire=None, ace=None, ase=None, ae=None,):
        self.success = success
        self.ire = ire
        self.ace = ace
        self.ase = ase
        self.ae = ae

    def read(self, iprot):
        if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None:
            iprot._fast_decode(self, iprot, [self.__class__, 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.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 2:
                if ftype == TType.STRUCT:
                    self.ace = airavata.api.error.ttypes.AiravataClientException.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 3:
                if ftype == TType.STRUCT:
                    self.ase = airavata.api.error.ttypes.AiravataSystemException.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 4:
                if ftype == TType.STRUCT:
                    self.ae = airavata.api.error.ttypes.AuthorizationException.read(iprot)
                else:
                    iprot.skip(ftype)
            else:
                iprot.skip(ftype)
            iprot.readFieldEnd()
        iprot.readStructEnd()

    def write(self, oprot):
        if oprot._fast_encode is 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)
all_structs.append(getParentDataProduct_result)
getParentDataProduct_result.thrift_spec = (
    (0, TType.STRUCT, 'success', [airavata.model.data.replica.ttypes.DataProductModel, None], None, ),  # 0
    (1, TType.STRUCT, 'ire', [airavata.api.error.ttypes.InvalidRequestException, None], None, ),  # 1
    (2, TType.STRUCT, 'ace', [airavata.api.error.ttypes.AiravataClientException, None], None, ),  # 2
    (3, TType.STRUCT, 'ase', [airavata.api.error.ttypes.AiravataSystemException, None], None, ),  # 3
    (4, TType.STRUCT, 'ae', [airavata.api.error.ttypes.AuthorizationException, None], None, ),  # 4
)


class getChildDataProducts_args(object):
    """
    Attributes:
     - authzToken
     - productUri

    """


    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', errors='replace') if sys.version_info[0] == 2 else iprot.readString()
                else:
                    iprot.skip(ftype)
            else:
                iprot.skip(ftype)
            iprot.readFieldEnd()
        iprot.readStructEnd()

    def write(self, oprot):
        if oprot._fast_encode is not None and self.thrift_spec is not None:
            oprot.trans.write(oprot._fast_encode(self, [self.__class__, self.thrift_spec]))
            return
        oprot.writeStructBegin('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)
all_structs.append(getChildDataProducts_args)
getChildDataProducts_args.thrift_spec = (
    None,  # 0
    (1, TType.STRUCT, 'authzToken', [airavata.model.security.ttypes.AuthzToken, None], None, ),  # 1
    (2, TType.STRING, 'productUri', 'UTF8', None, ),  # 2
)


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

    """


    def __init__(self, success=None, ire=None, ace=None, ase=None, ae=None,):
        self.success = success
        self.ire = ire
        self.ace = ace
        self.ase = ase
        self.ae = ae

    def read(self, iprot):
        if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None:
            iprot._fast_decode(self, iprot, [self.__class__, 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.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 2:
                if ftype == TType.STRUCT:
                    self.ace = airavata.api.error.ttypes.AiravataClientException.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 3:
                if ftype == TType.STRUCT:
                    self.ase = airavata.api.error.ttypes.AiravataSystemException.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 4:
                if ftype == TType.STRUCT:
                    self.ae = airavata.api.error.ttypes.AuthorizationException.read(iprot)
                else:
                    iprot.skip(ftype)
            else:
                iprot.skip(ftype)
            iprot.readFieldEnd()
        iprot.readStructEnd()

    def write(self, oprot):
        if oprot._fast_encode is 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)
all_structs.append(getChildDataProducts_result)
getChildDataProducts_result.thrift_spec = (
    (0, TType.LIST, 'success', (TType.STRUCT, [airavata.model.data.replica.ttypes.DataProductModel, None], False), None, ),  # 0
    (1, TType.STRUCT, 'ire', [airavata.api.error.ttypes.InvalidRequestException, None], None, ),  # 1
    (2, TType.STRUCT, 'ace', [airavata.api.error.ttypes.AiravataClientException, None], None, ),  # 2
    (3, TType.STRUCT, 'ase', [airavata.api.error.ttypes.AiravataSystemException, None], None, ),  # 3
    (4, TType.STRUCT, 'ae', [airavata.api.error.ttypes.AuthorizationException, None], None, ),  # 4
)


class shareResourceWithUsers_args(object):
    """
    Attributes:
     - authzToken
     - resourceId
     - userPermissionList

    """


    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', errors='replace') 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', errors='replace') 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)
all_structs.append(shareResourceWithUsers_args)
shareResourceWithUsers_args.thrift_spec = (
    None,  # 0
    (1, TType.STRUCT, 'authzToken', [airavata.model.security.ttypes.AuthzToken, None], None, ),  # 1
    (2, TType.STRING, 'resourceId', 'UTF8', None, ),  # 2
    None,  # 3
    (4, TType.MAP, 'userPermissionList', (TType.STRING, 'UTF8', TType.I32, None, False), None, ),  # 4
)


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

    """


    def __init__(self, success=None, ire=None, ace=None, ase=None, ae=None,):
        self.success = success
        self.ire = ire
        self.ace = ace
        self.ase = ase
        self.ae = ae

    def read(self, iprot):
        if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None:
            iprot._fast_decode(self, iprot, [self.__class__, 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.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 2:
                if ftype == TType.STRUCT:
                    self.ace = airavata.api.error.ttypes.AiravataClientException.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 3:
                if ftype == TType.STRUCT:
                    self.ase = airavata.api.error.ttypes.AiravataSystemException.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 4:
                if ftype == TType.STRUCT:
                    self.ae = airavata.api.error.ttypes.AuthorizationException.read(iprot)
                else:
                    iprot.skip(ftype)
            else:
                iprot.skip(ftype)
            iprot.readFieldEnd()
        iprot.readStructEnd()

    def write(self, oprot):
        if oprot._fast_encode is 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)
all_structs.append(shareResourceWithUsers_result)
shareResourceWithUsers_result.thrift_spec = (
    (0, TType.BOOL, 'success', None, None, ),  # 0
    (1, TType.STRUCT, 'ire', [airavata.api.error.ttypes.InvalidRequestException, None], None, ),  # 1
    (2, TType.STRUCT, 'ace', [airavata.api.error.ttypes.AiravataClientException, None], None, ),  # 2
    (3, TType.STRUCT, 'ase', [airavata.api.error.ttypes.AiravataSystemException, None], None, ),  # 3
    (4, TType.STRUCT, 'ae', [airavata.api.error.ttypes.AuthorizationException, None], None, ),  # 4
)


class shareResourceWithGroups_args(object):
    """
    Attributes:
     - authzToken
     - resourceId
     - groupPermissionList

    """


    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', errors='replace') 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', errors='replace') 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)
all_structs.append(shareResourceWithGroups_args)
shareResourceWithGroups_args.thrift_spec = (
    None,  # 0
    (1, TType.STRUCT, 'authzToken', [airavata.model.security.ttypes.AuthzToken, None], None, ),  # 1
    (2, TType.STRING, 'resourceId', 'UTF8', None, ),  # 2
    None,  # 3
    (4, TType.MAP, 'groupPermissionList', (TType.STRING, 'UTF8', TType.I32, None, False), None, ),  # 4
)


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

    """


    def __init__(self, success=None, ire=None, ace=None, ase=None, ae=None,):
        self.success = success
        self.ire = ire
        self.ace = ace
        self.ase = ase
        self.ae = ae

    def read(self, iprot):
        if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None:
            iprot._fast_decode(self, iprot, [self.__class__, 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.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 2:
                if ftype == TType.STRUCT:
                    self.ace = airavata.api.error.ttypes.AiravataClientException.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 3:
                if ftype == TType.STRUCT:
                    self.ase = airavata.api.error.ttypes.AiravataSystemException.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 4:
                if ftype == TType.STRUCT:
                    self.ae = airavata.api.error.ttypes.AuthorizationException.read(iprot)
                else:
                    iprot.skip(ftype)
            else:
                iprot.skip(ftype)
            iprot.readFieldEnd()
        iprot.readStructEnd()

    def write(self, oprot):
        if oprot._fast_encode is 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)
all_structs.append(shareResourceWithGroups_result)
shareResourceWithGroups_result.thrift_spec = (
    (0, TType.BOOL, 'success', None, None, ),  # 0
    (1, TType.STRUCT, 'ire', [airavata.api.error.ttypes.InvalidRequestException, None], None, ),  # 1
    (2, TType.STRUCT, 'ace', [airavata.api.error.ttypes.AiravataClientException, None], None, ),  # 2
    (3, TType.STRUCT, 'ase', [airavata.api.error.ttypes.AiravataSystemException, None], None, ),  # 3
    (4, TType.STRUCT, 'ae', [airavata.api.error.ttypes.AuthorizationException, None], None, ),  # 4
)


class revokeSharingOfResourceFromUsers_args(object):
    """
    Attributes:
     - authzToken
     - resourceId
     - userPermissionList

    """


    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', errors='replace') 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', errors='replace') 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)
all_structs.append(revokeSharingOfResourceFromUsers_args)
revokeSharingOfResourceFromUsers_args.thrift_spec = (
    None,  # 0
    (1, TType.STRUCT, 'authzToken', [airavata.model.security.ttypes.AuthzToken, None], None, ),  # 1
    (2, TType.STRING, 'resourceId', 'UTF8', None, ),  # 2
    None,  # 3
    (4, TType.MAP, 'userPermissionList', (TType.STRING, 'UTF8', TType.I32, None, False), None, ),  # 4
)


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

    """


    def __init__(self, success=None, ire=None, ace=None, ase=None, ae=None,):
        self.success = success
        self.ire = ire
        self.ace = ace
        self.ase = ase
        self.ae = ae

    def read(self, iprot):
        if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None:
            iprot._fast_decode(self, iprot, [self.__class__, 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.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 2:
                if ftype == TType.STRUCT:
                    self.ace = airavata.api.error.ttypes.AiravataClientException.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 3:
                if ftype == TType.STRUCT:
                    self.ase = airavata.api.error.ttypes.AiravataSystemException.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 4:
                if ftype == TType.STRUCT:
                    self.ae = airavata.api.error.ttypes.AuthorizationException.read(iprot)
                else:
                    iprot.skip(ftype)
            else:
                iprot.skip(ftype)
            iprot.readFieldEnd()
        iprot.readStructEnd()

    def write(self, oprot):
        if oprot._fast_encode is 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)
all_structs.append(revokeSharingOfResourceFromUsers_result)
revokeSharingOfResourceFromUsers_result.thrift_spec = (
    (0, TType.BOOL, 'success', None, None, ),  # 0
    (1, TType.STRUCT, 'ire', [airavata.api.error.ttypes.InvalidRequestException, None], None, ),  # 1
    (2, TType.STRUCT, 'ace', [airavata.api.error.ttypes.AiravataClientException, None], None, ),  # 2
    (3, TType.STRUCT, 'ase', [airavata.api.error.ttypes.AiravataSystemException, None], None, ),  # 3
    (4, TType.STRUCT, 'ae', [airavata.api.error.ttypes.AuthorizationException, None], None, ),  # 4
)


class revokeSharingOfResourceFromGroups_args(object):
    """
    Attributes:
     - authzToken
     - resourceId
     - groupPermissionList

    """


    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', errors='replace') 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', errors='replace') 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)
all_structs.append(revokeSharingOfResourceFromGroups_args)
revokeSharingOfResourceFromGroups_args.thrift_spec = (
    None,  # 0
    (1, TType.STRUCT, 'authzToken', [airavata.model.security.ttypes.AuthzToken, None], None, ),  # 1
    (2, TType.STRING, 'resourceId', 'UTF8', None, ),  # 2
    None,  # 3
    (4, TType.MAP, 'groupPermissionList', (TType.STRING, 'UTF8', TType.I32, None, False), None, ),  # 4
)


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

    """


    def __init__(self, success=None, ire=None, ace=None, ase=None, ae=None,):
        self.success = success
        self.ire = ire
        self.ace = ace
        self.ase = ase
        self.ae = ae

    def read(self, iprot):
        if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None:
            iprot._fast_decode(self, iprot, [self.__class__, 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.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 2:
                if ftype == TType.STRUCT:
                    self.ace = airavata.api.error.ttypes.AiravataClientException.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 3:
                if ftype == TType.STRUCT:
                    self.ase = airavata.api.error.ttypes.AiravataSystemException.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 4:
                if ftype == TType.STRUCT:
                    self.ae = airavata.api.error.ttypes.AuthorizationException.read(iprot)
                else:
                    iprot.skip(ftype)
            else:
                iprot.skip(ftype)
            iprot.readFieldEnd()
        iprot.readStructEnd()

    def write(self, oprot):
        if oprot._fast_encode is 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)
all_structs.append(revokeSharingOfResourceFromGroups_result)
revokeSharingOfResourceFromGroups_result.thrift_spec = (
    (0, TType.BOOL, 'success', None, None, ),  # 0
    (1, TType.STRUCT, 'ire', [airavata.api.error.ttypes.InvalidRequestException, None], None, ),  # 1
    (2, TType.STRUCT, 'ace', [airavata.api.error.ttypes.AiravataClientException, None], None, ),  # 2
    (3, TType.STRUCT, 'ase', [airavata.api.error.ttypes.AiravataSystemException, None], None, ),  # 3
    (4, TType.STRUCT, 'ae', [airavata.api.error.ttypes.AuthorizationException, None], None, ),  # 4
)


class getAllAccessibleUsers_args(object):
    """
    Attributes:
     - authzToken
     - resourceId
     - permissionType

    """


    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', errors='replace') 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)
all_structs.append(getAllAccessibleUsers_args)
getAllAccessibleUsers_args.thrift_spec = (
    None,  # 0
    (1, TType.STRUCT, 'authzToken', [airavata.model.security.ttypes.AuthzToken, None], None, ),  # 1
    (2, TType.STRING, 'resourceId', 'UTF8', None, ),  # 2
    None,  # 3
    (4, TType.I32, 'permissionType', None, None, ),  # 4
)


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

    """


    def __init__(self, success=None, ire=None, ace=None, ase=None, ae=None,):
        self.success = success
        self.ire = ire
        self.ace = ace
        self.ase = ase
        self.ae = ae

    def read(self, iprot):
        if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None:
            iprot._fast_decode(self, iprot, [self.__class__, 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', errors='replace') 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.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 2:
                if ftype == TType.STRUCT:
                    self.ace = airavata.api.error.ttypes.AiravataClientException.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 3:
                if ftype == TType.STRUCT:
                    self.ase = airavata.api.error.ttypes.AiravataSystemException.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 4:
                if ftype == TType.STRUCT:
                    self.ae = airavata.api.error.ttypes.AuthorizationException.read(iprot)
                else:
                    iprot.skip(ftype)
            else:
                iprot.skip(ftype)
            iprot.readFieldEnd()
        iprot.readStructEnd()

    def write(self, oprot):
        if oprot._fast_encode is 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)
all_structs.append(getAllAccessibleUsers_result)
getAllAccessibleUsers_result.thrift_spec = (
    (0, TType.LIST, 'success', (TType.STRING, 'UTF8', False), None, ),  # 0
    (1, TType.STRUCT, 'ire', [airavata.api.error.ttypes.InvalidRequestException, None], None, ),  # 1
    (2, TType.STRUCT, 'ace', [airavata.api.error.ttypes.AiravataClientException, None], None, ),  # 2
    (3, TType.STRUCT, 'ase', [airavata.api.error.ttypes.AiravataSystemException, None], None, ),  # 3
    (4, TType.STRUCT, 'ae', [airavata.api.error.ttypes.AuthorizationException, None], None, ),  # 4
)


class getAllAccessibleGroups_args(object):
    """
    Attributes:
     - authzToken
     - resourceId
     - permissionType

    """


    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', errors='replace') 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)
all_structs.append(getAllAccessibleGroups_args)
getAllAccessibleGroups_args.thrift_spec = (
    None,  # 0
    (1, TType.STRUCT, 'authzToken', [airavata.model.security.ttypes.AuthzToken, None], None, ),  # 1
    (2, TType.STRING, 'resourceId', 'UTF8', None, ),  # 2
    None,  # 3
    (4, TType.I32, 'permissionType', None, None, ),  # 4
)


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

    """


    def __init__(self, success=None, ire=None, ace=None, ase=None, ae=None,):
        self.success = success
        self.ire = ire
        self.ace = ace
        self.ase = ase
        self.ae = ae

    def read(self, iprot):
        if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None:
            iprot._fast_decode(self, iprot, [self.__class__, 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', errors='replace') 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.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 2:
                if ftype == TType.STRUCT:
                    self.ace = airavata.api.error.ttypes.AiravataClientException.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 3:
                if ftype == TType.STRUCT:
                    self.ase = airavata.api.error.ttypes.AiravataSystemException.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 4:
                if ftype == TType.STRUCT:
                    self.ae = airavata.api.error.ttypes.AuthorizationException.read(iprot)
                else:
                    iprot.skip(ftype)
            else:
                iprot.skip(ftype)
            iprot.readFieldEnd()
        iprot.readStructEnd()

    def write(self, oprot):
        if oprot._fast_encode is 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)
all_structs.append(getAllAccessibleGroups_result)
getAllAccessibleGroups_result.thrift_spec = (
    (0, TType.LIST, 'success', (TType.STRING, 'UTF8', False), None, ),  # 0
    (1, TType.STRUCT, 'ire', [airavata.api.error.ttypes.InvalidRequestException, None], None, ),  # 1
    (2, TType.STRUCT, 'ace', [airavata.api.error.ttypes.AiravataClientException, None], None, ),  # 2
    (3, TType.STRUCT, 'ase', [airavata.api.error.ttypes.AiravataSystemException, None], None, ),  # 3
    (4, TType.STRUCT, 'ae', [airavata.api.error.ttypes.AuthorizationException, None], None, ),  # 4
)


class getAllDirectlyAccessibleUsers_args(object):
    """
    Attributes:
     - authzToken
     - resourceId
     - permissionType

    """


    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', errors='replace') 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)
all_structs.append(getAllDirectlyAccessibleUsers_args)
getAllDirectlyAccessibleUsers_args.thrift_spec = (
    None,  # 0
    (1, TType.STRUCT, 'authzToken', [airavata.model.security.ttypes.AuthzToken, None], None, ),  # 1
    (2, TType.STRING, 'resourceId', 'UTF8', None, ),  # 2
    None,  # 3
    (4, TType.I32, 'permissionType', None, None, ),  # 4
)


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

    """


    def __init__(self, success=None, ire=None, ace=None, ase=None, ae=None,):
        self.success = success
        self.ire = ire
        self.ace = ace
        self.ase = ase
        self.ae = ae

    def read(self, iprot):
        if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None:
            iprot._fast_decode(self, iprot, [self.__class__, 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', errors='replace') 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.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 2:
                if ftype == TType.STRUCT:
                    self.ace = airavata.api.error.ttypes.AiravataClientException.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 3:
                if ftype == TType.STRUCT:
                    self.ase = airavata.api.error.ttypes.AiravataSystemException.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 4:
                if ftype == TType.STRUCT:
                    self.ae = airavata.api.error.ttypes.AuthorizationException.read(iprot)
                else:
                    iprot.skip(ftype)
            else:
                iprot.skip(ftype)
            iprot.readFieldEnd()
        iprot.readStructEnd()

    def write(self, oprot):
        if oprot._fast_encode is 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)
all_structs.append(getAllDirectlyAccessibleUsers_result)
getAllDirectlyAccessibleUsers_result.thrift_spec = (
    (0, TType.LIST, 'success', (TType.STRING, 'UTF8', False), None, ),  # 0
    (1, TType.STRUCT, 'ire', [airavata.api.error.ttypes.InvalidRequestException, None], None, ),  # 1
    (2, TType.STRUCT, 'ace', [airavata.api.error.ttypes.AiravataClientException, None], None, ),  # 2
    (3, TType.STRUCT, 'ase', [airavata.api.error.ttypes.AiravataSystemException, None], None, ),  # 3
    (4, TType.STRUCT, 'ae', [airavata.api.error.ttypes.AuthorizationException, None], None, ),  # 4
)


class getAllDirectlyAccessibleGroups_args(object):
    """
    Attributes:
     - authzToken
     - resourceId
     - permissionType

    """


    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', errors='replace') 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)
all_structs.append(getAllDirectlyAccessibleGroups_args)
getAllDirectlyAccessibleGroups_args.thrift_spec = (
    None,  # 0
    (1, TType.STRUCT, 'authzToken', [airavata.model.security.ttypes.AuthzToken, None], None, ),  # 1
    (2, TType.STRING, 'resourceId', 'UTF8', None, ),  # 2
    None,  # 3
    (4, TType.I32, 'permissionType', None, None, ),  # 4
)


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

    """


    def __init__(self, success=None, ire=None, ace=None, ase=None, ae=None,):
        self.success = success
        self.ire = ire
        self.ace = ace
        self.ase = ase
        self.ae = ae

    def read(self, iprot):
        if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None:
            iprot._fast_decode(self, iprot, [self.__class__, 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', errors='replace') 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.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 2:
                if ftype == TType.STRUCT:
                    self.ace = airavata.api.error.ttypes.AiravataClientException.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 3:
                if ftype == TType.STRUCT:
                    self.ase = airavata.api.error.ttypes.AiravataSystemException.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 4:
                if ftype == TType.STRUCT:
                    self.ae = airavata.api.error.ttypes.AuthorizationException.read(iprot)
                else:
                    iprot.skip(ftype)
            else:
                iprot.skip(ftype)
            iprot.readFieldEnd()
        iprot.readStructEnd()

    def write(self, oprot):
        if oprot._fast_encode is 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)
all_structs.append(getAllDirectlyAccessibleGroups_result)
getAllDirectlyAccessibleGroups_result.thrift_spec = (
    (0, TType.LIST, 'success', (TType.STRING, 'UTF8', False), None, ),  # 0
    (1, TType.STRUCT, 'ire', [airavata.api.error.ttypes.InvalidRequestException, None], None, ),  # 1
    (2, TType.STRUCT, 'ace', [airavata.api.error.ttypes.AiravataClientException, None], None, ),  # 2
    (3, TType.STRUCT, 'ase', [airavata.api.error.ttypes.AiravataSystemException, None], None, ),  # 3
    (4, TType.STRUCT, 'ae', [airavata.api.error.ttypes.AuthorizationException, None], None, ),  # 4
)


class userHasAccess_args(object):
    """
    Attributes:
     - authzToken
     - resourceId
     - permissionType

    """


    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', errors='replace') 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)
all_structs.append(userHasAccess_args)
userHasAccess_args.thrift_spec = (
    None,  # 0
    (1, TType.STRUCT, 'authzToken', [airavata.model.security.ttypes.AuthzToken, None], None, ),  # 1
    (2, TType.STRING, 'resourceId', 'UTF8', None, ),  # 2
    (3, TType.I32, 'permissionType', None, None, ),  # 3
)


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

    """


    def __init__(self, success=None, ire=None, ace=None, ase=None, ae=None,):
        self.success = success
        self.ire = ire
        self.ace = ace
        self.ase = ase
        self.ae = ae

    def read(self, iprot):
        if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None:
            iprot._fast_decode(self, iprot, [self.__class__, 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.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 2:
                if ftype == TType.STRUCT:
                    self.ace = airavata.api.error.ttypes.AiravataClientException.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 3:
                if ftype == TType.STRUCT:
                    self.ase = airavata.api.error.ttypes.AiravataSystemException.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 4:
                if ftype == TType.STRUCT:
                    self.ae = airavata.api.error.ttypes.AuthorizationException.read(iprot)
                else:
                    iprot.skip(ftype)
            else:
                iprot.skip(ftype)
            iprot.readFieldEnd()
        iprot.readStructEnd()

    def write(self, oprot):
        if oprot._fast_encode is 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)
all_structs.append(userHasAccess_result)
userHasAccess_result.thrift_spec = (
    (0, TType.BOOL, 'success', None, None, ),  # 0
    (1, TType.STRUCT, 'ire', [airavata.api.error.ttypes.InvalidRequestException, None], None, ),  # 1
    (2, TType.STRUCT, 'ace', [airavata.api.error.ttypes.AiravataClientException, None], None, ),  # 2
    (3, TType.STRUCT, 'ase', [airavata.api.error.ttypes.AiravataSystemException, None], None, ),  # 3
    (4, TType.STRUCT, 'ae', [airavata.api.error.ttypes.AuthorizationException, None], None, ),  # 4
)


class createGroupResourceProfile_args(object):
    """
    Attributes:
     - authzToken
     - groupResourceProfile

    """


    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)
all_structs.append(createGroupResourceProfile_args)
createGroupResourceProfile_args.thrift_spec = (
    None,  # 0
    (1, TType.STRUCT, 'authzToken', [airavata.model.security.ttypes.AuthzToken, None], None, ),  # 1
    (2, TType.STRUCT, 'groupResourceProfile', [airavata.model.appcatalog.groupresourceprofile.ttypes.GroupResourceProfile, None], None, ),  # 2
)


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

    """


    def __init__(self, success=None, ire=None, ace=None, ase=None, ae=None,):
        self.success = success
        self.ire = ire
        self.ace = ace
        self.ase = ase
        self.ae = ae

    def read(self, iprot):
        if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None:
            iprot._fast_decode(self, iprot, [self.__class__, 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', errors='replace') 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.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 2:
                if ftype == TType.STRUCT:
                    self.ace = airavata.api.error.ttypes.AiravataClientException.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 3:
                if ftype == TType.STRUCT:
                    self.ase = airavata.api.error.ttypes.AiravataSystemException.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 4:
                if ftype == TType.STRUCT:
                    self.ae = airavata.api.error.ttypes.AuthorizationException.read(iprot)
                else:
                    iprot.skip(ftype)
            else:
                iprot.skip(ftype)
            iprot.readFieldEnd()
        iprot.readStructEnd()

    def write(self, oprot):
        if oprot._fast_encode is 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)
all_structs.append(createGroupResourceProfile_result)
createGroupResourceProfile_result.thrift_spec = (
    (0, TType.STRING, 'success', 'UTF8', None, ),  # 0
    (1, TType.STRUCT, 'ire', [airavata.api.error.ttypes.InvalidRequestException, None], None, ),  # 1
    (2, TType.STRUCT, 'ace', [airavata.api.error.ttypes.AiravataClientException, None], None, ),  # 2
    (3, TType.STRUCT, 'ase', [airavata.api.error.ttypes.AiravataSystemException, None], None, ),  # 3
    (4, TType.STRUCT, 'ae', [airavata.api.error.ttypes.AuthorizationException, None], None, ),  # 4
)


class updateGroupResourceProfile_args(object):
    """
    Attributes:
     - authzToken
     - groupResourceProfile

    """


    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)
all_structs.append(updateGroupResourceProfile_args)
updateGroupResourceProfile_args.thrift_spec = (
    None,  # 0
    (1, TType.STRUCT, 'authzToken', [airavata.model.security.ttypes.AuthzToken, None], None, ),  # 1
    (2, TType.STRUCT, 'groupResourceProfile', [airavata.model.appcatalog.groupresourceprofile.ttypes.GroupResourceProfile, None], None, ),  # 2
)


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

    """


    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.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 2:
                if ftype == TType.STRUCT:
                    self.ace = airavata.api.error.ttypes.AiravataClientException.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 3:
                if ftype == TType.STRUCT:
                    self.ase = airavata.api.error.ttypes.AiravataSystemException.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 4:
                if ftype == TType.STRUCT:
                    self.ae = airavata.api.error.ttypes.AuthorizationException.read(iprot)
                else:
                    iprot.skip(ftype)
            else:
                iprot.skip(ftype)
            iprot.readFieldEnd()
        iprot.readStructEnd()

    def write(self, oprot):
        if oprot._fast_encode is 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)
all_structs.append(updateGroupResourceProfile_result)
updateGroupResourceProfile_result.thrift_spec = (
    None,  # 0
    (1, TType.STRUCT, 'ire', [airavata.api.error.ttypes.InvalidRequestException, None], None, ),  # 1
    (2, TType.STRUCT, 'ace', [airavata.api.error.ttypes.AiravataClientException, None], None, ),  # 2
    (3, TType.STRUCT, 'ase', [airavata.api.error.ttypes.AiravataSystemException, None], None, ),  # 3
    (4, TType.STRUCT, 'ae', [airavata.api.error.ttypes.AuthorizationException, None], None, ),  # 4
)


class getGroupResourceProfile_args(object):
    """
    Attributes:
     - authzToken
     - groupResourceProfileId

    """


    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', errors='replace') if sys.version_info[0] == 2 else iprot.readString()
                else:
                    iprot.skip(ftype)
            else:
                iprot.skip(ftype)
            iprot.readFieldEnd()
        iprot.readStructEnd()

    def write(self, oprot):
        if oprot._fast_encode is not None and self.thrift_spec is not None:
            oprot.trans.write(oprot._fast_encode(self, [self.__class__, self.thrift_spec]))
            return
        oprot.writeStructBegin('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)
all_structs.append(getGroupResourceProfile_args)
getGroupResourceProfile_args.thrift_spec = (
    None,  # 0
    (1, TType.STRUCT, 'authzToken', [airavata.model.security.ttypes.AuthzToken, None], None, ),  # 1
    (2, TType.STRING, 'groupResourceProfileId', 'UTF8', None, ),  # 2
)


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

    """


    def __init__(self, success=None, ire=None, ace=None, ase=None, ae=None,):
        self.success = success
        self.ire = ire
        self.ace = ace
        self.ase = ase
        self.ae = ae

    def read(self, iprot):
        if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None:
            iprot._fast_decode(self, iprot, [self.__class__, 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.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 2:
                if ftype == TType.STRUCT:
                    self.ace = airavata.api.error.ttypes.AiravataClientException.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 3:
                if ftype == TType.STRUCT:
                    self.ase = airavata.api.error.ttypes.AiravataSystemException.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 4:
                if ftype == TType.STRUCT:
                    self.ae = airavata.api.error.ttypes.AuthorizationException.read(iprot)
                else:
                    iprot.skip(ftype)
            else:
                iprot.skip(ftype)
            iprot.readFieldEnd()
        iprot.readStructEnd()

    def write(self, oprot):
        if oprot._fast_encode is 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)
all_structs.append(getGroupResourceProfile_result)
getGroupResourceProfile_result.thrift_spec = (
    (0, TType.STRUCT, 'success', [airavata.model.appcatalog.groupresourceprofile.ttypes.GroupResourceProfile, None], None, ),  # 0
    (1, TType.STRUCT, 'ire', [airavata.api.error.ttypes.InvalidRequestException, None], None, ),  # 1
    (2, TType.STRUCT, 'ace', [airavata.api.error.ttypes.AiravataClientException, None], None, ),  # 2
    (3, TType.STRUCT, 'ase', [airavata.api.error.ttypes.AiravataSystemException, None], None, ),  # 3
    (4, TType.STRUCT, 'ae', [airavata.api.error.ttypes.AuthorizationException, None], None, ),  # 4
)


class removeGroupResourceProfile_args(object):
    """
    Attributes:
     - authzToken
     - groupResourceProfileId

    """


    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', errors='replace') if sys.version_info[0] == 2 else iprot.readString()
                else:
                    iprot.skip(ftype)
            else:
                iprot.skip(ftype)
            iprot.readFieldEnd()
        iprot.readStructEnd()

    def write(self, oprot):
        if oprot._fast_encode is not None and self.thrift_spec is not None:
            oprot.trans.write(oprot._fast_encode(self, [self.__class__, self.thrift_spec]))
            return
        oprot.writeStructBegin('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)
all_structs.append(removeGroupResourceProfile_args)
removeGroupResourceProfile_args.thrift_spec = (
    None,  # 0
    (1, TType.STRUCT, 'authzToken', [airavata.model.security.ttypes.AuthzToken, None], None, ),  # 1
    (2, TType.STRING, 'groupResourceProfileId', 'UTF8', None, ),  # 2
)


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

    """


    def __init__(self, success=None, ire=None, ace=None, ase=None, ae=None,):
        self.success = success
        self.ire = ire
        self.ace = ace
        self.ase = ase
        self.ae = ae

    def read(self, iprot):
        if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None:
            iprot._fast_decode(self, iprot, [self.__class__, 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.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 2:
                if ftype == TType.STRUCT:
                    self.ace = airavata.api.error.ttypes.AiravataClientException.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 3:
                if ftype == TType.STRUCT:
                    self.ase = airavata.api.error.ttypes.AiravataSystemException.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 4:
                if ftype == TType.STRUCT:
                    self.ae = airavata.api.error.ttypes.AuthorizationException.read(iprot)
                else:
                    iprot.skip(ftype)
            else:
                iprot.skip(ftype)
            iprot.readFieldEnd()
        iprot.readStructEnd()

    def write(self, oprot):
        if oprot._fast_encode is 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)
all_structs.append(removeGroupResourceProfile_result)
removeGroupResourceProfile_result.thrift_spec = (
    (0, TType.BOOL, 'success', None, None, ),  # 0
    (1, TType.STRUCT, 'ire', [airavata.api.error.ttypes.InvalidRequestException, None], None, ),  # 1
    (2, TType.STRUCT, 'ace', [airavata.api.error.ttypes.AiravataClientException, None], None, ),  # 2
    (3, TType.STRUCT, 'ase', [airavata.api.error.ttypes.AiravataSystemException, None], None, ),  # 3
    (4, TType.STRUCT, 'ae', [airavata.api.error.ttypes.AuthorizationException, None], None, ),  # 4
)


class getGroupResourceList_args(object):
    """
    Attributes:
     - authzToken
     - gatewayId

    """


    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', errors='replace') if sys.version_info[0] == 2 else iprot.readString()
                else:
                    iprot.skip(ftype)
            else:
                iprot.skip(ftype)
            iprot.readFieldEnd()
        iprot.readStructEnd()

    def write(self, oprot):
        if oprot._fast_encode is not None and self.thrift_spec is not None:
            oprot.trans.write(oprot._fast_encode(self, [self.__class__, self.thrift_spec]))
            return
        oprot.writeStructBegin('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)
all_structs.append(getGroupResourceList_args)
getGroupResourceList_args.thrift_spec = (
    None,  # 0
    (1, TType.STRUCT, 'authzToken', [airavata.model.security.ttypes.AuthzToken, None], None, ),  # 1
    (2, TType.STRING, 'gatewayId', 'UTF8', None, ),  # 2
)


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

    """


    def __init__(self, success=None, ire=None, ace=None, ase=None, ae=None,):
        self.success = success
        self.ire = ire
        self.ace = ace
        self.ase = ase
        self.ae = ae

    def read(self, iprot):
        if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None:
            iprot._fast_decode(self, iprot, [self.__class__, 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.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 2:
                if ftype == TType.STRUCT:
                    self.ace = airavata.api.error.ttypes.AiravataClientException.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 3:
                if ftype == TType.STRUCT:
                    self.ase = airavata.api.error.ttypes.AiravataSystemException.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 4:
                if ftype == TType.STRUCT:
                    self.ae = airavata.api.error.ttypes.AuthorizationException.read(iprot)
                else:
                    iprot.skip(ftype)
            else:
                iprot.skip(ftype)
            iprot.readFieldEnd()
        iprot.readStructEnd()

    def write(self, oprot):
        if oprot._fast_encode is 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)
all_structs.append(getGroupResourceList_result)
getGroupResourceList_result.thrift_spec = (
    (0, TType.LIST, 'success', (TType.STRUCT, [airavata.model.appcatalog.groupresourceprofile.ttypes.GroupResourceProfile, None], False), None, ),  # 0
    (1, TType.STRUCT, 'ire', [airavata.api.error.ttypes.InvalidRequestException, None], None, ),  # 1
    (2, TType.STRUCT, 'ace', [airavata.api.error.ttypes.AiravataClientException, None], None, ),  # 2
    (3, TType.STRUCT, 'ase', [airavata.api.error.ttypes.AiravataSystemException, None], None, ),  # 3
    (4, TType.STRUCT, 'ae', [airavata.api.error.ttypes.AuthorizationException, None], None, ),  # 4
)


class removeGroupComputePrefs_args(object):
    """
    Attributes:
     - authzToken
     - computeResourceId
     - groupResourceProfileId

    """


    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', errors='replace') if sys.version_info[0] == 2 else iprot.readString()
                else:
                    iprot.skip(ftype)
            elif fid == 3:
                if ftype == TType.STRING:
                    self.groupResourceProfileId = iprot.readString().decode('utf-8', errors='replace') if sys.version_info[0] == 2 else iprot.readString()
                else:
                    iprot.skip(ftype)
            else:
                iprot.skip(ftype)
            iprot.readFieldEnd()
        iprot.readStructEnd()

    def write(self, oprot):
        if oprot._fast_encode is 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)
all_structs.append(removeGroupComputePrefs_args)
removeGroupComputePrefs_args.thrift_spec = (
    None,  # 0
    (1, TType.STRUCT, 'authzToken', [airavata.model.security.ttypes.AuthzToken, None], None, ),  # 1
    (2, TType.STRING, 'computeResourceId', 'UTF8', None, ),  # 2
    (3, TType.STRING, 'groupResourceProfileId', 'UTF8', None, ),  # 3
)


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

    """


    def __init__(self, success=None, ire=None, ace=None, ase=None, ae=None,):
        self.success = success
        self.ire = ire
        self.ace = ace
        self.ase = ase
        self.ae = ae

    def read(self, iprot):
        if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None:
            iprot._fast_decode(self, iprot, [self.__class__, 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.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 2:
                if ftype == TType.STRUCT:
                    self.ace = airavata.api.error.ttypes.AiravataClientException.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 3:
                if ftype == TType.STRUCT:
                    self.ase = airavata.api.error.ttypes.AiravataSystemException.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 4:
                if ftype == TType.STRUCT:
                    self.ae = airavata.api.error.ttypes.AuthorizationException.read(iprot)
                else:
                    iprot.skip(ftype)
            else:
                iprot.skip(ftype)
            iprot.readFieldEnd()
        iprot.readStructEnd()

    def write(self, oprot):
        if oprot._fast_encode is 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)
all_structs.append(removeGroupComputePrefs_result)
removeGroupComputePrefs_result.thrift_spec = (
    (0, TType.BOOL, 'success', None, None, ),  # 0
    (1, TType.STRUCT, 'ire', [airavata.api.error.ttypes.InvalidRequestException, None], None, ),  # 1
    (2, TType.STRUCT, 'ace', [airavata.api.error.ttypes.AiravataClientException, None], None, ),  # 2
    (3, TType.STRUCT, 'ase', [airavata.api.error.ttypes.AiravataSystemException, None], None, ),  # 3
    (4, TType.STRUCT, 'ae', [airavata.api.error.ttypes.AuthorizationException, None], None, ),  # 4
)


class removeGroupComputeResourcePolicy_args(object):
    """
    Attributes:
     - authzToken
     - resourcePolicyId

    """


    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', errors='replace') if sys.version_info[0] == 2 else iprot.readString()
                else:
                    iprot.skip(ftype)
            else:
                iprot.skip(ftype)
            iprot.readFieldEnd()
        iprot.readStructEnd()

    def write(self, oprot):
        if oprot._fast_encode is not None and self.thrift_spec is not None:
            oprot.trans.write(oprot._fast_encode(self, [self.__class__, self.thrift_spec]))
            return
        oprot.writeStructBegin('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)
all_structs.append(removeGroupComputeResourcePolicy_args)
removeGroupComputeResourcePolicy_args.thrift_spec = (
    None,  # 0
    (1, TType.STRUCT, 'authzToken', [airavata.model.security.ttypes.AuthzToken, None], None, ),  # 1
    (2, TType.STRING, 'resourcePolicyId', 'UTF8', None, ),  # 2
)


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

    """


    def __init__(self, success=None, ire=None, ace=None, ase=None, ae=None,):
        self.success = success
        self.ire = ire
        self.ace = ace
        self.ase = ase
        self.ae = ae

    def read(self, iprot):
        if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None:
            iprot._fast_decode(self, iprot, [self.__class__, 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.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 2:
                if ftype == TType.STRUCT:
                    self.ace = airavata.api.error.ttypes.AiravataClientException.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 3:
                if ftype == TType.STRUCT:
                    self.ase = airavata.api.error.ttypes.AiravataSystemException.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 4:
                if ftype == TType.STRUCT:
                    self.ae = airavata.api.error.ttypes.AuthorizationException.read(iprot)
                else:
                    iprot.skip(ftype)
            else:
                iprot.skip(ftype)
            iprot.readFieldEnd()
        iprot.readStructEnd()

    def write(self, oprot):
        if oprot._fast_encode is 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)
all_structs.append(removeGroupComputeResourcePolicy_result)
removeGroupComputeResourcePolicy_result.thrift_spec = (
    (0, TType.BOOL, 'success', None, None, ),  # 0
    (1, TType.STRUCT, 'ire', [airavata.api.error.ttypes.InvalidRequestException, None], None, ),  # 1
    (2, TType.STRUCT, 'ace', [airavata.api.error.ttypes.AiravataClientException, None], None, ),  # 2
    (3, TType.STRUCT, 'ase', [airavata.api.error.ttypes.AiravataSystemException, None], None, ),  # 3
    (4, TType.STRUCT, 'ae', [airavata.api.error.ttypes.AuthorizationException, None], None, ),  # 4
)


class removeGroupBatchQueueResourcePolicy_args(object):
    """
    Attributes:
     - authzToken
     - resourcePolicyId

    """


    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', errors='replace') if sys.version_info[0] == 2 else iprot.readString()
                else:
                    iprot.skip(ftype)
            else:
                iprot.skip(ftype)
            iprot.readFieldEnd()
        iprot.readStructEnd()

    def write(self, oprot):
        if oprot._fast_encode is not None and self.thrift_spec is not None:
            oprot.trans.write(oprot._fast_encode(self, [self.__class__, self.thrift_spec]))
            return
        oprot.writeStructBegin('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)
all_structs.append(removeGroupBatchQueueResourcePolicy_args)
removeGroupBatchQueueResourcePolicy_args.thrift_spec = (
    None,  # 0
    (1, TType.STRUCT, 'authzToken', [airavata.model.security.ttypes.AuthzToken, None], None, ),  # 1
    (2, TType.STRING, 'resourcePolicyId', 'UTF8', None, ),  # 2
)


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

    """


    def __init__(self, success=None, ire=None, ace=None, ase=None, ae=None,):
        self.success = success
        self.ire = ire
        self.ace = ace
        self.ase = ase
        self.ae = ae

    def read(self, iprot):
        if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None:
            iprot._fast_decode(self, iprot, [self.__class__, 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.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 2:
                if ftype == TType.STRUCT:
                    self.ace = airavata.api.error.ttypes.AiravataClientException.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 3:
                if ftype == TType.STRUCT:
                    self.ase = airavata.api.error.ttypes.AiravataSystemException.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 4:
                if ftype == TType.STRUCT:
                    self.ae = airavata.api.error.ttypes.AuthorizationException.read(iprot)
                else:
                    iprot.skip(ftype)
            else:
                iprot.skip(ftype)
            iprot.readFieldEnd()
        iprot.readStructEnd()

    def write(self, oprot):
        if oprot._fast_encode is 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)
all_structs.append(removeGroupBatchQueueResourcePolicy_result)
removeGroupBatchQueueResourcePolicy_result.thrift_spec = (
    (0, TType.BOOL, 'success', None, None, ),  # 0
    (1, TType.STRUCT, 'ire', [airavata.api.error.ttypes.InvalidRequestException, None], None, ),  # 1
    (2, TType.STRUCT, 'ace', [airavata.api.error.ttypes.AiravataClientException, None], None, ),  # 2
    (3, TType.STRUCT, 'ase', [airavata.api.error.ttypes.AiravataSystemException, None], None, ),  # 3
    (4, TType.STRUCT, 'ae', [airavata.api.error.ttypes.AuthorizationException, None], None, ),  # 4
)


class getGroupComputeResourcePreference_args(object):
    """
    Attributes:
     - authzToken
     - computeResourceId
     - groupResourceProfileId

    """


    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', errors='replace') if sys.version_info[0] == 2 else iprot.readString()
                else:
                    iprot.skip(ftype)
            elif fid == 3:
                if ftype == TType.STRING:
                    self.groupResourceProfileId = iprot.readString().decode('utf-8', errors='replace') if sys.version_info[0] == 2 else iprot.readString()
                else:
                    iprot.skip(ftype)
            else:
                iprot.skip(ftype)
            iprot.readFieldEnd()
        iprot.readStructEnd()

    def write(self, oprot):
        if oprot._fast_encode is 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)
all_structs.append(getGroupComputeResourcePreference_args)
getGroupComputeResourcePreference_args.thrift_spec = (
    None,  # 0
    (1, TType.STRUCT, 'authzToken', [airavata.model.security.ttypes.AuthzToken, None], None, ),  # 1
    (2, TType.STRING, 'computeResourceId', 'UTF8', None, ),  # 2
    (3, TType.STRING, 'groupResourceProfileId', 'UTF8', None, ),  # 3
)


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

    """


    def __init__(self, success=None, ire=None, ace=None, ase=None, ae=None,):
        self.success = success
        self.ire = ire
        self.ace = ace
        self.ase = ase
        self.ae = ae

    def read(self, iprot):
        if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None:
            iprot._fast_decode(self, iprot, [self.__class__, 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.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 2:
                if ftype == TType.STRUCT:
                    self.ace = airavata.api.error.ttypes.AiravataClientException.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 3:
                if ftype == TType.STRUCT:
                    self.ase = airavata.api.error.ttypes.AiravataSystemException.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 4:
                if ftype == TType.STRUCT:
                    self.ae = airavata.api.error.ttypes.AuthorizationException.read(iprot)
                else:
                    iprot.skip(ftype)
            else:
                iprot.skip(ftype)
            iprot.readFieldEnd()
        iprot.readStructEnd()

    def write(self, oprot):
        if oprot._fast_encode is 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)
all_structs.append(getGroupComputeResourcePreference_result)
getGroupComputeResourcePreference_result.thrift_spec = (
    (0, TType.STRUCT, 'success', [airavata.model.appcatalog.groupresourceprofile.ttypes.GroupComputeResourcePreference, None], None, ),  # 0
    (1, TType.STRUCT, 'ire', [airavata.api.error.ttypes.InvalidRequestException, None], None, ),  # 1
    (2, TType.STRUCT, 'ace', [airavata.api.error.ttypes.AiravataClientException, None], None, ),  # 2
    (3, TType.STRUCT, 'ase', [airavata.api.error.ttypes.AiravataSystemException, None], None, ),  # 3
    (4, TType.STRUCT, 'ae', [airavata.api.error.ttypes.AuthorizationException, None], None, ),  # 4
)


class getGroupComputeResourcePolicy_args(object):
    """
    Attributes:
     - authzToken
     - resourcePolicyId

    """


    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', errors='replace') if sys.version_info[0] == 2 else iprot.readString()
                else:
                    iprot.skip(ftype)
            else:
                iprot.skip(ftype)
            iprot.readFieldEnd()
        iprot.readStructEnd()

    def write(self, oprot):
        if oprot._fast_encode is not None and self.thrift_spec is not None:
            oprot.trans.write(oprot._fast_encode(self, [self.__class__, self.thrift_spec]))
            return
        oprot.writeStructBegin('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)
all_structs.append(getGroupComputeResourcePolicy_args)
getGroupComputeResourcePolicy_args.thrift_spec = (
    None,  # 0
    (1, TType.STRUCT, 'authzToken', [airavata.model.security.ttypes.AuthzToken, None], None, ),  # 1
    (2, TType.STRING, 'resourcePolicyId', 'UTF8', None, ),  # 2
)


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

    """


    def __init__(self, success=None, ire=None, ace=None, ase=None, ae=None,):
        self.success = success
        self.ire = ire
        self.ace = ace
        self.ase = ase
        self.ae = ae

    def read(self, iprot):
        if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None:
            iprot._fast_decode(self, iprot, [self.__class__, 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.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 2:
                if ftype == TType.STRUCT:
                    self.ace = airavata.api.error.ttypes.AiravataClientException.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 3:
                if ftype == TType.STRUCT:
                    self.ase = airavata.api.error.ttypes.AiravataSystemException.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 4:
                if ftype == TType.STRUCT:
                    self.ae = airavata.api.error.ttypes.AuthorizationException.read(iprot)
                else:
                    iprot.skip(ftype)
            else:
                iprot.skip(ftype)
            iprot.readFieldEnd()
        iprot.readStructEnd()

    def write(self, oprot):
        if oprot._fast_encode is 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)
all_structs.append(getGroupComputeResourcePolicy_result)
getGroupComputeResourcePolicy_result.thrift_spec = (
    (0, TType.STRUCT, 'success', [airavata.model.appcatalog.groupresourceprofile.ttypes.ComputeResourcePolicy, None], None, ),  # 0
    (1, TType.STRUCT, 'ire', [airavata.api.error.ttypes.InvalidRequestException, None], None, ),  # 1
    (2, TType.STRUCT, 'ace', [airavata.api.error.ttypes.AiravataClientException, None], None, ),  # 2
    (3, TType.STRUCT, 'ase', [airavata.api.error.ttypes.AiravataSystemException, None], None, ),  # 3
    (4, TType.STRUCT, 'ae', [airavata.api.error.ttypes.AuthorizationException, None], None, ),  # 4
)


class getBatchQueueResourcePolicy_args(object):
    """
    Attributes:
     - authzToken
     - resourcePolicyId

    """


    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', errors='replace') if sys.version_info[0] == 2 else iprot.readString()
                else:
                    iprot.skip(ftype)
            else:
                iprot.skip(ftype)
            iprot.readFieldEnd()
        iprot.readStructEnd()

    def write(self, oprot):
        if oprot._fast_encode is not None and self.thrift_spec is not None:
            oprot.trans.write(oprot._fast_encode(self, [self.__class__, self.thrift_spec]))
            return
        oprot.writeStructBegin('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)
all_structs.append(getBatchQueueResourcePolicy_args)
getBatchQueueResourcePolicy_args.thrift_spec = (
    None,  # 0
    (1, TType.STRUCT, 'authzToken', [airavata.model.security.ttypes.AuthzToken, None], None, ),  # 1
    (2, TType.STRING, 'resourcePolicyId', 'UTF8', None, ),  # 2
)


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

    """


    def __init__(self, success=None, ire=None, ace=None, ase=None, ae=None,):
        self.success = success
        self.ire = ire
        self.ace = ace
        self.ase = ase
        self.ae = ae

    def read(self, iprot):
        if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None:
            iprot._fast_decode(self, iprot, [self.__class__, 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.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 2:
                if ftype == TType.STRUCT:
                    self.ace = airavata.api.error.ttypes.AiravataClientException.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 3:
                if ftype == TType.STRUCT:
                    self.ase = airavata.api.error.ttypes.AiravataSystemException.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 4:
                if ftype == TType.STRUCT:
                    self.ae = airavata.api.error.ttypes.AuthorizationException.read(iprot)
                else:
                    iprot.skip(ftype)
            else:
                iprot.skip(ftype)
            iprot.readFieldEnd()
        iprot.readStructEnd()

    def write(self, oprot):
        if oprot._fast_encode is 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)
all_structs.append(getBatchQueueResourcePolicy_result)
getBatchQueueResourcePolicy_result.thrift_spec = (
    (0, TType.STRUCT, 'success', [airavata.model.appcatalog.groupresourceprofile.ttypes.BatchQueueResourcePolicy, None], None, ),  # 0
    (1, TType.STRUCT, 'ire', [airavata.api.error.ttypes.InvalidRequestException, None], None, ),  # 1
    (2, TType.STRUCT, 'ace', [airavata.api.error.ttypes.AiravataClientException, None], None, ),  # 2
    (3, TType.STRUCT, 'ase', [airavata.api.error.ttypes.AiravataSystemException, None], None, ),  # 3
    (4, TType.STRUCT, 'ae', [airavata.api.error.ttypes.AuthorizationException, None], None, ),  # 4
)


class getGroupComputeResourcePrefList_args(object):
    """
    Attributes:
     - authzToken
     - groupResourceProfileId

    """


    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', errors='replace') if sys.version_info[0] == 2 else iprot.readString()
                else:
                    iprot.skip(ftype)
            else:
                iprot.skip(ftype)
            iprot.readFieldEnd()
        iprot.readStructEnd()

    def write(self, oprot):
        if oprot._fast_encode is not None and self.thrift_spec is not None:
            oprot.trans.write(oprot._fast_encode(self, [self.__class__, self.thrift_spec]))
            return
        oprot.writeStructBegin('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)
all_structs.append(getGroupComputeResourcePrefList_args)
getGroupComputeResourcePrefList_args.thrift_spec = (
    None,  # 0
    (1, TType.STRUCT, 'authzToken', [airavata.model.security.ttypes.AuthzToken, None], None, ),  # 1
    (2, TType.STRING, 'groupResourceProfileId', 'UTF8', None, ),  # 2
)


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

    """


    def __init__(self, success=None, ire=None, ace=None, ase=None, ae=None,):
        self.success = success
        self.ire = ire
        self.ace = ace
        self.ase = ase
        self.ae = ae

    def read(self, iprot):
        if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None:
            iprot._fast_decode(self, iprot, [self.__class__, 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.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 2:
                if ftype == TType.STRUCT:
                    self.ace = airavata.api.error.ttypes.AiravataClientException.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 3:
                if ftype == TType.STRUCT:
                    self.ase = airavata.api.error.ttypes.AiravataSystemException.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 4:
                if ftype == TType.STRUCT:
                    self.ae = airavata.api.error.ttypes.AuthorizationException.read(iprot)
                else:
                    iprot.skip(ftype)
            else:
                iprot.skip(ftype)
            iprot.readFieldEnd()
        iprot.readStructEnd()

    def write(self, oprot):
        if oprot._fast_encode is 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)
all_structs.append(getGroupComputeResourcePrefList_result)
getGroupComputeResourcePrefList_result.thrift_spec = (
    (0, TType.LIST, 'success', (TType.STRUCT, [airavata.model.appcatalog.groupresourceprofile.ttypes.GroupComputeResourcePreference, None], False), None, ),  # 0
    (1, TType.STRUCT, 'ire', [airavata.api.error.ttypes.InvalidRequestException, None], None, ),  # 1
    (2, TType.STRUCT, 'ace', [airavata.api.error.ttypes.AiravataClientException, None], None, ),  # 2
    (3, TType.STRUCT, 'ase', [airavata.api.error.ttypes.AiravataSystemException, None], None, ),  # 3
    (4, TType.STRUCT, 'ae', [airavata.api.error.ttypes.AuthorizationException, None], None, ),  # 4
)


class getGroupBatchQueueResourcePolicyList_args(object):
    """
    Attributes:
     - authzToken
     - groupResourceProfileId

    """


    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', errors='replace') if sys.version_info[0] == 2 else iprot.readString()
                else:
                    iprot.skip(ftype)
            else:
                iprot.skip(ftype)
            iprot.readFieldEnd()
        iprot.readStructEnd()

    def write(self, oprot):
        if oprot._fast_encode is not None and self.thrift_spec is not None:
            oprot.trans.write(oprot._fast_encode(self, [self.__class__, self.thrift_spec]))
            return
        oprot.writeStructBegin('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)
all_structs.append(getGroupBatchQueueResourcePolicyList_args)
getGroupBatchQueueResourcePolicyList_args.thrift_spec = (
    None,  # 0
    (1, TType.STRUCT, 'authzToken', [airavata.model.security.ttypes.AuthzToken, None], None, ),  # 1
    (2, TType.STRING, 'groupResourceProfileId', 'UTF8', None, ),  # 2
)


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

    """


    def __init__(self, success=None, ire=None, ace=None, ase=None, ae=None,):
        self.success = success
        self.ire = ire
        self.ace = ace
        self.ase = ase
        self.ae = ae

    def read(self, iprot):
        if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None:
            iprot._fast_decode(self, iprot, [self.__class__, 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.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 2:
                if ftype == TType.STRUCT:
                    self.ace = airavata.api.error.ttypes.AiravataClientException.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 3:
                if ftype == TType.STRUCT:
                    self.ase = airavata.api.error.ttypes.AiravataSystemException.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 4:
                if ftype == TType.STRUCT:
                    self.ae = airavata.api.error.ttypes.AuthorizationException.read(iprot)
                else:
                    iprot.skip(ftype)
            else:
                iprot.skip(ftype)
            iprot.readFieldEnd()
        iprot.readStructEnd()

    def write(self, oprot):
        if oprot._fast_encode is 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)
all_structs.append(getGroupBatchQueueResourcePolicyList_result)
getGroupBatchQueueResourcePolicyList_result.thrift_spec = (
    (0, TType.LIST, 'success', (TType.STRUCT, [airavata.model.appcatalog.groupresourceprofile.ttypes.BatchQueueResourcePolicy, None], False), None, ),  # 0
    (1, TType.STRUCT, 'ire', [airavata.api.error.ttypes.InvalidRequestException, None], None, ),  # 1
    (2, TType.STRUCT, 'ace', [airavata.api.error.ttypes.AiravataClientException, None], None, ),  # 2
    (3, TType.STRUCT, 'ase', [airavata.api.error.ttypes.AiravataSystemException, None], None, ),  # 3
    (4, TType.STRUCT, 'ae', [airavata.api.error.ttypes.AuthorizationException, None], None, ),  # 4
)


class getGroupComputeResourcePolicyList_args(object):
    """
    Attributes:
     - authzToken
     - groupResourceProfileId

    """


    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', errors='replace') if sys.version_info[0] == 2 else iprot.readString()
                else:
                    iprot.skip(ftype)
            else:
                iprot.skip(ftype)
            iprot.readFieldEnd()
        iprot.readStructEnd()

    def write(self, oprot):
        if oprot._fast_encode is not None and self.thrift_spec is not None:
            oprot.trans.write(oprot._fast_encode(self, [self.__class__, self.thrift_spec]))
            return
        oprot.writeStructBegin('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)
all_structs.append(getGroupComputeResourcePolicyList_args)
getGroupComputeResourcePolicyList_args.thrift_spec = (
    None,  # 0
    (1, TType.STRUCT, 'authzToken', [airavata.model.security.ttypes.AuthzToken, None], None, ),  # 1
    (2, TType.STRING, 'groupResourceProfileId', 'UTF8', None, ),  # 2
)


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

    """


    def __init__(self, success=None, ire=None, ace=None, ase=None, ae=None,):
        self.success = success
        self.ire = ire
        self.ace = ace
        self.ase = ase
        self.ae = ae

    def read(self, iprot):
        if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None:
            iprot._fast_decode(self, iprot, [self.__class__, 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.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 2:
                if ftype == TType.STRUCT:
                    self.ace = airavata.api.error.ttypes.AiravataClientException.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 3:
                if ftype == TType.STRUCT:
                    self.ase = airavata.api.error.ttypes.AiravataSystemException.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 4:
                if ftype == TType.STRUCT:
                    self.ae = airavata.api.error.ttypes.AuthorizationException.read(iprot)
                else:
                    iprot.skip(ftype)
            else:
                iprot.skip(ftype)
            iprot.readFieldEnd()
        iprot.readStructEnd()

    def write(self, oprot):
        if oprot._fast_encode is 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)
all_structs.append(getGroupComputeResourcePolicyList_result)
getGroupComputeResourcePolicyList_result.thrift_spec = (
    (0, TType.LIST, 'success', (TType.STRUCT, [airavata.model.appcatalog.groupresourceprofile.ttypes.ComputeResourcePolicy, None], False), None, ),  # 0
    (1, TType.STRUCT, 'ire', [airavata.api.error.ttypes.InvalidRequestException, None], None, ),  # 1
    (2, TType.STRUCT, 'ace', [airavata.api.error.ttypes.AiravataClientException, None], None, ),  # 2
    (3, TType.STRUCT, 'ase', [airavata.api.error.ttypes.AiravataSystemException, None], None, ),  # 3
    (4, TType.STRUCT, 'ae', [airavata.api.error.ttypes.AuthorizationException, None], None, ),  # 4
)


class getGatewayGroups_args(object):
    """
    Attributes:
     - authzToken

    """


    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)
all_structs.append(getGatewayGroups_args)
getGatewayGroups_args.thrift_spec = (
    None,  # 0
    (1, TType.STRUCT, 'authzToken', [airavata.model.security.ttypes.AuthzToken, None], None, ),  # 1
)


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

    """


    def __init__(self, success=None, ire=None, ace=None, ase=None, ae=None,):
        self.success = success
        self.ire = ire
        self.ace = ace
        self.ase = ase
        self.ae = ae

    def read(self, iprot):
        if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None:
            iprot._fast_decode(self, iprot, [self.__class__, 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.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 2:
                if ftype == TType.STRUCT:
                    self.ace = airavata.api.error.ttypes.AiravataClientException.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 3:
                if ftype == TType.STRUCT:
                    self.ase = airavata.api.error.ttypes.AiravataSystemException.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 4:
                if ftype == TType.STRUCT:
                    self.ae = airavata.api.error.ttypes.AuthorizationException.read(iprot)
                else:
                    iprot.skip(ftype)
            else:
                iprot.skip(ftype)
            iprot.readFieldEnd()
        iprot.readStructEnd()

    def write(self, oprot):
        if oprot._fast_encode is 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)
all_structs.append(getGatewayGroups_result)
getGatewayGroups_result.thrift_spec = (
    (0, TType.STRUCT, 'success', [airavata.model.appcatalog.gatewaygroups.ttypes.GatewayGroups, None], None, ),  # 0
    (1, TType.STRUCT, 'ire', [airavata.api.error.ttypes.InvalidRequestException, None], None, ),  # 1
    (2, TType.STRUCT, 'ace', [airavata.api.error.ttypes.AiravataClientException, None], None, ),  # 2
    (3, TType.STRUCT, 'ase', [airavata.api.error.ttypes.AiravataSystemException, None], None, ),  # 3
    (4, TType.STRUCT, 'ae', [airavata.api.error.ttypes.AuthorizationException, None], None, ),  # 4
)


class getParser_args(object):
    """
    Attributes:
     - authzToken
     - parserId
     - gatewayId

    """


    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', errors='replace') 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', errors='replace') if sys.version_info[0] == 2 else iprot.readString()
                else:
                    iprot.skip(ftype)
            else:
                iprot.skip(ftype)
            iprot.readFieldEnd()
        iprot.readStructEnd()

    def write(self, oprot):
        if oprot._fast_encode is not None and self.thrift_spec is not None:
            oprot.trans.write(oprot._fast_encode(self, [self.__class__, self.thrift_spec]))
            return
        oprot.writeStructBegin('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)
all_structs.append(getParser_args)
getParser_args.thrift_spec = (
    None,  # 0
    (1, TType.STRUCT, 'authzToken', [airavata.model.security.ttypes.AuthzToken, None], None, ),  # 1
    (2, TType.STRING, 'parserId', 'UTF8', None, ),  # 2
    (3, TType.STRING, 'gatewayId', 'UTF8', None, ),  # 3
)


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

    """


    def __init__(self, success=None, ire=None, ace=None, ase=None, ae=None,):
        self.success = success
        self.ire = ire
        self.ace = ace
        self.ase = ase
        self.ae = ae

    def read(self, iprot):
        if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None:
            iprot._fast_decode(self, iprot, [self.__class__, 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.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 2:
                if ftype == TType.STRUCT:
                    self.ace = airavata.api.error.ttypes.AiravataClientException.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 3:
                if ftype == TType.STRUCT:
                    self.ase = airavata.api.error.ttypes.AiravataSystemException.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 4:
                if ftype == TType.STRUCT:
                    self.ae = airavata.api.error.ttypes.AuthorizationException.read(iprot)
                else:
                    iprot.skip(ftype)
            else:
                iprot.skip(ftype)
            iprot.readFieldEnd()
        iprot.readStructEnd()

    def write(self, oprot):
        if oprot._fast_encode is 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)
all_structs.append(getParser_result)
getParser_result.thrift_spec = (
    (0, TType.STRUCT, 'success', [airavata.model.appcatalog.parser.ttypes.Parser, None], None, ),  # 0
    (1, TType.STRUCT, 'ire', [airavata.api.error.ttypes.InvalidRequestException, None], None, ),  # 1
    (2, TType.STRUCT, 'ace', [airavata.api.error.ttypes.AiravataClientException, None], None, ),  # 2
    (3, TType.STRUCT, 'ase', [airavata.api.error.ttypes.AiravataSystemException, None], None, ),  # 3
    (4, TType.STRUCT, 'ae', [airavata.api.error.ttypes.AuthorizationException, None], None, ),  # 4
)


class saveParser_args(object):
    """
    Attributes:
     - authzToken
     - parser

    """


    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)
all_structs.append(saveParser_args)
saveParser_args.thrift_spec = (
    None,  # 0
    (1, TType.STRUCT, 'authzToken', [airavata.model.security.ttypes.AuthzToken, None], None, ),  # 1
    (2, TType.STRUCT, 'parser', [airavata.model.appcatalog.parser.ttypes.Parser, None], None, ),  # 2
)


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

    """


    def __init__(self, success=None, ire=None, ace=None, ase=None, ae=None,):
        self.success = success
        self.ire = ire
        self.ace = ace
        self.ase = ase
        self.ae = ae

    def read(self, iprot):
        if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None:
            iprot._fast_decode(self, iprot, [self.__class__, 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', errors='replace') 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.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 2:
                if ftype == TType.STRUCT:
                    self.ace = airavata.api.error.ttypes.AiravataClientException.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 3:
                if ftype == TType.STRUCT:
                    self.ase = airavata.api.error.ttypes.AiravataSystemException.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 4:
                if ftype == TType.STRUCT:
                    self.ae = airavata.api.error.ttypes.AuthorizationException.read(iprot)
                else:
                    iprot.skip(ftype)
            else:
                iprot.skip(ftype)
            iprot.readFieldEnd()
        iprot.readStructEnd()

    def write(self, oprot):
        if oprot._fast_encode is 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)
all_structs.append(saveParser_result)
saveParser_result.thrift_spec = (
    (0, TType.STRING, 'success', 'UTF8', None, ),  # 0
    (1, TType.STRUCT, 'ire', [airavata.api.error.ttypes.InvalidRequestException, None], None, ),  # 1
    (2, TType.STRUCT, 'ace', [airavata.api.error.ttypes.AiravataClientException, None], None, ),  # 2
    (3, TType.STRUCT, 'ase', [airavata.api.error.ttypes.AiravataSystemException, None], None, ),  # 3
    (4, TType.STRUCT, 'ae', [airavata.api.error.ttypes.AuthorizationException, None], None, ),  # 4
)


class listAllParsers_args(object):
    """
    Attributes:
     - authzToken
     - gatewayId

    """


    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', errors='replace') if sys.version_info[0] == 2 else iprot.readString()
                else:
                    iprot.skip(ftype)
            else:
                iprot.skip(ftype)
            iprot.readFieldEnd()
        iprot.readStructEnd()

    def write(self, oprot):
        if oprot._fast_encode is not None and self.thrift_spec is not None:
            oprot.trans.write(oprot._fast_encode(self, [self.__class__, self.thrift_spec]))
            return
        oprot.writeStructBegin('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)
all_structs.append(listAllParsers_args)
listAllParsers_args.thrift_spec = (
    None,  # 0
    (1, TType.STRUCT, 'authzToken', [airavata.model.security.ttypes.AuthzToken, None], None, ),  # 1
    (2, TType.STRING, 'gatewayId', 'UTF8', None, ),  # 2
)


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

    """


    def __init__(self, success=None, ire=None, ace=None, ase=None, ae=None,):
        self.success = success
        self.ire = ire
        self.ace = ace
        self.ase = ase
        self.ae = ae

    def read(self, iprot):
        if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None:
            iprot._fast_decode(self, iprot, [self.__class__, 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.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 2:
                if ftype == TType.STRUCT:
                    self.ace = airavata.api.error.ttypes.AiravataClientException.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 3:
                if ftype == TType.STRUCT:
                    self.ase = airavata.api.error.ttypes.AiravataSystemException.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 4:
                if ftype == TType.STRUCT:
                    self.ae = airavata.api.error.ttypes.AuthorizationException.read(iprot)
                else:
                    iprot.skip(ftype)
            else:
                iprot.skip(ftype)
            iprot.readFieldEnd()
        iprot.readStructEnd()

    def write(self, oprot):
        if oprot._fast_encode is 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)
all_structs.append(listAllParsers_result)
listAllParsers_result.thrift_spec = (
    (0, TType.LIST, 'success', (TType.STRUCT, [airavata.model.appcatalog.parser.ttypes.Parser, None], False), None, ),  # 0
    (1, TType.STRUCT, 'ire', [airavata.api.error.ttypes.InvalidRequestException, None], None, ),  # 1
    (2, TType.STRUCT, 'ace', [airavata.api.error.ttypes.AiravataClientException, None], None, ),  # 2
    (3, TType.STRUCT, 'ase', [airavata.api.error.ttypes.AiravataSystemException, None], None, ),  # 3
    (4, TType.STRUCT, 'ae', [airavata.api.error.ttypes.AuthorizationException, None], None, ),  # 4
)


class removeParser_args(object):
    """
    Attributes:
     - authzToken
     - parserId
     - gatewayId

    """


    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', errors='replace') 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', errors='replace') if sys.version_info[0] == 2 else iprot.readString()
                else:
                    iprot.skip(ftype)
            else:
                iprot.skip(ftype)
            iprot.readFieldEnd()
        iprot.readStructEnd()

    def write(self, oprot):
        if oprot._fast_encode is not None and self.thrift_spec is not None:
            oprot.trans.write(oprot._fast_encode(self, [self.__class__, self.thrift_spec]))
            return
        oprot.writeStructBegin('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)
all_structs.append(removeParser_args)
removeParser_args.thrift_spec = (
    None,  # 0
    (1, TType.STRUCT, 'authzToken', [airavata.model.security.ttypes.AuthzToken, None], None, ),  # 1
    (2, TType.STRING, 'parserId', 'UTF8', None, ),  # 2
    (3, TType.STRING, 'gatewayId', 'UTF8', None, ),  # 3
)


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

    """


    def __init__(self, success=None, ire=None, ace=None, ase=None, ae=None,):
        self.success = success
        self.ire = ire
        self.ace = ace
        self.ase = ase
        self.ae = ae

    def read(self, iprot):
        if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None:
            iprot._fast_decode(self, iprot, [self.__class__, 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.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 2:
                if ftype == TType.STRUCT:
                    self.ace = airavata.api.error.ttypes.AiravataClientException.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 3:
                if ftype == TType.STRUCT:
                    self.ase = airavata.api.error.ttypes.AiravataSystemException.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 4:
                if ftype == TType.STRUCT:
                    self.ae = airavata.api.error.ttypes.AuthorizationException.read(iprot)
                else:
                    iprot.skip(ftype)
            else:
                iprot.skip(ftype)
            iprot.readFieldEnd()
        iprot.readStructEnd()

    def write(self, oprot):
        if oprot._fast_encode is 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)
all_structs.append(removeParser_result)
removeParser_result.thrift_spec = (
    (0, TType.BOOL, 'success', None, None, ),  # 0
    (1, TType.STRUCT, 'ire', [airavata.api.error.ttypes.InvalidRequestException, None], None, ),  # 1
    (2, TType.STRUCT, 'ace', [airavata.api.error.ttypes.AiravataClientException, None], None, ),  # 2
    (3, TType.STRUCT, 'ase', [airavata.api.error.ttypes.AiravataSystemException, None], None, ),  # 3
    (4, TType.STRUCT, 'ae', [airavata.api.error.ttypes.AuthorizationException, None], None, ),  # 4
)


class getParsingTemplate_args(object):
    """
    Attributes:
     - authzToken
     - templateId
     - gatewayId

    """


    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', errors='replace') 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', errors='replace') if sys.version_info[0] == 2 else iprot.readString()
                else:
                    iprot.skip(ftype)
            else:
                iprot.skip(ftype)
            iprot.readFieldEnd()
        iprot.readStructEnd()

    def write(self, oprot):
        if oprot._fast_encode is not None and self.thrift_spec is not None:
            oprot.trans.write(oprot._fast_encode(self, [self.__class__, self.thrift_spec]))
            return
        oprot.writeStructBegin('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)
all_structs.append(getParsingTemplate_args)
getParsingTemplate_args.thrift_spec = (
    None,  # 0
    (1, TType.STRUCT, 'authzToken', [airavata.model.security.ttypes.AuthzToken, None], None, ),  # 1
    (2, TType.STRING, 'templateId', 'UTF8', None, ),  # 2
    (3, TType.STRING, 'gatewayId', 'UTF8', None, ),  # 3
)


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

    """


    def __init__(self, success=None, ire=None, ace=None, ase=None, ae=None,):
        self.success = success
        self.ire = ire
        self.ace = ace
        self.ase = ase
        self.ae = ae

    def read(self, iprot):
        if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None:
            iprot._fast_decode(self, iprot, [self.__class__, 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.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 2:
                if ftype == TType.STRUCT:
                    self.ace = airavata.api.error.ttypes.AiravataClientException.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 3:
                if ftype == TType.STRUCT:
                    self.ase = airavata.api.error.ttypes.AiravataSystemException.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 4:
                if ftype == TType.STRUCT:
                    self.ae = airavata.api.error.ttypes.AuthorizationException.read(iprot)
                else:
                    iprot.skip(ftype)
            else:
                iprot.skip(ftype)
            iprot.readFieldEnd()
        iprot.readStructEnd()

    def write(self, oprot):
        if oprot._fast_encode is 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)
all_structs.append(getParsingTemplate_result)
getParsingTemplate_result.thrift_spec = (
    (0, TType.STRUCT, 'success', [airavata.model.appcatalog.parser.ttypes.ParsingTemplate, None], None, ),  # 0
    (1, TType.STRUCT, 'ire', [airavata.api.error.ttypes.InvalidRequestException, None], None, ),  # 1
    (2, TType.STRUCT, 'ace', [airavata.api.error.ttypes.AiravataClientException, None], None, ),  # 2
    (3, TType.STRUCT, 'ase', [airavata.api.error.ttypes.AiravataSystemException, None], None, ),  # 3
    (4, TType.STRUCT, 'ae', [airavata.api.error.ttypes.AuthorizationException, None], None, ),  # 4
)


class getParsingTemplatesForExperiment_args(object):
    """
    Attributes:
     - authzToken
     - experimentId
     - gatewayId

    """


    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', errors='replace') 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', errors='replace') if sys.version_info[0] == 2 else iprot.readString()
                else:
                    iprot.skip(ftype)
            else:
                iprot.skip(ftype)
            iprot.readFieldEnd()
        iprot.readStructEnd()

    def write(self, oprot):
        if oprot._fast_encode is not None and self.thrift_spec is not None:
            oprot.trans.write(oprot._fast_encode(self, [self.__class__, self.thrift_spec]))
            return
        oprot.writeStructBegin('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)
all_structs.append(getParsingTemplatesForExperiment_args)
getParsingTemplatesForExperiment_args.thrift_spec = (
    None,  # 0
    (1, TType.STRUCT, 'authzToken', [airavata.model.security.ttypes.AuthzToken, None], None, ),  # 1
    (2, TType.STRING, 'experimentId', 'UTF8', None, ),  # 2
    (3, TType.STRING, 'gatewayId', 'UTF8', None, ),  # 3
)


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

    """


    def __init__(self, success=None, ire=None, ace=None, ase=None, ae=None,):
        self.success = success
        self.ire = ire
        self.ace = ace
        self.ase = ase
        self.ae = ae

    def read(self, iprot):
        if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None:
            iprot._fast_decode(self, iprot, [self.__class__, 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.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 2:
                if ftype == TType.STRUCT:
                    self.ace = airavata.api.error.ttypes.AiravataClientException.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 3:
                if ftype == TType.STRUCT:
                    self.ase = airavata.api.error.ttypes.AiravataSystemException.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 4:
                if ftype == TType.STRUCT:
                    self.ae = airavata.api.error.ttypes.AuthorizationException.read(iprot)
                else:
                    iprot.skip(ftype)
            else:
                iprot.skip(ftype)
            iprot.readFieldEnd()
        iprot.readStructEnd()

    def write(self, oprot):
        if oprot._fast_encode is 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)
all_structs.append(getParsingTemplatesForExperiment_result)
getParsingTemplatesForExperiment_result.thrift_spec = (
    (0, TType.LIST, 'success', (TType.STRUCT, [airavata.model.appcatalog.parser.ttypes.ParsingTemplate, None], False), None, ),  # 0
    (1, TType.STRUCT, 'ire', [airavata.api.error.ttypes.InvalidRequestException, None], None, ),  # 1
    (2, TType.STRUCT, 'ace', [airavata.api.error.ttypes.AiravataClientException, None], None, ),  # 2
    (3, TType.STRUCT, 'ase', [airavata.api.error.ttypes.AiravataSystemException, None], None, ),  # 3
    (4, TType.STRUCT, 'ae', [airavata.api.error.ttypes.AuthorizationException, None], None, ),  # 4
)


class saveParsingTemplate_args(object):
    """
    Attributes:
     - authzToken
     - parsingTemplate

    """


    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)
all_structs.append(saveParsingTemplate_args)
saveParsingTemplate_args.thrift_spec = (
    None,  # 0
    (1, TType.STRUCT, 'authzToken', [airavata.model.security.ttypes.AuthzToken, None], None, ),  # 1
    (2, TType.STRUCT, 'parsingTemplate', [airavata.model.appcatalog.parser.ttypes.ParsingTemplate, None], None, ),  # 2
)


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

    """


    def __init__(self, success=None, ire=None, ace=None, ase=None, ae=None,):
        self.success = success
        self.ire = ire
        self.ace = ace
        self.ase = ase
        self.ae = ae

    def read(self, iprot):
        if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None:
            iprot._fast_decode(self, iprot, [self.__class__, 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', errors='replace') 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.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 2:
                if ftype == TType.STRUCT:
                    self.ace = airavata.api.error.ttypes.AiravataClientException.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 3:
                if ftype == TType.STRUCT:
                    self.ase = airavata.api.error.ttypes.AiravataSystemException.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 4:
                if ftype == TType.STRUCT:
                    self.ae = airavata.api.error.ttypes.AuthorizationException.read(iprot)
                else:
                    iprot.skip(ftype)
            else:
                iprot.skip(ftype)
            iprot.readFieldEnd()
        iprot.readStructEnd()

    def write(self, oprot):
        if oprot._fast_encode is 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)
all_structs.append(saveParsingTemplate_result)
saveParsingTemplate_result.thrift_spec = (
    (0, TType.STRING, 'success', 'UTF8', None, ),  # 0
    (1, TType.STRUCT, 'ire', [airavata.api.error.ttypes.InvalidRequestException, None], None, ),  # 1
    (2, TType.STRUCT, 'ace', [airavata.api.error.ttypes.AiravataClientException, None], None, ),  # 2
    (3, TType.STRUCT, 'ase', [airavata.api.error.ttypes.AiravataSystemException, None], None, ),  # 3
    (4, TType.STRUCT, 'ae', [airavata.api.error.ttypes.AuthorizationException, None], None, ),  # 4
)


class removeParsingTemplate_args(object):
    """
    Attributes:
     - authzToken
     - templateId
     - gatewayId

    """


    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', errors='replace') 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', errors='replace') if sys.version_info[0] == 2 else iprot.readString()
                else:
                    iprot.skip(ftype)
            else:
                iprot.skip(ftype)
            iprot.readFieldEnd()
        iprot.readStructEnd()

    def write(self, oprot):
        if oprot._fast_encode is not None and self.thrift_spec is not None:
            oprot.trans.write(oprot._fast_encode(self, [self.__class__, self.thrift_spec]))
            return
        oprot.writeStructBegin('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)
all_structs.append(removeParsingTemplate_args)
removeParsingTemplate_args.thrift_spec = (
    None,  # 0
    (1, TType.STRUCT, 'authzToken', [airavata.model.security.ttypes.AuthzToken, None], None, ),  # 1
    (2, TType.STRING, 'templateId', 'UTF8', None, ),  # 2
    (3, TType.STRING, 'gatewayId', 'UTF8', None, ),  # 3
)


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

    """


    def __init__(self, success=None, ire=None, ace=None, ase=None, ae=None,):
        self.success = success
        self.ire = ire
        self.ace = ace
        self.ase = ase
        self.ae = ae

    def read(self, iprot):
        if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None:
            iprot._fast_decode(self, iprot, [self.__class__, 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.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 2:
                if ftype == TType.STRUCT:
                    self.ace = airavata.api.error.ttypes.AiravataClientException.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 3:
                if ftype == TType.STRUCT:
                    self.ase = airavata.api.error.ttypes.AiravataSystemException.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 4:
                if ftype == TType.STRUCT:
                    self.ae = airavata.api.error.ttypes.AuthorizationException.read(iprot)
                else:
                    iprot.skip(ftype)
            else:
                iprot.skip(ftype)
            iprot.readFieldEnd()
        iprot.readStructEnd()

    def write(self, oprot):
        if oprot._fast_encode is 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)
all_structs.append(removeParsingTemplate_result)
removeParsingTemplate_result.thrift_spec = (
    (0, TType.BOOL, 'success', None, None, ),  # 0
    (1, TType.STRUCT, 'ire', [airavata.api.error.ttypes.InvalidRequestException, None], None, ),  # 1
    (2, TType.STRUCT, 'ace', [airavata.api.error.ttypes.AiravataClientException, None], None, ),  # 2
    (3, TType.STRUCT, 'ase', [airavata.api.error.ttypes.AiravataSystemException, None], None, ),  # 3
    (4, TType.STRUCT, 'ae', [airavata.api.error.ttypes.AuthorizationException, None], None, ),  # 4
)


class listAllParsingTemplates_args(object):
    """
    Attributes:
     - authzToken
     - gatewayId

    """


    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', errors='replace') if sys.version_info[0] == 2 else iprot.readString()
                else:
                    iprot.skip(ftype)
            else:
                iprot.skip(ftype)
            iprot.readFieldEnd()
        iprot.readStructEnd()

    def write(self, oprot):
        if oprot._fast_encode is not None and self.thrift_spec is not None:
            oprot.trans.write(oprot._fast_encode(self, [self.__class__, self.thrift_spec]))
            return
        oprot.writeStructBegin('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)
all_structs.append(listAllParsingTemplates_args)
listAllParsingTemplates_args.thrift_spec = (
    None,  # 0
    (1, TType.STRUCT, 'authzToken', [airavata.model.security.ttypes.AuthzToken, None], None, ),  # 1
    (2, TType.STRING, 'gatewayId', 'UTF8', None, ),  # 2
)


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

    """


    def __init__(self, success=None, ire=None, ace=None, ase=None, ae=None,):
        self.success = success
        self.ire = ire
        self.ace = ace
        self.ase = ase
        self.ae = ae

    def read(self, iprot):
        if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None:
            iprot._fast_decode(self, iprot, [self.__class__, 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.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 2:
                if ftype == TType.STRUCT:
                    self.ace = airavata.api.error.ttypes.AiravataClientException.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 3:
                if ftype == TType.STRUCT:
                    self.ase = airavata.api.error.ttypes.AiravataSystemException.read(iprot)
                else:
                    iprot.skip(ftype)
            elif fid == 4:
                if ftype == TType.STRUCT:
                    self.ae = airavata.api.error.ttypes.AuthorizationException.read(iprot)
                else:
                    iprot.skip(ftype)
            else:
                iprot.skip(ftype)
            iprot.readFieldEnd()
        iprot.readStructEnd()

    def write(self, oprot):
        if oprot._fast_encode is 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)
all_structs.append(listAllParsingTemplates_result)
listAllParsingTemplates_result.thrift_spec = (
    (0, TType.LIST, 'success', (TType.STRUCT, [airavata.model.appcatalog.parser.ttypes.ParsingTemplate, None], False), None, ),  # 0
    (1, TType.STRUCT, 'ire', [airavata.api.error.ttypes.InvalidRequestException, None], None, ),  # 1
    (2, TType.STRUCT, 'ace', [airavata.api.error.ttypes.AiravataClientException, None], None, ),  # 2
    (3, TType.STRUCT, 'ase', [airavata.api.error.ttypes.AiravataSystemException, None], None, ),  # 3
    (4, TType.STRUCT, 'ae', [airavata.api.error.ttypes.AuthorizationException, None], None, ),  # 4
)
fix_spec(all_structs)
del all_structs
