Add a script to update the internal RefStack DB
using a provided csv. See the README for more information on how to use this script. Change-Id: I077d8588b69e2dd0c6302557a2b2867ca4bc1cc1
This commit is contained in:
131
tools/update-rs-db.py
Executable file
131
tools/update-rs-db.py
Executable file
@@ -0,0 +1,131 @@
|
|||||||
|
#!/usr/bin/python
|
||||||
|
import requests
|
||||||
|
import argparse
|
||||||
|
import os
|
||||||
|
import json
|
||||||
|
|
||||||
|
|
||||||
|
def getData(entry):
|
||||||
|
guidelines = ["2015.03", "2015.04", "2015.05", "2015.07", "2016.01",
|
||||||
|
"2016.08", "2017.01"]
|
||||||
|
components = ["Platform", "Compute", "Storage"]
|
||||||
|
if len(entry) < 10:
|
||||||
|
return None, None, None
|
||||||
|
if entry[9] != "" and entry[9] != " ":
|
||||||
|
refstackLink = entry[9]
|
||||||
|
testId = refstackLink.split("/")[-1]
|
||||||
|
else:
|
||||||
|
refstackLink = None
|
||||||
|
testId = None
|
||||||
|
if entry[4] != "" and entry[4] != " " and entry[4] in guidelines:
|
||||||
|
guideline = entry[4]
|
||||||
|
else:
|
||||||
|
guideline = None
|
||||||
|
if entry[5] != "" and entry[5] != " " and entry[5] in components:
|
||||||
|
target = entry[5].lower()
|
||||||
|
if target == "storage":
|
||||||
|
target = "object"
|
||||||
|
else:
|
||||||
|
target = None
|
||||||
|
return testId, guideline, target
|
||||||
|
|
||||||
|
|
||||||
|
def linkChk(link, token):
|
||||||
|
print("checking result with a test ID of: " + link.split("/")[-1])
|
||||||
|
if not link:
|
||||||
|
return False
|
||||||
|
try:
|
||||||
|
if " " in link:
|
||||||
|
return False
|
||||||
|
response = requests.get(
|
||||||
|
link, headers={'Authorization': 'Bearer ' + token})
|
||||||
|
if response.status_code == 200:
|
||||||
|
return json.loads(response.text)
|
||||||
|
else:
|
||||||
|
print("Link check response_status_code=" +
|
||||||
|
str(response.status_code))
|
||||||
|
return False
|
||||||
|
except requests.exceptions as err:
|
||||||
|
print(err)
|
||||||
|
return False
|
||||||
|
|
||||||
|
|
||||||
|
def updateResult(apiLink, target, guideline, token):
|
||||||
|
response = requests.post(apiLink + '/meta/shared', headers={
|
||||||
|
'Authorization': 'Bearer ' + token}, data='true')
|
||||||
|
if response.status_code != 201:
|
||||||
|
print("Update shared status response_status_code=" +
|
||||||
|
str(response.status_code))
|
||||||
|
return False
|
||||||
|
if ".json" not in guideline:
|
||||||
|
guideline = str(guideline) + ".json"
|
||||||
|
response = requests.post(apiLink + '/meta/guideline', headers={
|
||||||
|
'Authorization': 'Bearer ' + token}, data=guideline)
|
||||||
|
if response.status_code != 201:
|
||||||
|
print("Update guideline response_status_code=" +
|
||||||
|
str(response.status_code))
|
||||||
|
return False
|
||||||
|
response = requests.post(apiLink + '/meta/target', headers={
|
||||||
|
'Authorization': 'Bearer ' + token}, data=target)
|
||||||
|
if response.status_code != 201:
|
||||||
|
print("Update target response_status_code=" +
|
||||||
|
str(response.status_code))
|
||||||
|
return False
|
||||||
|
print("test result updated. Verifying.")
|
||||||
|
response = requests.put(apiLink, headers={
|
||||||
|
'Authorization': 'Bearer ' + token}, json={'verification_status': 1})
|
||||||
|
if response.status_code != 201:
|
||||||
|
return False
|
||||||
|
print("Test result verified.")
|
||||||
|
return True
|
||||||
|
|
||||||
|
|
||||||
|
def main():
|
||||||
|
linect = 0
|
||||||
|
parser = argparse.ArgumentParser(
|
||||||
|
"Update the internal RefStack db using a csv file")
|
||||||
|
parser.add_argument("--file", "-f", metavar='f', type=str, action="store",
|
||||||
|
required=True,
|
||||||
|
help="csv source for the data to use in updates")
|
||||||
|
parser.add_argument(
|
||||||
|
"--endpoint", "-e", metavar='e',
|
||||||
|
type=str, action="store", required=True,
|
||||||
|
help="the base URL of the endpoint. ex: http://examplerefstack.com/v1")
|
||||||
|
parser.add_argument("--token", "-t", metavar="t", type=str,
|
||||||
|
action="store", required=True, help="API auth token")
|
||||||
|
result = parser.parse_args()
|
||||||
|
infile = result.file
|
||||||
|
endpoint = result.endpoint
|
||||||
|
token = result.token
|
||||||
|
with open(infile) as f:
|
||||||
|
for line in f:
|
||||||
|
linect = linect + 1
|
||||||
|
entry = line.split(",")
|
||||||
|
testId, guideline, target = getData(entry)
|
||||||
|
if testId is None or guideline is None or target is None:
|
||||||
|
print(
|
||||||
|
"entry found at line " + str(linect) +
|
||||||
|
" cannot be updated and verified: entry incomplete.")
|
||||||
|
else:
|
||||||
|
apiLink = os.path.join(endpoint, 'results', testId)
|
||||||
|
testResult = linkChk(apiLink, token)
|
||||||
|
if testResult:
|
||||||
|
if testResult.get('verification_status'):
|
||||||
|
print(
|
||||||
|
"Result has already been verified; nothing to do.")
|
||||||
|
else:
|
||||||
|
print(
|
||||||
|
"Result link is valid. Updating result with ID " +
|
||||||
|
testId)
|
||||||
|
success = updateResult(apiLink, target, guideline,
|
||||||
|
token)
|
||||||
|
if not success:
|
||||||
|
print("update of the results with the ID " +
|
||||||
|
testId + " failed. please recheck your " +
|
||||||
|
"spreadsheet and try again")
|
||||||
|
else:
|
||||||
|
print("the test result " + testId +
|
||||||
|
" cannot be verified due to a broken result link.")
|
||||||
|
|
||||||
|
|
||||||
|
main()
|
||||||
57
tools/update-rs-db.rst
Normal file
57
tools/update-rs-db.rst
Normal file
@@ -0,0 +1,57 @@
|
|||||||
|
#######################################################################
|
||||||
|
# update-rs-db.py #
|
||||||
|
#######################################################################
|
||||||
|
|
||||||
|
This document contains some details that are neccessary to know to be
|
||||||
|
successful in the usage of the script update-rs-db.py.
|
||||||
|
|
||||||
|
The script can be run using the following formatting:
|
||||||
|
"./update-rs-db.py --file /tmp/datasource.csv --endpoint
|
||||||
|
http://example.com:8000/v1 --token <my-token>"
|
||||||
|
|
||||||
|
This script updates RefStack tests as verified given a specific
|
||||||
|
spreadsheet. The columns in this spreadsheet are, in this order:
|
||||||
|
- Company Name
|
||||||
|
- Product Name
|
||||||
|
- Type (Distribution, Public, or Private)
|
||||||
|
- Region
|
||||||
|
- Guideline
|
||||||
|
- Component (Compute, Platform, or Object)
|
||||||
|
- Reported Release
|
||||||
|
- Passed Release
|
||||||
|
- Federated identity (yes/no)
|
||||||
|
- Refstack Link
|
||||||
|
- Zendesk Link
|
||||||
|
- Marketplace Link
|
||||||
|
- License Date
|
||||||
|
- Update Product (yes/no)
|
||||||
|
- Contacts
|
||||||
|
- Notes
|
||||||
|
- License Link
|
||||||
|
- Active (1 or 0)
|
||||||
|
- Public (1 or 0)
|
||||||
|
|
||||||
|
The data is pulled from a csv file. The default csv name is toadd.csv,
|
||||||
|
but using the -f flag, we can use csv of a different filename.
|
||||||
|
|
||||||
|
The refstack database that we are pushing updates to is set via the "-e",
|
||||||
|
or "--endpoint flag. This flag specifies the refstack api endpoint to be
|
||||||
|
used to update the database. This is a required flag.
|
||||||
|
|
||||||
|
Because editing arbitrary test results requires administrative privileges,
|
||||||
|
an auth token must be used with the RefStack API. This token can be
|
||||||
|
generated by entering the command "jwt --key="$( cat <path to private key>
|
||||||
|
)" --alg=RS256 user_openid=<openstackid> exp=+100500". This generates a
|
||||||
|
json web token, which we must link using the "-t" or "--token" flag. Because
|
||||||
|
we cannot auth without this token, the token is a required flag.
|
||||||
|
|
||||||
|
The script will go through each line of the CSV, grabbing the refstack link,
|
||||||
|
the guideline, and the component. It also uses the refstack result to get a
|
||||||
|
test result Id.
|
||||||
|
|
||||||
|
It then uses that test ID to update the internal db using refstack's built
|
||||||
|
in RESTful api.
|
||||||
|
|
||||||
|
Lastly, if at least one of the links has proven to be valid, we will
|
||||||
|
then use the same RESTful api, and test ID to update the verification_status
|
||||||
|
field associated with that test result.
|
||||||
Reference in New Issue
Block a user