Esempio n. 1
0
def to_be_an_error_with(topic, status=500, msg=None, operation=None):
    """Asserts that `response from API is a proper error message`."""

    if not isinstance(topic, Response):
        raise AssertionError(
            f"Expected topic to be a flask.Response, not {type(topic)}.")

    if topic.status_code != status:
        raise AssertionError(
            f"Expected response's status code to equal {status}, but it was {topic.status_code}."
        )

    data = topic.data
    try:
        obj = loads(data)
    except ValueError:
        raise AssertionError(
            f"Expected response to be JSON, but it was not:\n\n{data}.")

    if operation is not None and obj.get("operation") != operation:
        raise AssertionError(
            f"Expected error operation to be {operation}, but it was {obj.get('operation')}."
        )

    if obj.get("error") != msg:
        raise AssertionError(
            f"Expected error message to be {msg}, but it was {obj.get('error')}."
        )
Esempio n. 2
0
def get_details():
    try:
        details = request.get_json()
    except Exception:
        details = None

    if details is None and request.get_data():
        details = loads(request.get_data())

    return details
Esempio n. 3
0
def send_webhook(
    task_id, job_id, execution_id, method, url, headers, retries, retry_count
):
    app = current_app

    job = Job.get_by_id(task_id, job_id)
    logger = app.logger.bind(
        operation="send_webhook",
        task_id=task_id,
        job_id=job_id,
        execution_id=execution_id,
        method=method,
        url=url,
        headers=headers,
        retries=retries,
        retry_count=retry_count,
    )

    if job is None:
        logger.error("Failed to retrieve task or job.")

        return False

    execution = job.get_execution_by_id(execution_id)
    logger.info("Execution loaded successfully")

    data = execution.to_dict(include_log=True, include_error=True)
    data = loads(dumps(data))
    if "webhookDispatch" in data["metadata"]:
        del data["metadata"]["webhookDispatch"]
    data["metadata"]["custom"] = job.metadata.get("custom", {})
    data["job_id"] = job_id
    data = dumps(data)
    try:
        dispatcher = WebhooksDispatcher()
        response = dispatcher.dispatch(method, url, data, headers)

        execution.metadata.setdefault("webhookDispatch", [])
        execution.metadata["webhookDispatch"].append(
            {
                "timestamp": datetime.utcnow().isoformat(),
                "url": url,
                "statusCode": response.status_code,
                "body": response.body,
                "headers": response.headers,
            }
        )
        execution.save()
        job.save()
        logger.info("Webhook dispatched successfully.")
    except WebhooksDispatchError as err:
        error = traceback.format_exc()
        execution.metadata.setdefault("webhookDispatch", [])
        execution.metadata["webhookDispatch"].append(
            {
                "timestamp": datetime.utcnow().isoformat(),
                "url": url,
                "statusCode": err.status_code,
                "body": err.body,
                "headers": err.headers,
                "error": error,
            }
        )
        execution.metadata["webhookDispatch"] = execution.metadata["webhookDispatch"][
            -3:
        ]
        execution.save()
        job.save()

        logger.error("Failed to dispatch webhook.", err=error)
        if retry_count < retries:
            logger.debug("Retrying...")
            args = [
                task_id,
                job_id,
                execution_id,
                method,
                url,
                headers,
                retries,
                retry_count + 1,
            ]

            factor = app.config["WEBHOOKS_EXPONENTIAL_BACKOFF_FACTOR"]
            min_backoff = app.config["WEBHOOKS_EXPONENTIAL_BACKOFF_MIN_MS"] / 1000.0
            delta = to_unix(
                datetime.utcnow()
                + timedelta(seconds=math.pow(factor, retry_count) * min_backoff)
            )
            current_app.webhooks_queue.enqueue_at(delta, Categories.Webhook, *args)
            logger.info("Webhook dispatch retry scheduled.", date=delta)

    return True