def test_parse_script(self, mock_subprocess): with temporary_file() as fp: mock_popen = mock.Mock() mock_popen.wait.return_value = 0 mock_subprocess.Popen.return_value = mock_popen parse_script(fp.name)('h1') assert mock_popen.wait.call_count == 1
def perform_maintenance_hosts(cluster): """usage: perform_maintenance_hosts {--filename=filename | --hosts=hosts} [--post_drain_script=path] [--grouping=function] [--override_percentage=percentage] [--override_duration=duration] [--override_reason=reason] [--unsafe_hosts_file=unsafe_hosts_filename] cluster Asks the scheduler to remove any running tasks from the machine and remove it from service temporarily, perform some action on them, then return the machines to service. """ options = app.get_options() drainable_hosts = parse_hostnames(options.filename, options.hosts) get_grouping_or_die(options.grouping) has_override = bool(options.percentage) or bool(options.duration) or bool(options.reason) all_overrides = bool(options.percentage) and bool(options.duration) and bool(options.reason) if has_override != all_overrides: die("All --override_* options are required when attempting to override default SLA values.") percentage = parse_sla_percentage(options.percentage) if options.percentage else None duration = parse_time(options.duration) if options.duration else None if options.reason: log_admin_message( logging.WARNING, "Default SLA values (percentage: %s, duration: %s) are overridden for the following " "hosts: %s. New percentage: %s, duration: %s, override reason: %s" % ( HostMaintenance.SLA_UPTIME_PERCENTAGE_LIMIT, HostMaintenance.SLA_UPTIME_DURATION_LIMIT, drainable_hosts, percentage, duration, options.reason, ), ) drained_callback = parse_script(options.post_drain_script) HostMaintenance(CLUSTERS[cluster], options.verbosity).perform_maintenance( drainable_hosts, grouping_function=options.grouping, callback=drained_callback, percentage=percentage, duration=duration, output_file=options.unsafe_hosts_filename, )
def host_drain(cluster): """usage: host_drain {--filename=filename | --hosts=hosts} [--post_drain_script=path] [--grouping=function] [--override_percentage=percentage] [--override_duration=duration] [--override_reason=reason] [--unsafe_hosts_file=unsafe_hosts_filename] cluster Asks the scheduler to start maintenance on the list of provided hosts (see host_deactivate for more details) and drains any active tasks on them. The list of hosts is drained and marked in a drained state. This will kill off any tasks currently running on these hosts, as well as prevent future tasks from scheduling on these hosts while they are drained. The hosts are left in maintenance mode upon completion. Use host_activate to return hosts back to service and allow scheduling tasks on them. """ options = app.get_options() drainable_hosts = parse_hostnames(options.filename, options.hosts) get_grouping_or_die(options.grouping) override_percentage, override_duration = parse_and_validate_sla_overrides( options, drainable_hosts) post_drain_callback = parse_script(options.post_drain_script) drained_hostnames = HostMaintenance(CLUSTERS[cluster], options.verbosity).perform_maintenance( drainable_hosts, grouping_function=options.grouping, percentage=override_percentage, duration=override_duration, output_file=options.unsafe_hosts_filename) if post_drain_callback: for hostname in drained_hostnames: post_drain_callback(hostname)
def host_drain(cluster): """usage: host_drain {--filename=filename | --hosts=hosts} [--post_drain_script=path] [--grouping=function] [--override_percentage=percentage] [--override_duration=duration] [--override_reason=reason] [--unsafe_hosts_file=unsafe_hosts_filename] cluster Asks the scheduler to start maintenance on the list of provided hosts (see host_deactivate for more details) and drains any active tasks on them. The list of hosts is drained and marked in a drained state. This will kill off any tasks currently running on these hosts, as well as prevent future tasks from scheduling on these hosts while they are drained. The hosts are left in maintenance mode upon completion. Use host_activate to return hosts back to service and allow scheduling tasks on them. """ options = app.get_options() drainable_hosts = parse_hostnames(options.filename, options.hosts) get_grouping_or_die(options.grouping) override_percentage, override_duration = parse_and_validate_sla_overrides( options, drainable_hosts) post_drain_callback = parse_script(options.post_drain_script) drained_hostnames = HostMaintenance( CLUSTERS[cluster], options.verbosity).perform_maintenance( drainable_hosts, grouping_function=options.grouping, percentage=override_percentage, duration=override_duration, output_file=options.unsafe_hosts_filename) if post_drain_callback: for hostname in drained_hostnames: post_drain_callback(hostname)