def send_email(environment, subject, message='', to_admins=True, recipients=None): """ Call a Django management command to send an email. :param environment: The Environement object :param subject: Email subject :param message: Email message :param to_admins: True if mail should be sent to Django admins :param recipients: List of additional addresses to send mail to """ if environment.fab_settings_config.email_enabled: print(color_summary(f">> Sending email: {subject}")) args = [ message, '--subject', subject, '--html', ] if to_admins: args.append('--to-admins') if recipients: if isinstance(recipients, list): recipients = ','.join(recipients) args.extend(['--recipients', recipients]) commcare_cloud( environment.name, 'django-manage', '--quiet', 'send_email', *args, show_command=False )
def mail_admins(environment, subject, message): if environment.fab_settings_config.email_enabled: commcare_cloud( environment.name, 'django-manage', 'mail_admins', '--subject', subject, message, '--environment', environment.meta_config.deploy_env )
def deploy_commcare(self, environment, deploy_revs, args, unknown_args): fab_func_args = self.get_deploy_commcare_fab_func_args(args) fab_settings = [args.fab_settings] if args.fab_settings else [] for name, rev in deploy_revs: var = 'code_branch' if name == 'commcare' else '{}_code_branch'.format(name) fab_settings.append('{}={}'.format(var, rev)) commcare_cloud(environment.name, 'fab', 'deploy_commcare{}'.format(fab_func_args), '--set', ','.join(fab_settings), branch=args.branch, *unknown_args)
def deploy_commcare(self, environment, commcare_rev, args, unknown_args): fab_func_args = self.get_deploy_commcare_fab_func_args(args) fab_settings = 'code_branch={}{}'.format( commcare_rev, ',{}'.format(args.fab_settings) if args.fab_settings else '' ) commcare_cloud(environment.name, 'fab', 'deploy_commcare{}'.format(fab_func_args), '--set', fab_settings, branch=args.branch, *unknown_args)
def call_record_deploy_success(environment, diff, start_time, end_time): delta = end_time - start_time args = [ '--user', get_default_username(), '--environment', environment.meta_config.deploy_env, '--url', diff.url, '--minutes', str(int(delta.total_seconds() // 60)), '--commit', diff.deploy_commit, ] commcare_cloud(environment.name, 'django-manage', 'record_deploy_success', *args)
def deploy_commcare(self, environment, commcare_branch, args, unknown_args): fab_func_args = self.get_deploy_commcare_fab_func_args(args) commcare_cloud(environment.name, 'fab', 'deploy_commcare{}'.format(fab_func_args), '--set', 'code_branch={}'.format(commcare_branch), branch=args.branch, *unknown_args)
def apply_migration_plans(environment, migration_plans, remote_migration_state_manager, log=lambda x: None): for migration_plan in migration_plans: migration = migration_plan.migration log(' [{:0>4} {}]'.format(migration.number, migration.slug)) for start_address, end_address in migration_plan.moves: log(' {} => {}'.format(start_address, end_address)) commcare_cloud(environment.name, 'terraform', 'state', 'mv', start_address, end_address) remote_migration_state_manager.push( RemoteMigrationState(number=migration.number, slug=migration.slug))
def apply_migration_plans(environment, migration_plans, remote_migration_state_manager, log=lambda x: None): for migration_plan in migration_plans: migration = migration_plan.migration log(' [{:0>4} {}]'.format(migration.number, migration.slug)) for start_address, end_address in migration_plan.moves: log(' {} => {}'.format(start_address, end_address)) commcare_cloud(environment.paths.env_name, 'terraform', 'state', 'mv', start_address, end_address) remote_migration_state_manager.push( RemoteMigrationState(number=migration.number, slug=migration.slug))
def run(self, args, unknown_args): args.playbook = 'deploy_stack.yml' unknown_args += ('--tags=services',) rc = AnsiblePlaybook(self.parser).run(args, unknown_args) if ask("Would you like to update supervisor to use the new configurations?"): carryover_args = [] if args.limit: carryover_args.extend(['--limit', args.limit]) commcare_cloud( args.env_name, 'run-shell-command', 'webworkers:celery:pillowtop:formplayer', 'supervisorctl reread; supervisorctl update', '-b', *carryover_args ) else: return rc
def run(self, args, unknown_args): args.playbook = 'deploy_stack.yml' unknown_args += ('--tags=services', ) rc = AnsiblePlaybook(self.parser).run(args, unknown_args) if ask("Would you like to update supervisor to use the new configurations?" ): carryover_args = [] if args.limit: carryover_args.extend(['--limit', args.limit]) commcare_cloud(args.env_name, 'run-shell-command', 'webworkers:celery:pillowtop:formplayer', 'supervisorctl reread; supervisorctl update', '-b', *carryover_args) else: return rc
def deploy_formplayer(self, environment, args, unknown_args): def run_ansible_playbook_command(): skip_check = True environment.create_generated_yml() ansible_context = AnsibleContext(args) return ansible_playbook.run_ansible_playbook( environment, 'deploy_stack.yml', ansible_context, skip_check=skip_check, quiet=skip_check, always_skip_check=skip_check, limit='formplayer', use_factory_auth=False, unknown_args=('--tags=formplayer_deploy',), respect_ansible_skip=True, ) rc = run_ansible_playbook_command() if rc != 0: return rc rc = commcare_cloud( args.env_name, 'run-shell-command', 'formplayer', ('supervisorctl reread; ' 'supervisorctl update {project}-{deploy_env}-formsplayer-spring; ' 'supervisorctl restart {project}-{deploy_env}-formsplayer-spring').format( project='commcare-hq', deploy_env=environment.meta_config.deploy_env, ), '-b', ) if rc != 0: return rc
def run(self, args, unknown_args): return commcare_cloud(args.env_name, 'ansible-playbook', 'deploy_localsettings.yml', tags='localsettings', branch=args.branch, *unknown_args)
def deploy_commcare(environment, args, unknown_args): deploy_revs, diffs = get_deploy_revs_and_diffs(environment, args) if not confirm_deploy(environment, deploy_revs, diffs, args): print(color_notice("Aborted by user")) return 1 fab_func_args = get_deploy_commcare_fab_func_args(args) fab_settings = [args.fab_settings] if args.fab_settings else [] for name, rev in deploy_revs.items(): var = 'code_branch' if name == 'commcare' else '{}_code_branch'.format( name) fab_settings.append('{}={}'.format(var, rev)) context = DeployContext(service_name="CommCare HQ", revision=args.commcare_rev, diff=_get_diff(environment, deploy_revs), start_time=datetime.utcnow()) record_deploy_start(environment, context) rc = commcare_cloud(environment.name, 'fab', 'deploy_commcare{}'.format(fab_func_args), '--set', ','.join(fab_settings), branch=args.branch, *unknown_args) if rc != 0: record_deploy_failed(environment, context) return rc if not args.skip_record: record_successful_deploy(environment, context) return 0
def record_deploy_in_datadog(environment, diff, tdelta): if environment.public_vars.get('DATADOG_ENABLED', False): print(color_summary(f">> Recording deploy in Datadog")) diff_url = f"\nDiff link: [Git Diff]({diff.url})" deploy_notification_text = ( "Formplayer has been successfully deployed to " "*{}* by *{}* in *{}* minutes.\nRelease Name: {}{}".format( environment.name, get_default_username(), int(tdelta.total_seconds() / 60) or '?', environment.new_release_name(), diff_url)) commcare_cloud(environment.name, 'send-datadog-event', 'Formplayer Deploy Success', deploy_notification_text, '--alert_type', "success", show_command=False)
def run(self, args, unknown_args): unknown_args += ('-e', '{"_should_update_formplayer_in_place": true}') return commcare_cloud(args.env_name, 'ansible-playbook', 'deploy_localsettings.yml', tags='localsettings', branch=args.branch, *unknown_args)
def run(self, args, unknown_args): unknown_args += ('-e', '{"_should_update_formplayer_in_place": true}') rc = commcare_cloud(args.env_name, 'ansible-playbook', 'deploy_localsettings.yml', tags='localsettings', branch=args.branch, *unknown_args) if rc == 0 and ask( "Would you like to run Django checks to validate the settings?" ): environment = get_environment(args.env_name) server_args = [] try: limit_arg = unknown_args.index('--limit') except ValueError: pass else: servers = environment.inventory_manager.get_hosts( unknown_args[limit_arg + 1]) server_args.extend(['--server', servers[0]]) commcare_cloud(args.env_name, 'django-manage', *(['check', '--deploy'] + server_args)) commcare_cloud( args.env_name, 'django-manage', *(['check', '--deploy', '-t', 'database'] + server_args)) commcare_cloud(args.env_name, 'django-manage', *(['check_services'] + server_args)) else: return rc
def deploy_formplayer(environment, args): print(color_notice("\nPreparing to deploy Formplayer to: "), end="") print(f"{environment.name}\n") tag_commits = environment.fab_settings_config.tag_deploy_commits repo = github_repo('dimagi/formplayer', require_write_permissions=tag_commits) diff = get_deploy_diff(environment, repo) diff.print_deployer_diff() context = DeployContext(service_name="Formplayer", revision=args.commcare_rev, diff=diff, start_time=datetime.utcnow()) if not ask('Continue with deploy?', quiet=args.quiet): return 1 record_deploy_start(environment, context) rc = run_ansible_playbook_command(environment, args) if rc != 0: record_deploy_failed(environment, context) return rc rc = commcare_cloud( args.env_name, 'run-shell-command', 'formplayer', ('supervisorctl reread; ' 'supervisorctl update {project}-{deploy_env}-formsplayer-spring; ' 'supervisorctl restart {project}-{deploy_env}-formsplayer-spring' ).format( project='commcare-hq', deploy_env=environment.meta_config.deploy_env, ), '-b', ) if rc != 0: record_deploy_failed(environment, context) return rc record_deploy_success(environment, context) return 0