diff --git a/cli/dcoscli/main.py b/cli/dcoscli/main.py index f34b1fc..4fbff74 100644 --- a/cli/dcoscli/main.py +++ b/cli/dcoscli/main.py @@ -8,6 +8,8 @@ from dcos import constants, emitting, errors, http, subcommand, util from dcos.errors import DCOSException from dcoscli.subcommand import SubcommandMain, default_doc +from six.moves import urllib + logger = util.get_logger(__name__) emitter = emitting.FlatEmitter() @@ -20,13 +22,44 @@ def main(): return 1 +def _get_versions(dcos_url): + """Print DCOS and DCOS-CLI versions + + :param dcos_url: url to DCOS cluster + :type dcos_url: str + :returns: Process status + :rtype: int + """ + + dcos_info = {} + try: + url = urllib.parse.urljoin( + dcos_url, 'dcos-metadata/dcos-version.json') + res = http.get(url, timeout=1) + if res.status_code == 200: + dcos_info = res.json() + except Exception as e: + logger.exception(e) + pass + + emitter.publish( + "dcoscli.version={}\n".format(dcoscli.version) + + "dcos.version={}\n".format(dcos_info.get("version", "N/A")) + + "dcos.commit={}\n".format(dcos_info.get( + "dcos-image-commit", "N/A")) + + "dcos.bootstrap-id={}".format(dcos_info.get("bootstrap-id", "N/A")) + ) + return 0 + + def _main(): signal.signal(signal.SIGINT, signal_handler) - args = docopt.docopt( - default_doc("dcos"), - version='dcos version {}'.format(dcoscli.version), - options_first=True) + http.silence_requests_warnings() + config = util.get_config() + set_ssl_info_env_vars(config) + + args = docopt.docopt(default_doc("dcos"), options_first=True) log_level = args['--log-level'] if log_level and not _config_log_level_environ(log_level): @@ -37,11 +70,10 @@ def _main(): util.configure_process_from_environ() - config = util.get_config() - set_ssl_info_env_vars(config) + if args['--version']: + return _get_versions(config.get("core.dcos_url")) command = args[''] - http.silence_requests_warnings() if not command: command = "help" diff --git a/cli/tests/integrations/test_dcos.py b/cli/tests/integrations/test_dcos.py index 8f981b8..26f48dd 100644 --- a/cli/tests/integrations/test_dcos.py +++ b/cli/tests/integrations/test_dcos.py @@ -14,8 +14,16 @@ def test_help(): def test_version(): - assert_command(['dcos', '--version'], - stdout=b'dcos version SNAPSHOT\n') + returncode, stdout, stderr = exec_command( + ['dcos', '--version']) + + assert returncode == 0 + assert stderr == b'' + versions = stdout.decode('utf-8').split("\n") + assert versions[0] == "dcoscli.version=SNAPSHOT" + assert versions[1].startswith("dcos.version") + assert versions[2].startswith("dcos.commit") + assert versions[3].startswith("dcos.bootstrap-id") def test_log_level_flag():