def test_get_old_live_draining_tasks_not_empty(self):
        fake_name = 'whoa'
        fake_instance = 'the_earth_is_tiny'
        fake_id = marathon_tools.format_job_id(fake_name, fake_instance)

        def fake_task(state):
            return mock.Mock(_drain_state=state)

        fake_apps = [
            mock.Mock(id=fake_id, tasks=[fake_task('up'), fake_task('down')]),
            mock.Mock(id=('%s2' % fake_id), tasks=[fake_task('up'), fake_task('down')])
        ]
        expected_live_tasks = {
            fake_apps[0].id: set([fake_apps[0].tasks[0]]),
            fake_apps[1].id: set([fake_apps[1].tasks[0]]),
        }
        expected_draining_tasks = {
            fake_apps[0].id: set([fake_apps[0].tasks[1]]),
            fake_apps[1].id: set([fake_apps[1].tasks[1]]),
        }

        fake_drain_method = mock.Mock(is_draining=lambda t: t._drain_state == 'down')

        actual = setup_marathon_job.get_old_live_draining_tasks(fake_apps, fake_drain_method)
        actual_live_tasks, actual_draining_tasks = actual
        assert actual_live_tasks == expected_live_tasks
        assert actual_draining_tasks == expected_draining_tasks
    def test_get_old_live_draining_tasks_empty(self):
        fake_name = 'whoa'
        fake_instance = 'the_earth_is_tiny'
        fake_id = marathon_tools.format_job_id(fake_name, fake_instance)

        fake_apps = [
            mock.Mock(id=fake_id, tasks=[]),
            mock.Mock(id=('%s2' % fake_id), tasks=[])
        ]

        expected_live_tasks = {
            fake_apps[0].id: set(),
            fake_apps[1].id: set(),
        }
        expected_draining_tasks = {
            fake_apps[0].id: set(),
            fake_apps[1].id: set(),
        }

        fake_drain_method = mock.Mock(is_draining=lambda _: True)

        actual = setup_marathon_job.get_old_live_draining_tasks(fake_apps, fake_drain_method)
        actual_live_tasks, actual_draining_tasks = actual
        assert actual_live_tasks == expected_live_tasks
        assert actual_draining_tasks == expected_draining_tasks
    def test_get_old_live_draining_tasks_not_empty(self):
        fake_name = "whoa"
        fake_instance = "the_earth_is_tiny"
        fake_id = marathon_tools.format_job_id(fake_name, fake_instance)

        def fake_task(state):
            return mock.Mock(_drain_state=state)

        fake_apps = [
            mock.Mock(id=fake_id, tasks=[fake_task("up"), fake_task("down")]),
            mock.Mock(id=("%s2" % fake_id), tasks=[fake_task("up"), fake_task("down")]),
        ]
        expected_live_tasks = {
            fake_apps[0].id: set([fake_apps[0].tasks[0]]),
            fake_apps[1].id: set([fake_apps[1].tasks[0]]),
        }
        expected_draining_tasks = {
            fake_apps[0].id: set([fake_apps[0].tasks[1]]),
            fake_apps[1].id: set([fake_apps[1].tasks[1]]),
        }

        fake_drain_method = mock.Mock(is_draining=lambda t: t._drain_state == "down")

        actual = setup_marathon_job.get_old_live_draining_tasks(fake_apps, fake_drain_method)
        actual_live_tasks, actual_draining_tasks = actual
        assert actual_live_tasks == expected_live_tasks
        assert actual_draining_tasks == expected_draining_tasks
    def test_get_old_live_draining_tasks_empty(self):
        fake_name = "whoa"
        fake_instance = "the_earth_is_tiny"
        fake_id = marathon_tools.format_job_id(fake_name, fake_instance)

        fake_apps = [mock.Mock(id=fake_id, tasks=[]), mock.Mock(id=("%s2" % fake_id), tasks=[])]

        expected_live_tasks = {fake_apps[0].id: set(), fake_apps[1].id: set()}
        expected_draining_tasks = {fake_apps[0].id: set(), fake_apps[1].id: set()}

        fake_drain_method = mock.Mock(is_draining=lambda _: True)

        actual = setup_marathon_job.get_old_live_draining_tasks(fake_apps, fake_drain_method)
        actual_live_tasks, actual_draining_tasks = actual
        assert actual_live_tasks == expected_live_tasks
        assert actual_draining_tasks == expected_draining_tasks
Beispiel #5
0
def main():
    args = parse_args()
    full_appid = args.appname.lstrip('/')
    soa_dir = args.soa_dir
    marathon_config = marathon_tools.load_marathon_config()
    client = marathon_tools.get_marathon_client(
        url=marathon_config.get_url(),
        user=marathon_config.get_username(),
        passwd=marathon_config.get_password(),
    )

    if not marathon_tools.is_app_id_running(app_id=full_appid, client=client):
        print("Couldn't find an app named {0}".format(full_appid))
        sys.exit(1)

    service, instance, _, __ = (s.replace('--', '_')
                                for s in decompose_job_id(full_appid))
    complete_config = marathon_tools.create_complete_config(
        service, instance, marathon_config)
    cluster = load_system_paasta_config().get_cluster()
    service_instance_config = marathon_tools.load_marathon_service_config(
        service=service,
        instance=instance,
        cluster=cluster,
        soa_dir=soa_dir,
    )
    nerve_ns = service_instance_config.get_nerve_namespace()
    service_namespace_config = marathon_tools.load_service_namespace_config(
        service=service, namespace=nerve_ns)
    drain_method = drain_lib.get_drain_method(
        service_instance_config.get_drain_method(service_namespace_config),
        service=service,
        instance=instance,
        nerve_ns=nerve_ns,
        drain_method_params=service_instance_config.get_drain_method_params(
            service_namespace_config),
    )

    bounce_func = bounce_lib.get_bounce_method_func('down')

    while marathon_tools.is_app_id_running(app_id=full_appid, client=client):
        app_to_kill = client.get_app(full_appid)
        old_app_live_tasks, old_app_draining_tasks = get_old_live_draining_tasks(
            [app_to_kill], drain_method)
        do_bounce(
            bounce_func=bounce_func,
            drain_method=drain_method,
            config=complete_config,
            new_app_running='',
            happy_new_tasks=[],
            old_app_live_tasks=old_app_live_tasks,
            old_app_draining_tasks=old_app_draining_tasks,
            serviceinstance="{0}.{1}".format(service, instance),
            bounce_method='down',
            service=service,
            cluster=cluster,
            instance=instance,
            marathon_jobid=full_appid,
            client=client,
            soa_dir=soa_dir,
        )

        print "Sleeping for 10 seconds to give the tasks time to drain"
        time.sleep(10)

    print("Sucessfully killed {0}".format(full_appid))
def main():
    args = parse_args()
    full_appid = args.appname.lstrip('/')
    soa_dir = args.soa_dir
    marathon_config = marathon_tools.load_marathon_config()
    client = marathon_tools.get_marathon_client(
        url=marathon_config.get_url(),
        user=marathon_config.get_username(),
        passwd=marathon_config.get_password(),
    )

    if not marathon_tools.is_app_id_running(app_id=full_appid, client=client):
        print("Couldn't find an app named {0}".format(full_appid))
        sys.exit(1)

    service, instance, _, __ = (s.replace('--', '_') for s in decompose_job_id(full_appid))
    complete_config = marathon_tools.create_complete_config(service, instance, marathon_config)
    cluster = load_system_paasta_config().get_cluster()
    service_instance_config = marathon_tools.load_marathon_service_config(
        service=service,
        instance=instance,
        cluster=cluster,
        soa_dir=soa_dir,
    )
    nerve_ns = service_instance_config.get_nerve_namespace()
    service_namespace_config = marathon_tools.load_service_namespace_config(service=service, namespace=nerve_ns)
    drain_method = drain_lib.get_drain_method(
        service_instance_config.get_drain_method(service_namespace_config),
        service=service,
        instance=instance,
        nerve_ns=nerve_ns,
        drain_method_params=service_instance_config.get_drain_method_params(service_namespace_config),
    )

    bounce_func = bounce_lib.get_bounce_method_func('down')

    while marathon_tools.is_app_id_running(app_id=full_appid, client=client):
        app_to_kill = client.get_app(full_appid)
        old_app_live_tasks, old_app_draining_tasks = get_old_live_draining_tasks([app_to_kill], drain_method)
        do_bounce(
            bounce_func=bounce_func,
            drain_method=drain_method,
            config=complete_config,
            new_app_running='',
            happy_new_tasks=[],
            old_app_live_tasks=old_app_live_tasks,
            old_app_draining_tasks=old_app_draining_tasks,
            serviceinstance="{0}.{1}".format(service, instance),
            bounce_method='down',
            service=service,
            cluster=cluster,
            instance=instance,
            marathon_jobid=full_appid,
            client=client,
            soa_dir=soa_dir,
        )

        print "Sleeping for 10 seconds to give the tasks time to drain"
        time.sleep(10)

    print("Sucessfully killed {0}".format(full_appid))