From 571c0b77f95b076747f5cba1150ed3b469803fde Mon Sep 17 00:00:00 2001 From: Sean Eagan Date: Thu, 24 May 2018 13:36:19 -0500 Subject: [PATCH] Add command to rollback release to CLI and API This adds a command to the CLI and API to rollback a release name to a specified version. Change-Id: Ie1434da42ccc75c658b7bde7164b3f4c909be7c4 --- armada/api/controller/rollback.py | 64 +++++++++ armada/api/server.py | 2 + armada/cli/rollback.py | 124 ++++++++++++++++++ armada/common/client.py | 9 ++ armada/common/policies/service.py | 6 + armada/exceptions/tiller_exceptions.py | 10 ++ armada/handlers/armada.py | 2 + armada/handlers/tiller.py | 50 +++++-- armada/shell.py | 3 + .../unit/api/test_rollback_controller.py | 65 +++++++++ armada/tests/unit/fake_policy.py | 1 + armada/tests/unit/handlers/test_tiller.py | 23 ++++ charts/armada/values.yaml | 1 + doc/source/commands/index.rst | 1 + doc/source/commands/rollback.rst | 32 +++++ doc/source/operations/guide-api.rst | 57 ++++++++ doc/source/operations/guide-use-armada.rst | 6 + etc/armada/policy.yaml | 4 + swagger/swaggerV2-api.yaml | 55 +++++++- swagger/swaggerV3-api.yaml | 62 ++++++++- 20 files changed, 562 insertions(+), 15 deletions(-) create mode 100644 armada/api/controller/rollback.py create mode 100644 armada/cli/rollback.py create mode 100644 armada/tests/unit/api/test_rollback_controller.py create mode 100644 doc/source/commands/rollback.rst diff --git a/armada/api/controller/rollback.py b/armada/api/controller/rollback.py new file mode 100644 index 00000000..c94f8a4b --- /dev/null +++ b/armada/api/controller/rollback.py @@ -0,0 +1,64 @@ +# Copyright 2018 The Armada Authors. +# +# Licensed 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. + +import json + +import falcon +from oslo_config import cfg + +from armada import api +from armada.common import policy +from armada.handlers.tiller import Tiller + +CONF = cfg.CONF + + +class Rollback(api.BaseResource): + """Controller for performing a rollback of a release + """ + + @policy.enforce('armada:rollback_release') + def on_post(self, req, resp, release): + try: + dry_run = req.get_param_as_bool('dry_run') + + tiller = Tiller( + tiller_host=req.get_param('tiller_host'), + tiller_port=req.get_param_as_int( + 'tiller_port') or CONF.tiller_port, + tiller_namespace=req.get_param( + 'tiller_namespace', default=CONF.tiller_namespace), + dry_run=dry_run) + + tiller.rollback_release( + release, + req.get_param_as_int('version') or 0, + wait=req.get_param_as_bool('wait'), + timeout=req.get_param_as_int('timeout') or 0) + + resp.body = json.dumps( + { + 'message': ('(dry run) ' if dry_run else '') + + 'Rollback of {} complete.'.format(release), + } + ) + + resp.content_type = 'application/json' + resp.status = falcon.HTTP_200 + except Exception as e: + self.logger.exception('Caught unexpected exception') + err_message = 'Failed to rollback release: {}'.format(e) + self.error(req.context, err_message) + self.return_error( + resp, falcon.HTTP_500, message=err_message) diff --git a/armada/api/server.py b/armada/api/server.py index fe7308aa..1b8479b7 100644 --- a/armada/api/server.py +++ b/armada/api/server.py @@ -23,6 +23,7 @@ from armada.api.controller.armada import Apply from armada.api.middleware import AuthMiddleware from armada.api.middleware import ContextMiddleware from armada.api.middleware import LoggingMiddleware +from armada.api.controller.rollback import Rollback from armada.api.controller.test import TestReleasesReleaseNameController from armada.api.controller.test import TestReleasesManifestController from armada.api.controller.health import Health @@ -61,6 +62,7 @@ def create(enable_middleware=CONF.middleware): ('health', Health()), ('apply', Apply()), ('releases', Release()), + ('rollback/{release}', Rollback()), ('status', Status()), ('tests', TestReleasesManifestController()), ('test/{release}', TestReleasesReleaseNameController()), diff --git a/armada/cli/rollback.py b/armada/cli/rollback.py new file mode 100644 index 00000000..76c3a080 --- /dev/null +++ b/armada/cli/rollback.py @@ -0,0 +1,124 @@ +# Copyright 2018 The Armada Authors. +# +# Licensed 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. + +import click +from oslo_config import cfg + +from armada.cli import CliAction +from armada.handlers.tiller import Tiller + +CONF = cfg.CONF + + +@click.group() +def rollback(): + """ Rollback a helm release + + """ + + +DESC = """ +This command performs a rollback on the specified release. + +To rollback a release, run: + + \b + $ armada rollback --release my_release + +""" + +SHORT_DESC = "Command performs a release rollback." + + +@rollback.command(name='rollback', + help=DESC, + short_help=SHORT_DESC) +@click.option('--release', + help="Release to rollback.", + type=str) +@click.option('--version', + help="Version of release to rollback to. 0 represents the " + "previous release", + type=int, + default=0) +@click.option('--dry-run', + help="Perform a dry-run rollback.", + is_flag=True) +@click.option('--tiller-host', + help="Tiller host IP.", + default=None) +@click.option('--tiller-port', + help="Tiller host port.", + type=int, + default=CONF.tiller_port) +@click.option('--tiller-namespace', '-tn', + help="Tiller namespace.", + type=str, + default=CONF.tiller_namespace) +@click.option('--timeout', + help="Specifies time to wait for rollback to complete.", + type=int, + default=0) +@click.option('--wait', + help=("Wait until rollback is complete before returning."), + is_flag=True) +@click.option('--debug', + help="Enable debug logging.", + is_flag=True) +@click.pass_context +def rollback_charts(ctx, release, version, dry_run, tiller_host, tiller_port, + tiller_namespace, timeout, wait, debug): + CONF.debug = debug + Rollback(ctx, release, version, dry_run, tiller_host, tiller_port, + tiller_namespace, timeout, wait).safe_invoke() + + +class Rollback(CliAction): + def __init__(self, + ctx, + release, + version, + dry_run, + tiller_host, + tiller_port, + tiller_namespace, + timeout, + wait): + super(Rollback, self).__init__() + self.ctx = ctx + self.release = release + self.version = version + self.dry_run = dry_run + self.tiller_host = tiller_host + self.tiller_port = tiller_port + self.tiller_namespace = tiller_namespace + self.timeout = timeout + self.wait = wait + + def invoke(self): + tiller = Tiller( + tiller_host=self.tiller_host, tiller_port=self.tiller_port, + tiller_namespace=self.tiller_namespace, dry_run=self.dry_run) + + response = tiller.rollback_release( + self.release, + self.version, + wait=self.wait, + timeout=self.timeout) + + self.output(response) + + def output(self, response): + self.logger.info(('(dry run) ' if self.dry_run else '') + + 'Rollback of %s complete.', self.release) diff --git a/armada/common/client.py b/armada/common/client.py index a851db67..a8c5ef63 100644 --- a/armada/common/client.py +++ b/armada/common/client.py @@ -130,6 +130,15 @@ class ArmadaClient(object): return resp.json() + def post_rollback_release(self, release, query=None, timeout=None): + + endpoint = self._set_endpoint('1.0', 'rollback/{}'.format(release)) + resp = self.session.get(endpoint, query=query, timeout=timeout) + + self._check_response(resp) + + return resp.json() + def get_test_release(self, release=None, query=None, timeout=None): endpoint = self._set_endpoint('1.0', 'test/{}'.format(release)) diff --git a/armada/common/policies/service.py b/armada/common/policies/service.py index 63488d64..f5b54633 100644 --- a/armada/common/policies/service.py +++ b/armada/common/policies/service.py @@ -36,6 +36,12 @@ armada_policies = [ check_str=base.RULE_ADMIN_REQUIRED, description='Test manifest', operations=[{'path': '/api/v1.0/tests/', 'method': 'POST'}]), + policy.DocumentedRuleDefault( + name=base.ARMADA % 'rollback_release', + check_str=base.RULE_ADMIN_REQUIRED, + description='Rollback release', + operations=[{'path': '/api/v1.0/rollback/{release}', 'method': 'POST'}] + ), ] diff --git a/armada/exceptions/tiller_exceptions.py b/armada/exceptions/tiller_exceptions.py index 901cc85c..f8c0cc9f 100644 --- a/armada/exceptions/tiller_exceptions.py +++ b/armada/exceptions/tiller_exceptions.py @@ -154,6 +154,16 @@ class GetReleaseContentException(TillerException): super(GetReleaseContentException, self).__init__(message) +class RollbackReleaseException(TillerException): + '''Exception that occurs during a failed Release Rollback''' + + def __init__(self, release, version): + message = 'Failed to rollback release {} to version {}'.format( + release, version) + + super(RollbackReleaseException, self).__init__(message) + + class TillerPodNotFoundException(TillerException): ''' Exception that occurs when a tiller pod cannot be found using the labels diff --git a/armada/handlers/armada.py b/armada/handlers/armada.py index e3c0b084..34774261 100644 --- a/armada/handlers/armada.py +++ b/armada/handlers/armada.py @@ -93,6 +93,8 @@ class Armada(object): self.dry_run = dry_run self.force_wait = force_wait self.timeout = timeout + # TODO: Use dependency injection i.e. pass in a Tiller instead of + # creating it here. self.tiller = Tiller( tiller_host=tiller_host, tiller_port=tiller_port, tiller_namespace=tiller_namespace, dry_run=dry_run) diff --git a/armada/handlers/tiller.py b/armada/handlers/tiller.py index 766e27c8..dc29b4d1 100644 --- a/armada/handlers/tiller.py +++ b/armada/handlers/tiller.py @@ -22,6 +22,7 @@ from hapi.services.tiller_pb2 import GetVersionRequest from hapi.services.tiller_pb2 import InstallReleaseRequest from hapi.services.tiller_pb2 import ListReleasesRequest from hapi.services.tiller_pb2_grpc import ReleaseServiceStub +from hapi.services.tiller_pb2 import RollbackReleaseRequest from hapi.services.tiller_pb2 import TestReleaseRequest from hapi.services.tiller_pb2 import UninstallReleaseRequest from hapi.services.tiller_pb2 import UpdateReleaseRequest @@ -322,7 +323,6 @@ class Tiller(object): Update a Helm Release ''' timeout = self._check_timeout(wait, timeout) - rel_timeout = self.timeout if not timeout else timeout LOG.info('Helm update release%s: wait=%s, timeout=%s', (' (dry run)' if self.dry_run else ''), @@ -349,7 +349,7 @@ class Tiller(object): timeout=timeout) update_msg = stub.UpdateRelease( - release_request, rel_timeout + GRPC_EPSILON, + release_request, timeout + GRPC_EPSILON, metadata=self.metadata) tiller_result = TillerResult( @@ -376,7 +376,6 @@ class Tiller(object): Create a Helm Release ''' timeout = self._check_timeout(wait, timeout) - rel_timeout = self.timeout if not timeout else timeout LOG.info('Helm install release%s: wait=%s, timeout=%s', (' (dry run)' if self.dry_run else ''), @@ -400,7 +399,7 @@ class Tiller(object): timeout=timeout) install_msg = stub.InstallRelease( - release_request, rel_timeout + GRPC_EPSILON, + release_request, timeout + GRPC_EPSILON, metadata=self.metadata) tiller_result = TillerResult( @@ -683,9 +682,44 @@ class Tiller(object): else: LOG.error("Unable to exectue name: % type: %s", name, action_type) + def rollback_release(self, + release_name, + version, + wait=False, + timeout=None): + ''' + Rollback a helm release. + ''' + + timeout = self._check_timeout(wait, timeout) + + LOG.debug('Helm rollback%s of release=%s, version=%s, ' + 'wait=%s, timeout=%s', + (' (dry run)' if self.dry_run else ''), + release_name, version, wait, timeout) + try: + stub = ReleaseServiceStub(self.channel) + rollback_request = RollbackReleaseRequest( + name=release_name, + version=version, + dry_run=self.dry_run, + wait=wait, + timeout=timeout) + + rollback_msg = stub.RollbackRelease( + rollback_request, + timeout + GRPC_EPSILON, + metadata=self.metadata) + LOG.debug('RollbackRelease= %s', rollback_msg) + return + + except Exception: + raise ex.RollbackReleaseException(release_name, version) + def _check_timeout(self, wait, timeout): - if wait and timeout <= 0: - LOG.warn('Tiller timeout is invalid or unspecified, ' - 'using default %ss.', const.DEFAULT_TILLER_TIMEOUT) - timeout = const.DEFAULT_TILLER_TIMEOUT + if timeout is None or timeout <= 0: + if wait: + LOG.warn('Tiller timeout is invalid or unspecified, ' + 'using default %ss.', self.timeout) + timeout = self.timeout return timeout diff --git a/armada/shell.py b/armada/shell.py index 1130be57..36a5d6d6 100644 --- a/armada/shell.py +++ b/armada/shell.py @@ -20,6 +20,7 @@ from oslo_log import log from armada.cli.apply import apply_create from armada.cli.delete import delete_charts +from armada.cli.rollback import rollback_charts from armada.cli.test import test_charts from armada.cli.tiller import tiller_service from armada.cli.validate import validate_manifest @@ -54,6 +55,7 @@ def main(ctx, debug, api, url, token): \b $ armada apply $ armada delete + $ armada rollback $ armada test $ armada tiller $ armada validate @@ -93,6 +95,7 @@ def main(ctx, debug, api, url, token): main.add_command(apply_create) main.add_command(delete_charts) +main.add_command(rollback_charts) main.add_command(test_charts) main.add_command(tiller_service) main.add_command(validate_manifest) diff --git a/armada/tests/unit/api/test_rollback_controller.py b/armada/tests/unit/api/test_rollback_controller.py new file mode 100644 index 00000000..793e22a9 --- /dev/null +++ b/armada/tests/unit/api/test_rollback_controller.py @@ -0,0 +1,65 @@ +# Copyright 2017 AT&T Intellectual Property. All other rights reserved. +# +# Licensed 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. + +import json + +import mock + +from armada.api.controller import rollback +from armada.common.policies import base as policy_base +from armada.tests import test_utils +from armada.tests.unit.api import base + + +class RollbackReleaseControllerTest(base.BaseControllerTest): + + @mock.patch.object(rollback, 'Tiller') + def test_rollback_controller_pass(self, mock_tiller): + rules = {'armada:rollback_release': '@'} + self.policy.set_rules(rules) + + rollback_release = mock_tiller.return_value.rollback_release + rollback_release.return_value = None + + resp = self.app.simulate_post('/api/v1.0/rollback/test-release') + self.assertEqual(200, resp.status_code) + self.assertEqual('Rollback of test-release complete.', + json.loads(resp.text)['message']) + + +@test_utils.attr(type=['negative']) +class RollbackReleaseControllerNegativeTest(base.BaseControllerTest): + + @mock.patch.object(rollback, 'Tiller') + def test_rollback_controller_tiller_exc_return_500(self, mock_tiller): + rules = {'armada:rollback_release': '@'} + self.policy.set_rules(rules) + + mock_tiller.side_effect = Exception + + resp = self.app.simulate_post('/api/v1.0/rollback/fake-release') + self.assertEqual(500, resp.status_code) + + +@test_utils.attr(type=['negative']) +class RollbackReleaseControllerNegativeRbacTest(base.BaseControllerTest): + + def test_rollback_release_insufficient_permissions(self): + """Tests the GET /api/v1.0/rollback/{release} endpoint returns 403 + following failed authorization. + """ + rules = {'armada:rollback_release': policy_base.RULE_ADMIN_REQUIRED} + self.policy.set_rules(rules) + resp = self.app.simulate_post('/api/v1.0/rollback/fake-release') + self.assertEqual(403, resp.status_code) diff --git a/armada/tests/unit/fake_policy.py b/armada/tests/unit/fake_policy.py index fff32eb7..679b7a68 100644 --- a/armada/tests/unit/fake_policy.py +++ b/armada/tests/unit/fake_policy.py @@ -19,6 +19,7 @@ policy_data = """ "armada:validate_manifest": "rule:admin_required" "armada:test_release": "rule:admin_required" "armada:test_manifest": "rule:admin_required" +"armada:rollback_release": "rule:admin_required" "tiller:get_status": "rule:admin_required" "tiller:get_release": "rule:admin_required" """ diff --git a/armada/tests/unit/handlers/test_tiller.py b/armada/tests/unit/handlers/test_tiller.py index 824b8091..bf9f014c 100644 --- a/armada/tests/unit/handlers/test_tiller.py +++ b/armada/tests/unit/handlers/test_tiller.py @@ -279,3 +279,26 @@ class TillerTestCase(base.ArmadaTestCase): uninstall_release_stub.assert_called_once_with( mock_uninstall_release_request.return_value, tiller_obj.timeout, metadata=tiller_obj.metadata) + + @mock.patch('armada.handlers.tiller.K8s') + @mock.patch('armada.handlers.tiller.grpc') + @mock.patch.object(tiller, 'RollbackReleaseRequest') + @mock.patch.object(tiller, 'ReleaseServiceStub') + def test_rollback_release(self, mock_release_service_stub, + mock_rollback_release_request, _, __): + mock_release_service_stub.return_value.RollbackRelease\ + .return_value = {} + + tiller_obj = tiller.Tiller('host', '8080', None) + + self.assertIsNone(tiller_obj.rollback_release('release', 0)) + + mock_release_service_stub.assert_called_once_with( + tiller_obj.channel) + rollback_release_stub = mock_release_service_stub.return_value. \ + RollbackRelease + + rollback_release_stub.assert_called_once_with( + mock_rollback_release_request.return_value, tiller_obj.timeout + + tiller.GRPC_EPSILON, + metadata=tiller_obj.metadata) diff --git a/charts/armada/values.yaml b/charts/armada/values.yaml index 7eb45f09..eefaa54f 100644 --- a/charts/armada/values.yaml +++ b/charts/armada/values.yaml @@ -176,6 +176,7 @@ conf: policy: admin_required: 'role:admin' 'armada:create_endpoints': 'rule:admin_required' + 'armada:rollback_release': 'rule:admin_required' 'armada:test_manifest': 'rule:admin_required' 'armada:test_release': 'rule:admin_required' 'armada:validate_manifest': 'rule:admin_required' diff --git a/doc/source/commands/index.rst b/doc/source/commands/index.rst index d240d77f..c76270a0 100644 --- a/doc/source/commands/index.rst +++ b/doc/source/commands/index.rst @@ -11,6 +11,7 @@ Commands Guide :caption: Contents: apply.rst + rollback.rst test.rst tiller.rst validate.rst diff --git a/doc/source/commands/rollback.rst b/doc/source/commands/rollback.rst new file mode 100644 index 00000000..a8620bd3 --- /dev/null +++ b/doc/source/commands/rollback.rst @@ -0,0 +1,32 @@ +Armada - Rollback +================= + + +Commands +-------- + +.. code:: bash + + Usage: armada rollback [OPTIONS] + + This command performs a rollback on the specified release. + + To rollback a release, run: + + $ armada rollback --release my_release + + Options: + --dry-run Perform a dry-run rollback. + --release TEXT Release to rollback. + --tiller-host TEXT Tiller Host IP + --tiller-port INTEGER Tiller Host Port + -tn, --tiller-namespace TEXT Tiller Namespace + --timeout INTEGER Tiller Host IP + --version INTEGER Version of release to rollback to. 0 represents the previous release + --wait Version of release to rollback to. 0 represents the previous release + --help Show this message and exit. + +Synopsis +-------- + +The rollback command will perform helm rollback on the release. diff --git a/doc/source/operations/guide-api.rst b/doc/source/operations/guide-api.rst index a8471e6a..b8b4b593 100644 --- a/doc/source/operations/guide-api.rst +++ b/doc/source/operations/guide-api.rst @@ -230,6 +230,63 @@ Successful installation/update of manifest Unable to Authorize or Permission +**405** +^^^^^^^ + +Failed to perform action + +POST ``/rollback/{release}`` +---------------------------- + + +Summary ++++++++ + +Rollback release name + + +Parameters +++++++++++ + +.. csv-table:: + :delim: | + :header: "Name", "Located in", "Required", "Type", "Format", "Properties", "Description" + :widths: 20, 15, 10, 10, 10, 20, 30 + + release | path | Yes | string | | | name of the release to rollback + version | query | No | integer | | | version of the release to rollback to + dry_run | query | No | boolean | | | perform dry run + wait | query | No | boolean | | | whether to wait for rollback to complete before returning + timeout | query | No | integer | | | time to wait for rollback to complete before timing out + +Request ++++++++ + + +Responses ++++++++++ + +**200** +^^^^^^^ + +Succesfully Test release response + +**Example:** + +.. code-block:: javascript + + { + "message": { + "message": "Rollback of release xyz complete" + } + } + +**403** +^^^^^^^ + +Unable to Authorize or Permission + + **405** ^^^^^^^ diff --git a/doc/source/operations/guide-use-armada.rst b/doc/source/operations/guide-use-armada.rst index 90d29473..df6fbecc 100644 --- a/doc/source/operations/guide-use-armada.rst +++ b/doc/source/operations/guide-use-armada.rst @@ -108,6 +108,12 @@ b. Helm Install docker exec armada armada test --file=/examples/openstack-helm.yaml +8. Rolling back Releases: + +.. code:: bash + + docker exec armada armada rollback --release=armada-keystone + Overriding Manifest Values -------------------------- It is possible to override manifest values from the command line using the diff --git a/etc/armada/policy.yaml b/etc/armada/policy.yaml index 4ed6251d..589ad21a 100644 --- a/etc/armada/policy.yaml +++ b/etc/armada/policy.yaml @@ -11,6 +11,10 @@ # POST api/v1.0/apply/ #"armada:create_endpoints": "rule:admin_required" +# rollback release +# POST api/v1.0/rollback/{release} +#"armada:rollback_release": "rule:admin_required" + # validate installed manifest # POST /api/v1.0/validate/ #"armada:validate_manifest": "rule:admin_required" diff --git a/swagger/swaggerV2-api.yaml b/swagger/swaggerV2-api.yaml index fe15376e..f2307366 100644 --- a/swagger/swaggerV2-api.yaml +++ b/swagger/swaggerV2-api.yaml @@ -153,7 +153,7 @@ paths: /api/v1.0/test/{release_name}: post: description: Test specified release name - operationId: postReleaseName + operationId: postTestReleaseName parameters: - name: release_name in: path @@ -173,6 +173,39 @@ paths: $ref: "#/responses/err-forbidden" '500': $ref: "#/responses/err-server-error" + /api/v1.0/rollback/{release_name}: + post: + description: Rollback the specified release name + operationId: postRollbackReleaseName + parameters: + - name: release_name + in: path + required: true + description: Name of the release to be rolled back + type: string + - name: version + in: query + required: false + type: integer + description: Version number of release to rollback to. 0 represents + the previous version + default: 0 + - $ref: "#/parameters/x-auth-token" + - $ref: "#/parameters/tiller-host" + - $ref: "#/parameters/tiller-port" + - $ref: "#/parameters/tiller-namespace" + - $ref: "#/parameters/dry-run" + - $ref: "#/parameters/wait" + - $ref: "#/parameters/timeout" + responses: + '200': + $ref: "#/responses/response-post-rollback-release" + '401': + $ref: "#/responses/err-no-auth" + '403': + $ref: "#/responses/err-forbidden" + '500': + $ref: "#/responses/err-server-error" /api/v1.0/validatedesign: post: description: Validate a design @@ -257,20 +290,22 @@ parameters: name: dry_run required: false type: boolean - description: Flag to simulate an install if set to True + description: Flag to simulate an action if set to True default: False wait: in: query name: wait required: false type: boolean - description: Specifies whether Tiller should wait until all charts are deployed. + description: Specifies whether Tiller should wait until the action is + complete before returning. timeout: in: query name: timeout required: false type: integer - description: Specifies time in seconds Tiller should wait for charts to deploy until timing out. + description: Specifies time in seconds Tiller should wait for the action to + complete before timing out. default: 3600 responses: # HTTP error responses @@ -297,6 +332,13 @@ responses: schema: allOf: - $ref: "#/definitions/applyresult" + response-post-rollback-release: + description: Response of a rollback of a specified release name + schema: + allOf: + - $ref: "#/definitions/rollbackresult" + example: + message: "Rollback of release xyz complete" response-post-test-release: description: Response of a test of a specified release name schema: @@ -405,6 +447,11 @@ definitions: type: object additionalProperties: type: string + rollbackresult: + type: object + properties: + message: + type: string testresult: type: object properties: diff --git a/swagger/swaggerV3-api.yaml b/swagger/swaggerV3-api.yaml index 02d70614..bcfea6bc 100644 --- a/swagger/swaggerV3-api.yaml +++ b/swagger/swaggerV3-api.yaml @@ -180,7 +180,7 @@ paths: tags: - Tests description: Test specified release name - operationId: postReleaseName + operationId: postTestReleaseName parameters: - $ref: "#/components/parameters/release-name" - $ref: "#/components/parameters/x-auth-token" @@ -199,7 +199,43 @@ paths: options: tags: - Tests - operationId: optReleaseName + operationId: optTestReleaseName + parameters: + - $ref: "#/components/parameters/release-name" + responses: + '200': + $ref: "#/components/responses/response-options" + /api/v1.0/rollback/{release_name}: + post: + tags: + - Rollback + description: Rollback the specified release name + operationId: postRollbackReleaseName + parameters: + - $ref: "#/components/parameters/release-name" + - $ref: "#/components/parameters/release-version" + - $ref: "#/components/parameters/x-auth-token" + - $ref: "#/components/parameters/tiller-host" + - $ref: "#/components/parameters/tiller-port" + - $ref: "#/components/parameters/tiller-namespace" + - $ref: "#/components/parameters/dry-run" + - $ref: "#/components/parameters/wait" + - $ref: "#/components/parameters/timeout" + responses: + '200': + $ref: "#/components/responses/response-post-rollback-release" + '401': + $ref: "#/components/responses/err-no-auth" + '403': + $ref: "#/components/responses/err-forbidden" + '500': + $ref: "#/components/responses/err-server-error" + options: + tags: + - Rollback + operationId: optRollbackReleaseName + parameters: + - $ref: "#/components/parameters/release-name" responses: '200': $ref: "#/components/responses/response-options" @@ -242,9 +278,16 @@ components: in: path name: release_name required: true - description: Name of the release to be tested + description: Name of the release to be acted upon schema: type: string + release-version: + in: query + name: version + required: false + description: "Version number of release to rollback to. 0 represents the previous version. Default: `0`" + schema: + type: integer tiller-host: in: query name: tiller_host @@ -369,6 +412,12 @@ components: application/json: schema: $ref: "#/components/schemas/result-apply" + response-post-rollback-release: + description: Response of a rollback of a specified release name + content: + application/json: + schema: + $ref: "#/components/schemas/result-rollback" response-post-test-release: description: Response of a test of a specified release name content: @@ -488,6 +537,13 @@ components: diff: key1: val1 key2: val2 + result-rollback: + type: object + properties: + message: + type: string + example: + message: "Rollback of release xyz complete" result-test: type: object properties: