From cd4e0f65da960b2567ca86eee661cbd1f50a30a1 Mon Sep 17 00:00:00 2001 From: Warren Van Winckel Date: Fri, 11 Aug 2017 09:31:06 -0700 Subject: [PATCH 1/4] Add passive Flask-based sensor that echo's input --- contrib/examples/sensors/echo_flask_app.py | 47 ++++++++++++++++++++ contrib/examples/sensors/echo_flask_app.yaml | 13 ++++++ 2 files changed, 60 insertions(+) create mode 100644 contrib/examples/sensors/echo_flask_app.py create mode 100644 contrib/examples/sensors/echo_flask_app.yaml diff --git a/contrib/examples/sensors/echo_flask_app.py b/contrib/examples/sensors/echo_flask_app.py new file mode 100644 index 0000000000..324b181522 --- /dev/null +++ b/contrib/examples/sensors/echo_flask_app.py @@ -0,0 +1,47 @@ +from flask import request, Flask, jsonify + +from st2reactor.sensor.base import Sensor + + +class EchoFlaskSensor(Sensor): + + def __init__(self, sensor_service, config): + super(EchoFlaskSensor, self).__init__( + sensor_service=sensor_service, + config=config + ) + + self._host = '127.0.0.1' + self._port = '5000' + self._path = '/echo' + + self._log = self._sensor_service.get_logger(__name__) + self._app = Flask(__name__) + + def setup(self): + pass + + def run(self): + @self._app.route(self._path, methods=['POST']) + def echo(): + self._sensor_service.dispatch(trigger="examples.echo_flask", + payload=jsonify( + request.get_json(force=True))) + self._log.info('Listening for payload on http://%s:%s%s' % + (self._host, self._port, self._path)) + self._app.run(host=self._host, port=self._port) + + def cleanup(self): + pass + + def add_trigger(self, trigger): + # This method is called when trigger is created + pass + + def update_trigger(self, trigger): + # This method is called when trigger is updated + pass + + def remove_trigger(self, trigger): + # This method is called when trigger is deleted + pass diff --git a/contrib/examples/sensors/echo_flask_app.yaml b/contrib/examples/sensors/echo_flask_app.yaml new file mode 100644 index 0000000000..e86734f658 --- /dev/null +++ b/contrib/examples/sensors/echo_flask_app.yaml @@ -0,0 +1,13 @@ +--- + class_name: "EchoFlaskSensor" + entry_point: "echo_flask_sensor.py" + description: "Simple echo flask app sensor that echo's its input." + trigger_types: + - + name: "echoflasksensor" + description: "Echo flask sensor." + payload_schema: + type: "object" + properties: + payload: + type: "object" From 708200eeb77daa4fa4568dc59b0a63f8dc3fd4c6 Mon Sep 17 00:00:00 2001 From: Warren Van Winckel Date: Mon, 14 Aug 2017 16:41:06 -0700 Subject: [PATCH 2/4] Verified that echo_flask_app works as expected --- contrib/examples/sensors/echo_flask_app.py | 8 +++++--- contrib/examples/sensors/echo_flask_app.yaml | 4 ++-- 2 files changed, 7 insertions(+), 5 deletions(-) diff --git a/contrib/examples/sensors/echo_flask_app.py b/contrib/examples/sensors/echo_flask_app.py index 324b181522..4506fb3bf1 100644 --- a/contrib/examples/sensors/echo_flask_app.py +++ b/contrib/examples/sensors/echo_flask_app.py @@ -1,4 +1,4 @@ -from flask import request, Flask, jsonify +from flask import request, Flask from st2reactor.sensor.base import Sensor @@ -24,9 +24,11 @@ def setup(self): def run(self): @self._app.route(self._path, methods=['POST']) def echo(): + payload = request.get_json(force=True) self._sensor_service.dispatch(trigger="examples.echo_flask", - payload=jsonify( - request.get_json(force=True))) + payload=payload) + return request.data + self._log.info('Listening for payload on http://%s:%s%s' % (self._host, self._port, self._path)) self._app.run(host=self._host, port=self._port) diff --git a/contrib/examples/sensors/echo_flask_app.yaml b/contrib/examples/sensors/echo_flask_app.yaml index e86734f658..e7c3231afd 100644 --- a/contrib/examples/sensors/echo_flask_app.yaml +++ b/contrib/examples/sensors/echo_flask_app.yaml @@ -1,7 +1,7 @@ --- class_name: "EchoFlaskSensor" - entry_point: "echo_flask_sensor.py" - description: "Simple echo flask app sensor that echo's its input." + entry_point: "echo_flask_app.py" + description: "Simple echo flask app sensor that echoes its input." trigger_types: - name: "echoflasksensor" From 2063de4b4bad6f4866c33d87c9cb29f635cc3109 Mon Sep 17 00:00:00 2001 From: Warren Van Winckel Date: Tue, 15 Aug 2017 13:21:35 -0700 Subject: [PATCH 3/4] Enabling threading in flask app If threading is not enabled, then it will block when there's more than one request. See similar: https://github.com/StackStorm-Exchange/stackstorm-activecampaign/pull/3 --- contrib/examples/sensors/echo_flask_app.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/contrib/examples/sensors/echo_flask_app.py b/contrib/examples/sensors/echo_flask_app.py index 4506fb3bf1..0e0b5ede95 100644 --- a/contrib/examples/sensors/echo_flask_app.py +++ b/contrib/examples/sensors/echo_flask_app.py @@ -31,7 +31,7 @@ def echo(): self._log.info('Listening for payload on http://%s:%s%s' % (self._host, self._port, self._path)) - self._app.run(host=self._host, port=self._port) + self._app.run(host=self._host, port=self._port, threaded=True) def cleanup(self): pass From b8b378a597da0dc553d0b4262a6882a6cde35001 Mon Sep 17 00:00:00 2001 From: Warren Van Winckel Date: Tue, 15 Aug 2017 15:10:39 -0700 Subject: [PATCH 4/4] Add entry in CHANGELOG --- CHANGELOG.rst | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.rst b/CHANGELOG.rst index 869598f0a4..5660f372ff 100644 --- a/CHANGELOG.rst +++ b/CHANGELOG.rst @@ -7,6 +7,7 @@ in development Added ~~~~~ +* Add sample passive sensor at `contrib/examples/sensors/echo_flask_app`. (improvement) #3667 * Add pack config into action context. This is made available under the ``config_context`` key. #3183 * Implement pause and resume for Mistral workflow. Pause and resume will cascade down to