Exemplo n.º 1
0
def delete_db_doc(
        client: AsyncClient,
        db: str,
        docid: str,
        params: Optional[dict[str, str]] = None,
        **client_kwargs: dict[str, Any]) -> Coroutine[Any, Any, Response]:
    """
    Mark a document as deleted.

    https://docs.couchdb.org/en/stable/api/document/common.html#delete--db-docid

    :param client: An HTTP client with which to perform the request.
    :param db: The name of the CocuhDB database that stores the document to be deleted.
    :param docid: The document ID of the document to be deleted.
    :param params: Optional query parameter options.
    :param client_kwargs: Arguments passed to the HTTP client.
    :return: The response of the HTTP request.
    """

    return client.delete(url=f'/{db}/{docid}', params=params, **client_kwargs)
Exemplo n.º 2
0
async def sync_dns_record(
    dns_record_db: DNSRecordDB,
    dns_record_cf: DNSRecordCloudflare,
    client: httpx.AsyncClient,
):
    response_futures = []

    if dns_record_db.to_delete and dns_record_cf is None:
        logger.warning(
            f'DNS Record in DB is marked for deletion but does not exist'
            f' (record: {dns_record_db})')
    elif dns_record_db.to_delete:
        if BaseDNSRecord(**dns_record_db.dict()) != BaseDNSRecord(
                **dns_record_cf.dict()):
            logger.warning(
                'DNS record in cloudflare does not match DNS record to be deleted, '
                'it might have been manually changed')
        logger.info(f'Delete: {dns_record_cf}')
        response_futures.append(
            client.delete(
                f'zones/{dns_record_cf.zone_id}/dns_records/{dns_record_cf.id}',
                auth=DomainAuth(dns_record_cf.domain),
            ))
    elif dns_record_cf is None:
        # create
        logger.info(f'Create: {dns_record_db}')
        dns_record_cf_upload = BaseDNSRecord(**dns_record_db.dict())
        response_futures.append(
            client.post(
                f'zones/{dns_record_cf_upload.zone_id}/dns_records',
                json=dns_record_cf_upload.dict(),
                auth=DomainAuth(dns_record_db.domain),
            ))
    elif BaseDNSRecord(**dns_record_db.dict()) == BaseDNSRecord(
            **dns_record_cf.dict()):
        # already matches exactly, skip
        logger.debug(f'Name: "{dns_record_db.name}" is up to date')
    elif BaseDNSRecord(**dns_record_db.dict()) != BaseDNSRecord(
            **dns_record_cf.dict()):
        # name already exists but record doesn't match, update
        logger.info(f'Update: {dns_record_db}')
        dns_record_cf_upload = BaseDNSRecord(**dns_record_db.dict())
        response_futures.append(
            client.put(
                f'zones/{dns_record_cf_upload.zone_id}/dns_records/{dns_record_cf.id}',
                json=dns_record_cf_upload.dict(),
                auth=DomainAuth(dns_record_db.domain),
            ))

    for response_future in asyncio.as_completed(response_futures):
        try:
            response = await response_future
            response.raise_for_status()
        except httpx.RequestError as exc:
            logger.info(
                f'An error occurred while requesting {exc.request.method!r}'
                f' {exc.request.url!r}.')
        except httpx.HTTPStatusError as exc:
            logger.warning(
                f'Error response {exc.response.status_code}: {exc.response.read()},'
                f' while doing {exc.request.method!r} {exc.request.url!r} with:'
                f' {exc.request.read()!r}')