209 lines
6.0 KiB
Python
209 lines
6.0 KiB
Python
import contextlib
|
|
import json
|
|
|
|
from .common import (assert_command, assert_lines, exec_command, remove_group,
|
|
show_app, watch_all_deployments)
|
|
|
|
GOOD_GROUP = 'tests/data/marathon/groups/good.json'
|
|
|
|
|
|
def test_deploy_group():
|
|
_deploy_group(GOOD_GROUP)
|
|
remove_group('test-group')
|
|
|
|
|
|
def test_group_list_table():
|
|
with _group(GOOD_GROUP, 'test-group'):
|
|
assert_lines(['dcos', 'marathon', 'group', 'list'], 3)
|
|
|
|
|
|
def test_validate_complicated_group_and_app():
|
|
_deploy_group('tests/data/marathon/groups/complicated.json')
|
|
remove_group('test-group')
|
|
|
|
|
|
def test_optional_deploy_group():
|
|
_deploy_group(GOOD_GROUP, False)
|
|
remove_group('test-group')
|
|
|
|
|
|
def test_add_existing_group():
|
|
with _group(GOOD_GROUP, 'test-group'):
|
|
with open(GOOD_GROUP) as fd:
|
|
stderr = b"Group '/test-group' already exists\n"
|
|
assert_command(['dcos', 'marathon', 'group', 'add'],
|
|
returncode=1,
|
|
stderr=stderr,
|
|
stdin=fd)
|
|
|
|
|
|
def test_show_group():
|
|
with _group(GOOD_GROUP, 'test-group'):
|
|
_show_group('test-group')
|
|
|
|
|
|
def test_add_bad_complicated_group():
|
|
with open('tests/data/marathon/groups/complicated_bad.json') as fd:
|
|
returncode, stdout, stderr = exec_command(
|
|
['dcos', 'marathon', 'group', 'add'],
|
|
stdin=fd)
|
|
|
|
err = b"""{
|
|
"details": [
|
|
{
|
|
"errors": [
|
|
"error.path.missing"
|
|
],
|
|
"path": "/groups(0)/apps(0)/id"
|
|
}
|
|
],
|
|
"message": "Invalid JSON"
|
|
}
|
|
"""
|
|
assert returncode == 1
|
|
assert stdout == b''
|
|
assert err in stderr
|
|
|
|
|
|
def test_update_group():
|
|
with _group(GOOD_GROUP, 'test-group'):
|
|
newapp = json.dumps([{"id": "appadded", "cmd": "sleep 0"}])
|
|
appjson = "apps={}".format(newapp)
|
|
returncode, stdout, stderr = exec_command(
|
|
['dcos', 'marathon', 'group', 'update', 'test-group/sleep',
|
|
appjson])
|
|
|
|
assert returncode == 0
|
|
assert stdout.decode().startswith('Created deployment ')
|
|
assert stderr == b''
|
|
|
|
watch_all_deployments()
|
|
show_app('test-group/sleep/appadded')
|
|
|
|
|
|
def test_update_group_from_stdin():
|
|
with _group(GOOD_GROUP, 'test-group'):
|
|
_update_group(
|
|
'test-group',
|
|
'tests/data/marathon/groups/update_good.json')
|
|
show_app('test-group/updated')
|
|
|
|
|
|
def test_update_missing_group():
|
|
assert_command(['dcos', 'marathon', 'group', 'update', 'missing-id'],
|
|
stderr=b"Error: Group '/missing-id' does not exist\n",
|
|
returncode=1)
|
|
|
|
|
|
def test_scale_group():
|
|
_deploy_group('tests/data/marathon/groups/scale.json')
|
|
returncode, stdout, stderr = exec_command(['dcos', 'marathon', 'group',
|
|
'scale', 'scale-group', '2'])
|
|
assert stderr == b''
|
|
assert returncode == 0
|
|
watch_all_deployments()
|
|
returncode, stdout, stderr = exec_command(
|
|
['dcos', 'marathon', 'group', 'show',
|
|
'scale-group'])
|
|
res = json.loads(stdout.decode('utf-8'))
|
|
|
|
assert res['groups'][0]['apps'][0]['instances'] == 2
|
|
remove_group('scale-group')
|
|
|
|
|
|
def test_scale_group_not_exist():
|
|
returncode, stdout, stderr = exec_command(['dcos', 'marathon', 'group',
|
|
'scale', 'scale-group', '2'])
|
|
assert stderr == b''
|
|
watch_all_deployments()
|
|
returncode, stdout, stderr = exec_command(
|
|
['dcos', 'marathon', 'group', 'show',
|
|
'scale-group'])
|
|
res = json.loads(stdout.decode('utf-8'))
|
|
|
|
assert len(res['apps']) == 0
|
|
remove_group('scale-group')
|
|
|
|
|
|
def test_scale_group_when_scale_factor_negative():
|
|
_deploy_group('tests/data/marathon/groups/scale.json')
|
|
returncode, stdout, stderr = exec_command(['dcos', 'marathon', 'group',
|
|
'scale', 'scale-group', '-2'])
|
|
assert b'Command not recognized' in stdout
|
|
assert returncode == 1
|
|
watch_all_deployments()
|
|
remove_group('scale-group')
|
|
|
|
|
|
def test_scale_group_when_scale_factor_not_float():
|
|
_deploy_group('tests/data/marathon/groups/scale.json')
|
|
returncode, stdout, stderr = exec_command(['dcos', 'marathon', 'group',
|
|
'scale', 'scale-group', '1.a'])
|
|
assert stderr == b'Error parsing string as float\n'
|
|
assert returncode == 1
|
|
watch_all_deployments()
|
|
remove_group('scale-group')
|
|
|
|
|
|
def _deploy_group(file_path, stdin=True):
|
|
if stdin:
|
|
with open(file_path) as fd:
|
|
assert_command(['dcos', 'marathon', 'group', 'add'], stdin=fd)
|
|
else:
|
|
assert_command(['dcos', 'marathon', 'group', 'add', file_path])
|
|
|
|
# Let's make sure that we don't return until the deployment has finished
|
|
watch_all_deployments()
|
|
|
|
|
|
def _show_group(group_id, version=None):
|
|
if version is None:
|
|
cmd = ['dcos', 'marathon', 'group', 'show', group_id]
|
|
else:
|
|
cmd = ['dcos', 'marathon', 'group', 'show',
|
|
'--group-version={}'.format(version), group_id]
|
|
|
|
returncode, stdout, stderr = exec_command(cmd)
|
|
|
|
result = json.loads(stdout.decode('utf-8'))
|
|
|
|
assert returncode == 0
|
|
assert isinstance(result, dict)
|
|
assert result['id'] == '/' + group_id
|
|
assert stderr == b''
|
|
|
|
return result
|
|
|
|
|
|
def _update_group(group_id, file_path):
|
|
with open(file_path) as fd:
|
|
returncode, stdout, stderr = exec_command(
|
|
['dcos', 'marathon', 'group', 'update', group_id],
|
|
stdin=fd)
|
|
|
|
assert returncode == 0
|
|
assert stdout.decode().startswith('Created deployment ')
|
|
assert stderr == b''
|
|
|
|
# Let's make sure that we don't return until the deployment has finished
|
|
watch_all_deployments()
|
|
|
|
|
|
@contextlib.contextmanager
|
|
def _group(path, group_id):
|
|
"""Context manager that deploys a group on entrance, and removes it on
|
|
exit.
|
|
|
|
:param path: path to group's json definition
|
|
:type path: str
|
|
:param group_id: group id
|
|
:type group_id: str
|
|
:rtype: None
|
|
"""
|
|
|
|
_deploy_group(path)
|
|
try:
|
|
yield
|
|
finally:
|
|
remove_group(group_id)
|