Example #1
0
def ListOS(opts, args):
    """List the valid OSes in the cluster.

  @param opts: the command line options selected by the user
  @type args: list
  @param args: should be an empty list
  @rtype: int
  @return: the desired exit code

  """
    op = opcodes.OpOsDiagnose(output_fields=["name", "variants"], names=[])
    result = SubmitOpCode(op, opts=opts)

    if not opts.no_headers:
        headers = {"name": "Name"}
    else:
        headers = None

    os_names = []
    for (name, variants) in result:
        os_names.extend([[n] for n in CalculateOSNames(name, variants)])

    data = GenerateTable(separator=None,
                         headers=headers,
                         fields=["name"],
                         data=os_names,
                         units=None)

    for line in data:
        ToStdout(line)

    return 0
Example #2
0
    def GET(self):
        """Return a list of all OSes.

    Can return error 500 in case of a problem.

    Example: ["debian-etch"]

    """
        cl = self.GetClient()
        op = opcodes.OpOsDiagnose(output_fields=["name", "variants"], names=[])
        cancel_fn = (lambda: _CheckIfConnectionDropped(self._req.request_sock))
        job_id = self.SubmitJob([op], cl=cl)
        # we use custom feedback function, instead of print we log the status
        result = cli.PollJob(job_id,
                             cl,
                             feedback_fn=baserlib.FeedbackFn,
                             cancel_fn=cancel_fn)
        diagnose_data = result[0]

        if not isinstance(diagnose_data, list):
            raise http.HttpBadGateway(message="Can't get OS list")

        os_names = []
        for (name, variants) in diagnose_data:
            os_names.extend(cli.CalculateOSNames(name, variants))

        return os_names
Example #3
0
def ShowOSInfo(opts, args):
  """List detailed information about OSes in the cluster.

  @param opts: the command line options selected by the user
  @type args: list
  @param args: should be an empty list
  @rtype: int
  @return: the desired exit code

  """
  op = opcodes.OpOsDiagnose(output_fields=["name", "valid", "variants",
                                           "parameters", "api_versions",
                                           "blacklisted", "hidden"],
                            names=[])
  result = SubmitOpCode(op, opts=opts)

  if not result:
    ToStderr("Can't get the OS list")
    return 1

  do_filter = bool(args)

  for (name, valid, variants, parameters, api_versions, blk, hid) in result:
    if do_filter:
      if name not in args:
        continue
      else:
        args.remove(name)
    ToStdout("%s:", name)
    ToStdout("  - valid: %s", valid)
    ToStdout("  - hidden: %s", hid)
    ToStdout("  - blacklisted: %s", blk)
    if valid:
      ToStdout("  - API versions:")
      for version in sorted(api_versions):
        ToStdout("    - %s", version)
      ToStdout("  - variants:")
      for vname in variants:
        ToStdout("    - %s", vname)
      ToStdout("  - parameters:")
      for pname, pdesc in parameters:
        ToStdout("    - %s: %s", pname, pdesc)
    ToStdout("")

  if args:
    for name in args:
      ToStdout("%s: ", name)
      ToStdout("")

  return 0
Example #4
0
def ShowOSInfo(opts, args):
    """List detailed information about OSes in the cluster.

  @param opts: the command line options selected by the user
  @type args: list
  @param args: should be an empty list
  @rtype: int
  @return: the desired exit code

  """
    op = opcodes.OpOsDiagnose(output_fields=[
        "name", "valid", "variants", "parameters", "api_versions",
        "blacklisted", "hidden", "os_hvp", "osparams", "trusted"
    ],
                              names=[])
    result = SubmitOpCode(op, opts=opts)

    if result is None:
        ToStderr("Can't get the OS list")
        return 1

    do_filter = bool(args)

    total_os_hvp = {}
    total_osparams = {}

    for (name, valid, variants, parameters, api_versions, blk, hid, os_hvp,
         osparams, trusted) in result:
        total_os_hvp.update(os_hvp)
        total_osparams.update(osparams)
        if do_filter:
            if name not in args:
                continue
            else:
                args.remove(name)
        ToStdout("%s:", name)
        ToStdout("  - valid: %s", valid)
        ToStdout("  - hidden: %s", hid)
        ToStdout("  - blacklisted: %s", blk)
        if valid:
            ToStdout("  - API versions:")
            for version in sorted(api_versions):
                ToStdout("    - %s", version)
            ToStdout("  - variants:")
            for vname in variants:
                ToStdout("    - %s", vname)
            ToStdout("  - parameters:")
            for pname, pdesc in parameters:
                ToStdout("    - %s: %s", pname, pdesc)
        ToStdout("  - trusted: %s", trusted)
        ToStdout("")

    if args:
        all_names = total_os_hvp.keys() + total_osparams.keys()
        for name in args:
            if not name in all_names:
                ToStdout("%s: ", name)
            else:
                info = [
                    (name, [
                        ("OS-specific hypervisor parameters",
                         total_os_hvp.get(name, {})),
                        ("OS parameters", total_osparams.get(name, {})),
                    ]),
                ]
                PrintGenericInfo(info)
            ToStdout("")

    return 0
Example #5
0
def DiagnoseOS(opts, args):
    """Analyse all OSes on this cluster.

  @param opts: the command line options selected by the user
  @type args: list
  @param args: should be an empty list
  @rtype: int
  @return: the desired exit code

  """
    op = opcodes.OpOsDiagnose(output_fields=[
        "name", "valid", "variants", "node_status", "hidden", "blacklisted"
    ],
                              names=[])
    result = SubmitOpCode(op, opts=opts)

    if result is None:
        ToStderr("Can't get the OS list")
        return 1

    has_bad = False

    for os_name, _, os_variants, node_data, hid, blk in result:
        nodes_valid = {}
        nodes_bad = {}
        nodes_hidden = {}
        for node_name, node_info in node_data.iteritems():
            nodes_hidden[node_name] = []
            if node_info:  # at least one entry in the per-node list
                (fo_path, fo_status, fo_msg, fo_variants, fo_params, fo_api,
                 fo_trusted) = node_info.pop(0)
                fo_msg = "%s (path: %s)" % (_OsStatus(fo_status,
                                                      fo_msg), fo_path)
                if fo_api:
                    max_os_api = max(fo_api)
                    fo_msg += " [API versions: %s]" % utils.CommaJoin(fo_api)
                else:
                    max_os_api = 0
                    fo_msg += " [no API versions declared]"

                if max_os_api >= constants.OS_API_V15:
                    if fo_variants:
                        fo_msg += " [variants: %s]" % utils.CommaJoin(
                            fo_variants)
                    else:
                        fo_msg += " [no variants]"
                if max_os_api >= constants.OS_API_V20:
                    if fo_params:
                        fo_msg += (" [parameters: %s]" %
                                   utils.CommaJoin([v[0] for v in fo_params]))
                    else:
                        fo_msg += " [no parameters]"
                if fo_trusted:
                    fo_msg += " [trusted]"
                else:
                    fo_msg += " [untrusted]"
                if fo_status:
                    nodes_valid[node_name] = fo_msg
                else:
                    nodes_bad[node_name] = fo_msg
                for hpath, hstatus, hmsg, _, _, _ in node_info:
                    nodes_hidden[node_name].append(
                        "    [hidden] path: %s, status: %s" %
                        (hpath, _OsStatus(hstatus, hmsg)))
            else:
                nodes_bad[node_name] = "OS not found"

        # TODO: Shouldn't the global status be calculated by the LU?
        if nodes_valid and not nodes_bad:
            status = "valid"
        elif not nodes_valid and nodes_bad:
            status = "invalid"
            has_bad = True
        else:
            status = "partial valid"
            has_bad = True

        def _OutputPerNodeOSStatus(msg_map):
            map_k = utils.NiceSort(msg_map.keys())
            for node_name in map_k:
                ToStdout("  Node: %s, status: %s", node_name,
                         msg_map[node_name])
                for msg in nodes_hidden[node_name]:
                    ToStdout(msg)

        st_msg = "OS: %s [global status: %s]" % (os_name, status)
        if hid:
            st_msg += " [hidden]"
        if blk:
            st_msg += " [blacklisted]"
        ToStdout(st_msg)
        if os_variants:
            ToStdout("  Variants: [%s]" % utils.CommaJoin(os_variants))
        _OutputPerNodeOSStatus(nodes_valid)
        _OutputPerNodeOSStatus(nodes_bad)
        ToStdout("")

    return int(has_bad)
Example #6
0
        if self.opts.nodes:
            names = self.opts.nodes.split(",")
        else:
            names = []
        try:
            qcl = GetClient(query=True)
            result = qcl.QueryNodes(names, ["name", "offline", "drained"],
                                    False)
        except errors.GenericError, err:
            err_code, msg = cli.FormatError(err)
            Err(msg, exit_code=err_code)
        finally:
            qcl.Close()
        self.nodes = [data[0] for data in result if not (data[1] or data[2])]

        op_diagnose = opcodes.OpOsDiagnose(
            output_fields=["name", "variants", "hidden"], names=[])
        result = self.ExecOp(True, op_diagnose)

        if not result:
            Err("Can't get the OS list")

        found = False
        for (name, variants, _) in result:
            if self.opts.os in cli.CalculateOSNames(name, variants):
                found = True
                break

        if not found:
            Err("OS '%s' not found" % self.opts.os)

        cluster_info = self.cl.QueryClusterInfo()