interop/tools/jsonToRst.py
Mark T. Voelker d8fb682a2b Change doc references to DefCore
At the Board of Directors meeting on April 24, 2016 the Board of
Directors indicated that as DefCore has evolved it's focus on
interoperability and it's working structure, it's name may be a source
of some confusion to those outside of the community or who are new to
the community.  The Board made an informal request that the DefCore
Committee consider changing it's name to more clearly reflect it's focus
and structure.

This patch is the first step in that process.  It updates references
in various documents to change the name "DefCore Committee" to
"Interop Working Group" as agreed at the summer 2016 DefCore Committee
Sprint [1].

It should be noted that this patch should be considered a work in
progress to generate discussion until the new name is approved by
the DefCore Committee and the Board of Directors.  Should we elect
to go forward with the new name, some other actions will also need
to be taken, including but not limited to:

1. We will need to consider updating references on the OpenStack wiki.
2. We will need to consider updating the name of our IRC channel,
   mailing list, Launchpad project, and git repository.  Most of these
   changes will need to be carefully coordinated with the OpenStack
   Infrastructure team.
3. We will need to take into account external resources that point to
   DefCore artifacts, such as Foundation-maintained websites (such as:
   http://www.openstack.org/interop ).
4. We will need to coordinate with RefStack to minimize impact.
5. We will need to clearly communicate the name change to the rest of the
   community.

Note also that I've intentionally left many historical documents that
have been superceded (such as the 2015A process docs, Guidelines that
are no longer used, etc) in tact.  There seemed little value in
spending time on them and cluttering the patch with them since they're
now obsolete.

[1] https://etherpad.openstack.org/p/DefCoreSummer2016Sprint

Change-Id: I79d337c193e75c54d49f1d847468f6347e2ef2b3
2017-01-23 21:25:05 -05:00

185 lines
5.3 KiB
Python
Executable File

#!/usr/bin/env python
#
# Copyright 2015 Alexander Hirschfeld
#
# 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.
#
# This was build for python 2.7, The print statements are failing with
# Python 3.X
import json
import sys
import textwrap
def printHelpArrays(input):
if(len(input) == 0):
return 'None'
output = ""
for i in input:
output = output + i.capitalize() + ', '
return output[0:-2]
wrapper = textwrap.TextWrapper(width=79, subsequent_indent=' ')
inFileName = "NONE"
for potentialFile in sys.argv:
if ".json" in potentialFile:
inFileName = potentialFile
if inFileName is "NONE":
print "Please pass the JSON file"
sys.exit(1)
print "reading from", inFileName
with open(inFileName) as f:
data = json.load(f)
if not isinstance(data, dict):
print 'Make sure this is a valid file'
sys.exit(1)
outFileName = 'doc/source/guidelines/' + inFileName.replace("json", "rst")
print "writing to", outFileName
# intro
with open(outFileName, "w") as outFile:
if data.get('id') is None:
print 'Make sure there is a valid id'
sys.exit(1)
line01 = "OpenStack Interoperability Guideline %s" % data["id"]
outFile.write('=' * len(line01) + '\n')
outFile.write(line01 + '\n')
outFile.write('=' * len(line01) + '\n')
# Nonlooping
if data.get('platform') is None:
print "The platform section is not found"
sys.exit(1)
# Correct Source
if data.get('source') != \
'http://git.openstack.org/cgit/openstack/defcore/':
print "The expected interoperability guideline source not found"
sys.exit(1)
outFile.write("""
:Status: {status}
:Replaces: {replaces}
:JSON Master: http://git.openstack.org/cgit/openstack/defcore/tree/{id}.json
This document outlines the mandatory capabilities and designated
sections required to exist in a software installation in order to
be eligible to use marks controlled by the OpenStack Foundation.
This document was generated from the `master JSON version <{id}.json>`_.
Releases Covered
==============================
Applies to {releases}
Platform Components
==============================
:Required: {platformRequired}
:Advisory: {platformAdvisory}
:Deprecated: {platformDepric}
:Removed: {platformRemoved}
""".format(status=data.get("status"),
replaces=data.get("replaces"),
id=data.get("id"),
releases=printHelpArrays(data.get("releases")),
platformRequired=printHelpArrays(data["platform"].get("required")),
platformAdvisory=printHelpArrays(data["platform"].get("advisory")),
platformDepric=printHelpArrays(data["platform"].get("deprecated")),
platformRemoved=printHelpArrays(data["platform"].get("removed"))))
# looping
if data.get('components') is None:
print "No components found"
sys.exit(1)
components = sorted(data["components"].keys())
order = ["required", "advisory", "deprecated", "removed"]
for component in components:
outFile.write("""
{component} Component Capabilities
""".format(component=component.capitalize()))
outFile.write('=' * (len(component) + 23)) # footer
for event in order:
outFile.write("\n{event} Capabilities\n".format(
event=event.capitalize()))
outFile.write("-" * (len(event) + 15) + "\n")
if(len(data['components'][component][event]) == 0):
outFile.write("None\n")
for req in data['components'][component][event]:
outFile.write("* {name} ({project})\n".format(
name=req,
project=data["capabilities"][req].get(
"project").capitalize()))
# Designated -Sections
if 'designated-sections' not in data:
print "designated-sections not in json file"
sys.exit(1)
outFile.write("""
Designated Sections
=====================================
The following designated sections apply to the same releases as
this specification.""")
order = ['required', 'advisory', 'deprecated', 'removed']
desig = data.get("designated-sections")
for event in order:
outFile.write('\n\n{event} Designated Sections\n'.format(
event=event.capitalize()))
# +20 is for length of header
outFile.write('-' * (len(event) + 20) + '\n\n')
names = sorted(desig[event].keys())
if len(names) is 0:
outFile.write('None')
outlines = []
for name in names:
outlines.append(
wrapper.fill(
"* {name} : {guide}".format(
name=name.capitalize(),
guide=desig[event][name].get('guidance'))))
outFile.write("\n".join(outlines))
outFile.write('\n')