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
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)
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)
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