From 2cb0056addd6f47763ebfd0eb7d04f717b969d01 Mon Sep 17 00:00:00 2001 From: Johnny Bieren Date: Tue, 3 Oct 2023 12:31:32 -0400 Subject: [PATCH] feat(RHTAPREL-392): add jinja2 and templating to the image As part of RHTAPREL-392, we need to create advisories. The easiest way to do this is from a template using jinja2, so this commit adds jinja2 and a template to the repo. Some ansible filters are not present in vanilla jinja2, so a module providing those is added too. Signed-off-by: Johnny Bieren --- Dockerfile | 5 ++++ templates/advisory.yaml | 23 ++++++++++++++++++ utils/apply-template.py | 53 +++++++++++++++++++++++++++++++++++++++++ 3 files changed, 81 insertions(+) create mode 100644 templates/advisory.yaml create mode 100755 utils/apply-template.py diff --git a/Dockerfile b/Dockerfile index 5541b835..776b73d8 100644 --- a/Dockerfile +++ b/Dockerfile @@ -20,16 +20,21 @@ RUN dnf -y --setopt=tsflags=nodocs install \ jq \ python39-devel \ diffutils \ + python39-pip \ python39-requests \ skopeo \ krb5-workstation \ && dnf clean all +RUN pip3 install Jinja2 \ + jinja2-ansible-filters + ADD data/certs/2015-IT-Root-CA.pem data/certs/2022-IT-Root-CA.pem /etc/pki/ca-trust/source/anchors/ RUN update-ca-trust COPY pyxis /home/pyxis COPY utils /home/utils +COPY templates /home/templates # Set HOME variable to something else than `/` to avoid 'permission denied' problems when writing files. ENV HOME=/tekton/home diff --git a/templates/advisory.yaml b/templates/advisory.yaml new file mode 100644 index 00000000..22100394 --- /dev/null +++ b/templates/advisory.yaml @@ -0,0 +1,23 @@ +apiVersion: rhtap.redhat.com/v1alpha1 +kind: Advisory +metadata: + name: {{ advisory_name }} +spec: + product_id: {{ advisory.spec.product_id }} + cpe: {{ advisory.spec.cpe }} + type: {{ advisory_type }} +{%- if 'issues' in advisory.spec %} + issues: + {{ advisory.spec.issues | to_nice_yaml(indent=2) | comment(decoration=' ') | trim }} +{%- endif %} + content: + {{ advisory.spec.content | to_nice_yaml(indent=2) | comment(decoration=' ') | trim }} + synopsis: {{ advisory.spec.synopsis }} + topic: >- + {{ advisory.spec.topic | wordwrap(76) | replace('\n', '\n ') }} + description: >- + {{ advisory.spec.description | wordwrap(76) | replace('\n', '\n ') }} + solution: >- + {{ advisory.spec.solution | wordwrap(76) | replace('\n', '\n ') }} + references: + {{ advisory.spec.references | to_nice_yaml | indent(4) | trim }} diff --git a/utils/apply-template.py b/utils/apply-template.py new file mode 100755 index 00000000..662cf718 --- /dev/null +++ b/utils/apply-template.py @@ -0,0 +1,53 @@ +#!/usr/bin/env python3 +from jinja2 import Template +from jinja2_ansible_filters import AnsibleCoreFiltersExtension +import argparse +import json +from typing import Any + + +def setup_argparser() -> Any: # pragma: no cover + """Setup argument parser + + :return: Initialized argument parser + """ + + parser = argparse.ArgumentParser(description="Applies a template.") + + parser.add_argument( + "--data", + help="JSON string containing data to use in the template.", + required=True, + ) + parser.add_argument( + "--template", + help="Path to the template file to use.", + required=True, + ) + parser.add_argument( + "-o", + "--output", + help="The desired filename of the result.", + required=True, + ) + return parser + + +def main(): # pragma: no cover + """Main func""" + + parser = setup_argparser() + args = parser.parse_args() + + with open(args.template) as t: + template = Template(t.read(), extensions=[AnsibleCoreFiltersExtension]) + content = template.render(json.loads(args.data)) + + filename = args.output + with open(filename, mode="w", encoding="utf-8") as advisory: + advisory.write(content) + print(f"Wrote {filename}") + + +if __name__ == "__main__": # pragma: no cover + main()