Currently `dcos node log --leader` will not get logs from mesos leader node. It will make a request against `dcos_url`. We should redirect the request to a leading mesos node unless --component dcos-marathon is used. In this case we have to redirect the request to a leading marathon master (which can be a totally different node).
317 lines
10 KiB
Python
317 lines
10 KiB
Python
import mock
|
|
import pytest
|
|
|
|
import dcoscli.node.main as main
|
|
from dcos.errors import DCOSException
|
|
|
|
|
|
@mock.patch('dcos.packagemanager.PackageManager')
|
|
def test_check_version_fail(mock_cosmos):
|
|
"""
|
|
Test _check_3dt_version(), should throw DCOSException exception.
|
|
"""
|
|
|
|
mock_cosmos().enabled.return_value = True
|
|
mock_cosmos().has_capability.return_value = False
|
|
|
|
with pytest.raises(DCOSException) as excinfo:
|
|
main._check_3dt_version()
|
|
assert str(excinfo.value) == (
|
|
'DC/OS backend does not support diagnostics capabilities in this '
|
|
'version. Must be DC/OS >= 1.8')
|
|
|
|
|
|
@mock.patch('dcos.packagemanager.PackageManager')
|
|
@mock.patch('dcos.http.get')
|
|
def test_check_version_success(mock_get, mock_cosmos):
|
|
"""
|
|
Test _check_3dt_version(), should not fail.
|
|
"""
|
|
|
|
mock_cosmos().enabled.return_value = True
|
|
m = mock.MagicMock()
|
|
m.json.return_value = {
|
|
'capabilities': [{'name': 'SUPPORT_CLUSTER_REPORT'}]
|
|
}
|
|
mock_get.return_value = m
|
|
main._check_3dt_version()
|
|
|
|
|
|
@mock.patch('dcos.packagemanager.PackageManager')
|
|
@mock.patch('dcos.http.get')
|
|
@mock.patch('dcoscli.node.main._do_diagnostics_request')
|
|
def test_node_diagnostics_create(mock_do_diagnostics_request, mock_get,
|
|
mock_cosmos):
|
|
"""
|
|
Test _bundle_create(), should not fail.
|
|
"""
|
|
|
|
mock_cosmos().enabled.return_value = True
|
|
m = mock.MagicMock()
|
|
m.json.return_value = {
|
|
'capabilities': [{'name': 'SUPPORT_CLUSTER_REPORT'}]
|
|
}
|
|
mock_get.return_value = m
|
|
mock_do_diagnostics_request.return_value = {
|
|
'status': 'OK',
|
|
'extra': {
|
|
'bundle_name': 'bundle.zip'
|
|
}
|
|
}
|
|
main._bundle_create(['10.10.0.1'])
|
|
mock_do_diagnostics_request.assert_called_once_with(
|
|
'/system/health/v1/report/diagnostics/create',
|
|
'POST',
|
|
json={'nodes': ['10.10.0.1']})
|
|
|
|
|
|
@mock.patch('dcos.packagemanager.PackageManager')
|
|
@mock.patch('dcos.http.get')
|
|
@mock.patch('dcoscli.node.main._do_diagnostics_request')
|
|
def test_node_diagnostics_delete(mock_do_diagnostics_request, mock_get,
|
|
mock_cosmos):
|
|
"""
|
|
Test _bundle_delete(), should not fail
|
|
"""
|
|
|
|
mock_cosmos().enabled.return_value = True
|
|
m = mock.MagicMock()
|
|
m.json.return_value = {
|
|
'capabilities': [{'name': 'SUPPORT_CLUSTER_REPORT'}]
|
|
}
|
|
mock_get.return_value = m
|
|
mock_do_diagnostics_request.return_value = {
|
|
'status': 'OK'
|
|
}
|
|
main._bundle_delete('bundle.zip')
|
|
mock_do_diagnostics_request.assert_called_once_with(
|
|
'/system/health/v1/report/diagnostics/delete/bundle.zip',
|
|
'POST'
|
|
)
|
|
|
|
|
|
@mock.patch('dcos.packagemanager.PackageManager')
|
|
@mock.patch('dcos.http.get')
|
|
@mock.patch('dcoscli.node.main._do_diagnostics_request')
|
|
def test_node_diagnostics_list(mock_do_diagnostics_request, mock_get,
|
|
mock_cosmos):
|
|
"""
|
|
Test _bundle_manage(), should not fail
|
|
"""
|
|
|
|
mock_cosmos().enabled.return_value = True
|
|
m = mock.MagicMock()
|
|
m.json.return_value = {
|
|
'capabilities': [{'name': 'SUPPORT_CLUSTER_REPORT'}]
|
|
}
|
|
mock_get.return_value = m
|
|
mock_do_diagnostics_request.return_value = {
|
|
'127.0.0.1': [
|
|
{
|
|
'file_name': 'bundle.zip',
|
|
'file_size': 123
|
|
}
|
|
]
|
|
}
|
|
|
|
# _bundle_manage(list_bundles, status, cancel, json)
|
|
main._bundle_manage(True, False, False, False)
|
|
mock_do_diagnostics_request.assert_called_once_with(
|
|
'/system/health/v1/report/diagnostics/list/all',
|
|
'GET'
|
|
)
|
|
|
|
|
|
@mock.patch('dcos.packagemanager.PackageManager')
|
|
@mock.patch('dcos.http.get')
|
|
@mock.patch('dcoscli.node.main._do_diagnostics_request')
|
|
def test_node_diagnostics_status(mock_do_diagnostics_request, mock_get,
|
|
mock_cosmos):
|
|
"""
|
|
Test _bundle_manage(), should not fail
|
|
"""
|
|
|
|
mock_cosmos().enabled.return_value = True
|
|
m = mock.MagicMock()
|
|
m.json.return_value = {
|
|
'capabilities': [{'name': 'SUPPORT_CLUSTER_REPORT'}]
|
|
}
|
|
mock_get.return_value = m
|
|
mock_do_diagnostics_request.return_value = {
|
|
'host1': {
|
|
'prop1': 'value1'
|
|
}
|
|
}
|
|
|
|
# _bundle_manage(list_bundles, status, cancel, json)
|
|
main._bundle_manage(False, True, False, False)
|
|
mock_do_diagnostics_request.assert_called_once_with(
|
|
'/system/health/v1/report/diagnostics/status/all',
|
|
'GET'
|
|
)
|
|
|
|
|
|
@mock.patch('dcos.packagemanager.PackageManager')
|
|
@mock.patch('dcos.http.get')
|
|
@mock.patch('dcoscli.node.main._do_diagnostics_request')
|
|
def test_node_diagnostics_cancel(mock_do_diagnostics_request, mock_get,
|
|
mock_cosmos):
|
|
"""
|
|
Test _bundle_manage(), should not fail
|
|
"""
|
|
|
|
mock_cosmos().enabled.return_value = True
|
|
m = mock.MagicMock()
|
|
m.json.return_value = {
|
|
'capabilities': [{'name': 'SUPPORT_CLUSTER_REPORT'}]
|
|
}
|
|
mock_get.return_value = m
|
|
mock_do_diagnostics_request.return_value = {
|
|
'status': 'success'
|
|
}
|
|
|
|
# _bundle_manage(list_bundles, status, cancel, json)
|
|
main._bundle_manage(False, False, True, False)
|
|
mock_do_diagnostics_request.assert_called_once_with(
|
|
'/system/health/v1/report/diagnostics/cancel',
|
|
'POST'
|
|
)
|
|
|
|
|
|
@mock.patch('dcos.packagemanager.PackageManager')
|
|
@mock.patch('dcoscli.node.main._do_request')
|
|
@mock.patch('dcoscli.node.main._get_bundle_list')
|
|
def test_node_diagnostics_download(mock_get_diagnostics_list, mock_do_request,
|
|
mock_cosmos):
|
|
mock_cosmos().enabled.return_value = True
|
|
mock_get_diagnostics_list.return_value = [('bundle.zip', 123)]
|
|
main._bundle_download('bundle.zip', None)
|
|
mock_do_request.assert_called_with(
|
|
'/system/health/v1/report/diagnostics/serve/bundle.zip', 'GET',
|
|
stream=True)
|
|
|
|
|
|
@mock.patch('dcos.config.get_config_val')
|
|
@mock.patch('dcos.http.get')
|
|
@mock.patch('dcoscli.log.dcos_log_enabled')
|
|
def test_dcos_log_leader_mesos(mocked_dcos_log_enabked, mocked_http_get,
|
|
mocked_get_config_val):
|
|
mocked_dcos_log_enabked.return_value = True
|
|
|
|
m = mock.MagicMock()
|
|
m.status_code = 200
|
|
mocked_http_get.return_value = m
|
|
|
|
mocked_get_config_val.return_value = 'http://127.0.0.1'
|
|
|
|
main._dcos_log(False, 10, True, '', None, [])
|
|
mocked_http_get.assert_called_with(
|
|
'http://127.0.0.1/system/v1/leader/mesos/logs/v1/range/?skip_prev=10',
|
|
headers={'Accept': 'text/plain'})
|
|
|
|
|
|
@mock.patch('dcos.config.get_config_val')
|
|
@mock.patch('dcos.http.get')
|
|
@mock.patch('dcoscli.log.dcos_log_enabled')
|
|
def test_dcos_log_leader_marathon(mocked_dcos_log_enabked, mocked_http_get,
|
|
mocked_get_config_val):
|
|
mocked_dcos_log_enabked.return_value = True
|
|
|
|
m = mock.MagicMock()
|
|
m.status_code = 200
|
|
mocked_http_get.return_value = m
|
|
|
|
mocked_get_config_val.return_value = 'http://127.0.0.1'
|
|
|
|
main._dcos_log(False, 10, True, '', 'dcos-marathon', [])
|
|
mocked_http_get.assert_called_with(
|
|
'http://127.0.0.1/system/v1/leader/marathon/logs/v1/range/'
|
|
'?skip_prev=10&filter=_SYSTEMD_UNIT:dcos-marathon.service',
|
|
headers={'Accept': 'text/plain'})
|
|
|
|
|
|
@mock.patch('dcoscli.log.follow_logs')
|
|
@mock.patch('dcos.config.get_config_val')
|
|
@mock.patch('dcos.http.get')
|
|
@mock.patch('dcoscli.log.dcos_log_enabled')
|
|
def test_dcos_log_stream(mocked_dcos_log_enabked, mocked_http_get,
|
|
mocked_get_config_val, mocked_follow_logs):
|
|
mocked_dcos_log_enabked.return_value = True
|
|
|
|
m = mock.MagicMock()
|
|
m.status_code = 200
|
|
mocked_http_get.return_value = m
|
|
|
|
mocked_get_config_val.return_value = 'http://127.0.0.1'
|
|
|
|
main._dcos_log(True, 20, False, 'mesos-id', None, [])
|
|
mocked_follow_logs.assert_called_with(
|
|
'http://127.0.0.1/system/v1/agent/mesos-id/logs'
|
|
'/v1/stream/?skip_prev=20')
|
|
|
|
|
|
@mock.patch('dcoscli.log.follow_logs')
|
|
@mock.patch('dcos.config.get_config_val')
|
|
@mock.patch('dcos.http.get')
|
|
@mock.patch('dcoscli.log.dcos_log_enabled')
|
|
def test_dcos_log_filters(mocked_dcos_log_enabked, mocked_http_get,
|
|
mocked_get_config_val, mocked_follow_logs):
|
|
mocked_dcos_log_enabked.return_value = True
|
|
|
|
m = mock.MagicMock()
|
|
m.status_code = 200
|
|
mocked_http_get.return_value = m
|
|
|
|
mocked_get_config_val.return_value = 'http://127.0.0.1'
|
|
|
|
main._dcos_log(True, 20, False, 'mesos-id', 'dcos-mesos-master',
|
|
['key1:value1', 'key2:value2'])
|
|
|
|
mocked_follow_logs.assert_called_with(
|
|
'http://127.0.0.1/system/v1/agent/mesos-id/logs/v1/stream/'
|
|
'?skip_prev=20&filter=key1:value1&filter=key2:value2&'
|
|
'filter=_SYSTEMD_UNIT:dcos-mesos-master.service')
|
|
|
|
|
|
@mock.patch('dcos.config.get_config_val')
|
|
@mock.patch('dcoscli.node.main._get_slave_ip')
|
|
@mock.patch('dcos.http.get')
|
|
def test_list_components(mocked_get, mocked_get_slave_ip,
|
|
mocked_get_config_val):
|
|
m = mock.MagicMock()
|
|
m.json.return_value = {
|
|
'units': [
|
|
{
|
|
'id': 'dcos-component.service',
|
|
}
|
|
]
|
|
}
|
|
mocked_get.return_value = m
|
|
mocked_get_slave_ip.return_value = '127.0.0.1'
|
|
mocked_get_config_val.return_value = 'http://10.10.10.10'
|
|
main._list_components(None, 'slave-id', False)
|
|
mocked_get.assert_called_with(
|
|
'http://10.10.10.10/system/health/v1/nodes/127.0.0.1/units')
|
|
|
|
|
|
@mock.patch('dcos.config.get_config_val')
|
|
@mock.patch('dcos.mesos.MesosDNSClient')
|
|
@mock.patch('dcos.http.get')
|
|
def test_list_components_leader(mocked_get, mocked_dns,
|
|
mocked_get_config_val):
|
|
m = mock.MagicMock()
|
|
m.json.return_value = {
|
|
'units': [
|
|
{
|
|
'id': 'dcos-component.service',
|
|
}
|
|
]
|
|
}
|
|
mocked_dns().hosts.return_value = [{'ip': '10.10.0.1'}]
|
|
mocked_get_config_val.return_value = 'http://10.10.10.10'
|
|
|
|
mocked_get.return_value = m
|
|
main._list_components(True, False, False)
|
|
mocked_get.assert_called_with(
|
|
'http://10.10.10.10/system/health/v1/nodes/10.10.0.1/units')
|