scripts/compile_checklist.py (93 lines of code) (raw):
#################################################################################
#
# This script attempts to build a unified checklist out of all the different checklists
# stored in this repo, and optionally filter it per design area.
#
# Last updated: June 2022
#
#################################################################################
import json
import argparse
import sys
import requests
# Get input arguments
parser = argparse.ArgumentParser(description='Update a checklist spreadsheet with JSON-formatted Azure Resource Graph results')
parser.add_argument('--output-file', dest='output_file', action='store',
help='You can optionally supply the name of the JSON file that will be created. Otherwise no output will be generated')
parser.add_argument('--category', dest='category_filter', action='store',
help='You can optionally provide a category name as a filter')
parser.add_argument('--checklist-name', dest='new_checklist_name', action='store',
default='Combined checklist',
help='You can optionally provide a category name as a filter')
parser.add_argument('--print-categories', dest='print_categories', action='store_true',
default=False,
help='print the categories of the combined checklist (default: False)')
parser.add_argument('--verbose', dest='verbose', action='store_true',
default=False,
help='run in verbose mode (default: False)')
args = parser.parse_args()
if args.category_filter:
category_filter = args.category_filter.lower()
# Variables
repo_contents_url = 'https://api.github.com/repos/azure/review-checklists/contents/checklists'
# Get existing checklists in the repo
response = requests.get(repo_contents_url)
# If download was successful
if response.status_code == 200:
if args.verbose:
print ("DEBUG: Github contents downloaded successfully from {0}".format(repo_contents_url))
try:
content_data = json.loads(response.text)
except Exception as e:
print("Error deserializing JSON content: {0}".format(str(e)))
sys.exit(1)
# Get the list of checklist files
checklist_urls = []
if content_data:
for github_object in content_data:
if github_object['name'][-7:] == 'en.json':
checklist_urls.append(github_object['download_url'])
else:
print("Error deserializing JSON content from GitHub repository contents: {0}".format(str(e)))
sys.exit(1)
if args.verbose:
print("DEBUG: {0} checklists found".format(str(len(checklist_urls))))
# Load all of the items in memory
new_checklist = {
'items': [],
'status': [
{'name': 'Not verified', 'description': 'This check has not been looked at yet'},
{'name': 'Open', 'description': 'There is an action item associated to this check'},
{'name': 'Fulfilled', 'description': 'This check has been verified, and there are no further action items associated to it'},
{'name': 'Not required', 'description': 'Recommendation understood, but not needed by current requirements'},
{'name': 'N/A', 'description': 'Not applicable for current design'}
],
'severities': [ {'name': 'High'}, {'name': 'Medium'}, {'name': 'Low'} ],
'categories': [],
'metadata': { 'name': args.new_checklist_name }
}
for checklist_url in checklist_urls:
if args.verbose:
print("DEBUG: Downloading checklist file from", checklist_url)
response = requests.get(checklist_url)
if response.status_code == 200:
if args.verbose:
print ("DEBUG: File {0} downloaded successfully".format(checklist_url))
try:
# Deserialize JSON to object variable
checklist_data = json.loads(response.text)
checklist_name = checklist_data['metadata']['name']
for item in checklist_data['items']:
if checklist_name:
item['checklist'] = checklist_name
item_category = str(item['category']).lower()
if not args.category_filter or item_category.__contains__(category_filter):
new_checklist['items'].append(item)
except Exception as e:
print("Error deserializing JSON content: {0}".format(str(e)))
sys.exit(1)
if args.verbose:
print("DEBUG: Resulting combined checklist has {0} items".format(str(len(new_checklist['items']))))
# Add the categories to the new checklist
categories = []
for item in new_checklist['items']:
category_name=item['checklist'] + '/' + item['category']
if not category_name in categories:
categories.append(category_name)
if args.verbose:
print("DEBUG: {0} categories found".format(str(len(categories))))
for category in categories:
new_checklist['categories'].append({'name': category})
if args.print_categories:
print(category)
# Saving output file if specified in the argument
if args.output_file:
if args.verbose:
print("DEBUG: saving output file to", args.output_file)
new_checklist_string = json.dumps(new_checklist)
with open(args.output_file, 'w', encoding='utf-8') as f:
f.write(new_checklist_string)
f.close()