Skip to content

Commit

Permalink
Merge pull request #28 from NitorCreations/disable-rollback
Browse files Browse the repository at this point in the history
Add disable rollback to cf deploy
  • Loading branch information
psiniemi committed Jan 4, 2023
2 parents 67fb792 + 828338b commit 1bcadbc
Show file tree
Hide file tree
Showing 3 changed files with 51 additions and 15 deletions.
16 changes: 9 additions & 7 deletions n_utils/cf_deploy.py
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@
# limitations under the License.

import collections
from dis import dis
import hashlib
import locale
import os
Expand Down Expand Up @@ -63,7 +64,7 @@ def log(message):
)


def update_stack(stack_name, template, params, dry_run=False, session=None, tags=None):
def update_stack(stack_name, template, params, dry_run=False, session=None, tags=None, disable_rollback=False):
clf = cloudformation(session=session)
chset_name = stack_name + "-" + time.strftime("%Y%m%d%H%M%S", time.gmtime())
params = get_template_arguments(stack_name, template, params)
Expand Down Expand Up @@ -102,16 +103,17 @@ def update_stack(stack_name, template, params, dry_run=False, session=None, tags
log("\033[32;1m*** Changeset ***:\033[m")
log_data(chset_data)
if not dry_run:
clf.execute_change_set(ChangeSetName=chset_id)
clf.execute_change_set(ChangeSetName=chset_id, DisableRollback=disable_rollback)
else:
clf.delete_change_set(ChangeSetName=chset_id)
return


def create_stack(stack_name, template, params, session=None, tags=None):
def create_stack(stack_name, template, params, session=None, tags=None, disable_rollback=False):
params = get_template_arguments(stack_name, template, params)
if tags:
params["Tags"] = tags
params["DisableRollback"] = disable_rollback
cloudformation(session=session).create_stack(**params)
return

Expand Down Expand Up @@ -161,9 +163,9 @@ def get_end_status(stack_name, session=None):
return status


def create_or_update_stack(stack_name, json_small, params_doc, session=None, tags=None):
def create_or_update_stack(stack_name, json_small, params_doc, session=None, tags=None, disable_rollback=False):
stack_func = get_stack_operation(stack_name, session=session)
stack_func(stack_name, json_small, params_doc, session=session, tags=tags)
stack_func(stack_name, json_small, params_doc, session=session, tags=tags, disable_rollback=disable_rollback)
return get_end_status(stack_name, session=session)


Expand Down Expand Up @@ -247,7 +249,7 @@ def resolve_ami(template_doc, session=None):
return ami_id, ami_name, ami_created


def deploy(stack_name, yaml_template, regn, dry_run=False, session=None):
def deploy(stack_name, yaml_template, regn, dry_run=False, session=None, disable_rollback=False):
os.environ["AWS_DEFAULT_REGION"] = regn
os.environ["REGION"] = regn
global REDIRECTED
Expand Down Expand Up @@ -315,7 +317,7 @@ def deploy(stack_name, yaml_template, regn, dry_run=False, session=None):

if not dry_run:
status = create_or_update_stack(
stack_name, json_small, params_doc, session=session, tags=tags
stack_name, json_small, params_doc, session=session, tags=tags, disable_rollback=disable_rollback
)
if not (status == "CREATE_COMPLETE" or status == "UPDATE_COMPLETE"):
sys.exit("Stack operation failed: end state " + status)
Expand Down
14 changes: 13 additions & 1 deletion n_utils/cli.py
Original file line number Diff line number Diff line change
Expand Up @@ -284,10 +284,22 @@ def update_stack():
help="Do not actually deploy anything, but just "
+ "assemble the json and associated parameters",
)
parser.add_argument(
"-r",
"--disable-rollback",
action="store_true",
help="Disable stack rollback on failure",
)
args = parser.parse_args()
if not os.path.isfile(args.yaml_template):
parser.error(args.yaml_template + " not found")
cf_deploy.deploy(args.stack_name, args.yaml_template, args.region, args.dry_run)
cf_deploy.deploy(
args.stack_name,
args.yaml_template,
args.region,
args.dry_run,
disable_rollback=args.disable_rollback,
)
return


Expand Down
36 changes: 29 additions & 7 deletions n_utils/includes/deploy-stack.sh
Original file line number Diff line number Diff line change
Expand Up @@ -57,7 +57,7 @@ if [ "$_ARGCOMPLETE" ]; then
fi

usage() {
echo "usage: ndt deploy-stack [-d] [-h] component stack-name ami-id bake-job" >&2
echo "usage: ndt deploy-stack [-d] [-r] [-h] component stack-name ami-id bake-job" >&2
echo "" >&2
echo "Resolves potential ECR urls and AMI Ids and then deploys the given stack either updating or creating it." >&2
echo "If pre_deploy.sh and post_deploy.sh exist and are executable in the subcompoent directory," >&2
Expand All @@ -75,6 +75,7 @@ usage() {
echo "" >&2
echo "optional arguments:" >&2
echo " -d, --dryrun dry-run - show only the change set without actually deploying it" >&2
echo " -r, --disable-rollback - disable stack rollback on failure"
echo " -h, --help show this help message and exit" >&2
exit 1
}
Expand All @@ -84,12 +85,33 @@ fi

source "$(n-include autocomplete-helpers.sh)"

set -xe
POSITIONAL_ARGS=()

if [ "$1" = "-d" ]; then
DRY_RUN="--dry-run"
shift
fi
while [[ $# -gt 0 ]]; do
case $1 in
-d|--dryrun)
DRY_RUN="--dry-run"
shift
;;
-r|--disable-rollback)
DISABLE_ROLLBACK="--disable-rollback"
shift
;;
-h|--help)
usage
;;
-*|--*)
echo "Unknown option $1"
usage
;;
*)
POSITIONAL_ARGS+=("$1")
shift
;;
esac
done
set -- "${POSITIONAL_ARGS[@]}" # restore positional parameters
set -xe
component="$1" ; shift
stackName="$1" ; shift
ARG_AMI_ID="$1"
Expand Down Expand Up @@ -120,7 +142,7 @@ fi
cd ../..

set -e
cf-update-stack "${STACK_NAME}" "${component}/stack-${ORIG_STACK_NAME}/template.yaml" "$REGION" $DRY_RUN
cf-update-stack "${STACK_NAME}" "${component}/stack-${ORIG_STACK_NAME}/template.yaml" "$REGION" $DRY_RUN $DISABLE_ROLLBACK

cd ${component}/stack-${ORIG_STACK_NAME}
if [ -z "$DRY_RUN" ] && [ -x "./post_deploy.sh" ]; then
Expand Down

0 comments on commit 1bcadbc

Please sign in to comment.