From b332c2a776709ae335ab2cca973ef407112b29e9 Mon Sep 17 00:00:00 2001 From: Doug Hellmann Date: Thu, 11 Dec 2014 16:22:48 -0500 Subject: [PATCH] Generate specs.o.o root page from template Use a YAML file listing the projects to generate the specs.openstack.org root page and an OPML file for all of the available RSS feeds. These changes are based on the work of Maish Saidel-Keesing in https://review.openstack.org/#/c/140041/ Change-Id: I828d65f10fb7608b59e3561cedc9553d4d96ee75 --- .gitignore | 1 + jenkins/jobs/projects.yaml | 1 + jenkins/jobs/specs-jobs.yaml | 42 ++++++++ specs/generate_specs_site.py | 65 ++++++++++++ specs/{index.html => index.html.tmpl} | 144 +++----------------------- specs/specs.opml.tmpl | 19 ++++ specs/specs.yaml | 42 ++++++++ tox.ini | 6 ++ zuul/layout.yaml | 4 + 9 files changed, 193 insertions(+), 131 deletions(-) create mode 100755 specs/generate_specs_site.py rename specs/{index.html => index.html.tmpl} (54%) create mode 100644 specs/specs.opml.tmpl create mode 100644 specs/specs.yaml diff --git a/.gitignore b/.gitignore index 529ec7d8c9..46f27a2588 100644 --- a/.gitignore +++ b/.gitignore @@ -7,3 +7,4 @@ /.project /.pydevproject *.egg +specs/output diff --git a/jenkins/jobs/projects.yaml b/jenkins/jobs/projects.yaml index b16677234b..bc6d93834e 100644 --- a/jenkins/jobs/projects.yaml +++ b/jenkins/jobs/projects.yaml @@ -2034,6 +2034,7 @@ jobs: - gate-{name}-pep8 - gate-{name}-bashate + - generate-specs-site-jobs - project: name: puppet-github diff --git a/jenkins/jobs/specs-jobs.yaml b/jenkins/jobs/specs-jobs.yaml index cf01876d95..616b10ff25 100644 --- a/jenkins/jobs/specs-jobs.yaml +++ b/jenkins/jobs/specs-jobs.yaml @@ -32,3 +32,45 @@ - gate-{name}-docs - gate-{name}-python27 - '{name}-publish-specs' + + +- builder: + name: generate-specs-site + + builders: + - revoke-sudo + - gerrit-git-prep + - tox: + envlist: specs + +- job: + name: check-generate-specs-site + description: Render the specs sites templates without publishing them. + node: 'bare-precise || bare-trusty' + + builders: + - generate-specs-site + +- job: + name: publish-specs-site + description: Render the specs sites templates and publish them. + node: 'bare-precise || bare-trusty' + + builders: + - generate-specs-site + + publishers: + - scp: + site: 'static.openstack.org' + files: + - target: 'specs/' + source: '$ZUUL_PROJECT/specs/output/**' + keep-hierarchy: true + copy-after-failure: false + - console-log + +- job-group: + name: generate-specs-site-jobs + jobs: + - check-generate-specs-site + - publish-specs-site diff --git a/specs/generate_specs_site.py b/specs/generate_specs_site.py new file mode 100755 index 0000000000..77780faf43 --- /dev/null +++ b/specs/generate_specs_site.py @@ -0,0 +1,65 @@ +#!/usr/bin/env python +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +"""Read the specs.yaml file and generate the index.html and specs.opml files. +""" + +from __future__ import print_function + +import argparse +import os + +import jinja2 +import yaml + + +def render_template(template_filename, output_filename, template_context): + with open(template_filename, 'r') as f: + template = jinja2.Template(f.read()) + print('Writing %r' % output_filename) + with open(output_filename, 'w') as f: + f.write(template.render(**template_context)) + + +parser = argparse.ArgumentParser() +parser.add_argument('-v', '--verbose', + dest='verbose', + default=False, + action='store_true', + ) +parser.add_argument( + 'infile', + help='Path to specs/specs.yaml', +) +args = parser.parse_args() + +print('Reading project data from %r' % args.infile) +infile = yaml.load(open(args.infile, 'r')) +template_path = os.path.dirname(args.infile) + +template_context = { + 'projects': infile['projects'], + 'programs': infile['programs'], + 'all': infile['projects'] + infile['programs'], +} + +outdir = os.path.join(template_path, 'output') +if not os.path.exists(outdir): + os.makedirs(outdir) + + +for template_name, filename in [('index.html.tmpl', 'index.html'), + ('specs.opml.tmpl', 'specs.opml')]: + render_template(os.path.join(template_path, template_name), + os.path.join(outdir, filename), + template_context) diff --git a/specs/index.html b/specs/index.html.tmpl similarity index 54% rename from specs/index.html rename to specs/index.html.tmpl index 83b0d5e285..c2f63fdbc1 100644 --- a/specs/index.html +++ b/specs/index.html.tmpl @@ -113,102 +113,14 @@
+{% for project in projects %}
- - Bare Metal Provisioning Specifications (ironic) + + {{project.name}} - (RSS) -
-
- - Compute Service - Specifications (nova) - - (RSS) -
-
- - Data Processing Service - Specifications (sahara) - - (RSS) -
-
- - Database Service Specifications (trove) - - (RSS) -
-
- - DNS Services - Specifications (designate) - - (RSS) -
-
- - Identity Program - Specifications (keystone) - - (RSS) -
-
- - Image Service - Specifications (glance) - - (RSS) -
-
- - Key Management Service - Specifications (barbican) - - (RSS) -
-
- - Networking Service - Developer Specifications (neutron) - - (RSS) -
-
- - Object Storage - Specifications (swift) - - (RSS) -
-
- - Orchestration - Specifications (heat) - - (RSS) -
-
- - Queue Service - Specifications (zaqar) - - (RSS) -
-
- - Telemetry Service - Specifications (ceilometer) - - (RSS) -
-
- - Volume Service - Specifications (cinder) - - (RSS) + (RSS)
+{% endfor %}
+