API class that contains the function to execute Airavata experiment
diff --git a/cwl-workflows/api.py b/cwl-workflows/api.py
new file mode 100644
index 0000000..887e2c6
--- /dev/null
+++ b/cwl-workflows/api.py
@@ -0,0 +1,89 @@
+# API for Jupyter Notebook client
+
+from apache.airavata.model.workspace.ttypes import *
+from apache.airavata.model.experiment.ttypes import *
+
+from thrift.protocol import TBinaryProtocol
+from thrift.transport import TSSLSocket
+from thrift.transport import TTransport
+
+from apache.airavata.api import Airavata
+from apache.airavata.model.security.ttypes import AuthzToken
+
+
+def get_transport(hostname, port):
+ """Create a socket to the Airavata Server
+
+ :param hostname: Hostname of Airavata server
+ :param port: Port of Airavata server
+ :return: Transport object
+ """
+ # TODO: validate server certificate
+ transport = TSSLSocket.TSSLSocket(hostname, port, validate=False)
+ # Use Buffered Protocol to speedup over raw sockets
+ transport = TTransport.TBufferedTransport(transport)
+ return transport
+
+
+def get_airavata_client(transport):
+ """Creates and returns airavata client object
+
+ :param transport: Transport object
+ :return: AiravataClient object
+ """
+ # Airavata currently uses Binary Protocol
+ protocol = TBinaryProtocol.TBinaryProtocol(transport)
+
+ # Create a Airavata client to use the protocol encoder
+ airavataClient = Airavata.Client(protocol)
+ return airavataClient
+
+
+def get_authz_token(token, gateway_id, user_name):
+ """Creates and returns a authorization token
+
+ :param token: Token string
+ :param gateway_id: Gateway ID
+ :param user_name: User name of the user
+ :return: AuthzToken object
+ """
+ return AuthzToken(accessToken=token, claimsMap={'gatewayID': gateway_id, 'userName': user_name})
+
+
+def launch_experiment(hostname, port, user_name, token_string, experiment_id, gateway_id):
+ """Launches an experiment identified by an experiment id
+
+ :param hostname: Hostname of the host where experiment is to be executed
+ :param port: Port of the host where experiment is to be executed
+ :param user_name: Airavata user
+ :param token_string: Access token passed as a string
+ :param experiment_id: ID of the experiment that needs to be executed
+ :param gateway_id: ID of the gateway where the experiment needs to be executed
+ """
+ transport = get_transport(hostname, port)
+ transport.open()
+ airavata_client = get_airavata_client(transport)
+ auth_token = get_authz_token(token_string, gateway_id, user_name)
+ airavata_client.launchExperiment(auth_token, experiment_id, gateway_id)
+ transport.close()
+
+
+def create_experiment(hostname, port, token_string, gateway_id, project_id, user_name, experiment_name):
+ """Creates an experiment in Airavata
+
+ :param hostname: Host name of the Airavata server
+ :param port: Port number of the Airavata server
+ :param token_string: Token string
+ :param gateway_id: Gateway ID
+ :param project_id: Project ID
+ :param user_name: Name of the user
+ :param experiment_name: Name of the experiment
+ :return: Experiment ID
+ """
+ transport = get_transport(hostname, port)
+ transport.open()
+ airavata_client = get_airavata_client(transport)
+ auth_token = get_authz_token(token_string, gateway_id, user_name)
+ experiment_model = ExperimentModel(projectId=project_id, gatewayId=gateway_id,
+ userName=user_name, experimentName=experiment_name)
+ return airavata_client.createExperiment(auth_token, gateway_id, experiment_model)