示例#1
0
def test_deploy_action(client, task_definition_revision_2):
    action = DeployAction(client, CLUSTER_NAME, SERVICE_NAME)
    updated_service = action.deploy(task_definition_revision_2)

    assert action.service.task_definition == task_definition_revision_2.arn
    assert isinstance(updated_service, EcsService)

    client.describe_services.assert_called_once_with(CLUSTER_NAME, SERVICE_NAME)
    client.update_service.assert_called_once_with(action.service.cluster, action.service.name,
                                                  action.service.desired_count, task_definition_revision_2.arn)
示例#2
0
def test_deploy_action(client, task_definition_revision_2):
    action = DeployAction(client, CLUSTER_NAME, SERVICE_NAME)
    updated_service = action.deploy(task_definition_revision_2)

    assert action.service.task_definition == task_definition_revision_2.arn
    assert isinstance(updated_service, EcsService)

    client.describe_services.assert_called_once_with(CLUSTER_NAME,
                                                     SERVICE_NAME)
    client.update_service.assert_called_once_with(
        action.service.cluster, action.service.name,
        action.service.desired_count, task_definition_revision_2.arn)
示例#3
0
def deploy(cluster, service, tag, image, command, env, secret, role, task,
           region, access_key_id, secret_access_key, profile, timeout,
           newrelic_apikey, newrelic_appid, comment, user, ignore_warnings,
           diff, deregister, rollback, exclusive_env, exclusive_secrets):
    """
    Redeploy or modify a service.

    \b
    CLUSTER is the name of your cluster (e.g. 'my-custer') within ECS.
    SERVICE is the name of your service (e.g. 'my-app') within ECS.

    When not giving any other options, the task definition will not be changed.
    It will just be duplicated, so that all container images will be pulled
    and redeployed.
    """

    try:
        client = get_client(access_key_id, secret_access_key, region, profile)
        deployment = DeployAction(client, cluster, service)

        td = get_task_definition(deployment, task)
        td.set_images(tag, **{key: value for (key, value) in image})
        td.set_commands(**{key: value for (key, value) in command})
        td.set_environment(env, exclusive_env)
        td.set_secrets(secret, exclusive_secrets)
        td.set_role_arn(role)

        if diff:
            print_diff(td)

        new_td = create_task_definition(deployment, td)

        try:
            deploy_task_definition(
                deployment=deployment,
                task_definition=new_td,
                title='Deploying new task definition',
                success_message='Deployment successful',
                failure_message='Deployment failed',
                timeout=timeout,
                deregister=deregister,
                previous_task_definition=td,
                ignore_warnings=ignore_warnings,
            )

        except TaskPlacementError as e:
            if rollback:
                click.secho('%s\n' % str(e), fg='red', err=True)
                rollback_task_definition(deployment, td, new_td)
                exit(1)
            else:
                raise

        record_deployment(tag, newrelic_apikey, newrelic_appid, comment, user)

    except (EcsError, NewRelicException) as e:
        click.secho('%s\n' % str(e), fg='red', err=True)
        exit(1)
示例#4
0
def deploy(cluster, service, tag, image, command, env, role, task, region,
           access_key_id, secret_access_key, profile, timeout, newrelic_apikey,
           newrelic_appid, comment, user, ignore_warnings, diff):
    """
    Redeploy or modify a service.

    \b
    CLUSTER is the name of your cluster (e.g. 'my-custer') within ECS.
    SERVICE is the name of your service (e.g. 'my-app') within ECS.

    When not giving any other options, the task definition will not be changed.
    It will just be duplicated, so that all container images will be pulled
    and redeployed.
    """

    try:
        client = get_client(access_key_id, secret_access_key, region, profile)
        deployment = DeployAction(client, cluster, service)

        if task:
            td = deployment.get_task_definition(task)
            click.secho('Deploying based on task definition: %s' % task)
        else:
            td = deployment.get_current_task_definition(deployment.service)

        td.set_images(tag, **{key: value for (key, value) in image})
        td.set_commands(**{key: value for (key, value) in command})
        td.set_environment(env)
        td.set_role_arn(role)

        if diff:
            print_diff(td)

        click.secho('Creating new task definition revision')
        new_td = deployment.update_task_definition(td)

        click.secho('Successfully created revision: %d' % new_td.revision,
                    fg='green')
        click.secho('Successfully deregistered revision: %d\n' % td.revision,
                    fg='green')

        record_deployment(tag, newrelic_apikey, newrelic_appid, comment, user)

        click.secho('Updating service')
        deployment.deploy(new_td)
        click.secho('Successfully changed task definition to: %s:%s\n' %
                    (new_td.family, new_td.revision),
                    fg='green')

        wait_for_finish(action=deployment,
                        timeout=timeout,
                        title='Deploying task definition',
                        success_message='Deployment successful',
                        failure_message='Deployment failed',
                        ignore_warnings=ignore_warnings)

    except Exception as e:
        click.secho('%s\n' % str(e), fg='red', err=True)
        exit(1)
示例#5
0
文件: cli.py 项目: fabfuel/ecs-deploy
def deploy(cluster, service, tag, image, command, env, role, access_key_id, secret_access_key, region, profile, timeout,
           newrelic_apikey, newrelic_appid, comment, user):
    """
    Redeploy or modify a service.

    \b
    CLUSTER is the name of your cluster (e.g. 'my-custer') within ECS.
    SERVICE is the name of your service (e.g. 'my-app') within ECS.

    When not giving any other options, the task definition will not be changed. It will just be duplicated, so that
    all container images will be pulled and redeployed.
    """

    try:
        client = get_client(access_key_id, secret_access_key, region, profile)
        deployment = DeployAction(client, cluster, service)
        task_definition = deployment.get_current_task_definition(deployment.service)

        task_definition.set_images(tag, **{key: value for (key, value) in image})
        task_definition.set_commands(**{key: value for (key, value) in command})
        task_definition.set_environment(env)
        task_definition.set_role_arn(role)
        print_diff(task_definition)

        click.secho('Creating new task definition revision')
        new_task_definition = deployment.update_task_definition(task_definition)
        click.secho('Successfully created revision: %d' % new_task_definition.revision, fg='green')
        click.secho('Successfully deregistered revision: %d\n' % task_definition.revision, fg='green')

        record_deployment(tag, newrelic_apikey, newrelic_appid, comment, user)

        click.secho('Updating service')
        deployment.deploy(new_task_definition)
        click.secho('Successfully changed task definition to: %s:%s\n' %
                    (new_task_definition.family, new_task_definition.revision), fg='green')

        wait_for_finish(deployment, timeout, 'Deploying task definition', 'Deployment successful', 'Deployment failed')

    except Exception as e:
        click.secho('%s\n' % str(e), fg='red', err=True)
        exit(1)
示例#6
0
def deploy(cluster, service, tag, image, command, env, secret, role, execution_role, task, region, access_key_id, secret_access_key, profile, timeout, newrelic_apikey, newrelic_appid, newrelic_region, comment, user, ignore_warnings, diff, deregister, rollback, exclusive_env, exclusive_secrets, sleep_time, slack_url, slack_service_match='.*', cd_application_name=None):
    """
    Redeploy or modify a service.

    \b
    CLUSTER is the name of your cluster (e.g. 'my-custer') within ECS.
    SERVICE is the name of your service (e.g. 'my-app') within ECS.

    When not giving any other options, the task definition will not be changed.
    It will just be duplicated, so that all container images will be pulled
    and redeployed.
    """

    try:
        client = get_client(access_key_id, secret_access_key, region, profile)
        if cd_application_name:
            deployment = DeployBlueGreenAction(client, cluster, service, cd_application_name=cd_application_name)
        else:
            deployment = DeployAction(client, cluster, service)

        td = get_task_definition(deployment, task)
        td.set_images(tag, **{key: value for (key, value) in image})
        td.set_commands(**{key: value for (key, value) in command})
        td.set_environment(env, exclusive_env)
        td.set_secrets(secret, exclusive_secrets)
        td.set_role_arn(role)
        td.set_execution_role_arn(execution_role)

        slack = SlackNotification(
            getenv('SLACK_URL', slack_url),
            getenv('SLACK_SERVICE_MATCH', slack_service_match)
        )
        slack.notify_start(cluster, tag, td, comment, user, service=service)

        click.secho('Deploying based on task definition: %s\n' % td.family_revision)

        if diff:
            print_diff(td)

        new_td = create_task_definition(deployment, td)

        try:
            deploy_task_definition(
                deployment=deployment,
                task_definition=new_td,
                title='Deploying new task definition',
                success_message='Deployment successful',
                failure_message='Deployment failed',
                timeout=timeout,
                deregister=deregister,
                previous_task_definition=td,
                ignore_warnings=ignore_warnings,
                sleep_time=sleep_time
            )

        except TaskPlacementError as e:
            slack.notify_failure(cluster, str(e), service=service)
            if rollback:
                click.secho('%s\n' % str(e), fg='red', err=True)
                rollback_task_definition(deployment, td, new_td, sleep_time=sleep_time)
                exit(1)
            else:
                raise

        record_deployment(tag, newrelic_apikey, newrelic_appid, newrelic_region, comment, user)

        slack.notify_success(cluster, td.revision, service=service)

    except (EcsError, NewRelicException) as e:
        click.secho('%s\n' % str(e), fg='red', err=True)
        exit(1)
示例#7
0
def deploy(cluster,
           service,
           tag,
           image,
           command,
           health_check,
           cpu,
           memory,
           memoryreservation,
           privileged,
           essential,
           env,
           secret,
           ulimit,
           system_control,
           port,
           mount,
           log,
           role,
           execution_role,
           task,
           region,
           access_key_id,
           secret_access_key,
           profile,
           timeout,
           newrelic_apikey,
           newrelic_appid,
           newrelic_region,
           comment,
           user,
           ignore_warnings,
           diff,
           deregister,
           rollback,
           exclusive_env,
           exclusive_secrets,
           sleep_time,
           exclusive_ulimits,
           exclusive_system_controls,
           exclusive_ports,
           exclusive_mounts,
           volume,
           add_container,
           remove_container,
           slack_url,
           slack_service_match='.*'):
    """
    Redeploy or modify a service.

    \b
    CLUSTER is the name of your cluster (e.g. 'my-custer') within ECS.
    SERVICE is the name of your service (e.g. 'my-app') within ECS.

    When not giving any other options, the task definition will not be changed.
    It will just be duplicated, so that all container images will be pulled
    and redeployed.
    """

    try:
        client = get_client(access_key_id, secret_access_key, region, profile)
        deployment = DeployAction(client, cluster, service)

        td = get_task_definition(deployment, task)
        # If there is a new container, add it at frist.
        td.add_containers(add_container)
        td.remove_containers(remove_container)
        td.set_images(tag, **{key: value for (key, value) in image})
        td.set_commands(**{key: value for (key, value) in command})
        td.set_health_checks(**{key: vals for (key, *vals) in health_check})
        td.set_cpu(**{key: value for (key, value) in cpu})
        td.set_memory(**{key: value for (key, value) in memory})
        td.set_memoryreservation(
            **{key: value
               for (key, value) in memoryreservation})
        td.set_privileged(**{key: value for (key, value) in privileged})
        td.set_essential(**{key: value for (key, value) in essential})
        td.set_environment(env, exclusive_env)
        td.set_secrets(secret, exclusive_secrets)
        td.set_ulimits(ulimit, exclusive_ulimits)
        td.set_system_controls(system_control, exclusive_system_controls)
        td.set_port_mappings(port, exclusive_ports)
        td.set_mount_points(mount, exclusive_mounts)
        td.set_log_configurations(log)
        td.set_role_arn(role)
        td.set_execution_role_arn(execution_role)
        td.set_volumes(volume)

        slack = SlackNotification(
            getenv('SLACK_URL', slack_url),
            getenv('SLACK_SERVICE_MATCH', slack_service_match))
        slack.notify_start(cluster, tag, td, comment, user, service=service)

        click.secho('Deploying based on task definition: %s\n' %
                    td.family_revision)

        if diff:
            print_diff(td)

        new_td = create_task_definition(deployment, td)

        try:
            deploy_task_definition(deployment=deployment,
                                   task_definition=new_td,
                                   title='Deploying new task definition',
                                   success_message='Deployment successful',
                                   failure_message='Deployment failed',
                                   timeout=timeout,
                                   deregister=deregister,
                                   previous_task_definition=td,
                                   ignore_warnings=ignore_warnings,
                                   sleep_time=sleep_time)

        except TaskPlacementError as e:
            slack.notify_failure(cluster, str(e), service=service)
            if rollback:
                click.secho('%s\n' % str(e), fg='red', err=True)
                rollback_task_definition(deployment,
                                         td,
                                         new_td,
                                         sleep_time=sleep_time)
                exit(1)
            else:
                raise

        record_deployment(tag, newrelic_apikey, newrelic_appid,
                          newrelic_region, comment, user)

        slack.notify_success(cluster, td.revision, service=service)

    except (EcsError, NewRelicException) as e:
        click.secho('%s\n' % str(e), fg='red', err=True)
        exit(1)