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).

  • /v1/clusterlogs
  • Requests need to have a mandatory 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
  • Requests need to have a mandatory 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'