Пример #1
0
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)
Пример #2
0
    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)
Пример #4
0
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
Пример #5
0
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(),
    )
Пример #6
0
 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()
Пример #7
0
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()
Пример #10
0
def test_binary_converter_v01():
    m = marshaller.NewHTTPMarshaller(
        [binary.NewBinaryHTTPCloudEventConverter()])

    pytest.raises(
        exceptions.UnsupportedEventConverter,
        m.FromRequest,
        v01.Event,
        {},
        None,
        lambda x: x,
    )
Пример #11
0
def test_unsupported_converter_v01():
    m = marshaller.NewHTTPMarshaller(
        [structured.NewJSONHTTPCloudEventConverter()])

    pytest.raises(
        exceptions.UnsupportedEventConverter,
        m.FromRequest,
        v01.Event,
        {},
        None,
        lambda x: x,
    )
Пример #12
0
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)
Пример #13
0
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
Пример #14
0
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()
Пример #15
0
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"]
Пример #18
0
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()
Пример #19
0
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()
Пример #20
0
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):