Skip to content

Commit 4fba45f

Browse files
cumason123grantleahecole
authored
added cloudevents to events-storage (#4537)
* added cloudevents to events-storage Signed-off-by: Curtis Mason <[email protected]> * modified README Signed-off-by: Curtis Mason <[email protected]> * nit lower case ce-subject fix Signed-off-by: Curtis Mason <[email protected]> Co-authored-by: Grant Timmerman <[email protected]> Co-authored-by: Leah E. Cole <[email protected]>
1 parent 73d4742 commit 4fba45f

File tree

5 files changed

+39
-24
lines changed

5 files changed

+39
-24
lines changed

run/events-storage/README.md

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
# Events for Cloud Run – GCS tutorial
22

3-
This sample shows how to create a service that processes GCS events.
3+
This sample shows how to create a service that processes GCS using [the CloudEvents SDK](https://github.com/cloudevents/sdk-python).
44

55
## Setup
66

@@ -57,13 +57,13 @@ gcloud alpha events triggers create $MY_GCS_TRIGGER \
5757

5858
## Test
5959

60-
Test your Cloud Run service by publishing a message to the topic:
60+
Test your Cloud Run service by publishing a message to the topic:
6161

6262
```sh
6363
gsutil defstorageclass set STANDARD gs://$MY_GCS_BUCKET
6464
```
6565

66-
Observe the Cloud Run service printing upon receiving an event in
66+
Observe the Cloud Run service printing upon receiving an event in
6767
Cloud Logging:
6868

6969
```sh

run/events-storage/main.py

Lines changed: 23 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,9 @@
1414
# [START run_events_gcs_handler]
1515
import os
1616

17+
import cloudevents.exceptions as cloud_exceptions
18+
from cloudevents.http import from_http
19+
1720
from flask import Flask, request
1821

1922

@@ -23,20 +26,29 @@
2326

2427
@app.route('/', methods=['POST'])
2528
def index():
26-
for field in required_fields:
27-
if field not in request.headers:
28-
errmsg = f'Bad Request: missing required header {field}'
29-
print(errmsg)
30-
return errmsg, 400
31-
32-
if 'Ce-Subject' not in request.headers:
33-
errmsg = 'Bad Request: expected header Ce-Subject'
29+
# Create CloudEvent from HTTP headers and body
30+
try:
31+
event = from_http(request.headers, request.get_data())
32+
33+
except cloud_exceptions.MissingRequiredFields as e:
34+
print(f"cloudevents.exceptions.MissingRequiredFields: {e}")
35+
return "Failed to find all required cloudevent fields. ", 400
36+
37+
except cloud_exceptions.InvalidStructuredJSON as e:
38+
print(f"cloudevents.exceptions.InvalidStructuredJSON: {e}")
39+
return "Could not deserialize the payload as JSON. ", 400
40+
41+
except cloud_exceptions.InvalidRequiredFields as e:
42+
print(f"cloudevents.exceptions.InvalidRequiredFields: {e}")
43+
return "Request contained invalid required cloudevent fields. ", 400
44+
45+
if 'subject' not in event:
46+
errmsg = 'Bad Request: expected header ce-subject'
3447
print(errmsg)
3548
return errmsg, 400
3649

37-
ce_subject = request.headers.get('Ce-Subject')
38-
print(f'GCS CloudEvent type: {ce_subject}')
39-
return (f'GCS CloudEvent type: {ce_subject}', 200)
50+
print(f"GCS CloudEvent type: {event['subject']}")
51+
return (f"GCS CloudEvent type: {event['subject']}", 200)
4052
# [END run_events_gcs_handler]
4153

4254

run/events-storage/main_test.py

Lines changed: 12 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -20,9 +20,12 @@
2020
import main
2121

2222

23-
required_fields = ['Ce-Id', 'Ce-Source', 'Ce-Type', 'Ce-Specversion']
24-
25-
header_data = {field: str(uuid4()) for field in required_fields}
23+
binary_headers = {
24+
"ce-id": str(uuid4),
25+
"ce-type": "com.pytest.sample.event",
26+
"ce-source": "<my-test-source>",
27+
"ce-specversion": "1.0"
28+
}
2629

2730

2831
@pytest.fixture
@@ -32,7 +35,7 @@ def client():
3235

3336

3437
def test_endpoint(client, capsys):
35-
test_headers = copy.copy(header_data)
38+
test_headers = copy.copy(binary_headers)
3639
test_headers['Ce-Subject'] = 'test-subject'
3740

3841
r = client.post('/', headers=test_headers)
@@ -43,20 +46,20 @@ def test_endpoint(client, capsys):
4346

4447

4548
def test_missing_subject(client, capsys):
46-
r = client.post('/', headers=header_data)
49+
r = client.post('/', headers=binary_headers)
4750
assert r.status_code == 400
4851

4952
out, _ = capsys.readouterr()
50-
assert 'Bad Request: expected header Ce-Subject' in out
53+
assert 'Bad Request: expected header ce-subject' in out
5154

5255

5356
def test_missing_required_fields(client, capsys):
54-
for field in required_fields:
55-
test_headers = copy.copy(header_data)
57+
for field in binary_headers:
58+
test_headers = copy.copy(binary_headers)
5659
test_headers.pop(field)
5760

5861
r = client.post('/', headers=test_headers)
5962
assert r.status_code == 400
6063

6164
out, _ = capsys.readouterr()
62-
assert f'Bad Request: missing required header {field}' in out
65+
assert 'MissingRequiredFields' in out
Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,2 +1 @@
11
pytest==6.0.1
2-

run/events-storage/requirements.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,2 +1,3 @@
11
Flask==1.1.2
22
gunicorn==20.0.4
3+
cloudevents==1.2.0

0 commit comments

Comments
 (0)