Add an "ara-manage generate" command to export to static HTML

This new command renders the templates of the built-in web UI
to static html files.

Change-Id: I66a346bcee188a194a7a2dd300a41d23906bbe5f
This commit is contained in:
David Moreau Simard 2019-07-19 10:15:23 -04:00
parent 5ecbb4c9c6
commit 16c65d9f11
3 changed files with 74 additions and 0 deletions

View File

@ -0,0 +1,64 @@
import os
import shutil
from django.core.management.base import BaseCommand
from django.template.loader import render_to_string
from ara.clients.offline import AraOfflineClient
class Command(BaseCommand):
help = "Generates a static tree of the web application"
@staticmethod
def create_dirs(path):
# create main output dir
if not os.path.exists(path):
os.mkdir(path)
# create subdirs
dirs = ["playbook", "file", "host", "result"]
for dir in dirs:
if not os.path.exists(os.path.join(path, dir)):
os.mkdir(os.path.join(path, dir))
# Retrieve static assets (../../static)
shutil.rmtree(os.path.join(path, "static"), ignore_errors=True)
ui_path = os.path.abspath(os.path.dirname(os.path.dirname(os.path.dirname(__file__))))
shutil.copytree(os.path.join(ui_path, "static"), os.path.join(path, "static"))
def add_arguments(self, parser):
parser.add_argument("path", help="Path where the static files will be built in", type=str)
def handle(self, *args, **options):
path = options.get("path")
print("Generating static files at %s..." % path)
self.create_dirs(path)
client = AraOfflineClient(run_sql_migrations=False)
playbooks = client.get("/api/v1/playbooks")
with open(os.path.join(path, "index.html"), "w") as f:
f.write(render_to_string("index.html", {"page": "index", "playbooks": playbooks["results"]}))
for playbook in playbooks["results"]:
detailed_playbook = client.get("/api/v1/playbooks/%s" % playbook["id"])
with open(os.path.join(path, "playbook/%s.html" % detailed_playbook["id"]), "w") as f:
f.write(render_to_string("playbook.html", {"playbook": detailed_playbook}))
for file in detailed_playbook["files"]:
detailed_file = client.get("/api/v1/files/%s" % file["id"])
with open(os.path.join(path, "file/%s.html" % detailed_file["id"]), "w") as f:
f.write(render_to_string("file.html", {"file": detailed_file}))
for host in detailed_playbook["hosts"]:
detailed_host = client.get("/api/v1/hosts/%s" % host["id"])
with open(os.path.join(path, "host/%s.html" % detailed_host["id"]), "w") as f:
f.write(render_to_string("host.html", {"host": detailed_host}))
# This is inefficient but the results are currently nested in plays -> tasks -> results
results = client.get("/api/v1/results", playbook=detailed_playbook["id"])
for result in results["results"]:
detailed_result = client.get("/api/v1/results/%s" % result["id"])
with open(os.path.join(path, "result/%s.html" % detailed_result["id"]), "w") as f:
f.write(render_to_string("result.html", {"result": detailed_result}))

View File

@ -29,6 +29,9 @@
- name: Recover integration test data
command: cp -rp {{ ara_api_root_dir }}/server {{ ansible_user_dir }}/workspace/logs/server
- name: Recover static report
command: cp -rp {{ ara_api_root_dir }}/static {{ ansible_user_dir }}/workspace/logs/static
- name: Upload log artifacts
synchronize:
src: "{{ ansible_user_dir }}/workspace/logs"

View File

@ -90,3 +90,10 @@
args:
executable: /bin/bash
ignore_errors: yes
- name: Generate static report
command: >
{{ ara_api_venv_path }}/bin/ara-manage generate {{ ara_api_root_dir }}/static
- name: List static report files
command: ls -alR {{ ara_api_root_dir }}/static