Пример #1
0
    def _create_event_from_payload(self,
                                   target_project,
                                   res_spec,
                                   res_id,
                                   res_parent_id,
                                   request,
                                   response,
                                   subpayload,
                                   suffix=None):
        self._log.debug("create event from payload: %s",
                        self._clean_payload(subpayload, res_spec))
        ev = self._create_cadf_event(target_project, res_spec, res_id,
                                     res_parent_id, request, response, suffix)
        if not ev:
            return None

        ev.target = self._create_target_resource(target_project, res_spec,
                                                 res_id, res_parent_id,
                                                 subpayload)

        # extract custom attributes from the payload
        for attr, typeURI in six.iteritems(res_spec.custom_attributes):
            value = subpayload.get(attr)
            if value:
                if not isinstance(value, six.string_types):
                    value = json.dumps(value, separators=(',', ':'))
                attach_val = Attachment(typeURI=typeURI,
                                        content=value,
                                        name=attr)
                ev.add_attachment(attach_val)

        return ev
Пример #2
0
    def _create_target_resource(self,
                                target_project,
                                res_spec,
                                res_id,
                                res_parent_id=None,
                                payload=None,
                                key=None):
        """ builds a target resource from payload
        """
        project_id = target_project
        rid = res_id
        name = None

        # fetch IDs from payload if possible
        if payload:
            name = payload.get(res_spec.name_field)
            rid = rid or payload.get(res_spec.id_field)

            project_id = (target_project or payload.get('project_id')
                          or payload.get('tenant_id'))

        type_uri = res_spec.el_type_uri if rid else res_spec.type_uri
        rid = _make_uuid(rid or res_parent_id or taxonomy.UNKNOWN)
        target = OpenStackResource(project_id=project_id,
                                   id=rid,
                                   typeURI=type_uri,
                                   name=name)

        if key:
            target.add_attachment(
                Attachment(typeURI="xs:string", content=key, name='key'))

        return target
    def _attach_payload(event, payload, res_spec):
        """Attach request payload to event
        """

        incl = res_spec.payloads.get('include')
        excl = res_spec.payloads.get('exclude')
        res_payload = {}
        if excl and isinstance(payload, dict):
            res_payload = payload
            # remove possible wrapper elements
            for k in excl:
                if k in res_payload:
                    del res_payload[k]
        elif incl and isinstance(payload, dict):
            for k in incl:
                v = payload.get(k)
                if v:
                    res_payload[k] = v
        else:
            res_payload = payload

        attach_val = Attachment(typeURI="mime:application/json",
                                content=json.dumps(res_payload,
                                                   separators=(',', ':')),
                                name='payload')

        event.add_attachment(attach_val)
Пример #4
0
    def _attach_payload(event, payload, res_spec):
        """Attach request payload to event."""
        res_payload = OpenStackAuditMiddleware._clean_payload(
            payload, res_spec)

        attach_val = Attachment(typeURI="mime:application/json",
                                content=json.dumps(res_payload,
                                                   separators=(',', ':')),
                                name='payload')

        event.add_attachment(attach_val)
Пример #5
0
    def _create_target_resource(self,
                                target_project,
                                res_spec,
                                res_id,
                                res_parent_id=None,
                                payload=None,
                                key=None):
        """Build the event's target element from  the payload."""
        project_id = target_project
        rid = res_id
        name = None
        # fetch IDs from payload if possible
        if payload:
            if isinstance(payload, dict):
                name = payload.get(res_spec.name_field)
                # some custom ID fields are no UUIDs/strings but just integers
                if not rid:
                    custom_id = payload.get(res_spec.id_field)
                    rid = str(custom_id) if custom_id else None

                project_id = (target_project or payload.get('project_id')
                              or payload.get('tenant_id'))
            else:
                project_id = target_project
                self._log.warning(
                    "mapping error, malformed resource payload %s (no dict) "
                    "in bulk operation on resource: %s", payload, res_spec)

        type_uri = res_spec.el_type_uri if rid else res_spec.type_uri
        rid = _make_uuid(rid or res_parent_id or taxonomy.UNKNOWN)
        target = OpenStackResource(project_id=project_id,
                                   id=rid,
                                   typeURI=type_uri,
                                   name=name)

        # provide name of custom keys in attachment of target
        if key:
            target.add_attachment(
                Attachment(typeURI="xs:string", content=key, name='key'))

        return target