Пример #1
0
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
        )
Пример #2
0
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
        )
Пример #3
0
 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)
Пример #4
0
 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)
Пример #5
0
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)
Пример #6
0
 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))
Пример #9
0
 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
Пример #10
0
 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
Пример #11
0
 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)
Пример #13
0
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
Пример #14
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)
Пример #15
0
 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)
Пример #16
0
 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
Пример #17
0
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
Пример #18
0
 def run(self, args, unknown_args):
     return commcare_cloud(args.env_name, 'ansible-playbook', 'deploy_localsettings.yml',
                           tags='localsettings', branch=args.branch, *unknown_args)