You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@sdap.apache.org by fg...@apache.org on 2019/01/23 17:56:49 UTC
[incubator-sdap-ningesterpy] 26/29: Made the host and port options
configurable and enabled an option for choosing a random available port and
writing that port number to a file. Also upgraded to latest version of
Flask (#9)
This is an automated email from the ASF dual-hosted git repository.
fgreg pushed a commit to branch v1.0.0-rc1
in repository https://gitbox.apache.org/repos/asf/incubator-sdap-ningesterpy.git
commit df99ec8989caf991589b509e6598ec1d19e38500
Author: fgreg <fg...@gmail.com>
AuthorDate: Wed Aug 29 09:33:31 2018 -0700
Made the host and port options configurable and enabled an option for choosing a random available port and writing that port number to a file. Also upgraded to latest version of Flask (#9)
---
.gitignore | 1 +
.idea/ningesterpy.iml | 2 +-
requirements.txt | 6 +++---
sdap/default_settings.py | 18 ++++++++++++++++++
sdap/ningesterpy.py | 38 ++++++++++++++++++++++++++++++++++----
tests/test_settings.py | 19 +++++++++++++++++++
6 files changed, 76 insertions(+), 8 deletions(-)
diff --git a/.gitignore b/.gitignore
index cc74a02..6942e83 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,3 +1,4 @@
+current_port
### Python template
# Byte-compiled / optimized / DLL files
diff --git a/.idea/ningesterpy.iml b/.idea/ningesterpy.iml
index dcf2bcc..1f079f2 100644
--- a/.idea/ningesterpy.iml
+++ b/.idea/ningesterpy.iml
@@ -4,7 +4,7 @@
<content url="file://$MODULE_DIR$">
<sourceFolder url="file://$MODULE_DIR$" isTestSource="false" />
</content>
- <orderEntry type="inheritedJdk" />
+ <orderEntry type="jdk" jdkName="Python 3.5.4 (~/anaconda/envs/ningesterpy/bin/python)" jdkType="Python SDK" />
<orderEntry type="sourceFolder" forTests="false" />
</component>
<component name="PyDocumentationSettings">
diff --git a/requirements.txt b/requirements.txt
index 69e023e..0db4856 100644
--- a/requirements.txt
+++ b/requirements.txt
@@ -1,6 +1,6 @@
-werkzeug==0.12.2
-flask==0.12.2
-flask-accept==0.0.4
+werkzeug==0.14.1
+flask==1.0.2
+flask-accept==0.0.6
nexusproto===1.0.0-SNAPSHOT
numpy==1.12.1
protobuf==3.2.0
diff --git a/sdap/default_settings.py b/sdap/default_settings.py
new file mode 100644
index 0000000..be6bc06
--- /dev/null
+++ b/sdap/default_settings.py
@@ -0,0 +1,18 @@
+# Licensed to the Apache Software Foundation (ASF) under one or more
+# contributor license agreements. See the NOTICE file distributed with
+# this work for additional information regarding copyright ownership.
+# The ASF licenses this file to You under the Apache License, Version 2.0
+# (the "License"); you may not use this file except in compliance with
+# the License. You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+SERVER_NAME = '127.0.0.1:5000'
+PORT_FILE = 'current_port'
+CREATE_PORT_FILE = False
diff --git a/sdap/ningesterpy.py b/sdap/ningesterpy.py
index e036952..21ea1bb 100644
--- a/sdap/ningesterpy.py
+++ b/sdap/ningesterpy.py
@@ -13,6 +13,7 @@
# See the License for the specific language governing permissions and
# limitations under the License.
import logging
+import pprint
import sys
import uuid
@@ -101,11 +102,40 @@ def handle_error(e):
if __name__ == '__main__':
- host = '127.0.0.1'
- port = 5000
- applog.info("Running app on %s:%d" % (host, port))
+
app.register_error_handler(Exception, handle_error)
for ex in default_exceptions:
app.register_error_handler(ex, handle_error)
app.json_encoder = ProtobufJSONEncoder
- app.run(host=host, port=port)
+ app.config.from_object('sdap.default_settings')
+ try:
+ app.config.from_envvar('NINGESTERPY_SETTINGS')
+ except RuntimeError:
+ applog.warning("NINGESTERPY_SETTINGS environment variable not set or invalid. Using default settings.")
+
+ # SERVER_NAME should be in the form of localhost:5000, 127.0.0.1:0, etc...
+ # So, split on : and take the second element as the port
+ # If the port is 0, we need to pick a random port and then tell the server to use that socket
+ if app.config['SERVER_NAME'] and int(app.config['SERVER_NAME'].split(':')[1]) == 0:
+ import socket, os
+
+ # Chose a random available port by binding to port 0
+ sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
+ sock.bind((app.config['SERVER_NAME'].split(':')[0], 0))
+ sock.listen()
+
+ # Tells the underlying WERKZEUG server to use the socket we just created
+ os.environ['WERKZEUG_SERVER_FD'] = str(sock.fileno())
+
+ # Update the configuration so it matches with the port we just chose
+ # (sock.getsockname will return the actual port being used, not 0)
+ app.config['SERVER_NAME'] = '%s:%d' % (sock.getsockname())
+
+ # Optionally write the current port to a file on the filesystem
+ if app.config['CREATE_PORT_FILE']:
+ with open(app.config['PORT_FILE'], 'w') as port_file:
+ port_file.write(app.config['SERVER_NAME'].split(':')[1])
+
+ applog.info("Running app on %s" % (app.config['SERVER_NAME']))
+ applog.info("Active Settings:%s" % pprint.pformat(app.config, compact=True))
+ app.run()
diff --git a/tests/test_settings.py b/tests/test_settings.py
new file mode 100644
index 0000000..1c28c6a
--- /dev/null
+++ b/tests/test_settings.py
@@ -0,0 +1,19 @@
+# Licensed to the Apache Software Foundation (ASF) under one or more
+# contributor license agreements. See the NOTICE file distributed with
+# this work for additional information regarding copyright ownership.
+# The ASF licenses this file to You under the Apache License, Version 2.0
+# (the "License"); you may not use this file except in compliance with
+# the License. You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+SERVER_NAME = '127.0.0.1:0'
+ENV = 'development'
+PORT_FILE = 'current_port'
+CREATE_PORT_FILE = True