Example #1
0
 def test_okay(self):
     self.assertEqual(
         run_tasks(
             1,
             [
                 ExampleTask("foo", lambda: "ok"),
                 ExampleTask("bar", lambda: "ok"),
             ],
             lambda task: task.todo(),
         ),
         ["ok", "ok"],
     )
Example #2
0
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)
Example #3
0
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)
Example #4
0
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)