(DIO-834) Adds infinitory-flask component

This commit is contained in:
suckatrash 2020-09-29 10:02:54 -07:00
parent fd1ad61fce
commit 79fc53cacc
No known key found for this signature in database
GPG key ID: 3857A763831B0756
4 changed files with 110 additions and 1 deletions

2
.gitignore vendored
View file

@ -6,3 +6,5 @@ __pycache__
/output /output
bin/ bin/
/cache /cache
/infinitory-flask/templates
/infinitory-flask/static

View file

@ -4,12 +4,26 @@ SRE Inventory Report
Generate a report on SRE inventory, including hosts, roles, and Generate a report on SRE inventory, including hosts, roles, and
services. services.
## Architecture
This app has two components:
`infinitory` - the data colection portion. Which can be run in cron or otherwise scheduled to collect data from Puppetdb using token authentication. Data can be stored locally as well as pushed to a GCS bucket.
`infinitory-flask` - the web frontend portion. This can be pointed to resources collected by the `infinitory` (cron) app and serves data from the GCS bucket
## Running in Docker ## Running in Docker
`infinitory`
``` ```
docker run -e GOOGLE_APPLICATION_CREDENTIALS=$GOOGLE_APPLICATION_CREDENTIALS -e BUCKET=<GCP_BUCKET_NAME> -e TOKEN=<PDB_ACCESS_TOKEN> -v /tmp:/output:rw --add-host <pdb-host>:<pdb-hostip> infinitory-app docker run -e GOOGLE_APPLICATION_CREDENTIALS=$GOOGLE_APPLICATION_CREDENTIALS -e BUCKET=<GCP_BUCKET_NAME> -e TOKEN=<PDB_ACCESS_TOKEN> -v /tmp:/output:rw --add-host <pdb-host>:<pdb-hostip> infinitory-app
``` ```
`infinitory-flask`
```
docker run -e GOOGLE_APPLICATION_CREDENTIALS=$GOOGLE_APPLICATION_CREDENTIALS -e BUCKET=<GCP_BUCKET_NAME> infinitory-flask
```
Using `GOOGLE_APPLICATION_CREDENTIALS` may require an extra volume mount in some cases: Using `GOOGLE_APPLICATION_CREDENTIALS` may require an extra volume mount in some cases:
``` ```
@ -26,6 +40,26 @@ export GOOGLE_APPLICATION_CREDENTIALS=/creds.json
Use python setup.py develop to install dependencies Use python setup.py develop to install dependencies
Run in Dev: Running `infinitory` in Dev:
```
bin/infinitory -h pdb.ops.puppetlabs.net -t <pdb-access-token> -o /tmp/output -b <gcs-bucket-name> bin/infinitory -h pdb.ops.puppetlabs.net -t <pdb-access-token> -o /tmp/output -b <gcs-bucket-name>
```
Running `infinitory-flask` in Dev:
```
infinitory-flask/python app.py infinitory-prod
```
### Build / release
`infinitory` - For infinitory, you must first release the python package and then build / push the docker image
```
## Release a python build
## (with .pypirc in place)
python setup.py sdist upload -r local
```
`infinitory-flask` - Simply build and push the docker image to release this portion of the app.

View file

@ -0,0 +1,9 @@
FROM python:3
ADD app.py /
ENV GOOGLE_APPLICATION_CREDENTIALS $GOOGLE_APPLICATION_CREDENTIALS
ENV TZ=America/Los_Angeles
ENV BUCKET $BUCKET
RUN pip install --upgrade pip
RUN pip install flask google-cloud-storage
EXPOSE 5000
ENTRYPOINT python app.py ${BUCKET}

64
infinitory-flask/app.py Normal file
View file

@ -0,0 +1,64 @@
import os
import logging
import shutil
import sys
from flask import Flask, send_file, Response
from google.cloud import storage
import tempfile
app = Flask(__name__)
app.config['root_path'] = '/'
app.config['SEND_FILE_MAX_AGE_DEFAULT'] = 0
app.config['static_url_path'] = '/static'
app.config['static_folder'] = 'static'
bucket = sys.argv[1]
if os.path.isdir('templates'):
shutil.rmtree('templates')
os.mkdir('templates', 0o755)
if os.path.isdir('static'):
shutil.rmtree('static')
os.mkdir('static', 0o755)
client = storage.Client()
bucket = client.get_bucket(bucket)
css = bucket.get_blob('pygments.css')
css.download_to_filename("templates/pygments.css")
static = bucket.list_blobs(prefix='static')
for b in static:
destination_uri = '{}'.format(b.name)
b.download_to_filename(destination_uri)
@app.route('/nodes/<string:page_name>/')
def render_static_node_page(page_name):
return fetch_bucket_resource("nodes/"+page_name)
@app.route('/roles/<string:page_name>/')
def render_static_roles_page(page_name):
return fetch_bucket_resource("roles/"+page_name)
@app.route('/services/<string:page_name>/')
def render_static_services_page(page_name):
return fetch_bucket_resource("services/"+page_name)
@app.route('/errors/<string:page_name>/')
def render_static_errors_page(page_name):
return fetch_bucket_resource("errors/"+page_name)
@app.route('/')
@app.route('/index.html/')
def render_index():
return fetch_bucket_resource('index.html')
def fetch_bucket_resource(blob_path):
blob = bucket.get_blob(blob_path)
with tempfile.NamedTemporaryFile() as temp:
blob.download_to_filename(temp.name)
return send_file(temp.name, mimetype='html')
if __name__ == '__main__':
app.run(host="0.0.0.0", port=5000)