mirror of
https://github.com/puppetlabs/infinitory.git
synced 2026-01-25 18:08:40 -05:00
(DIO-834) Adds infinitory-flask component
This commit is contained in:
parent
fd1ad61fce
commit
79fc53cacc
4 changed files with 110 additions and 1 deletions
2
.gitignore
vendored
2
.gitignore
vendored
|
|
@ -6,3 +6,5 @@ __pycache__
|
|||
/output
|
||||
bin/
|
||||
/cache
|
||||
/infinitory-flask/templates
|
||||
/infinitory-flask/static
|
||||
36
README.md
36
README.md
|
|
@ -4,12 +4,26 @@ SRE Inventory Report
|
|||
Generate a report on SRE inventory, including hosts, roles, and
|
||||
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
|
||||
|
||||
`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
|
||||
```
|
||||
|
||||
`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:
|
||||
|
||||
```
|
||||
|
|
@ -26,6 +40,26 @@ export GOOGLE_APPLICATION_CREDENTIALS=/creds.json
|
|||
|
||||
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>
|
||||
```
|
||||
|
||||
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.
|
||||
|
|
|
|||
9
infinitory-flask/Dockerfile
Normal file
9
infinitory-flask/Dockerfile
Normal 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
64
infinitory-flask/app.py
Normal 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)
|
||||
Loading…
Add table
Add a link
Reference in a new issue