Apache Airavata Thrift Interfaces - README
Licensed under Apache License 2.0 - http://www.apache.org/licenses/LICENSE-2.0
--------------------------------------------------------------------------------

This file describes the organization of Apache Airavata Thrift Interfaces and Data Model



Airavata Data Model:

Gateway
  |- Application Catalog
  |   |- Application Interface Descriptions
  |   |- Application Deployment Descriptions
  |   |- Computational Host Descriptions
  |   |- Workflow Templates
  |
  |- Groups (Groups is explicitly defined with a set of users within it)
  |   |-Users
  |
  |-Workspace
  |   |- User
  |   |   |- Group Ids (A user can be in one or more groups)
  |   |   |-Project
  |   |   |   |- Experiment
  |   |   |   |   |- Summary (Derived Information)
  |   |   |   |   |- Name
  |   |   |   |   |- Description
  |   |   |   |   |- Application/Workflow Template Id
  |   |   |   |   |- Workflow Instance Id
  |   |   |   |   |- User Configuration Data
  |   |   |   |   |   |- Scheduling Information
  |   |   |   |   |   |- Quality of Service Parameters
  |   |   |   |   |- Experiment Inputs
  |   |   |   |   |- Experiment Outputs
  |   |   |   |   |- Experiment Status
  |   |   |   |   |- Workflow Nodes
  |   |   |   |   |   |- Node Inputs
  |   |   |   |   |   |- Node Outputs
  |   |   |   |   |   |- Node Status
  |   |   |   |   |   |- Tasks
  |   |   |   |   |   |   |- Application Id
  |   |   |   |   |   |   |- Application Inputs
  |   |   |   |   |   |   |- Application Outputs
  |   |   |   |   |   |- Intermediate Data
  |   |   |   |   |   |- Final Output Data
  |   |   |   |   |- Experiment Errors
  |   |   |   |   |   |- User Friendly Message
  |   |   |   |   |   |- Raw Exception
  |   |   |   |   |   |- Error Category
  |   |   |   |   |   |- Actionable Information (what action can be taken and by one of End User, Gateway Admins, Airavata Admins)
  |   |   |   |   |   |- Error Category




