diff --git a/.github/workflows/test-spec.yml b/.github/workflows/test-spec.yml index 23f0fffc6..3729b66cb 100644 --- a/.github/workflows/test-spec.yml +++ b/.github/workflows/test-spec.yml @@ -42,6 +42,8 @@ jobs: tests: plugins/notifications - version: 2.17.0 tests: plugins/query_insights + - version: 2.17.0 + tests: plugins/workload-management - version: 2.18.0 hub: opensearchstaging ref: '@sha256:57a1cd1142d68c203e2e4aa0666d9a691e1e409a5d14aa4a8f5044036f05cf06' diff --git a/CHANGELOG.md b/CHANGELOG.md index 323fa2686..52a61fab2 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -106,6 +106,7 @@ Inspired from [Keep a Changelog](https://keepachangelog.com/en/1.0.0/) - Added `config_id` and `config_id_list` to `/_plugins/_notifications/configs` query parameters ([#594](https://github.com/opensearch-project/opensearch-api-specification/pull/594)) - Added a release workflow triggered on a tag ([#635](https://github.com/opensearch-project/opensearch-api-specification/pull/635)) - Added API spec for query insights plugin ([#625](https://github.com/opensearch-project/opensearch-api-specification/pull/625)) +- Added API specs for query groups lifecycle APIs ([#649](https://github.com/opensearch-project/opensearch-api-specification/pull/649)) - Added API spec for `adjust_pure_negative` for bool queries ([#641](https://github.com/opensearch-project/opensearch-api-specification/pull/641)) - Added a spec style checker [#620](https://github.com/opensearch-project/opensearch-api-specification/pull/620). - Added `remote_store` to node `Stats` ([#643](https://github.com/opensearch-project/opensearch-api-specification/pull/643)) diff --git a/spec/namespaces/wlm.yaml b/spec/namespaces/wlm.yaml new file mode 100644 index 000000000..083f8ed9e --- /dev/null +++ b/spec/namespaces/wlm.yaml @@ -0,0 +1,127 @@ +openapi: 3.1.0 +info: + title: OpenSearch Workload Management Query Group API + description: Query group lifecycle APIs for the workload management plugin. + version: 1.0.0 +paths: + /_wlm/query_group: + get: + operationId: wlm.get_query_group.0 + x-operation-group: wlm.get_query_group + x-version-added: '2.17' + description: Gets the specified QueryGroup or get all if no name is provided. + responses: + '200': + $ref: '#/components/responses/wlm.get_query_group@200' + put: + operationId: wlm.create_query_group.0 + x-operation-group: wlm.create_query_group + x-version-added: '2.17' + description: Creates the specified query group. + requestBody: + $ref: '#/components/requestBodies/wlm.create_query_group' + responses: + '200': + $ref: '#/components/responses/wlm.create_query_group@200' + /_wlm/query_group/{name}: + get: + operationId: wlm.get_query_group.1 + x-operation-group: wlm.get_query_group + x-version-added: '2.17' + description: Gets the specified QueryGroup or get all if no name is provided. + parameters: + - $ref: '#/components/parameters/wlm.get_query_group::path.name' + responses: + '200': + $ref: '#/components/responses/wlm.get_query_group@200' + put: + operationId: wlm.update_query_group.0 + x-operation-group: wlm.update_query_group + x-version-added: '2.17' + description: Updates the specified query group. + parameters: + - $ref: '#/components/parameters/wlm.update_query_group::path.name' + requestBody: + $ref: '#/components/requestBodies/wlm.update_query_group' + responses: + '200': + $ref: '#/components/responses/wlm.update_query_group@200' + delete: + operationId: wlm.delete_query_group.0 + x-operation-group: wlm.delete_query_group + x-version-added: '2.17' + description: Deletes the specified QueryGroup. + parameters: + - $ref: '#/components/parameters/wlm.delete_query_group::path.name' + responses: + '200': + $ref: '#/components/responses/wlm.delete_query_group@200' +components: + requestBodies: + wlm.create_query_group: + content: + application/json: + schema: + $ref: '../schemas/wlm._common.yaml#/components/schemas/QueryGroupCreate' + required: true + wlm.update_query_group: + content: + application/json: + schema: + $ref: '../schemas/wlm._common.yaml#/components/schemas/QueryGroupUpdate' + required: true + responses: + wlm.create_query_group@200: + description: '' + content: + application/json: + schema: + $ref: '../schemas/wlm._common.yaml#/components/schemas/QueryGroupResponse' + wlm.update_query_group@200: + description: '' + content: + application/json: + schema: + $ref: '../schemas/wlm._common.yaml#/components/schemas/QueryGroupResponse' + wlm.delete_query_group@200: + description: '' + content: + application/json: + schema: + type: object + properties: + acknowledged: + type: boolean + wlm.get_query_group@200: + description: '' + content: + application/json: + schema: + type: object + properties: + query_groups: + type: array + items: + $ref: '../schemas/wlm._common.yaml#/components/schemas/QueryGroupResponse' + parameters: + wlm.update_query_group::path.name: + name: name + in: path + description: QueryGroup name. + schema: + type: string + required: true + wlm.delete_query_group::path.name: + name: name + in: path + description: QueryGroup name. + schema: + type: string + required: true + wlm.get_query_group::path.name: + name: name + in: path + description: QueryGroup name. + schema: + type: string + required: true diff --git a/spec/schemas/wlm._common.yaml b/spec/schemas/wlm._common.yaml new file mode 100644 index 000000000..ca2c1ae7a --- /dev/null +++ b/spec/schemas/wlm._common.yaml @@ -0,0 +1,100 @@ +openapi: 3.1.0 +info: + title: Schemas of wlm._common category + description: Schemas of wlm._common category + version: 1.0.0 +paths: {} +components: + schemas: + QueryGroupResponse: + type: object + properties: + _id: + type: string + name: + type: string + resiliency_mode: + type: string + enum: [enforced, monitor,soft] + updated_at: + type: integer + format: int64 + resource_limits: + anyOf: + - type: object + properties: + memory: + type: number + format: double + cpu: + type: number + format: double + required: + - memory + - type: object + properties: + memory: + type: number + format: double + cpu: + type: number + format: double + required: + - cpu + required: + - _id + - name + - resiliency_mode + - resource_limits + - updated_at + QueryGroupCreate: + type: object + properties: + name: + type: string + resiliency_mode: + type: string + enum: [enforced, monitor,soft] + resource_limits: + anyOf: + - type: object + properties: + memory: + type: number + format: double + cpu: + type: number + format: double + required: + - memory + - type: object + properties: + memory: + type: number + format: double + cpu: + type: number + format: double + required: + - cpu + required: + - name + - resiliency_mode + - resource_limits + QueryGroupUpdate: + type: object + properties: + resiliency_mode: + type: string + enum: [enforced, monitor,soft] + resource_limits: + $ref: '#/components/schemas/ResourceLimitsSchema' + ResourceLimitsSchema: + type: object + properties: + memory: + type: number + format: double + cpu: + type: number + format: double diff --git a/tests/plugins/workload-management/Dockerfile b/tests/plugins/workload-management/Dockerfile new file mode 100644 index 000000000..2d040ccb8 --- /dev/null +++ b/tests/plugins/workload-management/Dockerfile @@ -0,0 +1,6 @@ +ARG OPENSEARCH_DOCKER_HUB_PROJECT +ARG OPENSEARCH_VERSION +ARG OPENSEARCH_DOCKER_REF + +FROM ${OPENSEARCH_DOCKER_HUB_PROJECT}/opensearch:${OPENSEARCH_VERSION}${OPENSEARCH_DOCKER_REF} +RUN ./bin/opensearch-plugin install -b workload-management diff --git a/tests/plugins/workload-management/docker-compose.yml b/tests/plugins/workload-management/docker-compose.yml new file mode 100644 index 000000000..c334c477f --- /dev/null +++ b/tests/plugins/workload-management/docker-compose.yml @@ -0,0 +1,17 @@ +version: '3' + +services: + opensearch-cluster: + build: + context: . + args: + - OPENSEARCH_DOCKER_HUB_PROJECT=${OPENSEARCH_DOCKER_HUB_PROJECT:-opensearchproject} + - OPENSEARCH_DOCKER_REF=${OPENSEARCH_DOCKER_REF} + - OPENSEARCH_VERSION=2.17.0 + ports: + - 9200:9200 + - 9600:9600 + environment: + - OPENSEARCH_INITIAL_ADMIN_PASSWORD=${OPENSEARCH_PASSWORD:-myStrongPassword123!} + - OPENSEARCH_JAVA_OPTS=${OPENSEARCH_JAVA_OPTS} + - discovery.type=single-node diff --git a/tests/plugins/workload-management/query_group.yaml b/tests/plugins/workload-management/query_group.yaml new file mode 100644 index 000000000..6f2b86367 --- /dev/null +++ b/tests/plugins/workload-management/query_group.yaml @@ -0,0 +1,67 @@ +$schema: ../../../json_schemas/test_story.schema.yaml + +description: This story tests all endpoints relevant to QueryGroups, from creation to deletion. + +prologues: + - path: /_wlm/query_group + version: '>= 2.17' + method: PUT + request: + payload: + name: analytics + resource_limits: + memory: 0.1 + resiliency_mode: monitor + status: [200] + - path: /_wlm/query_group + version: '>= 2.17' + method: PUT + request: + payload: + name: analytics2 + resource_limits: + memory: 0.15 + cpu: 0.05 + resiliency_mode: monitor + status: [200] + +chapters: + - synopsis: Update the QueryGroup named `analytics2`, with resiliency_mode to be enforced and memory to be 0.25 and cpu to be 0.25. + version: '>= 2.17' + path: /_wlm/query_group/{name} + method: PUT + parameters: + name: analytics2 + request: + payload: + resource_limits: + memory: 0.25 + cpu: 0.25 + resiliency_mode: enforced + response: + status: 200 + - synopsis: Get the QueryGroup named `analytics2`. + version: '>= 2.17' + path: /_wlm/query_group/{name} + method: GET + parameters: + name: analytics2 + response: + status: 200 + payload: + query_groups: + - name: analytics2 + resource_limits: + memory: 0.25 + cpu: 0.25 + resiliency_mode: enforced + +epilogues: + - path: /_wlm/query_group/analytics + version: '>= 2.17' + method: DELETE + status: [200] + - path: /_wlm/query_group/analytics2 + version: '>= 2.17' + method: DELETE + status: [200]