Ejemplo n.º 1
0
Archivo: dr.py Proyecto: kmalyjur/pcs
def config(
    lib: Any,
    argv: Sequence[str],
    modifiers: InputModifiers,
) -> None:
    """
    Options: None
    """
    modifiers.ensure_only_supported()
    if argv:
        raise CmdLineInputError()
    config_raw = lib.dr.get_config()
    try:
        config_dto = dto.from_dict(DrConfigDto, config_raw)
    except (KeyError, TypeError, ValueError) as e:
        raise error(
            "Unable to communicate with pcsd, received response:\n"
            f"{config_raw}"
        ) from e

    lines = ["Local site:"]
    lines.extend(indent(_config_site_lines(config_dto.local_site)))
    for site_dto in config_dto.remote_site_list:
        lines.append("Remote site:")
        lines.extend(indent(_config_site_lines(site_dto)))
    print("\n".join(lines))
Ejemplo n.º 2
0
def main() -> None:
    # pylint: disable=broad-except
    argv = sys.argv[1:]
    if argv:
        _exit(
            communication.const.COM_STATUS_INPUT_ERROR,
            status_msg="No arguments allowed",
        )

    utils.subprocess_setup()
    logging.basicConfig()

    try:
        input_dto = dto.from_dict(
            communication.dto.InternalCommunicationRequestDto,
            json.load(sys.stdin),
        )
        cli_env = get_cli_env(input_dto.options)
        lib = Library(cli_env, utils.get_middleware_factory())
        if input_dto.cmd not in SUPPORTED_COMMANDS:
            _exit(
                communication.const.COM_STATUS_UNKNOWN_CMD,
                status_msg=f"Unknown command '{input_dto.cmd}'",
            )
        for sub_cmd in input_dto.cmd.split("."):
            lib = getattr(lib, sub_cmd)
        output_data = lib(**input_dto.cmd_data)  # type: ignore
        _exit(
            communication.const.COM_STATUS_SUCCESS,
            report_list=cli_env.report_processor.processed_items,
            data=(
                dto.to_dict(output_data)
                if isinstance(output_data, dto.DataTransferObject)
                else output_data
            ),
        )
    except LibraryError as e:
        _exit(
            communication.const.COM_STATUS_ERROR,
            report_list=(
                cli_env.report_processor.processed_items + list(e.args)
            ),
            data=e.output,
        )
    except json.JSONDecodeError as e:
        _exit(
            communication.const.COM_STATUS_INPUT_ERROR,
            status_msg=f"Unable to parse input data: {e.msg}",
        )
    except DaciteError as e:
        _exit(
            communication.const.COM_STATUS_INPUT_ERROR,
            status_msg=str(e),
        )
    except Exception as e:
        # TODO: maybe add traceback?
        _exit(communication.const.COM_STATUS_EXCEPTION, status_msg=str(e))
Ejemplo n.º 3
0
 def entity_fixture(index):
     return dto.from_dict(
         RelationEntityDto,
         dict(id=f"ent_id{index}",
              type="ent_type",
              members=[f"{index}m1", f"{index}m2", f"{index}m0"],
              metadata=dict(
                  id=f"ent_id{index}",
                  k0="val0",
                  k1="val1",
              )))
Ejemplo n.º 4
0
def _convert_input_data(cmd: str, data: Dict[str, Any]) -> Mapping[str, Any]:
    if cmd == "resource_agent.get_agent_metadata":
        try:
            data["agent_name"] = dto.from_dict(ResourceAgentNameDto,
                                               data["agent_name"])
        except (DaciteError, KeyError) as e:
            _exit(
                communication.const.COM_STATUS_INPUT_ERROR,
                status_msg=str(e),
            )
    return data
Ejemplo n.º 5
0
Archivo: dr.py Proyecto: kmalyjur/pcs
def status(
    lib: Any,
    argv: Sequence[str],
    modifiers: InputModifiers,
) -> None:
    """
    Options:
      * --full - show full details, node attributes and failcount
      * --hide-inactive - hide inactive resources
      * --request-timeout - HTTP timeout for node authorization check
    """
    modifiers.ensure_only_supported(
        "--full",
        "--hide-inactive",
        "--request-timeout",
    )
    if argv:
        raise CmdLineInputError()

    status_list_raw = lib.dr.status_all_sites_plaintext(
        hide_inactive_resources=modifiers.get("--hide-inactive"),
        verbose=modifiers.get("--full"),
    )
    try:
        status_list = [
            dto.from_dict(DrSiteStatusDto, status_raw)
            for status_raw in status_list_raw
        ]
    except (KeyError, TypeError, ValueError) as e:
        raise error(
            "Unable to communicate with pcsd, received response:\n"
            f"{status_list_raw}"
        ) from e

    has_errors = False
    plaintext_parts = []
    for site_status in status_list:
        plaintext_parts.append(
            "--- {local_remote} cluster - {role} site ---".format(
                local_remote=("Local" if site_status.local_site else "Remote"),
                role=site_status.site_role.capitalize(),
            )
        )
        if site_status.status_successfully_obtained:
            plaintext_parts.append(site_status.status_plaintext.strip())
            plaintext_parts.extend(["", ""])
        else:
            has_errors = True
            plaintext_parts.extend(
                ["Error: Unable to get status of the cluster from any node", ""]
            )
    print("\n".join(plaintext_parts).strip())
    if has_errors:
        raise error("Unable to get status of all sites")
Ejemplo n.º 6
0
 def _action_dto(action):
     all_keys = {
         "name": "",
         "timeout": None,
         "interval": None,
         "role": None,
         "start-delay": None,
         "depth": None,
         "automatic": False,
         "on_target": False,
     }
     all_keys.update(action)
     return from_dict(ResourceAgentActionDto, all_keys)
Ejemplo n.º 7
0
 def entity_fixture(index):
     return dto.from_dict(
         RelationEntityDto,
         dict(
             id=f"ent_id{index}",
             type=str(ResourceRelationType.INNER_RESOURCES.value),
             members=[f"{index}m1", f"{index}m2", f"{index}m0"],
             metadata=dict(
                 id=f"ent_id{index}",
                 k0="val0",
                 k1="val1",
             ),
         ),
     )
Ejemplo n.º 8
0
def show_resource_relations_cmd(
    lib: Any, argv: Sequence[str], modifiers: InputModifiers,
) -> None:
    """
    Options:
      * -f - CIB file
      * --full - show constraint ids and resource types
    """
    modifiers.ensure_only_supported("-f", "--full")
    if len(argv) != 1:
        raise CmdLineInputError()
    tree = ResourcePrintableNode.from_dto(
        dto.from_dict(
            ResourceRelationDto,
            lib.resource.get_resource_relations_tree(argv[0]),
        )
    )
    for line in tree_to_lines(tree, verbose=modifiers.get("--full")):
        print(line)
Ejemplo n.º 9
0
Archivo: scsi.py Proyecto: vvidic/pcs
    def _process_response(self, response):
        report_item = response_to_report_item(response,
                                              report_pcsd_too_old_on_404=True)
        if report_item:
            self._report(report_item)
            return
        node_label = response.request.target.label
        try:
            result = from_dict(InternalCommunicationResultDto,
                               json.loads(response.data))
            context = reports.ReportItemContext(node_label)
            self._report_list([
                reports.report_dto_to_item(report, context)
                for report in result.report_list
            ])
            if result.status == const.COM_STATUS_SUCCESS:
                self._on_success()

        except (json.JSONDecodeError, DaciteError):
            self._report(
                reports.ReportItem.error(
                    reports.messages.InvalidResponseFormat(node_label)))
Ejemplo n.º 10
0
 def test_nested_from_dict(self):
     self.assertEqual(self.nested_dto, from_dict(MyDto3, self.nested_dict))
Ejemplo n.º 11
0
 def test_simple_from_dict(self):
     self.assertEqual(self.simple_dto, from_dict(MyDto1, self.simple_dict))