diff --git a/doc/source/configuration.rst b/doc/source/configuration.rst index 9e63c972c..f48f25a34 100644 --- a/doc/source/configuration.rst +++ b/doc/source/configuration.rst @@ -19,6 +19,19 @@ and ``providers`` sections:: The following sections are available. All are required unless otherwise indicated. +.. _webapp-conf: + +webapp +------ + +Define the webapp endpoint port and listen address. + +Example:: + + webapp: + port: 8005 + listen_address: '0.0.0.0' + .. _elements-dir: elements-dir diff --git a/nodepool/cmd/config_validator.py b/nodepool/cmd/config_validator.py index 374aafbeb..88e62a3d1 100644 --- a/nodepool/cmd/config_validator.py +++ b/nodepool/cmd/config_validator.py @@ -103,7 +103,13 @@ class ConfigValidator: 'env-vars': {str: str}, } + webapp = { + 'port': int, + 'listen_address': str, + } + top_level = { + 'webapp': webapp, 'elements-dir': str, 'images-dir': str, 'zookeeper-servers': [{ diff --git a/nodepool/cmd/launcher.py b/nodepool/cmd/launcher.py old mode 100644 new mode 100755 index d37571162..d5594a458 --- a/nodepool/cmd/launcher.py +++ b/nodepool/cmd/launcher.py @@ -54,7 +54,9 @@ class NodePoolLauncherApp(nodepool.cmd.NodepoolDaemonApp): self.pool = nodepool.launcher.NodePool(self.args.secure, self.args.config) if not self.args.no_webapp: - self.webapp = nodepool.webapp.WebApp(self.pool) + config = self.pool.loadConfig() + self.webapp = nodepool.webapp.WebApp(self.pool, + **config.webapp) signal.signal(signal.SIGINT, self.exit_handler) # For back compatibility: diff --git a/nodepool/config.py b/nodepool/config.py old mode 100644 new mode 100755 index 26b91d175..8f20e79bf --- a/nodepool/config.py +++ b/nodepool/config.py @@ -150,6 +150,11 @@ def loadConfig(config_path): newconfig = Config() newconfig.db = None + newconfig.webapp = { + 'port': config.get('webapp', {}).get('port', 8005), + 'listen_address': config.get('webapp', {}).get('listen_address', + '0.0.0.0') + } newconfig.providers = {} newconfig.labels = {} newconfig.elementsdir = config.get('elements-dir') diff --git a/nodepool/tests/fixtures/config_validate/good.yaml b/nodepool/tests/fixtures/config_validate/good.yaml index 210fcfbe7..8bf464b3d 100644 --- a/nodepool/tests/fixtures/config_validate/good.yaml +++ b/nodepool/tests/fixtures/config_validate/good.yaml @@ -1,6 +1,10 @@ elements-dir: /etc/nodepool/elements images-dir: /opt/nodepool_dib +webapp: + port: 8005 + listen_address: '0.0.0.0' + zookeeper-servers: - host: zk1.openstack.org port: 2181 diff --git a/nodepool/tests/fixtures/webapp.yaml b/nodepool/tests/fixtures/webapp.yaml new file mode 100644 index 000000000..2ec54df14 --- /dev/null +++ b/nodepool/tests/fixtures/webapp.yaml @@ -0,0 +1,3 @@ +webapp: + port: 8080 + listen_address: '127.0.0.1' diff --git a/nodepool/tests/test_webapp.py b/nodepool/tests/test_webapp.py index 5fd7ecd0e..9af193218 100644 --- a/nodepool/tests/test_webapp.py +++ b/nodepool/tests/test_webapp.py @@ -15,6 +15,7 @@ import json import logging +import yaml from six.moves.urllib import request from nodepool import tests @@ -67,3 +68,9 @@ class TestWebApp(tests.DBTestCase): self.assertDictContainsSubset({'id': 'fake-image-0000000001', 'formats': ['qcow2'], 'state': 'ready'}, objs[0]) + + def test_webapp_config(self): + configfile = self.setup_config('webapp.yaml') + config = yaml.safe_load(open(configfile)) + self.assertEqual(config['webapp']['port'], 8080) + self.assertEqual(config['webapp']['listen_address'], '127.0.0.1') diff --git a/nodepool/webapp.py b/nodepool/webapp.py index c176dbeb3..c9f2580b3 100644 --- a/nodepool/webapp.py +++ b/nodepool/webapp.py @@ -54,14 +54,17 @@ class Cache(object): class WebApp(threading.Thread): log = logging.getLogger("nodepool.WebApp") - def __init__(self, nodepool, port=8005, cache_expiry=1): + def __init__(self, nodepool, port=8005, listen_address='0.0.0.0', + cache_expiry=1): threading.Thread.__init__(self) self.nodepool = nodepool self.port = port + self.listen_address = listen_address self.cache = Cache(cache_expiry) self.cache_expiry = cache_expiry self.daemon = True - self.server = httpserver.serve(dec.wsgify(self.app), host='0.0.0.0', + self.server = httpserver.serve(dec.wsgify(self.app), + host=self.listen_address, port=self.port, start_loop=False) def run(self):