
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
185 lines
5.3 KiB
Python
Executable File
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')
|