openapi: 3.0.3
info:
title: Eliatra Managed EOD API (MEOD)
version: '1.0'
description: The MEOD API to administrate your managed OpenSearch clusters
contact:
name: Eliatra
url: https://eliatra.com
email: info@eliatra.com
license:
name: Apache 2.0
url: https://www.apache.org/licenses/LICENSE-2.0
servers:
- url: https://api.controlplane.prod.eliatra.cloud/v1
- url: https://api.controlplane.staging.eliatra.cloud/v1
- url: https://api.controlplane.dev.eliatra.cloud/v1
security:
- bearerAuth: []
tags:
- name: Clusters
description: Endpoints interacting with OpenSearch clusters
- name: Accounts
description: Endpoints interacting with MEOD accounts
- name: Limits/Costs
description: Endpoints interacting with limits/costs
- name: Logs
description: |
We expose an endpoint under /v1/clusterlogs
to retrieve cluster logs (logfiles of all nodes and dashboard instances).
X-Scope-OrgID
HTTP header which denotes the cluster ID for which the logs should be retrieved.
Requester needs also to be authenticated as explained here.
- name: Metrics
description: |
We expose a Prometheus compatible API under /v1/clustermetrics
.
/v1/clustermetrics/label/{label_name}/values
/v1/clustermetrics/query_range
/v1/clustermetrics/query
/v1/clustermetrics/series
/v1/clustermetrics/labels
X-Scope-OrgID
HTTP header which denotes the cluster ID for which metrics should be retrieved.
Requester needs also to be authenticated as explained here.
Alle OpenSearch metrics starts with opensearch_
and maps to the node info and node stats requests.
paths:
/accounts:
get:
operationId: getOwnAccount
tags:
- Accounts
description: |
Get own account (the callers own account) or return 404 if the caller does not have one yet."
summary: Get own account.
responses:
'200':
description: An Account.
content:
application/json:
schema:
$ref: '#/components/schemas/AccountGet'
'404':
$ref: '#/components/responses/NoContent'
default:
$ref: '#/components/responses/DefaultError'
put:
operationId: updateOwnAccount
tags:
- Accounts
description: |
Update own account (the callers own account) or return 404 if the caller does not have one yet."
summary: Update own account.
requestBody:
required: true
description: Object containing account update information.
content:
application/json:
schema:
$ref: '#/components/schemas/Account'
responses:
'204':
$ref: '#/components/responses/NoContent'
'404':
$ref: '#/components/responses/NoContent'
default:
$ref: '#/components/responses/DefaultError'
post:
operationId: createAccountAsync
tags:
- Accounts
description: |
Create a new account asynchronously and return
the resource id also in the location header.
Check the status field - if it is `ready` the account is usable.
summary: Create a new account asynchronously.
requestBody:
required: true
description: Object containing account creation parameters.
content:
application/json:
schema:
$ref: '#/components/schemas/AccountCreate'
responses:
'202':
$ref: '#/components/responses/AsyncLocation'
default:
$ref: '#/components/responses/DefaultError'
/clusters:
get:
operationId: getClustersForAccount
tags:
- Clusters
description: Get all clusters the caller owns.
summary: Get all clusters the caller owns.
parameters:
- name: deleted
description: If true, the endpoint returns also deleted clusters. Default is false
.
in: query
required: false
schema:
type: boolean
responses:
'200':
description: Successful operation
content:
application/json:
schema:
$ref: '#/components/schemas/Clusters'
default:
$ref: '#/components/responses/DefaultError'
post:
operationId: createClusterAsync
tags:
- Clusters
description: Create a new OpenSearch cluster asynchronously.
summary: Create a new OpenSearch cluster asynchronously.
requestBody:
required: true
description: Object containing cluster creation parameters.
content:
application/json:
schema:
$ref: '#/components/schemas/ClusterCreate'
responses:
'202':
$ref: '#/components/responses/AsyncLocation'
default:
$ref: '#/components/responses/DefaultError'
/clusters/{clusterIUUID}:
get:
operationId: getCluster
tags:
- Clusters
description: Get an OpenSearch cluster.
summary: Get an OpenSearch cluster (must be owned by the caller, if not 404 is returned).
parameters:
- name: clusterIUUID
description: Internal UUID (IUUID) identifier of the cluster
in: path
required: true
schema:
type: string
format: uuid
- name: deleted
description: If true, the endpoint returns also deleted clusters. Default is false
.
in: query
required: false
schema:
type: boolean
responses:
'200':
description: OK
content:
application/json:
schema:
$ref: '#/components/schemas/Cluster'
default:
$ref: '#/components/responses/DefaultError'
put:
operationId: updateCluster
tags:
- Clusters
description: Update a cluster
summary: Update a cluster
parameters:
- name: clusterIUUID
description: Internal UUID (IUUID) identifier of the cluster to get (must be owned by the caller, if not 404 is returned).
in: path
required: true
schema:
type: string
format: uuid
requestBody:
description: Object containing cluster update parameters.
required: true
content:
application/json:
schema:
$ref: '#/components/schemas/ClusterSpec'
responses:
'202':
$ref: '#/components/responses/AsyncLocation'
default:
$ref: '#/components/responses/DefaultError'
delete:
operationId: deleteCluster
tags:
- Clusters
description: Delete a cluster
summary: Delete a cluster
parameters:
- name: clusterIUUID
description: Internal UUID (IUUID) identifier of the cluster to delete (must be owned by the caller, if not 404 is returned).
in: path
required: true
schema:
type: string
format: uuid
responses:
'202':
$ref: '#/components/responses/AsyncLocation'
default:
$ref: '#/components/responses/DefaultError'
/versions:
get:
tags:
- Clusters
summary: List all supported EOD and OpenSearch versions
description: Returns a list of supported EOD and OpenSearch versions
operationId: getVersions
responses:
'200':
description: Successful response
content:
application/json:
schema:
type: array
items:
$ref: '#/components/schemas/Version'
/resources:
post:
operationId: verifyResource
tags:
- Limits/Costs
description: |
Retrieve limits/usage/costs and validate new cluster requests.
summary: Retrieve limits/usage/costs and validate new cluster requests.
requestBody:
required: true
description: Object containing requested resources.
content:
application/json:
schema:
$ref: '#/components/schemas/ResourceVerifyRequest'
responses:
'200':
description: Object containing limits/usage/costs information and validation results.
content:
application/json:
schema:
$ref: '#/components/schemas/ResourceVerifyResponse'
'400':
description: Bad request.
default:
$ref: '#/components/responses/DefaultError'
components:
securitySchemes:
bearerAuth:
type: http
scheme: bearer
bearerFormat: JWT
schemas:
Error:
type: object
description: General Error object
required:
- status
- code
- timestamp
- errors
properties:
status:
description: The type of error status.
type: string
enum:
- VALIDATION_ERROR
- AUTHORIZATION_ERROR
- NOT_FOUND
- INTERNAL_SERVER_ERROR
- BAD_REQUEST
- UNPROCESSABLE
- OTHER
example: VALIDATION_ERROR
code:
description: The HTTP status code applicable to this problem.
type: integer
format: int
example: 400
timestamp:
description: The timestamp when the error occurred, in ISO 8601 format.
type: string
format: date-time
example: '2024-02-20T15:33:14.988531Z'
payload:
description: Arbitrary payload for the error
type: object
additionalProperties: {}
default: {}
errors:
description: A list of detailed error messages associated with specific fields.
type: array
items:
type: object
required:
- message
- field
properties:
message:
description: A human-readable message specific to the field error.
type: string
example: Provided value is out of range '^[a-zA-Z]+$'
field:
description: The specific field associated with this error.
type: string
example: dashboard.cpuCores
Account:
type: object
description: An account.
properties:
companyName:
type: string
minLength: 2
vatId:
type: string
nullable: true
country:
type: string
nullable: true
billingAddress:
type: string
nullable: true
required:
- companyName
User:
type: object
description: A user.
properties:
fullName:
type: string
minLength: 2
email:
type: string
format: email
minLength: 5
required:
- fullName
- email
Quota:
type: object
description: Account quotas.
required:
- ramInGb
- ramInGbPerNode
- cpuCores
- cpuCoresPerNode
- storageInGb
- storageInGbPerVolume
properties:
ramInGb:
description: Quota for RAM (total)
type: integer
format: uint
ramInGbPerNode:
description: Quota for RAM per node
type: integer
format: uint
cpuCores:
description: Quota for CPU cores (total)
type: integer
format: uint
cpuCoresPerNode:
description: Quota for CPU cores per node
type: integer
format: uint
storageInGb:
description: Quota for disk space (total)
type: integer
format: uint
storageInGbPerVolume:
description: Quota for disk space per volume
type: integer
format: uint
QuotaFull:
allOf:
- type: object
description: Current quota and usage.
required:
- ramInGbUsage
- cpuCoresUsage
- storageInGbUsage
- clusters
- clustersUsage
- maxNodePoolsPerCluster
properties:
ramInGbUsage:
description: Current utilization for RAM (total)
type: integer
format: uint
cpuCoresUsage:
description: Current utilization for CPU cores (total)
type: integer
format: uint
storageInGbUsage:
description: Current utilization for disk space (total)
type: integer
format: uint
clusters:
description: Quota for amount of clusters (total)
type: integer
format: uint
clustersUsage:
description: Current utilization for clusters (total)
type: integer
format: uint
maxNodePoolsPerCluster:
description: Quota for amount of nodepools per cluster
type: integer
format: uint
- $ref: '#/components/schemas/Quota'
AccountGet:
type: object
description: An account with its status, the current user and quotas.
allOf:
- type: object
required:
- IUUID
- status
properties:
IUUID:
type: string
format: uuid
status:
type: string
- $ref: '#/components/schemas/Account'
- type: object
required:
- currentUser
properties:
currentUser:
$ref: '#/components/schemas/User'
- type: object
required:
- quotas
properties:
quotas:
$ref: '#/components/schemas/QuotaFull'
AccountCreate:
allOf:
- $ref: '#/components/schemas/Account'
- type: object
required:
- adminUser
properties:
adminUser:
$ref: '#/components/schemas/User'
AsyncStatus:
type: object
description: Status of an async request.
properties:
uuid:
type: string
format: uuid
CustomRoleSet:
type: array
items:
type: string
nullable: false
minItems: 0
PredefinedRoleSet:
type: string
enum:
- default
- default_but_manager
- dedicated_manager
- data_only
- ingest_only
- ml_only
- coordinating_only
- searchable_snapshots_only
default: default
nullable: false
NodePoolSpec:
type: object
required:
- name
- nodes
- roles
- zone
- nodeResources
properties:
name:
type: string
maxLength: 25
minLength: 1
description: Only lowercase, number, and dash, max 25 length
pattern: ^[a-z]+(?:[a-z0-9-]*[a-z0-9])?$
nodes:
type: integer
format: uint
default: 3
minimum: 1
maximum: 20
roles:
type: object
default: default
oneOf:
- $ref: '#/components/schemas/CustomRoleSet'
- $ref: '#/components/schemas/PredefinedRoleSet'
zone:
type: string
enum:
- ZONE_1
- ZONE_2
- AUTO
default: AUTO
nodeResources:
type: object
default: {}
required:
- ramInGb
- cpuCores
- storageInGb
properties:
ramInGb:
description: RAM in GB per node
type: integer
format: uint
minimum: 4
maximum: 64
default: 4
cpuCores:
description: Number of CPU cores per node
type: integer
format: uint
minimum: 1
maximum: 32
default: 1
storageInGb:
description: Amount of storage in GB per node
type: integer
format: uint
minimum: 10
maximum: 50000
default: 10
ClusterSpec:
type: object
description: Describes the specification of a OpenSearch cluster
required:
- name
- openSearchVersion
- flavor
- nodepools
- dashboard
- customSettings
- supportLevel
- expertMode
- automaticUpdates
- automaticBackups
properties:
name:
type: string
maxLength: 35
minLength: 1
description: Cluster name (only lowercase, numbers and dash, max 35 length)
pattern: ^[a-z]+(?:[a-z0-9-]*[a-z0-9])?$
flavor:
description: 'Flavor: Either eod or opensearch'
type: string
enum:
- eod
- opensearch
example: eod
default: eod
openSearchVersion:
description: 'OpenSearch or EOD version (examples: 2.13.0 or 2.11.1-ee2)'
type: string
pattern: ^(0|[1-9]\d*)\.(0|[1-9]\d*)\.(0|[1-9]\d*)(?:-ee([1-9]\d*))?$
example: 2.11.1-ee2
default: 2.11.1-ee2
supportLevel:
description: Support level, see https://docs.meod.eliatra.cloud
type: string
enum:
- basic
- plus
- pro
- enterprise
- time_material
example: basic
default: basic
expertMode:
description: Expert mode.
type: string
enum:
- enabled
- disabled
example: enabled
default: enabled
automaticUpdates:
description: Automatic updates, see https://docs.meod.eliatra.cloud
type: string
enum:
- 'off'
- critical_security_fixes_only
- critical_security_fixes_bugfixes
- critical_security_fixes_bugfixes_newfeatures
example: critical_security_fixes_bugfixes
default: critical_security_fixes_bugfixes
automaticBackups:
description: Automatic backups, see https://docs.meod.eliatra.cloud
type: string
enum:
- 'off'
- 24h-1d
- 24h-7d
- 24h-14d
- 24h-30d
example: 24h-1d
default: 24h-1d
customSettings:
description: Add custom settings for all opensearch nodes to opensearch.yml
type: object
additionalProperties: true
default: {}
nodepools:
type: array
description: Describes an OpenSearch Operator Nodepool
items:
$ref: '#/components/schemas/NodePoolSpec'
nullable: false
minItems: 1
maxItems: 50
dashboard:
type: object
description: Describes the specification of OpenSearch Dashboards
required:
- replicas
- cpuCores
- ramInGb
- customSettings
default: {}
properties:
customSettings:
description: Add custom settings for dashboards to opensearch_dashboards.yml
type: object
additionalProperties: true
default: {}
replicas:
description: Set to 0 to disable dashboard. If replicas > 1 it will be deployed across zones
type: integer
format: uint
minimum: 0
maximum: 8
default: 1
ramInGb:
description: RAM in GB per replica
type: integer
format: uint
minimum: 4
maximum: 16
default: 4
cpuCores:
description: Number of CPU cores per replica
type: integer
format: uint
minimum: 1
maximum: 8
default: 1
ClusterInfo:
type: object
required:
- url
- adminApiUrl
- dashboardUrl
- health
- adminUserName
- initialAdminUserPassword
- adminCert
- adminCertKey
- createdAt
properties:
url:
type: string
format: uri
adminApiUrl:
type: string
format: uri
dashboardUrl:
type: string
format: uri
health:
type: string
adminUserName:
type: string
initialAdminUserPassword:
type: string
adminCert:
type: string
adminCertKey:
type: string
createdAt:
type: string
format: date-time
deletedAt:
type: string
format: date-time
Cluster:
type: object
required:
- IUUID
- status
- clusterSpec
- clusterInfo
properties:
IUUID:
type: string
format: uuid
status:
type: string
clusterSpec:
$ref: '#/components/schemas/ClusterSpec'
clusterInfo:
$ref: '#/components/schemas/ClusterInfo'
Clusters:
type: object
required:
- clusters
properties:
clusters:
items:
$ref: '#/components/schemas/Cluster'
type: array
nullable: false
ClusterCreate:
type: object
allOf:
- $ref: '#/components/schemas/ClusterSpec'
Version:
type: object
required:
- flavor
- version
- status
- latest
properties:
flavor:
type: string
enum:
- eod
- opensearch
example: eod
version:
type: string
pattern: ^(0|[1-9]\d*)\.(0|[1-9]\d*)\.(0|[1-9]\d*)(?:-ee([1-9]\d*))?$
minLength: 5
example: 2.11.1-ee1
status:
type: string
enum:
- supported
- deprecated
example: supported
latest:
type: boolean
ResourceVerifyRequest:
type: object
description: Request resource calculation and pricing for a new cluster. Validate that there is enough quota left to create such a cluster. If replicas and nodepools (or nodes) are zero this request can be used to retrieve resource calculation and pricing for current deployed clusters.
required:
- dashboard
- nodepools
- pricing
properties:
pricing:
type: object
description: Options that influence pricing/cost of a cluster.
required:
- flavor
- supportLevel
- expertMode
- automaticUpdates
- automaticBackups
properties:
flavor:
description: 'Flavor: Either eod or opensearch.'
type: string
enum:
- eod
- opensearch
example: eod
default: eod
supportLevel:
description: Support level.
type: string
enum:
- basic
- plus
- pro
- enterprise
- time_material
example: basic
default: basic
expertMode:
description: Expert mode.
type: string
enum:
- enabled
- disabled
example: enabled
default: enabled
automaticUpdates:
description: Automatic updates.
type: string
enum:
- 'off'
- critical_security_fixes_only
- critical_security_fixes_bugfixes
- critical_security_fixes_bugfixes_newfeatures
example: critical_security_fixes_bugfixes
default: critical_security_fixes_bugfixes
automaticBackups:
description: Automatic backups.
type: string
enum:
- 'off'
- 24h-1d
- 24h-7d
- 24h-14d
- 24h-30d
example: 24h-1d
default: 24h-1d
dashboard:
type: object
description: Requested resource calculation and pricing for Dashboards.
required:
- cpuCores
- ramInGb
- replicas
properties:
cpuCores:
type: integer
description: Requested number of CPU cores for the dashboard
minimum: 0
default: 0
ramInGb:
type: integer
description: Requested amount of RAM in GB for the dashboard
minimum: 0
default: 0
replicas:
type: integer
description: Requested number of replicas for the dashboard
minimum: 0
default: 0
nodepools:
type: array
description: Request resource calculation and pricing for OpenSearch nodepools.
items:
type: object
properties:
nodes:
type: integer
description: Number of nodes in this nodepool
minimum: 0
default: 0
nodeResources:
type: object
required:
- ramInGb
- cpuCores
- storageInGb
properties:
ramInGb:
type: integer
description: Requested amount of RAM in GB per node
minimum: 0
default: 0
cpuCores:
type: integer
description: Requested number of CPU cores per node
minimum: 0
default: 0
storageInGb:
type: integer
description: Requested storage size in GB per node
minimum: 0
default: 0
ResourceVerifyResponse:
type: object
description: Provide comprehensive information about resource consumption and costs about currently used resources and potentially requested resources. For the meaning of -standby- resources please refer to the MEOD user documentation.
properties:
requestedCost:
type: object
description: The requested resources and costs without any standby resources. This is NOT for calculating quotas/limits but for calculating costs and real resource consumption.
properties:
eurPerMinute:
type: number
format: double
description: Requested cost per minute in EUR excluding VAT - without any standby resources
eurPerHour:
type: number
format: double
description: Requested cost per hour (est.) in EUR excluding VAT - without any standby resources
eurPerMonth:
type: number
format: double
description: Requested cost per month (est.) in EUR excluding VAT - without any standby resources
ramInGb:
type: integer
description: Requested amount of RAM in GB - without any standby resources
cpuCores:
type: integer
description: Requested number of CPU cores - without any standby resources
storageInGb:
type: integer
description: Requested storage size in GB - without any standby resources
clusters:
type: integer
description: Requested amount of clusters. Always 1
required:
- eurPerMinute
- eurPerHour
- eurPerMonth
- ramInGb
- cpuCores
- storageInGb
- clusters
usedCost:
type: object
description: The used resources and costs without any standby resources. This is NOT for calculating quotas/limits but for calculating costs and real resource consumption.
properties:
eurPerMinute:
type: number
format: double
description: Cost for current running clusters per minute in EUR excluding VAT - without any standby resources
eurPerHour:
type: number
format: double
description: Cost for current running clusters per hour (est.) in EUR excluding VAT - without any standby resources
eurPerMonth:
type: number
format: double
description: Cost for current running clusters per month (est.) in EUR excluding VAT - without any standby resources
ramInGb:
type: integer
description: Requested amount of RAM in GB - without any standby resources
cpuCores:
type: integer
description: Requested number of CPU cores - without any standby resources
storageInGb:
type: integer
description: Requested storage size in GB - without any standby resources
clusters:
type: integer
description: Requested amount of clusters. Always 1
required:
- eurPerMinute
- eurPerHour
- eurPerMonth
- ramInGb
- cpuCores
- storageInGb
- clusters
requested:
type: object
description: Requested resources (including standby resources). This is only for calculating quotas/limits.
properties:
ramInGb:
type: integer
description: Requested amount of RAM in GB
cpuCores:
type: integer
description: Requested number of CPU cores
storageInGb:
type: integer
description: Requested storage size in GB
clusters:
type: integer
description: Requested amount of clusters. Always 1
required:
- ramInGb
- cpuCores
- storageInGb
- clusters
used:
type: object
description: 'Resources, including standby resources, used by currently running clusters (more precisely: non-deleted clusters). This is only for calculating quotas/limits. The actual resource consumption maybe lower.'
properties:
ramInGb:
type: integer
description: Used amount of RAM in GB
cpuCores:
type: integer
description: Used number of CPU cores
storageInGb:
type: integer
description: Used storage size in GB
clusters:
type: integer
description: Used amount of clusters
required:
- ramInGb
- cpuCores
- storageInGb
- clusters
available:
type: object
description: Available resources define by the contract limits. Can only be changed by the support.
properties:
ramInGb:
type: integer
description: Available amount of RAM in GB
cpuCores:
type: integer
description: Available number of CPU cores
storageInGb:
type: integer
description: Available storage size in GB
clusters:
type: integer
description: Available amount of clusters
required:
- ramInGb
- cpuCores
- storageInGb
- clusters
remaining:
type: object
description: 'Remaining resources, including standby resources, after requested resources are potentially fulfilled. In other words: (available - used - requested). This is only for calculating quotas/limits.'
properties:
ramInGb:
type: integer
description: Remaining amount of RAM in GB
cpuCores:
type: integer
description: Remaining number of CPU cores
storageInGb:
type: integer
description: Remaining storage size in GB
clusters:
type: integer
description: Remaining amount of clusters
required:
- ramInGb
- cpuCores
- storageInGb
- clusters
result:
type: string
enum:
- rejected
- accepted
- exhausted
description: Result status of the request
required:
- requested
- available
- used
- remaining
- result
- requestedCost
- usedCost
responses:
DefaultError:
description: Error
content:
application/json:
schema:
$ref: '#/components/schemas/Error'
NoContent:
description: No content is returned.
AsyncLocation:
description: Location of a resource which has a status.
headers:
Location:
schema:
type: string
description: Location of a resource which has a status.
content:
application/json:
schema:
$ref: '#/components/schemas/AsyncStatus'