Merge pull request #310 from mterzo/docker_env
Default settings use environment variables
This commit is contained in:
13
Dockerfile
13
Dockerfile
@@ -1,3 +1,12 @@
|
|||||||
FROM grahamdumpleton/mod-wsgi-docker:python-2.7-onbuild
|
FROM python:2.7-alpine
|
||||||
CMD [ "wsgi.py" ]
|
|
||||||
|
|
||||||
|
ENV PUPPETBOARD_PORT 80
|
||||||
|
ENV PUPPETBOARD_SETTINGS docker_settings.py
|
||||||
|
RUN mkdir -p /usr/src/app
|
||||||
|
WORKDIR /usr/src/app
|
||||||
|
|
||||||
|
COPY requirements-docker.txt /usr/src/app/
|
||||||
|
RUN pip install --no-cache-dir -r requirements-docker.txt
|
||||||
|
COPY . /usr/src/app
|
||||||
|
|
||||||
|
CMD gunicorn -b 0.0.0.0:${PUPPETBOARD_PORT} --access-logfile=/dev/stdout puppetboard.app:app
|
||||||
|
|||||||
14
README.rst
14
README.rst
@@ -129,6 +129,20 @@ image is planned for the 0.2.x series.
|
|||||||
|
|
||||||
.. _Dockerfile: https://github.com/voxpupuli/puppetboard/blob/master/Dockerfile
|
.. _Dockerfile: https://github.com/voxpupuli/puppetboard/blob/master/Dockerfile
|
||||||
|
|
||||||
|
Usage:
|
||||||
|
.. code-block:: bash
|
||||||
|
$ docker build -t puppetboard .
|
||||||
|
$ docker run -it -p 9080:80 -v /etc/puppetlabs/puppet/ssl:/etc/puppetlabs/puppet/ssl \
|
||||||
|
-e PUPPETDB_HOST=<hostname> \
|
||||||
|
-e PUPPETDB_PORT=8081 \
|
||||||
|
-e PUPPETDB_SSL_VERIFY=/etc/puppetlabs/puppetdb/ssl/ca.pem \
|
||||||
|
-e PUPPETDB_KEY=/etc/puppetlabs/puppetdb/ssl/private.pem \
|
||||||
|
-e PUPPETDB_CERT=/etc/puppetlabs/puppetdb/ssl/public.pem \
|
||||||
|
-e INVENTORY_FACTS='Hostname,fqdn, IP Address,ipaddress' \
|
||||||
|
-e ENABLE_CATALOG=true \
|
||||||
|
-e GRAPH_FACTS='architecture,puppetversion,osfamily' \
|
||||||
|
puppetboard
|
||||||
|
|
||||||
Development
|
Development
|
||||||
-----------
|
-----------
|
||||||
|
|
||||||
|
|||||||
68
puppetboard/docker_settings.py
Normal file
68
puppetboard/docker_settings.py
Normal file
@@ -0,0 +1,68 @@
|
|||||||
|
import os
|
||||||
|
|
||||||
|
PUPPETDB_HOST = os.getenv('PUPPETDB_HOST', 'localhost')
|
||||||
|
PUPPETDB_PORT = int(os.getenv('PUPPETDB_PORT', '8080'))
|
||||||
|
# Since this is an env it will alwas be a string, we need
|
||||||
|
# to conver that string to a bool
|
||||||
|
SSL_VERIFY = os.getenv('PUPPETDB_SSL_VERIFY', 'True')
|
||||||
|
if SSL_VERIFY.upper() == 'TRUE':
|
||||||
|
PUPPETDB_SSL_VERIFY = True
|
||||||
|
elif SSL_VERIFY.upper() == 'FALSE':
|
||||||
|
PUPPETDB_SSL_VERIFY = False
|
||||||
|
else:
|
||||||
|
PUPPETDB_SSL_VERIFY = SSL_VERIFY
|
||||||
|
|
||||||
|
PUPPETDB_KEY = os.getenv('PUPPETDB_KEY', None)
|
||||||
|
PUPPETDB_CERT = os.getenv('PUPPETDB_CERT', None)
|
||||||
|
PUPPETDB_TIMEOUT = int(os.getenv('PUPPETDB_TIMEOUT', '20'))
|
||||||
|
DEFAULT_ENVIRONMENT = os.getenv('DEFAULT_ENVIRONMENT', 'production')
|
||||||
|
SECRET_KEY = os.getenv('SECRET_KEY', os.urandom(24))
|
||||||
|
DEV_LISTEN_HOST = os.getenv('DEV_LISTEN_HOST', '127.0.0.1')
|
||||||
|
DEV_LISTEN_PORT = int(os.getenv('DEV_LISTEN_PORT', '5000'))
|
||||||
|
DEV_COFFEE_LOCATION = os.getenv('DEV_COFFEE_LOCATION', 'coffee')
|
||||||
|
UNRESPONSIVE_HOURS = int(os.getenv('UNRESPONSIVE_HOURS', '2'))
|
||||||
|
ENABLE_QUERY = os.getenv('ENABLE_QUERY', 'True')
|
||||||
|
|
||||||
|
LOCALISE_TIMESTAMP = bool(os.getenv('LOCALISE_TIMESTAMP',
|
||||||
|
'True').upper() == 'TRUE')
|
||||||
|
LOGLEVEL = os.getenv('LOGLEVEL', 'info')
|
||||||
|
REPORTS_COUNT = int(os.getenv('REPORTS_COUNT', '10'))
|
||||||
|
OFFLINE_MODE = bool(os.getenv('OFFLINE_MODE', 'False').upper() == 'TRUE')
|
||||||
|
ENABLE_CATALOG = bool(os.getenv('ENABLE_CATALOG', 'False').upper() == 'TRUE')
|
||||||
|
OVERVIEW_FILTER = os.getenv('OVERVIEW_FILTER', None)
|
||||||
|
|
||||||
|
GRAPH_FACTS_DEFAULT = ','.join(['architecture', 'clientversion', 'domain',
|
||||||
|
'lsbcodename', 'lsbdistcodename', 'lsbdistid',
|
||||||
|
'lsbdistrelease', 'lsbmajdistrelease',
|
||||||
|
'netmask', 'osfamily', 'puppetversion',
|
||||||
|
'processorcount'])
|
||||||
|
|
||||||
|
GRAPH_FACTS = [x.strip() for x in os.getenv('GRAPH_FACTS',
|
||||||
|
GRAPH_FACTS_DEFAULT).split(',')]
|
||||||
|
|
||||||
|
|
||||||
|
# Tuples are hard to express as an environment variable, so here
|
||||||
|
# the tupple can be listed as a list of items
|
||||||
|
# export INVENTORY_FACTS="Hostname, fqdn, IP Address, ipaddress,.. etc"
|
||||||
|
# Define default array of of strings, this code is a bit neater than having
|
||||||
|
# a large string
|
||||||
|
INVENTORY_FACTS_DEFAULT = ','.join(['Hostname', 'fqdn',
|
||||||
|
'IP Address', 'ipaddress',
|
||||||
|
'OS', 'lsbdistdescription',
|
||||||
|
'Architecture', 'hardwaremodel',
|
||||||
|
'Kernel Version', 'kernelrelease',
|
||||||
|
'Puppet Version', 'puppetversion'])
|
||||||
|
|
||||||
|
# take either input as a list Key, Value, Key, Value, and conver it to an
|
||||||
|
# array: ['Key', 'Value']
|
||||||
|
INV_STR = os.getenv('INVENTORY_FACTS', INVENTORY_FACTS_DEFAULT).split(',')
|
||||||
|
|
||||||
|
# Take the Array and convert it to a tuple
|
||||||
|
INVENTORY_FACTS = [(INV_STR[i].strip(),
|
||||||
|
INV_STR[i + 1].strip()) for i in range(0, len(INV_STR), 2)]
|
||||||
|
|
||||||
|
REFRESH_RATE = int(os.getenv('REFRESH_RATE', '30'))
|
||||||
|
|
||||||
|
DAILY_REPORTS_CHART_ENABLED = bool(os.getenv('DAILY_REPORTS_CHART_ENABLED',
|
||||||
|
'True').upper() == 'TRUE')
|
||||||
|
DAILY_REPORTS_CHART_DAYS = int(os.getenv('DAILY_REPORTS_CHART_DAYS', '8'))
|
||||||
10
requirements-docker.txt
Normal file
10
requirements-docker.txt
Normal file
@@ -0,0 +1,10 @@
|
|||||||
|
gunicorn==19.6.0
|
||||||
|
Flask==0.10.1
|
||||||
|
Flask-WTF==0.12
|
||||||
|
Jinja2==2.7.2
|
||||||
|
MarkupSafe==0.19
|
||||||
|
WTForms==2.1
|
||||||
|
Werkzeug==0.11.10
|
||||||
|
itsdangerous==0.23
|
||||||
|
pypuppetdb==0.3.1
|
||||||
|
requests==2.6.0
|
||||||
92
test/test_docker_settings.py
Normal file
92
test/test_docker_settings.py
Normal file
@@ -0,0 +1,92 @@
|
|||||||
|
import os
|
||||||
|
from puppetboard import docker_settings
|
||||||
|
import unittest
|
||||||
|
import tempfile
|
||||||
|
try:
|
||||||
|
import future.utils
|
||||||
|
except:
|
||||||
|
pass
|
||||||
|
|
||||||
|
try:
|
||||||
|
from imp import reload as reload
|
||||||
|
except:
|
||||||
|
pass
|
||||||
|
|
||||||
|
|
||||||
|
class DockerTestCase(unittest.TestCase):
|
||||||
|
def setUp(self):
|
||||||
|
for env_var in dir(docker_settings):
|
||||||
|
if (env_var.startswith('__') or env_var.startswith('_') or
|
||||||
|
env_var.islower()):
|
||||||
|
continue
|
||||||
|
|
||||||
|
if env_var in os.environ:
|
||||||
|
del os.environ[env_var]
|
||||||
|
reload(docker_settings)
|
||||||
|
|
||||||
|
def test_default_host_port(self):
|
||||||
|
self.assertEqual(docker_settings.PUPPETDB_HOST, 'localhost')
|
||||||
|
self.assertEqual(docker_settings.PUPPETDB_PORT, 8080)
|
||||||
|
|
||||||
|
def test_set_host_port(self):
|
||||||
|
os.environ['PUPPETDB_HOST'] = 'puppetdb'
|
||||||
|
os.environ['PUPPETDB_PORT'] = '9081'
|
||||||
|
reload(docker_settings)
|
||||||
|
self.assertEqual(docker_settings.PUPPETDB_HOST, 'puppetdb')
|
||||||
|
self.assertEqual(docker_settings.PUPPETDB_PORT, 9081)
|
||||||
|
|
||||||
|
def test_cert_true_test(self):
|
||||||
|
os.environ['PUPPETDB_SSL_VERIFY'] = 'True'
|
||||||
|
reload(docker_settings)
|
||||||
|
self.assertTrue(docker_settings.PUPPETDB_SSL_VERIFY)
|
||||||
|
os.environ['PUPPETDB_SSL_VERIFY'] = 'true'
|
||||||
|
reload(docker_settings)
|
||||||
|
self.assertTrue(docker_settings.PUPPETDB_SSL_VERIFY)
|
||||||
|
|
||||||
|
def test_cert_false_test(self):
|
||||||
|
os.environ['PUPPETDB_SSL_VERIFY'] = 'False'
|
||||||
|
reload(docker_settings)
|
||||||
|
self.assertFalse(docker_settings.PUPPETDB_SSL_VERIFY)
|
||||||
|
os.environ['PUPPETDB_SSL_VERIFY'] = 'false'
|
||||||
|
reload(docker_settings)
|
||||||
|
self.assertFalse(docker_settings.PUPPETDB_SSL_VERIFY)
|
||||||
|
|
||||||
|
def test_cert_path(self):
|
||||||
|
ca_file = '/usr/ssl/path/ca.pem'
|
||||||
|
os.environ['PUPPETDB_SSL_VERIFY'] = ca_file
|
||||||
|
reload(docker_settings)
|
||||||
|
self.assertEqual(docker_settings.PUPPETDB_SSL_VERIFY, ca_file)
|
||||||
|
|
||||||
|
def validate_facts(self, facts):
|
||||||
|
self.assertEqual(type(facts), type([]))
|
||||||
|
self.assertTrue(len(facts) > 0)
|
||||||
|
for map in facts:
|
||||||
|
self.assertEqual(type(map), type(()))
|
||||||
|
self.assertTrue(len(map) == 2)
|
||||||
|
|
||||||
|
def test_inventory_facts_default(self):
|
||||||
|
self.validate_facts(docker_settings.INVENTORY_FACTS)
|
||||||
|
|
||||||
|
def test_invtory_facts_custom(self):
|
||||||
|
os.environ['INVENTORY_FACTS'] = "A, B, C, D"
|
||||||
|
reload(docker_settings)
|
||||||
|
self.validate_facts(docker_settings.INVENTORY_FACTS)
|
||||||
|
|
||||||
|
def test_graph_facts_defautl(self):
|
||||||
|
facts = docker_settings.GRAPH_FACTS
|
||||||
|
self.assertEqual(type(facts), type([]))
|
||||||
|
self.assertTrue('puppetversion' in facts)
|
||||||
|
|
||||||
|
def test_graph_facts_custom(self):
|
||||||
|
os.environ['GRAPH_FACTS'] = "architecture, puppetversion, extra"
|
||||||
|
reload(docker_settings)
|
||||||
|
facts = docker_settings.GRAPH_FACTS
|
||||||
|
self.assertEqual(type(facts), type([]))
|
||||||
|
self.assertEqual(len(facts), 3)
|
||||||
|
self.assertTrue('puppetversion' in facts)
|
||||||
|
self.assertTrue('architecture' in facts)
|
||||||
|
self.assertTrue('extra' in facts)
|
||||||
|
|
||||||
|
|
||||||
|
if __name__ == '__main__':
|
||||||
|
unittest.main()
|
||||||
Reference in New Issue
Block a user