[Agora-System](/sqedw7tHRye1RoAt5O108A) --- [API](/TreDITwVTiK_KRemt9QOLA) --- [Message Sequences](/AUbhB5KxSb2jQJBloKtC1g) --- [Asset (Proposal)](/cICGuug-Tde1sGuvpsBAJQ) --- [PoC Definition](/aSqmHZ4uRW-iC9N_Pesd5g) --- [Old Stuff](/B4Nn8Zn9RVyGJDk4bHYHbw) --- [Demo](/rAv27FvBQXmv_rLpKQB25w)
# AGORA PoC v0.2 | API
[toc]
## API Versioning
At some point, there should exist an APi Version based on the path structure (`/v1/keeper` …).
:::info
*All Components*
:::
:::warning
all comonents should advertise themselves honestly e.g. via User-Agent-Headers
:::
**API**
*incoming*
| method | path | description | comment |
| ------ | ----- | --------------- | ------- |
| GET | /cert | get Certificate | :white_circle: |
| GET | /parents | Get Components at Level $n-1$ | :x: |
| POST | /register | receive registrations of Components in Level $n+1$ | :recycle:
| POST | /unregister | receive deregistrations of Components from Level $n+1$ | :x:
| GET | /type | get component type | ( :heavy_check_mark: )
| GET | /version | get version |( :heavy_check_mark: )
| GET | /config | get configuration | implements [Component Metadata](https://hackmd.io/sqedw7tHRye1RoAt5O108A?both#Component-Metadata) :question:
*Ban Rules* :soon:
| method | path | description | comment |
| ------ | ----- | --------------- | ------- |
| GET | /banrules | get all Ban Rules |
| POST | /banrules | add a new Ban Rule |
| GET | /banrules/:id | get specific ban Rule |
| PATCH | /banrules/:id | update specific ban rule |
| DELETE | /banrules/:id | delete specific ban rule |
+ [x] Get Certificate
+ [x] Get Components at Level $n-1$
+ names from https://en.wikipedia.org/wiki/XPath#Axis_specifiers
+ [x] receive registrations of Components in Level $n+1$
+ [x] receive deregistrations of Components from Level $n+1$
+ [x] get version
+ [x] get configuration
+ includes
+ get list of all API Methods
+ [x] Manage Ban-Rule List (CRUD)
*outgoing*
+ Register self in component with Level $n-1$
+ Unregister self from component with Level $n-1$
+ needs to be advertised to components in Level $n+1$
**CLI**
+ Create self
+ Kill self
+ Change Affiliation to Level $n-1$ component
:::info
*Level 0*
:::
## Keeper
All paths for Keeper-specific are prefixed by /keeper
**Core API**
+ [x] List Level1 Components
| method | path | description | comment |
| ------ | ----- | --------------- | ------- |
| GET | /keeper/components | List Level1 Components | |
| GET | /keeper/components/marketplaces | List Marketplaces | List only the Marketplaces registered in the current keeper
| GET | /keeper/components/marketplaces/:id | List one specific Marketplace | List only the Marketplace with ID:id in the current keeper |
| GET | /keeper/components/searchengines | List Search Engines | |
| GET | /keeper/components/searchengines/:id | List Search Engine with id | |
**Physical API** :soon:
+ join logical keeper
+ leave logical keeper
+ synchronize component lists
| method | path | description | comment |
| ------ | ----- | --------------- | ------- |
| GET | /keeper/logical/ | Get logical keeper info||
| POST | /keeper/logical/ | Join logical keeper||
| DELETE | /keeper/logical | Leave logical keeper||
| GET | /keeper/ | Join logical keeper||
**Discovery API (optional)**
+ add keeper to list of other logical keepers
+ list known logical keepers
+ get marketplaces of other logical keepers
+ get search engine of other logical keepers
+ get keepers of children
| method | path | description | comment |
| ------ | ----- | --------------- | ------- |
|
:::info
*Level 1*
:::
## Marketplace
**Core API**
+ List Level2 Components
+ Include pagination, filters based on metadata (essentially query params)
| method | path | description | comment |
| ------ | ----- | --------------- | ------- |
| GET | /marketplace/executionmanagers | Get all Execution Managers||
| GET | /marketplace/executionmanagers/:id | Get Execution Manager with ID||
| GET | /marketplace/assetmanagers | Get all Asset Mangers ||
| GET | /marketplace/assetmanagers/:id | Get Asset Manger wit ID ||
:::warning
what does the marketplace actually know? If it knows metadata, then there may need to be a way to update it, which should be a general function
**Note:** The metadata known by the MP is about the components (AM and EM)
:::
**Discovery API (optional)**
+ List logical Keepers
+ get List of L2-Components from other Marketplaces
---
**Users API**
+ Create new User
+ Authenticate User
+ Get self (User)
**Transactions API**
+ Get transaction rules (e.g. comission)
+ process transaction information
+ Get asset token from an asset consumer :question:
---
## Search Engine
**Core API**
+ return list of assets that match with Query
+ Discover Marketplaces, Asset Managers, Assets, Execution Managers and Node Executors below its Keeper and fetch their Metadata.
| method | path | description | comment |
| ------ | ----- | --------------- | ------- |
| GET | /searchengine/search?q=<term> | perform a Search with given "term"| Parameters can be keywords, ID, type TBD.|
:::danger
Proposed by Sergey, as part of an interface for the Search Engine
| method | path | description | comment |
| ------ | ----- | --------------- | ------- |
| TBD | Add | | |
| TBD | Find | | |
| TBD | Remove | | |
| TBD | Update? | | Remove+Add |
:::
**Discovery API (optional)**
+ List logical Keepers
+ get List of L2-Components from other Search engines :question:
:::info
*Level 2*
:::
## Asset Manager
**Core API**
| method | path | description | comment |
| ------ | ----- | --------------- | ------- |
|POST|/assetmanager/assets/:id/|Use an Asset|Payload includes userid, marketplace. *Discuss if there is a difference with .../:id/access/*|
|\*|/assetmanager/assets/:id/interact/…| Interact directyl with the API provided by an asset | If the Underlying Asset provides a REST API |
|GET|/assetmanager/assets/:id/operations/|List all interaction means for Asset with ID:id||
|GET|/assetmanager/assets/:id/constraints/|Get the constraints (restrictions) for Asset with ID:id||
|POST|/assetmanager/assets/:id/access/|creates and hands out credentials for accessing the asset directly |If the asset owner declares as public|
+ Get asset (Optional e-bill from Marketplace) (Asset Metadata in CRUD section)
+ Get restrictions
+ Get credentials to use from outside the ecosystem
+ provide list of interaction means
+ use asset
+ needs to include info like
+ username
+ what marketplace to register the transaction at (if any)
+ needs to be set, if the asset manager wants to get paid
+ list all assets (In CRUD section)
**CRUD asset(s)**
| method | path | description | comment |
| ------ | ----- | --------------- | ------- |
| GET | /assetmanager/assets/ | get all Assets registered in the Asset Manager| |
|POST|/assetmanager/assets/|Create a new asset|Payload contains the Asset Metadata|
| GET | /assetmanager/assets/:id | get specific Asset Metadata |
| PATCH | /assetmanager/assets/:id | update specific Asset Metadata|
| DELETE | /assetmanager/assets/:id | delete specific Asset Metadata from the Asset Manager |
**Billing API**
+ start transaction
+ submit info to TX
+ end TX
## Execution Manager
+ [name=ricardo,jorge] Execution Manager
**Core API**
+ start transaction
+ do Dry Run
| method | path | description | comment |
| ------ | ----- | --------------- | ------- |
| POST| /executionmanager/query/|Start transaction (Agora Query)| Payload contains the actual Query|
|POST| /executionmanager/query/dryrun/| Validate transaction (Agora Query) | Payload contains the actual Query|
**Billing API**
:::danger
TO BE DISCUSSED
:::
+ submit info to TX
+ end TX
:::info
*Level 3*
:::
## Node Executor
**Core API**
| method | path | description | comment |
| ------ | ----- | --------------- | ------- |
|POST|/nodexecutor/job/:id|Run a Job with ID:id| Creates and forward to the respective Node Executors. Payload contains Agora Execution Representation (XR) to be executed in the underlying Execution Platform and Agora XR to be forwarded.|
|GET| /nodexecutor/job/:id|Get the current status of the Job with ID:id||
|POST| /nodexecutor/job/:id/message|Send a message (from NE to NE) regarding query with ID:id. Content is in payload| one example is a message indicating successful completion of a local-execution-plan from NE 1. Indicating that NE2 can start computation on his part|
+ Run Agora Execution Representation
+ Get Job Status
:::info
*Primitive*
:::
## Asset
:::info
*Other use cases to consider from user perspective*
:::
:::danger
Define Asset Metadata
+ Check OpenML Schema
:::
+ If I found assets in Agora
+ I can execute it in the Ecosystem.
+ I can download the assets to execute in private Execution Layer.
+ I can get the raw assets and I assume the config of all underlying systems to run.
+ I can get the path and credentials and execute it on premises if the assets are not downloadable.
:::info
*Ecosystem use cases, where Agora provides the tools to support*
:::
+ Full Ecosystem = Keeper + Marketplace + Search Engine + Asset Manager + Optional(Search Engine) + Execution Manager + Node Executors
+ Asset Management Layer = Keeper + Marketplace + Asset Manager + Optional (Search Engine) => Yellow Pages
+ Execution Layer = Keeper + Marketplace + Execution Manager + Node Executor + Optional(Search Engine) => Agora recieves an Agora Query
+ Cloud like = Asset Management Layer with Compute and Storage Assets