def test_okay(self): self.assertEqual( run_tasks( 1, [ ExampleTask("foo", lambda: "ok"), ExampleTask("bar", lambda: "ok"), ], lambda task: task.todo(), ), ["ok", "ok"], )
def op_check(args): def highlight(s): return nixops.util.ansi_highlight(s, outfile=sys.stdout) def warn(s): return nixops.util.ansi_warn(s, outfile=sys.stdout) def render_tristate(x): if x == None: return "N/A" elif x: return nixops.util.ansi_success("Yes", outfile=sys.stdout) else: return warn("No") tbl = create_table( ([("Deployment", "l")] if args.all else []) + [ ("Name", "l"), ("Exists", "l"), ("Up", "l"), ("Reachable", "l"), ("Disks OK", "l"), ("Load avg.", "l"), ("Units", "l"), ("Notes", "l"), ] ) machines: List[nixops.backends.MachineState] = [] resources: List[nixops.resources.ResourceState] = [] def check(depl: nixops.deployment.Deployment): for m in depl.active_resources.values(): if not nixops.deployment.should_do( m, args.include or [], args.exclude or [] ): continue if isinstance(m, nixops.backends.MachineState): machines.append(m) else: resources.append(m) for depl in one_or_all(args): check(depl) ResourceStatus = Tuple[ str, Union[nixops.backends.MachineState, nixops.resources.ResourceState], List[str], int, ] # Check all machines in parallel. def worker(m: nixops.backends.MachineState) -> ResourceStatus: res = m.check() unit_lines = [] if res.failed_units: unit_lines.append( "\n".join([warn("{0} [failed]".format(x)) for x in res.failed_units]) ) if res.in_progress_units: unit_lines.append( "\n".join( [ highlight("{0} [running]".format(x)) for x in res.in_progress_units ] ) ) row = ([m.depl.name or m.depl.uuid] if args.all else []) + [ m.name, render_tristate(res.exists), render_tristate(res.is_up), render_tristate(res.is_reachable), render_tristate(res.disks_ok), "{0} {1} {2}".format(res.load[0], res.load[1], res.load[2]) if res.load != None else "", "\n".join(unit_lines), "\n".join([warn(x) for x in res.messages]), ] status = 0 if res.exists == False: status |= 1 if res.is_up == False: status |= 2 if res.is_reachable == False: status |= 4 if res.disks_ok == False: status |= 8 if res.failed_units != None and res.failed_units != []: status |= 16 return (m.depl.name or m.depl.uuid, m, row, status) resources_tbl = create_table( ([("Deployment", "l")] if args.all else []) + [("Name", "l"), ("Exists", "l")] ) def resource_worker(r: nixops.resources.ResourceState) -> Optional[ResourceStatus]: if not nixops.deployment.is_machine(r): r.check() exist = True if r.state == nixops.resources.ResourceState.UP else False row = ([r.depl.name or r.depl.uuid] if args.all else []) + [ r.name, render_tristate(exist), ] return (r.depl.name or r.depl.uuid, r, row, 0) return None results = run_tasks(nr_workers=len(machines), tasks=machines, worker_fun=worker) resources_results = run_tasks( nr_workers=len(resources), tasks=resources, worker_fun=resource_worker ) # Sort the rows by deployment/machine. status = 0 for res in sorted( [res for res in results if res is not None], key=lambda res: machine_to_key(res[0], res[1].name, res[1].get_type()), ): tbl.add_row(res[2]) status |= res[3] print(nixops.util.ansi_success("Machines state:")) print(tbl) for res in sorted( [res for res in resources_results if res is not None], key=lambda res: machine_to_key(res[0], res[1].name, res[1].get_type()), ): resources_tbl.add_row(res[2]) status |= res[3] print(nixops.util.ansi_success("Non machines resources state:")) print(resources_tbl) sys.exit(status)
def op_check(args: Namespace) -> None: # noqa: C901 def highlight(s: str) -> str: return nixops.ansi.ansi_highlight(s, outfile=sys.stdout) def warn(s: str) -> str: return nixops.ansi.ansi_warn(s, outfile=sys.stdout) def render_tristate(x: bool) -> str: if x is None: return "N/A" elif x: return nixops.ansi.ansi_success("Yes", outfile=sys.stdout) else: return warn("No") tbl = create_table(([("Deployment", "l")] if args.all else []) + [ ("Name", "l"), ("Exists", "l"), ("Up", "l"), ("Reachable", "l"), ("Disks OK", "l"), ("Load avg.", "l"), ("Units", "l"), ("Notes", "l"), ]) machines: List[nixops.backends.GenericMachineState] = [] resources: List[nixops.resources.GenericResourceState] = [] def check(depl: nixops.deployment.Deployment) -> None: for m in depl.active_resources.values(): if not nixops.deployment.should_do(m, args.include or [], args.exclude or []): continue if isinstance(m, nixops.backends.MachineState): machines.append(m) else: resources.append(m) # TODO: writable=False? # Historically, nixops check was allowed to write to the state file. # With remote state however, this requires an exclusive lock, which may # not be the best choice. with one_or_all(args, writable=True, activityDescription="nixops check") as depls: for depl in depls: check(depl) ResourceStatus = Tuple[str, Union[nixops.backends.GenericMachineState, nixops.resources.GenericResourceState, ], List[str], int, ] # Check all machines in parallel. def worker(m: nixops.backends.GenericMachineState) -> ResourceStatus: res = m.check() unit_lines = [] if res.failed_units: unit_lines.append("\n".join([ warn("{0} [failed]".format(x)) for x in res.failed_units ])) if res.in_progress_units: unit_lines.append("\n".join([ highlight("{0} [running]".format(x)) for x in res.in_progress_units ])) row = ([m.depl.name or m.depl.uuid] if args.all else []) + [ m.name, render_tristate(res.exists), render_tristate(res.is_up), render_tristate(res.is_reachable), render_tristate(res.disks_ok), "{0} {1} {2}".format(res.load[0], res.load[1], res.load[2]) if res.load is not None else "", "\n".join(unit_lines), "\n".join([warn(x) for x in res.messages]), ] status = 0 if res.exists is False: status |= 1 if res.is_up is False: status |= 2 if res.is_reachable is False: status |= 4 if res.disks_ok is False: status |= 8 if res.failed_units is not None and res.failed_units != []: status |= 16 return (m.depl.name or m.depl.uuid, m, row, status) resources_tbl = create_table(([("Deployment", "l")] if args.all else []) + [("Name", "l"), ("Exists", "l")]) def resource_worker( r: nixops.resources.GenericResourceState, ) -> Optional[ResourceStatus]: if not nixops.deployment.is_machine(r): r.check() exist = True if r.state == nixops.resources.ResourceState.UP else False row = ([r.depl.name or r.depl.uuid] if args.all else []) + [ r.name, render_tristate(exist), ] return (r.depl.name or r.depl.uuid, r, row, 0) return None results = run_tasks(nr_workers=len(machines), tasks=machines, worker_fun=worker) resources_results = run_tasks(nr_workers=len(resources), tasks=resources, worker_fun=resource_worker) # Sort the rows by deployment/machine. status = 0 for res in sorted( [res for res in results if res is not None], key=lambda res: machine_to_key(res[0], res[1].name, res[1]. get_type()), ): tbl.add_row(res[2]) status |= res[3] print(nixops.ansi.ansi_success("Machines state:")) print(tbl) for res in sorted( [res for res in resources_results if res is not None], key=lambda res: machine_to_key(res[0], res[1].name, res[1]. get_type()), ): resources_tbl.add_row(res[2]) status |= res[3] print(nixops.ansi.ansi_success("Non machines resources state:")) print(resources_tbl) sys.exit(status)
def op_check(args): def highlight(s): return nixops.util.ansi_highlight(s, outfile=sys.stdout) def warn(s): return nixops.util.ansi_warn(s, outfile=sys.stdout) def render_tristate(x): if x == None: return "N/A" elif x: return nixops.util.ansi_success("Yes", outfile=sys.stdout) else: return warn("No") tbl = create_table( ([('Deployment', 'l')] if args.all else []) + [('Name', 'l'), ('Exists', 'l'), ('Up', 'l'), ('Reachable', 'l'), ('Disks OK', 'l'), ('Load avg.', 'l'), ('Units', 'l'), ('Notes', 'l')]) machines = [] resources = [] def check(depl): for m in depl.active_resources.itervalues(): if not nixops.deployment.should_do(m, args.include or [], args.exclude or []): continue if nixops.deployment.is_machine(m): machines.append(m) else: resources.append(m) for depl in one_or_all(args): check(depl) # Check all machines in parallel. def worker(m): res = m.check() unit_lines = [] if res.failed_units: unit_lines.append('\n'.join([warn('{0} [failed]'.format(x)) for x in res.failed_units])) if res.in_progress_units: unit_lines.append('\n'.join([highlight('{0} [running]'.format(x)) for x in res.in_progress_units])) row = ([m.depl.name or m.depl.uuid] if args.all else []) + \ [m.name, render_tristate(res.exists), render_tristate(res.is_up), render_tristate(res.is_reachable), render_tristate(res.disks_ok), '{0} {1} {2}'.format(res.load[0], res.load[1], res.load[2]) if res.load != None else "", '\n'.join(unit_lines), '\n'.join([warn(x) for x in res.messages]) ] status = 0 if res.exists == False: status |= 1 if res.is_up == False: status |= 2 if res.is_reachable == False: status |= 4 if res.disks_ok == False: status |= 8 if res.failed_units != None and res.failed_units != []: status |= 16 return (m.depl.name or m.depl.uuid, m, row, status) resources_tbl = create_table( ([('Deployment', 'l')] if args.all else []) + [('Name', 'l'), ('Exists', 'l')]) def resource_worker(r): if not nixops.deployment.is_machine(r): r.check() exist = True if r.state == nixops.resources.ResourceState.UP else False row = ([r.depl.name or r.depl.uuid] if args.all else []) + \ [r.name, render_tristate(exist)] return (r.depl.name or r.depl.uuid, r, row, 0) results = run_tasks(nr_workers=len(machines), tasks=machines, worker_fun=worker) resources_results = run_tasks(nr_workers=len(resources), tasks=resources, worker_fun=resource_worker) # Sort the rows by deployment/machine. status = 0 for res in sorted(results, key=lambda res: machine_to_key(res[0], res[1].name, res[1].get_type())): tbl.add_row(res[2]) status |= res[3] print nixops.util.ansi_success("Machines state:") print tbl for res in sorted(resources_results, key=lambda res: machine_to_key(res[0], res[1].name, res[1].get_type())): resources_tbl.add_row(res[2]) status |= res[3] print nixops.util.ansi_success("Non machines resources state:") print resources_tbl sys.exit(status)