Ejemplo n.º 1
0
def test_execute_increase(fs, mocker):
    source = "/var/data"
    fs.create_dir(source)
    target = { "dispatch": { "target_ip": "0.0.0.0", "target_aet_target": "a", "target_port": 90 } }
    fs.create_file("/var/data/"+mercure_names.TASKFILE, contents=json.dumps(target))
    result = increase_retry(source, 5, 50)

    with open("/var/data/"+mercure_names.TASKFILE, "r") as f:
        modified_target = json.load(f)

    assert modified_target["dispatch"]["retries"] == 1
    assert modified_target["dispatch"]["next_retry_at"]
    assert result
Ejemplo n.º 2
0
def test_execute_increase_fail(fs, mocker):
    source = "/var/data"
    fs.create_dir(source)
    target = {
        "dispatch": {
            "target_ip": "0.0.0.0",
            "target_aet_target": "a",
            "target_port": 90,
            "retries": 5,
        }
    }
    fs.create_file("/var/data/" + mercure_names.TASKFILE,
                   contents=json.dumps(target))
    result = increase_retry(source, 5, 50)

    assert not result
Ejemplo n.º 3
0
def execute(
    source_folder: Path,
    success_folder: Path,
    error_folder: Path,
    retry_max,
    retry_delay,
):
    """
    Execute the dcmsend command. It will create a .sending file to indicate that
    the folder is being sent. This is to prevent double sending. If there
    happens any error the .lock file is deleted and an .error file is created.
    Folder with .error files are _not_ ready for sending.
    """
    target_info = is_ready_for_sending(source_folder)
    delay = target_info.get("next_retry_at", 0)

    if target_info and time.time() >= delay:
        logger.info(f"Folder {source_folder} is ready for sending")

        series_uid = target_info.get("series_uid", "series_uid-missing")
        target_name = target_info.get("target_name", "target_name-missing")

        if (series_uid == "series_uid-missing") or (target_name
                                                    == "target_name-missing"):
            send_event(h_events.PROCESSING, severity.WARNING,
                       f"Missing information for folder {source_folder}")

        # Create a .sending file to indicate that this folder is being sent,
        # otherwise the dispatcher would pick it up again if the transfer is
        # still going on
        lock_file = Path(source_folder) / mercure_names.PROCESSING
        try:
            lock_file.touch()
        except:
            send_event(h_events.PROCESSING, severity.ERROR,
                       f"Error sending {series_uid} to {target_name}")
            send_series_event(s_events.ERROR, series_uid, 0, target_name,
                              "Unable to create lock file")
            logger.exception(f"Unable to create lock file {lock_file.name}")
            return

        command = _create_command(target_info, source_folder)
        logger.debug(f"Running command {command}")
        try:
            run(split(command), check=True)
            logger.info(
                f"Folder {source_folder} successfully sent, moving to {success_folder}"
            )
            # Send bookkeeper notification
            file_count = len(
                list(Path(source_folder).glob(mercure_names.DCMFILTER)))
            send_series_event(
                s_events.DISPATCH,
                target_info.get("series_uid", "series_uid-missing"),
                file_count,
                target_info.get("target_name", "target_name-missing"),
                "",
            )
            _move_sent_directory(source_folder, success_folder)
            send_series_event(s_events.MOVE, series_uid, 0, success_folder, "")
        except CalledProcessError as e:
            dcmsend_error_message = DCMSEND_ERROR_CODES.get(e.returncode, None)
            logger.exception(
                f"Failed command:\n {command} \nbecause of {dcmsend_error_message}"
            )
            send_event(h_events.PROCESSING, severity.ERROR,
                       f"Error sending {series_uid} to {target_name}")
            send_series_event(s_events.ERROR, series_uid, 0, target_name,
                              dcmsend_error_message)
            retry_increased = increase_retry(source_folder, retry_max,
                                             retry_delay)
            if retry_increased:
                lock_file.unlink()
            else:
                logger.info(f"Max retries reached, moving to {error_folder}")
                send_series_event(s_events.SUSPEND, series_uid, 0, target_name,
                                  "Max retries reached")
                _move_sent_directory(source_folder, error_folder)
                send_series_event(s_events.MOVE, series_uid, 0, error_folder,
                                  "")
                send_event(h_events.PROCESSING, severity.ERROR,
                           f"Series suspended after reaching max retries")
    else:
        pass