Example #1
0
    def history(self, q=None, sort=None, limit=None, marker=None):
        """Assembles the alarm history requested.

        :param q: Filter rules for the changes to be described.
        :param sort: A list of pairs of sort key and sort dir.
        :param limit: The maximum number of items to be return.
        :param marker: The pagination query marker.
        """

        # Ensure alarm exists
        self._enforce_rbac('alarm_history')

        q = q or []
        # allow history to be returned for deleted alarms, but scope changes
        # returned to those carried out on behalf of the auth'd tenant, to
        # avoid inappropriate cross-tenant visibility of alarm history
        auth_project = rbac.get_limited_to_project(pecan.request.headers,
                                                   pecan.request.enforcer)
        conn = pecan.request.storage
        kwargs = v2_utils.query_to_kwargs(
            q, conn.get_alarm_changes, ['on_behalf_of', 'alarm_id'])
        if sort or limit or marker:
            kwargs['pagination'] = v2_utils.get_pagination_options(
                sort, limit, marker, models.AlarmChange)
        return [AlarmChange.from_db_model(ac)
                for ac in conn.get_alarm_changes(self._id, auth_project,
                                                 **kwargs)]
Example #2
0
    def get_all(self, q=None, sort=None, limit=None, marker=None):
        """Return all alarms, based on the query provided.

        :param q: Filter rules for the alarms to be returned.
        :param sort: A list of pairs of sort key and sort dir.
        :param limit: The maximum number of items to be return.
        :param marker: The pagination query marker.
        """
        target = rbac.target_from_segregation_rule(pecan.request.headers,
                                                   pecan.request.enforcer)
        rbac.enforce('get_alarms', pecan.request.headers,
                     pecan.request.enforcer, target)

        q = q or []
        # Timestamp is not supported field for Simple Alarm queries
        kwargs = v2_utils.query_to_kwargs(q,
                                          pecan.request.storage.get_alarms,
                                          allow_timestamps=False)
        if sort or limit or marker:
            kwargs['pagination'] = v2_utils.get_pagination_options(
                sort, limit, marker, models.Alarm)
        return [
            Alarm.from_db_model(m)
            for m in pecan.request.storage.get_alarms(**kwargs)
        ]
Example #3
0
    def history(self, q=None, sort=None, limit=None, marker=None):
        """Assembles the alarm history requested.

        :param q: Filter rules for the changes to be described.
        :param sort: A list of pairs of sort key and sort dir.
        :param limit: The maximum number of items to be return.
        :param marker: The pagination query marker.
        """

        # Ensure alarm exists
        self._enforce_rbac('alarm_history')

        q = q or []
        # allow history to be returned for deleted alarms, but scope changes
        # returned to those carried out on behalf of the auth'd tenant, to
        # avoid inappropriate cross-tenant visibility of alarm history
        auth_project = rbac.get_limited_to_project(pecan.request.headers,
                                                   pecan.request.enforcer)
        conn = pecan.request.storage
        kwargs = v2_utils.query_to_kwargs(q, conn.get_alarm_changes,
                                          ['on_behalf_of', 'alarm_id'])
        if sort or limit or marker:
            kwargs['pagination'] = v2_utils.get_pagination_options(
                sort, limit, marker, models.AlarmChange)
        return [
            AlarmChange.from_db_model(ac)
            for ac in conn.get_alarm_changes(self._id, auth_project, **kwargs)
        ]
Example #4
0
    def get_all(self, q=None, sort=None, limit=None, marker=None):
        """Return all alarms, based on the query provided.

        :param q: Filter rules for the alarms to be returned.
        :param sort: A list of pairs of sort key and sort dir.
        :param limit: The maximum number of items to be return.
        :param marker: The pagination query marker.
        """
        target = rbac.target_from_segregation_rule(pecan.request.headers, pecan.request.enforcer)
        rbac.enforce("get_alarms", pecan.request.headers, pecan.request.enforcer, target)

        q = q or []
        # Timestamp is not supported field for Simple Alarm queries
        kwargs = v2_utils.query_to_kwargs(q, pecan.request.storage.get_alarms, allow_timestamps=False)
        if sort or limit or marker:
            kwargs["pagination"] = v2_utils.get_pagination_options(sort, limit, marker, models.Alarm)
        return [Alarm.from_db_model(m) for m in pecan.request.storage.get_alarms(**kwargs)]
Example #5
0
    def get_all(self, q=None, sort=None, limit=None, marker=None):
        """Return all alarms, based on the query provided.

        :param q: Filter rules for the alarms to be returned.
        :param sort: A list of pairs of sort key and sort dir.
        :param limit: The maximum number of items to be return.
        :param marker: The pagination query marker.
        """
        target = rbac.target_from_segregation_rule(pecan.request.headers,
                                                   pecan.request.enforcer)
        rbac.enforce('get_alarms', pecan.request.headers,
                     pecan.request.enforcer, target)

        q = q or []
        filters = {}

        # Check field
        keys = set([query.field for query in q])
        if not keys.issubset(ALARM_QUERY_FIELDS_ALLOWED):
            raise wsme.exc.InvalidInput(
                'field', keys,
                'only fields %s are allowed' % ALARM_QUERY_FIELDS_ALLOWED)
        # Check op
        ops = set([query.op for query in q])
        if any([op not in ALARM_QUERY_OPS_ALLOWED for op in ops]):
            raise wsme.exc.InvalidInput(
                'op', ops,
                'only operations %s are allowed' % ALARM_QUERY_OPS_ALLOWED)

        if 'all_projects' in keys:
            if v2_utils.get_query_value(q, 'all_projects', 'boolean'):
                rbac.enforce('get_alarms:all_projects', pecan.request.headers,
                             pecan.request.enforcer, target)
            keys.remove('all_projects')
        else:
            project_id = pecan.request.headers.get('X-Project-Id')
            is_admin = rbac.is_admin(pecan.request.headers)

            if not v2_utils.is_field_exist(q, 'project_id'):
                q.append(
                    base.Query(field='project_id', op='eq', value=project_id))
                keys.add('project_id')
            else:
                request_project = v2_utils.get_query_value(q, 'project_id')
                if not is_admin and request_project != project_id:
                    raise base.ProjectNotAuthorized(request_project)

        for query in q:
            if query.field in keys:
                filters[query.field] = {query.op: query.get_value(query.type)}

        if sort or limit or marker:
            filters['pagination'] = v2_utils.get_pagination_options(
                sort, limit, marker, models.Alarm)

        LOG.debug('Getting alarms from database, filters: %s', filters)

        return [
            Alarm.from_db_model_scrubbed(m)
            for m in pecan.request.storage.get_alarms(**filters)
        ]