diff --git a/Makefile b/Makefile index 01c9b2da54..711733a5b4 100644 --- a/Makefile +++ b/Makefile @@ -115,14 +115,27 @@ lint-api-spec: requirements .lint-api-spec @echo @echo "================== Lint API spec ====================" @echo - . $(VIRTUALENV_DIR)/bin/activate; st2common/bin/st2-validate-api-spec --generate + . $(VIRTUALENV_DIR)/bin/activate; st2common/bin/st2-validate-api-spec + +.PHONY: generate-api-spec +generate-api-spec: requirements .generate-api-spec + +.PHONY: .generate-api-spec +.generate-api-spec: + @echo + @echo "================== Generate openapi.yaml file ====================" + @echo + echo "# NOTE: This file is auto-generated - DO NOT EDIT MANUALLY" > st2common/st2common/openapi.yaml + echo "# Edit st2common/st2common/openapi.yaml.j2 and then run" >> st2common/st2common/openapi.yaml + echo "# make .generate-api-spec make target to generate the final spec file" >> st2common/st2common/openapi.yaml + . virtualenv/bin/activate; st2common/bin/st2-generate-api-spec >> st2common/st2common/openapi.yaml .PHONY: circle-lint-api-spec circle-lint-api-spec: @echo @echo "================== Lint API spec ====================" @echo - . $(VIRTUALENV_DIR)/bin/activate; st2common/bin/st2-validate-api-spec --generate || echo "Open API spec lint failed." + . $(VIRTUALENV_DIR)/bin/activate; st2common/bin/st2-validate-api-spec || echo "Open API spec lint failed." .PHONY: flake8 flake8: requirements .flake8 @@ -155,7 +168,7 @@ bandit: requirements .bandit lint: requirements .lint .PHONY: .lint -.lint: .flake8 .pylint .bandit .st2client-dependencies-check .st2common-circular-dependencies-check .rst-check +.lint: .generate-api-spec .flake8 .pylint .bandit .st2client-dependencies-check .st2common-circular-dependencies-check .rst-check .PHONY: clean clean: .cleanpycs @@ -280,7 +293,7 @@ tests: pytests pytests: compile requirements .flake8 .pylint .pytests-coverage .PHONY: .pytests -.pytests: compile .unit-tests .itests clean +.pytests: compile .generate-api-spec .unit-tests .itests clean .PHONY: .pytests-coverage .pytests-coverage: .unit-tests-coverage-html .itests-coverage-html clean diff --git a/circle.yml b/circle.yml index 7046a122ae..5211e02bc9 100644 --- a/circle.yml +++ b/circle.yml @@ -37,7 +37,7 @@ test: - case $CIRCLE_NODE_INDEX in 0) make ci-checks ci-packs-tests ;; 1) make ci-unit ;; 2) make ci-integration ;; 3) make ci-unit ;; 4) make ci-integration ;; esac: parallel: true post: - - case $CIRCLE_NODE_INDEX in 0) . virtualenv/bin/activate; tools/generate_spec.py > $CIRCLE_ARTIFACTS/openapi.yaml ;; [1,2]) codecov ;; esac: + - case $CIRCLE_NODE_INDEX in 0) . virtualenv/bin/activate; st2common/bin/st2-generate-api-spec > $CIRCLE_ARTIFACTS/openapi.yaml ;; [1,2]) codecov ;; esac: parallel: true experimental: diff --git a/tools/generate_spec.py b/st2common/bin/st2-generate-api-spec similarity index 76% rename from tools/generate_spec.py rename to st2common/bin/st2-generate-api-spec index f21d01e9e1..8040c83abf 100755 --- a/tools/generate_spec.py +++ b/st2common/bin/st2-generate-api-spec @@ -14,14 +14,8 @@ # See the License for the specific language governing permissions and # limitations under the License. -import pkg_resources - -import jinja2 - -from st2common.util.spec_loader import ARGUMENTS - +import sys +from st2common.cmd.generate_api_spec import main if __name__ == '__main__': - spec_template = pkg_resources.resource_string('st2common', 'openapi.yaml.j2') - spec_string = jinja2.Template(spec_template).render(**ARGUMENTS) - print(spec_string) + sys.exit(main()) diff --git a/st2common/st2common/cmd/generate_api_spec.py b/st2common/st2common/cmd/generate_api_spec.py new file mode 100644 index 0000000000..51ff051d93 --- /dev/null +++ b/st2common/st2common/cmd/generate_api_spec.py @@ -0,0 +1,60 @@ +# Licensed to the StackStorm, Inc ('StackStorm') under one or more +# contributor license agreements. See the NOTICE file distributed with +# this work for additional information regarding copyright ownership. +# The ASF licenses this file to You under the Apache License, Version 2.0 +# (the "License"); you may not use this file except in compliance with +# the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +""" +A script generates final openapi.yaml file based on openapi.yaml.j2 Jinja +template file. +""" + +from st2common import config +from st2common import log as logging +from st2common.util import spec_loader +from st2common.script_setup import setup as common_setup +from st2common.script_setup import teardown as common_teardown + + +__all__ = [ + 'main' +] + +LOG = logging.getLogger(__name__) + + +def setup(): + common_setup(config=config, setup_db=False, register_mq_exchanges=False) + + +def generate_spec(): + spec_string = spec_loader.generate_spec('st2common', 'openapi.yaml.j2') + print(spec_string) + + +def teartown(): + common_teardown() + + +def main(): + setup() + + try: + generate_spec() + ret = 0 + except Exception as e: + LOG.error(e.message) + ret = 1 + finally: + teartown() + + return ret diff --git a/st2common/st2common/openapi.yaml b/st2common/st2common/openapi.yaml index d83d00c05d..abbf8bbfbd 100644 --- a/st2common/st2common/openapi.yaml +++ b/st2common/st2common/openapi.yaml @@ -1,3 +1,6 @@ +# NOTE: This file is auto-generated - DO NOT EDIT MANUALLY +# Edit st2common/st2common/openapi.yaml.j2 and then run +# make .generate-api-spec make target to generate the final spec file swagger: '2.0' info: @@ -237,7 +240,7 @@ paths: type: integer - name: offset in: query - description: Number of actions offset + description: Number of actions to offset type: integer default: 0 - name: id @@ -431,7 +434,7 @@ paths: type: integer - name: offset in: query - description: Number of actions offset + description: Number of actions to offset type: integer default: 0 - name: id @@ -712,12 +715,12 @@ paths: type: string - name: limit in: query - description: Number of action alias to get + description: Number of actions alias to get type: integer default: 100 - name: offset in: query - description: Number of action alias offset + description: Number of actions alias to offset type: integer default: 0 responses: @@ -787,7 +790,7 @@ paths: default: 100 - name: offset in: query - description: Number of executions offset + description: Number of executions to offset type: integer default: 0 - name: sort @@ -1212,12 +1215,12 @@ paths: type: string - name: limit in: query - description: Number of keys to get from datastore + description: Number of keys to get type: integer default: 100 - name: offset in: query - description: Number of keys offset + description: Number of keys to offset type: integer default: 0 - name: sort @@ -1368,7 +1371,7 @@ paths: default: 100 - name: offset in: query - description: Number of packs offset + description: Number of packs to offset type: integer default: 0 - name: sort @@ -1639,7 +1642,7 @@ paths: default: 100 - name: offset in: query - description: Number of configs offset + description: Number of configs to offset type: integer default: 0 - name: sort @@ -1756,12 +1759,12 @@ paths: parameters: - name: limit in: query - description: Number of config_schemas to get + description: Number of config schemas to get type: integer default: 100 - name: offset in: query - description: Number of config_schemas offset + description: Number of config schemas to offset type: integer default: 0 - name: sort @@ -1833,12 +1836,12 @@ paths: type: string - name: limit in: query - description: Number of policytypes to get + description: Number of policy types to get type: integer default: 100 - name: offset in: query - description: Number of policytypes offset + description: Number of policy types to offset type: integer default: 0 - name: sort @@ -1915,6 +1918,16 @@ paths: in: query description: Policies name type: string + - name: limit + in: query + description: Number of policies to get + type: integer + default: 100 + - name: offset + in: query + description: Number of policies to offset + type: integer + default: 0 responses: '200': description: Policy created successfully. @@ -2226,11 +2239,6 @@ paths: in: query description: Number of entities to get type: integer - - name: offset - in: query - description: Number of policytypes offset - type: integer - default: 0 - name: id in: query description: Entity id filter @@ -2404,11 +2412,6 @@ paths: in: query description: Number of entities to get type: integer - - name: offset - in: query - description: Number of policytypes offset - type: integer - default: 0 - name: id in: query description: Entity id filter @@ -2536,12 +2539,12 @@ paths: required: false - name: limit in: query - description: Number of runnertypes to get + description: Number of runner types to get type: integer default: 100 - name: offset in: query - description: Number of runnertypes offset + description: Number of runner types to offset type: integer default: 0 - name: sort @@ -2654,11 +2657,6 @@ paths: in: query description: Number of entities to get type: integer - - name: offset - in: query - description: Number of policytypes offset - type: integer - default: 0 - name: id in: query description: Entity id filter @@ -2774,12 +2772,12 @@ paths: type: boolean - name: limit in: query - description: List N most recent apikeys. + description: Number of API keys to get type: integer default: 50 - name: offset in: query - description: Number of apikeys offset + description: Number of API keys to offset type: integer default: 0 x-parameters: @@ -2931,7 +2929,7 @@ paths: default: 50 - name: offset in: query - description: Number of ruleenforcements offset + description: Number of rule enforcements to offset type: integer default: 0 - name: sort @@ -3087,7 +3085,7 @@ paths: default: 100 - name: offset in: query - description: Number of traces offset + description: Number of traces to offset type: integer default: 0 - name: sort @@ -3182,12 +3180,12 @@ paths: parameters: - name: limit in: query - description: Number of triggertypes to get + description: Number of trigger types to get type: integer default: 100 - name: offset in: query - description: Number of triggertypes offset + description: Number of trigger types to offset type: integer default: 0 - name: sort @@ -3435,12 +3433,12 @@ paths: parameters: - name: limit in: query - description: Number of triggerinstances to get + description: Number of trigger instances to get type: integer default: 100 - name: offset in: query - description: Number of triggerinstances offset + description: Number of trigger instances to offset type: integer default: 0 - name: sort @@ -3998,7 +3996,7 @@ definitions: status: description: The current status of the action execution. type: string - enum: {{ LIVEACTION_STATUSES }} + enum: ['requested', 'scheduled', 'delayed', 'running', 'succeeded', 'failed', 'timeout', 'abandoned', 'canceling', 'canceled'] result: type: object additionalProperties: False @@ -4434,4 +4432,4 @@ security: - X-Auth-Token: [] - St2-Api-Key: [] - x-auth-token: [] - - st2-api-key: [] \ No newline at end of file + - st2-api-key: [] diff --git a/st2common/st2common/openapi.yaml.j2 b/st2common/st2common/openapi.yaml.j2 index 8b77c1f762..042af19948 100644 --- a/st2common/st2common/openapi.yaml.j2 +++ b/st2common/st2common/openapi.yaml.j2 @@ -235,6 +235,11 @@ paths: in: query description: Number of actions to get type: integer + - name: offset + in: query + description: Number of actions to offset + type: integer + default: 0 - name: id in: query description: Action id filter @@ -424,6 +429,11 @@ paths: in: query description: Number of actions to get type: integer + - name: offset + in: query + description: Number of actions to offset + type: integer + default: 0 - name: id in: query description: Action id filter @@ -523,6 +533,10 @@ paths: description: | Get list of action-aliases. parameters: + - name: name + in: query + description: Entity name filter + type: string - name: pack in: query description: Only return resources belonging to the provided pack @@ -698,12 +712,12 @@ paths: type: string - name: limit in: query - description: Number of actions to get + description: Number of actions alias to get type: integer default: 100 - name: offset in: query - description: Number of actions offset + description: Number of actions alias to offset type: integer default: 0 responses: @@ -768,12 +782,12 @@ paths: required: false - name: limit in: query - description: Number of actions to get + description: Number of executions to get type: integer default: 100 - name: offset in: query - description: Number of actions offset + description: Number of executions to offset type: integer default: 0 - name: sort @@ -954,6 +968,39 @@ paths: description: Unexpected error schema: $ref: '#/definitions/Error' + put: + operationId: st2api.controllers.v1.actionexecutions:action_executions_controller.put + description: | + Update status and result for an execution. + parameters: + - name: id + in: path + description: Entity id + type: string + required: true + - name: liveaction_api + in: body + description: Execution update request + schema: + $ref: '#/definitions/ExecutionUpdateRequest' + - name: show_secrets + in: query + description: Show secrets in plain text + type: boolean + x-parameters: + - name: user + in: context + x-as: requester_user + description: User performing the operation. + responses: + '200': + description: Execution that was updated + schema: + $ref: '#/definitions/Execution' + default: + description: Unexpected error + schema: + $ref: '#/definitions/Error' delete: operationId: st2api.controllers.v1.actionexecutions:action_executions_controller.delete description: | @@ -1165,12 +1212,12 @@ paths: type: string - name: limit in: query - description: Number of actions to get + description: Number of keys to get type: integer default: 100 - name: offset in: query - description: Number of actions offset + description: Number of keys to offset type: integer default: 0 - name: sort @@ -1316,12 +1363,12 @@ paths: parameters: - name: limit in: query - description: Number of actions to get + description: Number of packs to get type: integer default: 100 - name: offset in: query - description: Number of actions offset + description: Number of packs to offset type: integer default: 0 - name: sort @@ -1587,12 +1634,12 @@ paths: parameters: - name: limit in: query - description: Number of actions to get + description: Number of configs to get type: integer default: 100 - name: offset in: query - description: Number of actions offset + description: Number of configs to offset type: integer default: 0 - name: sort @@ -1709,12 +1756,12 @@ paths: parameters: - name: limit in: query - description: Number of actions to get + description: Number of config schemas to get type: integer default: 100 - name: offset in: query - description: Number of actions offset + description: Number of config schemas to offset type: integer default: 0 - name: sort @@ -1786,12 +1833,12 @@ paths: type: string - name: limit in: query - description: Number of actions to get + description: Number of policy types to get type: integer default: 100 - name: offset in: query - description: Number of actions offset + description: Number of policy types to offset type: integer default: 0 - name: sort @@ -1868,6 +1915,16 @@ paths: in: query description: Policies name type: string + - name: limit + in: query + description: Number of policies to get + type: integer + default: 100 + - name: offset + in: query + description: Number of policies to offset + type: integer + default: 0 responses: '200': description: Policy created successfully. @@ -2479,12 +2536,12 @@ paths: required: false - name: limit in: query - description: Number of actions to get + description: Number of runner types to get type: integer default: 100 - name: offset in: query - description: Number of actions offset + description: Number of runner types to offset type: integer default: 0 - name: sort @@ -2710,6 +2767,16 @@ paths: in: query description: Show secrets in plain text type: boolean + - name: limit + in: query + description: Number of API keys to get + type: integer + default: 50 + - name: offset + in: query + description: Number of API keys to offset + type: integer + default: 0 x-parameters: - name: user in: context @@ -2859,7 +2926,7 @@ paths: default: 50 - name: offset in: query - description: Number of actions offset + description: Number of rule enforcements to offset type: integer default: 0 - name: sort @@ -3010,12 +3077,12 @@ paths: parameters: - name: limit in: query - description: Number of actions to get + description: Number of traces to get type: integer default: 100 - name: offset in: query - description: Number of actions offset + description: Number of traces to offset type: integer default: 0 - name: sort @@ -3110,12 +3177,12 @@ paths: parameters: - name: limit in: query - description: Number of actions to get + description: Number of trigger types to get type: integer default: 100 - name: offset in: query - description: Number of actions offset + description: Number of trigger types to offset type: integer default: 0 - name: sort @@ -3363,12 +3430,12 @@ paths: parameters: - name: limit in: query - description: Number of actions to get + description: Number of trigger instances to get type: integer default: 100 - name: offset in: query - description: Number of actions offset + description: Number of trigger instances to offset type: integer default: 0 - name: sort @@ -3920,6 +3987,16 @@ definitions: x-nullable: true description: User context under which action should run (admins only) default: '' + ExecutionUpdateRequest: + type: object + properties: + status: + description: The current status of the action execution. + type: string + enum: {{ LIVEACTION_STATUSES }} + result: + type: object + additionalProperties: False ExecutionFilters: type: object KeyValuePair: