Exemplo n.º 1
0
    def __init__(self,
                 node_name=None,
                 task_id=None,
                 collected_date=None,
                 generator=None,
                 data_format=None,
                 data_element=None):
        """Initiator for BuildData."""
        if not all((node_name, task_id, generator, data_format, data_element)):
            raise ValueError("Required field missing.")

        try:
            if isinstance(data_element, bytes):
                data_element = data_element.decode('utf-8')
            elif not isinstance(data_element, str):
                data_element = str(data_element)
        except Exception:
            raise errors.BuildDataError(
                "Error saving build data - data_element type %s could"
                "not be cast to string." % str(type(data_element)))

        self.node_name = node_name
        self.task_id = task_id
        self.collected_date = collected_date or datetime.utcnow()
        self.generator = generator
        self.data_format = data_format
        self.data_element = data_element
Exemplo n.º 2
0
    def get_build_data(self,
                       node_name=None,
                       task_id=None,
                       latest=False,
                       verbosity=2):
        """Retrieve build data from the database.

        If ``node_name`` or ``task_id`` are defined, use them as
        filters for the build_data retrieved. If ``task_id`` is not
        defined, ``latest`` determines if all build data is returned,
        or only the chronologically latest version for each generator
        description.

        :param node_name: String name of the node to filter on
        :param task_id: uuid.UUID ID of the task to filter on
        :param latest: boolean whether to return only the latest
                       version for each generator
        :param verbosity: integer of how verbose the response should
                          be. 1 is summary, 2 includes the collected data
        :returns: list of objects.BuildData instances
        """
        # TODO(sh8121att) possibly optimize queries by changing select column
        # list based on verbosity
        try:
            with self.db_engine.connect() as conn:
                if node_name and task_id:
                    query = self.build_data_tbl.select().where(
                        self.build_data_tbl.c.node_name == node_name
                        and self.build_data_tbl.c.task_id
                        == task_id.bytes).order_by(
                            self.build_data_tbl.c.collected_date.desc())
                    rs = conn.execute(query)
                elif node_name:
                    if latest:
                        query = sql.text(
                            'SELECT DISTINCT ON (generator) build_data.* '
                            'FROM build_data '
                            'WHERE build_data.node_name = :nodename '
                            'ORDER BY generator, build_data.collected_date DESC'
                        )
                        rs = conn.execute(query, nodename=node_name)
                    else:
                        query = self.build_data_tbl.select().where(
                            self.build_data_tbl.c.node_name == node_name)
                        rs = conn.execute(query)
                elif task_id:
                    query = self.build_data_tbl.select().where(
                        self.build_data_tbl.c.task_id == task_id.bytes)
                    rs = conn.execute(query)
                else:
                    if latest:
                        query = sql.text(
                            'SELECT DISTINCT ON (generator), build_data.* '
                            'FROM build_data '
                            'ORDER BY generator, build_data.collected.date DESC'
                        )
                        rs = conn.execute(query)
                    else:
                        query = self.build_data_tbl.select()
                        rs = conn.execute(query)

                result_data = rs.fetchall()

            return [objects.BuildData.from_db(dict(r)) for r in result_data]
        except Exception as ex:
            self.logger.error("Error selecting build data.", exc_info=ex)
            raise errors.BuildDataError("Error selecting build data.")