Esempio n. 1
0
    def delete_document_revision(self,
                                 document_id,
                                 revision_id,
                                 logger=DEFAULT_LOGGER):
        """
        Delete the Cloudant document revision
        """

        logger.info("Deleting Cloudant document: %s. Revision: %s...",
                    document_id, revision_id)

        if self._database is None:
            message = "Failed to delete Cloudant document: {0}. Revision: {1}. " \
                "Database connection is closed: {2}.".format(document_id, revision_id, self._database_name)
            logger.error(message)
            return False

        start_time = datetime.datetime.now()

        document_url = self._get_document_url(document_id)

        if not document_url:
            message = "Failed to delete Cloudant document: {0}. Revision: {1}. " \
                "Document URL is undefined: {2}.".format(document_id, revision_id, self._database_name)
            logger.error(message)
            return False

        params = {"rev": revision_id}

        session = self._database.r_session
        response = session.delete(document_url, params=params)

        if logger_util.is_enabled_for_trace(logger):
            serialized_response = pformat(vars(response))
            logger_util.log_trace(logger, serialized_response)

        try:
            response.raise_for_status()
        except HTTPError as err:
            logger.error(
                "Failed to delete Cloudant document: %s. Revision: %s.",
                document_id, revision_id)
            error_util.log_http_error(logger, err)
            return False

        end_time = datetime.datetime.now()
        elapsed_time = (end_time - start_time).total_seconds() * 1000  # ms

        logger.info(
            "Successfully deleted Cloudant document: %s. Revision: %s (%d ms).",
            document_id, revision_id, elapsed_time)

        return True
Esempio n. 2
0
    def _process_row(self, index, row, logger=DEFAULT_LOGGER):
        """
        TODO
        """

        # e.g.
        # {
        #    "id":"*****@*****.**",
        #    "key":"*****@*****.**",
        #    "value":[
        #       "263-b01372f0f37ec98867bce7a2a015402a",
        #       "164-aa6ffd5138393226f3bd65da320fa75a"
        #    ]
        # }

        if logger_util.is_enabled_for_trace(logger):
            logger_util.log_trace(logger, str(row))

        # Print row

        display_row = self._get_display_row(index, row)
        logger.info(display_row)

        # Track total number of conflicted documents

        self._total_conflicted_documents += 1

        # Track number of conflicted document revisions

        field_conflicts = len(row[constants.PROPERTY_VALUE])

        # Track total number of conflicted document revisions

        self._total_conflicted_revisions += field_conflicts

        # Delete conflicted document revisions

        deleted_revisions = self._delete_conflicted_revisions(index, row)

        # Generate CSV fields

        fields = {}
        fields[constants.CSV_FIELD_ID] = row[constants.PROPERTY_ID]
        fields[constants.CSV_FIELD_NAME] = row[constants.PROPERTY_KEY]
        fields[constants.CSV_FIELD_CONFLICTS] = field_conflicts
        fields[constants.CSV_FIELD_DELETED] = len(deleted_revisions)
        fields[constants.CSV_FIELD_REVISIONS] = deleted_revisions

        # Serialize document to CSV file record

        self._serialize_csv_fields(fields)
    def _process_row(self, index, row, logger=DEFAULT_LOGGER):
        """
        TODO
        """

        # e.g.
        # {
        #    "id":"*****@*****.**",
        #    "key":"*****@*****.**",
        #    "value":[
        #       "263-b01372f0f37ec98867bce7a2a015402a",
        #       "164-aa6ffd5138393226f3bd65da320fa75a"
        #    ]
        # }

        if logger_util.is_enabled_for_trace(logger):
            logger_util.log_trace(logger, str(row))

        # Validate row
        # TODO: REVISIT: Should we abort the entire scan when an exception is encountered ?

        error = self._validate_row(row=row,
                                   index=self._total_conflicted_documents)

        if error:
            logger.error(error)
            return

        # Normalize row

        normalized_row = self._get_normalized_row(row)

        # Print row

        display_row = self._get_display_row(index=index, row=normalized_row)

        logger.info(display_row)

        # Track total number of conflicted documents

        self._total_conflicted_documents += 1

        # Store conflicted document in memory

        self._store_conflicted_document(normalized_row)

        # Serialize document to CSV file record

        self._serialize_row(normalized_row)
Esempio n. 4
0
    def get_document(self, document_id, logger=DEFAULT_LOGGER):
        """
        Retrieve the Cloudant document by ID (latest revision)
        """

        logger.debug("Retrieving Cloudant document: %s...", document_id)

        if self._database is None:
            message = "Failed to retrieve Cloudant document: {0}. " \
                "Database connection is closed: {1}.".format(document_id, self._database_name)
            logger.error(message)
            return None

        start_time = datetime.datetime.now()

        try:
            document = self._database[document_id]
        except KeyError as err:
            message = "Failed to retrieve Cloudant document: {0}.".format(
                document_id)
            logger.error(message)
            error_util.log_exception(logger, err)
            return None
        except HTTPError as err:
            message = "Failed to retrieve Cloudant document: {0}.".format(
                document_id)
            logger.error(message)
            error_util.log_http_error(logger, err)
            return None

        if not document:
            message = "Failed to retrieve Cloudant document: {0}. " \
                "The document is undefined.".format(document_id)
            logger.error(message)
            return None

        end_time = datetime.datetime.now()
        elapsed_time = (end_time - start_time).total_seconds() * 1000  # ms

        logger.debug("Successfully retrieved Cloudant document: %s (%d ms).",
                     document_id, elapsed_time)

        if logger_util.is_enabled_for_trace(logger):
            formatted_document = json.dumps(
                document, indent=constants.JSON_FORMAT_INDENT)
            logger_util.log_trace(logger, formatted_document)

        return document
Esempio n. 5
0
def validate_version(logger=DEFAULT_LOGGER): # pylint: disable=unused-variable
    """
    Validates whether the minimum Python interpreter version is satisfied
    """

    if sys.version_info < MIN_VERSION_PYTHON:
        logger.error("Python version %s.%s or later is required.", MIN_VERSION_PYTHON[0], MIN_VERSION_PYTHON[1])
        return False

    logger_util.log_trace(
        logger,
        "Detected Python version: %s.%s.%s",
        sys.version_info.major,
        sys.version_info.minor,
        sys.version_info.micro)

    return True
Esempio n. 6
0
    def get_design_document(self, ddoc_name, logger=DEFAULT_LOGGER):
        """
        Retrieve the Cloudant design document
        """

        ddoc = None

        logger.info("Retrieving Cloudant design document: %s...", ddoc_name)

        if self._database is None:
            message = "Failed to retrieve Cloudant design document: {0}. " \
                "Database connection is closed: {1}.".format(ddoc_name, self._database_name)
            logger.error(message)
            return None

        try:
            ddoc = self._database.get_design_document(ddoc_name)
        except HTTPError as err:
            logger.error("Failed to retrieve Cloudant design document: %s.",
                         ddoc_name)
            error_util.log_http_error(logger, err)
            return None

        if ddoc and (ddoc_name in ddoc.views):
            logger.info("Successfully retrieved Cloudant design document: %s.",
                        ddoc_name)

            if logger_util.is_enabled_for_trace(logger):
                logger_util.log_trace(logger, "Design Document:")
                formatted_ddoc = json.dumps(
                    ddoc, indent=constants.JSON_FORMAT_INDENT)
                logger_util.log_trace(logger, formatted_ddoc)

            return ddoc

        logger.error("Failed to retrieve Cloudant design document: %s.",
                     ddoc_name)

        return None