def test_launch_docker_grace_period(marathon_service_name): """Tests 'taskKillGracePeriodSeconds' option using a Docker container in a Marathon environment. Read more details about this test in `test_root_marathon.py::test_launch_mesos_root_marathon_grace_period` """ app_id = '/launch-docker-grace-period-app' app_def = apps.docker_http_server(app_id) app_def['container']['docker']['image'] = 'kensipe/python-test' default_grace_period = 3 grace_period = 20 app_def['taskKillGracePeriodSeconds'] = grace_period app_def['cmd'] = 'python test.py' task_name = app_id.lstrip('/') client = marathon.create_client() client.add_app(app_def) deployment_wait(service_id=app_id) tasks = get_service_task(marathon_service_name, task_name) assert tasks is not None client.scale_app(app_id, 0) tasks = get_service_task(marathon_service_name, task_name) assert tasks is not None # tasks should still be here after the default_graceperiod time.sleep(default_grace_period + 1) tasks = get_service_task(marathon_service_name, task_name) assert tasks is not None # but not after the set grace_period time.sleep(grace_period) assert_that(lambda: get_service_task(marathon_service_name, task_name), eventually(equal_to(None), max_attempts=30))
def test_docker_dns_mapping(marathon_service_name): """Tests that a running Docker task is accessible via DNS.""" app_def = apps.docker_http_server(app_id='docker-dns-mapping-app') client = marathon.create_client() client.add_app(app_def) shakedown.deployment_wait(app_id=app_def["id"]) bad_cmd = 'ping -c 1 docker-test.marathon-user.mesos-bad' status, output = shakedown.run_command_on_master(bad_cmd) assert not status @retrying.retry(wait_fixed=1000, stop_max_attempt_number=30, retry_on_exception=common.ignore_exception) def check_dns(): dnsname = '{}.{}.mesos'.format(app_def["id"].lstrip('/'), marathon_service_name) cmd = 'ping -c 1 {}'.format(dnsname) shakedown.wait_for_dns(dnsname) status, output = shakedown.run_command_on_master(cmd) assert status, "ping failed for app using DNS lookup: {}".format( dnsname) check_dns()
def test_vip_docker_bridge_mode(marathon_service_name): """Tests the creation of a VIP from a python command in a docker image using bridge mode. the test validates the creation of an app with the VIP label and the accessability of the service via the VIP. """ app_def = apps.docker_http_server(app_id='vip-docker-bridge-mode-app') app_id = app_def["id"] vip_name = app_id.lstrip("/") fqn = '{}.{}.l4lb.thisdcos.directory'.format(vip_name, marathon_service_name) app_def['id'] = vip_name app_def['container']['docker']['portMappings'] = [{ "containerPort": 8080, "hostPort": 0, "labels": { "VIP_0": "/{}:10000".format(vip_name) }, "protocol": "tcp", "name": "{}".format(vip_name) }] client = marathon.create_client() client.add_app(app_def) deployment_wait(service_id=app_id) @retrying.retry(wait_fixed=1000, stop_max_attempt_number=30, retry_on_exception=common.ignore_exception) def http_output_check(): time.sleep(1) common.assert_http_code('{}:{}'.format(fqn, 10000)) http_output_check()
def test_vip_docker_bridge_mode(marathon_service_name): """Tests the creation of a VIP from a python command in a docker image using bridge mode. the test validates the creation of an app with the VIP label and the accessability of the service via the VIP. """ app_def = apps.docker_http_server(app_id='vip-docker-bridge-mode-app') vip_name = app_def["id"].lstrip("/") fqn = '{}.{}.l4lb.thisdcos.directory'.format(vip_name, marathon_service_name) app_def['id'] = vip_name app_def['container']['docker']['portMappings'] = [{ "containerPort": 8080, "hostPort": 0, "labels": { "VIP_0": "/{}:10000".format(vip_name) }, "protocol": "tcp", "name": "{}".format(vip_name) }] client = marathon.create_client() client.add_app(app_def) shakedown.deployment_wait() @retrying.retry(wait_fixed=1000, stop_max_attempt_number=30, retry_on_exception=common.ignore_exception) def http_output_check(): time.sleep(1) common.assert_http_code('{}:{}'.format(fqn, 10000)) http_output_check()
def test_launch_docker_grace_period(marathon_service_name): """Tests 'taskKillGracePeriodSeconds' option using a Docker container in a Marathon environment. Read more details about this test in `test_root_marathon.py::test_launch_mesos_root_marathon_grace_period` """ app_def = apps.docker_http_server(app_id='launch-docker-grace-period-app') app_def['container']['docker']['image'] = 'kensipe/python-test' default_grace_period = 3 grace_period = 20 app_def['taskKillGracePeriodSeconds'] = grace_period app_def['cmd'] = 'python test.py' app_id = app_def['id'].lstrip('/') client = marathon.create_client() client.add_app(app_def) shakedown.deployment_wait(app_id=app_id) tasks = shakedown.get_service_task(marathon_service_name, app_id) assert tasks is not None client.scale_app(app_id, 0) tasks = shakedown.get_service_task(marathon_service_name, app_id) assert tasks is not None # tasks should still be here after the default_graceperiod time.sleep(default_grace_period + 1) tasks = shakedown.get_service_task(marathon_service_name, app_id) assert tasks is not None # but not after the set grace_period time.sleep(grace_period) assert_that( lambda: shakedown.get_service_task(marathon_service_name, app_id), eventually(equal_to(None), max_attempts=30))
def test_launch_docker_grace_period(marathon_service_name): """Tests 'taskKillGracePeriodSeconds' option using a Docker container in a Marathon environment. Read more details about this test in `test_root_marathon.py::test_launch_mesos_root_marathon_grace_period` """ app_def = apps.docker_http_server() app_def['container']['docker']['image'] = 'kensipe/python-test' default_grace_period = 3 grace_period = 20 app_def['taskKillGracePeriodSeconds'] = grace_period app_def['cmd'] = 'python test.py' app_id = app_def['id'].lstrip('/') client = marathon.create_client() client.add_app(app_def) shakedown.deployment_wait(app_id=app_id) tasks = shakedown.get_service_task(marathon_service_name, app_id) assert tasks is not None client.scale_app(app_id, 0) tasks = shakedown.get_service_task(marathon_service_name, app_id) assert tasks is not None # tasks should still be here after the default_graceperiod time.sleep(default_grace_period + 1) tasks = shakedown.get_service_task(marathon_service_name, app_id) assert tasks is not None # but not after the set grace_period time.sleep(grace_period) tasks = shakedown.get_service_task(marathon_service_name, app_id) assert tasks is None
def test_launch_docker_container(): """Launches a Docker container on Marathon.""" app_def = apps.docker_http_server() client = marathon.create_client() client.add_app(app_def) shakedown.deployment_wait() tasks = client.get_tasks(app_def["id"]) app = client.get_app(app_def["id"]) assert len(tasks) == 1, "The number of tasks is {} after deployment, but only 1 was expected".format(len(tasks)) assert app['container']['type'] == 'DOCKER', "The container type is not DOCKER"
def test_launch_docker_container(): """Launches a Docker container on Marathon.""" app_def = apps.docker_http_server(app_id='launch-docker-container-app') app_id = app_def["id"] client = marathon.create_client() client.add_app(app_def) shakedown.deployment_wait(app_id=app_id) tasks = client.get_tasks(app_id) app = client.get_app(app_id) assert len(tasks) == 1, "The number of tasks is {} after deployment, but only 1 was expected".format(len(tasks)) assert app['container']['type'] == 'DOCKER', "The container type is not DOCKER"
def test_docker_port_mappings(): """Tests that Docker ports are mapped and are accessible from the host.""" app_def = apps.docker_http_server(app_id='docker-port-mapping-app') client = marathon.create_client() client.add_app(app_def) shakedown.deployment_wait(app_id=app_def["id"]) tasks = client.get_tasks(app_def["id"]) host = tasks[0]['host'] port = tasks[0]['ports'][0] cmd = r'curl -s -w "%{http_code}"' cmd = cmd + ' {}:{}/.dockerenv'.format(host, port) status, output = shakedown.run_command_on_agent(host, cmd) assert status and output == "200", "HTTP status code is {}, but 200 was expected".format(output)
def test_docker_port_mappings(): """Tests that Docker ports are mapped and are accessible from the host.""" app_def = apps.docker_http_server(app_id='/docker-port-mapping-app') app_id = app_def["id"] client = marathon.create_client() client.add_app(app_def) deployment_wait(service_id=app_id) tasks = client.get_tasks(app_id) host = tasks[0]['host'] port = tasks[0]['ports'][0] cmd = r'curl -s -w "%{http_code}"' cmd = cmd + ' {}:{}/.dockerenv'.format(host, port) status, output = run_command_on_agent(host, cmd) assert status and output == "200", "HTTP status code is {}, but 200 was expected".format(output)
def test_docker_dns_mapping(marathon_service_name): """Tests that a running Docker task is accessible via DNS.""" app_def = apps.docker_http_server() client = marathon.create_client() client.add_app(app_def) shakedown.deployment_wait(app_id=app_def["id"]) bad_cmd = 'ping -c 1 docker-test.marathon-user.mesos-bad' status, output = shakedown.run_command_on_master(bad_cmd) assert not status @retrying.retry(wait_fixed=1000, stop_max_attempt_number=30, retry_on_exception=common.ignore_exception) def check_dns(): dnsname = '{}.{}.mesos'.format(app_def["id"].lstrip('/'), marathon_service_name) cmd = 'ping -c 1 {}'.format(dnsname) shakedown.wait_for_dns(dnsname) status, output = shakedown.run_command_on_master(cmd) assert status, "ping failed for app using DNS lookup: {}".format(dnsname) check_dns()