def _mesos_files(tasks, file_, client): """Return MesosFile objects for the specified tasks and file name. Only include files that satisfy all of the following: a) belong to an available slave b) have an executor entry on the slave :param tasks: tasks on which files reside :type tasks: [mesos.Task] :param file_: file path to read :type file_: str :param client: DC/OS client :type client: mesos.DCOSClient :returns: MesosFile objects :rtype: [mesos.MesosFile] """ # load slave state in parallel slaves = _load_slaves_state([task.slave() for task in tasks]) # some completed tasks may have entries on the master, but none on # the slave. since we need the slave entry to get the executor # sandbox, we only include files with an executor entry. available_tasks = [task for task in tasks if task.slave() in slaves and task.executor()] # create files. return [mesos.MesosFile(file_, task=task, dcos_client=client) for task in available_tasks]
def test_log_file_unavailable(): """ Test a file's read.json being unavailable """ files = [mesos.MesosFile('bogus')] files[0].read = _mock_exception('exception') with patch('dcoscli.task.main._mesos_files', return_value=files): args = ['task', 'log', 'test-app1'] stderr = b"No files exist. Exiting.\n" assert_mock(main, args, returncode=1, stderr=stderr)
def test_log_file_unavailable(): """ Test a file's read.json being unavailable """ files = [mesos.MesosFile('bogus')] files[0].read = _mock_exception('exception') with pytest.raises(DCOSException) as e: log_files(files, True, 10) msg = "No files exist. Exiting." assert e.exconly().split(':', 1)[1].strip() == msg
def _mesos_files(leader, slave_id): """Returns the MesosFile objects to log :param leader: whether to include the leading master's log file :type leader: bool :param slave_id: the ID of a slave. used to include a slave's log file :type slave_id: str | None :returns: MesosFile objects :rtype: [MesosFile] """ files = [] if leader: files.append(mesos.MesosFile('/master/log')) if slave_id: slave = mesos.get_master().slave(slave_id) files.append(mesos.MesosFile('/slave/log', slave=slave)) return files
def log_job(args): dcos_client = mesos.DCOSClient() task = mesos.get_master(dcos_client).task(args['<submissionId>']) log_file = args.get('--file', "stdout") if log_file is None: log_file = "stdout" mesos_file = mesos.MesosFile(log_file, task=task, dcos_client=dcos_client) lines_count = args.get('--lines_count', "10") if lines_count is None: lines_count = "10" return log.log_files([mesos_file], args['--follow'], int(lines_count))
def _log_task(task_id, follow, lines, file_): """Prints the contents of the logs for a given task ID. :param task_id: task ID :type task_id: str :param follow: same as unix tail's -f :type follow: bool :param lines: number of lines to print :type lines: int :param file_: file path to read :type file_: str :returns: process return code :rtype: int """ dcos_client = mesos.DCOSClient() task = mesos.get_master(dcos_client).task(task_id) mesos_file = mesos.MesosFile(file_, task=task, dcos_client=dcos_client) return log.log_files([mesos_file], follow, lines)