import requests
import sys, getopt
from pprint import pprint
# https://community.microfocus.com/t5/Fortify-User-Discussions/How-to-create-application-in-SSC-with-REST-API/td-p/1553209
# python pip.exe install requests
#
# Following are the steps that this script takes.
# Use Basic Auth to obtain a token
# Use token in order to perform a project lookup
# If the project doesn't exist, the project and project version will be created
# 1. Make call to projectVersions to create Project and Version
# 2. Make call to projectVersions/attributes to update the project attributes
# 3. Update projectVersions resource to be enabled.
# Use token in order to perform a project version lookup
# If the project version doesn't exist the project version will be created
baseURL = "http://10.10.10.31:8080/ssc/api/v1/"
authURL = baseURL+"auth/obtain_token"
projectURL = baseURL+"projects?start=-1&limit=-1"
authHeaders = {
'accept': "application/json, text/plain; */*",
'content-type': "application/json;charset=UTF-8",
'accept-encoding': "application/gzip",
'cache-control': "no-cache",
'authorization': "Basic <insert basic token>",
}
#
# This function will get project information and return the assocaited project ID for the project
#
def getProject( projectHeaders, projectName, projectVersion, projectURL ):
print("Performing Project Lookup....................\n")
# Connect to Project Resource to get details on available projects
print ("Connecting to " + projectURL + " ...............................\n")
try:
projectResponse = requests.request("GET", projectURL, headers=projectHeaders)
except requests.exceptions.RequestException as e:
print (e)
print ("-------------------------------------- \n")
print ("Project Response Status Code = " + str(projectResponse.status_code) + "\n")
print ("-------------------------------------- \n")
sys.exit(1)
if projectResponse.status_code == 200 :
projectJSON = projectResponse.json()
projectList = projectJSON['data']
for projectDict in projectList :
if projectDict['name'] == projectName :
projectID = projectDict['id']
print ("Project ID Was located.........................................\n")
print ("\n--------------- Project ID from Lookup, " + str(projectID) + "\n")
print ("Project ID "+ str(projectID))
versionID = getProjectVersion( projectHeaders, baseURL, projectID, projectVersion, projectName )
return projectID;
break
else:
print ("Project ID was not found, creating new project....................................")
returnedVersionID = createProject(projectName, projectVersion, projectHeaders )
#print ("Project ID after project creation " + str(versionID) + "\n")
print ("Project Version ID after project creation " + str(returnedVersionID) + "\n")
updateProjectAttributes( projectHeaders, returnedVersionID, projectVersion, projectName)
updateProject( projectHeaders, returnedVersionID, projectVersion, projectName )
return returnedVersionID;
else :
print ("Project Request experienced an error and returned response code " + str(projectResponse.status_code) + "\n")
#
# This function will get project version information and return the assocaited project ID for the project
#
def getProjectVersion( projectHeaders, baseURL, projectID, projectVersion, projectName ):
#Get the Project Version data
print ("Looking up Project Version information.........................\n")
projectVersionURL = baseURL+"projects/"+str(projectID)+"/versions"
print ("\nConnecting to " + projectVersionURL + " ...............................\n")
try:
projectVersionResponse = requests.request("GET", projectVersionURL, headers=projectHeaders)
except requests.exceptions.RequestException as e:
print (e)
print ("-------------------------------------- \n")
print ("Project Version Response Status Code = " + str(projectVersionResponse.status_code) + "\n")
print ("-------------------------------------- \n")
sys.exit(1)
if projectVersionResponse.status_code == 200 :
projectVersionJSON = projectVersionResponse.json()
#pprint(projectVersionJSON)
# Grab the Data Dictionariy from the JSON
projectVersionList = projectVersionJSON['data']
#pprint( projectVersionList )
# The project version call returns a list of dictionaries. Loop through the list to get individual dictionaries
# After obtaining the individial dictionaries look through each one to see if any of them have a projectVersion that matches
# out project version.
for projectVersionDict in projectVersionList :
if projectVersionDict['name'] == projectVersion :
lookupVersionID = projectVersionDict['id']
print ("Project Version ID Was located.........................................\n")
print ("\n--------------- Project Version ID is: " + str(lookupVersionID) + "\n")
return lookupVersionID;
break
else:
print ("Project Version was not found, We need to create a new project ..............................\n")
createVersion( projectHeaders, projectID, projectVersion, projectName )
return;
def createProject (projectName, projectVersion, projectHeaders ):
print ("\n.................................")
print ("\n Creating new project................................................")
url = "http://10.10.10.31:8080/ssc/api/v1/projectVersions"
payload = "{\"project\":{\"name\":\""+projectName+"\",\"description\":\"Created with SSC Client\",\"issueTemplateId\":\"Prioritized-HighRisk-Project-Template\",\"committed\": \"true\"},\"masterAttrGuid\":\"87f2364f-dcd4-49e6-861d-f8d3f351686b\",\"name\":\""+projectVersion+"\",\"description\":\"Created with SSC Client\",\"issueTemplateId\":\"Prioritized-HighRisk-Project-Template\",\"owner\": \"SSC Client\",\"active\": \"true\",\"committed\": \"false\"}"
try:
response = requests.request("POST", url, data=payload, headers=projectHeaders)
except requests.exceptions.RequestException as e:
print (e)
print ("-------------------------------------- \n")
print ("Response Status Code = " + str(response.status_code) + "\n")
print ("-------------------------------------- \n")
sys.exit(1)
print ("\n--------------- Project Creation JSON --------------- \n")
print(response.text)
if response.status_code == 201 :
projectJSON = response.json()
projectData = projectJSON['data']
versionID = projectData['id']
print ("\n.............................. Project Version ID after Project Creation .............................. \n")
print ("ProjectVersionID = " + str(versionID))
print ("\n....................................................................................................... \n")
return versionID;
else:
return;
def createVersion( projectHeaders, projectID, projectVersion, projectName ):
print ("Creating new Project Version.............................................\n")
print ("Creating project Version " + projectVersion + " with project ID of " + str(projectID) + "\n")
url = "http://10.10.10.31:8080/ssc/api/v1/projects/"+str(projectID)+"/versions"
payload = "{\n\t\"masterAttrGuid\":\"87f2364f-dcd4-49e6-861d-f8d3f351686b\",\n\t\"name\":\""+projectVersion+"\",\n\t\"description\":\"Created with SSC Client\",\n\t\"issueTemplateId\":\"Prioritized-HighRisk-Project-Template\",\n\t\"owner\": \"SSC Client\",\n\t\"active\": \"true\",\n\t\"committed\": \"true\"\n}"
print ("Creating project version by connecting to " + url)
try:
response = requests.request("POST", url, data=payload, headers=projectHeaders)
except requests.exceptions.RequestException as e:
print (e)
print ("-------------------------------------- \n")
print ("Response Status Code = " + str(response.status_code) + "\n")
print ("-------------------------------------- \n")
sys.exit(1)
print (projectID)
print (response.status_code)
if response.status_code == 201 :
projectJSON = response.json()
pprint( projectJSON )
projectData = projectJSON['data']
versionID = projectData['id']
print ("\n.............................. Project Version ID after Project Creation .............................. \n")
print ("ProjectVersionID = " + str(versionID))
print ("\n....................................................................................................... \n")
updateProjectAttributes( projectHeaders, versionID, projectVersion, projectName )
updateProject( projectHeaders, versionID, projectVersion, projectName )
return;
return;
def updateProjectAttributes( projectHeaders, projectID, projectVersion, projectName ):
print ("Updating Project Attributes ................................................\n")
print ("Updating project Attributes for project " + projectName + " with project id of, " + str(projectID) + "\n")
url = "http://10.10.10.31:8080/ssc/api/v1/projectVersions/" + str(projectID) + "/attributes"
payload = "[\n\t{\n\t \"guid\":\"DevPhase\",\n\t \"attributeDefinitionId\":\"5\",\n\t \"values\": [ \n\t\t\t\t {\"guid\":\"Active\"} \n\t\t\t ]\n\t},\n\t\t{\n\t\t\"guid\":\"Accessibility\",\n\t\t\"attributeDefinitionId\":\"7\",\n\t\t\"values\": [\n\t\t\t\t\t{\"guid\":\"externalpublicnetwork\"}\n\t\t\t\t ]\n\t},\n\t{\n\t\t\"guid\":\"DevStrategy\",\n\t\t\"attributeDefinitionId\":\"6\",\n\t\t\"values\": [\n\t\t\t\t\t{\"guid\":\"Internal\"}\n\t\t\t\t ]\n\t}\n\n]\n\t\n\t\n\t"
try:
response = requests.request("PUT", url, data=payload, headers=projectHeaders)
except requests.exceptions.RequestException as e:
print (e)
print ("-------------------------------------- \n")
print ("Response Status Code = " + str(response.status_code) + "\n")
print ("-------------------------------------- \n")
sys.exit(1)
print ("Project Attribute Update Completed................................\n")
return;
def updateProject( projectHeaders, projectID, projectVersion, projectName ):
print ("Updating Project Version Status to Committed ................................................\n")
print ("Changing Project Version Status to Committed for project " + projectName + " with with project id of, " + str(projectID) + "\n")
url = "http://10.10.10.31:8080/ssc/api/v1/projectVersions/"+str(projectID)+"/"
print ("Connecting to " + url)
payload = "{\"project\":{\"name\":\""+projectName+"\",\"description\":\"Created with SSC Client\",\"issueTemplateId\":\"Prioritized-HighRisk-Project-Template\",\"committed\": \"true\"},\"masterAttrGuid\":\"87f2364f-dcd4-49e6-861d-f8d3f351686b\",\"name\":\""+projectVersion+"\",\"description\":\"Created with SSC Client\",\"issueTemplateId\":\"Prioritized-HighRisk-Project-Template\",\"owner\": \"SSC CLIENT\",\"active\": \"true\",\"committed\": \"true\"}"
print (payload)
try:
response = requests.request("PUT", url, data=payload, headers=projectHeaders)
print(response.text)
except requests.exceptions.RequestException as e:
print (e)
print ("-------------------------------------- \n")
print ("Response Status Code = " + str(response.status_code) + "\n")
print ("-------------------------------------- \n")
sys.exit(1)
return;
def main(argv):
projectName = ''
projectVersion = ''
try:
opts, args = getopt.getopt(argv, "hn:v:d", ["help", "projectName=", "projectVersion="])
except getopt.GetoptError:
print ('ssc-client.py -n <projectName> -v <projectVersion>')
sys.exit(2)
for opt, arg in opts:
if opt == '-h':
print ('ssc-client.py -n <projectName> -v <projectVersion>')
sys.exit()
elif opt in ("-n", "--projectName"):
projectName = arg
elif opt in ("-v", "--projectVersion"):
projectVersion = arg
print ("\nProject Name entered is: " + projectName)
print ("\nProject Version entered is: " + projectVersion)
print ("\nPerforming Initial Authentication.................................")
print ("\nConnecting to " + authURL + "\n")
try:
authResponse = requests.request("POST", authURL, headers=authHeaders)
except requests.exceptions.RequestException as e:
print (e)
print ("-------------------------------------- \n")
print ("Auth Response Status Code = " + str(authResponse.status_code) + "\n")
print ("-------------------------------------- \n")
sys.exit(1)
if authResponse.status_code == 200 :
authJSON = authResponse.json()
data = authJSON['data']
sscToken = data['token']
print ("SSC Token: " + sscToken + "\n")
projectHeaders = {
'accept': "application/json, text/plain, */*",
'cache-control': "no-cache",
'authorization': "FortifyToken "+sscToken,
'content-type': "application/json; charset=utf-8",
'accept-encoding': "gzip, deflate",
}
#projectID = getProject( projectHeaders, projectName, projectVersion, projectURL )
getProject( projectHeaders, projectName, projectVersion, projectURL )
else :
print ("Auth Request experienced an error and returned response code " + str(authResponse.status_code) + "\n")
if __name__ == "__main__":
main(sys.argv[1:])