def target(): # Deserialize the HTTP request into a CloudEvent try: logging.info('Deserializing CloudEvent in binary format') # Instantiate the Binary Format marshaller mb = marshaller.NewHTTPMarshaller( [binary.NewBinaryHTTPCloudEventConverter()]) ce = mb.FromRequest(v1.Event(), request.headers, request.stream.read(), lambda x: x) except: logging.warning( 'Deserializing application/cloudevents+json CloudEvent') # Instantiate the JSON Structured CloudEvent marshaller m = marshaller.NewHTTPMarshaller( [structured.NewJSONHTTPCloudEventConverter()]) ce = m.FromRequest() except: logging.warning('Could not deserialize CloudEvent') # Create a CloudEvent to send as response data = 'Data received was not understandable as a CloudEvent' event = ( v1.Event().SetContentType("text/plain").SetData(data).SetEventID( str(uuid.uuid4())).SetSource("from_your_own_target"). SetSubject("your_event_subject").SetEventTime( datetime.now( timezone.utc).astimezone().isoformat()).SetEventType( "io.triggermesh.target.byown")) return app.response_class(response=body, headers=headers, status=400) # Do your Transformation or Target work based on the eventype if ce.EventType() == "io.triggermesh.byown.create": logging.info("Create event type") elif ce.EventType() == "io.triggermesh.byown.delete": logging.info("Delete event type") else: logging.warning("Unknown event type %s" % ce.EventType()) # Create a CloudEvent to send as response data = 'this is some data' event = (v1.Event().SetContentType("text/plain").SetData(data).SetEventID( str(uuid.uuid4())).SetSource("from_your_own_target").SetSubject( "your_event_subject").SetEventTime( datetime.now( timezone.utc).astimezone().isoformat()).SetEventType( "io.triggermesh.target.byown")) # Prepare the Header and Body to send a request back as a CloudEvent m = marshaller.NewHTTPMarshaller( [structured.NewJSONHTTPCloudEventConverter()]) headers, body = m.ToRequest(event, converters.TypeStructured, lambda x: x) return app.response_class(response=body, headers=headers, status=200)
def do_POST(self): # Process an HTTP POST request and return a response with an HTTP 200 status. content_len = int(self.headers.get('Content-Length')) request_body = self.rfile.read(content_len) m = marshaller.NewHTTPMarshaller( [binary.NewBinaryHTTPCloudEventConverter()]) event = m.FromRequest(v1.Event(), self.headers, io.BytesIO(request_body), lambda x: json.load(x)) event_type = event.EventType() assert event_type in ALLOWED_EVENT_TYPES extensions = event.Extensions() extensions["djangoapp"] = FakeSourceModel._meta.app_label extensions["djangomodel"] = FakeSourceModel._meta.model_name event_data = event.Data() if event_type in ("django.orm.post.init", "django.orm.pre.save", "django.orm.post.save", "django.orm.pre.delete", "django.orm.post.delete", "django.orm.m2m.change"): assert "data" in event_data instance_data = event_data["data"] assert "id" in instance_data and "name" in instance_data and "enabled" in instance_data assert event_data["db_table"] == FakeSourceModel._meta.db_table check_expected_kwargs(event_type, event_data["signal_kwargs"]) self.send_response(requests.codes.ok) self.end_headers() return
def test_binary_converter_upstream(): m = marshaller.NewHTTPMarshaller( [binary.NewBinaryHTTPCloudEventConverter()]) event = m.FromRequest(v02.Event(), data.headers, None, lambda x: x) assert event is not None assert event.Get("type") == (data.ce_type, True) assert event.Get("id") == (data.ce_id, True)
def test_binary_converter_upstream(event_class): m = marshaller.NewHTTPMarshaller( [binary.NewBinaryHTTPCloudEventConverter()]) event = m.FromRequest(event_class(), data.headers[event_class], None, lambda x: x) assert event is not None assert event.EventType() == data.ce_type assert event.EventID() == data.ce_id assert event.ContentType() == data.contentType
def test_unsupported_event_configuration(): m = marshaller.NewHTTPMarshaller( [binary.NewBinaryHTTPCloudEventConverter()]) pytest.raises( exceptions.UnsupportedEventConverter, m.FromRequest, v01.Event(), {"Content-Type": "application/cloudevents+json"}, io.StringIO(json.dumps(data.json_ce[v02.Event])), lambda x: x.read(), )
def make_cloud_event(event_type: str, data: Dict[str, Any]) -> Any: tz = get_tz() event = (v03.Event().SetContentType("application/json").SetData( data).SetEventID(str( uuid.uuid4())).SetSource("chaosiq-cloud").SetEventTime( tz.localize( datetime.now()).isoformat()).SetEventType(event_type)) m = marshaller.NewHTTPMarshaller( [structured.NewJSONHTTPCloudEventConverter()]) h, b = m.ToRequest(event, converters.TypeStructured, lambda x: x) return h, b.getvalue()
def test_binary_event_v1(): event = (v1.Event().SetContentType("application/octet-stream").SetData( b"\x00\x01")) m = marshaller.NewHTTPMarshaller( [structured.NewJSONHTTPCloudEventConverter()]) _, body = m.ToRequest(event, converters.TypeStructured, lambda x: x) assert isinstance(body, bytes) content = json.loads(body) assert "data" not in content assert content["data_base64"] == "AAE=", f"Content is: {content}"
def send_cloudevent(sender, **kwargs): sink_url = os.environ.get(settings.CLOUDEVENTS_ENV["SINK_VAR"]) if sink_url is not None: event = get_cloudevent_from_signal(sender, **kwargs) m = marshaller.NewHTTPMarshaller( [binary.NewBinaryHTTPCloudEventConverter()]) headers, body = m.ToRequest(event, converters.TypeBinary, json.dumps) response = requests.post(sink_url, headers=headers, data=body) response.raise_for_status()
def default_handler(event): from django.conf import settings sink_url = os.environ.get(settings.CLOUDEVENTS_ENV["SINK_VAR"]) if sink_url is not None: m = marshaller.NewHTTPMarshaller([binary.NewBinaryHTTPCloudEventConverter()]) headers, body = m.ToRequest(event, converters.TypeBinary, json.dumps) response = requests.post(sink_url, headers=headers, data=body) response.raise_for_status()
def test_binary_converter_v01(): m = marshaller.NewHTTPMarshaller( [binary.NewBinaryHTTPCloudEventConverter()]) pytest.raises( exceptions.UnsupportedEventConverter, m.FromRequest, v01.Event, {}, None, lambda x: x, )
def test_unsupported_converter_v01(): m = marshaller.NewHTTPMarshaller( [structured.NewJSONHTTPCloudEventConverter()]) pytest.raises( exceptions.UnsupportedEventConverter, m.FromRequest, v01.Event, {}, None, lambda x: x, )
def test_structured_converter_v01(): m = marshaller.NewHTTPMarshaller( [structured.NewJSONHTTPCloudEventConverter()]) event = m.FromRequest( v01.Event(), {"Content-Type": "application/cloudevents+json"}, io.StringIO(json.dumps(data.json_ce[v02.Event])), lambda x: x.read(), ) assert event is not None assert event.Get("type") == (data.ce_type, True) assert event.Get("id") == (data.ce_id, True)
def test_structured_converter_upstream(event_class): m = marshaller.NewHTTPMarshaller( [structured.NewJSONHTTPCloudEventConverter()]) event = m.FromRequest( event_class(), {"Content-Type": "application/cloudevents+json"}, io.StringIO(json.dumps(data.json_ce[event_class])), lambda x: x.read(), ) assert event is not None assert event.EventType() == data.ce_type assert event.EventID() == data.ce_id assert event.ContentType() == data.contentType
def callback(message): print(message.data.decode()) print(sink_url) event = (v01.Event().SetContentType("application/json").SetData( message.data.decode()).SetEventID("my-id").SetSource( "from-galaxy-far-far-away").SetEventTime("tomorrow").SetEventType( "cloudevent.greet.you")) m = marshaller.NewHTTPMarshaller( [structured.NewJSONHTTPCloudEventConverter()]) headers, body = m.ToRequest(event, converters.TypeStructured, lambda x: x) requests.post(sink_url, data=body, headers=headers) message.ack()
def test_structured_event_to_request_v01(): copy_of_ce = copy.deepcopy(data.ce) m = marshaller.NewHTTPMarshaller( [structured.NewJSONHTTPCloudEventConverter()]) http_headers = {"content-type": "application/cloudevents+json"} event = m.FromRequest(v01.Event(), http_headers, io.StringIO(json.dumps(data.ce)), lambda x: x.read()) assert event is not None assert event.Get("type") == (data.ce_type, True) assert event.Get("id") == (data.ce_id, True) new_headers, _ = m.ToRequest(event, converters.TypeStructured, lambda x: x) for key in new_headers: if key == "content-type": assert new_headers[key] == http_headers[key] continue assert key in copy_of_ce
def dispatch(self, event_type, subject, payload): if isinstance(subject, str): subject = subject_factory(subject) _event_info = subject.event_info() _id = str(uuid.uuid4()) logging.debug("new event id: {}".format(_id)) event = v1.Event() event.SetContentType('application/json') event.SetEventID(_id) event.SetSource(self._source) event.SetSubject(str(subject)) event.SetEventTime( datetime.utcnow().replace(tzinfo=pytz.UTC).isoformat()) event.SetEventType(event_type) # set extended properties ext_props = subject.get_ext_props() property_name = payload.get(PayloadConst.PROPERTY_NAME, None) if property_name is not None: ext_props.update({"propertyname": property_name}) event.SetExtensions(ext_props) event.Set('Originid', str(_event_info.get("originid", _id))) event.SetData(payload) m = marshaller.NewHTTPMarshaller( [binary.NewBinaryHTTPCloudEventConverter()]) headers, body = m.ToRequest(event, converters.TypeBinary, lambda x: json.dumps(x, cls=_JSONEncoder)) # headers['Ce-Originid'] = str(_event_info.get("Originid", _id)) if callable(self._dispatch_url): dispatch_url = self._dispatch_url(subject, event_type) else: dispatch_url = self._dispatch_url response = requests.post(dispatch_url, headers=headers, data=body) response.raise_for_status() if self._test: return _id, response.status_code, headers return _id
def test_event_pipeline_v01(): event = (v01.Event().SetContentType(data.contentType).SetData( data.body).SetEventID(data.ce_id).SetSource(data.source).SetEventTime( data.eventTime).SetEventType(data.ce_type)) m = marshaller.NewHTTPMarshaller( [structured.NewJSONHTTPCloudEventConverter()]) _, body = m.ToRequest(event, converters.TypeStructured, lambda x: x) assert isinstance(body, io.BytesIO) new_headers = json.load(io.TextIOWrapper(body, encoding="utf-8")) assert new_headers is not None assert "cloudEventsVersion" in new_headers assert "eventType" in new_headers assert "source" in new_headers assert "eventID" in new_headers assert "eventTime" in new_headers assert "contentType" in new_headers assert data.body == new_headers["data"]
def customCallback(client, userdata, message): logger.info("Received a new message: ") logger.info(message.payload) logger.info("from topic: ") logger.info(message.topic) logger.info("--------------\n\n") print(message.data.decode()) print(sink_url) event = (v01.Event().SetContentType("application/json").SetData( message.payload).SetEventID("my-id").SetSource("AWS IoT").SetEventTime( datetime.datetime.now()).SetEventType("cloudevent.greet.you")) m = marshaller.NewHTTPMarshaller( [structured.NewJSONHTTPCloudEventConverter()]) headers, body = m.ToRequest(event, converters.TypeStructured, lambda x: x) requests.post(sink_url, data=body, headers=headers) message.ack()
def hello(cloudevent): m = marshaller.NewHTTPMarshaller([structured.NewJSONHTTPCloudEventConverter()]) headers, body = m.ToRequest(cloudevent, converters.TypeStructured, lambda x: x) text_file = open("function_output.json", "w") text_file.write(body.getvalue().decode("utf-8")) text_file.close()
from cloudevents.sdk.event import v1 from google.cloud import pubsub_v1 import requests subscriber = pubsub_v1.SubscriberClient() subscription_name = 'projects/{project_id}/subscriptions/{sub}'.format( project_id=os.getenv('GOOGLE_CLOUD_PROJECT'), sub=os.getenv('MY_SUBSCRIPTION_NAME'), ) K_SINK = os.getenv('K_SINK') m = marshaller.NewHTTPMarshaller([structured.NewJSONHTTPCloudEventConverter()]) def run_structured(event, url): structured_headers, structured_data = m.ToRequest( event, converters.TypeStructured, json.dumps) print("structured CloudEvent") print(structured_data.getvalue()) response = requests.post(url, headers=structured_headers, data=structured_data.getvalue()) response.raise_for_status() def callback(message):